instar 1.2.74 → 1.2.76

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 (45) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +43 -1
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  5. package/dist/config/ConfigDefaults.js +6 -0
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/core/Usher.d.ts +57 -0
  8. package/dist/core/Usher.d.ts.map +1 -0
  9. package/dist/core/Usher.js +179 -0
  10. package/dist/core/Usher.js.map +1 -0
  11. package/dist/core/UsherSignalStore.d.ts +58 -0
  12. package/dist/core/UsherSignalStore.d.ts.map +1 -0
  13. package/dist/core/UsherSignalStore.js +113 -0
  14. package/dist/core/UsherSignalStore.js.map +1 -0
  15. package/dist/core/types.d.ts +8 -0
  16. package/dist/core/types.d.ts.map +1 -1
  17. package/dist/core/types.js.map +1 -1
  18. package/dist/server/AgentServer.d.ts +2 -0
  19. package/dist/server/AgentServer.d.ts.map +1 -1
  20. package/dist/server/AgentServer.js +5 -0
  21. package/dist/server/AgentServer.js.map +1 -1
  22. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  23. package/dist/server/CapabilityIndex.js +1 -0
  24. package/dist/server/CapabilityIndex.js.map +1 -1
  25. package/dist/server/usherRoutes.d.ts +16 -0
  26. package/dist/server/usherRoutes.d.ts.map +1 -0
  27. package/dist/server/usherRoutes.js +40 -0
  28. package/dist/server/usherRoutes.js.map +1 -0
  29. package/dist/threadline/ConversationStore.d.ts +53 -25
  30. package/dist/threadline/ConversationStore.d.ts.map +1 -1
  31. package/dist/threadline/ConversationStore.js +149 -68
  32. package/dist/threadline/ConversationStore.js.map +1 -1
  33. package/dist/threadline/ThreadResumeMap.d.ts +49 -116
  34. package/dist/threadline/ThreadResumeMap.d.ts.map +1 -1
  35. package/dist/threadline/ThreadResumeMap.js +194 -252
  36. package/dist/threadline/ThreadResumeMap.js.map +1 -1
  37. package/dist/threadline/ThreadlineObservability.d.ts +6 -1
  38. package/dist/threadline/ThreadlineObservability.d.ts.map +1 -1
  39. package/dist/threadline/ThreadlineObservability.js +17 -8
  40. package/dist/threadline/ThreadlineObservability.js.map +1 -1
  41. package/package.json +1 -1
  42. package/src/data/builtin-manifest.json +3 -3
  43. package/upgrades/1.2.75.md +69 -0
  44. package/upgrades/1.2.76.md +64 -0
  45. package/upgrades/side-effects/cwa-usher.md +82 -0
@@ -1,202 +1,210 @@
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
17
  import fs from 'node:fs';
18
18
  import path from 'node:path';
19
19
  import os from 'node:os';
20
20
  import { spawnSync } from 'node:child_process';
