@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,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analysis Dispatcher (Story 4.6)
|
|
3
|
+
*
|
|
4
|
+
* Maps analysis type strings to handler functions and converts
|
|
5
|
+
* their results into the unified ReflectResult format.
|
|
6
|
+
*/
|
|
7
|
+
import { analyzeErrorPatterns } from './error-patterns.js';
|
|
8
|
+
import { analyzeToolSequences } from './tool-sequences.js';
|
|
9
|
+
import { analyzeCosts } from './cost-analysis.js';
|
|
10
|
+
import { analyzePerformance } from './performance-trends.js';
|
|
11
|
+
/**
|
|
12
|
+
* Run an analysis by type string and return a unified ReflectResult.
|
|
13
|
+
*/
|
|
14
|
+
export async function runAnalysis(analysis, store, opts = {}) {
|
|
15
|
+
switch (analysis) {
|
|
16
|
+
case 'error_patterns':
|
|
17
|
+
return runErrorPatterns(store, opts);
|
|
18
|
+
case 'tool_sequences':
|
|
19
|
+
return runToolSequences(store, opts);
|
|
20
|
+
case 'cost_analysis':
|
|
21
|
+
return runCostAnalysis(store, opts);
|
|
22
|
+
case 'performance_trends':
|
|
23
|
+
return runPerformanceTrends(store, opts);
|
|
24
|
+
default:
|
|
25
|
+
throw new Error(`Unknown analysis type: ${analysis}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function runErrorPatterns(store, opts) {
|
|
29
|
+
const result = await analyzeErrorPatterns(store, opts);
|
|
30
|
+
const insights = result.patterns.map((p) => ({
|
|
31
|
+
type: 'error_pattern',
|
|
32
|
+
summary: `Error pattern "${p.pattern}" occurred ${p.count} time(s) across ${p.affectedSessions.length} session(s)`,
|
|
33
|
+
data: {
|
|
34
|
+
pattern: p.pattern,
|
|
35
|
+
count: p.count,
|
|
36
|
+
firstSeen: p.firstSeen,
|
|
37
|
+
lastSeen: p.lastSeen,
|
|
38
|
+
affectedSessions: p.affectedSessions,
|
|
39
|
+
precedingTools: p.precedingTools,
|
|
40
|
+
},
|
|
41
|
+
confidence: Math.min(0.5 + p.count * 0.1, 1.0),
|
|
42
|
+
}));
|
|
43
|
+
return {
|
|
44
|
+
analysis: 'error_patterns',
|
|
45
|
+
insights,
|
|
46
|
+
metadata: {
|
|
47
|
+
sessionsAnalyzed: new Set(result.patterns.flatMap((p) => p.affectedSessions)).size,
|
|
48
|
+
eventsAnalyzed: result.metadata.eventsAnalyzed,
|
|
49
|
+
timeRange: result.metadata.timeRange,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function runToolSequences(store, opts) {
|
|
54
|
+
const result = await analyzeToolSequences(store, opts);
|
|
55
|
+
const insights = result.sequences.map((s) => ({
|
|
56
|
+
type: s.errorRate > 0 ? 'error_prone_sequence' : 'tool_sequence',
|
|
57
|
+
summary: `Sequence [${s.tools.join(' → ')}] used ${s.frequency} time(s) across ${s.sessions} session(s)${s.errorRate > 0 ? ` (${Math.round(s.errorRate * 100)}% error rate)` : ''}`,
|
|
58
|
+
data: {
|
|
59
|
+
tools: s.tools,
|
|
60
|
+
frequency: s.frequency,
|
|
61
|
+
sessions: s.sessions,
|
|
62
|
+
errorRate: s.errorRate,
|
|
63
|
+
},
|
|
64
|
+
confidence: Math.min(0.4 + s.frequency * 0.1, 1.0),
|
|
65
|
+
}));
|
|
66
|
+
return {
|
|
67
|
+
analysis: 'tool_sequences',
|
|
68
|
+
insights,
|
|
69
|
+
metadata: {
|
|
70
|
+
sessionsAnalyzed: result.stats.totalCalls > 0 ? result.sequences.reduce((max, s) => Math.max(max, s.sessions), 0) : 0,
|
|
71
|
+
eventsAnalyzed: result.metadata.eventsAnalyzed,
|
|
72
|
+
timeRange: result.metadata.timeRange,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async function runCostAnalysis(store, opts) {
|
|
77
|
+
const model = opts.params?.model;
|
|
78
|
+
const result = await analyzeCosts(store, { ...opts, model });
|
|
79
|
+
const insights = [];
|
|
80
|
+
// Summary insight
|
|
81
|
+
insights.push({
|
|
82
|
+
type: 'cost_summary',
|
|
83
|
+
summary: `Total cost: $${result.summary.totalCost.toFixed(4)} across ${result.summary.totalSessions} session(s) (avg $${result.summary.avgPerSession.toFixed(4)}/session)`,
|
|
84
|
+
data: result.summary,
|
|
85
|
+
confidence: 1.0,
|
|
86
|
+
});
|
|
87
|
+
// Trend insight
|
|
88
|
+
insights.push({
|
|
89
|
+
type: 'cost_trend',
|
|
90
|
+
summary: `Cost trend is ${result.trend.direction}`,
|
|
91
|
+
data: {
|
|
92
|
+
direction: result.trend.direction,
|
|
93
|
+
bucketCount: result.trend.buckets.length,
|
|
94
|
+
},
|
|
95
|
+
confidence: result.trend.buckets.length >= 7 ? 0.8 : 0.5,
|
|
96
|
+
});
|
|
97
|
+
// Top model insights
|
|
98
|
+
for (const m of result.byModel.slice(0, 3)) {
|
|
99
|
+
insights.push({
|
|
100
|
+
type: 'cost_by_model',
|
|
101
|
+
summary: `Model "${m.model}": $${m.totalCost.toFixed(4)} (${m.callCount} calls, avg $${m.avgCostPerCall.toFixed(4)}/call)`,
|
|
102
|
+
data: m,
|
|
103
|
+
confidence: 0.9,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
analysis: 'cost_analysis',
|
|
108
|
+
insights,
|
|
109
|
+
metadata: {
|
|
110
|
+
sessionsAnalyzed: result.summary.totalSessions,
|
|
111
|
+
eventsAnalyzed: result.metadata.eventsAnalyzed,
|
|
112
|
+
timeRange: result.metadata.timeRange,
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
async function runPerformanceTrends(store, opts) {
|
|
117
|
+
const result = await analyzePerformance(store, opts);
|
|
118
|
+
const insights = [];
|
|
119
|
+
// Current performance insight
|
|
120
|
+
insights.push({
|
|
121
|
+
type: 'performance_current',
|
|
122
|
+
summary: `Current: ${Math.round(result.current.successRate * 100)}% success rate, avg ${result.current.avgDuration}ms duration, ${result.current.avgToolCalls} tool calls/session, ${result.current.avgErrors} errors/session`,
|
|
123
|
+
data: result.current,
|
|
124
|
+
confidence: result.metadata.sessionsAnalyzed >= 10 ? 0.9 : 0.6,
|
|
125
|
+
});
|
|
126
|
+
// Assessment insight
|
|
127
|
+
insights.push({
|
|
128
|
+
type: 'performance_assessment',
|
|
129
|
+
summary: `Performance trend: ${result.assessment}`,
|
|
130
|
+
data: { assessment: result.assessment },
|
|
131
|
+
confidence: result.trends.length >= 4 ? 0.8 : 0.5,
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
analysis: 'performance_trends',
|
|
135
|
+
insights,
|
|
136
|
+
metadata: result.metadata,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// Re-export individual analysis functions
|
|
140
|
+
export { analyzeErrorPatterns } from './error-patterns.js';
|
|
141
|
+
export { analyzeToolSequences } from './tool-sequences.js';
|
|
142
|
+
export { analyzeCosts } from './cost-analysis.js';
|
|
143
|
+
export { analyzePerformance } from './performance-trends.js';
|
|
144
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/analysis/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Trends Analysis (Story 4.4)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes sessions over time to calculate success rates, durations,
|
|
5
|
+
* tool call averages, and error averages, with trend detection.
|
|
6
|
+
*/
|
|
7
|
+
import type { IEventStore } from '@agentlensai/core';
|
|
8
|
+
import type { PerformanceTrendsResult } from '@agentlensai/core';
|
|
9
|
+
export interface PerformanceTrendsOpts {
|
|
10
|
+
agentId?: string;
|
|
11
|
+
from?: string;
|
|
12
|
+
to?: string;
|
|
13
|
+
limit?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Analyze performance trends across sessions.
|
|
17
|
+
*/
|
|
18
|
+
export declare function analyzePerformance(store: IEventStore, opts?: PerformanceTrendsOpts): Promise<PerformanceTrendsResult>;
|
|
19
|
+
//# sourceMappingURL=performance-trends.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-trends.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/performance-trends.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EACV,uBAAuB,EAGxB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CAiHlC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Trends Analysis (Story 4.4)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes sessions over time to calculate success rates, durations,
|
|
5
|
+
* tool call averages, and error averages, with trend detection.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Analyze performance trends across sessions.
|
|
9
|
+
*/
|
|
10
|
+
export async function analyzePerformance(store, opts = {}) {
|
|
11
|
+
// Query sessions
|
|
12
|
+
const sessionResult = await store.querySessions({
|
|
13
|
+
agentId: opts.agentId,
|
|
14
|
+
from: opts.from,
|
|
15
|
+
to: opts.to,
|
|
16
|
+
limit: 1000,
|
|
17
|
+
});
|
|
18
|
+
// Track whether the query hit its limit (results may be truncated)
|
|
19
|
+
const possiblyTruncated = sessionResult.sessions.length === 1000;
|
|
20
|
+
const sessions = sessionResult.sessions;
|
|
21
|
+
const sessionsAnalyzed = sessions.length;
|
|
22
|
+
// Count events for metadata
|
|
23
|
+
const eventCount = await store.countEvents({
|
|
24
|
+
agentId: opts.agentId,
|
|
25
|
+
from: opts.from,
|
|
26
|
+
to: opts.to,
|
|
27
|
+
});
|
|
28
|
+
const timeRange = {
|
|
29
|
+
from: sessions.length > 0
|
|
30
|
+
? sessions.reduce((min, s) => (s.startedAt < min ? s.startedAt : min), sessions[0].startedAt)
|
|
31
|
+
: (opts.from ?? ''),
|
|
32
|
+
to: sessions.length > 0
|
|
33
|
+
? sessions.reduce((max, s) => (s.startedAt > max ? s.startedAt : max), sessions[0].startedAt)
|
|
34
|
+
: (opts.to ?? ''),
|
|
35
|
+
};
|
|
36
|
+
// Current aggregate metrics
|
|
37
|
+
const successCount = sessions.filter((s) => s.errorCount === 0).length;
|
|
38
|
+
const successRate = sessionsAnalyzed > 0 ? successCount / sessionsAnalyzed : 0;
|
|
39
|
+
const durations = sessions
|
|
40
|
+
.filter((s) => s.endedAt && s.startedAt)
|
|
41
|
+
.map((s) => new Date(s.endedAt).getTime() - new Date(s.startedAt).getTime());
|
|
42
|
+
const avgDuration = durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0;
|
|
43
|
+
const avgToolCalls = sessionsAnalyzed > 0
|
|
44
|
+
? sessions.reduce((sum, s) => sum + s.toolCallCount, 0) / sessionsAnalyzed
|
|
45
|
+
: 0;
|
|
46
|
+
const avgErrors = sessionsAnalyzed > 0
|
|
47
|
+
? sessions.reduce((sum, s) => sum + s.errorCount, 0) / sessionsAnalyzed
|
|
48
|
+
: 0;
|
|
49
|
+
// Bucket by day for trend lines
|
|
50
|
+
const dailyMap = new Map();
|
|
51
|
+
for (const session of sessions) {
|
|
52
|
+
const date = session.startedAt.slice(0, 10); // YYYY-MM-DD
|
|
53
|
+
const entry = dailyMap.get(date) ?? { sessions: [] };
|
|
54
|
+
entry.sessions.push(session);
|
|
55
|
+
dailyMap.set(date, entry);
|
|
56
|
+
}
|
|
57
|
+
const limit = opts.limit ?? 20;
|
|
58
|
+
const allBuckets = Array.from(dailyMap.entries())
|
|
59
|
+
.map(([date, data]) => {
|
|
60
|
+
const daySessions = data.sessions;
|
|
61
|
+
const daySuccess = daySessions.filter((s) => s.errorCount === 0).length;
|
|
62
|
+
const dayDurations = daySessions
|
|
63
|
+
.filter((s) => s.endedAt && s.startedAt)
|
|
64
|
+
.map((s) => new Date(s.endedAt).getTime() - new Date(s.startedAt).getTime());
|
|
65
|
+
return {
|
|
66
|
+
date,
|
|
67
|
+
successRate: daySessions.length > 0 ? daySuccess / daySessions.length : 0,
|
|
68
|
+
duration: dayDurations.length > 0
|
|
69
|
+
? dayDurations.reduce((a, b) => a + b, 0) / dayDurations.length
|
|
70
|
+
: 0,
|
|
71
|
+
toolCalls: daySessions.length > 0
|
|
72
|
+
? daySessions.reduce((sum, s) => sum + s.toolCallCount, 0) / daySessions.length
|
|
73
|
+
: 0,
|
|
74
|
+
errors: daySessions.length > 0
|
|
75
|
+
? daySessions.reduce((sum, s) => sum + s.errorCount, 0) / daySessions.length
|
|
76
|
+
: 0,
|
|
77
|
+
};
|
|
78
|
+
})
|
|
79
|
+
.sort((a, b) => a.date.localeCompare(b.date));
|
|
80
|
+
// Respect limit on trend buckets
|
|
81
|
+
const trends = allBuckets.slice(-limit);
|
|
82
|
+
// Trend assessment: compare recent half vs historical half
|
|
83
|
+
const assessment = detectPerformanceTrend(allBuckets);
|
|
84
|
+
return {
|
|
85
|
+
current: {
|
|
86
|
+
successRate: Math.round(successRate * 10000) / 10000,
|
|
87
|
+
avgDuration: Math.round(avgDuration),
|
|
88
|
+
avgToolCalls: Math.round(avgToolCalls * 100) / 100,
|
|
89
|
+
avgErrors: Math.round(avgErrors * 100) / 100,
|
|
90
|
+
},
|
|
91
|
+
trends,
|
|
92
|
+
assessment,
|
|
93
|
+
metadata: {
|
|
94
|
+
sessionsAnalyzed,
|
|
95
|
+
eventsAnalyzed: eventCount,
|
|
96
|
+
timeRange,
|
|
97
|
+
...(possiblyTruncated ? { truncated: true, note: 'Results may be incomplete — query limit reached' } : {}),
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Detect performance trend by comparing recent vs historical success rates.
|
|
103
|
+
*/
|
|
104
|
+
function detectPerformanceTrend(buckets) {
|
|
105
|
+
if (buckets.length < 2)
|
|
106
|
+
return 'stable';
|
|
107
|
+
const midpoint = Math.floor(buckets.length / 2);
|
|
108
|
+
const recent = buckets.slice(midpoint);
|
|
109
|
+
const historical = buckets.slice(0, midpoint);
|
|
110
|
+
if (historical.length === 0 || recent.length === 0)
|
|
111
|
+
return 'stable';
|
|
112
|
+
const recentAvgSuccess = recent.reduce((s, b) => s + b.successRate, 0) / recent.length;
|
|
113
|
+
const historicalAvgSuccess = historical.reduce((s, b) => s + b.successRate, 0) / historical.length;
|
|
114
|
+
const diff = recentAvgSuccess - historicalAvgSuccess;
|
|
115
|
+
if (diff > 0.05)
|
|
116
|
+
return 'improving';
|
|
117
|
+
if (diff < -0.05)
|
|
118
|
+
return 'degrading';
|
|
119
|
+
return 'stable';
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=performance-trends.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-trends.js","sourceRoot":"","sources":["../../../src/lib/analysis/performance-trends.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Sequence Analysis (Story 4.2)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes tool_call events to extract N-grams (2-grams and 3-grams)
|
|
5
|
+
* of tool sequences per session, and identifies error-prone sequences.
|
|
6
|
+
*/
|
|
7
|
+
import type { IEventStore } from '@agentlensai/core';
|
|
8
|
+
import type { ToolSequenceResult } from '@agentlensai/core';
|
|
9
|
+
export interface ToolSequenceOpts {
|
|
10
|
+
agentId?: string;
|
|
11
|
+
from?: string;
|
|
12
|
+
to?: string;
|
|
13
|
+
limit?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Analyze tool usage sequences across sessions.
|
|
17
|
+
*/
|
|
18
|
+
export declare function analyzeToolSequences(store: IEventStore, opts?: ToolSequenceOpts): Promise<ToolSequenceResult>;
|
|
19
|
+
//# sourceMappingURL=tool-sequences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-sequences.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/tool-sequences.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EACV,kBAAkB,EAGnB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CAmK7B"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Sequence Analysis (Story 4.2)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes tool_call events to extract N-grams (2-grams and 3-grams)
|
|
5
|
+
* of tool sequences per session, and identifies error-prone sequences.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Analyze tool usage sequences across sessions.
|
|
9
|
+
*/
|
|
10
|
+
export async function analyzeToolSequences(store, opts = {}) {
|
|
11
|
+
const limit = opts.limit ?? 20;
|
|
12
|
+
// Query tool_call events
|
|
13
|
+
const toolCallResult = await store.queryEvents({
|
|
14
|
+
agentId: opts.agentId,
|
|
15
|
+
from: opts.from,
|
|
16
|
+
to: opts.to,
|
|
17
|
+
eventType: 'tool_call',
|
|
18
|
+
limit: 1000,
|
|
19
|
+
order: 'asc',
|
|
20
|
+
});
|
|
21
|
+
// Also query tool_error events to identify error-prone sequences
|
|
22
|
+
const toolErrorResult = await store.queryEvents({
|
|
23
|
+
agentId: opts.agentId,
|
|
24
|
+
from: opts.from,
|
|
25
|
+
to: opts.to,
|
|
26
|
+
eventType: 'tool_error',
|
|
27
|
+
limit: 1000,
|
|
28
|
+
order: 'asc',
|
|
29
|
+
});
|
|
30
|
+
// Track whether either query hit its limit (results may be truncated)
|
|
31
|
+
const possiblyTruncated = toolCallResult.events.length === 1000 || toolErrorResult.events.length === 1000;
|
|
32
|
+
const allToolCalls = toolCallResult.events;
|
|
33
|
+
const allToolErrors = toolErrorResult.events;
|
|
34
|
+
const eventsAnalyzed = allToolCalls.length + allToolErrors.length;
|
|
35
|
+
const timeRange = {
|
|
36
|
+
from: allToolCalls.length > 0 ? allToolCalls[0].timestamp : (opts.from ?? ''),
|
|
37
|
+
to: allToolCalls.length > 0 ? allToolCalls[allToolCalls.length - 1].timestamp : (opts.to ?? ''),
|
|
38
|
+
};
|
|
39
|
+
// Group tool_call events by session
|
|
40
|
+
const sessionToolCalls = new Map();
|
|
41
|
+
for (const event of allToolCalls) {
|
|
42
|
+
const list = sessionToolCalls.get(event.sessionId) ?? [];
|
|
43
|
+
list.push(event);
|
|
44
|
+
sessionToolCalls.set(event.sessionId, list);
|
|
45
|
+
}
|
|
46
|
+
// Group tool_error events by session for error-prone detection
|
|
47
|
+
const sessionErrors = new Map();
|
|
48
|
+
for (const event of allToolErrors) {
|
|
49
|
+
const list = sessionErrors.get(event.sessionId) ?? [];
|
|
50
|
+
list.push(event);
|
|
51
|
+
sessionErrors.set(event.sessionId, list);
|
|
52
|
+
}
|
|
53
|
+
// Extract tool names per session (ordered by timestamp)
|
|
54
|
+
const uniqueToolsSet = new Set();
|
|
55
|
+
let totalCalls = 0;
|
|
56
|
+
const sessionToolNames = new Map();
|
|
57
|
+
for (const [sessionId, calls] of sessionToolCalls) {
|
|
58
|
+
const names = calls.map((e) => {
|
|
59
|
+
const p = e.payload;
|
|
60
|
+
const name = String(p.toolName ?? 'unknown');
|
|
61
|
+
uniqueToolsSet.add(name);
|
|
62
|
+
return name;
|
|
63
|
+
});
|
|
64
|
+
sessionToolNames.set(sessionId, names);
|
|
65
|
+
totalCalls += names.length;
|
|
66
|
+
}
|
|
67
|
+
// Extract N-grams and count frequencies
|
|
68
|
+
// key = tools joined by "→", value = { frequency across sessions, set of sessions, errorFollowed count }
|
|
69
|
+
const ngramMap = new Map();
|
|
70
|
+
for (const [sessionId, toolNames] of sessionToolNames) {
|
|
71
|
+
const sessionErrorEvents = sessionErrors.get(sessionId) ?? [];
|
|
72
|
+
// Get the full session timeline for error-proximity checks
|
|
73
|
+
const sessionCalls = sessionToolCalls.get(sessionId) ?? [];
|
|
74
|
+
// Extract 2-grams and 3-grams
|
|
75
|
+
const seenInSession = new Set(); // Avoid counting same ngram twice per session
|
|
76
|
+
for (const n of [2, 3]) {
|
|
77
|
+
for (let i = 0; i <= toolNames.length - n; i++) {
|
|
78
|
+
const ngram = toolNames.slice(i, i + n);
|
|
79
|
+
const key = ngram.join('→');
|
|
80
|
+
if (!seenInSession.has(key)) {
|
|
81
|
+
seenInSession.add(key);
|
|
82
|
+
let entry = ngramMap.get(key);
|
|
83
|
+
if (!entry) {
|
|
84
|
+
entry = { tools: ngram, frequency: 0, sessions: new Set(), errorFollowed: 0 };
|
|
85
|
+
ngramMap.set(key, entry);
|
|
86
|
+
}
|
|
87
|
+
entry.frequency++;
|
|
88
|
+
entry.sessions.add(sessionId);
|
|
89
|
+
}
|
|
90
|
+
// Check if this ngram is followed by an error within 2 events
|
|
91
|
+
// The last event of the ngram is at index i + n - 1 in sessionCalls
|
|
92
|
+
const lastCallInNgram = sessionCalls[i + n - 1];
|
|
93
|
+
if (lastCallInNgram) {
|
|
94
|
+
const isErrorFollowed = sessionErrorEvents.some((errEvt) => {
|
|
95
|
+
// Error must be after the last tool call in ngram
|
|
96
|
+
// and within 2 "event positions" (by timestamp)
|
|
97
|
+
if (errEvt.timestamp < lastCallInNgram.timestamp)
|
|
98
|
+
return false;
|
|
99
|
+
// Count how many tool_call events are between the last ngram call and the error
|
|
100
|
+
const callsAfter = sessionCalls.filter((c) => c.timestamp > lastCallInNgram.timestamp && c.timestamp <= errEvt.timestamp);
|
|
101
|
+
return callsAfter.length <= 2;
|
|
102
|
+
});
|
|
103
|
+
if (isErrorFollowed) {
|
|
104
|
+
// We only count this once per session per ngram for error rate calculation
|
|
105
|
+
// But we need to track total occurrences vs error-followed
|
|
106
|
+
let entry = ngramMap.get(key);
|
|
107
|
+
// Track on first occurrence in session
|
|
108
|
+
if (seenInSession.has(`${key}:error-checked`))
|
|
109
|
+
continue;
|
|
110
|
+
seenInSession.add(`${key}:error-checked`);
|
|
111
|
+
entry.errorFollowed++;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Calculate stats
|
|
118
|
+
const sessionLengths = Array.from(sessionToolNames.values()).map((n) => n.length);
|
|
119
|
+
const avgSequenceLength = sessionLengths.length > 0
|
|
120
|
+
? sessionLengths.reduce((a, b) => a + b, 0) / sessionLengths.length
|
|
121
|
+
: 0;
|
|
122
|
+
// Build sorted results
|
|
123
|
+
const sequences = Array.from(ngramMap.values())
|
|
124
|
+
.map((entry) => ({
|
|
125
|
+
tools: entry.tools,
|
|
126
|
+
frequency: entry.frequency,
|
|
127
|
+
sessions: entry.sessions.size,
|
|
128
|
+
errorRate: entry.sessions.size > 0
|
|
129
|
+
? entry.errorFollowed / entry.sessions.size
|
|
130
|
+
: 0,
|
|
131
|
+
}))
|
|
132
|
+
.sort((a, b) => b.frequency - a.frequency)
|
|
133
|
+
.slice(0, limit);
|
|
134
|
+
return {
|
|
135
|
+
sequences,
|
|
136
|
+
stats: {
|
|
137
|
+
avgSequenceLength: Math.round(avgSequenceLength * 100) / 100,
|
|
138
|
+
uniqueTools: uniqueToolsSet.size,
|
|
139
|
+
totalCalls,
|
|
140
|
+
},
|
|
141
|
+
metadata: {
|
|
142
|
+
eventsAnalyzed,
|
|
143
|
+
timeRange,
|
|
144
|
+
...(possiblyTruncated ? { truncated: true, note: 'Results may be incomplete — query limit reached' } : {}),
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=tool-sequences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-sequences.js","sourceRoot":"","sources":["../../../src/lib/analysis/tool-sequences.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/context/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/context/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
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 type { ContextQuery, ContextResult } from '@agentlensai/core';
|
|
10
|
+
import type { EmbeddingStore } from '../../db/embedding-store.js';
|
|
11
|
+
import type { EmbeddingService } from '../embeddings/index.js';
|
|
12
|
+
import type { SessionSummaryStore } from '../../db/session-summary-store.js';
|
|
13
|
+
import type { LessonStore } from '../../db/lesson-store.js';
|
|
14
|
+
import type { IEventStore } from '@agentlensai/core';
|
|
15
|
+
export declare class ContextRetriever {
|
|
16
|
+
private readonly embeddingStore;
|
|
17
|
+
private readonly embeddingService;
|
|
18
|
+
private readonly sessionSummaryStore;
|
|
19
|
+
private readonly lessonStore;
|
|
20
|
+
private readonly eventStore;
|
|
21
|
+
constructor(embeddingStore: EmbeddingStore | null, embeddingService: EmbeddingService | null, sessionSummaryStore: SessionSummaryStore, lessonStore: LessonStore, eventStore: IEventStore);
|
|
22
|
+
/**
|
|
23
|
+
* Retrieve cross-session context by combining:
|
|
24
|
+
* 1. Semantic search over session summary embeddings
|
|
25
|
+
* 2. Lesson search (semantic or text-based)
|
|
26
|
+
* 3. Key events for matching sessions
|
|
27
|
+
* 4. Ranking by relevance + recency
|
|
28
|
+
*
|
|
29
|
+
* TODO: userId filtering is accepted in the ContextQuery type but not yet
|
|
30
|
+
* implemented. Requires schema changes to associate sessions/events with
|
|
31
|
+
* a userId before we can filter here. Deferred to a future release.
|
|
32
|
+
*/
|
|
33
|
+
retrieve(tenantId: string, query: ContextQuery): Promise<ContextResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Find relevant sessions using semantic search (with text search fallback).
|
|
36
|
+
*/
|
|
37
|
+
private findRelevantSessions;
|
|
38
|
+
/**
|
|
39
|
+
* Filter semantic search results by agentId/userId and rank by relevance + recency.
|
|
40
|
+
*/
|
|
41
|
+
private filterAndRankSessions;
|
|
42
|
+
/**
|
|
43
|
+
* Text search fallback when embeddings are unavailable.
|
|
44
|
+
*/
|
|
45
|
+
private textSearchSessions;
|
|
46
|
+
/**
|
|
47
|
+
* Find relevant lessons using semantic search (with text search fallback).
|
|
48
|
+
*/
|
|
49
|
+
private findRelevantLessons;
|
|
50
|
+
/**
|
|
51
|
+
* Enrich a session result with key events from the timeline.
|
|
52
|
+
*/
|
|
53
|
+
private enrichSessionWithEvents;
|
|
54
|
+
/**
|
|
55
|
+
* Compute a recency boost (0-1) based on how recent the content is.
|
|
56
|
+
* Items from the last 24h get ~1.0, items from 30+ days ago get ~0.0.
|
|
57
|
+
*/
|
|
58
|
+
private computeRecencyBoost;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=retrieval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrieval.d.ts","sourceRoot":"","sources":["../../../src/lib/context/retrieval.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAkD,MAAM,mBAAmB,CAAC;AACrH,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAwB,MAAM,mCAAmC,CAAC;AACnG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AASrD,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAJV,cAAc,EAAE,cAAc,GAAG,IAAI,EACrC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,EACzC,mBAAmB,EAAE,mBAAmB,EACxC,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,WAAW;IAG1C;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAsB7E;;OAEG;YACW,oBAAoB;IA6BlC;;OAEG;YACW,qBAAqB;IAwCnC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;YACW,mBAAmB;IAwDjC;;OAEG;YACW,uBAAuB;IA+CrC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAU5B"}
|