@hddz/plugin-harness 0.2.0 → 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.
- package/dist/core/auditors/index.d.ts +2 -0
- package/dist/core/auditors/index.js +7 -0
- package/dist/core/auditors/skill-auditor.d.ts +72 -0
- package/dist/core/auditors/skill-auditor.js +488 -0
- package/dist/core/index.d.ts +22 -0
- package/dist/core/index.js +47 -0
- package/dist/core/loggers/config-logger.d.ts +25 -0
- package/dist/core/loggers/config-logger.js +139 -0
- package/dist/core/loggers/index.d.ts +4 -0
- package/dist/core/loggers/index.js +9 -0
- package/dist/core/loggers/operation-logger.d.ts +23 -0
- package/dist/core/loggers/operation-logger.js +125 -0
- package/dist/core/middleware/context-injector.d.ts +25 -0
- package/dist/core/middleware/context-injector.js +174 -0
- package/dist/core/middleware/index.d.ts +5 -0
- package/dist/core/middleware/index.js +11 -0
- package/dist/core/middleware/loop-detector.d.ts +18 -0
- package/dist/core/middleware/loop-detector.js +125 -0
- package/dist/core/middleware/trace-logger.d.ts +34 -0
- package/dist/core/middleware/trace-logger.js +141 -0
- package/dist/core/utils/file.d.ts +28 -0
- package/dist/core/utils/file.js +104 -0
- package/dist/core/utils/format.d.ts +16 -0
- package/dist/core/utils/format.js +60 -0
- package/dist/core/utils/index.d.ts +2 -0
- package/dist/core/utils/index.js +14 -0
- package/dist/core/validators/config-validator.d.ts +25 -0
- package/dist/core/validators/config-validator.js +235 -0
- package/dist/core/validators/index.d.ts +2 -0
- package/dist/core/validators/index.js +7 -0
- package/dist/index.js +8 -8
- package/package.json +2 -4
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// src/index.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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
15
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.createHarness = createHarness;
|
|
19
|
+
exports.createConfigValidator = createConfigValidator;
|
|
20
|
+
__exportStar(require("./middleware"), exports);
|
|
21
|
+
__exportStar(require("./validators"), exports);
|
|
22
|
+
__exportStar(require("./loggers"), exports);
|
|
23
|
+
__exportStar(require("./utils"), exports);
|
|
24
|
+
__exportStar(require("./auditors"), exports);
|
|
25
|
+
// 便捷工厂函数
|
|
26
|
+
const loop_detector_1 = require("./middleware/loop-detector");
|
|
27
|
+
const trace_logger_1 = require("./middleware/trace-logger");
|
|
28
|
+
const context_injector_1 = require("./middleware/context-injector");
|
|
29
|
+
const config_validator_1 = require("./validators/config-validator");
|
|
30
|
+
const config_logger_1 = require("./loggers/config-logger");
|
|
31
|
+
const operation_logger_1 = require("./loggers/operation-logger");
|
|
32
|
+
function createHarness(workspacePath) {
|
|
33
|
+
return {
|
|
34
|
+
loopDetector: new loop_detector_1.LoopDetector(workspacePath),
|
|
35
|
+
traceLogger: new trace_logger_1.TraceLogger(workspacePath),
|
|
36
|
+
contextInjector: new context_injector_1.ContextInjector(workspacePath),
|
|
37
|
+
configValidator: new config_validator_1.ConfigValidator(workspacePath),
|
|
38
|
+
configLogger: new config_logger_1.ConfigLogger(workspacePath),
|
|
39
|
+
operationLogger: new operation_logger_1.OperationLogger(workspacePath),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// 便捷导出(用于包装层)
|
|
43
|
+
function createConfigValidator() {
|
|
44
|
+
return new config_validator_1.ConfigValidator(process.cwd());
|
|
45
|
+
}
|
|
46
|
+
exports.default = createHarness;
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEscUJBQXFCOzs7Ozs7Ozs7Ozs7Ozs7O0FBeUJyQixzQ0FTQztBQUdELHNEQUVDO0FBckNELCtDQUE2QjtBQUM3QiwrQ0FBNkI7QUFDN0IsNENBQTBCO0FBQzFCLDBDQUF3QjtBQUN4Qiw2Q0FBMkI7QUFFM0IsU0FBUztBQUNULDhEQUEwRDtBQUMxRCw0REFBd0Q7QUFDeEQsb0VBQWdFO0FBQ2hFLG9FQUFnRTtBQUNoRSwyREFBdUQ7QUFDdkQsaUVBQTZEO0FBVzdELFNBQWdCLGFBQWEsQ0FBQyxhQUFxQjtJQUNqRCxPQUFPO1FBQ0wsWUFBWSxFQUFFLElBQUksNEJBQVksQ0FBQyxhQUFhLENBQUM7UUFDN0MsV0FBVyxFQUFFLElBQUksMEJBQVcsQ0FBQyxhQUFhLENBQUM7UUFDM0MsZUFBZSxFQUFFLElBQUksa0NBQWUsQ0FBQyxhQUFhLENBQUM7UUFDbkQsZUFBZSxFQUFFLElBQUksa0NBQWUsQ0FBQyxhQUFhLENBQUM7UUFDbkQsWUFBWSxFQUFFLElBQUksNEJBQVksQ0FBQyxhQUFhLENBQUM7UUFDN0MsZUFBZSxFQUFFLElBQUksa0NBQWUsQ0FBQyxhQUFhLENBQUM7S0FDcEQsQ0FBQztBQUNKLENBQUM7QUFFRCxjQUFjO0FBQ2QsU0FBZ0IscUJBQXFCO0lBQ25DLE9BQU8sSUFBSSxrQ0FBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxrQkFBZSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvaW5kZXgudHMgLSDkuLvlhaXlj6NcblxuZXhwb3J0ICogZnJvbSAnLi9taWRkbGV3YXJlJztcbmV4cG9ydCAqIGZyb20gJy4vdmFsaWRhdG9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2xvZ2dlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL2F1ZGl0b3JzJztcblxuLy8g5L6/5o235bel5Y6C5Ye95pWwXG5pbXBvcnQgeyBMb29wRGV0ZWN0b3IgfSBmcm9tICcuL21pZGRsZXdhcmUvbG9vcC1kZXRlY3Rvcic7XG5pbXBvcnQgeyBUcmFjZUxvZ2dlciB9IGZyb20gJy4vbWlkZGxld2FyZS90cmFjZS1sb2dnZXInO1xuaW1wb3J0IHsgQ29udGV4dEluamVjdG9yIH0gZnJvbSAnLi9taWRkbGV3YXJlL2NvbnRleHQtaW5qZWN0b3InO1xuaW1wb3J0IHsgQ29uZmlnVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3JzL2NvbmZpZy12YWxpZGF0b3InO1xuaW1wb3J0IHsgQ29uZmlnTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXJzL2NvbmZpZy1sb2dnZXInO1xuaW1wb3J0IHsgT3BlcmF0aW9uTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXJzL29wZXJhdGlvbi1sb2dnZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhhcm5lc3Mge1xuICBsb29wRGV0ZWN0b3I6IExvb3BEZXRlY3RvcjtcbiAgdHJhY2VMb2dnZXI6IFRyYWNlTG9nZ2VyO1xuICBjb250ZXh0SW5qZWN0b3I6IENvbnRleHRJbmplY3RvcjtcbiAgY29uZmlnVmFsaWRhdG9yOiBDb25maWdWYWxpZGF0b3I7XG4gIGNvbmZpZ0xvZ2dlcjogQ29uZmlnTG9nZ2VyO1xuICBvcGVyYXRpb25Mb2dnZXI6IE9wZXJhdGlvbkxvZ2dlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhhcm5lc3Mod29ya3NwYWNlUGF0aDogc3RyaW5nKTogSGFybmVzcyB7XG4gIHJldHVybiB7XG4gICAgbG9vcERldGVjdG9yOiBuZXcgTG9vcERldGVjdG9yKHdvcmtzcGFjZVBhdGgpLFxuICAgIHRyYWNlTG9nZ2VyOiBuZXcgVHJhY2VMb2dnZXIod29ya3NwYWNlUGF0aCksXG4gICAgY29udGV4dEluamVjdG9yOiBuZXcgQ29udGV4dEluamVjdG9yKHdvcmtzcGFjZVBhdGgpLFxuICAgIGNvbmZpZ1ZhbGlkYXRvcjogbmV3IENvbmZpZ1ZhbGlkYXRvcih3b3Jrc3BhY2VQYXRoKSxcbiAgICBjb25maWdMb2dnZXI6IG5ldyBDb25maWdMb2dnZXIod29ya3NwYWNlUGF0aCksXG4gICAgb3BlcmF0aW9uTG9nZ2VyOiBuZXcgT3BlcmF0aW9uTG9nZ2VyKHdvcmtzcGFjZVBhdGgpLFxuICB9O1xufVxuXG4vLyDkvr/mjbflr7zlh7rvvIjnlKjkuo7ljIXoo4XlsYLvvIlcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25maWdWYWxpZGF0b3IoKTogQ29uZmlnVmFsaWRhdG9yIHtcbiAgcmV0dXJuIG5ldyBDb25maWdWYWxpZGF0b3IocHJvY2Vzcy5jd2QoKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUhhcm5lc3M7XG4iXX0=
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface ConfigChange {
|
|
2
|
+
timestamp: string;
|
|
3
|
+
modifier: string;
|
|
4
|
+
file: string;
|
|
5
|
+
changes: Array<{
|
|
6
|
+
field: string;
|
|
7
|
+
oldValue: any;
|
|
8
|
+
newValue: any;
|
|
9
|
+
}>;
|
|
10
|
+
reason: string;
|
|
11
|
+
verified: boolean;
|
|
12
|
+
gatewayRestarted: boolean;
|
|
13
|
+
sessionId?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class ConfigLogger {
|
|
16
|
+
private workspacePath;
|
|
17
|
+
private logFilePath;
|
|
18
|
+
constructor(workspacePath: string);
|
|
19
|
+
log(change: Omit<ConfigChange, 'timestamp'>): void;
|
|
20
|
+
private formatEntry;
|
|
21
|
+
private truncateValue;
|
|
22
|
+
getRecentChanges(limit?: number): ConfigChange[];
|
|
23
|
+
private parseEntry;
|
|
24
|
+
exportToJson(outputPath: string): void;
|
|
25
|
+
}
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLWxvZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL2xvZ2dlcnMvY29uZmlnLWxvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsd0NBQXdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFeEMsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQWlCN0IsTUFBYSxZQUFZO0lBR0g7SUFGWixXQUFXLENBQVM7SUFFNUIsWUFBb0IsYUFBcUI7UUFBckIsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM1QixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFFM0QsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3JDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBQyxNQUF1QztRQUN6QyxNQUFNLFVBQVUsR0FBaUI7WUFDL0IsR0FBRyxNQUFNO1lBQ1QsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1NBQ3BDLENBQUM7UUFFRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU8sV0FBVyxDQUFDLE1BQW9CO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXRFLElBQUksS0FBSyxHQUFHLE1BQU0sT0FBTyxJQUFJLENBQUM7UUFDOUIsS0FBSyxJQUFJLGNBQWMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDO1FBQzNDLEtBQUssSUFBSSxhQUFhLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQztRQUN0QyxLQUFLLElBQUksYUFBYSxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUM7UUFDeEMsS0FBSyxJQUFJLGFBQWEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQztRQUM1RCxLQUFLLElBQUkscUJBQXFCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQztRQUMxRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQixLQUFLLElBQUksZ0JBQWdCLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQztRQUNoRCxDQUFDO1FBQ0QsS0FBSyxJQUFJLGNBQWMsQ0FBQztRQUV4QixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLEtBQUssSUFBSSxhQUFhLENBQUM7UUFDekIsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDOUIsS0FBSyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUM7Z0JBQ3RDLEtBQUssSUFBSSxhQUFhLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQzNELEtBQUssSUFBSSxhQUFhLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDN0QsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsS0FBSyxJQUFJLFdBQVcsQ0FBQztRQUNyQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBVSxFQUFFLFlBQW9CLEdBQUc7UUFDdkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksU0FBUztZQUFFLE9BQU8sR0FBRyxDQUFDO1FBQ3hDLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzdDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFnQixFQUFFO1FBQ2pDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVoRCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTyxVQUFVLENBQUMsS0FBYTtRQUM5QixPQUFPO1FBQ1AsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBaUI7WUFDM0IsU0FBUyxFQUFFLEVBQUU7WUFDYixRQUFRLEVBQUUsRUFBRTtZQUNaLElBQUksRUFBRSxFQUFFO1lBQ1IsT0FBTyxFQUFFLEVBQUU7WUFDWCxNQUFNLEVBQUUsRUFBRTtZQUNWLFFBQVEsRUFBRSxLQUFLO1lBQ2YsZ0JBQWdCLEVBQUUsS0FBSztTQUN4QixDQUFDO1FBRUYsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwRCxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakQsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDekIsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxZQUFZLENBQUMsVUFBa0I7UUFDN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7Q0FDRjtBQXZHRCxvQ0F1R0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvbG9nZ2Vycy9jb25maWctbG9nZ2VyLnRzIC0g6YWN572u5Y+Y5pu05pel5b+XXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnQ2hhbmdlIHtcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIG1vZGlmaWVyOiBzdHJpbmc7ICAgICAgICAgLy8g5L+u5pS56ICF77yI5aaCIFwi6JOd5bGxXCLvvIlcbiAgZmlsZTogc3RyaW5nOyAgICAgICAgICAgICAvLyDkv67mlLnnmoTmlofku7ZcbiAgY2hhbmdlczogQXJyYXk8e1xuICAgIGZpZWxkOiBzdHJpbmc7XG4gICAgb2xkVmFsdWU6IGFueTtcbiAgICBuZXdWYWx1ZTogYW55O1xuICB9PjtcbiAgcmVhc29uOiBzdHJpbmc7ICAgICAgICAgICAvLyDlj5jmm7Tljp/lm6BcbiAgdmVyaWZpZWQ6IGJvb2xlYW47ICAgICAgICAvLyDmmK/lkKbpqozor4HpgJrov4dcbiAgZ2F0ZXdheVJlc3RhcnRlZDogYm9vbGVhbjsgLy8g5piv5ZCm6YeN5ZCvIEdhdGV3YXlcbiAgc2Vzc2lvbklkPzogc3RyaW5nOyAgICAgICAvLyDkvJror50gSURcbn1cblxuZXhwb3J0IGNsYXNzIENvbmZpZ0xvZ2dlciB7XG4gIHByaXZhdGUgbG9nRmlsZVBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHdvcmtzcGFjZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IGxvZ3NEaXIgPSBwYXRoLmpvaW4od29ya3NwYWNlUGF0aCwgJ2xvZ3MnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMobG9nc0RpcikpIHtcbiAgICAgIGZzLm1rZGlyU3luYyhsb2dzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgdGhpcy5sb2dGaWxlUGF0aCA9IHBhdGguam9pbihsb2dzRGlyLCAnY29uZmlnLWNoYW5nZXMubWQnKTtcbiAgICBcbiAgICAvLyDliJ3lp4vljJbml6Xlv5fmlofku7bvvIjlpoLmnpzkuI3lrZjlnKjvvIlcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5sb2dGaWxlUGF0aCkpIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5sb2dGaWxlUGF0aCwgJyMg6YWN572u5Y+Y5pu05pel5b+XXFxuXFxuJyk7XG4gICAgfVxuICB9XG5cbiAgbG9nKGNoYW5nZTogT21pdDxDb25maWdDaGFuZ2UsICd0aW1lc3RhbXAnPik6IHZvaWQge1xuICAgIGNvbnN0IGZ1bGxDaGFuZ2U6IENvbmZpZ0NoYW5nZSA9IHtcbiAgICAgIC4uLmNoYW5nZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG5cbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZm9ybWF0RW50cnkoZnVsbENoYW5nZSk7XG4gICAgZnMuYXBwZW5kRmlsZVN5bmModGhpcy5sb2dGaWxlUGF0aCwgZW50cnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRFbnRyeShjaGFuZ2U6IENvbmZpZ0NoYW5nZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGNoYW5nZS50aW1lc3RhbXApO1xuICAgIGNvbnN0IGRhdGVTdHIgPSBkYXRlLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgnVCcsICcgJykuc3Vic3RyaW5nKDAsIDE5KTtcblxuICAgIGxldCBlbnRyeSA9IGAjIyAke2RhdGVTdHJ9XFxuYDtcbiAgICBlbnRyeSArPSBgLSAqKuS/ruaUueiAhSoqOiAke2NoYW5nZS5tb2RpZmllcn1cXG5gO1xuICAgIGVudHJ5ICs9IGAtICoq5paH5Lu2Kio6ICR7Y2hhbmdlLmZpbGV9XFxuYDtcbiAgICBlbnRyeSArPSBgLSAqKuWOn+WboCoqOiAke2NoYW5nZS5yZWFzb259XFxuYDtcbiAgICBlbnRyeSArPSBgLSAqKumqjOivgSoqOiAke2NoYW5nZS52ZXJpZmllZCA/ICfinIUg6YCa6L+HJyA6ICfinYwg5aSx6LSlJ31cXG5gO1xuICAgIGVudHJ5ICs9IGAtICoqR2F0ZXdheSDph43lkK8qKjogJHtjaGFuZ2UuZ2F0ZXdheVJlc3RhcnRlZCA/ICfinIUg5pivJyA6ICfinYwg5ZCmJ31cXG5gO1xuICAgIGlmIChjaGFuZ2Uuc2Vzc2lvbklkKSB7XG4gICAgICBlbnRyeSArPSBgLSAqKuS8muivnSBJRCoqOiAke2NoYW5nZS5zZXNzaW9uSWR9XFxuYDtcbiAgICB9XG4gICAgZW50cnkgKz0gYFxcbiMjIyDlj5jmm7Tor6bmg4VcXG5gO1xuICAgIFxuICAgIGlmIChjaGFuZ2UuY2hhbmdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudHJ5ICs9ICdf5peg5YW35L2T5Y+Y5pu06K6w5b2VX1xcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZS5jaGFuZ2VzLmZvckVhY2goKGMsIGkpID0+IHtcbiAgICAgICAgZW50cnkgKz0gYCR7aSArIDF9LiBcXGAke2MuZmllbGR9XFxgXFxuYDtcbiAgICAgICAgZW50cnkgKz0gYCAgIC0g5pen5YC877yaXFxgJHt0aGlzLnRydW5jYXRlVmFsdWUoYy5vbGRWYWx1ZSl9XFxgXFxuYDtcbiAgICAgICAgZW50cnkgKz0gYCAgIC0g5paw5YC877yaXFxgJHt0aGlzLnRydW5jYXRlVmFsdWUoYy5uZXdWYWx1ZSl9XFxgXFxuYDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGVudHJ5ICs9IGBcXG4tLS1cXG5cXG5gO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIHByaXZhdGUgdHJ1bmNhdGVWYWx1ZSh2YWx1ZTogYW55LCBtYXhMZW5ndGg6IG51bWJlciA9IDEwMCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGlmIChzdHIubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIHN0cjtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpICsgJy4uLic7XG4gIH1cblxuICBnZXRSZWNlbnRDaGFuZ2VzKGxpbWl0OiBudW1iZXIgPSAxMCk6IENvbmZpZ0NoYW5nZVtdIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5sb2dGaWxlUGF0aCkpIHJldHVybiBbXTtcbiAgICBcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRoaXMubG9nRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgZW50cmllcyA9IGNvbnRlbnQuc3BsaXQoJyMjICcpLnNsaWNlKDEpO1xuICAgIHJldHVybiBlbnRyaWVzLnNsaWNlKC1saW1pdCkubWFwKGVudHJ5ID0+IHRoaXMucGFyc2VFbnRyeShlbnRyeSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUVudHJ5KGVudHJ5OiBzdHJpbmcpOiBDb25maWdDaGFuZ2Uge1xuICAgIC8vIOeugOWMluino+aekFxuICAgIGNvbnN0IGxpbmVzID0gZW50cnkuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IGNoYW5nZTogQ29uZmlnQ2hhbmdlID0ge1xuICAgICAgdGltZXN0YW1wOiAnJyxcbiAgICAgIG1vZGlmaWVyOiAnJyxcbiAgICAgIGZpbGU6ICcnLFxuICAgICAgY2hhbmdlczogW10sXG4gICAgICByZWFzb246ICcnLFxuICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgZ2F0ZXdheVJlc3RhcnRlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnLSAqKuS/ruaUueiAhSoqOiAnKSkge1xuICAgICAgICBjaGFuZ2UubW9kaWZpZXIgPSBsaW5lLnJlcGxhY2UoJy0gKirkv67mlLnogIUqKjogJywgJycpO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJy0gKirmlofku7YqKjogJykpIHtcbiAgICAgICAgY2hhbmdlLmZpbGUgPSBsaW5lLnJlcGxhY2UoJy0gKirmlofku7YqKjogJywgJycpO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoJy0gKirljp/lm6AqKjogJykpIHtcbiAgICAgICAgY2hhbmdlLnJlYXNvbiA9IGxpbmUucmVwbGFjZSgnLSAqKuWOn+WboCoqOiAnLCAnJyk7XG4gICAgICB9IGVsc2UgaWYgKGxpbmUuaW5jbHVkZXMoJ+KchSDpgJrov4cnKSkge1xuICAgICAgICBjaGFuZ2UudmVyaWZpZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLmluY2x1ZGVzKCfinIUg5pivJykpIHtcbiAgICAgICAgY2hhbmdlLmdhdGV3YXlSZXN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2U7XG4gIH1cblxuICBleHBvcnRUb0pzb24ob3V0cHV0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuZ2V0UmVjZW50Q2hhbmdlcygxMDApO1xuICAgIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgSlNPTi5zdHJpbmdpZnkoY2hhbmdlcywgbnVsbCwgMikpO1xuICB9XG59XG4iXX0=
|
|
@@ -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==
|