@getrift/rift 0.1.0-beta.1 → 0.1.0-beta.11

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 (207) hide show
  1. package/README.md +154 -0
  2. package/dist/src/auth/keychain.d.ts +9 -0
  3. package/dist/src/auth/keychain.d.ts.map +1 -1
  4. package/dist/src/auth/keychain.js +37 -0
  5. package/dist/src/auth/keychain.js.map +1 -1
  6. package/dist/src/capture/recover-quarantine.d.ts +221 -0
  7. package/dist/src/capture/recover-quarantine.d.ts.map +1 -0
  8. package/dist/src/capture/recover-quarantine.js +453 -0
  9. package/dist/src/capture/recover-quarantine.js.map +1 -0
  10. package/dist/src/cli/commands/backfill.d.ts.map +1 -1
  11. package/dist/src/cli/commands/backfill.js +5 -2
  12. package/dist/src/cli/commands/backfill.js.map +1 -1
  13. package/dist/src/cli/commands/capture-recover.d.ts +12 -0
  14. package/dist/src/cli/commands/capture-recover.d.ts.map +1 -0
  15. package/dist/src/cli/commands/capture-recover.js +120 -0
  16. package/dist/src/cli/commands/capture-recover.js.map +1 -0
  17. package/dist/src/cli/commands/capture.d.ts.map +1 -1
  18. package/dist/src/cli/commands/capture.js +10 -4
  19. package/dist/src/cli/commands/capture.js.map +1 -1
  20. package/dist/src/cli/commands/feedback.d.ts.map +1 -1
  21. package/dist/src/cli/commands/feedback.js +6 -2
  22. package/dist/src/cli/commands/feedback.js.map +1 -1
  23. package/dist/src/cli/commands/mcp-install.js +5 -2
  24. package/dist/src/cli/commands/mcp-install.js.map +1 -1
  25. package/dist/src/cli/commands/onboard.d.ts +24 -0
  26. package/dist/src/cli/commands/onboard.d.ts.map +1 -1
  27. package/dist/src/cli/commands/onboard.js +119 -21
  28. package/dist/src/cli/commands/onboard.js.map +1 -1
  29. package/dist/src/cli/commands/rebuild.d.ts.map +1 -1
  30. package/dist/src/cli/commands/rebuild.js +6 -3
  31. package/dist/src/cli/commands/rebuild.js.map +1 -1
  32. package/dist/src/cli/commands/review.d.ts.map +1 -1
  33. package/dist/src/cli/commands/review.js +22 -7
  34. package/dist/src/cli/commands/review.js.map +1 -1
  35. package/dist/src/cli/commands/search.d.ts.map +1 -1
  36. package/dist/src/cli/commands/search.js +28 -4
  37. package/dist/src/cli/commands/search.js.map +1 -1
  38. package/dist/src/cli/commands/status.d.ts.map +1 -1
  39. package/dist/src/cli/commands/status.js +48 -2
  40. package/dist/src/cli/commands/status.js.map +1 -1
  41. package/dist/src/cli/commands/token-issue.d.ts.map +1 -1
  42. package/dist/src/cli/commands/token-issue.js +9 -1
  43. package/dist/src/cli/commands/token-issue.js.map +1 -1
  44. package/dist/src/cli/commands/triage.d.ts.map +1 -1
  45. package/dist/src/cli/commands/triage.js +7 -5
  46. package/dist/src/cli/commands/triage.js.map +1 -1
  47. package/dist/src/cli/commands/update.d.ts +26 -0
  48. package/dist/src/cli/commands/update.d.ts.map +1 -0
  49. package/dist/src/cli/commands/update.js +130 -0
  50. package/dist/src/cli/commands/update.js.map +1 -0
  51. package/dist/src/cli/default-config-path.d.ts +15 -0
  52. package/dist/src/cli/default-config-path.d.ts.map +1 -0
  53. package/dist/src/cli/default-config-path.js +27 -0
  54. package/dist/src/cli/default-config-path.js.map +1 -0
  55. package/dist/src/cli/http-client.d.ts +56 -1
  56. package/dist/src/cli/http-client.d.ts.map +1 -1
  57. package/dist/src/cli/http-client.js +161 -6
  58. package/dist/src/cli/http-client.js.map +1 -1
  59. package/dist/src/cli/index.d.ts.map +1 -1
  60. package/dist/src/cli/index.js +25 -6
  61. package/dist/src/cli/index.js.map +1 -1
  62. package/dist/src/cli/status/friend-header.d.ts.map +1 -1
  63. package/dist/src/cli/status/friend-header.js +117 -7
  64. package/dist/src/cli/status/friend-header.js.map +1 -1
  65. package/dist/src/ingestion/inbox-core/conversation-fingerprint.d.ts +2 -0
  66. package/dist/src/ingestion/inbox-core/conversation-fingerprint.d.ts.map +1 -0
  67. package/dist/src/ingestion/inbox-core/conversation-fingerprint.js +27 -0
  68. package/dist/src/ingestion/inbox-core/conversation-fingerprint.js.map +1 -0
  69. package/dist/src/ingestion/inbox-core/conversation-key.d.ts +2 -0
  70. package/dist/src/ingestion/inbox-core/conversation-key.d.ts.map +1 -0
  71. package/dist/src/ingestion/inbox-core/conversation-key.js +31 -0
  72. package/dist/src/ingestion/inbox-core/conversation-key.js.map +1 -0
  73. package/dist/src/ingestion/inbox-core/extensions.d.ts +3 -0
  74. package/dist/src/ingestion/inbox-core/extensions.d.ts.map +1 -0
  75. package/dist/src/ingestion/inbox-core/extensions.js +16 -0
  76. package/dist/src/ingestion/inbox-core/extensions.js.map +1 -0
  77. package/dist/src/ingestion/inbox-core/idempotency.d.ts +2 -0
  78. package/dist/src/ingestion/inbox-core/idempotency.d.ts.map +1 -0
  79. package/dist/src/ingestion/inbox-core/idempotency.js +22 -0
  80. package/dist/src/ingestion/inbox-core/idempotency.js.map +1 -0
  81. package/dist/src/ingestion/inbox-core/index.d.ts +20 -0
  82. package/dist/src/ingestion/inbox-core/index.d.ts.map +1 -0
  83. package/dist/src/ingestion/inbox-core/index.js +20 -0
  84. package/dist/src/ingestion/inbox-core/index.js.map +1 -0
  85. package/dist/src/ingestion/inbox-core/source-detection.d.ts +2 -0
  86. package/dist/src/ingestion/inbox-core/source-detection.d.ts.map +1 -0
  87. package/dist/src/ingestion/inbox-core/source-detection.js +23 -0
  88. package/dist/src/ingestion/inbox-core/source-detection.js.map +1 -0
  89. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts +11 -0
  90. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts.map +1 -0
  91. package/dist/src/ingestion/inbox-core/source-sniffer.js +69 -0
  92. package/dist/src/ingestion/inbox-core/source-sniffer.js.map +1 -0
  93. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts +70 -0
  94. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts.map +1 -0
  95. package/dist/src/ingestion/inbox-core/zip-sniffer.js +161 -0
  96. package/dist/src/ingestion/inbox-core/zip-sniffer.js.map +1 -0
  97. package/dist/src/ingestion/inbox-watcher.d.ts.map +1 -1
  98. package/dist/src/ingestion/inbox-watcher.js +34 -50
  99. package/dist/src/ingestion/inbox-watcher.js.map +1 -1
  100. package/dist/src/ingestion/indexer.d.ts +7 -0
  101. package/dist/src/ingestion/indexer.d.ts.map +1 -1
  102. package/dist/src/ingestion/indexer.js +36 -2
  103. package/dist/src/ingestion/indexer.js.map +1 -1
  104. package/dist/src/ingestion/metadata-extraction.d.ts +8 -5
  105. package/dist/src/ingestion/metadata-extraction.d.ts.map +1 -1
  106. package/dist/src/ingestion/metadata-extraction.js +24 -5
  107. package/dist/src/ingestion/metadata-extraction.js.map +1 -1
  108. package/dist/src/ingestion/skip-quarantine.d.ts +10 -0
  109. package/dist/src/ingestion/skip-quarantine.d.ts.map +1 -0
  110. package/dist/src/ingestion/skip-quarantine.js +35 -0
  111. package/dist/src/ingestion/skip-quarantine.js.map +1 -0
  112. package/dist/src/jobs/handlers/compact.d.ts.map +1 -1
  113. package/dist/src/jobs/handlers/compact.js +25 -4
  114. package/dist/src/jobs/handlers/compact.js.map +1 -1
  115. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
  116. package/dist/src/jobs/handlers/ingest.js +214 -36
  117. package/dist/src/jobs/handlers/ingest.js.map +1 -1
  118. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -1
  119. package/dist/src/jobs/handlers/reconcile.js +30 -8
  120. package/dist/src/jobs/handlers/reconcile.js.map +1 -1
  121. package/dist/src/jobs/handlers/reindex.d.ts.map +1 -1
  122. package/dist/src/jobs/handlers/reindex.js +12 -2
  123. package/dist/src/jobs/handlers/reindex.js.map +1 -1
  124. package/dist/src/jobs/handlers/save.d.ts.map +1 -1
  125. package/dist/src/jobs/handlers/save.js +9 -2
  126. package/dist/src/jobs/handlers/save.js.map +1 -1
  127. package/dist/src/jobs/queue.d.ts +11 -0
  128. package/dist/src/jobs/queue.d.ts.map +1 -1
  129. package/dist/src/jobs/queue.js +18 -0
  130. package/dist/src/jobs/queue.js.map +1 -1
  131. package/dist/src/jobs/worker-entry.d.ts.map +1 -1
  132. package/dist/src/jobs/worker-entry.js +2 -0
  133. package/dist/src/jobs/worker-entry.js.map +1 -1
  134. package/dist/src/main.js +36 -4
  135. package/dist/src/main.js.map +1 -1
  136. package/dist/src/mcp/errors.d.ts.map +1 -1
  137. package/dist/src/mcp/errors.js +20 -1
  138. package/dist/src/mcp/errors.js.map +1 -1
  139. package/dist/src/mcp/tools/context-pack.d.ts.map +1 -1
  140. package/dist/src/mcp/tools/context-pack.js +5 -2
  141. package/dist/src/mcp/tools/context-pack.js.map +1 -1
  142. package/dist/src/mcp/tools/search.d.ts +6 -2
  143. package/dist/src/mcp/tools/search.d.ts.map +1 -1
  144. package/dist/src/mcp/tools/search.js +34 -4
  145. package/dist/src/mcp/tools/search.js.map +1 -1
  146. package/dist/src/observability/embedding-events.d.ts +52 -0
  147. package/dist/src/observability/embedding-events.d.ts.map +1 -0
  148. package/dist/src/observability/embedding-events.js +149 -0
  149. package/dist/src/observability/embedding-events.js.map +1 -0
  150. package/dist/src/observability/index-events.d.ts +70 -0
  151. package/dist/src/observability/index-events.d.ts.map +1 -0
  152. package/dist/src/observability/index-events.js +148 -0
  153. package/dist/src/observability/index-events.js.map +1 -0
  154. package/dist/src/observability/tool-usage-stats.d.ts +69 -4
  155. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -1
  156. package/dist/src/observability/tool-usage-stats.js +88 -31
  157. package/dist/src/observability/tool-usage-stats.js.map +1 -1
  158. package/dist/src/observability/tool-usage.d.ts +100 -7
  159. package/dist/src/observability/tool-usage.d.ts.map +1 -1
  160. package/dist/src/observability/tool-usage.js +196 -33
  161. package/dist/src/observability/tool-usage.js.map +1 -1
  162. package/dist/src/observability/version-check.d.ts +70 -0
  163. package/dist/src/observability/version-check.d.ts.map +1 -0
  164. package/dist/src/observability/version-check.js +197 -0
  165. package/dist/src/observability/version-check.js.map +1 -0
  166. package/dist/src/providers/ollama-embed.d.ts +2 -1
  167. package/dist/src/providers/ollama-embed.d.ts.map +1 -1
  168. package/dist/src/providers/ollama-embed.js +1 -0
  169. package/dist/src/providers/ollama-embed.js.map +1 -1
  170. package/dist/src/providers/openai-metadata-extraction.d.ts +3 -3
  171. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -1
  172. package/dist/src/providers/openai-metadata-extraction.js +18 -3
  173. package/dist/src/providers/openai-metadata-extraction.js.map +1 -1
  174. package/dist/src/providers/stub.d.ts +2 -0
  175. package/dist/src/providers/stub.d.ts.map +1 -1
  176. package/dist/src/providers/stub.js +2 -0
  177. package/dist/src/providers/stub.js.map +1 -1
  178. package/dist/src/providers/types.d.ts +11 -0
  179. package/dist/src/providers/types.d.ts.map +1 -1
  180. package/dist/src/providers/voyage.d.ts +2 -1
  181. package/dist/src/providers/voyage.d.ts.map +1 -1
  182. package/dist/src/providers/voyage.js +1 -0
  183. package/dist/src/providers/voyage.js.map +1 -1
  184. package/dist/src/retrieval/compact.d.ts +115 -2
  185. package/dist/src/retrieval/compact.d.ts.map +1 -1
  186. package/dist/src/retrieval/compact.js +154 -5
  187. package/dist/src/retrieval/compact.js.map +1 -1
  188. package/dist/src/retrieval/context-pack.d.ts +8 -0
  189. package/dist/src/retrieval/context-pack.d.ts.map +1 -1
  190. package/dist/src/retrieval/context-pack.js +17 -2
  191. package/dist/src/retrieval/context-pack.js.map +1 -1
  192. package/dist/src/server/app.d.ts.map +1 -1
  193. package/dist/src/server/app.js +67 -1
  194. package/dist/src/server/app.js.map +1 -1
  195. package/dist/src/server/routes/friend-status.d.ts +202 -3
  196. package/dist/src/server/routes/friend-status.d.ts.map +1 -1
  197. package/dist/src/server/routes/friend-status.js +290 -7
  198. package/dist/src/server/routes/friend-status.js.map +1 -1
  199. package/dist/src/server/routes/mcp-usage.d.ts +4 -4
  200. package/dist/src/server/routes/search.d.ts.map +1 -1
  201. package/dist/src/server/routes/search.js +144 -24
  202. package/dist/src/server/routes/search.js.map +1 -1
  203. package/dist/src/storage/rebuild.d.ts +14 -1
  204. package/dist/src/storage/rebuild.d.ts.map +1 -1
  205. package/dist/src/storage/rebuild.js +160 -34
  206. package/dist/src/storage/rebuild.js.map +1 -1
  207. package/package.json +1 -1
