@hddz/plugin-harness 0.1.19 → 0.2.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.

Potentially problematic release.


This version of @hddz/plugin-harness might be problematic. Click here for more details.

Files changed (41) hide show
  1. package/README.md +97 -114
  2. package/dist/core/auditors/index.d.ts +2 -0
  3. package/dist/core/auditors/index.js +7 -0
  4. package/dist/core/auditors/skill-auditor.d.ts +72 -0
  5. package/dist/core/auditors/skill-auditor.js +488 -0
  6. package/dist/core/index.d.ts +22 -0
  7. package/dist/core/index.js +47 -0
  8. package/dist/core/loggers/config-logger.d.ts +25 -0
  9. package/dist/core/loggers/config-logger.js +139 -0
  10. package/dist/core/loggers/index.d.ts +4 -0
  11. package/dist/core/loggers/index.js +9 -0
  12. package/dist/core/loggers/operation-logger.d.ts +23 -0
  13. package/dist/core/loggers/operation-logger.js +125 -0
  14. package/dist/core/middleware/context-injector.d.ts +25 -0
  15. package/dist/core/middleware/context-injector.js +174 -0
  16. package/dist/core/middleware/index.d.ts +5 -0
  17. package/dist/core/middleware/index.js +11 -0
  18. package/dist/core/middleware/loop-detector.d.ts +18 -0
  19. package/dist/core/middleware/loop-detector.js +125 -0
  20. package/dist/core/middleware/trace-logger.d.ts +34 -0
  21. package/dist/core/middleware/trace-logger.js +141 -0
  22. package/dist/core/utils/file.d.ts +28 -0
  23. package/dist/core/utils/file.js +104 -0
  24. package/dist/core/utils/format.d.ts +16 -0
  25. package/dist/core/utils/format.js +60 -0
  26. package/dist/core/utils/index.d.ts +2 -0
  27. package/dist/core/utils/index.js +14 -0
  28. package/dist/core/validators/config-validator.d.ts +25 -0
  29. package/dist/core/validators/config-validator.js +235 -0
  30. package/dist/core/validators/index.d.ts +2 -0
  31. package/dist/core/validators/index.js +7 -0
  32. package/dist/file-watcher.d.ts +37 -0
  33. package/dist/file-watcher.js +151 -0
  34. package/dist/index.d.ts +63 -0
  35. package/dist/index.js +166 -106
  36. package/dist/src/file-watcher.d.ts +37 -0
  37. package/dist/src/file-watcher.js +151 -0
  38. package/dist/src/index.d.ts +70 -0
  39. package/dist/src/index.js +192 -0
  40. package/package.json +4 -12
  41. package/openclaw.plugin.json +0 -39
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ // src/loggers/config-logger.ts - 配置变更日志
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.ConfigLogger = void 0;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ class ConfigLogger {
41
+ workspacePath;
42
+ logFilePath;
43
+ constructor(workspacePath) {
44
+ this.workspacePath = workspacePath;
45
+ const logsDir = path.join(workspacePath, 'logs');
46
+ if (!fs.existsSync(logsDir)) {
47
+ fs.mkdirSync(logsDir, { recursive: true });
48
+ }
49
+ this.logFilePath = path.join(logsDir, 'config-changes.md');
50
+ // 初始化日志文件(如果不存在)
51
+ if (!fs.existsSync(this.logFilePath)) {
52
+ fs.writeFileSync(this.logFilePath, '# 配置变更日志\n\n');
53
+ }
54
+ }
55
+ log(change) {
56
+ const fullChange = {
57
+ ...change,
58
+ timestamp: new Date().toISOString(),
59
+ };
60
+ const entry = this.formatEntry(fullChange);
61
+ fs.appendFileSync(this.logFilePath, entry);
62
+ }
63
+ formatEntry(change) {
64
+ const date = new Date(change.timestamp);
65
+ const dateStr = date.toISOString().replace('T', ' ').substring(0, 19);
66
+ let entry = `## ${dateStr}\n`;
67
+ entry += `- **修改者**: ${change.modifier}\n`;
68
+ entry += `- **文件**: ${change.file}\n`;
69
+ entry += `- **原因**: ${change.reason}\n`;
70
+ entry += `- **验证**: ${change.verified ? '✅ 通过' : '❌ 失败'}\n`;
71
+ entry += `- **Gateway 重启**: ${change.gatewayRestarted ? '✅ 是' : '❌ 否'}\n`;
72
+ if (change.sessionId) {
73
+ entry += `- **会话 ID**: ${change.sessionId}\n`;
74
+ }
75
+ entry += `\n### 变更详情\n`;
76
+ if (change.changes.length === 0) {
77
+ entry += '_无具体变更记录_\n';
78
+ }
79
+ else {
80
+ change.changes.forEach((c, i) => {
81
+ entry += `${i + 1}. \`${c.field}\`\n`;
82
+ entry += ` - 旧值:\`${this.truncateValue(c.oldValue)}\`\n`;
83
+ entry += ` - 新值:\`${this.truncateValue(c.newValue)}\`\n`;
84
+ });
85
+ }
86
+ entry += `\n---\n\n`;
87
+ return entry;
88
+ }
89
+ truncateValue(value, maxLength = 100) {
90
+ const str = JSON.stringify(value);
91
+ if (str.length <= maxLength)
92
+ return str;
93
+ return str.substring(0, maxLength) + '...';
94
+ }
95
+ getRecentChanges(limit = 10) {
96
+ if (!fs.existsSync(this.logFilePath))
97
+ return [];
98
+ const content = fs.readFileSync(this.logFilePath, 'utf8');
99
+ const entries = content.split('## ').slice(1);
100
+ return entries.slice(-limit).map(entry => this.parseEntry(entry));
101
+ }
102
+ parseEntry(entry) {
103
+ // 简化解析
104
+ const lines = entry.split('\n');
105
+ const change = {
106
+ timestamp: '',
107
+ modifier: '',
108
+ file: '',
109
+ changes: [],
110
+ reason: '',
111
+ verified: false,
112
+ gatewayRestarted: false,
113
+ };
114
+ for (const line of lines) {
115
+ if (line.startsWith('- **修改者**: ')) {
116
+ change.modifier = line.replace('- **修改者**: ', '');
117
+ }
118
+ else if (line.startsWith('- **文件**: ')) {
119
+ change.file = line.replace('- **文件**: ', '');
120
+ }
121
+ else if (line.startsWith('- **原因**: ')) {
122
+ change.reason = line.replace('- **原因**: ', '');
123
+ }
124
+ else if (line.includes('✅ 通过')) {
125
+ change.verified = true;
126
+ }
127
+ else if (line.includes('✅ 是')) {
128
+ change.gatewayRestarted = true;
129
+ }
130
+ }
131
+ return change;
132
+ }
133
+ exportToJson(outputPath) {
134
+ const changes = this.getRecentChanges(100);
135
+ fs.writeFileSync(outputPath, JSON.stringify(changes, null, 2));
136
+ }
137
+ }
138
+ exports.ConfigLogger = ConfigLogger;
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLWxvZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL2xvZ2dlcnMvY29uZmlnLWxvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsd0NBQXdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFeEMsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQWlCN0IsTUFBYSxZQUFZO0lBR0g7SUFGWixXQUFXLENBQVM7SUFFNUIsWUFBb0IsYUFBcUI7UUFBckIsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM1QixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFFM0QsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3JDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBQyxNQUF1QztRQUN6QyxNQUFNLFVBQVUsR0FBaUI7WUFDL0IsR0FBRyxNQUFNO1lBQ1QsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1NBQ3BDLENBQUM7UUFFRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FB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QUFnQixHQUFHLElBQUksQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxZQUFZLENBQUMsVUFBa0I7UUFDN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7Q0FDRjtBQXZHRCxvQ0F1R0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvbG9nZ2Vycy9jb25maWctbG9nZ2VyLnRzIC0g6YWN572u5Y+Y5pu05pel5b+XXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnQ2hhbmdlIHtcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIG1vZGlmaWVyOiBzdHJpbmc7ICAgICAgICAgLy8g5L+u5pS56ICF77yI5aaCIFwi6JOd5bGxXCLvvIlcbiAgZmlsZTogc3RyaW5nOyAgICAgICAgICAgICAvLyDkv67mlLnnmoTmlofku7ZcbiAgY2hhbmdlczogQXJyYXk8e1xuICAgIGZpZWxkOiBzdHJpbmc7XG4gICAgb2xkVmFsdWU6IGFueTtcbiAgICBuZXdWYWx1ZTogYW55O1xuICB9PjtcbiAgcmVhc29uOiBzdHJpbmc7ICAgICAgICAgICAvLyDlj5jmm7Tljp/lm6BcbiAgdmVyaWZpZWQ6IGJvb2xlYW47ICAgICAgICAvLyDmmK/lkKbpqozor4HpgJrov4dcbiAgZ2F0ZXdheVJlc3RhcnRlZDogYm9vbGVhbjsgLy8g5piv5ZCm6YeN5ZCvIEdhdGV3YXlcbiAgc2Vzc2lvbklkPzogc3RyaW5nOyAgICAgICAvLyDkvJror50gSURcbn1cblxuZXhwb3J0IGNsYXNzIENvbmZpZ0xvZ2dlciB7XG4gIHByaXZhdGUgbG9nRmlsZVBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHdvcmtzcGFjZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IGxvZ3NEaXIgPSBwYXRoLmpvaW4od29ya3NwYWNlUGF0aCwgJ2xvZ3MnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMobG9nc0RpcikpIHtcbiAgICAgIGZzLm1rZGlyU3luYyhsb2dzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgdGhpcy5sb2dGaWxlUGF0aCA9IHBhdGguam9pbihsb2dzRGlyLCAnY29uZmlnLWNoYW5nZXMubWQnKTtcbiAgICBcbiAgICAvLyDliJ3lp4vljJbml6Xlv5fmlofku7bvvIjlpoLmnpzkuI3lrZjlnKjvvIlcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5sb2dGaWxlUGF0aCkpIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5sb2dGaWxlUGF0aCwgJyMg6YWN572u5Y+Y5pu05pel5b+XXFxuXFxuJyk7XG4gICAgfVxuICB9XG5cbiAgbG9nKGNoYW5nZTogT21pdDxDb25maWdDaGFuZ2UsICd0aW1lc3RhbXAnPik6IHZvaWQge1xuICAgIGNvbnN0IGZ1bGxDaGFuZ2U6IENvbmZpZ0NoYW5nZSA9IHtcbiAgICAgIC4uLmNoYW5nZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG5cbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZm9ybWF0RW50cnkoZnVsbENoYW5nZSk7XG4gICAgZnMuYXBwZW5kRmlsZVN5bmModGhpcy5sb2dGaWxlUGF0aCwgZW50cnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRFbnRyeShjaGFuZ2U6IENvbmZpZ0NoYW5nZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGNoYW5nZS50aW1lc3RhbXApO1xuICAgIGNvbnN0IGRhdGVTdHIgPSBkYXRlLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgnVCcsICcgJykuc3Vic3RyaW5nKDAsIDE5KTtcblxuICAgIGxldCBlbnRyeSA9IGAjIyAke2RhdGVTdHJ9XFxuYDtcbiAgICBlbnRyeSArPSBgLSAqKuS/ruaUueiAhSoqOiAke2NoYW5nZS5tb2RpZmllcn1cXG5gO1xuICAgIGVudHJ5ICs9IGAtICoq5paH5Lu2Kio6ICR7Y2hhbmdlLmZpbGV9XFxuYDtcbiAgICBlbnRyeSArPSBgLSAqKuWOn+WboCoqOiAke2NoYW5nZS5yZWFzb259XFxuYDtcbiAgICBlbnRyeSArPSBgLSAqKumqjOivgSoqOiAke2NoYW5nZS52ZXJpZmllZCA/ICfinIUg6YCa6L+HJyA6ICfinYwg5aSx6LSlJ31cXG5gO1xuICAgIGVudHJ5ICs9IGAtICoqR2F0ZXdheSDph43lkK8qKjogJHtjaGFuZ2UuZ2F0ZXdheVJlc3RhcnRlZCA/ICfinIUg5pivJyA6ICfinYwg5ZCmJ31cXG5gO1xuICAgIGlmIChjaGFuZ2Uuc2Vzc2lvbklkKSB7XG4gICAgICBlbnRyeSArPSBgLSAqKuS8muivnSBJRCoqOiAke2NoYW5nZS5zZXNzaW9uSWR9XFxuYDtcbiAgICB9XG4gICAgZW50cnkgKz0gYFxcbiMjIyDlj5jmm7Tor6bmg4VcXG5gO1xuICAgIFxuICAgIGlmIChjaGFuZ2UuY2hhbmdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudHJ5ICs9ICdf5peg5YW35L2T5Y+Y5pu06K6w5b2VX1xcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZS5jaGFuZ2VzLmZvckVhY2goKGMsIGkpID0+IHtcbiAgICAgICAgZW50cnkgKz0gYCR7aSArIDF9LiBcXGAke2MuZmllbGR9XFxgXFxuYDtcbiAgICAgICAgZW50cnkgKz0gYCAgIC0g5pen5YC877yaXFxgJHt0aGlzLnRydW5jYXRlVmFsdWUoYy5vbGRWYWx1ZSl9XFxgXFxuYDtcbiAgICAgICAgZW50cnkgKz0gYCAgIC0g5paw5YC877yaXFxgJHt0aGlzLnRydW5jYXRlVmFsdWUoYy5uZXdWYWx1ZSl9XFxgXFxuYDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGVudHJ5ICs9IGBcXG4tLS1cXG5cXG5gO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIHByaXZhdGUgdHJ1bmNhdGVWYWx1ZSh2YWx1ZTogYW55LCBtYXhMZW5ndGg6IG51bWJlciA9IDEwMCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGlmIChzdHIubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIHN0cjtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpICsgJy4uLic7XG4gIH1cblxuICBnZXRSZWNlbnRDaGFuZ2VzKGxpbWl0OiBudW1iZXIgPSAxMCk6IENvbmZpZ0NoYW5nZVtdIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5sb2dGaWxlUGF0aCkpIHJldHVybiBbXTtcbiAgICBcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRoaXMubG9nRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgZW50cmllcyA9IGNvbnRlbnQuc3BsaXQoJyMjICcpLnNsaWNlKDEpO1xuICAgIHJldHVybiBlbnRyaWVzLnNsaWNlKC1saW1pdCkubWFwKGVudHJ5ID0+IHRoaXMucGFyc2VFbnRyeShlbnRyeSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUVudHJ5KGVudHJ5OiBzdHJpbmcpOiBDb25maWdDaGFuZ2Uge1xuICAgIC8vIOeugOWMluino+aekFxuICAgIGNvbnN0IGxpbmVzID0gZW50cnkuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IGNoYW5nZTogQ29uZmlnQ2hhbmdlID0ge1xuICAgICAgdGltZXN0YW1wOiAnJyxcbiAgICAgIG1vZGlmaWVyOiAnJyxcbiAgICAgIGZpbGU6ICcnLFxuICAgICAgY2hhbmdlczogW10sXG4gICAgICByZWFzb246ICcnLFxuICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgZ2F0ZXdheVJlc3RhcnRlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnLSAqKuS/ruaUueiAhSoqOiAnKSkge1xuICAgICAgICBjaGFuZ2UubW9kaWZpZXIgPSBsaW5lLnJlcGxhY2UoJy0gKirkv67mlLnogIUqKjogJywgJycpO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJy0gKirmlofku7YqKjogJykpIHtcbiAgICAgICAgY2hhbmdlLmZpbGUgPSBsaW5lLnJlcGxhY2UoJy0gKirmlofku7YqKjogJywgJycpO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJy0gKirljp/lm6AqKjogJykpIHtcbiAgICAgICAgY2hhbmdlLnJlYXNvbiA9IGxpbmUucmVwbGFjZSgnLSAqKuWOn+WboCoqOiAnLCAnJyk7XG4gICAgICB9IGVsc2UgaWYgKGxpbmUuaW5jbHVkZXMoJ+KchSDpgJrov4cnKSkge1xuICAgICAgICBjaGFuZ2UudmVyaWZpZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLmluY2x1ZGVzKCfinIUg5pivJykpIHtcbiAgICAgICAgY2hhbmdlLmdhdGV3YXlSZXN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2U7XG4gIH1cblxuICBleHBvcnRUb0pzb24ob3V0cHV0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuZ2V0UmVjZW50Q2hhbmdlcygxMDApO1xuICAgIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgSlNPTi5zdHJpbmdpZnkoY2hhbmdlcywgbnVsbCwgMikpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ export { ConfigLogger } from './config-logger';
2
+ export type { ConfigChange } from './config-logger';
3
+ export { OperationLogger } from './operation-logger';
4
+ export type { OperationEntry } from './operation-logger';
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OperationLogger = exports.ConfigLogger = void 0;
4
+ // src/loggers/index.ts
5
+ var config_logger_1 = require("./config-logger");
6
+ Object.defineProperty(exports, "ConfigLogger", { enumerable: true, get: function () { return config_logger_1.ConfigLogger; } });
7
+ var operation_logger_1 = require("./operation-logger");
8
+ Object.defineProperty(exports, "OperationLogger", { enumerable: true, get: function () { return operation_logger_1.OperationLogger; } });
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9sb2dnZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVCQUF1QjtBQUN2QixpREFBK0M7QUFBdEMsNkdBQUEsWUFBWSxPQUFBO0FBRXJCLHVEQUFxRDtBQUE1QyxtSEFBQSxlQUFlLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvbG9nZ2Vycy9pbmRleC50c1xuZXhwb3J0IHsgQ29uZmlnTG9nZ2VyIH0gZnJvbSAnLi9jb25maWctbG9nZ2VyJztcbmV4cG9ydCB0eXBlIHsgQ29uZmlnQ2hhbmdlIH0gZnJvbSAnLi9jb25maWctbG9nZ2VyJztcbmV4cG9ydCB7IE9wZXJhdGlvbkxvZ2dlciB9IGZyb20gJy4vb3BlcmF0aW9uLWxvZ2dlcic7XG5leHBvcnQgdHlwZSB7IE9wZXJhdGlvbkVudHJ5IH0gZnJvbSAnLi9vcGVyYXRpb24tbG9nZ2VyJztcbiJdfQ==
@@ -0,0 +1,23 @@
1
+ export interface OperationEntry {
2
+ timestamp: string;
3
+ sessionId: string;
4
+ modifier: string;
5
+ type: 'config_change' | 'file_edit' | 'file_delete' | 'system_command' | 'gateway_restart' | 'other';
6
+ description: string;
7
+ file?: string;
8
+ command?: string;
9
+ result: 'success' | 'error' | 'pending';
10
+ error?: string;
11
+ }
12
+ export declare class OperationLogger {
13
+ private workspacePath;
14
+ private logFilePath;
15
+ constructor(workspacePath: string);
16
+ log(entry: Omit<OperationEntry, 'timestamp'>): void;
17
+ private formatEntry;
18
+ private getTypeIcon;
19
+ getRecentOperations(limit?: number): OperationEntry[];
20
+ private parseEntry;
21
+ getOperationsBySession(sessionId: string, limit?: number): OperationEntry[];
22
+ getOperationsByType(type: OperationEntry['type'], limit?: number): OperationEntry[];
23
+ }
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ // src/loggers/operation-logger.ts - 操作日志
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.OperationLogger = void 0;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ class OperationLogger {
41
+ workspacePath;
42
+ logFilePath;
43
+ constructor(workspacePath) {
44
+ this.workspacePath = workspacePath;
45
+ const logsDir = path.join(workspacePath, 'logs');
46
+ if (!fs.existsSync(logsDir)) {
47
+ fs.mkdirSync(logsDir, { recursive: true });
48
+ }
49
+ this.logFilePath = path.join(logsDir, 'operations.md');
50
+ // 初始化日志文件(如果不存在)
51
+ if (!fs.existsSync(this.logFilePath)) {
52
+ fs.writeFileSync(this.logFilePath, '# 操作日志\n\n');
53
+ }
54
+ }
55
+ log(entry) {
56
+ const fullEntry = {
57
+ ...entry,
58
+ timestamp: new Date().toISOString(),
59
+ };
60
+ const logEntry = this.formatEntry(fullEntry);
61
+ fs.appendFileSync(this.logFilePath, logEntry);
62
+ }
63
+ formatEntry(entry) {
64
+ const date = new Date(entry.timestamp);
65
+ const dateStr = date.toISOString().replace('T', ' ').substring(0, 19);
66
+ const icon = entry.result === 'success' ? '✅' : entry.result === 'error' ? '❌' : '⏳';
67
+ const typeIcon = this.getTypeIcon(entry.type);
68
+ let logEntry = `### ${dateStr} ${icon}\n\n`;
69
+ logEntry += `- **类型**: ${typeIcon} ${entry.type}\n`;
70
+ logEntry += `- **会话**: ${entry.sessionId}\n`;
71
+ logEntry += `- **操作者**: ${entry.modifier}\n`;
72
+ logEntry += `- **描述**: ${entry.description}\n`;
73
+ if (entry.file) {
74
+ logEntry += `- **文件**: \`${entry.file}\`\n`;
75
+ }
76
+ if (entry.command) {
77
+ logEntry += `- **命令**: \`${entry.command}\`\n`;
78
+ }
79
+ if (entry.error) {
80
+ logEntry += `- **错误**: ${entry.error}\n`;
81
+ }
82
+ logEntry += `\n`;
83
+ return logEntry;
84
+ }
85
+ getTypeIcon(type) {
86
+ const icons = {
87
+ config_change: '⚙️',
88
+ file_edit: '📝',
89
+ file_delete: '🗑️',
90
+ system_command: '💻',
91
+ gateway_restart: '🔄',
92
+ other: '📌',
93
+ };
94
+ return icons[type] || '📌';
95
+ }
96
+ getRecentOperations(limit = 20) {
97
+ if (!fs.existsSync(this.logFilePath))
98
+ return [];
99
+ const content = fs.readFileSync(this.logFilePath, 'utf8');
100
+ // 简化解析
101
+ const entries = content.split('### ').slice(1);
102
+ return entries.slice(-limit).map(entry => this.parseEntry(entry));
103
+ }
104
+ parseEntry(entry) {
105
+ // 简化解析
106
+ return {
107
+ timestamp: '',
108
+ sessionId: '',
109
+ modifier: '',
110
+ type: 'other',
111
+ description: '',
112
+ result: 'pending',
113
+ };
114
+ }
115
+ getOperationsBySession(sessionId, limit = 50) {
116
+ const all = this.getRecentOperations(limit);
117
+ return all.filter(op => op.sessionId === sessionId);
118
+ }
119
+ getOperationsByType(type, limit = 20) {
120
+ const all = this.getRecentOperations(limit);
121
+ return all.filter(op => op.type === type);
122
+ }
123
+ }
124
+ exports.OperationLogger = OperationLogger;
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLWxvZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL2xvZ2dlcnMvb3BlcmF0aW9uLWxvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUNBQXlDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFekMsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQWM3QixNQUFhLGVBQWU7SUFHTjtJQUZaLFdBQVcsQ0FBUztJQUU1QixZQUFvQixhQUFxQjtRQUFyQixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzVCLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFdkQsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3JDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBQyxLQUF3QztRQUMxQyxNQUFNLFNBQVMsR0FBbUI7WUFDaEMsR0FBRyxLQUFLO1lBQ1IsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1NBQ3BDLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFD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QUFFO1lBQ1osSUFBSSxFQUFFLE9BQU87WUFDYixXQUFXLEVBQUUsRUFBRTtZQUNmLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUM7SUFDSixDQUFDO0lBRUQsc0JBQXNCLENBQUMsU0FBaUIsRUFBRSxRQUFnQixFQUFFO1FBQzFELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUE0QixFQUFFLFFBQWdCLEVBQUU7UUFDbEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGO0FBakdELDBDQWlHQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNyYy9sb2dnZXJzL29wZXJhdGlvbi1sb2dnZXIudHMgLSDmk43kvZzml6Xlv5dcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb25FbnRyeSB7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgbW9kaWZpZXI6IHN0cmluZztcbiAgdHlwZTogJ2NvbmZpZ19jaGFuZ2UnIHwgJ2ZpbGVfZWRpdCcgfCAnZmlsZV9kZWxldGUnIHwgJ3N5c3RlbV9jb21tYW5kJyB8ICdnYXRld2F5X3Jlc3RhcnQnIHwgJ290aGVyJztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgZmlsZT86IHN0cmluZztcbiAgY29tbWFuZD86IHN0cmluZztcbiAgcmVzdWx0OiAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ3BlbmRpbmcnO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbkxvZ2dlciB7XG4gIHByaXZhdGUgbG9nRmlsZVBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHdvcmtzcGFjZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IGxvZ3NEaXIgPSBwYXRoLmpvaW4od29ya3NwYWNlUGF0aCwgJ2xvZ3MnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMobG9nc0RpcikpIHtcbiAgICAgIGZzLm1rZGlyU3luYyhsb2dzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgdGhpcy5sb2dGaWxlUGF0aCA9IHBhdGguam9pbihsb2dzRGlyLCAnb3BlcmF0aW9ucy5tZCcpO1xuICAgIFxuICAgIC8vIOWIneWni+WMluaXpeW/l+aWh+S7tu+8iOWmguaenOS4jeWtmOWcqO+8iVxuICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmxvZ0ZpbGVQYXRoKSkge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmxvZ0ZpbGVQYXRoLCAnIyDmk43kvZzml6Xlv5dcXG5cXG4nKTtcbiAgICB9XG4gIH1cblxuICBsb2coZW50cnk6IE9taXQ8T3BlcmF0aW9uRW50cnksICd0aW1lc3RhbXAnPik6IHZvaWQge1xuICAgIGNvbnN0IGZ1bGxFbnRyeTogT3BlcmF0aW9uRW50cnkgPSB7XG4gICAgICAuLi5lbnRyeSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG5cbiAgICBjb25zdCBsb2dFbnRyeSA9IHRoaXMuZm9ybWF0RW50cnkoZnVsbEVudHJ5KTtcbiAgICBmcy5hcHBlbmRGaWxlU3luYyh0aGlzLmxvZ0ZpbGVQYXRoLCBsb2dFbnRyeSk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEVudHJ5KGVudHJ5OiBPcGVyYXRpb25FbnRyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGVudHJ5LnRpbWVzdGFtcCk7XG4gICAgY29uc3QgZGF0ZVN0ciA9IGRhdGUudG9JU09TdHJpbmcoKS5yZXBsYWNlKCdUJywgJyAnKS5zdWJzdHJpbmcoMCwgMTkpO1xuICAgIFxuICAgIGNvbnN0IGljb24gPSBlbnRyeS5yZXN1bHQgPT09ICdzdWNjZXNzJyA/ICfinIUnIDogZW50cnkucmVzdWx0ID09PSAnZXJyb3InID8gJ+KdjCcgOiAn4o+zJztcbiAgICBjb25zdCB0eXBlSWNvbiA9IHRoaXMuZ2V0VHlwZUljb24oZW50cnkudHlwZSk7XG5cbiAgICBsZXQgbG9nRW50cnkgPSBgIyMjICR7ZGF0ZVN0cn0gJHtpY29ufVxcblxcbmA7XG4gICAgbG9nRW50cnkgKz0gYC0gKirnsbvlnosqKjogJHt0eXBlSWNvbn0gJHtlbnRyeS50eXBlfVxcbmA7XG4gICAgbG9nRW50cnkgKz0gYC0gKirkvJror50qKjogJHtlbnRyeS5zZXNzaW9uSWR9XFxuYDtcbiAgICBsb2dFbnRyeSArPSBgLSAqKuaTjeS9nOiAhSoqOiAke2VudHJ5Lm1vZGlmaWVyfVxcbmA7XG4gICAgbG9nRW50cnkgKz0gYC0gKirmj4/ov7AqKjogJHtlbnRyeS5kZXNjcmlwdGlvbn1cXG5gO1xuICAgIFxuICAgIGlmIChlbnRyeS5maWxlKSB7XG4gICAgICBsb2dFbnRyeSArPSBgLSAqKuaWh+S7tioqOiBcXGAke2VudHJ5LmZpbGV9XFxgXFxuYDtcbiAgICB9XG4gICAgXG4gICAgaWYgKGVudHJ5LmNvbW1hbmQpIHtcbiAgICAgIGxvZ0VudHJ5ICs9IGAtICoq5ZG95LukKio6IFxcYCR7ZW50cnkuY29tbWFuZH1cXGBcXG5gO1xuICAgIH1cblxuICAgIGlmIChlbnRyeS5lcnJvcikge1xuICAgICAgbG9nRW50cnkgKz0gYC0gKirplJnor68qKjogJHtlbnRyeS5lcnJvcn1cXG5gO1xuICAgIH1cblxuICAgIGxvZ0VudHJ5ICs9IGBcXG5gO1xuICAgIHJldHVybiBsb2dFbnRyeTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHlwZUljb24odHlwZTogT3BlcmF0aW9uRW50cnlbJ3R5cGUnXSk6IHN0cmluZyB7XG4gICAgY29uc3QgaWNvbnM6IFJlY29yZDxPcGVyYXRpb25FbnRyeVsndHlwZSddLCBzdHJpbmc+ID0ge1xuICAgICAgY29uZmlnX2NoYW5nZTogJ+Kame+4jycsXG4gICAgICBmaWxlX2VkaXQ6ICfwn5OdJyxcbiAgICAgIGZpbGVfZGVsZXRlOiAn8J+Xke+4jycsXG4gICAgICBzeXN0ZW1fY29tbWFuZDogJ/CfkrsnLFxuICAgICAgZ2F0ZXdheV9yZXN0YXJ0OiAn8J+UhCcsXG4gICAgICBvdGhlcjogJ/Cfk4wnLFxuICAgIH07XG4gICAgcmV0dXJuIGljb25zW3R5cGVdIHx8ICfwn5OMJztcbiAgfVxuXG4gIGdldFJlY2VudE9wZXJhdGlvbnMobGltaXQ6IG51bWJlciA9IDIwKTogT3BlcmF0aW9uRW50cnlbXSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMubG9nRmlsZVBhdGgpKSByZXR1cm4gW107XG4gICAgXG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLmxvZ0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgIC8vIOeugOWMluino+aekFxuICAgIGNvbnN0IGVudHJpZXMgPSBjb250ZW50LnNwbGl0KCcjIyMgJykuc2xpY2UoMSk7XG4gICAgcmV0dXJuIGVudHJpZXMuc2xpY2UoLWxpbWl0KS5tYXAoZW50cnkgPT4gdGhpcy5wYXJzZUVudHJ5KGVudHJ5KSk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlRW50cnkoZW50cnk6IHN0cmluZyk6IE9wZXJhdGlvbkVudHJ5IHtcbiAgICAvLyDnroDljJbop6PmnpBcbiAgICByZXR1cm4ge1xuICAgICAgdGltZXN0YW1wOiAnJyxcbiAgICAgIHNlc3Npb25JZDogJycsXG4gICAgICBtb2RpZmllcjogJycsXG4gICAgICB0eXBlOiAnb3RoZXInLFxuICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgcmVzdWx0OiAncGVuZGluZycsXG4gICAgfTtcbiAgfVxuXG4gIGdldE9wZXJhdGlvbnNCeVNlc3Npb24oc2Vzc2lvbklkOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSA1MCk6IE9wZXJhdGlvbkVudHJ5W10ge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMuZ2V0UmVjZW50T3BlcmF0aW9ucyhsaW1pdCk7XG4gICAgcmV0dXJuIGFsbC5maWx0ZXIob3AgPT4gb3Auc2Vzc2lvbklkID09PSBzZXNzaW9uSWQpO1xuICB9XG5cbiAgZ2V0T3BlcmF0aW9uc0J5VHlwZSh0eXBlOiBPcGVyYXRpb25FbnRyeVsndHlwZSddLCBsaW1pdDogbnVtYmVyID0gMjApOiBPcGVyYXRpb25FbnRyeVtdIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLmdldFJlY2VudE9wZXJhdGlvbnMobGltaXQpO1xuICAgIHJldHVybiBhbGwuZmlsdGVyKG9wID0+IG9wLnR5cGUgPT09IHR5cGUpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,25 @@
1
+ export interface ContextInjection {
2
+ section: string;
3
+ content: string;
4
+ priority?: 'high' | 'medium' | 'low';
5
+ }
6
+ export declare class ContextInjector {
7
+ private workspacePath;
8
+ constructor(workspacePath: string);
9
+ /**
10
+ * 获取当前工作环境的上下文信息
11
+ */
12
+ getEnvironmentContext(): ContextInjection[];
13
+ /**
14
+ * 获取目录结构(只显示 Markdown 和配置文件)
15
+ */
16
+ private getDirectoryStructure;
17
+ /**
18
+ * 获取可用的全局命令
19
+ */
20
+ private getAvailableCommands;
21
+ /**
22
+ * 格式化为可注入的上下文字符串
23
+ */
24
+ formatForInjection(contexts?: ContextInjection[]): string;
25
+ }
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ // src/middleware/context-injector.ts - 环境上下文注入器
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.ContextInjector = void 0;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const child_process_1 = require("child_process");
41
+ class ContextInjector {
42
+ workspacePath;
43
+ constructor(workspacePath) {
44
+ this.workspacePath = workspacePath;
45
+ }
46
+ /**
47
+ * 获取当前工作环境的上下文信息
48
+ */
49
+ getEnvironmentContext() {
50
+ const injections = [];
51
+ // 工作目录
52
+ injections.push({
53
+ section: '当前工作目录',
54
+ content: this.workspacePath,
55
+ priority: 'high',
56
+ });
57
+ // 目录结构
58
+ try {
59
+ const dirStructure = this.getDirectoryStructure();
60
+ injections.push({
61
+ section: '项目结构',
62
+ content: dirStructure,
63
+ priority: 'medium',
64
+ });
65
+ }
66
+ catch (error) {
67
+ // 忽略错误
68
+ }
69
+ // Node.js 版本
70
+ try {
71
+ const nodeVersion = (0, child_process_1.execSync)('node --version').toString().trim();
72
+ injections.push({
73
+ section: 'Node.js 环境',
74
+ content: `Node.js: ${nodeVersion}`,
75
+ priority: 'medium',
76
+ });
77
+ }
78
+ catch (error) {
79
+ // 忽略错误
80
+ }
81
+ // 可用的全局命令
82
+ try {
83
+ const commands = this.getAvailableCommands();
84
+ injections.push({
85
+ section: '可用命令',
86
+ content: commands,
87
+ priority: 'low',
88
+ });
89
+ }
90
+ catch (error) {
91
+ // 忽略错误
92
+ }
93
+ return injections;
94
+ }
95
+ /**
96
+ * 获取目录结构(只显示 Markdown 和配置文件)
97
+ */
98
+ getDirectoryStructure() {
99
+ const maxDepth = 3;
100
+ const result = [];
101
+ const scanDir = (dir, depth, prefix = '') => {
102
+ if (depth > maxDepth)
103
+ return;
104
+ let items;
105
+ try {
106
+ items = fs.readdirSync(dir);
107
+ }
108
+ catch (error) {
109
+ return;
110
+ }
111
+ // 过滤:只显示 .md, .json, .js, .ts 文件,跳过 node_modules, .git, dist
112
+ const filtered = items.filter(item => {
113
+ if (['node_modules', '.git', 'dist', '.DS_Store'].includes(item))
114
+ return false;
115
+ const ext = path.extname(item);
116
+ const isRelevant = ['.md', '.json', '.js', '.ts', '.sh'].includes(ext);
117
+ const isDir = fs.statSync(path.join(dir, item)).isDirectory();
118
+ return isRelevant || isDir;
119
+ });
120
+ for (const item of filtered) {
121
+ const fullPath = path.join(dir, item);
122
+ const stat = fs.statSync(fullPath);
123
+ if (stat.isDirectory()) {
124
+ result.push(`${prefix}${item}/`);
125
+ scanDir(fullPath, depth + 1, prefix + ' ');
126
+ }
127
+ else {
128
+ result.push(`${prefix}${item}`);
129
+ }
130
+ }
131
+ };
132
+ scanDir(this.workspacePath, 0);
133
+ return result.join('\n');
134
+ }
135
+ /**
136
+ * 获取可用的全局命令
137
+ */
138
+ getAvailableCommands() {
139
+ const commands = [
140
+ 'node', 'npm', 'npx',
141
+ 'git',
142
+ 'curl', 'wget',
143
+ 'jq',
144
+ 'openclaw',
145
+ ];
146
+ const available = [];
147
+ for (const cmd of commands) {
148
+ try {
149
+ const version = (0, child_process_1.execSync)(`${cmd} --version`, { stdio: ['pipe', 'pipe', 'ignore'] })
150
+ .toString()
151
+ .trim()
152
+ .split('\n')[0];
153
+ available.push(`${cmd}: ${version}`);
154
+ }
155
+ catch (error) {
156
+ // 命令不可用
157
+ }
158
+ }
159
+ return available.join('\n') || '无可用命令';
160
+ }
161
+ /**
162
+ * 格式化为可注入的上下文字符串
163
+ */
164
+ formatForInjection(contexts) {
165
+ const ctx = contexts || this.getEnvironmentContext();
166
+ let output = '## 当前环境上下文\n\n';
167
+ ctx.forEach(c => {
168
+ output += `### ${c.section}\n\`\`\`\n${c.content}\n\`\`\`\n\n`;
169
+ });
170
+ return output;
171
+ }
172
+ }
173
+ exports.ContextInjector = ContextInjector;
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1pbmplY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL21pZGRsZXdhcmUvY29udGV4dC1pbmplY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsZ0RBQWdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFaEQsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixpREFBeUM7QUFRekMsTUFBYSxlQUFlO0lBQ047SUFBcEIsWUFBb0IsYUFBcUI7UUFBckIsa0JBQWEsR0FBYixhQUFhLENBQVE7SUFBRyxDQUFDO0lBRTdDOztPQUVHO0lBQ0gscUJBQXFCO1FBQ25CLE1BQU0sVUFBVSxHQUF1QixFQUFFLENBQUM7UUFFMUMsT0FBTztRQUNQLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDZCxPQUFPLEVBQUUsUUFBUTtZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDM0IsUUFBUSxFQUFFLE1BQU07U0FDakIsQ0FBQyxDQUFDO1FBRUgsT0FBTztRQUNQLElBQUksQ0FBQztZQUNILE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2xELFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ2QsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsT0FBTyxFQUFFLFlBQVk7Z0JBQ3JCLFFBQVEsRUFBRSxRQUFRO2FBQ25CLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxhQUFhO1FBQ2IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsSUFBQSx3QkFBUSxFQUFDLGdCQUFnQixDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakUsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDZCxPQUFPLEVBQUUsWUFBWTtnQkFDckIsT0FBTyxFQUFFLFlBQVksV0FB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Yy9taWRkbGV3YXJlL2NvbnRleHQtaW5qZWN0b3IudHMgLSDnjq/looPkuIrkuIvmlofms6jlhaXlmahcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dEluamVjdGlvbiB7XG4gIHNlY3Rpb246IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xuICBwcmlvcml0eT86ICdoaWdoJyB8ICdtZWRpdW0nIHwgJ2xvdyc7XG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0SW5qZWN0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHdvcmtzcGFjZVBhdGg6IHN0cmluZykge31cblxuICAvKipcbiAgICog6I635Y+W5b2T5YmN5bel5L2c546v5aKD55qE5LiK5LiL5paH5L+h5oGvXG4gICAqL1xuICBnZXRFbnZpcm9ubWVudENvbnRleHQoKTogQ29udGV4dEluamVjdGlvbltdIHtcbiAgICBjb25zdCBpbmplY3Rpb25zOiBDb250ZXh0SW5qZWN0aW9uW10gPSBbXTtcblxuICAgIC8vIOW3peS9nOebruW9lVxuICAgIGluamVjdGlvbnMucHVzaCh7XG4gICAgICBzZWN0aW9uOiAn5b2T5YmN5bel5L2c55uu5b2VJyxcbiAgICAgIGNvbnRlbnQ6IHRoaXMud29ya3NwYWNlUGF0aCxcbiAgICAgIHByaW9yaXR5OiAnaGlnaCcsXG4gICAgfSk7XG5cbiAgICAvLyDnm67lvZXnu5PmnoRcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlyU3RydWN0dXJlID0gdGhpcy5nZXREaXJlY3RvcnlTdHJ1Y3R1cmUoKTtcbiAgICAgIGluamVjdGlvbnMucHVzaCh7XG4gICAgICAgIHNlY3Rpb246ICfpobnnm67nu5PmnoQnLFxuICAgICAgICBjb250ZW50OiBkaXJTdHJ1Y3R1cmUsXG4gICAgICAgIHByaW9yaXR5OiAnbWVkaXVtJyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDlv73nlaXplJnor69cbiAgICB9XG5cbiAgICAvLyBOb2RlLmpzIOeJiOacrFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBub2RlVmVyc2lvbiA9IGV4ZWNTeW5jKCdub2RlIC0tdmVyc2lvbicpLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgaW5qZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgc2VjdGlvbjogJ05vZGUuanMg546v5aKDJyxcbiAgICAgICAgY29udGVudDogYE5vZGUuanM6ICR7bm9kZVZlcnNpb259YCxcbiAgICAgICAgcHJpb3JpdHk6ICdtZWRpdW0nLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIOW/veeVpemUmeivr1xuICAgIH1cblxuICAgIC8vIOWPr+eUqOeahOWFqOWxgOWRveS7pFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb21tYW5kcyA9IHRoaXMuZ2V0QXZhaWxhYmxlQ29tbWFuZHMoKTtcbiAgICAgIGluamVjdGlvbnMucHVzaCh7XG4gICAgICAgIHNlY3Rpb246ICflj6/nlKjlkb3ku6QnLFxuICAgICAgICBjb250ZW50OiBjb21tYW5kcyxcbiAgICAgICAgcHJpb3JpdHk6ICdsb3cnLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIOW/veeVpemUmeivr1xuICAgIH1cblxuICAgIHJldHVybiBpbmplY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluebruW9lee7k+aehO+8iOWPquaYvuekuiBNYXJrZG93biDlkozphY3nva7mlofku7bvvIlcbiAgICovXG4gIHByaXZhdGUgZ2V0RGlyZWN0b3J5U3RydWN0dXJlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbWF4RGVwdGggPSAzO1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnN0IHNjYW5EaXIgPSAoZGlyOiBzdHJpbmcsIGRlcHRoOiBudW1iZXIsIHByZWZpeDogc3RyaW5nID0gJycpOiB2b2lkID0+IHtcbiAgICAgIGlmIChkZXB0aCA+IG1heERlcHRoKSByZXR1cm47XG5cbiAgICAgIGxldCBpdGVtczogc3RyaW5nW107XG4gICAgICB0cnkge1xuICAgICAgICBpdGVtcyA9IGZzLnJlYWRkaXJTeW5jKGRpcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIOi/h+a7pO+8muWPquaYvuekuiAubWQsIC5qc29uLCAuanMsIC50cyDmlofku7bvvIzot7Pov4cgbm9kZV9tb2R1bGVzLCAuZ2l0LCBkaXN0XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgaWYgKFsnbm9kZV9tb2R1bGVzJywgJy5naXQnLCAnZGlzdCcsICcuRFNfU3RvcmUnXS5pbmNsdWRlcyhpdGVtKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoaXRlbSk7XG4gICAgICAgIGNvbnN0IGlzUmVsZXZhbnQgPSBbJy5tZCcsICcuanNvbicsICcuanMnLCAnLnRzJywgJy5zaCddLmluY2x1ZGVzKGV4dCk7XG4gICAgICAgIGNvbnN0IGlzRGlyID0gZnMuc3RhdFN5bmMocGF0aC5qb2luKGRpciwgaXRlbSkpLmlzRGlyZWN0b3J5KCk7XG4gICAgICAgIHJldHVybiBpc1JlbGV2YW50IHx8IGlzRGlyO1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBmaWx0ZXJlZCkge1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGl0ZW0pO1xuICAgICAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGAke3ByZWZpeH0ke2l0ZW19L2ApO1xuICAgICAgICAgIHNjYW5EaXIoZnVsbFBhdGgsIGRlcHRoICsgMSwgcHJlZml4ICsgJyAgJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goYCR7cHJlZml4fSR7aXRlbX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBzY2FuRGlyKHRoaXMud29ya3NwYWNlUGF0aCwgMCk7XG4gICAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blj6/nlKjnmoTlhajlsYDlkb3ku6RcbiAgICovXG4gIHByaXZhdGUgZ2V0QXZhaWxhYmxlQ29tbWFuZHMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21tYW5kcyA9IFtcbiAgICAgICdub2RlJywgJ25wbScsICducHgnLFxuICAgICAgJ2dpdCcsXG4gICAgICAnY3VybCcsICd3Z2V0JyxcbiAgICAgICdqcScsXG4gICAgICAnb3BlbmNsYXcnLFxuICAgIF07XG5cbiAgICBjb25zdCBhdmFpbGFibGU6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBjbWQgb2YgY29tbWFuZHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSBleGVjU3luYyhgJHtjbWR9IC0tdmVyc2lvbmAsIHsgc3RkaW86IFsncGlwZScsICdwaXBlJywgJ2lnbm9yZSddIH0pXG4gICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgLnNwbGl0KCdcXG4nKVswXTtcbiAgICAgICAgYXZhaWxhYmxlLnB1c2goYCR7Y21kfTogJHt2ZXJzaW9ufWApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8g5ZG95Luk5LiN5Y+v55SoXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF2YWlsYWJsZS5qb2luKCdcXG4nKSB8fCAn5peg5Y+v55So5ZG95LukJztcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLzlvI/ljJbkuLrlj6/ms6jlhaXnmoTkuIrkuIvmloflrZfnrKbkuLJcbiAgICovXG4gIGZvcm1hdEZvckluamVjdGlvbihjb250ZXh0cz86IENvbnRleHRJbmplY3Rpb25bXSk6IHN0cmluZyB7XG4gICAgY29uc3QgY3R4ID0gY29udGV4dHMgfHwgdGhpcy5nZXRFbnZpcm9ubWVudENvbnRleHQoKTtcbiAgICBcbiAgICBsZXQgb3V0cHV0ID0gJyMjIOW9k+WJjeeOr+Wig+S4iuS4i+aWh1xcblxcbic7XG4gICAgY3R4LmZvckVhY2goYyA9PiB7XG4gICAgICBvdXRwdXQgKz0gYCMjIyAke2Muc2VjdGlvbn1cXG5cXGBcXGBcXGBcXG4ke2MuY29udGVudH1cXG5cXGBcXGBcXGBcXG5cXG5gO1xuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export { LoopDetector } from './loop-detector';
2
+ export { TraceLogger } from './trace-logger';
3
+ export type { TraceEntry } from './trace-logger';
4
+ export { ContextInjector } from './context-injector';
5
+ export type { ContextInjection } from './context-injector';
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContextInjector = exports.TraceLogger = exports.LoopDetector = void 0;
4
+ // src/middleware/index.ts
5
+ var loop_detector_1 = require("./loop-detector");
6
+ Object.defineProperty(exports, "LoopDetector", { enumerable: true, get: function () { return loop_detector_1.LoopDetector; } });
7
+ var trace_logger_1 = require("./trace-logger");
8
+ Object.defineProperty(exports, "TraceLogger", { enumerable: true, get: function () { return trace_logger_1.TraceLogger; } });
9
+ var context_injector_1 = require("./context-injector");
10
+ Object.defineProperty(exports, "ContextInjector", { enumerable: true, get: function () { return context_injector_1.ContextInjector; } });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9taWRkbGV3YXJlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDBCQUEwQjtBQUMxQixpREFBK0M7QUFBdEMsNkdBQUEsWUFBWSxPQUFBO0FBQ3JCLCtDQUE2QztBQUFwQywyR0FBQSxXQUFXLE9BQUE7QUFFcEIsdURBQXFEO0FBQTVDLG1IQUFBLGVBQWUsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNyYy9taWRkbGV3YXJlL2luZGV4LnRzXG5leHBvcnQgeyBMb29wRGV0ZWN0b3IgfSBmcm9tICcuL2xvb3AtZGV0ZWN0b3InO1xuZXhwb3J0IHsgVHJhY2VMb2dnZXIgfSBmcm9tICcuL3RyYWNlLWxvZ2dlcic7XG5leHBvcnQgdHlwZSB7IFRyYWNlRW50cnkgfSBmcm9tICcuL3RyYWNlLWxvZ2dlcic7XG5leHBvcnQgeyBDb250ZXh0SW5qZWN0b3IgfSBmcm9tICcuL2NvbnRleHQtaW5qZWN0b3InO1xuZXhwb3J0IHR5cGUgeyBDb250ZXh0SW5qZWN0aW9uIH0gZnJvbSAnLi9jb250ZXh0LWluamVjdG9yJztcbiJdfQ==
@@ -0,0 +1,18 @@
1
+ export interface LoopDetectorConfig {
2
+ limit?: number;
3
+ windowMs?: number;
4
+ warningMessage?: string;
5
+ }
6
+ export declare class LoopDetector {
7
+ private workspacePath;
8
+ private fileEditCounts;
9
+ private stateFilePath;
10
+ private config;
11
+ constructor(workspacePath: string, config?: LoopDetectorConfig);
12
+ private loadState;
13
+ private saveState;
14
+ onFileEdit(filePath: string): string | null;
15
+ reset(filePath?: string): void;
16
+ getStats(): Record<string, number>;
17
+ getConfig(): Required<LoopDetectorConfig>;
18
+ }