@nocoo/pew 0.7.0 → 0.9.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 (91) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +30 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/notify.d.ts +7 -2
  5. package/dist/commands/notify.d.ts.map +1 -1
  6. package/dist/commands/notify.js +48 -10
  7. package/dist/commands/notify.js.map +1 -1
  8. package/dist/commands/session-sync.d.ts +12 -0
  9. package/dist/commands/session-sync.d.ts.map +1 -1
  10. package/dist/commands/session-sync.js +99 -311
  11. package/dist/commands/session-sync.js.map +1 -1
  12. package/dist/commands/sync.d.ts.map +1 -1
  13. package/dist/commands/sync.js +112 -330
  14. package/dist/commands/sync.js.map +1 -1
  15. package/dist/drivers/registry.d.ts +63 -0
  16. package/dist/drivers/registry.d.ts.map +1 -0
  17. package/dist/drivers/registry.js +88 -0
  18. package/dist/drivers/registry.js.map +1 -0
  19. package/dist/drivers/session/claude-session-driver.d.ts +10 -0
  20. package/dist/drivers/session/claude-session-driver.d.ts.map +1 -0
  21. package/dist/drivers/session/claude-session-driver.js +29 -0
  22. package/dist/drivers/session/claude-session-driver.js.map +1 -0
  23. package/dist/drivers/session/codex-session-driver.d.ts +10 -0
  24. package/dist/drivers/session/codex-session-driver.d.ts.map +1 -0
  25. package/dist/drivers/session/codex-session-driver.js +29 -0
  26. package/dist/drivers/session/codex-session-driver.js.map +1 -0
  27. package/dist/drivers/session/gemini-session-driver.d.ts +10 -0
  28. package/dist/drivers/session/gemini-session-driver.d.ts.map +1 -0
  29. package/dist/drivers/session/gemini-session-driver.js +29 -0
  30. package/dist/drivers/session/gemini-session-driver.js.map +1 -0
  31. package/dist/drivers/session/openclaw-session-driver.d.ts +10 -0
  32. package/dist/drivers/session/openclaw-session-driver.d.ts.map +1 -0
  33. package/dist/drivers/session/openclaw-session-driver.js +29 -0
  34. package/dist/drivers/session/openclaw-session-driver.js.map +1 -0
  35. package/dist/drivers/session/opencode-json-session-driver.d.ts +14 -0
  36. package/dist/drivers/session/opencode-json-session-driver.d.ts.map +1 -0
  37. package/dist/drivers/session/opencode-json-session-driver.js +51 -0
  38. package/dist/drivers/session/opencode-json-session-driver.js.map +1 -0
  39. package/dist/drivers/session/opencode-sqlite-session-driver.d.ts +23 -0
  40. package/dist/drivers/session/opencode-sqlite-session-driver.d.ts.map +1 -0
  41. package/dist/drivers/session/opencode-sqlite-session-driver.js +88 -0
  42. package/dist/drivers/session/opencode-sqlite-session-driver.js.map +1 -0
  43. package/dist/drivers/token/claude-token-driver.d.ts +11 -0
  44. package/dist/drivers/token/claude-token-driver.d.ts.map +1 -0
  45. package/dist/drivers/token/claude-token-driver.js +42 -0
  46. package/dist/drivers/token/claude-token-driver.js.map +1 -0
  47. package/dist/drivers/token/codex-token-driver.d.ts +11 -0
  48. package/dist/drivers/token/codex-token-driver.d.ts.map +1 -0
  49. package/dist/drivers/token/codex-token-driver.js +59 -0
  50. package/dist/drivers/token/codex-token-driver.js.map +1 -0
  51. package/dist/drivers/token/gemini-token-driver.d.ts +11 -0
  52. package/dist/drivers/token/gemini-token-driver.d.ts.map +1 -0
  53. package/dist/drivers/token/gemini-token-driver.js +57 -0
  54. package/dist/drivers/token/gemini-token-driver.js.map +1 -0
  55. package/dist/drivers/token/openclaw-token-driver.d.ts +11 -0
  56. package/dist/drivers/token/openclaw-token-driver.d.ts.map +1 -0
  57. package/dist/drivers/token/openclaw-token-driver.js +42 -0
  58. package/dist/drivers/token/openclaw-token-driver.js.map +1 -0
  59. package/dist/drivers/token/opencode-json-token-driver.d.ts +15 -0
  60. package/dist/drivers/token/opencode-json-token-driver.d.ts.map +1 -0
  61. package/dist/drivers/token/opencode-json-token-driver.js +73 -0
  62. package/dist/drivers/token/opencode-json-token-driver.js.map +1 -0
  63. package/dist/drivers/token/opencode-sqlite-token-driver.d.ts +25 -0
  64. package/dist/drivers/token/opencode-sqlite-token-driver.d.ts.map +1 -0
  65. package/dist/drivers/token/opencode-sqlite-token-driver.js +99 -0
  66. package/dist/drivers/token/opencode-sqlite-token-driver.js.map +1 -0
  67. package/dist/drivers/types.d.ts +202 -0
  68. package/dist/drivers/types.d.ts.map +1 -0
  69. package/dist/drivers/types.js +12 -0
  70. package/dist/drivers/types.js.map +1 -0
  71. package/dist/notifier/coordinator.d.ts +3 -2
  72. package/dist/notifier/coordinator.d.ts.map +1 -1
  73. package/dist/notifier/coordinator.js +76 -5
  74. package/dist/notifier/coordinator.js.map +1 -1
  75. package/dist/storage/base-cursor-store.d.ts +16 -0
  76. package/dist/storage/base-cursor-store.d.ts.map +1 -0
  77. package/dist/storage/base-cursor-store.js +33 -0
  78. package/dist/storage/base-cursor-store.js.map +1 -0
  79. package/dist/storage/cursor-store.d.ts +2 -6
  80. package/dist/storage/cursor-store.d.ts.map +1 -1
  81. package/dist/storage/cursor-store.js +4 -25
  82. package/dist/storage/cursor-store.js.map +1 -1
  83. package/dist/storage/session-cursor-store.d.ts +2 -6
  84. package/dist/storage/session-cursor-store.d.ts.map +1 -1
  85. package/dist/storage/session-cursor-store.js +4 -25
  86. package/dist/storage/session-cursor-store.js.map +1 -1
  87. package/dist/utils/file-changed.d.ts +35 -0
  88. package/dist/utils/file-changed.d.ts.map +1 -0
  89. package/dist/utils/file-changed.js +34 -0
  90. package/dist/utils/file-changed.js.map +1 -0
  91. package/package.json +1 -1
