@mengzf/skillflow-mcp 0.0.0-stage → 1.0.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.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +238 -2
  3. package/dist/adapters/workbuddy.sniffer.d.ts +22 -0
  4. package/dist/adapters/workbuddy.sniffer.d.ts.map +1 -0
  5. package/dist/adapters/workbuddy.sniffer.js +143 -0
  6. package/dist/adapters/workbuddy.sniffer.js.map +1 -0
  7. package/dist/config.d.ts +9 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +33 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/db/index.d.ts +4 -0
  12. package/dist/db/index.d.ts.map +1 -0
  13. package/dist/db/index.js +39 -0
  14. package/dist/db/index.js.map +1 -0
  15. package/dist/db/schema.d.ts +3 -0
  16. package/dist/db/schema.d.ts.map +1 -0
  17. package/dist/db/schema.js +103 -0
  18. package/dist/db/schema.js.map +1 -0
  19. package/dist/db/seed.d.ts +15 -0
  20. package/dist/db/seed.d.ts.map +1 -0
  21. package/dist/db/seed.js +128 -0
  22. package/dist/db/seed.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +51 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/server.d.ts +7 -0
  28. package/dist/server.d.ts.map +1 -0
  29. package/dist/server.js +368 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/services/benchmark.service.d.ts +27 -0
  32. package/dist/services/benchmark.service.d.ts.map +1 -0
  33. package/dist/services/benchmark.service.js +94 -0
  34. package/dist/services/benchmark.service.js.map +1 -0
  35. package/dist/services/dashboard.service.d.ts +12 -0
  36. package/dist/services/dashboard.service.d.ts.map +1 -0
  37. package/dist/services/dashboard.service.js +191 -0
  38. package/dist/services/dashboard.service.js.map +1 -0
  39. package/dist/services/impact.service.d.ts +20 -0
  40. package/dist/services/impact.service.d.ts.map +1 -0
  41. package/dist/services/impact.service.js +114 -0
  42. package/dist/services/impact.service.js.map +1 -0
  43. package/dist/services/telemetry.service.d.ts +33 -0
  44. package/dist/services/telemetry.service.d.ts.map +1 -0
  45. package/dist/services/telemetry.service.js +175 -0
  46. package/dist/services/telemetry.service.js.map +1 -0
  47. package/dist/types/index.d.ts +3 -0
  48. package/dist/types/index.d.ts.map +1 -0
  49. package/dist/types/index.js +3 -0
  50. package/dist/types/index.js.map +1 -0
  51. package/dist/types/models.d.ts +61 -0
  52. package/dist/types/models.d.ts.map +1 -0
  53. package/dist/types/models.js +2 -0
  54. package/dist/types/models.js.map +1 -0
  55. package/dist/types/tools.d.ts +134 -0
  56. package/dist/types/tools.d.ts.map +1 -0
  57. package/dist/types/tools.js +149 -0
  58. package/dist/types/tools.js.map +1 -0
  59. package/dist/utils/ascii-chart.d.ts +9 -0
  60. package/dist/utils/ascii-chart.d.ts.map +1 -0
  61. package/dist/utils/ascii-chart.js +29 -0
  62. package/dist/utils/ascii-chart.js.map +1 -0
  63. package/dist/utils/formatter.d.ts +6 -0
  64. package/dist/utils/formatter.d.ts.map +1 -0
  65. package/dist/utils/formatter.js +29 -0
  66. package/dist/utils/formatter.js.map +1 -0
  67. package/dist/utils/hours.d.ts +3 -0
  68. package/dist/utils/hours.d.ts.map +1 -0
  69. package/dist/utils/hours.js +15 -0
  70. package/dist/utils/hours.js.map +1 -0
  71. package/dist/utils/pricing.d.ts +19 -0
  72. package/dist/utils/pricing.d.ts.map +1 -0
  73. package/dist/utils/pricing.js +96 -0
  74. package/dist/utils/pricing.js.map +1 -0
  75. package/dist/utils/quality.d.ts +15 -0
  76. package/dist/utils/quality.d.ts.map +1 -0
  77. package/dist/utils/quality.js +47 -0
  78. package/dist/utils/quality.js.map +1 -0
  79. package/dist/web/render.d.ts +2 -0
  80. package/dist/web/render.d.ts.map +1 -0
  81. package/dist/web/render.js +593 -0
  82. package/dist/web/render.js.map +1 -0
  83. package/dist/web/server.d.ts +10 -0
  84. package/dist/web/server.d.ts.map +1 -0
  85. package/dist/web/server.js +136 -0
  86. package/dist/web/server.js.map +1 -0
  87. package/package.json +51 -4
