mister-wolf 2.2.1 → 2.3.2

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 (77) hide show
  1. package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
  2. package/dist/adapters/cli/cli-entry.js +4 -0
  3. package/dist/adapters/cli/cli-entry.js.map +1 -1
  4. package/dist/adapters/cli/commands/analytics.d.ts +22 -0
  5. package/dist/adapters/cli/commands/analytics.d.ts.map +1 -0
  6. package/dist/adapters/cli/commands/analytics.js +218 -0
  7. package/dist/adapters/cli/commands/analytics.js.map +1 -0
  8. package/dist/adapters/cli/commands/dashboard.d.ts +15 -0
  9. package/dist/adapters/cli/commands/dashboard.d.ts.map +1 -0
  10. package/dist/adapters/cli/commands/dashboard.js +209 -0
  11. package/dist/adapters/cli/commands/dashboard.js.map +1 -0
  12. package/dist/adapters/cli/commands/memory-effectiveness.d.ts.map +1 -1
  13. package/dist/adapters/cli/commands/memory-effectiveness.js +44 -4
  14. package/dist/adapters/cli/commands/memory-effectiveness.js.map +1 -1
  15. package/dist/adapters/cli/commands/memory-insights.d.ts.map +1 -1
  16. package/dist/adapters/cli/commands/memory-insights.js +3 -1
  17. package/dist/adapters/cli/commands/memory-insights.js.map +1 -1
  18. package/dist/adapters/cli/commands/memory-run.d.ts.map +1 -1
  19. package/dist/adapters/cli/commands/memory-run.js +37 -1
  20. package/dist/adapters/cli/commands/memory-run.js.map +1 -1
  21. package/dist/adapters/cli/commands/table-render.d.ts +18 -0
  22. package/dist/adapters/cli/commands/table-render.d.ts.map +1 -0
  23. package/dist/adapters/cli/commands/table-render.js +74 -0
  24. package/dist/adapters/cli/commands/table-render.js.map +1 -0
  25. package/dist/adapters/cli/opencode-run-metrics.d.ts +7 -0
  26. package/dist/adapters/cli/opencode-run-metrics.d.ts.map +1 -1
  27. package/dist/adapters/cli/opencode-run-metrics.js +12 -2
  28. package/dist/adapters/cli/opencode-run-metrics.js.map +1 -1
  29. package/dist/adapters/fs/config-file.d.ts.map +1 -1
  30. package/dist/adapters/fs/config-file.js +32 -0
  31. package/dist/adapters/fs/config-file.js.map +1 -1
  32. package/dist/adapters/fs/effectiveness-snapshots.d.ts +12 -0
  33. package/dist/adapters/fs/effectiveness-snapshots.d.ts.map +1 -0
  34. package/dist/adapters/fs/effectiveness-snapshots.js +42 -0
  35. package/dist/adapters/fs/effectiveness-snapshots.js.map +1 -0
  36. package/dist/adapters/fs/session-metrics-log.d.ts +26 -1
  37. package/dist/adapters/fs/session-metrics-log.d.ts.map +1 -1
  38. package/dist/adapters/fs/session-metrics-log.js +12 -1
  39. package/dist/adapters/fs/session-metrics-log.js.map +1 -1
  40. package/dist/adapters/mcp/mcp-schemas.d.ts +28 -0
  41. package/dist/adapters/mcp/mcp-schemas.d.ts.map +1 -1
  42. package/dist/adapters/mcp/mcp-schemas.js +10 -0
  43. package/dist/adapters/mcp/mcp-schemas.js.map +1 -1
  44. package/dist/adapters/mcp/mcp-tools.d.ts.map +1 -1
  45. package/dist/adapters/mcp/mcp-tools.js +45 -1
  46. package/dist/adapters/mcp/mcp-tools.js.map +1 -1
  47. package/dist/app/use-cases/build-analytics.d.ts +201 -0
  48. package/dist/app/use-cases/build-analytics.d.ts.map +1 -0
  49. package/dist/app/use-cases/build-analytics.js +595 -0
  50. package/dist/app/use-cases/build-analytics.js.map +1 -0
  51. package/dist/app/use-cases/build-dashboard.d.ts +38 -0
  52. package/dist/app/use-cases/build-dashboard.d.ts.map +1 -0
  53. package/dist/app/use-cases/build-dashboard.js +31 -0
  54. package/dist/app/use-cases/build-dashboard.js.map +1 -0
  55. package/dist/app/use-cases/effectiveness.d.ts +27 -0
  56. package/dist/app/use-cases/effectiveness.d.ts.map +1 -1
  57. package/dist/app/use-cases/effectiveness.js +63 -0
  58. package/dist/app/use-cases/effectiveness.js.map +1 -1
  59. package/dist/app/use-cases/generate-insights.d.ts +15 -0
  60. package/dist/app/use-cases/generate-insights.d.ts.map +1 -1
  61. package/dist/app/use-cases/generate-insights.js +36 -1
  62. package/dist/app/use-cases/generate-insights.js.map +1 -1
  63. package/dist/app/use-cases/snapshot-delta.d.ts +22 -0
  64. package/dist/app/use-cases/snapshot-delta.d.ts.map +1 -0
  65. package/dist/app/use-cases/snapshot-delta.js +72 -0
  66. package/dist/app/use-cases/snapshot-delta.js.map +1 -0
  67. package/dist/domain/pricing.d.ts +20 -0
  68. package/dist/domain/pricing.d.ts.map +1 -0
  69. package/dist/domain/pricing.js +12 -0
  70. package/dist/domain/pricing.js.map +1 -0
  71. package/dist/domain/taxonomy.d.ts +10 -0
  72. package/dist/domain/taxonomy.d.ts.map +1 -1
  73. package/dist/domain/taxonomy.js.map +1 -1
  74. package/dist/domain/tool-economy.d.ts +15 -0
  75. package/dist/domain/tool-economy.d.ts.map +1 -1
  76. package/dist/domain/tool-economy.js.map +1 -1
  77. package/package.json +1 -1