21
+ import { ConversationStore } from './ConversationStore.js';
22
+ // ── Field bridge ────────────────────────────────────────────────
23
+ /** Map a Conversation lifecycle state onto the legacy ThreadState subset. */
24
+ function toThreadState(s) {
25
+ if (s === 'open' || s === 'awaiting-reply')
26
+ return 'active';
27
+ return s;
28
+ }
29
+ /** Conversation → ThreadResumeEntry (read direction). */
30
+ function conversationToEntry(c) {
31
+ return {
32
+ uuid: c.sessionUuid ?? '',
33
+ sessionName: c.boundSessionName ?? '',
34
+ createdAt: c.createdAt,
35
+ savedAt: c.savedAt,
36
+ lastAccessedAt: c.lastActivityAt,
37
+ remoteAgent: c.remoteAgent ?? c.participants.peers[0] ?? '',
38
+ subject: c.subject ?? '',
39
+ state: toThreadState(c.state),
40
+ resolvedAt: c.resolvedAt,
41
+ pinned: c.pinned,
42
+ messageCount: c.messageCount,
43
+ machineOrigin: c.machineOrigin,
44
+ migratedTo: c.migratedTo,
45
+ spawnMode: c.spawnMode,
46
+ originTopicId: c.boundTopicId,
47
+ originSessionName: c.originSessionName,
48
+ };
49
+ }
50
+ /**
51
+ * Apply a ThreadResumeEntry onto a Conversation draft (write direction) —
52
+ * MERGING: resume fields are set from the entry, but the loop gate's
53
+ * `turnCount`/`lastInboundHash`/`lastOutboundHash` are LEFT INTACT (convergence
54
+ * finding — a legacy save must not wipe turn state).
55
+ */
56
+ function applyEntryToConversation(entry, draft) {
57
+ if (entry.uuid)
58
+ draft.sessionUuid = entry.uuid;
59
+ if (entry.sessionName)
60
+ draft.boundSessionName = entry.sessionName;
61
+ if (entry.remoteAgent) {
62
+ draft.remoteAgent = entry.remoteAgent;
63
+ if (!draft.participants.peers.includes(entry.remoteAgent))
64
+ draft.participants.peers.push(entry.remoteAgent);
65
+ }
66
+ if (entry.subject)
67
+ draft.subject = entry.subject;
68
+ draft.state = entry.state; // legacy state is authoritative on an explicit save
69
+ if (entry.resolvedAt !== undefined)
70
+ draft.resolvedAt = entry.resolvedAt;
71
+ draft.pinned = entry.pinned;
72
+ // messageCount is shared with the gate — never go backwards.
73
+ draft.messageCount = Math.max(draft.messageCount ?? 0, entry.messageCount ?? 0);
74
+ if (entry.machineOrigin !== undefined)
75
+ draft.machineOrigin = entry.machineOrigin;
76
+ if (entry.migratedTo !== undefined)
77
+ draft.migratedTo = entry.migratedTo;
78
+ if (entry.spawnMode !== undefined)
79
+ draft.spawnMode = entry.spawnMode;
80
+ if (entry.originTopicId !== undefined)
81
+ draft.boundTopicId = entry.originTopicId;
82
+ if (entry.originSessionName !== undefined)
83
+ draft.originSessionName = entry.originSessionName;
84
+ if (entry.createdAt && draft.version === 0)
85
+ draft.createdAt = entry.createdAt;
86
+ draft.lastActivityAt = entry.lastAccessedAt || new Date().toISOString();
87
+ // turnCount / lastInboundHash / lastOutboundHash: intentionally untouched.
88
+ return draft;
89
+ }
21
90
  // ── Constants ───────────────────────────────────────────────────
22
- /** Entries older than 7 days are pruned (non-pinned only) */
23
91
  const MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
24
- /** Resolved threads get a 7-day grace period before removal */
25
92
  const RESOLVED_GRACE_MS = 7 * 24 * 60 * 60 * 1000;
26
- /** Maximum number of entries before LRU eviction */
27
- const MAX_ENTRIES = 1000;
28
93
  // ── Implementation ──────────────────────────────────────────────
