ragscope 0.1.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 (103) hide show
  1. package/LICENSE +183 -0
  2. package/README.md +135 -0
  3. package/dist/bin/ragscope.d.ts +3 -0
  4. package/dist/bin/ragscope.d.ts.map +1 -0
  5. package/dist/bin/ragscope.js +135 -0
  6. package/dist/bin/ragscope.js.map +1 -0
  7. package/dist/src/app.d.ts +5 -0
  8. package/dist/src/app.d.ts.map +1 -0
  9. package/dist/src/app.js +88 -0
  10. package/dist/src/app.js.map +1 -0
  11. package/dist/src/app.test.d.ts +2 -0
  12. package/dist/src/app.test.d.ts.map +1 -0
  13. package/dist/src/app.test.js +59 -0
  14. package/dist/src/app.test.js.map +1 -0
  15. package/dist/src/audit/scorer.d.ts +17 -0
  16. package/dist/src/audit/scorer.d.ts.map +1 -0
  17. package/dist/src/audit/scorer.js +85 -0
  18. package/dist/src/audit/scorer.js.map +1 -0
  19. package/dist/src/audit/scorer.test.d.ts +2 -0
  20. package/dist/src/audit/scorer.test.d.ts.map +1 -0
  21. package/dist/src/audit/scorer.test.js +101 -0
  22. package/dist/src/audit/scorer.test.js.map +1 -0
  23. package/dist/src/db/index.d.ts +731 -0
  24. package/dist/src/db/index.d.ts.map +1 -0
  25. package/dist/src/db/index.js +59 -0
  26. package/dist/src/db/index.js.map +1 -0
  27. package/dist/src/db/queries.d.ts +12 -0
  28. package/dist/src/db/queries.d.ts.map +1 -0
  29. package/dist/src/db/queries.js +35 -0
  30. package/dist/src/db/queries.js.map +1 -0
  31. package/dist/src/db/queries.test.d.ts +2 -0
  32. package/dist/src/db/queries.test.d.ts.map +1 -0
  33. package/dist/src/db/queries.test.js +101 -0
  34. package/dist/src/db/queries.test.js.map +1 -0
  35. package/dist/src/db/schema.d.ts +725 -0
  36. package/dist/src/db/schema.d.ts.map +1 -0
  37. package/dist/src/db/schema.js +47 -0
  38. package/dist/src/db/schema.js.map +1 -0
  39. package/dist/src/enrichment/boundaries.d.ts +4 -0
  40. package/dist/src/enrichment/boundaries.d.ts.map +1 -0
  41. package/dist/src/enrichment/boundaries.js +19 -0
  42. package/dist/src/enrichment/boundaries.js.map +1 -0
  43. package/dist/src/enrichment/boundaries.test.d.ts +2 -0
  44. package/dist/src/enrichment/boundaries.test.d.ts.map +1 -0
  45. package/dist/src/enrichment/boundaries.test.js +69 -0
  46. package/dist/src/enrichment/boundaries.test.js.map +1 -0
  47. package/dist/src/enrichment/embeddings.d.ts +3 -0
  48. package/dist/src/enrichment/embeddings.d.ts.map +1 -0
  49. package/dist/src/enrichment/embeddings.js +37 -0
  50. package/dist/src/enrichment/embeddings.js.map +1 -0
  51. package/dist/src/enrichment/normalizer.d.ts +10 -0
  52. package/dist/src/enrichment/normalizer.d.ts.map +1 -0
  53. package/dist/src/enrichment/normalizer.js +42 -0
  54. package/dist/src/enrichment/normalizer.js.map +1 -0
  55. package/dist/src/enrichment/normalizer.test.d.ts +2 -0
  56. package/dist/src/enrichment/normalizer.test.d.ts.map +1 -0
  57. package/dist/src/enrichment/normalizer.test.js +47 -0
  58. package/dist/src/enrichment/normalizer.test.js.map +1 -0
  59. package/dist/src/enrichment/pipeline.d.ts +4 -0
  60. package/dist/src/enrichment/pipeline.d.ts.map +1 -0
  61. package/dist/src/enrichment/pipeline.js +93 -0
  62. package/dist/src/enrichment/pipeline.js.map +1 -0
  63. package/dist/src/enrichment/pipeline.test.d.ts +2 -0
  64. package/dist/src/enrichment/pipeline.test.d.ts.map +1 -0
  65. package/dist/src/enrichment/pipeline.test.js +133 -0
  66. package/dist/src/enrichment/pipeline.test.js.map +1 -0
  67. package/dist/src/enrichment/reranker.d.ts +20 -0
  68. package/dist/src/enrichment/reranker.d.ts.map +1 -0
  69. package/dist/src/enrichment/reranker.js +45 -0
  70. package/dist/src/enrichment/reranker.js.map +1 -0
  71. package/dist/src/enrichment/reranker.test.d.ts +2 -0
  72. package/dist/src/enrichment/reranker.test.d.ts.map +1 -0
  73. package/dist/src/enrichment/reranker.test.js +82 -0
  74. package/dist/src/enrichment/reranker.test.js.map +1 -0
  75. package/dist/src/enrichment/tokenizer.d.ts +2 -0
  76. package/dist/src/enrichment/tokenizer.d.ts.map +1 -0
  77. package/dist/src/enrichment/tokenizer.js +40 -0
  78. package/dist/src/enrichment/tokenizer.js.map +1 -0
  79. package/dist/src/enrichment/tokenizer.test.d.ts +2 -0
  80. package/dist/src/enrichment/tokenizer.test.d.ts.map +1 -0
  81. package/dist/src/enrichment/tokenizer.test.js +36 -0
  82. package/dist/src/enrichment/tokenizer.test.js.map +1 -0
  83. package/dist/src/index.d.ts +3 -0
  84. package/dist/src/index.d.ts.map +1 -0
  85. package/dist/src/index.js +3 -0
  86. package/dist/src/index.js.map +1 -0
  87. package/dist/src/ingestion/langfuse.d.ts +17 -0
  88. package/dist/src/ingestion/langfuse.d.ts.map +1 -0
  89. package/dist/src/ingestion/langfuse.js +102 -0
  90. package/dist/src/ingestion/langfuse.js.map +1 -0
  91. package/dist/src/ingestion/otlp-parser.d.ts +3 -0
  92. package/dist/src/ingestion/otlp-parser.d.ts.map +1 -0
  93. package/dist/src/ingestion/otlp-parser.js +122 -0
  94. package/dist/src/ingestion/otlp-parser.js.map +1 -0
  95. package/dist/src/ingestion/otlp-parser.test.d.ts +2 -0
  96. package/dist/src/ingestion/otlp-parser.test.d.ts.map +1 -0
  97. package/dist/src/ingestion/otlp-parser.test.js +194 -0
  98. package/dist/src/ingestion/otlp-parser.test.js.map +1 -0
  99. package/dist/src/types.d.ts +114 -0
  100. package/dist/src/types.d.ts.map +1 -0
  101. package/dist/src/types.js +3 -0
  102. package/dist/src/types.js.map +1 -0
  103. package/package.json +78 -0