@@ -0,0 +1,175 @@
1
+ import { BenchmarkService } from './benchmark.service.js';
2
+ import { calculateCost } from '../utils/pricing.js';
3
+ import { calculateSavedHours } from '../utils/hours.js';
4
+ import { classifySkillInvestment } from '../utils/quality.js';
5
+ export class TelemetryService {
6
+ db;
7
+ benchmarkService;
8
+ constructor(db) {
9
+ this.db = db;
10
+ this.benchmarkService = new BenchmarkService(db);
11
+ }
12
+ ensureSession(sessionId, agentName = 'unknown', roundIndex = 1) {
13
+ const existing = this.db
14
+ .prepare('SELECT * FROM sessions WHERE session_id = ?')
15
+ .get(sessionId);
16
+ if (!existing) {
17
+ this.db
18
+ .prepare(`
19
+ INSERT INTO sessions (
20
+ session_id, agent_name, created_at, last_active_at,
21
+ round_count, total_invocations, total_saved_steps, total_saved_tokens,
22
+ total_saved_hours, total_cost_saved_usd, total_cost_saved_cny, total_corrections
23
+ ) VALUES (?, ?, datetime('now'), datetime('now'), ?, 0, 0, 0, 0.0, 0.0, 0.0, 0)
24
+ `)
25
+ .run(sessionId, agentName, roundIndex);
26
+ return this.db
27
+ .prepare('SELECT * FROM sessions WHERE session_id = ?')
28
+ .get(sessionId);
29
+ }
30
+ const updatedAgent = existing.agent_name === 'unknown' && agentName !== 'unknown' ? agentName : existing.agent_name;
31
+ const maxRound = Math.max(existing.round_count, roundIndex);
32
+ this.db
33
+ .prepare(`
34
+ UPDATE sessions SET
35
+ agent_name = ?,
36
+ round_count = ?,
37
+ last_active_at = datetime('now')
38
+ WHERE session_id = ?
39
+ `)
40
+ .run(updatedAgent, maxRound, sessionId);
41
+ return this.db
42
+ .prepare('SELECT * FROM sessions WHERE session_id = ?')
43
+ .get(sessionId);
44
+ }
45
+ recordHit(input) {
46
+ const roundIndex = input.round_index ?? 1;
47
+ const agentName = input.agent_name || 'unknown';
48
+ const modelName = input.model_name || 'unknown';
49
+ const status = input.status || 'success';
50
+ const actualSteps = input.actual_steps ?? 1;
51
+ const actualTokens = input.actual_tokens ?? 0;
52
+ const executionTimeMs = input.execution_time_ms ?? 0;
53
+ const metadataStr = input.metadata ? JSON.stringify(input.metadata) : '{}';
54
+ const hasCorrection = input.has_correction ? 1 : 0;
55
+ // 1. Ensure skill exists in manifest (auto-register if new)
56
+ let benchmark = this.benchmarkService.getBenchmark(input.skill_id);
57
+ if (!benchmark) {
58
+ benchmark = this.benchmarkService.setBenchmark({
59
+ skill_id: input.skill_id,
60
+ skill_name: input.skill_id,
61
+ category: 'general',
62
+ });
63
+ }
64
+ // 2. Compute saved steps, tokens, and net delta
65
+ let savedSteps;
66
+ if (input.saved_steps !== undefined) {
67
+ savedSteps = input.saved_steps;
68
+ }
69
+ else {
70
+ if (status === 'success') {
71
+ savedSteps = Math.max(0, benchmark.baseline_steps - actualSteps);
72
+ }
73
+ else if (status === 'partial') {
74
+ savedSteps = Math.max(0, Math.floor(0.5 * benchmark.default_saved_steps));
75
+ }
76
+ else {
77
+ savedSteps = 0;
78
+ }
79
+ }
80
+ let savedTokens;
81
+ if (input.saved_tokens !== undefined) {
82
+ savedTokens = input.saved_tokens;
83
+ }
84
+ else {
85
+ if (status === 'success') {
86
+ savedTokens = Math.max(0, benchmark.baseline_tokens - actualTokens);
87
+ }
88
+ else if (status === 'partial') {
89
+ savedTokens = Math.max(0, Math.floor(0.5 * benchmark.default_saved_tokens));
90
+ }
91
+ else {
92
+ savedTokens = 0;
93
+ }
94
+ }
95
+ const netTokens = benchmark.baseline_tokens - actualTokens;
96
+ const investmentProfile = classifySkillInvestment(actualTokens, benchmark.baseline_tokens);
97
+ // 3. Compute saved work-hours and model cost
98
+ let savedHours;
99
+ if (input.saved_hours !== undefined) {
100
+ savedHours = input.saved_hours;
101
+ }
102
+ else {
103
+ const baselineMins = benchmark.baseline_manual_minutes || 15;
104
+ if (status === 'success') {
105
+ savedHours = calculateSavedHours(baselineMins, executionTimeMs);
106
+ }
107
+ else if (status === 'partial') {
108
+ savedHours = Math.round(0.5 * calculateSavedHours(baselineMins, executionTimeMs) * 100) / 100;
109
+ }
110
+ else {
111
+ savedHours = 0.0;
112
+ }
113
+ }
114
+ const cost = calculateCost(savedTokens, modelName);
115
+ // 4. Ensure session exists
116
+ this.ensureSession(input.session_id, agentName, roundIndex);
117
+ // 5. Insert invocation record
118
+ const insertRes = this.db
119
+ .prepare(`
120
+ INSERT INTO invocations (
121
+ session_id, agent_name, model_name, skill_id, round_index, status,
122
+ actual_tokens, actual_steps, saved_steps, saved_tokens, net_tokens,
123
+ saved_hours, cost_saved_usd, cost_saved_cny, has_correction, quality_profile,
124
+ execution_time_ms, metadata, timestamp
125
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))
126
+ `)
127
+ .run(input.session_id, agentName, modelName, input.skill_id, roundIndex, status, actualTokens, actualSteps, savedSteps, savedTokens, netTokens, savedHours, cost.usd, cost.cny, hasCorrection, investmentProfile.type, executionTimeMs, metadataStr);
128
+ const invocationId = Number(insertRes.lastInsertRowid);
129
+ // 6. Update session cumulative stats
130
+ this.db
131
+ .prepare(`
132
+ UPDATE sessions SET
133
+ total_invocations = total_invocations + 1,
134
+ total_saved_steps = total_saved_steps + ?,
135
+ total_saved_tokens = total_saved_tokens + ?,
136
+ total_saved_hours = total_saved_hours + ?,
137
+ total_cost_saved_usd = total_cost_saved_usd + ?,
138
+ total_cost_saved_cny = total_cost_saved_cny + ?,
139
+ total_corrections = total_corrections + ?,
140
+ last_active_at = datetime('now')
141
+ WHERE session_id = ?
142
+ `)
143
+ .run(savedSteps, savedTokens, savedHours, cost.usd, cost.cny, hasCorrection, input.session_id);
144
+ const updatedSession = this.db
145
+ .prepare('SELECT * FROM sessions WHERE session_id = ?')
146
+ .get(input.session_id);
147
+ return {
148
+ invocation_id: invocationId,
149
+ session_id: input.session_id,
150
+ agent_name: agentName,
151
+ model_name: modelName,
152
+ skill_id: input.skill_id,
153
+ skill_name: benchmark.skill_name,
154
+ round_index: roundIndex,
155
+ status,
156
+ actual_steps: actualSteps,
157
+ saved_steps: savedSteps,
158
+ actual_tokens: actualTokens,
159
+ saved_tokens: savedTokens,
160
+ net_tokens: netTokens,
161
+ quality_profile: investmentProfile.type,
162
+ has_correction: Boolean(hasCorrection),
163
+ saved_hours: savedHours,
164
+ cost_saved_usd: cost.usd,
165
+ cost_saved_cny: cost.cny,
166
+ session: updatedSession,
167
+ };
168
+ }
169
+ getLastActiveSession() {
170
+ return this.db
171
+ .prepare('SELECT * FROM sessions ORDER BY last_active_at DESC LIMIT 1')
172
+ .get();
173
+ }
174
+ }
175
+ //# sourceMappingURL=telemetry.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.service.js","sourceRoot":"","sources":["../../src/services/telemetry.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './models.js';
2
+ export * from './tools.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './models.js';
2
+ export * from './tools.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,61 @@
1
+ export type InvocationStatus = 'success' | 'failed' | 'partial' | 'skipped';
2
+ export interface SkillManifestRow {
3
+ skill_id: string;
4
+ skill_name: string;
5
+ category: string;
6
+ description: string | null;
7
+ baseline_steps: number;
8
+ baseline_tokens: number;
9
+ baseline_manual_minutes: number;
10
+ default_saved_steps: number;
11
+ default_saved_tokens: number;
12
+ tags: string;
13
+ created_at: string;
14
+ updated_at: string;
15
+ }
16
+ export interface SessionRow {
17
+ session_id: string;
18
+ agent_name: string;
19
+ title: string | null;
20
+ created_at: string;
21
+ last_active_at: string;
22
+ round_count: number;
23
+ total_invocations: number;
24
+ total_saved_steps: number;
25
+ total_saved_tokens: number;
26
+ total_saved_hours: number;
27
+ total_cost_saved_usd: number;
28
+ total_cost_saved_cny: number;
29
+ total_corrections: number;
30
+ metadata: string;
31
+ }
32
+ export interface InvocationRow {
33
+ id: number;
34
+ session_id: string;
35
+ agent_name: string;
36
+ model_name: string;
37
+ skill_id: string;
38
+ round_index: number;
39
+ status: InvocationStatus;
40
+ actual_tokens: number;
41
+ actual_steps: number;
42
+ saved_steps: number;
43
+ saved_tokens: number;
44
+ net_tokens: number;
45
+ saved_hours: number;
46
+ cost_saved_usd: number;
47
+ cost_saved_cny: number;
48
+ has_correction: number;
49
+ quality_profile: string;
50
+ execution_time_ms: number;
51
+ metadata: string;
52
+ timestamp: string;
53
+ }
54
+ export interface InvocationWithSkill extends InvocationRow {
55
+ skill_name: string;
56
+ category: string;
57
+ baseline_steps: number;
58
+ baseline_tokens: number;
59
+ baseline_manual_minutes: number;
60
+ }
61
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/types/models.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAE5E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,gBAAgB,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;CACjC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/types/models.ts"],"names":[],"mappings":""}
@@ -0,0 +1,134 @@
1
+ import { z } from 'zod';
2
+ import { InvocationStatus } from './models.js';
3
+ export declare const RecordSkillHitSchema: z.ZodObject<{
4
+ session_id: z.ZodString;
5
+ skill_id: z.ZodString;
6
+ agent_name: z.ZodDefault<z.ZodOptional<z.ZodString>>;
7
+ model_name: z.ZodDefault<z.ZodOptional<z.ZodString>>;
8
+ round_index: z.ZodOptional<z.ZodNumber>;
9
+ status: z.ZodDefault<z.ZodOptional<z.ZodEnum<["success", "failed", "partial", "skipped"]>>>;
10
+ actual_tokens: z.ZodOptional<z.ZodNumber>;
11
+ actual_steps: z.ZodOptional<z.ZodNumber>;
12
+ saved_steps: z.ZodOptional<z.ZodNumber>;
13
+ saved_tokens: z.ZodOptional<z.ZodNumber>;
14
+ execution_time_ms: z.ZodOptional<z.ZodNumber>;
15
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
16
+ }, "strip", z.ZodTypeAny, {
17
+ session_id: string;
18
+ skill_id: string;
19
+ agent_name: string;
20
+ model_name: string;
21
+ status: "success" | "failed" | "partial" | "skipped";
22
+ round_index?: number | undefined;
23
+ actual_tokens?: number | undefined;
24
+ actual_steps?: number | undefined;
25
+ saved_steps?: number | undefined;
26
+ saved_tokens?: number | undefined;
27
+ execution_time_ms?: number | undefined;
28
+ metadata?: Record<string, any> | undefined;
29
+ }, {
30
+ session_id: string;
31
+ skill_id: string;
32
+ agent_name?: string | undefined;
33
+ model_name?: string | undefined;
34
+ round_index?: number | undefined;
35
+ status?: "success" | "failed" | "partial" | "skipped" | undefined;
36
+ actual_tokens?: number | undefined;
37
+ actual_steps?: number | undefined;
38
+ saved_steps?: number | undefined;
39
+ saved_tokens?: number | undefined;
40
+ execution_time_ms?: number | undefined;
41
+ metadata?: Record<string, any> | undefined;
42
+ }>;
43
+ export interface RecordSkillHitInput {
44
+ session_id: string;
45
+ skill_id: string;
46
+ agent_name?: string;
47
+ model_name?: string;
48
+ round_index?: number;
49
+ status?: InvocationStatus;
50
+ actual_tokens?: number;
51
+ actual_steps?: number;
52
+ saved_steps?: number;
53
+ saved_tokens?: number;
54
+ saved_hours?: number;
55
+ has_correction?: boolean;
56
+ execution_time_ms?: number;
57
+ metadata?: Record<string, any>;
58
+ }
59
+ export declare const GetRoundSkillImpactSchema: z.ZodObject<{
60
+ session_id: z.ZodOptional<z.ZodString>;
61
+ round_index: z.ZodOptional<z.ZodNumber>;
62
+ include_session_summary: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
63
+ }, "strip", z.ZodTypeAny, {
64
+ include_session_summary: boolean;
65
+ session_id?: string | undefined;
66
+ round_index?: number | undefined;
67
+ }, {
68
+ session_id?: string | undefined;
69
+ round_index?: number | undefined;
70
+ include_session_summary?: boolean | undefined;
71
+ }>;
72
+ export type GetRoundSkillImpactInput = z.infer<typeof GetRoundSkillImpactSchema>;
73
+ export declare const GetSkillDashboardSchema: z.ZodObject<{
74
+ time_range: z.ZodDefault<z.ZodOptional<z.ZodEnum<["current_session", "today", "7days", "30days", "all"]>>>;
75
+ session_id: z.ZodOptional<z.ZodString>;
76
+ agent_name: z.ZodOptional<z.ZodString>;
77
+ skill_id: z.ZodOptional<z.ZodString>;
78
+ group_by: z.ZodDefault<z.ZodOptional<z.ZodEnum<["skill", "agent", "category", "date"]>>>;
79
+ }, "strip", z.ZodTypeAny, {
80
+ time_range: "current_session" | "today" | "7days" | "30days" | "all";
81
+ group_by: "skill" | "agent" | "category" | "date";
82
+ session_id?: string | undefined;
83
+ skill_id?: string | undefined;
84
+ agent_name?: string | undefined;
85
+ }, {
86
+ session_id?: string | undefined;
87
+ skill_id?: string | undefined;
88
+ agent_name?: string | undefined;
89
+ time_range?: "current_session" | "today" | "7days" | "30days" | "all" | undefined;
90
+ group_by?: "skill" | "agent" | "category" | "date" | undefined;
91
+ }>;
92
+ export interface GetSkillDashboardInput {
93
+ time_range?: 'current_session' | 'today' | '7days' | '30days' | 'all';
94
+ session_id?: string;
95
+ agent_name?: string;
96
+ skill_id?: string;
97
+ group_by?: 'skill' | 'agent' | 'category' | 'date';
98
+ }
99
+ export declare const ManageSkillBenchmarkSchema: z.ZodObject<{
100
+ action: z.ZodEnum<["list", "get", "set", "delete", "reset_defaults"]>;
101
+ skill_id: z.ZodOptional<z.ZodString>;
102
+ skill_name: z.ZodOptional<z.ZodString>;
103
+ category: z.ZodOptional<z.ZodString>;
104
+ description: z.ZodOptional<z.ZodString>;
105
+ baseline_steps: z.ZodOptional<z.ZodNumber>;
106
+ baseline_tokens: z.ZodOptional<z.ZodNumber>;
107
+ default_saved_steps: z.ZodOptional<z.ZodNumber>;
108
+ default_saved_tokens: z.ZodOptional<z.ZodNumber>;
109
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
110
+ }, "strip", z.ZodTypeAny, {
111
+ action: "list" | "get" | "set" | "delete" | "reset_defaults";
112
+ skill_id?: string | undefined;
113
+ category?: string | undefined;
114
+ skill_name?: string | undefined;
115
+ description?: string | undefined;
116
+ baseline_steps?: number | undefined;
117
+ baseline_tokens?: number | undefined;
118
+ default_saved_steps?: number | undefined;
119
+ default_saved_tokens?: number | undefined;
120
+ tags?: string[] | undefined;
121
+ }, {
122
+ action: "list" | "get" | "set" | "delete" | "reset_defaults";
123
+ skill_id?: string | undefined;
124
+ category?: string | undefined;
125
+ skill_name?: string | undefined;
126
+ description?: string | undefined;
127
+ baseline_steps?: number | undefined;
128
+ baseline_tokens?: number | undefined;
129
+ default_saved_steps?: number | undefined;
130
+ default_saved_tokens?: number | undefined;
131
+ tags?: string[] | undefined;
132
+ }>;
133
+ export type ManageSkillBenchmarkInput = z.infer<typeof ManageSkillBenchmarkSchema>;
134
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/types/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwD/B,CAAC;AAEH,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAgBpC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEjF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;EAuBlC,CAAC;AAEH,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,iBAAiB,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;CACpD;AAED,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgDrC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
@@ -0,0 +1,149 @@
1
+ import { z } from 'zod';
2
+ export const RecordSkillHitSchema = z.object({
3
+ session_id: z.string().describe('Unique session identifier (e.g. sess-20261111-01)'),
4
+ skill_id: z.string().describe("Unique identifier of the skill (e.g. 'code-review', 'frontend-design')"),
5
+ agent_name: z
6
+ .string()
7
+ .optional()
8
+ .default('unknown')
9
+ .describe("Agent identifier (e.g. 'Claude Code', 'Trae', 'Qoder', 'WorkBuddy', 'Codex', 'DSH')"),
10
+ model_name: z
11
+ .string()
12
+ .optional()
13
+ .default('unknown')
14
+ .describe("Model identifier (e.g. 'deepseek-v4.1-flash', 'claude-3-5-sonnet', 'gpt-4o')"),
15
+ round_index: z
16
+ .number()
17
+ .int()
18
+ .min(1)
19
+ .optional()
20
+ .describe('Conversation round index (if omitted, increments automatically or defaults to current)'),
21
+ status: z
22
+ .enum(['success', 'failed', 'partial', 'skipped'])
23
+ .optional()
24
+ .default('success')
25
+ .describe('Execution status of the skill'),
26
+ actual_tokens: z
27
+ .number()
28
+ .int()
29
+ .min(0)
30
+ .optional()
31
+ .describe('Actual tokens consumed during skill execution'),
32
+ actual_steps: z
33
+ .number()
34
+ .int()
35
+ .min(0)
36
+ .optional()
37
+ .describe('Actual steps taken by the skill (defaults to 1)'),
38
+ saved_steps: z
39
+ .number()
40
+ .int()
41
+ .optional()
42
+ .describe('Explicit steps saved (if omitted, calculated automatically from skill baseline)'),
43
+ saved_tokens: z
44
+ .number()
45
+ .int()
46
+ .optional()
47
+ .describe('Explicit tokens saved (if omitted, calculated automatically from skill baseline)'),
48
+ execution_time_ms: z
49
+ .number()
50
+ .int()
51
+ .min(0)
52
+ .optional()
53
+ .describe('Execution duration in milliseconds'),
54
+ metadata: z
55
+ .record(z.any())
56
+ .optional()
57
+ .describe('Arbitrary extra metadata such as prompt summary, error message, or target files'),
58
+ });
59
+ export const GetRoundSkillImpactSchema = z.object({
60
+ session_id: z
61
+ .string()
62
+ .optional()
63
+ .describe('Session ID to inspect (if omitted, uses the most recently active session)'),
64
+ round_index: z
65
+ .number()
66
+ .int()
67
+ .min(1)
68
+ .optional()
69
+ .describe('Specific conversation round index (if omitted, inspects the latest round)'),
70
+ include_session_summary: z
71
+ .boolean()
72
+ .optional()
73
+ .default(true)
74
+ .describe('Include cumulative session stats in the output report'),
75
+ });
76
+ export const GetSkillDashboardSchema = z.object({
77
+ time_range: z
78
+ .enum(['current_session', 'today', '7days', '30days', 'all'])
79
+ .optional()
80
+ .default('all')
81
+ .describe('Time window for analysis'),
82
+ session_id: z
83
+ .string()
84
+ .optional()
85
+ .describe("Specific session ID (required when time_range is 'current_session')"),
86
+ agent_name: z
87
+ .string()
88
+ .optional()
89
+ .describe("Filter by specific agent (e.g. 'Trae', 'Claude Code', 'Qoder', 'WorkBuddy')"),
90
+ skill_id: z
91
+ .string()
92
+ .optional()
93
+ .describe('Filter by specific skill identifier'),
94
+ group_by: z
95
+ .enum(['skill', 'agent', 'category', 'date'])
96
+ .optional()
97
+ .default('skill')
98
+ .describe('Primary aggregation grouping dimension'),
99
+ });
100
+ export const ManageSkillBenchmarkSchema = z.object({
101
+ action: z
102
+ .enum(['list', 'get', 'set', 'delete', 'reset_defaults'])
103
+ .describe('Action to perform on skill benchmarks'),
104
+ skill_id: z
105
+ .string()
106
+ .optional()
107
+ .describe("Skill ID (required for 'get', 'set', 'delete')"),
108
+ skill_name: z
109
+ .string()
110
+ .optional()
111
+ .describe('Human-readable display name of the skill'),
112
+ category: z
113
+ .string()
114
+ .optional()
115
+ .describe("Category (e.g. 'engineering', 'design', 'security', 'documentation', 'data', 'utility')"),
116
+ description: z
117
+ .string()
118
+ .optional()
119
+ .describe('Capability summary for this skill'),
120
+ baseline_steps: z
121
+ .number()
122
+ .int()
123
+ .min(1)
124
+ .optional()
125
+ .describe('Estimated manual steps required without this skill'),
126
+ baseline_tokens: z
127
+ .number()
128
+ .int()
129
+ .min(100)
130
+ .optional()
131
+ .describe('Estimated tokens consumed without this skill'),
132
+ default_saved_steps: z
133
+ .number()
134
+ .int()
135
+ .min(1)
136
+ .optional()
137
+ .describe('Expected steps saved per run'),
138
+ default_saved_tokens: z
139
+ .number()
140
+ .int()
141
+ .min(50)
142
+ .optional()
143
+ .describe('Expected tokens saved per run'),
144
+ tags: z
145
+ .array(z.string())
146
+ .optional()
147
+ .describe('Tag keywords for searching and grouping'),
148
+ });
149
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/types/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function renderBar(value: number, max: number, width?: number): string;
2
+ export declare function renderProgressBar(ratio: number, width?: number): string;
3
+ export interface BarChartItem {
4
+ label: string;
5
+ value: number;
6
+ suffix?: string;
7
+ }
8
+ export declare function renderHorizontalBarChart(items: BarChartItem[], width?: number): string;
9
+ //# sourceMappingURL=ascii-chart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ascii-chart.d.ts","sourceRoot":"","sources":["../../src/utils/ascii-chart.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAOxE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAKnE;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,KAAK,SAAK,GAAG,MAAM,CAclF"}
@@ -0,0 +1,29 @@
1
+ export function renderBar(value, max, width = 20) {
2
+ if (max <= 0 || value <= 0) {
3
+ return '░'.repeat(width);
4
+ }
5
+ const filledCount = Math.min(width, Math.max(0, Math.round((value / max) * width)));
6
+ const emptyCount = width - filledCount;
7
+ return '█'.repeat(filledCount) + '░'.repeat(emptyCount);
8
+ }
9
+ export function renderProgressBar(ratio, width = 20) {
10
+ const clamped = Math.min(1, Math.max(0, ratio));
11
+ const filledCount = Math.round(clamped * width);
12
+ const emptyCount = width - filledCount;
13
+ return `[${'█'.repeat(filledCount)}${'░'.repeat(emptyCount)}] ${(clamped * 100).toFixed(0)}%`;
14
+ }
15
+ export function renderHorizontalBarChart(items, width = 16) {
16
+ if (items.length === 0)
17
+ return '_No data available_';
18
+ const maxValue = Math.max(...items.map((i) => i.value), 1);
19
+ const maxLabelLen = Math.max(...items.map((i) => i.label.length), 4);
20
+ return items
21
+ .map((item, index) => {
22
+ const paddedLabel = item.label.padEnd(maxLabelLen, ' ');
23
+ const bar = renderBar(item.value, maxValue, width);
24
+ const suffix = item.suffix ? ` ${item.suffix}` : ` (${item.value.toLocaleString()})`;
25
+ return `${index + 1}. \`${paddedLabel}\` [${bar}]${suffix}`;
26
+ })
27
+ .join('\n');
28
+ }
29
+ //# sourceMappingURL=ascii-chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ascii-chart.js","sourceRoot":"","sources":["../../src/utils/ascii-chart.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,GAAW,EAAE,KAAK,GAAG,EAAE;IAC9D,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,KAAK,GAAG,WAAW,CAAC;IACvC,OAAO,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,KAAK,GAAG,EAAE;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,KAAK,GAAG,WAAW,CAAC;IACvC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAChG,CAAC;AAQD,MAAM,UAAU,wBAAwB,CAAC,KAAqB,EAAE,KAAK,GAAG,EAAE;IACxE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,qBAAqB,CAAC;IAErD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAErE,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC;QACrF,OAAO,GAAG,KAAK,GAAG,CAAC,OAAO,WAAW,OAAO,GAAG,IAAI,MAAM,EAAE,CAAC;IAC9D,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function formatNumber(n: number): string;
2
+ export declare function formatPercent(ratio: number): string;
3
+ export declare function formatDuration(ms: number): string;
4
+ export declare function formatTokens(n: number): string;
5
+ export declare function formatEstimatedCost(tokens: number, costPerMillion?: number): string;
6
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/utils/formatter.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ9C;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,SAAM,GAAG,MAAM,CAMhF"}