@tyvm/knowhow 0.0.108-dev.c7d102c → 0.0.108-dev.ed88cf4
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/package.json +2 -3
- package/src/agents/tools/index.ts +0 -1
- package/src/agents/tools/list.ts +0 -2
- package/src/chat/CliChatService.ts +10 -1
- 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 +91 -664
- package/src/clients/index.ts +6 -5
- package/src/commands/agent.ts +246 -0
- package/src/commands/misc.ts +174 -0
- package/src/commands/modules.ts +182 -0
- package/src/commands/services.ts +77 -0
- package/src/commands/workers.ts +160 -0
- package/src/config.ts +37 -0
- package/src/index.ts +1 -0
- package/src/logger.ts +197 -0
- package/src/plugins/plugins.ts +0 -21
- package/src/processors/JsonCompressor.ts +3 -3
- package/src/services/EventService.ts +61 -1
- package/src/services/modules/index.ts +70 -50
- package/src/services/modules/types.ts +4 -0
- package/src/tunnel.ts +216 -0
- package/src/types.ts +0 -1
- package/src/worker.ts +65 -336
- 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/tests/unit/commands/github-credentials.test.ts +211 -0
- package/tests/unit/modules/moduleLoading.test.ts +39 -37
- package/tests/unit/plugins/pluginLoading.test.ts +0 -85
- package/ts_build/package.json +2 -3
- 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 +13 -1
- package/ts_build/src/chat/CliChatService.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 +47 -525
- package/ts_build/src/cli.js.map +1 -1
- package/ts_build/src/clients/index.js +2 -4
- package/ts_build/src/clients/index.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 +197 -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 +87 -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 +3 -1
- package/ts_build/src/index.js.map +1 -1
- package/ts_build/src/logger.d.ts +21 -0
- package/ts_build/src/logger.js +106 -0
- package/ts_build/src/logger.js.map +1 -0
- 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/processors/JsonCompressor.js +1 -1
- package/ts_build/src/services/EventService.d.ts +6 -1
- package/ts_build/src/services/EventService.js +29 -0
- package/ts_build/src/services/EventService.js.map +1 -1
- package/ts_build/src/services/modules/index.d.ts +33 -0
- package/ts_build/src/services/modules/index.js +46 -45
- 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 +38 -244
- 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/tests/unit/commands/github-credentials.test.d.ts +1 -0
- package/ts_build/tests/unit/commands/github-credentials.test.js +146 -0
- package/ts_build/tests/unit/commands/github-credentials.test.js.map +1 -0
- package/ts_build/tests/unit/modules/moduleLoading.test.js +20 -26
- 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,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
jest.mock("../../../src/config", () => ({
|
|
4
|
+
getConfig: jest.fn().mockResolvedValue({ modules: [] }),
|
|
5
|
+
getGlobalConfig: jest.fn().mockResolvedValue({ modules: [] }),
|
|
6
|
+
getConfigSync: jest.fn().mockReturnValue({}),
|
|
7
|
+
migrateConfig: jest.fn().mockResolvedValue(undefined),
|
|
8
|
+
}));
|
|
9
|
+
jest.mock("../../../src/clients", () => ({
|
|
10
|
+
AIClient: jest.fn(),
|
|
11
|
+
Clients: { registerClient: jest.fn(), registerModels: jest.fn() },
|
|
12
|
+
}));
|
|
13
|
+
jest.mock("../../../src/services/KnowhowClient", () => ({
|
|
14
|
+
KnowhowSimpleClient: jest.fn().mockImplementation(() => ({
|
|
15
|
+
getGitCredential: jest.fn().mockResolvedValue({
|
|
16
|
+
protocol: "https",
|
|
17
|
+
host: "github.com",
|
|
18
|
+
username: "x-access-token",
|
|
19
|
+
password: "ghu_TESTTOKEN123",
|
|
20
|
+
}),
|
|
21
|
+
})),
|
|
22
|
+
}));
|
|
23
|
+
jest.mock("readline", () => ({
|
|
24
|
+
createInterface: jest.fn().mockReturnValue({
|
|
25
|
+
on: jest.fn().mockImplementation(function (event, cb) {
|
|
26
|
+
if (event === "close") {
|
|
27
|
+
setImmediate(() => cb());
|
|
28
|
+
}
|
|
29
|
+
return this;
|
|
30
|
+
}),
|
|
31
|
+
}),
|
|
32
|
+
}));
|
|
33
|
+
const commander_1 = require("commander");
|
|
34
|
+
const misc_1 = require("../../../src/commands/misc");
|
|
35
|
+
const logger_1 = require("../../../src/logger");
|
|
36
|
+
describe("github-credentials command", () => {
|
|
37
|
+
describe("early silencing (pre-module-load)", () => {
|
|
38
|
+
beforeEach(() => {
|
|
39
|
+
logger_1.logger.unsilence();
|
|
40
|
+
logger_1.logger.installConsoleOverload();
|
|
41
|
+
});
|
|
42
|
+
afterEach(() => {
|
|
43
|
+
logger_1.logger.unsilence();
|
|
44
|
+
logger_1.logger.uninstallConsoleOverload();
|
|
45
|
+
});
|
|
46
|
+
it("silences before module loading when github-credentials is in argv", () => {
|
|
47
|
+
const originalArgv = process.argv;
|
|
48
|
+
process.argv = ["node", "knowhow", "github-credentials", "get"];
|
|
49
|
+
const rawArgs = process.argv.slice(2);
|
|
50
|
+
const SILENT_COMMANDS = ["github-credentials"];
|
|
51
|
+
if (rawArgs.some((a) => SILENT_COMMANDS.includes(a))) {
|
|
52
|
+
logger_1.logger.silence();
|
|
53
|
+
}
|
|
54
|
+
const consoleSpy = jest.spyOn(process.stdout, "write");
|
|
55
|
+
console.warn("⚠️ Terminal module: no TunnelHandler in context — terminal addon not registered");
|
|
56
|
+
console.log("some other module loading noise");
|
|
57
|
+
expect(consoleSpy).not.toHaveBeenCalled();
|
|
58
|
+
consoleSpy.mockRestore();
|
|
59
|
+
process.argv = originalArgv;
|
|
60
|
+
});
|
|
61
|
+
it("does NOT silence for other commands", () => {
|
|
62
|
+
const originalArgv = process.argv;
|
|
63
|
+
process.argv = ["node", "knowhow", "chat"];
|
|
64
|
+
const rawArgs = process.argv.slice(2);
|
|
65
|
+
const SILENT_COMMANDS = ["github-credentials"];
|
|
66
|
+
if (rawArgs.some((a) => SILENT_COMMANDS.includes(a))) {
|
|
67
|
+
logger_1.logger.silence();
|
|
68
|
+
}
|
|
69
|
+
expect(logger_1.logger.isSilenced()).toBe(false);
|
|
70
|
+
process.argv = originalArgv;
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
let program;
|
|
74
|
+
let stdoutSpy;
|
|
75
|
+
let writtenToStdout;
|
|
76
|
+
beforeEach(() => {
|
|
77
|
+
jest.clearAllMocks();
|
|
78
|
+
logger_1.logger.unsilence();
|
|
79
|
+
writtenToStdout = [];
|
|
80
|
+
stdoutSpy = jest
|
|
81
|
+
.spyOn(process.stdout, "write")
|
|
82
|
+
.mockImplementation((chunk) => {
|
|
83
|
+
writtenToStdout.push(typeof chunk === "string" ? chunk : chunk.toString());
|
|
84
|
+
return true;
|
|
85
|
+
});
|
|
86
|
+
program = new commander_1.Command();
|
|
87
|
+
program.exitOverride();
|
|
88
|
+
(0, misc_1.addGithubCredentialsCommand)(program);
|
|
89
|
+
});
|
|
90
|
+
afterEach(() => {
|
|
91
|
+
stdoutSpy.mockRestore();
|
|
92
|
+
logger_1.logger.unsilence();
|
|
93
|
+
});
|
|
94
|
+
it("outputs only credential lines to stdout for 'get' action", async () => {
|
|
95
|
+
await program.parseAsync([
|
|
96
|
+
"node", "knowhow", "github-credentials", "get", "--repo", "myorg/myrepo",
|
|
97
|
+
]);
|
|
98
|
+
expect(writtenToStdout).toHaveLength(1);
|
|
99
|
+
expect(writtenToStdout[0]).toBe("protocol=https\nhost=github.com\nusername=x-access-token\npassword=ghu_TESTTOKEN123\n");
|
|
100
|
+
});
|
|
101
|
+
it("silences the logger immediately so module logs don't pollute stdout", async () => {
|
|
102
|
+
await program.parseAsync([
|
|
103
|
+
"node", "knowhow", "github-credentials", "get", "--repo", "myorg/myrepo",
|
|
104
|
+
]);
|
|
105
|
+
expect(logger_1.logger.isSilenced()).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
it("produces exactly 4 credential field lines and nothing else", async () => {
|
|
108
|
+
await program.parseAsync([
|
|
109
|
+
"node", "knowhow", "github-credentials", "get", "--repo", "myorg/myrepo",
|
|
110
|
+
]);
|
|
111
|
+
const allOutput = writtenToStdout.join("");
|
|
112
|
+
const lines = allOutput.trim().split("\n");
|
|
113
|
+
expect(lines).toHaveLength(4);
|
|
114
|
+
expect(lines[0]).toMatch(/^protocol=/);
|
|
115
|
+
expect(lines[1]).toMatch(/^host=/);
|
|
116
|
+
expect(lines[2]).toMatch(/^username=/);
|
|
117
|
+
expect(lines[3]).toMatch(/^password=/);
|
|
118
|
+
});
|
|
119
|
+
it("exits cleanly for 'store' action without writing credentials", async () => {
|
|
120
|
+
let exitCode;
|
|
121
|
+
const exitSpy = jest
|
|
122
|
+
.spyOn(process, "exit")
|
|
123
|
+
.mockImplementation(((code) => {
|
|
124
|
+
exitCode = code ?? 0;
|
|
125
|
+
throw new Error(`process.exit(${exitCode})`);
|
|
126
|
+
}));
|
|
127
|
+
await expect(program.parseAsync(["node", "knowhow", "github-credentials", "store"])).rejects.toThrow("process.exit(0)");
|
|
128
|
+
expect(exitCode).toBe(0);
|
|
129
|
+
expect(writtenToStdout).toHaveLength(0);
|
|
130
|
+
exitSpy.mockRestore();
|
|
131
|
+
});
|
|
132
|
+
it("exits cleanly for 'erase' action without writing credentials", async () => {
|
|
133
|
+
let exitCode;
|
|
134
|
+
const exitSpy = jest
|
|
135
|
+
.spyOn(process, "exit")
|
|
136
|
+
.mockImplementation(((code) => {
|
|
137
|
+
exitCode = code ?? 0;
|
|
138
|
+
throw new Error(`process.exit(${exitCode})`);
|
|
139
|
+
}));
|
|
140
|
+
await expect(program.parseAsync(["node", "knowhow", "github-credentials", "erase"])).rejects.toThrow("process.exit(0)");
|
|
141
|
+
expect(exitCode).toBe(0);
|
|
142
|
+
expect(writtenToStdout).toHaveLength(0);
|
|
143
|
+
exitSpy.mockRestore();
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=github-credentials.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-credentials.test.js","sourceRoot":"","sources":["../../../../tests/unit/commands/github-credentials.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,12 +23,14 @@ const mockGetConfig = config_1.getConfig;
|
|
|
23
23
|
const mockGetGlobalConfig = config_1.getGlobalConfig;
|
|
24
24
|
function makeContext(overrides) {
|
|
25
25
|
return {
|
|
26
|
+
Events: {
|
|
27
|
+
log: jest.fn(),
|
|
28
|
+
},
|
|
26
29
|
Agents: {
|
|
27
30
|
registerAgent: jest.fn(),
|
|
28
31
|
},
|
|
29
32
|
Plugins: {
|
|
30
33
|
registerPlugin: jest.fn(),
|
|
31
|
-
loadPluginsFromConfig: jest.fn().mockResolvedValue(undefined),
|
|
32
34
|
},
|
|
33
35
|
Clients: {
|
|
34
36
|
registerClient: jest.fn(),
|
|
@@ -71,7 +73,8 @@ describe("ModulesService.loadModulesFromConfig", () => {
|
|
|
71
73
|
});
|
|
72
74
|
const service = new modules_1.ModulesService();
|
|
73
75
|
const context = makeContext();
|
|
74
|
-
const requireSpy = jest
|
|
76
|
+
const requireSpy = jest
|
|
77
|
+
.spyOn(service, "loadModulesFromConfig")
|
|
75
78
|
.mockImplementation(async (ctx) => {
|
|
76
79
|
const resolvedCtx = ctx || context;
|
|
77
80
|
await mockModule.init({ config: {}, cwd: process.cwd() });
|
|
@@ -94,11 +97,14 @@ describe("ModulesService.loadModulesFromConfig", () => {
|
|
|
94
97
|
};
|
|
95
98
|
const mockToolHandler = jest.fn();
|
|
96
99
|
const mockModule = makeModule({
|
|
97
|
-
tools: [
|
|
100
|
+
tools: [
|
|
101
|
+
{ name: "myTool", handler: mockToolHandler, definition: mockToolDef },
|
|
102
|
+
],
|
|
98
103
|
});
|
|
99
104
|
const service = new modules_1.ModulesService();
|
|
100
105
|
const context = makeContext();
|
|
101
|
-
const spy = jest
|
|
106
|
+
const spy = jest
|
|
107
|
+
.spyOn(service, "loadModulesFromConfig")
|
|
102
108
|
.mockImplementation(async (ctx) => {
|
|
103
109
|
const resolvedCtx = ctx || context;
|
|
104
110
|
await mockModule.init({ config: {}, cwd: process.cwd() });
|
|
@@ -122,13 +128,16 @@ describe("ModulesService.loadModulesFromConfig", () => {
|
|
|
122
128
|
callMany: () => Promise.resolve(""),
|
|
123
129
|
embed: () => Promise.resolve([]),
|
|
124
130
|
};
|
|
125
|
-
const MockPluginClass = jest
|
|
131
|
+
const MockPluginClass = jest
|
|
132
|
+
.fn()
|
|
133
|
+
.mockImplementation(() => mockPluginInstance);
|
|
126
134
|
const mockModule = makeModule({
|
|
127
135
|
plugins: [{ name: "test-plugin", plugin: MockPluginClass }],
|
|
128
136
|
});
|
|
129
137
|
const service = new modules_1.ModulesService();
|
|
130
138
|
const context = makeContext();
|
|
131
|
-
const spy = jest
|
|
139
|
+
const spy = jest
|
|
140
|
+
.spyOn(service, "loadModulesFromConfig")
|
|
132
141
|
.mockImplementation(async (ctx) => {
|
|
133
142
|
const resolvedCtx = ctx || context;
|
|
134
143
|
await mockModule.init({ config: {}, cwd: process.cwd() });
|
|
@@ -141,26 +150,10 @@ describe("ModulesService.loadModulesFromConfig", () => {
|
|
|
141
150
|
expect(context.Plugins.registerPlugin).toHaveBeenCalledWith("test-plugin", mockPluginInstance);
|
|
142
151
|
spy.mockRestore();
|
|
143
152
|
});
|
|
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
153
|
it("should load modules from both global and local config paths", async () => {
|
|
163
|
-
const globalModule = makeModule({
|
|
154
|
+
const globalModule = makeModule({
|
|
155
|
+
agents: [{ name: "GlobalAgent" }],
|
|
156
|
+
});
|
|
164
157
|
const localModule = makeModule({ agents: [{ name: "LocalAgent" }] });
|
|
165
158
|
mockGetConfig.mockResolvedValue({
|
|
166
159
|
modules: ["./local-module"],
|
|
@@ -171,7 +164,8 @@ describe("ModulesService.loadModulesFromConfig", () => {
|
|
|
171
164
|
const service = new modules_1.ModulesService();
|
|
172
165
|
const context = makeContext();
|
|
173
166
|
const loadedPaths = [];
|
|
174
|
-
const spy = jest
|
|
167
|
+
const spy = jest
|
|
168
|
+
.spyOn(service, "loadModulesFromConfig")
|
|
175
169
|
.mockImplementation(async (ctx) => {
|
|
176
170
|
const resolvedCtx = ctx || context;
|
|
177
171
|
for (const [path, mod] of [
|
|
@@ -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;
|
|
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
|
-
};
|