@mako10k/shell-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +114 -0
- package/dist/backoffice/index.d.ts +2 -0
- package/dist/backoffice/index.d.ts.map +1 -0
- package/dist/backoffice/index.js +47 -0
- package/dist/backoffice/index.js.map +1 -0
- package/dist/backoffice/server.d.ts +45 -0
- package/dist/backoffice/server.d.ts.map +1 -0
- package/dist/backoffice/server.js +610 -0
- package/dist/backoffice/server.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +525 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/config-manager.d.ts +80 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +218 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/enhanced-history-manager.d.ts +84 -0
- package/dist/core/enhanced-history-manager.d.ts.map +1 -0
- package/dist/core/enhanced-history-manager.js +319 -0
- package/dist/core/enhanced-history-manager.js.map +1 -0
- package/dist/core/file-manager.d.ts +79 -0
- package/dist/core/file-manager.d.ts.map +1 -0
- package/dist/core/file-manager.js +338 -0
- package/dist/core/file-manager.js.map +1 -0
- package/dist/core/file-storage-subscriber.d.ts +38 -0
- package/dist/core/file-storage-subscriber.d.ts.map +1 -0
- package/dist/core/file-storage-subscriber.js +132 -0
- package/dist/core/file-storage-subscriber.js.map +1 -0
- package/dist/core/monitoring-manager.d.ts +32 -0
- package/dist/core/monitoring-manager.d.ts.map +1 -0
- package/dist/core/monitoring-manager.js +296 -0
- package/dist/core/monitoring-manager.js.map +1 -0
- package/dist/core/process-manager.d.ts +105 -0
- package/dist/core/process-manager.d.ts.map +1 -0
- package/dist/core/process-manager.js +1374 -0
- package/dist/core/process-manager.js.map +1 -0
- package/dist/core/realtime-stream-subscriber.d.ts +93 -0
- package/dist/core/realtime-stream-subscriber.d.ts.map +1 -0
- package/dist/core/realtime-stream-subscriber.js +200 -0
- package/dist/core/realtime-stream-subscriber.js.map +1 -0
- package/dist/core/remote-http-client.d.ts +15 -0
- package/dist/core/remote-http-client.d.ts.map +1 -0
- package/dist/core/remote-http-client.js +60 -0
- package/dist/core/remote-http-client.js.map +1 -0
- package/dist/core/remote-process-service.d.ts +50 -0
- package/dist/core/remote-process-service.d.ts.map +1 -0
- package/dist/core/remote-process-service.js +20 -0
- package/dist/core/remote-process-service.js.map +1 -0
- package/dist/core/server-manager.d.ts +71 -0
- package/dist/core/server-manager.d.ts.map +1 -0
- package/dist/core/server-manager.js +680 -0
- package/dist/core/server-manager.js.map +1 -0
- package/dist/core/stream-publisher.d.ts +75 -0
- package/dist/core/stream-publisher.d.ts.map +1 -0
- package/dist/core/stream-publisher.js +127 -0
- package/dist/core/stream-publisher.js.map +1 -0
- package/dist/core/streaming-pipeline-reader.d.ts +67 -0
- package/dist/core/streaming-pipeline-reader.d.ts.map +1 -0
- package/dist/core/streaming-pipeline-reader.js +191 -0
- package/dist/core/streaming-pipeline-reader.js.map +1 -0
- package/dist/core/terminal-manager.d.ts +96 -0
- package/dist/core/terminal-manager.d.ts.map +1 -0
- package/dist/core/terminal-manager.js +515 -0
- package/dist/core/terminal-manager.js.map +1 -0
- package/dist/daemon/server.d.ts +8 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +416 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/uds-transport.d.ts +31 -0
- package/dist/daemon/uds-transport.d.ts.map +1 -0
- package/dist/daemon/uds-transport.js +149 -0
- package/dist/daemon/uds-transport.js.map +1 -0
- package/dist/executor/server.d.ts +20 -0
- package/dist/executor/server.d.ts.map +1 -0
- package/dist/executor/server.js +375 -0
- package/dist/executor/server.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/daemon-runtime.d.ts +4 -0
- package/dist/runtime/daemon-runtime.d.ts.map +1 -0
- package/dist/runtime/daemon-runtime.js +4 -0
- package/dist/runtime/daemon-runtime.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/tool-runtime.d.ts +52 -0
- package/dist/runtime/tool-runtime.d.ts.map +1 -0
- package/dist/runtime/tool-runtime.js +161 -0
- package/dist/runtime/tool-runtime.js.map +1 -0
- package/dist/security/chat-completion-adapter.d.ts +443 -0
- package/dist/security/chat-completion-adapter.d.ts.map +1 -0
- package/dist/security/chat-completion-adapter.js +475 -0
- package/dist/security/chat-completion-adapter.js.map +1 -0
- package/dist/security/enhanced-evaluator.d.ts +139 -0
- package/dist/security/enhanced-evaluator.d.ts.map +1 -0
- package/dist/security/enhanced-evaluator.js +1208 -0
- package/dist/security/enhanced-evaluator.js.map +1 -0
- package/dist/security/evaluator-types.d.ts +614 -0
- package/dist/security/evaluator-types.d.ts.map +1 -0
- package/dist/security/evaluator-types.js +124 -0
- package/dist/security/evaluator-types.js.map +1 -0
- package/dist/security/manager.d.ts +76 -0
- package/dist/security/manager.d.ts.map +1 -0
- package/dist/security/manager.js +445 -0
- package/dist/security/manager.js.map +1 -0
- package/dist/security/security-llm-prompt-generator.d.ts +105 -0
- package/dist/security/security-llm-prompt-generator.d.ts.map +1 -0
- package/dist/security/security-llm-prompt-generator.js +323 -0
- package/dist/security/security-llm-prompt-generator.js.map +1 -0
- package/dist/security/security-tools.d.ts +174 -0
- package/dist/security/security-tools.d.ts.map +1 -0
- package/dist/security/security-tools.js +159 -0
- package/dist/security/security-tools.js.map +1 -0
- package/dist/security/validator-criteria-manager.d.ts +47 -0
- package/dist/security/validator-criteria-manager.d.ts.map +1 -0
- package/dist/security/validator-criteria-manager.js +169 -0
- package/dist/security/validator-criteria-manager.js.map +1 -0
- package/dist/tools/shell-tools.d.ts +474 -0
- package/dist/tools/shell-tools.d.ts.map +1 -0
- package/dist/tools/shell-tools.js +861 -0
- package/dist/tools/shell-tools.js.map +1 -0
- package/dist/types/enhanced-security.d.ts +529 -0
- package/dist/types/enhanced-security.d.ts.map +1 -0
- package/dist/types/enhanced-security.js +286 -0
- package/dist/types/enhanced-security.js.map +1 -0
- package/dist/types/index.d.ts +282 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +158 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/quick-schemas.d.ts +177 -0
- package/dist/types/quick-schemas.d.ts.map +1 -0
- package/dist/types/quick-schemas.js +113 -0
- package/dist/types/quick-schemas.js.map +1 -0
- package/dist/types/response-schemas.d.ts +41 -0
- package/dist/types/response-schemas.d.ts.map +1 -0
- package/dist/types/response-schemas.js +41 -0
- package/dist/types/response-schemas.js.map +1 -0
- package/dist/types/schemas.d.ts +578 -0
- package/dist/types/schemas.d.ts.map +1 -0
- package/dist/types/schemas.js +498 -0
- package/dist/types/schemas.js.map +1 -0
- package/dist/utils/criteria-manager.d.ts +47 -0
- package/dist/utils/criteria-manager.d.ts.map +1 -0
- package/dist/utils/criteria-manager.js +228 -0
- package/dist/utils/criteria-manager.js.map +1 -0
- package/dist/utils/errors.d.ts +27 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +67 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/helpers.d.ts +85 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +400 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/json-repair.d.ts +23 -0
- package/dist/utils/json-repair.d.ts.map +1 -0
- package/dist/utils/json-repair.js +208 -0
- package/dist/utils/json-repair.js.map +1 -0
- package/dist/utils/process-utils.d.ts +31 -0
- package/dist/utils/process-utils.d.ts.map +1 -0
- package/dist/utils/process-utils.js +217 -0
- package/dist/utils/process-utils.js.map +1 -0
- package/dist/utils/server-helpers.d.ts +4 -0
- package/dist/utils/server-helpers.d.ts.map +1 -0
- package/dist/utils/server-helpers.js +10 -0
- package/dist/utils/server-helpers.js.map +1 -0
- package/dist/utils/sse.d.ts +2 -0
- package/dist/utils/sse.d.ts.map +1 -0
- package/dist/utils/sse.js +6 -0
- package/dist/utils/sse.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import * as fs from 'fs/promises';
|
|
3
|
+
import * as fsSync from 'fs';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import * as os from 'os';
|
|
6
|
+
// ID生成
|
|
7
|
+
export function generateId() {
|
|
8
|
+
return uuidv4();
|
|
9
|
+
}
|
|
10
|
+
// タイムスタンプ生成
|
|
11
|
+
export function getCurrentTimestamp() {
|
|
12
|
+
return new Date().toISOString();
|
|
13
|
+
}
|
|
14
|
+
// ファイルパスの検証
|
|
15
|
+
export function isValidPath(filePath, allowedPaths) {
|
|
16
|
+
try {
|
|
17
|
+
const resolvedPath = path.resolve(filePath);
|
|
18
|
+
// 基本的なセキュリティチェック
|
|
19
|
+
if (resolvedPath.includes('..')) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
// 許可されたパスのチェック
|
|
23
|
+
if (allowedPaths && allowedPaths.length > 0) {
|
|
24
|
+
return allowedPaths.some((allowedPath) => resolvedPath.startsWith(path.resolve(allowedPath)));
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// コマンドの検証
|
|
33
|
+
export function isValidCommand(command, allowedCommands, blockedCommands) {
|
|
34
|
+
const commandName = command.trim().split(/\s+/)[0];
|
|
35
|
+
if (!commandName) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
// ブロックされたコマンドのチェック
|
|
39
|
+
if (blockedCommands?.includes(commandName)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
// 許可されたコマンドのチェック
|
|
43
|
+
if (allowedCommands && allowedCommands.length > 0) {
|
|
44
|
+
return allowedCommands.includes(commandName);
|
|
45
|
+
}
|
|
46
|
+
// デフォルトで危険なコマンドをブロック
|
|
47
|
+
const dangerousCommands = [
|
|
48
|
+
'rm',
|
|
49
|
+
'rmdir',
|
|
50
|
+
'del',
|
|
51
|
+
'format',
|
|
52
|
+
'fdisk',
|
|
53
|
+
'mkfs',
|
|
54
|
+
'shutdown',
|
|
55
|
+
'reboot',
|
|
56
|
+
'halt',
|
|
57
|
+
'poweroff',
|
|
58
|
+
'sudo',
|
|
59
|
+
'su',
|
|
60
|
+
'chmod',
|
|
61
|
+
'chown',
|
|
62
|
+
'iptables',
|
|
63
|
+
'ufw',
|
|
64
|
+
'firewall-cmd',
|
|
65
|
+
];
|
|
66
|
+
return !dangerousCommands.includes(commandName);
|
|
67
|
+
}
|
|
68
|
+
// ファイルサイズの取得
|
|
69
|
+
export async function getFileSize(filePath) {
|
|
70
|
+
try {
|
|
71
|
+
const stats = await fs.stat(filePath);
|
|
72
|
+
return stats.size;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ディレクトリの作成
|
|
79
|
+
export async function ensureDirectory(dirPath) {
|
|
80
|
+
try {
|
|
81
|
+
await fs.access(dirPath);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// ディレクトリの作成(同期版)
|
|
88
|
+
export function ensureDirectorySync(dirPath) {
|
|
89
|
+
try {
|
|
90
|
+
fsSync.accessSync(dirPath);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
fsSync.mkdirSync(dirPath, { recursive: true });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// ファイルの安全な読み取り
|
|
97
|
+
export async function safeReadFile(filePath, offset = 0, size, encoding = 'utf-8') {
|
|
98
|
+
const stats = await fs.stat(filePath);
|
|
99
|
+
const totalSize = stats.size;
|
|
100
|
+
const fileHandle = await fs.open(filePath, 'r');
|
|
101
|
+
try {
|
|
102
|
+
const readSize = size ? Math.min(size, totalSize - offset) : totalSize - offset;
|
|
103
|
+
const buffer = Buffer.alloc(readSize);
|
|
104
|
+
await fileHandle.read(buffer, 0, readSize, offset);
|
|
105
|
+
const content = buffer.toString(encoding);
|
|
106
|
+
const isTruncated = size ? totalSize > offset + size : false;
|
|
107
|
+
return { content, totalSize, isTruncated };
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
await fileHandle.close();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// システム情報の取得
|
|
114
|
+
export function getSystemInfo() {
|
|
115
|
+
return {
|
|
116
|
+
platform: os.platform(),
|
|
117
|
+
arch: os.arch(),
|
|
118
|
+
hostname: os.hostname(),
|
|
119
|
+
loadavg: os.loadavg(),
|
|
120
|
+
totalmem: os.totalmem(),
|
|
121
|
+
freemem: os.freemem(),
|
|
122
|
+
uptime: os.uptime(),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// プロセス情報の取得
|
|
126
|
+
export function getProcessInfo() {
|
|
127
|
+
return {
|
|
128
|
+
pid: process.pid,
|
|
129
|
+
ppid: process.ppid,
|
|
130
|
+
platform: process.platform,
|
|
131
|
+
arch: process.arch,
|
|
132
|
+
version: process.version,
|
|
133
|
+
memoryUsage: process.memoryUsage(),
|
|
134
|
+
cpuUsage: process.cpuUsage(),
|
|
135
|
+
uptime: process.uptime(),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// 安全な実行環境の設定
|
|
139
|
+
export function getSafeEnvironment(baseEnv = {}, additionalEnv = {}) {
|
|
140
|
+
// 基本的な環境変数のみを許可
|
|
141
|
+
const safeBaseEnv = {
|
|
142
|
+
PATH: process.env['PATH'] || '',
|
|
143
|
+
HOME: process.env['HOME'] || '',
|
|
144
|
+
USER: process.env['USER'] || '',
|
|
145
|
+
SHELL: process.env['SHELL'] || '/bin/bash',
|
|
146
|
+
TERM: process.env['TERM'] || 'xterm-256color',
|
|
147
|
+
LANG: process.env['LANG'] || 'en_US.UTF-8',
|
|
148
|
+
TZ: process.env['TZ'] || 'UTC',
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
...safeBaseEnv,
|
|
152
|
+
...baseEnv,
|
|
153
|
+
...additionalEnv,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
// 文字列のサニタイゼーション
|
|
157
|
+
export function sanitizeString(input, maxLength = 1000) {
|
|
158
|
+
return input
|
|
159
|
+
.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '') // 制御文字を削除
|
|
160
|
+
.substring(0, maxLength);
|
|
161
|
+
}
|
|
162
|
+
// バイト数のフォーマット
|
|
163
|
+
export function formatBytes(bytes) {
|
|
164
|
+
if (bytes === 0)
|
|
165
|
+
return '0 Bytes';
|
|
166
|
+
const k = 1024;
|
|
167
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
|
|
168
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
169
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
170
|
+
}
|
|
171
|
+
// 実行時間のフォーマット
|
|
172
|
+
export function formatDuration(milliseconds) {
|
|
173
|
+
if (milliseconds < 1000) {
|
|
174
|
+
return `${milliseconds}ms`;
|
|
175
|
+
}
|
|
176
|
+
const seconds = Math.floor(milliseconds / 1000);
|
|
177
|
+
const minutes = Math.floor(seconds / 60);
|
|
178
|
+
const hours = Math.floor(minutes / 60);
|
|
179
|
+
if (hours > 0) {
|
|
180
|
+
return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
|
|
181
|
+
}
|
|
182
|
+
else if (minutes > 0) {
|
|
183
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
return `${seconds}s`;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// ログレベル
|
|
190
|
+
export var LogLevel;
|
|
191
|
+
(function (LogLevel) {
|
|
192
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
193
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
194
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
195
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
196
|
+
})(LogLevel || (LogLevel = {}));
|
|
197
|
+
// デフォルトログ設定
|
|
198
|
+
const defaultLogConfig = {
|
|
199
|
+
enableFileLogging: true,
|
|
200
|
+
logFilePath: './logs/mcp_server.log',
|
|
201
|
+
maxFileSize: 10 * 1024 * 1024, // 10MB
|
|
202
|
+
maxLogFiles: 5,
|
|
203
|
+
enableConsoleLogging: false, // MCP Serverでは標準出力を汚さない
|
|
204
|
+
};
|
|
205
|
+
let currentLogConfig = { ...defaultLogConfig };
|
|
206
|
+
// 内部ログストレージ
|
|
207
|
+
const logEntries = [];
|
|
208
|
+
const MAX_LOG_ENTRIES = 1000;
|
|
209
|
+
// ログファイル書き込み関数
|
|
210
|
+
async function writeToLogFile(entry) {
|
|
211
|
+
if (!currentLogConfig.enableFileLogging) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
// ログディレクトリを作成
|
|
216
|
+
const logDir = path.dirname(currentLogConfig.logFilePath);
|
|
217
|
+
await fs.mkdir(logDir, { recursive: true });
|
|
218
|
+
// ログエントリをフォーマット
|
|
219
|
+
const logLine = `${entry.timestamp} [${LogLevel[entry.level]}] ${entry.component || 'SYSTEM'}: ${entry.message}`;
|
|
220
|
+
const dataLine = entry.data ? ` | Data: ${JSON.stringify(entry.data)}` : '';
|
|
221
|
+
const fullLogLine = logLine + dataLine + '\n';
|
|
222
|
+
// ファイルに追記
|
|
223
|
+
await fs.appendFile(currentLogConfig.logFilePath, fullLogLine);
|
|
224
|
+
// ファイルサイズチェックとローテーション
|
|
225
|
+
await rotateLogFileIfNeeded();
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
// ファイルログエラーは内部でのみ記録(無限ループを避ける)
|
|
229
|
+
console.error('Failed to write to log file:', error);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// ログファイルローテーション
|
|
233
|
+
async function rotateLogFileIfNeeded() {
|
|
234
|
+
try {
|
|
235
|
+
const stats = await fs.stat(currentLogConfig.logFilePath);
|
|
236
|
+
if (stats.size > currentLogConfig.maxFileSize) {
|
|
237
|
+
// 古いログファイルを移動
|
|
238
|
+
for (let i = currentLogConfig.maxLogFiles - 1; i >= 1; i--) {
|
|
239
|
+
const oldFile = `${currentLogConfig.logFilePath}.${i}`;
|
|
240
|
+
const newFile = `${currentLogConfig.logFilePath}.${i + 1}`;
|
|
241
|
+
try {
|
|
242
|
+
await fs.access(oldFile);
|
|
243
|
+
if (i === currentLogConfig.maxLogFiles - 1) {
|
|
244
|
+
await fs.unlink(oldFile); // 最古のファイルを削除
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
await fs.rename(oldFile, newFile);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
// ファイルが存在しない場合は無視
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// 現在のログファイルを .1 に移動
|
|
255
|
+
await fs.rename(currentLogConfig.logFilePath, `${currentLogConfig.logFilePath}.1`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// ローテーションエラーは無視(ファイルが存在しない場合など)
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// ログ設定更新関数
|
|
263
|
+
export function updateLogConfig(config) {
|
|
264
|
+
currentLogConfig = { ...currentLogConfig, ...config };
|
|
265
|
+
}
|
|
266
|
+
// ログ設定取得関数
|
|
267
|
+
export function getLogConfig() {
|
|
268
|
+
return { ...currentLogConfig };
|
|
269
|
+
}
|
|
270
|
+
// ログ機能(標準出力に書き込まない)
|
|
271
|
+
export function internalLog(level, message, data, component) {
|
|
272
|
+
const entry = {
|
|
273
|
+
timestamp: getCurrentTimestamp(),
|
|
274
|
+
level,
|
|
275
|
+
message,
|
|
276
|
+
};
|
|
277
|
+
if (data !== undefined) {
|
|
278
|
+
entry.data = data;
|
|
279
|
+
}
|
|
280
|
+
if (component !== undefined) {
|
|
281
|
+
entry.component = component;
|
|
282
|
+
}
|
|
283
|
+
logEntries.push(entry);
|
|
284
|
+
// 古いログエントリを削除
|
|
285
|
+
if (logEntries.length > MAX_LOG_ENTRIES) {
|
|
286
|
+
logEntries.shift();
|
|
287
|
+
}
|
|
288
|
+
// ファイルログ書き込み(非同期、エラーは無視)
|
|
289
|
+
if (currentLogConfig.enableFileLogging) {
|
|
290
|
+
writeToLogFile(entry).catch(() => {
|
|
291
|
+
// ファイル書き込みエラーは無視(無限ループを避ける)
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
// コンソールログ出力
|
|
295
|
+
if (currentLogConfig.enableConsoleLogging) {
|
|
296
|
+
const logMessage = `${entry.timestamp} [${LogLevel[entry.level]}] ${entry.component || 'SYSTEM'}: ${entry.message}`;
|
|
297
|
+
switch (level) {
|
|
298
|
+
case LogLevel.ERROR:
|
|
299
|
+
console.error(logMessage, entry.data);
|
|
300
|
+
break;
|
|
301
|
+
case LogLevel.WARN:
|
|
302
|
+
console.warn(logMessage, entry.data);
|
|
303
|
+
break;
|
|
304
|
+
case LogLevel.INFO:
|
|
305
|
+
console.info(logMessage, entry.data);
|
|
306
|
+
break;
|
|
307
|
+
case LogLevel.DEBUG:
|
|
308
|
+
default:
|
|
309
|
+
console.log(logMessage, entry.data);
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// ログ取得機能
|
|
315
|
+
export function getLogEntries(level, component, limit) {
|
|
316
|
+
let filtered = logEntries;
|
|
317
|
+
if (level !== undefined) {
|
|
318
|
+
filtered = filtered.filter((entry) => entry.level >= level);
|
|
319
|
+
}
|
|
320
|
+
if (component) {
|
|
321
|
+
filtered = filtered.filter((entry) => entry.component === component);
|
|
322
|
+
}
|
|
323
|
+
if (limit) {
|
|
324
|
+
filtered = filtered.slice(-limit);
|
|
325
|
+
}
|
|
326
|
+
return filtered;
|
|
327
|
+
}
|
|
328
|
+
// 便利なログ関数
|
|
329
|
+
export const logger = {
|
|
330
|
+
debug: (message, data, component) => internalLog(LogLevel.DEBUG, message, data, component),
|
|
331
|
+
info: (message, data, component) => internalLog(LogLevel.INFO, message, data, component),
|
|
332
|
+
warn: (message, data, component) => internalLog(LogLevel.WARN, message, data, component),
|
|
333
|
+
error: (message, data, component) => internalLog(LogLevel.ERROR, message, data, component),
|
|
334
|
+
// ログ取得機能
|
|
335
|
+
getEntries: (level, component, limit) => getLogEntries(level, component, limit),
|
|
336
|
+
// ログ履歴取得(より詳細なフィルタリング)
|
|
337
|
+
getHistory: (options) => {
|
|
338
|
+
let filtered = logEntries;
|
|
339
|
+
if (options?.level !== undefined) {
|
|
340
|
+
const targetLevel = options.level;
|
|
341
|
+
filtered = filtered.filter((entry) => entry.level >= targetLevel);
|
|
342
|
+
}
|
|
343
|
+
if (options?.component) {
|
|
344
|
+
filtered = filtered.filter((entry) => entry.component === options.component);
|
|
345
|
+
}
|
|
346
|
+
if (options?.since) {
|
|
347
|
+
const sinceTime = options.since;
|
|
348
|
+
filtered = filtered.filter((entry) => entry.timestamp >= sinceTime);
|
|
349
|
+
}
|
|
350
|
+
if (options?.until) {
|
|
351
|
+
const untilTime = options.until;
|
|
352
|
+
filtered = filtered.filter((entry) => entry.timestamp <= untilTime);
|
|
353
|
+
}
|
|
354
|
+
if (options?.search) {
|
|
355
|
+
const searchLower = options.search.toLowerCase();
|
|
356
|
+
filtered = filtered.filter((entry) => entry.message.toLowerCase().includes(searchLower) ||
|
|
357
|
+
JSON.stringify(entry.data || {}).toLowerCase().includes(searchLower));
|
|
358
|
+
}
|
|
359
|
+
if (options?.limit) {
|
|
360
|
+
filtered = filtered.slice(-options.limit);
|
|
361
|
+
}
|
|
362
|
+
return filtered;
|
|
363
|
+
},
|
|
364
|
+
// ログファイル読み取り機能
|
|
365
|
+
readLogFile: async (lines) => {
|
|
366
|
+
try {
|
|
367
|
+
const content = await fs.readFile(currentLogConfig.logFilePath, 'utf-8');
|
|
368
|
+
const allLines = content.split('\n').filter(line => line.trim() !== '');
|
|
369
|
+
if (lines && lines > 0) {
|
|
370
|
+
return allLines.slice(-lines);
|
|
371
|
+
}
|
|
372
|
+
return allLines;
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
logger.error('Failed to read log file', { error: String(error) }, 'logger');
|
|
376
|
+
return [];
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
// ログ統計取得
|
|
380
|
+
getStats: () => {
|
|
381
|
+
const stats = {
|
|
382
|
+
totalEntries: logEntries.length,
|
|
383
|
+
byLevel: {},
|
|
384
|
+
byComponent: {},
|
|
385
|
+
oldestEntry: logEntries.length > 0 ? logEntries[0]?.timestamp : null,
|
|
386
|
+
newestEntry: logEntries.length > 0 ? logEntries[logEntries.length - 1]?.timestamp : null,
|
|
387
|
+
};
|
|
388
|
+
logEntries.forEach(entry => {
|
|
389
|
+
const levelName = LogLevel[entry.level];
|
|
390
|
+
stats.byLevel[levelName] = (stats.byLevel[levelName] || 0) + 1;
|
|
391
|
+
const component = entry.component || 'SYSTEM';
|
|
392
|
+
stats.byComponent[component] = (stats.byComponent[component] || 0) + 1;
|
|
393
|
+
});
|
|
394
|
+
return stats;
|
|
395
|
+
},
|
|
396
|
+
// ログ設定関数
|
|
397
|
+
configure: updateLogConfig,
|
|
398
|
+
getConfig: getLogConfig,
|
|
399
|
+
};
|
|
400
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Repair Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides fallback mechanisms to repair common JSON formatting issues
|
|
5
|
+
* that can occur when LLMs generate malformed JSON responses.
|
|
6
|
+
*/
|
|
7
|
+
export interface JsonRepairResult {
|
|
8
|
+
success: boolean;
|
|
9
|
+
value?: unknown;
|
|
10
|
+
originalError?: string;
|
|
11
|
+
repairAttempts?: string[];
|
|
12
|
+
finalError?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Attempts to repair and parse malformed JSON strings.
|
|
16
|
+
* Uses multiple repair strategies in sequence.
|
|
17
|
+
*/
|
|
18
|
+
export declare function repairAndParseJson(jsonString: string): JsonRepairResult;
|
|
19
|
+
/**
|
|
20
|
+
* Advanced repair attempt using regex-based fixes for common LLM errors
|
|
21
|
+
*/
|
|
22
|
+
export declare function advancedJsonRepair(jsonString: string): string;
|
|
23
|
+
//# sourceMappingURL=json-repair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-repair.d.ts","sourceRoot":"","sources":["../../src/utils/json-repair.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAkDvE;AA0KD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA8B7D"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Repair Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides fallback mechanisms to repair common JSON formatting issues
|
|
5
|
+
* that can occur when LLMs generate malformed JSON responses.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Attempts to repair and parse malformed JSON strings.
|
|
9
|
+
* Uses multiple repair strategies in sequence.
|
|
10
|
+
*/
|
|
11
|
+
export function repairAndParseJson(jsonString) {
|
|
12
|
+
const result = {
|
|
13
|
+
success: false,
|
|
14
|
+
repairAttempts: []
|
|
15
|
+
};
|
|
16
|
+
// Try original JSON first
|
|
17
|
+
try {
|
|
18
|
+
const parsed = JSON.parse(jsonString);
|
|
19
|
+
result.success = true;
|
|
20
|
+
result.value = parsed;
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
catch (originalError) {
|
|
24
|
+
result.originalError = originalError instanceof Error ? originalError.message : String(originalError);
|
|
25
|
+
}
|
|
26
|
+
// Repair strategies to try in order
|
|
27
|
+
const repairStrategies = [
|
|
28
|
+
fixShellEscapeSequences,
|
|
29
|
+
fixQuoteIssues,
|
|
30
|
+
fixAdvancedEscaping,
|
|
31
|
+
fixTrailingCommas,
|
|
32
|
+
fixUnquotedKeys,
|
|
33
|
+
fixControlCharacters,
|
|
34
|
+
fixComplexQuotePatterns,
|
|
35
|
+
extractJsonFromText
|
|
36
|
+
];
|
|
37
|
+
for (const strategy of repairStrategies) {
|
|
38
|
+
try {
|
|
39
|
+
const repairedJson = strategy(jsonString);
|
|
40
|
+
if (result.repairAttempts) {
|
|
41
|
+
result.repairAttempts.push(`Strategy ${strategy.name}: ${repairedJson.substring(0, 200)}...`);
|
|
42
|
+
}
|
|
43
|
+
const parsed = JSON.parse(repairedJson);
|
|
44
|
+
result.success = true;
|
|
45
|
+
result.value = parsed;
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
// Log the error for debugging
|
|
50
|
+
if (result.repairAttempts) {
|
|
51
|
+
result.repairAttempts.push(`Strategy ${strategy.name} failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
52
|
+
}
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
result.finalError = 'All repair strategies failed';
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Fix shell escape sequences that are invalid in JSON
|
|
61
|
+
*/
|
|
62
|
+
function fixShellEscapeSequences(json) {
|
|
63
|
+
let fixed = json;
|
|
64
|
+
// Fix the main problem: \; (backslash semicolon) in JSON strings
|
|
65
|
+
// This is a shell escape but invalid JSON escape sequence
|
|
66
|
+
fixed = fixed.replace(/\\;/g, '\\\\;');
|
|
67
|
+
// Also fix other problematic shell sequences
|
|
68
|
+
fixed = fixed.replace(/\\{/g, '\\\\{');
|
|
69
|
+
fixed = fixed.replace(/\\}/g, '\\\\}');
|
|
70
|
+
fixed = fixed.replace(/\\\*/g, '\\\\*');
|
|
71
|
+
fixed = fixed.replace(/\\\?/g, '\\\\?');
|
|
72
|
+
// Fix pattern where backslash is followed by quote within JSON string
|
|
73
|
+
// Pattern: \"Found: {}\" \; should become \"Found: {}\" \\;
|
|
74
|
+
fixed = fixed.replace(/" \\;/g, '" \\\\;');
|
|
75
|
+
return fixed;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Fix common quote-related issues
|
|
79
|
+
*/
|
|
80
|
+
function fixQuoteIssues(json) {
|
|
81
|
+
let fixed = json;
|
|
82
|
+
// Replace smart quotes with regular quotes
|
|
83
|
+
fixed = fixed.replace(/[""]/g, '"');
|
|
84
|
+
fixed = fixed.replace(/['']/g, "'");
|
|
85
|
+
// Fix single quotes around strings (but not inside strings)
|
|
86
|
+
fixed = fixed.replace(/:\s*'([^']*?)'/g, ': "$1"');
|
|
87
|
+
fixed = fixed.replace(/{\s*'([^']*?)':/g, '{"$1":');
|
|
88
|
+
fixed = fixed.replace(/,\s*'([^']*?)':/g, ', "$1":');
|
|
89
|
+
// Fix unescaped quotes within strings
|
|
90
|
+
fixed = fixed.replace(/"([^"]*?)"([^"]*?)"([^"]*?)"/g, (_match, p1, p2, p3) => {
|
|
91
|
+
// If p2 contains unescaped quotes, escape them
|
|
92
|
+
const escapedP2 = p2.replace(/"/g, '\\"');
|
|
93
|
+
return `"${p1}${escapedP2}${p3}"`;
|
|
94
|
+
});
|
|
95
|
+
return fixed;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Advanced escaping fixes for command patterns
|
|
99
|
+
*/
|
|
100
|
+
function fixAdvancedEscaping(json) {
|
|
101
|
+
let fixed = json;
|
|
102
|
+
// Fix shell commands with complex quoting patterns
|
|
103
|
+
// Pattern: find /tmp -name "*.tmp" -exec echo "Found: {}" \;
|
|
104
|
+
fixed = fixed.replace(/"command":\s*"([^"]*find[^"]*-name[^"]*)"([^"]*)"([^"]*-exec[^"]*echo[^"]*)"([^"]*)"([^"]*\\;[^"]*)"/g, (_match, p1, p2, p3, p4, p5) => {
|
|
105
|
+
const escapedCommand = `${p1}\\"${p2}\\"${p3}\\"${p4}\\"${p5}`;
|
|
106
|
+
return `"command": "${escapedCommand}"`;
|
|
107
|
+
});
|
|
108
|
+
// Fix reasoning fields with embedded quotes
|
|
109
|
+
fixed = fixed.replace(/"reasoning":\s*"([^"]*)"([^"]*)"([^"]*)"([^"]*)"([^"]*)"/g, (_match, p1, p2, p3, p4, p5) => {
|
|
110
|
+
const escapedReasoning = `${p1}\\"${p2}\\"${p3}\\"${p4}\\"${p5}`;
|
|
111
|
+
return `"reasoning": "${escapedReasoning}"`;
|
|
112
|
+
});
|
|
113
|
+
return fixed;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Fix complex quote patterns including nested quotes
|
|
117
|
+
*/
|
|
118
|
+
function fixComplexQuotePatterns(json) {
|
|
119
|
+
let fixed = json;
|
|
120
|
+
// Strategy: Find string values that contain unescaped quotes and fix them
|
|
121
|
+
// This is more aggressive - looks for patterns like "field": "value"with"quotes"
|
|
122
|
+
const stringFieldRegex = /"(\w+)":\s*"([^"]*(?:"[^"]*)*[^"]*)"/g;
|
|
123
|
+
fixed = fixed.replace(stringFieldRegex, (match, fieldName, value) => {
|
|
124
|
+
// Count quotes in the value
|
|
125
|
+
const quoteCount = (value.match(/"/g) || []).length;
|
|
126
|
+
// If we have unescaped quotes, escape them
|
|
127
|
+
if (quoteCount > 0) {
|
|
128
|
+
// Simple replacement - escape all internal quotes
|
|
129
|
+
const escapedValue = value.replace(/"/g, '\\"');
|
|
130
|
+
return `"${fieldName}": "${escapedValue}"`;
|
|
131
|
+
}
|
|
132
|
+
return match;
|
|
133
|
+
});
|
|
134
|
+
// Also handle specific problematic patterns we've seen
|
|
135
|
+
// Pattern: "text with "quotes" inside"
|
|
136
|
+
fixed = fixed.replace(/"([^"]*)"([^"]*)"([^"]*)"/g, '"$1\\"$2\\"$3"');
|
|
137
|
+
return fixed;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Remove trailing commas
|
|
141
|
+
*/
|
|
142
|
+
function fixTrailingCommas(json) {
|
|
143
|
+
let fixed = json;
|
|
144
|
+
// Remove trailing commas before closing brackets/braces
|
|
145
|
+
fixed = fixed.replace(/,\s*]/g, ']');
|
|
146
|
+
fixed = fixed.replace(/,\s*}/g, '}');
|
|
147
|
+
return fixed;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Quote unquoted object keys
|
|
151
|
+
*/
|
|
152
|
+
function fixUnquotedKeys(json) {
|
|
153
|
+
let fixed = json;
|
|
154
|
+
// Quote unquoted keys
|
|
155
|
+
fixed = fixed.replace(/([{,]\s*)([a-zA-Z_$][a-zA-Z0-9_$]*)\s*:/g, '$1"$2":');
|
|
156
|
+
return fixed;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Fix control characters and line breaks
|
|
160
|
+
*/
|
|
161
|
+
function fixControlCharacters(json) {
|
|
162
|
+
let fixed = json;
|
|
163
|
+
// Replace actual newlines with escaped newlines within strings
|
|
164
|
+
fixed = fixed.replace(/"([^"]*?)\n([^"]*?)"/g, '"$1\\n$2"');
|
|
165
|
+
fixed = fixed.replace(/"([^"]*?)\r([^"]*?)"/g, '"$1\\r$2"');
|
|
166
|
+
fixed = fixed.replace(/"([^"]*?)\t([^"]*?)"/g, '"$1\\t$2"');
|
|
167
|
+
return fixed;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Try to extract JSON from text that might have extra content
|
|
171
|
+
*/
|
|
172
|
+
function extractJsonFromText(text) {
|
|
173
|
+
// Look for JSON-like structure
|
|
174
|
+
const jsonMatch = text.match(/\{[\s\S]*\}/);
|
|
175
|
+
if (jsonMatch) {
|
|
176
|
+
return jsonMatch[0];
|
|
177
|
+
}
|
|
178
|
+
// Look for array structure
|
|
179
|
+
const arrayMatch = text.match(/\[[\s\S]*\]/);
|
|
180
|
+
if (arrayMatch) {
|
|
181
|
+
return arrayMatch[0];
|
|
182
|
+
}
|
|
183
|
+
throw new Error('No JSON structure found');
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Advanced repair attempt using regex-based fixes for common LLM errors
|
|
187
|
+
*/
|
|
188
|
+
export function advancedJsonRepair(jsonString) {
|
|
189
|
+
let fixed = jsonString.trim();
|
|
190
|
+
// Fix common LLM mistakes
|
|
191
|
+
// 1. Fix reasoning field with unescaped quotes
|
|
192
|
+
fixed = fixed.replace(/"reasoning":\s*"([^"]*?)"([^"]*?)"([^"]*?)"/g, (_match, p1, p2, p3) => {
|
|
193
|
+
const escapedContent = `${p1}\\"${p2}\\"${p3}`;
|
|
194
|
+
return `"reasoning": "${escapedContent}"`;
|
|
195
|
+
});
|
|
196
|
+
// 2. Fix command field with unescaped quotes
|
|
197
|
+
fixed = fixed.replace(/"command":\s*"([^"]*?)"([^"]*?)"([^"]*?)"/g, (_match, p1, p2, p3) => {
|
|
198
|
+
const escapedContent = `${p1}\\"${p2}\\"${p3}`;
|
|
199
|
+
return `"command": "${escapedContent}"`;
|
|
200
|
+
});
|
|
201
|
+
// 3. Apply all other repair strategies
|
|
202
|
+
fixed = fixQuoteIssues(fixed);
|
|
203
|
+
fixed = fixTrailingCommas(fixed);
|
|
204
|
+
fixed = fixUnquotedKeys(fixed);
|
|
205
|
+
fixed = fixControlCharacters(fixed);
|
|
206
|
+
return fixed;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=json-repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-repair.js","sourceRoot":"","sources":["../../src/utils/json-repair.ts"],"names":[],"mappings":"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"}
|