@jungjaehoon/mama-os 0.18.2 → 0.19.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/agent/agent-loop.d.ts +25 -0
- package/dist/agent/agent-loop.d.ts.map +1 -1
- package/dist/agent/agent-loop.js +67 -14
- package/dist/agent/agent-loop.js.map +1 -1
- package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
- package/dist/agent/code-act/host-bridge.js +98 -0
- package/dist/agent/code-act/host-bridge.js.map +1 -1
- package/dist/agent/code-act/type-definition-generator.d.ts.map +1 -1
- package/dist/agent/code-act/type-definition-generator.js +0 -1
- package/dist/agent/code-act/type-definition-generator.js.map +1 -1
- package/dist/agent/gateway-tool-executor.d.ts +36 -1
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
- package/dist/agent/gateway-tool-executor.js +938 -54
- package/dist/agent/gateway-tool-executor.js.map +1 -1
- package/dist/agent/gateway-tools.md +9 -0
- package/dist/agent/managed-agent-runtime-sync.d.ts +36 -0
- package/dist/agent/managed-agent-runtime-sync.d.ts.map +1 -0
- package/dist/agent/managed-agent-runtime-sync.js +207 -0
- package/dist/agent/managed-agent-runtime-sync.js.map +1 -0
- package/dist/agent/managed-agent-validation.d.ts +4 -0
- package/dist/agent/managed-agent-validation.d.ts.map +1 -0
- package/dist/agent/managed-agent-validation.js +84 -0
- package/dist/agent/managed-agent-validation.js.map +1 -0
- package/dist/agent/os-agent-capabilities.md +400 -0
- package/dist/agent/skill-loader.d.ts +2 -0
- package/dist/agent/skill-loader.d.ts.map +1 -1
- package/dist/agent/skill-loader.js +28 -0
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/tool-registry.d.ts.map +1 -1
- package/dist/agent/tool-registry.js +66 -0
- package/dist/agent/tool-registry.js.map +1 -1
- package/dist/agent/types.d.ts +2 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/agent-handler.d.ts +34 -0
- package/dist/api/agent-handler.d.ts.map +1 -0
- package/dist/api/agent-handler.js +216 -0
- package/dist/api/agent-handler.js.map +1 -0
- package/dist/api/graph-api-types.d.ts +4 -0
- package/dist/api/graph-api-types.d.ts.map +1 -1
- package/dist/api/graph-api.d.ts +2 -2
- package/dist/api/graph-api.d.ts.map +1 -1
- package/dist/api/graph-api.js +480 -51
- package/dist/api/graph-api.js.map +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +4 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/token-handler.d.ts +1 -0
- package/dist/api/token-handler.d.ts.map +1 -1
- package/dist/api/token-handler.js +4 -3
- package/dist/api/token-handler.js.map +1 -1
- package/dist/api/ui-command-handler.d.ts +48 -0
- package/dist/api/ui-command-handler.d.ts.map +1 -0
- package/dist/api/ui-command-handler.js +160 -0
- package/dist/api/ui-command-handler.js.map +1 -0
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +127 -1
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/config/config-manager.d.ts.map +1 -1
- package/dist/cli/config/config-manager.js +16 -31
- package/dist/cli/config/config-manager.js.map +1 -1
- package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
- package/dist/cli/runtime/agent-loop-init.js +31 -7
- package/dist/cli/runtime/agent-loop-init.js.map +1 -1
- package/dist/cli/runtime/api-routes-init.d.ts +3 -0
- package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
- package/dist/cli/runtime/api-routes-init.js +283 -34
- package/dist/cli/runtime/api-routes-init.js.map +1 -1
- package/dist/cli/runtime/gateway-init.d.ts +2 -1
- package/dist/cli/runtime/gateway-init.d.ts.map +1 -1
- package/dist/cli/runtime/gateway-init.js +5 -1
- package/dist/cli/runtime/gateway-init.js.map +1 -1
- package/dist/connectors/framework/raw-store.d.ts +4 -0
- package/dist/connectors/framework/raw-store.d.ts.map +1 -1
- package/dist/connectors/framework/raw-store.js +33 -10
- package/dist/connectors/framework/raw-store.js.map +1 -1
- package/dist/db/agent-store.d.ts +115 -0
- package/dist/db/agent-store.d.ts.map +1 -0
- package/dist/db/agent-store.js +248 -0
- package/dist/db/agent-store.js.map +1 -0
- package/dist/db/migrations/agent-activity-validation-columns.d.ts +3 -0
- package/dist/db/migrations/agent-activity-validation-columns.d.ts.map +1 -0
- package/dist/db/migrations/agent-activity-validation-columns.js +22 -0
- package/dist/db/migrations/agent-activity-validation-columns.js.map +1 -0
- package/dist/db/migrations/agent-metrics-response-avg.d.ts +3 -0
- package/dist/db/migrations/agent-metrics-response-avg.d.ts.map +1 -0
- package/dist/db/migrations/agent-metrics-response-avg.js +19 -0
- package/dist/db/migrations/agent-metrics-response-avg.js.map +1 -0
- package/dist/db/migrations/agent-store-tables.d.ts +3 -0
- package/dist/db/migrations/agent-store-tables.d.ts.map +1 -0
- package/dist/db/migrations/agent-store-tables.js +59 -0
- package/dist/db/migrations/agent-store-tables.js.map +1 -0
- package/dist/db/migrations/token-usage-agent-version.d.ts +3 -0
- package/dist/db/migrations/token-usage-agent-version.d.ts.map +1 -0
- package/dist/db/migrations/token-usage-agent-version.js +16 -0
- package/dist/db/migrations/token-usage-agent-version.js.map +1 -0
- package/dist/db/migrations/validation-session-tables.d.ts +3 -0
- package/dist/db/migrations/validation-session-tables.d.ts.map +1 -0
- package/dist/db/migrations/validation-session-tables.js +59 -0
- package/dist/db/migrations/validation-session-tables.js.map +1 -0
- package/dist/gateways/message-router.d.ts +10 -0
- package/dist/gateways/message-router.d.ts.map +1 -1
- package/dist/gateways/message-router.js +188 -14
- package/dist/gateways/message-router.js.map +1 -1
- package/dist/gateways/types.d.ts +1 -1
- package/dist/gateways/types.d.ts.map +1 -1
- package/dist/multi-agent/agent-process-manager.js +1 -1
- package/dist/multi-agent/agent-process-manager.js.map +1 -1
- package/dist/multi-agent/conductor-persona.d.ts +13 -0
- package/dist/multi-agent/conductor-persona.d.ts.map +1 -0
- package/dist/multi-agent/conductor-persona.js +157 -0
- package/dist/multi-agent/conductor-persona.js.map +1 -0
- package/dist/multi-agent/dashboard-agent-persona.d.ts +1 -1
- package/dist/multi-agent/dashboard-agent-persona.d.ts.map +1 -1
- package/dist/multi-agent/dashboard-agent-persona.js +7 -3
- package/dist/multi-agent/dashboard-agent-persona.js.map +1 -1
- package/dist/multi-agent/delegation-manager.d.ts +5 -0
- package/dist/multi-agent/delegation-manager.d.ts.map +1 -1
- package/dist/multi-agent/delegation-manager.js +37 -0
- package/dist/multi-agent/delegation-manager.js.map +1 -1
- package/dist/multi-agent/ultrawork.d.ts +3 -0
- package/dist/multi-agent/ultrawork.d.ts.map +1 -1
- package/dist/multi-agent/ultrawork.js +9 -0
- package/dist/multi-agent/ultrawork.js.map +1 -1
- package/dist/validation/session-service.d.ts +72 -0
- package/dist/validation/session-service.d.ts.map +1 -0
- package/dist/validation/session-service.js +298 -0
- package/dist/validation/session-service.js.map +1 -0
- package/dist/validation/store.d.ts +25 -0
- package/dist/validation/store.d.ts.map +1 -0
- package/dist/validation/store.js +200 -0
- package/dist/validation/store.js.map +1 -0
- package/dist/validation/types.d.ts +119 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +57 -0
- package/dist/validation/types.js.map +1 -0
- package/package.json +3 -3
- package/public/viewer/js/modules/agents.js +1148 -0
- package/public/viewer/js/modules/chat.js +20 -11
- package/public/viewer/js/modules/connector-feed.js +35 -0
- package/public/viewer/js/modules/dashboard.js +49 -0
- package/public/viewer/js/modules/memory.js +32 -0
- package/public/viewer/js/modules/settings.js +34 -79
- package/public/viewer/js/modules/wiki.js +59 -4
- package/public/viewer/js/utils/api.js +70 -0
- package/public/viewer/js/utils/dom.js +3 -0
- package/public/viewer/js/utils/ui-commands.js +93 -0
- package/public/viewer/log-viewer.html +2 -2
- package/public/viewer/src/modules/agents.ts +1299 -0
- package/public/viewer/src/modules/chat.ts +23 -14
- package/public/viewer/src/modules/connector-feed.ts +35 -0
- package/public/viewer/src/modules/dashboard.ts +50 -0
- package/public/viewer/src/modules/memory.ts +31 -0
- package/public/viewer/src/modules/settings.ts +36 -96
- package/public/viewer/src/modules/wiki.ts +73 -6
- package/public/viewer/src/types/global.d.ts +0 -9
- package/public/viewer/src/utils/api.ts +156 -2
- package/public/viewer/src/utils/dom.ts +6 -1
- package/public/viewer/src/utils/ui-commands.ts +118 -0
- package/public/viewer/viewer.css +105 -10
- package/public/viewer/viewer.html +1868 -777
- package/scripts/generate-gateway-tools.ts +5 -1
- package/public/viewer/js/modules/playground.js +0 -148
- package/public/viewer/js/modules/skills.js +0 -451
- package/public/viewer/src/modules/playground.ts +0 -173
- package/public/viewer/src/modules/skills.ts +0 -491
- package/templates/playgrounds/cron-workflow-lab.html +0 -1601
- package/templates/playgrounds/mama-log-viewer.html +0 -1341
- package/templates/playgrounds/skill-lab-playground.html +0 -1625
- package/templates/playgrounds/wave-visualizer.html +0 -694
- package/templates/skills/playground.md +0 -197
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Validation Session Service
|
|
4
|
+
*
|
|
5
|
+
* Orchestrates the validation session lifecycle:
|
|
6
|
+
* startSession → recordRun → finalizeSession
|
|
7
|
+
*
|
|
8
|
+
* Includes snapshot building (API-only, no DOM),
|
|
9
|
+
* metric computation, status classification, and stale session cleanup.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ValidationSessionService = void 0;
|
|
13
|
+
const crypto_1 = require("crypto");
|
|
14
|
+
const store_js_1 = require("./store.js");
|
|
15
|
+
const types_js_1 = require("./types.js");
|
|
16
|
+
// ── Service ─────────────────────────────────────────────────────────────────
|
|
17
|
+
class ValidationSessionService {
|
|
18
|
+
db;
|
|
19
|
+
constructor(db) {
|
|
20
|
+
this.db = db;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Start a new validation session.
|
|
24
|
+
* Captures before snapshot, looks up baseline, creates DB row.
|
|
25
|
+
*/
|
|
26
|
+
startSession(agentId, agentVersion, triggerType, options) {
|
|
27
|
+
const sessionId = `vs-${(0, crypto_1.randomUUID)().slice(0, 8)}-${Date.now()}`;
|
|
28
|
+
const profile = (0, types_js_1.getMetricProfile)(agentId);
|
|
29
|
+
// Baseline lookup
|
|
30
|
+
const baseline = (0, store_js_1.findBaseline)(this.db, agentId, triggerType);
|
|
31
|
+
// Before snapshot (API state summary)
|
|
32
|
+
const beforeSnapshot = options?.customBeforeSnapshot ?? this.buildBeforeSnapshot(agentId);
|
|
33
|
+
return (0, store_js_1.createValidationSession)(this.db, {
|
|
34
|
+
id: sessionId,
|
|
35
|
+
agent_id: agentId,
|
|
36
|
+
agent_version: agentVersion,
|
|
37
|
+
trigger_type: triggerType,
|
|
38
|
+
goal: options?.goal,
|
|
39
|
+
metric_profile_json: JSON.stringify(profile),
|
|
40
|
+
baseline_version: baseline?.version,
|
|
41
|
+
baseline_session_id: baseline?.sessionId,
|
|
42
|
+
execution_status: 'started',
|
|
43
|
+
validation_outcome: 'inconclusive',
|
|
44
|
+
before_snapshot_json: (0, types_js_1.guardJsonSize)(beforeSnapshot),
|
|
45
|
+
started_at: Date.now(),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Record a run envelope. Links an activity row to this session via run_id.
|
|
50
|
+
*/
|
|
51
|
+
recordRun(sessionId, input) {
|
|
52
|
+
if (input.activityId) {
|
|
53
|
+
this.db
|
|
54
|
+
.prepare('UPDATE agent_activity SET run_id = ? WHERE id = ?')
|
|
55
|
+
.run(sessionId, input.activityId);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Finalize a session: capture after snapshot, compute metrics,
|
|
60
|
+
* classify status, update validation state.
|
|
61
|
+
*/
|
|
62
|
+
finalizeSession(sessionId, input) {
|
|
63
|
+
this.validateFinalizeInput(input);
|
|
64
|
+
const detail = (0, store_js_1.getValidationSessionDetail)(this.db, sessionId);
|
|
65
|
+
if (!detail) {
|
|
66
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
67
|
+
}
|
|
68
|
+
const session = detail.session;
|
|
69
|
+
if (input.activity_row_id !== undefined) {
|
|
70
|
+
this.recordRun(sessionId, { activityId: input.activity_row_id });
|
|
71
|
+
}
|
|
72
|
+
// If execution failed, mark inconclusive
|
|
73
|
+
if (input.execution_status === 'failed' || input.execution_status === 'timeout') {
|
|
74
|
+
(0, store_js_1.updateValidationSession)(this.db, sessionId, {
|
|
75
|
+
execution_status: input.execution_status,
|
|
76
|
+
validation_outcome: 'inconclusive',
|
|
77
|
+
summary: input.error_message ?? `Execution ${input.execution_status}`,
|
|
78
|
+
after_snapshot_json: this.buildAfterSnapshot(session.agent_id, input),
|
|
79
|
+
ended_at: Date.now(),
|
|
80
|
+
});
|
|
81
|
+
this.updateState(session.agent_id, session.trigger_type, 'inconclusive');
|
|
82
|
+
return this.getSession(sessionId);
|
|
83
|
+
}
|
|
84
|
+
// Compute metrics and deltas against baseline
|
|
85
|
+
const profile = JSON.parse(session.metric_profile_json);
|
|
86
|
+
const baselineMetrics = this.loadBaselineMetrics(session.baseline_session_id);
|
|
87
|
+
let outcome = 'inconclusive';
|
|
88
|
+
if (input.metrics && Object.keys(input.metrics).length > 0) {
|
|
89
|
+
const { hasImprovement, hasRegression } = this.saveMetricsWithDelta(sessionId, input.metrics, baselineMetrics, profile);
|
|
90
|
+
outcome = this.classifyOutcome(input.metrics, profile, hasImprovement, hasRegression);
|
|
91
|
+
}
|
|
92
|
+
// Build after snapshot
|
|
93
|
+
const afterSnapshot = this.buildAfterSnapshot(session.agent_id, input);
|
|
94
|
+
// Build report
|
|
95
|
+
const report = this.buildReport(session, input, outcome);
|
|
96
|
+
(0, store_js_1.updateValidationSession)(this.db, sessionId, {
|
|
97
|
+
execution_status: 'completed',
|
|
98
|
+
validation_outcome: outcome,
|
|
99
|
+
after_snapshot_json: afterSnapshot,
|
|
100
|
+
report_json: report,
|
|
101
|
+
summary: `${outcome}: ${Object.keys(input.metrics ?? {}).length} metrics evaluated`,
|
|
102
|
+
ended_at: Date.now(),
|
|
103
|
+
});
|
|
104
|
+
this.updateState(session.agent_id, session.trigger_type, outcome);
|
|
105
|
+
return this.getSession(sessionId);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Clean up stale sessions (started but never ended).
|
|
109
|
+
* Returns count of cleaned sessions.
|
|
110
|
+
*/
|
|
111
|
+
cleanupStaleSessions(maxAgeMs) {
|
|
112
|
+
const stale = (0, store_js_1.listStaleSessions)(this.db, maxAgeMs);
|
|
113
|
+
for (const session of stale) {
|
|
114
|
+
(0, store_js_1.updateValidationSession)(this.db, session.id, {
|
|
115
|
+
execution_status: 'timeout',
|
|
116
|
+
validation_outcome: 'inconclusive',
|
|
117
|
+
summary: 'Session timed out (stale cleanup)',
|
|
118
|
+
ended_at: Date.now(),
|
|
119
|
+
});
|
|
120
|
+
this.updateState(session.agent_id, session.trigger_type, 'inconclusive');
|
|
121
|
+
}
|
|
122
|
+
return stale.length;
|
|
123
|
+
}
|
|
124
|
+
// ── Private ─────────────────────────────────────────────────────────────
|
|
125
|
+
getSession(id) {
|
|
126
|
+
const detail = (0, store_js_1.getValidationSessionDetail)(this.db, id);
|
|
127
|
+
if (!detail)
|
|
128
|
+
throw new Error(`Session ${id} not found`);
|
|
129
|
+
return detail.session;
|
|
130
|
+
}
|
|
131
|
+
buildBeforeSnapshot(agentId) {
|
|
132
|
+
// Capture API-level state summary from DB
|
|
133
|
+
const activityCount = this.db
|
|
134
|
+
.prepare('SELECT COUNT(*) as cnt FROM agent_activity WHERE agent_id = ?')
|
|
135
|
+
.get(agentId)?.cnt ?? 0;
|
|
136
|
+
const latestActivity = this.db
|
|
137
|
+
.prepare('SELECT type, score, created_at FROM agent_activity WHERE agent_id = ? ORDER BY created_at DESC LIMIT 1')
|
|
138
|
+
.get(agentId);
|
|
139
|
+
return JSON.stringify({
|
|
140
|
+
schema_version: types_js_1.SCHEMA_VERSION,
|
|
141
|
+
agent_id: agentId,
|
|
142
|
+
activity_count: activityCount,
|
|
143
|
+
latest_activity_type: latestActivity?.type ?? null,
|
|
144
|
+
latest_score: latestActivity?.score ?? null,
|
|
145
|
+
captured_at: Date.now(),
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
buildAfterSnapshot(agentId, input) {
|
|
149
|
+
const base = JSON.parse(this.buildBeforeSnapshot(agentId));
|
|
150
|
+
return JSON.stringify({
|
|
151
|
+
...base,
|
|
152
|
+
execution_status: input.execution_status,
|
|
153
|
+
error_message: input.error_message ?? null,
|
|
154
|
+
test_input_summary: input.test_input_summary ?? null,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
validateFinalizeInput(input) {
|
|
158
|
+
const validStatuses = ['completed', 'failed', 'timeout'];
|
|
159
|
+
if (!validStatuses.includes(input.execution_status)) {
|
|
160
|
+
throw new Error(`Invalid execution status: ${input.execution_status}`);
|
|
161
|
+
}
|
|
162
|
+
if (input.error_message !== undefined && typeof input.error_message !== 'string') {
|
|
163
|
+
throw new Error('Invalid validation error payload');
|
|
164
|
+
}
|
|
165
|
+
if (input.test_input_summary !== undefined && typeof input.test_input_summary !== 'string') {
|
|
166
|
+
throw new Error('Invalid validation test input payload');
|
|
167
|
+
}
|
|
168
|
+
if (input.metrics !== undefined) {
|
|
169
|
+
if (typeof input.metrics !== 'object' || input.metrics === null) {
|
|
170
|
+
throw new Error('Invalid validation metrics payload');
|
|
171
|
+
}
|
|
172
|
+
for (const value of Object.values(input.metrics)) {
|
|
173
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
174
|
+
throw new Error('Invalid validation metrics payload');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
loadBaselineMetrics(baselineSessionId) {
|
|
180
|
+
const map = new Map();
|
|
181
|
+
if (!baselineSessionId)
|
|
182
|
+
return map;
|
|
183
|
+
const detail = (0, store_js_1.getValidationSessionDetail)(this.db, baselineSessionId);
|
|
184
|
+
if (!detail)
|
|
185
|
+
return map;
|
|
186
|
+
for (const m of detail.metrics) {
|
|
187
|
+
map.set(m.name, m);
|
|
188
|
+
}
|
|
189
|
+
return map;
|
|
190
|
+
}
|
|
191
|
+
saveMetricsWithDelta(sessionId, metrics, baselineMetrics, profile) {
|
|
192
|
+
let hasImprovement = false;
|
|
193
|
+
let hasRegression = false;
|
|
194
|
+
for (const [name, value] of Object.entries(metrics)) {
|
|
195
|
+
const direction = profile.directions?.[name] ?? this.inferDirection(name);
|
|
196
|
+
const baselineMetric = baselineMetrics.get(name);
|
|
197
|
+
const baselineValue = baselineMetric?.value ?? null;
|
|
198
|
+
let deltaValue = null;
|
|
199
|
+
if (baselineValue !== null) {
|
|
200
|
+
deltaValue = value - baselineValue;
|
|
201
|
+
// Check if improved or regressed
|
|
202
|
+
if (direction === 'down_good') {
|
|
203
|
+
if (deltaValue < 0)
|
|
204
|
+
hasImprovement = true;
|
|
205
|
+
if (deltaValue > 0)
|
|
206
|
+
hasRegression = true;
|
|
207
|
+
}
|
|
208
|
+
else if (direction === 'up_good') {
|
|
209
|
+
if (deltaValue > 0)
|
|
210
|
+
hasImprovement = true;
|
|
211
|
+
if (deltaValue < 0)
|
|
212
|
+
hasRegression = true;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
(0, store_js_1.saveValidationMetric)(this.db, {
|
|
216
|
+
validation_session_id: sessionId,
|
|
217
|
+
name,
|
|
218
|
+
value,
|
|
219
|
+
baseline_value: baselineValue,
|
|
220
|
+
delta_value: deltaValue,
|
|
221
|
+
direction,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
return { hasImprovement, hasRegression };
|
|
225
|
+
}
|
|
226
|
+
classifyOutcome(metrics, profile, hasImprovement, hasRegression) {
|
|
227
|
+
// Check critical thresholds
|
|
228
|
+
if (profile.thresholds) {
|
|
229
|
+
for (const [name, threshold] of Object.entries(profile.thresholds)) {
|
|
230
|
+
const value = metrics[name];
|
|
231
|
+
if (value !== undefined && value >= threshold.critical) {
|
|
232
|
+
return 'regressed';
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (hasRegression)
|
|
237
|
+
return 'regressed';
|
|
238
|
+
if (hasImprovement)
|
|
239
|
+
return 'improved';
|
|
240
|
+
return 'healthy';
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Infer metric direction from naming conventions when the metric profile does not
|
|
244
|
+
* provide an explicit override.
|
|
245
|
+
*
|
|
246
|
+
* `down_good`: names containing latency, duration, cost, error, meaningless, staleness
|
|
247
|
+
* `up_good`: names containing rate, efficiency, accuracy, signal
|
|
248
|
+
* default: neutral
|
|
249
|
+
*/
|
|
250
|
+
inferDirection(metricName) {
|
|
251
|
+
if (metricName.includes('latency') ||
|
|
252
|
+
metricName.includes('duration') ||
|
|
253
|
+
metricName.includes('cost') ||
|
|
254
|
+
metricName.includes('error') ||
|
|
255
|
+
metricName.includes('meaningless') ||
|
|
256
|
+
metricName.includes('staleness')) {
|
|
257
|
+
return 'down_good';
|
|
258
|
+
}
|
|
259
|
+
// Metrics where higher is better
|
|
260
|
+
if (metricName.includes('rate') ||
|
|
261
|
+
metricName.includes('efficiency') ||
|
|
262
|
+
metricName.includes('accuracy') ||
|
|
263
|
+
metricName.includes('signal')) {
|
|
264
|
+
return 'up_good';
|
|
265
|
+
}
|
|
266
|
+
return 'neutral';
|
|
267
|
+
}
|
|
268
|
+
buildReport(session, input, outcome) {
|
|
269
|
+
const lines = [
|
|
270
|
+
`${session.agent_id} validation: ${outcome}`,
|
|
271
|
+
`trigger: ${session.trigger_type}`,
|
|
272
|
+
`version: ${session.agent_version}`,
|
|
273
|
+
];
|
|
274
|
+
if (input.metrics) {
|
|
275
|
+
for (const [name, value] of Object.entries(input.metrics)) {
|
|
276
|
+
lines.push(` ${name}: ${value}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (input.error_message) {
|
|
280
|
+
lines.push(`error: ${input.error_message}`);
|
|
281
|
+
}
|
|
282
|
+
return JSON.stringify({
|
|
283
|
+
schema_version: types_js_1.SCHEMA_VERSION,
|
|
284
|
+
headline: `${session.agent_id}: ${outcome}`,
|
|
285
|
+
what_changed: input.metrics ? Object.keys(input.metrics).join(', ') : 'no metrics',
|
|
286
|
+
outcome,
|
|
287
|
+
details: lines.join('\n'),
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
updateState(agentId, triggerType, outcome) {
|
|
291
|
+
(0, store_js_1.updateAgentValidationState)(this.db, agentId, triggerType, {
|
|
292
|
+
current_status: outcome,
|
|
293
|
+
last_validation_at: Date.now(),
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
exports.ValidationSessionService = ValidationSessionService;
|
|
298
|
+
//# sourceMappingURL=session-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-service.js","sourceRoot":"","sources":["../../src/validation/session-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Session Store
|
|
3
|
+
*
|
|
4
|
+
* SQLite persistence for validation_sessions, validation_metrics,
|
|
5
|
+
* and agent_validation_state. Includes ALTER TABLE migration for
|
|
6
|
+
* agent_activity (run_id, execution_status, trigger_reason).
|
|
7
|
+
*/
|
|
8
|
+
import type { SQLiteDatabase } from '../sqlite.js';
|
|
9
|
+
import { type CreateValidationSessionInput, type ValidationSessionRow, type SaveValidationMetricInput, type AgentValidationStateRow, type UpdateValidationStateInput, type ValidationSessionDetail, type ValidationTriggerType } from './types.js';
|
|
10
|
+
export declare function initValidationTables(db: SQLiteDatabase): void;
|
|
11
|
+
export declare function createValidationSession(db: SQLiteDatabase, input: CreateValidationSessionInput): ValidationSessionRow;
|
|
12
|
+
export declare function updateValidationSession(db: SQLiteDatabase, id: string, updates: Partial<Pick<CreateValidationSessionInput, 'execution_status' | 'validation_outcome' | 'summary' | 'recommendation' | 'after_snapshot_json' | 'report_json' | 'ended_at'>>): void;
|
|
13
|
+
export declare function saveValidationMetric(db: SQLiteDatabase, input: SaveValidationMetricInput): void;
|
|
14
|
+
export declare function getValidationSummary(db: SQLiteDatabase, agentId: string, triggerType?: ValidationTriggerType): ValidationSessionRow | null;
|
|
15
|
+
export declare function listValidationHistory(db: SQLiteDatabase, agentId: string, limit?: number, triggerType?: ValidationTriggerType): ValidationSessionRow[];
|
|
16
|
+
export declare function getValidationSessionDetail(db: SQLiteDatabase, sessionId: string): ValidationSessionDetail | null;
|
|
17
|
+
export declare function approveValidationSession(db: SQLiteDatabase, sessionId: string): void;
|
|
18
|
+
export declare function getAgentValidationState(db: SQLiteDatabase, agentId: string, triggerType: string): AgentValidationStateRow | null;
|
|
19
|
+
export declare function updateAgentValidationState(db: SQLiteDatabase, agentId: string, triggerType: string, input: UpdateValidationStateInput): void;
|
|
20
|
+
export declare function listStaleSessions(db: SQLiteDatabase, maxAgeMs: number): ValidationSessionRow[];
|
|
21
|
+
export declare function findBaseline(db: SQLiteDatabase, agentId: string, triggerType: string): {
|
|
22
|
+
version: number;
|
|
23
|
+
sessionId: string;
|
|
24
|
+
} | null;
|
|
25
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/validation/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAGL,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAE9B,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC3B,MAAM,YAAY,CAAC;AAIpB,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAG7D;AAUD,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,4BAA4B,GAClC,oBAAoB,CAgCtB;AAED,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,cAAc,EAClB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CACd,IAAI,CACF,4BAA4B,EAC1B,kBAAkB,GAClB,oBAAoB,GACpB,SAAS,GACT,gBAAgB,GAChB,qBAAqB,GACrB,aAAa,GACb,UAAU,CACb,CACF,GACA,IAAI,CAoCN;AAID,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,yBAAyB,GAAG,IAAI,CAc/F;AAID,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,qBAAqB,GAClC,oBAAoB,GAAG,IAAI,CAuB7B;AAID,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,SAAK,EACV,WAAW,CAAC,EAAE,qBAAqB,GAClC,oBAAoB,EAAE,CAmBxB;AAID,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,MAAM,GAChB,uBAAuB,GAAG,IAAI,CAYhC;AAID,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAepF;AAID,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,uBAAuB,GAAG,IAAI,CAMhC;AAED,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,0BAA0B,GAChC,IAAI,CAqBN;AAID,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAS9F;AAID,wBAAgB,YAAY,CAC1B,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiC/C"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Validation Session Store
|
|
4
|
+
*
|
|
5
|
+
* SQLite persistence for validation_sessions, validation_metrics,
|
|
6
|
+
* and agent_validation_state. Includes ALTER TABLE migration for
|
|
7
|
+
* agent_activity (run_id, execution_status, trigger_reason).
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.initValidationTables = initValidationTables;
|
|
11
|
+
exports.createValidationSession = createValidationSession;
|
|
12
|
+
exports.updateValidationSession = updateValidationSession;
|
|
13
|
+
exports.saveValidationMetric = saveValidationMetric;
|
|
14
|
+
exports.getValidationSummary = getValidationSummary;
|
|
15
|
+
exports.listValidationHistory = listValidationHistory;
|
|
16
|
+
exports.getValidationSessionDetail = getValidationSessionDetail;
|
|
17
|
+
exports.approveValidationSession = approveValidationSession;
|
|
18
|
+
exports.getAgentValidationState = getAgentValidationState;
|
|
19
|
+
exports.updateAgentValidationState = updateAgentValidationState;
|
|
20
|
+
exports.listStaleSessions = listStaleSessions;
|
|
21
|
+
exports.findBaseline = findBaseline;
|
|
22
|
+
const validation_session_tables_js_1 = require("../db/migrations/validation-session-tables.js");
|
|
23
|
+
const agent_activity_validation_columns_js_1 = require("../db/migrations/agent-activity-validation-columns.js");
|
|
24
|
+
const types_js_1 = require("./types.js");
|
|
25
|
+
// ── Table Init ──────────────────────────────────────────────────────────────
|
|
26
|
+
function initValidationTables(db) {
|
|
27
|
+
(0, validation_session_tables_js_1.applyValidationSessionTablesMigration)(db);
|
|
28
|
+
migrateAgentActivity(db);
|
|
29
|
+
}
|
|
30
|
+
// ── agent_activity Migration ────────────────────────────────────────────────
|
|
31
|
+
function migrateAgentActivity(db) {
|
|
32
|
+
(0, agent_activity_validation_columns_js_1.applyAgentActivityValidationColumnsMigration)(db);
|
|
33
|
+
}
|
|
34
|
+
// ── Validation Session CRUD ─────────────────────────────────────────────────
|
|
35
|
+
function createValidationSession(db, input) {
|
|
36
|
+
db.prepare(`INSERT INTO validation_sessions
|
|
37
|
+
(id, agent_id, agent_version, trigger_type, goal, metric_profile_json,
|
|
38
|
+
baseline_version, baseline_session_id, execution_status, validation_outcome,
|
|
39
|
+
summary, recommendation, before_snapshot_json, after_snapshot_json,
|
|
40
|
+
report_json, schema_version, requires_approval, started_at, ended_at)
|
|
41
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(input.id, input.agent_id, input.agent_version, input.trigger_type, input.goal ?? null, input.metric_profile_json, input.baseline_version ?? null, input.baseline_session_id ?? null, input.execution_status, input.validation_outcome, input.summary ?? null, input.recommendation ?? null, (0, types_js_1.guardJsonSize)(input.before_snapshot_json), (0, types_js_1.guardJsonSize)(input.after_snapshot_json), (0, types_js_1.guardJsonSize)(input.report_json), input.schema_version ?? types_js_1.SCHEMA_VERSION, input.requires_approval ?? 0, input.started_at, input.ended_at ?? null);
|
|
42
|
+
return db
|
|
43
|
+
.prepare('SELECT * FROM validation_sessions WHERE id = ?')
|
|
44
|
+
.get(input.id);
|
|
45
|
+
}
|
|
46
|
+
function updateValidationSession(db, id, updates) {
|
|
47
|
+
const setClauses = [];
|
|
48
|
+
const values = [];
|
|
49
|
+
if (updates.execution_status !== undefined) {
|
|
50
|
+
setClauses.push('execution_status = ?');
|
|
51
|
+
values.push(updates.execution_status);
|
|
52
|
+
}
|
|
53
|
+
if (updates.validation_outcome !== undefined) {
|
|
54
|
+
setClauses.push('validation_outcome = ?');
|
|
55
|
+
values.push(updates.validation_outcome);
|
|
56
|
+
}
|
|
57
|
+
if (updates.summary !== undefined) {
|
|
58
|
+
setClauses.push('summary = ?');
|
|
59
|
+
values.push(updates.summary);
|
|
60
|
+
}
|
|
61
|
+
if (updates.recommendation !== undefined) {
|
|
62
|
+
setClauses.push('recommendation = ?');
|
|
63
|
+
values.push(updates.recommendation);
|
|
64
|
+
}
|
|
65
|
+
if (updates.after_snapshot_json !== undefined) {
|
|
66
|
+
setClauses.push('after_snapshot_json = ?');
|
|
67
|
+
values.push((0, types_js_1.guardJsonSize)(updates.after_snapshot_json));
|
|
68
|
+
}
|
|
69
|
+
if (updates.report_json !== undefined) {
|
|
70
|
+
setClauses.push('report_json = ?');
|
|
71
|
+
values.push((0, types_js_1.guardJsonSize)(updates.report_json));
|
|
72
|
+
}
|
|
73
|
+
if (updates.ended_at !== undefined) {
|
|
74
|
+
setClauses.push('ended_at = ?');
|
|
75
|
+
values.push(updates.ended_at);
|
|
76
|
+
}
|
|
77
|
+
if (setClauses.length === 0)
|
|
78
|
+
return;
|
|
79
|
+
values.push(id);
|
|
80
|
+
db.prepare(`UPDATE validation_sessions SET ${setClauses.join(', ')} WHERE id = ?`).run(...values);
|
|
81
|
+
}
|
|
82
|
+
// ── Validation Metrics ──────────────────────────────────────────────────────
|
|
83
|
+
function saveValidationMetric(db, input) {
|
|
84
|
+
db.prepare(`INSERT INTO validation_metrics
|
|
85
|
+
(validation_session_id, name, value, baseline_value, delta_value, direction, created_at)
|
|
86
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`).run(input.validation_session_id, input.name, input.value, input.baseline_value ?? null, input.delta_value ?? null, input.direction, Date.now());
|
|
87
|
+
}
|
|
88
|
+
// ── Query: Summary ──────────────────────────────────────────────────────────
|
|
89
|
+
function getValidationSummary(db, agentId, triggerType) {
|
|
90
|
+
if (triggerType) {
|
|
91
|
+
return (db
|
|
92
|
+
.prepare(`SELECT * FROM validation_sessions
|
|
93
|
+
WHERE agent_id = ? AND trigger_type = ?
|
|
94
|
+
ORDER BY started_at DESC
|
|
95
|
+
LIMIT 1`)
|
|
96
|
+
.get(agentId, triggerType) ?? null);
|
|
97
|
+
}
|
|
98
|
+
return (db
|
|
99
|
+
.prepare(`SELECT * FROM validation_sessions
|
|
100
|
+
WHERE agent_id = ?
|
|
101
|
+
ORDER BY started_at DESC
|
|
102
|
+
LIMIT 1`)
|
|
103
|
+
.get(agentId) ?? null);
|
|
104
|
+
}
|
|
105
|
+
// ── Query: History ──────────────────────────────────────────────────────────
|
|
106
|
+
function listValidationHistory(db, agentId, limit = 50, triggerType) {
|
|
107
|
+
if (triggerType) {
|
|
108
|
+
return db
|
|
109
|
+
.prepare(`SELECT * FROM validation_sessions
|
|
110
|
+
WHERE agent_id = ? AND trigger_type = ?
|
|
111
|
+
ORDER BY started_at DESC
|
|
112
|
+
LIMIT ?`)
|
|
113
|
+
.all(agentId, triggerType, limit);
|
|
114
|
+
}
|
|
115
|
+
return db
|
|
116
|
+
.prepare(`SELECT * FROM validation_sessions
|
|
117
|
+
WHERE agent_id = ?
|
|
118
|
+
ORDER BY started_at DESC
|
|
119
|
+
LIMIT ?`)
|
|
120
|
+
.all(agentId, limit);
|
|
121
|
+
}
|
|
122
|
+
// ── Query: Session Detail ───────────────────────────────────────────────────
|
|
123
|
+
function getValidationSessionDetail(db, sessionId) {
|
|
124
|
+
const session = db.prepare('SELECT * FROM validation_sessions WHERE id = ?').get(sessionId);
|
|
125
|
+
if (!session)
|
|
126
|
+
return null;
|
|
127
|
+
const metrics = db
|
|
128
|
+
.prepare('SELECT * FROM validation_metrics WHERE validation_session_id = ? ORDER BY created_at')
|
|
129
|
+
.all(sessionId);
|
|
130
|
+
return { session, metrics };
|
|
131
|
+
}
|
|
132
|
+
// ── Approval ────────────────────────────────────────────────────────────────
|
|
133
|
+
function approveValidationSession(db, sessionId) {
|
|
134
|
+
const session = db.prepare('SELECT * FROM validation_sessions WHERE id = ?').get(sessionId);
|
|
135
|
+
if (!session) {
|
|
136
|
+
throw new Error(`Validation session not found: ${sessionId}`);
|
|
137
|
+
}
|
|
138
|
+
updateAgentValidationState(db, session.agent_id, session.trigger_type, {
|
|
139
|
+
approved_version: session.agent_version,
|
|
140
|
+
approved_session_id: session.id,
|
|
141
|
+
current_status: session.validation_outcome,
|
|
142
|
+
last_validation_at: Date.now(),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
// ── Agent Validation State ──────────────────────────────────────────────────
|
|
146
|
+
function getAgentValidationState(db, agentId, triggerType) {
|
|
147
|
+
return (db
|
|
148
|
+
.prepare('SELECT * FROM agent_validation_state WHERE agent_id = ? AND trigger_type = ?')
|
|
149
|
+
.get(agentId, triggerType) ?? null);
|
|
150
|
+
}
|
|
151
|
+
function updateAgentValidationState(db, agentId, triggerType, input) {
|
|
152
|
+
const now = Date.now();
|
|
153
|
+
db.prepare(`INSERT INTO agent_validation_state
|
|
154
|
+
(agent_id, trigger_type, approved_version, approved_session_id, current_status, last_validation_at, updated_at)
|
|
155
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
156
|
+
ON CONFLICT(agent_id, trigger_type) DO UPDATE SET
|
|
157
|
+
approved_version = COALESCE(excluded.approved_version, approved_version),
|
|
158
|
+
approved_session_id = COALESCE(excluded.approved_session_id, approved_session_id),
|
|
159
|
+
current_status = COALESCE(excluded.current_status, current_status),
|
|
160
|
+
last_validation_at = COALESCE(excluded.last_validation_at, last_validation_at),
|
|
161
|
+
updated_at = excluded.updated_at`).run(agentId, triggerType, input.approved_version ?? null, input.approved_session_id ?? null, input.current_status ?? null, input.last_validation_at ?? null, now);
|
|
162
|
+
}
|
|
163
|
+
// ── Stale Session Cleanup ───────────────────────────────────────────────────
|
|
164
|
+
function listStaleSessions(db, maxAgeMs) {
|
|
165
|
+
const cutoff = Date.now() - maxAgeMs;
|
|
166
|
+
return db
|
|
167
|
+
.prepare(`SELECT * FROM validation_sessions
|
|
168
|
+
WHERE ended_at IS NULL AND started_at < ?
|
|
169
|
+
ORDER BY started_at ASC`)
|
|
170
|
+
.all(cutoff);
|
|
171
|
+
}
|
|
172
|
+
// ── Baseline Lookup ─────────────────────────────────────────────────────────
|
|
173
|
+
function findBaseline(db, agentId, triggerType) {
|
|
174
|
+
// 1. approved session
|
|
175
|
+
const state = getAgentValidationState(db, agentId, triggerType);
|
|
176
|
+
if (state?.approved_session_id && state.approved_version !== null) {
|
|
177
|
+
return { version: state.approved_version, sessionId: state.approved_session_id };
|
|
178
|
+
}
|
|
179
|
+
// 2. last healthy session
|
|
180
|
+
const healthy = db
|
|
181
|
+
.prepare(`SELECT id, agent_version FROM validation_sessions
|
|
182
|
+
WHERE agent_id = ? AND trigger_type = ? AND validation_outcome = 'healthy'
|
|
183
|
+
ORDER BY started_at DESC LIMIT 1`)
|
|
184
|
+
.get(agentId, triggerType);
|
|
185
|
+
if (healthy) {
|
|
186
|
+
return { version: healthy.agent_version, sessionId: healthy.id };
|
|
187
|
+
}
|
|
188
|
+
// 3. last completed session
|
|
189
|
+
const completed = db
|
|
190
|
+
.prepare(`SELECT id, agent_version FROM validation_sessions
|
|
191
|
+
WHERE agent_id = ? AND trigger_type = ? AND execution_status = 'completed'
|
|
192
|
+
ORDER BY started_at DESC LIMIT 1`)
|
|
193
|
+
.get(agentId, triggerType);
|
|
194
|
+
if (completed) {
|
|
195
|
+
return { version: completed.agent_version, sessionId: completed.id };
|
|
196
|
+
}
|
|
197
|
+
// 4. no baseline → inconclusive
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/validation/store.ts"],"names":[],"mappings":"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"}
|