@mengzf/skillflow-mcp 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +48 -7
  2. package/dist/adapters/claude-code.adapter.d.ts +10 -0
  3. package/dist/adapters/claude-code.adapter.d.ts.map +1 -0
  4. package/dist/adapters/claude-code.adapter.js +166 -0
  5. package/dist/adapters/claude-code.adapter.js.map +1 -0
  6. package/dist/adapters/codex.adapter.d.ts +10 -0
  7. package/dist/adapters/codex.adapter.d.ts.map +1 -0
  8. package/dist/adapters/codex.adapter.js +109 -0
  9. package/dist/adapters/codex.adapter.js.map +1 -0
  10. package/dist/adapters/dsh.adapter.d.ts +8 -0
  11. package/dist/adapters/dsh.adapter.d.ts.map +1 -0
  12. package/dist/adapters/dsh.adapter.js +75 -0
  13. package/dist/adapters/dsh.adapter.js.map +1 -0
  14. package/dist/adapters/qoder.adapter.d.ts +10 -0
  15. package/dist/adapters/qoder.adapter.d.ts.map +1 -0
  16. package/dist/adapters/qoder.adapter.js +119 -0
  17. package/dist/adapters/qoder.adapter.js.map +1 -0
  18. package/dist/adapters/trae.adapter.d.ts +8 -0
  19. package/dist/adapters/trae.adapter.d.ts.map +1 -0
  20. package/dist/adapters/trae.adapter.js +104 -0
  21. package/dist/adapters/trae.adapter.js.map +1 -0
  22. package/dist/adapters/types.d.ts +25 -0
  23. package/dist/adapters/types.d.ts.map +1 -0
  24. package/dist/adapters/types.js +2 -0
  25. package/dist/adapters/types.js.map +1 -0
  26. package/dist/adapters/universal.sync.d.ts +22 -0
  27. package/dist/adapters/universal.sync.d.ts.map +1 -0
  28. package/dist/adapters/universal.sync.js +140 -0
  29. package/dist/adapters/universal.sync.js.map +1 -0
  30. package/dist/adapters/workbuddy.sniffer.d.ts.map +1 -1
  31. package/dist/adapters/workbuddy.sniffer.js +8 -3
  32. package/dist/adapters/workbuddy.sniffer.js.map +1 -1
  33. package/dist/db/invocation-filter.d.ts +29 -0
  34. package/dist/db/invocation-filter.d.ts.map +1 -0
  35. package/dist/db/invocation-filter.js +78 -0
  36. package/dist/db/invocation-filter.js.map +1 -0
  37. package/dist/db/schema.d.ts.map +1 -1
  38. package/dist/db/schema.js +28 -2
  39. package/dist/db/schema.js.map +1 -1
  40. package/dist/server.d.ts.map +1 -1
  41. package/dist/server.js +16 -12
  42. package/dist/server.js.map +1 -1
  43. package/dist/services/dashboard.service.d.ts +2 -0
  44. package/dist/services/dashboard.service.d.ts.map +1 -1
  45. package/dist/services/dashboard.service.js +145 -40
  46. package/dist/services/dashboard.service.js.map +1 -1
  47. package/dist/services/filter.service.d.ts +26 -0
  48. package/dist/services/filter.service.d.ts.map +1 -0
  49. package/dist/services/filter.service.js +103 -0
  50. package/dist/services/filter.service.js.map +1 -0
  51. package/dist/services/telemetry.service.d.ts +9 -1
  52. package/dist/services/telemetry.service.d.ts.map +1 -1
  53. package/dist/services/telemetry.service.js +105 -36
  54. package/dist/services/telemetry.service.js.map +1 -1
  55. package/dist/types/models.d.ts +13 -1
  56. package/dist/types/models.d.ts.map +1 -1
  57. package/dist/types/tools.d.ts +44 -5
  58. package/dist/types/tools.d.ts.map +1 -1
  59. package/dist/types/tools.js +47 -1
  60. package/dist/types/tools.js.map +1 -1
  61. package/dist/utils/governance.d.ts +25 -0
  62. package/dist/utils/governance.d.ts.map +1 -0
  63. package/dist/utils/governance.js +70 -0
  64. package/dist/utils/governance.js.map +1 -0
  65. package/dist/utils/pricing.d.ts.map +1 -1
  66. package/dist/utils/pricing.js +21 -1
  67. package/dist/utils/pricing.js.map +1 -1
  68. package/dist/web/render.d.ts.map +1 -1
  69. package/dist/web/render.js +1751 -241
  70. package/dist/web/render.js.map +1 -1
  71. package/dist/web/server.d.ts.map +1 -1
  72. package/dist/web/server.js +66 -31
  73. package/dist/web/server.js.map +1 -1
  74. package/package.json +1 -1
