@agentlensai/server 0.13.0 → 0.14.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/app.d.ts +27 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +178 -0
- package/dist/app.js.map +1 -0
- package/dist/config.d.ts +2 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -10
- package/dist/config.js.map +1 -1
- package/dist/health.d.ts +22 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +34 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +17 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -502
- package/dist/index.js.map +1 -1
- package/dist/lib/api-schema.d.ts +126 -0
- package/dist/lib/api-schema.d.ts.map +1 -0
- package/dist/lib/api-schema.js +69 -0
- package/dist/lib/api-schema.js.map +1 -0
- package/dist/lib/api-version.d.ts +21 -0
- package/dist/lib/api-version.d.ts.map +1 -0
- package/dist/lib/api-version.js +36 -0
- package/dist/lib/api-version.js.map +1 -0
- package/dist/lib/lore-client.d.ts +64 -112
- package/dist/lib/lore-client.d.ts.map +1 -1
- package/dist/lib/lore-client.js +120 -155
- package/dist/lib/lore-client.js.map +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +73 -0
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/alerts.d.ts.map +1 -1
- package/dist/routes/alerts.js +13 -36
- package/dist/routes/alerts.js.map +1 -1
- package/dist/routes/analytics.d.ts.map +1 -1
- package/dist/routes/analytics.js +93 -0
- package/dist/routes/analytics.js.map +1 -1
- package/dist/routes/api-version.d.ts +9 -0
- package/dist/routes/api-version.d.ts.map +1 -0
- package/dist/routes/api-version.js +19 -0
- package/dist/routes/api-version.js.map +1 -0
- package/dist/routes/audit-verify.d.ts +3 -2
- package/dist/routes/audit-verify.d.ts.map +1 -1
- package/dist/routes/audit-verify.js +91 -27
- package/dist/routes/audit-verify.js.map +1 -1
- package/dist/routes/cost-budgets.d.ts.map +1 -1
- package/dist/routes/cost-budgets.js +19 -36
- package/dist/routes/cost-budgets.js.map +1 -1
- package/dist/routes/guardrails.d.ts.map +1 -1
- package/dist/routes/guardrails.js +121 -37
- package/dist/routes/guardrails.js.map +1 -1
- package/dist/routes/helpers.d.ts +27 -0
- package/dist/routes/helpers.d.ts.map +1 -0
- package/dist/routes/helpers.js +46 -0
- package/dist/routes/helpers.js.map +1 -0
- package/dist/routes/lore-proxy.d.ts +8 -6
- package/dist/routes/lore-proxy.d.ts.map +1 -1
- package/dist/routes/lore-proxy.js +39 -193
- package/dist/routes/lore-proxy.js.map +1 -1
- package/dist/routes/mcp-policies.d.ts +40 -0
- package/dist/routes/mcp-policies.d.ts.map +1 -0
- package/dist/routes/mcp-policies.js +200 -0
- package/dist/routes/mcp-policies.js.map +1 -0
- package/dist/routes/optimization-advisor.d.ts +13 -0
- package/dist/routes/optimization-advisor.d.ts.map +1 -0
- package/dist/routes/optimization-advisor.js +42 -0
- package/dist/routes/optimization-advisor.js.map +1 -0
- package/dist/routes/recall.d.ts.map +1 -1
- package/dist/routes/recall.js +7 -3
- package/dist/routes/recall.js.map +1 -1
- package/dist/routes/registration.d.ts +27 -0
- package/dist/routes/registration.d.ts.map +1 -0
- package/dist/routes/registration.js +311 -0
- package/dist/routes/registration.js.map +1 -0
- package/dist/routes/replay.d.ts.map +1 -1
- package/dist/routes/replay.js +51 -0
- package/dist/routes/replay.js.map +1 -1
- package/dist/services/optimization-advisor.d.ts +37 -0
- package/dist/services/optimization-advisor.d.ts.map +1 -0
- package/dist/services/optimization-advisor.js +239 -0
- package/dist/services/optimization-advisor.js.map +1 -0
- package/package.json +1 -1
package/dist/lib/lore-client.js
CHANGED
|
@@ -1,34 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Lore Adapter —
|
|
2
|
+
* Lore Read Adapter — read-only HTTP client for Lore v0.5.0 server API.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* - LocalLoreAdapter: delegates to lore-sdk (conditional import)
|
|
4
|
+
* Maps Lore's problem/resolution server model → content-based LoreMemory type.
|
|
5
|
+
* Write operations are handled by Lore's own MCP server/CLI/SDK.
|
|
7
6
|
*/
|
|
8
|
-
/** Map AgentLens lesson format → Lore format */
|
|
9
|
-
function toLoreFormat(data) {
|
|
10
|
-
const { title, content, category, ...rest } = data;
|
|
11
|
-
return {
|
|
12
|
-
...(title !== undefined ? { problem: title } : {}),
|
|
13
|
-
...(content !== undefined ? { resolution: content } : {}),
|
|
14
|
-
...(category !== undefined ? { tags: [category] } : {}),
|
|
15
|
-
...rest,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
/** Map Lore format → AgentLens lesson format */
|
|
19
|
-
function fromLoreFormat(data) {
|
|
20
|
-
if (!data)
|
|
21
|
-
return data;
|
|
22
|
-
const { problem, resolution, tags, reputation_score, quality_signals, ...rest } = data;
|
|
23
|
-
return {
|
|
24
|
-
...(problem !== undefined ? { title: problem } : {}),
|
|
25
|
-
...(resolution !== undefined ? { content: resolution } : {}),
|
|
26
|
-
...(tags?.length ? { category: tags[0] } : {}),
|
|
27
|
-
...(reputation_score !== undefined ? { reputationScore: reputation_score } : {}),
|
|
28
|
-
...(quality_signals !== undefined ? { qualitySignals: quality_signals } : {}),
|
|
29
|
-
...rest,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
7
|
export class LoreError extends Error {
|
|
33
8
|
statusCode;
|
|
34
9
|
constructor(statusCode, message) {
|
|
@@ -37,152 +12,142 @@ export class LoreError extends Error {
|
|
|
37
12
|
this.name = 'LoreError';
|
|
38
13
|
}
|
|
39
14
|
}
|
|
40
|
-
|
|
15
|
+
// ─── Field Mapping ──────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* Map a Lore server lesson response → AgentLens LoreMemory.
|
|
18
|
+
*
|
|
19
|
+
* Follows the same convention as Lore's HttpStore._lesson_to_memory():
|
|
20
|
+
* - `problem` field becomes `content` (the display text)
|
|
21
|
+
* - `meta.type` becomes `type` (memory type discriminator)
|
|
22
|
+
* - If `resolution` differs from `problem`, store in `metadata._resolution`
|
|
23
|
+
*/
|
|
24
|
+
export function fromLoreLesson(data) {
|
|
25
|
+
const meta = { ...(data.meta ?? {}) };
|
|
26
|
+
const type = meta.type ?? 'general';
|
|
27
|
+
delete meta.type;
|
|
28
|
+
const problem = data.problem ?? '';
|
|
29
|
+
const resolution = data.resolution ?? '';
|
|
30
|
+
if (resolution && resolution !== problem) {
|
|
31
|
+
meta._resolution = resolution;
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
id: data.id,
|
|
35
|
+
content: problem,
|
|
36
|
+
type,
|
|
37
|
+
context: data.context ?? null,
|
|
38
|
+
tags: data.tags ?? [],
|
|
39
|
+
confidence: data.confidence ?? 1.0,
|
|
40
|
+
source: data.source ?? null,
|
|
41
|
+
project: data.project ?? null,
|
|
42
|
+
createdAt: data.created_at,
|
|
43
|
+
updatedAt: data.updated_at,
|
|
44
|
+
expiresAt: data.expires_at ?? null,
|
|
45
|
+
upvotes: data.upvotes ?? 0,
|
|
46
|
+
downvotes: data.downvotes ?? 0,
|
|
47
|
+
metadata: Object.keys(meta).length > 0 ? meta : null,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// ─── Adapter ────────────────────────────────────────────────
|
|
51
|
+
export class LoreReadAdapter {
|
|
41
52
|
baseUrl;
|
|
42
53
|
apiKey;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
this.
|
|
54
|
+
timeout;
|
|
55
|
+
constructor(config) {
|
|
56
|
+
this.baseUrl = config.apiUrl.replace(/\/+$/, '');
|
|
57
|
+
this.apiKey = config.apiKey;
|
|
58
|
+
this.timeout = config.timeout ?? 10_000;
|
|
59
|
+
}
|
|
60
|
+
/** Health check — call on startup, non-blocking */
|
|
61
|
+
async checkHealth() {
|
|
62
|
+
try {
|
|
63
|
+
const res = await fetch(`${this.baseUrl}/health`, {
|
|
64
|
+
signal: AbortSignal.timeout(5_000),
|
|
65
|
+
headers: this.headers,
|
|
66
|
+
});
|
|
67
|
+
return res.ok;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** List memories with optional filters */
|
|
74
|
+
async listMemories(query) {
|
|
75
|
+
const params = new URLSearchParams();
|
|
76
|
+
if (query.project)
|
|
77
|
+
params.set('project', query.project);
|
|
78
|
+
if (query.search)
|
|
79
|
+
params.set('query', query.search);
|
|
80
|
+
if (query.limit != null)
|
|
81
|
+
params.set('limit', String(query.limit));
|
|
82
|
+
if (query.offset != null)
|
|
83
|
+
params.set('offset', String(query.offset));
|
|
84
|
+
const qs = params.toString();
|
|
85
|
+
const data = await this.request('GET', `/v1/lessons${qs ? `?${qs}` : ''}`);
|
|
86
|
+
return {
|
|
87
|
+
memories: (data.lessons ?? []).map(fromLoreLesson),
|
|
88
|
+
total: data.total,
|
|
89
|
+
limit: data.limit,
|
|
90
|
+
offset: data.offset,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Get single memory by ID */
|
|
94
|
+
async getMemory(id) {
|
|
95
|
+
try {
|
|
96
|
+
const data = await this.request('GET', `/v1/lessons/${id}`);
|
|
97
|
+
return fromLoreLesson(data);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
if (err instanceof LoreError && err.statusCode === 404)
|
|
101
|
+
return null;
|
|
102
|
+
throw err;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** Get aggregate stats (count by type) */
|
|
106
|
+
async getStats(project) {
|
|
107
|
+
const params = new URLSearchParams({ limit: '200' });
|
|
108
|
+
if (project)
|
|
109
|
+
params.set('project', project);
|
|
110
|
+
const data = await this.request('GET', `/v1/lessons?${params}`);
|
|
111
|
+
const byType = {};
|
|
112
|
+
for (const lesson of data.lessons ?? []) {
|
|
113
|
+
const t = lesson.meta?.type ?? 'general';
|
|
114
|
+
byType[t] = (byType[t] ?? 0) + 1;
|
|
115
|
+
}
|
|
116
|
+
return { total: data.total, byType };
|
|
46
117
|
}
|
|
118
|
+
// --- Private ---
|
|
47
119
|
get headers() {
|
|
48
120
|
return {
|
|
49
121
|
'Content-Type': 'application/json',
|
|
50
122
|
'Authorization': `Bearer ${this.apiKey}`,
|
|
51
123
|
};
|
|
52
124
|
}
|
|
53
|
-
async request(method, path
|
|
125
|
+
async request(method, path) {
|
|
54
126
|
const url = `${this.baseUrl}${path}`;
|
|
55
127
|
const res = await fetch(url, {
|
|
56
128
|
method,
|
|
57
129
|
headers: this.headers,
|
|
58
|
-
|
|
130
|
+
signal: AbortSignal.timeout(this.timeout),
|
|
59
131
|
});
|
|
60
132
|
if (!res.ok) {
|
|
61
133
|
const text = await res.text().catch(() => 'Unknown error');
|
|
62
|
-
throw new LoreError(res.status, `Lore API error: ${text}`);
|
|
134
|
+
throw new LoreError(res.status, `Lore API error (${res.status}): ${text}`);
|
|
63
135
|
}
|
|
64
136
|
return res.json();
|
|
65
137
|
}
|
|
66
|
-
async createLesson(data) {
|
|
67
|
-
const result = await this.request('POST', '/v1/lessons', toLoreFormat(data));
|
|
68
|
-
return fromLoreFormat(result);
|
|
69
|
-
}
|
|
70
|
-
async listLessons(query) {
|
|
71
|
-
const params = new URLSearchParams();
|
|
72
|
-
for (const [k, v] of Object.entries(query)) {
|
|
73
|
-
if (v !== undefined)
|
|
74
|
-
params.set(k, String(v));
|
|
75
|
-
}
|
|
76
|
-
const result = await this.request('GET', `/v1/lessons?${params}`);
|
|
77
|
-
return { ...result, lessons: (result.lessons ?? []).map(fromLoreFormat) };
|
|
78
|
-
}
|
|
79
|
-
async getLesson(id) {
|
|
80
|
-
const result = await this.request('GET', `/v1/lessons/${id}`);
|
|
81
|
-
return fromLoreFormat(result);
|
|
82
|
-
}
|
|
83
|
-
async updateLesson(id, data) {
|
|
84
|
-
const result = await this.request('PUT', `/v1/lessons/${id}`, toLoreFormat(data));
|
|
85
|
-
return fromLoreFormat(result);
|
|
86
|
-
}
|
|
87
|
-
async deleteLesson(id) {
|
|
88
|
-
return this.request('DELETE', `/v1/lessons/${id}`);
|
|
89
|
-
}
|
|
90
|
-
async searchCommunity(query, options) {
|
|
91
|
-
const params = new URLSearchParams();
|
|
92
|
-
if (query)
|
|
93
|
-
params.set('query', query);
|
|
94
|
-
if (options?.category)
|
|
95
|
-
params.set('category', options.category);
|
|
96
|
-
if (options?.limit)
|
|
97
|
-
params.set('limit', String(options.limit));
|
|
98
|
-
if (options?.minReputation !== undefined)
|
|
99
|
-
params.set('minReputation', String(options.minReputation));
|
|
100
|
-
const qs = params.toString();
|
|
101
|
-
const result = await this.request('GET', `/v1/lessons${qs ? `?${qs}` : ''}`);
|
|
102
|
-
return { ...result, lessons: (result.lessons ?? []).map(fromLoreFormat) };
|
|
103
|
-
}
|
|
104
|
-
async rateLesson(id, delta) {
|
|
105
|
-
return this.request('POST', `/v1/lessons/${id}/rate`, { delta });
|
|
106
|
-
}
|
|
107
|
-
async getSharingConfig() {
|
|
108
|
-
return this.request('GET', '/v1/sharing/config');
|
|
109
|
-
}
|
|
110
|
-
async updateSharingConfig(data) {
|
|
111
|
-
return this.request('PUT', '/v1/sharing/config', data);
|
|
112
|
-
}
|
|
113
|
-
async getAgentSharingConfigs() {
|
|
114
|
-
return this.request('GET', '/v1/sharing/agents');
|
|
115
|
-
}
|
|
116
|
-
async updateAgentSharingConfig(agentId, data) {
|
|
117
|
-
return this.request('PUT', `/v1/sharing/agents/${agentId}`, data);
|
|
118
|
-
}
|
|
119
|
-
async getDenyList() {
|
|
120
|
-
return this.request('GET', '/v1/sharing/deny-list');
|
|
121
|
-
}
|
|
122
|
-
async addDenyListRule(data) {
|
|
123
|
-
return this.request('POST', '/v1/sharing/deny-list', data);
|
|
124
|
-
}
|
|
125
|
-
async deleteDenyListRule(id) {
|
|
126
|
-
return this.request('DELETE', `/v1/sharing/deny-list/${id}`);
|
|
127
|
-
}
|
|
128
|
-
async getSharingAuditLog(params) {
|
|
129
|
-
const qs = new URLSearchParams();
|
|
130
|
-
if (params.eventType)
|
|
131
|
-
qs.set('event_type', params.eventType);
|
|
132
|
-
if (params.from)
|
|
133
|
-
qs.set('from', params.from);
|
|
134
|
-
if (params.to)
|
|
135
|
-
qs.set('to', params.to);
|
|
136
|
-
if (params.limit)
|
|
137
|
-
qs.set('limit', String(params.limit));
|
|
138
|
-
return this.request('GET', `/v1/sharing/audit?${qs}`);
|
|
139
|
-
}
|
|
140
|
-
async getSharingStats() {
|
|
141
|
-
return this.request('GET', '/v1/sharing/stats');
|
|
142
|
-
}
|
|
143
|
-
async purgeSharing(confirmation) {
|
|
144
|
-
return this.request('POST', '/v1/sharing/purge', { confirmation });
|
|
145
|
-
}
|
|
146
138
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
async createLesson(data) { return this.sdk.createLesson(data); }
|
|
162
|
-
async listLessons(query) { return this.sdk.listLessons(query); }
|
|
163
|
-
async getLesson(id) { return this.sdk.getLesson(id); }
|
|
164
|
-
async updateLesson(id, data) { return this.sdk.updateLesson(id, data); }
|
|
165
|
-
async deleteLesson(id) { return this.sdk.deleteLesson(id); }
|
|
166
|
-
async searchCommunity(query, options) { return this.sdk.searchCommunity(query, options); }
|
|
167
|
-
async rateLesson(_id, _delta) { throw new Error('Not available in local mode'); }
|
|
168
|
-
async getSharingConfig() { throw new Error('Not available in local mode'); }
|
|
169
|
-
async updateSharingConfig(_data) { throw new Error('Not available in local mode'); }
|
|
170
|
-
async getAgentSharingConfigs() { throw new Error('Not available in local mode'); }
|
|
171
|
-
async updateAgentSharingConfig(_agentId, _data) { throw new Error('Not available in local mode'); }
|
|
172
|
-
async getDenyList() { throw new Error('Not available in local mode'); }
|
|
173
|
-
async addDenyListRule(_data) { throw new Error('Not available in local mode'); }
|
|
174
|
-
async deleteDenyListRule(_id) { throw new Error('Not available in local mode'); }
|
|
175
|
-
async getSharingAuditLog(_params) { throw new Error('Not available in local mode'); }
|
|
176
|
-
async getSharingStats() { throw new Error('Not available in local mode'); }
|
|
177
|
-
async purgeSharing(_confirmation) { throw new Error('Not available in local mode'); }
|
|
178
|
-
}
|
|
179
|
-
/** Factory: create the right adapter based on config */
|
|
180
|
-
export function createLoreAdapter(config) {
|
|
181
|
-
if (config.loreMode === 'remote') {
|
|
182
|
-
if (!config.loreApiUrl)
|
|
183
|
-
throw new Error('LORE_API_URL is required for remote mode');
|
|
184
|
-
return new RemoteLoreAdapter(config.loreApiUrl, config.loreApiKey ?? '');
|
|
185
|
-
}
|
|
186
|
-
return new LocalLoreAdapter(config.loreDbPath ?? './lore.db');
|
|
139
|
+
// ─── Factory ────────────────────────────────────────────────
|
|
140
|
+
/** Create adapter if Lore is configured, else return null */
|
|
141
|
+
export function createLoreAdapter(env) {
|
|
142
|
+
if (!env.loreEnabled)
|
|
143
|
+
return null;
|
|
144
|
+
if (!env.loreApiUrl)
|
|
145
|
+
throw new Error('LORE_API_URL required when LORE_ENABLED=true');
|
|
146
|
+
if (!env.loreApiKey)
|
|
147
|
+
throw new Error('LORE_API_KEY required when LORE_ENABLED=true');
|
|
148
|
+
return new LoreReadAdapter({
|
|
149
|
+
apiUrl: env.loreApiUrl,
|
|
150
|
+
apiKey: env.loreApiKey,
|
|
151
|
+
});
|
|
187
152
|
}
|
|
188
153
|
//# sourceMappingURL=lore-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lore-client.js","sourceRoot":"","sources":["../../src/lib/lore-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lore-client.js","sourceRoot":"","sources":["../../src/lib/lore-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW;eACX,aAAa;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW;eACX,aAAa;0CAsIhD"}
|
package/dist/routes/agents.js
CHANGED
|
@@ -41,6 +41,79 @@ export function agentsRoutes(store) {
|
|
|
41
41
|
const updated = await tenantStore.getAgent(id);
|
|
42
42
|
return c.json(updated);
|
|
43
43
|
});
|
|
44
|
+
/**
|
|
45
|
+
* @summary Get aggregated agent insights (Phase 2 — Feature 7)
|
|
46
|
+
* @param {string} id — Agent name/ID (path)
|
|
47
|
+
* @returns {200} `{ agent, totalSessions, avgScore, toolUsage, delegationCount, recentSessions, healthTrend }`
|
|
48
|
+
* @throws {404} Agent not found
|
|
49
|
+
*/
|
|
50
|
+
app.get('/:id/insights', async (c) => {
|
|
51
|
+
const tenantStore = getTenantStore(store, c);
|
|
52
|
+
const id = c.req.param('id');
|
|
53
|
+
const agent = await tenantStore.getAgent(id);
|
|
54
|
+
if (!agent) {
|
|
55
|
+
return c.json({ error: 'Agent not found', status: 404 }, 404);
|
|
56
|
+
}
|
|
57
|
+
// Fetch recent sessions for this agent
|
|
58
|
+
const sessionsResult = await tenantStore.querySessions({
|
|
59
|
+
agentId: id,
|
|
60
|
+
limit: 20,
|
|
61
|
+
offset: 0,
|
|
62
|
+
});
|
|
63
|
+
const sessions = sessionsResult.sessions ?? [];
|
|
64
|
+
// Compute tool usage distribution and delegation count from events
|
|
65
|
+
const toolUsage = {};
|
|
66
|
+
let totalScore = 0;
|
|
67
|
+
let scoreCount = 0;
|
|
68
|
+
let delegationCount = 0;
|
|
69
|
+
for (const session of sessions) {
|
|
70
|
+
const eventsResult = await tenantStore.queryEvents({
|
|
71
|
+
sessionId: session.id,
|
|
72
|
+
limit: 200,
|
|
73
|
+
offset: 0,
|
|
74
|
+
});
|
|
75
|
+
for (const event of eventsResult.events) {
|
|
76
|
+
if (event.eventType === 'tool_call' || event.eventType === 'tool_response') {
|
|
77
|
+
const toolName = event.payload?.toolName ?? 'unknown';
|
|
78
|
+
toolUsage[toolName] = (toolUsage[toolName] ?? 0) + 1;
|
|
79
|
+
}
|
|
80
|
+
// Extract health scores and delegation counts from custom events
|
|
81
|
+
if (event.eventType === 'custom') {
|
|
82
|
+
const payload = event.payload;
|
|
83
|
+
if (payload?.type === 'health_score' || payload?.type === 'health_check') {
|
|
84
|
+
const score = payload?.score;
|
|
85
|
+
if (typeof score === 'number') {
|
|
86
|
+
totalScore += score;
|
|
87
|
+
scoreCount++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (payload?.type === 'delegation') {
|
|
91
|
+
delegationCount++;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Health trend: last 10 sessions with their timestamps
|
|
97
|
+
const healthTrend = sessions.slice(0, 10).map((s) => ({
|
|
98
|
+
sessionId: s.id,
|
|
99
|
+
startedAt: s.startedAt,
|
|
100
|
+
score: s.healthScore,
|
|
101
|
+
}));
|
|
102
|
+
return c.json({
|
|
103
|
+
agent,
|
|
104
|
+
totalSessions: agent.sessionCount ?? sessions.length,
|
|
105
|
+
avgScore: scoreCount > 0 ? Math.round((totalScore / scoreCount) * 100) / 100 : null,
|
|
106
|
+
toolUsage,
|
|
107
|
+
delegationCount,
|
|
108
|
+
recentSessions: sessions.slice(0, 10).map((s) => ({
|
|
109
|
+
id: s.id,
|
|
110
|
+
startedAt: s.startedAt,
|
|
111
|
+
endedAt: s.endedAt,
|
|
112
|
+
eventCount: s.eventCount,
|
|
113
|
+
})),
|
|
114
|
+
healthTrend,
|
|
115
|
+
});
|
|
116
|
+
});
|
|
44
117
|
// GET /api/agents/:id — single agent
|
|
45
118
|
app.get('/:id', async (c) => {
|
|
46
119
|
const tenantStore = getTenantStore(store, c);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC7C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAgC,CAAC;IAErD,8DAA8D;IAC9D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;QAE9C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7B,sCAAsC;QACtC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,6CAA6C;QAC7C,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,kBAAkB,GAAG,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;QAED,wDAAwD;QACxD,IAAI,cAAc,IAAI,WAAW,IAAI,OAAO,WAAW,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YACpF,MAAO,WAAmF,CAAC,YAAY,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAClI,CAAC;QAED,2BAA2B;QAC3B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,qCAAqC;IACrC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../src/routes/alerts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../src/routes/alerts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW;eACX,aAAa;0CAoHhD"}
|
package/dist/routes/alerts.js
CHANGED
|
@@ -14,27 +14,16 @@ import { ulid } from 'ulid';
|
|
|
14
14
|
import { createAlertRuleSchema, updateAlertRuleSchema } from '@agentlensai/core';
|
|
15
15
|
import { NotFoundError } from '../db/errors.js';
|
|
16
16
|
import { getTenantStore } from './tenant-helper.js';
|
|
17
|
+
import { parseBody, notFound, created } from './helpers.js';
|
|
17
18
|
export function alertsRoutes(store) {
|
|
18
19
|
const app = new Hono();
|
|
19
20
|
// POST /api/alerts/rules — create alert rule
|
|
20
21
|
app.post('/rules', async (c) => {
|
|
21
22
|
const tenantStore = getTenantStore(store, c);
|
|
22
|
-
const
|
|
23
|
-
if (!
|
|
24
|
-
return
|
|
25
|
-
|
|
26
|
-
const parseResult = createAlertRuleSchema.safeParse(rawBody);
|
|
27
|
-
if (!parseResult.success) {
|
|
28
|
-
return c.json({
|
|
29
|
-
error: 'Validation failed',
|
|
30
|
-
status: 400,
|
|
31
|
-
details: parseResult.error.issues.map((issue) => ({
|
|
32
|
-
path: issue.path.map(String).join('.'),
|
|
33
|
-
message: issue.message,
|
|
34
|
-
})),
|
|
35
|
-
}, 400);
|
|
36
|
-
}
|
|
37
|
-
const input = parseResult.data;
|
|
23
|
+
const parsed = await parseBody(c, createAlertRuleSchema);
|
|
24
|
+
if (!parsed.success)
|
|
25
|
+
return parsed.response;
|
|
26
|
+
const input = parsed.data;
|
|
38
27
|
const now = new Date().toISOString();
|
|
39
28
|
const rule = {
|
|
40
29
|
id: ulid(),
|
|
@@ -50,7 +39,7 @@ export function alertsRoutes(store) {
|
|
|
50
39
|
tenantId: getTenantId(c),
|
|
51
40
|
};
|
|
52
41
|
await tenantStore.createAlertRule(rule);
|
|
53
|
-
return c
|
|
42
|
+
return created(c, rule);
|
|
54
43
|
});
|
|
55
44
|
// GET /api/alerts/rules — list all alert rules
|
|
56
45
|
app.get('/rules', async (c) => {
|
|
@@ -64,7 +53,7 @@ export function alertsRoutes(store) {
|
|
|
64
53
|
const id = c.req.param('id');
|
|
65
54
|
const rule = await tenantStore.getAlertRule(id);
|
|
66
55
|
if (!rule) {
|
|
67
|
-
return c
|
|
56
|
+
return notFound(c, 'Alert rule');
|
|
68
57
|
}
|
|
69
58
|
return c.json(rule);
|
|
70
59
|
});
|
|
@@ -72,22 +61,10 @@ export function alertsRoutes(store) {
|
|
|
72
61
|
app.put('/rules/:id', async (c) => {
|
|
73
62
|
const tenantStore = getTenantStore(store, c);
|
|
74
63
|
const id = c.req.param('id');
|
|
75
|
-
const
|
|
76
|
-
if (!
|
|
77
|
-
return
|
|
78
|
-
|
|
79
|
-
const parseResult = updateAlertRuleSchema.safeParse(rawBody);
|
|
80
|
-
if (!parseResult.success) {
|
|
81
|
-
return c.json({
|
|
82
|
-
error: 'Validation failed',
|
|
83
|
-
status: 400,
|
|
84
|
-
details: parseResult.error.issues.map((issue) => ({
|
|
85
|
-
path: issue.path.map(String).join('.'),
|
|
86
|
-
message: issue.message,
|
|
87
|
-
})),
|
|
88
|
-
}, 400);
|
|
89
|
-
}
|
|
90
|
-
const updates = parseResult.data;
|
|
64
|
+
const parsed = await parseBody(c, updateAlertRuleSchema);
|
|
65
|
+
if (!parsed.success)
|
|
66
|
+
return parsed.response;
|
|
67
|
+
const updates = parsed.data;
|
|
91
68
|
try {
|
|
92
69
|
await tenantStore.updateAlertRule(id, {
|
|
93
70
|
...updates,
|
|
@@ -96,7 +73,7 @@ export function alertsRoutes(store) {
|
|
|
96
73
|
}
|
|
97
74
|
catch (err) {
|
|
98
75
|
if (err instanceof NotFoundError) {
|
|
99
|
-
return c
|
|
76
|
+
return notFound(c, 'Alert rule');
|
|
100
77
|
}
|
|
101
78
|
throw err;
|
|
102
79
|
}
|
|
@@ -112,7 +89,7 @@ export function alertsRoutes(store) {
|
|
|
112
89
|
}
|
|
113
90
|
catch (err) {
|
|
114
91
|
if (err instanceof NotFoundError) {
|
|
115
|
-
return c
|
|
92
|
+
return notFound(c, 'Alert rule');
|
|
116
93
|
}
|
|
117
94
|
throw err;
|
|
118
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../src/routes/alerts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAIjF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../src/routes/alerts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AA+D/D,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,UAAU;eAC/C,aAAa;
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AA+D/D,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,UAAU;eAC/C,aAAa;0CA6hBhD"}
|