@frontmcp/plugins 0.4.0 → 0.5.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 (98) hide show
  1. package/package.json +8 -3
  2. package/src/cache/cache.plugin.js +27 -25
  3. package/src/cache/cache.plugin.js.map +1 -1
  4. package/src/cache/providers/cache-memory.provider.js +2 -1
  5. package/src/cache/providers/cache-memory.provider.js.map +1 -1
  6. package/src/cache/providers/cache-redis.provider.js +1 -0
  7. package/src/cache/providers/cache-redis.provider.js.map +1 -1
  8. package/src/codecall/README.md +999 -0
  9. package/src/codecall/codecall.plugin.d.ts +41 -0
  10. package/src/codecall/codecall.plugin.js +152 -0
  11. package/src/codecall/codecall.plugin.js.map +1 -0
  12. package/src/codecall/codecall.symbol.d.ts +106 -0
  13. package/src/codecall/codecall.symbol.js +4 -0
  14. package/src/codecall/codecall.symbol.js.map +1 -0
  15. package/src/codecall/codecall.types.d.ts +289 -0
  16. package/src/codecall/codecall.types.js +258 -0
  17. package/src/codecall/codecall.types.js.map +1 -0
  18. package/src/codecall/errors/index.d.ts +1 -0
  19. package/src/codecall/errors/index.js +6 -0
  20. package/src/codecall/errors/index.js.map +1 -0
  21. package/src/codecall/errors/tool-call.errors.d.ts +79 -0
  22. package/src/codecall/errors/tool-call.errors.js +119 -0
  23. package/src/codecall/errors/tool-call.errors.js.map +1 -0
  24. package/src/codecall/index.d.ts +2 -0
  25. package/src/codecall/index.js +8 -0
  26. package/src/codecall/index.js.map +1 -0
  27. package/src/codecall/providers/code-call.config.d.ts +29 -0
  28. package/src/codecall/providers/code-call.config.js +120 -0
  29. package/src/codecall/providers/code-call.config.js.map +1 -0
  30. package/src/codecall/security/index.d.ts +2 -0
  31. package/src/codecall/security/index.js +7 -0
  32. package/src/codecall/security/index.js.map +1 -0
  33. package/src/codecall/security/self-reference-guard.d.ts +32 -0
  34. package/src/codecall/security/self-reference-guard.js +70 -0
  35. package/src/codecall/security/self-reference-guard.js.map +1 -0
  36. package/src/codecall/security/tool-access-control.service.d.ts +104 -0
  37. package/src/codecall/security/tool-access-control.service.js +170 -0
  38. package/src/codecall/security/tool-access-control.service.js.map +1 -0
  39. package/src/codecall/services/audit-logger.service.d.ts +186 -0
  40. package/src/codecall/services/audit-logger.service.js +322 -0
  41. package/src/codecall/services/audit-logger.service.js.map +1 -0
  42. package/src/codecall/services/enclave.service.d.ts +62 -0
  43. package/src/codecall/services/enclave.service.js +214 -0
  44. package/src/codecall/services/enclave.service.js.map +1 -0
  45. package/src/codecall/services/error-enrichment.service.d.ts +94 -0
  46. package/src/codecall/services/error-enrichment.service.js +387 -0
  47. package/src/codecall/services/error-enrichment.service.js.map +1 -0
  48. package/src/codecall/services/index.d.ts +6 -0
  49. package/src/codecall/services/index.js +13 -0
  50. package/src/codecall/services/index.js.map +1 -0
  51. package/src/codecall/services/output-sanitizer.d.ts +86 -0
  52. package/src/codecall/services/output-sanitizer.js +260 -0
  53. package/src/codecall/services/output-sanitizer.js.map +1 -0
  54. package/src/codecall/services/synonym-expansion.service.d.ts +66 -0
  55. package/src/codecall/services/synonym-expansion.service.js +374 -0
  56. package/src/codecall/services/synonym-expansion.service.js.map +1 -0
  57. package/src/codecall/services/tool-search.service.d.ts +175 -0
  58. package/src/codecall/services/tool-search.service.js +587 -0
  59. package/src/codecall/services/tool-search.service.js.map +1 -0
  60. package/src/codecall/tools/describe.schema.d.ts +28 -0
  61. package/src/codecall/tools/describe.schema.js +67 -0
  62. package/src/codecall/tools/describe.schema.js.map +1 -0
  63. package/src/codecall/tools/describe.tool.d.ts +35 -0
  64. package/src/codecall/tools/describe.tool.js +207 -0
  65. package/src/codecall/tools/describe.tool.js.map +1 -0
  66. package/src/codecall/tools/execute.schema.d.ts +115 -0
  67. package/src/codecall/tools/execute.schema.js +116 -0
  68. package/src/codecall/tools/execute.schema.js.map +1 -0
  69. package/src/codecall/tools/execute.tool.d.ts +5 -0
  70. package/src/codecall/tools/execute.tool.js +238 -0
  71. package/src/codecall/tools/execute.tool.js.map +1 -0
  72. package/src/codecall/tools/index.d.ts +4 -0
  73. package/src/codecall/tools/index.js +13 -0
  74. package/src/codecall/tools/index.js.map +1 -0
  75. package/src/codecall/tools/invoke.schema.d.ts +55 -0
  76. package/src/codecall/tools/invoke.schema.js +27 -0
  77. package/src/codecall/tools/invoke.schema.js.map +1 -0
  78. package/src/codecall/tools/invoke.tool.d.ts +13 -0
  79. package/src/codecall/tools/invoke.tool.js +70 -0
  80. package/src/codecall/tools/invoke.tool.js.map +1 -0
  81. package/src/codecall/tools/search.schema.d.ts +30 -0
  82. package/src/codecall/tools/search.schema.js +60 -0
  83. package/src/codecall/tools/search.schema.js.map +1 -0
  84. package/src/codecall/tools/search.tool.d.ts +5 -0
  85. package/src/codecall/tools/search.tool.js +108 -0
  86. package/src/codecall/tools/search.tool.js.map +1 -0
  87. package/src/codecall/utils/describe.utils.d.ts +86 -0
  88. package/src/codecall/utils/describe.utils.js +531 -0
  89. package/src/codecall/utils/describe.utils.js.map +1 -0
  90. package/src/codecall/utils/index.d.ts +2 -0
  91. package/src/codecall/utils/index.js +7 -0
  92. package/src/codecall/utils/index.js.map +1 -0
  93. package/src/codecall/utils/mcp-result.d.ts +6 -0
  94. package/src/codecall/utils/mcp-result.js +36 -0
  95. package/src/codecall/utils/mcp-result.js.map +1 -0
  96. package/src/index.d.ts +2 -0
  97. package/src/index.js +3 -1
  98. package/src/index.js.map +1 -1
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Audit event types for CodeCall operations.
3
+ */
4
+ export declare const AUDIT_EVENT_TYPES: {
5
+ /** Script execution started */
6
+ readonly EXECUTION_START: "codecall:execution:start";
7
+ /** Script execution completed successfully */
8
+ readonly EXECUTION_SUCCESS: "codecall:execution:success";
9
+ /** Script execution failed */
10
+ readonly EXECUTION_FAILURE: "codecall:execution:failure";
11
+ /** Script execution timed out */
12
+ readonly EXECUTION_TIMEOUT: "codecall:execution:timeout";
13
+ /** Tool call initiated from script */
14
+ readonly TOOL_CALL_START: "codecall:tool:call:start";
15
+ /** Tool call completed successfully */
16
+ readonly TOOL_CALL_SUCCESS: "codecall:tool:call:success";
17
+ /** Tool call failed */
18
+ readonly TOOL_CALL_FAILURE: "codecall:tool:call:failure";
19
+ /** Self-reference attack blocked */
20
+ readonly SECURITY_SELF_REFERENCE: "codecall:security:self-reference";
21
+ /** Tool access denied */
22
+ readonly SECURITY_ACCESS_DENIED: "codecall:security:access-denied";
23
+ /** AST validation failed (blocked code pattern) */
24
+ readonly SECURITY_AST_BLOCKED: "codecall:security:ast-blocked";
25
+ /** Search performed */
26
+ readonly SEARCH_PERFORMED: "codecall:search:performed";
27
+ /** Tool described */
28
+ readonly DESCRIBE_PERFORMED: "codecall:describe:performed";
29
+ /** Direct invoke performed */
30
+ readonly INVOKE_PERFORMED: "codecall:invoke:performed";
31
+ };
32
+ export type AuditEventType = (typeof AUDIT_EVENT_TYPES)[keyof typeof AUDIT_EVENT_TYPES];
33
+ /**
34
+ * Base audit event structure.
35
+ */
36
+ export interface AuditEvent {
37
+ /** Event type */
38
+ type: AuditEventType;
39
+ /** ISO timestamp */
40
+ timestamp: string;
41
+ /** Unique execution ID for correlation */
42
+ executionId: string;
43
+ /** Duration in milliseconds (if applicable) */
44
+ durationMs?: number;
45
+ /** Additional event-specific data */
46
+ data?: Record<string, unknown>;
47
+ }
48
+ /**
49
+ * Execution audit event with script details.
50
+ */
51
+ export interface ExecutionAuditEvent extends AuditEvent {
52
+ type: typeof AUDIT_EVENT_TYPES.EXECUTION_START | typeof AUDIT_EVENT_TYPES.EXECUTION_SUCCESS | typeof AUDIT_EVENT_TYPES.EXECUTION_FAILURE | typeof AUDIT_EVENT_TYPES.EXECUTION_TIMEOUT;
53
+ data: {
54
+ /** Script hash (NOT the full script - security!) */
55
+ scriptHash: string;
56
+ /** Script length in characters */
57
+ scriptLength: number;
58
+ /** Number of tool calls made */
59
+ toolCallCount?: number;
60
+ /** Error message (sanitized) if failed */
61
+ error?: string;
62
+ };
63
+ }
64
+ /**
65
+ * Tool call audit event.
66
+ */
67
+ export interface ToolCallAuditEvent extends AuditEvent {
68
+ type: typeof AUDIT_EVENT_TYPES.TOOL_CALL_START | typeof AUDIT_EVENT_TYPES.TOOL_CALL_SUCCESS | typeof AUDIT_EVENT_TYPES.TOOL_CALL_FAILURE;
69
+ data: {
70
+ /** Tool name */
71
+ toolName: string;
72
+ /** Call depth (nested calls) */
73
+ callDepth: number;
74
+ /** Error code if failed */
75
+ errorCode?: string;
76
+ };
77
+ }
78
+ /**
79
+ * Security audit event.
80
+ */
81
+ export interface SecurityAuditEvent extends AuditEvent {
82
+ type: typeof AUDIT_EVENT_TYPES.SECURITY_SELF_REFERENCE | typeof AUDIT_EVENT_TYPES.SECURITY_ACCESS_DENIED | typeof AUDIT_EVENT_TYPES.SECURITY_AST_BLOCKED;
83
+ data: {
84
+ /** What was blocked */
85
+ blocked: string;
86
+ /** Reason for blocking */
87
+ reason: string;
88
+ };
89
+ }
90
+ /**
91
+ * Audit event listener function type.
92
+ */
93
+ export type AuditEventListener = (event: AuditEvent) => void;
94
+ /**
95
+ * Audit Logger Service
96
+ *
97
+ * Provides centralized audit logging for all CodeCall operations.
98
+ * Uses the SDK event emitter pattern for integration with external systems.
99
+ *
100
+ * Security considerations:
101
+ * - NEVER logs full scripts (only hashes)
102
+ * - NEVER logs tool inputs/outputs (only metadata)
103
+ * - NEVER logs sensitive error details (only sanitized messages)
104
+ * - All events include execution ID for correlation
105
+ */
106
+ export declare class AuditLoggerService {
107
+ private listeners;
108
+ private executionCounter;
109
+ /**
110
+ * Subscribe to audit events.
111
+ *
112
+ * @param listener - Function to call when events occur
113
+ * @returns Unsubscribe function
114
+ */
115
+ subscribe(listener: AuditEventListener): () => void;
116
+ /**
117
+ * Generate a unique execution ID.
118
+ */
119
+ generateExecutionId(): string;
120
+ /**
121
+ * Log execution start.
122
+ */
123
+ logExecutionStart(executionId: string, script: string): void;
124
+ /**
125
+ * Log execution success.
126
+ */
127
+ logExecutionSuccess(executionId: string, script: string, durationMs: number, toolCallCount: number): void;
128
+ /**
129
+ * Log execution failure.
130
+ */
131
+ logExecutionFailure(executionId: string, script: string, durationMs: number, error: string): void;
132
+ /**
133
+ * Log execution timeout.
134
+ */
135
+ logExecutionTimeout(executionId: string, script: string, durationMs: number): void;
136
+ /**
137
+ * Log tool call start.
138
+ */
139
+ logToolCallStart(executionId: string, toolName: string, callDepth: number): void;
140
+ /**
141
+ * Log tool call success.
142
+ */
143
+ logToolCallSuccess(executionId: string, toolName: string, callDepth: number, durationMs: number): void;
144
+ /**
145
+ * Log tool call failure.
146
+ */
147
+ logToolCallFailure(executionId: string, toolName: string, callDepth: number, durationMs: number, errorCode: string): void;
148
+ /**
149
+ * Log security event: self-reference blocked.
150
+ */
151
+ logSecuritySelfReference(executionId: string, toolName: string): void;
152
+ /**
153
+ * Log security event: access denied.
154
+ */
155
+ logSecurityAccessDenied(executionId: string, toolName: string, reason: string): void;
156
+ /**
157
+ * Log security event: AST validation blocked.
158
+ */
159
+ logSecurityAstBlocked(executionId: string, pattern: string, reason: string): void;
160
+ /**
161
+ * Log search operation.
162
+ */
163
+ logSearch(executionId: string, query: string, resultCount: number, durationMs: number): void;
164
+ /**
165
+ * Log describe operation.
166
+ */
167
+ logDescribe(executionId: string, toolNames: string[], durationMs: number): void;
168
+ /**
169
+ * Log invoke operation.
170
+ */
171
+ logInvoke(executionId: string, toolName: string, success: boolean, durationMs: number): void;
172
+ /**
173
+ * Emit an audit event to all listeners.
174
+ */
175
+ private emit;
176
+ /**
177
+ * Create a simple hash of the script for identification.
178
+ * Uses a fast, non-cryptographic hash for performance.
179
+ */
180
+ private hashScript;
181
+ /**
182
+ * Sanitize error messages to remove sensitive information.
183
+ */
184
+ private sanitizeError;
185
+ }
186
+ export default AuditLoggerService;
@@ -0,0 +1,322 @@
1
+ "use strict";
2
+ // file: libs/plugins/src/codecall/services/audit-logger.service.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AuditLoggerService = exports.AUDIT_EVENT_TYPES = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const sdk_1 = require("@frontmcp/sdk");
7
+ /**
8
+ * Audit event types for CodeCall operations.
9
+ */
10
+ exports.AUDIT_EVENT_TYPES = {
11
+ /** Script execution started */
12
+ EXECUTION_START: 'codecall:execution:start',
13
+ /** Script execution completed successfully */
14
+ EXECUTION_SUCCESS: 'codecall:execution:success',
15
+ /** Script execution failed */
16
+ EXECUTION_FAILURE: 'codecall:execution:failure',
17
+ /** Script execution timed out */
18
+ EXECUTION_TIMEOUT: 'codecall:execution:timeout',
19
+ /** Tool call initiated from script */
20
+ TOOL_CALL_START: 'codecall:tool:call:start',
21
+ /** Tool call completed successfully */
22
+ TOOL_CALL_SUCCESS: 'codecall:tool:call:success',
23
+ /** Tool call failed */
24
+ TOOL_CALL_FAILURE: 'codecall:tool:call:failure',
25
+ /** Self-reference attack blocked */
26
+ SECURITY_SELF_REFERENCE: 'codecall:security:self-reference',
27
+ /** Tool access denied */
28
+ SECURITY_ACCESS_DENIED: 'codecall:security:access-denied',
29
+ /** AST validation failed (blocked code pattern) */
30
+ SECURITY_AST_BLOCKED: 'codecall:security:ast-blocked',
31
+ /** Search performed */
32
+ SEARCH_PERFORMED: 'codecall:search:performed',
33
+ /** Tool described */
34
+ DESCRIBE_PERFORMED: 'codecall:describe:performed',
35
+ /** Direct invoke performed */
36
+ INVOKE_PERFORMED: 'codecall:invoke:performed',
37
+ };
38
+ /**
39
+ * Audit Logger Service
40
+ *
41
+ * Provides centralized audit logging for all CodeCall operations.
42
+ * Uses the SDK event emitter pattern for integration with external systems.
43
+ *
44
+ * Security considerations:
45
+ * - NEVER logs full scripts (only hashes)
46
+ * - NEVER logs tool inputs/outputs (only metadata)
47
+ * - NEVER logs sensitive error details (only sanitized messages)
48
+ * - All events include execution ID for correlation
49
+ */
50
+ let AuditLoggerService = class AuditLoggerService {
51
+ listeners = new Set();
52
+ executionCounter = 0;
53
+ /**
54
+ * Subscribe to audit events.
55
+ *
56
+ * @param listener - Function to call when events occur
57
+ * @returns Unsubscribe function
58
+ */
59
+ subscribe(listener) {
60
+ this.listeners.add(listener);
61
+ return () => {
62
+ this.listeners.delete(listener);
63
+ };
64
+ }
65
+ /**
66
+ * Generate a unique execution ID.
67
+ */
68
+ generateExecutionId() {
69
+ const timestamp = Date.now().toString(36);
70
+ const counter = (++this.executionCounter).toString(36).padStart(4, '0');
71
+ const random = Math.random().toString(36).substring(2, 8);
72
+ return `exec_${timestamp}_${counter}_${random}`;
73
+ }
74
+ /**
75
+ * Log execution start.
76
+ */
77
+ logExecutionStart(executionId, script) {
78
+ this.emit({
79
+ type: exports.AUDIT_EVENT_TYPES.EXECUTION_START,
80
+ timestamp: new Date().toISOString(),
81
+ executionId,
82
+ data: {
83
+ scriptHash: this.hashScript(script),
84
+ scriptLength: script.length,
85
+ },
86
+ });
87
+ }
88
+ /**
89
+ * Log execution success.
90
+ */
91
+ logExecutionSuccess(executionId, script, durationMs, toolCallCount) {
92
+ this.emit({
93
+ type: exports.AUDIT_EVENT_TYPES.EXECUTION_SUCCESS,
94
+ timestamp: new Date().toISOString(),
95
+ executionId,
96
+ durationMs,
97
+ data: {
98
+ scriptHash: this.hashScript(script),
99
+ scriptLength: script.length,
100
+ toolCallCount,
101
+ },
102
+ });
103
+ }
104
+ /**
105
+ * Log execution failure.
106
+ */
107
+ logExecutionFailure(executionId, script, durationMs, error) {
108
+ this.emit({
109
+ type: exports.AUDIT_EVENT_TYPES.EXECUTION_FAILURE,
110
+ timestamp: new Date().toISOString(),
111
+ executionId,
112
+ durationMs,
113
+ data: {
114
+ scriptHash: this.hashScript(script),
115
+ scriptLength: script.length,
116
+ error: this.sanitizeError(error),
117
+ },
118
+ });
119
+ }
120
+ /**
121
+ * Log execution timeout.
122
+ */
123
+ logExecutionTimeout(executionId, script, durationMs) {
124
+ this.emit({
125
+ type: exports.AUDIT_EVENT_TYPES.EXECUTION_TIMEOUT,
126
+ timestamp: new Date().toISOString(),
127
+ executionId,
128
+ durationMs,
129
+ data: {
130
+ scriptHash: this.hashScript(script),
131
+ scriptLength: script.length,
132
+ },
133
+ });
134
+ }
135
+ /**
136
+ * Log tool call start.
137
+ */
138
+ logToolCallStart(executionId, toolName, callDepth) {
139
+ this.emit({
140
+ type: exports.AUDIT_EVENT_TYPES.TOOL_CALL_START,
141
+ timestamp: new Date().toISOString(),
142
+ executionId,
143
+ data: {
144
+ toolName,
145
+ callDepth,
146
+ },
147
+ });
148
+ }
149
+ /**
150
+ * Log tool call success.
151
+ */
152
+ logToolCallSuccess(executionId, toolName, callDepth, durationMs) {
153
+ this.emit({
154
+ type: exports.AUDIT_EVENT_TYPES.TOOL_CALL_SUCCESS,
155
+ timestamp: new Date().toISOString(),
156
+ executionId,
157
+ durationMs,
158
+ data: {
159
+ toolName,
160
+ callDepth,
161
+ },
162
+ });
163
+ }
164
+ /**
165
+ * Log tool call failure.
166
+ */
167
+ logToolCallFailure(executionId, toolName, callDepth, durationMs, errorCode) {
168
+ this.emit({
169
+ type: exports.AUDIT_EVENT_TYPES.TOOL_CALL_FAILURE,
170
+ timestamp: new Date().toISOString(),
171
+ executionId,
172
+ durationMs,
173
+ data: {
174
+ toolName,
175
+ callDepth,
176
+ errorCode,
177
+ },
178
+ });
179
+ }
180
+ /**
181
+ * Log security event: self-reference blocked.
182
+ */
183
+ logSecuritySelfReference(executionId, toolName) {
184
+ this.emit({
185
+ type: exports.AUDIT_EVENT_TYPES.SECURITY_SELF_REFERENCE,
186
+ timestamp: new Date().toISOString(),
187
+ executionId,
188
+ data: {
189
+ blocked: toolName,
190
+ reason: 'Self-reference attack: attempted to call CodeCall tool from within AgentScript',
191
+ },
192
+ });
193
+ }
194
+ /**
195
+ * Log security event: access denied.
196
+ */
197
+ logSecurityAccessDenied(executionId, toolName, reason) {
198
+ this.emit({
199
+ type: exports.AUDIT_EVENT_TYPES.SECURITY_ACCESS_DENIED,
200
+ timestamp: new Date().toISOString(),
201
+ executionId,
202
+ data: {
203
+ blocked: toolName,
204
+ reason: this.sanitizeError(reason),
205
+ },
206
+ });
207
+ }
208
+ /**
209
+ * Log security event: AST validation blocked.
210
+ */
211
+ logSecurityAstBlocked(executionId, pattern, reason) {
212
+ this.emit({
213
+ type: exports.AUDIT_EVENT_TYPES.SECURITY_AST_BLOCKED,
214
+ timestamp: new Date().toISOString(),
215
+ executionId,
216
+ data: {
217
+ blocked: pattern,
218
+ reason: this.sanitizeError(reason),
219
+ },
220
+ });
221
+ }
222
+ /**
223
+ * Log search operation.
224
+ */
225
+ logSearch(executionId, query, resultCount, durationMs) {
226
+ this.emit({
227
+ type: exports.AUDIT_EVENT_TYPES.SEARCH_PERFORMED,
228
+ timestamp: new Date().toISOString(),
229
+ executionId,
230
+ durationMs,
231
+ data: {
232
+ queryLength: query.length,
233
+ resultCount,
234
+ },
235
+ });
236
+ }
237
+ /**
238
+ * Log describe operation.
239
+ */
240
+ logDescribe(executionId, toolNames, durationMs) {
241
+ this.emit({
242
+ type: exports.AUDIT_EVENT_TYPES.DESCRIBE_PERFORMED,
243
+ timestamp: new Date().toISOString(),
244
+ executionId,
245
+ durationMs,
246
+ data: {
247
+ toolCount: toolNames.length,
248
+ toolNames: toolNames.slice(0, 10), // Limit to first 10 for audit
249
+ },
250
+ });
251
+ }
252
+ /**
253
+ * Log invoke operation.
254
+ */
255
+ logInvoke(executionId, toolName, success, durationMs) {
256
+ this.emit({
257
+ type: exports.AUDIT_EVENT_TYPES.INVOKE_PERFORMED,
258
+ timestamp: new Date().toISOString(),
259
+ executionId,
260
+ durationMs,
261
+ data: {
262
+ toolName,
263
+ success,
264
+ },
265
+ });
266
+ }
267
+ /**
268
+ * Emit an audit event to all listeners.
269
+ */
270
+ emit(event) {
271
+ // Freeze the event to prevent modification
272
+ const frozenEvent = Object.freeze({ ...event, data: Object.freeze({ ...event.data }) });
273
+ for (const listener of this.listeners) {
274
+ try {
275
+ listener(frozenEvent);
276
+ }
277
+ catch {
278
+ // Never let listener errors propagate
279
+ }
280
+ }
281
+ }
282
+ /**
283
+ * Create a simple hash of the script for identification.
284
+ * Uses a fast, non-cryptographic hash for performance.
285
+ */
286
+ hashScript(script) {
287
+ let hash = 0;
288
+ for (let i = 0; i < script.length; i++) {
289
+ const char = script.charCodeAt(i);
290
+ hash = (hash << 5) - hash + char;
291
+ hash = hash & hash; // Convert to 32bit integer
292
+ }
293
+ return `sh_${(hash >>> 0).toString(16).padStart(8, '0')}`;
294
+ }
295
+ /**
296
+ * Sanitize error messages to remove sensitive information.
297
+ */
298
+ sanitizeError(error) {
299
+ if (!error)
300
+ return 'Unknown error';
301
+ // Remove file paths
302
+ let sanitized = error.replace(/(?:\/[\w.-]+)+|(?:[A-Za-z]:\\[\w\\.-]+)+/g, '[path]');
303
+ // Remove line numbers
304
+ sanitized = sanitized.replace(/:\d+:\d+/g, '');
305
+ // Remove stack traces
306
+ sanitized = sanitized.replace(/\n\s*at .*/g, '');
307
+ // Truncate
308
+ if (sanitized.length > 200) {
309
+ sanitized = sanitized.substring(0, 200) + '...';
310
+ }
311
+ return sanitized.trim();
312
+ }
313
+ };
314
+ exports.AuditLoggerService = AuditLoggerService;
315
+ exports.AuditLoggerService = AuditLoggerService = tslib_1.__decorate([
316
+ (0, sdk_1.Provider)({
317
+ name: 'codecall:audit-logger',
318
+ scope: sdk_1.ProviderScope.GLOBAL,
319
+ })
320
+ ], AuditLoggerService);
321
+ exports.default = AuditLoggerService;
322
+ //# sourceMappingURL=audit-logger.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-logger.service.js","sourceRoot":"","sources":["../../../../src/codecall/services/audit-logger.service.ts"],"names":[],"mappings":"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","sourcesContent":["// file: libs/plugins/src/codecall/services/audit-logger.service.ts\n\nimport { Provider, ProviderScope } from '@frontmcp/sdk';\n\n/**\n * Audit event types for CodeCall operations.\n */\nexport const AUDIT_EVENT_TYPES = {\n /** Script execution started */\n EXECUTION_START: 'codecall:execution:start',\n /** Script execution completed successfully */\n EXECUTION_SUCCESS: 'codecall:execution:success',\n /** Script execution failed */\n EXECUTION_FAILURE: 'codecall:execution:failure',\n /** Script execution timed out */\n EXECUTION_TIMEOUT: 'codecall:execution:timeout',\n\n /** Tool call initiated from script */\n TOOL_CALL_START: 'codecall:tool:call:start',\n /** Tool call completed successfully */\n TOOL_CALL_SUCCESS: 'codecall:tool:call:success',\n /** Tool call failed */\n TOOL_CALL_FAILURE: 'codecall:tool:call:failure',\n\n /** Self-reference attack blocked */\n SECURITY_SELF_REFERENCE: 'codecall:security:self-reference',\n /** Tool access denied */\n SECURITY_ACCESS_DENIED: 'codecall:security:access-denied',\n /** AST validation failed (blocked code pattern) */\n SECURITY_AST_BLOCKED: 'codecall:security:ast-blocked',\n\n /** Search performed */\n SEARCH_PERFORMED: 'codecall:search:performed',\n /** Tool described */\n DESCRIBE_PERFORMED: 'codecall:describe:performed',\n /** Direct invoke performed */\n INVOKE_PERFORMED: 'codecall:invoke:performed',\n} as const;\n\nexport type AuditEventType = (typeof AUDIT_EVENT_TYPES)[keyof typeof AUDIT_EVENT_TYPES];\n\n/**\n * Base audit event structure.\n */\nexport interface AuditEvent {\n /** Event type */\n type: AuditEventType;\n /** ISO timestamp */\n timestamp: string;\n /** Unique execution ID for correlation */\n executionId: string;\n /** Duration in milliseconds (if applicable) */\n durationMs?: number;\n /** Additional event-specific data */\n data?: Record<string, unknown>;\n}\n\n/**\n * Execution audit event with script details.\n */\nexport interface ExecutionAuditEvent extends AuditEvent {\n type:\n | typeof AUDIT_EVENT_TYPES.EXECUTION_START\n | typeof AUDIT_EVENT_TYPES.EXECUTION_SUCCESS\n | typeof AUDIT_EVENT_TYPES.EXECUTION_FAILURE\n | typeof AUDIT_EVENT_TYPES.EXECUTION_TIMEOUT;\n data: {\n /** Script hash (NOT the full script - security!) */\n scriptHash: string;\n /** Script length in characters */\n scriptLength: number;\n /** Number of tool calls made */\n toolCallCount?: number;\n /** Error message (sanitized) if failed */\n error?: string;\n };\n}\n\n/**\n * Tool call audit event.\n */\nexport interface ToolCallAuditEvent extends AuditEvent {\n type:\n | typeof AUDIT_EVENT_TYPES.TOOL_CALL_START\n | typeof AUDIT_EVENT_TYPES.TOOL_CALL_SUCCESS\n | typeof AUDIT_EVENT_TYPES.TOOL_CALL_FAILURE;\n data: {\n /** Tool name */\n toolName: string;\n /** Call depth (nested calls) */\n callDepth: number;\n /** Error code if failed */\n errorCode?: string;\n };\n}\n\n/**\n * Security audit event.\n */\nexport interface SecurityAuditEvent extends AuditEvent {\n type:\n | typeof AUDIT_EVENT_TYPES.SECURITY_SELF_REFERENCE\n | typeof AUDIT_EVENT_TYPES.SECURITY_ACCESS_DENIED\n | typeof AUDIT_EVENT_TYPES.SECURITY_AST_BLOCKED;\n data: {\n /** What was blocked */\n blocked: string;\n /** Reason for blocking */\n reason: string;\n };\n}\n\n/**\n * Audit event listener function type.\n */\nexport type AuditEventListener = (event: AuditEvent) => void;\n\n/**\n * Audit Logger Service\n *\n * Provides centralized audit logging for all CodeCall operations.\n * Uses the SDK event emitter pattern for integration with external systems.\n *\n * Security considerations:\n * - NEVER logs full scripts (only hashes)\n * - NEVER logs tool inputs/outputs (only metadata)\n * - NEVER logs sensitive error details (only sanitized messages)\n * - All events include execution ID for correlation\n */\n@Provider({\n name: 'codecall:audit-logger',\n scope: ProviderScope.GLOBAL,\n})\nexport class AuditLoggerService {\n private listeners: Set<AuditEventListener> = new Set();\n private executionCounter = 0;\n\n /**\n * Subscribe to audit events.\n *\n * @param listener - Function to call when events occur\n * @returns Unsubscribe function\n */\n subscribe(listener: AuditEventListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Generate a unique execution ID.\n */\n generateExecutionId(): string {\n const timestamp = Date.now().toString(36);\n const counter = (++this.executionCounter).toString(36).padStart(4, '0');\n const random = Math.random().toString(36).substring(2, 8);\n return `exec_${timestamp}_${counter}_${random}`;\n }\n\n /**\n * Log execution start.\n */\n logExecutionStart(executionId: string, script: string): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.EXECUTION_START,\n timestamp: new Date().toISOString(),\n executionId,\n data: {\n scriptHash: this.hashScript(script),\n scriptLength: script.length,\n },\n });\n }\n\n /**\n * Log execution success.\n */\n logExecutionSuccess(executionId: string, script: string, durationMs: number, toolCallCount: number): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.EXECUTION_SUCCESS,\n timestamp: new Date().toISOString(),\n executionId,\n durationMs,\n data: {\n scriptHash: this.hashScript(script),\n scriptLength: script.length,\n toolCallCount,\n },\n });\n }\n\n /**\n * Log execution failure.\n */\n logExecutionFailure(executionId: string, script: string, durationMs: number, error: string): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.EXECUTION_FAILURE,\n timestamp: new Date().toISOString(),\n executionId,\n durationMs,\n data: {\n scriptHash: this.hashScript(script),\n scriptLength: script.length,\n error: this.sanitizeError(error),\n },\n });\n }\n\n /**\n * Log execution timeout.\n */\n logExecutionTimeout(executionId: string, script: string, durationMs: number): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.EXECUTION_TIMEOUT,\n timestamp: new Date().toISOString(),\n executionId,\n durationMs,\n data: {\n scriptHash: this.hashScript(script),\n scriptLength: script.length,\n },\n });\n }\n\n /**\n * Log tool call start.\n */\n logToolCallStart(executionId: string, toolName: string, callDepth: number): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.TOOL_CALL_START,\n timestamp: new Date().toISOString(),\n executionId,\n data: {\n toolName,\n callDepth,\n },\n });\n }\n\n /**\n * Log tool call success.\n */\n logToolCallSuccess(executionId: string, toolName: string, callDepth: number, durationMs: number): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.TOOL_CALL_SUCCESS,\n timestamp: new Date().toISOString(),\n executionId,\n durationMs,\n data: {\n toolName,\n callDepth,\n },\n });\n }\n\n /**\n * Log tool call failure.\n */\n logToolCallFailure(\n executionId: string,\n toolName: string,\n callDepth: number,\n durationMs: number,\n errorCode: string,\n ): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.TOOL_CALL_FAILURE,\n timestamp: new Date().toISOString(),\n executionId,\n durationMs,\n data: {\n toolName,\n callDepth,\n errorCode,\n },\n });\n }\n\n /**\n * Log security event: self-reference blocked.\n */\n logSecuritySelfReference(executionId: string, toolName: string): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.SECURITY_SELF_REFERENCE,\n timestamp: new Date().toISOString(),\n executionId,\n data: {\n blocked: toolName,\n reason: 'Self-reference attack: attempted to call CodeCall tool from within AgentScript',\n },\n });\n }\n\n /**\n * Log security event: access denied.\n */\n logSecurityAccessDenied(executionId: string, toolName: string, reason: string): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.SECURITY_ACCESS_DENIED,\n timestamp: new Date().toISOString(),\n executionId,\n data: {\n blocked: toolName,\n reason: this.sanitizeError(reason),\n },\n });\n }\n\n /**\n * Log security event: AST validation blocked.\n */\n logSecurityAstBlocked(executionId: string, pattern: string, reason: string): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.SECURITY_AST_BLOCKED,\n timestamp: new Date().toISOString(),\n executionId,\n data: {\n blocked: pattern,\n reason: this.sanitizeError(reason),\n },\n });\n }\n\n /**\n * Log search operation.\n */\n logSearch(executionId: string, query: string, resultCount: number, durationMs: number): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.SEARCH_PERFORMED,\n timestamp: new Date().toISOString(),\n executionId,\n durationMs,\n data: {\n queryLength: query.length,\n resultCount,\n },\n });\n }\n\n /**\n * Log describe operation.\n */\n logDescribe(executionId: string, toolNames: string[], durationMs: number): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.DESCRIBE_PERFORMED,\n timestamp: new Date().toISOString(),\n executionId,\n durationMs,\n data: {\n toolCount: toolNames.length,\n toolNames: toolNames.slice(0, 10), // Limit to first 10 for audit\n },\n });\n }\n\n /**\n * Log invoke operation.\n */\n logInvoke(executionId: string, toolName: string, success: boolean, durationMs: number): void {\n this.emit({\n type: AUDIT_EVENT_TYPES.INVOKE_PERFORMED,\n timestamp: new Date().toISOString(),\n executionId,\n durationMs,\n data: {\n toolName,\n success,\n },\n });\n }\n\n /**\n * Emit an audit event to all listeners.\n */\n private emit(event: AuditEvent): void {\n // Freeze the event to prevent modification\n const frozenEvent = Object.freeze({ ...event, data: Object.freeze({ ...event.data }) });\n\n for (const listener of this.listeners) {\n try {\n listener(frozenEvent);\n } catch {\n // Never let listener errors propagate\n }\n }\n }\n\n /**\n * Create a simple hash of the script for identification.\n * Uses a fast, non-cryptographic hash for performance.\n */\n private hashScript(script: string): string {\n let hash = 0;\n for (let i = 0; i < script.length; i++) {\n const char = script.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return `sh_${(hash >>> 0).toString(16).padStart(8, '0')}`;\n }\n\n /**\n * Sanitize error messages to remove sensitive information.\n */\n private sanitizeError(error: string): string {\n if (!error) return 'Unknown error';\n\n // Remove file paths\n let sanitized = error.replace(/(?:\\/[\\w.-]+)+|(?:[A-Za-z]:\\\\[\\w\\\\.-]+)+/g, '[path]');\n\n // Remove line numbers\n sanitized = sanitized.replace(/:\\d+:\\d+/g, '');\n\n // Remove stack traces\n sanitized = sanitized.replace(/\\n\\s*at .*/g, '');\n\n // Truncate\n if (sanitized.length > 200) {\n sanitized = sanitized.substring(0, 200) + '...';\n }\n\n return sanitized.trim();\n }\n}\n\nexport default AuditLoggerService;\n"]}
@@ -0,0 +1,62 @@
1
+ import type CodeCallConfig from '../providers/code-call.config';
2
+ import type { CodeCallVmEnvironment } from '../codecall.symbol';
3
+ /**
4
+ * Result from enclave execution - maps to existing VmExecutionResult interface
5
+ */
6
+ export interface EnclaveExecutionResult {
7
+ success: boolean;
8
+ result?: unknown;
9
+ error?: {
10
+ message: string;
11
+ name: string;
12
+ stack?: string;
13
+ code?: string;
14
+ toolName?: string;
15
+ toolInput?: unknown;
16
+ details?: unknown;
17
+ [key: string]: unknown;
18
+ };
19
+ logs: string[];
20
+ timedOut: boolean;
21
+ stats?: {
22
+ duration: number;
23
+ toolCallCount: number;
24
+ iterationCount: number;
25
+ };
26
+ }
27
+ /**
28
+ * Service for executing AgentScript code using enclave-vm
29
+ *
30
+ * This service wraps the Enclave class and provides:
31
+ * - Safe AgentScript execution with AST validation
32
+ * - Automatic code transformation (callTool -> __safe_callTool)
33
+ * - Runtime limits (timeout, iterations, tool calls)
34
+ * - Tool call integration with FrontMCP pipeline
35
+ */
36
+ /**
37
+ * Error thrown when script exceeds maximum length and sidecar is disabled
38
+ */
39
+ export declare class ScriptTooLargeError extends Error {
40
+ readonly code = "SCRIPT_TOO_LARGE";
41
+ readonly scriptLength: number;
42
+ readonly maxLength: number;
43
+ constructor(scriptLength: number, maxLength: number);
44
+ }
45
+ export default class EnclaveService {
46
+ private readonly vmOptions;
47
+ private readonly sidecarOptions;
48
+ constructor(config: CodeCallConfig);
49
+ /**
50
+ * Execute AgentScript code in the enclave
51
+ *
52
+ * @param code - The AgentScript code to execute (raw, not transformed)
53
+ * @param environment - The VM environment with callTool, getTool, etc.
54
+ * @returns Execution result with success/error and logs
55
+ * @throws ScriptTooLargeError if script exceeds max length and sidecar is disabled
56
+ */
57
+ execute(code: string, environment: CodeCallVmEnvironment): Promise<EnclaveExecutionResult>;
58
+ /**
59
+ * Map Enclave ExecutionResult to EnclaveExecutionResult
60
+ */
61
+ private mapEnclaveResult;
62
+ }