29
94
  export class ThreadResumeMap {
30
- filePath;
95
+ store;
96
+ legacyPath;
31
97
  projectDir;
32
98
  tmuxPath;
33
- constructor(stateDir, projectDir, tmuxPath) {
34
- const threadlineDir = path.join(stateDir, 'threadline');
35
- fs.mkdirSync(threadlineDir, { recursive: true });
36
- this.filePath = path.join(threadlineDir, 'thread-resume-map.json');
99
+ constructor(stateDir, projectDir, tmuxPath, store) {
100
+ this.store = store ?? new ConversationStore(stateDir);
101
+ this.legacyPath = path.join(stateDir, 'threadline', 'thread-resume-map.json');
37
102
  this.projectDir = projectDir;
38
103
  this.tmuxPath = tmuxPath || 'tmux';
39
104
  }
40
105
  /**
41
- * Save or update a thread resume mapping.
42
- * Triggers pruning if the map exceeds MAX_ENTRIES.
43
- */
44
- save(threadId, entry) {
45
- const map = this.load();
46
- map[threadId] = {
47
- ...entry,
48
- savedAt: new Date().toISOString(),
49
- };
50
- // Prune if needed
51
- this.pruneMap(map);
52
- this.persist(map);
53
- }
54
- /**
55
- * Look up a thread resume entry. Returns null if not found,
56
- * expired, or the JSONL file no longer exists.
106
+ * Look up a thread resume entry. Returns null if not found, expired, or the
107
+ * session JSONL no longer exists. Dual-read: on a ConversationStore miss, fall
108
+ * back to the legacy file and write through (one-release transition window).
57
109
  */
58
110
  get(threadId) {
59
- const map = this.load();
60
- const entry = map[threadId];
61
- if (!entry)
62
- return null;
63
- // Check if expired (non-pinned only)
64
- if (!entry.pinned && this.isExpired(entry)) {
65
- return null;
111
+ let c = this.store.get(threadId);
112
+ if (!c) {
113
+ const legacy = this.readLegacyEntry(threadId);
114
+ if (legacy) {
115
+ this.save(threadId, legacy); // write-through to ConversationStore
116
+ c = this.store.get(threadId);
117
+ }
66
118
  }
67
- // Verify the JSONL file still exists
68
- if (!this.jsonlExists(entry.uuid)) {
119
+ if (!c)
120
+ return null;
121
+ const entry = conversationToEntry(c);
122
+ // Resume guard: the session JSONL must still exist (unless pinned).
123
+ if (!entry.pinned && !this.jsonlExists(entry.uuid))
69
124
  return null;
70
- }
71
125
  return entry;
72
126
  }
73
- /**
74
- * Remove a thread entry.
75
- */
127
+ /** Save or update a thread resume mapping (MERGES — preserves gate turn state). */
128
+ save(threadId, entry) {
129
+ this.store.mutateSync(threadId, draft => applyEntryToConversation({ ...entry, savedAt: new Date().toISOString() }, draft));
130
+ }
131
+ /** Remove a thread entry (cross-process safe via ConversationStore). */
76
132
  remove(threadId) {
77
- const map = this.load();
78
- delete map[threadId];
79
- this.persist(map);
133
+ this.store.mutateSync(threadId, () => null);
80
134
  }
81
- /**
82
- * Mark a thread as resolved — sets state to 'resolved' and records resolvedAt.
83
- * Resolved threads get a grace period before being removed by prune().
84
- */
135
+ /** Mark a thread resolved (grace period before removal). */
85
136
  resolve(threadId) {
86
- const map = this.load();
87
- const entry = map[threadId];
88
- if (!entry)
137
+ if (!this.store.get(threadId))
89
138
  return;
90
- entry.state = 'resolved';
91
- entry.resolvedAt = new Date().toISOString();
92
- entry.savedAt = new Date().toISOString();
93
- this.persist(map);
139
+ this.store.mutateSync(threadId, draft => {
140
+ draft.state = 'resolved';
141
+ draft.resolvedAt = new Date().toISOString();
142
+ return draft;
143
+ });
94
144
  }
95
- /**
96
- * Mark entries from a specific machine as migrated (Phase 4: cross-machine sync).
97
- * Called during failover when this machine takes over from another.
98
- * The migrated entries can be used to resume threads with --resume UUID.
99
- */
145
+ /** Pin — never evicted. */
146
+ pin(threadId) {
147
+ if (!this.store.get(threadId))
148
+ return;
149
+ this.store.mutateSync(threadId, draft => { draft.pinned = true; return draft; });
150
+ }
151
+ /** Unpin — allow normal TTL/LRU eviction. */
152
+ unpin(threadId) {
153
+ if (!this.store.get(threadId))
154
+ return;
155
+ this.store.mutateSync(threadId, draft => { draft.pinned = false; return draft; });
156
+ }
157
+ /** Find all (non-expired) threads with a specific remote agent. */
158
+ getByRemoteAgent(agentName) {
159
+ return this.store.getByParticipant(agentName)
160
+ .map(c => ({ threadId: c.threadId, entry: conversationToEntry(c) }));
161
+ }
162
+ /** List all active or idle threads. */
163
+ listActive() {
164
+ return this.store.listActive()
165
+ .map(c => ({ threadId: c.threadId, entry: conversationToEntry(c) }))
166
+ .filter(({ entry }) => entry.state === 'active' || entry.state === 'idle');
167
+ }
168
+ /** Cross-machine failover: demote a source machine's active threads to idle. */
100
169
  migrateFrom(sourceMachine, targetMachine) {
101
- const map = this.load();
102
170
  let migrated = 0;
103
171
  let skipped = 0;
104
- for (const [threadId, entry] of Object.entries(map)) {
105
- if (entry.machineOrigin === sourceMachine && entry.state === 'active') {
106
- entry.migratedTo = targetMachine;
107
- entry.state = 'idle'; // Demote to idle — will be resumed on next message
108
- entry.savedAt = new Date().toISOString();
172
+ // Iterate ALL conversations (not just active) so resolved/failed threads from
173
+ // the source machine are counted as skipped, matching legacy semantics.
174
+ for (const c of this.store.all()) {
175
+ if (c.machineOrigin !== sourceMachine)
176
+ continue;
177
+ if (c.state === 'active') {
178
+ this.store.mutateSync(c.threadId, draft => {
179
+ draft.migratedTo = targetMachine;
180
+ draft.state = 'idle';
181
+ return draft;
182
+ });
109
183
  migrated++;
110
184
  }
111
- else if (entry.machineOrigin === sourceMachine) {
185
+ else {
112
186
  skipped++;
113
187
  }
114
188
  }
115
- if (migrated > 0)
116
- this.persist(map);
117
189
  return { migrated, skipped };
118
190
  }
119
- /**
120
- * Get entries that were migrated to this machine (for resume capability).
121
- */
191
+ /** Get entries migrated to this machine (for resume capability). */
122
192
  getMigratedEntries(targetMachine) {
123
- const map = this.load();
124
- const results = [];
125
- for (const [threadId, entry] of Object.entries(map)) {
126
- if (entry.migratedTo === targetMachine) {
127
- results.push({ threadId, entry });
128
- }
129
- }
130
- return results;
131
- }
132
- /**
133
- * Pin a thread — pinned threads are never evicted by LRU or TTL.
134
- */
135
- pin(threadId) {
136
- const map = this.load();
137
- const entry = map[threadId];
138
- if (!entry)
139
- return;
140
- entry.pinned = true;
141
- entry.savedAt = new Date().toISOString();
142
- this.persist(map);
193
+ return this.store.all()
194
+ .filter(c => c.migratedTo === targetMachine)
195
+ .map(c => ({ threadId: c.threadId, entry: conversationToEntry(c) }));
143
196
  }
144
- /**
145
- * Unpin a thread — allows normal TTL and LRU eviction.
146
- */
147
- unpin(threadId) {
148
- const map = this.load();
149
- const entry = map[threadId];
150
- if (!entry)
151
- return;
152
- entry.pinned = false;
153
- entry.savedAt = new Date().toISOString();
154
- this.persist(map);
155
- }
156
- /**
157
- * Find all threads with a specific remote agent.
158
- * Returns entries that are not expired.
159
- */
160
- getByRemoteAgent(agentName) {
161
- const map = this.load();
162
- const results = [];
163
- for (const [threadId, entry] of Object.entries(map)) {
164
- if (entry.remoteAgent === agentName && (entry.pinned || !this.isExpired(entry))) {
165
- results.push({ threadId, entry });
166
- }
167
- }
168
- return results;
169
- }
170
- /**
171
- * List all active or idle threads (not resolved, failed, or archived).
172
- */
173
- listActive() {
174
- const map = this.load();
175
- const results = [];
176
- for (const [threadId, entry] of Object.entries(map)) {
177
- if ((entry.state === 'active' || entry.state === 'idle') &&
178
- (entry.pinned || !this.isExpired(entry))) {
179
- results.push({ threadId, entry });
180
- }
181
- }
182
- return results;
197
+ /** Total stored entries (for monitoring). */
198
+ size() {
199
+ return this.store.size();
183
200
  }
184
- /**
185
- * Prune expired entries, resolved entries past grace period,
186
- * and LRU overflow entries. Called automatically on save, but
187
- * can be called manually for maintenance.
188
- */
201
+ /** Prune expired / resolved-past-grace / LRU overflow. */
189
202
  prune() {
190
- const map = this.load();
191
- this.pruneMap(map);
192
- this.persist(map);
203
+ this.store.prune();
193
204
  }
194
205
  /**
195
- * Proactive resume heartbeat: scan all active thread-linked tmux sessions
196
- * and update the thread→UUID mapping. Should be called periodically.
197
- *
198
- * This ensures that even if a session crashes unexpectedly, we already have
199
- * its UUID on file for --resume.
206
+ * Proactive resume heartbeat: scan active thread-linked tmux sessions and
207
+ * update the thread→UUID mapping so a crash leaves the UUID on file.
200
208
  */
201
209
  refreshResumeMappings(threadSessions) {
202
210
  try {
@@ -206,13 +214,12 @@ export class ThreadResumeMap {
206
214
  const projectJsonlDir = path.join(os.homedir(), '.claude', 'projects', projectHash);
207
215
  if (!fs.existsSync(projectJsonlDir))
208
216
  return;
209
- // Get all JSONL files with their stats
210
217
  const jsonlFiles = fs.readdirSync(projectJsonlDir)
211
218
  .filter(f => f.endsWith('.jsonl'))
212
219
  .map(f => {
213
220
  try {
214
221
  const stat = fs.statSync(path.join(projectJsonlDir, f));
215
- return { name: f, mtimeMs: stat.mtimeMs, uuid: f.replace('.jsonl', '') };
222
+ return { mtimeMs: stat.mtimeMs, uuid: f.replace('.jsonl', '') };
216
223
  }
217
224
  catch {
218
225
  return null;
@@ -222,138 +229,73 @@ export class ThreadResumeMap {
222
229
  .sort((a, b) => b.mtimeMs - a.mtimeMs);
223
230
  if (jsonlFiles.length === 0)
224
231
  return;
225
- const map = this.load();
226
- let updated = 0;
227
232
  const claimedUuids = new Set();
228
233
  for (const [threadId, sessionName] of threadSessions) {
229
- // Verify the tmux session is actually alive
230
234
  const hasSession = spawnSync(this.tmuxPath, ['has-session', '-t', `=${sessionName}`]);
231
235
  if (hasSession.status !== 0)
232
236
  continue;
233
- // Find the JSONL for this session (most recently modified, not already claimed)
234
237
  const availableJsonl = jsonlFiles.find(f => !claimedUuids.has(f.uuid));
235
238
  if (!availableJsonl)
236
239
  continue;
237
240
  claimedUuids.add(availableJsonl.uuid);
238
- const existingEntry = map[threadId];
239
- // Update if UUID changed, entry doesn't exist, or entry is stale (>2 hours)
240
- const entryAge = existingEntry ? Date.now() - new Date(existingEntry.savedAt).getTime() : Infinity;
241
- if (existingEntry && (existingEntry.uuid !== availableJsonl.uuid || entryAge > 2 * 60 * 60 * 1000)) {
242
- existingEntry.uuid = availableJsonl.uuid;
243
- existingEntry.savedAt = new Date().toISOString();
244
- existingEntry.lastAccessedAt = new Date().toISOString();
245
- existingEntry.sessionName = sessionName;
246
- updated++;
241
+ const existing = this.store.get(threadId);
242
+ const entryAge = existing ? Date.now() - new Date(existing.savedAt).getTime() : Infinity;
243
+ if (existing && (existing.sessionUuid !== availableJsonl.uuid || entryAge > 2 * 60 * 60 * 1000)) {
244
+ this.store.mutateSync(threadId, draft => {
245
+ draft.sessionUuid = availableJsonl.uuid;
246
+ draft.boundSessionName = sessionName;
247
+ draft.lastActivityAt = new Date().toISOString();
248
+ return draft;
249
+ });
247
250
  }
248
251
  }
249
- if (updated > 0) {
250
- this.persist(map);
251
- }
252
252
  }
253
253
  catch (err) {
254
254
  console.error('[ThreadResumeMap] Resume heartbeat error:', err);
255
255
  }
256
256
  }
257
- /**
258
- * Get the total number of entries in the map (for monitoring).
259
- */
260
- size() {
261
- return Object.keys(this.load()).length;
262
- }
263
- // ── Private Helpers ──────────────────────────────────────────
264
- load() {
257
+ // ── Private helpers ──────────────────────────────────────────
258
+ /** Dual-read: read a single entry from the frozen legacy file, if present + fresh. */
259
+ readLegacyEntry(threadId) {
265
260
  try {
266
- if (fs.existsSync(this.filePath)) {
267
- return JSON.parse(fs.readFileSync(this.filePath, 'utf-8'));
268
- }
261
+ if (!fs.existsSync(this.legacyPath))
262
+ return null;
263
+ const map = JSON.parse(fs.readFileSync(this.legacyPath, 'utf-8'));
264
+ const entry = map[threadId];
265
+ if (!entry)
266
+ return null;
267
+ if (!entry.pinned && this.isExpired(entry))
268
+ return null;
269
+ return entry;
269
270
  }
270
271
  catch {
271
- // Corrupted file — start fresh
272
- }
273
- return {};
274
- }
275
- persist(map) {
276
- try {
277
- fs.writeFileSync(this.filePath, JSON.stringify(map, null, 2));
278
- }
279
- catch (err) {
280
- console.error(`[ThreadResumeMap] Failed to save: ${err}`);
272
+ return null;
281
273
  }
282
274
  }
283
- /**
284
- * Check if an entry is expired based on its state and age.
285
- * - Active/idle: expire after MAX_AGE_MS from lastAccessedAt
286
- * - Resolved: expire after RESOLVED_GRACE_MS from resolvedAt
287
- * - Failed/archived: expire after MAX_AGE_MS from savedAt
288
- */
289
275
  isExpired(entry) {
290
276
  const now = Date.now();
291
277
  if (entry.state === 'resolved' && entry.resolvedAt) {
292
278
  return now - new Date(entry.resolvedAt).getTime() > RESOLVED_GRACE_MS;
293
279
  }
294
- // For active/idle threads, use lastAccessedAt
295
- const referenceTime = entry.lastAccessedAt || entry.savedAt;
296
- return now - new Date(referenceTime).getTime() > MAX_AGE_MS;
280
+ const ref = entry.lastAccessedAt || entry.savedAt;
281
+ return now - new Date(ref).getTime() > MAX_AGE_MS;
297
282
  }
298
- /**
299
- * Prune a map in-place: remove expired entries, resolved-past-grace entries,
300
- * and LRU overflow (non-pinned) entries.
301
- */
302
- pruneMap(map) {
303
- // Phase 1: Remove expired and resolved-past-grace entries
304
- for (const key of Object.keys(map)) {
305
- const entry = map[key];
306
- if (entry.pinned)
307
- continue;
308
- if (this.isExpired(entry)) {
309
- delete map[key];
310
- }
311
- }
312
- // Phase 2: LRU eviction if still over MAX_ENTRIES
313
- const keys = Object.keys(map);
314
- if (keys.length <= MAX_ENTRIES)
315
- return;
316
- // Separate pinned from unpinned
317
- const pinned = [];
318
- const unpinned = [];
319
- for (const key of keys) {
320
- const entry = map[key];
321
- if (entry.pinned) {
322
- pinned.push(key);
323
- }
324
- else {
325
- unpinned.push({
326
- key,
327
- lastAccessedAt: new Date(entry.lastAccessedAt || entry.savedAt).getTime(),
328
- });
329
- }
330
- }
331
- // Sort unpinned by lastAccessedAt ascending (oldest first = evict first)
332
- unpinned.sort((a, b) => a.lastAccessedAt - b.lastAccessedAt);
333
- // Evict oldest unpinned entries until we're at or under MAX_ENTRIES
334
- const toEvict = keys.length - MAX_ENTRIES;
335
- for (let i = 0; i < toEvict && i < unpinned.length; i++) {
336
- delete map[unpinned[i].key];
337
- }
338
- }
339
- /**
340
- * Check if a JSONL file exists for the given UUID.
341
- */
283
+ /** Check if a JSONL file exists for the given session UUID. (protected so
284
+ * tests can bypass the filesystem check via a subclass.) */
342
285
  jsonlExists(uuid) {
343
- const homeDir = os.homedir();
344
- const claudeProjectsDir = path.join(homeDir, '.claude', 'projects');
286
+ if (!uuid)
287
+ return false;
288
+ const claudeProjectsDir = path.join(os.homedir(), '.claude', 'projects');
345
289
  if (!fs.existsSync(claudeProjectsDir))
346
290
  return false;
347
291
  try {
348
- const projectDirs = fs.readdirSync(claudeProjectsDir);
349
- for (const dir of projectDirs) {
350
- const jsonlPath = path.join(claudeProjectsDir, dir, `${uuid}.jsonl`);
351
- if (fs.existsSync(jsonlPath))
292
+ for (const dir of fs.readdirSync(claudeProjectsDir)) {
293
+ if (fs.existsSync(path.join(claudeProjectsDir, dir, `${uuid}.jsonl`)))
352
294
  return true;
353
295
  }
354
296
  }
355
297
  catch {
356
- // Can't check — assume not found
298
+ // Can't check — assume not found.
357
299
  }
358
300
  return false;
359
301
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadResumeMap.js","sourceRoot":"","sources":["../../src/threadline/ThreadResumeMap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ThreadResumeMap.js","sourceRoot":"","sources":["../../src/threadline/ThreadResumeMap.ts"],"names":[],"mappings":"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"}
@@ -82,9 +82,14 @@ export declare class ThreadlineObservability {
82
82
  private outboxPath;
83
83
  private bindingsPath;
84
84
  private knownAgentsPath;
85
- private threadResumePath;
85
+ private conversationsPath;
86
86
  private readJsonl;
87
87
  private loadBindings;
88
+ /**
89
+ * Phase 2a (CMT-497): the resume state now lives in conversations.json (the
90
+ * single store). Return threads that have a spawned session (a sessionUuid) so
91
+ * the dashboard's `hasSpawnedSession` check is preserved.
92
+ */
88
93
  private loadThreadResume;
89
94
  private resolveAgentName;
90
95
  private loadKnownAgentsCache;
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadlineObservability.d.ts","sourceRoot":"","sources":["../../src/threadline/ThreadlineObservability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iHAAiH;IACjH,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChG,yEAAyE;IACzE,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,gGAAgG;IAChG,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,MAAM,CAAC;CAClB;AA8BD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,eAAe,CAAK;gBAEhB,IAAI,EAAE,8BAA8B;IAMhD,WAAW,CAAC,OAAO,CAAC,EAAE;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,yFAAyF;QACzF,QAAQ,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;KACzB,GAAG,aAAa,EAAE;IAsFnB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAiBhD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,SAAS,EAAE;IAyBtD,OAAO,CAAC,SAAS;IAGjB,OAAO,CAAC,UAAU;IAGlB,OAAO,CAAC,YAAY;IAGpB,OAAO,CAAC,eAAe;IAGvB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,2BAA2B;CAwBpC"}
1
+ {"version":3,"file":"ThreadlineObservability.d.ts","sourceRoot":"","sources":["../../src/threadline/ThreadlineObservability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iHAAiH;IACjH,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChG,yEAAyE;IACzE,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,gGAAgG;IAChG,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,MAAM,CAAC;CAClB;AA8BD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,eAAe,CAAK;gBAEhB,IAAI,EAAE,8BAA8B;IAMhD,WAAW,CAAC,OAAO,CAAC,EAAE;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,yFAAyF;QACzF,QAAQ,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;KACzB,GAAG,aAAa,EAAE;IAsFnB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAiBhD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,SAAS,EAAE;IAyBtD,OAAO,CAAC,SAAS;IAGjB,OAAO,CAAC,UAAU;IAGlB,OAAO,CAAC,YAAY;IAGpB,OAAO,CAAC,eAAe;IAGvB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,YAAY;IAapB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,2BAA2B;CAwBpC"}