sentinel-agentos 0.3.8 → 0.3.10

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.
Files changed (97) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1797 -0
  3. package/dist/adapters/evaluation-bridge.d.ts +78 -0
  4. package/dist/adapters/evaluation-bridge.d.ts.map +1 -0
  5. package/dist/adapters/evaluation-bridge.js +273 -0
  6. package/dist/adapters/evaluation-bridge.js.map +1 -0
  7. package/dist/adapters/memory-bridge.d.ts +110 -0
  8. package/dist/adapters/memory-bridge.d.ts.map +1 -0
  9. package/dist/adapters/memory-bridge.js +316 -0
  10. package/dist/adapters/memory-bridge.js.map +1 -0
  11. package/dist/adapters/migrate.d.ts +2 -0
  12. package/dist/adapters/migrate.d.ts.map +1 -0
  13. package/dist/adapters/migrate.js +63 -0
  14. package/dist/adapters/migrate.js.map +1 -0
  15. package/dist/api.d.ts +151 -0
  16. package/dist/api.d.ts.map +1 -0
  17. package/dist/api.js +179 -0
  18. package/dist/api.js.map +1 -0
  19. package/dist/cli.d.ts +16 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +350 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/core.d.ts +156 -0
  24. package/dist/core.d.ts.map +1 -0
  25. package/dist/core.js +400 -0
  26. package/dist/core.js.map +1 -0
  27. package/dist/evaluator/exec-evaluator.d.ts +102 -0
  28. package/dist/evaluator/exec-evaluator.d.ts.map +1 -0
  29. package/dist/evaluator/exec-evaluator.js +266 -0
  30. package/dist/evaluator/exec-evaluator.js.map +1 -0
  31. package/dist/evaluator/feedback.d.ts +102 -0
  32. package/dist/evaluator/feedback.d.ts.map +1 -0
  33. package/dist/evaluator/feedback.js +478 -0
  34. package/dist/evaluator/feedback.js.map +1 -0
  35. package/dist/evaluator/profiler.d.ts +56 -0
  36. package/dist/evaluator/profiler.d.ts.map +1 -0
  37. package/dist/evaluator/profiler.js +140 -0
  38. package/dist/evaluator/profiler.js.map +1 -0
  39. package/dist/guard/audit-log.d.ts +48 -0
  40. package/dist/guard/audit-log.d.ts.map +1 -0
  41. package/dist/guard/audit-log.js +213 -0
  42. package/dist/guard/audit-log.js.map +1 -0
  43. package/dist/guard/container-sandbox.d.ts +25 -0
  44. package/dist/guard/container-sandbox.d.ts.map +1 -0
  45. package/dist/guard/container-sandbox.js +145 -0
  46. package/dist/guard/container-sandbox.js.map +1 -0
  47. package/dist/guard/risk-gate.d.ts +101 -0
  48. package/dist/guard/risk-gate.d.ts.map +1 -0
  49. package/dist/guard/risk-gate.js +200 -0
  50. package/dist/guard/risk-gate.js.map +1 -0
  51. package/dist/guard/sandbox.d.ts +112 -0
  52. package/dist/guard/sandbox.d.ts.map +1 -0
  53. package/dist/guard/sandbox.js +379 -0
  54. package/dist/guard/sandbox.js.map +1 -0
  55. package/dist/guard/schema-gate.d.ts +90 -0
  56. package/dist/guard/schema-gate.d.ts.map +1 -0
  57. package/dist/guard/schema-gate.js +452 -0
  58. package/dist/guard/schema-gate.js.map +1 -0
  59. package/dist/guard/snapshot-verify.d.ts +111 -0
  60. package/dist/guard/snapshot-verify.d.ts.map +1 -0
  61. package/dist/guard/snapshot-verify.js +571 -0
  62. package/dist/guard/snapshot-verify.js.map +1 -0
  63. package/dist/index.d.ts +28 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +59 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/memory/episodic.d.ts +80 -0
  68. package/dist/memory/episodic.d.ts.map +1 -0
  69. package/dist/memory/episodic.js +305 -0
  70. package/dist/memory/episodic.js.map +1 -0
  71. package/dist/memory/semantic.d.ts +68 -0
  72. package/dist/memory/semantic.d.ts.map +1 -0
  73. package/dist/memory/semantic.js +299 -0
  74. package/dist/memory/semantic.js.map +1 -0
  75. package/dist/memory/working.d.ts +53 -0
  76. package/dist/memory/working.d.ts.map +1 -0
  77. package/dist/memory/working.js +166 -0
  78. package/dist/memory/working.js.map +1 -0
  79. package/dist/middleware/openclaw.d.ts +45 -0
  80. package/dist/middleware/openclaw.d.ts.map +1 -0
  81. package/dist/middleware/openclaw.js +95 -0
  82. package/dist/middleware/openclaw.js.map +1 -0
  83. package/dist/middleware/wrapper.d.ts +54 -0
  84. package/dist/middleware/wrapper.d.ts.map +1 -0
  85. package/dist/middleware/wrapper.js +155 -0
  86. package/dist/middleware/wrapper.js.map +1 -0
  87. package/dist/server.d.ts +45 -0
  88. package/dist/server.d.ts.map +1 -0
  89. package/dist/server.js +256 -0
  90. package/dist/server.js.map +1 -0
  91. package/dist/src/dashboard.html +9 -7
  92. package/dist/types/index.d.ts +228 -0
  93. package/dist/types/index.d.ts.map +1 -0
  94. package/dist/types/index.js +23 -0
  95. package/dist/types/index.js.map +1 -0
  96. package/package.json +1 -1
  97. package/scripts/sentinel-light.js +234 -0
