@creatoria/miniapp-mcp 0.1.3 → 0.2.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/README.md +14 -3
- package/dist/app/cli/index.d.ts +6 -0
- package/dist/app/cli/index.d.ts.map +1 -0
- package/dist/app/cli/index.js +6 -0
- package/dist/app/cli/index.js.map +1 -0
- package/dist/app/index.d.ts +6 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +6 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/server/index.d.ts +7 -0
- package/dist/app/server/index.d.ts.map +1 -0
- package/dist/app/server/index.js +6 -0
- package/dist/app/server/index.js.map +1 -0
- package/dist/capabilities/assert/index.d.ts +5 -0
- package/dist/capabilities/assert/index.d.ts.map +1 -0
- package/dist/capabilities/assert/index.js +5 -0
- package/dist/capabilities/assert/index.js.map +1 -0
- package/dist/capabilities/automator/index.d.ts +6 -0
- package/dist/capabilities/automator/index.d.ts.map +1 -0
- package/dist/capabilities/automator/index.js +6 -0
- package/dist/capabilities/automator/index.js.map +1 -0
- package/dist/capabilities/automator/schemas/close.d.ts +5 -0
- package/dist/capabilities/automator/schemas/close.d.ts.map +1 -0
- package/dist/capabilities/automator/schemas/close.js +11 -0
- package/dist/capabilities/automator/schemas/close.js.map +1 -0
- package/dist/capabilities/automator/schemas/connect.d.ts +11 -0
- package/dist/capabilities/automator/schemas/connect.d.ts.map +1 -0
- package/dist/capabilities/automator/schemas/connect.js +19 -0
- package/dist/capabilities/automator/schemas/connect.js.map +1 -0
- package/dist/capabilities/automator/schemas/disconnect.d.ts +5 -0
- package/dist/capabilities/automator/schemas/disconnect.d.ts.map +1 -0
- package/dist/capabilities/automator/schemas/disconnect.js +11 -0
- package/dist/capabilities/automator/schemas/disconnect.js.map +1 -0
- package/dist/capabilities/automator/schemas/index.d.ts +4 -0
- package/dist/capabilities/automator/schemas/index.d.ts.map +1 -0
- package/dist/capabilities/automator/schemas/index.js +12 -0
- package/dist/capabilities/automator/schemas/index.js.map +1 -0
- package/dist/capabilities/automator/schemas/launch.d.ts +17 -0
- package/dist/capabilities/automator/schemas/launch.d.ts.map +1 -0
- package/dist/capabilities/automator/schemas/launch.js +26 -0
- package/dist/capabilities/automator/schemas/launch.js.map +1 -0
- package/dist/capabilities/element/index.d.ts +5 -0
- package/dist/capabilities/element/index.d.ts.map +1 -0
- package/dist/capabilities/element/index.js +5 -0
- package/dist/capabilities/element/index.js.map +1 -0
- package/dist/capabilities/index.d.ts +15 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +14 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/capabilities/miniprogram/index.d.ts +5 -0
- package/dist/capabilities/miniprogram/index.d.ts.map +1 -0
- package/dist/capabilities/miniprogram/index.js +5 -0
- package/dist/capabilities/miniprogram/index.js.map +1 -0
- package/dist/capabilities/network/index.d.ts +5 -0
- package/dist/capabilities/network/index.d.ts.map +1 -0
- package/dist/capabilities/network/index.js +5 -0
- package/dist/capabilities/network/index.js.map +1 -0
- package/dist/capabilities/page/index.d.ts +5 -0
- package/dist/capabilities/page/index.d.ts.map +1 -0
- package/dist/capabilities/page/index.js +5 -0
- package/dist/capabilities/page/index.js.map +1 -0
- package/dist/capabilities/record/index.d.ts +5 -0
- package/dist/capabilities/record/index.d.ts.map +1 -0
- package/dist/capabilities/record/index.js +5 -0
- package/dist/capabilities/record/index.js.map +1 -0
- package/dist/capabilities/schema-registry.d.ts +4 -0
- package/dist/capabilities/schema-registry.d.ts.map +1 -0
- package/dist/capabilities/schema-registry.js +18 -0
- package/dist/capabilities/schema-registry.js.map +1 -0
- package/dist/capabilities/schema-types.d.ts +22 -0
- package/dist/capabilities/schema-types.d.ts.map +1 -0
- package/dist/capabilities/schema-types.js +2 -0
- package/dist/capabilities/schema-types.js.map +1 -0
- package/dist/capabilities/snapshot/index.d.ts +5 -0
- package/dist/capabilities/snapshot/index.d.ts.map +1 -0
- package/dist/capabilities/snapshot/index.js +5 -0
- package/dist/capabilities/snapshot/index.js.map +1 -0
- package/dist/config/loader.js +1 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/core/element-ref.d.ts +1 -43
- package/dist/core/element-ref.d.ts.map +1 -1
- package/dist/core/element-ref.js +1 -212
- package/dist/core/element-ref.js.map +1 -1
- package/dist/core/logger.d.ts +1 -54
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +1 -377
- package/dist/core/logger.js.map +1 -1
- package/dist/core/output.d.ts +1 -20
- package/dist/core/output.d.ts.map +1 -1
- package/dist/core/output.js +1 -55
- package/dist/core/output.js.map +1 -1
- package/dist/core/report-generator.d.ts +1 -23
- package/dist/core/report-generator.d.ts.map +1 -1
- package/dist/core/report-generator.js +1 -211
- package/dist/core/report-generator.js.map +1 -1
- package/dist/core/session.d.ts +2 -82
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +2 -305
- package/dist/core/session.js.map +1 -1
- package/dist/core/timeout.d.ts +1 -48
- package/dist/core/timeout.d.ts.map +1 -1
- package/dist/core/timeout.js +1 -66
- package/dist/core/timeout.js.map +1 -1
- package/dist/core/tool-logger.d.ts +1 -82
- package/dist/core/tool-logger.d.ts.map +1 -1
- package/dist/core/tool-logger.js +1 -452
- package/dist/core/tool-logger.js.map +1 -1
- package/dist/core/validation.d.ts +1 -38
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +1 -92
- package/dist/core/validation.js.map +1 -1
- package/dist/runtime/element/element-ref.d.ts +44 -0
- package/dist/runtime/element/element-ref.d.ts.map +1 -0
- package/dist/runtime/element/element-ref.js +214 -0
- package/dist/runtime/element/element-ref.js.map +1 -0
- package/dist/runtime/element/index.d.ts +2 -0
- package/dist/runtime/element/index.d.ts.map +1 -0
- package/dist/runtime/element/index.js +2 -0
- package/dist/runtime/element/index.js.map +1 -0
- package/dist/runtime/index.d.ts +10 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +10 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/logging/index.d.ts +3 -0
- package/dist/runtime/logging/index.d.ts.map +1 -0
- package/dist/runtime/logging/index.js +3 -0
- package/dist/runtime/logging/index.js.map +1 -0
- package/dist/runtime/logging/logger.d.ts +55 -0
- package/dist/runtime/logging/logger.d.ts.map +1 -0
- package/dist/runtime/logging/logger.js +379 -0
- package/dist/runtime/logging/logger.js.map +1 -0
- package/dist/runtime/logging/tool-logger.d.ts +83 -0
- package/dist/runtime/logging/tool-logger.d.ts.map +1 -0
- package/dist/runtime/logging/tool-logger.js +454 -0
- package/dist/runtime/logging/tool-logger.js.map +1 -0
- package/dist/runtime/outputs/index.d.ts +3 -0
- package/dist/runtime/outputs/index.d.ts.map +1 -0
- package/dist/runtime/outputs/index.js +3 -0
- package/dist/runtime/outputs/index.js.map +1 -0
- package/dist/runtime/outputs/output-manager.d.ts +12 -0
- package/dist/runtime/outputs/output-manager.d.ts.map +1 -0
- package/dist/runtime/outputs/output-manager.js +39 -0
- package/dist/runtime/outputs/output-manager.js.map +1 -0
- package/dist/runtime/outputs/report-generator.d.ts +5 -0
- package/dist/runtime/outputs/report-generator.d.ts.map +1 -0
- package/dist/runtime/outputs/report-generator.js +175 -0
- package/dist/runtime/outputs/report-generator.js.map +1 -0
- package/dist/runtime/session/index.d.ts +3 -0
- package/dist/runtime/session/index.d.ts.map +1 -0
- package/dist/runtime/session/index.js +3 -0
- package/dist/runtime/session/index.js.map +1 -0
- package/dist/runtime/session/store.d.ts +28 -0
- package/dist/runtime/session/store.d.ts.map +1 -0
- package/dist/runtime/session/store.js +154 -0
- package/dist/runtime/session/store.js.map +1 -0
- package/dist/runtime/session/utils/cleanup.d.ts +3 -0
- package/dist/runtime/session/utils/cleanup.d.ts.map +1 -0
- package/dist/runtime/session/utils/cleanup.js +78 -0
- package/dist/runtime/session/utils/cleanup.js.map +1 -0
- package/dist/runtime/timeout/index.d.ts +2 -0
- package/dist/runtime/timeout/index.d.ts.map +1 -0
- package/dist/runtime/timeout/index.js +2 -0
- package/dist/runtime/timeout/index.js.map +1 -0
- package/dist/runtime/timeout/timeout.d.ts +49 -0
- package/dist/runtime/timeout/timeout.d.ts.map +1 -0
- package/dist/runtime/timeout/timeout.js +67 -0
- package/dist/runtime/timeout/timeout.js.map +1 -0
- package/dist/runtime/validation/index.d.ts +2 -0
- package/dist/runtime/validation/index.d.ts.map +1 -0
- package/dist/runtime/validation/index.js +2 -0
- package/dist/runtime/validation/index.js.map +1 -0
- package/dist/runtime/validation/validation.d.ts +39 -0
- package/dist/runtime/validation/validation.d.ts.map +1 -0
- package/dist/runtime/validation/validation.js +93 -0
- package/dist/runtime/validation/validation.js.map +1 -0
- package/dist/schemas/automator/miniprogram_close.json +12 -0
- package/dist/schemas/automator/miniprogram_connect.json +19 -0
- package/dist/schemas/automator/miniprogram_disconnect.json +12 -0
- package/dist/schemas/automator/miniprogram_launch.json +30 -0
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/miniprogram.d.ts +0 -1
- package/dist/tools/miniprogram.d.ts.map +1 -1
- package/dist/tools/miniprogram.js +17 -29
- package/dist/tools/miniprogram.js.map +1 -1
- package/dist/tools/page.js +2 -2
- package/dist/tools/page.js.map +1 -1
- package/docs/directory-structure-and-code-style-best-practices.md +91 -0
- package/docs/migration/README.md +34 -0
- package/docs/migration/TC-ALIGN-01-notes.md +35 -0
- package/docs/migration/runtime-skeleton.md +50 -0
- package/docs/migration/tool-schema-strategy.md +75 -0
- package/docs//345/256/214/346/225/264/345/256/236/347/216/260/346/226/271/346/241/210.md +14 -14
- package/docs//347/254/254/344/270/200/347/211/210/346/234/254/346/226/271/346/241/210.md +7 -7
- package/package.json +4 -2
- package/docs/SIMPLE_USAGE.md +0 -210
- package/docs/architecture.E-Docs.md +0 -1359
- package/docs/architecture.F1.md +0 -720
- package/docs/architecture.F2.md +0 -871
- package/docs/architecture.F3.md +0 -905
- package/docs/architecture.md +0 -90
- package/docs/charter.A1.align.yaml +0 -170
- package/docs/charter.A2.align.yaml +0 -199
- package/docs/charter.A3.align.yaml +0 -242
- package/docs/charter.A4.align.yaml +0 -227
- package/docs/charter.B1.align.yaml +0 -179
- package/docs/charter.B2.align.yaml +0 -200
- package/docs/charter.B3.align.yaml +0 -200
- package/docs/charter.B4.align.yaml +0 -188
- package/docs/charter.C1.align.yaml +0 -190
- package/docs/charter.C2.align.yaml +0 -202
- package/docs/charter.C3.align.yaml +0 -211
- package/docs/charter.C4.align.yaml +0 -263
- package/docs/charter.C5.align.yaml +0 -220
- package/docs/charter.D1.align.yaml +0 -190
- package/docs/charter.D2.align.yaml +0 -234
- package/docs/charter.D3.align.yaml +0 -206
- package/docs/charter.E-Docs.align.yaml +0 -294
- package/docs/charter.F1.align.yaml +0 -193
- package/docs/charter.F2.align.yaml +0 -248
- package/docs/charter.F3.align.yaml +0 -287
- package/docs/charter.G.align.yaml +0 -174
- package/docs/charter.align.yaml +0 -111
- package/docs/maintenance.md +0 -682
- package/docs/playwright-mcp/350/260/203/347/240/224.md +0 -53
- package/docs/setup-guide.md +0 -775
- package/docs/tasks.A1.atomize.md +0 -296
- package/docs/tasks.A2.atomize.md +0 -408
- package/docs/tasks.A3.atomize.md +0 -564
- package/docs/tasks.A4.atomize.md +0 -496
- package/docs/tasks.B1.atomize.md +0 -352
- package/docs/tasks.B2.atomize.md +0 -561
- package/docs/tasks.B3.atomize.md +0 -508
- package/docs/tasks.B4.atomize.md +0 -504
- package/docs/tasks.C1.atomize.md +0 -540
- package/docs/tasks.C2.atomize.md +0 -665
- package/docs/tasks.C3.atomize.md +0 -745
- package/docs/tasks.C4.atomize.md +0 -908
- package/docs/tasks.C5.atomize.md +0 -755
- package/docs/tasks.D1.atomize.md +0 -547
- package/docs/tasks.D2.atomize.md +0 -619
- package/docs/tasks.D3.atomize.md +0 -790
- package/docs/tasks.E-Docs.atomize.md +0 -1204
- package/docs/tasks.atomize.md +0 -189
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
/**
|
|
3
|
+
* Logger implementation for structured logging with file support
|
|
4
|
+
*/
|
|
5
|
+
import { open, mkdir, rename } from 'fs/promises';
|
|
6
|
+
import { statfs } from 'fs/promises'; // Issue #6: Disk space check (Node 18+)
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
/**
|
|
9
|
+
* Default logger configuration
|
|
10
|
+
*/
|
|
11
|
+
const DEFAULT_LOGGER_CONFIG = {
|
|
12
|
+
level: 'info',
|
|
13
|
+
enableFileLog: false,
|
|
14
|
+
outputDir: '.mcp-artifacts',
|
|
15
|
+
bufferSize: 100,
|
|
16
|
+
flushInterval: 5000,
|
|
17
|
+
enableFailureSnapshot: false,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Log level priorities for filtering
|
|
21
|
+
*/
|
|
22
|
+
const LOG_LEVELS = {
|
|
23
|
+
debug: 0,
|
|
24
|
+
info: 1,
|
|
25
|
+
warn: 2,
|
|
26
|
+
error: 3,
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Internal file writer with buffering for async log writing
|
|
30
|
+
*/
|
|
31
|
+
class FileWriter {
|
|
32
|
+
sessionId;
|
|
33
|
+
outputDir;
|
|
34
|
+
bufferSize;
|
|
35
|
+
flushInterval;
|
|
36
|
+
buffer = [];
|
|
37
|
+
flushTimer;
|
|
38
|
+
fileHandle;
|
|
39
|
+
disposed = false;
|
|
40
|
+
filePath;
|
|
41
|
+
flushInProgress = false; // Issue #2: Prevent concurrent flushes
|
|
42
|
+
failureCount = 0; // Issue #1: Circuit breaker for persistent failures
|
|
43
|
+
MAX_FAILURES = 3; // Disable after 3 consecutive failures
|
|
44
|
+
constructor(sessionId, outputDir, bufferSize, flushInterval) {
|
|
45
|
+
this.sessionId = sessionId;
|
|
46
|
+
this.outputDir = outputDir;
|
|
47
|
+
this.bufferSize = bufferSize;
|
|
48
|
+
this.flushInterval = flushInterval;
|
|
49
|
+
this.startFlushTimer();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Add log entry to buffer (non-blocking)
|
|
53
|
+
*/
|
|
54
|
+
write(entry) {
|
|
55
|
+
if (this.disposed)
|
|
56
|
+
return;
|
|
57
|
+
this.buffer.push(entry);
|
|
58
|
+
// Trigger flush if buffer is full
|
|
59
|
+
if (this.buffer.length >= this.bufferSize) {
|
|
60
|
+
// Fire-and-forget flush (non-blocking)
|
|
61
|
+
void this.flush().catch((err) => {
|
|
62
|
+
console.error('Failed to flush log buffer:', err);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Flush buffer to file
|
|
68
|
+
*/
|
|
69
|
+
async flush() {
|
|
70
|
+
// Issue #2: Prevent concurrent flushes
|
|
71
|
+
if (this.buffer.length === 0 || this.disposed || this.flushInProgress)
|
|
72
|
+
return;
|
|
73
|
+
this.flushInProgress = true;
|
|
74
|
+
try {
|
|
75
|
+
// Extract buffer entries
|
|
76
|
+
const entries = this.buffer.splice(0, this.buffer.length);
|
|
77
|
+
const lines = entries
|
|
78
|
+
.map((e) => {
|
|
79
|
+
try {
|
|
80
|
+
// Issue #13: Handle circular references
|
|
81
|
+
return JSON.stringify(e);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
return JSON.stringify({
|
|
85
|
+
...e,
|
|
86
|
+
context: '<Serialization failed: circular reference>',
|
|
87
|
+
_serializationError: error instanceof Error ? error.message : String(error),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
.join('\n') + '\n';
|
|
92
|
+
try {
|
|
93
|
+
// Ensure file handle is open
|
|
94
|
+
if (!this.fileHandle) {
|
|
95
|
+
await this.ensureLogDirectory();
|
|
96
|
+
this.filePath = join(this.outputDir, 'logs', `session-${this.sessionId}.log`);
|
|
97
|
+
this.fileHandle = await open(this.filePath, 'a');
|
|
98
|
+
}
|
|
99
|
+
// Issue #6: Check disk space before writing
|
|
100
|
+
await this.checkDiskSpace();
|
|
101
|
+
if (this.disposed)
|
|
102
|
+
return; // Disk space check may have disabled logging
|
|
103
|
+
// Issue #8: Rotate file if too large
|
|
104
|
+
await this.rotateIfNeeded();
|
|
105
|
+
// Write to file
|
|
106
|
+
await this.fileHandle.write(lines);
|
|
107
|
+
// Issue #1: Reset failure count on success
|
|
108
|
+
this.failureCount = 0;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
const err = error instanceof Error ? error.message : String(error);
|
|
112
|
+
// Handle disk full error
|
|
113
|
+
if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOSPC') {
|
|
114
|
+
console.error('Disk full, disabling file logging');
|
|
115
|
+
// Issue #4: Close file handle before disposing to prevent leak
|
|
116
|
+
if (this.fileHandle) {
|
|
117
|
+
await this.fileHandle.close().catch(() => { });
|
|
118
|
+
this.fileHandle = undefined;
|
|
119
|
+
}
|
|
120
|
+
this.disposed = true;
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
console.error('Failed to write logs to file:', err);
|
|
124
|
+
// Issue #1: Circuit breaker - disable after too many failures
|
|
125
|
+
this.failureCount++;
|
|
126
|
+
if (this.failureCount >= this.MAX_FAILURES) {
|
|
127
|
+
console.error(`Too many flush failures (${this.failureCount}), disabling file logging`);
|
|
128
|
+
// Issue #4: Close file handle before disposing
|
|
129
|
+
if (this.fileHandle) {
|
|
130
|
+
await this.fileHandle.close().catch(() => { });
|
|
131
|
+
this.fileHandle = undefined;
|
|
132
|
+
}
|
|
133
|
+
this.disposed = true;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Issue #1: Smart retry with buffer size limit
|
|
137
|
+
// Only keep the most recent entries to prevent unbounded growth
|
|
138
|
+
const entriesToKeep = Math.min(entries.length, this.bufferSize - this.buffer.length);
|
|
139
|
+
if (entriesToKeep > 0) {
|
|
140
|
+
// Keep newest entries, drop oldest
|
|
141
|
+
this.buffer.unshift(...entries.slice(-entriesToKeep));
|
|
142
|
+
if (entriesToKeep < entries.length) {
|
|
143
|
+
console.warn(`Dropped ${entries.length - entriesToKeep} old log entries due to buffer limit`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.warn(`Buffer full, dropped ${entries.length} failed log entries`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
this.flushInProgress = false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Dispose writer and flush remaining buffer
|
|
157
|
+
*/
|
|
158
|
+
async dispose() {
|
|
159
|
+
this.disposed = true;
|
|
160
|
+
if (this.flushTimer) {
|
|
161
|
+
clearInterval(this.flushTimer);
|
|
162
|
+
}
|
|
163
|
+
await this.flush();
|
|
164
|
+
if (this.fileHandle) {
|
|
165
|
+
await this.fileHandle.close();
|
|
166
|
+
this.fileHandle = undefined;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Start periodic flush timer
|
|
171
|
+
*/
|
|
172
|
+
startFlushTimer() {
|
|
173
|
+
this.flushTimer = setInterval(() => {
|
|
174
|
+
void this.flush().catch((err) => {
|
|
175
|
+
console.error('Scheduled flush failed:', err);
|
|
176
|
+
});
|
|
177
|
+
}, this.flushInterval);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Ensure log directory exists
|
|
181
|
+
*/
|
|
182
|
+
async ensureLogDirectory() {
|
|
183
|
+
const logDir = join(this.outputDir, 'logs');
|
|
184
|
+
await mkdir(logDir, { recursive: true });
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check disk space and warn/disable if low (Issue #6)
|
|
188
|
+
*/
|
|
189
|
+
async checkDiskSpace() {
|
|
190
|
+
if (!this.fileHandle || !this.filePath)
|
|
191
|
+
return;
|
|
192
|
+
try {
|
|
193
|
+
const stats = await statfs(this.outputDir);
|
|
194
|
+
const freeBytes = BigInt(stats.bsize) * BigInt(stats.bavail);
|
|
195
|
+
const freeMB = Number(freeBytes / BigInt(1024 * 1024));
|
|
196
|
+
if (freeMB < 100) {
|
|
197
|
+
console.warn(`[Logger] Low disk space: ${freeMB.toFixed(2)}MB remaining`);
|
|
198
|
+
}
|
|
199
|
+
if (freeMB < 10) {
|
|
200
|
+
console.error('[Logger] Critical disk space (<10MB), disabling file logging');
|
|
201
|
+
// Close file handle and dispose
|
|
202
|
+
await this.fileHandle.close().catch(() => { });
|
|
203
|
+
this.fileHandle = undefined;
|
|
204
|
+
this.disposed = true;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
// statfs may not be available on all platforms/Node versions
|
|
209
|
+
// Silently ignore to avoid breaking on older Node versions
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Rotate log file if it exceeds 10MB (Issue #8)
|
|
214
|
+
*/
|
|
215
|
+
async rotateIfNeeded() {
|
|
216
|
+
if (!this.fileHandle || !this.filePath)
|
|
217
|
+
return;
|
|
218
|
+
try {
|
|
219
|
+
const stats = await this.fileHandle.stat();
|
|
220
|
+
const sizeMB = stats.size / (1024 * 1024);
|
|
221
|
+
if (sizeMB > 10) {
|
|
222
|
+
console.warn(`[Logger] Log file exceeds 10MB (${sizeMB.toFixed(2)}MB), rotating...`);
|
|
223
|
+
// Close current file
|
|
224
|
+
await this.fileHandle.close();
|
|
225
|
+
// Rename to timestamped backup
|
|
226
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, -5); // Remove .xxxZ
|
|
227
|
+
const rotatedPath = `${this.filePath}.${timestamp}`;
|
|
228
|
+
await rename(this.filePath, rotatedPath);
|
|
229
|
+
console.error(`[Logger] Rotated log file to: ${rotatedPath}`);
|
|
230
|
+
// Reopen new file
|
|
231
|
+
this.fileHandle = await open(this.filePath, 'a');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
console.error('[Logger] Failed to rotate log file:', error);
|
|
236
|
+
// Continue with existing file handle
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Console-based logger implementation
|
|
242
|
+
*/
|
|
243
|
+
export class ConsoleLogger {
|
|
244
|
+
sessionId;
|
|
245
|
+
toolName;
|
|
246
|
+
config;
|
|
247
|
+
fileWriter;
|
|
248
|
+
constructor(sessionId, toolName, config) {
|
|
249
|
+
this.sessionId = sessionId;
|
|
250
|
+
this.toolName = toolName;
|
|
251
|
+
this.config = this.mergeConfig(config);
|
|
252
|
+
// Initialize file writer if enabled
|
|
253
|
+
if (this.config.enableFileLog && sessionId) {
|
|
254
|
+
this.fileWriter = new FileWriter(sessionId, this.config.outputDir, this.config.bufferSize, this.config.flushInterval);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Merge user config with defaults and validate values (Issue #7)
|
|
259
|
+
*/
|
|
260
|
+
mergeConfig(userConfig) {
|
|
261
|
+
// Start with defaults
|
|
262
|
+
const merged = {
|
|
263
|
+
...DEFAULT_LOGGER_CONFIG,
|
|
264
|
+
...userConfig,
|
|
265
|
+
};
|
|
266
|
+
// Issue #7: Validate and clamp buffer size (10 - 10000)
|
|
267
|
+
const rawBufferSize = merged.bufferSize;
|
|
268
|
+
merged.bufferSize = Math.max(10, Math.min(merged.bufferSize, 10000));
|
|
269
|
+
if (rawBufferSize !== merged.bufferSize) {
|
|
270
|
+
console.warn(`Logger bufferSize clamped to ${merged.bufferSize} (was ${rawBufferSize}). Valid range: 10-10000`);
|
|
271
|
+
}
|
|
272
|
+
// Issue #7: Validate and clamp flush interval (100ms - 60s)
|
|
273
|
+
const rawFlushInterval = merged.flushInterval;
|
|
274
|
+
merged.flushInterval = Math.max(100, Math.min(merged.flushInterval, 60000));
|
|
275
|
+
if (rawFlushInterval !== merged.flushInterval) {
|
|
276
|
+
console.warn(`Logger flushInterval clamped to ${merged.flushInterval}ms (was ${rawFlushInterval}ms). Valid range: 100-60000ms`);
|
|
277
|
+
}
|
|
278
|
+
// Issue #7: Validate log level
|
|
279
|
+
const validLevels = ['debug', 'info', 'warn', 'error'];
|
|
280
|
+
if (!validLevels.includes(merged.level)) {
|
|
281
|
+
console.warn(`Invalid log level "${merged.level}", using default "info". Valid levels: ${validLevels.join(', ')}`);
|
|
282
|
+
merged.level = 'info';
|
|
283
|
+
}
|
|
284
|
+
// Issue #7: Validate outputDir is non-empty string
|
|
285
|
+
if (typeof merged.outputDir !== 'string' || merged.outputDir.trim() === '') {
|
|
286
|
+
console.warn(`Invalid outputDir "${merged.outputDir}", using default ".mcp-artifacts"`);
|
|
287
|
+
merged.outputDir = '.mcp-artifacts';
|
|
288
|
+
}
|
|
289
|
+
return merged;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Check if log level should be output
|
|
293
|
+
*/
|
|
294
|
+
shouldLog(level) {
|
|
295
|
+
return LOG_LEVELS[level] >= LOG_LEVELS[this.config.level];
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Create log entry with metadata
|
|
299
|
+
*/
|
|
300
|
+
createEntry(level, message, context) {
|
|
301
|
+
return {
|
|
302
|
+
timestamp: new Date(),
|
|
303
|
+
level,
|
|
304
|
+
message,
|
|
305
|
+
sessionId: this.sessionId,
|
|
306
|
+
toolName: this.toolName,
|
|
307
|
+
context,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Format log entry for console output
|
|
312
|
+
*/
|
|
313
|
+
format(entry) {
|
|
314
|
+
const timestamp = entry.timestamp.toISOString();
|
|
315
|
+
const level = entry.level.toUpperCase().padEnd(5);
|
|
316
|
+
const sessionInfo = entry.sessionId ? ` [${entry.sessionId}]` : '';
|
|
317
|
+
const toolInfo = entry.toolName ? ` [${entry.toolName}]` : '';
|
|
318
|
+
const contextInfo = entry.context ? ` ${JSON.stringify(entry.context)}` : '';
|
|
319
|
+
return `${timestamp} ${level}${sessionInfo}${toolInfo}: ${entry.message}${contextInfo}`;
|
|
320
|
+
}
|
|
321
|
+
info(message, context) {
|
|
322
|
+
if (!this.shouldLog('info'))
|
|
323
|
+
return;
|
|
324
|
+
const entry = this.createEntry('info', message, context);
|
|
325
|
+
this.log(entry);
|
|
326
|
+
}
|
|
327
|
+
warn(message, context) {
|
|
328
|
+
if (!this.shouldLog('warn'))
|
|
329
|
+
return;
|
|
330
|
+
const entry = this.createEntry('warn', message, context);
|
|
331
|
+
this.log(entry);
|
|
332
|
+
}
|
|
333
|
+
error(message, context) {
|
|
334
|
+
if (!this.shouldLog('error'))
|
|
335
|
+
return;
|
|
336
|
+
const entry = this.createEntry('error', message, context);
|
|
337
|
+
this.log(entry);
|
|
338
|
+
}
|
|
339
|
+
debug(message, context) {
|
|
340
|
+
if (!this.shouldLog('debug'))
|
|
341
|
+
return;
|
|
342
|
+
const entry = this.createEntry('debug', message, context);
|
|
343
|
+
this.log(entry);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Log entry to console and optionally to file
|
|
347
|
+
*/
|
|
348
|
+
log(entry) {
|
|
349
|
+
// Console output (always)
|
|
350
|
+
console.error(this.format(entry));
|
|
351
|
+
// File output (if enabled)
|
|
352
|
+
this.fileWriter?.write(entry);
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Flush log buffer to file
|
|
356
|
+
*/
|
|
357
|
+
async flush() {
|
|
358
|
+
await this.fileWriter?.flush();
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Dispose logger and flush buffer
|
|
362
|
+
*/
|
|
363
|
+
async dispose() {
|
|
364
|
+
await this.fileWriter?.dispose();
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Create a child logger with specific tool name
|
|
368
|
+
*/
|
|
369
|
+
child(toolName) {
|
|
370
|
+
return new ConsoleLogger(this.sessionId, toolName, this.config);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Create a logger for a session
|
|
375
|
+
*/
|
|
376
|
+
export function createLogger(sessionId, config) {
|
|
377
|
+
return new ConsoleLogger(sessionId, undefined, config);
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/runtime/logging/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool call logger wrapper for automatic logging
|
|
3
|
+
*/
|
|
4
|
+
import type { Logger } from '../../types.js';
|
|
5
|
+
import type { SessionState } from '../../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Tool logger wrapper for automatic START/END/ERROR logging
|
|
8
|
+
*/
|
|
9
|
+
export declare class ToolLogger {
|
|
10
|
+
private logger;
|
|
11
|
+
private config?;
|
|
12
|
+
private capturing;
|
|
13
|
+
constructor(logger: Logger, config?: import("../../types.js").LoggerConfig | undefined);
|
|
14
|
+
/**
|
|
15
|
+
* Wrap a tool handler with automatic logging
|
|
16
|
+
*
|
|
17
|
+
* @param toolName - Name of the tool (e.g., "page_query")
|
|
18
|
+
* @param handler - Original tool handler function
|
|
19
|
+
* @returns Wrapped handler with automatic logging
|
|
20
|
+
*/
|
|
21
|
+
wrap<TArgs, TResult>(toolName: string, handler: (session: SessionState, args: TArgs) => Promise<TResult>): (session: SessionState, args: TArgs) => Promise<TResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a key name matches sensitive patterns (Issue #3)
|
|
24
|
+
*/
|
|
25
|
+
private isSensitiveKey;
|
|
26
|
+
/**
|
|
27
|
+
* Sanitize arguments for logging (remove sensitive data, limit size)
|
|
28
|
+
* Issue #3: Enhanced with deep recursion and pattern matching
|
|
29
|
+
*/
|
|
30
|
+
private sanitizeArgs;
|
|
31
|
+
/**
|
|
32
|
+
* Sanitize result for logging (limit size, remove large objects)
|
|
33
|
+
* Issue #3: Use same deep sanitization as args
|
|
34
|
+
*/
|
|
35
|
+
private sanitizeResult;
|
|
36
|
+
/**
|
|
37
|
+
* Capture failure snapshot when tool call fails (F2 feature)
|
|
38
|
+
*
|
|
39
|
+
* Creates a failure directory with:
|
|
40
|
+
* - snapshot.json: Page data
|
|
41
|
+
* - snapshot.png: Screenshot
|
|
42
|
+
* - error-context.json: Error details + tool context
|
|
43
|
+
*
|
|
44
|
+
* @param context Failure context
|
|
45
|
+
* @returns Relative path to the failure directory (for F3 reporting)
|
|
46
|
+
*/
|
|
47
|
+
private captureFailureSnapshot;
|
|
48
|
+
/**
|
|
49
|
+
* Record a tool call to session report data (F3 feature)
|
|
50
|
+
*
|
|
51
|
+
* Adds a tool call record to the session's reportData. Implements
|
|
52
|
+
* memory protection by limiting to MAX_TOOL_CALL_RECORDS with FIFO eviction.
|
|
53
|
+
*
|
|
54
|
+
* @param session Session state
|
|
55
|
+
* @param record Tool call record to add
|
|
56
|
+
*/
|
|
57
|
+
private recordToolCall;
|
|
58
|
+
/**
|
|
59
|
+
* Sanitize error message to remove sensitive information (F3-S1)
|
|
60
|
+
*
|
|
61
|
+
* Removes:
|
|
62
|
+
* - File paths (Unix, Linux, Windows)
|
|
63
|
+
* - API keys and tokens (32+ character alphanumeric strings)
|
|
64
|
+
* - Stack trace locations
|
|
65
|
+
*
|
|
66
|
+
* @param message Raw error message
|
|
67
|
+
* @returns Sanitized error message with placeholders
|
|
68
|
+
*/
|
|
69
|
+
private sanitizeErrorMessage;
|
|
70
|
+
/**
|
|
71
|
+
* Sanitize stack trace to remove sensitive file paths (Issue #P2)
|
|
72
|
+
*
|
|
73
|
+
* Removes:
|
|
74
|
+
* - Absolute user paths (/Users/<username>/, /home/<username>/)
|
|
75
|
+
* - Windows paths (C:\Users\<username>\)
|
|
76
|
+
* - Environment-specific paths
|
|
77
|
+
*
|
|
78
|
+
* @param stack Raw stack trace
|
|
79
|
+
* @returns Sanitized stack trace with placeholders
|
|
80
|
+
*/
|
|
81
|
+
private sanitizeStackTrace;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=tool-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-logger.d.ts","sourceRoot":"","sources":["../../../src/runtime/logging/tool-logger.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,gBAAgB,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AA4ClD;;GAEG;AACH,qBAAa,UAAU;IAInB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM,CAAC;IAJjB,OAAO,CAAC,SAAS,CAAQ;gBAGf,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,OAAO,gBAAgB,EAAE,YAAY,YAAA;IAGxD;;;;;;OAMG;IACH,IAAI,CAAC,KAAK,EAAE,OAAO,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,GAChE,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC;IAgF3D;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAoEpB;;;OAGG;IACH,OAAO,CAAC,cAAc;IA0EtB;;;;;;;;;;OAUG;YACW,sBAAsB;IAqGpC;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;IA6BtB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kBAAkB;CAqB3B"}
|