@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
package/dist/lib/alert-engine.js
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* 4. Logs to console
|
|
10
10
|
*/
|
|
11
11
|
import { ulid } from 'ulid';
|
|
12
|
+
import { SqliteEventStore } from '../db/sqlite-store.js';
|
|
13
|
+
import { TenantScopedStore } from '../db/tenant-scoped-store.js';
|
|
12
14
|
import { eventBus } from './event-bus.js';
|
|
13
15
|
/** Default evaluation interval: 60 seconds */
|
|
14
16
|
const DEFAULT_CHECK_INTERVAL_MS = 60_000;
|
|
@@ -93,37 +95,75 @@ export class AlertEngine {
|
|
|
93
95
|
console.log('[AlertEngine] Stopped');
|
|
94
96
|
}
|
|
95
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Get a tenant-scoped store for a given rule.
|
|
100
|
+
* If the underlying store is SqliteEventStore and the rule has a tenantId,
|
|
101
|
+
* returns a TenantScopedStore. Otherwise returns the original store.
|
|
102
|
+
*/
|
|
103
|
+
getTenantStore(rule) {
|
|
104
|
+
const tenantId = rule.tenantId ?? 'default';
|
|
105
|
+
if (this.store instanceof SqliteEventStore) {
|
|
106
|
+
return new TenantScopedStore(this.store, tenantId);
|
|
107
|
+
}
|
|
108
|
+
return this.store;
|
|
109
|
+
}
|
|
96
110
|
/**
|
|
97
111
|
* Run a single evaluation cycle (can also be called manually / from tests).
|
|
112
|
+
*
|
|
113
|
+
* Rules are grouped by tenantId so every operation — listing rules,
|
|
114
|
+
* querying analytics, deduplication, and history insertion — goes
|
|
115
|
+
* through a tenant-scoped store. This prevents any cross-tenant
|
|
116
|
+
* data leakage during alert evaluation.
|
|
98
117
|
*/
|
|
99
118
|
async evaluate() {
|
|
100
119
|
if (this.running)
|
|
101
120
|
return [];
|
|
102
121
|
this.running = true;
|
|
103
122
|
try {
|
|
104
|
-
|
|
105
|
-
|
|
123
|
+
// NOTE (E1-H3): This intentionally calls listAlertRules() without a tenantId
|
|
124
|
+
// to fetch rules across ALL tenants. The alert engine is a system-level service
|
|
125
|
+
// that evaluates every tenant's rules, then scopes all subsequent reads/writes
|
|
126
|
+
// through per-tenant TenantScopedStore instances (see grouping below).
|
|
127
|
+
// This is the only place where cross-tenant global access is expected.
|
|
128
|
+
const allRules = await this.store.listAlertRules();
|
|
129
|
+
const rulesByTenant = new Map();
|
|
130
|
+
for (const rule of allRules) {
|
|
131
|
+
const tid = rule.tenantId ?? 'default';
|
|
132
|
+
let bucket = rulesByTenant.get(tid);
|
|
133
|
+
if (!bucket) {
|
|
134
|
+
bucket = [];
|
|
135
|
+
rulesByTenant.set(tid, bucket);
|
|
136
|
+
}
|
|
137
|
+
bucket.push(rule);
|
|
138
|
+
}
|
|
106
139
|
const triggered = [];
|
|
107
|
-
for (const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
140
|
+
for (const [tenantId, tenantRules] of rulesByTenant) {
|
|
141
|
+
// Build a single tenant-scoped store per tenant
|
|
142
|
+
const tenantStore = this.store instanceof SqliteEventStore
|
|
143
|
+
? new TenantScopedStore(this.store, tenantId)
|
|
144
|
+
: this.store;
|
|
145
|
+
const enabledRules = tenantRules.filter((r) => r.enabled);
|
|
146
|
+
for (const rule of enabledRules) {
|
|
147
|
+
try {
|
|
148
|
+
const currentValue = await this.computeCurrentValue(rule, tenantStore);
|
|
149
|
+
const shouldTrigger = this.checkCondition(rule.condition, currentValue, rule.threshold);
|
|
150
|
+
if (shouldTrigger) {
|
|
151
|
+
// M1 fix: Deduplication — skip if the rule already triggered within its window
|
|
152
|
+
const recentHistory = await tenantStore.listAlertHistory({ ruleId: rule.id, limit: 1 });
|
|
153
|
+
if (recentHistory.entries.length > 0) {
|
|
154
|
+
const lastTrigger = new Date(recentHistory.entries[0].triggeredAt).getTime();
|
|
155
|
+
const cooldownMs = rule.windowMinutes * 60_000;
|
|
156
|
+
if (Date.now() - lastTrigger < cooldownMs) {
|
|
157
|
+
continue; // Still within cooldown period
|
|
158
|
+
}
|
|
119
159
|
}
|
|
160
|
+
const entry = await this.triggerAlert(rule, currentValue, tenantStore);
|
|
161
|
+
triggered.push(entry);
|
|
120
162
|
}
|
|
121
|
-
const entry = await this.triggerAlert(rule, currentValue);
|
|
122
|
-
triggered.push(entry);
|
|
123
163
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
164
|
+
catch (err) {
|
|
165
|
+
console.error(`[AlertEngine] Error evaluating rule "${rule.name}" (${rule.id}):`, err);
|
|
166
|
+
}
|
|
127
167
|
}
|
|
128
168
|
}
|
|
129
169
|
return triggered;
|
|
@@ -135,12 +175,12 @@ export class AlertEngine {
|
|
|
135
175
|
/**
|
|
136
176
|
* Compute the current metric value for a rule by querying analytics.
|
|
137
177
|
*/
|
|
138
|
-
async computeCurrentValue(rule) {
|
|
178
|
+
async computeCurrentValue(rule, tenantStore) {
|
|
139
179
|
const now = new Date();
|
|
140
180
|
const windowStart = new Date(now.getTime() - rule.windowMinutes * 60_000);
|
|
141
181
|
const from = windowStart.toISOString();
|
|
142
182
|
const to = now.toISOString();
|
|
143
|
-
const analytics = await
|
|
183
|
+
const analytics = await tenantStore.getAnalytics({
|
|
144
184
|
from,
|
|
145
185
|
to,
|
|
146
186
|
agentId: rule.scope.agentId,
|
|
@@ -192,7 +232,7 @@ export class AlertEngine {
|
|
|
192
232
|
/**
|
|
193
233
|
* Trigger an alert: persist history, deliver webhooks, emit on EventBus.
|
|
194
234
|
*/
|
|
195
|
-
async triggerAlert(rule, currentValue) {
|
|
235
|
+
async triggerAlert(rule, currentValue, tenantStore) {
|
|
196
236
|
const now = new Date().toISOString();
|
|
197
237
|
const message = this.buildMessage(rule, currentValue);
|
|
198
238
|
const entry = {
|
|
@@ -202,9 +242,10 @@ export class AlertEngine {
|
|
|
202
242
|
currentValue,
|
|
203
243
|
threshold: rule.threshold,
|
|
204
244
|
message,
|
|
245
|
+
tenantId: rule.tenantId,
|
|
205
246
|
};
|
|
206
|
-
// 1. Persist to alert history
|
|
207
|
-
await
|
|
247
|
+
// 1. Persist to alert history (via tenant-scoped store)
|
|
248
|
+
await tenantStore.insertAlertHistory(entry);
|
|
208
249
|
// 2. Console log
|
|
209
250
|
console.log(`[AlertEngine] 🔔 Alert triggered: "${rule.name}" — ${message}`);
|
|
210
251
|
// 3. Emit on EventBus (Story 12.5)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert-engine.js","sourceRoot":"","sources":["../../src/lib/alert-engine.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"alert-engine.js","sourceRoot":"","sources":["../../src/lib/alert-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost Analysis (Story 4.3)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes cost data from sessions and llm_response events to provide
|
|
5
|
+
* cost breakdowns by model, agent, and time trends.
|
|
6
|
+
*/
|
|
7
|
+
import type { IEventStore } from '@agentlensai/core';
|
|
8
|
+
import type { CostAnalysisResult } from '@agentlensai/core';
|
|
9
|
+
export interface CostAnalysisOpts {
|
|
10
|
+
agentId?: string;
|
|
11
|
+
from?: string;
|
|
12
|
+
to?: string;
|
|
13
|
+
model?: string;
|
|
14
|
+
limit?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Analyze costs across sessions and LLM calls.
|
|
18
|
+
*/
|
|
19
|
+
export declare function analyzeCosts(store: IEventStore, opts?: CostAnalysisOpts): Promise<CostAnalysisResult>;
|
|
20
|
+
//# sourceMappingURL=cost-analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-analysis.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/cost-analysis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EACV,kBAAkB,EAKnB,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;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CAoJ7B"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost Analysis (Story 4.3)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes cost data from sessions and llm_response events to provide
|
|
5
|
+
* cost breakdowns by model, agent, and time trends.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Analyze costs across sessions and LLM calls.
|
|
9
|
+
*/
|
|
10
|
+
export async function analyzeCosts(store, opts = {}) {
|
|
11
|
+
const limit = opts.limit ?? 20;
|
|
12
|
+
// Query sessions with cost data
|
|
13
|
+
const sessionResult = await store.querySessions({
|
|
14
|
+
agentId: opts.agentId,
|
|
15
|
+
from: opts.from,
|
|
16
|
+
to: opts.to,
|
|
17
|
+
limit: 1000,
|
|
18
|
+
});
|
|
19
|
+
// Query llm_response events for model breakdown
|
|
20
|
+
const llmResult = await store.queryEvents({
|
|
21
|
+
agentId: opts.agentId,
|
|
22
|
+
from: opts.from,
|
|
23
|
+
to: opts.to,
|
|
24
|
+
eventType: 'llm_response',
|
|
25
|
+
limit: 1000,
|
|
26
|
+
order: 'asc',
|
|
27
|
+
});
|
|
28
|
+
// Track whether either query hit its limit (results may be truncated)
|
|
29
|
+
const possiblyTruncated = sessionResult.sessions.length === 1000 || llmResult.events.length === 1000;
|
|
30
|
+
const sessions = sessionResult.sessions;
|
|
31
|
+
const llmEvents = llmResult.events;
|
|
32
|
+
// Filter llm events by model if specified
|
|
33
|
+
const filteredLlmEvents = opts.model
|
|
34
|
+
? llmEvents.filter((e) => {
|
|
35
|
+
const p = e.payload;
|
|
36
|
+
return p.model === opts.model;
|
|
37
|
+
})
|
|
38
|
+
: llmEvents;
|
|
39
|
+
const eventsAnalyzed = filteredLlmEvents.length;
|
|
40
|
+
const timeRange = {
|
|
41
|
+
from: sessions.length > 0
|
|
42
|
+
? sessions.reduce((min, s) => (s.startedAt < min ? s.startedAt : min), sessions[0].startedAt)
|
|
43
|
+
: (opts.from ?? ''),
|
|
44
|
+
to: sessions.length > 0
|
|
45
|
+
? sessions.reduce((max, s) => (s.startedAt > max ? s.startedAt : max), sessions[0].startedAt)
|
|
46
|
+
: (opts.to ?? ''),
|
|
47
|
+
};
|
|
48
|
+
// Summary from sessions
|
|
49
|
+
const totalCost = sessions.reduce((sum, s) => sum + s.totalCostUsd, 0);
|
|
50
|
+
const totalSessions = sessions.length;
|
|
51
|
+
const avgPerSession = totalSessions > 0 ? totalCost / totalSessions : 0;
|
|
52
|
+
// Cost by model from llm_response events
|
|
53
|
+
const modelMap = new Map();
|
|
54
|
+
for (const event of filteredLlmEvents) {
|
|
55
|
+
const p = event.payload;
|
|
56
|
+
const model = p.model ?? 'unknown';
|
|
57
|
+
const cost = p.costUsd ?? 0;
|
|
58
|
+
const entry = modelMap.get(model) ?? { totalCost: 0, callCount: 0 };
|
|
59
|
+
entry.totalCost += cost;
|
|
60
|
+
entry.callCount++;
|
|
61
|
+
modelMap.set(model, entry);
|
|
62
|
+
}
|
|
63
|
+
const byModel = Array.from(modelMap.entries())
|
|
64
|
+
.map(([model, data]) => ({
|
|
65
|
+
model,
|
|
66
|
+
totalCost: Math.round(data.totalCost * 1_000_000) / 1_000_000,
|
|
67
|
+
callCount: data.callCount,
|
|
68
|
+
avgCostPerCall: data.callCount > 0
|
|
69
|
+
? Math.round((data.totalCost / data.callCount) * 1_000_000) / 1_000_000
|
|
70
|
+
: 0,
|
|
71
|
+
}))
|
|
72
|
+
.sort((a, b) => b.totalCost - a.totalCost);
|
|
73
|
+
// Cost by agent from sessions
|
|
74
|
+
const agentMap = new Map();
|
|
75
|
+
for (const session of sessions) {
|
|
76
|
+
const entry = agentMap.get(session.agentId) ?? { totalCost: 0, sessionCount: 0 };
|
|
77
|
+
entry.totalCost += session.totalCostUsd;
|
|
78
|
+
entry.sessionCount++;
|
|
79
|
+
agentMap.set(session.agentId, entry);
|
|
80
|
+
}
|
|
81
|
+
const byAgent = Array.from(agentMap.entries())
|
|
82
|
+
.map(([agentId, data]) => ({
|
|
83
|
+
agentId,
|
|
84
|
+
totalCost: Math.round(data.totalCost * 1_000_000) / 1_000_000,
|
|
85
|
+
sessionCount: data.sessionCount,
|
|
86
|
+
avgCostPerSession: data.sessionCount > 0
|
|
87
|
+
? Math.round((data.totalCost / data.sessionCount) * 1_000_000) / 1_000_000
|
|
88
|
+
: 0,
|
|
89
|
+
}))
|
|
90
|
+
.sort((a, b) => b.totalCost - a.totalCost);
|
|
91
|
+
// Cost trend over time (daily buckets)
|
|
92
|
+
const dailyMap = new Map();
|
|
93
|
+
for (const session of sessions) {
|
|
94
|
+
const date = session.startedAt.slice(0, 10); // YYYY-MM-DD
|
|
95
|
+
const entry = dailyMap.get(date) ?? { totalCost: 0, sessionCount: 0 };
|
|
96
|
+
entry.totalCost += session.totalCostUsd;
|
|
97
|
+
entry.sessionCount++;
|
|
98
|
+
dailyMap.set(date, entry);
|
|
99
|
+
}
|
|
100
|
+
const buckets = Array.from(dailyMap.entries())
|
|
101
|
+
.map(([date, data]) => ({
|
|
102
|
+
date,
|
|
103
|
+
totalCost: Math.round(data.totalCost * 1_000_000) / 1_000_000,
|
|
104
|
+
sessionCount: data.sessionCount,
|
|
105
|
+
}))
|
|
106
|
+
.sort((a, b) => a.date.localeCompare(b.date));
|
|
107
|
+
// Trend detection: compare last 7 days vs previous 7 days
|
|
108
|
+
const direction = detectCostTrend(buckets);
|
|
109
|
+
// Top sessions by cost
|
|
110
|
+
const topSessions = [...sessions]
|
|
111
|
+
.sort((a, b) => b.totalCostUsd - a.totalCostUsd)
|
|
112
|
+
.slice(0, limit)
|
|
113
|
+
.map((s) => ({
|
|
114
|
+
sessionId: s.id,
|
|
115
|
+
agentId: s.agentId,
|
|
116
|
+
totalCost: Math.round(s.totalCostUsd * 1_000_000) / 1_000_000,
|
|
117
|
+
startedAt: s.startedAt,
|
|
118
|
+
}));
|
|
119
|
+
return {
|
|
120
|
+
summary: {
|
|
121
|
+
totalCost: Math.round(totalCost * 1_000_000) / 1_000_000,
|
|
122
|
+
avgPerSession: Math.round(avgPerSession * 1_000_000) / 1_000_000,
|
|
123
|
+
totalSessions,
|
|
124
|
+
},
|
|
125
|
+
byModel,
|
|
126
|
+
byAgent,
|
|
127
|
+
trend: {
|
|
128
|
+
direction,
|
|
129
|
+
buckets,
|
|
130
|
+
},
|
|
131
|
+
topSessions,
|
|
132
|
+
metadata: {
|
|
133
|
+
eventsAnalyzed,
|
|
134
|
+
timeRange,
|
|
135
|
+
...(possiblyTruncated ? { truncated: true, note: 'Results may be incomplete — query limit reached' } : {}),
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Detect cost trend by comparing the most recent 7 day-buckets vs the previous 7.
|
|
141
|
+
*/
|
|
142
|
+
function detectCostTrend(buckets) {
|
|
143
|
+
if (buckets.length < 2)
|
|
144
|
+
return 'stable';
|
|
145
|
+
const recent = buckets.slice(-7);
|
|
146
|
+
const previous = buckets.slice(-14, -7);
|
|
147
|
+
if (previous.length === 0)
|
|
148
|
+
return 'stable';
|
|
149
|
+
const recentTotal = recent.reduce((s, b) => s + b.totalCost, 0);
|
|
150
|
+
const previousTotal = previous.reduce((s, b) => s + b.totalCost, 0);
|
|
151
|
+
if (previousTotal === 0) {
|
|
152
|
+
return recentTotal > 0 ? 'increasing' : 'stable';
|
|
153
|
+
}
|
|
154
|
+
const changeRatio = (recentTotal - previousTotal) / previousTotal;
|
|
155
|
+
if (changeRatio > 0.1)
|
|
156
|
+
return 'increasing';
|
|
157
|
+
if (changeRatio < -0.1)
|
|
158
|
+
return 'decreasing';
|
|
159
|
+
return 'stable';
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=cost-analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-analysis.js","sourceRoot":"","sources":["../../../src/lib/analysis/cost-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Pattern Analysis (Story 4.1)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes tool_error events and error/critical severity events to find
|
|
5
|
+
* recurring error patterns, grouping by normalized message.
|
|
6
|
+
*/
|
|
7
|
+
import type { IEventStore } from '@agentlensai/core';
|
|
8
|
+
import type { ErrorPatternResult } from '@agentlensai/core';
|
|
9
|
+
export interface ErrorPatternOpts {
|
|
10
|
+
agentId?: string;
|
|
11
|
+
from?: string;
|
|
12
|
+
to?: string;
|
|
13
|
+
limit?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Normalize an error message for grouping:
|
|
17
|
+
* - Replace UUIDs with <UUID>
|
|
18
|
+
* - Replace file paths with <PATH>
|
|
19
|
+
* - Replace numbers with <N>
|
|
20
|
+
*/
|
|
21
|
+
export declare function normalizeErrorMessage(msg: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Analyze error patterns from the event store.
|
|
24
|
+
*/
|
|
25
|
+
export declare function analyzeErrorPatterns(store: IEventStore, opts?: ErrorPatternOpts): Promise<ErrorPatternResult>;
|
|
26
|
+
//# sourceMappingURL=error-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-patterns.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/error-patterns.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;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQzD;AAgBD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CAiI7B"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Pattern Analysis (Story 4.1)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes tool_error events and error/critical severity events to find
|
|
5
|
+
* recurring error patterns, grouping by normalized message.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Normalize an error message for grouping:
|
|
9
|
+
* - Replace UUIDs with <UUID>
|
|
10
|
+
* - Replace file paths with <PATH>
|
|
11
|
+
* - Replace numbers with <N>
|
|
12
|
+
*/
|
|
13
|
+
export function normalizeErrorMessage(msg) {
|
|
14
|
+
return msg
|
|
15
|
+
// UUIDs: 8-4-4-4-12 hex pattern
|
|
16
|
+
.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, '<UUID>')
|
|
17
|
+
// File paths: /foo/bar/baz.ts etc.
|
|
18
|
+
.replace(/\/[\w\/.\-]+/g, '<PATH>')
|
|
19
|
+
// Numbers (standalone or in context)
|
|
20
|
+
.replace(/\d+/g, '<N>');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Extract error message from an event payload.
|
|
24
|
+
*/
|
|
25
|
+
function getErrorMessage(event) {
|
|
26
|
+
const payload = event.payload;
|
|
27
|
+
if (event.eventType === 'tool_error') {
|
|
28
|
+
return String(payload.error ?? 'Unknown error');
|
|
29
|
+
}
|
|
30
|
+
// For other error/critical severity events, try to extract a message
|
|
31
|
+
return String(payload.error ?? payload.message ?? payload.reason ?? JSON.stringify(payload));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Analyze error patterns from the event store.
|
|
35
|
+
*/
|
|
36
|
+
export async function analyzeErrorPatterns(store, opts = {}) {
|
|
37
|
+
const limit = opts.limit ?? 20;
|
|
38
|
+
// Query error events: tool_error events + error/critical severity events
|
|
39
|
+
// We query tool_error events first
|
|
40
|
+
const toolErrorResult = await store.queryEvents({
|
|
41
|
+
agentId: opts.agentId,
|
|
42
|
+
from: opts.from,
|
|
43
|
+
to: opts.to,
|
|
44
|
+
eventType: 'tool_error',
|
|
45
|
+
limit: 1000,
|
|
46
|
+
order: 'asc',
|
|
47
|
+
});
|
|
48
|
+
// Then query error/critical severity events
|
|
49
|
+
const severityErrorResult = await store.queryEvents({
|
|
50
|
+
agentId: opts.agentId,
|
|
51
|
+
from: opts.from,
|
|
52
|
+
to: opts.to,
|
|
53
|
+
severity: ['error', 'critical'],
|
|
54
|
+
limit: 1000,
|
|
55
|
+
order: 'asc',
|
|
56
|
+
});
|
|
57
|
+
// Track whether either query hit its limit (results may be truncated)
|
|
58
|
+
const possiblyTruncated = toolErrorResult.events.length === 1000 || severityErrorResult.events.length === 1000;
|
|
59
|
+
// Merge and deduplicate by event ID
|
|
60
|
+
const seenIds = new Set();
|
|
61
|
+
const allErrors = [];
|
|
62
|
+
for (const event of [...toolErrorResult.events, ...severityErrorResult.events]) {
|
|
63
|
+
if (!seenIds.has(event.id)) {
|
|
64
|
+
seenIds.add(event.id);
|
|
65
|
+
allErrors.push(event);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Sort by timestamp ascending
|
|
69
|
+
allErrors.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
|
|
70
|
+
const eventsAnalyzed = allErrors.length;
|
|
71
|
+
const timeRange = {
|
|
72
|
+
from: allErrors.length > 0 ? allErrors[0].timestamp : (opts.from ?? ''),
|
|
73
|
+
to: allErrors.length > 0 ? allErrors[allErrors.length - 1].timestamp : (opts.to ?? ''),
|
|
74
|
+
};
|
|
75
|
+
// Group by normalized error message pattern
|
|
76
|
+
const patternMap = new Map();
|
|
77
|
+
// To find preceding tools, we need session timelines.
|
|
78
|
+
// Cache session events to avoid repeated queries.
|
|
79
|
+
const sessionEventsCache = new Map();
|
|
80
|
+
for (const event of allErrors) {
|
|
81
|
+
const msg = getErrorMessage(event);
|
|
82
|
+
const pattern = normalizeErrorMessage(msg);
|
|
83
|
+
let entry = patternMap.get(pattern);
|
|
84
|
+
if (!entry) {
|
|
85
|
+
entry = {
|
|
86
|
+
count: 0,
|
|
87
|
+
firstSeen: event.timestamp,
|
|
88
|
+
lastSeen: event.timestamp,
|
|
89
|
+
sessions: new Set(),
|
|
90
|
+
precedingTools: [],
|
|
91
|
+
};
|
|
92
|
+
patternMap.set(pattern, entry);
|
|
93
|
+
}
|
|
94
|
+
entry.count++;
|
|
95
|
+
if (event.timestamp < entry.firstSeen)
|
|
96
|
+
entry.firstSeen = event.timestamp;
|
|
97
|
+
if (event.timestamp > entry.lastSeen)
|
|
98
|
+
entry.lastSeen = event.timestamp;
|
|
99
|
+
entry.sessions.add(event.sessionId);
|
|
100
|
+
// Get preceding tool calls (last 3 tool_call events before this error in the session)
|
|
101
|
+
let sessionEvents = sessionEventsCache.get(event.sessionId);
|
|
102
|
+
if (!sessionEvents) {
|
|
103
|
+
sessionEvents = await store.getSessionTimeline(event.sessionId);
|
|
104
|
+
sessionEventsCache.set(event.sessionId, sessionEvents);
|
|
105
|
+
}
|
|
106
|
+
const eventIdx = sessionEvents.findIndex((e) => e.id === event.id);
|
|
107
|
+
if (eventIdx > 0) {
|
|
108
|
+
const preceding = [];
|
|
109
|
+
for (let i = eventIdx - 1; i >= 0 && preceding.length < 3; i--) {
|
|
110
|
+
const prev = sessionEvents[i];
|
|
111
|
+
if (prev.eventType === 'tool_call') {
|
|
112
|
+
const p = prev.payload;
|
|
113
|
+
preceding.unshift(String(p.toolName ?? 'unknown'));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (preceding.length > 0) {
|
|
117
|
+
entry.precedingTools.push(preceding);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Build result sorted by frequency descending
|
|
122
|
+
const patterns = Array.from(patternMap.entries())
|
|
123
|
+
.map(([pattern, entry]) => ({
|
|
124
|
+
pattern,
|
|
125
|
+
count: entry.count,
|
|
126
|
+
firstSeen: entry.firstSeen,
|
|
127
|
+
lastSeen: entry.lastSeen,
|
|
128
|
+
affectedSessions: Array.from(entry.sessions),
|
|
129
|
+
// Deduplicate preceding tool sequences
|
|
130
|
+
precedingTools: deduplicateSequences(entry.precedingTools),
|
|
131
|
+
}))
|
|
132
|
+
.sort((a, b) => b.count - a.count)
|
|
133
|
+
.slice(0, limit);
|
|
134
|
+
return {
|
|
135
|
+
patterns,
|
|
136
|
+
metadata: {
|
|
137
|
+
eventsAnalyzed,
|
|
138
|
+
timeRange,
|
|
139
|
+
...(possiblyTruncated ? { truncated: true, note: 'Results may be incomplete — query limit reached' } : {}),
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Deduplicate tool sequences by stringified form, keeping unique ones.
|
|
145
|
+
*/
|
|
146
|
+
function deduplicateSequences(sequences) {
|
|
147
|
+
const seen = new Set();
|
|
148
|
+
const result = [];
|
|
149
|
+
for (const seq of sequences) {
|
|
150
|
+
const key = seq.join('→');
|
|
151
|
+
if (!seen.has(key)) {
|
|
152
|
+
seen.add(key);
|
|
153
|
+
result.push(seq);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=error-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-patterns.js","sourceRoot":"","sources":["../../../src/lib/analysis/error-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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 type { IEventStore, ReflectResult } from '@agentlensai/core';
|
|
8
|
+
export interface AnalysisOpts {
|
|
9
|
+
agentId?: string;
|
|
10
|
+
from?: string;
|
|
11
|
+
to?: string;
|
|
12
|
+
limit?: number;
|
|
13
|
+
params?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Run an analysis by type string and return a unified ReflectResult.
|
|
17
|
+
*/
|
|
18
|
+
export declare function runAnalysis(analysis: string, store: IEventStore, opts?: AnalysisOpts): Promise<ReflectResult>;
|
|
19
|
+
export { analyzeErrorPatterns } from './error-patterns.js';
|
|
20
|
+
export { analyzeToolSequences } from './tool-sequences.js';
|
|
21
|
+
export { analyzeCosts } from './cost-analysis.js';
|
|
22
|
+
export { analyzePerformance } from './performance-trends.js';
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAmC,MAAM,mBAAmB,CAAC;AAMrG,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,aAAa,CAAC,CAaxB;AA+ID,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
|