@@ -1,14 +1,18 @@
1
1
  import { stat } from "node:fs/promises";
2
2
  import { CursorStore } from "../storage/cursor-store.js";
3
3
  import { LocalQueue } from "../storage/local-queue.js";
4
- import { discoverClaudeFiles, discoverCodexFiles, discoverGeminiFiles, discoverOpenCodeFiles, discoverOpenClawFiles, } from "../discovery/sources.js";
5
- import { parseClaudeFile } from "../parsers/claude.js";
6
- import { parseCodexFile } from "../parsers/codex.js";
7
- import { parseGeminiFile } from "../parsers/gemini.js";
8
- import { parseOpenCodeFile } from "../parsers/opencode.js";
9
- import { parseOpenClawFile } from "../parsers/openclaw.js";
10
- import { processOpenCodeMessages } from "../parsers/opencode-sqlite.js";
11
4
  import { toUtcHalfHourStart, bucketKey, addTokens, emptyTokenDelta } from "../utils/buckets.js";
5
+ import { createTokenDrivers } from "../drivers/registry.js";
6
+ /** Map Source type to short result key */
7
+ function sourceKey(source) {
8
+ switch (source) {
9
+ case "claude-code": return "claude";
10
+ case "gemini-cli": return "gemini";
11
+ case "opencode": return "opencode";
12
+ case "openclaw": return "openclaw";
13
+ case "codex": return "codex";
14
+ }
15
+ }
12
16
  /**
13
17
  * Execute the sync operation: discover files, parse incrementally,
14
18
  * aggregate into half-hour buckets, and write to local queue.
@@ -23,149 +27,68 @@ export async function executeSync(opts) {
23
27
  const allDeltas = [];
24
28
  const sourceCounts = { claude: 0, codex: 0, gemini: 0, opencode: 0, openclaw: 0 };
25
29
  const filesScanned = { claude: 0, codex: 0, gemini: 0, opencode: 0, openclaw: 0 };
26
- // ---------- Claude Code ----------
27
- if (opts.claudeDir) {
28
- onProgress?.({
29
- source: "claude-code",
30
- phase: "discover",
31
- message: "Discovering Claude Code files...",
32
- });
33
- const files = await discoverClaudeFiles(opts.claudeDir);
34
- filesScanned.claude = files.length;
35
- onProgress?.({ source: "claude-code",
36
- phase: "parse",
37
- total: files.length,
38
- message: `Parsing ${files.length} Claude files...`,
39
- });
40
- for (let i = 0; i < files.length; i++) {
41
- const filePath = files[i];
42
- const prev = cursors.files[filePath];
43
- const st = await stat(filePath).catch(() => null);
44
- if (!st)
45
- continue;
46
- const inode = st.ino;
47
- const startOffset = prev && prev.inode === inode ? (prev.offset ?? 0) : 0;
48
- const result = await parseClaudeFile({ filePath, startOffset }).catch((err) => {
49
- onProgress?.({
50
- source: "claude-code",
51
- phase: "warn",
52
- message: `Skipping ${filePath}: ${err instanceof Error ? err.message : String(err)}`,
53
- });
54
- return null;
55
- });
56
- if (!result)
57
- continue;
58
- cursors.files[filePath] = {
59
- inode,
60
- offset: result.endOffset,
61
- updatedAt: new Date().toISOString(),
62
- };
63
- allDeltas.push(...result.deltas);
64
- sourceCounts.claude += result.deltas.length;
65
- onProgress?.({
66
- source: "claude-code",
67
- phase: "parse",
68
- current: i + 1,
69
- total: files.length,
70
- });
71
- }
72
- }
73
- // ---------- Gemini CLI ----------
74
- if (opts.geminiDir) {
30
+ // Build driver sets from options
31
+ const { fileDrivers, dbDrivers } = createTokenDrivers(opts);
32
+ // Shared state bag for cross-driver communication
33
+ const ctx = { dirMtimes: cursors.dirMtimes };
34
+ // Discovery options bag (drivers read their relevant directory)
35
+ const discoverOpts = {
36
+ claudeDir: opts.claudeDir,
37
+ codexSessionsDir: opts.codexSessionsDir,
38
+ geminiDir: opts.geminiDir,
39
+ openCodeMessageDir: opts.openCodeMessageDir,
40
+ openCodeDbPath: opts.openCodeDbPath,
41
+ openclawDir: opts.openclawDir,
42
+ };
43
+ // ---------- Phase 1: File-based drivers (generic loop) ----------
44
+ for (const driver of fileDrivers) {
45
+ const key = sourceKey(driver.source);
75
46
  onProgress?.({
76
- source: "gemini-cli",
47
+ source: driver.source,
77
48
  phase: "discover",
78
- message: "Discovering Gemini CLI files...",
49
+ message: `Discovering ${driver.source} files...`,
79
50
  });
80
- const files = await discoverGeminiFiles(opts.geminiDir);
81
- filesScanned.gemini = files.length;
51
+ const files = await driver.discover(discoverOpts, ctx);
52
+ filesScanned[key] = files.length;
53
+ // Build discover message with skipped dirs info from context
54
+ const skippedDirs = driver.source === "opencode" && ctx.dirMtimes
55
+ ? Object.keys(ctx.dirMtimes).length
56
+ : 0;
57
+ const parseMsg = driver.source === "opencode" && skippedDirs > 0
58
+ ? `Parsing ${files.length} ${driver.source} files (${skippedDirs} dirs skipped)...`
59
+ : `Parsing ${files.length} ${driver.source} files...`;
82
60
  onProgress?.({
83
- source: "gemini-cli",
61
+ source: driver.source,
84
62
  phase: "parse",
85
63
  total: files.length,
86
- message: `Parsing ${files.length} Gemini files...`,
64
+ message: parseMsg,
87
65
  });
88
66
  for (let i = 0; i < files.length; i++) {
89
67
  const filePath = files[i];
90
- const prev = cursors.files[filePath];
91
68
  const st = await stat(filePath).catch(() => null);
92
69
  if (!st)
93
70
  continue;
94
- const inode = st.ino;
95
- const startIndex = prev && prev.inode === inode ? (prev.lastIndex ?? -1) : -1;
96
- const lastTotals = prev && prev.inode === inode ? (prev.lastTotals ?? null) : null;
97
- const result = await parseGeminiFile({
98
- filePath,
99
- startIndex,
100
- lastTotals,
101
- }).catch((err) => {
102
- onProgress?.({
103
- source: "gemini-cli",
104
- phase: "warn",
105
- message: `Skipping ${filePath}: ${err instanceof Error ? err.message : String(err)}`,
106
- });
107
- return null;
108
- });
109
- if (!result)
110
- continue;
111
- cursors.files[filePath] = {
112
- inode,
113
- lastIndex: result.lastIndex,
114
- lastTotals: result.lastTotals,
115
- lastModel: result.lastModel,
116
- updatedAt: new Date().toISOString(),
71
+ const fingerprint = {
72
+ inode: st.ino,
73
+ mtimeMs: st.mtimeMs,
74
+ size: st.size,
117
75
  };
118
- allDeltas.push(...result.deltas);
119
- sourceCounts.gemini += result.deltas.length;
120
- onProgress?.({
121
- source: "gemini-cli",
122
- phase: "parse",
123
- current: i + 1,
124
- total: files.length,
125
- });
126
- }
127
- }
128
- // ---------- OpenCode ----------
129
- if (opts.openCodeMessageDir) {
130
- onProgress?.({
131
- source: "opencode",
132
- phase: "discover",
133
- message: "Discovering OpenCode files...",
134
- });
135
- const discovery = await discoverOpenCodeFiles(opts.openCodeMessageDir, cursors.dirMtimes);
136
- const files = discovery.files;
137
- // Count includes files in skipped dirs (already tracked in cursors)
138
- filesScanned.opencode = files.length;
139
- onProgress?.({
140
- source: "opencode",
141
- phase: "parse",
142
- total: files.length,
143
- message: `Parsing ${files.length} OpenCode files (${discovery.skippedDirs} dirs skipped)...`,
144
- });
145
- for (let i = 0; i < files.length; i++) {
146
- const filePath = files[i];
147
- const prev = cursors.files[filePath];
148
- const st = await stat(filePath).catch(() => null);
149
- if (!st)
150
- continue;
151
- const inode = st.ino;
152
- // Triple-check unchanged optimization
153
- if (prev &&
154
- prev.inode === inode &&
155
- prev.size === st.size &&
156
- prev.mtimeMs === st.mtimeMs) {
76
+ const cursor = cursors.files[filePath];
77
+ // Fast skip: file unchanged since last cursor?
78
+ if (driver.shouldSkip(cursor, fingerprint)) {
157
79
  onProgress?.({
158
- source: "opencode",
80
+ source: driver.source,
159
81
  phase: "parse",
160
82
  current: i + 1,
161
83
  total: files.length,
162
84
  });
163
85
  continue;
164
86
  }
165
- const lastTotals = prev && prev.inode === inode ? (prev.lastTotals ?? null) : null;
166
- const result = await parseOpenCodeFile({ filePath, lastTotals }).catch((err) => {
87
+ // Extract resume state and parse
88
+ const resume = driver.resumeState(cursor, fingerprint);
89
+ const result = await driver.parse(filePath, resume).catch((err) => {
167
90
  onProgress?.({
168
- source: "opencode",
91
+ source: driver.source,
169
92
  phase: "warn",
170
93
  message: `Skipping ${filePath}: ${err instanceof Error ? err.message : String(err)}`,
171
94
  });
@@ -173,230 +96,89 @@ export async function executeSync(opts) {
173
96
  });
174
97
  if (!result)
175
98
  continue;
176
- cursors.files[filePath] = {
177
- inode,
178
- size: st.size,
179
- mtimeMs: st.mtimeMs,
180
- lastTotals: result.lastTotals,
181
- messageKey: result.messageKey,
182
- updatedAt: new Date().toISOString(),
183
- };
184
- if (result.delta) {
185
- allDeltas.push(result.delta);
186
- sourceCounts.opencode += 1;
187
- }
99
+ // Build and persist cursor (cast: driver returns concrete cursor type
100
+ // but the generic loop types it as FileCursorBase)
101
+ cursors.files[filePath] = driver.buildCursor(fingerprint, result, cursor);
102
+ // Collect deltas
103
+ allDeltas.push(...result.deltas);
104
+ sourceCounts[key] += result.deltas.length;
188
105
  onProgress?.({
189
- source: "opencode",
106
+ source: driver.source,
190
107
  phase: "parse",
191
108
  current: i + 1,
192
109
  total: files.length,
193
110
  });
194
111
  }
195
- // Persist directory mtimes for next run
196
- cursors.dirMtimes = discovery.dirMtimes;
112
+ // Post-parse hook (e.g. OpenCode JSON deposits messageKeys into ctx)
113
+ driver.afterAll?.(cursors.files, ctx);
197
114
  }
198
- // ---------- OpenCode SQLite ----------
115
+ // ---------- Phase 2: DB-based drivers ----------
116
+ // SQLite warning paths are handled at the orchestrator level because:
117
+ // - "bun:sqlite not available": registry doesn't create a driver (no openMessageDb)
118
+ // - "Failed to open": factory returns null, driver would silently return empty
119
+ // We pre-probe the factory here to emit warnings BEFORE running the driver,
120
+ // avoiding the need for double-open detection after the fact.
121
+ let activeDbDrivers = dbDrivers;
199
122
  if (opts.openCodeDbPath) {
200
- onProgress?.({
201
- source: "opencode-sqlite",
202
- phase: "discover",
203
- message: "Checking OpenCode SQLite database...",
204
- });
205
- // Check if DB file exists
206
123
  const dbStat = await stat(opts.openCodeDbPath).catch(() => null);
207
- if (dbStat && !opts.openMessageDb) {
208
- // DB file exists but adapter is missing (bun:sqlite not available)
209
- onProgress?.({
210
- source: "opencode-sqlite",
211
- phase: "warn",
212
- message: `OpenCode SQLite database found at ${opts.openCodeDbPath} but bun:sqlite is not available — SQLite token data will NOT be synced`,
213
- });
214
- }
215
- else if (dbStat && opts.openMessageDb) {
216
- const dbInode = dbStat.ino;
217
- const prevSqlite = cursors.openCodeSqlite;
218
- // If inode changed (DB recreated), reset cursor
219
- const lastTimeCreated = prevSqlite && prevSqlite.inode === dbInode
220
- ? prevSqlite.lastTimeCreated
221
- : 0;
222
- const prevProcessedIds = new Set(prevSqlite && prevSqlite.inode === dbInode
223
- ? (prevSqlite.lastProcessedIds ?? [])
224
- : []);
225
- const handle = opts.openMessageDb(opts.openCodeDbPath);
226
- if (handle) {
227
- try {
228
- // Query uses >= to avoid missing same-millisecond rows.
229
- // We dedup previously-processed IDs from the prior batch.
230
- const rawRows = handle.queryMessages(lastTimeCreated);
231
- const rows = prevProcessedIds.size > 0
232
- ? rawRows.filter((r) => !prevProcessedIds.has(r.id))
233
- : rawRows;
234
- // Collect JSON messageKeys from cursor store for dedup.
235
- // During the overlap window (~Feb 15-17), both JSON and SQLite
236
- // sources contain the same messages. We skip any SQLite row
237
- // whose messageKey is already tracked by a JSON file cursor.
238
- const jsonMessageKeys = new Set();
239
- for (const cursor of Object.values(cursors.files)) {
240
- const oc = cursor;
241
- if (oc.messageKey) {
242
- jsonMessageKeys.add(oc.messageKey);
243
- }
244
- }
245
- // Filter rows: exclude assistant messages already tracked by JSON parser.
246
- // row.role is extracted at the SQL level via json_extract — no need to
247
- // parse the full data JSON here.
248
- const filteredRows = rows.filter((row) => {
249
- if (row.role !== "assistant")
250
- return true; // non-assistant rows don't produce deltas
251
- const key = `${row.session_id}|${row.id}`;
252
- return !jsonMessageKeys.has(key);
124
+ if (dbStat) {
125
+ if (!opts.openMessageDb) {
126
+ // Case 1: DB file exists but bun:sqlite adapter is missing
127
+ onProgress?.({
128
+ source: "opencode-sqlite",
129
+ phase: "discover",
130
+ message: "Checking OpenCode SQLite database...",
131
+ });
132
+ onProgress?.({
133
+ source: "opencode-sqlite",
134
+ phase: "warn",
135
+ message: `OpenCode SQLite database found at ${opts.openCodeDbPath} but bun:sqlite is not available — SQLite token data will NOT be synced`,
136
+ });
137
+ }
138
+ else {
139
+ // Case 2: Both provided pre-probe if factory returns null
140
+ const handle = opts.openMessageDb(opts.openCodeDbPath);
141
+ if (!handle) {
142
+ onProgress?.({
143
+ source: "opencode-sqlite",
144
+ phase: "discover",
145
+ message: "Checking OpenCode SQLite database...",
253
146
  });
254
- const dedupSkipped = rows.length - filteredRows.length;
255
- const result = processOpenCodeMessages(filteredRows);
256
147
  onProgress?.({
257
148
  source: "opencode-sqlite",
258
- phase: "parse",
259
- message: `Parsed ${result.deltas.length} deltas from ${rawRows.length} SQLite rows${dedupSkipped > 0 ? ` (${dedupSkipped} deduped)` : ""}`,
149
+ phase: "warn",
150
+ message: `Failed to open OpenCode SQLite database at ${opts.openCodeDbPath} SQLite token data will NOT be synced`,
260
151
  });
261
- allDeltas.push(...result.deltas);
262
- sourceCounts.opencode += result.deltas.length;
263
- // Update SQLite cursor — advance past ALL rows (including deduped).
264
- // Rows are ORDER BY time_created ASC, so the last row has the
265
- // highest time_created. Track IDs at the max timestamp for
266
- // same-millisecond dedup on the next query.
267
- const maxTime = rawRows.length > 0
268
- ? rawRows[rawRows.length - 1].time_created
269
- : lastTimeCreated;
270
- const idsAtMax = rawRows
271
- .filter((r) => r.time_created === maxTime)
272
- .map((r) => r.id);
273
- cursors.openCodeSqlite = {
274
- lastTimeCreated: maxTime,
275
- lastProcessedIds: idsAtMax,
276
- lastSessionUpdated: prevSqlite?.lastSessionUpdated ?? 0,
277
- inode: dbInode,
278
- updatedAt: new Date().toISOString(),
279
- };
152
+ // Skip DB drivers — factory returns null, driver would return empty anyway
153
+ activeDbDrivers = [];
280
154
  }
281
- finally {
155
+ else {
282
156
  handle.close();
283
157
  }
284
158
  }
285
- else {
286
- // openMessageDb returned null — DB exists but couldn't be opened
287
- onProgress?.({
288
- source: "opencode-sqlite",
289
- phase: "warn",
290
- message: `Failed to open OpenCode SQLite database at ${opts.openCodeDbPath} — SQLite token data will NOT be synced`,
291
- });
292
- }
293
- }
294
- }
295
- // ---------- OpenClaw ----------
296
- if (opts.openclawDir) {
297
- onProgress?.({
298
- source: "openclaw",
299
- phase: "discover",
300
- message: "Discovering OpenClaw files...",
301
- });
302
- const files = await discoverOpenClawFiles(opts.openclawDir);
303
- filesScanned.openclaw = files.length;
304
- onProgress?.({
305
- source: "openclaw",
306
- phase: "parse",
307
- total: files.length,
308
- message: `Parsing ${files.length} OpenClaw files...`,
309
- });
310
- for (let i = 0; i < files.length; i++) {
311
- const filePath = files[i];
312
- const prev = cursors.files[filePath];
313
- const st = await stat(filePath).catch(() => null);
314
- if (!st)
315
- continue;
316
- const inode = st.ino;
317
- const startOffset = prev && prev.inode === inode ? (prev.offset ?? 0) : 0;
318
- const result = await parseOpenClawFile({ filePath, startOffset }).catch((err) => {
319
- onProgress?.({
320
- source: "openclaw",
321
- phase: "warn",
322
- message: `Skipping ${filePath}: ${err instanceof Error ? err.message : String(err)}`,
323
- });
324
- return null;
325
- });
326
- if (!result)
327
- continue;
328
- cursors.files[filePath] = {
329
- inode,
330
- offset: result.endOffset,
331
- updatedAt: new Date().toISOString(),
332
- };
333
- allDeltas.push(...result.deltas);
334
- sourceCounts.openclaw += result.deltas.length;
335
- onProgress?.({
336
- source: "openclaw",
337
- phase: "parse",
338
- current: i + 1,
339
- total: files.length,
340
- });
341
159
  }
342
160
  }
343
- // ---------- Codex CLI ----------
344
- if (opts.codexSessionsDir) {
161
+ for (const driver of activeDbDrivers) {
162
+ const key = sourceKey(driver.source);
345
163
  onProgress?.({
346
- source: "codex",
164
+ source: "opencode-sqlite",
347
165
  phase: "discover",
348
- message: "Discovering Codex CLI files...",
166
+ message: "Checking OpenCode SQLite database...",
349
167
  });
350
- const files = await discoverCodexFiles(opts.codexSessionsDir);
351
- filesScanned.codex = files.length;
168
+ const prevCursor = cursors.openCodeSqlite;
169
+ const result = await driver.run(prevCursor, ctx);
170
+ cursors.openCodeSqlite = result.cursor;
171
+ allDeltas.push(...result.deltas);
172
+ sourceCounts[key] += result.deltas.length;
173
+ const dedupSkipped = result.rowCount - (result.deltas.length > 0 ? result.deltas.length : 0);
352
174
  onProgress?.({
353
- source: "codex",
175
+ source: "opencode-sqlite",
354
176
  phase: "parse",
355
- total: files.length,
356
- message: `Parsing ${files.length} Codex files...`,
177
+ message: `Parsed ${result.deltas.length} deltas from ${result.rowCount} SQLite rows${dedupSkipped > 0 ? ` (${dedupSkipped} deduped)` : ""}`,
357
178
  });
358
- for (let i = 0; i < files.length; i++) {
359
- const filePath = files[i];
360
- const prev = cursors.files[filePath];
361
- const st = await stat(filePath).catch(() => null);
362
- if (!st)
363
- continue;
364
- const inode = st.ino;
365
- const startOffset = prev && prev.inode === inode ? (prev.offset ?? 0) : 0;
366
- const lastTotals = prev && prev.inode === inode ? (prev.lastTotals ?? null) : null;
367
- const lastModel = prev && prev.inode === inode ? (prev.lastModel ?? null) : null;
368
- const result = await parseCodexFile({
369
- filePath,
370
- startOffset,
371
- lastTotals,
372
- lastModel,
373
- }).catch((err) => {
374
- onProgress?.({
375
- source: "codex",
376
- phase: "warn",
377
- message: `Skipping ${filePath}: ${err instanceof Error ? err.message : String(err)}`,
378
- });
379
- return null;
380
- });
381
- if (!result)
382
- continue;
383
- cursors.files[filePath] = {
384
- inode,
385
- offset: result.endOffset,
386
- lastTotals: result.lastTotals,
387
- lastModel: result.lastModel,
388
- updatedAt: new Date().toISOString(),
389
- };
390
- allDeltas.push(...result.deltas);
391
- sourceCounts.codex += result.deltas.length;
392
- onProgress?.({
393
- source: "codex",
394
- phase: "parse",
395
- current: i + 1,
396
- total: files.length,
397
- });
398
- }
399
179
  }
180
+ // Persist context state
181
+ cursors.dirMtimes = ctx.dirMtimes;
400
182
  // ---------- Aggregate into half-hour buckets ----------
401
183
  onProgress?.({
402
184
  source: "all",
@@ -408,8 +190,8 @@ export async function executeSync(opts) {
408
190
  const hourStart = toUtcHalfHourStart(delta.timestamp);
409
191
  if (!hourStart)
410
192
  continue;
411
- const key = bucketKey(delta.source, delta.model, hourStart);
412
- let bucket = buckets.get(key);
193
+ const bk = bucketKey(delta.source, delta.model, hourStart);
194
+ let bucket = buckets.get(bk);
413
195
  if (!bucket) {
414
196
  bucket = {
415
197
  source: delta.source,
@@ -417,7 +199,7 @@ export async function executeSync(opts) {
417
199
  hourStart,
418
200
  tokens: emptyTokenDelta(),
419
201
  };
420
- buckets.set(key, bucket);
202
+ buckets.set(bk, bucket);
421
203
  }
422
204
  addTokens(bucket.tokens, delta.tokens);
423
205
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Driver Registry — single entry point for constructing active driver sets.
3
+ *
4
+ * Returns drivers for enabled sources based on which directories/DB paths
5
+ * exist in the provided options. File-based drivers are singletons;
6
+ * DB-based drivers are constructed via factory functions (need DI params).
7
+ *
8
+ * The orchestrator (sync.ts / session-sync.ts) calls these once per run
9
+ * and iterates the returned arrays with generic loops.
10
+ */
11
+ import type { FileCursorBase, SessionFileCursor } from "@pew/core";
12
+ import type { FileTokenDriver, DbTokenDriver, FileSessionDriver, DbSessionDriver } from "./types.js";
13
+ import { type OpenCodeSqliteTokenDriverOpts } from "./token/opencode-sqlite-token-driver.js";
14
+ import { type OpenCodeSqliteSessionDriverOpts } from "./session/opencode-sqlite-session-driver.js";
15
+ /**
16
+ * Options for constructing the token driver set.
17
+ *
18
+ * Directory fields control which file-based drivers are included.
19
+ * DB fields control the SQLite driver (requires both path + opener).
20
+ */
21
+ export interface TokenDriverRegistryOpts {
22
+ claudeDir?: string;
23
+ geminiDir?: string;
24
+ openCodeMessageDir?: string;
25
+ openclawDir?: string;
26
+ codexSessionsDir?: string;
27
+ openCodeDbPath?: string;
28
+ openMessageDb?: OpenCodeSqliteTokenDriverOpts["openMessageDb"];
29
+ }
30
+ export interface TokenDriverSet {
31
+ fileDrivers: FileTokenDriver<FileCursorBase>[];
32
+ dbDrivers: DbTokenDriver[];
33
+ }
34
+ /**
35
+ * Construct the active token driver set based on which sources are available.
36
+ *
37
+ * A file driver is included when its corresponding directory option is truthy.
38
+ * The SQLite DB driver is included when both `openCodeDbPath` and `openMessageDb` are provided.
39
+ */
40
+ export declare function createTokenDrivers(opts: TokenDriverRegistryOpts): TokenDriverSet;
41
+ /**
42
+ * Options for constructing the session driver set.
43
+ */
44
+ export interface SessionDriverRegistryOpts {
45
+ claudeDir?: string;
46
+ geminiDir?: string;
47
+ openCodeMessageDir?: string;
48
+ openclawDir?: string;
49
+ codexSessionsDir?: string;
50
+ openCodeDbPath?: string;
51
+ openSessionDb?: OpenCodeSqliteSessionDriverOpts["openSessionDb"];
52
+ }
53
+ export interface SessionDriverSet {
54
+ fileDrivers: FileSessionDriver<SessionFileCursor | unknown>[];
55
+ dbDrivers: DbSessionDriver[];
56
+ }
57
+ /**
58
+ * Construct the active session driver set based on which sources are available.
59
+ *
60
+ * Same pattern as token drivers: directory presence → file driver, DB opts → DB driver.
61
+ */
62
+ export declare function createSessionDrivers(opts: SessionDriverRegistryOpts): SessionDriverSet;
63
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/drivers/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,KAAK,EAEV,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,eAAe,EAChB,MAAM,YAAY,CAAC;AAQpB,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,yCAAyC,CAAC;AAQjD,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,6CAA6C,CAAC;AAMrD;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,6BAA6B,CAAC,eAAe,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC;IAC/C,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,uBAAuB,GAAG,cAAc,CA6BhF;AAMD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,+BAA+B,CAAC,eAAe,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,iBAAiB,CAAC,iBAAiB,GAAG,OAAO,CAAC,EAAE,CAAC;IAC9D,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,yBAAyB,GAAG,gBAAgB,CA6BtF"}