@@ -0,0 +1,20 @@
1
+ import type { ParsedSpan, RagChunk } from '../types.js';
2
+ export interface RerankerDiff {
3
+ chunkId: string;
4
+ rankRetrieval: number;
5
+ rankReranked: number;
6
+ rankDelta: number;
7
+ scoreRaw: number | null;
8
+ scoreReranked: number | null;
9
+ scoreDelta: number | null;
10
+ }
11
+ /**
12
+ * Matches RETRIEVER chunks against RERANKER span output documents.
13
+ * Sets rankReranked on each chunk that appears in the reranker output.
14
+ * Returns the set of diff records for the response.
15
+ */
16
+ export declare function applyRerankerResults(chunks: RagChunk[], rerankerSpans: ParsedSpan[]): {
17
+ chunks: RagChunk[];
18
+ diffs: RerankerDiff[];
19
+ };
20
+ //# sourceMappingURL=reranker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reranker.d.ts","sourceRoot":"","sources":["../../../src/enrichment/reranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEvD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,QAAQ,EAAE,EAClB,aAAa,EAAE,UAAU,EAAE,GAC1B;IAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,CAwC/C"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Matches RETRIEVER chunks against RERANKER span output documents.
3
+ * Sets rankReranked on each chunk that appears in the reranker output.
4
+ * Returns the set of diff records for the response.
5
+ */
6
+ export function applyRerankerResults(chunks, rerankerSpans) {
7
+ if (rerankerSpans.length === 0)
8
+ return { chunks, diffs: [] };
9
+ // Use the first RERANKER span — pipelines rarely have more than one
10
+ const span = rerankerSpans[0];
11
+ if (!span.documents || span.documents.length === 0)
12
+ return { chunks, diffs: [] };
13
+ // Build a map: chunkId → reranked position (1-based)
14
+ const rerankedRank = new Map();
15
+ const rerankedScore = new Map();
16
+ span.documents.forEach((doc, i) => {
17
+ rerankedRank.set(doc.id, i + 1);
18
+ rerankedScore.set(doc.id, doc.score);
19
+ });
20
+ const updatedChunks = chunks.map(chunk => {
21
+ const newRank = rerankedRank.get(chunk.chunkId);
22
+ if (newRank == null)
23
+ return chunk;
24
+ const newScore = rerankedScore.get(chunk.chunkId) ?? null;
25
+ return { ...chunk, rankReranked: newRank, scoreReranked: newScore };
26
+ });
27
+ const diffs = chunks
28
+ .filter(c => rerankedRank.has(c.chunkId) && c.rankRetrieval != null)
29
+ .map(c => {
30
+ const rr = rerankedRank.get(c.chunkId);
31
+ const sr = rerankedScore.get(c.chunkId) ?? null;
32
+ return {
33
+ chunkId: c.chunkId,
34
+ rankRetrieval: c.rankRetrieval,
35
+ rankReranked: rr,
36
+ rankDelta: c.rankRetrieval - rr, // positive = moved up in ranking
37
+ scoreRaw: c.scoreRaw,
38
+ scoreReranked: sr,
39
+ scoreDelta: sr != null && c.scoreRaw != null ? sr - c.scoreRaw : null,
40
+ };
41
+ })
42
+ .sort((a, b) => a.rankReranked - b.rankReranked);
43
+ return { chunks: updatedChunks, diffs };
44
+ }
45
+ //# sourceMappingURL=reranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reranker.js","sourceRoot":"","sources":["../../../src/enrichment/reranker.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAkB,EAClB,aAA2B;IAE3B,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IAE5D,oEAAoE;IACpE,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;IAC7B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IAEhF,qDAAqD;IACrD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC9C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC/C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAChC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/B,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACvC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC/C,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,KAAK,CAAA;QACjC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;QACzD,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,MAAM,KAAK,GAAmB,MAAM;SACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC;SACnE,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAE,CAAA;QACvC,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;QAC/C,OAAO;YACL,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,aAAa,EAAE,CAAC,CAAC,aAAc;YAC/B,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE,CAAC,CAAC,aAAc,GAAG,EAAE,EAAI,iCAAiC;YACrE,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,aAAa,EAAE,EAAE;YACjB,UAAU,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;SACtE,CAAA;IACH,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAA;IAElD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA;AACzC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reranker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reranker.test.d.ts","sourceRoot":"","sources":["../../../src/enrichment/reranker.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { applyRerankerResults } from './reranker.js';
3
+ function makeChunk(chunkId, rank, score = 0.9) {
4
+ return {
5
+ id: `id-${chunkId}`, spanId: 's1', traceId: 't1', chunkId,
6
+ content: `content of ${chunkId}`, scoreRaw: score, scoreNormalized: score,
7
+ rankRetrieval: rank, rankReranked: null, scoreReranked: null, tokenCount: 5,
8
+ vectorStore: null, inContext: false, contextPosition: null,
9
+ overlapWithNext: 0, scoreMissing: false,
10
+ };
11
+ }
12
+ function makeRerankerSpan(docs) {
13
+ return {
14
+ traceId: 't1', spanId: 'reranker-span', name: 'cohere.rerank',
15
+ kind: 'RERANKER', startTimeMs: 200, endTimeMs: 350, latencyMs: 150,
16
+ rawAttributes: '[]', documents: docs,
17
+ };
18
+ }
19
+ describe('applyRerankerResults', () => {
20
+ const chunks = [
21
+ makeChunk('doc-a', 1, 0.80),
22
+ makeChunk('doc-b', 2, 0.75),
23
+ makeChunk('doc-c', 3, 0.60),
24
+ ];
25
+ it('returns unchanged chunks when no reranker spans', () => {
26
+ const { chunks: out, diffs } = applyRerankerResults(chunks, []);
27
+ expect(out).toEqual(chunks);
28
+ expect(diffs).toHaveLength(0);
29
+ });
30
+ it('sets rankReranked on matching chunks', () => {
31
+ const span = makeRerankerSpan([
32
+ { id: 'doc-c', score: 0.95 },
33
+ { id: 'doc-a', score: 0.88 },
34
+ { id: 'doc-b', score: 0.72 },
35
+ ]);
36
+ const { chunks: out } = applyRerankerResults(chunks, [span]);
37
+ expect(out.find(c => c.chunkId === 'doc-c').rankReranked).toBe(1);
38
+ expect(out.find(c => c.chunkId === 'doc-a').rankReranked).toBe(2);
39
+ expect(out.find(c => c.chunkId === 'doc-b').rankReranked).toBe(3);
40
+ });
41
+ it('computes positive rankDelta for chunks that moved up', () => {
42
+ const span = makeRerankerSpan([
43
+ { id: 'doc-c', score: 0.95 }, // was rank 3, now rank 1 → delta = +2
44
+ { id: 'doc-a', score: 0.88 },
45
+ { id: 'doc-b', score: 0.72 },
46
+ ]);
47
+ const { diffs } = applyRerankerResults(chunks, [span]);
48
+ const diffC = diffs.find(d => d.chunkId === 'doc-c');
49
+ expect(diffC.rankDelta).toBe(2); // moved up 2 positions
50
+ });
51
+ it('computes negative rankDelta for chunks that moved down', () => {
52
+ const span = makeRerankerSpan([
53
+ { id: 'doc-c', score: 0.95 },
54
+ { id: 'doc-a', score: 0.88 },
55
+ { id: 'doc-b', score: 0.72 },
56
+ ]);
57
+ const { diffs } = applyRerankerResults(chunks, [span]);
58
+ const diffA = diffs.find(d => d.chunkId === 'doc-a');
59
+ expect(diffA.rankDelta).toBe(-1); // was rank 1, now rank 2
60
+ });
61
+ it('includes scoreDelta in diffs', () => {
62
+ const span = makeRerankerSpan([{ id: 'doc-a', score: 0.95 }]);
63
+ const { diffs } = applyRerankerResults(chunks, [span]);
64
+ const diff = diffs.find(d => d.chunkId === 'doc-a');
65
+ expect(diff.scoreDelta).toBeCloseTo(0.95 - 0.80);
66
+ });
67
+ it('leaves rankReranked null for chunks not in reranker output', () => {
68
+ const span = makeRerankerSpan([{ id: 'doc-a', score: 0.9 }]);
69
+ const { chunks: out } = applyRerankerResults(chunks, [span]);
70
+ expect(out.find(c => c.chunkId === 'doc-b').rankReranked).toBeNull();
71
+ });
72
+ it('returns diffs sorted by rankReranked', () => {
73
+ const span = makeRerankerSpan([
74
+ { id: 'doc-c', score: 0.95 },
75
+ { id: 'doc-b', score: 0.88 },
76
+ { id: 'doc-a', score: 0.72 },
77
+ ]);
78
+ const { diffs } = applyRerankerResults(chunks, [span]);
79
+ expect(diffs.map(d => d.rankReranked)).toEqual([1, 2, 3]);
80
+ });
81
+ });
82
+ //# sourceMappingURL=reranker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reranker.test.js","sourceRoot":"","sources":["../../../src/enrichment/reranker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function countTokens(text: string, model?: string): number;
2
+ //# sourceMappingURL=tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../../src/enrichment/tokenizer.ts"],"names":[],"mappings":"AAuCA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAIhE"}
@@ -0,0 +1,40 @@
1
+ import { models, Tokenizer } from 'ai-tokenizer';
2
+ // @ts-ignore — CJS default export from encoding subpath
3
+ import * as encodings from 'ai-tokenizer/encoding';
4
+ // Cache tokenizer instances by encoding name
5
+ const tokenizerCache = new Map();
6
+ function getTokenizer(encodingName) {
7
+ if (!tokenizerCache.has(encodingName)) {
8
+ const enc = encodings[encodingName];
9
+ if (!enc)
10
+ throw new Error(`Unknown encoding: ${encodingName}`);
11
+ tokenizerCache.set(encodingName, new Tokenizer(enc));
12
+ }
13
+ return tokenizerCache.get(encodingName);
14
+ }
15
+ function resolveEncoding(model) {
16
+ if (!model)
17
+ return 'cl100k_base';
18
+ // Try exact match
19
+ if (model in models) {
20
+ return models[model].encoding;
21
+ }
22
+ // Try prefix match (e.g. "gpt-4o" → "openai/gpt-4o")
23
+ for (const [key, val] of Object.entries(models)) {
24
+ if (key.endsWith(`/${model}`) || key === model) {
25
+ return val.encoding;
26
+ }
27
+ }
28
+ // Heuristics
29
+ if (model.startsWith('claude'))
30
+ return 'claude';
31
+ if (model.includes('gpt-4o') || model.includes('o1') || model.includes('o3'))
32
+ return 'o200k_base';
33
+ return 'cl100k_base';
34
+ }
35
+ export function countTokens(text, model) {
36
+ const encodingName = resolveEncoding(model);
37
+ const tokenizer = getTokenizer(encodingName);
38
+ return tokenizer.encode(text).length;
39
+ }
40
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../../src/enrichment/tokenizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAChD,wDAAwD;AACxD,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAA;AAIlD,6CAA6C;AAC7C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAqB,CAAA;AAEnD,SAAS,YAAY,CAAC,YAAoB;IACxC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,GAAI,SAAqC,CAAC,YAAY,CAAC,CAAA;QAChE,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,EAAE,CAAC,CAAA;QAC9D,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,SAAS,CAAC,GAAiD,CAAC,CAAC,CAAA;IACpG,CAAC;IACD,OAAO,cAAc,CAAC,GAAG,CAAC,YAAY,CAAE,CAAA;AAC1C,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,aAAa,CAAA;IAEhC,kBAAkB;IAClB,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACpB,OAAQ,MAA+C,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAA;IACzE,CAAC;IAED,qDAAqD;IACrD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAC/C,OAAQ,GAA4B,CAAC,QAAQ,CAAA;QAC/C,CAAC;IACH,CAAC;IAED,aAAa;IACb,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAA;IAC/C,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAA;IACjG,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAc;IACtD,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,CAAA;IAC5C,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAA;AACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tokenizer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.test.d.ts","sourceRoot":"","sources":["../../../src/enrichment/tokenizer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { countTokens } from './tokenizer.js';
3
+ describe('countTokens', () => {
4
+ it('counts tokens for a simple string with default encoding', () => {
5
+ const count = countTokens('Hello world');
6
+ expect(count).toBeGreaterThan(0);
7
+ expect(count).toBeLessThan(10);
8
+ });
9
+ it('returns more tokens for longer text', () => {
10
+ const short = countTokens('Hi');
11
+ const long = countTokens('This is a much longer sentence with many words that should tokenize to more tokens');
12
+ expect(long).toBeGreaterThan(short);
13
+ });
14
+ it('counts tokens with a GPT-4o model hint', () => {
15
+ const count = countTokens('The capital of France is Paris.', 'openai/gpt-4o');
16
+ expect(count).toBeGreaterThan(0);
17
+ expect(count).toBeLessThanOrEqual(15);
18
+ });
19
+ it('counts tokens with a Claude model hint', () => {
20
+ const count = countTokens('The capital of France is Paris.', 'anthropic/claude-3.5-sonnet');
21
+ expect(count).toBeGreaterThan(0);
22
+ expect(count).toBeLessThanOrEqual(15);
23
+ });
24
+ it('handles empty string', () => {
25
+ expect(countTokens('')).toBe(0);
26
+ });
27
+ it('falls back gracefully for unknown model', () => {
28
+ const count = countTokens('Hello world', 'some-unknown-model-v99');
29
+ expect(count).toBeGreaterThan(0);
30
+ });
31
+ it('uses claude encoding for claude- prefix models', () => {
32
+ const count = countTokens('Hello world', 'claude-3-haiku');
33
+ expect(count).toBeGreaterThan(0);
34
+ });
35
+ });
36
+ //# sourceMappingURL=tokenizer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.test.js","sourceRoot":"","sources":["../../../src/enrichment/tokenizer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC,CAAA;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;QAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,oFAAoF,CAAC,CAAA;QAC9G,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,WAAW,CAAC,iCAAiC,EAAE,eAAe,CAAC,CAAA;QAC7E,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,WAAW,CAAC,iCAAiC,EAAE,6BAA6B,CAAC,CAAA;QAC3F,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAA;QAClE,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAA;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { createApp } from './app.js';
2
+ export { createDb } from './db/index.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { createApp } from './app.js';
2
+ export { createDb } from './db/index.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,17 @@
1
+ import type { Db } from '../db/index.js';
2
+ interface LangfuseConfig {
3
+ publicKey: string;
4
+ secretKey: string;
5
+ baseUrl?: string;
6
+ }
7
+ export declare class LangfusePoller {
8
+ private readonly config;
9
+ private lastPolledAt;
10
+ private timer;
11
+ constructor(config: LangfuseConfig);
12
+ start(db: Db, onTrace?: (traceId: string) => void): void;
13
+ stop(): void;
14
+ private poll;
15
+ }
16
+ export {};
17
+ //# sourceMappingURL=langfuse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langfuse.d.ts","sourceRoot":"","sources":["../../../src/ingestion/langfuse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAGxC,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAsFD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,KAAK,CAA8C;gBAE/C,MAAM,EAAE,cAAc;IAKlC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAKxD,IAAI,IAAI,IAAI;YAIE,IAAI;CAqCnB"}
@@ -0,0 +1,102 @@
1
+ import { ingestTrace } from '../enrichment/pipeline.js';
2
+ function inferKindFromObservation(obs) {
3
+ const name = (obs.name ?? '').toLowerCase();
4
+ if (obs.type === 'GENERATION')
5
+ return 'LLM';
6
+ if (name.includes('rerank'))
7
+ return 'RERANKER';
8
+ if (name.includes('embed'))
9
+ return 'EMBEDDING';
10
+ if (name.includes('retriev') || name.includes('search') || name.includes('query'))
11
+ return 'RETRIEVER';
12
+ if (name.includes('chain') || name.includes('pipeline'))
13
+ return 'CHAIN';
14
+ return 'SPAN';
15
+ }
16
+ function extractDocuments(obs) {
17
+ const output = obs.output;
18
+ if (!Array.isArray(output))
19
+ return undefined;
20
+ return output
21
+ .filter((d) => typeof d === 'object' && d !== null)
22
+ .map((d, i) => ({
23
+ id: String(d['id'] ?? d['document_id'] ?? i),
24
+ score: typeof d['score'] === 'number' ? d['score'] : 0,
25
+ content: typeof d['content'] === 'string' ? d['content'] : undefined,
26
+ }));
27
+ }
28
+ function parseIsoToMs(iso) {
29
+ return new Date(iso).getTime();
30
+ }
31
+ function observationToSpan(obs, traceId) {
32
+ const startMs = parseIsoToMs(obs.startTime);
33
+ const endMs = obs.endTime ? parseIsoToMs(obs.endTime) : startMs;
34
+ const docs = extractDocuments(obs);
35
+ const inputText = typeof obs.input === 'string' ? obs.input
36
+ : obs.input ? JSON.stringify(obs.input) : undefined;
37
+ return {
38
+ traceId,
39
+ spanId: obs.id,
40
+ parentSpanId: obs.parentObservationId ?? undefined,
41
+ name: obs.name ?? obs.type,
42
+ kind: inferKindFromObservation(obs),
43
+ startTimeMs: startMs,
44
+ endTimeMs: endMs,
45
+ latencyMs: endMs - startMs,
46
+ model: obs.model ?? undefined,
47
+ inputTokens: obs.usage?.input ?? undefined,
48
+ outputTokens: obs.usage?.output ?? undefined,
49
+ rawAttributes: '[]',
50
+ documents: docs,
51
+ prompt: inputText,
52
+ };
53
+ }
54
+ export class LangfusePoller {
55
+ config;
56
+ lastPolledAt;
57
+ timer = null;
58
+ constructor(config) {
59
+ this.config = config;
60
+ this.lastPolledAt = Date.now() - 5 * 60 * 1000; // look back 5 min on first poll
61
+ }
62
+ start(db, onTrace) {
63
+ this.poll(db, onTrace).catch(console.error);
64
+ this.timer = setInterval(() => this.poll(db, onTrace).catch(console.error), 30_000);
65
+ }
66
+ stop() {
67
+ if (this.timer)
68
+ clearInterval(this.timer);
69
+ }
70
+ async poll(db, onTrace) {
71
+ const since = new Date(this.lastPolledAt).toISOString();
72
+ const pollStart = Date.now();
73
+ const baseUrl = this.config.baseUrl ?? 'https://cloud.langfuse.com';
74
+ const auth = Buffer.from(`${this.config.publicKey}:${this.config.secretKey}`).toString('base64');
75
+ const url = `${baseUrl}/api/public/traces?fromTimestamp=${encodeURIComponent(since)}&limit=50&page=1`;
76
+ const res = await fetch(url, {
77
+ headers: { Authorization: `Basic ${auth}`, 'Content-Type': 'application/json' },
78
+ });
79
+ if (!res.ok) {
80
+ console.error(`[LangfusePoller] fetch failed: ${res.status} ${res.statusText}`);
81
+ return;
82
+ }
83
+ const page = await res.json();
84
+ this.lastPolledAt = pollStart;
85
+ for (const trace of page.data) {
86
+ if (!trace.observations?.length)
87
+ continue;
88
+ const spans = trace.observations.map(obs => observationToSpan(obs, trace.id));
89
+ const parsed = {
90
+ traceId: trace.id,
91
+ serviceName: trace.metadata?.['service.name'] ?? 'langfuse',
92
+ spans,
93
+ };
94
+ await ingestTrace(db, parsed, 'langfuse');
95
+ onTrace?.(parsed.traceId);
96
+ }
97
+ if (page.data.length > 0) {
98
+ console.log(`[LangfusePoller] ingested ${page.data.length} traces`);
99
+ }
100
+ }
101
+ }
102
+ //# sourceMappingURL=langfuse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langfuse.js","sourceRoot":"","sources":["../../../src/ingestion/langfuse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { OtlpPayload, ParsedTrace } from '../types.js';
2
+ export declare function parseOtlpPayload(payload: OtlpPayload): ParsedTrace[];
3
+ //# sourceMappingURL=otlp-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-parser.d.ts","sourceRoot":"","sources":["../../../src/ingestion/otlp-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EAIX,WAAW,EAGZ,MAAM,aAAa,CAAA;AA0EpB,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,EAAE,CA+CpE"}
@@ -0,0 +1,122 @@
1
+ function attrValue(v) {
2
+ if (v.stringValue !== undefined)
3
+ return v.stringValue;
4
+ if (v.intValue !== undefined)
5
+ return parseInt(v.intValue, 10);
6
+ if (v.doubleValue !== undefined)
7
+ return v.doubleValue;
8
+ if (v.boolValue !== undefined)
9
+ return v.boolValue;
10
+ return null;
11
+ }
12
+ function attrsToMap(attrs = []) {
13
+ const map = {};
14
+ for (const a of attrs)
15
+ map[a.key] = attrValue(a.value);
16
+ return map;
17
+ }
18
+ function nanoToMs(nano) {
19
+ return Number(BigInt(nano) / 1000000n);
20
+ }
21
+ function inferKind(spanName, attrs) {
22
+ const op = attrs['gen_ai.operation.name']?.toLowerCase() ?? '';
23
+ const name = spanName.toLowerCase();
24
+ if (op === 'rerank' || name.includes('rerank'))
25
+ return 'RERANKER';
26
+ if (op === 'embeddings' || op === 'embed' || name.includes('embed'))
27
+ return 'EMBEDDING';
28
+ if (op === 'retrieve' || op === 'retrieval' || name.includes('retriev'))
29
+ return 'RETRIEVER';
30
+ if (op === 'chat' || op === 'completion' || op === 'text_generation' || name.includes('llm') || name.includes('chat'))
31
+ return 'LLM';
32
+ if (name.includes('chain') || name.includes('pipeline') || name.includes('graph'))
33
+ return 'CHAIN';
34
+ return 'SPAN';
35
+ }
36
+ function parseDocuments(attrs, rawAttrs) {
37
+ // gen_ai.retrieval.documents is encoded as a JSON string in a string attribute
38
+ const raw = attrs['gen_ai.retrieval.documents'];
39
+ if (raw) {
40
+ try {
41
+ const parsed = JSON.parse(raw);
42
+ if (Array.isArray(parsed)) {
43
+ return parsed.map((d, i) => ({
44
+ id: d.id ?? String(i),
45
+ score: d.score ?? 0,
46
+ content: d.content,
47
+ }));
48
+ }
49
+ }
50
+ catch {
51
+ // fall through to array-based parsing
52
+ }
53
+ }
54
+ // Also look for indexed attributes like gen_ai.retrieval.documents.0.id
55
+ const docs = new Map();
56
+ for (const attr of rawAttrs) {
57
+ const m = attr.key.match(/^gen_ai\.retrieval\.documents\.(\d+)\.(id|score|content)$/);
58
+ if (!m)
59
+ continue;
60
+ const idx = parseInt(m[1], 10);
61
+ const field = m[2];
62
+ if (!docs.has(idx))
63
+ docs.set(idx, {});
64
+ const doc = docs.get(idx);
65
+ const val = attrValue(attr.value);
66
+ if (field === 'id')
67
+ doc.id = String(val ?? idx);
68
+ if (field === 'score')
69
+ doc.score = typeof val === 'number' ? val : 0;
70
+ if (field === 'content')
71
+ doc.content = String(val ?? '');
72
+ }
73
+ if (docs.size > 0) {
74
+ return Array.from(docs.entries())
75
+ .sort(([a], [b]) => a - b)
76
+ .map(([i, d]) => ({ id: d.id ?? String(i), score: d.score ?? 0, content: d.content }));
77
+ }
78
+ return [];
79
+ }
80
+ export function parseOtlpPayload(payload) {
81
+ const traces = [];
82
+ for (const rs of payload.resourceSpans ?? []) {
83
+ const resourceAttrs = attrsToMap(rs.resource?.attributes ?? []);
84
+ const serviceName = resourceAttrs['service.name'] ?? 'unknown';
85
+ const traceSpans = new Map();
86
+ for (const ss of rs.scopeSpans ?? []) {
87
+ for (const span of ss.spans ?? []) {
88
+ const attrs = attrsToMap(span.attributes ?? []);
89
+ const startTimeMs = nanoToMs(span.startTimeUnixNano);
90
+ const endTimeMs = nanoToMs(span.endTimeUnixNano);
91
+ const documents = parseDocuments(attrs, span.attributes ?? []);
92
+ const prompt = (attrs['ai.prompt'] ?? attrs['gen_ai.prompt']);
93
+ const parsed = {
94
+ traceId: span.traceId,
95
+ spanId: span.spanId,
96
+ parentSpanId: span.parentSpanId,
97
+ name: span.name,
98
+ kind: inferKind(span.name, attrs),
99
+ startTimeMs,
100
+ endTimeMs,
101
+ latencyMs: endTimeMs - startTimeMs,
102
+ operationName: attrs['gen_ai.operation.name'],
103
+ model: attrs['gen_ai.request.model'] ?? attrs['gen_ai.response.model'],
104
+ system: attrs['gen_ai.system'],
105
+ inputTokens: attrs['gen_ai.usage.input_tokens'],
106
+ outputTokens: attrs['gen_ai.usage.output_tokens'],
107
+ rawAttributes: JSON.stringify(span.attributes ?? []),
108
+ documents: documents.length > 0 ? documents : undefined,
109
+ prompt: typeof prompt === 'string' ? prompt : undefined,
110
+ };
111
+ if (!traceSpans.has(span.traceId))
112
+ traceSpans.set(span.traceId, []);
113
+ traceSpans.get(span.traceId).push(parsed);
114
+ }
115
+ }
116
+ for (const [traceId, spanList] of traceSpans) {
117
+ traces.push({ traceId, serviceName, spans: spanList });
118
+ }
119
+ }
120
+ return traces;
121
+ }
122
+ //# sourceMappingURL=otlp-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-parser.js","sourceRoot":"","sources":["../../../src/ingestion/otlp-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=otlp-parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-parser.test.d.ts","sourceRoot":"","sources":["../../../src/ingestion/otlp-parser.test.ts"],"names":[],"mappings":""}