instar 1.2.73 → 1.2.75

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.
@@ -1,24 +1,29 @@
1
1
  /**
2
2
  * ConversationStore — the single source of truth for a Threadline conversation.
3
3
  *
4
- * Phase 1 of the Threadline re-assessment (THREADLINE-CONVERSATION-KEYSTONE-SPEC.md).
5
- * Collapses the state previously smeared across `ThreadResumeMap`,
6
- * `ContextThreadMap`, the in-memory peer-affinity map and `inbox.jsonl` into one
7
- * durable record keyed by `threadId`. It is the ONLY place conversation turn
8
- * state lives — the one-shot reply worker provably cannot self-police a loop, so
9
- * the turn count + novelty hashes must live here, on the conversation.
4
+ * Phase 1 of the Threadline re-assessment (THREADLINE-CONVERSATION-KEYSTONE-SPEC.md)
5
+ * introduced this as a server-process in-memory store. Phase 2a
6
+ * (THREADLINE-SINGLE-STORE-SPEC.md / CMT-497) makes it **cross-process safe** so it
7
+ * can be the ONE authoritative store and the legacy `ThreadResumeMap` can become a
8
+ * view over it.
10
9
  *
11
- * Concurrency: every write goes through `mutate(threadId, fn)`, a single-writer
12
- * surface modeled on `CommitmentTracker.mutate()` — a per-threadId FIFO queue
13
- * plus optimistic CAS on the record's `version`. This is the fix for the
14
- * convergence-flagged race where two near-simultaneous inbound messages (or a
15
- * live-inject racing a resume) would clobber `turnCount`/`lastOutboundHash` under
16
- * the legacy last-writer-wins `load→mutate→persist`.
10
+ * Concurrency (Phase 2a): `conversations.json` on disk is the source of truth.
11
+ * Every write async `mutate()` and sync `mutateSync()` does reload-per-op +
12
+ * optimistic per-record version CAS + atomic tmp-write+rename, the same
13
+ * cross-process-safe pattern the legacy maps used (reload-per-op) hardened with a
14
+ * `version` token so a same-thread race loses no update (a strict improvement over
15
+ * the legacy last-writer-wins). A write reads the LATEST full file immediately
16
+ * before committing and rewrites it with only its own record changed, so a
17
+ * concurrent write to a DIFFERENT thread from another process is preserved — the
18
+ * only residual is the microsecond window between that final re-read and the
19
+ * atomic rename, which matches the (accepted, never-observed-as-a-problem) legacy
20
+ * full-file-rewrite behavior. Reads use a very-short-TTL snapshot cache so the
21
+ * loop gate's hot path doesn't re-read on every call; staleness only ever causes a
22
+ * redundant reload on the next mutate (which always re-reads), never a lost write.
17
23
  *
18
- * Storage: {stateDir}/threadline/conversations.json (server-write-only, atomic
19
- * tmp+rename). NOT relay-hosted — authoritative state stays local. The
20
- * append-only SharedStateLedger remains the audit trail; this is the live
21
- * mutable state it logs transitions from.
24
+ * Storage: {stateDir}/threadline/conversations.json. NOT relay-hosted
25
+ * authoritative state stays local. The append-only SharedStateLedger remains the
26
+ * audit trail; this is the live mutable state it logs transitions from.
22
27
  */
23
28
  import fs from 'node:fs';
24
29
  import path from 'node:path';
@@ -31,8 +36,10 @@ const RESOLVED_GRACE_MS = 7 * 24 * 60 * 60 * 1000;
31
36
  const MAX_ENTRIES = 1000;
32
37
  /** Max depth of the per-id mutate queue. Enqueue beyond this rejects. */
33
38
  const MUTATE_QUEUE_MAX_DEPTH = 256;
34
- /** Max CAS retries when the version drifts under an apply. */
35
- const MUTATE_CAS_MAX_RETRIES = 5;
39
+ /** Max CAS retries when the version drifts under an apply (cross-process). */
40
+ const MUTATE_CAS_MAX_RETRIES = 8;
41
+ /** Read-snapshot cache TTL — keeps the gate's hot path off per-call disk reads. */
42
+ const READ_CACHE_TTL_MS = 250;
36
43
  // ── Ephemeral verified-only peer-affinity (NOT persisted) ────────
37
44
  //
38
45
  // The legacy peer-affinity map is a SHORT (10-min sliding / 2-hr absolute),
@@ -44,22 +51,36 @@ const AFFINITY_ABSOLUTE_MS = 2 * 60 * 60 * 1000;
44
51
  // ── Implementation ──────────────────────────────────────────────
