@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.
Files changed (63) hide show
  1. package/README.md +12 -2
  2. package/dist/bin/ttt.js +0 -6
  3. package/dist/bin/ttt.js.map +1 -1
  4. package/dist/package.json +2 -1
  5. package/dist/src/commands/chat/ChatApp.js +102 -61
  6. package/dist/src/commands/chat/ChatApp.js.map +1 -1
  7. package/dist/src/commands/chat/OnboardingApp.js +49 -0
  8. package/dist/src/commands/chat/OnboardingApp.js.map +1 -0
  9. package/dist/src/commands/chat/components/Banner.js +1 -1
  10. package/dist/src/commands/chat/components/Banner.js.map +1 -1
  11. package/dist/src/commands/chat/components/ChatInput.js +16 -3
  12. package/dist/src/commands/chat/components/ChatInput.js.map +1 -1
  13. package/dist/src/commands/chat/components/TodoPanel.js +71 -0
  14. package/dist/src/commands/chat/components/TodoPanel.js.map +1 -0
  15. package/dist/src/commands/chat-ink.js +116 -292
  16. package/dist/src/commands/chat-ink.js.map +1 -1
  17. package/dist/src/lib/__tests__/code-mode-integration.test.js +45 -356
  18. package/dist/src/lib/__tests__/code-mode-integration.test.js.map +1 -1
  19. package/dist/src/lib/__tests__/tool-executor-mode-gating.test.js +46 -0
  20. package/dist/src/lib/__tests__/tool-executor-mode-gating.test.js.map +1 -0
  21. package/dist/src/lib/__tests__/ui-browser-integration.test.js +35 -0
  22. package/dist/src/lib/__tests__/ui-browser-integration.test.js.map +1 -0
  23. package/dist/src/lib/agent-orchestrator.js +16 -717
  24. package/dist/src/lib/agent-orchestrator.js.map +1 -1
  25. package/dist/src/lib/backend-loop-client.js +364 -0
  26. package/dist/src/lib/backend-loop-client.js.map +1 -0
  27. package/dist/src/lib/cli-tool-manifest.js +71 -0
  28. package/dist/src/lib/cli-tool-manifest.js.map +1 -0
  29. package/dist/src/lib/config.js +60 -9
  30. package/dist/src/lib/config.js.map +1 -1
  31. package/dist/src/lib/conversation/turns.js +58 -0
  32. package/dist/src/lib/conversation/turns.js.map +1 -0
  33. package/dist/src/lib/events.js +20 -4
  34. package/dist/src/lib/events.js.map +1 -1
  35. package/dist/src/lib/http.js +7 -2
  36. package/dist/src/lib/http.js.map +1 -1
  37. package/dist/src/lib/prompts/templates.js +18 -0
  38. package/dist/src/lib/prompts/templates.js.map +1 -1
  39. package/dist/src/lib/session-manager.js +74 -33
  40. package/dist/src/lib/session-manager.js.map +1 -1
  41. package/dist/src/lib/socket.js +15 -3
  42. package/dist/src/lib/socket.js.map +1 -1
  43. package/dist/src/lib/todo.js +7 -0
  44. package/dist/src/lib/todo.js.map +1 -0
  45. package/dist/src/lib/tool-executor.js +196 -51
  46. package/dist/src/lib/tool-executor.js.map +1 -1
  47. package/dist/src/lib/tui/events.js +10 -9
  48. package/dist/src/lib/tui/events.js.map +1 -1
  49. package/dist/src/lib/utils/json.js +15 -0
  50. package/dist/src/lib/utils/json.js.map +1 -0
  51. package/package.json +2 -1
  52. package/dist/src/commands/report.js +0 -25
  53. package/dist/src/commands/report.js.map +0 -1
  54. package/dist/src/commands/restart.js +0 -17
  55. package/dist/src/commands/restart.js.map +0 -1
  56. package/dist/src/commands/share.js +0 -18
  57. package/dist/src/commands/share.js.map +0 -1
  58. package/dist/src/lib/context-compactor.js +0 -310
  59. package/dist/src/lib/context-compactor.js.map +0 -1
  60. package/dist/src/lib/tool-registry.js +0 -971
  61. package/dist/src/lib/tool-registry.js.map +0 -1
  62. package/dist/src/lib/tool-result-pruner.js +0 -384
  63. 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
- * Tests mode switching, tool availability per mode, and end-to-end code analysis flow.
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, afterEach } from "vitest";
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 { getToolSchemasByDomain } from "../tool-registry.js";
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
- describe("parseTestingMode", () => {
18
- it("should parse 'code' as a valid testing mode", () => {
19
- const result = parseTestingMode("code");
20
- expect(result).toBe("code");
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
- * Task 14.2: Test tool availability per mode (code tools only in code mode)
94
- */
95
- describe("Tool Availability Per Mode", () => {
96
- const CODE_TOOLS = [
97
- "read_file",
98
- "list_directory",
99
- "search_files",
100
- "grep_search",
101
- "run_command",
102
- ];
103
- const GENERAL_TOOLS = ["finish", "set_testing_mode"];
104
- describe("getToolSchemasByDomain for code mode", () => {
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
- describe("UI tools not available in code mode", () => {
158
- const UI_TOOLS = [
159
- "browser_navigate",
160
- "browser_click",
161
- "browser_type",
162
- "browser_hover",
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
- describe("API tools not available in code mode", () => {
173
- const API_TOOLS = [
174
- "api_request",
175
- "build_api_request",
176
- "generate_curl",
177
- "validate_api_response",
178
- ];
179
- it("should NOT include API tools in 'code' mode", () => {
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(async () => {
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: tempDir,
58
+ workingDirectory: process.cwd(),
202
59
  },
203
60
  };
204
61
  executor = new ToolExecutor(context);
205
62
  });
206
- afterEach(async () => {
207
- // Clean up temporary directory
208
- await fs.rm(tempDir, { recursive: true, force: true });
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"}