@@ -0,0 +1,478 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ImplicitFeedbackEngine = void 0;
37
+ const crypto = __importStar(require("crypto"));
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ /**
41
+ * Generate a unique feedback ID.
42
+ */
43
+ function generateFeedbackId() {
44
+ return `fb_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`;
45
+ }
46
+ /**
47
+ * ImplicitFeedbackEngine — captures and interprets implicit user signals.
48
+ *
49
+ * Instead of relying on explicit "thumbs up/down", this engine
50
+ * detects subtle signals from user behavior to infer satisfaction.
51
+ *
52
+ * Two modes:
53
+ * - Manual: caller provides explicit signals via record()
54
+ * - Auto-detect: scans audit log to infer signals (results unused,
55
+ * results modified later, repeated same tool, verify failures)
56
+ *
57
+ * This is the key differentiator of AgentOS: it learns from
58
+ * what users DO, not just what they SAY.
59
+ */
60
+ class ImplicitFeedbackEngine {
61
+ feedbackLog = [];
62
+ persistPath = null;
63
+ // Global audit log for cross-session auto-detection
64
+ globalAuditPath = null;
65
+ // Track which auto-detected signals we've already logged (dedup key)
66
+ detectedKeys = new Set();
67
+ // Caps for unbounded growth
68
+ static MAX_FEEDBACK = 300;
69
+ static MAX_DETECTED_KEYS = 500;
70
+ // Persist as append-only JSONL (one line per record) instead of full snapshot rewrite
71
+ persistLinePath = null;
72
+ /**
73
+ * Record an implicit feedback signal.
74
+ */
75
+ record(signal, sessionId, operationId, confidence = 0.8, source = 'auto-detected') {
76
+ const strength = this.getSignalStrength(signal);
77
+ const feedback = {
78
+ id: generateFeedbackId(),
79
+ timestamp: Date.now(),
80
+ signal,
81
+ strength,
82
+ confidence,
83
+ sessionId,
84
+ operationId,
85
+ source,
86
+ };
87
+ this.feedbackLog.push(feedback);
88
+ // Trim oldest to prevent unbounded growth
89
+ while (this.feedbackLog.length > ImplicitFeedbackEngine.MAX_FEEDBACK)
90
+ this.feedbackLog.shift();
91
+ // Keep detectedKeys within bounds
92
+ if (this.detectedKeys.size > ImplicitFeedbackEngine.MAX_DETECTED_KEYS) {
93
+ const iter = this.detectedKeys.values();
94
+ for (let i = 0; i < 100; i++) {
95
+ const n = iter.next();
96
+ if (n.done)
97
+ break;
98
+ this.detectedKeys.delete(n.value);
99
+ }
100
+ }
101
+ this.persist();
102
+ return feedback;
103
+ }
104
+ // ══════════════════════════════════
105
+ // Auto-detect feedback from audit log
106
+ // ══════════════════════════════════
107
+ /**
108
+ * Scan the audit log and auto-detect implicit feedback signals.
109
+ *
110
+ * Detection rules (conservative — low confidence to avoid false positives):
111
+ * - verify FAIL or WARN → user_provided_correction (agent made mistakes)
112
+ * - same tool+params called within 60s → user_repeated_instruction (low confidence, noisy)
113
+ * - high risk operations that were retried and eventually passed → agent_self_corrected
114
+ *
115
+ * Note: auto-detected signals carry lower confidence than explicit user feedback.
116
+ * They serve as supplementary data, not primary quality indicators.
117
+ *
118
+ * @param entries Recent audit entries to analyze
119
+ * @param sessionId Session to attribute signals to
120
+ * @returns Number of signals auto-detected
121
+ */
122
+ /**
123
+ * Enable persistence for feedbackLog and auto-detected signal keys.
124
+ */
125
+ enablePersistence(workspaceRoot) {
126
+ const agentosDir = path.join(workspaceRoot, '.agentos');
127
+ if (!fs.existsSync(agentosDir)) {
128
+ fs.mkdirSync(agentosDir, { recursive: true });
129
+ }
130
+ this.persistPath = path.join(agentosDir, 'feedback.jsonl');
131
+ this.persistLinePath = path.join(agentosDir, 'feedback-lines.jsonl');
132
+ this.globalAuditPath = path.join(agentosDir, 'audit.jsonl');
133
+ this.load();
134
+ }
135
+ /** Persist: append one line to feedback-lines.jsonl. */
136
+ _writeCount = 0;
137
+ persist() {
138
+ if (!this.persistLinePath)
139
+ return;
140
+ try {
141
+ const last = this.feedbackLog[this.feedbackLog.length - 1];
142
+ if (!last)
143
+ return;
144
+ const line = JSON.stringify(last) + '\n';
145
+ fs.appendFileSync(this.persistLinePath, line, 'utf-8');
146
+ this._writeCount++;
147
+ // Every 50 writes, compact the file to keep only last 200 lines
148
+ if (this._writeCount >= 50) {
149
+ this._writeCount = 0;
150
+ this.compactFeedbackFile();
151
+ }
152
+ }
153
+ catch { /* non-critical */ }
154
+ }
155
+ /** Compact feedback-lines.jsonl: keep last 200 lines only. */
156
+ compactFeedbackFile() {
157
+ if (!this.persistLinePath)
158
+ return;
159
+ try {
160
+ if (!fs.existsSync(this.persistLinePath))
161
+ return;
162
+ const all = fs.readFileSync(this.persistLinePath, 'utf-8').trim();
163
+ if (!all)
164
+ return;
165
+ const lines = all.split('\n').filter(Boolean);
166
+ if (lines.length <= 200)
167
+ return;
168
+ const recent = lines.slice(-200);
169
+ fs.writeFileSync(this.persistLinePath, recent.join('\n') + '\n', 'utf-8');
170
+ }
171
+ catch { /* non-critical */ }
172
+ }
173
+ /** Load persisted feedback log from disk. */
174
+ load() {
175
+ if (!this.persistPath)
176
+ return;
177
+ try {
178
+ // Prefer new line-based format
179
+ if (this.persistLinePath && fs.existsSync(this.persistLinePath)) {
180
+ const content = fs.readFileSync(this.persistLinePath, 'utf-8').trim();
181
+ if (content) {
182
+ const lines = content.split('\n').filter(Boolean);
183
+ const cutoff = Date.now() - 7 * 24 * 60 * 60 * 1000;
184
+ this.feedbackLog = lines
185
+ .map((l) => { try {
186
+ return JSON.parse(l);
187
+ }
188
+ catch {
189
+ return null;
190
+ } })
191
+ .filter((f) => f !== null && f.timestamp >= cutoff)
192
+ .slice(-ImplicitFeedbackEngine.MAX_FEEDBACK);
193
+ return;
194
+ }
195
+ }
196
+ // Fallback: old snapshot format
197
+ if (!fs.existsSync(this.persistPath))
198
+ return;
199
+ const content = fs.readFileSync(this.persistPath, 'utf-8').trim();
200
+ if (!content)
201
+ return;
202
+ const snapshot = JSON.parse(content);
203
+ if (Array.isArray(snapshot.feedbackLog)) {
204
+ this.feedbackLog = snapshot.feedbackLog;
205
+ const cutoff = Date.now() - 7 * 24 * 60 * 60 * 1000;
206
+ this.feedbackLog = this.feedbackLog.filter((f) => f.timestamp >= cutoff);
207
+ }
208
+ if (Array.isArray(snapshot.detectedKeys)) {
209
+ this.detectedKeys = new Set(snapshot.detectedKeys);
210
+ }
211
+ }
212
+ catch {
213
+ // Corrupt file — start fresh
214
+ }
215
+ }
216
+ /**
217
+ * Cross-session auto-detect: scan the global audit.jsonl for signals
218
+ * from ALL sessions, not just the current one.
219
+ */
220
+ autoDetectGlobal() {
221
+ if (!this.globalAuditPath)
222
+ return 0;
223
+ try {
224
+ if (!fs.existsSync(this.globalAuditPath))
225
+ return 0;
226
+ const content = fs.readFileSync(this.globalAuditPath, 'utf-8');
227
+ const lines = content.split('\n').filter((l) => l.trim());
228
+ const entries = lines.map((l) => JSON.parse(l));
229
+ return this.autoDetect(entries, '__global__');
230
+ }
231
+ catch {
232
+ return 0;
233
+ }
234
+ }
235
+ autoDetect(entries, sessionId) {
236
+ let detected = 0;
237
+ // Rule 1: Verify failures → agent made errors (confidence 0.7)
238
+ for (const entry of entries) {
239
+ if (entry.verifyGate.status !== 'PASS') {
240
+ const dedupKey = `verify-fail:${entry.id}`;
241
+ if (!this.detectedKeys.has(dedupKey)) {
242
+ this.detectedKeys.add(dedupKey);
243
+ this.record('user_provided_correction', sessionId, entry.id, 0.7, 'auto-audit-verify');
244
+ detected++;
245
+ }
246
+ }
247
+ }
248
+ // Rule 2: Repeated same tool call within 60s → user had to repeat
249
+ // Low confidence (0.3) because some tools (read, exec) are legitimately called multiple times
250
+ for (let i = 0; i < entries.length; i++) {
251
+ for (let j = i + 1; j < entries.length; j++) {
252
+ const ei = entries[i];
253
+ const ej = entries[j];
254
+ if (!ei || !ej)
255
+ continue;
256
+ if (ei.toolName === ej.toolName &&
257
+ JSON.stringify(ei.toolParameters) === JSON.stringify(ej.toolParameters) &&
258
+ Math.abs(ei.completedAt - ej.startedAt) < 60_000) {
259
+ const dedupKey = `repeat:${ei.id}:${ej.id}`;
260
+ if (!this.detectedKeys.has(dedupKey)) {
261
+ this.detectedKeys.add(dedupKey);
262
+ this.record('user_repeated_instruction', sessionId, ej.id, 0.3, 'auto-audit-repeat');
263
+ detected++;
264
+ }
265
+ break;
266
+ }
267
+ }
268
+ }
269
+ // Rule 3: Agent self-corrected — only when retry eventually succeeded
270
+ // (NOT "high risk passed" — that's coincidence, not demonstrated skill)
271
+ // Detected by: same tool+params failed once, then passed later in the same session
272
+ const failures = new Set();
273
+ for (const entry of entries) {
274
+ if (entry.verifyGate.status !== 'PASS') {
275
+ failures.add(JSON.stringify({ t: entry.toolName, p: entry.toolParameters }));
276
+ }
277
+ }
278
+ for (const entry of entries) {
279
+ const key = JSON.stringify({ t: entry.toolName, p: entry.toolParameters });
280
+ if (entry.verifyGate.status === 'PASS' && failures.has(key)) {
281
+ const dedupKey = `self-corrected:${entry.id}`;
282
+ if (!this.detectedKeys.has(dedupKey)) {
283
+ this.detectedKeys.add(dedupKey);
284
+ this.record('agent_self_corrected', sessionId, entry.id, 0.5, 'auto-audit-self-corrected');
285
+ detected++;
286
+ }
287
+ failures.delete(key); // one signal per correction
288
+ }
289
+ }
290
+ return detected;
291
+ }
292
+ // ══════════════════════════════════
293
+ // User message analysis — detect correction signals from text
294
+ // ══════════════════════════════════
295
+ /**
296
+ * Analyze user messages to detect implicit correction/feedback signals.
297
+ *
298
+ * Chinese corrective patterns (high precision, low recall — only matches clear signals):
299
+ * - "不对"/"错了"/"不是这样" → user_provided_correction (confidence 0.8)
300
+ * - "漏了"/"缺了"/"没包括"/"遗漏" → user_provided_correction (confidence 0.75)
301
+ * - "你没"/"你怎么"/"你咋" + 负面动作(忘记/漏/没/不) → user_provided_correction (confidence 0.7)
302
+ * - "失忆"/"忘了"/"不记得" → user_provided_correction (confidence 0.85)
303
+ * - "重新"/"再查"/"再搜"/"再看看" → user_repeated_instruction (confidence 0.6)
304
+ * - "不对吧"/"没音信" → user_interrupted (confidence 0.5)
305
+ *
306
+ * English patterns:
307
+ * - "wrong"/"incorrect"/"not right" → user_provided_correction (confidence 0.7)
308
+ * - "missed"/"missing"/"forgot"/"incomplete" → user_provided_correction (confidence 0.7)
309
+ * - "redo"/"again"/"retry"/"try again" → user_repeated_instruction (confidence 0.5)
310
+ *
311
+ * Returns number of signals detected.
312
+ */
313
+ detectFromUserMessages(messages, sessionId) {
314
+ let detected = 0;
315
+ const userMessages = messages.filter((m) => m.role === 'user');
316
+ for (const msg of userMessages) {
317
+ const text = msg.content.toLowerCase();
318
+ const dedupKey = `msg:${msg.ts ?? Date.now()}:${msg.content.substring(0, 40)}`;
319
+ if (this.detectedKeys.has(dedupKey))
320
+ continue;
321
+ // ── Chinese correction patterns ──
322
+ // Strong frustration: "失忆"/"忘了"/"不记得"
323
+ if (/失忆|忘了|(?:怎么|咋).{0,3}(?:忘|漏|没|不记得)/.test(msg.content)) {
324
+ this.detectedKeys.add(dedupKey);
325
+ this.record('user_provided_correction', sessionId, undefined, 0.85, 'auto-msg-correction-strong');
326
+ detected++;
327
+ continue;
328
+ }
329
+ // Direct negation: "不对"/"错了"/"不是这样" (not followed by "吗"/"吧" question)
330
+ if (/(?:不对|错了|不是这样)(?:[吗吧]|的[吗吧])?$/.test(msg.content) ||
331
+ /^(?:不对|错了|不是)!/.test(msg.content)) {
332
+ this.detectedKeys.add(dedupKey);
333
+ this.record('user_provided_correction', sessionId, undefined, 0.8, 'auto-msg-correction-direct');
334
+ detected++;
335
+ continue;
336
+ }
337
+ // Omission: "漏了"/"缺了"/"没包括"/"遗漏"
338
+ if (/漏了|缺了|没包括|遗漏|没统计|没算|少.了/.test(msg.content)) {
339
+ this.detectedKeys.add(dedupKey);
340
+ this.record('user_provided_correction', sessionId, undefined, 0.75, 'auto-msg-correction-omission');
341
+ detected++;
342
+ continue;
343
+ }
344
+ // Agent capability complaint: "你没"/"你怎么"/"你咋" + negative
345
+ if (/(?:你没|你怎么|你咋)(?:.{0,5})(?:听|做|查|看|写|记|算|说|回答|汇总|总结)/.test(msg.content)) {
346
+ this.detectedKeys.add(dedupKey);
347
+ this.record('user_provided_correction', sessionId, undefined, 0.7, 'auto-msg-correction-agent');
348
+ detected++;
349
+ continue;
350
+ }
351
+ // Repeat request: "重新"/"再查"/"再搜"/"再看看"/"再汇总"
352
+ if (/重新.{0,3}(?:做|查|搜|看|写|汇总|弄|搞|来)|再.{0,2}(?:查|搜|看|汇总|弄|搞|试)/.test(msg.content)) {
353
+ this.detectedKeys.add(dedupKey);
354
+ this.record('user_repeated_instruction', sessionId, undefined, 0.6, 'auto-msg-repeat-request');
355
+ detected++;
356
+ continue;
357
+ }
358
+ // Mild interruption: "没音信"/"不对吧"
359
+ if (/没音信|不对吧/.test(msg.content)) {
360
+ this.detectedKeys.add(dedupKey);
361
+ this.record('user_interrupted', sessionId, undefined, 0.5, 'auto-msg-interrupt');
362
+ detected++;
363
+ continue;
364
+ }
365
+ // ── English patterns ──
366
+ // Strong negation
367
+ if (/(?:that.?s|this is|you.?re|you are).{0,5}(?:wrong|incorrect|not right|not correct)/.test(text)) {
368
+ this.detectedKeys.add(dedupKey);
369
+ this.record('user_provided_correction', sessionId, undefined, 0.7, 'auto-msg-correction-en');
370
+ detected++;
371
+ continue;
372
+ }
373
+ // Omission
374
+ if (/(?:missed|missing|forgot|forgotten|incomplete|left out|didn.?t include)/.test(text)) {
375
+ this.detectedKeys.add(dedupKey);
376
+ this.record('user_provided_correction', sessionId, undefined, 0.7, 'auto-msg-omission-en');
377
+ detected++;
378
+ continue;
379
+ }
380
+ // Repeat
381
+ if (/(?:redo|do it again|try again|retry)/.test(text)) {
382
+ this.detectedKeys.add(dedupKey);
383
+ this.record('user_repeated_instruction', sessionId, undefined, 0.5, 'auto-msg-repeat-en');
384
+ detected++;
385
+ }
386
+ }
387
+ return detected;
388
+ }
389
+ // ══════════════════════════════════
390
+ getSignalStrength(signal) {
391
+ switch (signal) {
392
+ case 'user_deleted_code': return -0.8;
393
+ case 'user_interrupted': return -0.6;
394
+ case 'user_provided_correction': return -0.7;
395
+ case 'user_modified_output': return -0.5;
396
+ case 'user_repeated_instruction': return -0.15;
397
+ case 'user_ignored_result': return -0.4;
398
+ case 'user_silence_then_praise': return 0.2;
399
+ case 'user_immediate_continue': return 0.3;
400
+ case 'agent_self_corrected': return 0.3;
401
+ case 'user_explicit_approval': return 0.6;
402
+ case 'user_used_result': return 0.7;
403
+ case 'user_shared_output': return 0.8;
404
+ default: return 0;
405
+ }
406
+ }
407
+ getSatisfactionScore(sessionId, recentHours = 24) {
408
+ // If feedbackLog is empty, try auto-detecting from global audit log first
409
+ if (this.feedbackLog.length === 0 && this.globalAuditPath) {
410
+ this.autoDetectGlobal();
411
+ }
412
+ let relevant = this.feedbackLog;
413
+ if (sessionId) {
414
+ relevant = relevant.filter((f) => f.sessionId === sessionId);
415
+ }
416
+ const cutoff = Date.now() - recentHours * 60 * 60 * 1000;
417
+ relevant = relevant.filter((f) => f.timestamp >= cutoff);
418
+ // No signals: return neutral 0 (maps to 50/100 satisfaction) instead of 0
419
+ if (relevant.length === 0)
420
+ return 0;
421
+ let weightedSum = 0;
422
+ let totalWeight = 0;
423
+ for (const fb of relevant) {
424
+ const ageHours = (Date.now() - fb.timestamp) / (60 * 60 * 1000);
425
+ const recencyWeight = Math.max(0.1, 1 - ageHours / recentHours);
426
+ // Auto-detected signals get 0.5x weight discount to avoid polluting stats
427
+ const sourceWeight = fb.source.startsWith('auto-') ? 0.5 : 1.0;
428
+ const weight = fb.confidence * recencyWeight * sourceWeight;
429
+ weightedSum += fb.strength * weight;
430
+ totalWeight += weight;
431
+ }
432
+ return totalWeight > 0
433
+ ? Math.round((weightedSum / totalWeight) * 100) / 100
434
+ : 0;
435
+ }
436
+ query(filter = {}) {
437
+ let results = this.feedbackLog;
438
+ if (filter.signal)
439
+ results = results.filter((f) => f.signal === filter.signal);
440
+ if (filter.sessionId)
441
+ results = results.filter((f) => f.sessionId === filter.sessionId);
442
+ if (filter.minStrength !== undefined)
443
+ results = results.filter((f) => f.strength >= filter.minStrength);
444
+ if (filter.maxStrength !== undefined)
445
+ results = results.filter((f) => f.strength <= filter.maxStrength);
446
+ if (filter.since !== undefined)
447
+ results = results.filter((f) => f.timestamp >= filter.since);
448
+ results.sort((a, b) => b.timestamp - a.timestamp);
449
+ return results.slice(0, filter.limit ?? 50);
450
+ }
451
+ stats() {
452
+ const positive = this.feedbackLog.filter((f) => f.strength > 0);
453
+ const negative = this.feedbackLog.filter((f) => f.strength < 0);
454
+ const avgStrength = this.feedbackLog.length > 0
455
+ ? this.feedbackLog.reduce((s, f) => s + f.strength, 0) / this.feedbackLog.length
456
+ : 0;
457
+ const counts = new Map();
458
+ for (const fb of this.feedbackLog)
459
+ counts.set(fb.signal, (counts.get(fb.signal) || 0) + 1);
460
+ let mostCommon = null;
461
+ let maxCount = 0;
462
+ for (const [sig, count] of counts) {
463
+ if (count > maxCount) {
464
+ maxCount = count;
465
+ mostCommon = sig;
466
+ }
467
+ }
468
+ return {
469
+ totalSignals: this.feedbackLog.length,
470
+ positiveSignals: positive.length,
471
+ negativeSignals: negative.length,
472
+ averageStrength: Math.round(avgStrength * 100) / 100,
473
+ mostCommonSignal: mostCommon,
474
+ };
475
+ }
476
+ }
477
+ exports.ImplicitFeedbackEngine = ImplicitFeedbackEngine;
478
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/evaluator/feedback.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,+CAAiC;AACjC,uCAAyB;AACzB,2CAA6B;AAE7B;;GAEG;AACH,SAAS,kBAAkB;IACzB,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAa,sBAAsB;IACzB,WAAW,GAAuB,EAAE,CAAC;IACrC,WAAW,GAAkB,IAAI,CAAC;IAC1C,oDAAoD;IAC5C,eAAe,GAAkB,IAAI,CAAC;IAC9C,qEAAqE;IAC7D,YAAY,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC9C,4BAA4B;IACpB,MAAM,CAAU,YAAY,GAAG,GAAG,CAAC;IACnC,MAAM,CAAU,iBAAiB,GAAG,GAAG,CAAC;IAChD,sFAAsF;IAC9E,eAAe,GAAkB,IAAI,CAAC;IAE9C;;OAEG;IACH,MAAM,CACJ,MAAkB,EAClB,SAAiB,EACjB,WAAoB,EACpB,UAAU,GAAG,GAAG,EAChB,MAAM,GAAG,eAAe;QAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAEhD,MAAM,QAAQ,GAAqB;YACjC,EAAE,EAAE,kBAAkB,EAAE;YACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM;YACN,QAAQ;YACR,UAAU;YACV,SAAS;YACT,WAAW;YACX,MAAM;SACP,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,0CAA0C;QAC1C,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,sBAAsB,CAAC,YAAY;YAAE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC/F,kCAAkC;QAClC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,sBAAsB,CAAC,iBAAiB,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBAAC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAAC,IAAI,CAAC,CAAC,IAAI;oBAAE,MAAM;gBAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;QAChH,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,qCAAqC;IACrC,uCAAuC;IACvC,qCAAqC;IAErC;;;;;;;;;;;;;;OAcG;IACH;;OAEG;IACH,iBAAiB,CAAC,aAAqB;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAC3D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;QACrE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,wDAAwD;IAChD,WAAW,GAAG,CAAC,CAAC;IAChB,OAAO;QACb,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACzC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,gEAAgE;YAChE,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;gBAC3B,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;gBACrB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAChC,CAAC;IAED,8DAA8D;IACtD,mBAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;QAClC,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC;gBAAE,OAAO;YACjD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAClE,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;gBAAE,OAAO;YAChC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;YACjC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAChC,CAAC;IAED,6CAA6C;IACrC,IAAI;QACV,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAC9B,IAAI,CAAC;YACH,+BAA+B;YAC/B,IAAI,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;gBAChE,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACtE,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAClD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;oBACpD,IAAI,CAAC,WAAW,GAAG,KAAK;yBACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC;wBAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC;wBAAC,OAAO,IAAI,CAAC;oBAAC,CAAC,CAAC,CAAC,CAAC;yBACpE,MAAM,CAAC,CAAC,CAAC,EAAyB,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC;yBACzE,KAAK,CAAC,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;oBAC/C,OAAO;gBACT,CAAC;YACH,CAAC;YACD,gCAAgC;YAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;gBAAE,OAAO;YAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAClE,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;gBACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;gBACpD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;YAC3E,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACzC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC;gBAAE,OAAO,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAiB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,UAAU,CAAC,OAAqB,EAAE,SAAiB;QACjD,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,+DAA+D;QAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACvC,MAAM,QAAQ,GAAG,eAAe,KAAK,CAAC,EAAE,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAChC,IAAI,CAAC,MAAM,CACT,0BAA0B,EAC1B,SAAS,EACT,KAAK,CAAC,EAAE,EACR,GAAG,EACH,mBAAmB,CACpB,CAAC;oBACF,QAAQ,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,8FAA8F;QAC9F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACtB,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE;oBAAE,SAAS;gBACzB,IAAI,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,QAAQ;oBAC3B,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,cAAc,CAAC;oBACvE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,CAAC;oBACrD,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5C,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBAChC,IAAI,CAAC,MAAM,CACT,2BAA2B,EAC3B,SAAS,EACT,EAAE,CAAC,EAAE,EACL,GAAG,EACH,mBAAmB,CACpB,CAAC;wBACF,QAAQ,EAAE,CAAC;oBACb,CAAC;oBACD,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,wEAAwE;QACxE,mFAAmF;QACnF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACvC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;YAC3E,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5D,MAAM,QAAQ,GAAG,kBAAkB,KAAK,CAAC,EAAE,EAAE,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAChC,IAAI,CAAC,MAAM,CACT,sBAAsB,EACtB,SAAS,EACT,KAAK,CAAC,EAAE,EACR,GAAG,EACH,2BAA2B,CAC5B,CAAC;oBACF,QAAQ,EAAE,CAAC;gBACb,CAAC;gBACD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,4BAA4B;YACpD,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,qCAAqC;IACrC,+DAA+D;IAC/D,qCAAqC;IAErC;;;;;;;;;;;;;;;;;OAiBG;IACH,sBAAsB,CAAC,QAA+D,EAAE,SAAiB;QACvG,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAE/D,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC/E,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAE9C,oCAAoC;YAEpC,sCAAsC;YACtC,IAAI,mCAAmC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,4BAA4B,CAAC,CAAC;gBAClG,QAAQ,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,uEAAuE;YACvE,IAAI,gCAAgC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;gBAClD,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,4BAA4B,CAAC,CAAC;gBACjG,QAAQ,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,iCAAiC;YACjC,IAAI,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,8BAA8B,CAAC,CAAC;gBACpG,QAAQ,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,yDAAyD;YACzD,IAAI,qDAAqD,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,2BAA2B,CAAC,CAAC;gBAChG,QAAQ,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,6CAA6C;YAC7C,IAAI,0DAA0D,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,2BAA2B,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,yBAAyB,CAAC,CAAC;gBAC/F,QAAQ,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,iCAAiC;YACjC,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;gBACjF,QAAQ,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,yBAAyB;YAEzB,kBAAkB;YAClB,IAAI,oFAAoF,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,wBAAwB,CAAC,CAAC;gBAC7F,QAAQ,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,WAAW;YACX,IAAI,yEAAyE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,sBAAsB,CAAC,CAAC;gBAC3F,QAAQ,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,SAAS;YACT,IAAI,sCAAsC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,2BAA2B,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;gBAC1F,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,qCAAqC;IAE7B,iBAAiB,CAAC,MAAkB;QAC1C,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;YACtC,KAAK,kBAAkB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;YACrC,KAAK,0BAA0B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;YAC7C,KAAK,sBAAsB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;YACzC,KAAK,2BAA2B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;YAC/C,KAAK,qBAAqB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;YACxC,KAAK,0BAA0B,CAAC,CAAC,OAAO,GAAG,CAAC;YAC5C,KAAK,yBAAyB,CAAC,CAAC,OAAO,GAAG,CAAC;YAC3C,KAAK,sBAAsB,CAAC,CAAC,OAAO,GAAG,CAAC;YACxC,KAAK,wBAAwB,CAAC,CAAC,OAAO,GAAG,CAAC;YAC1C,KAAK,kBAAkB,CAAC,CAAC,OAAO,GAAG,CAAC;YACpC,KAAK,oBAAoB,CAAC,CAAC,OAAO,GAAG,CAAC;YACtC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,oBAAoB,CAAC,SAAkB,EAAE,WAAW,GAAG,EAAE;QACvD,0EAA0E;QAC1E,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1D,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC;QAED,IAAI,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC;QAEhC,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACzD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;QAEzD,0EAA0E;QAC1E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEpC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAChE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAC;YAChE,0EAA0E;YAC1E,MAAM,YAAY,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/D,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,GAAG,aAAa,GAAG,YAAY,CAAC;YAC5D,WAAW,IAAI,EAAE,CAAC,QAAQ,GAAG,MAAM,CAAC;YACpC,WAAW,IAAI,MAAM,CAAC;QACxB,CAAC;QAED,OAAO,WAAW,GAAG,CAAC;YACpB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YACrD,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,SAOF,EAAE;QACJ,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;QAE/B,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/E,IAAI,MAAM,CAAC,SAAS;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC;QACxF,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,WAAY,CAAC,CAAC;QACzG,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,WAAY,CAAC,CAAC;QACzG,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,KAAM,CAAC,CAAC;QAE9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK;QAOH,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAC7C,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM;YAChF,CAAC,CAAC,CAAC,CAAC;QAEN,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC7C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW;YAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3F,IAAI,UAAU,GAAsB,IAAI,CAAC;QACzC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;gBAAC,QAAQ,GAAG,KAAK,CAAC;gBAAC,UAAU,GAAG,GAAG,CAAC;YAAC,CAAC;QAC/D,CAAC;QAED,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM;YACrC,eAAe,EAAE,QAAQ,CAAC,MAAM;YAChC,eAAe,EAAE,QAAQ,CAAC,MAAM;YAChC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG;YACpD,gBAAgB,EAAE,UAAU;SAC7B,CAAC;IACJ,CAAC;;AA3cH,wDA4cC"}
@@ -0,0 +1,56 @@
1
+ import { PreExecMetrics, RuntimeMetrics, PostExecMetrics } from '../types';
2
+ import { ImplicitFeedbackEngine } from './feedback';
3
+ /**
4
+ * Agent quality profile — accumulated across all evaluations.
5
+ */
6
+ export interface AgentProfile {
7
+ /** Overall quality score (0-100) */
8
+ overallScore: number;
9
+ /** Number of operations evaluated */
10
+ totalOps: number;
11
+ /** Score breakdown by metric category */
12
+ breakdown: {
13
+ preExec: number | null;
14
+ runtime: number | null;
15
+ postExec: number | null;
16
+ userSatisfaction: number;
17
+ };
18
+ /** Trend data */
19
+ trends: {
20
+ improving: boolean;
21
+ recentOps: number;
22
+ recentScore: number;
23
+ };
24
+ /** Areas needing attention */
25
+ warnings: string[];
26
+ /** Kudos for good patterns */
27
+ strengths: string[];
28
+ }
29
+ /**
30
+ * AgentProfiler — builds and maintains the agent's quality profile.
31
+ *
32
+ * Aggregates PreExec + Runtime + PostExec metrics and
33
+ * ImplicitFeedback to produce a composite quality score
34
+ * that improves over time through self-correction.
35
+ */
36
+ export declare class AgentProfiler {
37
+ private feedbackEngine;
38
+ private preMetrics;
39
+ private runMetrics;
40
+ private postMetrics;
41
+ private sessionScores;
42
+ private static readonly MAX_HISTORY;
43
+ constructor(feedbackEngine: ImplicitFeedbackEngine);
44
+ /**
45
+ * Record a complete evaluation cycle for one tool call.
46
+ */
47
+ recordCycle(sessionId: string, pre: PreExecMetrics, run: RuntimeMetrics, post: PostExecMetrics): void;
48
+ /** Clean up session scores to prevent memory leak */
49
+ clearSession(sessionId: string): void;
50
+ /**
51
+ * Build the current agent profile.
52
+ */
53
+ getProfile(sessionId?: string): AgentProfile;
54
+ private average;
55
+ }
56
+ //# sourceMappingURL=profiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../../src/evaluator/profiler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,iBAAiB;IACjB,MAAM,EAAE;QACN,SAAS,EAAE,OAAO,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAyB;IAE/C,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,aAAa,CAAoC;IAEzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAO;gBAE9B,cAAc,EAAE,sBAAsB;IAIlD;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAmBrG,qDAAqD;IACrD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY;IA2F5C,OAAO,CAAC,OAAO;CAKhB"}