@agentlensai/server 0.3.0 → 0.6.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.
- package/dist/db/embedding-store.d.ts +74 -0
- package/dist/db/embedding-store.d.ts.map +1 -0
- package/dist/db/embedding-store.js +177 -0
- package/dist/db/embedding-store.js.map +1 -0
- package/dist/db/health-snapshot-store.d.ts +33 -0
- package/dist/db/health-snapshot-store.d.ts.map +1 -0
- package/dist/db/health-snapshot-store.js +112 -0
- package/dist/db/health-snapshot-store.js.map +1 -0
- package/dist/db/lesson-store.d.ts +57 -0
- package/dist/db/lesson-store.d.ts.map +1 -0
- package/dist/db/lesson-store.js +217 -0
- package/dist/db/lesson-store.js.map +1 -0
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +256 -8
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema.sqlite.d.ts +822 -47
- package/dist/db/schema.sqlite.d.ts.map +1 -1
- package/dist/db/schema.sqlite.js +79 -4
- package/dist/db/schema.sqlite.js.map +1 -1
- package/dist/db/session-summary-store.d.ts +45 -0
- package/dist/db/session-summary-store.d.ts.map +1 -0
- package/dist/db/session-summary-store.js +112 -0
- package/dist/db/session-summary-store.js.map +1 -0
- package/dist/db/sqlite-store.d.ts +19 -12
- package/dist/db/sqlite-store.d.ts.map +1 -1
- package/dist/db/sqlite-store.js +145 -44
- package/dist/db/sqlite-store.js.map +1 -1
- package/dist/db/tenant-scoped-store.d.ts +61 -0
- package/dist/db/tenant-scoped-store.d.ts.map +1 -0
- package/dist/db/tenant-scoped-store.js +94 -0
- package/dist/db/tenant-scoped-store.js.map +1 -0
- package/dist/index.d.ts +18 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +78 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/alert-engine.d.ts +11 -0
- package/dist/lib/alert-engine.d.ts.map +1 -1
- package/dist/lib/alert-engine.js +65 -24
- package/dist/lib/alert-engine.js.map +1 -1
- package/dist/lib/analysis/cost-analysis.d.ts +20 -0
- package/dist/lib/analysis/cost-analysis.d.ts.map +1 -0
- package/dist/lib/analysis/cost-analysis.js +161 -0
- package/dist/lib/analysis/cost-analysis.js.map +1 -0
- package/dist/lib/analysis/error-patterns.d.ts +26 -0
- package/dist/lib/analysis/error-patterns.d.ts.map +1 -0
- package/dist/lib/analysis/error-patterns.js +158 -0
- package/dist/lib/analysis/error-patterns.js.map +1 -0
- package/dist/lib/analysis/index.d.ts +23 -0
- package/dist/lib/analysis/index.d.ts.map +1 -0
- package/dist/lib/analysis/index.js +144 -0
- package/dist/lib/analysis/index.js.map +1 -0
- package/dist/lib/analysis/performance-trends.d.ts +19 -0
- package/dist/lib/analysis/performance-trends.d.ts.map +1 -0
- package/dist/lib/analysis/performance-trends.js +121 -0
- package/dist/lib/analysis/performance-trends.js.map +1 -0
- package/dist/lib/analysis/tool-sequences.d.ts +19 -0
- package/dist/lib/analysis/tool-sequences.d.ts.map +1 -0
- package/dist/lib/analysis/tool-sequences.js +148 -0
- package/dist/lib/analysis/tool-sequences.js.map +1 -0
- package/dist/lib/context/index.d.ts +5 -0
- package/dist/lib/context/index.d.ts.map +1 -0
- package/dist/lib/context/index.js +5 -0
- package/dist/lib/context/index.js.map +1 -0
- package/dist/lib/context/retrieval.d.ts +60 -0
- package/dist/lib/context/retrieval.d.ts.map +1 -0
- package/dist/lib/context/retrieval.js +233 -0
- package/dist/lib/context/retrieval.js.map +1 -0
- package/dist/lib/embeddings/index.d.ts +31 -0
- package/dist/lib/embeddings/index.d.ts.map +1 -0
- package/dist/lib/embeddings/index.js +31 -0
- package/dist/lib/embeddings/index.js.map +1 -0
- package/dist/lib/embeddings/local.d.ts +15 -0
- package/dist/lib/embeddings/local.d.ts.map +1 -0
- package/dist/lib/embeddings/local.js +65 -0
- package/dist/lib/embeddings/local.js.map +1 -0
- package/dist/lib/embeddings/math.d.ts +13 -0
- package/dist/lib/embeddings/math.d.ts.map +1 -0
- package/dist/lib/embeddings/math.js +35 -0
- package/dist/lib/embeddings/math.js.map +1 -0
- package/dist/lib/embeddings/openai.d.ts +15 -0
- package/dist/lib/embeddings/openai.d.ts.map +1 -0
- package/dist/lib/embeddings/openai.js +58 -0
- package/dist/lib/embeddings/openai.js.map +1 -0
- package/dist/lib/embeddings/summarizer.d.ts +26 -0
- package/dist/lib/embeddings/summarizer.d.ts.map +1 -0
- package/dist/lib/embeddings/summarizer.js +181 -0
- package/dist/lib/embeddings/summarizer.js.map +1 -0
- package/dist/lib/embeddings/types.d.ts +17 -0
- package/dist/lib/embeddings/types.d.ts.map +1 -0
- package/dist/lib/embeddings/types.js +5 -0
- package/dist/lib/embeddings/types.js.map +1 -0
- package/dist/lib/embeddings/worker.d.ts +56 -0
- package/dist/lib/embeddings/worker.d.ts.map +1 -0
- package/dist/lib/embeddings/worker.js +109 -0
- package/dist/lib/embeddings/worker.js.map +1 -0
- package/dist/lib/health/computer.d.ts +28 -0
- package/dist/lib/health/computer.d.ts.map +1 -0
- package/dist/lib/health/computer.js +270 -0
- package/dist/lib/health/computer.js.map +1 -0
- package/dist/lib/optimization/classifier.d.ts +34 -0
- package/dist/lib/optimization/classifier.d.ts.map +1 -0
- package/dist/lib/optimization/classifier.js +108 -0
- package/dist/lib/optimization/classifier.js.map +1 -0
- package/dist/lib/optimization/engine.d.ts +24 -0
- package/dist/lib/optimization/engine.d.ts.map +1 -0
- package/dist/lib/optimization/engine.js +202 -0
- package/dist/lib/optimization/engine.js.map +1 -0
- package/dist/lib/optimization/index.d.ts +10 -0
- package/dist/lib/optimization/index.d.ts.map +1 -0
- package/dist/lib/optimization/index.js +9 -0
- package/dist/lib/optimization/index.js.map +1 -0
- package/dist/lib/sse.d.ts +1 -0
- package/dist/lib/sse.d.ts.map +1 -1
- package/dist/lib/sse.js +8 -1
- package/dist/lib/sse.js.map +1 -1
- package/dist/middleware/auth.d.ts +1 -0
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +2 -1
- package/dist/middleware/auth.js.map +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +6 -3
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/alerts.d.ts.map +1 -1
- package/dist/routes/alerts.js +15 -7
- package/dist/routes/alerts.js.map +1 -1
- package/dist/routes/analytics.d.ts.map +1 -1
- package/dist/routes/analytics.js +16 -2
- package/dist/routes/analytics.js.map +1 -1
- package/dist/routes/api-keys.d.ts.map +1 -1
- package/dist/routes/api-keys.js +30 -5
- package/dist/routes/api-keys.js.map +1 -1
- package/dist/routes/context.d.ts +23 -0
- package/dist/routes/context.d.ts.map +1 -0
- package/dist/routes/context.js +52 -0
- package/dist/routes/context.js.map +1 -0
- package/dist/routes/events.d.ts +6 -1
- package/dist/routes/events.d.ts.map +1 -1
- package/dist/routes/events.js +61 -6
- package/dist/routes/events.js.map +1 -1
- package/dist/routes/health.d.ts +21 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +142 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/ingest.d.ts +6 -0
- package/dist/routes/ingest.d.ts.map +1 -1
- package/dist/routes/ingest.js +23 -4
- package/dist/routes/ingest.js.map +1 -1
- package/dist/routes/lessons.d.ts +19 -0
- package/dist/routes/lessons.d.ts.map +1 -0
- package/dist/routes/lessons.js +164 -0
- package/dist/routes/lessons.js.map +1 -0
- package/dist/routes/optimize.d.ts +15 -0
- package/dist/routes/optimize.d.ts.map +1 -0
- package/dist/routes/optimize.js +55 -0
- package/dist/routes/optimize.js.map +1 -0
- package/dist/routes/recall.d.ts +22 -0
- package/dist/routes/recall.d.ts.map +1 -0
- package/dist/routes/recall.js +91 -0
- package/dist/routes/recall.js.map +1 -0
- package/dist/routes/reflect.d.ts +15 -0
- package/dist/routes/reflect.d.ts.map +1 -0
- package/dist/routes/reflect.js +54 -0
- package/dist/routes/reflect.js.map +1 -0
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +8 -6
- package/dist/routes/sessions.js.map +1 -1
- package/dist/routes/stats.d.ts.map +1 -1
- package/dist/routes/stats.js +3 -1
- package/dist/routes/stats.js.map +1 -1
- package/dist/routes/stream.d.ts +9 -2
- package/dist/routes/stream.d.ts.map +1 -1
- package/dist/routes/stream.js +55 -2
- package/dist/routes/stream.js.map +1 -1
- package/dist/routes/tenant-helper.d.ts +20 -0
- package/dist/routes/tenant-helper.d.ts.map +1 -0
- package/dist/routes/tenant-helper.js +35 -0
- package/dist/routes/tenant-helper.js.map +1 -0
- package/package.json +11 -11
- package/LICENSE +0 -21
- package/dist/__tests__/agents-stats.test.d.ts +0 -5
- package/dist/__tests__/agents-stats.test.d.ts.map +0 -1
- package/dist/__tests__/agents-stats.test.js +0 -134
- package/dist/__tests__/agents-stats.test.js.map +0 -1
- package/dist/__tests__/alerts.test.d.ts +0 -5
- package/dist/__tests__/alerts.test.d.ts.map +0 -1
- package/dist/__tests__/alerts.test.js +0 -245
- package/dist/__tests__/alerts.test.js.map +0 -1
- package/dist/__tests__/analytics.test.d.ts +0 -5
- package/dist/__tests__/analytics.test.d.ts.map +0 -1
- package/dist/__tests__/analytics.test.js +0 -218
- package/dist/__tests__/analytics.test.js.map +0 -1
- package/dist/__tests__/api-keys.test.d.ts +0 -5
- package/dist/__tests__/api-keys.test.d.ts.map +0 -1
- package/dist/__tests__/api-keys.test.js +0 -118
- package/dist/__tests__/api-keys.test.js.map +0 -1
- package/dist/__tests__/auth-no-db.test.d.ts +0 -2
- package/dist/__tests__/auth-no-db.test.d.ts.map +0 -1
- package/dist/__tests__/auth-no-db.test.js +0 -43
- package/dist/__tests__/auth-no-db.test.js.map +0 -1
- package/dist/__tests__/auth.test.d.ts +0 -5
- package/dist/__tests__/auth.test.d.ts.map +0 -1
- package/dist/__tests__/auth.test.js +0 -86
- package/dist/__tests__/auth.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -37
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/events-ingest.test.d.ts +0 -5
- package/dist/__tests__/events-ingest.test.d.ts.map +0 -1
- package/dist/__tests__/events-ingest.test.js +0 -248
- package/dist/__tests__/events-ingest.test.js.map +0 -1
- package/dist/__tests__/events-query.test.d.ts +0 -5
- package/dist/__tests__/events-query.test.d.ts.map +0 -1
- package/dist/__tests__/events-query.test.js +0 -205
- package/dist/__tests__/events-query.test.js.map +0 -1
- package/dist/__tests__/health.test.d.ts +0 -5
- package/dist/__tests__/health.test.d.ts.map +0 -1
- package/dist/__tests__/health.test.js +0 -40
- package/dist/__tests__/health.test.js.map +0 -1
- package/dist/__tests__/ingest.test.d.ts +0 -8
- package/dist/__tests__/ingest.test.d.ts.map +0 -1
- package/dist/__tests__/ingest.test.js +0 -469
- package/dist/__tests__/ingest.test.js.map +0 -1
- package/dist/__tests__/llm-tracking.test.d.ts +0 -10
- package/dist/__tests__/llm-tracking.test.d.ts.map +0 -1
- package/dist/__tests__/llm-tracking.test.js +0 -602
- package/dist/__tests__/llm-tracking.test.js.map +0 -1
- package/dist/__tests__/sessions.test.d.ts +0 -5
- package/dist/__tests__/sessions.test.d.ts.map +0 -1
- package/dist/__tests__/sessions.test.js +0 -176
- package/dist/__tests__/sessions.test.js.map +0 -1
- package/dist/__tests__/stream.test.d.ts +0 -5
- package/dist/__tests__/stream.test.d.ts.map +0 -1
- package/dist/__tests__/stream.test.js +0 -352
- package/dist/__tests__/stream.test.js.map +0 -1
- package/dist/__tests__/test-helpers.d.ts +0 -24
- package/dist/__tests__/test-helpers.d.ts.map +0 -1
- package/dist/__tests__/test-helpers.js +0 -45
- package/dist/__tests__/test-helpers.js.map +0 -1
- package/dist/db/__tests__/init.test.d.ts +0 -2
- package/dist/db/__tests__/init.test.d.ts.map +0 -1
- package/dist/db/__tests__/init.test.js +0 -73
- package/dist/db/__tests__/init.test.js.map +0 -1
- package/dist/db/__tests__/sqlite-store-read.test.d.ts +0 -2
- package/dist/db/__tests__/sqlite-store-read.test.d.ts.map +0 -1
- package/dist/db/__tests__/sqlite-store-read.test.js +0 -749
- package/dist/db/__tests__/sqlite-store-read.test.js.map +0 -1
- package/dist/db/__tests__/sqlite-store-write.test.d.ts +0 -2
- package/dist/db/__tests__/sqlite-store-write.test.d.ts.map +0 -1
- package/dist/db/__tests__/sqlite-store-write.test.js +0 -418
- package/dist/db/__tests__/sqlite-store-write.test.js.map +0 -1
- package/dist/lib/__tests__/alert-engine.test.d.ts +0 -5
- package/dist/lib/__tests__/alert-engine.test.d.ts.map +0 -1
- package/dist/lib/__tests__/alert-engine.test.js +0 -211
- package/dist/lib/__tests__/alert-engine.test.js.map +0 -1
- package/dist/lib/__tests__/retention.test.d.ts +0 -2
- package/dist/lib/__tests__/retention.test.d.ts.map +0 -1
- package/dist/lib/__tests__/retention.test.js +0 -238
- package/dist/lib/__tests__/retention.test.js.map +0 -1
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Retriever (Story 5.2)
|
|
3
|
+
*
|
|
4
|
+
* Combines semantic search over session summaries, lesson search,
|
|
5
|
+
* and key event retrieval to build cross-session context.
|
|
6
|
+
*
|
|
7
|
+
* Falls back to text search when embeddings are unavailable.
|
|
8
|
+
*/
|
|
9
|
+
import { summarizeEvent } from '../embeddings/summarizer.js';
|
|
10
|
+
/** Default maximum results */
|
|
11
|
+
const DEFAULT_LIMIT = 10;
|
|
12
|
+
/** Maximum key events per session in results */
|
|
13
|
+
const MAX_KEY_EVENTS = 5;
|
|
14
|
+
export class ContextRetriever {
|
|
15
|
+
embeddingStore;
|
|
16
|
+
embeddingService;
|
|
17
|
+
sessionSummaryStore;
|
|
18
|
+
lessonStore;
|
|
19
|
+
eventStore;
|
|
20
|
+
constructor(embeddingStore, embeddingService, sessionSummaryStore, lessonStore, eventStore) {
|
|
21
|
+
this.embeddingStore = embeddingStore;
|
|
22
|
+
this.embeddingService = embeddingService;
|
|
23
|
+
this.sessionSummaryStore = sessionSummaryStore;
|
|
24
|
+
this.lessonStore = lessonStore;
|
|
25
|
+
this.eventStore = eventStore;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Retrieve cross-session context by combining:
|
|
29
|
+
* 1. Semantic search over session summary embeddings
|
|
30
|
+
* 2. Lesson search (semantic or text-based)
|
|
31
|
+
* 3. Key events for matching sessions
|
|
32
|
+
* 4. Ranking by relevance + recency
|
|
33
|
+
*
|
|
34
|
+
* TODO: userId filtering is accepted in the ContextQuery type but not yet
|
|
35
|
+
* implemented. Requires schema changes to associate sessions/events with
|
|
36
|
+
* a userId before we can filter here. Deferred to a future release.
|
|
37
|
+
*/
|
|
38
|
+
async retrieve(tenantId, query) {
|
|
39
|
+
const limit = query.limit ?? DEFAULT_LIMIT;
|
|
40
|
+
// Step 1: Find relevant sessions
|
|
41
|
+
const sessionResults = await this.findRelevantSessions(tenantId, query, limit);
|
|
42
|
+
// Step 2: Find relevant lessons
|
|
43
|
+
const lessonResults = await this.findRelevantLessons(tenantId, query, limit);
|
|
44
|
+
// Step 3: For each matching session, get key events
|
|
45
|
+
const sessionsWithEvents = await Promise.all(sessionResults.map((s) => this.enrichSessionWithEvents(tenantId, s)));
|
|
46
|
+
return {
|
|
47
|
+
topic: query.topic,
|
|
48
|
+
sessions: sessionsWithEvents,
|
|
49
|
+
lessons: lessonResults,
|
|
50
|
+
totalSessions: sessionsWithEvents.length,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Find relevant sessions using semantic search (with text search fallback).
|
|
55
|
+
*/
|
|
56
|
+
async findRelevantSessions(tenantId, query, limit) {
|
|
57
|
+
// Try semantic search first
|
|
58
|
+
if (this.embeddingService && this.embeddingStore) {
|
|
59
|
+
try {
|
|
60
|
+
const queryVector = await this.embeddingService.embed(query.topic);
|
|
61
|
+
const results = this.embeddingStore.similaritySearch(tenantId, queryVector, {
|
|
62
|
+
sourceType: 'session',
|
|
63
|
+
from: query.from,
|
|
64
|
+
to: query.to,
|
|
65
|
+
limit: limit * 2, // over-fetch for post-filtering
|
|
66
|
+
minScore: 0.3,
|
|
67
|
+
});
|
|
68
|
+
if (results.length > 0) {
|
|
69
|
+
return this.filterAndRankSessions(tenantId, results, query, limit);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Fall through to text search
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Fallback: text search on session summaries
|
|
77
|
+
return this.textSearchSessions(tenantId, query, limit);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Filter semantic search results by agentId/userId and rank by relevance + recency.
|
|
81
|
+
*/
|
|
82
|
+
async filterAndRankSessions(tenantId, results, query, limit) {
|
|
83
|
+
const sessions = [];
|
|
84
|
+
for (const result of results) {
|
|
85
|
+
// sourceId is the sessionId for session-scope embeddings
|
|
86
|
+
const sessionId = result.sourceId;
|
|
87
|
+
// Filter by agentId if provided
|
|
88
|
+
if (query.agentId) {
|
|
89
|
+
const session = await this.eventStore.getSession(sessionId);
|
|
90
|
+
if (!session || session.agentId !== query.agentId)
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
// Get the summary text from the store (richer than embedding text)
|
|
94
|
+
const summaryRecord = this.sessionSummaryStore.get(tenantId, sessionId);
|
|
95
|
+
const summary = summaryRecord?.summary ?? result.text;
|
|
96
|
+
// Recency boost: more recent sessions score slightly higher
|
|
97
|
+
const recencyBoost = this.computeRecencyBoost(result.createdAt);
|
|
98
|
+
const adjustedScore = result.score * 0.85 + recencyBoost * 0.15;
|
|
99
|
+
sessions.push({
|
|
100
|
+
sessionId,
|
|
101
|
+
summary,
|
|
102
|
+
relevanceScore: Math.round(adjustedScore * 10000) / 10000,
|
|
103
|
+
});
|
|
104
|
+
if (sessions.length >= limit)
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
// Sort by adjusted score descending
|
|
108
|
+
sessions.sort((a, b) => b.relevanceScore - a.relevanceScore);
|
|
109
|
+
return sessions.slice(0, limit);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Text search fallback when embeddings are unavailable.
|
|
113
|
+
*/
|
|
114
|
+
textSearchSessions(tenantId, query, limit) {
|
|
115
|
+
const results = this.sessionSummaryStore.search(tenantId, query.topic, limit * 2);
|
|
116
|
+
let filtered = results;
|
|
117
|
+
// If agentId filter is needed, we need to cross-reference sessions
|
|
118
|
+
// For text search, we can't easily filter by agentId synchronously here,
|
|
119
|
+
// so we'll skip that filter for the text fallback (best effort)
|
|
120
|
+
return filtered.slice(0, limit).map((r, index) => ({
|
|
121
|
+
sessionId: r.sessionId,
|
|
122
|
+
summary: r.summary,
|
|
123
|
+
// Assign a decreasing relevance score for text search results (1.0 → 0.5)
|
|
124
|
+
relevanceScore: Math.round((1.0 - index * (0.5 / Math.max(limit, 1))) * 10000) / 10000,
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Find relevant lessons using semantic search (with text search fallback).
|
|
129
|
+
*/
|
|
130
|
+
async findRelevantLessons(tenantId, query, limit) {
|
|
131
|
+
// Try semantic search first
|
|
132
|
+
if (this.embeddingService && this.embeddingStore) {
|
|
133
|
+
try {
|
|
134
|
+
const queryVector = await this.embeddingService.embed(query.topic);
|
|
135
|
+
const results = this.embeddingStore.similaritySearch(tenantId, queryVector, {
|
|
136
|
+
sourceType: 'lesson',
|
|
137
|
+
limit,
|
|
138
|
+
minScore: 0.3,
|
|
139
|
+
});
|
|
140
|
+
if (results.length > 0) {
|
|
141
|
+
const lessons = [];
|
|
142
|
+
for (const result of results) {
|
|
143
|
+
const lesson = this.lessonStore.get(tenantId, result.sourceId);
|
|
144
|
+
if (lesson) {
|
|
145
|
+
lessons.push({
|
|
146
|
+
id: lesson.id,
|
|
147
|
+
title: lesson.title,
|
|
148
|
+
content: lesson.content,
|
|
149
|
+
category: lesson.category,
|
|
150
|
+
importance: lesson.importance,
|
|
151
|
+
relevanceScore: Math.round(result.score * 10000) / 10000,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return lessons;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Fall through to text search
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Fallback: text search on lessons
|
|
163
|
+
const textResults = this.lessonStore.list(tenantId, {
|
|
164
|
+
search: query.topic,
|
|
165
|
+
limit,
|
|
166
|
+
});
|
|
167
|
+
return textResults.map((lesson, index) => ({
|
|
168
|
+
id: lesson.id,
|
|
169
|
+
title: lesson.title,
|
|
170
|
+
content: lesson.content,
|
|
171
|
+
category: lesson.category,
|
|
172
|
+
importance: lesson.importance,
|
|
173
|
+
// Assign decreasing scores for text search results
|
|
174
|
+
relevanceScore: Math.round((1.0 - index * (0.5 / Math.max(limit, 1))) * 10000) / 10000,
|
|
175
|
+
}));
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Enrich a session result with key events from the timeline.
|
|
179
|
+
*/
|
|
180
|
+
async enrichSessionWithEvents(tenantId, session) {
|
|
181
|
+
// Get session metadata for startedAt/endedAt/agentId
|
|
182
|
+
const sessionRecord = await this.eventStore.getSession(session.sessionId);
|
|
183
|
+
// Get timeline events for key event extraction
|
|
184
|
+
let keyEvents = [];
|
|
185
|
+
try {
|
|
186
|
+
const timeline = await this.eventStore.getSessionTimeline(session.sessionId);
|
|
187
|
+
// Extract key events: errors, tool calls, session boundaries
|
|
188
|
+
const significant = timeline.filter((e) => e.eventType === 'tool_error' ||
|
|
189
|
+
e.eventType === 'tool_call' ||
|
|
190
|
+
e.eventType === 'session_started' ||
|
|
191
|
+
e.eventType === 'session_ended' ||
|
|
192
|
+
e.severity === 'error' ||
|
|
193
|
+
e.severity === 'critical');
|
|
194
|
+
keyEvents = significant.slice(0, MAX_KEY_EVENTS).map((e) => {
|
|
195
|
+
const eventSummary = summarizeEvent(e) ?? `${e.eventType}`;
|
|
196
|
+
return {
|
|
197
|
+
id: e.id,
|
|
198
|
+
eventType: e.eventType,
|
|
199
|
+
summary: eventSummary,
|
|
200
|
+
timestamp: e.timestamp,
|
|
201
|
+
};
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Non-critical — return session without events
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
sessionId: session.sessionId,
|
|
209
|
+
agentId: sessionRecord?.agentId ?? '',
|
|
210
|
+
summary: session.summary,
|
|
211
|
+
relevanceScore: session.relevanceScore,
|
|
212
|
+
startedAt: sessionRecord?.startedAt ?? '',
|
|
213
|
+
endedAt: sessionRecord?.endedAt,
|
|
214
|
+
keyEvents,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Compute a recency boost (0-1) based on how recent the content is.
|
|
219
|
+
* Items from the last 24h get ~1.0, items from 30+ days ago get ~0.0.
|
|
220
|
+
*/
|
|
221
|
+
computeRecencyBoost(createdAt) {
|
|
222
|
+
const now = Date.now();
|
|
223
|
+
const created = new Date(createdAt).getTime();
|
|
224
|
+
const ageMs = now - created;
|
|
225
|
+
const thirtyDaysMs = 30 * 24 * 60 * 60 * 1000;
|
|
226
|
+
if (ageMs <= 0)
|
|
227
|
+
return 1.0;
|
|
228
|
+
if (ageMs >= thirtyDaysMs)
|
|
229
|
+
return 0.0;
|
|
230
|
+
return 1.0 - ageMs / thirtyDaysMs;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=retrieval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrieval.js","sourceRoot":"","sources":["../../../src/lib/context/retrieval.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,8BAA8B;AAC9B,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,gDAAgD;AAChD,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,MAAM,OAAO,gBAAgB;IAER;IACA;IACA;IACA;IACA;IALnB,YACmB,cAAqC,EACrC,gBAAyC,EACzC,mBAAwC,EACxC,WAAwB,EACxB,UAAuB;QAJvB,mBAAc,GAAd,cAAc,CAAuB;QACrC,qBAAgB,GAAhB,gBAAgB,CAAyB;QACzC,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,gBAAW,GAAX,WAAW,CAAa;QACxB,eAAU,GAAV,UAAU,CAAa;IACvC,CAAC;IAEJ;;;;;;;;;;OAUG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,KAAmB;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,aAAa,CAAC;QAE3C,iCAAiC;QACjC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAE/E,gCAAgC;QAChC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAE7E,oDAAoD;QACpD,MAAM,kBAAkB,GAAqB,MAAM,OAAO,CAAC,GAAG,CAC5D,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CACrE,CAAC;QAEF,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,kBAAkB;YAC5B,OAAO,EAAE,aAAa;YACtB,aAAa,EAAE,kBAAkB,CAAC,MAAM;SACzC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAChC,QAAgB,EAChB,KAAmB,EACnB,KAAa;QAEb,4BAA4B;QAC5B,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACnE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE;oBAC1E,UAAU,EAAE,SAAS;oBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,gCAAgC;oBAClD,QAAQ,EAAE,GAAG;iBACd,CAAC,CAAC;gBAEH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,OAAO,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;YAChC,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB,CACjC,QAAgB,EAChB,OAA2B,EAC3B,KAAmB,EACnB,KAAa;QAEb,MAAM,QAAQ,GAA0E,EAAE,CAAC;QAE3F,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,yDAAyD;YACzD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;YAElC,gCAAgC;YAChC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAC5D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;oBAAE,SAAS;YAC9D,CAAC;YAED,mEAAmE;YACnE,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACxE,MAAM,OAAO,GAAG,aAAa,EAAE,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC;YAEtD,4DAA4D;YAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAChE,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,GAAG,IAAI,GAAG,YAAY,GAAG,IAAI,CAAC;YAEhE,QAAQ,CAAC,IAAI,CAAC;gBACZ,SAAS;gBACT,OAAO;gBACP,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,GAAG,KAAK;aAC1D,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK;gBAAE,MAAM;QACtC,CAAC;QAED,oCAAoC;QACpC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,kBAAkB,CACxB,QAAgB,EAChB,KAAmB,EACnB,KAAa;QAEb,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAElF,IAAI,QAAQ,GAAG,OAAO,CAAC;QAEvB,mEAAmE;QACnE,yEAAyE;QACzE,gEAAgE;QAEhE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACjD,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,0EAA0E;YAC1E,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK;SACvF,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC/B,QAAgB,EAChB,KAAmB,EACnB,KAAa;QAEb,4BAA4B;QAC5B,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACnE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE;oBAC1E,UAAU,EAAE,QAAQ;oBACpB,KAAK;oBACL,QAAQ,EAAE,GAAG;iBACd,CAAC,CAAC;gBAEH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,OAAO,GAAoB,EAAE,CAAC;oBAEpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;wBAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAC/D,IAAI,MAAM,EAAE,CAAC;4BACX,OAAO,CAAC,IAAI,CAAC;gCACX,EAAE,EAAE,MAAM,CAAC,EAAE;gCACb,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,OAAO,EAAE,MAAM,CAAC,OAAO;gCACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,UAAU,EAAE,MAAM,CAAC,UAAU;gCAC7B,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK;6BACzD,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBAED,OAAO,OAAO,CAAC;gBACjB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;YAChC,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClD,MAAM,EAAE,KAAK,CAAC,KAAK;YACnB,KAAK;SACN,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACzC,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,mDAAmD;YACnD,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK;SACvF,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,uBAAuB,CACnC,QAAgB,EAChB,OAAuE;QAEvE,qDAAqD;QACrD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE1E,+CAA+C;QAC/C,IAAI,SAAS,GAAsB,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAE7E,6DAA6D;YAC7D,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,SAAS,KAAK,YAAY;gBAC5B,CAAC,CAAC,SAAS,KAAK,WAAW;gBAC3B,CAAC,CAAC,SAAS,KAAK,iBAAiB;gBACjC,CAAC,CAAC,SAAS,KAAK,eAAe;gBAC/B,CAAC,CAAC,QAAQ,KAAK,OAAO;gBACtB,CAAC,CAAC,QAAQ,KAAK,UAAU,CAC5B,CAAC;YAEF,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACzD,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC3D,OAAO;oBACL,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,OAAO,EAAE,YAAY;oBACrB,SAAS,EAAE,CAAC,CAAC,SAAS;iBACvB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;QAED,OAAO;YACL,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,aAAa,EAAE,OAAO,IAAI,EAAE;YACrC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,SAAS,EAAE,aAAa,EAAE,SAAS,IAAI,EAAE;YACzC,OAAO,EAAE,aAAa,EAAE,OAAO;YAC/B,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,mBAAmB,CAAC,SAAiB;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC;QAC5B,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAE9C,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC;QAC3B,IAAI,KAAK,IAAI,YAAY;YAAE,OAAO,GAAG,CAAC;QACtC,OAAO,GAAG,GAAG,KAAK,GAAG,YAAY,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Service — interface and factory (Story 2.1)
|
|
3
|
+
*
|
|
4
|
+
* Supports local (Xenova/transformers.js ONNX) and OpenAI backends.
|
|
5
|
+
*/
|
|
6
|
+
import type { EmbeddingServiceConfig } from './types.js';
|
|
7
|
+
export type { EmbeddingVector, EmbeddingBackend, EmbeddingServiceConfig } from './types.js';
|
|
8
|
+
export { cosineSimilarity } from './math.js';
|
|
9
|
+
/**
|
|
10
|
+
* Embedding service interface — embed text into vector space.
|
|
11
|
+
*/
|
|
12
|
+
export interface EmbeddingService {
|
|
13
|
+
/** Embed a single text string */
|
|
14
|
+
embed(text: string): Promise<Float32Array>;
|
|
15
|
+
/** Embed a batch of texts */
|
|
16
|
+
embedBatch(texts: string[]): Promise<Float32Array[]>;
|
|
17
|
+
/** Dimensionality of the output vectors */
|
|
18
|
+
readonly dimensions: number;
|
|
19
|
+
/** Name of the model used */
|
|
20
|
+
readonly modelName: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create an embedding service from config or environment variables.
|
|
24
|
+
*
|
|
25
|
+
* Environment variables:
|
|
26
|
+
* - AGENTLENS_EMBEDDING_BACKEND: 'local' | 'openai' (default: 'local')
|
|
27
|
+
* - AGENTLENS_EMBEDDING_MODEL: model name override
|
|
28
|
+
* - OPENAI_API_KEY: required for 'openai' backend
|
|
29
|
+
*/
|
|
30
|
+
export declare function createEmbeddingService(config?: Partial<EmbeddingServiceConfig>): EmbeddingService;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAIzD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE3C,6BAA6B;IAC7B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAErD,2CAA2C;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,6BAA6B;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,gBAAgB,CAgBjG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Service — interface and factory (Story 2.1)
|
|
3
|
+
*
|
|
4
|
+
* Supports local (Xenova/transformers.js ONNX) and OpenAI backends.
|
|
5
|
+
*/
|
|
6
|
+
import { createLocalEmbeddingService } from './local.js';
|
|
7
|
+
import { createOpenAIEmbeddingService } from './openai.js';
|
|
8
|
+
export { cosineSimilarity } from './math.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create an embedding service from config or environment variables.
|
|
11
|
+
*
|
|
12
|
+
* Environment variables:
|
|
13
|
+
* - AGENTLENS_EMBEDDING_BACKEND: 'local' | 'openai' (default: 'local')
|
|
14
|
+
* - AGENTLENS_EMBEDDING_MODEL: model name override
|
|
15
|
+
* - OPENAI_API_KEY: required for 'openai' backend
|
|
16
|
+
*/
|
|
17
|
+
export function createEmbeddingService(config) {
|
|
18
|
+
const backend = config?.backend ??
|
|
19
|
+
process.env['AGENTLENS_EMBEDDING_BACKEND'] ??
|
|
20
|
+
'local';
|
|
21
|
+
const modelName = config?.modelName ?? process.env['AGENTLENS_EMBEDDING_MODEL'];
|
|
22
|
+
switch (backend) {
|
|
23
|
+
case 'local':
|
|
24
|
+
return createLocalEmbeddingService(modelName);
|
|
25
|
+
case 'openai':
|
|
26
|
+
return createOpenAIEmbeddingService(config?.openaiApiKey, modelName);
|
|
27
|
+
default:
|
|
28
|
+
throw new Error(`Unknown embedding backend: ${backend}. Use 'local' or 'openai'.`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAG3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAmB7C;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAwC;IAC7E,MAAM,OAAO,GACX,MAAM,EAAE,OAAO;QACd,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAoC;QAC9E,OAAO,CAAC;IAEV,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEhF,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,2BAA2B,CAAC,SAAS,CAAC,CAAC;QAChD,KAAK,QAAQ;YACX,OAAO,4BAA4B,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QACvE;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAiB,4BAA4B,CAAC,CAAC;IACjG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local embedding service using @xenova/transformers (ONNX) (Story 2.1)
|
|
3
|
+
*
|
|
4
|
+
* Uses all-MiniLM-L6-v2 model (384 dimensions) by default.
|
|
5
|
+
* Model is loaded once and cached for subsequent calls.
|
|
6
|
+
*/
|
|
7
|
+
import type { EmbeddingService } from './index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create a local embedding service backed by @xenova/transformers.
|
|
10
|
+
*
|
|
11
|
+
* The @xenova/transformers package is dynamically imported, so it's
|
|
12
|
+
* not a hard dependency. If not installed, a clear error is thrown.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createLocalEmbeddingService(modelName?: string): EmbeddingService;
|
|
15
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/local.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKnD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAwDhF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local embedding service using @xenova/transformers (ONNX) (Story 2.1)
|
|
3
|
+
*
|
|
4
|
+
* Uses all-MiniLM-L6-v2 model (384 dimensions) by default.
|
|
5
|
+
* Model is loaded once and cached for subsequent calls.
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_MODEL = 'Xenova/all-MiniLM-L6-v2';
|
|
8
|
+
const DEFAULT_DIMENSIONS = 384;
|
|
9
|
+
/**
|
|
10
|
+
* Create a local embedding service backed by @xenova/transformers.
|
|
11
|
+
*
|
|
12
|
+
* The @xenova/transformers package is dynamically imported, so it's
|
|
13
|
+
* not a hard dependency. If not installed, a clear error is thrown.
|
|
14
|
+
*/
|
|
15
|
+
export function createLocalEmbeddingService(modelName) {
|
|
16
|
+
const model = modelName ?? DEFAULT_MODEL;
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
+
let pipelinePromise = null;
|
|
19
|
+
async function getPipeline() {
|
|
20
|
+
if (!pipelinePromise) {
|
|
21
|
+
pipelinePromise = (async () => {
|
|
22
|
+
try {
|
|
23
|
+
// Dynamic import — @xenova/transformers may not be installed
|
|
24
|
+
// Use a variable to prevent TypeScript/bundlers from resolving at compile time
|
|
25
|
+
const moduleName = '@xenova/transformers';
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
const mod = await import(moduleName);
|
|
28
|
+
const { pipeline } = mod;
|
|
29
|
+
return await pipeline('feature-extraction', model);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
pipelinePromise = null; // Reset so user can retry after install
|
|
33
|
+
if (err instanceof Error &&
|
|
34
|
+
(err.message.includes('Cannot find module') ||
|
|
35
|
+
err.message.includes('Cannot find package') ||
|
|
36
|
+
err.message.includes('ERR_MODULE_NOT_FOUND'))) {
|
|
37
|
+
throw new Error('Local embedding backend requires @xenova/transformers. ' +
|
|
38
|
+
'Install it with: pnpm add @xenova/transformers');
|
|
39
|
+
}
|
|
40
|
+
throw err;
|
|
41
|
+
}
|
|
42
|
+
})();
|
|
43
|
+
}
|
|
44
|
+
return pipelinePromise;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
dimensions: DEFAULT_DIMENSIONS,
|
|
48
|
+
modelName: model,
|
|
49
|
+
async embed(text) {
|
|
50
|
+
const pipe = await getPipeline();
|
|
51
|
+
const output = await pipe(text, { pooling: 'mean', normalize: true });
|
|
52
|
+
return new Float32Array(output.data);
|
|
53
|
+
},
|
|
54
|
+
async embedBatch(texts) {
|
|
55
|
+
const pipe = await getPipeline();
|
|
56
|
+
const results = [];
|
|
57
|
+
for (const text of texts) {
|
|
58
|
+
const output = await pipe(text, { pooling: 'mean', normalize: true });
|
|
59
|
+
results.push(new Float32Array(output.data));
|
|
60
|
+
}
|
|
61
|
+
return results;
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/lib/embeddings/local.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAChD,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,SAAkB;IAC5D,MAAM,KAAK,GAAG,SAAS,IAAI,aAAa,CAAC;IACzC,8DAA8D;IAC9D,IAAI,eAAe,GAAwB,IAAI,CAAC;IAEhD,KAAK,UAAU,WAAW;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,eAAe,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC5B,IAAI,CAAC;oBACH,6DAA6D;oBAC7D,+EAA+E;oBAC/E,MAAM,UAAU,GAAG,sBAAsB,CAAC;oBAC1C,8DAA8D;oBAC9D,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;oBAC1C,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;oBACzB,OAAO,MAAM,QAAQ,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;gBACrD,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACtB,eAAe,GAAG,IAAI,CAAC,CAAC,wCAAwC;oBAChE,IACE,GAAG,YAAY,KAAK;wBACpB,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;4BACzC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC;4BAC3C,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,EAC/C,CAAC;wBACD,MAAM,IAAI,KAAK,CACb,yDAAyD;4BACvD,gDAAgD,CACnD,CAAC;oBACJ,CAAC;oBACD,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,OAAO;QACL,UAAU,EAAE,kBAAkB;QAC9B,SAAS,EAAE,KAAK;QAEhB,KAAK,CAAC,KAAK,CAAC,IAAY;YACtB,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtE,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,KAAe;YAC9B,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;YACjC,MAAM,OAAO,GAAmB,EAAE,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtE,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector math utilities for embeddings (Story 2.1)
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Compute cosine similarity between two vectors.
|
|
6
|
+
*
|
|
7
|
+
* Returns a value between -1 and 1, where 1 means identical direction,
|
|
8
|
+
* 0 means orthogonal, and -1 means opposite direction.
|
|
9
|
+
*
|
|
10
|
+
* @throws Error if vectors have different lengths or are zero-length
|
|
11
|
+
*/
|
|
12
|
+
export declare function cosineSimilarity(a: Float32Array, b: Float32Array): number;
|
|
13
|
+
//# sourceMappingURL=math.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/math.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CA0BzE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector math utilities for embeddings (Story 2.1)
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Compute cosine similarity between two vectors.
|
|
6
|
+
*
|
|
7
|
+
* Returns a value between -1 and 1, where 1 means identical direction,
|
|
8
|
+
* 0 means orthogonal, and -1 means opposite direction.
|
|
9
|
+
*
|
|
10
|
+
* @throws Error if vectors have different lengths or are zero-length
|
|
11
|
+
*/
|
|
12
|
+
export function cosineSimilarity(a, b) {
|
|
13
|
+
if (a.length !== b.length) {
|
|
14
|
+
throw new Error(`Vector dimension mismatch: ${a.length} vs ${b.length}`);
|
|
15
|
+
}
|
|
16
|
+
if (a.length === 0) {
|
|
17
|
+
throw new Error('Cannot compute cosine similarity of zero-length vectors');
|
|
18
|
+
}
|
|
19
|
+
let dotProduct = 0;
|
|
20
|
+
let normA = 0;
|
|
21
|
+
let normB = 0;
|
|
22
|
+
for (let i = 0; i < a.length; i++) {
|
|
23
|
+
const ai = a[i];
|
|
24
|
+
const bi = b[i];
|
|
25
|
+
dotProduct += ai * bi;
|
|
26
|
+
normA += ai * ai;
|
|
27
|
+
normB += bi * bi;
|
|
28
|
+
}
|
|
29
|
+
const denominator = Math.sqrt(normA) * Math.sqrt(normB);
|
|
30
|
+
if (denominator === 0) {
|
|
31
|
+
return 0; // zero vector(s)
|
|
32
|
+
}
|
|
33
|
+
return dotProduct / denominator;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=math.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../../src/lib/embeddings/math.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAC/D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,UAAU,IAAI,EAAE,GAAG,EAAE,CAAC;QACtB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC,CAAC,iBAAiB;IAC7B,CAAC;IAED,OAAO,UAAU,GAAG,WAAW,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI embedding service (Story 2.1)
|
|
3
|
+
*
|
|
4
|
+
* Uses text-embedding-3-small (1536 dimensions) by default.
|
|
5
|
+
* Simple fetch-based client — no SDK dependency.
|
|
6
|
+
*/
|
|
7
|
+
import type { EmbeddingService } from './index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create an OpenAI embedding service.
|
|
10
|
+
*
|
|
11
|
+
* @param apiKey - OpenAI API key (falls back to OPENAI_API_KEY env var)
|
|
12
|
+
* @param modelName - Model to use (default: text-embedding-3-small)
|
|
13
|
+
*/
|
|
14
|
+
export declare function createOpenAIEmbeddingService(apiKey?: string, modelName?: string): EmbeddingService;
|
|
15
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/openai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkBnD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,gBAAgB,CAiDlB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI embedding service (Story 2.1)
|
|
3
|
+
*
|
|
4
|
+
* Uses text-embedding-3-small (1536 dimensions) by default.
|
|
5
|
+
* Simple fetch-based client — no SDK dependency.
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_MODEL = 'text-embedding-3-small';
|
|
8
|
+
const DEFAULT_DIMENSIONS = 1536;
|
|
9
|
+
const OPENAI_EMBEDDINGS_URL = 'https://api.openai.com/v1/embeddings';
|
|
10
|
+
/**
|
|
11
|
+
* Create an OpenAI embedding service.
|
|
12
|
+
*
|
|
13
|
+
* @param apiKey - OpenAI API key (falls back to OPENAI_API_KEY env var)
|
|
14
|
+
* @param modelName - Model to use (default: text-embedding-3-small)
|
|
15
|
+
*/
|
|
16
|
+
export function createOpenAIEmbeddingService(apiKey, modelName) {
|
|
17
|
+
const key = apiKey ?? process.env['OPENAI_API_KEY'];
|
|
18
|
+
const model = modelName ?? DEFAULT_MODEL;
|
|
19
|
+
if (!key) {
|
|
20
|
+
throw new Error('OpenAI embedding backend requires an API key. ' +
|
|
21
|
+
'Set OPENAI_API_KEY environment variable or pass apiKey to config.');
|
|
22
|
+
}
|
|
23
|
+
async function callOpenAI(input) {
|
|
24
|
+
const response = await fetch(OPENAI_EMBEDDINGS_URL, {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: {
|
|
27
|
+
Authorization: `Bearer ${key}`,
|
|
28
|
+
'Content-Type': 'application/json',
|
|
29
|
+
},
|
|
30
|
+
body: JSON.stringify({
|
|
31
|
+
input,
|
|
32
|
+
model,
|
|
33
|
+
}),
|
|
34
|
+
});
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
const errorBody = await response.text();
|
|
37
|
+
throw new Error(`OpenAI embeddings API error (${response.status}): ${errorBody}`);
|
|
38
|
+
}
|
|
39
|
+
const json = (await response.json());
|
|
40
|
+
// Sort by index to ensure order matches input
|
|
41
|
+
return json.data.sort((a, b) => a.index - b.index).map((d) => d.embedding);
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
dimensions: DEFAULT_DIMENSIONS,
|
|
45
|
+
modelName: model,
|
|
46
|
+
async embed(text) {
|
|
47
|
+
const [embedding] = await callOpenAI(text);
|
|
48
|
+
return new Float32Array(embedding);
|
|
49
|
+
},
|
|
50
|
+
async embedBatch(texts) {
|
|
51
|
+
if (texts.length === 0)
|
|
52
|
+
return [];
|
|
53
|
+
const embeddings = await callOpenAI(texts);
|
|
54
|
+
return embeddings.map((e) => new Float32Array(e));
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/lib/embeddings/openai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,qBAAqB,GAAG,sCAAsC,CAAC;AAcrE;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,MAAe,EACf,SAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,SAAS,IAAI,aAAa,CAAC;IAEzC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,gDAAgD;YAC9C,mEAAmE,CACtE,CAAC;IACJ,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,KAAwB;QAChD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qBAAqB,EAAE;YAClD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,GAAG,EAAE;gBAC9B,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,KAAK;aACN,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;QAChE,8CAA8C;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO;QACL,UAAU,EAAE,kBAAkB;QAC9B,SAAS,EAAE,KAAK;QAEhB,KAAK,CAAC,KAAK,CAAC,IAAY;YACtB,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,IAAI,YAAY,CAAC,SAAU,CAAC,CAAC;QACtC,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,KAAe;YAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event & Session Summarizer (Story 2.3)
|
|
3
|
+
*
|
|
4
|
+
* Produces concise text summaries suitable for embedding.
|
|
5
|
+
* - summarizeEvent(): returns embedding text for events worth embedding, or null to skip
|
|
6
|
+
* - summarizeSession(): produces a heuristic session summary
|
|
7
|
+
*/
|
|
8
|
+
import type { AgentLensEvent, Session } from '@agentlensai/core';
|
|
9
|
+
/**
|
|
10
|
+
* Summarize a single event into text suitable for embedding.
|
|
11
|
+
* Returns null if the event should be skipped (not worth embedding).
|
|
12
|
+
*/
|
|
13
|
+
export declare function summarizeEvent(event: AgentLensEvent): string | null;
|
|
14
|
+
export type SessionOutcome = 'success' | 'partial' | 'failure';
|
|
15
|
+
export interface SessionSummary {
|
|
16
|
+
summary: string;
|
|
17
|
+
topics: string[];
|
|
18
|
+
toolSequence: string[];
|
|
19
|
+
errorSummary: string;
|
|
20
|
+
outcome: SessionOutcome;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Produce a heuristic summary of a session from its metadata and events.
|
|
24
|
+
*/
|
|
25
|
+
export declare function summarizeSession(session: Session, events: AgentLensEvent[]): SessionSummary;
|
|
26
|
+
//# sourceMappingURL=summarizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/summarizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,OAAO,EAOR,MAAM,mBAAmB,CAAC;AAuB3B;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAuDnE;AAID,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,cAAc,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,cAAc,EAAE,GACvB,cAAc,CAmGhB"}
|