45
52
  export class ConversationStore {
46
53
  filePath;
47
- store;
48
- /** Per-threadId FIFO mutate queues — serialize concurrent writers. */
54
+ /** Per-threadId FIFO mutate queues — serialize same-process concurrent writers. */
49
55
  mutateQueues = new Map();
50
56
  mutateRunning = new Set();
51
57
  /** Ephemeral verified-only peer-affinity hints (peerFingerprint → hint). */
52
58
  affinity = new Map();
59
+ /** Short-TTL read snapshot cache (disk is the source of truth). */
60
+ cache = null;
61
+ cacheAt = 0;
53
62
  constructor(stateDir) {
54
63
  const threadlineDir = path.join(stateDir, 'threadline');
55
64
  fs.mkdirSync(threadlineDir, { recursive: true });
56
65
  this.filePath = path.join(threadlineDir, 'conversations.json');
57
- this.store = this.loadStore();
58
66
  }
59
- // ── Reads (synchronous, from in-memory store) ──────────────────
67
+ // ── Reads (from disk, via a very-short-TTL snapshot cache) ─────
68
+ /** A cached snapshot of the on-disk file (reloaded after READ_CACHE_TTL_MS). */
69
+ snapshot() {
70
+ const now = Date.now();
71
+ if (this.cache && now - this.cacheAt < READ_CACHE_TTL_MS)
72
+ return this.cache;
73
+ this.cache = this.readFileFresh();
74
+ this.cacheAt = now;
75
+ return this.cache;
76
+ }
77
+ invalidateCache() {
78
+ this.cache = null;
79
+ this.cacheAt = 0;
80
+ }
60
81
  /** Get a conversation by threadId. Returns null if missing or TTL-expired. */
61
82
  get(threadId) {
62
- const c = this.store.conversations[threadId];
83
+ const c = this.snapshot().conversations[threadId];
63
84
  if (!c)
64
85
  return null;
65
86
  if (!c.pinned && this.isExpired(c))
@@ -73,7 +94,7 @@ export class ConversationStore {
73
94
  /** Find conversations whose peer set includes the given fingerprint/name. */
74
95
  getByParticipant(participant) {
75
96
  const out = [];
76
- for (const c of Object.values(this.store.conversations)) {
97
+ for (const c of Object.values(this.snapshot().conversations)) {
77
98
  if (c.pinned || !this.isExpired(c)) {
78
99
  if (c.participants.peers.includes(participant) || c.remoteAgent === participant) {
79
100
  out.push(c);
@@ -84,7 +105,7 @@ export class ConversationStore {
84
105
  }
85
106
  /** Find the conversation bound to a Telegram topic, if any. */
86
107
  getByTopicId(topicId) {
87
- for (const c of Object.values(this.store.conversations)) {
108
+ for (const c of Object.values(this.snapshot().conversations)) {
88
109
  if (c.boundTopicId === topicId && (c.pinned || !this.isExpired(c)))
89
110
  return c;
90
111
  }
@@ -92,7 +113,7 @@ export class ConversationStore {
92
113
  }
93
114
  /** Reverse lookup: conversation owning an A2A contextId (identity-bound). */
94
115
  getByContextId(contextId, agentIdentity) {
95
- for (const c of Object.values(this.store.conversations)) {
116
+ for (const c of Object.values(this.snapshot().conversations)) {
96
117
  if (c.contextId === contextId && (c.pinned || !this.isExpired(c))) {
97
118
  // Identity binding — prevents session smuggling (ContextThreadMap parity).
98
119
  if (c.agentIdentity && c.agentIdentity !== agentIdentity)
@@ -105,7 +126,7 @@ export class ConversationStore {
105
126
  /** List active/idle conversations (not resolved/failed/archived). */
106
127
  listActive() {
107
128
  const out = [];
108
- for (const c of Object.values(this.store.conversations)) {
129
+ for (const c of Object.values(this.snapshot().conversations)) {
109
130
  if ((c.state === 'active' || c.state === 'idle' || c.state === 'open' || c.state === 'awaiting-reply') &&
110
131
  (c.pinned || !this.isExpired(c))) {
111
132
  out.push(c);
@@ -113,9 +134,18 @@ export class ConversationStore {
113
134
  }
114
135
  return out;
115
136
  }
137
+ /** All non-expired (or pinned) conversations, any lifecycle state. */
138
+ all() {
139
+ const out = [];
140
+ for (const c of Object.values(this.snapshot().conversations)) {
141
+ if (c.pinned || !this.isExpired(c))
142
+ out.push(c);
143
+ }
144
+ return out;
145
+ }
116
146
  /** Total stored conversations (for monitoring). */
117
147
  size() {
118
- return Object.keys(this.store.conversations).length;
148
+ return Object.keys(this.snapshot().conversations).length;
119
149
  }
120
150
  // ── Writes (single-writer CAS) ─────────────────────────────────
121
151
  /**
@@ -172,52 +202,105 @@ export class ConversationStore {
172
202
  async applyMutationWithCAS(threadId, fn) {
173
203
  let attempt = 0;
174
204
  while (attempt <= MUTATE_CAS_MAX_RETRIES) {
175
- const current = this.store.conversations[threadId] ?? this.skeleton(threadId);
205
+ const file = this.readFileFresh();
206
+ const current = file.conversations[threadId] ?? this.skeleton(threadId);
176
207
  const observedVersion = current.version ?? 0;
177
208
  const draft = { ...current, participants: { ...current.participants, peers: [...current.participants.peers] } };
178
209
  const next = await fn(draft);
179
- // CAS: the record's version must not have drifted underneath us.
180
- const latest = this.store.conversations[threadId];
181
- const latestVersion = latest?.version ?? (latest ? 0 : observedVersion);
182
- if (latest && latestVersion !== observedVersion) {
210
+ // Re-read fresh immediately before commit: CAS against the latest on-disk
211
+ // version, AND preserve any concurrent write to a DIFFERENT thread.
212
+ const latestFile = this.readFileFresh();
213
+ const latest = latestFile.conversations[threadId];
214
+ if (latest && (latest.version ?? 0) !== observedVersion) {
183
215
  attempt++;
184
- continue;
216
+ continue; // someone else mutated THIS thread — reload and retry
185
217
  }
186
- const committed = {
187
- ...next,
188
- threadId,
189
- version: observedVersion + 1,
190
- savedAt: new Date().toISOString(),
191
- };
192
- this.store.conversations[threadId] = committed;
193
- this.pruneIfNeeded();
194
- this.saveStore();
218
+ const committed = this.commit(latestFile, threadId, next, observedVersion);
195
219
  return committed;
196
220
  }
197
221
  throw new Error(`ConversationStore.mutate: CAS retry budget exhausted for ${threadId} after ${MUTATE_CAS_MAX_RETRIES} retries`);
198
222
  }
199
223
  /**
200
- * Direct upsert of a full record WITHOUT going through the CAS queue. ONLY
201
- * for migration / bulk import where there are no concurrent writers. Runtime
202
- * writers MUST use mutate().
224
+ * Synchronous single-record mutate (Phase 2a). Used by the synchronous legacy
225
+ * interfaces (the `ThreadResumeMap` view's `save`/`remove`/etc.). Same file
226
+ * version-CAS as `mutate`, but the fn is synchronous so the re-read→write
227
+ * window has no await and is atomic within this process. Cross-process safety
228
+ * is identical to `mutate` (per-record version CAS + atomic rename).
229
+ *
230
+ * The fn MAY return null to signal "delete this record".
231
+ */
232
+ mutateSync(threadId, fn) {
233
+ let attempt = 0;
234
+ while (attempt <= MUTATE_CAS_MAX_RETRIES) {
235
+ const file = this.readFileFresh();
236
+ const current = file.conversations[threadId] ?? this.skeleton(threadId);
237
+ const observedVersion = current.version ?? 0;
238
+ const draft = { ...current, participants: { ...current.participants, peers: [...current.participants.peers] } };
239
+ const next = fn(draft);
240
+ const latestFile = this.readFileFresh();
241
+ const latest = latestFile.conversations[threadId];
242
+ if (latest && (latest.version ?? 0) !== observedVersion) {
243
+ attempt++;
244
+ continue;
245
+ }
246
+ if (next === null) {
247
+ if (latestFile.conversations[threadId]) {
248
+ delete latestFile.conversations[threadId];
249
+ this.writeFileAtomic(latestFile);
250
+ this.invalidateCache();
251
+ }
252
+ return null;
253
+ }
254
+ return this.commit(latestFile, threadId, next, observedVersion);
255
+ }
256
+ throw new Error(`ConversationStore.mutateSync: CAS retry budget exhausted for ${threadId} after ${MUTATE_CAS_MAX_RETRIES} retries`);
257
+ }
258
+ /** Commit a record into the freshly-read file with version+1 (LOAD-BEARING:
259
+ * both async and sync commit paths bump version so the CAS detects races). */
260
+ commit(file, threadId, next, observedVersion) {
261
+ const committed = {
262
+ ...next,
263
+ threadId,
264
+ version: observedVersion + 1,
265
+ savedAt: new Date().toISOString(),
266
+ };
267
+ file.conversations[threadId] = committed;
268
+ this.pruneMapInPlace(file.conversations);
269
+ this.writeFileAtomic(file);
270
+ this.invalidateCache();
271
+ return committed;
272
+ }
273
+ /**
274
+ * Direct upsert of a full record. Used by migration / bulk import. Now does a
275
+ * read-merge-write so it is safe even if the file changed since construction.
203
276
  */
204
277
  importDirect(conversation) {
205
- const existing = this.store.conversations[conversation.threadId];
206
- this.store.conversations[conversation.threadId] = {
278
+ const file = this.pendingFile ?? this.readFileFresh();
279
+ const existing = file.conversations[conversation.threadId];
280
+ file.conversations[conversation.threadId] = {
207
281
  ...conversation,
208
282
  version: existing ? Math.max(existing.version ?? 0, conversation.version ?? 0) : (conversation.version ?? 0),
209
283
  savedAt: new Date().toISOString(),
210
284
  };
285
+ this.pendingFile = file;
211
286
  }
287
+ /** Holds an in-flight importDirect batch until flush(). */
288
+ pendingFile = null;
212
289
  /** Persist after a batch of importDirect calls. */
213
290
  flush() {
214
- this.saveStore();
291
+ if (this.pendingFile) {
292
+ this.writeFileAtomic(this.pendingFile);
293
+ this.pendingFile = null;
294
+ this.invalidateCache();
295
+ }
215
296
  }
216
297
  /** Remove a conversation. */
217
298
  remove(threadId) {
218
- if (this.store.conversations[threadId]) {
219
- delete this.store.conversations[threadId];
220
- this.saveStore();
299
+ const file = this.readFileFresh();
300
+ if (file.conversations[threadId]) {
301
+ delete file.conversations[threadId];
302
+ this.writeFileAtomic(file);
303
+ this.invalidateCache();
221
304
  }
222
305
  }
223
306
  // ── Ephemeral verified-only peer affinity (in-memory, non-durable) ──
@@ -252,8 +335,10 @@ export class ConversationStore {
252
335
  // ── Maintenance ────────────────────────────────────────────────
253
336
  /** Prune expired + resolved-past-grace + LRU-overflow (non-pinned). */
254
337
  prune() {
255
- this.pruneMap();
256
- this.saveStore();
338
+ const file = this.readFileFresh();
339
+ this.pruneMapInPlace(file.conversations);
340
+ this.writeFileAtomic(file);
341
+ this.invalidateCache();
257
342
  }
258
343
  // ── Private helpers ────────────────────────────────────────────
259
344
  skeleton(threadId) {
@@ -279,13 +364,8 @@ export class ConversationStore {
279
364
  const ref = c.lastActivityAt || c.savedAt;
280
365
  return now - new Date(ref).getTime() > MAX_AGE_MS;
281
366
  }
282
- pruneIfNeeded() {
283
- if (Object.keys(this.store.conversations).length > MAX_ENTRIES)
284
- this.pruneMap();
285
- }
286
- pruneMap() {
287
- const map = this.store.conversations;
288
- // Phase 1: drop expired / resolved-past-grace (non-pinned).
367
+ /** Prune a conversations map in place (non-pinned expired + LRU overflow). */
368
+ pruneMapInPlace(map) {
289
369
  for (const key of Object.keys(map)) {
290
370
  const c = map[key];
291
371
  if (c.pinned)
@@ -293,7 +373,6 @@ export class ConversationStore {
293
373
  if (this.isExpired(c))
294
374
  delete map[key];
295
375
  }
296
- // Phase 2: LRU eviction if still over cap.
297
376
  const keys = Object.keys(map);
298
377
  if (keys.length <= MAX_ENTRIES)
299
378
  return;
@@ -310,7 +389,8 @@ export class ConversationStore {
310
389
  delete map[unpinned[i].key];
311
390
  }
312
391
  }
313
- loadStore() {
392
+ /** Read + parse the on-disk store fresh (the source of truth). */
393
+ readFileFresh() {
314
394
  try {
315
395
  if (fs.existsSync(this.filePath)) {
316
396
  const data = JSON.parse(fs.readFileSync(this.filePath, 'utf-8'));
@@ -320,17 +400,18 @@ export class ConversationStore {
320
400
  }
321
401
  }
322
402
  catch {
323
- // Corrupted — start fresh.
403
+ // Corrupted / mid-write torn read treat as empty; the next write heals it.
324
404
  }
325
405
  return { version: 1, conversations: {}, lastModified: new Date().toISOString() };
326
406
  }
327
- saveStore() {
328
- this.store.lastModified = new Date().toISOString();
407
+ /** Atomic write (tmp + rename) — no reader ever sees a torn file. */
408
+ writeFileAtomic(file) {
409
+ file.lastModified = new Date().toISOString();
329
410
  try {
330
411
  const dir = path.dirname(this.filePath);
331
412
  fs.mkdirSync(dir, { recursive: true });
332
- const tmpPath = `${this.filePath}.${process.pid}.tmp`;
333
- fs.writeFileSync(tmpPath, JSON.stringify(this.store, null, 2) + '\n');
413
+ const tmpPath = `${this.filePath}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
414
+ fs.writeFileSync(tmpPath, JSON.stringify(file, null, 2) + '\n');
334
415
  fs.renameSync(tmpPath, this.filePath);
335
416
  }
336
417
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationStore.js","sourceRoot":"","sources":["../../src/threadline/ConversationStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConversationStore.js","sourceRoot":"","sources":["../../src/threadline/ConversationStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAsG7B,mEAAmE;AAEnE,mFAAmF;AACnF,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC3C,gFAAgF;AAChF,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAClD,+EAA+E;AAC/E,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB,yEAAyE;AACzE,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,8EAA8E;AAC9E,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,mFAAmF;AACnF,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,oEAAoE;AACpE,EAAE;AACF,4EAA4E;AAC5E,0EAA0E;AAC1E,2EAA2E;AAC3E,0EAA0E;AAC1E,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC3C,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAgBhD,mEAAmE;AAEnE,MAAM,OAAO,iBAAiB;IACpB,QAAQ,CAAS;IAEzB,mFAAmF;IAC3E,YAAY,GAAoC,IAAI,GAAG,EAAE,CAAC;IAC1D,aAAa,GAAgB,IAAI,GAAG,EAAE,CAAC;IAE/C,4EAA4E;IACpE,QAAQ,GAA8B,IAAI,GAAG,EAAE,CAAC;IAExD,mEAAmE;IAC3D,KAAK,GAAiC,IAAI,CAAC;IAC3C,OAAO,GAAG,CAAC,CAAC;IAEpB,YAAY,QAAgB;QAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxD,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;IACjE,CAAC;IAED,kEAAkE;IAElE,gFAAgF;IACxE,QAAQ;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,iBAAiB;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QAC5E,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,8EAA8E;IAC9E,GAAG,CAAC,QAAgB;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAChD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,oEAAoE;IACpE,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACrC,CAAC;IAED,6EAA6E;IAC7E,gBAAgB,CAAC,WAAmB;QAClC,MAAM,GAAG,GAAmB,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;oBAChF,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,+DAA+D;IAC/D,YAAY,CAAC,OAAe;QAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,CAAC,YAAY,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAC7E,cAAc,CAAC,SAAiB,EAAE,aAAqB;QACrD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,2EAA2E;gBAC3E,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,aAAa,KAAK,aAAa;oBAAE,OAAO,IAAI,CAAC;gBACtE,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qEAAqE;IACrE,UAAU;QACR,MAAM,GAAG,GAAmB,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,gBAAgB,CAAC;gBAClG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,sEAAsE;IACtE,GAAG;QACD,MAAM,GAAG,GAAmB,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,mDAAmD;IACnD,IAAI;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;IAC3D,CAAC;IAED,kEAAkE;IAElE;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,EAAwB;QACrD,OAAO,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnD,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,IAAI,sBAAsB,EAAE,CAAC;gBAC3C,MAAM,CAAC,IAAI,KAAK,CACd,4CAA4C,QAAQ,WAAW,KAAK,CAAC,MAAM,OAAO,sBAAsB,GAAG,CAC5G,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACpC,KAAK,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QAC7C,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO;QAC7C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9C,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;gBAC7B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;oBACnE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACxB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,KAAK,CAAC,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;YACD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,QAAgB,EAAE,EAAwB;QAC3E,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,OAAO,IAAI,sBAAsB,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxE,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;YAE7C,MAAM,KAAK,GAAiB,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;YAC9H,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;YAE7B,0EAA0E;YAC1E,oEAAoE;YACpE,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,eAAe,EAAE,CAAC;gBACxD,OAAO,EAAE,CAAC;gBACV,SAAS,CAAC,sDAAsD;YAClE,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;YAC3E,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,KAAK,CACb,4DAA4D,QAAQ,UAAU,sBAAsB,UAAU,CAC/G,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,UAAU,CAAC,QAAgB,EAAE,EAAgD;QAC3E,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,OAAO,IAAI,sBAAsB,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxE,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAiB,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;YAC9H,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,eAAe,EAAE,CAAC;gBACxD,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,IAAI,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACvC,OAAO,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAC1C,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;oBACjC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,IAAI,KAAK,CACb,gEAAgE,QAAQ,UAAU,sBAAsB,UAAU,CACnH,CAAC;IACJ,CAAC;IAED;mFAC+E;IACvE,MAAM,CAAC,IAA2B,EAAE,QAAgB,EAAE,IAAkB,EAAE,eAAuB;QACvG,MAAM,SAAS,GAAiB;YAC9B,GAAG,IAAI;YACP,QAAQ;YACR,OAAO,EAAE,eAAe,GAAG,CAAC;YAC5B,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAClC,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;QACzC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,YAA0B;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG;YAC1C,GAAG,YAAY;YACf,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,EAAE,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;YAC5G,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAClC,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,2DAA2D;IACnD,WAAW,GAAiC,IAAI,CAAC;IAEzD,mDAAmD;IACnD,KAAK;QACH,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,CAAC,QAAgB;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,uEAAuE;IAEvE;;;;;OAKG;IACH,cAAc,CAAC,eAAuB,EAAE,QAAgB;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/C,QAAQ,CAAC,QAAQ,GAAG,GAAG,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,WAAW,CAAC,eAAuB;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,mBAAmB,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,oBAAoB,EAAE,CAAC;YAC7F,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,kEAAkE;IAElE,uEAAuE;IACvE,KAAK;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,kEAAkE;IAE1D,QAAQ,CAAC,QAAgB;QAC/B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,CAAC;YACV,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAC3B,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,KAAK;YACb,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,GAAG;YACd,OAAO,EAAE,GAAG;YACZ,cAAc,EAAE,GAAG;SACpB,CAAC;IACJ,CAAC;IAEO,SAAS,CAAC,CAAe;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC3C,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC;QACpE,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,OAAO,CAAC;QAC1C,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC;IACpD,CAAC;IAED,8EAA8E;IACtE,eAAe,CAAC,GAAiC;QACvD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,CAAC,MAAM;gBAAE,SAAS;YACvB,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,IAAI,WAAW;YAAE,OAAO;QACvC,MAAM,QAAQ,GAAsC,EAAE,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,CAAC,MAAM;gBAAE,SAAS;YACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxD,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,kEAAkE;IAC1D,aAAa;QACnB,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBACjE,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;oBAC/F,OAAO,IAA6B,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6EAA6E;QAC/E,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IACnF,CAAC;IAED,qEAAqE;IAC7D,eAAe,CAAC,IAA2B;QACjD,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7F,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAChE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;QAC5E,CAAC;IACH,CAAC;CACF"}
@@ -1,164 +1,97 @@
1
1
  /**
2
- * ThreadResumeMap — Persistent mapping from thread IDs to Claude session UUIDs.
2
+ * ThreadResumeMap — persistent mapping from thread IDs to Claude/Codex session
3
+ * UUIDs, for `--resume`.
3
4
  *
4
- * Analogous to TopicResumeMap but for inter-agent conversation threads.
5
- * When a thread's session is killed idle, the Claude session UUID is persisted
6
- * so it can be resumed (--resume UUID) when the next message arrives on that thread.
5
+ * Phase 2a (THREADLINE-SINGLE-STORE-SPEC.md / CMT-497): this is now a **view over
6
+ * `ConversationStore`** the single source of truth. Every method maps the legacy
7
+ * `ThreadResumeEntry` shape onto a `Conversation` record via the field bridge
8
+ * below. `save` MERGES (it never clobbers the loop gate's `turnCount`/
9
+ * `lastInboundHash`/`lastOutboundHash`). The on-disk `thread-resume-map.json` is no
10
+ * longer written; a one-release dual-read window falls back to it on a miss and
11
+ * writes through, so threads written by a pre-2a version are not lost.
7
12
  *
8
- * Key differences from TopicResumeMap:
9
- * - Maps threadId (string UUID) → extended session info
10
- * - 7-day TTL (vs. 24 hours)
11
- * - Max 1,000 entries with LRU eviction of non-pinned entries
12
- * - Resolved threads get a 7-day grace period before removal
13
- * - Pinned threads are never evicted
14
- *
15
- * Storage: {stateDir}/threadline/thread-resume-map.json
13
+ * Field bridge (ThreadResumeEntry ↔ Conversation):
14
+ * uuid↔sessionUuid · sessionName↔boundSessionName · lastAccessedAt↔lastActivityAt
15
+ * originTopicId↔boundTopicId · originSessionName↔originSessionName · the rest 1:1.
16
16
  */
17
- /** Thread lifecycle state */
17
+ import { ConversationStore } from './ConversationStore.js';
18
+ /** Thread lifecycle state (legacy subset of ConversationState). */
18
19
  export type ThreadState = 'active' | 'idle' | 'resolved' | 'failed' | 'archived';
19
- /** A single thread resume mapping entry */
20
+ /** A single thread resume mapping entry. */
20
21
  export interface ThreadResumeEntry {
21
- /** Claude session UUID */
22
22
  uuid: string;
23
- /** tmux session name */
24
23
  sessionName: string;
25
- /** When thread was created */
26
24
  createdAt: string;
27
- /** When this mapping was last saved */
28
25
  savedAt: string;
29
- /** When thread was last accessed */
30
26
  lastAccessedAt: string;
31
- /** The other agent in this conversation */
32
27
  remoteAgent: string;
33
- /** Thread subject */
34
28
  subject: string;
35
- /** Thread lifecycle state */
36
29
  state: ThreadState;
37
- /** When thread was resolved (only set if state === 'resolved') */
38
30
  resolvedAt?: string;
39
- /** Pinned threads are never evicted */
40
31
  pinned: boolean;
41
- /** Total messages in thread */
42
32
  messageCount: number;
43
- /** Machine that owns this thread (for cross-machine sync) */
44
33
  machineOrigin?: string;
45
- /** If migrated to another machine, which one */
46
34
  migratedTo?: string;
47
- /** Spawn mode: interactive (default) or pipe */
48
35
  spawnMode?: 'interactive' | 'pipe';
49
- /**
50
- * Thread↔Topic linkage (THREAD-TOPIC-LINKAGE-SPEC.md).
51
- * If this thread was initiated by a topic-bound session, the Telegram topic
52
- * that owns it. Set on outbound send; used by inbound dispatch to route the
53
- * reply back to the originating topic session instead of a sibling worker.
54
- */
55
36
  originTopicId?: number;
56
- /**
57
- * Session name of the originating topic at send time. Fast-path cache so the
58
- * inbound dispatcher doesn't have to query CommitmentTracker on every reply.
59
- * The source of truth for "what topic owns this thread" is the commitment
60
- * record with `verificationMethod: 'threadline-reply'`.
61
- */
62
37
  originSessionName?: string;
63
38
  }
64
39
  export declare class ThreadResumeMap {
65
- private filePath;
40
+ private store;
41
+ private legacyPath;
66
42
  private projectDir;
67
43
  private tmuxPath;
68
- constructor(stateDir: string, projectDir: string, tmuxPath?: string);
69
- /**
70
- * Save or update a thread resume mapping.
71
- * Triggers pruning if the map exceeds MAX_ENTRIES.
72
- */
73
- save(threadId: string, entry: ThreadResumeEntry): void;
44
+ constructor(stateDir: string, projectDir: string, tmuxPath?: string, store?: ConversationStore);
74
45
  /**
75
- * Look up a thread resume entry. Returns null if not found,
76
- * expired, or the JSONL file no longer exists.
46
+ * Look up a thread resume entry. Returns null if not found, expired, or the
47
+ * session JSONL no longer exists. Dual-read: on a ConversationStore miss, fall
48
+ * back to the legacy file and write through (one-release transition window).
77
49
  */
78
50
  get(threadId: string): ThreadResumeEntry | null;
79
- /**
80
- * Remove a thread entry.
81
- */
51
+ /** Save or update a thread resume mapping (MERGES — preserves gate turn state). */
52
+ save(threadId: string, entry: ThreadResumeEntry): void;
53
+ /** Remove a thread entry (cross-process safe via ConversationStore). */
82
54
  remove(threadId: string): void;
83
- /**
84
- * Mark a thread as resolved — sets state to 'resolved' and records resolvedAt.
85
- * Resolved threads get a grace period before being removed by prune().
86
- */
55
+ /** Mark a thread resolved (grace period before removal). */
87
56
  resolve(threadId: string): void;
88
- /**
89
- * Mark entries from a specific machine as migrated (Phase 4: cross-machine sync).
90
- * Called during failover when this machine takes over from another.
91
- * The migrated entries can be used to resume threads with --resume UUID.
92
- */
93
- migrateFrom(sourceMachine: string, targetMachine: string): {
94
- migrated: number;
95
- skipped: number;
96
- };
97
- /**
98
- * Get entries that were migrated to this machine (for resume capability).
99
- */
100
- getMigratedEntries(targetMachine: string): Array<{
101
- threadId: string;
102
- entry: ThreadResumeEntry;
103
- }>;
104
- /**
105
- * Pin a thread — pinned threads are never evicted by LRU or TTL.
106
- */
57
+ /** Pin — never evicted. */
107
58
  pin(threadId: string): void;
108
- /**
109
- * Unpin a thread — allows normal TTL and LRU eviction.
110
- */
59
+ /** Unpin — allow normal TTL/LRU eviction. */
111
60
  unpin(threadId: string): void;
112
- /**
113
- * Find all threads with a specific remote agent.
114
- * Returns entries that are not expired.
115
- */
61
+ /** Find all (non-expired) threads with a specific remote agent. */
116
62
  getByRemoteAgent(agentName: string): Array<{
117
63
  threadId: string;
118
64
  entry: ThreadResumeEntry;
119
65
  }>;
120
- /**
121
- * List all active or idle threads (not resolved, failed, or archived).
122
- */
66
+ /** List all active or idle threads. */
123
67
  listActive(): Array<{
124
68
  threadId: string;
125
69
  entry: ThreadResumeEntry;
126
70
  }>;
127
- /**
128
- * Prune expired entries, resolved entries past grace period,
129
- * and LRU overflow entries. Called automatically on save, but
130
- * can be called manually for maintenance.
131
- */
71
+ /** Cross-machine failover: demote a source machine's active threads to idle. */
72
+ migrateFrom(sourceMachine: string, targetMachine: string): {
73
+ migrated: number;
74
+ skipped: number;
75
+ };
76
+ /** Get entries migrated to this machine (for resume capability). */
77
+ getMigratedEntries(targetMachine: string): Array<{
78
+ threadId: string;
79
+ entry: ThreadResumeEntry;
80
+ }>;
81
+ /** Total stored entries (for monitoring). */
82
+ size(): number;
83
+ /** Prune expired / resolved-past-grace / LRU overflow. */
132
84
  prune(): void;
133
85
  /**
134
- * Proactive resume heartbeat: scan all active thread-linked tmux sessions
135
- * and update the thread→UUID mapping. Should be called periodically.
136
- *
137
- * This ensures that even if a session crashes unexpectedly, we already have
138
- * its UUID on file for --resume.
86
+ * Proactive resume heartbeat: scan active thread-linked tmux sessions and
87
+ * update the thread→UUID mapping so a crash leaves the UUID on file.
139
88
  */
140
89
  refreshResumeMappings(threadSessions: Map<string, string>): void;
141
- /**
142
- * Get the total number of entries in the map (for monitoring).
143
- */
144
- size(): number;
145
- private load;
146
- private persist;
147
- /**
148
- * Check if an entry is expired based on its state and age.
149
- * - Active/idle: expire after MAX_AGE_MS from lastAccessedAt
150
- * - Resolved: expire after RESOLVED_GRACE_MS from resolvedAt
151
- * - Failed/archived: expire after MAX_AGE_MS from savedAt
152
- */
90
+ /** Dual-read: read a single entry from the frozen legacy file, if present + fresh. */
91
+ private readLegacyEntry;
153
92
  private isExpired;
154
- /**
155
- * Prune a map in-place: remove expired entries, resolved-past-grace entries,
156
- * and LRU overflow (non-pinned) entries.
157
- */
158
- private pruneMap;
159
- /**
160
- * Check if a JSONL file exists for the given UUID.
161
- */
162
- private jsonlExists;
93
+ /** Check if a JSONL file exists for the given session UUID. (protected so
94
+ * tests can bypass the filesystem check via a subclass.) */
95
+ protected jsonlExists(uuid: string): boolean;
163
96
  }
164
97
  //# sourceMappingURL=ThreadResumeMap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadResumeMap.d.ts","sourceRoot":"","sources":["../../src/threadline/ThreadResumeMap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ThreadResumeMap.d.ts","sourceRoot":"","sources":["../../src/threadline/ThreadResumeMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,EAAE,iBAAiB,EAAqB,MAAM,wBAAwB,CAAC;AAI9E,mEAAmE;AACnE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEjF,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAqED,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,iBAAiB;IAO9F;;;;OAIG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAgB/C,mFAAmF;IACnF,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAItD,wEAAwE;IACxE,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI9B,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAS/B,2BAA2B;IAC3B,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK3B,6CAA6C;IAC7C,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK7B,mEAAmE;IACnE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAK1F,uCAAuC;IACvC,UAAU,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAMnE,gFAAgF;IAChF,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAoBhG,oEAAoE;IACpE,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAMhG,6CAA6C;IAC7C,IAAI,IAAI,MAAM;IAId,0DAA0D;IAC1D,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,qBAAqB,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IA6ChE,sFAAsF;IACtF,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,SAAS;IASjB;iEAC6D;IAC7D,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAa7C"}