@timetotest/cli 0.3.0 → 0.3.2
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 +12 -2
- package/dist/bin/ttt.js +0 -6
- package/dist/bin/ttt.js.map +1 -1
- package/dist/package.json +2 -1
- package/dist/src/commands/chat/ChatApp.js +102 -61
- package/dist/src/commands/chat/ChatApp.js.map +1 -1
- package/dist/src/commands/chat/OnboardingApp.js +49 -0
- package/dist/src/commands/chat/OnboardingApp.js.map +1 -0
- package/dist/src/commands/chat/components/Banner.js +1 -1
- package/dist/src/commands/chat/components/Banner.js.map +1 -1
- package/dist/src/commands/chat/components/ChatInput.js +16 -3
- package/dist/src/commands/chat/components/ChatInput.js.map +1 -1
- package/dist/src/commands/chat/components/TodoPanel.js +71 -0
- package/dist/src/commands/chat/components/TodoPanel.js.map +1 -0
- package/dist/src/commands/chat-ink.js +116 -292
- package/dist/src/commands/chat-ink.js.map +1 -1
- package/dist/src/lib/__tests__/code-mode-integration.test.js +45 -356
- package/dist/src/lib/__tests__/code-mode-integration.test.js.map +1 -1
- package/dist/src/lib/__tests__/tool-executor-mode-gating.test.js +46 -0
- package/dist/src/lib/__tests__/tool-executor-mode-gating.test.js.map +1 -0
- package/dist/src/lib/__tests__/ui-browser-integration.test.js +35 -0
- package/dist/src/lib/__tests__/ui-browser-integration.test.js.map +1 -0
- package/dist/src/lib/agent-orchestrator.js +16 -717
- package/dist/src/lib/agent-orchestrator.js.map +1 -1
- package/dist/src/lib/backend-loop-client.js +364 -0
- package/dist/src/lib/backend-loop-client.js.map +1 -0
- package/dist/src/lib/cli-tool-manifest.js +71 -0
- package/dist/src/lib/cli-tool-manifest.js.map +1 -0
- package/dist/src/lib/config.js +60 -9
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/conversation/turns.js +58 -0
- package/dist/src/lib/conversation/turns.js.map +1 -0
- package/dist/src/lib/events.js +20 -4
- package/dist/src/lib/events.js.map +1 -1
- package/dist/src/lib/http.js +7 -2
- package/dist/src/lib/http.js.map +1 -1
- package/dist/src/lib/prompts/templates.js +18 -0
- package/dist/src/lib/prompts/templates.js.map +1 -1
- package/dist/src/lib/session-manager.js +74 -33
- package/dist/src/lib/session-manager.js.map +1 -1
- package/dist/src/lib/socket.js +15 -3
- package/dist/src/lib/socket.js.map +1 -1
- package/dist/src/lib/todo.js +7 -0
- package/dist/src/lib/todo.js.map +1 -0
- package/dist/src/lib/tool-executor.js +196 -51
- package/dist/src/lib/tool-executor.js.map +1 -1
- package/dist/src/lib/tui/events.js +10 -9
- package/dist/src/lib/tui/events.js.map +1 -1
- package/dist/src/lib/utils/json.js +15 -0
- package/dist/src/lib/utils/json.js.map +1 -0
- package/package.json +2 -1
- package/dist/src/commands/report.js +0 -25
- package/dist/src/commands/report.js.map +0 -1
- package/dist/src/commands/restart.js +0 -17
- package/dist/src/commands/restart.js.map +0 -1
- package/dist/src/commands/share.js +0 -18
- package/dist/src/commands/share.js.map +0 -1
- package/dist/src/lib/context-compactor.js +0 -310
- package/dist/src/lib/context-compactor.js.map +0 -1
- package/dist/src/lib/tool-registry.js +0 -971
- package/dist/src/lib/tool-registry.js.map +0 -1
- package/dist/src/lib/tool-result-pruner.js +0 -384
- package/dist/src/lib/tool-result-pruner.js.map +0 -1
|
@@ -1,380 +1,69 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Integration tests for Code Testing Mode.
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* The backend now runs the canonical agent loop. The CLI provides local tools
|
|
5
|
+
* via a compact manifest (domain + permissive schema) and executes calls via
|
|
6
|
+
* ToolExecutor.
|
|
4
7
|
*/
|
|
5
|
-
import { describe, it, expect, beforeEach
|
|
6
|
-
import * as fs from "fs/promises";
|
|
7
|
-
import * as path from "path";
|
|
8
|
-
import * as os from "os";
|
|
8
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
9
9
|
import { parseTestingMode, resolveTestingMode, isTestingMode, TESTING_MODES, } from "../testing-mode.js";
|
|
10
|
-
import {
|
|
10
|
+
import { buildCliToolManifest } from "../cli-tool-manifest.js";
|
|
11
11
|
import { ToolExecutor } from "../tool-executor.js";
|
|
12
12
|
describe("Code Mode Integration Tests", () => {
|
|
13
|
-
/**
|
|
14
|
-
* Task 14.1: Test mode switching to/from code mode
|
|
15
|
-
*/
|
|
16
13
|
describe("Mode Switching", () => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
it("should parse 'CODE' (uppercase) as 'code'", () => {
|
|
23
|
-
const result = parseTestingMode("CODE");
|
|
24
|
-
expect(result).toBe("code");
|
|
25
|
-
});
|
|
26
|
-
it("should parse 'Code' (mixed case) as 'code'", () => {
|
|
27
|
-
const result = parseTestingMode("Code");
|
|
28
|
-
expect(result).toBe("code");
|
|
29
|
-
});
|
|
30
|
-
it("should still parse 'ui' and 'api' modes correctly", () => {
|
|
31
|
-
expect(parseTestingMode("ui")).toBe("ui");
|
|
32
|
-
expect(parseTestingMode("api")).toBe("api");
|
|
33
|
-
});
|
|
34
|
-
it("should return null for invalid modes", () => {
|
|
35
|
-
expect(parseTestingMode("invalid")).toBeNull();
|
|
36
|
-
expect(parseTestingMode("")).toBeNull();
|
|
37
|
-
expect(parseTestingMode(123)).toBeNull();
|
|
38
|
-
expect(parseTestingMode(null)).toBeNull();
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
describe("resolveTestingMode", () => {
|
|
42
|
-
it("should resolve 'code' mode correctly", () => {
|
|
43
|
-
const result = resolveTestingMode("code");
|
|
44
|
-
expect(result).toBe("code");
|
|
45
|
-
});
|
|
46
|
-
it("should use default mode when value is empty", () => {
|
|
47
|
-
expect(resolveTestingMode(undefined)).toBe("ui");
|
|
48
|
-
expect(resolveTestingMode(null)).toBe("ui");
|
|
49
|
-
expect(resolveTestingMode("")).toBe("ui");
|
|
50
|
-
});
|
|
51
|
-
it("should use custom default mode when specified", () => {
|
|
52
|
-
const result = resolveTestingMode(undefined, { defaultMode: "code" });
|
|
53
|
-
expect(result).toBe("code");
|
|
54
|
-
});
|
|
55
|
-
it("should throw error in strict mode for invalid values", () => {
|
|
56
|
-
expect(() => resolveTestingMode("invalid", { strict: true })).toThrow(/invalid testing mode/);
|
|
57
|
-
});
|
|
58
|
-
it("should throw error in strict mode for empty values", () => {
|
|
59
|
-
expect(() => resolveTestingMode("", { strict: true })).toThrow(/invalid testing mode/);
|
|
60
|
-
});
|
|
61
|
-
it("should include context label in error message", () => {
|
|
62
|
-
expect(() => resolveTestingMode("invalid", {
|
|
63
|
-
strict: true,
|
|
64
|
-
contextLabel: "CLI flag",
|
|
65
|
-
})).toThrow(/CLI flag/);
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
describe("isTestingMode", () => {
|
|
69
|
-
it("should return true for 'code'", () => {
|
|
70
|
-
expect(isTestingMode("code")).toBe(true);
|
|
71
|
-
});
|
|
72
|
-
it("should return true for 'ui' and 'api'", () => {
|
|
73
|
-
expect(isTestingMode("ui")).toBe(true);
|
|
74
|
-
expect(isTestingMode("api")).toBe(true);
|
|
75
|
-
});
|
|
76
|
-
it("should return false for invalid modes", () => {
|
|
77
|
-
expect(isTestingMode("invalid")).toBe(false);
|
|
78
|
-
expect(isTestingMode("")).toBe(false);
|
|
79
|
-
expect(isTestingMode(null)).toBe(false);
|
|
80
|
-
expect(isTestingMode(undefined)).toBe(false);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
describe("TESTING_MODES constant", () => {
|
|
84
|
-
it("should include 'code' in the list of testing modes", () => {
|
|
85
|
-
expect(TESTING_MODES).toContain("code");
|
|
86
|
-
});
|
|
87
|
-
it("should include all three modes: ui, api, code", () => {
|
|
88
|
-
expect(TESTING_MODES).toEqual(["ui", "api", "code"]);
|
|
89
|
-
});
|
|
14
|
+
it("parses and resolves code mode", () => {
|
|
15
|
+
expect(parseTestingMode("code")).toBe("code");
|
|
16
|
+
expect(resolveTestingMode("CODE")).toBe("code");
|
|
17
|
+
expect(isTestingMode("code")).toBe(true);
|
|
18
|
+
expect(TESTING_MODES).toEqual(["ui", "api", "code"]);
|
|
90
19
|
});
|
|
91
20
|
});
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
it("should return all code tools when domain is 'code'", () => {
|
|
106
|
-
const tools = getToolSchemasByDomain("code");
|
|
107
|
-
const toolNames = Object.keys(tools);
|
|
108
|
-
for (const codeTool of CODE_TOOLS) {
|
|
109
|
-
expect(toolNames).toContain(codeTool);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
it("should include general tools in code mode", () => {
|
|
113
|
-
const tools = getToolSchemasByDomain("code");
|
|
114
|
-
const toolNames = Object.keys(tools);
|
|
115
|
-
for (const generalTool of GENERAL_TOOLS) {
|
|
116
|
-
expect(toolNames).toContain(generalTool);
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
it("should have correct schema structure for code tools", () => {
|
|
120
|
-
const tools = getToolSchemasByDomain("code");
|
|
121
|
-
for (const toolName of CODE_TOOLS) {
|
|
122
|
-
const schema = tools[toolName];
|
|
123
|
-
expect(schema).toBeDefined();
|
|
124
|
-
expect(schema.name).toBe(toolName);
|
|
125
|
-
expect(schema.description).toBeTruthy();
|
|
126
|
-
expect(schema.parameters).toBeDefined();
|
|
127
|
-
expect(schema.parameters.type).toBe("object");
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
describe("code tools not available in other modes", () => {
|
|
132
|
-
it("should NOT include code tools in 'ui' mode", () => {
|
|
133
|
-
const tools = getToolSchemasByDomain("ui");
|
|
134
|
-
const toolNames = Object.keys(tools);
|
|
135
|
-
for (const codeTool of CODE_TOOLS) {
|
|
136
|
-
expect(toolNames).not.toContain(codeTool);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
it("should NOT include code tools in 'api' mode", () => {
|
|
140
|
-
const tools = getToolSchemasByDomain("api");
|
|
141
|
-
const toolNames = Object.keys(tools);
|
|
142
|
-
for (const codeTool of CODE_TOOLS) {
|
|
143
|
-
expect(toolNames).not.toContain(codeTool);
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
it("should include general tools in all modes", () => {
|
|
147
|
-
const uiTools = getToolSchemasByDomain("ui");
|
|
148
|
-
const apiTools = getToolSchemasByDomain("api");
|
|
149
|
-
const codeTools = getToolSchemasByDomain("code");
|
|
150
|
-
for (const generalTool of GENERAL_TOOLS) {
|
|
151
|
-
expect(Object.keys(uiTools)).toContain(generalTool);
|
|
152
|
-
expect(Object.keys(apiTools)).toContain(generalTool);
|
|
153
|
-
expect(Object.keys(codeTools)).toContain(generalTool);
|
|
154
|
-
}
|
|
155
|
-
});
|
|
21
|
+
describe("CLI Tool Manifest", () => {
|
|
22
|
+
it("includes code tools with domain=code", () => {
|
|
23
|
+
const manifest = buildCliToolManifest();
|
|
24
|
+
const names = new Set(manifest.map((t) => `${t.domain}:${t.name}`));
|
|
25
|
+
for (const tool of [
|
|
26
|
+
"read_file",
|
|
27
|
+
"list_directory",
|
|
28
|
+
"search_files",
|
|
29
|
+
"grep_search",
|
|
30
|
+
"run_command",
|
|
31
|
+
]) {
|
|
32
|
+
expect(names.has(`code:${tool}`)).toBe(true);
|
|
33
|
+
}
|
|
156
34
|
});
|
|
157
|
-
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
];
|
|
164
|
-
it("should NOT include UI tools in 'code' mode", () => {
|
|
165
|
-
const tools = getToolSchemasByDomain("code");
|
|
166
|
-
const toolNames = Object.keys(tools);
|
|
167
|
-
for (const uiTool of UI_TOOLS) {
|
|
168
|
-
expect(toolNames).not.toContain(uiTool);
|
|
169
|
-
}
|
|
170
|
-
});
|
|
35
|
+
it("includes general tools with domain=general", () => {
|
|
36
|
+
const manifest = buildCliToolManifest();
|
|
37
|
+
const names = new Set(manifest.map((t) => `${t.domain}:${t.name}`));
|
|
38
|
+
for (const tool of ["finish", "set_testing_mode", "todo", "browser_session"]) {
|
|
39
|
+
expect(names.has(`general:${tool}`)).toBe(true);
|
|
40
|
+
}
|
|
171
41
|
});
|
|
172
|
-
|
|
173
|
-
const
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
"
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
const tools = getToolSchemasByDomain("code");
|
|
181
|
-
const toolNames = Object.keys(tools);
|
|
182
|
-
for (const apiTool of API_TOOLS) {
|
|
183
|
-
expect(toolNames).not.toContain(apiTool);
|
|
184
|
-
}
|
|
185
|
-
});
|
|
42
|
+
it("provides permissive parameter schemas for all tools", () => {
|
|
43
|
+
const manifest = buildCliToolManifest();
|
|
44
|
+
for (const t of manifest) {
|
|
45
|
+
expect(t.schema.name).toBe(t.name);
|
|
46
|
+
expect(typeof t.schema.description).toBe("string");
|
|
47
|
+
expect(t.schema.parameters).toBeTruthy();
|
|
48
|
+
expect(t.schema.parameters.type).toBe("object");
|
|
49
|
+
}
|
|
186
50
|
});
|
|
187
51
|
});
|
|
188
|
-
|
|
189
|
-
* Task 14.3: Test end-to-end code analysis flow
|
|
190
|
-
*/
|
|
191
|
-
describe("End-to-End Code Analysis Flow", () => {
|
|
192
|
-
let tempDir;
|
|
52
|
+
describe("ToolExecutor (Code Mode) Basic Flow", () => {
|
|
193
53
|
let executor;
|
|
194
|
-
beforeEach(
|
|
195
|
-
// Create a temporary directory for tests
|
|
196
|
-
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "code-mode-integration-"));
|
|
197
|
-
// Create executor in code mode
|
|
54
|
+
beforeEach(() => {
|
|
198
55
|
const context = {
|
|
199
56
|
testingMode: "code",
|
|
200
57
|
codeContext: {
|
|
201
|
-
workingDirectory:
|
|
58
|
+
workingDirectory: process.cwd(),
|
|
202
59
|
},
|
|
203
60
|
};
|
|
204
61
|
executor = new ToolExecutor(context);
|
|
205
62
|
});
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
describe("ToolExecutor executes code tools in code mode", () => {
|
|
211
|
-
it("should execute read_file successfully in code mode", async () => {
|
|
212
|
-
// Create a test file
|
|
213
|
-
const testContent = "const x = 1;\nconst y = 2;";
|
|
214
|
-
await fs.writeFile(path.join(tempDir, "test.ts"), testContent);
|
|
215
|
-
const result = await executor.execute({
|
|
216
|
-
name: "read_file",
|
|
217
|
-
arguments: { path: "test.ts" },
|
|
218
|
-
});
|
|
219
|
-
expect(result.success).toBe(true);
|
|
220
|
-
expect(result.content).toContain("const x = 1");
|
|
221
|
-
expect(result.language).toBe("typescript");
|
|
222
|
-
});
|
|
223
|
-
it("should execute list_directory successfully in code mode", async () => {
|
|
224
|
-
// Create test files
|
|
225
|
-
await fs.writeFile(path.join(tempDir, "file1.ts"), "");
|
|
226
|
-
await fs.writeFile(path.join(tempDir, "file2.ts"), "");
|
|
227
|
-
await fs.mkdir(path.join(tempDir, "subdir"));
|
|
228
|
-
const result = await executor.execute({
|
|
229
|
-
name: "list_directory",
|
|
230
|
-
arguments: { path: "." },
|
|
231
|
-
});
|
|
232
|
-
expect(result.success).toBe(true);
|
|
233
|
-
expect(result.entries).toBeDefined();
|
|
234
|
-
expect(result.entries.length).toBeGreaterThanOrEqual(3);
|
|
235
|
-
});
|
|
236
|
-
it("should execute search_files successfully in code mode", async () => {
|
|
237
|
-
// Create test files
|
|
238
|
-
await fs.writeFile(path.join(tempDir, "file1.ts"), "");
|
|
239
|
-
await fs.writeFile(path.join(tempDir, "file2.ts"), "");
|
|
240
|
-
await fs.writeFile(path.join(tempDir, "file3.js"), "");
|
|
241
|
-
const result = await executor.execute({
|
|
242
|
-
name: "search_files",
|
|
243
|
-
arguments: { pattern: "*.ts" },
|
|
244
|
-
});
|
|
245
|
-
expect(result.success).toBe(true);
|
|
246
|
-
expect(result.files).toBeDefined();
|
|
247
|
-
expect(result.files.length).toBe(2);
|
|
248
|
-
});
|
|
249
|
-
it("should execute grep_search successfully in code mode", async () => {
|
|
250
|
-
// Create test file with searchable content
|
|
251
|
-
await fs.writeFile(path.join(tempDir, "test.ts"), "function hello() {\n return 'world';\n}");
|
|
252
|
-
const result = await executor.execute({
|
|
253
|
-
name: "grep_search",
|
|
254
|
-
arguments: { query: "hello" },
|
|
255
|
-
});
|
|
256
|
-
expect(result.success).toBe(true);
|
|
257
|
-
expect(result.matches).toBeDefined();
|
|
258
|
-
expect(result.matches.length).toBeGreaterThan(0);
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
describe("ToolExecutor rejects code tools when not in code mode", () => {
|
|
262
|
-
it("should reject read_file when in UI mode", async () => {
|
|
263
|
-
const uiContext = {
|
|
264
|
-
testingMode: "ui",
|
|
265
|
-
};
|
|
266
|
-
const uiExecutor = new ToolExecutor(uiContext);
|
|
267
|
-
const result = await uiExecutor.execute({
|
|
268
|
-
name: "read_file",
|
|
269
|
-
arguments: { path: "test.ts" },
|
|
270
|
-
});
|
|
271
|
-
expect(result.error).toBeDefined();
|
|
272
|
-
expect(result.error).toContain("code mode");
|
|
273
|
-
expect(result.current_mode).toBe("ui");
|
|
274
|
-
});
|
|
275
|
-
it("should reject list_directory when in API mode", async () => {
|
|
276
|
-
const apiContext = {
|
|
277
|
-
testingMode: "api",
|
|
278
|
-
};
|
|
279
|
-
const apiExecutor = new ToolExecutor(apiContext);
|
|
280
|
-
const result = await apiExecutor.execute({
|
|
281
|
-
name: "list_directory",
|
|
282
|
-
arguments: { path: "." },
|
|
283
|
-
});
|
|
284
|
-
expect(result.error).toBeDefined();
|
|
285
|
-
expect(result.error).toContain("code mode");
|
|
286
|
-
expect(result.current_mode).toBe("api");
|
|
287
|
-
});
|
|
288
|
-
it("should reject grep_search when in UI mode", async () => {
|
|
289
|
-
const uiContext = {
|
|
290
|
-
testingMode: "ui",
|
|
291
|
-
};
|
|
292
|
-
const uiExecutor = new ToolExecutor(uiContext);
|
|
293
|
-
const result = await uiExecutor.execute({
|
|
294
|
-
name: "grep_search",
|
|
295
|
-
arguments: { query: "test" },
|
|
296
|
-
});
|
|
297
|
-
expect(result.error).toBeDefined();
|
|
298
|
-
expect(result.error).toContain("code mode");
|
|
299
|
-
});
|
|
300
|
-
it("should reject run_command when in API mode", async () => {
|
|
301
|
-
const apiContext = {
|
|
302
|
-
testingMode: "api",
|
|
303
|
-
};
|
|
304
|
-
const apiExecutor = new ToolExecutor(apiContext);
|
|
305
|
-
const result = await apiExecutor.execute({
|
|
306
|
-
name: "run_command",
|
|
307
|
-
arguments: { command: "echo", args: ["hello"] },
|
|
308
|
-
});
|
|
309
|
-
expect(result.error).toBeDefined();
|
|
310
|
-
expect(result.error).toContain("code mode");
|
|
311
|
-
});
|
|
312
|
-
});
|
|
313
|
-
describe("Mode switching via set_testing_mode", () => {
|
|
314
|
-
it("should switch from UI mode to code mode", async () => {
|
|
315
|
-
const context = {
|
|
316
|
-
testingMode: "ui",
|
|
317
|
-
};
|
|
318
|
-
const switchExecutor = new ToolExecutor(context);
|
|
319
|
-
// First, verify code tools don't work in UI mode
|
|
320
|
-
let result = await switchExecutor.execute({
|
|
321
|
-
name: "read_file",
|
|
322
|
-
arguments: { path: "test.ts" },
|
|
323
|
-
});
|
|
324
|
-
expect(result.error).toContain("code mode");
|
|
325
|
-
// Switch to code mode
|
|
326
|
-
result = await switchExecutor.execute({
|
|
327
|
-
name: "set_testing_mode",
|
|
328
|
-
arguments: { mode: "code" },
|
|
329
|
-
});
|
|
330
|
-
expect(result.success).toBe(true);
|
|
331
|
-
expect(result.mode).toBe("code");
|
|
332
|
-
});
|
|
333
|
-
it("should switch from code mode to API mode", async () => {
|
|
334
|
-
const context = {
|
|
335
|
-
testingMode: "code",
|
|
336
|
-
codeContext: { workingDirectory: tempDir },
|
|
337
|
-
};
|
|
338
|
-
const switchExecutor = new ToolExecutor(context);
|
|
339
|
-
// Switch to API mode
|
|
340
|
-
const result = await switchExecutor.execute({
|
|
341
|
-
name: "set_testing_mode",
|
|
342
|
-
arguments: { mode: "api" },
|
|
343
|
-
});
|
|
344
|
-
expect(result.success).toBe(true);
|
|
345
|
-
expect(result.mode).toBe("api");
|
|
346
|
-
});
|
|
347
|
-
it("should reject invalid mode in set_testing_mode", async () => {
|
|
348
|
-
const context = {
|
|
349
|
-
testingMode: "code",
|
|
350
|
-
};
|
|
351
|
-
const switchExecutor = new ToolExecutor(context);
|
|
352
|
-
const result = await switchExecutor.execute({
|
|
353
|
-
name: "set_testing_mode",
|
|
354
|
-
arguments: { mode: "invalid" },
|
|
355
|
-
});
|
|
356
|
-
expect(result.success).toBe(false);
|
|
357
|
-
expect(result.error).toContain("Invalid testing mode");
|
|
358
|
-
});
|
|
359
|
-
});
|
|
360
|
-
describe("General tools work in code mode", () => {
|
|
361
|
-
it("should execute finish tool in code mode", async () => {
|
|
362
|
-
const result = await executor.execute({
|
|
363
|
-
name: "finish",
|
|
364
|
-
arguments: { summary: "Test completed" },
|
|
365
|
-
});
|
|
366
|
-
expect(result.success).toBe(true);
|
|
367
|
-
expect(result.finished).toBe(true);
|
|
368
|
-
expect(result.summary).toBe("Test completed");
|
|
369
|
-
});
|
|
370
|
-
it("should execute set_testing_mode in code mode", async () => {
|
|
371
|
-
const result = await executor.execute({
|
|
372
|
-
name: "set_testing_mode",
|
|
373
|
-
arguments: { mode: "ui" },
|
|
374
|
-
});
|
|
375
|
-
expect(result.success).toBe(true);
|
|
376
|
-
expect(result.mode).toBe("ui");
|
|
377
|
-
});
|
|
63
|
+
it("returns a helpful error for unknown tools", async () => {
|
|
64
|
+
const res = await executor.execute({ name: "does_not_exist", arguments: {} });
|
|
65
|
+
expect(res.success).toBe(false);
|
|
66
|
+
expect(String(res.error || "")).toMatch(/unknown tool/i);
|
|
378
67
|
});
|
|
379
68
|
});
|
|
380
69
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-mode-integration.test.js","sourceRoot":"","sources":["../../../../src/lib/__tests__/code-mode-integration.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"code-mode-integration.test.js","sourceRoot":"","sources":["../../../../src/lib/__tests__/code-mode-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { ToolExecutor } from "../tool-executor.js";
|
|
3
|
+
describe("ToolExecutor mode gating", () => {
|
|
4
|
+
let executor;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
const context = {
|
|
7
|
+
testingMode: "code",
|
|
8
|
+
codeContext: { workingDirectory: process.cwd() },
|
|
9
|
+
apiContext: {},
|
|
10
|
+
browserContext: {},
|
|
11
|
+
};
|
|
12
|
+
executor = new ToolExecutor(context);
|
|
13
|
+
});
|
|
14
|
+
it("returns structured failure when tool is called in wrong mode", async () => {
|
|
15
|
+
const result = await executor.execute({
|
|
16
|
+
name: "api_request",
|
|
17
|
+
arguments: { method: "GET", url: "https://example.com" },
|
|
18
|
+
});
|
|
19
|
+
expect(result.success).toBe(false);
|
|
20
|
+
expect(String(result.error || "")).toMatch(/only in api mode/i);
|
|
21
|
+
expect(result.current_mode).toBe("code");
|
|
22
|
+
});
|
|
23
|
+
it("switches mode and then unlocks tools for that mode", async () => {
|
|
24
|
+
const switched = await executor.execute({
|
|
25
|
+
name: "set_testing_mode",
|
|
26
|
+
arguments: { mode: "api" },
|
|
27
|
+
});
|
|
28
|
+
expect(switched.success).toBe(true);
|
|
29
|
+
expect(switched.mode).toBe("api");
|
|
30
|
+
const result = await executor.execute({
|
|
31
|
+
name: "build_api_request",
|
|
32
|
+
arguments: { method: "GET", url: "https://example.com", headers: {} },
|
|
33
|
+
});
|
|
34
|
+
expect(result.success).not.toBe(false);
|
|
35
|
+
expect(String(result.error || "")).not.toMatch(/only in api mode/i);
|
|
36
|
+
});
|
|
37
|
+
it("gates browser tools outside ui mode", async () => {
|
|
38
|
+
const result = await executor.execute({
|
|
39
|
+
name: "browser_navigate",
|
|
40
|
+
arguments: { url: "https://google.com" },
|
|
41
|
+
});
|
|
42
|
+
expect(result.success).toBe(false);
|
|
43
|
+
expect(String(result.error || "")).toMatch(/only in ui mode/i);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=tool-executor-mode-gating.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-executor-mode-gating.test.js","sourceRoot":"","sources":["../../../../src/lib/__tests__/tool-executor-mode-gating.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAC,MAAM,QAAQ,CAAC;AAExD,OAAO,EAAC,YAAY,EAAwB,MAAM,qBAAqB,CAAC;AAExE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,QAAsB,CAAC;IAE3B,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,OAAO,GAAqB;YAChC,WAAW,EAAE,MAAM;YACnB,WAAW,EAAE,EAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,EAAC;YAC9C,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,EAAE;SACnB,CAAC;QACF,QAAQ,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;YACpC,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,EAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,qBAAqB,EAAC;SACvD,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;YACtC,IAAI,EAAE,kBAAkB;YACxB,SAAS,EAAE,EAAC,IAAI,EAAE,KAAK,EAAC;SACzB,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;YACpC,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,EAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,qBAAqB,EAAE,OAAO,EAAE,EAAE,EAAC;SACpE,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;YACpC,IAAI,EAAE,kBAAkB;YACxB,SAAS,EAAE,EAAC,GAAG,EAAE,oBAAoB,EAAC;SACvC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { ToolExecutor } from "../tool-executor.js";
|
|
3
|
+
const RUN_UI_INTEGRATION = process.env.RUN_UI_INTEGRATION === "1";
|
|
4
|
+
describe("UI browser integration", () => {
|
|
5
|
+
const runOrSkip = RUN_UI_INTEGRATION ? it : it.skip;
|
|
6
|
+
runOrSkip("starts a real browser session and navigates", async () => {
|
|
7
|
+
const context = {
|
|
8
|
+
testingMode: "ui",
|
|
9
|
+
browserContext: {},
|
|
10
|
+
};
|
|
11
|
+
const executor = new ToolExecutor(context);
|
|
12
|
+
const started = await executor.execute({
|
|
13
|
+
name: "browser_session",
|
|
14
|
+
arguments: { action: "start", start_url: "https://www.google.com" },
|
|
15
|
+
});
|
|
16
|
+
if (!started.success) {
|
|
17
|
+
throw new Error(`browser_session failed: ${started.error || "unknown error"}`);
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const navigated = await executor.execute({
|
|
21
|
+
name: "browser_navigate",
|
|
22
|
+
arguments: { url: "https://www.google.com" },
|
|
23
|
+
});
|
|
24
|
+
expect(navigated.success).toBe(true);
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
const stopped = await executor.execute({
|
|
28
|
+
name: "browser_session",
|
|
29
|
+
arguments: { action: "stop" },
|
|
30
|
+
});
|
|
31
|
+
expect(stopped.success).toBe(true);
|
|
32
|
+
}
|
|
33
|
+
}, 120_000);
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=ui-browser-integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-browser-integration.test.js","sourceRoot":"","sources":["../../../../src/lib/__tests__/ui-browser-integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAC,MAAM,QAAQ,CAAC;AAE5C,OAAO,EAAC,YAAY,EAAwB,MAAM,qBAAqB,CAAC;AAExE,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,GAAG,CAAC;AAElE,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;IAEpD,SAAS,CACP,6CAA6C,EAC7C,KAAK,IAAI,EAAE;QACT,MAAM,OAAO,GAAqB;YAChC,WAAW,EAAE,IAAI;YACjB,cAAc,EAAE,EAAE;SACnB,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;YACrC,IAAI,EAAE,iBAAiB;YACvB,SAAS,EAAE,EAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAC;SAClE,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;gBACvC,IAAI,EAAE,kBAAkB;gBACxB,SAAS,EAAE,EAAC,GAAG,EAAE,wBAAwB,EAAC;aAC3C,CAAC,CAAC;YAEH,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;gBACrC,IAAI,EAAE,iBAAiB;gBACvB,SAAS,EAAE,EAAC,MAAM,EAAE,MAAM,EAAC;aAC5B,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,EACD,OAAO,CACR,CAAC;AACJ,CAAC,CAAC,CAAC"}
|