mister-wolf 2.5.0 → 2.7.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/adapters/cli/cli-entry.d.ts.map +1 -1
- package/dist/adapters/cli/cli-entry.js +6 -9
- package/dist/adapters/cli/cli-entry.js.map +1 -1
- package/dist/adapters/cli/commands/analytics.d.ts +2 -2
- package/dist/adapters/cli/commands/analytics.d.ts.map +1 -1
- package/dist/adapters/cli/commands/analytics.js +42 -5
- package/dist/adapters/cli/commands/analytics.js.map +1 -1
- package/dist/adapters/cli/commands/coord.d.ts +3 -0
- package/dist/adapters/cli/commands/coord.d.ts.map +1 -0
- package/dist/adapters/cli/commands/coord.js +36 -0
- package/dist/adapters/cli/commands/coord.js.map +1 -0
- package/dist/adapters/cli/commands/memory-brief.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-brief.js +16 -0
- package/dist/adapters/cli/commands/memory-brief.js.map +1 -1
- package/dist/adapters/cli/commands/memory-call.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-call.js +16 -2
- package/dist/adapters/cli/commands/memory-call.js.map +1 -1
- package/dist/adapters/cli/commands/memory-get.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-get.js +18 -0
- package/dist/adapters/cli/commands/memory-get.js.map +1 -1
- package/dist/adapters/cli/commands/memory-migrate.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-migrate.js +28 -0
- package/dist/adapters/cli/commands/memory-migrate.js.map +1 -1
- package/dist/adapters/cli/commands/memory-run.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-run.js +36 -23
- package/dist/adapters/cli/commands/memory-run.js.map +1 -1
- package/dist/adapters/cli/commands/memory-search.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-search.js +16 -0
- package/dist/adapters/cli/commands/memory-search.js.map +1 -1
- package/dist/adapters/cli/commands/memory-stage.d.ts +3 -0
- package/dist/adapters/cli/commands/memory-stage.d.ts.map +1 -0
- package/dist/adapters/cli/commands/memory-stage.js +35 -0
- package/dist/adapters/cli/commands/memory-stage.js.map +1 -0
- package/dist/adapters/cli/commands/memory-tool.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-tool.js +4 -3
- package/dist/adapters/cli/commands/memory-tool.js.map +1 -1
- package/dist/adapters/fs/run-log-migration.d.ts +18 -0
- package/dist/adapters/fs/run-log-migration.d.ts.map +1 -0
- package/dist/adapters/fs/run-log-migration.js +63 -0
- package/dist/adapters/fs/run-log-migration.js.map +1 -0
- package/dist/adapters/fs/session-metrics-log.d.ts +87 -2
- package/dist/adapters/fs/session-metrics-log.d.ts.map +1 -1
- package/dist/adapters/fs/session-metrics-log.js +105 -2
- package/dist/adapters/fs/session-metrics-log.js.map +1 -1
- package/dist/adapters/mcp/mcp-schemas.d.ts +1 -0
- package/dist/adapters/mcp/mcp-schemas.d.ts.map +1 -1
- package/dist/adapters/mcp/mcp-schemas.js +1 -0
- package/dist/adapters/mcp/mcp-schemas.js.map +1 -1
- package/dist/adapters/mcp/mcp-tools.d.ts.map +1 -1
- package/dist/adapters/mcp/mcp-tools.js +104 -23
- package/dist/adapters/mcp/mcp-tools.js.map +1 -1
- package/dist/adapters/version.d.ts +3 -0
- package/dist/adapters/version.d.ts.map +1 -0
- package/dist/adapters/version.js +12 -0
- package/dist/adapters/version.js.map +1 -0
- package/dist/app/use-cases/build-analytics.d.ts +67 -1
- package/dist/app/use-cases/build-analytics.d.ts.map +1 -1
- package/dist/app/use-cases/build-analytics.js +225 -29
- package/dist/app/use-cases/build-analytics.js.map +1 -1
- package/dist/app/use-cases/effectiveness.d.ts.map +1 -1
- package/dist/app/use-cases/effectiveness.js +8 -6
- package/dist/app/use-cases/effectiveness.js.map +1 -1
- package/dist/app/use-cases/generate-agent-brief.d.ts +2 -0
- package/dist/app/use-cases/generate-agent-brief.d.ts.map +1 -1
- package/dist/app/use-cases/generate-agent-brief.js +1 -1
- package/dist/app/use-cases/generate-agent-brief.js.map +1 -1
- package/dist/app/use-cases/run-source.d.ts +15 -0
- package/dist/app/use-cases/run-source.d.ts.map +1 -0
- package/dist/app/use-cases/run-source.js +26 -0
- package/dist/app/use-cases/run-source.js.map +1 -0
- package/dist/app/use-cases/tool-stats.d.ts +5 -1
- package/dist/app/use-cases/tool-stats.d.ts.map +1 -1
- package/dist/app/use-cases/tool-stats.js +6 -13
- package/dist/app/use-cases/tool-stats.js.map +1 -1
- package/dist/domain/actor.d.ts +3 -0
- package/dist/domain/actor.d.ts.map +1 -1
- package/dist/domain/actor.js +6 -0
- package/dist/domain/actor.js.map +1 -1
- package/package.json +1 -1
|
@@ -104,10 +104,68 @@ export interface CoverageStats {
|
|
|
104
104
|
runs: number;
|
|
105
105
|
scoredTaskRatePct: number | null;
|
|
106
106
|
}
|
|
107
|
+
/** P2 D4: счётчик стадии — события + уникальные memory_ids. */
|
|
108
|
+
export interface StageCount {
|
|
109
|
+
events: number;
|
|
110
|
+
uniqueIds: number;
|
|
111
|
+
}
|
|
112
|
+
/** P2 D4: воронка added→retrieved→injected→cited→applied. */
|
|
113
|
+
export interface MemoryLifecycleFunnel {
|
|
114
|
+
added: number;
|
|
115
|
+
retrieved: StageCount;
|
|
116
|
+
injected: StageCount;
|
|
117
|
+
cited: StageCount;
|
|
118
|
+
applied: StageCount;
|
|
119
|
+
/** Уникальные id, доходившие до applied (D4), отсортирован. */
|
|
120
|
+
appliedUniqueIds: string[];
|
|
121
|
+
}
|
|
122
|
+
/** P2 D4: атрибуция — доля accepted-вердиктов с предшествующей инъекцией в сессии. */
|
|
123
|
+
export interface AttributionCoverage {
|
|
124
|
+
acceptedTotal: number;
|
|
125
|
+
acceptedWithInjection: number;
|
|
126
|
+
attributionCoveragePct: number | null;
|
|
127
|
+
/** При pct === null: 'no task_evaluated' | 'no injected' | 'no accepted verdicts'. */
|
|
128
|
+
reason?: string;
|
|
129
|
+
}
|
|
130
|
+
/** P2 D5: координационное view. */
|
|
131
|
+
export interface CoordinationCount {
|
|
132
|
+
kind: string;
|
|
133
|
+
actorFrom: string;
|
|
134
|
+
count: number;
|
|
135
|
+
}
|
|
136
|
+
export interface CoordinationRecentEvent {
|
|
137
|
+
ts: string;
|
|
138
|
+
kind: string;
|
|
139
|
+
from: string;
|
|
140
|
+
to: string | null;
|
|
141
|
+
refs: string[];
|
|
142
|
+
}
|
|
143
|
+
export interface CoordinationBlockerPair {
|
|
144
|
+
ref: string;
|
|
145
|
+
openedAt: string;
|
|
146
|
+
resolvedAt: string | null;
|
|
147
|
+
}
|
|
148
|
+
export interface CoordinationView {
|
|
149
|
+
/** kind × actor_from; sort: count убыв., потом kind, потом actorFrom. */
|
|
150
|
+
counts: CoordinationCount[];
|
|
151
|
+
/** Последние 20 по ts, свежие первыми. */
|
|
152
|
+
recent: CoordinationRecentEvent[];
|
|
153
|
+
/** По refs coord_event kind=blocker, sort по ref. */
|
|
154
|
+
blockers: CoordinationBlockerPair[];
|
|
155
|
+
}
|
|
107
156
|
/** D7: data-quality сигнального лога (битые строки не роняют контур — только метрика). */
|
|
108
157
|
export interface DataQualityStats {
|
|
109
158
|
validEventRatePct: number | null;
|
|
110
159
|
malformedLines: number;
|
|
160
|
+
/** D6: повторы event_id в логе (вторая копия в аналитику не попадает); null — нет событий с event_id. */
|
|
161
|
+
duplicateEventRatePct: number | null;
|
|
162
|
+
/** D6: run-события с modelID null/'unknown' / все run-события; null — нет run-событий. */
|
|
163
|
+
unknownModelRatePct: number | null;
|
|
164
|
+
/** D6: run с tokens, чья модель есть в pricing / все run с tokens; null — pricing нет или нет run с tokens. */
|
|
165
|
+
pricingCoveragePct: number | null;
|
|
166
|
+
/** D6: всегда null до span-модели (P2). */
|
|
167
|
+
completeTraceRatePct: null;
|
|
168
|
+
completeTraceRateReason: string;
|
|
111
169
|
}
|
|
112
170
|
export interface StewardView {
|
|
113
171
|
mutations: {
|
|
@@ -186,6 +244,8 @@ export interface AnalyticsReport {
|
|
|
186
244
|
memory: {
|
|
187
245
|
rows: MemoryLedgerRow[];
|
|
188
246
|
garbage: GarbageStats;
|
|
247
|
+
funnel: MemoryLifecycleFunnel;
|
|
248
|
+
attribution: AttributionCoverage;
|
|
189
249
|
};
|
|
190
250
|
tools: ToolLedgerRow[];
|
|
191
251
|
rules: RuleRankingRow[];
|
|
@@ -195,6 +255,7 @@ export interface AnalyticsReport {
|
|
|
195
255
|
steward: StewardView;
|
|
196
256
|
readiness: ExperimentReadiness;
|
|
197
257
|
councils: CouncilsView;
|
|
258
|
+
coordination: CoordinationView;
|
|
198
259
|
acceptance: AcceptanceStats;
|
|
199
260
|
coverage: CoverageStats;
|
|
200
261
|
dataQuality: DataQualityStats;
|
|
@@ -225,7 +286,7 @@ export interface AnalyticsInput {
|
|
|
225
286
|
*/
|
|
226
287
|
export declare function buildAnalyticsReport(deps: AnalyticsDeps, input: AnalyticsInput): Promise<AnalyticsReport>;
|
|
227
288
|
export interface AnalyticsViewFilter {
|
|
228
|
-
view: 'memory' | 'tools' | 'rules' | 'weeklyActivity' | 'agents' | 'steward' | 'outliers' | 'readiness' | 'councils' | 'all';
|
|
289
|
+
view: 'memory' | 'tools' | 'rules' | 'weeklyActivity' | 'agents' | 'steward' | 'outliers' | 'readiness' | 'councils' | 'coordination' | 'all';
|
|
229
290
|
class?: 'new' | 'sleeper' | 'workhorse' | 'dead';
|
|
230
291
|
type?: string;
|
|
231
292
|
origin?: 'script' | 'model-native';
|
|
@@ -237,6 +298,8 @@ export type AnalyticsViewPayload = {
|
|
|
237
298
|
view: 'memory';
|
|
238
299
|
rows: MemoryLedgerRow[];
|
|
239
300
|
garbage: GarbageStats;
|
|
301
|
+
funnel: MemoryLifecycleFunnel;
|
|
302
|
+
attribution: AttributionCoverage;
|
|
240
303
|
} | {
|
|
241
304
|
view: 'tools';
|
|
242
305
|
rows: ToolLedgerRow[];
|
|
@@ -261,6 +324,9 @@ export type AnalyticsViewPayload = {
|
|
|
261
324
|
} | {
|
|
262
325
|
view: 'councils';
|
|
263
326
|
councils: CouncilsView;
|
|
327
|
+
} | {
|
|
328
|
+
view: 'coordination';
|
|
329
|
+
coordination: CoordinationView;
|
|
264
330
|
} | {
|
|
265
331
|
view: 'all';
|
|
266
332
|
report: AnalyticsReport;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-analytics.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/build-analytics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAGvD,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAIvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"build-analytics.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/build-analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { DEFAULT_PATTERN_THRESHOLD } from '../../adapters/fs/session-metrics-log.js';
|
|
2
|
-
import { parseRunLog } from '../../domain/tool-economy.js';
|
|
3
2
|
import { UNCATEGORIZED_ERROR_CLASS } from '../../domain/error-class.js';
|
|
4
3
|
import { runCostUsd } from '../../domain/pricing.js';
|
|
5
4
|
import { silentRuleIds } from './learn-decay.js';
|
|
5
|
+
import { mergeRunEntries } from './run-source.js';
|
|
6
6
|
import { mondayOf } from './generate-insights.js';
|
|
7
7
|
import { extractVote } from './tally-council-votes.js';
|
|
8
8
|
export const DEFAULT_LIFECYCLE_THRESHOLDS = { newDays: 14, workhorseUses: 3 };
|
|
@@ -25,7 +25,8 @@ export function classifyLifecycle(uses, ageDays, t) {
|
|
|
25
25
|
function finiteNumber(value) {
|
|
26
26
|
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
27
27
|
}
|
|
28
|
-
/** Memory ledger (Q1/Q2): per-object след использования + lifecycle-класс D7.
|
|
28
|
+
/** Memory ledger (Q1/Q2): per-object след использования + lifecycle-класс D7.
|
|
29
|
+
* (funnel/attribution добавляет вызов buildAnalyticsReport — P2 D4.) */
|
|
29
30
|
function buildMemoryLedger(objects, events, signals, now, t) {
|
|
30
31
|
const rows = [];
|
|
31
32
|
for (const o of objects) {
|
|
@@ -101,7 +102,7 @@ function toolNameOf(o) {
|
|
|
101
102
|
return o.type === 'tool' && typeof rec.name === 'string' && rec.name !== '' ? rec.name : null;
|
|
102
103
|
}
|
|
103
104
|
/** Tool ledger (Q3, D11): script = объекты type:'tool'; model-native = имена из логов минус script. */
|
|
104
|
-
function buildToolLedger(toolObjects, signals,
|
|
105
|
+
function buildToolLedger(toolObjects, signals, runEntries, patternThreshold) {
|
|
105
106
|
// ошибки по имени тула: tool_error-сигналы, группа по error_class_id
|
|
106
107
|
const errorsByName = new Map();
|
|
107
108
|
for (const ev of signals) {
|
|
@@ -143,7 +144,8 @@ function buildToolLedger(toolObjects, signals, runLogText, patternThreshold) {
|
|
|
143
144
|
promotion: o.status === 'candidate' && usageCount >= patternThreshold ? 'expose-candidate' : null,
|
|
144
145
|
});
|
|
145
146
|
}
|
|
146
|
-
// model-native: имена из tool_error-сигналов ∪ run-
|
|
147
|
+
// model-native: имена из tool_error-сигналов ∪ run-entries tools[] (P1 D4: сигналы + legacy),
|
|
148
|
+
// минус зарегистрированные script
|
|
147
149
|
const nativeCounts = new Map();
|
|
148
150
|
const bumpNative = (name) => {
|
|
149
151
|
nativeCounts.set(name, (nativeCounts.get(name) ?? 0) + 1);
|
|
@@ -152,7 +154,7 @@ function buildToolLedger(toolObjects, signals, runLogText, patternThreshold) {
|
|
|
152
154
|
if (ev.event === 'tool_error' && typeof ev.tool_name === 'string')
|
|
153
155
|
bumpNative(ev.tool_name);
|
|
154
156
|
}
|
|
155
|
-
for (const entry of
|
|
157
|
+
for (const entry of runEntries) {
|
|
156
158
|
for (const name of entry.tools ?? [])
|
|
157
159
|
bumpNative(name);
|
|
158
160
|
}
|
|
@@ -236,9 +238,10 @@ function buildWeeklyActivity(events, signals, now, weeks) {
|
|
|
236
238
|
deliverToTriggerPct: delivers > 0 ? (names.size / delivers) * 100 : null,
|
|
237
239
|
}));
|
|
238
240
|
}
|
|
239
|
-
/** Outliers Q8: top-N прогонов по finite weighted
|
|
240
|
-
|
|
241
|
-
|
|
241
|
+
/** Outliers Q8: top-N прогонов по finite weighted (P1 D4: сигналы + legacy run-log);
|
|
242
|
+
* $ при pricing (D9 — без данных null). */
|
|
243
|
+
function buildOutliers(runEntries, pricing, top) {
|
|
244
|
+
return runEntries
|
|
242
245
|
.filter((e) => finiteNumber(e.weighted) !== null)
|
|
243
246
|
.sort((a, b) => (b.weighted ?? 0) - (a.weighted ?? 0))
|
|
244
247
|
.slice(0, top)
|
|
@@ -300,6 +303,155 @@ function buildCoverage(signals) {
|
|
|
300
303
|
const runs = signals.filter((s) => s.event === 'run').length;
|
|
301
304
|
return { scored, runs, scoredTaskRatePct: runs > 0 ? (scored / runs) * 100 : null };
|
|
302
305
|
}
|
|
306
|
+
/** Валидный memory_stage-сигнал (D4 guard): detail есть, stage — одна из четырёх,
|
|
307
|
+
* memory_ids — массив непустых строк (≥1); малформ → null, отчёт не роняет. */
|
|
308
|
+
function memoryStageOf(s) {
|
|
309
|
+
if (s.event !== 'memory_stage')
|
|
310
|
+
return null;
|
|
311
|
+
const d = s.detail;
|
|
312
|
+
if (d === undefined)
|
|
313
|
+
return null;
|
|
314
|
+
const stage = d.stage;
|
|
315
|
+
if (stage !== 'retrieved' && stage !== 'injected' && stage !== 'cited' && stage !== 'applied') {
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
if (!Array.isArray(d.memory_ids))
|
|
319
|
+
return null;
|
|
320
|
+
const ids = d.memory_ids.filter((id) => typeof id === 'string' && id !== '');
|
|
321
|
+
return ids.length > 0 ? { stage, ids } : null;
|
|
322
|
+
}
|
|
323
|
+
/** Воронка D4: added = все объекты store; стадии — события + уникальные memory_ids. */
|
|
324
|
+
function buildLifecycleFunnel(added, signals) {
|
|
325
|
+
const acc = {
|
|
326
|
+
retrieved: { events: 0, ids: new Set() },
|
|
327
|
+
injected: { events: 0, ids: new Set() },
|
|
328
|
+
cited: { events: 0, ids: new Set() },
|
|
329
|
+
applied: { events: 0, ids: new Set() },
|
|
330
|
+
};
|
|
331
|
+
for (const s of signals) {
|
|
332
|
+
const st = memoryStageOf(s);
|
|
333
|
+
if (st === null)
|
|
334
|
+
continue;
|
|
335
|
+
const a = acc[st.stage];
|
|
336
|
+
a.events += 1;
|
|
337
|
+
for (const id of st.ids)
|
|
338
|
+
a.ids.add(id);
|
|
339
|
+
}
|
|
340
|
+
const count = (a) => ({ events: a.events, uniqueIds: a.ids.size });
|
|
341
|
+
return {
|
|
342
|
+
added,
|
|
343
|
+
retrieved: count(acc.retrieved),
|
|
344
|
+
injected: count(acc.injected),
|
|
345
|
+
cited: count(acc.cited),
|
|
346
|
+
applied: count(acc.applied),
|
|
347
|
+
appliedUniqueIds: [...acc.applied.ids].sort(),
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
/** Атрибуция D4: доля accepted-вердиктов, перед которыми в той же сессии была
|
|
351
|
+
* инъекция (memory_stage injected, session_id !== null, ts <= ts вердикта). */
|
|
352
|
+
function buildAttribution(signals) {
|
|
353
|
+
if (!signals.some((s) => s.event === 'task_evaluated')) {
|
|
354
|
+
return { acceptedTotal: 0, acceptedWithInjection: 0, attributionCoveragePct: null, reason: 'no task_evaluated' };
|
|
355
|
+
}
|
|
356
|
+
// ts injected-сигналов по сессии (без session_id в атрибуции не участвуют)
|
|
357
|
+
const injectedTsBySession = new Map();
|
|
358
|
+
for (const s of signals) {
|
|
359
|
+
const st = memoryStageOf(s);
|
|
360
|
+
if (st === null || st.stage !== 'injected' || s.session_id === null)
|
|
361
|
+
continue;
|
|
362
|
+
const arr = injectedTsBySession.get(s.session_id) ?? [];
|
|
363
|
+
arr.push(s.ts);
|
|
364
|
+
injectedTsBySession.set(s.session_id, arr);
|
|
365
|
+
}
|
|
366
|
+
if (injectedTsBySession.size === 0) {
|
|
367
|
+
return { acceptedTotal: 0, acceptedWithInjection: 0, attributionCoveragePct: null, reason: 'no injected' };
|
|
368
|
+
}
|
|
369
|
+
let acceptedTotal = 0;
|
|
370
|
+
let acceptedWithInjection = 0;
|
|
371
|
+
for (const s of signals) {
|
|
372
|
+
if (s.event !== 'task_evaluated' || s.detail?.verdict !== 'accepted')
|
|
373
|
+
continue;
|
|
374
|
+
acceptedTotal += 1;
|
|
375
|
+
if (s.session_id === null)
|
|
376
|
+
continue;
|
|
377
|
+
if ((injectedTsBySession.get(s.session_id) ?? []).some((ts) => ts <= s.ts))
|
|
378
|
+
acceptedWithInjection += 1;
|
|
379
|
+
}
|
|
380
|
+
if (acceptedTotal === 0) {
|
|
381
|
+
return { acceptedTotal: 0, acceptedWithInjection: 0, attributionCoveragePct: null, reason: 'no accepted verdicts' };
|
|
382
|
+
}
|
|
383
|
+
return {
|
|
384
|
+
acceptedTotal,
|
|
385
|
+
acceptedWithInjection,
|
|
386
|
+
attributionCoveragePct: (acceptedWithInjection / acceptedTotal) * 100,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
/** Валидный coord_event-сигнал (D5 guard): kind/actor_from — строки, refs — массив строк. */
|
|
390
|
+
function coordEventOf(s) {
|
|
391
|
+
if (s.event !== 'coord_event')
|
|
392
|
+
return null;
|
|
393
|
+
const d = s.detail;
|
|
394
|
+
if (d === undefined || typeof d.kind !== 'string' || typeof d.actor_from !== 'string' || !Array.isArray(d.refs)) {
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
return {
|
|
398
|
+
kind: d.kind,
|
|
399
|
+
from: d.actor_from,
|
|
400
|
+
to: typeof d.actor_to === 'string' ? d.actor_to : null,
|
|
401
|
+
refs: d.refs.filter((r) => typeof r === 'string' && r !== ''),
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
/** Координация D5: counts (kind × actor_from), последние 20 событий, blocker-пары
|
|
405
|
+
* (ref → earliest blocker-открытие → первый memory.resolved не раньше openedAt). */
|
|
406
|
+
function buildCoordination(signals, events) {
|
|
407
|
+
const parsed = [];
|
|
408
|
+
// ключ kind ⊕ actor_from; \u001f не встречается в именах агентов (unit-separator)
|
|
409
|
+
const countAcc = new Map();
|
|
410
|
+
for (const s of signals) {
|
|
411
|
+
const c = coordEventOf(s);
|
|
412
|
+
if (c === null)
|
|
413
|
+
continue;
|
|
414
|
+
parsed.push({ ts: s.ts, ...c });
|
|
415
|
+
const key = `${c.kind}\u001f${c.from}`;
|
|
416
|
+
const cur = countAcc.get(key);
|
|
417
|
+
if (cur === undefined)
|
|
418
|
+
countAcc.set(key, { kind: c.kind, actorFrom: c.from, count: 1 });
|
|
419
|
+
else
|
|
420
|
+
cur.count += 1;
|
|
421
|
+
}
|
|
422
|
+
const counts = [...countAcc.values()].sort((a, b) => b.count - a.count || a.kind.localeCompare(b.kind) || a.actorFrom.localeCompare(b.actorFrom));
|
|
423
|
+
const recent = [...parsed].sort((a, b) => (a.ts < b.ts ? 1 : a.ts > b.ts ? -1 : 0)).slice(0, 20);
|
|
424
|
+
// openedAt по ref — самый ранний blocker-сигнал
|
|
425
|
+
const openedByRef = new Map();
|
|
426
|
+
for (const p of parsed) {
|
|
427
|
+
if (p.kind !== 'blocker')
|
|
428
|
+
continue;
|
|
429
|
+
for (const ref of p.refs) {
|
|
430
|
+
const cur = openedByRef.get(ref);
|
|
431
|
+
if (cur === undefined || p.ts < cur)
|
|
432
|
+
openedByRef.set(ref, p.ts);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// resolvedAt: первый memory.resolved с payload.memory_id === ref и timestamp >= openedAt
|
|
436
|
+
const resolvedTsById = new Map();
|
|
437
|
+
for (const ev of events) {
|
|
438
|
+
if (ev.type !== 'memory.resolved')
|
|
439
|
+
continue;
|
|
440
|
+
const mid = ev.payload?.memory_id;
|
|
441
|
+
if (typeof mid !== 'string')
|
|
442
|
+
continue;
|
|
443
|
+
const arr = resolvedTsById.get(mid) ?? [];
|
|
444
|
+
arr.push(ev.timestamp);
|
|
445
|
+
resolvedTsById.set(mid, arr);
|
|
446
|
+
}
|
|
447
|
+
const blockers = [...openedByRef.entries()]
|
|
448
|
+
.map(([ref, openedAt]) => {
|
|
449
|
+
const resolvedAt = (resolvedTsById.get(ref) ?? []).filter((ts) => ts >= openedAt).sort()[0];
|
|
450
|
+
return { ref, openedAt, resolvedAt: resolvedAt ?? null };
|
|
451
|
+
})
|
|
452
|
+
.sort((a, b) => a.ref.localeCompare(b.ref));
|
|
453
|
+
return { counts, recent, blockers };
|
|
454
|
+
}
|
|
303
455
|
/** Agent ledger Q11: строки по run-агентам ∪ complaint-акторам `agent:<имя>`; три уровня —
|
|
304
456
|
* объём (runs/weighted/duration/cost), проблемы (processFailures/toolErrors/жалобы), достижения
|
|
305
457
|
* (completedRuns/accepted/holdout_prevented его rule/lesson). */
|
|
@@ -702,28 +854,63 @@ export async function buildAnalyticsReport(deps, input) {
|
|
|
702
854
|
const allObjects = await deps.store.list();
|
|
703
855
|
const events = await deps.log.readAll();
|
|
704
856
|
const weeks = input.weeks ?? 8;
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
const
|
|
708
|
-
|
|
709
|
-
const
|
|
710
|
-
const
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
857
|
+
// P1 D7: дедуп signals по event_id (остаётся первая копия по порядку) — повтор не
|
|
858
|
+
// попадает ни в один построитель отчёта; считается метрикой duplicateEventRatePct.
|
|
859
|
+
const seenEventIds = new Set();
|
|
860
|
+
let duplicateLines = 0;
|
|
861
|
+
const signals = [];
|
|
862
|
+
for (const s of input.signals) {
|
|
863
|
+
if (s.event_id === undefined) {
|
|
864
|
+
signals.push(s);
|
|
865
|
+
continue;
|
|
866
|
+
}
|
|
867
|
+
if (seenEventIds.has(s.event_id)) {
|
|
868
|
+
duplicateLines += 1;
|
|
869
|
+
continue;
|
|
870
|
+
}
|
|
871
|
+
seenEventIds.add(s.event_id);
|
|
872
|
+
signals.push(s);
|
|
873
|
+
}
|
|
874
|
+
const memory = {
|
|
875
|
+
...buildMemoryLedger(allObjects, events, signals, now, thresholds),
|
|
876
|
+
// P2 D4: воронка added→applied + атрибуция accepted-вердиктов к инъекциям
|
|
877
|
+
funnel: buildLifecycleFunnel(allObjects.length, signals),
|
|
878
|
+
attribution: buildAttribution(signals),
|
|
879
|
+
};
|
|
880
|
+
// P1 D4: канонический источник run-метрик — сигналы + compat-мерж legacy run-log
|
|
881
|
+
const runEntries = mergeRunEntries(signals, input.runLogText);
|
|
882
|
+
const tools = buildToolLedger(allObjects.filter((o) => o.type === 'tool'), signals, runEntries, input.patternThreshold ?? DEFAULT_PATTERN_THRESHOLD);
|
|
883
|
+
const rules = buildRuleRanking(allObjects.filter((o) => o.type === 'rule'), signals);
|
|
884
|
+
const weeklyActivity = buildWeeklyActivity(events, signals, now, weeks);
|
|
885
|
+
const outliers = buildOutliers(runEntries, input.pricing, input.topOutliers ?? 10);
|
|
886
|
+
const acceptance = buildAcceptance(signals);
|
|
887
|
+
const agents = buildAgents(signals, allObjects, input.pricing, acceptance.acceptedByAgent);
|
|
888
|
+
const steward = buildSteward(events, signals, allObjects, now, weeks);
|
|
889
|
+
const readiness = buildReadiness(signals);
|
|
714
890
|
const councils = await buildCouncils(allObjects, deps.relations, now, weeks);
|
|
715
|
-
const
|
|
891
|
+
const coordination = buildCoordination(signals, events); // P2 D5
|
|
892
|
+
const coverage = buildCoverage(signals);
|
|
893
|
+
// D6: unknown-model и pricing-coverage по дедуплицированным run-сигналам
|
|
894
|
+
const runSignals = signals.filter((s) => s.event === 'run');
|
|
895
|
+
const unknownModels = runSignals.filter((s) => s.gen_ai.modelID === null || s.gen_ai.modelID === 'unknown').length;
|
|
896
|
+
const runsWithTokens = runSignals.filter((s) => s.tokens !== undefined);
|
|
897
|
+
const pricedRuns = input.pricing === undefined
|
|
898
|
+
? 0
|
|
899
|
+
: runsWithTokens.filter((s) => runCostUsd(s.tokens, input.pricing, s.gen_ai.modelID) !== null).length;
|
|
716
900
|
// D7: без signalLogStats (старые вызывающие) → n/a; totalLines=0 → null-процент
|
|
717
|
-
const dataQuality =
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
901
|
+
const dataQuality = {
|
|
902
|
+
validEventRatePct: input.signalLogStats === undefined || input.signalLogStats.totalLines <= 0
|
|
903
|
+
? null
|
|
904
|
+
: ((input.signalLogStats.totalLines - input.signalLogStats.malformedLines) / input.signalLogStats.totalLines) *
|
|
905
|
+
100,
|
|
906
|
+
malformedLines: input.signalLogStats?.malformedLines ?? 0,
|
|
907
|
+
// доля событий-дубликатов среди всех событий с event_id (v1-записи без id не учитываются)
|
|
908
|
+
duplicateEventRatePct: seenEventIds.size + duplicateLines > 0 ? (duplicateLines / (seenEventIds.size + duplicateLines)) * 100 : null,
|
|
909
|
+
unknownModelRatePct: runSignals.length > 0 ? (unknownModels / runSignals.length) * 100 : null,
|
|
910
|
+
pricingCoveragePct: input.pricing === undefined || runsWithTokens.length === 0 ? null : (pricedRuns / runsWithTokens.length) * 100,
|
|
911
|
+
completeTraceRatePct: null,
|
|
912
|
+
completeTraceRateReason: 'span model planned P2',
|
|
913
|
+
};
|
|
727
914
|
return {
|
|
728
915
|
generatedAt: now.toISOString(),
|
|
729
916
|
thresholds,
|
|
@@ -736,6 +923,7 @@ export async function buildAnalyticsReport(deps, input) {
|
|
|
736
923
|
steward,
|
|
737
924
|
readiness,
|
|
738
925
|
councils,
|
|
926
|
+
coordination,
|
|
739
927
|
acceptance: { accepted: acceptance.accepted, costPerAcceptedTask: acceptance.costPerAcceptedTask },
|
|
740
928
|
coverage,
|
|
741
929
|
dataQuality,
|
|
@@ -751,7 +939,13 @@ export function filterAnalytics(report, filter) {
|
|
|
751
939
|
rows = rows.filter((r) => r.lifecycle === filter.class);
|
|
752
940
|
if (filter.type !== undefined)
|
|
753
941
|
rows = rows.filter((r) => r.type === filter.type);
|
|
754
|
-
return {
|
|
942
|
+
return {
|
|
943
|
+
view: 'memory',
|
|
944
|
+
rows: rows.slice(0, top),
|
|
945
|
+
garbage: report.memory.garbage,
|
|
946
|
+
funnel: report.memory.funnel,
|
|
947
|
+
attribution: report.memory.attribution,
|
|
948
|
+
};
|
|
755
949
|
}
|
|
756
950
|
case 'tools': {
|
|
757
951
|
let rows = report.tools;
|
|
@@ -781,6 +975,8 @@ export function filterAnalytics(report, filter) {
|
|
|
781
975
|
return { view: 'readiness', readiness: report.readiness };
|
|
782
976
|
case 'councils':
|
|
783
977
|
return { view: 'councils', councils: report.councils };
|
|
978
|
+
case 'coordination':
|
|
979
|
+
return { view: 'coordination', coordination: report.coordination };
|
|
784
980
|
case 'all':
|
|
785
981
|
return { view: 'all', report };
|
|
786
982
|
}
|