@@ -1,24 +1,7 @@
1
- /**
2
- * Tokens-saved estimates per MCP tool call. The numbers are the
3
- * approximate tokens an agent would have to spend stuffing equivalent
4
- * context into a system prompt or doing the same query without the
5
- * compact, bucketed retrieval the MCP server provides.
6
- *
7
- * Unknown tools fall back to `DEFAULT_TOKENS_SAVED` so future tools
8
- * report a non-zero baseline.
9
- */
10
- const TOKENS_SAVED_PER_TOOL = {
11
- rift_context_pack: 12_000,
12
- rift_conversations_search: 8_000,
13
- rift_search: 6_000,
14
- rift_save: 2_000,
15
- rift_status: 1_000,
16
- };
17
- const DEFAULT_TOKENS_SAVED = 1_000;
18
1
  /**
19
2
  * Map legacy tool names from JSONL rows written before the rename onto
20
- * their canonical `rift_*` equivalents so SwiftBar tokens-saved counters
21
- * stay continuous on a machine that upgrades. Hidden migration only —
3
+ * their canonical `rift_*` equivalents so SwiftBar counters stay
4
+ * continuous on a machine that upgrades. Hidden migration only —
22
5
  * never surfaces in user-visible output.
23
6
  */
24
7
  const LEGACY_TOOL_RENAMES = {
@@ -33,16 +16,53 @@ function canonicalToolName(tool) {
33
16
  }
34
17
  const DAY_MS = 24 * 60 * 60 * 1000;
35
18
  function emptyWindow() {
36
- return { calls: 0, tokens_saved: 0 };
19
+ return { calls: 0, context_hits: 0, context_tokens_delivered_estimate: 0 };
20
+ }
21
+ /**
22
+ * Cheap tokens estimate from a UTF-8 byte count. `bytes / 4` is the standard
23
+ * back-of-envelope for English text — good enough for a glanceable menu-bar
24
+ * counter without pulling a real tokenizer into the daemon.
25
+ */
26
+ function tokensFromBytes(bytes) {
27
+ return bytes > 0 ? Math.ceil(bytes / 4) : 0;
28
+ }
29
+ /**
30
+ * Local-time start-of-day. The menu-bar "today" counter is a glanceable
31
+ * Mac-local metric, so the boundary follows the machine's wall clock — not
32
+ * UTC, which would reset mid-evening in Asia/early-morning in Europe.
33
+ */
34
+ function startOfLocalDay(date) {
35
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();
37
36
  }
38
- function tokensSavedFor(tool) {
39
- return TOKENS_SAVED_PER_TOOL[tool] ?? DEFAULT_TOKENS_SAVED;
37
+ /**
38
+ * Local-time start of the following day. Built via the local-time Date
39
+ * constructor (not `startOfLocalDay + DAY_MS`) so DST-fallback days, which
40
+ * have 25 hours, still capture their final hour as "today".
41
+ */
42
+ function startOfNextLocalDay(date) {
43
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1).getTime();
40
44
  }
41
- function startOfUtcDay(date) {
42
- return Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
45
+ /**
46
+ * Tools whose `result_count` counts toward `context_hits`. Belt-and-suspenders
47
+ * with the logger's own whitelist in [extractRetrievalSignal] — if a future
48
+ * code path ever writes `result_count` for a non-retrieval tool, this gate
49
+ * still keeps it out of the metric.
50
+ */
51
+ const RETRIEVAL_TOOLS_FOR_HITS = new Set([
52
+ "rift_search",
53
+ "rift_conversations_search",
54
+ "rift_context_pack",
55
+ ]);
56
+ function isContextHit(tool, entry) {
57
+ return (RETRIEVAL_TOOLS_FOR_HITS.has(tool) &&
58
+ entry.success === true &&
59
+ entry.degraded !== true &&
60
+ typeof entry.result_count === "number" &&
61
+ entry.result_count > 0);
43
62
  }
44
63
  export function aggregateUsage(entries, now = new Date()) {
45
- const todayStartMs = startOfUtcDay(now);
64
+ const todayStartMs = startOfLocalDay(now);
65
+ const todayEndMs = startOfNextLocalDay(now);
46
66
  const nowMs = now.getTime();
47
67
  const weekStartMs = nowMs - 7 * DAY_MS;
48
68
  const monthStartMs = nowMs - 30 * DAY_MS;
@@ -52,30 +72,67 @@ export function aggregateUsage(entries, now = new Date()) {
52
72
  month: emptyWindow(),
53
73
  all_time: emptyWindow(),
54
74
  by_tool: {},
75
+ precise_lookup: {
76
+ total: 0,
77
+ successes: 0,
78
+ typed_failures: {},
79
+ by_detail: { middle: 0, full: 0 },
80
+ truncated_count: 0,
81
+ max_content_tokens_estimate: 0,
82
+ },
55
83
  };
56
- const todayEndMs = todayStartMs + DAY_MS;
57
84
  for (const entry of entries) {
58
85
  const ts = Date.parse(entry.timestamp);
59
86
  if (Number.isNaN(ts))
60
87
  continue;
61
88
  const tool = canonicalToolName(entry.tool);
62
- const tokens = entry.success ? tokensSavedFor(tool) : 0;
89
+ const hit = isContextHit(tool, entry) ? 1 : 0;
90
+ // Only count delivered tokens on context hits — empty/degraded/non-retrieval
91
+ // calls all contribute 0. `response_text_bytes` is absent on legacy rows
92
+ // written before the field existed; those naturally contribute 0 too.
93
+ const delivered = hit && typeof entry.response_text_bytes === "number"
94
+ ? tokensFromBytes(entry.response_text_bytes)
95
+ : 0;
63
96
  summary.all_time.calls += 1;
64
- summary.all_time.tokens_saved += tokens;
97
+ summary.all_time.context_tokens_delivered_estimate += delivered;
98
+ summary.all_time.context_hits += hit;
65
99
  summary.by_tool[tool] = (summary.by_tool[tool] ?? 0) + 1;
100
+ if (tool === "rift_search" && entry.search_mode === "exact_id") {
101
+ const pl = summary.precise_lookup;
102
+ pl.total += 1;
103
+ if (entry.success === true)
104
+ pl.successes += 1;
105
+ else if (typeof entry.typed_error === "string") {
106
+ pl.typed_failures[entry.typed_error] =
107
+ (pl.typed_failures[entry.typed_error] ?? 0) + 1;
108
+ }
109
+ if (entry.detail === "middle")
110
+ pl.by_detail.middle += 1;
111
+ else if (entry.detail === "full")
112
+ pl.by_detail.full += 1;
113
+ if (entry.has_truncated_content === true)
114
+ pl.truncated_count += 1;
115
+ if (typeof entry.max_content_tokens_estimate === "number" &&
116
+ entry.max_content_tokens_estimate > pl.max_content_tokens_estimate) {
117
+ pl.max_content_tokens_estimate = entry.max_content_tokens_estimate;
118
+ }
119
+ }
66
120
  if (ts > nowMs)
67
121
  continue;
68
122
  if (ts >= monthStartMs) {
69
123
  summary.month.calls += 1;
70
- summary.month.tokens_saved += tokens;
124
+ summary.month.context_tokens_delivered_estimate += delivered;
125
+ summary.month.context_hits += hit;
71
126
  }
72
127
  if (ts >= weekStartMs) {
73
128
  summary.week.calls += 1;
74
- summary.week.tokens_saved += tokens;
129
+ summary.week.context_tokens_delivered_estimate += delivered;
130
+ summary.week.context_hits += hit;
75
131
  }
76
132
  if (ts >= todayStartMs && ts < todayEndMs) {
77
133
  summary.today.calls += 1;
78
- summary.today.tokens_saved += tokens;
134
+ summary.today.context_tokens_delivered_estimate += delivered;
135
+ summary.today.context_hits += hit;
79
136
  }
80
137
  }
81
138
  return summary;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-usage-stats.js","sourceRoot":"","sources":["../../../src/observability/tool-usage-stats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-usage-stats.js","sourceRoot":"","sources":["../../../src/observability/tool-usage-stats.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ export type SearchMode = "exact_id" | "ranked";
2
+ export type DetailLevel = "summary" | "middle" | "full";
1
3
  export interface ToolUsageEntry {
2
4
  timestamp: string;
3
5
  type: "mcp_tool_call";
@@ -8,15 +10,64 @@ export interface ToolUsageEntry {
8
10
  result_count?: number;
9
11
  degraded?: boolean;
10
12
  error?: string;
13
+ /**
14
+ * rift_search only: "exact_id" when `args.id` is present AND
15
+ * `detail` is "middle" or "full" (the strict direct-lookup gate on
16
+ * `/search`); "ranked" otherwise. Recorded as a leading indicator for
17
+ * precise-lookup trust: a healthy exact-ID flow has a high success
18
+ * ratio and rare typed failures; failures are trust-loss risk signals
19
+ * that may push an agent to seek evidence outside Rift.
20
+ * Trust risk is named precisely — we cannot tell from Rift alone that
21
+ * the agent went on to read JSONL from disk, only that the precise
22
+ * lookup it asked for here failed.
23
+ */
24
+ search_mode?: SearchMode;
25
+ /** rift_search only: the detail level argued by the caller. */
26
+ detail?: DetailLevel;
27
+ /** rift_search only: whether the caller supplied an `id`. */
28
+ id_present?: boolean;
29
+ /** rift_search only: whether the caller supplied a `tier`. */
30
+ tier_present?: boolean;
31
+ /** rift_search only: whether the caller supplied a `source_table`. */
32
+ source_table_present?: boolean;
33
+ /**
34
+ * rift_search only: the typed error code parsed from the response
35
+ * body when the call failed with a structured error (e.g.
36
+ * `id_not_found`, `ambiguous_id`). Absent for generic transport
37
+ * failures or untyped 4xx/5xx.
38
+ */
39
+ typed_error?: string;
40
+ /**
41
+ * rift_search only: true when any returned hit carries
42
+ * `content_truncated === true`. Signals that the agent received a
43
+ * bounded middle-detail excerpt rather than the full row body — a
44
+ * useful leading indicator that the agent may decide to escalate to
45
+ * `detail=full` next.
46
+ */
47
+ has_truncated_content?: boolean;
48
+ /**
49
+ * rift_search only: the maximum `content_tokens_estimate` observed
50
+ * across returned hits. Cheap to compute (the size advisory is
51
+ * already on each hit) and lets us see whether agents are routinely
52
+ * being shown rows that would blow context if expanded.
53
+ */
54
+ max_content_tokens_estimate?: number;
55
+ /**
56
+ * Total UTF-8 byte length of `content[].text` on the MCP response we
57
+ * hand back to the caller. The text channel is the user/model-visible
58
+ * answer; we count it (rather than `structuredContent`, which often
59
+ * duplicates the same data) so the resulting tokens-delivered estimate
60
+ * isn't double-counted. Recorded on every successful call so it can
61
+ * survive retrieval-tool / non-retrieval-tool reclassifications later.
62
+ */
63
+ response_text_bytes?: number;
11
64
  }
12
65
  export declare function sanitizeArgs(raw: Record<string, unknown>): Record<string, unknown>;
13
66
  /**
14
- * Try to extract result_count from search-tool responses.
15
- *
16
- * Slice 1: search tools now emit markdown on the text channel and put the
17
- * compact DTO in `structuredContent`. We read from structuredContent first
18
- * and fall back to JSON-parsing the text channel for backwards compatibility
19
- * with tools that still return JSON there.
67
+ * Try to extract `result_count` from a retrieval-tool response. For search
68
+ * tools this is `results.length`; for `rift_context_pack` it is the sum of
69
+ * all four bucket sizes (decisions + constraints + examples + rules).
70
+ * Returns `undefined` for non-retrieval tools.
20
71
  */
21
72
  export declare function extractResultCount(tool: string, mcpResult: {
22
73
  content: Array<{
@@ -26,7 +77,9 @@ export declare function extractResultCount(tool: string, mcpResult: {
26
77
  structuredContent?: Record<string, unknown>;
27
78
  }): number | undefined;
28
79
  /**
29
- * Try to extract degraded flag from search-tool responses.
80
+ * Try to extract the `degraded` flag from a retrieval-tool response.
81
+ * Returns `undefined` for non-retrieval tools and for retrieval tools whose
82
+ * response did not carry the flag.
30
83
  */
31
84
  export declare function extractDegraded(tool: string, mcpResult: {
32
85
  content: Array<{
@@ -35,6 +88,46 @@ export declare function extractDegraded(tool: string, mcpResult: {
35
88
  }>;
36
89
  structuredContent?: Record<string, unknown>;
37
90
  }): boolean | undefined;
91
+ /**
92
+ * Derive search-mode metadata from the raw rift_search args. Mirrors the
93
+ * direct-lookup gate on `/search`: `id` + (`middle` | `full`) → exact_id;
94
+ * anything else is ranked retrieval, even if `id` is present alongside
95
+ * `detail="summary"` (which doesn't trigger the strict path).
96
+ */
97
+ export declare function deriveSearchModeMeta(args: Record<string, unknown>): {
98
+ search_mode: SearchMode;
99
+ detail: DetailLevel;
100
+ id_present: boolean;
101
+ tier_present: boolean;
102
+ source_table_present: boolean;
103
+ };
104
+ /**
105
+ * Derive result-side metadata for a successful rift_search call:
106
+ * - has_truncated_content: any returned hit with content_truncated=true
107
+ * - max_content_tokens_estimate: max content_tokens_estimate across hits
108
+ *
109
+ * Reads from `structuredContent.results` (the canonical compact DTO).
110
+ * Returns `{}` when the result shape is unknown — never throws.
111
+ */
112
+ export declare function extractSearchResultMeta(mcpResult: {
113
+ content: Array<{
114
+ type: string;
115
+ text: string;
116
+ }>;
117
+ structuredContent?: Record<string, unknown>;
118
+ }): {
119
+ has_truncated_content?: boolean;
120
+ max_content_tokens_estimate?: number;
121
+ };
122
+ /**
123
+ * Try to parse the typed error code (`id_not_found`, `ambiguous_id`, …)
124
+ * out of a failure response's text channel. `formatError` formats typed
125
+ * 404/409 bodies as `"<Prefix>: { "error": "id_not_found", … }"`, so we
126
+ * locate the first `{`, JSON.parse to end, and return the `error` field
127
+ * when it's a string. Returns `undefined` for transport-only failures
128
+ * (no body), untyped responses, or unparseable text.
129
+ */
130
+ export declare function parseTypedError(text: string | undefined): string | undefined;
38
131
  export declare class ToolUsageLogger {
39
132
  private readonly logPath;
40
133
  constructor(dataDir: string);
@@ -1 +1 @@
1
- {"version":3,"file":"tool-usage.d.ts","sourceRoot":"","sources":["../../../src/observability/tool-usage.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB;AAID;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE;IACT,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C,GACA,MAAM,GAAG,SAAS,CAapB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE;IACT,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C,GACA,OAAO,GAAG,SAAS,CAarB;AAID,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,MAAM;IAK3B,2CAA2C;IAC3C,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAWhC;;;OAGG;IACH,IAAI,CACF,CAAC,SAAS;QACR,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC7C,EAED,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,CAAC;IAwCb,sCAAsC;IACtC,OAAO,IAAI,cAAc,EAAE;IAa3B,IAAI,QAAQ,IAAI,MAAM,CAErB;CACF;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,GACf,cAAc,EAAE,CA4BlB"}
1
+ {"version":3,"file":"tool-usage.d.ts","sourceRoot":"","sources":["../../../src/observability/tool-usage.ts"],"names":[],"mappings":"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"}
@@ -40,51 +40,174 @@ export function sanitizeArgs(raw) {
40
40
  }
41
41
  // --- Result extraction ---
42
42
  /**
43
- * Try to extract result_count from search-tool responses.
44
- *
45
- * Slice 1: search tools now emit markdown on the text channel and put the
46
- * compact DTO in `structuredContent`. We read from structuredContent first
47
- * and fall back to JSON-parsing the text channel for backwards compatibility
48
- * with tools that still return JSON there.
43
+ * Tools whose responses carry a retrieval-size signal we can count toward
44
+ * `context_hits`. Explicit whitelist (not a substring match on "search") so
45
+ * future non-retrieval tools that happen to return a `results` array don't
46
+ * pollute the metric.
49
47
  */
50
- export function extractResultCount(tool, mcpResult) {
51
- if (!tool.includes("search"))
52
- return undefined;
53
- const fromStructured = mcpResult.structuredContent?.["results"];
54
- if (Array.isArray(fromStructured))
55
- return fromStructured.length;
56
- try {
57
- const text = mcpResult.content[0]?.text;
58
- if (!text)
48
+ const RETRIEVAL_TOOLS = new Set([
49
+ "rift_search",
50
+ "rift_conversations_search",
51
+ "rift_context_pack",
52
+ ]);
53
+ /**
54
+ * Per-tool extractor for `(result_count, degraded)` derived from the MCP
55
+ * response. Search tools expose `results: []`; context_pack exposes four
56
+ * named buckets we sum. Anything else returns `undefined` for both.
57
+ */
58
+ function extractRetrievalSignal(tool, mcpResult) {
59
+ if (!RETRIEVAL_TOOLS.has(tool))
60
+ return {};
61
+ const sc = mcpResult.structuredContent;
62
+ const parseText = () => {
63
+ try {
64
+ const text = mcpResult.content[0]?.text;
65
+ if (!text)
66
+ return undefined;
67
+ const parsed = JSON.parse(text);
68
+ return typeof parsed === "object" && parsed !== null
69
+ ? parsed
70
+ : undefined;
71
+ }
72
+ catch {
59
73
  return undefined;
60
- const parsed = JSON.parse(text);
61
- if (Array.isArray(parsed.results))
62
- return parsed.results.length;
74
+ }
75
+ };
76
+ if (tool === "rift_context_pack") {
77
+ // context_pack always writes structuredContent (see tools/context-pack.ts).
78
+ // Skip the text-channel fallback — the text is human-readable markdown,
79
+ // not JSON, so attempting to parse it would always fail.
80
+ if (!sc)
81
+ return {};
82
+ const sum = (key) => {
83
+ const v = sc[key];
84
+ return Array.isArray(v) ? v.length : 0;
85
+ };
86
+ const count = sum("decisions") + sum("constraints") + sum("examples") + sum("rules");
87
+ const out = { count };
88
+ if (typeof sc["degraded"] === "boolean")
89
+ out.degraded = sc["degraded"];
90
+ return out;
63
91
  }
64
- catch {
65
- // not parseable fine
92
+ // Search tools: prefer structuredContent, fall back to JSON-on-text for
93
+ // backwards compatibility with the pre-Slice-1 response shape.
94
+ const fromStructured = sc?.["results"];
95
+ if (Array.isArray(fromStructured)) {
96
+ const out = {
97
+ count: fromStructured.length,
98
+ };
99
+ if (typeof sc?.["degraded"] === "boolean")
100
+ out.degraded = sc["degraded"];
101
+ return out;
66
102
  }
67
- return undefined;
103
+ const parsed = parseText();
104
+ if (!parsed)
105
+ return {};
106
+ const out = {};
107
+ if (Array.isArray(parsed.results))
108
+ out.count = parsed.results.length;
109
+ if (typeof parsed.degraded === "boolean")
110
+ out.degraded = parsed.degraded;
111
+ return out;
68
112
  }
69
113
  /**
70
- * Try to extract degraded flag from search-tool responses.
114
+ * Try to extract `result_count` from a retrieval-tool response. For search
115
+ * tools this is `results.length`; for `rift_context_pack` it is the sum of
116
+ * all four bucket sizes (decisions + constraints + examples + rules).
117
+ * Returns `undefined` for non-retrieval tools.
118
+ */
119
+ export function extractResultCount(tool, mcpResult) {
120
+ return extractRetrievalSignal(tool, mcpResult).count;
121
+ }
122
+ /**
123
+ * Try to extract the `degraded` flag from a retrieval-tool response.
124
+ * Returns `undefined` for non-retrieval tools and for retrieval tools whose
125
+ * response did not carry the flag.
71
126
  */
72
127
  export function extractDegraded(tool, mcpResult) {
73
- if (!tool.includes("search"))
128
+ return extractRetrievalSignal(tool, mcpResult).degraded;
129
+ }
130
+ // --- rift_search metadata extraction ---
131
+ /**
132
+ * Derive search-mode metadata from the raw rift_search args. Mirrors the
133
+ * direct-lookup gate on `/search`: `id` + (`middle` | `full`) → exact_id;
134
+ * anything else is ranked retrieval, even if `id` is present alongside
135
+ * `detail="summary"` (which doesn't trigger the strict path).
136
+ */
137
+ export function deriveSearchModeMeta(args) {
138
+ const detail = (args["detail"] === "middle" || args["detail"] === "full"
139
+ ? args["detail"]
140
+ : "summary");
141
+ const id_present = typeof args["id"] === "string" && args["id"].length > 0;
142
+ const tier_present = typeof args["tier"] === "string" && args["tier"].length > 0;
143
+ const source_table_present = typeof args["source_table"] === "string" &&
144
+ args["source_table"].length > 0;
145
+ const search_mode = id_present && (detail === "middle" || detail === "full")
146
+ ? "exact_id"
147
+ : "ranked";
148
+ return {
149
+ search_mode,
150
+ detail,
151
+ id_present,
152
+ tier_present,
153
+ source_table_present,
154
+ };
155
+ }
156
+ /**
157
+ * Derive result-side metadata for a successful rift_search call:
158
+ * - has_truncated_content: any returned hit with content_truncated=true
159
+ * - max_content_tokens_estimate: max content_tokens_estimate across hits
160
+ *
161
+ * Reads from `structuredContent.results` (the canonical compact DTO).
162
+ * Returns `{}` when the result shape is unknown — never throws.
163
+ */
164
+ export function extractSearchResultMeta(mcpResult) {
165
+ const results = mcpResult.structuredContent?.["results"];
166
+ if (!Array.isArray(results))
167
+ return {};
168
+ let truncated = false;
169
+ let maxTokens;
170
+ for (const r of results) {
171
+ if (!r || typeof r !== "object")
172
+ continue;
173
+ const hit = r;
174
+ if (hit["content_truncated"] === true)
175
+ truncated = true;
176
+ const tokens = hit["content_tokens_estimate"];
177
+ if (typeof tokens === "number" && (maxTokens === undefined || tokens > maxTokens)) {
178
+ maxTokens = tokens;
179
+ }
180
+ }
181
+ const out = {};
182
+ if (truncated)
183
+ out.has_truncated_content = true;
184
+ if (maxTokens !== undefined)
185
+ out.max_content_tokens_estimate = maxTokens;
186
+ return out;
187
+ }
188
+ /**
189
+ * Try to parse the typed error code (`id_not_found`, `ambiguous_id`, …)
190
+ * out of a failure response's text channel. `formatError` formats typed
191
+ * 404/409 bodies as `"<Prefix>: { "error": "id_not_found", … }"`, so we
192
+ * locate the first `{`, JSON.parse to end, and return the `error` field
193
+ * when it's a string. Returns `undefined` for transport-only failures
194
+ * (no body), untyped responses, or unparseable text.
195
+ */
196
+ export function parseTypedError(text) {
197
+ if (!text)
198
+ return undefined;
199
+ const braceIdx = text.indexOf("{");
200
+ if (braceIdx < 0)
74
201
  return undefined;
75
- const fromStructured = mcpResult.structuredContent?.["degraded"];
76
- if (typeof fromStructured === "boolean")
77
- return fromStructured;
202
+ const jsonPart = text.slice(braceIdx);
78
203
  try {
79
- const text = mcpResult.content[0]?.text;
80
- if (!text)
81
- return undefined;
82
- const parsed = JSON.parse(text);
83
- if (typeof parsed.degraded === "boolean")
84
- return parsed.degraded;
204
+ const parsed = JSON.parse(jsonPart);
205
+ const err = parsed["error"];
206
+ if (typeof err === "string" && err.length > 0)
207
+ return err;
85
208
  }
86
209
  catch {
87
- // not parseable — fine
210
+ // not a parseable JSON tail likely a plain transport message
88
211
  }
89
212
  return undefined;
90
213
  }
@@ -131,6 +254,38 @@ export class ToolUsageLogger {
131
254
  const deg = extractDegraded(tool, result);
132
255
  if (deg !== undefined)
133
256
  entry.degraded = deg;
257
+ if (!result.isError) {
258
+ let textBytes = 0;
259
+ for (const part of result.content ?? []) {
260
+ if (typeof part?.text === "string") {
261
+ textBytes += Buffer.byteLength(part.text, "utf8");
262
+ }
263
+ }
264
+ entry.response_text_bytes = textBytes;
265
+ }
266
+ if (tool === "rift_search") {
267
+ const meta = deriveSearchModeMeta(args);
268
+ entry.search_mode = meta.search_mode;
269
+ entry.detail = meta.detail;
270
+ entry.id_present = meta.id_present;
271
+ entry.tier_present = meta.tier_present;
272
+ entry.source_table_present = meta.source_table_present;
273
+ if (result.isError) {
274
+ const typed = parseTypedError(result.content[0]?.text);
275
+ if (typed)
276
+ entry.typed_error = typed;
277
+ }
278
+ else {
279
+ const resultMeta = extractSearchResultMeta(result);
280
+ if (resultMeta.has_truncated_content !== undefined) {
281
+ entry.has_truncated_content = resultMeta.has_truncated_content;
282
+ }
283
+ if (resultMeta.max_content_tokens_estimate !== undefined) {
284
+ entry.max_content_tokens_estimate =
285
+ resultMeta.max_content_tokens_estimate;
286
+ }
287
+ }
288
+ }
134
289
  this.log(entry);
135
290
  return result;
136
291
  }, (err) => {
@@ -144,6 +299,14 @@ export class ToolUsageLogger {
144
299
  success: false,
145
300
  error: err instanceof Error ? err.message : String(err),
146
301
  };
302
+ if (tool === "rift_search") {
303
+ const meta = deriveSearchModeMeta(args);
304
+ entry.search_mode = meta.search_mode;
305
+ entry.detail = meta.detail;
306
+ entry.id_present = meta.id_present;
307
+ entry.tier_present = meta.tier_present;
308
+ entry.source_table_present = meta.source_table_present;
309
+ }
147
310
  this.log(entry);
148
311
  throw err;
149
312
  });
@@ -1 +1 @@
1
- {"version":3,"file":"tool-usage.js","sourceRoot":"","sources":["../../../src/observability/tool-usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-usage.js","sourceRoot":"","sources":["../../../src/observability/tool-usage.ts"],"names":[],"mappings":"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"}