@tyvm/knowhow 0.0.21 โ†’ 0.0.22

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 (69) hide show
  1. package/package.json +3 -1
  2. package/src/agents/tools/executeScript/README.md +78 -0
  3. package/src/agents/tools/executeScript/definition.ts +73 -0
  4. package/src/agents/tools/executeScript/examples/quick-test.ts +80 -0
  5. package/src/agents/tools/executeScript/examples/serialization-test.ts +309 -0
  6. package/src/agents/tools/executeScript/examples/test-runner.ts +204 -0
  7. package/src/agents/tools/executeScript/index.ts +74 -0
  8. package/src/agents/tools/index.ts +1 -0
  9. package/src/agents/tools/list.ts +2 -1
  10. package/src/cli.ts +2 -6
  11. package/src/clients/index.ts +23 -9
  12. package/src/services/Tools.ts +19 -3
  13. package/src/services/script-execution/SandboxContext.ts +278 -0
  14. package/src/services/script-execution/ScriptExecutor.ts +337 -0
  15. package/src/services/script-execution/ScriptPolicy.ts +236 -0
  16. package/src/services/script-execution/ScriptTracer.ts +249 -0
  17. package/src/services/script-execution/types.ts +134 -0
  18. package/ts_build/src/agents/tools/executeScript/definition.d.ts +2 -0
  19. package/ts_build/src/agents/tools/executeScript/definition.js +70 -0
  20. package/ts_build/src/agents/tools/executeScript/definition.js.map +1 -0
  21. package/ts_build/src/agents/tools/executeScript/examples/quick-test.d.ts +3 -0
  22. package/ts_build/src/agents/tools/executeScript/examples/quick-test.js +68 -0
  23. package/ts_build/src/agents/tools/executeScript/examples/quick-test.js.map +1 -0
  24. package/ts_build/src/agents/tools/executeScript/examples/serialization-test.d.ts +15 -0
  25. package/ts_build/src/agents/tools/executeScript/examples/serialization-test.js +267 -0
  26. package/ts_build/src/agents/tools/executeScript/examples/serialization-test.js.map +1 -0
  27. package/ts_build/src/agents/tools/executeScript/examples/simple-example.d.ts +20 -0
  28. package/ts_build/src/agents/tools/executeScript/examples/simple-example.js +35 -0
  29. package/ts_build/src/agents/tools/executeScript/examples/simple-example.js.map +1 -0
  30. package/ts_build/src/agents/tools/executeScript/examples/test-runner.d.ts +4 -0
  31. package/ts_build/src/agents/tools/executeScript/examples/test-runner.js +202 -0
  32. package/ts_build/src/agents/tools/executeScript/examples/test-runner.js.map +1 -0
  33. package/ts_build/src/agents/tools/executeScript/handler.d.ts +27 -0
  34. package/ts_build/src/agents/tools/executeScript/handler.js +64 -0
  35. package/ts_build/src/agents/tools/executeScript/handler.js.map +1 -0
  36. package/ts_build/src/agents/tools/executeScript/index.d.ts +27 -0
  37. package/ts_build/src/agents/tools/executeScript/index.js +64 -0
  38. package/ts_build/src/agents/tools/executeScript/index.js.map +1 -0
  39. package/ts_build/src/agents/tools/executeScript.d.ts +29 -0
  40. package/ts_build/src/agents/tools/executeScript.js +124 -0
  41. package/ts_build/src/agents/tools/executeScript.js.map +1 -0
  42. package/ts_build/src/agents/tools/index.d.ts +1 -0
  43. package/ts_build/src/agents/tools/index.js +1 -0
  44. package/ts_build/src/agents/tools/index.js.map +1 -1
  45. package/ts_build/src/agents/tools/list.js +2 -0
  46. package/ts_build/src/agents/tools/list.js.map +1 -1
  47. package/ts_build/src/cli.js +2 -6
  48. package/ts_build/src/cli.js.map +1 -1
  49. package/ts_build/src/clients/index.d.ts +9 -2
  50. package/ts_build/src/clients/index.js +17 -4
  51. package/ts_build/src/clients/index.js.map +1 -1
  52. package/ts_build/src/services/Tools.d.ts +3 -0
  53. package/ts_build/src/services/Tools.js +10 -2
  54. package/ts_build/src/services/Tools.js.map +1 -1
  55. package/ts_build/src/services/script-execution/SandboxContext.d.ts +34 -0
  56. package/ts_build/src/services/script-execution/SandboxContext.js +188 -0
  57. package/ts_build/src/services/script-execution/SandboxContext.js.map +1 -0
  58. package/ts_build/src/services/script-execution/ScriptExecutor.d.ts +17 -0
  59. package/ts_build/src/services/script-execution/ScriptExecutor.js +207 -0
  60. package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -0
  61. package/ts_build/src/services/script-execution/ScriptPolicy.d.ts +27 -0
  62. package/ts_build/src/services/script-execution/ScriptPolicy.js +150 -0
  63. package/ts_build/src/services/script-execution/ScriptPolicy.js.map +1 -0
  64. package/ts_build/src/services/script-execution/ScriptTracer.d.ts +19 -0
  65. package/ts_build/src/services/script-execution/ScriptTracer.js +186 -0
  66. package/ts_build/src/services/script-execution/ScriptTracer.js.map +1 -0
  67. package/ts_build/src/services/script-execution/types.d.ts +108 -0
  68. package/ts_build/src/services/script-execution/types.js +3 -0
  69. package/ts_build/src/services/script-execution/types.js.map +1 -0
