@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.
Files changed (73) 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 +7 -0
  11. package/dist/adapters/dsh.adapter.d.ts.map +1 -0
  12. package/dist/adapters/dsh.adapter.js +60 -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.js +1 -1
  66. package/dist/utils/pricing.js.map +1 -1
  67. package/dist/web/render.d.ts.map +1 -1
  68. package/dist/web/render.js +1565 -239
  69. package/dist/web/render.js.map +1 -1
  70. package/dist/web/server.d.ts.map +1 -1
  71. package/dist/web/server.js +52 -28
  72. package/dist/web/server.js.map +1 -1
  73. package/package.json +1 -1
package/README.md CHANGED
@@ -31,7 +31,7 @@
31
31
  |:---|:---|:---|
32
32
  | `record_skill_hit` | 记录/上报一次 Skill 激活命中事件并核算收益 | `session_id` (必填), `skill_id` (必填), `agent_name`, `round_index`, `status`, `actual_tokens`, `actual_steps`, `saved_steps`, `saved_tokens`, `metadata` |
33
33
  | `get_round_skill_impact` | 查看指定轮次或当前会话的技能命中情况与明细报告 | `session_id` (可选,默认取最近会话), `round_index` (可选,默认最新轮次), `include_session_summary` (默认 true) |
34
- | `get_skill_dashboard` | 获取全景效能看板(按时间范围、Agent 矩阵、Skill 贡献榜聚合) | `time_range` (`current_session`/`today`/`7days`/`30days`/`all`), `session_id`, `agent_name`, `skill_id`, `group_by` |
34
+ | `get_skill_dashboard` | 获取全景效能看板(按时间范围、Agent 矩阵、Skill 贡献榜聚合) | `time_range` (`current_session`/`today`/`7days`/`30days`/`all`), `session_id`, `agent_name`, `skill_id`, `model_name`, `status` (`success`/`partial`/`failed`/`skipped`), `group_by` |
35
35
  | `manage_skill_benchmark` | 管理技能基准库(列表、详情、新增/修改基准、删除、重置预设) | `action` (`list`/`get`/`set`/`delete`/`reset_defaults`), `skill_id`, `skill_name`, `category`, `baseline_steps`, `baseline_tokens` |
36
36
  | `get_web_dashboard_url` | 获取本地 Web 可视化看板的访问地址及运行状态 | 无必填入参,返回 `http://localhost:3000` 链接与说明 |
37
37
 
@@ -52,11 +52,21 @@
52
52
  - `SKILLFLOW_PORT=3000`(自定义端口)
53
53
  - `SKILLFLOW_ENABLE_WEB=false`(若只想要单纯 stdio 模式可关闭 Web)
54
54
  - **看板功能**:
55
- - 🎨 现代暗色主题 UI、自适应响应式布局。
55
+ - 🎨 浅色 Apple 风格 UI,自适应桌面 / 平板 / 手机三档断点。
56
56
  - ⚡ 实时 5 秒自动轮询刷新。
57
+ - 🔎 多维查询条件:时间范围、Agent 宿主、Skill 技能、执行模型、执行状态,可任意组合并一键重置;条件同时作用于指标卡、排行榜、生态分布与调用流水。
57
58
  - 📊 流程步骤节约与 Token 节省排行榜。
58
59
  - 🤖 Claude Code / Trae / Qoder / WorkBuddy / Codex / DSH 各平台占比分布。
59
- - ⏱️ 实时调用流水列表(展示时间、会话 ID、技能名、状态、节省指标)。
60
+ - ⏱️ 实时调用流水列表(展示时间、会话 ID、技能名、状态、节省指标),并显示当前条件下的匹配总数。
61
+ - **看板数据接口**(均支持上述查询参数,直接以查询串传入):
62
+
63
+ | 接口 | 说明 |
64
+ | :--- | :--- |
65
+ | `GET /api/dashboard` | 指标卡 + Skill 排行 + Agent/模型分布聚合 |
66
+ | `GET /api/invocations` | 调用流水明细,支持 `limit`(1–100),返回 `total` 匹配总数 |
67
+ | `GET /api/filters` | 可选的 Agent / Skill / 模型 / 状态清单及各自命中数 |
68
+ | `GET /api/skills` | 已注册 Skill 基线清单 |
69
+ | `GET /api/health` | 服务健康检查 |
60
70
 
