@mengzf/skillflow-mcp 1.0.0 → 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/README.md +48 -7
- 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.map +1 -1
- package/dist/adapters/workbuddy.sniffer.js +8 -3
- package/dist/adapters/workbuddy.sniffer.js.map +1 -1
- 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.map +1 -1
- package/dist/db/schema.js +28 -2
- package/dist/db/schema.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +16 -12
- package/dist/server.js.map +1 -1
- package/dist/services/dashboard.service.d.ts +2 -0
- package/dist/services/dashboard.service.d.ts.map +1 -1
- package/dist/services/dashboard.service.js +145 -40
- package/dist/services/dashboard.service.js.map +1 -1
- 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/telemetry.service.d.ts +9 -1
- package/dist/services/telemetry.service.d.ts.map +1 -1
- package/dist/services/telemetry.service.js +105 -36
- package/dist/services/telemetry.service.js.map +1 -1
- package/dist/types/models.d.ts +13 -1
- package/dist/types/models.d.ts.map +1 -1
- package/dist/types/tools.d.ts +44 -5
- package/dist/types/tools.d.ts.map +1 -1
- package/dist/types/tools.js +47 -1
- package/dist/types/tools.js.map +1 -1
- 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/pricing.js +1 -1
- package/dist/utils/pricing.js.map +1 -1
- package/dist/web/render.d.ts.map +1 -1
- package/dist/web/render.js +1565 -239
- package/dist/web/render.js.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +52 -28
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -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 @@
|
|
|
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;
|
|
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":"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
|
|
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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"}
|
package/dist/db/schema.d.ts.map
CHANGED
|
@@ -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;
|
|
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);
|
package/dist/db/schema.js.map
CHANGED
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|