@@ -0,0 +1,249 @@
1
+ import { TraceEvent, TraceMetrics, ExecutionTrace, QuotaUsage } from "./types";
2
+
3
+ /**
4
+ * Handles tracing and monitoring of script execution
5
+ */
6
+ export class ScriptTracer {
7
+ private events: TraceEvent[] = [];
8
+ private metrics: TraceMetrics;
9
+ private startTime: number;
10
+
11
+ constructor() {
12
+ this.startTime = Date.now();
13
+ this.metrics = {
14
+ executionTimeMs: 0,
15
+ toolCallCount: 0,
16
+ llmCallCount: 0,
17
+ tokenUsage: {
18
+ prompt: 0,
19
+ completion: 0,
20
+ total: 0,
21
+ },
22
+ memoryUsage: {
23
+ heapUsed: 0,
24
+ heapTotal: 0,
25
+ },
26
+ costUsd: 0,
27
+ };
28
+ }
29
+
30
+ /**
31
+ * Emit a trace event
32
+ */
33
+ emitEvent(type: string, data: any): void {
34
+ const event: TraceEvent = {
35
+ id: `evt-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
36
+ type,
37
+ timestamp: Date.now(),
38
+ data: this.sanitizeEventData(data),
39
+ };
40
+
41
+ this.events.push(event);
42
+ this.updateMetrics(event);
43
+ }
44
+
45
+ /**
46
+ * Record cost for tracking
47
+ */
48
+ recordCost(costUsd: number): void {
49
+ this.metrics.costUsd += costUsd;
50
+ this.emitEvent("cost_recorded", {
51
+ costUsd,
52
+ totalCost: this.metrics.costUsd,
53
+ });
54
+ }
55
+
56
+ /**
57
+ * Get current quota usage
58
+ */
59
+ getCurrentQuota(): QuotaUsage {
60
+ return {
61
+ toolCalls: this.metrics.toolCallCount,
62
+ tokens: this.metrics.tokenUsage.total,
63
+ executionTimeMs: Date.now() - this.startTime,
64
+ costUsd: this.metrics.costUsd,
65
+ };
66
+ }
67
+
68
+ /**
69
+ * Get all trace events
70
+ */
71
+ getEvents(): TraceEvent[] {
72
+ return [...this.events];
73
+ }
74
+
75
+ /**
76
+ * Get current metrics
77
+ */
78
+ getMetrics(): TraceMetrics {
79
+ return {
80
+ ...this.metrics,
81
+ executionTimeMs: Date.now() - this.startTime,
82
+ };
83
+ }
84
+
85
+ /**
86
+ * Generate execution trace
87
+ */
88
+ getTrace(): ExecutionTrace {
89
+ return {
90
+ id: `trace-${Date.now()}`,
91
+ startTime: this.startTime,
92
+ endTime: Date.now(),
93
+ events: this.getEvents(),
94
+ metrics: this.getMetrics(),
95
+ success: !this.events.some((e) => e.type.includes("error")),
96
+ error: this.getLastError(),
97
+ };
98
+ }
99
+
100
+ /**
101
+ * Clear all events and reset metrics
102
+ */
103
+ reset(): void {
104
+ this.events = [];
105
+ this.startTime = Date.now();
106
+ this.metrics = {
107
+ executionTimeMs: 0,
108
+ toolCallCount: 0,
109
+ llmCallCount: 0,
110
+ tokenUsage: {
111
+ prompt: 0,
112
+ completion: 0,
113
+ total: 0,
114
+ },
115
+ memoryUsage: {
116
+ heapUsed: 0,
117
+ heapTotal: 0,
118
+ },
119
+ costUsd: 0,
120
+ };
121
+ }
122
+
123
+ /**
124
+ * Update metrics based on events
125
+ */
126
+ private updateMetrics(event: TraceEvent): void {
127
+ switch (event.type) {
128
+ case "tool_call_start":
129
+ this.metrics.toolCallCount++;
130
+ break;
131
+
132
+ case "llm_call_start":
133
+ this.metrics.llmCallCount++;
134
+ break;
135
+
136
+ case "llm_call_success":
137
+ if (event.data && event.data.usage) {
138
+ const usage = event.data.usage;
139
+ this.metrics.tokenUsage.prompt += usage.prompt_tokens || 0;
140
+ this.metrics.tokenUsage.completion += usage.completion_tokens || 0;
141
+ this.metrics.tokenUsage.total += usage.total_tokens || 0;
142
+ }
143
+ break;
144
+ }
145
+
146
+ // Update memory usage if available
147
+ if (typeof process !== "undefined" && process.memoryUsage) {
148
+ const memUsage = process.memoryUsage();
149
+ this.metrics.memoryUsage.heapUsed = memUsage.heapUsed;
150
+ this.metrics.memoryUsage.heapTotal = memUsage.heapTotal;
151
+ }
152
+ }
153
+
154
+ /**
155
+ * Get the last error from events
156
+ */
157
+ private getLastError(): string | undefined {
158
+ const errorEvents = this.events
159
+ .filter((e) => e.type.includes("error"))
160
+ .reverse();
161
+
162
+ if (errorEvents.length > 0) {
163
+ const lastError = errorEvents[0];
164
+ return (
165
+ lastError.data?.error || lastError.data?.message || "Unknown error"
166
+ );
167
+ }
168
+
169
+ return undefined;
170
+ }
171
+
172
+ /**
173
+ * Sanitize event data to prevent sensitive information leaks
174
+ */
175
+ private sanitizeEventData(data: any): any {
176
+ if (data === null || data === undefined) {
177
+ return data;
178
+ }
179
+
180
+ if (typeof data === "string") {
181
+ // Truncate very long strings
182
+ return data.length > 1000
183
+ ? data.substring(0, 1000) + "...[TRUNCATED]"
184
+ : data;
185
+ }
186
+
187
+ if (Array.isArray(data)) {
188
+ return data.map((item) => this.sanitizeEventData(item));
189
+ }
190
+
191
+ if (typeof data === "object") {
192
+ const sanitized: any = {};
193
+ for (const [key, value] of Object.entries(data)) {
194
+ // Redact sensitive keys
195
+ if (this.isSensitiveKey(key)) {
196
+ sanitized[key] = "[REDACTED]";
197
+ } else if (key === "parameters" && typeof value === "object") {
198
+ // Special handling for tool parameters
199
+ sanitized[key] = this.sanitizeParameters(value);
200
+ } else {
201
+ sanitized[key] = this.sanitizeEventData(value);
202
+ }
203
+ }
204
+ return sanitized;
205
+ }
206
+
207
+ return data;
208
+ }
209
+
210
+ /**
211
+ * Check if a key contains sensitive information
212
+ */
213
+ private isSensitiveKey(key: string): boolean {
214
+ const lowerKey = key.toLowerCase();
215
+ const sensitivePatterns = [
216
+ "password",
217
+ "secret",
218
+ "token",
219
+ "key",
220
+ "auth",
221
+ "credential",
222
+ "private",
223
+ "confidential",
224
+ ];
225
+
226
+ return sensitivePatterns.some((pattern) => lowerKey.includes(pattern));
227
+ }
228
+
229
+ /**
230
+ * Sanitize tool parameters
231
+ */
232
+ private sanitizeParameters(params: any): any {
233
+ if (!params || typeof params !== "object") {
234
+ return params;
235
+ }
236
+
237
+ const sanitized: any = {};
238
+ for (const [key, value] of Object.entries(params)) {
239
+ if (this.isSensitiveKey(key)) {
240
+ sanitized[key] = "[REDACTED]";
241
+ } else if (typeof value === "string" && value.length > 500) {
242
+ sanitized[key] = value.substring(0, 500) + "...[TRUNCATED]";
243
+ } else {
244
+ sanitized[key] = this.sanitizeEventData(value);
245
+ }
246
+ }
247
+ return sanitized;
248
+ }
249
+ }
@@ -0,0 +1,134 @@
1
+ import { Message } from '../../clients/types';
2
+
3
+ // Basic trace event interface
4
+ export interface TraceEvent {
5
+ id: string;
6
+ type: string;
7
+ timestamp: number;
8
+ data: any;
9
+ }
10
+
11
+ // Trace metrics for performance monitoring
12
+ export interface TraceMetrics {
13
+ executionTimeMs: number;
14
+ toolCallCount: number;
15
+ llmCallCount: number;
16
+ tokenUsage: {
17
+ prompt: number;
18
+ completion: number;
19
+ total: number;
20
+ };
21
+ memoryUsage: {
22
+ heapUsed: number;
23
+ heapTotal: number;
24
+ };
25
+ costUsd: number;
26
+ }
27
+
28
+ // Complete execution trace
29
+ export interface ExecutionTrace {
30
+ id: string;
31
+ startTime: number;
32
+ endTime: number;
33
+ events: TraceEvent[];
34
+ metrics: TraceMetrics;
35
+ success: boolean;
36
+ error?: string;
37
+ }
38
+
39
+ // Resource quotas for script execution
40
+ export interface ResourceQuotas {
41
+ maxToolCalls: number;
42
+ maxTokens: number;
43
+ maxExecutionTimeMs: number;
44
+ maxCostUsd: number;
45
+ maxMemoryMb: number;
46
+ }
47
+
48
+ // Security policy configuration
49
+ export interface SecurityPolicy {
50
+ allowlistedTools: string[];
51
+ denylistedTools: string[];
52
+ maxScriptLength: number;
53
+ allowNetworkAccess: boolean;
54
+ allowFileSystemAccess: boolean;
55
+ }
56
+
57
+ // Current quota usage tracking
58
+ export interface QuotaUsage {
59
+ toolCalls: number;
60
+ tokens: number;
61
+ executionTimeMs: number;
62
+ costUsd: number;
63
+ }
64
+
65
+ // Policy violation record
66
+ export interface PolicyViolation {
67
+ id: string;
68
+ type: 'quota_exceeded' | 'tool_denied' | 'tool_not_allowed' | 'script_validation';
69
+ message: string;
70
+ timestamp: number;
71
+ usage: QuotaUsage;
72
+ }
73
+
74
+ // Script execution request
75
+ export interface ExecutionRequest {
76
+ script: string;
77
+ context?: Record<string, any>;
78
+ quotas?: Partial<ResourceQuotas>;
79
+ policy?: Partial<SecurityPolicy>;
80
+ }
81
+
82
+ // Script execution result
83
+ export interface ExecutionResult {
84
+ success: boolean;
85
+ error: string | null;
86
+ result: any;
87
+ trace: ExecutionTrace;
88
+ artifacts: Artifact[];
89
+ consoleOutput: string[];
90
+ }
91
+
92
+ // Artifact created by script
93
+ export interface Artifact {
94
+ id: string;
95
+ name: string;
96
+ type: 'text' | 'json' | 'csv' | 'html' | 'markdown';
97
+ content: string;
98
+ createdAt: string;
99
+ }
100
+
101
+ // Tool execution result
102
+ export interface ToolResult {
103
+ success: boolean;
104
+ result?: any;
105
+ error?: string;
106
+ }
107
+
108
+ // Tool call record
109
+ export interface ToolCall {
110
+ id: string;
111
+ name: string;
112
+ args: Record<string, any>;
113
+ result?: any;
114
+ error?: string;
115
+ timestamp: number;
116
+ duration?: number;
117
+ }
118
+
119
+ // LLM call record
120
+ export interface LLMCall {
121
+ id: string;
122
+ model: string;
123
+ messages: Message[];
124
+ response?: any;
125
+ error?: string;
126
+ timestamp: number;
127
+ duration?: number;
128
+ tokenUsage?: {
129
+ prompt: number;
130
+ completion: number;
131
+ total: number;
132
+ };
133
+ cost?: number;
134
+ }
@@ -0,0 +1,2 @@
1
+ import { Tool } from "../../../clients";
2
+ export declare const executeScriptDefinition: Tool;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeScriptDefinition = void 0;
4
+ exports.executeScriptDefinition = {
5
+ type: "function",
6
+ function: {
7
+ name: "executeScript",
8
+ description: `Execute TypeScript code in a secure sandbox environment with access to tools and AI models.
9
+
10
+ The script has access to:
11
+ - callTool(toolName, parameters): Call any available tool
12
+ - llm(messages, options): Make LLM calls
13
+ - createArtifact(name, content, type): Create downloadable artifacts
14
+ - console: Standard console logging
15
+ - getQuotaUsage(): Check resource usage
16
+ - sleep(ms): Pause execution for a specified time
17
+
18
+ Example:
19
+ \`\`\`typescript
20
+ // Call a tool
21
+ const searchResult = await callTool('textSearch', { searchTerm: 'hello world' });
22
+ console.log('Search found:', searchResult);
23
+
24
+ // Call LLM
25
+ const response = await llm([
26
+ { role: 'user', content: 'Explain quantum computing' }
27
+ ], { model: 'gpt-4o-mini', maxTokens: 100 });
28
+ console.log('LLM response:', response.choices[0].message.content);
29
+
30
+ // Create an artifact
31
+ createArtifact('summary.md', '# Summary\\nThis is a test', 'markdown');
32
+
33
+ return { message: 'Script completed successfully' };
34
+ \`\`\`
35
+
36
+ Must either return or await the a top level function
37
+
38
+ Test tools yourself to know the return type when scripting. Can pass JSON.stringified data into llm call if you don't need to know the type.
39
+ You cannot use isolation breaking methods like: setTimeout setInterval setImmediate clearTimeout clearInterval
40
+
41
+ Security: Scripts run in isolation with quotas on tool calls, tokens, time, and cost.`,
42
+ parameters: {
43
+ type: "object",
44
+ properties: {
45
+ script: {
46
+ type: "string",
47
+ description: "The TypeScript code to execute",
48
+ },
49
+ maxToolCalls: {
50
+ type: "number",
51
+ description: "Maximum number of tool calls allowed (default: 50)",
52
+ },
53
+ maxTokens: {
54
+ type: "number",
55
+ description: "Maximum tokens for LLM calls (default: 10000)",
56
+ },
57
+ maxExecutionTimeMs: {
58
+ type: "number",
59
+ description: "Maximum execution time in milliseconds (default: 30000)",
60
+ },
61
+ maxCostUsd: {
62
+ type: "number",
63
+ description: "Maximum cost in USD (default: 1.0)",
64
+ },
65
+ },
66
+ required: ["script"],
67
+ },
68
+ },
69
+ };
70
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../../../../src/agents/tools/executeScript/definition.ts"],"names":[],"mappings":";;;AAKa,QAAA,uBAAuB,GAAS;IAC3C,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wFAiCuE;QAEpF,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oDAAoD;iBAClE;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+CAA+C;iBAC7D;gBACD,kBAAkB,EAAE;oBAClB,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,yDAAyD;iBAC5D;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oCAAoC;iBAClD;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;KACF;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ts-node
2
+ declare function quickTest(): Promise<void>;
3
+ export { quickTest };
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env ts-node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.quickTest = void 0;
5
+ const executeScript_1 = require("../../executeScript");
6
+ const services_1 = require("../../../../services");
7
+ const clients_1 = require("../../../../clients");
8
+ const simpleScript = `
9
+ console.log("Hello from executeScript!");
10
+
11
+ async function main() {
12
+ // Test basic functionality
13
+ console.log("Running simple test...");
14
+
15
+ // Try a simple tool call
16
+ const files = await callTool("fileSearch", { searchTerm: "*.ts" });
17
+ console.log("Found", files?.length || 0, "TypeScript files");
18
+
19
+ return {
20
+ message: "Simple test completed!",
21
+ filesFound: files?.length || 0,
22
+ timestamp: new Date().toISOString()
23
+ };
24
+ }
25
+
26
+ await main().then(result => {
27
+ console.log("Result:", result);
28
+ }).catch(error => {
29
+ console.error("Error:", error);
30
+ });
31
+ `;
32
+ async function quickTest() {
33
+ console.log("๐Ÿงช Quick executeScript test\n");
34
+ try {
35
+ const result = await (0, executeScript_1.executeScript)({
36
+ script: simpleScript,
37
+ maxToolCalls: 5,
38
+ maxTokens: 100,
39
+ maxExecutionTimeMs: 10000,
40
+ maxCostUsd: 0.1,
41
+ }, {
42
+ tools: services_1.Tools,
43
+ clients: clients_1.Clients,
44
+ });
45
+ console.log("\n๐Ÿ“Š QUICK TEST RESULT:");
46
+ console.log("Success:", result.success);
47
+ console.log("Result:", result.result);
48
+ console.log("Tool calls:", result.quotaUsage.toolCalls);
49
+ console.log("Cost: $" + result.quotaUsage.costUsd.toFixed(4));
50
+ if (result.consoleOutput.length > 0) {
51
+ console.log("\n๐Ÿ“ Console Output:");
52
+ result.consoleOutput.forEach((entry) => {
53
+ console.log(` ${entry}`);
54
+ });
55
+ }
56
+ if (!result.success) {
57
+ console.log("โŒ Error:", result.error);
58
+ }
59
+ }
60
+ catch (error) {
61
+ console.error("๐Ÿ’ฅ Test failed:", error);
62
+ }
63
+ }
64
+ exports.quickTest = quickTest;
65
+ if (require.main === module) {
66
+ quickTest();
67
+ }
68
+ //# sourceMappingURL=quick-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-test.js","sourceRoot":"","sources":["../../../../../../src/agents/tools/executeScript/examples/quick-test.ts"],"names":[],"mappings":";;;;AAMA,uDAAoD;AACpD,mDAA6C;AAC7C,iDAA8C;AAG9C,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBpB,CAAC;AAEF,KAAK,UAAU,SAAS;IACtB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAE7C,IAAI;QACF,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAa,EAChC;YACE,MAAM,EAAE,YAAY;YACpB,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,GAAG;YACd,kBAAkB,EAAE,KAAK;YACzB,UAAU,EAAE,GAAG;SAChB,EACD;YACE,KAAK,EAAE,gBAAK;YACZ,OAAO,EAAE,iBAAO;SACjB,CACF,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9D,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YACnC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;SACJ;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;SACvC;KACF;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;KACzC;AACH,CAAC;AAMQ,8BAAS;AAJlB,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;IAC3B,SAAS,EAAE,CAAC;CACb"}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ts-node
2
+ interface TestCase {
3
+ name: string;
4
+ script: string;
5
+ expectedToWork: boolean;
6
+ description: string;
7
+ }
8
+ declare const testCases: TestCase[];
9
+ declare function runSerializationTests(): Promise<{
10
+ passed: number;
11
+ failed: number;
12
+ unexpected: number;
13
+ details: any[];
14
+ }>;
15
+ export { runSerializationTests, testCases };