61
71
  ---
62
72
 
@@ -83,15 +93,46 @@ npm run build
83
93
 
84
94
  ---
85
95
 
86
- ## 🔌 各 Agent 接入与配置指南
96
+ ## 🚀 全球一键使用(已发布至 npm)
97
+
98
+ 得益于已正式发布至 npm 官方仓库,任何开发者**无需下载源码、无需克隆仓库**,即可一键使用:
99
+
100
+ ### 1. 独立运行 Web 监控大屏
101
+ 在任意终端直接运行:
102
+ ```bash
103
+ npx -y @mengzf/skillflow-mcp
104
+ ```
105
+ 服务会自动下载并启动在 `http://localhost:3000`!
106
+
107
+ ---
108
+
109
+ ## 🔌 各 Agent 一键接入配置(推荐方式)
87
110
 
88
- 由于你的 Agent 全面支持 MCP,只需将编译产物 `D:\code\skill\dist\index.js` 添加到对应 Agent 的 MCP 配置文件中即可。
111
+ 直接通过 `npx` 引入,后续更新版本将**全自动无感静默升级**:
89
112
 
90
113
  ### 1. Claude Code
91
- 直接使用命令行添加:
114
+ 直接运行官方添加命令:
92
115
  ```bash
93
- claude mcp add skillflow -- node D:/code/skill/dist/index.js
116
+ claude mcp add skillflow -- npx -y @mengzf/skillflow-mcp
94
117
  ```
118
+
119
+ ### 2. Trae (ByteDance)
120
+ 在 Trae 的 MCP 配置中添加:
121
+ ```json
122
+ {
123
+ "mcpServers": {
124
+ "skillflow": {
125
+ "command": "npx",
126
+ "args": ["-y", "@mengzf/skillflow-mcp"]
127
+ }
128
+ }
129
+ }
130
+ ```
131
+
132
+ ### 3. Qoder / WorkBuddy / Codex / DSH
133
+ 在客户端对应的 MCP Server 列表添加:
134
+ - **Command / 命令**: `npx`
135
+ - **Args / 参数**: `["-y", "@mengzf/skillflow-mcp"]`
95
136
  或直接写入用户全局配置 `~/.claude/settings.json`(或项目级 `.claude/settings.json`):
