@getrift/rift 0.1.0-beta.10 → 0.1.0-beta.12

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 (76) hide show
  1. package/dist/src/cli/commands/reconcile.d.ts.map +1 -1
  2. package/dist/src/cli/commands/reconcile.js +12 -0
  3. package/dist/src/cli/commands/reconcile.js.map +1 -1
  4. package/dist/src/cli/commands/search.d.ts.map +1 -1
  5. package/dist/src/cli/commands/search.js +28 -4
  6. package/dist/src/cli/commands/search.js.map +1 -1
  7. package/dist/src/cli/http-client.d.ts.map +1 -1
  8. package/dist/src/cli/http-client.js +21 -2
  9. package/dist/src/cli/http-client.js.map +1 -1
  10. package/dist/src/ingestion/inbox-core/conversation-fingerprint.d.ts +2 -0
  11. package/dist/src/ingestion/inbox-core/conversation-fingerprint.d.ts.map +1 -0
  12. package/dist/src/ingestion/inbox-core/conversation-fingerprint.js +27 -0
  13. package/dist/src/ingestion/inbox-core/conversation-fingerprint.js.map +1 -0
  14. package/dist/src/ingestion/inbox-core/index.d.ts +1 -0
  15. package/dist/src/ingestion/inbox-core/index.d.ts.map +1 -1
  16. package/dist/src/ingestion/inbox-core/index.js +1 -0
  17. package/dist/src/ingestion/inbox-core/index.js.map +1 -1
  18. package/dist/src/jobs/handlers/compact.js +1 -0
  19. package/dist/src/jobs/handlers/compact.js.map +1 -1
  20. package/dist/src/jobs/handlers/dedupe-conversations.d.ts +111 -0
  21. package/dist/src/jobs/handlers/dedupe-conversations.d.ts.map +1 -0
  22. package/dist/src/jobs/handlers/dedupe-conversations.js +332 -0
  23. package/dist/src/jobs/handlers/dedupe-conversations.js.map +1 -0
  24. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
  25. package/dist/src/jobs/handlers/ingest.js +204 -31
  26. package/dist/src/jobs/handlers/ingest.js.map +1 -1
  27. package/dist/src/jobs/handlers/reconcile.d.ts +11 -0
  28. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -1
  29. package/dist/src/jobs/handlers/reconcile.js +25 -0
  30. package/dist/src/jobs/handlers/reconcile.js.map +1 -1
  31. package/dist/src/jobs/handlers/save.d.ts.map +1 -1
  32. package/dist/src/jobs/handlers/save.js +6 -1
  33. package/dist/src/jobs/handlers/save.js.map +1 -1
  34. package/dist/src/mcp/errors.d.ts.map +1 -1
  35. package/dist/src/mcp/errors.js +20 -1
  36. package/dist/src/mcp/errors.js.map +1 -1
  37. package/dist/src/mcp/tools/context-pack.d.ts.map +1 -1
  38. package/dist/src/mcp/tools/context-pack.js +5 -2
  39. package/dist/src/mcp/tools/context-pack.js.map +1 -1
  40. package/dist/src/mcp/tools/search.d.ts +6 -2
  41. package/dist/src/mcp/tools/search.d.ts.map +1 -1
  42. package/dist/src/mcp/tools/search.js +34 -4
  43. package/dist/src/mcp/tools/search.js.map +1 -1
  44. package/dist/src/observability/tool-usage-stats.d.ts +70 -4
  45. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -1
  46. package/dist/src/observability/tool-usage-stats.js +58 -27
  47. package/dist/src/observability/tool-usage-stats.js.map +1 -1
  48. package/dist/src/observability/tool-usage.d.ts +93 -0
  49. package/dist/src/observability/tool-usage.d.ts.map +1 -1
  50. package/dist/src/observability/tool-usage.js +124 -0
  51. package/dist/src/observability/tool-usage.js.map +1 -1
  52. package/dist/src/retrieval/compact.d.ts +115 -2
  53. package/dist/src/retrieval/compact.d.ts.map +1 -1
  54. package/dist/src/retrieval/compact.js +154 -5
  55. package/dist/src/retrieval/compact.js.map +1 -1
  56. package/dist/src/retrieval/context-pack.d.ts +71 -0
  57. package/dist/src/retrieval/context-pack.d.ts.map +1 -1
  58. package/dist/src/retrieval/context-pack.js +126 -7
  59. package/dist/src/retrieval/context-pack.js.map +1 -1
  60. package/dist/src/server/routes/mcp-usage.d.ts +5 -4
  61. package/dist/src/server/routes/mcp-usage.d.ts.map +1 -1
  62. package/dist/src/server/routes/mcp-usage.js.map +1 -1
  63. package/dist/src/server/routes/reconcile.d.ts.map +1 -1
  64. package/dist/src/server/routes/reconcile.js +16 -0
  65. package/dist/src/server/routes/reconcile.js.map +1 -1
  66. package/dist/src/server/routes/search.d.ts.map +1 -1
  67. package/dist/src/server/routes/search.js +144 -24
  68. package/dist/src/server/routes/search.js.map +1 -1
  69. package/dist/src/storage/rebuild.d.ts.map +1 -1
  70. package/dist/src/storage/rebuild.js +24 -2
  71. package/dist/src/storage/rebuild.js.map +1 -1
  72. package/dist/src/storage/tables.d.ts +9 -0
  73. package/dist/src/storage/tables.d.ts.map +1 -1
  74. package/dist/src/storage/tables.js +22 -1
  75. package/dist/src/storage/tables.js.map +1 -1
  76. package/package.json +1 -1
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Dedupe-conversations repair pass — opt-in tool.
3
+ *
4
+ * Closes the residual gap from the 2026-05-13 stable-row-id upgrade:
5
+ * rows written before that slice carry a legacy row id derived from
6
+ * `(conversationId, jobRootId)` instead of the new
7
+ * `stableConversationRowId(source, conversationId)`. A re-import after
8
+ * the upgrade lands the new stable-id row alongside the surviving legacy
9
+ * row instead of collapsing onto it, leaving two rows for the same
10
+ * `(source, conversation_id)`.
11
+ *
12
+ * Strategy: scan `conversations_hot` + `conversations_cold`, match each
13
+ * row to its raw artifact (by row id embedded in the filename), read
14
+ * `(source, conversation_id)` from the raw, and group rows by that
15
+ * canonical key. For groups with more than one member, pick a keeper
16
+ * and delete the rest (plus the matching raw files).
17
+ *
18
+ * Decision rule:
19
+ * 1. If any group member's row id matches
20
+ * `stableConversationRowId(source, conversation_id)`, that member
21
+ * wins ("stable-id is canonical post-upgrade"). Ties between
22
+ * multiple stable members (degenerate — same row id would be one
23
+ * row) fall through to the same secondary tie-breakers.
24
+ * 2. Otherwise (all members are legacy), prefer the newest
25
+ * `indexed_at`, then prefer the `conversations_cold` member
26
+ * (compaction promotes cold to canonical), then prefer larger
27
+ * `content_length` (avoid silently shrinking the indexed snapshot),
28
+ * then the lexicographically smaller row id (deterministic).
29
+ *
30
+ * Safety guard on the stable rule: a stable-id row may have been
31
+ * imported from an older export, so it can legitimately be older or
32
+ * shorter than a surviving legacy row from a more recent import. If
33
+ * any legacy member of the group is newer OR has more content than
34
+ * the chosen stable winner, the group is classified `suspicious` and
35
+ * `--apply` never mutates it. The operator triages by hand.
36
+ *
37
+ * Dry-run by default. Only `--apply` mutates rows or deletes raw files.
38
+ * Rows whose raw file is missing are skipped — the normal reconcile pass
39
+ * already classifies them as orphans, which is a different repair lane.
40
+ */
41
+ import { stableConversationRowId } from "../../ingestion/inbox-core/conversation-key.js";
42
+ /**
43
+ * Pure planner. Given a snapshot of rows + raw files, produces the
44
+ * dedupe plan with no I/O. Caller decides whether to apply.
45
+ */
46
+ export function planDedupe(input) {
47
+ // Group raw files by the row id in the filename. A row id can have
48
+ // multiple raws (refresh-on-grow before the prune-prior-raw slice).
49
+ const rawsByRowId = new Map();
50
+ for (const raw of input.raw_files) {
51
+ const arr = rawsByRowId.get(raw.row_id_from_filename) ?? [];
52
+ arr.push(raw);
53
+ rawsByRowId.set(raw.row_id_from_filename, arr);
54
+ }
55
+ // Derive (source, conversation_id) per row id from its latest raw
56
+ // (lexicographically greatest filename). All raws for the same row
57
+ // id share the same provider conversation id, so this is just
58
+ // picking the most recent metadata snapshot.
59
+ const sourceAndConvByRowId = new Map();
60
+ for (const [rowId, raws] of rawsByRowId) {
61
+ const latest = raws.reduce((a, b) => (a.filename > b.filename ? a : b));
62
+ sourceAndConvByRowId.set(rowId, {
63
+ source: latest.source,
64
+ conversation_id: latest.conversation_id,
65
+ });
66
+ }
67
+ // Group rows by (source, conversation_id). Nested map (source ->
68
+ // conversation_id -> members) avoids string-key delimiter ambiguity
69
+ // since provider conversation ids can in principle contain any
70
+ // character.
71
+ const groups = new Map();
72
+ const rowsWithoutRaw = [];
73
+ for (const row of input.rows) {
74
+ const lookup = sourceAndConvByRowId.get(row.row_id);
75
+ if (!lookup) {
76
+ rowsWithoutRaw.push({ row_id: row.row_id, table: row.table });
77
+ continue;
78
+ }
79
+ const stableId = stableConversationRowId(lookup.source, lookup.conversation_id);
80
+ const member = {
81
+ row_id: row.row_id,
82
+ table: row.table,
83
+ indexed_at: row.indexed_at,
84
+ content_length: row.content_length,
85
+ is_stable_id: row.row_id === stableId,
86
+ raw_files: (rawsByRowId.get(row.row_id) ?? []).map((r) => r.path),
87
+ };
88
+ let bySource = groups.get(lookup.source);
89
+ if (!bySource) {
90
+ bySource = new Map();
91
+ groups.set(lookup.source, bySource);
92
+ }
93
+ const arr = bySource.get(lookup.conversation_id) ?? [];
94
+ arr.push(member);
95
+ bySource.set(lookup.conversation_id, arr);
96
+ }
97
+ // Build group plans for actual duplicates (size > 1).
98
+ const actionable = [];
99
+ const suspicious = [];
100
+ for (const [source, bySource] of groups) {
101
+ for (const [conversationId, members] of bySource) {
102
+ if (members.length < 2)
103
+ continue;
104
+ const stableId = stableConversationRowId(source, conversationId);
105
+ const decision = pickKeeper(members);
106
+ const deleted = members.filter((m) => m !== decision.kept);
107
+ const reasons = detectSuspicion(decision.kept, deleted);
108
+ const plan = {
109
+ source,
110
+ conversation_id: conversationId,
111
+ stable_id: stableId,
112
+ members,
113
+ kept_member: decision.kept,
114
+ deleted_members: deleted,
115
+ raw_files_to_delete: deleted.flatMap((m) => m.raw_files),
116
+ decision_reason: decision.reason,
117
+ classification: reasons.length > 0 ? "suspicious" : "actionable",
118
+ suspicious_reasons: reasons,
119
+ };
120
+ if (reasons.length > 0)
121
+ suspicious.push(plan);
122
+ else
123
+ actionable.push(plan);
124
+ }
125
+ }
126
+ // Deterministic ordering within each bucket: by source, then conversation_id.
127
+ const orderGroups = (a, b) => {
128
+ if (a.source !== b.source)
129
+ return a.source < b.source ? -1 : 1;
130
+ return a.conversation_id < b.conversation_id ? -1 : 1;
131
+ };
132
+ actionable.sort(orderGroups);
133
+ suspicious.sort(orderGroups);
134
+ return {
135
+ actionable_groups: actionable,
136
+ suspicious_groups: suspicious,
137
+ rows_without_raw: rowsWithoutRaw,
138
+ };
139
+ }
140
+ /**
141
+ * A stable winner is only safe to delete legacy members when it is
142
+ * at least as new AND at least as long as every loser. Returns the
143
+ * list of suspicion reasons; empty list means the group is actionable.
144
+ * Legacy-only groups (where the keeper is itself legacy) are always
145
+ * actionable — the keeper rule already picked the safest legacy
146
+ * member (newest, then cold-preferred, then longer content).
147
+ */
148
+ function detectSuspicion(kept, deleted) {
149
+ if (!kept.is_stable_id)
150
+ return [];
151
+ const reasons = new Set();
152
+ for (const loser of deleted) {
153
+ if (loser.indexed_at > kept.indexed_at)
154
+ reasons.add("legacy_member_is_newer");
155
+ if (loser.content_length > kept.content_length)
156
+ reasons.add("legacy_member_has_more_content");
157
+ }
158
+ return [...reasons];
159
+ }
160
+ function pickKeeper(members) {
161
+ const stable = members.filter((m) => m.is_stable_id);
162
+ if (stable.length > 0) {
163
+ const kept = stable.reduce(secondaryTieBreak);
164
+ return { kept, reason: "stable-id row is canonical post-upgrade" };
165
+ }
166
+ const kept = members.reduce(legacyPick);
167
+ return {
168
+ kept,
169
+ reason: "no stable-id row in group; kept newest legacy (cold-preferred, then longer content)",
170
+ };
171
+ }
172
+ /** Newest indexed_at wins; then prefer cold; then longer content; then lex-smaller id. */
173
+ function legacyPick(a, b) {
174
+ if (a.indexed_at !== b.indexed_at)
175
+ return a.indexed_at > b.indexed_at ? a : b;
176
+ return secondaryTieBreak(a, b);
177
+ }
178
+ /** Prefer cold; then longer content; then lex-smaller row id. */
179
+ function secondaryTieBreak(a, b) {
180
+ if (a.table !== b.table) {
181
+ return a.table === "conversations_cold" ? a : b;
182
+ }
183
+ if (a.content_length !== b.content_length) {
184
+ return a.content_length > b.content_length ? a : b;
185
+ }
186
+ return a.row_id < b.row_id ? a : b;
187
+ }
188
+ // ---------------------------------------------------------------------------
189
+ // Side-effecting wrapper: reads tables + raw dirs, plans, optionally applies.
190
+ // ---------------------------------------------------------------------------
191
+ import fs from "node:fs";
192
+ import path from "node:path";
193
+ import { getTable } from "../../storage/tables.js";
194
+ import { CONVERSATION_SOURCES } from "../../providers/types.js";
195
+ const ALL_CONV_SOURCES = [...CONVERSATION_SOURCES, "inbox"];
196
+ /**
197
+ * Scan `conversations_hot` + `conversations_cold`, plan the dedupe,
198
+ * optionally apply. Caller (the reconcile handler) wraps this in the
199
+ * watcher pause/resume protocol so live writes can't race.
200
+ */
201
+ export async function dedupeConversations(opts) {
202
+ const hotTable = getTable("conversations_hot");
203
+ const coldTable = getTable("conversations_cold");
204
+ const hotRows = (await hotTable.query().toArray());
205
+ const coldRows = (await coldTable.query().toArray());
206
+ const rows = [
207
+ ...hotRows.map((r) => rowView(r, "conversations_hot")),
208
+ ...coldRows.map((r) => rowView(r, "conversations_cold")),
209
+ ];
210
+ const errors = [];
211
+ const rawFiles = [];
212
+ for (const source of ALL_CONV_SOURCES) {
213
+ const rawDir = path.join(opts.dataDir, "raw", "conversations", source);
214
+ if (!fs.existsSync(rawDir))
215
+ continue;
216
+ for (const filename of fs.readdirSync(rawDir)) {
217
+ if (!filename.endsWith(".json"))
218
+ continue;
219
+ const rowIdFromFilename = extractIdFromFilename(filename);
220
+ if (!rowIdFromFilename)
221
+ continue;
222
+ const fullPath = path.join(rawDir, filename);
223
+ try {
224
+ const raw = JSON.parse(fs.readFileSync(fullPath, "utf-8"));
225
+ const rawSource = typeof raw.source === "string" ? raw.source : source;
226
+ const conversationId = typeof raw.conversation_id === "string" ? raw.conversation_id : "";
227
+ if (!conversationId) {
228
+ // Pre-stable-id raws may not carry conversation_id at all.
229
+ // Without it we can't group, so skip silently.
230
+ continue;
231
+ }
232
+ rawFiles.push({
233
+ path: fullPath,
234
+ filename,
235
+ row_id_from_filename: rowIdFromFilename,
236
+ source: rawSource,
237
+ conversation_id: conversationId,
238
+ });
239
+ }
240
+ catch (err) {
241
+ errors.push(`read raw failed: ${fullPath}: ${err instanceof Error ? err.message : String(err)}`);
242
+ }
243
+ }
244
+ }
245
+ const plan = planDedupe({ rows, raw_files: rawFiles });
246
+ const rowsToDelete = plan.actionable_groups.reduce((n, g) => n + g.deleted_members.length, 0);
247
+ const rawFilesToDelete = plan.actionable_groups.reduce((n, g) => n + g.raw_files_to_delete.length, 0);
248
+ let rowsDeleted = 0;
249
+ let rawFilesDeleted = 0;
250
+ if (opts.apply) {
251
+ // Suspicious groups are deliberately NOT touched, even with --apply.
252
+ for (const group of plan.actionable_groups) {
253
+ for (const member of group.deleted_members) {
254
+ const table = member.table === "conversations_cold"
255
+ ? coldTable
256
+ : hotTable;
257
+ try {
258
+ await table.delete(`id = '${member.row_id}'`);
259
+ rowsDeleted++;
260
+ }
261
+ catch (err) {
262
+ errors.push(`delete row failed: ${member.table}/${member.row_id}: ${err instanceof Error ? err.message : String(err)}`);
263
+ }
264
+ }
265
+ for (const rawPath of group.raw_files_to_delete) {
266
+ try {
267
+ fs.unlinkSync(rawPath);
268
+ rawFilesDeleted++;
269
+ }
270
+ catch (err) {
271
+ if (err && typeof err === "object" && "code" in err
272
+ && err.code === "ENOENT") {
273
+ // Already gone — count as deleted, not an error.
274
+ rawFilesDeleted++;
275
+ }
276
+ else {
277
+ errors.push(`delete raw failed: ${rawPath}: ${err instanceof Error ? err.message : String(err)}`);
278
+ }
279
+ }
280
+ }
281
+ }
282
+ }
283
+ const report = {
284
+ apply: opts.apply,
285
+ rows_scanned: rows.length,
286
+ raw_files_scanned: rawFiles.length,
287
+ duplicate_groups_found: plan.actionable_groups.length + plan.suspicious_groups.length,
288
+ rows_to_delete: rowsToDelete,
289
+ raw_files_to_delete: rawFilesToDelete,
290
+ rows_deleted: rowsDeleted,
291
+ raw_files_deleted: rawFilesDeleted,
292
+ rows_without_raw: plan.rows_without_raw.length,
293
+ suspicious_groups_skipped: plan.suspicious_groups.length,
294
+ actionable_groups: plan.actionable_groups,
295
+ suspicious_groups: plan.suspicious_groups,
296
+ errors,
297
+ };
298
+ if (opts.reportsDir) {
299
+ try {
300
+ fs.mkdirSync(opts.reportsDir, { recursive: true });
301
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
302
+ const suffix = opts.apply ? "apply" : "dry-run";
303
+ const reportPath = path.join(opts.reportsDir, `dedupe-conversations-${stamp}-${suffix}.json`);
304
+ // Set report_path BEFORE serializing so the persisted file is
305
+ // self-identifying — `report_path` on disk equals its own location.
306
+ report.report_path = reportPath;
307
+ fs.writeFileSync(reportPath, JSON.stringify(report, null, 2));
308
+ }
309
+ catch (err) {
310
+ report.errors.push(`write report failed: ${opts.reportsDir}: ${err instanceof Error ? err.message : String(err)}`);
311
+ }
312
+ }
313
+ return report;
314
+ }
315
+ function rowView(row, table) {
316
+ return {
317
+ row_id: row.id,
318
+ table,
319
+ indexed_at: row.indexed_at,
320
+ content_length: (row.content ?? "").length,
321
+ };
322
+ }
323
+ /**
324
+ * Filename format: `{ISO-timestamp}_{rowId}.json`. ISO timestamps in
325
+ * the writer use `:` and `.` replaced by `-`, so the first `_`
326
+ * is the unambiguous separator.
327
+ */
328
+ function extractIdFromFilename(filename) {
329
+ const match = filename.match(/^[^_]+_(.+)\.json$/);
330
+ return match?.[1];
331
+ }
332
+ //# sourceMappingURL=dedupe-conversations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedupe-conversations.js","sourceRoot":"","sources":["../../../../src/jobs/handlers/dedupe-conversations.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../../../src/jobs/handlers/ingest.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAO,UAAU,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAElB,MAAM,0BAA0B,CAAC;AAWlC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAKnE,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,CAAC;IAChB,wBAAwB,CAAC,EAAE,CACzB,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,iBAAiB,KACpB,iBAAiB,CAAC;CACxB;AAiDD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,CA4LvE"}
1
+ {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../../../src/jobs/handlers/ingest.ts"],"names":[],"mappings":"AAsDA,OAAO,KAAK,EAAO,UAAU,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAElB,MAAM,0BAA0B,CAAC;AAalC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAKnE,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,CAAC;IAChB,wBAAwB,CAAC,EAAE,CACzB,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,iBAAiB,KACpB,iBAAiB,CAAC;CACxB;AA4HD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,CA6PvE"}