@creatoria/miniapp-mcp 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.
Files changed (160) hide show
  1. package/README.md +469 -0
  2. package/dist/cli.d.ts +6 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +144 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config/defaults.d.ts +73 -0
  7. package/dist/config/defaults.d.ts.map +1 -0
  8. package/dist/config/defaults.js +118 -0
  9. package/dist/config/defaults.js.map +1 -0
  10. package/dist/config/loader.d.ts +50 -0
  11. package/dist/config/loader.d.ts.map +1 -0
  12. package/dist/config/loader.js +189 -0
  13. package/dist/config/loader.js.map +1 -0
  14. package/dist/core/element-ref.d.ts +44 -0
  15. package/dist/core/element-ref.d.ts.map +1 -0
  16. package/dist/core/element-ref.js +213 -0
  17. package/dist/core/element-ref.js.map +1 -0
  18. package/dist/core/logger.d.ts +55 -0
  19. package/dist/core/logger.d.ts.map +1 -0
  20. package/dist/core/logger.js +378 -0
  21. package/dist/core/logger.js.map +1 -0
  22. package/dist/core/output.d.ts +21 -0
  23. package/dist/core/output.d.ts.map +1 -0
  24. package/dist/core/output.js +56 -0
  25. package/dist/core/output.js.map +1 -0
  26. package/dist/core/report-generator.d.ts +24 -0
  27. package/dist/core/report-generator.d.ts.map +1 -0
  28. package/dist/core/report-generator.js +212 -0
  29. package/dist/core/report-generator.js.map +1 -0
  30. package/dist/core/session.d.ts +83 -0
  31. package/dist/core/session.d.ts.map +1 -0
  32. package/dist/core/session.js +306 -0
  33. package/dist/core/session.js.map +1 -0
  34. package/dist/core/timeout.d.ts +49 -0
  35. package/dist/core/timeout.d.ts.map +1 -0
  36. package/dist/core/timeout.js +67 -0
  37. package/dist/core/timeout.js.map +1 -0
  38. package/dist/core/tool-logger.d.ts +83 -0
  39. package/dist/core/tool-logger.d.ts.map +1 -0
  40. package/dist/core/tool-logger.js +453 -0
  41. package/dist/core/tool-logger.js.map +1 -0
  42. package/dist/core/validation.d.ts +39 -0
  43. package/dist/core/validation.d.ts.map +1 -0
  44. package/dist/core/validation.js +93 -0
  45. package/dist/core/validation.js.map +1 -0
  46. package/dist/index.d.ts +7 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +6 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/server.d.ts +7 -0
  51. package/dist/server.d.ts.map +1 -0
  52. package/dist/server.js +85 -0
  53. package/dist/server.js.map +1 -0
  54. package/dist/tools/assert.d.ts +108 -0
  55. package/dist/tools/assert.d.ts.map +1 -0
  56. package/dist/tools/assert.js +291 -0
  57. package/dist/tools/assert.js.map +1 -0
  58. package/dist/tools/automator.d.ts +45 -0
  59. package/dist/tools/automator.d.ts.map +1 -0
  60. package/dist/tools/automator.js +186 -0
  61. package/dist/tools/automator.js.map +1 -0
  62. package/dist/tools/element.d.ts +253 -0
  63. package/dist/tools/element.d.ts.map +1 -0
  64. package/dist/tools/element.js +615 -0
  65. package/dist/tools/element.js.map +1 -0
  66. package/dist/tools/index.d.ts +97 -0
  67. package/dist/tools/index.d.ts.map +1 -0
  68. package/dist/tools/index.js +1565 -0
  69. package/dist/tools/index.js.map +1 -0
  70. package/dist/tools/miniprogram.d.ts +79 -0
  71. package/dist/tools/miniprogram.d.ts.map +1 -0
  72. package/dist/tools/miniprogram.js +245 -0
  73. package/dist/tools/miniprogram.js.map +1 -0
  74. package/dist/tools/network.d.ts +65 -0
  75. package/dist/tools/network.d.ts.map +1 -0
  76. package/dist/tools/network.js +205 -0
  77. package/dist/tools/network.js.map +1 -0
  78. package/dist/tools/page.d.ts +108 -0
  79. package/dist/tools/page.d.ts.map +1 -0
  80. package/dist/tools/page.js +307 -0
  81. package/dist/tools/page.js.map +1 -0
  82. package/dist/tools/record.d.ts +86 -0
  83. package/dist/tools/record.d.ts.map +1 -0
  84. package/dist/tools/record.js +316 -0
  85. package/dist/tools/record.js.map +1 -0
  86. package/dist/tools/snapshot.d.ts +82 -0
  87. package/dist/tools/snapshot.d.ts.map +1 -0
  88. package/dist/tools/snapshot.js +258 -0
  89. package/dist/tools/snapshot.js.map +1 -0
  90. package/dist/types.d.ts +240 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +5 -0
  93. package/dist/types.js.map +1 -0
  94. package/docs/SIMPLE_USAGE.md +210 -0
  95. package/docs/api/README.md +244 -0
  96. package/docs/api/assert.md +1015 -0
  97. package/docs/api/automator.md +345 -0
  98. package/docs/api/element.md +1454 -0
  99. package/docs/api/miniprogram.md +558 -0
  100. package/docs/api/network.md +883 -0
  101. package/docs/api/page.md +909 -0
  102. package/docs/api/record.md +963 -0
  103. package/docs/api/snapshot.md +792 -0
  104. package/docs/architecture.E-Docs.md +1359 -0
  105. package/docs/architecture.F1.md +720 -0
  106. package/docs/architecture.F2.md +871 -0
  107. package/docs/architecture.F3.md +905 -0
  108. package/docs/architecture.md +90 -0
  109. package/docs/charter.A1.align.yaml +170 -0
  110. package/docs/charter.A2.align.yaml +199 -0
  111. package/docs/charter.A3.align.yaml +242 -0
  112. package/docs/charter.A4.align.yaml +227 -0
  113. package/docs/charter.B1.align.yaml +179 -0
  114. package/docs/charter.B2.align.yaml +200 -0
  115. package/docs/charter.B3.align.yaml +200 -0
  116. package/docs/charter.B4.align.yaml +188 -0
  117. package/docs/charter.C1.align.yaml +190 -0
  118. package/docs/charter.C2.align.yaml +202 -0
  119. package/docs/charter.C3.align.yaml +211 -0
  120. package/docs/charter.C4.align.yaml +263 -0
  121. package/docs/charter.C5.align.yaml +220 -0
  122. package/docs/charter.D1.align.yaml +190 -0
  123. package/docs/charter.D2.align.yaml +234 -0
  124. package/docs/charter.D3.align.yaml +206 -0
  125. package/docs/charter.E-Docs.align.yaml +294 -0
  126. package/docs/charter.F1.align.yaml +193 -0
  127. package/docs/charter.F2.align.yaml +248 -0
  128. package/docs/charter.F3.align.yaml +287 -0
  129. package/docs/charter.G.align.yaml +174 -0
  130. package/docs/charter.align.yaml +111 -0
  131. package/docs/examples/session-report-usage.md +449 -0
  132. package/docs/maintenance.md +682 -0
  133. package/docs/playwright-mcp/350/260/203/347/240/224.md +53 -0
  134. package/docs/setup-guide.md +775 -0
  135. package/docs/tasks.A1.atomize.md +296 -0
  136. package/docs/tasks.A2.atomize.md +408 -0
  137. package/docs/tasks.A3.atomize.md +564 -0
  138. package/docs/tasks.A4.atomize.md +496 -0
  139. package/docs/tasks.B1.atomize.md +352 -0
  140. package/docs/tasks.B2.atomize.md +561 -0
  141. package/docs/tasks.B3.atomize.md +508 -0
  142. package/docs/tasks.B4.atomize.md +504 -0
  143. package/docs/tasks.C1.atomize.md +540 -0
  144. package/docs/tasks.C2.atomize.md +665 -0
  145. package/docs/tasks.C3.atomize.md +745 -0
  146. package/docs/tasks.C4.atomize.md +908 -0
  147. package/docs/tasks.C5.atomize.md +755 -0
  148. package/docs/tasks.D1.atomize.md +547 -0
  149. package/docs/tasks.D2.atomize.md +619 -0
  150. package/docs/tasks.D3.atomize.md +790 -0
  151. package/docs/tasks.E-Docs.atomize.md +1204 -0
  152. package/docs/tasks.atomize.md +189 -0
  153. package/docs/troubleshooting.md +855 -0
  154. package/docs//345/256/214/346/225/264/345/256/236/347/216/260/346/226/271/346/241/210.md +155 -0
  155. package/docs//345/274/200/345/217/221/344/273/273/345/212/241/350/256/241/345/210/222.md +110 -0
  156. package/docs//345/276/256/344/277/241/345/260/217/347/250/213/345/272/217/350/207/252/345/212/250/345/214/226API/345/256/214/346/225/264/346/226/207/346/241/243.md +894 -0
  157. package/docs//345/276/256/344/277/241/345/260/217/347/250/213/345/272/217/350/207/252/345/212/250/345/214/226/345/256/214/346/225/264/346/223/215/344/275/234/346/211/213/345/206/214.md +1885 -0
  158. package/docs//346/216/245/345/217/243/346/226/271/346/241/210.md +565 -0
  159. package/docs//347/254/254/344/270/200/347/211/210/346/234/254/346/226/271/346/241/210.md +380 -0
  160. package/package.json +87 -0