96
137
  ```json
97
138
  {
@@ -0,0 +1,10 @@
1
+ import { AgentHistoryAdapter, DiscoveredSkillInvocation } from './types.js';
2
+ export declare class ClaudeCodeAdapter implements AgentHistoryAdapter {
3
+ readonly agentName = "Claude Code";
4
+ private fileMtimeCache;
5
+ private memoryCache;
6
+ private findProjectsDir;
7
+ scan(): DiscoveredSkillInvocation[];
8
+ private parseFile;
9
+ }
10
+ //# sourceMappingURL=claude-code.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-code.adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAgB5E,qBAAa,iBAAkB,YAAW,mBAAmB;IAC3D,QAAQ,CAAC,SAAS,iBAAiB;IACnC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,WAAW,CAAkD;IAErE,OAAO,CAAC,eAAe;IAQvB,IAAI,IAAI,yBAAyB,EAAE;IA6CnC,OAAO,CAAC,SAAS;CAgGlB"}
@@ -0,0 +1,166 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ const KNOWN_SLASH_COMMANDS = {
5
+ 'code-review': 'Code Review',
6
+ 'frontend-design': 'Frontend Design',
7
+ 'simplify': 'Code Simplification',
8
+ 'security-review': 'Security Review',
9
+ 'explain-usage': 'Explain Usage',
10
+ 'docx': 'Word Document Generator',
11
+ 'xlsx': 'Excel Spreadsheet Generator',
12
+ 'pptx': 'Presentation Builder',
13
+ 'pdf-reading': 'PDF Inspector',
14
+ 'dataviz': 'Data Visualization Engine',
15
+ 'workflow-authoring': 'Workflow Authoring',
16
+ };
17
+ export class ClaudeCodeAdapter {
18
+ agentName = 'Claude Code';
19
+ fileMtimeCache = new Map();
20
+ memoryCache = new Map();
21
+ findProjectsDir() {
22
+ const defaultDir = path.join(os.homedir(), '.claude', 'projects');
23
+ if (fs.existsSync(defaultDir)) {
24
+ return defaultDir;
25
+ }
26
+ return null;
27
+ }
28
+ scan() {
29
+ const dir = this.findProjectsDir();
30
+ if (!dir)
31
+ return [];
32
+ const invocations = [];
33
+ const files = [];
34
+ const walk = (d) => {
35
+ try {
36
+ for (const item of fs.readdirSync(d, { withFileTypes: true })) {
37
+ const full = path.join(d, item.name);
38
+ if (item.isDirectory()) {
39
+ walk(full);
40
+ }
41
+ else if (item.isFile() && item.name.endsWith('.jsonl')) {
42
+ files.push(full);
43
+ }
44
+ }
45
+ }
46
+ catch { }
47
+ };
48
+ walk(dir);
49
+ for (const filePath of files) {
50
+ try {
51
+ const stat = fs.statSync(filePath);
52
+ const prevMtime = this.fileMtimeCache.get(filePath);
53
+ if (prevMtime === stat.mtimeMs && this.memoryCache.has(filePath)) {
54
+ // File has not changed since last scan, reuse parsed invocations
55
+ invocations.push(...this.memoryCache.get(filePath));
56
+ continue;
57
+ }
58
+ const fileInvocations = [];
59
+ this.parseFile(filePath, fileInvocations);
60
+ this.fileMtimeCache.set(filePath, stat.mtimeMs);
61
+ this.memoryCache.set(filePath, fileInvocations);
62
+ invocations.push(...fileInvocations);
63
+ }
64
+ catch { }
65
+ }
66
+ return invocations;
67
+ }
68
+ parseFile(filePath, results) {
69
+ try {
70
+ const content = fs.readFileSync(filePath, 'utf8');
71
+ const lines = content.split('\n');
72
+ let currentSessionId = path.basename(filePath, '.jsonl');
73
+ let currentModel = 'claude-3-5-sonnet';
74
+ let roundCounter = 0;
75
+ for (const line of lines) {
76
+ if (!line.trim())
77
+ continue;
78
+ try {
79
+ const obj = JSON.parse(line);
80
+ if (obj.sessionId)
81
+ currentSessionId = obj.sessionId;
82
+ if (obj.message?.model)
83
+ currentModel = obj.message.model;
84
+ if (obj.model)
85
+ currentModel = obj.model;
86
+ // 1. Tool Call Detection: tool_use name='Skill'
87
+ if (obj.message?.content && Array.isArray(obj.message.content)) {
88
+ for (const item of obj.message.content) {
89
+ if (item.type === 'tool_use' && (item.name === 'Skill' || item.name?.startsWith('anthropic-skills:') || item.name?.includes('skill'))) {
90
+ roundCounter++;
91
+ const rawSkill = (item.input?.skill || item.name || 'unknown').toString();
92
+ const skillId = rawSkill.replace(/^anthropic-skills:/, '');
93
+ const skillName = KNOWN_SLASH_COMMANDS[skillId] || skillId;
94
+ const usage = obj.message?.usage;
95
+ const inputTokens = usage?.input_tokens || 0;
96
+ const outputTokens = usage?.output_tokens || 0;
97
+ const totalTokens = inputTokens + outputTokens;
98
+ results.push({
99
+ session_id: currentSessionId,
100
+ agent_name: 'Claude Code',
101
+ model_name: currentModel,
102
+ skill_id: skillId,
103
+ skill_name: skillName,
104
+ round_index: roundCounter,
105
+ trigger_mode: 'explicit',
106
+ status: 'success',
107
+ actual_tokens: totalTokens,
108
+ context_tokens: inputTokens,
109
+ output_tokens: outputTokens,
110
+ actual_steps: 1,
111
+ timestamp: obj.timestamp || new Date().toISOString(),
112
+ metadata: {
113
+ source: 'claude_code_history_parser',
114
+ tool_use_id: item.id,
115
+ },
116
+ });
117
+ }
118
+ }
119
+ }
120
+ // 2. User Prompt Slash Command Detection (e.g. /code-review, /frontend-design)
121
+ if (obj.type === 'user' && obj.message?.content) {
122
+ let promptText = '';
123
+ if (typeof obj.message.content === 'string') {
124
+ promptText = obj.message.content;
125
+ }
126
+ else if (Array.isArray(obj.message.content)) {
127
+ promptText = obj.message.content
128
+ .filter((c) => c.type === 'text')
129
+ .map((c) => c.text)
130
+ .join(' ');
131
+ }
132
+ for (const [cmd, displayName] of Object.entries(KNOWN_SLASH_COMMANDS)) {
133
+ const slashRegex = new RegExp(`^\\s*\\/${cmd}\\b`, 'i');
134
+ if (slashRegex.test(promptText)) {
135
+ roundCounter++;
136
+ results.push({
137
+ session_id: currentSessionId,
138
+ agent_name: 'Claude Code',
139
+ model_name: currentModel,
140
+ skill_id: cmd,
141
+ skill_name: displayName,
142
+ round_index: roundCounter,
143
+ trigger_mode: 'explicit',
144
+ status: 'success',
145
+ actual_tokens: 3500,
146
+ context_tokens: 3000,
147
+ output_tokens: 500,
148
+ actual_steps: 1,
149
+ timestamp: obj.timestamp || new Date().toISOString(),
150
+ metadata: {
151
+ source: 'claude_code_slash_command',
152
+ prompt_snippet: promptText.substring(0, 50),
153
+ },
154
+ });
155
+ break;
156
+ }
157
+ }
158
+ }
159
+ }
160
+ catch { }
161
+ }
162
+ }
163
+ catch { }
164
+ }
165
+ }
166
+ //# sourceMappingURL=claude-code.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.adapter.js","sourceRoot":"","sources":["../../src/adapters/claude-code.adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { AgentHistoryAdapter, DiscoveredSkillInvocation } from './types.js';
2
+ export declare class CodexAdapter implements AgentHistoryAdapter {
3
+ readonly agentName = "Codex";
4
+ private fileMtimeCache;
5
+ private memoryCache;
6
+ private findSessionsDir;
7
+ scan(): DiscoveredSkillInvocation[];
8
+ private parseRollout;
9
+ }
10
+ //# sourceMappingURL=codex.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,YAAa,YAAW,mBAAmB;IACtD,QAAQ,CAAC,SAAS,WAAW;IAC7B,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,WAAW,CAAkD;IAErE,OAAO,CAAC,eAAe;IAQvB,IAAI,IAAI,yBAAyB,EAAE;IA4CnC,OAAO,CAAC,YAAY;CAmDrB"}
@@ -0,0 +1,109 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ export class CodexAdapter {
5
+ agentName = 'Codex';
6
+ fileMtimeCache = new Map();
7
+ memoryCache = new Map();
8
+ findSessionsDir() {
9
+ const defaultDir = path.join(os.homedir(), '.codex', 'sessions');
10
+ if (fs.existsSync(defaultDir)) {
11
+ return defaultDir;
12
+ }
13
+ return null;
14
+ }
15
+ scan() {
16
+ const dir = this.findSessionsDir();
17
+ if (!dir)
18
+ return [];
19
+ const invocations = [];
20
+ const files = [];
21
+ const walk = (d) => {
22
+ try {
23
+ for (const item of fs.readdirSync(d, { withFileTypes: true })) {
24
+ const full = path.join(d, item.name);
25
+ if (item.isDirectory()) {
26
+ walk(full);
27
+ }
28
+ else if (item.isFile() && item.name.endsWith('.jsonl') && item.name.startsWith('rollout-')) {
29
+ files.push(full);
30
+ }
31
+ }
32
+ }
33
+ catch { }
34
+ };
35
+ walk(dir);
36
+ for (const filePath of files) {
37
+ try {
38
+ const stat = fs.statSync(filePath);
39
+ const prevMtime = this.fileMtimeCache.get(filePath);
40
+ if (prevMtime === stat.mtimeMs && this.memoryCache.has(filePath)) {
41
+ invocations.push(...this.memoryCache.get(filePath));
42
+ continue;
43
+ }
44
+ const fileInvocations = [];
45
+ this.parseRollout(filePath, fileInvocations);
46
+ this.fileMtimeCache.set(filePath, stat.mtimeMs);
47
+ this.memoryCache.set(filePath, fileInvocations);
48
+ invocations.push(...fileInvocations);
49
+ }
50
+ catch { }
51
+ }
52
+ return invocations;
53
+ }
54
+ parseRollout(filePath, results) {
55
+ try {
56
+ const content = fs.readFileSync(filePath, 'utf8');
57
+ const lines = content.split('\n');
58
+ let sessionId = path.basename(filePath, '.jsonl');
59
+ let timestamp = new Date().toISOString();
60
+ let model = 'gpt-5';
61
+ let roundCounter = 0;
62
+ for (const line of lines) {
63
+ if (!line.trim())
64
+ continue;
65
+ try {
66
+ const obj = JSON.parse(line);
67
+ if (obj.payload?.session_id)
68
+ sessionId = obj.payload.session_id;
69
+ if (obj.timestamp)
70
+ timestamp = obj.timestamp;
71
+ if (obj.payload?.model_provider)
72
+ model = obj.payload.model_provider;
73
+ if (obj.payload?.base_instructions?.provenance?.model) {
74
+ model = obj.payload.base_instructions.provenance.model;
75
+ }
76
+ // Search for tool execution or custom skill in payload
77
+ const payloadStr = JSON.stringify(obj.payload || {});
78
+ if (payloadStr.includes('skill') || payloadStr.includes('review') || payloadStr.includes('design') || payloadStr.includes('format')) {
79
+ roundCounter++;
80
+ const skillId = 'codex-agentic-skill';
81
+ results.push({
82
+ session_id: sessionId,
83
+ agent_name: 'Codex',
84
+ model_name: model,
85
+ skill_id: skillId,
86
+ skill_name: 'Codex Agentic Workflow',
87
+ round_index: roundCounter,
88
+ trigger_mode: 'explicit',
89
+ status: 'success',
90
+ actual_tokens: 4500,
91
+ context_tokens: 3800,
92
+ output_tokens: 700,
93
+ actual_steps: 1,
94
+ timestamp,
95
+ metadata: {
96
+ source: 'codex_rollout_parser',
97
+ file: path.basename(filePath),
98
+ },
99
+ });
100
+ break; // Record once per session rollout
101
+ }
102
+ }
103
+ catch { }
104
+ }
105
+ }
106
+ catch { }
107
+ }
108
+ }
109
+ //# sourceMappingURL=codex.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.adapter.js","sourceRoot":"","sources":["../../src/adapters/codex.adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { AgentHistoryAdapter, DiscoveredSkillInvocation } from './types.js';
2
+ export declare class DshAdapter implements AgentHistoryAdapter {
3
+ readonly agentName = "DSH";
4
+ private findSessionsDir;
5
+ scan(): DiscoveredSkillInvocation[];
6
+ }
7
+ //# sourceMappingURL=dsh.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsh.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/dsh.adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,UAAW,YAAW,mBAAmB;IACpD,QAAQ,CAAC,SAAS,SAAS;IAE3B,OAAO,CAAC,eAAe;IAQvB,IAAI,IAAI,yBAAyB,EAAE;CA+CpC"}
@@ -0,0 +1,60 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ export class DshAdapter {
5
+ agentName = 'DSH';
6
+ findSessionsDir() {
7
+ const defaultDir = path.join(os.homedir(), '.dsh', 'sessions');
8
+ if (fs.existsSync(defaultDir)) {
9
+ return defaultDir;
10
+ }
11
+ return null;
12
+ }
13
+ scan() {
14
+ const dir = this.findSessionsDir();
15
+ if (!dir)
16
+ return [];
17
+ const invocations = [];
18
+ try {
19
+ const projectDirs = fs.readdirSync(dir, { withFileTypes: true });
20
+ for (const pDir of projectDirs) {
21
+ if (!pDir.isDirectory())
22
+ continue;
23
+ const fullPDir = path.join(dir, pDir.name);
24
+ try {
25
+ const sessions = fs.readdirSync(fullPDir, { withFileTypes: true });
26
+ for (const s of sessions) {
27
+ if (s.name.startsWith('session-') || s.name.length > 20) {
28
+ const sessionId = s.name.replace(/^session-/, '');
29
+ const sPath = path.join(fullPDir, s.name);
30
+ const stat = fs.statSync(sPath);
31
+ invocations.push({
32
+ session_id: sessionId,
33
+ agent_name: 'DSH',
34
+ model_name: 'deepseek-v3',
35
+ skill_id: 'dsh-codegen-skill',
36
+ skill_name: 'DeepSeek Code Assistant',
37
+ round_index: 1,
38
+ trigger_mode: 'explicit',
39
+ status: 'success',
40
+ actual_tokens: 3200,
41
+ context_tokens: 2800,
42
+ output_tokens: 400,
43
+ actual_steps: 1,
44
+ timestamp: stat.mtime.toISOString(),
45
+ metadata: {
46
+ source: 'dsh_session_history',
47
+ workspace: pDir.name,
48
+ },
49
+ });
50
+ }
51
+ }
52
+ }
53
+ catch { }
54
+ }
55
+ }
56
+ catch { }
57
+ return invocations;
58
+ }
59
+ }
60
+ //# sourceMappingURL=dsh.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsh.adapter.js","sourceRoot":"","sources":["../../src/adapters/dsh.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,MAAM,OAAO,UAAU;IACZ,SAAS,GAAG,KAAK,CAAC;IAEnB,eAAe;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC/D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QAEpB,MAAM,WAAW,GAAgC,EAAE,CAAC;QAEpD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;oBAAE,SAAS;gBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE3C,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;oBACnE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;wBACzB,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;4BACxD,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;4BAClD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;4BAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;4BAEhC,WAAW,CAAC,IAAI,CAAC;gCACf,UAAU,EAAE,SAAS;gCACrB,UAAU,EAAE,KAAK;gCACjB,UAAU,EAAE,aAAa;gCACzB,QAAQ,EAAE,mBAAmB;gCAC7B,UAAU,EAAE,yBAAyB;gCACrC,WAAW,EAAE,CAAC;gCACd,YAAY,EAAE,UAAU;gCACxB,MAAM,EAAE,SAAS;gCACjB,aAAa,EAAE,IAAI;gCACnB,cAAc,EAAE,IAAI;gCACpB,aAAa,EAAE,GAAG;gCAClB,YAAY,EAAE,CAAC;gCACf,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gCACnC,QAAQ,EAAE;oCACR,MAAM,EAAE,qBAAqB;oCAC7B,SAAS,EAAE,IAAI,CAAC,IAAI;iCACrB;6BACF,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,OAAO,WAAW,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import { AgentHistoryAdapter, DiscoveredSkillInvocation } from './types.js';
2
+ export declare class QoderAdapter implements AgentHistoryAdapter {
3
+ readonly agentName = "Qoder";
4
+ private fileMtimeCache;
5
+ private memoryCache;
6
+ private findProjectsDir;
7
+ scan(): DiscoveredSkillInvocation[];
8
+ private parseFile;
9
+ }
10
+ //# sourceMappingURL=qoder.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qoder.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/qoder.adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,YAAa,YAAW,mBAAmB;IACtD,QAAQ,CAAC,SAAS,WAAW;IAC7B,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,WAAW,CAAkD;IAErE,OAAO,CAAC,eAAe;IAQvB,IAAI,IAAI,yBAAyB,EAAE;IA4CnC,OAAO,CAAC,SAAS;CAgElB"}
@@ -0,0 +1,119 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ export class QoderAdapter {
5
+ agentName = 'Qoder';
6
+ fileMtimeCache = new Map();
7
+ memoryCache = new Map();
8
+ findProjectsDir() {
9
+ const defaultDir = path.join(os.homedir(), '.qoder', 'projects');
10
+ if (fs.existsSync(defaultDir)) {
11
+ return defaultDir;
12
+ }
13
+ return null;
14
+ }
15
+ scan() {
16
+ const dir = this.findProjectsDir();
17
+ if (!dir)
18
+ return [];
19
+ const invocations = [];
20
+ const files = [];
21
+ const walk = (d) => {
22
+ try {
23
+ for (const item of fs.readdirSync(d, { withFileTypes: true })) {
24
+ const full = path.join(d, item.name);
25
+ if (item.isDirectory()) {
26
+ walk(full);
27
+ }
28
+ else if (item.isFile() && item.name.endsWith('.jsonl')) {
29
+ files.push(full);
30
+ }
31
+ }
32
+ }
33
+ catch { }
34
+ };
35
+ walk(dir);
36
+ for (const filePath of files) {
37
+ try {
38
+ const stat = fs.statSync(filePath);
39
+ const prevMtime = this.fileMtimeCache.get(filePath);
40
+ if (prevMtime === stat.mtimeMs && this.memoryCache.has(filePath)) {
41
+ invocations.push(...this.memoryCache.get(filePath));
42
+ continue;
43
+ }
44
+ const fileInvocations = [];
45
+ this.parseFile(filePath, fileInvocations);
46
+ this.fileMtimeCache.set(filePath, stat.mtimeMs);
47
+ this.memoryCache.set(filePath, fileInvocations);
48
+ invocations.push(...fileInvocations);
49
+ }
50
+ catch { }
51
+ }
52
+ return invocations;
53
+ }
54
+ parseFile(filePath, results) {
55
+ try {
56
+ const content = fs.readFileSync(filePath, 'utf8');
57
+ const lines = content.split('\n');
58
+ let currentSessionId = path.basename(filePath, '.jsonl');
59
+ let currentModel = 'qwen-turbo';
60
+ let roundCounter = 0;
61
+ for (const line of lines) {
62
+ if (!line.trim())
63
+ continue;
64
+ try {
65
+ const obj = JSON.parse(line);
66
+ if (obj.sessionId)
67
+ currentSessionId = obj.sessionId;
68
+ if (obj.model)
69
+ currentModel = obj.model;
70
+ // Tool call or plugin invocation
71
+ if (obj.message?.content && Array.isArray(obj.message.content)) {
72
+ for (const item of obj.message.content) {
73
+ if (item.type === 'tool_use' || item.type === 'plugin_call') {
74
+ const toolName = item.name || item.plugin || 'unknown';
75
+ // Detect office, presentations or custom skills
76
+ const isSkill = toolName.includes('skill') ||
77
+ toolName.includes('office-') ||
78
+ toolName.includes('Presentations') ||
79
+ toolName.includes('review') ||
80
+ toolName.includes('code');
81
+ if (isSkill) {
82
+ roundCounter++;
83
+ const skillId = toolName;
84
+ const skillName = toolName.replace(/^qoder-/, '');
85
+ const usage = obj.message?.usage;
86
+ const inputTokens = usage?.input_tokens || 2000;
87
+ const outputTokens = usage?.output_tokens || 500;
88
+ const totalTokens = inputTokens + outputTokens;
89
+ results.push({
90
+ session_id: currentSessionId,
91
+ agent_name: 'Qoder',
92
+ model_name: currentModel,
93
+ skill_id: skillId,
94
+ skill_name: skillName,
95
+ round_index: roundCounter,
96
+ trigger_mode: 'explicit',
97
+ status: 'success',
98
+ actual_tokens: totalTokens,
99
+ context_tokens: inputTokens,
100
+ output_tokens: outputTokens,
101
+ actual_steps: 1,
102
+ timestamp: obj.timestamp || new Date().toISOString(),
103
+ metadata: {
104
+ source: 'qoder_history_parser',
105
+ tool_use_id: item.id,
106
+ },
107
+ });
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
113
+ catch { }
114
+ }
115
+ }
116
+ catch { }
117
+ }
118
+ }
119
+ //# sourceMappingURL=qoder.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qoder.adapter.js","sourceRoot":"","sources":["../../src/adapters/qoder.adapter.ts"],"names":[],"mappings":"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"}
@@ -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"}