@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,188 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SandboxContext = void 0;
4
+ const services_1 = require("../../services");
5
+ const clients_1 = require("../../clients");
6
+ class SandboxContext {
7
+ toolsService;
8
+ clients;
9
+ tracer;
10
+ policyEnforcer;
11
+ artifacts = [];
12
+ consoleOutput = [];
13
+ constructor(toolsService = services_1.Tools, clients = clients_1.Clients, tracer, policyEnforcer) {
14
+ this.toolsService = toolsService;
15
+ this.clients = clients;
16
+ this.tracer = tracer;
17
+ this.policyEnforcer = policyEnforcer;
18
+ }
19
+ console = {
20
+ log: (...args) => {
21
+ const message = args
22
+ .map((arg) => typeof arg === "object" ? JSON.stringify(arg) : String(arg))
23
+ .join(" ");
24
+ this.consoleOutput.push(`[LOG] ${message}`);
25
+ this.tracer.emitEvent("console_log", { message, args });
26
+ },
27
+ error: (...args) => {
28
+ const message = args
29
+ .map((arg) => typeof arg === "object" ? JSON.stringify(arg) : String(arg))
30
+ .join(" ");
31
+ this.consoleOutput.push(`[ERROR] ${message}`);
32
+ this.tracer.emitEvent("console_error", { message, args });
33
+ },
34
+ warn: (...args) => {
35
+ const message = args
36
+ .map((arg) => typeof arg === "object" ? JSON.stringify(arg) : String(arg))
37
+ .join(" ");
38
+ this.consoleOutput.push(`[WARN] ${message}`);
39
+ this.tracer.emitEvent("console_warn", { message, args });
40
+ },
41
+ info: (...args) => {
42
+ const message = args
43
+ .map((arg) => typeof arg === "object" ? JSON.stringify(arg) : String(arg))
44
+ .join(" ");
45
+ this.consoleOutput.push(`[INFO] ${message}`);
46
+ this.tracer.emitEvent("console_info", { message, args });
47
+ },
48
+ };
49
+ async callTool(toolName, parameters) {
50
+ if (!this.policyEnforcer.checkToolCall(toolName)) {
51
+ throw new Error(`Tool call '${toolName}' blocked by policy`);
52
+ }
53
+ this.tracer.emitEvent("tool_call_start", {
54
+ toolName,
55
+ parameters: this.sanitizeForLogging(parameters),
56
+ });
57
+ try {
58
+ this.policyEnforcer.recordToolCall();
59
+ const toolCall = {
60
+ id: `script-tool-${Date.now()}-${Math.random()
61
+ .toString(36)
62
+ .substr(2, 9)}`,
63
+ type: "function",
64
+ function: {
65
+ name: toolName,
66
+ arguments: JSON.stringify(parameters),
67
+ },
68
+ };
69
+ const result = await this.toolsService.callTool(toolCall);
70
+ this.tracer.emitEvent("tool_call_success", {
71
+ toolName,
72
+ result: this.sanitizeForLogging(result),
73
+ });
74
+ return result;
75
+ }
76
+ catch (error) {
77
+ this.tracer.emitEvent("tool_call_error", {
78
+ toolName,
79
+ error: error instanceof Error ? error.message : String(error),
80
+ });
81
+ throw error;
82
+ }
83
+ }
84
+ async llm(messages, options = {}) {
85
+ const estimatedTokens = this.estimateTokens(messages);
86
+ if (!this.policyEnforcer.checkTokenUsage(estimatedTokens)) {
87
+ throw new Error("Token quota would be exceeded");
88
+ }
89
+ this.tracer.emitEvent("llm_call_start", {
90
+ messageCount: messages.length,
91
+ estimatedTokens,
92
+ model: options.model,
93
+ options: this.sanitizeForLogging(options),
94
+ });
95
+ try {
96
+ this.policyEnforcer.recordTokenUsage(estimatedTokens);
97
+ const completionOptions = {
98
+ model: options.model,
99
+ messages,
100
+ max_tokens: options.maxTokens,
101
+ };
102
+ const response = await this.clients.createCompletion("", completionOptions);
103
+ this.tracer.emitEvent("llm_call_success", {
104
+ model: response.model,
105
+ usage: response.usage,
106
+ usdCost: response.usd_cost,
107
+ });
108
+ return response;
109
+ }
110
+ catch (error) {
111
+ this.tracer.emitEvent("llm_call_error", {
112
+ error: error instanceof Error ? error.message : String(error),
113
+ });
114
+ throw error;
115
+ }
116
+ }
117
+ getQuotaUsage() {
118
+ return this.policyEnforcer.getUsage();
119
+ }
120
+ async createArtifact(name, content, type = "text") {
121
+ const artifact = {
122
+ id: `artifact-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
123
+ name,
124
+ type,
125
+ content,
126
+ createdAt: new Date().toISOString(),
127
+ };
128
+ this.artifacts.push(artifact);
129
+ this.tracer.emitEvent("artifact_created", {
130
+ artifactId: artifact.id,
131
+ name,
132
+ type,
133
+ contentLength: content.length,
134
+ });
135
+ return artifact;
136
+ }
137
+ async sleep(ms) {
138
+ if (typeof ms !== "number" || ms < 0 || ms > 2000) {
139
+ throw new Error("Invalid sleep duration");
140
+ }
141
+ await new Promise((res) => setTimeout(res, ms));
142
+ this.tracer.emitEvent("sleep", { durationMs: ms });
143
+ }
144
+ getArtifacts() {
145
+ return [...this.artifacts];
146
+ }
147
+ getConsoleOutput() {
148
+ return [...this.consoleOutput];
149
+ }
150
+ estimateTokens(messages) {
151
+ let totalText = "";
152
+ for (const message of messages) {
153
+ if (typeof message === "string") {
154
+ totalText += message;
155
+ }
156
+ else if (message && typeof message.content === "string") {
157
+ totalText += message.content;
158
+ }
159
+ }
160
+ return Math.ceil(totalText.length / 4);
161
+ }
162
+ sanitizeForLogging(data) {
163
+ if (data === null || data === undefined) {
164
+ return data;
165
+ }
166
+ if (typeof data === "string") {
167
+ return data.length > 500 ? data.substring(0, 500) + "..." : data;
168
+ }
169
+ if (typeof data === "object") {
170
+ const sanitized = {};
171
+ for (const [key, value] of Object.entries(data)) {
172
+ if (key.toLowerCase().includes("password") ||
173
+ key.toLowerCase().includes("token") ||
174
+ key.toLowerCase().includes("secret") ||
175
+ key.toLowerCase().includes("key")) {
176
+ sanitized[key] = "[REDACTED]";
177
+ }
178
+ else {
179
+ sanitized[key] = this.sanitizeForLogging(value);
180
+ }
181
+ }
182
+ return sanitized;
183
+ }
184
+ return data;
185
+ }
186
+ }
187
+ exports.SandboxContext = SandboxContext;
188
+ //# sourceMappingURL=SandboxContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SandboxContext.js","sourceRoot":"","sources":["../../../../src/services/script-execution/SandboxContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Tools } from "../../services";
2
+ import { Clients } from "../../clients";
3
+ import { ExecutionRequest, ExecutionResult, ResourceQuotas, SecurityPolicy } from "./types";
4
+ export declare class ScriptExecutor {
5
+ private toolsService;
6
+ private clients;
7
+ private defaultQuotas;
8
+ private defaultPolicy;
9
+ constructor(toolsService?: typeof Tools | null, clients?: typeof Clients | null);
10
+ execute(request: ExecutionRequest): Promise<ExecutionResult>;
11
+ private executeWithTimeout;
12
+ private executeScriptSecure;
13
+ private setupIsolatedContext;
14
+ private executeScriptFallback;
15
+ getDefaultQuotas(): ResourceQuotas;
16
+ getDefaultPolicy(): SecurityPolicy;
17
+ }
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ScriptExecutor = void 0;
7
+ const isolated_vm_1 = __importDefault(require("isolated-vm"));
8
+ const SandboxContext_1 = require("./SandboxContext");
9
+ const ScriptTracer_1 = require("./ScriptTracer");
10
+ const ScriptPolicy_1 = require("./ScriptPolicy");
11
+ class ScriptExecutor {
12
+ toolsService;
13
+ clients;
14
+ defaultQuotas = {
15
+ maxToolCalls: 50,
16
+ maxTokens: 10000,
17
+ maxExecutionTimeMs: 30000,
18
+ maxCostUsd: 1.0,
19
+ maxMemoryMb: 100,
20
+ };
21
+ defaultPolicy = {
22
+ allowlistedTools: [],
23
+ denylistedTools: [
24
+ "execCommand",
25
+ "writeFileChunk",
26
+ "patchFile",
27
+ ],
28
+ maxScriptLength: 50000,
29
+ allowNetworkAccess: false,
30
+ allowFileSystemAccess: false,
31
+ };
32
+ constructor(toolsService = null, clients = null) {
33
+ this.toolsService = toolsService;
34
+ this.clients = clients;
35
+ }
36
+ async execute(request) {
37
+ const tracer = new ScriptTracer_1.ScriptTracer();
38
+ const quotas = { ...this.defaultQuotas, ...request.quotas };
39
+ const policy = { ...this.defaultPolicy, ...request.policy };
40
+ const policyEnforcer = new ScriptPolicy_1.ScriptPolicyEnforcer(quotas, policy);
41
+ tracer.emitEvent("execution_start", {
42
+ scriptLength: request.script.length,
43
+ quotas,
44
+ policy: {
45
+ ...policy,
46
+ allowlistedTools: `${policy.allowlistedTools.length} tools`,
47
+ denylistedTools: `${policy.denylistedTools.length} tools`,
48
+ },
49
+ });
50
+ try {
51
+ const validation = policyEnforcer.validateScript(request.script);
52
+ if (!validation.valid) {
53
+ tracer.emitEvent("script_validation_failed", {
54
+ issues: validation.issues,
55
+ });
56
+ return {
57
+ success: false,
58
+ error: `Script validation failed: ${validation.issues.join(", ")}`,
59
+ result: null,
60
+ trace: tracer.getTrace(),
61
+ artifacts: [],
62
+ consoleOutput: [],
63
+ };
64
+ }
65
+ tracer.emitEvent("script_validation_passed", {});
66
+ const context = new SandboxContext_1.SandboxContext(this.toolsService, this.clients, tracer, policyEnforcer);
67
+ const startTime = Date.now();
68
+ const timeoutMs = quotas.maxExecutionTimeMs;
69
+ const result = await this.executeWithTimeout(request.script, context, timeoutMs, tracer, policyEnforcer);
70
+ const executionTime = Date.now() - startTime;
71
+ tracer.emitEvent("execution_complete", {
72
+ executionTimeMs: executionTime,
73
+ finalUsage: policyEnforcer.getUsage(),
74
+ });
75
+ return {
76
+ success: true,
77
+ error: null,
78
+ result,
79
+ trace: tracer.getTrace(),
80
+ artifacts: context.getArtifacts(),
81
+ consoleOutput: context.getConsoleOutput(),
82
+ };
83
+ }
84
+ catch (error) {
85
+ const errorMessage = error instanceof Error ? error.message : String(error);
86
+ tracer.emitEvent("execution_error", {
87
+ error: errorMessage,
88
+ finalUsage: policyEnforcer.getUsage(),
89
+ });
90
+ return {
91
+ success: false,
92
+ error: errorMessage,
93
+ result: null,
94
+ trace: tracer.getTrace(),
95
+ artifacts: [],
96
+ consoleOutput: [],
97
+ };
98
+ }
99
+ }
100
+ async executeWithTimeout(script, context, timeoutMs, tracer, policyEnforcer) {
101
+ return new Promise((resolve, reject) => {
102
+ const timeoutId = setTimeout(() => {
103
+ tracer.emitEvent("execution_timeout", { timeoutMs });
104
+ reject(new Error(`Script execution timed out after ${timeoutMs}ms`));
105
+ }, timeoutMs);
106
+ this.executeScriptSecure(script, context, tracer, policyEnforcer)
107
+ .then((result) => {
108
+ clearTimeout(timeoutId);
109
+ resolve(result);
110
+ })
111
+ .catch((error) => {
112
+ clearTimeout(timeoutId);
113
+ reject(error);
114
+ });
115
+ });
116
+ }
117
+ async executeScriptSecure(script, context, tracer, policyEnforcer) {
118
+ tracer.emitEvent("secure_execution_start", {
119
+ note: "Using isolated-vm for secure execution",
120
+ });
121
+ const isolate = new isolated_vm_1.default.Isolate({
122
+ memoryLimit: policyEnforcer.getQuotas().maxMemoryMb,
123
+ });
124
+ try {
125
+ const vmContext = await isolate.createContext();
126
+ tracer.emitEvent("vm_context_created", {});
127
+ await this.setupIsolatedContext(vmContext, context, tracer);
128
+ tracer.emitEvent("script_compilation_start", {});
129
+ const wrappedScript = `
130
+ (async function() {
131
+ "use strict";
132
+ ${script}
133
+ })()
134
+ `;
135
+ const compiledScript = await isolate.compileScript(wrappedScript);
136
+ tracer.emitEvent("script_compilation_complete", {});
137
+ tracer.emitEvent("script_execution_start", {});
138
+ const result = await compiledScript.run(vmContext, {
139
+ timeout: policyEnforcer.getQuotas().maxExecutionTimeMs,
140
+ promise: true,
141
+ });
142
+ tracer.emitEvent("script_execution_complete", {
143
+ resultType: typeof result,
144
+ });
145
+ return result;
146
+ }
147
+ finally {
148
+ isolate.dispose();
149
+ tracer.emitEvent("vm_cleanup_complete", {});
150
+ }
151
+ }
152
+ async setupIsolatedContext(vmContext, sandboxContext, tracer) {
153
+ tracer.emitEvent("context_setup_start", {});
154
+ const globalRef = vmContext.global;
155
+ await globalRef.set("globalThis", globalRef.derefInto());
156
+ const exposeAsync = async (name, fn) => {
157
+ await globalRef.set(`__host_${name}`, new isolated_vm_1.default.Reference(async (...args) => {
158
+ const result = await fn(...args);
159
+ return new isolated_vm_1.default.ExternalCopy(result).copyInto();
160
+ }));
161
+ await vmContext.eval(`
162
+ globalThis.${name} = (...a) =>
163
+ __host_${name}.apply(undefined, a,
164
+ { arguments: { copy: true }, result: { promise: true, copy: true } });
165
+ `);
166
+ };
167
+ const exposeSync = async (name, fn) => {
168
+ await globalRef.set(`__host_${name}`, new isolated_vm_1.default.Reference((...args) => {
169
+ const result = fn(...args);
170
+ return new isolated_vm_1.default.ExternalCopy(result).copyInto();
171
+ }));
172
+ await vmContext.eval(`
173
+ globalThis.${name} = (...a) =>
174
+ __host_${name}.apply(undefined, a,
175
+ { arguments: { copy: true }, result: { copy: true } });
176
+ `);
177
+ };
178
+ await exposeAsync("callTool", (tool, params) => sandboxContext.callTool(tool, params));
179
+ await exposeAsync("llm", (messages, options) => sandboxContext.llm(messages, options || {}));
180
+ await exposeAsync("sleep", (ms) => sandboxContext.sleep(ms));
181
+ await exposeSync("createArtifact", (name, content, type) => sandboxContext.createArtifact(name, content, type));
182
+ await exposeSync("getQuotaUsage", () => sandboxContext.getQuotaUsage());
183
+ for (const level of ["log", "info", "warn", "error"]) {
184
+ await globalRef.set(`__console_${level}`, new isolated_vm_1.default.Reference((...args) => sandboxContext.console[level](...args)));
185
+ }
186
+ await vmContext.eval(`
187
+ globalThis.console = {};
188
+ for (const lvl of ["log", "info", "warn", "error"]) {
189
+ globalThis.console[lvl] = (...a) =>
190
+ globalThis["__console_" + lvl].apply(undefined, a,
191
+ { arguments: { copy: true } });
192
+ }
193
+ `);
194
+ tracer.emitEvent("context_setup_complete", {});
195
+ }
196
+ async executeScriptFallback(script, context, tracer, policyEnforcer) {
197
+ throw new Error("Isolated-vm execution failed, no fallback available");
198
+ }
199
+ getDefaultQuotas() {
200
+ return { ...this.defaultQuotas };
201
+ }
202
+ getDefaultPolicy() {
203
+ return { ...this.defaultPolicy };
204
+ }
205
+ }
206
+ exports.ScriptExecutor = ScriptExecutor;
207
+ //# sourceMappingURL=ScriptExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScriptExecutor.js","sourceRoot":"","sources":["../../../../src/services/script-execution/ScriptExecutor.ts"],"names":[],"mappings":";;;;;;AAAA,8DAA8B;AAG9B,qDAAkD;AAClD,iDAA8C;AAC9C,iDAAsD;AAYtD,MAAa,cAAc;IAsBf;IACA;IAtBF,aAAa,GAAmB;QACtC,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,KAAK;QAChB,kBAAkB,EAAE,KAAK;QACzB,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,GAAG;KACjB,CAAC;IAEM,aAAa,GAAmB;QACtC,gBAAgB,EAAE,EAAE;QACpB,eAAe,EAAE;YACf,aAAa;YACb,gBAAgB;YAChB,WAAW;SACZ;QACD,eAAe,EAAE,KAAK;QACtB,kBAAkB,EAAE,KAAK;QACzB,qBAAqB,EAAE,KAAK;KAC7B,CAAC;IAEF,YACU,eAAoC,IAAI,EACxC,UAAiC,IAAI;QADrC,iBAAY,GAAZ,YAAY,CAA4B;QACxC,YAAO,GAAP,OAAO,CAA8B;IAC5C,CAAC;IAKJ,KAAK,CAAC,OAAO,CAAC,OAAyB;QACrC,MAAM,MAAM,GAAG,IAAI,2BAAY,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5D,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5D,MAAM,cAAc,GAAG,IAAI,mCAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEhE,MAAM,CAAC,SAAS,CAAC,iBAAiB,EAAE;YAClC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;YACnC,MAAM;YACN,MAAM,EAAE;gBACN,GAAG,MAAM;gBAET,gBAAgB,EAAE,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,QAAQ;gBAC3D,eAAe,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,QAAQ;aAC1D;SACF,CAAC,CAAC;QAEH,IAAI;YAEF,MAAM,UAAU,GAAG,cAAc,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACjE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;gBACrB,MAAM,CAAC,SAAS,CAAC,0BAA0B,EAAE;oBAC3C,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,6BAA6B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAClE,MAAM,EAAE,IAAI;oBACZ,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;oBACxB,SAAS,EAAE,EAAE;oBACb,aAAa,EAAE,EAAE;iBAClB,CAAC;aACH;YAED,MAAM,CAAC,SAAS,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;YAGjD,MAAM,OAAO,GAAG,IAAI,+BAAc,CAChC,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,OAAO,EACZ,MAAM,EACN,cAAc,CACf,CAAC;YAGF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,kBAAkB,CAAC;YAE5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAC1C,OAAO,CAAC,MAAM,EACd,OAAO,EACP,SAAS,EACT,MAAM,EACN,cAAc,CACf,CAAC;YAEF,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,oBAAoB,EAAE;gBACrC,eAAe,EAAE,aAAa;gBAC9B,UAAU,EAAE,cAAc,CAAC,QAAQ,EAAE;aACtC,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,IAAI;gBACX,MAAM;gBACN,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;gBACxB,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE;gBACjC,aAAa,EAAE,OAAO,CAAC,gBAAgB,EAAE;aAC1C,CAAC;SACH;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEzD,MAAM,CAAC,SAAS,CAAC,iBAAiB,EAAE;gBAClC,KAAK,EAAE,YAAY;gBACnB,UAAU,EAAE,cAAc,CAAC,QAAQ,EAAE;aACtC,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;gBACxB,SAAS,EAAE,EAAE;gBACb,aAAa,EAAE,EAAE;aAClB,CAAC;SACH;IACH,CAAC;IAKO,KAAK,CAAC,kBAAkB,CAC9B,MAAc,EACd,OAAuB,EACvB,SAAiB,EACjB,MAAoB,EACpB,cAAoC;QAEpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,MAAM,CAAC,SAAS,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBACrD,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,SAAS,IAAI,CAAC,CAAC,CAAC;YACvE,CAAC,EAAE,SAAS,CAAC,CAAC;YAGd,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC;iBAC9D,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;IAKO,KAAK,CAAC,mBAAmB,CAC/B,MAAc,EACd,OAAuB,EACvB,MAAoB,EACpB,cAAoC;QAEpC,MAAM,CAAC,SAAS,CAAC,wBAAwB,EAAE;YACzC,IAAI,EAAE,wCAAwC;SAC/C,CAAC,CAAC;QAGH,MAAM,OAAO,GAAG,IAAI,qBAAG,CAAC,OAAO,CAAC;YAC9B,WAAW,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC,WAAW;SACpD,CAAC,CAAC;QAEH,IAAI;YAEF,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;YAEhD,MAAM,CAAC,SAAS,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;YAG3C,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAE5D,MAAM,CAAC,SAAS,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;YAGjD,MAAM,aAAa,GAAG;;;YAGhB,MAAM;;OAEX,CAAC;YAEF,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YAElE,MAAM,CAAC,SAAS,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;YACpD,MAAM,CAAC,SAAS,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;YAG/C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE;gBACjD,OAAO,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC,kBAAkB;gBACtD,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,CAAC,SAAS,CAAC,2BAA2B,EAAE;gBAC5C,UAAU,EAAE,OAAO,MAAM;aAC1B,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;SACf;gBAAS;YAER,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;SAC7C;IACH,CAAC;IAKO,KAAK,CAAC,oBAAoB,CAChC,SAAsB,EACtB,cAA8B,EAC9B,MAAoB;QAEpB,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAE5C,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC;QACnC,MAAM,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;QAGzD,MAAM,WAAW,GAAG,KAAK,EACvB,IAAY,EACZ,EAAiC,EACjC,EAAE;YACF,MAAM,SAAS,CAAC,GAAG,CACjB,UAAU,IAAI,EAAE,EAChB,IAAI,qBAAG,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE;gBACzC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBACjC,OAAO,IAAI,qBAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;YACjD,CAAC,CAAC,CACH,CAAC;YACF,MAAM,SAAS,CAAC,IAAI,CAAC;qBACN,IAAI;mBACN,IAAI;;OAEhB,CAAC,CAAC;QACL,CAAC,CAAC;QAGF,MAAM,UAAU,GAAG,KAAK,EAAE,IAAY,EAAE,EAAwB,EAAE,EAAE;YAClE,MAAM,SAAS,CAAC,GAAG,CACjB,UAAU,IAAI,EAAE,EAChB,IAAI,qBAAG,CAAC,SAAS,CAAC,CAAC,GAAG,IAAW,EAAE,EAAE;gBACnC,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC3B,OAAO,IAAI,qBAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;YACjD,CAAC,CAAC,CACH,CAAC;YACF,MAAM,SAAS,CAAC,IAAI,CAAC;qBACN,IAAI;mBACN,IAAI;;OAEhB,CAAC,CAAC;QACL,CAAC,CAAC;QAGF,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAC7C,cAAc,CAAC,QAAQ,CAAC,IAAc,EAAE,MAAM,CAAC,CAChD,CAAC;QACF,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAC7C,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,CAC5C,CAAC;QACF,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAG7D,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CACzD,cAAc,CAAC,cAAc,CAAC,IAAc,EAAE,OAAO,EAAE,IAAI,CAAC,CAC7D,CAAC;QACF,MAAM,UAAU,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC;QAGxE,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,EAAE;YAC7D,MAAM,SAAS,CAAC,GAAG,CACjB,aAAa,KAAK,EAAE,EACpB,IAAI,qBAAG,CAAC,SAAS,CAAC,CAAC,GAAG,IAAW,EAAE,EAAE,CACnC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CACvC,CACF,CAAC;SACH;QACD,MAAM,SAAS,CAAC,IAAI,CAAC;;;;;;;KAOpB,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IAKO,KAAK,CAAC,qBAAqB,CACjC,MAAc,EACd,OAAuB,EACvB,MAAoB,EACpB,cAAoC;QAGpC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAKD,gBAAgB;QACd,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IACnC,CAAC;IAKD,gBAAgB;QACd,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IACnC,CAAC;CACF;AA/TD,wCA+TC"}
@@ -0,0 +1,27 @@
1
+ import { ResourceQuotas, SecurityPolicy, QuotaUsage, PolicyViolation } from './types';
2
+ export declare class ScriptPolicyEnforcer {
3
+ private quotas;
4
+ private policy;
5
+ private usage;
6
+ private violations;
7
+ constructor(quotas: ResourceQuotas, policy: SecurityPolicy);
8
+ checkToolCall(toolName: string): boolean;
9
+ recordToolCall(): void;
10
+ checkTokenUsage(tokens: number): boolean;
11
+ recordTokenUsage(tokens: number): void;
12
+ checkExecutionTime(currentTimeMs: number): boolean;
13
+ checkCost(additionalCost: number): boolean;
14
+ recordCost(cost: number): void;
15
+ getUsage(): QuotaUsage;
16
+ getQuotas(): ResourceQuotas;
17
+ getViolations(): PolicyViolation[];
18
+ hasViolations(): boolean;
19
+ getLastViolation(): PolicyViolation | undefined;
20
+ resetUsage(): void;
21
+ resetViolations(): void;
22
+ validateScript(scriptContent: string): {
23
+ valid: boolean;
24
+ issues: string[];
25
+ };
26
+ private recordViolation;
27
+ }
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScriptPolicyEnforcer = void 0;
4
+ class ScriptPolicyEnforcer {
5
+ quotas;
6
+ policy;
7
+ usage;
8
+ violations = [];
9
+ constructor(quotas, policy) {
10
+ this.quotas = quotas;
11
+ this.policy = policy;
12
+ this.usage = {
13
+ toolCalls: 0,
14
+ tokens: 0,
15
+ executionTimeMs: 0,
16
+ costUsd: 0
17
+ };
18
+ }
19
+ checkToolCall(toolName) {
20
+ if (this.policy.denylistedTools && this.policy.denylistedTools.includes(toolName)) {
21
+ this.recordViolation('tool_denied', `Tool '${toolName}' is in denylist`);
22
+ return false;
23
+ }
24
+ if (this.policy.allowlistedTools && this.policy.allowlistedTools.length > 0 &&
25
+ !this.policy.allowlistedTools.includes(toolName)) {
26
+ this.recordViolation('tool_not_allowed', `Tool '${toolName}' is not in allowlist`);
27
+ return false;
28
+ }
29
+ if (this.usage.toolCalls >= this.quotas.maxToolCalls) {
30
+ this.recordViolation('quota_exceeded', 'Maximum tool calls exceeded');
31
+ return false;
32
+ }
33
+ return true;
34
+ }
35
+ recordToolCall() {
36
+ this.usage.toolCalls++;
37
+ }
38
+ checkTokenUsage(tokens) {
39
+ if (this.usage.tokens + tokens > this.quotas.maxTokens) {
40
+ this.recordViolation('quota_exceeded', 'Maximum tokens would be exceeded');
41
+ return false;
42
+ }
43
+ return true;
44
+ }
45
+ recordTokenUsage(tokens) {
46
+ this.usage.tokens += tokens;
47
+ }
48
+ checkExecutionTime(currentTimeMs) {
49
+ if (currentTimeMs > this.quotas.maxExecutionTimeMs) {
50
+ this.recordViolation('quota_exceeded', 'Maximum execution time exceeded');
51
+ return false;
52
+ }
53
+ this.usage.executionTimeMs = currentTimeMs;
54
+ return true;
55
+ }
56
+ checkCost(additionalCost) {
57
+ if (this.usage.costUsd + additionalCost > this.quotas.maxCostUsd) {
58
+ this.recordViolation('quota_exceeded', 'Maximum cost would be exceeded');
59
+ return false;
60
+ }
61
+ return true;
62
+ }
63
+ recordCost(cost) {
64
+ this.usage.costUsd += cost;
65
+ }
66
+ getUsage() {
67
+ return { ...this.usage };
68
+ }
69
+ getQuotas() {
70
+ return { ...this.quotas };
71
+ }
72
+ getViolations() {
73
+ return [...this.violations];
74
+ }
75
+ hasViolations() {
76
+ return this.violations.length > 0;
77
+ }
78
+ getLastViolation() {
79
+ return this.violations[this.violations.length - 1];
80
+ }
81
+ resetUsage() {
82
+ this.usage = {
83
+ toolCalls: 0,
84
+ tokens: 0,
85
+ executionTimeMs: 0,
86
+ costUsd: 0
87
+ };
88
+ }
89
+ resetViolations() {
90
+ this.violations = [];
91
+ }
92
+ validateScript(scriptContent) {
93
+ const issues = [];
94
+ const dangerousPatterns = [
95
+ /require\s*\(/gi,
96
+ /import\s+.*\s+from/gi,
97
+ /process\./gi,
98
+ /global\./gi,
99
+ /eval\s*\(/gi,
100
+ /Function\s*\(/gi,
101
+ /setTimeout/gi,
102
+ /setInterval/gi,
103
+ /fetch\s*\(/gi,
104
+ /XMLHttpRequest/gi,
105
+ /WebSocket/gi,
106
+ /location\./gi,
107
+ /document\./gi,
108
+ /window\./gi,
109
+ ];
110
+ for (const pattern of dangerousPatterns) {
111
+ if (pattern.test(scriptContent)) {
112
+ issues.push(`Potentially dangerous pattern detected: ${pattern.source}`);
113
+ }
114
+ }
115
+ if (scriptContent.length > this.policy.maxScriptLength) {
116
+ issues.push(`Script too long: ${scriptContent.length} > ${this.policy.maxScriptLength}`);
117
+ }
118
+ const complexityIndicators = [
119
+ /for\s*\(/gi,
120
+ /while\s*\(/gi,
121
+ /function\s+\w+/gi,
122
+ /=>\s*{/gi,
123
+ /if\s*\(/gi,
124
+ ];
125
+ let complexityScore = 0;
126
+ for (const indicator of complexityIndicators) {
127
+ const matches = scriptContent.match(indicator);
128
+ complexityScore += matches ? matches.length : 0;
129
+ }
130
+ if (complexityScore > 50) {
131
+ issues.push(`Script complexity too high: ${complexityScore} constructs detected`);
132
+ }
133
+ return {
134
+ valid: issues.length === 0,
135
+ issues
136
+ };
137
+ }
138
+ recordViolation(type, message) {
139
+ const violation = {
140
+ id: `violation-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
141
+ type,
142
+ message,
143
+ timestamp: Date.now(),
144
+ usage: { ...this.usage }
145
+ };
146
+ this.violations.push(violation);
147
+ }
148
+ }
149
+ exports.ScriptPolicyEnforcer = ScriptPolicyEnforcer;
150
+ //# sourceMappingURL=ScriptPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScriptPolicy.js","sourceRoot":"","sources":["../../../../src/services/script-execution/ScriptPolicy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { TraceEvent, TraceMetrics, ExecutionTrace, QuotaUsage } from "./types";
2
+ export declare class ScriptTracer {
3
+ private events;
4
+ private metrics;
5
+ private startTime;
6
+ constructor();
7
+ emitEvent(type: string, data: any): void;
8
+ recordCost(costUsd: number): void;
9
+ getCurrentQuota(): QuotaUsage;
10
+ getEvents(): TraceEvent[];
11
+ getMetrics(): TraceMetrics;
12
+ getTrace(): ExecutionTrace;
13
+ reset(): void;
14
+ private updateMetrics;
15
+ private getLastError;
16
+ private sanitizeEventData;
17
+ private isSensitiveKey;
18
+ private sanitizeParameters;
19
+ }