@tyvm/knowhow 0.0.107 → 0.0.108-dev.4a8ba55
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 +45 -0
- package/package.json +9 -4
- package/scripts/publish.sh +86 -0
- package/src/agents/base/base.ts +10 -0
- package/src/agents/tools/execCommand.ts +49 -6
- package/src/agents/tools/index.ts +0 -1
- package/src/agents/tools/list.ts +0 -2
- package/src/chat/CliChatService.ts +7 -1
- package/src/chat/modules/AgentModule.ts +55 -30
- package/src/chat/modules/SessionsModule.ts +7 -2
- package/src/chat/renderer/CompactRenderer.ts +20 -0
- package/src/chat/renderer/ConsoleRenderer.ts +19 -0
- package/src/chat/renderer/FancyRenderer.ts +19 -0
- package/src/chat/renderer/types.ts +11 -0
- package/src/cli.ts +79 -661
- package/src/clients/anthropic.ts +19 -16
- package/src/clients/types.ts +23 -4
- package/src/cloudWorker.ts +75 -1
- package/src/commands/agent.ts +246 -0
- package/src/commands/misc.ts +169 -0
- package/src/commands/modules.ts +182 -0
- package/src/commands/services.ts +72 -0
- package/src/commands/workers.ts +160 -0
- package/src/config.ts +37 -0
- package/src/index.ts +18 -0
- package/src/plugins/embedding.ts +11 -6
- package/src/plugins/plugins.ts +0 -21
- package/src/plugins/vim.ts +5 -16
- package/src/processors/JsonCompressor.ts +6 -6
- package/src/services/KnowhowClient.ts +22 -2
- package/src/services/S3.ts +10 -0
- package/src/services/modules/index.ts +58 -49
- package/src/services/modules/types.ts +4 -0
- package/src/tunnel.ts +216 -0
- package/src/types.ts +0 -1
- package/src/worker.ts +105 -312
- package/src/workers/auth/WsMiddleware.ts +99 -0
- package/src/workers/auth/authMiddleware.ts +104 -0
- package/src/workers/auth/types.ts +14 -2
- package/src/workers/tools/index.ts +2 -0
- package/src/workers/tools/reloadConfig.ts +84 -0
- package/tests/services/WorkerReloadConfig.test.ts +141 -0
- package/tests/unit/modules/moduleLoading.test.ts +0 -25
- package/tests/unit/plugins/pluginLoading.test.ts +0 -85
- package/ts_build/package.json +9 -4
- package/ts_build/src/agents/base/base.js +11 -0
- package/ts_build/src/agents/base/base.js.map +1 -1
- package/ts_build/src/agents/tools/execCommand.d.ts +1 -1
- package/ts_build/src/agents/tools/execCommand.js +39 -5
- package/ts_build/src/agents/tools/execCommand.js.map +1 -1
- package/ts_build/src/agents/tools/index.d.ts +0 -1
- package/ts_build/src/agents/tools/index.js +0 -1
- package/ts_build/src/agents/tools/index.js.map +1 -1
- package/ts_build/src/agents/tools/list.js +0 -2
- package/ts_build/src/agents/tools/list.js.map +1 -1
- package/ts_build/src/chat/CliChatService.js +10 -1
- package/ts_build/src/chat/CliChatService.js.map +1 -1
- package/ts_build/src/chat/modules/AgentModule.d.ts +1 -1
- package/ts_build/src/chat/modules/AgentModule.js +39 -19
- package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
- package/ts_build/src/chat/modules/SessionsModule.js +7 -2
- package/ts_build/src/chat/modules/SessionsModule.js.map +1 -1
- package/ts_build/src/chat/renderer/CompactRenderer.d.ts +4 -0
- package/ts_build/src/chat/renderer/CompactRenderer.js +16 -0
- package/ts_build/src/chat/renderer/CompactRenderer.js.map +1 -1
- package/ts_build/src/chat/renderer/ConsoleRenderer.d.ts +4 -0
- package/ts_build/src/chat/renderer/ConsoleRenderer.js +16 -0
- package/ts_build/src/chat/renderer/ConsoleRenderer.js.map +1 -1
- package/ts_build/src/chat/renderer/FancyRenderer.d.ts +4 -0
- package/ts_build/src/chat/renderer/FancyRenderer.js +16 -0
- package/ts_build/src/chat/renderer/FancyRenderer.js.map +1 -1
- package/ts_build/src/chat/renderer/types.d.ts +2 -0
- package/ts_build/src/cli.js +40 -519
- package/ts_build/src/cli.js.map +1 -1
- package/ts_build/src/clients/anthropic.d.ts +5 -5
- package/ts_build/src/clients/anthropic.js +19 -16
- package/ts_build/src/clients/anthropic.js.map +1 -1
- package/ts_build/src/clients/types.d.ts +5 -2
- package/ts_build/src/cloudWorker.d.ts +9 -0
- package/ts_build/src/cloudWorker.js +36 -0
- package/ts_build/src/cloudWorker.js.map +1 -1
- package/ts_build/src/commands/agent.d.ts +6 -0
- package/ts_build/src/commands/agent.js +229 -0
- package/ts_build/src/commands/agent.js.map +1 -0
- package/ts_build/src/commands/misc.d.ts +10 -0
- package/ts_build/src/commands/misc.js +195 -0
- package/ts_build/src/commands/misc.js.map +1 -0
- package/ts_build/src/commands/modules.d.ts +3 -0
- package/ts_build/src/commands/modules.js +160 -0
- package/ts_build/src/commands/modules.js.map +1 -0
- package/ts_build/src/commands/services.d.ts +5 -0
- package/ts_build/src/commands/services.js +86 -0
- package/ts_build/src/commands/services.js.map +1 -0
- package/ts_build/src/commands/workers.d.ts +6 -0
- package/ts_build/src/commands/workers.js +163 -0
- package/ts_build/src/commands/workers.js.map +1 -0
- package/ts_build/src/config.d.ts +1 -0
- package/ts_build/src/config.js +32 -0
- package/ts_build/src/config.js.map +1 -1
- package/ts_build/src/index.d.ts +1 -0
- package/ts_build/src/index.js +17 -1
- package/ts_build/src/index.js.map +1 -1
- package/ts_build/src/plugins/embedding.js +4 -3
- package/ts_build/src/plugins/embedding.js.map +1 -1
- package/ts_build/src/plugins/plugins.d.ts +0 -2
- package/ts_build/src/plugins/plugins.js +0 -11
- package/ts_build/src/plugins/plugins.js.map +1 -1
- package/ts_build/src/plugins/vim.js +3 -9
- package/ts_build/src/plugins/vim.js.map +1 -1
- package/ts_build/src/processors/JsonCompressor.js +4 -4
- package/ts_build/src/processors/JsonCompressor.js.map +1 -1
- package/ts_build/src/services/KnowhowClient.d.ts +12 -0
- package/ts_build/src/services/KnowhowClient.js +11 -0
- package/ts_build/src/services/KnowhowClient.js.map +1 -1
- package/ts_build/src/services/S3.js +7 -0
- package/ts_build/src/services/S3.js.map +1 -1
- package/ts_build/src/services/modules/index.d.ts +33 -0
- package/ts_build/src/services/modules/index.js +38 -42
- package/ts_build/src/services/modules/index.js.map +1 -1
- package/ts_build/src/services/modules/types.d.ts +4 -0
- package/ts_build/src/tunnel.d.ts +27 -0
- package/ts_build/src/tunnel.js +112 -0
- package/ts_build/src/tunnel.js.map +1 -0
- package/ts_build/src/types.d.ts +0 -1
- package/ts_build/src/types.js.map +1 -1
- package/ts_build/src/worker.d.ts +1 -4
- package/ts_build/src/worker.js +59 -227
- package/ts_build/src/worker.js.map +1 -1
- package/ts_build/src/workers/auth/WsMiddleware.d.ts +8 -0
- package/ts_build/src/workers/auth/WsMiddleware.js +65 -0
- package/ts_build/src/workers/auth/WsMiddleware.js.map +1 -0
- package/ts_build/src/workers/auth/authMiddleware.d.ts +3 -0
- package/ts_build/src/workers/auth/authMiddleware.js +60 -0
- package/ts_build/src/workers/auth/authMiddleware.js.map +1 -0
- package/ts_build/src/workers/auth/types.d.ts +8 -1
- package/ts_build/src/workers/tools/index.d.ts +2 -0
- package/ts_build/src/workers/tools/index.js +4 -1
- package/ts_build/src/workers/tools/index.js.map +1 -1
- package/ts_build/src/workers/tools/reloadConfig.d.ts +14 -0
- package/ts_build/src/workers/tools/reloadConfig.js +48 -0
- package/ts_build/src/workers/tools/reloadConfig.js.map +1 -0
- package/ts_build/tests/services/WorkerReloadConfig.test.d.ts +1 -0
- package/ts_build/tests/services/WorkerReloadConfig.test.js +86 -0
- package/ts_build/tests/services/WorkerReloadConfig.test.js.map +1 -0
- package/ts_build/tests/unit/modules/moduleLoading.test.js +0 -19
- package/ts_build/tests/unit/modules/moduleLoading.test.js.map +1 -1
- package/ts_build/tests/unit/plugins/pluginLoading.test.js +0 -65
- package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +1 -1
- package/src/agents/tools/executeScript/README.md +0 -94
- package/src/agents/tools/executeScript/definition.ts +0 -79
- package/src/agents/tools/executeScript/examples/dependency-injection-validation.ts +0 -272
- package/src/agents/tools/executeScript/examples/quick-test.ts +0 -74
- package/src/agents/tools/executeScript/examples/serialization-test.ts +0 -321
- package/src/agents/tools/executeScript/examples/test-runner.ts +0 -197
- package/src/agents/tools/executeScript/index.ts +0 -98
- package/src/services/script-execution/SandboxContext.ts +0 -282
- package/src/services/script-execution/ScriptExecutor.ts +0 -441
- package/src/services/script-execution/ScriptPolicy.ts +0 -194
- package/src/services/script-execution/ScriptTracer.ts +0 -249
- package/src/services/script-execution/types.ts +0 -134
- package/ts_build/src/agents/tools/executeScript/definition.d.ts +0 -2
- package/ts_build/src/agents/tools/executeScript/definition.js +0 -76
- package/ts_build/src/agents/tools/executeScript/definition.js.map +0 -1
- package/ts_build/src/agents/tools/executeScript/examples/dependency-injection-validation.d.ts +0 -18
- package/ts_build/src/agents/tools/executeScript/examples/dependency-injection-validation.js +0 -192
- package/ts_build/src/agents/tools/executeScript/examples/dependency-injection-validation.js.map +0 -1
- package/ts_build/src/agents/tools/executeScript/examples/quick-test.d.ts +0 -3
- package/ts_build/src/agents/tools/executeScript/examples/quick-test.js +0 -64
- package/ts_build/src/agents/tools/executeScript/examples/quick-test.js.map +0 -1
- package/ts_build/src/agents/tools/executeScript/examples/serialization-test.d.ts +0 -15
- package/ts_build/src/agents/tools/executeScript/examples/serialization-test.js +0 -266
- package/ts_build/src/agents/tools/executeScript/examples/serialization-test.js.map +0 -1
- package/ts_build/src/agents/tools/executeScript/examples/test-runner.d.ts +0 -4
- package/ts_build/src/agents/tools/executeScript/examples/test-runner.js +0 -208
- package/ts_build/src/agents/tools/executeScript/examples/test-runner.js.map +0 -1
- package/ts_build/src/agents/tools/executeScript/index.d.ts +0 -28
- package/ts_build/src/agents/tools/executeScript/index.js +0 -72
- package/ts_build/src/agents/tools/executeScript/index.js.map +0 -1
- package/ts_build/src/services/script-execution/SandboxContext.d.ts +0 -34
- package/ts_build/src/services/script-execution/SandboxContext.js +0 -189
- package/ts_build/src/services/script-execution/SandboxContext.js.map +0 -1
- package/ts_build/src/services/script-execution/ScriptExecutor.d.ts +0 -19
- package/ts_build/src/services/script-execution/ScriptExecutor.js +0 -269
- package/ts_build/src/services/script-execution/ScriptExecutor.js.map +0 -1
- package/ts_build/src/services/script-execution/ScriptPolicy.d.ts +0 -28
- package/ts_build/src/services/script-execution/ScriptPolicy.js +0 -115
- package/ts_build/src/services/script-execution/ScriptPolicy.js.map +0 -1
- package/ts_build/src/services/script-execution/ScriptTracer.d.ts +0 -19
- package/ts_build/src/services/script-execution/ScriptTracer.js +0 -186
- package/ts_build/src/services/script-execution/ScriptTracer.js.map +0 -1
- package/ts_build/src/services/script-execution/types.d.ts +0 -108
- package/ts_build/src/services/script-execution/types.js +0 -3
- package/ts_build/src/services/script-execution/types.js.map +0 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Tool } from "../../clients/types";
|
|
2
|
+
import { McpServerService } from "../../services/McpServer";
|
|
3
|
+
import { McpService } from "../../services/Mcp";
|
|
4
|
+
import { ToolsService } from "../../services/Tools";
|
|
5
|
+
export interface ReloadConfigResult {
|
|
6
|
+
success: boolean;
|
|
7
|
+
toolCount: number;
|
|
8
|
+
mcpCount: number;
|
|
9
|
+
message: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function makeReloadConfigTool(Mcp: McpService, Tools: ToolsService, mcpServer: McpServerService, setToolsToUse: (tools: ReturnType<typeof Tools.getToolsByNames>) => void): {
|
|
12
|
+
reloadConfig: () => Promise<ReloadConfigResult>;
|
|
13
|
+
reloadConfigDefinition: Tool;
|
|
14
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeReloadConfigTool = makeReloadConfigTool;
|
|
4
|
+
const config_1 = require("../../config");
|
|
5
|
+
function makeReloadConfigTool(Mcp, Tools, mcpServer, setToolsToUse) {
|
|
6
|
+
const reloadConfig = async () => {
|
|
7
|
+
try {
|
|
8
|
+
const freshConfig = await (0, config_1.getConfig)();
|
|
9
|
+
await Mcp.closeAll();
|
|
10
|
+
await Mcp.connectToConfigured(Tools);
|
|
11
|
+
const allowedToolNames = freshConfig.worker?.allowedTools ?? Tools.getToolNames();
|
|
12
|
+
const newToolsToUse = Tools.getToolsByNames(allowedToolNames);
|
|
13
|
+
setToolsToUse(newToolsToUse);
|
|
14
|
+
mcpServer.withTools(newToolsToUse);
|
|
15
|
+
const mcpCount = freshConfig.mcps?.length ?? 0;
|
|
16
|
+
return {
|
|
17
|
+
success: true,
|
|
18
|
+
toolCount: newToolsToUse.length,
|
|
19
|
+
mcpCount,
|
|
20
|
+
message: `Config reloaded: ${newToolsToUse.length} tools active, ${mcpCount} MCP(s) configured`,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
toolCount: 0,
|
|
28
|
+
mcpCount: 0,
|
|
29
|
+
message: `Failed to reload config: ${message}`,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const reloadConfigDefinition = {
|
|
34
|
+
type: "function",
|
|
35
|
+
function: {
|
|
36
|
+
name: "reloadConfig",
|
|
37
|
+
description: "Reload the worker config from disk, reconnect all MCPs, and rebuild the active tool list. " +
|
|
38
|
+
"Call this after running `knowhow cloudworker --pull <id>` to apply updated MCPs without restarting the worker.",
|
|
39
|
+
parameters: {
|
|
40
|
+
type: "object",
|
|
41
|
+
properties: {},
|
|
42
|
+
required: [],
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
return { reloadConfig, reloadConfigDefinition };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=reloadConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reloadConfig.js","sourceRoot":"","sources":["../../../../src/workers/tools/reloadConfig.ts"],"names":[],"mappings":";;AAsBA,oDA6DC;AAlFD,yCAAyC;AAqBzC,SAAgB,oBAAoB,CAClC,GAAe,EACf,KAAmB,EACnB,SAA2B,EAC3B,aAAwE;IAExE,MAAM,YAAY,GAAG,KAAK,IAAiC,EAAE;QAC3D,IAAI,CAAC;YAEH,MAAM,WAAW,GAAG,MAAM,IAAA,kBAAS,GAAE,CAAC;YAGtC,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC;YAGrB,MAAM,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAGrC,MAAM,gBAAgB,GACpB,WAAW,CAAC,MAAM,EAAE,YAAY,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YAC3D,MAAM,aAAa,GAAG,KAAK,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;YAC9D,aAAa,CAAC,aAAa,CAAC,CAAC;YAG7B,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAEnC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;YAE/C,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,aAAa,CAAC,MAAM;gBAC/B,QAAQ;gBACR,OAAO,EAAE,oBAAoB,aAAa,CAAC,MAAM,kBAAkB,QAAQ,oBAAoB;aAChG,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,CAAC;gBACZ,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,4BAA4B,OAAO,EAAE;aAC/C,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,sBAAsB,GAAS;QACnC,IAAI,EAAE,UAAmB;QACzB,QAAQ,EAAE;YACR,IAAI,EAAE,cAAc;YACpB,WAAW,EACT,4FAA4F;gBAC5F,gHAAgH;YAClH,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,EAAE;aACb;SACF;KACF,CAAC;IAEF,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const Mcp_1 = require("../../src/services/Mcp");
|
|
4
|
+
const Tools_1 = require("../../src/services/Tools");
|
|
5
|
+
async function simulateReloadConfig(Mcp, Tools, mcpServer, getConfig, toolsToUseRef) {
|
|
6
|
+
const freshConfig = await getConfig();
|
|
7
|
+
await Mcp.closeAll();
|
|
8
|
+
await Mcp.connectToConfigured(Tools);
|
|
9
|
+
const allowedToolNames = freshConfig.worker?.allowedTools ?? Tools.getToolNames();
|
|
10
|
+
toolsToUseRef.value = Tools.getToolsByNames(allowedToolNames);
|
|
11
|
+
mcpServer.withTools(toolsToUseRef.value);
|
|
12
|
+
}
|
|
13
|
+
describe("Worker reloadConfig handler", () => {
|
|
14
|
+
let Mcp;
|
|
15
|
+
let Tools;
|
|
16
|
+
let mcpServer;
|
|
17
|
+
let toolsToUseRef;
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
Mcp = new Mcp_1.McpService();
|
|
20
|
+
Tools = new Tools_1.ToolsService();
|
|
21
|
+
mcpServer = { withTools: jest.fn() };
|
|
22
|
+
toolsToUseRef = { value: [] };
|
|
23
|
+
jest.spyOn(Mcp, "closeAll").mockResolvedValue(undefined);
|
|
24
|
+
jest.spyOn(Mcp, "connectToConfigured").mockResolvedValue(undefined);
|
|
25
|
+
});
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
jest.restoreAllMocks();
|
|
28
|
+
});
|
|
29
|
+
it("should call closeAll() to tear down existing MCP connections", async () => {
|
|
30
|
+
const getConfig = jest
|
|
31
|
+
.fn()
|
|
32
|
+
.mockResolvedValue({ worker: { allowedTools: [] } });
|
|
33
|
+
await simulateReloadConfig(Mcp, Tools, mcpServer, getConfig, toolsToUseRef);
|
|
34
|
+
expect(Mcp.closeAll).toHaveBeenCalledTimes(1);
|
|
35
|
+
});
|
|
36
|
+
it("should call connectToConfigured() to reconnect MCPs from fresh config", async () => {
|
|
37
|
+
const getConfig = jest
|
|
38
|
+
.fn()
|
|
39
|
+
.mockResolvedValue({ worker: { allowedTools: [] } });
|
|
40
|
+
await simulateReloadConfig(Mcp, Tools, mcpServer, getConfig, toolsToUseRef);
|
|
41
|
+
expect(Mcp.connectToConfigured).toHaveBeenCalledWith(Tools);
|
|
42
|
+
});
|
|
43
|
+
it("should rebuild the tool list from allowedTools in fresh config", async () => {
|
|
44
|
+
const toolsByNamesSpy = jest
|
|
45
|
+
.spyOn(Tools, "getToolsByNames")
|
|
46
|
+
.mockReturnValue([{ function: { name: "execCommand" } }]);
|
|
47
|
+
const getConfig = jest
|
|
48
|
+
.fn()
|
|
49
|
+
.mockResolvedValue({ worker: { allowedTools: ["execCommand"] } });
|
|
50
|
+
await simulateReloadConfig(Mcp, Tools, mcpServer, getConfig, toolsToUseRef);
|
|
51
|
+
expect(toolsByNamesSpy).toHaveBeenCalledWith(["execCommand"]);
|
|
52
|
+
expect(toolsToUseRef.value).toHaveLength(1);
|
|
53
|
+
});
|
|
54
|
+
it("should fall back to all tool names when allowedTools is not set", async () => {
|
|
55
|
+
const allNames = ["execCommand", "readFile", "writeFileChunk"];
|
|
56
|
+
jest.spyOn(Tools, "getToolNames").mockReturnValue(allNames);
|
|
57
|
+
const toolsByNamesSpy = jest
|
|
58
|
+
.spyOn(Tools, "getToolsByNames")
|
|
59
|
+
.mockReturnValue([]);
|
|
60
|
+
const getConfig = jest.fn().mockResolvedValue({});
|
|
61
|
+
await simulateReloadConfig(Mcp, Tools, mcpServer, getConfig, toolsToUseRef);
|
|
62
|
+
expect(toolsByNamesSpy).toHaveBeenCalledWith(allNames);
|
|
63
|
+
});
|
|
64
|
+
it("should call mcpServer.withTools() with the rebuilt tool list", async () => {
|
|
65
|
+
const fakeTools = [{ function: { name: "readFile" } }];
|
|
66
|
+
jest.spyOn(Tools, "getToolsByNames").mockReturnValue(fakeTools);
|
|
67
|
+
const getConfig = jest
|
|
68
|
+
.fn()
|
|
69
|
+
.mockResolvedValue({ worker: { allowedTools: ["readFile"] } });
|
|
70
|
+
await simulateReloadConfig(Mcp, Tools, mcpServer, getConfig, toolsToUseRef);
|
|
71
|
+
expect(mcpServer.withTools).toHaveBeenCalledWith(fakeTools);
|
|
72
|
+
});
|
|
73
|
+
it("should re-read the config on every reload (not use stale config)", async () => {
|
|
74
|
+
const getConfig = jest
|
|
75
|
+
.fn()
|
|
76
|
+
.mockResolvedValueOnce({ worker: { allowedTools: ["execCommand"] } })
|
|
77
|
+
.mockResolvedValueOnce({ worker: { allowedTools: ["readFile", "writeFileChunk"] } });
|
|
78
|
+
jest.spyOn(Tools, "getToolsByNames").mockReturnValue([]);
|
|
79
|
+
await simulateReloadConfig(Mcp, Tools, mcpServer, getConfig, toolsToUseRef);
|
|
80
|
+
await simulateReloadConfig(Mcp, Tools, mcpServer, getConfig, toolsToUseRef);
|
|
81
|
+
expect(getConfig).toHaveBeenCalledTimes(2);
|
|
82
|
+
expect(Mcp.closeAll).toHaveBeenCalledTimes(2);
|
|
83
|
+
expect(Mcp.connectToConfigured).toHaveBeenCalledTimes(2);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=WorkerReloadConfig.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerReloadConfig.test.js","sourceRoot":"","sources":["../../../tests/services/WorkerReloadConfig.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,6 @@ function makeContext(overrides) {
|
|
|
28
28
|
},
|
|
29
29
|
Plugins: {
|
|
30
30
|
registerPlugin: jest.fn(),
|
|
31
|
-
loadPluginsFromConfig: jest.fn().mockResolvedValue(undefined),
|
|
32
31
|
},
|
|
33
32
|
Clients: {
|
|
34
33
|
registerClient: jest.fn(),
|
|
@@ -141,24 +140,6 @@ describe("ModulesService.loadModulesFromConfig", () => {
|
|
|
141
140
|
expect(context.Plugins.registerPlugin).toHaveBeenCalledWith("test-plugin", mockPluginInstance);
|
|
142
141
|
spy.mockRestore();
|
|
143
142
|
});
|
|
144
|
-
it("should call loadPluginsFromConfig with both global and local configs", async () => {
|
|
145
|
-
const localConfig = {
|
|
146
|
-
modules: [],
|
|
147
|
-
pluginPackages: { asana: "@knowhow/plugin-asana" },
|
|
148
|
-
};
|
|
149
|
-
const globalConfig = {
|
|
150
|
-
modules: [],
|
|
151
|
-
pluginPackages: { linear: "@knowhow/plugin-linear" },
|
|
152
|
-
};
|
|
153
|
-
mockGetConfig.mockResolvedValue(localConfig);
|
|
154
|
-
mockGetGlobalConfig.mockResolvedValue(globalConfig);
|
|
155
|
-
const service = new modules_1.ModulesService();
|
|
156
|
-
const context = makeContext();
|
|
157
|
-
await service.loadModulesFromConfig(context);
|
|
158
|
-
expect(context.Plugins.loadPluginsFromConfig).toHaveBeenCalledTimes(2);
|
|
159
|
-
expect(context.Plugins.loadPluginsFromConfig).toHaveBeenCalledWith(localConfig);
|
|
160
|
-
expect(context.Plugins.loadPluginsFromConfig).toHaveBeenCalledWith(globalConfig);
|
|
161
|
-
});
|
|
162
143
|
it("should load modules from both global and local config paths", async () => {
|
|
163
144
|
const globalModule = makeModule({ agents: [{ name: "GlobalAgent" }] });
|
|
164
145
|
const localModule = makeModule({ agents: [{ name: "LocalAgent" }] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"moduleLoading.test.js","sourceRoot":"","sources":["../../../../tests/unit/modules/moduleLoading.test.ts"],"names":[],"mappings":";;AAGA,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;IACpB,eAAe,EAAE,IAAI,CAAC,EAAE,EAAE;IAC1B,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;CAC7C,CAAC,CAAC,CAAC;AAGJ,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;IACnB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;CACnB,CAAC,CAAC,CAAC;AAGJ,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;QAClC,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;KACV,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,2DAA+D;AAE/D,gDAAiE;AAEjE,MAAM,aAAa,GAAG,kBAAkD,CAAC;AACzE,MAAM,mBAAmB,GAAG,wBAA8D,CAAC;AAE3F,SAAS,WAAW,CAAC,SAAkC;IACrD,OAAO;QACL,MAAM,EAAE;YACN,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;SAClB;QACR,OAAO,EAAE;YACP,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"moduleLoading.test.js","sourceRoot":"","sources":["../../../../tests/unit/modules/moduleLoading.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,69 +55,4 @@ describe("PluginService.loadPlugin", () => {
|
|
|
55
55
|
expect(plugin.meta.key).toBe(mockKey);
|
|
56
56
|
});
|
|
57
57
|
});
|
|
58
|
-
describe("PluginService.loadPluginsFromConfig", () => {
|
|
59
|
-
it("should load plugins listed in config.pluginPackages", async () => {
|
|
60
|
-
const service = new plugins_1.PluginService(makeContext());
|
|
61
|
-
const loadedSpecs = [];
|
|
62
|
-
service.loadPlugin = jest.fn().mockImplementation(async (spec) => {
|
|
63
|
-
loadedSpecs.push(spec);
|
|
64
|
-
const key = `plugin-from-${spec}`;
|
|
65
|
-
const instance = {
|
|
66
|
-
meta: { key, name: key },
|
|
67
|
-
isEnabled: () => true,
|
|
68
|
-
enable: () => { },
|
|
69
|
-
disable: () => { },
|
|
70
|
-
call: () => Promise.resolve(""),
|
|
71
|
-
callMany: () => Promise.resolve(""),
|
|
72
|
-
embed: () => Promise.resolve([]),
|
|
73
|
-
};
|
|
74
|
-
service.pluginMap.set(key, instance);
|
|
75
|
-
return key;
|
|
76
|
-
});
|
|
77
|
-
const config = {
|
|
78
|
-
pluginPackages: {
|
|
79
|
-
asana: "@knowhow/plugin-asana",
|
|
80
|
-
linear: "@knowhow/plugin-linear",
|
|
81
|
-
},
|
|
82
|
-
};
|
|
83
|
-
await service.loadPluginsFromConfig(config);
|
|
84
|
-
expect(loadedSpecs).toContain("@knowhow/plugin-asana");
|
|
85
|
-
expect(loadedSpecs).toContain("@knowhow/plugin-linear");
|
|
86
|
-
expect(loadedSpecs.length).toBe(2);
|
|
87
|
-
});
|
|
88
|
-
it("should handle empty pluginPackages gracefully", async () => {
|
|
89
|
-
const service = new plugins_1.PluginService(makeContext());
|
|
90
|
-
service.loadPlugin = jest.fn();
|
|
91
|
-
const config = {};
|
|
92
|
-
await expect(service.loadPluginsFromConfig(config)).resolves.toBeUndefined();
|
|
93
|
-
expect(service.loadPlugin).not.toHaveBeenCalled();
|
|
94
|
-
});
|
|
95
|
-
it("should log a warning and not crash when a plugin fails to load", async () => {
|
|
96
|
-
const context = makeContext();
|
|
97
|
-
const service = new plugins_1.PluginService(context);
|
|
98
|
-
service.loadPlugin = jest.fn().mockRejectedValue(new Error("Module not found"));
|
|
99
|
-
const config = {
|
|
100
|
-
pluginPackages: {
|
|
101
|
-
broken: "non-existent-package",
|
|
102
|
-
},
|
|
103
|
-
};
|
|
104
|
-
await expect(service.loadPluginsFromConfig(config)).resolves.toBeUndefined();
|
|
105
|
-
expect(context.Events.log).toHaveBeenCalledWith("PluginService", expect.stringContaining("broken"), "warn");
|
|
106
|
-
});
|
|
107
|
-
it("should load each plugin with the correct spec string", async () => {
|
|
108
|
-
const service = new plugins_1.PluginService(makeContext());
|
|
109
|
-
const loadedSpecs = [];
|
|
110
|
-
service.loadPlugin = jest.fn().mockImplementation(async (spec) => {
|
|
111
|
-
loadedSpecs.push(spec);
|
|
112
|
-
return spec;
|
|
113
|
-
});
|
|
114
|
-
const config = {
|
|
115
|
-
pluginPackages: {
|
|
116
|
-
valid: "@knowhow/valid-plugin",
|
|
117
|
-
},
|
|
118
|
-
};
|
|
119
|
-
await service.loadPluginsFromConfig(config);
|
|
120
|
-
expect(loadedSpecs).toEqual(["@knowhow/valid-plugin"]);
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
58
|
//# sourceMappingURL=pluginLoading.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pluginLoading.test.js","sourceRoot":"","sources":["../../../../tests/unit/plugins/pluginLoading.test.ts"],"names":[],"mappings":";;AAAA,0DAA6D;
|
|
1
|
+
{"version":3,"file":"pluginLoading.test.js","sourceRoot":"","sources":["../../../../tests/unit/plugins/pluginLoading.test.ts"],"names":[],"mappings":";;AAAA,0DAA6D;AAK7D,SAAS,WAAW;IAClB,OAAO;QACL,MAAM,EAAE;YACN,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;YACb,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;YACf,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;YACvB,eAAe,EAAE,IAAI,CAAC,EAAE,EAAE;YAC1B,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;SACR;KACQ,CAAC;AACrB,CAAC;AAED,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,OAAO,GAAG,IAAI,uBAAa,CAAC,WAAW,EAAE,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,aAAa,CAAC;QAG9B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;YACxE,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE;gBAC3C,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;gBACrB,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;gBAChB,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;gBACjB,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aACjC,CAAC;YACD,OAAe,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC5D,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACrD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,OAAO,GAAG,IAAI,uBAAa,CAAC,WAAW,EAAE,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,WAAW,CAAC;QAE5B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;YACxE,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE;gBACzC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;gBACrB,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;gBAChB,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;gBACjB,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACrC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACzC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aACjC,CAAC;YACD,OAAe,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC5D,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# Execute Script Tool
|
|
2
|
-
|
|
3
|
-
The `executeScript` tool provides secure, isolated execution of TypeScript scripts with access to the Knowhow platform's tools and AI capabilities.
|
|
4
|
-
|
|
5
|
-
## Requirements
|
|
6
|
-
|
|
7
|
-
### Node.js Version and Configuration
|
|
8
|
-
|
|
9
|
-
**Important**: For Node.js 20.x and later, the `--no-node-snapshot` flag is required due to isolated-vm compatibility requirements.
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
# Required for Node.js 20+
|
|
13
|
-
node --no-node-snapshot your-app.js
|
|
14
|
-
|
|
15
|
-
# Or set in package.json scripts
|
|
16
|
-
"scripts": {
|
|
17
|
-
"start": "node --no-node-snapshot dist/index.js"
|
|
18
|
-
}
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Features
|
|
22
|
-
|
|
23
|
-
- **Secure Sandbox**: Scripts run in isolated-vm with no access to Node.js APIs
|
|
24
|
-
- **Tool Integration**: Access to all existing Knowhow tools via `callTool()`
|
|
25
|
-
- **AI Integration**: Direct access to AI completions via `llm()`
|
|
26
|
-
- **Resource Quotas**: Configurable limits on execution time, memory, tool calls, and tokens
|
|
27
|
-
- **Comprehensive Tracing**: Full audit trail of all script activities
|
|
28
|
-
- **Policy Enforcement**: Fine-grained security controls and access restrictions
|
|
29
|
-
|
|
30
|
-
## Usage
|
|
31
|
-
|
|
32
|
-
```typescript
|
|
33
|
-
// Basic usage
|
|
34
|
-
await executeScript({
|
|
35
|
-
script: `
|
|
36
|
-
console.log("Hello from script!");
|
|
37
|
-
|
|
38
|
-
const files = await callTool("fileSearch", { searchTerm: "*.ts" });
|
|
39
|
-
console.log("Found TypeScript files:", files);
|
|
40
|
-
|
|
41
|
-
const response = await llm([
|
|
42
|
-
{ role: "user", content: "What is TypeScript?" }
|
|
43
|
-
]);
|
|
44
|
-
|
|
45
|
-
return { message: "Script completed successfully" };
|
|
46
|
-
`
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
// With custom policy
|
|
50
|
-
await executeScript({
|
|
51
|
-
script: "...",
|
|
52
|
-
policy: {
|
|
53
|
-
maxExecutionTimeMs: 10000,
|
|
54
|
-
maxMemoryMB: 64,
|
|
55
|
-
maxToolCalls: 5,
|
|
56
|
-
maxTokens: 1000,
|
|
57
|
-
allowedTools: ["fileSearch", "textSearch"],
|
|
58
|
-
deniedTools: ["execCommand"]
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## Available Functions in Scripts
|
|
64
|
-
|
|
65
|
-
### `callTool(name: string, args: any): Promise<any>`
|
|
66
|
-
Call any available Knowhow tool by name with arguments.
|
|
67
|
-
|
|
68
|
-
### `llm(messages: ChatMessage[], options?: LLMOptions): Promise<ChatCompletion>`
|
|
69
|
-
Make AI completion requests with message history and options.
|
|
70
|
-
|
|
71
|
-
## Security Features
|
|
72
|
-
|
|
73
|
-
- **No Node.js Access**: Scripts cannot access filesystem, network, or system APIs directly
|
|
74
|
-
- **Tool Authorization**: All external access goes through existing authorization systems
|
|
75
|
-
- **Resource Limits**: Prevents runaway scripts with time, memory, and usage quotas
|
|
76
|
-
- **Trace Sanitization**: Sensitive data is redacted from execution logs
|
|
77
|
-
- **Policy Enforcement**: Granular control over what tools and resources scripts can access
|
|
78
|
-
|
|
79
|
-
## Implementation Details
|
|
80
|
-
|
|
81
|
-
- **ScriptExecutor**: Handles compilation and isolated execution
|
|
82
|
-
- **SandboxContext**: Provides `callTool` and `llm` function implementations
|
|
83
|
-
- **ScriptTracer**: Records all script activities for debugging and audit
|
|
84
|
-
- **ScriptPolicyEnforcer**: Enforces resource quotas and security policies
|
|
85
|
-
|
|
86
|
-
## Files
|
|
87
|
-
|
|
88
|
-
- `types.ts` - TypeScript interfaces and type definitions
|
|
89
|
-
- `ScriptExecutor.ts` - Core execution engine with isolated-vm
|
|
90
|
-
- `SandboxContext.ts` - Script execution context with tool/AI access
|
|
91
|
-
- `ScriptTracer.ts` - Event tracing and monitoring system
|
|
92
|
-
- `ScriptPolicyEnforcer.ts` - Security policy enforcement
|
|
93
|
-
- `executeScript.ts` - Tool handler and main entry point
|
|
94
|
-
- `examples/` - Example scripts demonstrating capabilities
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { Tool } from "../../../clients";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Tool for executing TypeScript scripts in a secure sandbox
|
|
5
|
-
*/
|
|
6
|
-
export const executeScriptDefinition: Tool = {
|
|
7
|
-
type: "function",
|
|
8
|
-
function: {
|
|
9
|
-
name: "executeScript",
|
|
10
|
-
description: `Used to contruct a script that calls tools and analyzes data, not for general purpose scripting.
|
|
11
|
-
|
|
12
|
-
This is most useful for complex workflows of tool calls that need conditional logic based off tool responses.
|
|
13
|
-
|
|
14
|
-
The script has access to:
|
|
15
|
-
- callTool(toolName, parameters): Call any available tool
|
|
16
|
-
- llm(messages, options): Make LLM calls
|
|
17
|
-
- createArtifact(name, content, type): Create downloadable artifacts
|
|
18
|
-
- console: Standard console logging
|
|
19
|
-
- getQuotaUsage(): Check resource usage
|
|
20
|
-
- sleep(ms): Pause execution for a specified time, max 2000ms
|
|
21
|
-
|
|
22
|
-
The script cannot:
|
|
23
|
-
- import or require
|
|
24
|
-
- make external network requests, outside of callTool and llm
|
|
25
|
-
|
|
26
|
-
Example:
|
|
27
|
-
\`\`\`typescript
|
|
28
|
-
// Call a tool
|
|
29
|
-
const searchResult = await callTool('textSearch', { searchTerm: 'hello world' });
|
|
30
|
-
console.log('Search found:', searchResult);
|
|
31
|
-
|
|
32
|
-
// Call LLM
|
|
33
|
-
const response = await llm([
|
|
34
|
-
{ role: 'user', content: 'Explain quantum computing' }
|
|
35
|
-
], { model: 'gpt-4o-mini', maxTokens: 100 });
|
|
36
|
-
console.log('LLM response:', response.choices[0].message.content);
|
|
37
|
-
|
|
38
|
-
// Create an artifact
|
|
39
|
-
createArtifact('summary.md', '# Summary\\nThis is a test', 'markdown');
|
|
40
|
-
|
|
41
|
-
return { message: 'Script completed successfully' };
|
|
42
|
-
\`\`\`
|
|
43
|
-
|
|
44
|
-
You must return the data you want to be the functionResp
|
|
45
|
-
|
|
46
|
-
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.
|
|
47
|
-
You cannot use isolation breaking methods like: setTimeout setInterval setImmediate clearTimeout clearInterval
|
|
48
|
-
|
|
49
|
-
Security: Scripts run in isolation with quotas on tool calls, tokens, time, and cost.`,
|
|
50
|
-
|
|
51
|
-
parameters: {
|
|
52
|
-
type: "object",
|
|
53
|
-
properties: {
|
|
54
|
-
script: {
|
|
55
|
-
type: "string",
|
|
56
|
-
description: "The TypeScript code to execute. 4000 tokens or less",
|
|
57
|
-
},
|
|
58
|
-
maxToolCalls: {
|
|
59
|
-
type: "number",
|
|
60
|
-
description: "Maximum number of tool calls allowed (default: 50)",
|
|
61
|
-
},
|
|
62
|
-
maxTokens: {
|
|
63
|
-
type: "number",
|
|
64
|
-
description: "Maximum tokens for LLM calls (default: 10000)",
|
|
65
|
-
},
|
|
66
|
-
maxExecutionTimeMs: {
|
|
67
|
-
type: "number",
|
|
68
|
-
description:
|
|
69
|
-
"Maximum execution time in milliseconds (default: 30000)",
|
|
70
|
-
},
|
|
71
|
-
maxCostUsd: {
|
|
72
|
-
type: "number",
|
|
73
|
-
description: "Maximum cost in USD (default: 1.0)",
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
required: ["script"],
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
};
|