@@ -0,0 +1,8 @@
1
+ import { AgentHistoryAdapter, DiscoveredSkillInvocation } from './types.js';
2
+ export declare class TraeAdapter implements AgentHistoryAdapter {
3
+ readonly agentName = "Trae";
4
+ private findTraeUserDirs;
5
+ scan(): DiscoveredSkillInvocation[];
6
+ private parseStateDb;
7
+ }
8
+ //# sourceMappingURL=trae.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trae.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/trae.adapter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,WAAY,YAAW,mBAAmB;IACrD,QAAQ,CAAC,SAAS,UAAU;IAE5B,OAAO,CAAC,gBAAgB;IAsBxB,IAAI,IAAI,yBAAyB,EAAE;IA4BnC,OAAO,CAAC,YAAY;CAuDrB"}
@@ -0,0 +1,104 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import { DatabaseSync } from 'node:sqlite';
5
+ export class TraeAdapter {
6
+ agentName = 'Trae';
7
+ findTraeUserDirs() {
8
+ const candidates = [];
9
+ const appdata = process.env.APPDATA || '';
10
+ const home = os.homedir();
11
+ // Windows
12
+ if (appdata) {
13
+ candidates.push(path.join(appdata, 'Trae CN', 'User'));
14
+ candidates.push(path.join(appdata, 'Trae', 'User'));
15
+ }
16
+ // macOS
17
+ candidates.push(path.join(home, 'Library', 'Application Support', 'Trae CN', 'User'));
18
+ candidates.push(path.join(home, 'Library', 'Application Support', 'Trae', 'User'));
19
+ // Linux
20
+ candidates.push(path.join(home, '.config', 'Trae CN', 'User'));
21
+ candidates.push(path.join(home, '.config', 'Trae', 'User'));
22
+ return candidates.filter((d) => fs.existsSync(d));
23
+ }
24
+ scan() {
25
+ const userDirs = this.findTraeUserDirs();
26
+ if (userDirs.length === 0)
27
+ return [];
28
+ const invocations = [];
29
+ for (const userDir of userDirs) {
30
+ const wsStorage = path.join(userDir, 'workspaceStorage');
31
+ if (!fs.existsSync(wsStorage))
32
+ continue;
33
+ try {
34
+ const folders = fs.readdirSync(wsStorage, { withFileTypes: true });
35
+ for (const f of folders) {
36
+ if (!f.isDirectory())
37
+ continue;
38
+ const folderPath = path.join(wsStorage, f.name);
39
+ const vscdbPath = path.join(folderPath, 'state.vscdb');
40
+ const wsJsonPath = path.join(folderPath, 'workspace.json');
41
+ if (fs.existsSync(vscdbPath)) {
42
+ this.parseStateDb(vscdbPath, wsJsonPath, f.name, invocations);
43
+ }
44
+ }
45
+ }
46
+ catch { }
47
+ }
48
+ return invocations;
49
+ }
50
+ parseStateDb(dbPath, wsJsonPath, workspaceId, results) {
51
+ let db = null;
52
+ try {
53
+ db = new DatabaseSync(dbPath, { readOnly: true });
54
+ const rows = db
55
+ .prepare(`SELECT key, value FROM ItemTable WHERE key LIKE '%chat%' OR key LIKE '%agent%' OR key LIKE '%history%'`)
56
+ .all();
57
+ let wsFolder = workspaceId;
58
+ if (fs.existsSync(wsJsonPath)) {
59
+ try {
60
+ const wsJson = JSON.parse(fs.readFileSync(wsJsonPath, 'utf8'));
61
+ if (wsJson.folder)
62
+ wsFolder = wsJson.folder;
63
+ }
64
+ catch { }
65
+ }
66
+ for (const row of rows) {
67
+ const valStr = typeof row.value === 'string' ? row.value : row.value?.toString() || '';
68
+ if (valStr.includes('skill') || valStr.includes('review') || valStr.includes('prompt') || valStr.includes('agent')) {
69
+ results.push({
70
+ session_id: `trae-${workspaceId.substring(0, 12)}`,
71
+ agent_name: 'Trae',
72
+ model_name: 'claude-3-5-sonnet',
73
+ skill_id: 'trae-copilot-agent',
74
+ skill_name: 'Trae Agent Copilot',
75
+ round_index: 1,
76
+ trigger_mode: 'explicit',
77
+ status: 'success',
78
+ actual_tokens: 3800,
79
+ context_tokens: 3200,
80
+ output_tokens: 600,
81
+ actual_steps: 1,
82
+ timestamp: new Date().toISOString(),
83
+ metadata: {
84
+ source: 'trae_workspace_storage',
85
+ workspace: wsFolder,
86
+ db_key: row.key,
87
+ },
88
+ });
89
+ break; // One record per workspace state
90
+ }
91
+ }
92
+ }
93
+ catch { }
94
+ finally {
95
+ if (db) {
96
+ try {
97
+ db.close();
98
+ }
99
+ catch { }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ //# sourceMappingURL=trae.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trae.adapter.js","sourceRoot":"","sources":["../../src/adapters/trae.adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface DiscoveredSkillInvocation {
2
+ session_id: string;
3
+ agent_name: string;
4
+ model_name?: string;
5
+ skill_id: string;
6
+ skill_name?: string;
7
+ skill_version?: string;
8
+ round_index?: number;
9
+ trigger_mode?: 'explicit' | 'implicit';
10
+ status?: 'success' | 'partial' | 'failed' | 'skipped';
11
+ actual_tokens?: number;
12
+ context_tokens?: number;
13
+ output_tokens?: number;
14
+ actual_steps?: number;
15
+ saved_steps?: number;
16
+ saved_tokens?: number;
17
+ execution_time_ms?: number;
18
+ timestamp?: string;
19
+ metadata?: Record<string, any>;
20
+ }
21
+ export interface AgentHistoryAdapter {
22
+ agentName: string;
23
+ scan(): DiscoveredSkillInvocation[];
24
+ }
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,IAAI,yBAAyB,EAAE,CAAC;CACrC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ export interface UniversalSyncSummary {
3
+ totalSynced: number;
4
+ breakdown: Record<string, number>;
5
+ }
6
+ export declare class UniversalHistorySync {
7
+ private skillflowDb;
8
+ private telemetryService;
9
+ private workbuddySniffer;
10
+ private adapters;
11
+ private lastSyncTime;
12
+ private isSyncing;
13
+ constructor(skillflowDb: DatabaseSync);
14
+ /**
15
+ * Deferred synchronous sync with cooldown (e.g. at most once every 60 seconds).
16
+ * Runs on the next tick via setImmediate; execution is synchronous across files.
17
+ */
18
+ triggerBackgroundSync(minIntervalMs?: number): void;
19
+ syncAll(): UniversalSyncSummary;
20
+ private importItem;
21
+ }
22
+ //# sourceMappingURL=universal.sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"universal.sync.d.ts","sourceRoot":"","sources":["../../src/adapters/universal.sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAU3C,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,qBAAa,oBAAoB;IAOnB,OAAO,CAAC,WAAW;IAN/B,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEN,WAAW,EAAE,YAAY;IAY7C;;;OAGG;IACH,qBAAqB,CAAC,aAAa,SAAQ,GAAG,IAAI;IAqBlD,OAAO,IAAI,oBAAoB;IA2C/B,OAAO,CAAC,UAAU;CAkDnB"}
@@ -0,0 +1,140 @@
1
+ import { TelemetryService } from '../services/telemetry.service.js';
2
+ import { WorkBuddySniffer } from './workbuddy.sniffer.js';
3
+ import { ClaudeCodeAdapter } from './claude-code.adapter.js';
4
+ import { QoderAdapter } from './qoder.adapter.js';
5
+ import { CodexAdapter } from './codex.adapter.js';
6
+ import { DshAdapter } from './dsh.adapter.js';
7
+ import { TraeAdapter } from './trae.adapter.js';
8
+ export class UniversalHistorySync {
9
+ skillflowDb;
10
+ telemetryService;
11
+ workbuddySniffer;
12
+ adapters;
13
+ lastSyncTime = 0;
14
+ isSyncing = false;
15
+ constructor(skillflowDb) {
16
+ this.skillflowDb = skillflowDb;
17
+ this.telemetryService = new TelemetryService(skillflowDb);
18
+ this.workbuddySniffer = new WorkBuddySniffer(skillflowDb);
19
+ this.adapters = [
20
+ new ClaudeCodeAdapter(),
21
+ new QoderAdapter(),
22
+ new CodexAdapter(),
23
+ new DshAdapter(),
24
+ new TraeAdapter(),
25
+ ];
26
+ }
27
+ /**
28
+ * Deferred synchronous sync with cooldown (e.g. at most once every 60 seconds).
29
+ * Runs on the next tick via setImmediate; execution is synchronous across files.
30
+ */
31
+ triggerBackgroundSync(minIntervalMs = 60000) {
32
+ const now = Date.now();
33
+ if (this.isSyncing || now - this.lastSyncTime < minIntervalMs) {
34
+ return;
35
+ }
36
+ this.isSyncing = true;
37
+ setImmediate(() => {
38
+ try {
39
+ const res = this.syncAll();
40
+ if (res.totalSynced > 0) {
41
+ process.stderr.write(`[SkillFlow UniversalSync] Background sync found ${res.totalSynced} new items\n`);
42
+ }
43
+ }
44
+ catch (err) {
45
+ process.stderr.write(`[SkillFlow UniversalSync] Background sync warning: ${err.message}\n`);
46
+ }
47
+ finally {
48
+ this.lastSyncTime = Date.now();
49
+ this.isSyncing = false;
50
+ }
51
+ });
52
+ }
53
+ syncAll() {
54
+ const breakdown = {
55
+ WorkBuddy: 0,
56
+ 'Claude Code': 0,
57
+ Qoder: 0,
58
+ Codex: 0,
59
+ DSH: 0,
60
+ Trae: 0,
61
+ };
62
+ let totalSynced = 0;
63
+ // 1. WorkBuddy native sync
64
+ try {
65
+ const wbRes = this.workbuddySniffer.sync();
66
+ breakdown.WorkBuddy = wbRes.syncedCount;
67
+ totalSynced += wbRes.syncedCount;
68
+ }
69
+ catch (err) {
70
+ process.stderr.write(`[UniversalSync] WorkBuddy sync warning: ${err.message}\n`);
71
+ }
72
+ // 2. Generic adapters sync (Claude Code, Qoder, Codex, DSH, Trae)
73
+ for (const adapter of this.adapters) {
74
+ try {
75
+ const items = adapter.scan();
76
+ let agentCount = 0;
77
+ for (const item of items) {
78
+ if (this.importItem(item)) {
79
+ agentCount++;
80
+ totalSynced++;
81
+ }
82
+ }
83
+ breakdown[adapter.agentName] = agentCount;
84
+ }
85
+ catch (err) {
86
+ process.stderr.write(`[UniversalSync] ${adapter.agentName} sync warning: ${err.message}\n`);
87
+ }
88
+ }
89
+ this.lastSyncTime = Date.now();
90
+ return { totalSynced, breakdown };
91
+ }
92
+ importItem(item) {
93
+ const roundIndex = item.round_index || 1;
94
+ // Idempotent check per session, skill, and conversation round
95
+ const existing = this.skillflowDb
96
+ .prepare('SELECT id FROM invocations WHERE session_id = ? AND skill_id = ? AND round_index = ?')
97
+ .get(item.session_id, item.skill_id, roundIndex);
98
+ if (existing) {
99
+ return false; // Already imported
100
+ }
101
+ const res = this.telemetryService.recordHit({
102
+ session_id: item.session_id,
103
+ skill_id: item.skill_id,
104
+ skill_version: item.skill_version || '1.0.0',
105
+ agent_name: item.agent_name,
106
+ model_name: item.model_name || 'unknown',
107
+ round_index: item.round_index || 1,
108
+ trigger_mode: item.trigger_mode || 'explicit',
109
+ status: item.status || 'success',
110
+ actual_tokens: item.actual_tokens || 3500,
111
+ context_tokens: item.context_tokens || 3000,
112
+ output_tokens: item.output_tokens || 500,
113
+ actual_steps: item.actual_steps || 1,
114
+ saved_steps: item.saved_steps,
115
+ saved_tokens: item.saved_tokens,
116
+ execution_time_ms: item.execution_time_ms || 0,
117
+ metadata: item.metadata,
118
+ });
119
+ // If item has original timestamp, update it to reflect real historical time
120
+ if (item.timestamp) {
121
+ try {
122
+ this.skillflowDb
123
+ .prepare('UPDATE invocations SET timestamp = ? WHERE id = ?')
124
+ .run(item.timestamp, res.invocation_id);
125
+ }
126
+ catch { }
127
+ }
128
+ // If custom skill name was found, update manifest
129
+ if (item.skill_name) {
130
+ try {
131
+ this.skillflowDb
132
+ .prepare('UPDATE skills_manifest SET skill_name = ? WHERE skill_id = ?')
133
+ .run(item.skill_name, item.skill_id);
134
+ }
135
+ catch { }
136
+ }
137
+ return true;
138
+ }
139
+ }
140
+ //# sourceMappingURL=universal.sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"universal.sync.js","sourceRoot":"","sources":["../../src/adapters/universal.sync.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"workbuddy.sniffer.d.ts","sourceRoot":"","sources":["../../src/adapters/workbuddy.sniffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,gBAAgB;IAGf,OAAO,CAAC,WAAW;IAF/B,OAAO,CAAC,gBAAgB,CAAmB;gBAEvB,WAAW,EAAE,YAAY;IAI7C;;OAEG;IACH,kBAAkB,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE;IAsC7D;;OAEG;IACH,IAAI,IAAI,oBAAoB;CA6F7B"}
1
+ {"version":3,"file":"workbuddy.sniffer.d.ts","sourceRoot":"","sources":["../../src/adapters/workbuddy.sniffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,gBAAgB;IAGf,OAAO,CAAC,WAAW;IAF/B,OAAO,CAAC,gBAAgB,CAAmB;gBAEvB,WAAW,EAAE,YAAY;IAI7C;;OAEG;IACH,kBAAkB,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE;IAsC7D;;OAEG;IACH,IAAI,IAAI,oBAAoB;CAmG7B"}
@@ -90,20 +90,25 @@ export class WorkBuddySniffer {
90
90
  const meta = skillMap.get(rawId);
91
91
  const skillId = meta?.slug || meta?.overrideKey || rawId;
92
92
  const skillName = meta?.name || meta?.slug || rawId;
93
- // Check if already synced into SkillFlow
93
+ // Check if already synced into SkillFlow (idempotent per session, skill, round)
94
94
  const alreadySynced = this.skillflowDb
95
- .prepare('SELECT id FROM invocations WHERE session_id = ? AND skill_id = ?')
96
- .get(sess.id, skillId);
95
+ .prepare('SELECT id FROM invocations WHERE session_id = ? AND skill_id = ? AND round_index = ?')
96
+ .get(sess.id, skillId, 1);
97
97
  if (!alreadySynced) {
98
98
  const actualTokens = sess.tokens_used || 0;
99
+ const isExplicit = Boolean(sess.title && (sess.title.includes(skillName) || sess.title.includes(skillId)));
100
+ const triggerMode = isExplicit ? 'explicit' : 'implicit';
99
101
  this.telemetryService.recordHit({
100
102
  session_id: sess.id,
101
103
  skill_id: skillId,
102
104
  agent_name: 'WorkBuddy',
103
105
  model_name: sess.model || 'deepseek-v4.1-flash',
104
106
  round_index: 1,
107
+ trigger_mode: triggerMode,
105
108
  status: 'success',
106
109
  actual_tokens: actualTokens,
110
+ context_tokens: Math.max(0, actualTokens - 500),
111
+ output_tokens: Math.min(actualTokens, 500),
107
112
  actual_steps: 1,
108
113
  metadata: {
109
114
  title: sess.title,
@@ -1 +1 @@
1
- {"version":3,"file":"workbuddy.sniffer.js","sourceRoot":"","sources":["../../src/adapters/workbuddy.sniffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAOpE,MAAM,OAAO,gBAAgB;IAGP;IAFZ,gBAAgB,CAAmB;IAE3C,YAAoB,WAAyB;QAAzB,gBAAW,GAAX,WAAW,CAAc;QAC3C,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,MAAM,OAAO,GAA4C,EAAE,CAAC;QAE5D,0BAA0B;QAC1B,MAAM,UAAU,GAAG;YACjB,0CAA0C;YAC1C,0CAA0C;YAC1C,0CAA0C;YAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,YAAY,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,WAAW,CAAC;SAClD,CAAC;QAEF,iDAAiD;QACjD,IAAI,EAAE,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;gBACxD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;oBAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;oBAC/D,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACrB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QAEpD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;YAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QAC9C,CAAC;QAED,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,IAAI,GAAwB,IAAI,CAAC;YACrC,IAAI,CAAC;gBACH,IAAI,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;gBACrE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;gBAExC,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;oBACxC,IAAI,CAAC,CAAC,OAAO;wBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBAC1C,IAAI,CAAC,CAAC,UAAU;wBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;oBAChD,IAAI,CAAC,CAAC,IAAI;wBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;oBACpC,IAAI,CAAC,CAAC,WAAW;wBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBACpD,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAI;qBAClB,OAAO,CACN;;;;;SAKH,CACE;qBACA,GAAG,EAAW,CAAC;gBAElB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;oBAC5B,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;wBAC/C,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;4BAAE,SAAS;wBAE1E,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;4BACxC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gCACnE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;gCACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gCACjC,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,WAAW,IAAI,KAAK,CAAC;gCACzD,MAAM,SAAS,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC;gCAEpD,yCAAyC;gCACzC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW;qCACnC,OAAO,CAAC,kEAAkE,CAAC;qCAC3E,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gCAEzB,IAAI,CAAC,aAAa,EAAE,CAAC;oCACnB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;oCAC3C,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;wCAC9B,UAAU,EAAE,IAAI,CAAC,EAAE;wCACnB,QAAQ,EAAE,OAAO;wCACjB,UAAU,EAAE,WAAW;wCACvB,UAAU,EAAE,IAAI,CAAC,KAAK,IAAI,qBAAqB;wCAC/C,WAAW,EAAE,CAAC;wCACd,MAAM,EAAE,SAAS;wCACjB,aAAa,EAAE,YAAY;wCAC3B,YAAY,EAAE,CAAC;wCACf,QAAQ,EAAE;4CACR,KAAK,EAAE,IAAI,CAAC,KAAK;4CACjB,KAAK,EAAE,IAAI,CAAC,KAAK;4CACjB,UAAU,EAAE,IAAI,CAAC,UAAU;4CAC3B,MAAM,EAAE,wBAAwB;yCACjC;qCACF,CAAC,CAAC;oCAEH,kDAAkD;oCAClD,IAAI,CAAC,WAAW;yCACb,OAAO,CAAC,8DAA8D,CAAC;yCACvE,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oCAE3B,WAAW,EAAE,CAAC;oCACd,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gCACpD,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACZ,CAAC;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gDAAgD,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YACxF,CAAC;oBAAS,CAAC;gBACT,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC;wBAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;IACvC,CAAC;CACF"}
1
+ {"version":3,"file":"workbuddy.sniffer.js","sourceRoot":"","sources":["../../src/adapters/workbuddy.sniffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { InvocationStatus } from '../types/models.js';
2
+ export type TimeRange = 'current_session' | 'today' | '7days' | '30days' | 'all';
3
+ export interface InvocationFilter {
4
+ timeRange?: string | null;
5
+ sessionId?: string | null;
6
+ agentName?: string | null;
7
+ skillId?: string | null;
8
+ modelName?: string | null;
9
+ status?: string | null;
10
+ }
11
+ export declare const INVOCATION_STATUSES: InvocationStatus[];
12
+ /**
13
+ * Normalizes an arbitrary query-string value into a supported time range.
14
+ */
15
+ export declare function normalizeTimeRange(value: string | null | undefined): TimeRange;
16
+ export declare function isInvocationStatus(value: string | null | undefined): value is InvocationStatus;
17
+ /**
18
+ * Builds a shared WHERE clause for `invocations` so the dashboard aggregation and the
19
+ * invocation feed always interpret the same filter set identically.
20
+ */
21
+ export declare function buildInvocationWhere(filter?: InvocationFilter, alias?: string): {
22
+ whereSql: string;
23
+ params: (string | number)[];
24
+ };
25
+ /**
26
+ * Reads the shared filter set from a request query string.
27
+ */
28
+ export declare function readInvocationFilter(searchParams: URLSearchParams): InvocationFilter;
29
+ //# sourceMappingURL=invocation-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invocation-filter.d.ts","sourceRoot":"","sources":["../../src/db/invocation-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG,iBAAiB,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEjF,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,mBAAmB,EAAE,gBAAgB,EAAgD,CAAC;AAEnG;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,CAK9E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,IAAI,gBAAgB,CAK9F;AASD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,GAAE,gBAAqB,EAC7B,KAAK,SAAM,GACV;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAyCnD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,eAAe,GAAG,gBAAgB,CAQpF"}
@@ -0,0 +1,78 @@
1
+ export const INVOCATION_STATUSES = ['success', 'partial', 'failed', 'skipped'];
2
+ /**
3
+ * Normalizes an arbitrary query-string value into a supported time range.
4
+ */
5
+ export function normalizeTimeRange(value) {
6
+ if (value === 'current_session' || value === 'today' || value === '7days' || value === '30days') {
7
+ return value;
8
+ }
9
+ return 'all';
10
+ }
11
+ export function isInvocationStatus(value) {
12
+ if (!value) {
13
+ return false;
14
+ }
15
+ return INVOCATION_STATUSES.includes(value);
16
+ }
17
+ function readText(value) {
18
+ if (!value) {
19
+ return '';
20
+ }
21
+ return value.trim();
22
+ }
23
+ /**
24
+ * Builds a shared WHERE clause for `invocations` so the dashboard aggregation and the
25
+ * invocation feed always interpret the same filter set identically.
26
+ */
27
+ export function buildInvocationWhere(filter = {}, alias = 'i') {
28
+ if (!/^[a-zA-Z_]\w*$/.test(alias)) {
29
+ throw new Error(`Invalid SQL alias: ${alias}`);
30
+ }
31
+ const clauses = ['1=1'];
32
+ const params = [];
33
+ const timeRange = normalizeTimeRange(filter.timeRange);
34
+ if (timeRange === 'current_session') {
35
+ clauses.push(`${alias}.session_id = ?`);
36
+ params.push(readText(filter.sessionId) || 'unknown');
37
+ }
38
+ else if (timeRange === 'today') {
39
+ clauses.push(`date(${alias}.timestamp) = date('now')`);
40
+ }
41
+ else if (timeRange === '7days') {
42
+ clauses.push(`${alias}.timestamp >= datetime('now', '-7 days')`);
43
+ }
44
+ else if (timeRange === '30days') {
45
+ clauses.push(`${alias}.timestamp >= datetime('now', '-30 days')`);
46
+ }
47
+ const exactMatches = [
48
+ [`${alias}.agent_name`, readText(filter.agentName)],
49
+ [`${alias}.skill_id`, readText(filter.skillId)],
50
+ [`${alias}.model_name`, readText(filter.modelName)],
51
+ ];
52
+ for (const [column, value] of exactMatches) {
53
+ if (!value) {
54
+ continue;
55
+ }
56
+ clauses.push(`${column} = ?`);
57
+ params.push(value);
58
+ }
59
+ const status = readText(filter.status);
60
+ if (isInvocationStatus(status)) {
61
+ clauses.push(`${alias}.status = ?`);
62
+ params.push(status);
63
+ }
64
+ return { whereSql: clauses.join(' AND '), params };
65
+ }
66
+ /**
67
+ * Reads the shared filter set from a request query string.
68
+ */
69
+ export function readInvocationFilter(searchParams) {
70
+ return {
71
+ timeRange: searchParams.get('time_range'),
72
+ agentName: searchParams.get('agent_name'),
73
+ skillId: searchParams.get('skill_id'),
74
+ modelName: searchParams.get('model_name'),
75
+ status: searchParams.get('status'),
76
+ };
77
+ }
78
+ //# sourceMappingURL=invocation-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invocation-filter.js","sourceRoot":"","sources":["../../src/db/invocation-filter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAU3C,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,UAAQ,GAAG,IAAI,CAkG3E"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgB3C,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,UAAQ,GAAG,IAAI,CAsH3E"}
package/dist/db/schema.js CHANGED
@@ -1,4 +1,10 @@
1
1
  function tryAddColumn(db, table, colDef) {
2
+ if (!/^[a-zA-Z_]\w*$/.test(table)) {
3
+ throw new Error(`Invalid table name: ${table}`);
4
+ }
5
+ if (!/^[a-zA-Z_]\w*\s+[a-zA-Z_]/.test(colDef.trim())) {
6
+ throw new Error(`Invalid column definition: ${colDef}`);
7
+ }
2
8
  try {
3
9
  db.exec(`ALTER TABLE ${table} ADD COLUMN ${colDef};`);
4
10
  }
@@ -7,7 +13,6 @@ function tryAddColumn(db, table, colDef) {
7
13
  }
8
14
  }
9
15
  export function initializeSchema(db, isInMemory = false) {
10
- // Concurrency and integrity pragmas
11
16
  db.exec('PRAGMA foreign_keys = ON;');
12
17
  db.exec('PRAGMA busy_timeout = 5000;');
13
18
  if (!isInMemory) {
@@ -20,18 +25,24 @@ export function initializeSchema(db, isInMemory = false) {
20
25
  skill_id TEXT PRIMARY KEY,
21
26
  skill_name TEXT NOT NULL,
22
27
  category TEXT NOT NULL DEFAULT 'general',
28
+ version TEXT NOT NULL DEFAULT '1.0.0',
23
29
  description TEXT,
24
30
  baseline_steps INTEGER NOT NULL DEFAULT 5,
25
31
  baseline_tokens INTEGER NOT NULL DEFAULT 3000,
26
32
  baseline_manual_minutes INTEGER NOT NULL DEFAULT 15,
27
33
  default_saved_steps INTEGER NOT NULL DEFAULT 4,
28
34
  default_saved_tokens INTEGER NOT NULL DEFAULT 2000,
35
+ health_score INTEGER NOT NULL DEFAULT 100,
29
36
  tags TEXT DEFAULT '[]',
37
+ last_invoked_at TEXT DEFAULT NULL,
30
38
  created_at TEXT NOT NULL DEFAULT (datetime('now')),
31
39
  updated_at TEXT NOT NULL DEFAULT (datetime('now'))
32
40
  );
33
41
  `);
34
42
  tryAddColumn(db, 'skills_manifest', 'baseline_manual_minutes INTEGER NOT NULL DEFAULT 15');
43
+ tryAddColumn(db, 'skills_manifest', "version TEXT NOT NULL DEFAULT '1.0.0'");
44
+ tryAddColumn(db, 'skills_manifest', 'health_score INTEGER NOT NULL DEFAULT 100');
45
+ tryAddColumn(db, 'skills_manifest', 'last_invoked_at TEXT DEFAULT NULL');
35
46
  // 2. Sessions table
36
47
  db.exec(`
37
48
  CREATE TABLE IF NOT EXISTS sessions (
@@ -63,9 +74,13 @@ export function initializeSchema(db, isInMemory = false) {
63
74
  agent_name TEXT NOT NULL DEFAULT 'unknown',
64
75
  model_name TEXT NOT NULL DEFAULT 'unknown',
65
76
  skill_id TEXT NOT NULL,
77
+ skill_version TEXT NOT NULL DEFAULT '1.0.0',
66
78
  round_index INTEGER NOT NULL DEFAULT 1,
79
+ trigger_mode TEXT NOT NULL DEFAULT 'explicit',
67
80
  status TEXT NOT NULL CHECK(status IN ('success', 'failed', 'partial', 'skipped')),
68
81
  actual_tokens INTEGER NOT NULL DEFAULT 0,
82
+ context_tokens INTEGER NOT NULL DEFAULT 0,
83
+ output_tokens INTEGER NOT NULL DEFAULT 0,
69
84
  actual_steps INTEGER NOT NULL DEFAULT 1,
70
85
  saved_steps INTEGER NOT NULL DEFAULT 0,
71
86
  saved_tokens INTEGER NOT NULL DEFAULT 0,
@@ -73,7 +88,10 @@ export function initializeSchema(db, isInMemory = false) {
73
88
  saved_hours REAL NOT NULL DEFAULT 0.0,
74
89
  cost_saved_usd REAL NOT NULL DEFAULT 0.0,
75
90
  cost_saved_cny REAL NOT NULL DEFAULT 0.0,
91
+ tool_chain_depth INTEGER NOT NULL DEFAULT 0,
92
+ tool_failures INTEGER NOT NULL DEFAULT 0,
76
93
  has_correction INTEGER NOT NULL DEFAULT 0,
94
+ follow_up_modifier TEXT DEFAULT NULL,
77
95
  quality_profile TEXT NOT NULL DEFAULT 'efficient',
78
96
  execution_time_ms INTEGER DEFAULT 0,
79
97
  metadata TEXT DEFAULT '{}',
@@ -83,16 +101,24 @@ export function initializeSchema(db, isInMemory = false) {
83
101
  );
84
102
  `);
85
103
  tryAddColumn(db, 'invocations', "model_name TEXT NOT NULL DEFAULT 'unknown'");
104
+ tryAddColumn(db, 'invocations', "skill_version TEXT NOT NULL DEFAULT '1.0.0'");
105
+ tryAddColumn(db, 'invocations', "trigger_mode TEXT NOT NULL DEFAULT 'explicit'");
106
+ tryAddColumn(db, 'invocations', 'context_tokens INTEGER NOT NULL DEFAULT 0');
107
+ tryAddColumn(db, 'invocations', 'output_tokens INTEGER NOT NULL DEFAULT 0');
86
108
  tryAddColumn(db, 'invocations', 'saved_hours REAL NOT NULL DEFAULT 0.0');
87
109
  tryAddColumn(db, 'invocations', 'cost_saved_usd REAL NOT NULL DEFAULT 0.0');
88
110
  tryAddColumn(db, 'invocations', 'cost_saved_cny REAL NOT NULL DEFAULT 0.0');
111
+ tryAddColumn(db, 'invocations', 'tool_chain_depth INTEGER NOT NULL DEFAULT 0');
112
+ tryAddColumn(db, 'invocations', 'tool_failures INTEGER NOT NULL DEFAULT 0');
89
113
  tryAddColumn(db, 'invocations', 'net_tokens INTEGER NOT NULL DEFAULT 0');
90
114
  tryAddColumn(db, 'invocations', 'has_correction INTEGER NOT NULL DEFAULT 0');
115
+ tryAddColumn(db, 'invocations', 'follow_up_modifier TEXT DEFAULT NULL');
91
116
  tryAddColumn(db, 'invocations', "quality_profile TEXT NOT NULL DEFAULT 'efficient'");
92
- tryAddColumn(db, 'sessions', 'total_corrections INTEGER NOT NULL DEFAULT 0');
93
117
  // Indices for query performance
94
118
  db.exec(`
95
119
  CREATE INDEX IF NOT EXISTS idx_invocations_session_round ON invocations(session_id, round_index);
120
+ CREATE INDEX IF NOT EXISTS idx_invocations_session_skill ON invocations(session_id, skill_id);
121
+ CREATE INDEX IF NOT EXISTS idx_invocations_session_skill_round ON invocations(session_id, skill_id, round_index);
96
122
  CREATE INDEX IF NOT EXISTS idx_invocations_agent ON invocations(agent_name);
97
123
  CREATE INDEX IF NOT EXISTS idx_invocations_model ON invocations(model_name);
98
124
  CREATE INDEX IF NOT EXISTS idx_invocations_skill ON invocations(skill_id);
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAEA,SAAS,YAAY,CAAC,EAAgB,EAAE,KAAa,EAAE,MAAc;IACnE,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,eAAe,KAAK,eAAe,MAAM,GAAG,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAgB,EAAE,UAAU,GAAG,KAAK;IACnE,oCAAoC;IACpC,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACrC,EAAE,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAEvC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACtC,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC1C,CAAC;IAED,2BAA2B;IAC3B,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;GAeP,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,EAAE,iBAAiB,EAAE,qDAAqD,CAAC,CAAC;IAE3F,oBAAoB;IACpB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;GAiBP,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,6CAA6C,CAAC,CAAC;IAC5E,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,gDAAgD,CAAC,CAAC;IAC/E,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,gDAAgD,CAAC,CAAC;IAC/E,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,8CAA8C,CAAC,CAAC;IAE7E,uBAAuB;IACvB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBP,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,4CAA4C,CAAC,CAAC;IAC9E,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,uCAAuC,CAAC,CAAC;IACzE,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,0CAA0C,CAAC,CAAC;IAC5E,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,0CAA0C,CAAC,CAAC;IAC5E,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,uCAAuC,CAAC,CAAC;IACzE,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,2CAA2C,CAAC,CAAC;IAC7E,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,mDAAmD,CAAC,CAAC;IACrF,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,8CAA8C,CAAC,CAAC;IAE7E,gCAAgC;IAChC,EAAE,CAAC,IAAI,CAAC;;;;;;;GAOP,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,GAAE,gBAAqB,GAAG,SAAS,CAoZ3F"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,GAAE,gBAAqB,GAAG,SAAS,CA8Z3F"}