@@ -0,0 +1,595 @@
1
+ import { DEFAULT_PATTERN_THRESHOLD } from '../../adapters/fs/session-metrics-log.js';
2
+ import { parseRunLog } from '../../domain/tool-economy.js';
3
+ import { UNCATEGORIZED_ERROR_CLASS } from '../../domain/error-class.js';
4
+ import { runCostUsd } from '../../domain/pricing.js';
5
+ import { silentRuleIds } from './learn-decay.js';
6
+ import { mondayOf } from './generate-insights.js';
7
+ export const DEFAULT_LIFECYCLE_THRESHOLDS = { newDays: 14, workhorseUses: 3 };
8
+ /** Override из config (analytics.thresholds) поверх дефолтов (D7). */
9
+ export function resolveLifecycleThresholds(override) {
10
+ return { ...DEFAULT_LIFECYCLE_THRESHOLDS, ...override };
11
+ }
12
+ /** uses >= workhorseUses → workhorse; 1..workhorseUses-1 → sleeper; 0 && ageDays <= newDays → new; иначе dead. */
13
+ export function classifyLifecycle(uses, ageDays, t) {
14
+ if (uses >= t.workhorseUses)
15
+ return 'workhorse';
16
+ if (uses >= 1)
17
+ return 'sleeper';
18
+ return ageDays <= t.newDays ? 'new' : 'dead';
19
+ }
20
+ // ---------------------------------------------------------------------------
21
+ // Внутренние хелперы
22
+ // ---------------------------------------------------------------------------
23
+ /** Passthrough-поля MemoryObject — читаем кастом, NaN/Infinity отбрасываем (прецедент effectiveness). */
24
+ function finiteNumber(value) {
25
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
26
+ }
27
+ /** Memory ledger (Q1/Q2): per-object след использования + lifecycle-класс D7. */
28
+ function buildMemoryLedger(objects, events, signals, now, t) {
29
+ const rows = [];
30
+ for (const o of objects) {
31
+ // база: активная память минус archived и document-ref (прецедент noise-метрики)
32
+ if (o.status === 'archived' || o.type === 'document-ref')
33
+ continue;
34
+ const rec = o;
35
+ // tool-доставки пишутся по полю name (ToolFields), не по id объекта
36
+ const toolName = o.type === 'tool' && typeof rec.name === 'string' ? rec.name : null;
37
+ let lastUsed = null;
38
+ const bump = (ts) => {
39
+ if (ts !== null && (lastUsed === null || ts > lastUsed))
40
+ lastUsed = ts;
41
+ };
42
+ // доставки: delivery-сигналы по detail.name === id (или tool-name)
43
+ let deliveries = 0;
44
+ for (const s of signals) {
45
+ if (s.event !== 'delivery')
46
+ continue;
47
+ const name = s.detail?.name;
48
+ if (name === o.id || (toolName !== null && name === toolName)) {
49
+ deliveries += 1;
50
+ bump(s.ts);
51
+ }
52
+ }
53
+ // срабатывания: любое событие кроме memory.added с payload.memory_id === id (прецедент readIds)
54
+ let triggers = 0;
55
+ for (const ev of events) {
56
+ if (ev.type === 'memory.added')
57
+ continue;
58
+ const mid = ev.payload?.memory_id;
59
+ if (mid === o.id) {
60
+ triggers += 1;
61
+ bump(ev.timestamp);
62
+ }
63
+ }
64
+ // жалобы: complaint-сигналы по detail.object_id
65
+ let complaints = 0;
66
+ for (const s of signals) {
67
+ if (s.event === 'complaint' && s.detail?.object_id === o.id) {
68
+ complaints += 1;
69
+ bump(s.ts);
70
+ }
71
+ }
72
+ // у tool-объектов last_used_at пишется использованием (ToolFields)
73
+ if (toolName !== null && typeof rec.last_used_at === 'string')
74
+ bump(rec.last_used_at);
75
+ const ageDays = Math.floor((now.getTime() - Date.parse(o.created_at)) / 86_400_000);
76
+ const uses = deliveries + triggers;
77
+ rows.push({
78
+ id: o.id,
79
+ type: o.type,
80
+ title: o.title,
81
+ status: o.status,
82
+ created_at: o.created_at,
83
+ age_days: ageDays,
84
+ deliveries,
85
+ triggers,
86
+ complaints,
87
+ holdout_prevented: finiteNumber(rec.holdout_prevented),
88
+ holdout_checked: finiteNumber(rec.holdout_checked),
89
+ last_used: lastUsed,
90
+ lifecycle: classifyLifecycle(uses, ageDays, t),
91
+ });
92
+ }
93
+ const dead = rows.filter((r) => r.lifecycle === 'dead').length;
94
+ const base = rows.length;
95
+ return { rows, garbage: { dead, base, ratioPct: base > 0 ? (dead / base) * 100 : null } };
96
+ }
97
+ /** Каст tool-полей реестра (ToolFields в tool-librarian.ts): name — ключ lookup'а. */
98
+ function toolNameOf(o) {
99
+ const rec = o;
100
+ return o.type === 'tool' && typeof rec.name === 'string' && rec.name !== '' ? rec.name : null;
101
+ }
102
+ /** Tool ledger (Q3, D11): script = объекты type:'tool'; model-native = имена из логов минус script. */
103
+ function buildToolLedger(toolObjects, signals, runLogText, patternThreshold) {
104
+ // ошибки по имени тула: tool_error-сигналы, группа по error_class_id
105
+ const errorsByName = new Map();
106
+ for (const ev of signals) {
107
+ if (ev.event !== 'tool_error' || typeof ev.tool_name !== 'string')
108
+ continue;
109
+ const tally = errorsByName.get(ev.tool_name) ?? { count: 0, classes: new Map() };
110
+ tally.count += 1;
111
+ const cls = ev.error_class_id ?? UNCATEGORIZED_ERROR_CLASS;
112
+ tally.classes.set(cls, (tally.classes.get(cls) ?? 0) + 1);
113
+ errorsByName.set(ev.tool_name, tally);
114
+ }
115
+ const errorRow = (name) => {
116
+ const tally = errorsByName.get(name);
117
+ if (tally === undefined)
118
+ return { errorCount: 0, errorClasses: [] };
119
+ return {
120
+ errorCount: tally.count,
121
+ errorClasses: [...tally.classes.entries()]
122
+ .map(([id, count]) => ({ id, count }))
123
+ .sort((a, b) => b.count - a.count || a.id.localeCompare(b.id)),
124
+ };
125
+ };
126
+ const rows = [];
127
+ const scriptNames = new Set();
128
+ // script-ряды: реестр type:'tool' (каст ToolFields — прецедент tool-stats)
129
+ for (const o of toolObjects) {
130
+ const rec = o;
131
+ const name = toolNameOf(o) ?? o.title;
132
+ scriptNames.add(name);
133
+ const usageCount = typeof rec.usage_count === 'number' ? rec.usage_count : 0;
134
+ rows.push({
135
+ name,
136
+ origin: 'script',
137
+ id: o.id,
138
+ status: o.status,
139
+ usageCount,
140
+ lastUsedAt: typeof rec.last_used_at === 'string' ? rec.last_used_at : null,
141
+ ...errorRow(name),
142
+ promotion: o.status === 'candidate' && usageCount >= patternThreshold ? 'expose-candidate' : null,
143
+ });
144
+ }
145
+ // model-native: имена из tool_error-сигналов ∪ run-log tools[], минус зарегистрированные script
146
+ const nativeCounts = new Map();
147
+ const bumpNative = (name) => {
148
+ nativeCounts.set(name, (nativeCounts.get(name) ?? 0) + 1);
149
+ };
150
+ for (const ev of signals) {
151
+ if (ev.event === 'tool_error' && typeof ev.tool_name === 'string')
152
+ bumpNative(ev.tool_name);
153
+ }
154
+ for (const entry of parseRunLog(runLogText ?? '')) {
155
+ for (const name of entry.tools ?? [])
156
+ bumpNative(name);
157
+ }
158
+ for (const [name, usageCount] of nativeCounts) {
159
+ if (scriptNames.has(name))
160
+ continue;
161
+ rows.push({
162
+ name,
163
+ origin: 'model-native',
164
+ id: null,
165
+ status: null,
166
+ usageCount,
167
+ lastUsedAt: null,
168
+ ...errorRow(name),
169
+ promotion: usageCount >= patternThreshold ? 'register-candidate' : null,
170
+ });
171
+ }
172
+ // сортировка: script первым, потом usageCount убыв., потом имя
173
+ return rows.sort((a, b) => {
174
+ if (a.origin !== b.origin)
175
+ return a.origin === 'script' ? -1 : 1;
176
+ return b.usageCount - a.usageCount || a.name.localeCompare(b.name);
177
+ });
178
+ }
179
+ /** Rule ranking (Q4): все статусы; prevented из holdout_prevented; silent от silentRuleIds. */
180
+ function buildRuleRanking(ruleObjects, signals) {
181
+ const silent = silentRuleIds(signals).ids;
182
+ return ruleObjects
183
+ .map((o) => {
184
+ const rec = o;
185
+ return {
186
+ id: o.id,
187
+ title: o.title,
188
+ status: o.status,
189
+ prevented: finiteNumber(rec.holdout_prevented) ?? 0,
190
+ checked: finiteNumber(rec.holdout_checked),
191
+ silent: silent.has(o.id),
192
+ };
193
+ })
194
+ .sort((a, b) => b.prevented - a.prevented || Number(a.silent) - Number(b.silent) || a.id.localeCompare(b.id));
195
+ }
196
+ /** Ключи недельных бакетов (понедельники ISO), от старой к новой; weeks — глубина окна. */
197
+ function weekBuckets(now, weeks) {
198
+ const currentMondayMs = Date.parse(`${mondayOf(now.toISOString())}T00:00:00Z`);
199
+ const keys = [];
200
+ for (let i = weeks - 1; i >= 0; i--)
201
+ keys.push(new Date(currentMondayMs - i * 7 * 86_400_000).toISOString().slice(0, 10));
202
+ return keys;
203
+ }
204
+ /** Воронка Q6: write (memory.added) → deliver (delivery-сигналы) → trigger (уникальные имена).
205
+ * prevented НЕ входит: holdout-счётчики кумулятивны, без таймстампов (спека §5 M5, rev.4). */
206
+ function buildFunnel(events, signals, now, weeks) {
207
+ const buckets = new Map();
208
+ for (const week of weekBuckets(now, weeks)) {
209
+ buckets.set(week, { week, writes: 0, delivers: 0, names: new Set() });
210
+ }
211
+ for (const ev of events) {
212
+ if (ev.type !== 'memory.added')
213
+ continue;
214
+ const b = buckets.get(mondayOf(ev.timestamp));
215
+ if (b !== undefined)
216
+ b.writes += 1;
217
+ }
218
+ for (const s of signals) {
219
+ if (s.event !== 'delivery')
220
+ continue;
221
+ const b = buckets.get(mondayOf(s.ts));
222
+ if (b === undefined)
223
+ continue;
224
+ b.delivers += 1;
225
+ if (typeof s.detail?.name === 'string')
226
+ b.names.add(s.detail.name); // прецедент delivery.triggeredObjects
227
+ }
228
+ return [...buckets.values()].map(({ week, writes, delivers, names }) => ({
229
+ week,
230
+ writes,
231
+ delivers,
232
+ triggers: names.size,
233
+ writeToDeliverPct: writes > 0 ? (delivers / writes) * 100 : null,
234
+ deliverToTriggerPct: delivers > 0 ? (names.size / delivers) * 100 : null,
235
+ }));
236
+ }
237
+ /** Outliers Q8: top-N прогонов по finite weighted; $ при pricing (D9 — без данных null). */
238
+ function buildOutliers(runLogText, pricing, top) {
239
+ return parseRunLog(runLogText ?? '')
240
+ .filter((e) => finiteNumber(e.weighted) !== null)
241
+ .sort((a, b) => (b.weighted ?? 0) - (a.weighted ?? 0))
242
+ .slice(0, top)
243
+ .map((e) => ({
244
+ ts: typeof e.ts === 'string' ? e.ts : null,
245
+ model: typeof e.model === 'string' ? e.model : null,
246
+ agent: typeof e.agent === 'string' ? e.agent : null,
247
+ title: typeof e.title === 'string' ? e.title : null,
248
+ weighted: e.weighted,
249
+ costUsd: runCostUsd(e.tokens, pricing, typeof e.model === 'string' ? e.model : null),
250
+ tools: e.tools ?? [],
251
+ }));
252
+ }
253
+ /** Agent ledger Q11: строки по run-агентам ∪ complaint-акторам `agent:<имя>`; три уровня —
254
+ * объём (runs/weighted/duration/cost), проблемы (failures/toolErrors/жалобы), достижения
255
+ * (successes/holdout_prevented его rule/lesson). */
256
+ function buildAgents(signals, objects, pricing) {
257
+ const AGENT_PREFIX = 'agent:';
258
+ const acc = new Map();
259
+ const rowOf = (name) => {
260
+ let r = acc.get(name);
261
+ if (r === undefined) {
262
+ r = {
263
+ runs: 0,
264
+ failures: 0,
265
+ successes: 0,
266
+ weighted: 0,
267
+ durations: [],
268
+ cost: null,
269
+ toolErrors: 0,
270
+ complaintsBy: 0,
271
+ complaintsAbout: 0,
272
+ holdoutSum: 0,
273
+ hasHoldout: false,
274
+ };
275
+ acc.set(name, r);
276
+ }
277
+ return r;
278
+ };
279
+ // проход 1: источники строк (run-агенты, complaint-акторы) + объём/ошибки
280
+ for (const ev of signals) {
281
+ if (ev.event === 'run' && typeof ev.gen_ai.agent === 'string' && ev.gen_ai.agent !== '') {
282
+ const r = rowOf(ev.gen_ai.agent);
283
+ r.runs += 1;
284
+ if (ev.outcome === 'ok')
285
+ r.successes += 1;
286
+ else
287
+ r.failures += 1;
288
+ r.weighted += finiteNumber(ev.weighted) ?? 0;
289
+ const d = finiteNumber(ev.duration_ms);
290
+ if (d !== null)
291
+ r.durations.push(d);
292
+ const cost = runCostUsd(ev.tokens, pricing, ev.gen_ai.modelID);
293
+ if (cost !== null)
294
+ r.cost = (r.cost ?? 0) + cost;
295
+ }
296
+ if (ev.event === 'complaint') {
297
+ const actor = ev.orchestration.actor;
298
+ if (actor.startsWith(`${AGENT_PREFIX}`) && actor.length > AGENT_PREFIX.length) {
299
+ rowOf(actor.slice(AGENT_PREFIX.length)).complaintsBy += 1;
300
+ }
301
+ }
302
+ }
303
+ // tool-ошибки по агенту — только для существующих строк (строки создают run/complaint-actor)
304
+ for (const ev of signals) {
305
+ if (ev.event === 'tool_error' && typeof ev.gen_ai.agent === 'string' && acc.has(ev.gen_ai.agent)) {
306
+ acc.get(ev.gen_ai.agent).toolErrors += 1;
307
+ }
308
+ }
309
+ // проход 2: жалобы НА агента — detail.about содержит имя
310
+ for (const ev of signals) {
311
+ if (ev.event !== 'complaint')
312
+ continue;
313
+ const about = String(ev.detail?.about ?? '');
314
+ if (about === '')
315
+ continue;
316
+ for (const name of acc.keys()) {
317
+ if (about.includes(name))
318
+ acc.get(name).complaintsAbout += 1;
319
+ }
320
+ }
321
+ // достижения: holdout_prevented у rule/lesson с created_by === 'agent:<имя>'
322
+ for (const o of objects) {
323
+ if (o.type !== 'rule' && o.type !== 'lesson')
324
+ continue;
325
+ // план-код падал на моках без created_by: guard (схема требует, тестовые фикстуры — нет)
326
+ if (typeof o.created_by !== 'string' || !o.created_by.startsWith(AGENT_PREFIX))
327
+ continue;
328
+ const name = o.created_by.slice(AGENT_PREFIX.length);
329
+ if (!acc.has(name))
330
+ continue;
331
+ const p = finiteNumber(o.holdout_prevented);
332
+ if (p !== null) {
333
+ acc.get(name).holdoutSum += p;
334
+ acc.get(name).hasHoldout = true;
335
+ }
336
+ }
337
+ return [...acc.entries()]
338
+ .map(([agent, r]) => ({
339
+ agent,
340
+ runs: r.runs,
341
+ failures: r.failures,
342
+ failureRatePct: r.runs > 0 ? (r.failures / r.runs) * 100 : null,
343
+ weighted: r.weighted,
344
+ avgDurationMs: r.durations.length > 0 ? r.durations.reduce((s, v) => s + v, 0) / r.durations.length : null,
345
+ costUsd: r.cost,
346
+ toolErrors: r.toolErrors,
347
+ complaintsBy: r.complaintsBy,
348
+ complaintsAbout: r.complaintsAbout,
349
+ successes: r.successes,
350
+ holdoutPrevented: r.hasHoldout ? r.holdoutSum : null,
351
+ }))
352
+ .sort((a, b) => b.runs - a.runs || a.agent.localeCompare(b.agent));
353
+ }
354
+ /** Вид мутации события: update/supersede/resolve/transition; memory.updated с kind='tool.used'
355
+ * → tool-mutation; added/scan.updated — не мутации. */
356
+ function mutationKindOf(ev) {
357
+ switch (ev.type) {
358
+ case 'memory.updated': {
359
+ const kind = ev.payload?.kind;
360
+ return kind === 'tool.used' ? 'tool-mutation' : 'update';
361
+ }
362
+ case 'memory.superseded':
363
+ return 'supersede';
364
+ case 'memory.resolved':
365
+ return 'resolve';
366
+ case 'memory.transitioned':
367
+ return 'transition';
368
+ default:
369
+ return null;
370
+ }
371
+ }
372
+ const MUTATION_KINDS = ['update', 'supersede', 'resolve', 'transition', 'tool-mutation'];
373
+ /** Steward view Q12: мутации за окно weeks (то же, что воронка), жалобная воронка,
374
+ * SLA-эскалации (dispatch_ages >= 3), рецидивы, churn, доля авто-мутаций. */
375
+ function buildSteward(events, signals, objects, now, weeks) {
376
+ const keys = weekBuckets(now, weeks);
377
+ // мутации: виды + недели + churn + авто-доля
378
+ const kindCount = new Map(MUTATION_KINDS.map((k) => [k, 0]));
379
+ const weekTotal = new Map(keys.map((k) => [k, 0]));
380
+ const mutationsById = new Map();
381
+ let totalMutations = 0;
382
+ let autoMutations = 0;
383
+ for (const ev of events) {
384
+ const kind = mutationKindOf(ev);
385
+ if (kind === null)
386
+ continue;
387
+ if (!weekTotal.has(mondayOf(ev.timestamp)))
388
+ continue; // вне окна
389
+ kindCount.set(kind, (kindCount.get(kind) ?? 0) + 1);
390
+ weekTotal.set(mondayOf(ev.timestamp), (weekTotal.get(mondayOf(ev.timestamp)) ?? 0) + 1);
391
+ totalMutations += 1;
392
+ if (ev.actor === 'system:wolf')
393
+ autoMutations += 1;
394
+ const mid = ev.payload?.memory_id;
395
+ if (typeof mid === 'string')
396
+ mutationsById.set(mid, (mutationsById.get(mid) ?? 0) + 1);
397
+ }
398
+ // жалобная воронка
399
+ const complaints = signals.filter((s) => s.event === 'complaint' && weekTotal.has(mondayOf(s.ts)));
400
+ const filed = complaints.length;
401
+ let resolved = 0;
402
+ let rejected = 0;
403
+ for (const ev of events) {
404
+ if (!weekTotal.has(mondayOf(ev.timestamp)))
405
+ continue;
406
+ if (ev.type === 'memory.resolved')
407
+ resolved += 1;
408
+ if (ev.type === 'memory.transitioned' && ev.payload?.to === 'rejected') {
409
+ rejected += 1;
410
+ }
411
+ }
412
+ // время жизни: resolved-событие − первый complaint по тому же id (в часах)
413
+ const firstComplaintById = new Map();
414
+ for (const s of signals) {
415
+ if (s.event !== 'complaint')
416
+ continue;
417
+ const id = s.detail?.object_id;
418
+ if (typeof id !== 'string')
419
+ continue;
420
+ const cur = firstComplaintById.get(id);
421
+ if (cur === undefined || s.ts < cur)
422
+ firstComplaintById.set(id, s.ts);
423
+ }
424
+ const lifetimes = [];
425
+ for (const ev of events) {
426
+ if (ev.type !== 'memory.resolved')
427
+ continue;
428
+ const mid = ev.payload?.memory_id;
429
+ if (typeof mid !== 'string')
430
+ continue;
431
+ const first = firstComplaintById.get(mid);
432
+ if (first === undefined)
433
+ continue;
434
+ lifetimes.push((Date.parse(ev.timestamp) - Date.parse(first)) / 3_600_000);
435
+ }
436
+ const avgLifetimeHours = lifetimes.length > 0 ? lifetimes.reduce((s, v) => s + v, 0) / lifetimes.length : null;
437
+ // SLA: объекты с dispatch_ages >= 3 (passthrough-поле)
438
+ let slaEscalations = 0;
439
+ for (const o of objects) {
440
+ const dispatchAges = finiteNumber(o.dispatch_ages);
441
+ if (dispatchAges !== null && dispatchAges >= 3)
442
+ slaEscalations += 1;
443
+ }
444
+ // рецидивы: ≥2 жалобы на объект И update по нему строго между первой и последней жалобой
445
+ const complaintTsById = new Map();
446
+ for (const s of signals) {
447
+ if (s.event !== 'complaint')
448
+ continue;
449
+ const id = s.detail?.object_id;
450
+ if (typeof id !== 'string')
451
+ continue;
452
+ const arr = complaintTsById.get(id) ?? [];
453
+ arr.push(s.ts);
454
+ complaintTsById.set(id, arr);
455
+ }
456
+ const updateTsById = new Map();
457
+ for (const ev of events) {
458
+ if (ev.type !== 'memory.updated')
459
+ continue;
460
+ const mid = ev.payload?.memory_id;
461
+ if (typeof mid !== 'string')
462
+ continue;
463
+ const arr = updateTsById.get(mid) ?? [];
464
+ arr.push(ev.timestamp);
465
+ updateTsById.set(mid, arr);
466
+ }
467
+ let recidivismCount = 0;
468
+ for (const [id, tsList] of complaintTsById) {
469
+ if (tsList.length < 2)
470
+ continue;
471
+ const sorted = [...tsList].sort();
472
+ const first = sorted[0];
473
+ const last = sorted[sorted.length - 1];
474
+ if ((updateTsById.get(id) ?? []).some((ts) => ts > first && ts < last))
475
+ recidivismCount += 1;
476
+ }
477
+ const churnIds = [...mutationsById.entries()]
478
+ .filter(([, n]) => n >= 2)
479
+ .map(([id]) => id)
480
+ .sort();
481
+ return {
482
+ mutations: MUTATION_KINDS.map((kind) => ({ kind, count: kindCount.get(kind) ?? 0 })),
483
+ mutationsByWeek: keys.map((week) => ({ week, total: weekTotal.get(week) ?? 0 })),
484
+ complaintFunnel: { filed, resolved, rejected, avgLifetimeHours, slaEscalations },
485
+ recidivismCount,
486
+ churnIds,
487
+ autoMutationSharePct: totalMutations > 0 ? (autoMutations / totalMutations) * 100 : null,
488
+ };
489
+ }
490
+ /** Experiment readiness Q10: доля run-сигналов с experiment.arm; выборки по группам. */
491
+ function buildReadiness(signals) {
492
+ const runs = signals.filter((s) => s.event === 'run');
493
+ let withArm = 0;
494
+ const byArm = new Map();
495
+ const byExperiment = new Map();
496
+ for (const ev of runs) {
497
+ const experiment = ev.experiment;
498
+ const arm = experiment?.arm;
499
+ if (typeof arm === 'string' && arm !== '') {
500
+ withArm += 1;
501
+ byArm.set(arm, (byArm.get(arm) ?? 0) + 1);
502
+ }
503
+ const id = experiment?.id;
504
+ if (typeof id === 'string' && id !== '')
505
+ byExperiment.set(id, (byExperiment.get(id) ?? 0) + 1);
506
+ }
507
+ const totalRuns = runs.length;
508
+ return {
509
+ totalRuns,
510
+ withArm,
511
+ withArmPct: totalRuns > 0 ? (withArm / totalRuns) * 100 : null,
512
+ byArm: [...byArm.entries()].map(([arm, n]) => ({ arm, runs: n })).sort((a, b) => a.arm.localeCompare(b.arm)),
513
+ byExperiment: [...byExperiment.entries()]
514
+ .map(([experiment, n]) => ({ experiment, runs: n }))
515
+ .sort((a, b) => b.runs - a.runs || a.experiment.localeCompare(b.experiment)),
516
+ };
517
+ }
518
+ // ---------------------------------------------------------------------------
519
+ // Use-case
520
+ // ---------------------------------------------------------------------------
521
+ /**
522
+ * Полный аналитический отчёт M5 из трёх портов: чистая агрегация, детерминированная.
523
+ * Не падает на пустой памяти — все блоки возвращают нули/null/пустые массивы.
524
+ */
525
+ export async function buildAnalyticsReport(deps, input) {
526
+ const thresholds = resolveLifecycleThresholds(input.thresholds);
527
+ const now = deps.clock.now();
528
+ // ponytail: store.list() — полный reparse всех md; ровно один вызов на отчёт (прецедент generateInsights)
529
+ const allObjects = await deps.store.list();
530
+ const events = await deps.log.readAll();
531
+ const weeks = input.weeks ?? 8;
532
+ const memory = buildMemoryLedger(allObjects, events, input.signals, now, thresholds);
533
+ const tools = buildToolLedger(allObjects.filter((o) => o.type === 'tool'), input.signals, input.runLogText, input.patternThreshold ?? DEFAULT_PATTERN_THRESHOLD);
534
+ const rules = buildRuleRanking(allObjects.filter((o) => o.type === 'rule'), input.signals);
535
+ const funnel = buildFunnel(events, input.signals, now, weeks);
536
+ const outliers = buildOutliers(input.runLogText, input.pricing, input.topOutliers ?? 10);
537
+ const agents = buildAgents(input.signals, allObjects, input.pricing);
538
+ const steward = buildSteward(events, input.signals, allObjects, now, weeks);
539
+ const readiness = buildReadiness(input.signals);
540
+ return {
541
+ generatedAt: now.toISOString(),
542
+ thresholds,
543
+ memory,
544
+ tools,
545
+ rules,
546
+ funnel,
547
+ outliers,
548
+ agents,
549
+ steward,
550
+ readiness,
551
+ };
552
+ }
553
+ /** Срез отчёта по view-фильтру (§6.2); top ограничивает строки, дефолт 20. */
554
+ export function filterAnalytics(report, filter) {
555
+ const top = filter.top ?? 20;
556
+ switch (filter.view) {
557
+ case 'memory': {
558
+ let rows = report.memory.rows;
559
+ if (filter.class !== undefined)
560
+ rows = rows.filter((r) => r.lifecycle === filter.class);
561
+ if (filter.type !== undefined)
562
+ rows = rows.filter((r) => r.type === filter.type);
563
+ return { view: 'memory', rows: rows.slice(0, top), garbage: report.memory.garbage };
564
+ }
565
+ case 'tools': {
566
+ let rows = report.tools;
567
+ if (filter.origin !== undefined)
568
+ rows = rows.filter((r) => r.origin === filter.origin);
569
+ return { view: 'tools', rows: rows.slice(0, top) };
570
+ }
571
+ case 'rules': {
572
+ let rows = report.rules;
573
+ if (filter.silent !== undefined)
574
+ rows = rows.filter((r) => r.silent === filter.silent);
575
+ return { view: 'rules', rows: rows.slice(0, top) };
576
+ }
577
+ case 'funnel':
578
+ return { view: 'funnel', weeks: report.funnel };
579
+ case 'agents': {
580
+ let rows = report.agents;
581
+ if (filter.agent !== undefined)
582
+ rows = rows.filter((r) => r.agent === filter.agent);
583
+ return { view: 'agents', rows: rows.slice(0, top) };
584
+ }
585
+ case 'steward':
586
+ return { view: 'steward', steward: report.steward };
587
+ case 'outliers':
588
+ return { view: 'outliers', runs: report.outliers.slice(0, top) };
589
+ case 'readiness':
590
+ return { view: 'readiness', readiness: report.readiness };
591
+ case 'all':
592
+ return { view: 'all', report };
593
+ }
594
+ }
595
+ //# sourceMappingURL=build-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-analytics.js","sourceRoot":"","sources":["../../../src/app/use-cases/build-analytics.ts"],"names":[],"mappings":"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"}