@@ -0,0 +1,453 @@
1
+ /**
2
+ * Tool call logger wrapper for automatic logging
3
+ */
4
+ /**
5
+ * Maximum size for logged arguments/results (1KB)
6
+ */
7
+ const MAX_LOG_SIZE = 1024;
8
+ /**
9
+ * Maximum recursion depth for sanitization
10
+ */
11
+ const MAX_SANITIZE_DEPTH = 5;
12
+ /**
13
+ * Maximum number of tool call records to keep in memory (F3)
14
+ */
15
+ const MAX_TOOL_CALL_RECORDS = 1000;
16
+ /**
17
+ * Sensitive key patterns to redact from logs (Issue #3: Enhanced sanitization)
18
+ * Uses regex for case-insensitive matching and pattern variations
19
+ */
20
+ const SENSITIVE_PATTERNS = [
21
+ /password/i,
22
+ /passwd/i,
23
+ /pwd/i,
24
+ /token/i,
25
+ /secret/i,
26
+ /api[_-]?key/i,
27
+ /auth/i,
28
+ /authorization/i,
29
+ /bearer/i,
30
+ /credential/i,
31
+ /private[_-]?key/i,
32
+ /access[_-]?key/i,
33
+ /session[_-]?id/i,
34
+ /csrf/i,
35
+ /xsrf/i,
36
+ /jwt/i,
37
+ // WeChat specific PII
38
+ /openid/i,
39
+ /unionid/i,
40
+ /app[_-]?secret/i,
41
+ ];
42
+ /**
43
+ * Tool logger wrapper for automatic START/END/ERROR logging
44
+ */
45
+ export class ToolLogger {
46
+ logger;
47
+ config;
48
+ capturing = false; // Issue #P2: Prevent recursive snapshot triggers
49
+ constructor(logger, config) {
50
+ this.logger = logger;
51
+ this.config = config;
52
+ }
53
+ /**
54
+ * Wrap a tool handler with automatic logging
55
+ *
56
+ * @param toolName - Name of the tool (e.g., "page_query")
57
+ * @param handler - Original tool handler function
58
+ * @returns Wrapped handler with automatic logging
59
+ */
60
+ wrap(toolName, handler) {
61
+ return async (session, args) => {
62
+ const startTime = Date.now();
63
+ const childLogger = this.logger.child(toolName);
64
+ // Log START
65
+ childLogger.info('Tool call started', {
66
+ phase: 'START',
67
+ args: this.sanitizeArgs(args),
68
+ });
69
+ try {
70
+ // Execute tool
71
+ const result = await handler(session, args);
72
+ const duration = Date.now() - startTime;
73
+ // Log END
74
+ childLogger.info('Tool call completed', {
75
+ phase: 'END',
76
+ duration,
77
+ result: this.sanitizeResult(result),
78
+ });
79
+ // F3: Record successful tool call
80
+ this.recordToolCall(session, {
81
+ timestamp: new Date(startTime),
82
+ toolName,
83
+ duration,
84
+ success: true,
85
+ result: this.sanitizeResult(result),
86
+ });
87
+ return result;
88
+ }
89
+ catch (error) {
90
+ const duration = Date.now() - startTime;
91
+ // Log ERROR
92
+ childLogger.error('Tool call failed', {
93
+ phase: 'ERROR',
94
+ duration,
95
+ error: error instanceof Error ? error.message : String(error),
96
+ stackTrace: error instanceof Error ? error.stack : undefined,
97
+ });
98
+ // F2: Capture failure snapshot (fire-and-forget, non-blocking)
99
+ let snapshotPath;
100
+ if (this.config?.enableFailureSnapshot) {
101
+ snapshotPath = await this.captureFailureSnapshot({
102
+ session,
103
+ toolName,
104
+ args,
105
+ error: error instanceof Error ? error : new Error(String(error)),
106
+ duration,
107
+ }).catch((e) => {
108
+ childLogger.warn('Snapshot capture failed', {
109
+ error: e instanceof Error ? e.message : String(e),
110
+ });
111
+ return undefined;
112
+ });
113
+ }
114
+ // F3: Record failed tool call
115
+ this.recordToolCall(session, {
116
+ timestamp: new Date(startTime),
117
+ toolName,
118
+ duration,
119
+ success: false,
120
+ error: {
121
+ message: this.sanitizeErrorMessage(error instanceof Error ? error.message : String(error)),
122
+ snapshotPath,
123
+ },
124
+ });
125
+ throw error; // Re-throw to preserve error handling
126
+ }
127
+ };
128
+ }
129
+ /**
130
+ * Check if a key name matches sensitive patterns (Issue #3)
131
+ */
132
+ isSensitiveKey(key) {
133
+ return SENSITIVE_PATTERNS.some((pattern) => pattern.test(key));
134
+ }
135
+ /**
136
+ * Sanitize arguments for logging (remove sensitive data, limit size)
137
+ * Issue #3: Enhanced with deep recursion and pattern matching
138
+ */
139
+ sanitizeArgs(args, depth = 0) {
140
+ if (args === null || args === undefined) {
141
+ return args;
142
+ }
143
+ // Prevent infinite recursion
144
+ if (depth > MAX_SANITIZE_DEPTH) {
145
+ return '<Max sanitization depth reached>';
146
+ }
147
+ try {
148
+ // For primitives, handle directly
149
+ if (typeof args !== 'object') {
150
+ if (typeof args === 'string' && args.length > MAX_LOG_SIZE) {
151
+ return args.substring(0, MAX_LOG_SIZE) + `... (${args.length} bytes total)`;
152
+ }
153
+ return args;
154
+ }
155
+ // Handle arrays
156
+ if (Array.isArray(args)) {
157
+ return args.map((item) => this.sanitizeArgs(item, depth + 1));
158
+ }
159
+ // Handle objects with deep sanitization
160
+ const sanitized = {};
161
+ for (const [key, value] of Object.entries(args)) {
162
+ // Redact sensitive keys (Issue #3: Pattern-based matching)
163
+ if (this.isSensitiveKey(key)) {
164
+ sanitized[key] = '[REDACTED]';
165
+ continue;
166
+ }
167
+ // Truncate large strings
168
+ if (typeof value === 'string' && value.length > MAX_LOG_SIZE) {
169
+ sanitized[key] = value.substring(0, MAX_LOG_SIZE) + `... (${value.length} bytes total)`;
170
+ continue;
171
+ }
172
+ // Convert buffers to placeholder
173
+ if (value &&
174
+ typeof value === 'object' &&
175
+ 'type' in value &&
176
+ value.type === 'Buffer' &&
177
+ 'data' in value) {
178
+ const bufferData = value.data;
179
+ sanitized[key] = `<Buffer ${bufferData?.length || 0} bytes>`;
180
+ continue;
181
+ }
182
+ // Recursively sanitize nested objects/arrays (Issue #3: Deep sanitization)
183
+ if (value && typeof value === 'object') {
184
+ sanitized[key] = this.sanitizeArgs(value, depth + 1);
185
+ continue;
186
+ }
187
+ sanitized[key] = value;
188
+ }
189
+ return sanitized;
190
+ }
191
+ catch (error) {
192
+ // If sanitization fails, return placeholder
193
+ return '<Failed to sanitize args>';
194
+ }
195
+ }
196
+ /**
197
+ * Sanitize result for logging (limit size, remove large objects)
198
+ * Issue #3: Use same deep sanitization as args
199
+ */
200
+ sanitizeResult(result, depth = 0) {
201
+ if (result === null || result === undefined) {
202
+ return result;
203
+ }
204
+ // Prevent infinite recursion
205
+ if (depth > MAX_SANITIZE_DEPTH) {
206
+ return '<Max sanitization depth reached>';
207
+ }
208
+ try {
209
+ // For simple types, return as-is
210
+ if (typeof result !== 'object') {
211
+ if (typeof result === 'string' && result.length > MAX_LOG_SIZE) {
212
+ return result.substring(0, MAX_LOG_SIZE) + `... (${result.length} bytes total)`;
213
+ }
214
+ return result;
215
+ }
216
+ // Handle arrays
217
+ if (Array.isArray(result)) {
218
+ if (result.length > 10) {
219
+ return [
220
+ ...result.slice(0, 10).map((item) => this.sanitizeResult(item, depth + 1)),
221
+ `... (${result.length - 10} more items)`,
222
+ ];
223
+ }
224
+ return result.map((item) => this.sanitizeResult(item, depth + 1));
225
+ }
226
+ // For objects, sanitize with deep recursion
227
+ const sanitized = {};
228
+ for (const [key, value] of Object.entries(result)) {
229
+ // Redact sensitive keys in results too (Issue #3)
230
+ if (this.isSensitiveKey(key)) {
231
+ sanitized[key] = '[REDACTED]';
232
+ continue;
233
+ }
234
+ // Truncate large strings
235
+ if (typeof value === 'string' && value.length > MAX_LOG_SIZE) {
236
+ sanitized[key] = value.substring(0, MAX_LOG_SIZE) + `... (${value.length} bytes total)`;
237
+ continue;
238
+ }
239
+ // Convert buffers to placeholder
240
+ if (value &&
241
+ typeof value === 'object' &&
242
+ 'type' in value &&
243
+ value.type === 'Buffer' &&
244
+ 'data' in value) {
245
+ const bufferData = value.data;
246
+ sanitized[key] = `<Buffer ${bufferData?.length || 0} bytes>`;
247
+ continue;
248
+ }
249
+ // Recursively sanitize nested objects/arrays
250
+ if (value && typeof value === 'object') {
251
+ sanitized[key] = this.sanitizeResult(value, depth + 1);
252
+ continue;
253
+ }
254
+ sanitized[key] = value;
255
+ }
256
+ return sanitized;
257
+ }
258
+ catch (error) {
259
+ // If sanitization fails, return placeholder
260
+ return '<Failed to sanitize result>';
261
+ }
262
+ }
263
+ /**
264
+ * Capture failure snapshot when tool call fails (F2 feature)
265
+ *
266
+ * Creates a failure directory with:
267
+ * - snapshot.json: Page data
268
+ * - snapshot.png: Screenshot
269
+ * - error-context.json: Error details + tool context
270
+ *
271
+ * @param context Failure context
272
+ * @returns Relative path to the failure directory (for F3 reporting)
273
+ */
274
+ async captureFailureSnapshot(context) {
275
+ const { session, toolName, args, error, duration } = context;
276
+ const logger = this.logger;
277
+ // Issue #P2: Prevent recursive snapshot triggers
278
+ if (this.capturing) {
279
+ logger?.debug('Skipping failure snapshot: already capturing');
280
+ return undefined;
281
+ }
282
+ this.capturing = true;
283
+ try {
284
+ // 1. Check prerequisites
285
+ if (!this.config?.enableFailureSnapshot) {
286
+ return undefined; // Feature disabled
287
+ }
288
+ if (!session.miniProgram) {
289
+ logger?.debug('Skipping failure snapshot: miniProgram not connected');
290
+ return undefined;
291
+ }
292
+ if (!session.outputManager) {
293
+ logger?.debug('Skipping failure snapshot: outputManager not available');
294
+ return undefined;
295
+ }
296
+ // 2. Create failure directory
297
+ // Issue #P1: Sanitize toolName to prevent path traversal
298
+ const sanitizedToolName = toolName.replace(/[^a-zA-Z0-9_-]/g, '_');
299
+ // Issue #P1: Preserve millisecond precision to avoid collisions
300
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').replace('T', '_');
301
+ const failureDirName = `${sanitizedToolName}-${timestamp}`;
302
+ const failureDir = `failures/${failureDirName}`;
303
+ const outputManager = session.outputManager;
304
+ await outputManager.ensureOutputDir();
305
+ // Create failures subdirectory
306
+ const { mkdir } = await import('fs/promises');
307
+ const { join } = await import('path');
308
+ const failurePath = join(outputManager.getOutputDir(), failureDir);
309
+ await mkdir(failurePath, { recursive: true });
310
+ logger?.info('Capturing failure snapshot', { path: failurePath });
311
+ // 3. Capture page snapshot
312
+ const snapshotFilename = join(failureDir, 'snapshot.json');
313
+ const snapshotTools = await import('../tools/snapshot.js');
314
+ await snapshotTools.snapshotPage(session, {
315
+ filename: snapshotFilename,
316
+ includeScreenshot: true,
317
+ fullPage: false,
318
+ });
319
+ // 4. Save error context
320
+ const errorContext = {
321
+ toolName,
322
+ timestamp: new Date().toISOString(),
323
+ error: {
324
+ message: error.message,
325
+ // Issue #P2: Sanitize stack trace to remove sensitive paths
326
+ stack: this.sanitizeStackTrace(error.stack),
327
+ code: error.code,
328
+ },
329
+ args: this.sanitizeArgs(args), // Reuse existing sanitization
330
+ duration,
331
+ };
332
+ const contextFilename = join(failureDir, 'error-context.json');
333
+ await outputManager.writeFile(contextFilename, Buffer.from(JSON.stringify(errorContext, null, 2)));
334
+ logger?.info('Failure snapshot captured successfully', {
335
+ path: failurePath,
336
+ files: ['snapshot.json', 'snapshot.png', 'error-context.json'],
337
+ });
338
+ // F3: Return relative path for report linking
339
+ return failureDir;
340
+ }
341
+ catch (snapshotError) {
342
+ // Snapshot capture failed - log but don't throw
343
+ logger?.warn('Failed to capture failure snapshot', {
344
+ error: snapshotError instanceof Error ? snapshotError.message : String(snapshotError),
345
+ });
346
+ return undefined;
347
+ }
348
+ finally {
349
+ this.capturing = false;
350
+ }
351
+ }
352
+ /**
353
+ * Record a tool call to session report data (F3 feature)
354
+ *
355
+ * Adds a tool call record to the session's reportData. Implements
356
+ * memory protection by limiting to MAX_TOOL_CALL_RECORDS with FIFO eviction.
357
+ *
358
+ * @param session Session state
359
+ * @param record Tool call record to add
360
+ */
361
+ recordToolCall(session, record) {
362
+ // Skip if session reporting is not enabled
363
+ if (!session.reportData) {
364
+ return;
365
+ }
366
+ // Add record to the array
367
+ session.reportData.toolCalls.push(record);
368
+ // F3-P2: Memory protection with batch eviction for better performance
369
+ // Instead of shift() every time (O(n)), we batch-remove when hitting 1.5x limit
370
+ // This reduces eviction frequency from every call to every 500 calls
371
+ const currentLength = session.reportData.toolCalls.length;
372
+ if (currentLength >= MAX_TOOL_CALL_RECORDS * 1.5) {
373
+ // Remove oldest 50% to get back to limit
374
+ const removeCount = Math.floor(MAX_TOOL_CALL_RECORDS * 0.5);
375
+ const removed = session.reportData.toolCalls.splice(0, removeCount);
376
+ this.logger?.debug('Tool call records evicted (memory limit)', {
377
+ removedCount: removed.length,
378
+ oldestTool: removed[0]?.toolName,
379
+ oldestTimestamp: removed[0]?.timestamp,
380
+ newestRemovedTool: removed[removed.length - 1]?.toolName,
381
+ currentCount: session.reportData.toolCalls.length,
382
+ maxCount: MAX_TOOL_CALL_RECORDS,
383
+ });
384
+ }
385
+ }
386
+ /**
387
+ * Sanitize error message to remove sensitive information (F3-S1)
388
+ *
389
+ * Removes:
390
+ * - File paths (Unix, Linux, Windows)
391
+ * - API keys and tokens (32+ character alphanumeric strings)
392
+ * - Stack trace locations
393
+ *
394
+ * @param message Raw error message
395
+ * @returns Sanitized error message with placeholders
396
+ */
397
+ sanitizeErrorMessage(message) {
398
+ if (!message)
399
+ return message;
400
+ try {
401
+ return (message
402
+ // Replace Unix user paths: /Users/username/ -> /Users/<user>/
403
+ .replace(/\/Users\/[^/]+\//g, '/Users/<user>/')
404
+ // Replace Linux home paths: /home/username/ -> /home/<user>/
405
+ .replace(/\/home\/[^/]+\//g, '/home/<user>/')
406
+ // Replace Windows user paths: C:\Users\username\ -> C:\Users\<user>\
407
+ .replace(/C:\\Users\\[^\\]+\\/gi, 'C:\\Users\\<user>\\')
408
+ // Replace common environment paths
409
+ .replace(/\/opt\/[^/\s]+\//g, '/opt/<app>/')
410
+ .replace(/\/var\/[^/\s]+\//g, '/var/<app>/')
411
+ // Replace long alphanumeric strings with underscores/hyphens (likely API keys/tokens)
412
+ .replace(/\b[a-zA-Z0-9_-]{32,}\b/g, '<REDACTED>')
413
+ // Replace stack trace locations: "at path:line:col" or " at path:line:col" -> "at <path>:<line>:<col>"
414
+ .replace(/\bat\s+[^:\s]+:\d+:\d+/g, 'at <path>:<line>:<col>'));
415
+ }
416
+ catch (error) {
417
+ // If sanitization fails, return placeholder to avoid leaking raw message
418
+ return '<Failed to sanitize error message>';
419
+ }
420
+ }
421
+ /**
422
+ * Sanitize stack trace to remove sensitive file paths (Issue #P2)
423
+ *
424
+ * Removes:
425
+ * - Absolute user paths (/Users/<username>/, /home/<username>/)
426
+ * - Windows paths (C:\Users\<username>\)
427
+ * - Environment-specific paths
428
+ *
429
+ * @param stack Raw stack trace
430
+ * @returns Sanitized stack trace with placeholders
431
+ */
432
+ sanitizeStackTrace(stack) {
433
+ if (!stack)
434
+ return stack;
435
+ try {
436
+ return (stack
437
+ // Replace Unix user paths: /Users/username/ -> /Users/<user>/
438
+ .replace(/\/Users\/[^/]+\//g, '/Users/<user>/')
439
+ // Replace Linux home paths: /home/username/ -> /home/<user>/
440
+ .replace(/\/home\/[^/]+\//g, '/home/<user>/')
441
+ // Replace Windows user paths: C:\Users\username\ -> C:\Users\<user>\
442
+ .replace(/C:\\Users\\[^\\]+\\/gi, 'C:\\Users\\<user>\\')
443
+ // Replace common environment variables that may leak info
444
+ .replace(/\/opt\/[^/]+\//g, '/opt/<app>/')
445
+ .replace(/\/var\/[^/]+\//g, '/var/<app>/'));
446
+ }
447
+ catch (error) {
448
+ // If sanitization fails, return placeholder to avoid leaking raw stack
449
+ return '<Stack trace sanitization failed>';
450
+ }
451
+ }
452
+ }
453
+ //# sourceMappingURL=tool-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-logger.js","sourceRoot":"","sources":["../../src/core/tool-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Input validation utilities
3
+ */
4
+ /**
5
+ * Validates a filename to prevent path traversal attacks
6
+ *
7
+ * Rules:
8
+ * - No path separators (/ or \)
9
+ * - No parent directory references (..)
10
+ * - Only alphanumeric, underscore, hyphen, and dot
11
+ * - Must have a valid extension
12
+ *
13
+ * @param filename - The filename to validate
14
+ * @param allowedExtensions - Array of allowed extensions (without dot)
15
+ * @throws Error if filename is invalid
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * validateFilename('screenshot.png', ['png', 'jpg']) // OK
20
+ * validateFilename('../etc/passwd', ['png']) // throws
21
+ * validateFilename('file/path.png', ['png']) // throws
22
+ * ```
23
+ */
24
+ export declare function validateFilename(filename: string, allowedExtensions?: string[]): void;
25
+ /**
26
+ * Sanitizes a filename by removing or replacing invalid characters
27
+ *
28
+ * @param filename - The filename to sanitize
29
+ * @param defaultExtension - Default extension if none provided
30
+ * @returns A safe filename
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * sanitizeFilename('my file!.png') // 'my-file.png'
35
+ * sanitizeFilename('test', 'json') // 'test.json'
36
+ * ```
37
+ */
38
+ export declare function sanitizeFilename(filename: string, defaultExtension?: string): string;
39
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,iBAAiB,GAAE,MAAM,EAA0C,GAClE,IAAI,CA0CN;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CA0BpF"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Input validation utilities
3
+ */
4
+ /**
5
+ * Validates a filename to prevent path traversal attacks
6
+ *
7
+ * Rules:
8
+ * - No path separators (/ or \)
9
+ * - No parent directory references (..)
10
+ * - Only alphanumeric, underscore, hyphen, and dot
11
+ * - Must have a valid extension
12
+ *
13
+ * @param filename - The filename to validate
14
+ * @param allowedExtensions - Array of allowed extensions (without dot)
15
+ * @throws Error if filename is invalid
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * validateFilename('screenshot.png', ['png', 'jpg']) // OK
20
+ * validateFilename('../etc/passwd', ['png']) // throws
21
+ * validateFilename('file/path.png', ['png']) // throws
22
+ * ```
23
+ */
24
+ export function validateFilename(filename, allowedExtensions = ['png', 'jpg', 'jpeg', 'json', 'txt']) {
25
+ if (!filename || filename.trim() === '') {
26
+ throw new Error('Filename cannot be empty');
27
+ }
28
+ // Check for path traversal attempts
29
+ if (filename.includes('..')) {
30
+ throw new Error('Filename must not contain ".." sequences (path traversal attempt)');
31
+ }
32
+ // Check for path separators
33
+ if (filename.includes('/') || filename.includes('\\')) {
34
+ throw new Error('Filename must not contain path separators');
35
+ }
36
+ // Check for null bytes (security)
37
+ if (filename.includes('\0')) {
38
+ throw new Error('Filename must not contain null bytes');
39
+ }
40
+ // Validate format: alphanumeric, underscore, hyphen, and dot
41
+ if (!/^[a-zA-Z0-9_.-]+$/.test(filename)) {
42
+ throw new Error('Filename must only contain alphanumeric characters, underscores, hyphens, and dots');
43
+ }
44
+ // Check extension
45
+ const parts = filename.split('.');
46
+ if (parts.length < 2) {
47
+ throw new Error('Filename must have an extension');
48
+ }
49
+ const extension = parts[parts.length - 1].toLowerCase();
50
+ if (!allowedExtensions.includes(extension)) {
51
+ throw new Error(`Invalid file extension. Allowed extensions: ${allowedExtensions.join(', ')}`);
52
+ }
53
+ // Check length (防止过长文件名)
54
+ if (filename.length > 255) {
55
+ throw new Error('Filename is too long (max 255 characters)');
56
+ }
57
+ }
58
+ /**
59
+ * Sanitizes a filename by removing or replacing invalid characters
60
+ *
61
+ * @param filename - The filename to sanitize
62
+ * @param defaultExtension - Default extension if none provided
63
+ * @returns A safe filename
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * sanitizeFilename('my file!.png') // 'my-file.png'
68
+ * sanitizeFilename('test', 'json') // 'test.json'
69
+ * ```
70
+ */
71
+ export function sanitizeFilename(filename, defaultExtension) {
72
+ // Remove path components
73
+ filename = filename.split('/').pop();
74
+ filename = filename.split('\\').pop();
75
+ // Remove or replace invalid characters
76
+ filename = filename.replace(/[^a-zA-Z0-9_.-]/g, '-');
77
+ // Remove multiple consecutive hyphens or dots
78
+ filename = filename.replace(/[-]{2,}/g, '-');
79
+ filename = filename.replace(/[.]{2,}/g, '.');
80
+ // Ensure extension
81
+ if (defaultExtension && !filename.includes('.')) {
82
+ filename = `${filename}.${defaultExtension}`;
83
+ }
84
+ // Limit length
85
+ if (filename.length > 255) {
86
+ const parts = filename.split('.');
87
+ const ext = parts.pop();
88
+ const name = parts.join('.').substring(0, 255 - ext.length - 1);
89
+ filename = `${name}.${ext}`;
90
+ }
91
+ return filename;
92
+ }
93
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Main entry point for creatoria-miniapp-mcp
3
+ * MCP Server for WeChat Mini Program automation
4
+ */
5
+ export { startServer } from './server.js';
6
+ export type { ServerConfig } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Main entry point for creatoria-miniapp-mcp
3
+ * MCP Server for WeChat Mini Program automation
4
+ */
5
+ export { startServer } from './server.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP Server implementation for WeChat Mini Program automation
3
+ */
4
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
5
+ import type { ServerConfig } from './types.js';
6
+ export declare function startServer(config?: Partial<ServerConfig>): Promise<Server>;
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAGlE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAK9C,wBAAsB,WAAW,CAAC,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8FrF"}