@mengzf/skillflow-mcp 0.0.0-stage → 1.0.1
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/LICENSE +21 -0
- package/README.md +279 -2
- package/dist/adapters/claude-code.adapter.d.ts +10 -0
- package/dist/adapters/claude-code.adapter.d.ts.map +1 -0
- package/dist/adapters/claude-code.adapter.js +166 -0
- package/dist/adapters/claude-code.adapter.js.map +1 -0
- package/dist/adapters/codex.adapter.d.ts +10 -0
- package/dist/adapters/codex.adapter.d.ts.map +1 -0
- package/dist/adapters/codex.adapter.js +109 -0
- package/dist/adapters/codex.adapter.js.map +1 -0
- package/dist/adapters/dsh.adapter.d.ts +7 -0
- package/dist/adapters/dsh.adapter.d.ts.map +1 -0
- package/dist/adapters/dsh.adapter.js +60 -0
- package/dist/adapters/dsh.adapter.js.map +1 -0
- package/dist/adapters/qoder.adapter.d.ts +10 -0
- package/dist/adapters/qoder.adapter.d.ts.map +1 -0
- package/dist/adapters/qoder.adapter.js +119 -0
- package/dist/adapters/qoder.adapter.js.map +1 -0
- package/dist/adapters/trae.adapter.d.ts +8 -0
- package/dist/adapters/trae.adapter.d.ts.map +1 -0
- package/dist/adapters/trae.adapter.js +104 -0
- package/dist/adapters/trae.adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +25 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/universal.sync.d.ts +22 -0
- package/dist/adapters/universal.sync.d.ts.map +1 -0
- package/dist/adapters/universal.sync.js +140 -0
- package/dist/adapters/universal.sync.js.map +1 -0
- package/dist/adapters/workbuddy.sniffer.d.ts +22 -0
- package/dist/adapters/workbuddy.sniffer.d.ts.map +1 -0
- package/dist/adapters/workbuddy.sniffer.js +148 -0
- package/dist/adapters/workbuddy.sniffer.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +33 -0
- package/dist/config.js.map +1 -0
- package/dist/db/index.d.ts +4 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +39 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/invocation-filter.d.ts +29 -0
- package/dist/db/invocation-filter.d.ts.map +1 -0
- package/dist/db/invocation-filter.js +78 -0
- package/dist/db/invocation-filter.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +129 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/seed.d.ts +15 -0
- package/dist/db/seed.d.ts.map +1 -0
- package/dist/db/seed.js +128 -0
- package/dist/db/seed.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +372 -0
- package/dist/server.js.map +1 -0
- package/dist/services/benchmark.service.d.ts +27 -0
- package/dist/services/benchmark.service.d.ts.map +1 -0
- package/dist/services/benchmark.service.js +94 -0
- package/dist/services/benchmark.service.js.map +1 -0
- package/dist/services/dashboard.service.d.ts +14 -0
- package/dist/services/dashboard.service.d.ts.map +1 -0
- package/dist/services/dashboard.service.js +296 -0
- package/dist/services/dashboard.service.js.map +1 -0
- package/dist/services/filter.service.d.ts +26 -0
- package/dist/services/filter.service.d.ts.map +1 -0
- package/dist/services/filter.service.js +103 -0
- package/dist/services/filter.service.js.map +1 -0
- package/dist/services/impact.service.d.ts +20 -0
- package/dist/services/impact.service.d.ts.map +1 -0
- package/dist/services/impact.service.js +114 -0
- package/dist/services/impact.service.js.map +1 -0
- package/dist/services/telemetry.service.d.ts +41 -0
- package/dist/services/telemetry.service.d.ts.map +1 -0
- package/dist/services/telemetry.service.js +244 -0
- package/dist/services/telemetry.service.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/models.d.ts +73 -0
- package/dist/types/models.d.ts.map +1 -0
- package/dist/types/models.js +2 -0
- package/dist/types/models.js.map +1 -0
- package/dist/types/tools.d.ts +173 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +195 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/ascii-chart.d.ts +9 -0
- package/dist/utils/ascii-chart.d.ts.map +1 -0
- package/dist/utils/ascii-chart.js +29 -0
- package/dist/utils/ascii-chart.js.map +1 -0
- package/dist/utils/formatter.d.ts +6 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +29 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/governance.d.ts +25 -0
- package/dist/utils/governance.d.ts.map +1 -0
- package/dist/utils/governance.js +70 -0
- package/dist/utils/governance.js.map +1 -0
- package/dist/utils/hours.d.ts +3 -0
- package/dist/utils/hours.d.ts.map +1 -0
- package/dist/utils/hours.js +15 -0
- package/dist/utils/hours.js.map +1 -0
- package/dist/utils/pricing.d.ts +19 -0
- package/dist/utils/pricing.d.ts.map +1 -0
- package/dist/utils/pricing.js +96 -0
- package/dist/utils/pricing.js.map +1 -0
- package/dist/utils/quality.d.ts +15 -0
- package/dist/utils/quality.d.ts.map +1 -0
- package/dist/utils/quality.js +47 -0
- package/dist/utils/quality.js.map +1 -0
- package/dist/web/render.d.ts +2 -0
- package/dist/web/render.d.ts.map +1 -0
- package/dist/web/render.js +1919 -0
- package/dist/web/render.js.map +1 -0
- package/dist/web/server.d.ts +10 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +160 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +51 -4
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { DEFAULT_SKILL_BENCHMARKS, seedDefaultSkills } from '../db/seed.js';
|
|
2
|
+
export class BenchmarkService {
|
|
3
|
+
db;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
}
|
|
7
|
+
listBenchmarks(category, search) {
|
|
8
|
+
let query = 'SELECT * FROM skills_manifest WHERE 1=1';
|
|
9
|
+
const params = [];
|
|
10
|
+
if (category) {
|
|
11
|
+
query += ' AND category = ?';
|
|
12
|
+
params.push(category);
|
|
13
|
+
}
|
|
14
|
+
if (search) {
|
|
15
|
+
query += ' AND (skill_id LIKE ? OR skill_name LIKE ? OR description LIKE ?)';
|
|
16
|
+
const term = `%${search}%`;
|
|
17
|
+
params.push(term, term, term);
|
|
18
|
+
}
|
|
19
|
+
query += ' ORDER BY category ASC, skill_name ASC';
|
|
20
|
+
return this.db.prepare(query).all(...params);
|
|
21
|
+
}
|
|
22
|
+
getBenchmark(skillId) {
|
|
23
|
+
return this.db
|
|
24
|
+
.prepare('SELECT * FROM skills_manifest WHERE skill_id = ?')
|
|
25
|
+
.get(skillId);
|
|
26
|
+
}
|
|
27
|
+
setBenchmark(data) {
|
|
28
|
+
const existing = this.getBenchmark(data.skill_id);
|
|
29
|
+
if (existing) {
|
|
30
|
+
const updatedName = data.skill_name ?? existing.skill_name;
|
|
31
|
+
const updatedCategory = data.category ?? existing.category;
|
|
32
|
+
const updatedDesc = data.description ?? existing.description;
|
|
33
|
+
const updatedBSteps = data.baseline_steps ?? existing.baseline_steps;
|
|
34
|
+
const updatedBTokens = data.baseline_tokens ?? existing.baseline_tokens;
|
|
35
|
+
const updatedSSteps = data.default_saved_steps ?? existing.default_saved_steps;
|
|
36
|
+
const updatedSTokens = data.default_saved_tokens ?? existing.default_saved_tokens;
|
|
37
|
+
const updatedTags = data.tags ? JSON.stringify(data.tags) : existing.tags;
|
|
38
|
+
this.db
|
|
39
|
+
.prepare(`
|
|
40
|
+
UPDATE skills_manifest SET
|
|
41
|
+
skill_name = ?,
|
|
42
|
+
category = ?,
|
|
43
|
+
description = ?,
|
|
44
|
+
baseline_steps = ?,
|
|
45
|
+
baseline_tokens = ?,
|
|
46
|
+
default_saved_steps = ?,
|
|
47
|
+
default_saved_tokens = ?,
|
|
48
|
+
tags = ?,
|
|
49
|
+
updated_at = datetime('now')
|
|
50
|
+
WHERE skill_id = ?
|
|
51
|
+
`)
|
|
52
|
+
.run(updatedName, updatedCategory, updatedDesc, updatedBSteps, updatedBTokens, updatedSSteps, updatedSTokens, updatedTags, data.skill_id);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
const skillName = data.skill_name || data.skill_id;
|
|
56
|
+
const category = data.category || 'general';
|
|
57
|
+
const desc = data.description || null;
|
|
58
|
+
const bSteps = data.baseline_steps ?? 6;
|
|
59
|
+
const bTokens = data.baseline_tokens ?? 3500;
|
|
60
|
+
const sSteps = data.default_saved_steps ?? Math.max(1, bSteps - 2);
|
|
61
|
+
const sTokens = data.default_saved_tokens ?? Math.max(500, bTokens - 1000);
|
|
62
|
+
const tags = data.tags ? JSON.stringify(data.tags) : '[]';
|
|
63
|
+
this.db
|
|
64
|
+
.prepare(`
|
|
65
|
+
INSERT INTO skills_manifest (
|
|
66
|
+
skill_id, skill_name, category, description,
|
|
67
|
+
baseline_steps, baseline_tokens, default_saved_steps, default_saved_tokens, tags
|
|
68
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
69
|
+
`)
|
|
70
|
+
.run(data.skill_id, skillName, category, desc, bSteps, bTokens, sSteps, sTokens, tags);
|
|
71
|
+
}
|
|
72
|
+
return this.getBenchmark(data.skill_id);
|
|
73
|
+
}
|
|
74
|
+
deleteBenchmark(skillId) {
|
|
75
|
+
const invocationsCount = this.db.prepare('SELECT COUNT(*) as cnt FROM invocations WHERE skill_id = ?').get(skillId).cnt;
|
|
76
|
+
if (invocationsCount > 0) {
|
|
77
|
+
return {
|
|
78
|
+
success: false,
|
|
79
|
+
message: `Cannot delete skill '${skillId}' because it has ${invocationsCount} recorded invocations.`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const res = this.db.prepare('DELETE FROM skills_manifest WHERE skill_id = ?').run(skillId);
|
|
83
|
+
return {
|
|
84
|
+
success: res.changes > 0,
|
|
85
|
+
message: res.changes > 0 ? `Deleted benchmark for '${skillId}'` : `Skill '${skillId}' not found`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
resetDefaults() {
|
|
89
|
+
this.db.exec('DELETE FROM skills_manifest');
|
|
90
|
+
seedDefaultSkills(this.db);
|
|
91
|
+
return { resetCount: DEFAULT_SKILL_BENCHMARKS.length };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=benchmark.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.service.js","sourceRoot":"","sources":["../../src/services/benchmark.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
import { GetSkillDashboardInput } from '../types/tools.js';
|
|
3
|
+
export declare class DashboardService {
|
|
4
|
+
private db;
|
|
5
|
+
private telemetryService;
|
|
6
|
+
constructor(db: DatabaseSync);
|
|
7
|
+
private resolveSessionId;
|
|
8
|
+
private describeFilters;
|
|
9
|
+
getDashboard(input: GetSkillDashboardInput): {
|
|
10
|
+
markdown: string;
|
|
11
|
+
data: any;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=dashboard.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.service.d.ts","sourceRoot":"","sources":["../../src/services/dashboard.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAQ3D,qBAAa,gBAAgB;IAGf,OAAO,CAAC,EAAE;IAFtB,OAAO,CAAC,gBAAgB,CAAmB;gBAEvB,EAAE,EAAE,YAAY;IAIpC,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,eAAe;IAgBvB,YAAY,CAAC,KAAK,EAAE,sBAAsB,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE;CA0R7E"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { formatNumber, formatPercent } from '../utils/formatter.js';
|
|
2
|
+
import { renderHorizontalBarChart } from '../utils/ascii-chart.js';
|
|
3
|
+
import { formatWorkHours } from '../utils/hours.js';
|
|
4
|
+
import { buildInvocationWhere, normalizeTimeRange } from '../db/invocation-filter.js';
|
|
5
|
+
import { calculateSkillHealthScore, MODIFIER_PATTERNS } from '../utils/governance.js';
|
|
6
|
+
import { TelemetryService } from './telemetry.service.js';
|
|
7
|
+
export class DashboardService {
|
|
8
|
+
db;
|
|
9
|
+
telemetryService;
|
|
10
|
+
constructor(db) {
|
|
11
|
+
this.db = db;
|
|
12
|
+
this.telemetryService = new TelemetryService(db);
|
|
13
|
+
}
|
|
14
|
+
resolveSessionId(sessionId) {
|
|
15
|
+
if (sessionId) {
|
|
16
|
+
return sessionId;
|
|
17
|
+
}
|
|
18
|
+
const lastSession = this.telemetryService.getLastActiveSession();
|
|
19
|
+
return lastSession?.session_id || 'unknown';
|
|
20
|
+
}
|
|
21
|
+
describeFilters(input) {
|
|
22
|
+
const parts = [];
|
|
23
|
+
parts.push(`范围 \`${normalizeTimeRange(input.time_range)}\``);
|
|
24
|
+
parts.push(`Agent \`${input.agent_name || '全部'}\``);
|
|
25
|
+
if (input.skill_id) {
|
|
26
|
+
parts.push(`Skill \`${input.skill_id}\``);
|
|
27
|
+
}
|
|
28
|
+
if (input.model_name) {
|
|
29
|
+
parts.push(`模型 \`${input.model_name}\``);
|
|
30
|
+
}
|
|
31
|
+
if (input.status) {
|
|
32
|
+
parts.push(`状态 \`${input.status}\``);
|
|
33
|
+
}
|
|
34
|
+
return parts.join(' | ');
|
|
35
|
+
}
|
|
36
|
+
getDashboard(input) {
|
|
37
|
+
const timeRange = normalizeTimeRange(input.time_range);
|
|
38
|
+
const sessionId = timeRange === 'current_session' ? this.resolveSessionId(input.session_id) : undefined;
|
|
39
|
+
const { whereSql, params } = buildInvocationWhere({
|
|
40
|
+
timeRange,
|
|
41
|
+
sessionId,
|
|
42
|
+
agentName: input.agent_name,
|
|
43
|
+
skillId: input.skill_id,
|
|
44
|
+
modelName: input.model_name,
|
|
45
|
+
status: input.status,
|
|
46
|
+
});
|
|
47
|
+
// 1. L1 & L2 KPI Aggregation
|
|
48
|
+
const kpiRow = this.db
|
|
49
|
+
.prepare(`
|
|
50
|
+
SELECT
|
|
51
|
+
COUNT(DISTINCT i.session_id) as session_count,
|
|
52
|
+
COUNT(*) as total_invocations,
|
|
53
|
+
SUM(CASE WHEN i.status = 'success' THEN 1 ELSE 0 END) as success_count,
|
|
54
|
+
SUM(CASE WHEN i.status = 'failed' THEN 1 ELSE 0 END) as failure_count,
|
|
55
|
+
SUM(i.saved_steps) as total_saved_steps,
|
|
56
|
+
SUM(i.saved_tokens) as total_saved_tokens,
|
|
57
|
+
SUM(i.saved_hours) as total_saved_hours,
|
|
58
|
+
SUM(i.cost_saved_usd) as total_cost_saved_usd,
|
|
59
|
+
SUM(i.cost_saved_cny) as total_cost_saved_cny,
|
|
60
|
+
SUM(i.actual_tokens) as total_actual_tokens,
|
|
61
|
+
SUM(i.context_tokens) as total_context_tokens,
|
|
62
|
+
SUM(i.output_tokens) as total_output_tokens,
|
|
63
|
+
SUM(CASE WHEN i.trigger_mode = 'explicit' THEN 1 ELSE 0 END) as explicit_count,
|
|
64
|
+
SUM(CASE WHEN i.trigger_mode = 'implicit' THEN 1 ELSE 0 END) as implicit_count,
|
|
65
|
+
SUM(i.has_correction) as total_corrections,
|
|
66
|
+
SUM(CASE WHEN i.quality_profile = 'heavy_investment' THEN 1 ELSE 0 END) as heavy_investment_count,
|
|
67
|
+
SUM(CASE WHEN i.quality_profile = 'efficient' THEN 1 ELSE 0 END) as efficient_count,
|
|
68
|
+
SUM(i.tool_chain_depth) as total_tool_chain_depth,
|
|
69
|
+
SUM(i.tool_failures) as total_tool_failures,
|
|
70
|
+
AVG(i.execution_time_ms) as avg_execution_time
|
|
71
|
+
FROM invocations i
|
|
72
|
+
WHERE ${whereSql}
|
|
73
|
+
`)
|
|
74
|
+
.get(...params);
|
|
75
|
+
const sessionCount = kpiRow?.session_count ?? 0;
|
|
76
|
+
const totalInvocations = kpiRow?.total_invocations ?? 0;
|
|
77
|
+
const successCount = kpiRow?.success_count ?? 0;
|
|
78
|
+
const totalSavedSteps = kpiRow?.total_saved_steps ?? 0;
|
|
79
|
+
const totalSavedTokens = kpiRow?.total_saved_tokens ?? 0;
|
|
80
|
+
const totalSavedHours = kpiRow?.total_saved_hours ?? 0.0;
|
|
81
|
+
const totalCostSavedUsd = kpiRow?.total_cost_saved_usd ?? 0.0;
|
|
82
|
+
const totalCostSavedCny = kpiRow?.total_cost_saved_cny ?? 0.0;
|
|
83
|
+
const successRate = totalInvocations > 0 ? successCount / totalInvocations : 1;
|
|
84
|
+
// L2 Engineering Metrics
|
|
85
|
+
const explicitCount = kpiRow?.explicit_count ?? 0;
|
|
86
|
+
const implicitCount = kpiRow?.implicit_count ?? 0;
|
|
87
|
+
const totalCorrections = kpiRow?.total_corrections ?? 0;
|
|
88
|
+
const totalContextTokens = kpiRow?.total_context_tokens ?? 0;
|
|
89
|
+
const totalOutputTokens = kpiRow?.total_output_tokens ?? 0;
|
|
90
|
+
const totalToolDepth = kpiRow?.total_tool_chain_depth ?? 0;
|
|
91
|
+
const totalToolFailures = kpiRow?.total_tool_failures ?? 0;
|
|
92
|
+
const correctionRate = totalInvocations > 0 ? totalCorrections / totalInvocations : 0;
|
|
93
|
+
const explicitRate = totalInvocations > 0 ? explicitCount / totalInvocations : 1;
|
|
94
|
+
const yieldRatio = totalContextTokens > 0 ? (totalOutputTokens / totalContextTokens) * 100 : 100;
|
|
95
|
+
const kpiData = {
|
|
96
|
+
sessionCount,
|
|
97
|
+
totalInvocations,
|
|
98
|
+
successRate,
|
|
99
|
+
totalSavedSteps,
|
|
100
|
+
totalSavedTokens,
|
|
101
|
+
totalSavedHours,
|
|
102
|
+
totalCostSavedUsd,
|
|
103
|
+
totalCostSavedCny,
|
|
104
|
+
explicitCount,
|
|
105
|
+
implicitCount,
|
|
106
|
+
explicitRate,
|
|
107
|
+
totalCorrections,
|
|
108
|
+
correctionRate,
|
|
109
|
+
totalContextTokens,
|
|
110
|
+
totalOutputTokens,
|
|
111
|
+
yieldRatio,
|
|
112
|
+
totalToolDepth,
|
|
113
|
+
totalToolFailures,
|
|
114
|
+
};
|
|
115
|
+
if (totalInvocations === 0) {
|
|
116
|
+
return {
|
|
117
|
+
markdown: `## 📊 SkillFlow 全景效能看板\n\n> **筛选条件**: ${this.describeFilters(input)}\n\n当前筛选条件下暂无任何 Skill 调用数据。`,
|
|
118
|
+
data: { kpi: kpiData, agentRows: [], skillRows: [], modelRows: [], governance: {} },
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
// 2. Breakdown by Agent
|
|
122
|
+
const agentRows = this.db
|
|
123
|
+
.prepare(`
|
|
124
|
+
SELECT
|
|
125
|
+
i.agent_name,
|
|
126
|
+
COUNT(DISTINCT i.session_id) as session_cnt,
|
|
127
|
+
COUNT(*) as hit_cnt,
|
|
128
|
+
SUM(i.saved_steps) as saved_steps,
|
|
129
|
+
SUM(i.saved_tokens) as saved_tokens,
|
|
130
|
+
SUM(i.saved_hours) as saved_hours,
|
|
131
|
+
SUM(i.cost_saved_cny) as cost_saved_cny
|
|
132
|
+
FROM invocations i
|
|
133
|
+
WHERE ${whereSql}
|
|
134
|
+
GROUP BY i.agent_name
|
|
135
|
+
ORDER BY hit_cnt DESC
|
|
136
|
+
`)
|
|
137
|
+
.all(...params);
|
|
138
|
+
// 3. Breakdown by Model
|
|
139
|
+
const modelRows = this.db
|
|
140
|
+
.prepare(`
|
|
141
|
+
SELECT
|
|
142
|
+
i.model_name,
|
|
143
|
+
COUNT(*) as hit_cnt,
|
|
144
|
+
SUM(i.saved_tokens) as saved_tokens,
|
|
145
|
+
SUM(i.saved_hours) as saved_hours,
|
|
146
|
+
SUM(i.cost_saved_cny) as cost_saved_cny,
|
|
147
|
+
SUM(i.cost_saved_usd) as cost_saved_usd
|
|
148
|
+
FROM invocations i
|
|
149
|
+
WHERE ${whereSql}
|
|
150
|
+
GROUP BY i.model_name
|
|
151
|
+
ORDER BY hit_cnt DESC
|
|
152
|
+
`)
|
|
153
|
+
.all(...params);
|
|
154
|
+
// 4. Breakdown by Skill
|
|
155
|
+
const skillRows = this.db
|
|
156
|
+
.prepare(`
|
|
157
|
+
SELECT
|
|
158
|
+
s.skill_id,
|
|
159
|
+
s.skill_name,
|
|
160
|
+
s.category,
|
|
161
|
+
s.baseline_steps,
|
|
162
|
+
s.health_score,
|
|
163
|
+
COUNT(*) as hit_cnt,
|
|
164
|
+
SUM(i.saved_steps) as saved_steps,
|
|
165
|
+
SUM(i.saved_tokens) as saved_tokens,
|
|
166
|
+
SUM(i.saved_hours) as saved_hours,
|
|
167
|
+
SUM(i.cost_saved_cny) as cost_saved_cny,
|
|
168
|
+
SUM(i.has_correction) as corrections,
|
|
169
|
+
AVG(i.saved_tokens) as avg_saved_tokens
|
|
170
|
+
FROM invocations i
|
|
171
|
+
JOIN skills_manifest s ON i.skill_id = s.skill_id
|
|
172
|
+
WHERE ${whereSql}
|
|
173
|
+
GROUP BY s.skill_id
|
|
174
|
+
ORDER BY saved_steps DESC
|
|
175
|
+
LIMIT 10
|
|
176
|
+
`)
|
|
177
|
+
.all(...params);
|
|
178
|
+
// 5. L3 Governance: Dormant Skills (No invocations in > 14 days or never invoked)
|
|
179
|
+
const dormantSkills = this.db
|
|
180
|
+
.prepare(`
|
|
181
|
+
SELECT
|
|
182
|
+
s.skill_id,
|
|
183
|
+
s.skill_name,
|
|
184
|
+
s.category,
|
|
185
|
+
s.description,
|
|
186
|
+
s.last_invoked_at
|
|
187
|
+
FROM skills_manifest s
|
|
188
|
+
WHERE s.skill_id NOT IN (
|
|
189
|
+
SELECT DISTINCT skill_id FROM invocations WHERE timestamp >= datetime('now', '-14 days')
|
|
190
|
+
)
|
|
191
|
+
ORDER BY s.skill_name ASC
|
|
192
|
+
`)
|
|
193
|
+
.all();
|
|
194
|
+
// 6. L3 Governance: Follow-Up Modifiers Mining (Clustered blind-spot suggestions)
|
|
195
|
+
const modifierRows = this.db
|
|
196
|
+
.prepare(`
|
|
197
|
+
SELECT
|
|
198
|
+
i.follow_up_modifier,
|
|
199
|
+
COUNT(*) as cnt
|
|
200
|
+
FROM invocations i
|
|
201
|
+
WHERE ${whereSql} AND i.follow_up_modifier IS NOT NULL
|
|
202
|
+
GROUP BY i.follow_up_modifier
|
|
203
|
+
ORDER BY cnt DESC
|
|
204
|
+
LIMIT 5
|
|
205
|
+
`)
|
|
206
|
+
.all(...params);
|
|
207
|
+
const followUpModifiers = modifierRows.map((m) => {
|
|
208
|
+
const matched = MODIFIER_PATTERNS.find((p) => p.category === m.follow_up_modifier);
|
|
209
|
+
return {
|
|
210
|
+
category: m.follow_up_modifier,
|
|
211
|
+
count: m.cnt,
|
|
212
|
+
recommendation: matched ? matched.recommendation : '建议将该高频补充指令收敛进对应技能规则中',
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
// 7. L3 Governance: Health Leaderboard with Grades
|
|
216
|
+
const healthLeaderboard = skillRows.map((s) => {
|
|
217
|
+
const health = calculateSkillHealthScore({
|
|
218
|
+
totalInvocations: s.hit_cnt,
|
|
219
|
+
successCount: s.hit_cnt,
|
|
220
|
+
correctionCount: s.corrections || 0,
|
|
221
|
+
});
|
|
222
|
+
return {
|
|
223
|
+
skill_id: s.skill_id,
|
|
224
|
+
skill_name: s.skill_name,
|
|
225
|
+
category: s.category,
|
|
226
|
+
score: health.score,
|
|
227
|
+
grade: health.grade,
|
|
228
|
+
summary: health.summary,
|
|
229
|
+
};
|
|
230
|
+
});
|
|
231
|
+
// ASCII Chart for Top Skills by Steps Saved
|
|
232
|
+
const chartItems = skillRows.slice(0, 5).map((s) => ({
|
|
233
|
+
label: s.skill_name.length > 18 ? s.skill_name.substring(0, 16) + '..' : s.skill_name,
|
|
234
|
+
value: s.saved_steps,
|
|
235
|
+
suffix: `+${formatNumber(s.saved_steps)} 步 (${s.hit_cnt}次)`,
|
|
236
|
+
}));
|
|
237
|
+
// Build Markdown output
|
|
238
|
+
let md = `## 📊 SkillFlow 跨平台全景效能看板\n\n`;
|
|
239
|
+
md += `> **筛选条件**: ${this.describeFilters(input)} | **主视角**: \`${input.group_by || 'skill'}\`\n\n`;
|
|
240
|
+
md += `### 💡 核心效能大盘指标\n\n`;
|
|
241
|
+
md += `| 统计维度 | 数值指标 | 效能评估说明 |\n`;
|
|
242
|
+
md += `| :--- | :--- | :--- |\n`;
|
|
243
|
+
md += `| **覆盖会话** | **${formatNumber(sessionCount)}** 场 | 活跃对话会话总数 |\n`;
|
|
244
|
+
md += `| **Skill 触发总量** | **${formatNumber(totalInvocations)}** 次 | 成功率 **${formatPercent(successRate)}** (显式 ${explicitCount} / 隐式 ${implicitCount}) |\n`;
|
|
245
|
+
md += `| **累计节省工时** | **+${formatWorkHours(totalSavedHours)}** | 替代开发者手动排查与撰写工时 |\n`;
|
|
246
|
+
md += `| **累计精简流程** | **+${formatNumber(totalSavedSteps)} 步** | 消除的重复/排查交互步骤 |\n`;
|
|
247
|
+
md += `| **累计节省 Token** | **+${formatNumber(totalSavedTokens)} Tokens** | 模型真金白银节约 **¥${totalCostSavedCny.toFixed(2)} ($${totalCostSavedUsd.toFixed(2)})** |\n\n`;
|
|
248
|
+
md += `### ⚙️ 工程质量与健康度\n\n`;
|
|
249
|
+
md += `- **意图触发方式**: 显式调用率 **${formatPercent(explicitRate)}** | 隐式自动匹配 **${formatPercent(1 - explicitRate)}**\n`;
|
|
250
|
+
md += `- **采纳纯度与返工**: 二次纠错返工率 **${formatPercent(correctionRate)}** (${totalCorrections} 次被要求修改)\n`;
|
|
251
|
+
if (totalContextTokens > 0) {
|
|
252
|
+
md += `- **上下文注入与产出**: 累计注入规则 **${formatNumber(totalContextTokens)} Tokens** | 产出 **${formatNumber(totalOutputTokens)} Tokens** (产出比 ${yieldRatio.toFixed(1)}%)\n`;
|
|
253
|
+
}
|
|
254
|
+
if (totalToolDepth > 0) {
|
|
255
|
+
md += `- **工具调用链**: 驱动子工具 **${totalToolDepth} 次** | 阻断失败 **${totalToolFailures} 次**\n`;
|
|
256
|
+
}
|
|
257
|
+
md += `\n### 🏆 价值贡献最大 Skill Top 5 (节省步骤榜)\n\n`;
|
|
258
|
+
md += `${renderHorizontalBarChart(chartItems, 18)}\n\n`;
|
|
259
|
+
md += `### 🤖 各 Agent 生态调用与收益贡献矩阵\n\n`;
|
|
260
|
+
md += `| Agent 宿主 | 覆盖会话 | 触发次数 | 占比 | 贡献节约工时 | 贡献节约 Token |\n`;
|
|
261
|
+
md += `| :--- | :---: | :---: | :---: | :---: | :---: |\n`;
|
|
262
|
+
for (const a of agentRows) {
|
|
263
|
+
const pct = formatPercent(a.hit_cnt / totalInvocations);
|
|
264
|
+
md += `| **${a.agent_name}** | ${a.session_cnt} | ${a.hit_cnt} 次 | ${pct} | **+${formatWorkHours(a.saved_hours || 0)}** | **+${formatNumber(a.saved_tokens)}** |\n`;
|
|
265
|
+
}
|
|
266
|
+
if (modelRows.length > 0) {
|
|
267
|
+
md += `\n### 🧠 执行模型分布与计费核算\n\n`;
|
|
268
|
+
md += `| 模型标识 | 调用次数 | 节约 Token | 节约人工工时 | 折合节省资金 |\n`;
|
|
269
|
+
md += `| :--- | :---: | :---: | :---: | :---: |\n`;
|
|
270
|
+
for (const m of modelRows) {
|
|
271
|
+
md += `| \`${m.model_name}\` | ${m.hit_cnt} 次 | +${formatNumber(m.saved_tokens)} | +${formatWorkHours(m.saved_hours || 0)} | **¥${(m.cost_saved_cny || 0).toFixed(2)}** ($${(m.cost_saved_usd || 0).toFixed(2)}) |\n`;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (dormantSkills.length > 0) {
|
|
275
|
+
md += `\n### 💤 僵尸技能待治理清单 (>14天未调用)\n\n`;
|
|
276
|
+
for (const d of dormantSkills.slice(0, 5)) {
|
|
277
|
+
md += `- \`${d.skill_id}\` (${d.skill_name}): ${d.description || '无描述'}\n`;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
markdown: md,
|
|
282
|
+
data: {
|
|
283
|
+
kpi: kpiData,
|
|
284
|
+
agentRows,
|
|
285
|
+
modelRows,
|
|
286
|
+
skillRows,
|
|
287
|
+
governance: {
|
|
288
|
+
healthLeaderboard,
|
|
289
|
+
dormantSkills,
|
|
290
|
+
followUpModifiers,
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=dashboard.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.service.js","sourceRoot":"","sources":["../../src/services/dashboard.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
export interface FilterOption {
|
|
3
|
+
value: string;
|
|
4
|
+
label: string;
|
|
5
|
+
count: number;
|
|
6
|
+
}
|
|
7
|
+
export interface FilterOptions {
|
|
8
|
+
agents: FilterOption[];
|
|
9
|
+
skills: FilterOption[];
|
|
10
|
+
models: FilterOption[];
|
|
11
|
+
statuses: FilterOption[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Supplies the option lists for the dashboard query filters.
|
|
15
|
+
* Every list is produced by a single grouped query so the UI never fans out per row.
|
|
16
|
+
*/
|
|
17
|
+
export declare class FilterService {
|
|
18
|
+
private db;
|
|
19
|
+
constructor(db: DatabaseSync);
|
|
20
|
+
list(): FilterOptions;
|
|
21
|
+
private listAgents;
|
|
22
|
+
private listSkills;
|
|
23
|
+
private listModels;
|
|
24
|
+
private listStatuses;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=filter.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.service.d.ts","sourceRoot":"","sources":["../../src/services/filter.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AASD;;;GAGG;AACH,qBAAa,aAAa;IACZ,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,YAAY;IAEpC,IAAI,IAAI,aAAa;IASrB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,YAAY;CA4BrB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { INVOCATION_STATUSES } from '../db/invocation-filter.js';
|
|
2
|
+
const STATUS_LABELS = {
|
|
3
|
+
success: '成功',
|
|
4
|
+
partial: '部分成功',
|
|
5
|
+
failed: '失败',
|
|
6
|
+
skipped: '已跳过',
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Supplies the option lists for the dashboard query filters.
|
|
10
|
+
* Every list is produced by a single grouped query so the UI never fans out per row.
|
|
11
|
+
*/
|
|
12
|
+
export class FilterService {
|
|
13
|
+
db;
|
|
14
|
+
constructor(db) {
|
|
15
|
+
this.db = db;
|
|
16
|
+
}
|
|
17
|
+
list() {
|
|
18
|
+
return {
|
|
19
|
+
agents: this.listAgents(),
|
|
20
|
+
skills: this.listSkills(),
|
|
21
|
+
models: this.listModels(),
|
|
22
|
+
statuses: this.listStatuses(),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
listAgents() {
|
|
26
|
+
const rows = this.db
|
|
27
|
+
.prepare(`
|
|
28
|
+
SELECT agent_name AS value, COUNT(*) AS count
|
|
29
|
+
FROM invocations
|
|
30
|
+
WHERE agent_name IS NOT NULL AND TRIM(agent_name) <> ''
|
|
31
|
+
GROUP BY agent_name
|
|
32
|
+
ORDER BY count DESC, agent_name ASC
|
|
33
|
+
`)
|
|
34
|
+
.all();
|
|
35
|
+
return rows.map((row) => ({
|
|
36
|
+
value: row.value,
|
|
37
|
+
label: row.value,
|
|
38
|
+
count: row.count,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
listSkills() {
|
|
42
|
+
const rows = this.db
|
|
43
|
+
.prepare(`
|
|
44
|
+
SELECT
|
|
45
|
+
i.skill_id AS value,
|
|
46
|
+
COALESCE(s.skill_name, i.skill_id) AS label,
|
|
47
|
+
COUNT(*) AS count
|
|
48
|
+
FROM invocations i
|
|
49
|
+
LEFT JOIN skills_manifest s ON s.skill_id = i.skill_id
|
|
50
|
+
GROUP BY i.skill_id
|
|
51
|
+
ORDER BY count DESC, label ASC
|
|
52
|
+
`)
|
|
53
|
+
.all();
|
|
54
|
+
return rows.map((row) => ({
|
|
55
|
+
value: row.value,
|
|
56
|
+
label: row.label,
|
|
57
|
+
count: row.count,
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
listModels() {
|
|
61
|
+
const rows = this.db
|
|
62
|
+
.prepare(`
|
|
63
|
+
SELECT model_name AS value, COUNT(*) AS count
|
|
64
|
+
FROM invocations
|
|
65
|
+
WHERE model_name IS NOT NULL AND TRIM(model_name) <> ''
|
|
66
|
+
GROUP BY model_name
|
|
67
|
+
ORDER BY count DESC, model_name ASC
|
|
68
|
+
`)
|
|
69
|
+
.all();
|
|
70
|
+
return rows.map((row) => ({
|
|
71
|
+
value: row.value,
|
|
72
|
+
label: row.value === 'unknown' ? '未标注模型' : row.value,
|
|
73
|
+
count: row.count,
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
listStatuses() {
|
|
77
|
+
const rows = this.db
|
|
78
|
+
.prepare(`
|
|
79
|
+
SELECT status AS value, COUNT(*) AS count
|
|
80
|
+
FROM invocations
|
|
81
|
+
GROUP BY status
|
|
82
|
+
`)
|
|
83
|
+
.all();
|
|
84
|
+
const counts = new Map();
|
|
85
|
+
for (const row of rows) {
|
|
86
|
+
counts.set(row.value, row.count);
|
|
87
|
+
}
|
|
88
|
+
const options = [];
|
|
89
|
+
for (const status of INVOCATION_STATUSES) {
|
|
90
|
+
const count = counts.get(status);
|
|
91
|
+
if (!count) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
options.push({
|
|
95
|
+
value: status,
|
|
96
|
+
label: STATUS_LABELS[status],
|
|
97
|
+
count,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return options;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=filter.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.service.js","sourceRoot":"","sources":["../../src/services/filter.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAgBjE,MAAM,aAAa,GAAqC;IACtD,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,KAAK;CACf,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,aAAa;IACJ;IAApB,YAAoB,EAAgB;QAAhB,OAAE,GAAF,EAAE,CAAc;IAAG,CAAC;IAExC,IAAI;QACF,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE;YACzB,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE;YACzB,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE;YACzB,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE;SAC9B,CAAC;IACJ,CAAC;IAEO,UAAU;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC;;;;;;OAMR,CAAC;aACD,GAAG,EAA6C,CAAC;QAEpD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,UAAU;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC;;;;;;;;;OASR,CAAC;aACD,GAAG,EAA4D,CAAC;QAEnE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,UAAU;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC;;;;;;OAMR,CAAC;aACD,GAAG,EAA6C,CAAC;QAEpD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK;YACpD,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,YAAY;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC;;;;OAIR,CAAC;aACD,GAAG,EAA6C,CAAC;QAEpD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YACD,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC;gBAC5B,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
import { GetRoundSkillImpactInput } from '../types/tools.js';
|
|
3
|
+
import { InvocationWithSkill, SessionRow } from '../types/models.js';
|
|
4
|
+
export declare class ImpactService {
|
|
5
|
+
private db;
|
|
6
|
+
private telemetryService;
|
|
7
|
+
constructor(db: DatabaseSync);
|
|
8
|
+
getRoundImpact(input: GetRoundSkillImpactInput): {
|
|
9
|
+
found: boolean;
|
|
10
|
+
markdown: string;
|
|
11
|
+
data?: {
|
|
12
|
+
session: SessionRow;
|
|
13
|
+
round_index: number;
|
|
14
|
+
invocations: InvocationWithSkill[];
|
|
15
|
+
round_saved_steps: number;
|
|
16
|
+
round_saved_tokens: number;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=impact.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.service.d.ts","sourceRoot":"","sources":["../../src/services/impact.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrE,qBAAa,aAAa;IAGZ,OAAO,CAAC,EAAE;IAFtB,OAAO,CAAC,gBAAgB,CAAmB;gBAEvB,EAAE,EAAE,YAAY;IAIpC,cAAc,CAAC,KAAK,EAAE,wBAAwB,GAAG;QAC/C,KAAK,EAAE,OAAO,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE;YACL,OAAO,EAAE,UAAU,CAAC;YACpB,WAAW,EAAE,MAAM,CAAC;YACpB,WAAW,EAAE,mBAAmB,EAAE,CAAC;YACnC,iBAAiB,EAAE,MAAM,CAAC;YAC1B,kBAAkB,EAAE,MAAM,CAAC;SAC5B,CAAC;KACH;CAqHF"}
|