@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,454 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
/**
|
|
3
|
+
* Tool call logger wrapper for automatic logging
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Maximum size for logged arguments/results (1KB)
|
|
7
|
+
*/
|
|
8
|
+
const MAX_LOG_SIZE = 1024;
|
|
9
|
+
/**
|
|
10
|
+
* Maximum recursion depth for sanitization
|
|
11
|
+
*/
|
|
12
|
+
const MAX_SANITIZE_DEPTH = 5;
|
|
13
|
+
/**
|
|
14
|
+
* Maximum number of tool call records to keep in memory (F3)
|
|
15
|
+
*/
|
|
16
|
+
const MAX_TOOL_CALL_RECORDS = 1000;
|
|
17
|
+
/**
|
|
18
|
+
* Sensitive key patterns to redact from logs (Issue #3: Enhanced sanitization)
|
|
19
|
+
* Uses regex for case-insensitive matching and pattern variations
|
|
20
|
+
*/
|
|
21
|
+
const SENSITIVE_PATTERNS = [
|
|
22
|
+
/password/i,
|
|
23
|
+
/passwd/i,
|
|
24
|
+
/pwd/i,
|
|
25
|
+
/token/i,
|
|
26
|
+
/secret/i,
|
|
27
|
+
/api[_-]?key/i,
|
|
28
|
+
/auth/i,
|
|
29
|
+
/authorization/i,
|
|
30
|
+
/bearer/i,
|
|
31
|
+
/credential/i,
|
|
32
|
+
/private[_-]?key/i,
|
|
33
|
+
/access[_-]?key/i,
|
|
34
|
+
/session[_-]?id/i,
|
|
35
|
+
/csrf/i,
|
|
36
|
+
/xsrf/i,
|
|
37
|
+
/jwt/i,
|
|
38
|
+
// WeChat specific PII
|
|
39
|
+
/openid/i,
|
|
40
|
+
/unionid/i,
|
|
41
|
+
/app[_-]?secret/i,
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Tool logger wrapper for automatic START/END/ERROR logging
|
|
45
|
+
*/
|
|
46
|
+
export class ToolLogger {
|
|
47
|
+
logger;
|
|
48
|
+
config;
|
|
49
|
+
capturing = false; // Issue #P2: Prevent recursive snapshot triggers
|
|
50
|
+
constructor(logger, config) {
|
|
51
|
+
this.logger = logger;
|
|
52
|
+
this.config = config;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Wrap a tool handler with automatic logging
|
|
56
|
+
*
|
|
57
|
+
* @param toolName - Name of the tool (e.g., "page_query")
|
|
58
|
+
* @param handler - Original tool handler function
|
|
59
|
+
* @returns Wrapped handler with automatic logging
|
|
60
|
+
*/
|
|
61
|
+
wrap(toolName, handler) {
|
|
62
|
+
return async (session, args) => {
|
|
63
|
+
const startTime = Date.now();
|
|
64
|
+
const childLogger = this.logger.child(toolName);
|
|
65
|
+
// Log START
|
|
66
|
+
childLogger.info('Tool call started', {
|
|
67
|
+
phase: 'START',
|
|
68
|
+
args: this.sanitizeArgs(args),
|
|
69
|
+
});
|
|
70
|
+
try {
|
|
71
|
+
// Execute tool
|
|
72
|
+
const result = await handler(session, args);
|
|
73
|
+
const duration = Date.now() - startTime;
|
|
74
|
+
// Log END
|
|
75
|
+
childLogger.info('Tool call completed', {
|
|
76
|
+
phase: 'END',
|
|
77
|
+
duration,
|
|
78
|
+
result: this.sanitizeResult(result),
|
|
79
|
+
});
|
|
80
|
+
// F3: Record successful tool call
|
|
81
|
+
this.recordToolCall(session, {
|
|
82
|
+
timestamp: new Date(startTime),
|
|
83
|
+
toolName,
|
|
84
|
+
duration,
|
|
85
|
+
success: true,
|
|
86
|
+
result: this.sanitizeResult(result),
|
|
87
|
+
});
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
const duration = Date.now() - startTime;
|
|
92
|
+
// Log ERROR
|
|
93
|
+
childLogger.error('Tool call failed', {
|
|
94
|
+
phase: 'ERROR',
|
|
95
|
+
duration,
|
|
96
|
+
error: error instanceof Error ? error.message : String(error),
|
|
97
|
+
stackTrace: error instanceof Error ? error.stack : undefined,
|
|
98
|
+
});
|
|
99
|
+
// F2: Capture failure snapshot (fire-and-forget, non-blocking)
|
|
100
|
+
let snapshotPath;
|
|
101
|
+
if (this.config?.enableFailureSnapshot) {
|
|
102
|
+
snapshotPath = await this.captureFailureSnapshot({
|
|
103
|
+
session,
|
|
104
|
+
toolName,
|
|
105
|
+
args,
|
|
106
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
107
|
+
duration,
|
|
108
|
+
}).catch((e) => {
|
|
109
|
+
childLogger.warn('Snapshot capture failed', {
|
|
110
|
+
error: e instanceof Error ? e.message : String(e),
|
|
111
|
+
});
|
|
112
|
+
return undefined;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// F3: Record failed tool call
|
|
116
|
+
this.recordToolCall(session, {
|
|
117
|
+
timestamp: new Date(startTime),
|
|
118
|
+
toolName,
|
|
119
|
+
duration,
|
|
120
|
+
success: false,
|
|
121
|
+
error: {
|
|
122
|
+
message: this.sanitizeErrorMessage(error instanceof Error ? error.message : String(error)),
|
|
123
|
+
snapshotPath,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
throw error; // Re-throw to preserve error handling
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check if a key name matches sensitive patterns (Issue #3)
|
|
132
|
+
*/
|
|
133
|
+
isSensitiveKey(key) {
|
|
134
|
+
return SENSITIVE_PATTERNS.some((pattern) => pattern.test(key));
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Sanitize arguments for logging (remove sensitive data, limit size)
|
|
138
|
+
* Issue #3: Enhanced with deep recursion and pattern matching
|
|
139
|
+
*/
|
|
140
|
+
sanitizeArgs(args, depth = 0) {
|
|
141
|
+
if (args === null || args === undefined) {
|
|
142
|
+
return args;
|
|
143
|
+
}
|
|
144
|
+
// Prevent infinite recursion
|
|
145
|
+
if (depth > MAX_SANITIZE_DEPTH) {
|
|
146
|
+
return '<Max sanitization depth reached>';
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
// For primitives, handle directly
|
|
150
|
+
if (typeof args !== 'object') {
|
|
151
|
+
if (typeof args === 'string' && args.length > MAX_LOG_SIZE) {
|
|
152
|
+
return args.substring(0, MAX_LOG_SIZE) + `... (${args.length} bytes total)`;
|
|
153
|
+
}
|
|
154
|
+
return args;
|
|
155
|
+
}
|
|
156
|
+
// Handle arrays
|
|
157
|
+
if (Array.isArray(args)) {
|
|
158
|
+
return args.map((item) => this.sanitizeArgs(item, depth + 1));
|
|
159
|
+
}
|
|
160
|
+
// Handle objects with deep sanitization
|
|
161
|
+
const sanitized = {};
|
|
162
|
+
for (const [key, value] of Object.entries(args)) {
|
|
163
|
+
// Redact sensitive keys (Issue #3: Pattern-based matching)
|
|
164
|
+
if (this.isSensitiveKey(key)) {
|
|
165
|
+
sanitized[key] = '[REDACTED]';
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
// Truncate large strings
|
|
169
|
+
if (typeof value === 'string' && value.length > MAX_LOG_SIZE) {
|
|
170
|
+
sanitized[key] = value.substring(0, MAX_LOG_SIZE) + `... (${value.length} bytes total)`;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
// Convert buffers to placeholder
|
|
174
|
+
if (value &&
|
|
175
|
+
typeof value === 'object' &&
|
|
176
|
+
'type' in value &&
|
|
177
|
+
value.type === 'Buffer' &&
|
|
178
|
+
'data' in value) {
|
|
179
|
+
const bufferData = value.data;
|
|
180
|
+
sanitized[key] = `<Buffer ${bufferData?.length || 0} bytes>`;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
// Recursively sanitize nested objects/arrays (Issue #3: Deep sanitization)
|
|
184
|
+
if (value && typeof value === 'object') {
|
|
185
|
+
sanitized[key] = this.sanitizeArgs(value, depth + 1);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
sanitized[key] = value;
|
|
189
|
+
}
|
|
190
|
+
return sanitized;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
// If sanitization fails, return placeholder
|
|
194
|
+
return '<Failed to sanitize args>';
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Sanitize result for logging (limit size, remove large objects)
|
|
199
|
+
* Issue #3: Use same deep sanitization as args
|
|
200
|
+
*/
|
|
201
|
+
sanitizeResult(result, depth = 0) {
|
|
202
|
+
if (result === null || result === undefined) {
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
205
|
+
// Prevent infinite recursion
|
|
206
|
+
if (depth > MAX_SANITIZE_DEPTH) {
|
|
207
|
+
return '<Max sanitization depth reached>';
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
// For simple types, return as-is
|
|
211
|
+
if (typeof result !== 'object') {
|
|
212
|
+
if (typeof result === 'string' && result.length > MAX_LOG_SIZE) {
|
|
213
|
+
return result.substring(0, MAX_LOG_SIZE) + `... (${result.length} bytes total)`;
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
// Handle arrays
|
|
218
|
+
if (Array.isArray(result)) {
|
|
219
|
+
if (result.length > 10) {
|
|
220
|
+
return [
|
|
221
|
+
...result.slice(0, 10).map((item) => this.sanitizeResult(item, depth + 1)),
|
|
222
|
+
`... (${result.length - 10} more items)`,
|
|
223
|
+
];
|
|
224
|
+
}
|
|
225
|
+
return result.map((item) => this.sanitizeResult(item, depth + 1));
|
|
226
|
+
}
|
|
227
|
+
// For objects, sanitize with deep recursion
|
|
228
|
+
const sanitized = {};
|
|
229
|
+
for (const [key, value] of Object.entries(result)) {
|
|
230
|
+
// Redact sensitive keys in results too (Issue #3)
|
|
231
|
+
if (this.isSensitiveKey(key)) {
|
|
232
|
+
sanitized[key] = '[REDACTED]';
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
// Truncate large strings
|
|
236
|
+
if (typeof value === 'string' && value.length > MAX_LOG_SIZE) {
|
|
237
|
+
sanitized[key] = value.substring(0, MAX_LOG_SIZE) + `... (${value.length} bytes total)`;
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
// Convert buffers to placeholder
|
|
241
|
+
if (value &&
|
|
242
|
+
typeof value === 'object' &&
|
|
243
|
+
'type' in value &&
|
|
244
|
+
value.type === 'Buffer' &&
|
|
245
|
+
'data' in value) {
|
|
246
|
+
const bufferData = value.data;
|
|
247
|
+
sanitized[key] = `<Buffer ${bufferData?.length || 0} bytes>`;
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
// Recursively sanitize nested objects/arrays
|
|
251
|
+
if (value && typeof value === 'object') {
|
|
252
|
+
sanitized[key] = this.sanitizeResult(value, depth + 1);
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
sanitized[key] = value;
|
|
256
|
+
}
|
|
257
|
+
return sanitized;
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
// If sanitization fails, return placeholder
|
|
261
|
+
return '<Failed to sanitize result>';
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Capture failure snapshot when tool call fails (F2 feature)
|
|
266
|
+
*
|
|
267
|
+
* Creates a failure directory with:
|
|
268
|
+
* - snapshot.json: Page data
|
|
269
|
+
* - snapshot.png: Screenshot
|
|
270
|
+
* - error-context.json: Error details + tool context
|
|
271
|
+
*
|
|
272
|
+
* @param context Failure context
|
|
273
|
+
* @returns Relative path to the failure directory (for F3 reporting)
|
|
274
|
+
*/
|
|
275
|
+
async captureFailureSnapshot(context) {
|
|
276
|
+
const { session, toolName, args, error, duration } = context;
|
|
277
|
+
const logger = this.logger;
|
|
278
|
+
// Issue #P2: Prevent recursive snapshot triggers
|
|
279
|
+
if (this.capturing) {
|
|
280
|
+
logger?.debug('Skipping failure snapshot: already capturing');
|
|
281
|
+
return undefined;
|
|
282
|
+
}
|
|
283
|
+
this.capturing = true;
|
|
284
|
+
try {
|
|
285
|
+
// 1. Check prerequisites
|
|
286
|
+
if (!this.config?.enableFailureSnapshot) {
|
|
287
|
+
return undefined; // Feature disabled
|
|
288
|
+
}
|
|
289
|
+
if (!session.miniProgram) {
|
|
290
|
+
logger?.debug('Skipping failure snapshot: miniProgram not connected');
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
293
|
+
if (!session.outputManager) {
|
|
294
|
+
logger?.debug('Skipping failure snapshot: outputManager not available');
|
|
295
|
+
return undefined;
|
|
296
|
+
}
|
|
297
|
+
// 2. Create failure directory
|
|
298
|
+
// Issue #P1: Sanitize toolName to prevent path traversal
|
|
299
|
+
const sanitizedToolName = toolName.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
300
|
+
// Issue #P1: Preserve millisecond precision to avoid collisions
|
|
301
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').replace('T', '_');
|
|
302
|
+
const failureDirName = `${sanitizedToolName}-${timestamp}`;
|
|
303
|
+
const failureDir = `failures/${failureDirName}`;
|
|
304
|
+
const outputManager = session.outputManager;
|
|
305
|
+
await outputManager.ensureOutputDir();
|
|
306
|
+
// Create failures subdirectory
|
|
307
|
+
const { mkdir } = await import('fs/promises');
|
|
308
|
+
const { join } = await import('path');
|
|
309
|
+
const failurePath = join(outputManager.getOutputDir(), failureDir);
|
|
310
|
+
await mkdir(failurePath, { recursive: true });
|
|
311
|
+
logger?.info('Capturing failure snapshot', { path: failurePath });
|
|
312
|
+
// 3. Capture page snapshot
|
|
313
|
+
const snapshotFilename = join(failureDir, 'snapshot.json');
|
|
314
|
+
const snapshotTools = await import('../../tools/snapshot.js');
|
|
315
|
+
await snapshotTools.snapshotPage(session, {
|
|
316
|
+
filename: snapshotFilename,
|
|
317
|
+
includeScreenshot: true,
|
|
318
|
+
fullPage: false,
|
|
319
|
+
});
|
|
320
|
+
// 4. Save error context
|
|
321
|
+
const errorContext = {
|
|
322
|
+
toolName,
|
|
323
|
+
timestamp: new Date().toISOString(),
|
|
324
|
+
error: {
|
|
325
|
+
message: error.message,
|
|
326
|
+
// Issue #P2: Sanitize stack trace to remove sensitive paths
|
|
327
|
+
stack: this.sanitizeStackTrace(error.stack),
|
|
328
|
+
code: error.code,
|
|
329
|
+
},
|
|
330
|
+
args: this.sanitizeArgs(args), // Reuse existing sanitization
|
|
331
|
+
duration,
|
|
332
|
+
};
|
|
333
|
+
const contextFilename = join(failureDir, 'error-context.json');
|
|
334
|
+
await outputManager.writeFile(contextFilename, Buffer.from(JSON.stringify(errorContext, null, 2)));
|
|
335
|
+
logger?.info('Failure snapshot captured successfully', {
|
|
336
|
+
path: failurePath,
|
|
337
|
+
files: ['snapshot.json', 'snapshot.png', 'error-context.json'],
|
|
338
|
+
});
|
|
339
|
+
// F3: Return relative path for report linking
|
|
340
|
+
return failureDir;
|
|
341
|
+
}
|
|
342
|
+
catch (snapshotError) {
|
|
343
|
+
// Snapshot capture failed - log but don't throw
|
|
344
|
+
logger?.warn('Failed to capture failure snapshot', {
|
|
345
|
+
error: snapshotError instanceof Error ? snapshotError.message : String(snapshotError),
|
|
346
|
+
});
|
|
347
|
+
return undefined;
|
|
348
|
+
}
|
|
349
|
+
finally {
|
|
350
|
+
this.capturing = false;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Record a tool call to session report data (F3 feature)
|
|
355
|
+
*
|
|
356
|
+
* Adds a tool call record to the session's reportData. Implements
|
|
357
|
+
* memory protection by limiting to MAX_TOOL_CALL_RECORDS with FIFO eviction.
|
|
358
|
+
*
|
|
359
|
+
* @param session Session state
|
|
360
|
+
* @param record Tool call record to add
|
|
361
|
+
*/
|
|
362
|
+
recordToolCall(session, record) {
|
|
363
|
+
// Skip if session reporting is not enabled
|
|
364
|
+
if (!session.reportData) {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
// Add record to the array
|
|
368
|
+
session.reportData.toolCalls.push(record);
|
|
369
|
+
// F3-P2: Memory protection with batch eviction for better performance
|
|
370
|
+
// Instead of shift() every time (O(n)), we batch-remove when hitting 1.5x limit
|
|
371
|
+
// This reduces eviction frequency from every call to every 500 calls
|
|
372
|
+
const currentLength = session.reportData.toolCalls.length;
|
|
373
|
+
if (currentLength >= MAX_TOOL_CALL_RECORDS * 1.5) {
|
|
374
|
+
// Remove oldest 50% to get back to limit
|
|
375
|
+
const removeCount = Math.floor(MAX_TOOL_CALL_RECORDS * 0.5);
|
|
376
|
+
const removed = session.reportData.toolCalls.splice(0, removeCount);
|
|
377
|
+
this.logger?.debug('Tool call records evicted (memory limit)', {
|
|
378
|
+
removedCount: removed.length,
|
|
379
|
+
oldestTool: removed[0]?.toolName,
|
|
380
|
+
oldestTimestamp: removed[0]?.timestamp,
|
|
381
|
+
newestRemovedTool: removed[removed.length - 1]?.toolName,
|
|
382
|
+
currentCount: session.reportData.toolCalls.length,
|
|
383
|
+
maxCount: MAX_TOOL_CALL_RECORDS,
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Sanitize error message to remove sensitive information (F3-S1)
|
|
389
|
+
*
|
|
390
|
+
* Removes:
|
|
391
|
+
* - File paths (Unix, Linux, Windows)
|
|
392
|
+
* - API keys and tokens (32+ character alphanumeric strings)
|
|
393
|
+
* - Stack trace locations
|
|
394
|
+
*
|
|
395
|
+
* @param message Raw error message
|
|
396
|
+
* @returns Sanitized error message with placeholders
|
|
397
|
+
*/
|
|
398
|
+
sanitizeErrorMessage(message) {
|
|
399
|
+
if (!message)
|
|
400
|
+
return message;
|
|
401
|
+
try {
|
|
402
|
+
return (message
|
|
403
|
+
// Replace Unix user paths: /Users/username/ -> /Users/<user>/
|
|
404
|
+
.replace(/\/Users\/[^/]+\//g, '/Users/<user>/')
|
|
405
|
+
// Replace Linux home paths: /home/username/ -> /home/<user>/
|
|
406
|
+
.replace(/\/home\/[^/]+\//g, '/home/<user>/')
|
|
407
|
+
// Replace Windows user paths: C:\Users\username\ -> C:\Users\<user>\
|
|
408
|
+
.replace(/C:\\Users\\[^\\]+\\/gi, 'C:\\Users\\<user>\\')
|
|
409
|
+
// Replace common environment paths
|
|
410
|
+
.replace(/\/opt\/[^/\s]+\//g, '/opt/<app>/')
|
|
411
|
+
.replace(/\/var\/[^/\s]+\//g, '/var/<app>/')
|
|
412
|
+
// Replace long alphanumeric strings with underscores/hyphens (likely API keys/tokens)
|
|
413
|
+
.replace(/\b[a-zA-Z0-9_-]{32,}\b/g, '<REDACTED>')
|
|
414
|
+
// Replace stack trace locations: "at path:line:col" or " at path:line:col" -> "at <path>:<line>:<col>"
|
|
415
|
+
.replace(/\bat\s+[^:\s]+:\d+:\d+/g, 'at <path>:<line>:<col>'));
|
|
416
|
+
}
|
|
417
|
+
catch (error) {
|
|
418
|
+
// If sanitization fails, return placeholder to avoid leaking raw message
|
|
419
|
+
return '<Failed to sanitize error message>';
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Sanitize stack trace to remove sensitive file paths (Issue #P2)
|
|
424
|
+
*
|
|
425
|
+
* Removes:
|
|
426
|
+
* - Absolute user paths (/Users/<username>/, /home/<username>/)
|
|
427
|
+
* - Windows paths (C:\Users\<username>\)
|
|
428
|
+
* - Environment-specific paths
|
|
429
|
+
*
|
|
430
|
+
* @param stack Raw stack trace
|
|
431
|
+
* @returns Sanitized stack trace with placeholders
|
|
432
|
+
*/
|
|
433
|
+
sanitizeStackTrace(stack) {
|
|
434
|
+
if (!stack)
|
|
435
|
+
return stack;
|
|
436
|
+
try {
|
|
437
|
+
return (stack
|
|
438
|
+
// Replace Unix user paths: /Users/username/ -> /Users/<user>/
|
|
439
|
+
.replace(/\/Users\/[^/]+\//g, '/Users/<user>/')
|
|
440
|
+
// Replace Linux home paths: /home/username/ -> /home/<user>/
|
|
441
|
+
.replace(/\/home\/[^/]+\//g, '/home/<user>/')
|
|
442
|
+
// Replace Windows user paths: C:\Users\username\ -> C:\Users\<user>\
|
|
443
|
+
.replace(/C:\\Users\\[^\\]+\\/gi, 'C:\\Users\\<user>\\')
|
|
444
|
+
// Replace common environment variables that may leak info
|
|
445
|
+
.replace(/\/opt\/[^/]+\//g, '/opt/<app>/')
|
|
446
|
+
.replace(/\/var\/[^/]+\//g, '/var/<app>/'));
|
|
447
|
+
}
|
|
448
|
+
catch (error) {
|
|
449
|
+
// If sanitization fails, return placeholder to avoid leaking raw stack
|
|
450
|
+
return '<Stack trace sanitization failed>';
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
//# sourceMappingURL=tool-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-logger.js","sourceRoot":"","sources":["../../../src/runtime/logging/tool-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/outputs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/outputs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { OutputManager, OutputType } from '../../types.js';
|
|
2
|
+
export declare class FileOutputManager implements OutputManager {
|
|
3
|
+
private outputDir;
|
|
4
|
+
private counter;
|
|
5
|
+
constructor(outputDir: string);
|
|
6
|
+
getOutputDir(): string;
|
|
7
|
+
generateFilename(type: OutputType, extension: string): string;
|
|
8
|
+
writeFile(filename: string, content: Buffer | string): Promise<string>;
|
|
9
|
+
ensureOutputDir(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare function createOutputManager(outputDir: string): OutputManager;
|
|
12
|
+
//# sourceMappingURL=output-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-manager.d.ts","sourceRoot":"","sources":["../../../src/runtime/outputs/output-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE/D,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,OAAO,CAAyB;gBAE5B,SAAS,EAAE,MAAM;IAK7B,YAAY,IAAI,MAAM;IAItB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAOvD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWtE,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAKvC;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAEpE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { mkdir, writeFile as fsWriteFile } from 'fs/promises';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
export class FileOutputManager {
|
|
5
|
+
outputDir;
|
|
6
|
+
counter;
|
|
7
|
+
constructor(outputDir) {
|
|
8
|
+
this.outputDir = outputDir;
|
|
9
|
+
this.counter = new Map();
|
|
10
|
+
}
|
|
11
|
+
getOutputDir() {
|
|
12
|
+
return this.outputDir;
|
|
13
|
+
}
|
|
14
|
+
generateFilename(type, extension) {
|
|
15
|
+
const count = this.counter.get(type) || 0;
|
|
16
|
+
this.counter.set(type, count + 1);
|
|
17
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
18
|
+
return `${type}-${count + 1}-${timestamp}.${extension}`;
|
|
19
|
+
}
|
|
20
|
+
async writeFile(filename, content) {
|
|
21
|
+
await this.ensureOutputDir();
|
|
22
|
+
const fullPath = join(this.outputDir, filename);
|
|
23
|
+
const fileDir = dirname(fullPath);
|
|
24
|
+
if (!existsSync(fileDir)) {
|
|
25
|
+
await mkdir(fileDir, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
await fsWriteFile(fullPath, content);
|
|
28
|
+
return fullPath;
|
|
29
|
+
}
|
|
30
|
+
async ensureOutputDir() {
|
|
31
|
+
if (!existsSync(this.outputDir)) {
|
|
32
|
+
await mkdir(this.outputDir, { recursive: true });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function createOutputManager(outputDir) {
|
|
37
|
+
return new FileOutputManager(outputDir);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=output-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-manager.js","sourceRoot":"","sources":["../../../src/runtime/outputs/output-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAG/B,MAAM,OAAO,iBAAiB;IACpB,SAAS,CAAQ;IACjB,OAAO,CAAyB;IAExC,YAAY,SAAiB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAA;IAC1B,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,gBAAgB,CAAC,IAAgB,EAAE,SAAiB;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;QACjC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7E,OAAO,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,IAAI,SAAS,IAAI,SAAS,EAAE,CAAA;IACzD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,OAAwB;QACxD,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;QACjC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3C,CAAC;QACD,MAAM,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACpC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,OAAO,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SessionState, SessionReport } from '../../types.js';
|
|
2
|
+
export declare function generateSessionReport(session: SessionState): SessionReport;
|
|
3
|
+
export declare function generateMarkdownReport(report: SessionReport): string;
|
|
4
|
+
export declare function generateAndSaveReports(session: SessionState): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=report-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-generator.d.ts","sourceRoot":"","sources":["../../../src/runtime/outputs/report-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAA;AA8BjF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CA+B1E;AAuDD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAuEpE;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BjF"}
|