@wingman-ai/gateway 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 (124) hide show
  1. package/README.md +8 -0
  2. package/dist/agent/config/agentConfig.cjs +12 -0
  3. package/dist/agent/config/agentConfig.d.ts +22 -0
  4. package/dist/agent/config/agentConfig.js +10 -1
  5. package/dist/agent/config/agentLoader.cjs +9 -0
  6. package/dist/agent/config/agentLoader.js +9 -0
  7. package/dist/agent/config/toolRegistry.cjs +17 -0
  8. package/dist/agent/config/toolRegistry.d.ts +15 -0
  9. package/dist/agent/config/toolRegistry.js +17 -0
  10. package/dist/agent/tests/agentConfig.test.cjs +6 -1
  11. package/dist/agent/tests/agentConfig.test.js +6 -1
  12. package/dist/agent/tests/browserControlHelpers.test.cjs +35 -0
  13. package/dist/agent/tests/browserControlHelpers.test.d.ts +1 -0
  14. package/dist/agent/tests/browserControlHelpers.test.js +29 -0
  15. package/dist/agent/tests/browserControlTool.test.cjs +2117 -0
  16. package/dist/agent/tests/browserControlTool.test.d.ts +1 -0
  17. package/dist/agent/tests/browserControlTool.test.js +2111 -0
  18. package/dist/agent/tests/internet_search.test.cjs +22 -28
  19. package/dist/agent/tests/internet_search.test.js +22 -28
  20. package/dist/agent/tests/toolRegistry.test.cjs +6 -0
  21. package/dist/agent/tests/toolRegistry.test.js +6 -0
  22. package/dist/agent/tools/browser_control.cjs +1282 -0
  23. package/dist/agent/tools/browser_control.d.ts +478 -0
  24. package/dist/agent/tools/browser_control.js +1242 -0
  25. package/dist/agent/tools/internet_search.cjs +9 -5
  26. package/dist/agent/tools/internet_search.js +9 -5
  27. package/dist/cli/commands/agent.cjs +16 -2
  28. package/dist/cli/commands/agent.js +16 -2
  29. package/dist/cli/commands/browser.cjs +603 -0
  30. package/dist/cli/commands/browser.d.ts +13 -0
  31. package/dist/cli/commands/browser.js +566 -0
  32. package/dist/cli/commands/gateway.cjs +18 -7
  33. package/dist/cli/commands/gateway.d.ts +5 -1
  34. package/dist/cli/commands/gateway.js +18 -7
  35. package/dist/cli/commands/init.cjs +134 -45
  36. package/dist/cli/commands/init.js +134 -45
  37. package/dist/cli/commands/skill.cjs +3 -2
  38. package/dist/cli/commands/skill.js +3 -2
  39. package/dist/cli/config/loader.cjs +15 -0
  40. package/dist/cli/config/loader.js +15 -0
  41. package/dist/cli/config/schema.cjs +51 -2
  42. package/dist/cli/config/schema.d.ts +49 -0
  43. package/dist/cli/config/schema.js +44 -1
  44. package/dist/cli/core/workspace.cjs +89 -0
  45. package/dist/cli/core/workspace.d.ts +1 -0
  46. package/dist/cli/core/workspace.js +55 -0
  47. package/dist/cli/index.cjs +53 -5
  48. package/dist/cli/index.js +53 -5
  49. package/dist/cli/types/browser.cjs +18 -0
  50. package/dist/cli/types/browser.d.ts +9 -0
  51. package/dist/cli/types/browser.js +0 -0
  52. package/dist/gateway/browserRelayServer.cjs +338 -0
  53. package/dist/gateway/browserRelayServer.d.ts +38 -0
  54. package/dist/gateway/browserRelayServer.js +301 -0
  55. package/dist/gateway/http/agents.cjs +22 -0
  56. package/dist/gateway/http/agents.js +22 -0
  57. package/dist/gateway/http/fs.cjs +57 -0
  58. package/dist/gateway/http/fs.js +58 -1
  59. package/dist/gateway/server.cjs +43 -6
  60. package/dist/gateway/server.d.ts +4 -1
  61. package/dist/gateway/server.js +36 -5
  62. package/dist/gateway/transport/websocket.cjs +45 -10
  63. package/dist/gateway/transport/websocket.d.ts +1 -0
  64. package/dist/gateway/transport/websocket.js +41 -9
  65. package/dist/gateway/types.d.ts +4 -0
  66. package/dist/tests/agents-api.test.cjs +52 -0
  67. package/dist/tests/agents-api.test.js +53 -1
  68. package/dist/tests/browser-command.test.cjs +264 -0
  69. package/dist/tests/browser-command.test.d.ts +1 -0
  70. package/dist/tests/browser-command.test.js +258 -0
  71. package/dist/tests/browser-relay-server.test.cjs +20 -0
  72. package/dist/tests/browser-relay-server.test.d.ts +1 -0
  73. package/dist/tests/browser-relay-server.test.js +14 -0
  74. package/dist/tests/cli-config-loader.test.cjs +43 -0
  75. package/dist/tests/cli-config-loader.test.js +43 -0
  76. package/dist/tests/cli-init.test.cjs +25 -2
  77. package/dist/tests/cli-init.test.js +25 -2
  78. package/dist/tests/cli-workspace-root.test.cjs +114 -0
  79. package/dist/tests/cli-workspace-root.test.d.ts +1 -0
  80. package/dist/tests/cli-workspace-root.test.js +108 -0
  81. package/dist/tests/fs-api.test.cjs +138 -0
  82. package/dist/tests/fs-api.test.d.ts +1 -0
  83. package/dist/tests/fs-api.test.js +132 -0
  84. package/dist/tests/gateway-command-workspace.test.cjs +150 -0
  85. package/dist/tests/gateway-command-workspace.test.d.ts +1 -0
  86. package/dist/tests/gateway-command-workspace.test.js +144 -0
  87. package/dist/tests/gateway-request-execution-overrides.test.cjs +42 -0
  88. package/dist/tests/gateway-request-execution-overrides.test.d.ts +1 -0
  89. package/dist/tests/gateway-request-execution-overrides.test.js +36 -0
  90. package/dist/tests/gateway.test.cjs +31 -0
  91. package/dist/tests/gateway.test.js +31 -0
  92. package/dist/tests/websocket-transport.test.cjs +31 -0
  93. package/dist/tests/websocket-transport.test.d.ts +1 -0
  94. package/dist/tests/websocket-transport.test.js +25 -0
  95. package/dist/webui/assets/index-Cwkg4DKj.css +11 -0
  96. package/dist/webui/assets/{index-0nUBsUUq.js → index-DHbfLOUR.js} +109 -107
  97. package/dist/webui/index.html +2 -2
  98. package/extensions/wingman-browser-extension/README.md +27 -0
  99. package/extensions/wingman-browser-extension/background.js +416 -0
  100. package/extensions/wingman-browser-extension/manifest.json +19 -0
  101. package/extensions/wingman-browser-extension/options.html +156 -0
  102. package/extensions/wingman-browser-extension/options.js +106 -0
  103. package/package.json +8 -8
  104. package/{.wingman → templates}/agents/README.md +2 -1
  105. package/{.wingman → templates}/agents/coding/agent.md +0 -1
  106. package/{.wingman → templates}/agents/coding-v2/agent.md +0 -1
  107. package/{.wingman → templates}/agents/game-dev/agent.md +8 -1
  108. package/{.wingman → templates}/agents/game-dev/art-generation.md +1 -0
  109. package/{.wingman → templates}/agents/main/agent.md +5 -0
  110. package/{.wingman → templates}/agents/researcher/agent.md +9 -0
  111. package/{.wingman → templates}/agents/stock-trader/agent.md +1 -0
  112. package/dist/webui/assets/index-kk7OrD-G.css +0 -11
  113. /package/{.wingman → templates}/agents/coding-v2/implementor.md +0 -0
  114. /package/{.wingman → templates}/agents/game-dev/asset-refinement.md +0 -0
  115. /package/{.wingman → templates}/agents/game-dev/planning-idea.md +0 -0
  116. /package/{.wingman → templates}/agents/game-dev/ui-specialist.md +0 -0
  117. /package/{.wingman → templates}/agents/stock-trader/chain-curator.md +0 -0
  118. /package/{.wingman → templates}/agents/stock-trader/goal-translator.md +0 -0
  119. /package/{.wingman → templates}/agents/stock-trader/guardrails-veto.md +0 -0
  120. /package/{.wingman → templates}/agents/stock-trader/path-planner.md +0 -0
  121. /package/{.wingman → templates}/agents/stock-trader/regime-analyst.md +0 -0
  122. /package/{.wingman → templates}/agents/stock-trader/risk.md +0 -0
  123. /package/{.wingman → templates}/agents/stock-trader/selection.md +0 -0
  124. /package/{.wingman → templates}/agents/stock-trader/strategy-composer.md +0 -0
package/README.md CHANGED
@@ -74,6 +74,14 @@ npm install -g @wingman-ai/gateway
74
74
  wingman init
75
75
  ```
76
76
 
77
+ ### Re-sync Bundled Agent Templates
78
+
79
+ ```bash
80
+ wingman init --mode sync --only agents
81
+ wingman init --mode sync --only agents --agents main,coding
82
+ wingman init --mode sync --only agents --force
83
+ ```
84
+
77
85
  ### Start the Gateway
78
86
 
79
87
  ```bash
@@ -24,6 +24,7 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
+ AgentBrowserTransportSchema: ()=>AgentBrowserTransportSchema,
27
28
  WingmanDirectory: ()=>WingmanDirectory,
28
29
  AgentConfigSchema: ()=>AgentConfigSchema,
29
30
  AvailableToolNames: ()=>AvailableToolNames,
@@ -38,6 +39,7 @@ const WingmanDirectory = ".wingman";
38
39
  const AvailableToolNames = external_zod_namespaceObject["enum"]([
39
40
  "internet_search",
40
41
  "web_crawler",
42
+ "browser_control",
41
43
  "command_execute",
42
44
  "background_terminal",
43
45
  "think",
@@ -56,6 +58,11 @@ const ReasoningEffortSchema = external_zod_namespaceObject.preprocess((value)=>{
56
58
  "medium",
57
59
  "high"
58
60
  ]));
61
+ const AgentBrowserTransportSchema = external_zod_namespaceObject["enum"]([
62
+ "auto",
63
+ "playwright",
64
+ "relay"
65
+ ]);
59
66
  const PromptRefinementSchema = external_zod_namespaceObject.preprocess((value)=>{
60
67
  if (void 0 === value) return;
61
68
  if ("boolean" == typeof value) return {
@@ -76,6 +83,9 @@ const BaseAgentConfigSchema = external_zod_namespaceObject.object({
76
83
  blockedCommands: external_zod_namespaceObject.array(external_zod_namespaceObject.string()).optional().describe("List of blocked commands for command_execute tool (e.g., ['rm', 'mv'])"),
77
84
  allowScriptExecution: external_zod_namespaceObject.boolean().optional().default(true).describe("Whether to allow script execution in command_execute tool"),
78
85
  commandTimeout: external_zod_namespaceObject.number().optional().default(300000).describe("Command execution timeout in milliseconds (default: 300000)"),
86
+ browserProfile: external_zod_namespaceObject.string().min(1).optional().describe("Optional named browser profile ID for persistent browser_control sessions"),
87
+ browserTransport: AgentBrowserTransportSchema.optional().describe('Optional browser_control transport preference ("auto", "playwright", or "relay")'),
88
+ browserExtensions: external_zod_namespaceObject.array(external_zod_namespaceObject.string().min(1)).optional().describe("Optional extension IDs to load for browser_control sessions (maps from wingman.config browser.extensions)"),
79
89
  toolHooks: types_cjs_namespaceObject.HooksConfigSchema.optional().describe("Agent-specific tool hooks configuration"),
80
90
  mcp: mcp_cjs_namespaceObject.MCPServersConfigSchema.optional().describe("Agent-specific MCP server configurations"),
81
91
  mcpUseGlobal: external_zod_namespaceObject.boolean().optional().default(false).describe("Whether this agent should also load global MCP servers from wingman.config.json"),
@@ -135,12 +145,14 @@ function validateAgentConfig(config) {
135
145
  };
136
146
  }
137
147
  }
148
+ exports.AgentBrowserTransportSchema = __webpack_exports__.AgentBrowserTransportSchema;
138
149
  exports.AgentConfigSchema = __webpack_exports__.AgentConfigSchema;
139
150
  exports.AvailableToolNames = __webpack_exports__.AvailableToolNames;
140
151
  exports.ReasoningEffortSchema = __webpack_exports__.ReasoningEffortSchema;
141
152
  exports.WingmanDirectory = __webpack_exports__.WingmanDirectory;
142
153
  exports.validateAgentConfig = __webpack_exports__.validateAgentConfig;
143
154
  for(var __rspack_i in __webpack_exports__)if (-1 === [
155
+ "AgentBrowserTransportSchema",
144
156
  "AgentConfigSchema",
145
157
  "AvailableToolNames",
146
158
  "ReasoningEffortSchema",
@@ -6,6 +6,7 @@ export declare const WingmanDirectory = ".wingman";
6
6
  export declare const AvailableToolNames: z.ZodEnum<{
7
7
  internet_search: "internet_search";
8
8
  web_crawler: "web_crawler";
9
+ browser_control: "browser_control";
9
10
  command_execute: "command_execute";
10
11
  background_terminal: "background_terminal";
11
12
  think: "think";
@@ -23,6 +24,11 @@ export declare const ReasoningEffortSchema: z.ZodPipe<z.ZodTransform<unknown, un
23
24
  high: "high";
24
25
  }>>;
25
26
  export type ReasoningEffort = z.infer<typeof ReasoningEffortSchema>;
27
+ export declare const AgentBrowserTransportSchema: z.ZodEnum<{
28
+ auto: "auto";
29
+ playwright: "playwright";
30
+ relay: "relay";
31
+ }>;
26
32
  declare const PromptRefinementSchema: z.ZodPipe<z.ZodTransform<{} | null | undefined, unknown>, z.ZodObject<{
27
33
  enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
28
34
  instructionsPath: z.ZodOptional<z.ZodString>;
@@ -35,6 +41,7 @@ export declare const AgentConfigSchema: z.ZodObject<{
35
41
  tools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
36
42
  internet_search: "internet_search";
37
43
  web_crawler: "web_crawler";
44
+ browser_control: "browser_control";
38
45
  command_execute: "command_execute";
39
46
  background_terminal: "background_terminal";
40
47
  think: "think";
@@ -54,6 +61,13 @@ export declare const AgentConfigSchema: z.ZodObject<{
54
61
  blockedCommands: z.ZodOptional<z.ZodArray<z.ZodString>>;
55
62
  allowScriptExecution: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
56
63
  commandTimeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
64
+ browserProfile: z.ZodOptional<z.ZodString>;
65
+ browserTransport: z.ZodOptional<z.ZodEnum<{
66
+ auto: "auto";
67
+ playwright: "playwright";
68
+ relay: "relay";
69
+ }>>;
70
+ browserExtensions: z.ZodOptional<z.ZodArray<z.ZodString>>;
57
71
  toolHooks: z.ZodOptional<z.ZodObject<{
58
72
  PreToolUse: z.ZodOptional<z.ZodArray<z.ZodObject<{
59
73
  matcher: z.ZodOptional<z.ZodString>;
@@ -131,6 +145,7 @@ export declare const AgentConfigSchema: z.ZodObject<{
131
145
  tools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
132
146
  internet_search: "internet_search";
133
147
  web_crawler: "web_crawler";
148
+ browser_control: "browser_control";
134
149
  command_execute: "command_execute";
135
150
  background_terminal: "background_terminal";
136
151
  think: "think";
@@ -150,6 +165,13 @@ export declare const AgentConfigSchema: z.ZodObject<{
150
165
  blockedCommands: z.ZodOptional<z.ZodArray<z.ZodString>>;
151
166
  allowScriptExecution: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
152
167
  commandTimeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
168
+ browserProfile: z.ZodOptional<z.ZodString>;
169
+ browserTransport: z.ZodOptional<z.ZodEnum<{
170
+ auto: "auto";
171
+ playwright: "playwright";
172
+ relay: "relay";
173
+ }>>;
174
+ browserExtensions: z.ZodOptional<z.ZodArray<z.ZodString>>;
153
175
  toolHooks: z.ZodOptional<z.ZodObject<{
154
176
  PreToolUse: z.ZodOptional<z.ZodArray<z.ZodObject<{
155
177
  matcher: z.ZodOptional<z.ZodString>;
@@ -6,6 +6,7 @@ const WingmanDirectory = ".wingman";
6
6
  const AvailableToolNames = external_zod_enum([
7
7
  "internet_search",
8
8
  "web_crawler",
9
+ "browser_control",
9
10
  "command_execute",
10
11
  "background_terminal",
11
12
  "think",
@@ -24,6 +25,11 @@ const ReasoningEffortSchema = preprocess((value)=>{
24
25
  "medium",
25
26
  "high"
26
27
  ]));
28
+ const AgentBrowserTransportSchema = external_zod_enum([
29
+ "auto",
30
+ "playwright",
31
+ "relay"
32
+ ]);
27
33
  const PromptRefinementSchema = preprocess((value)=>{
28
34
  if (void 0 === value) return;
29
35
  if ("boolean" == typeof value) return {
@@ -44,6 +50,9 @@ const BaseAgentConfigSchema = object({
44
50
  blockedCommands: array(string()).optional().describe("List of blocked commands for command_execute tool (e.g., ['rm', 'mv'])"),
45
51
  allowScriptExecution: external_zod_boolean().optional().default(true).describe("Whether to allow script execution in command_execute tool"),
46
52
  commandTimeout: number().optional().default(300000).describe("Command execution timeout in milliseconds (default: 300000)"),
53
+ browserProfile: string().min(1).optional().describe("Optional named browser profile ID for persistent browser_control sessions"),
54
+ browserTransport: AgentBrowserTransportSchema.optional().describe('Optional browser_control transport preference ("auto", "playwright", or "relay")'),
55
+ browserExtensions: array(string().min(1)).optional().describe("Optional extension IDs to load for browser_control sessions (maps from wingman.config browser.extensions)"),
47
56
  toolHooks: HooksConfigSchema.optional().describe("Agent-specific tool hooks configuration"),
48
57
  mcp: MCPServersConfigSchema.optional().describe("Agent-specific MCP server configurations"),
49
58
  mcpUseGlobal: external_zod_boolean().optional().default(false).describe("Whether this agent should also load global MCP servers from wingman.config.json"),
@@ -103,4 +112,4 @@ function validateAgentConfig(config) {
103
112
  };
104
113
  }
105
114
  }
106
- export { AgentConfigSchema, AvailableToolNames, ReasoningEffortSchema, WingmanDirectory, validateAgentConfig };
115
+ export { AgentBrowserTransportSchema, AgentConfigSchema, AvailableToolNames, ReasoningEffortSchema, WingmanDirectory, validateAgentConfig };
@@ -228,6 +228,15 @@ class AgentLoader {
228
228
  blockedCommands: source.blockedCommands,
229
229
  allowScriptExecution: source.allowScriptExecution,
230
230
  timeout: source.commandTimeout,
231
+ browserProfile: source.browserProfile || this.wingmanConfig?.browser?.defaultProfile,
232
+ browserTransport: source.browserTransport || this.wingmanConfig?.browser?.transport,
233
+ browserProfilesDirectory: this.wingmanConfig?.browser?.profilesDir,
234
+ browserProfiles: this.wingmanConfig?.browser?.profiles,
235
+ browserExtensions: source.browserExtensions,
236
+ browserExtensionsDirectory: this.wingmanConfig?.browser?.extensionsDir,
237
+ browserExtensionsById: this.wingmanConfig?.browser?.extensions,
238
+ browserDefaultExtensions: this.wingmanConfig?.browser?.defaultExtensions,
239
+ browserRelay: this.wingmanConfig?.browser?.relay,
231
240
  searchConfig: this.wingmanConfig?.search,
232
241
  mcpConfigs,
233
242
  skillsDirectory,
@@ -200,6 +200,15 @@ class AgentLoader {
200
200
  blockedCommands: source.blockedCommands,
201
201
  allowScriptExecution: source.allowScriptExecution,
202
202
  timeout: source.commandTimeout,
203
+ browserProfile: source.browserProfile || this.wingmanConfig?.browser?.defaultProfile,
204
+ browserTransport: source.browserTransport || this.wingmanConfig?.browser?.transport,
205
+ browserProfilesDirectory: this.wingmanConfig?.browser?.profilesDir,
206
+ browserProfiles: this.wingmanConfig?.browser?.profiles,
207
+ browserExtensions: source.browserExtensions,
208
+ browserExtensionsDirectory: this.wingmanConfig?.browser?.extensionsDir,
209
+ browserExtensionsById: this.wingmanConfig?.browser?.extensions,
210
+ browserDefaultExtensions: this.wingmanConfig?.browser?.defaultExtensions,
211
+ browserRelay: this.wingmanConfig?.browser?.relay,
203
212
  searchConfig: this.wingmanConfig?.search,
204
213
  mcpConfigs,
205
214
  skillsDirectory,
@@ -31,6 +31,7 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  });
32
32
  const external_logger_cjs_namespaceObject = require("../../logger.cjs");
33
33
  const background_terminal_cjs_namespaceObject = require("../tools/background_terminal.cjs");
34
+ const browser_control_cjs_namespaceObject = require("../tools/browser_control.cjs");
34
35
  const code_search_cjs_namespaceObject = require("../tools/code_search.cjs");
35
36
  const command_execute_cjs_namespaceObject = require("../tools/command_execute.cjs");
36
37
  const git_status_cjs_namespaceObject = require("../tools/git_status.cjs");
@@ -65,6 +66,21 @@ function createTool(name, options = {}) {
65
66
  return (0, internet_search_cjs_namespaceObject.createInternetSearchTool)(searchConfig);
66
67
  case "web_crawler":
67
68
  return web_crawler_cjs_namespaceObject.webCrawler;
69
+ case "browser_control":
70
+ return (0, browser_control_cjs_namespaceObject.createBrowserControlTool)({
71
+ workspace: runtimeWorkspace,
72
+ configWorkspace: workspace,
73
+ launchTimeoutMs: timeout,
74
+ browserProfile: options.browserProfile,
75
+ browserTransport: options.browserTransport,
76
+ profilesRootDir: options.browserProfilesDirectory,
77
+ profilePaths: options.browserProfiles,
78
+ browserExtensions: options.browserExtensions,
79
+ extensionsRootDir: options.browserExtensionsDirectory,
80
+ extensionPaths: options.browserExtensionsById,
81
+ defaultExtensions: options.browserDefaultExtensions,
82
+ relayConfig: options.browserRelay
83
+ });
68
84
  case "command_execute":
69
85
  return (0, command_execute_cjs_namespaceObject.createCommandExecuteTool)(runtimeWorkspace, process.env, blockedCommands, allowScriptExecution, timeout);
70
86
  case "background_terminal":
@@ -121,6 +137,7 @@ function getAvailableTools() {
121
137
  return [
122
138
  "internet_search",
123
139
  "web_crawler",
140
+ "browser_control",
124
141
  "command_execute",
125
142
  "background_terminal",
126
143
  "think",
@@ -9,6 +9,21 @@ export interface ToolOptions {
9
9
  blockedCommands?: string[];
10
10
  allowScriptExecution?: boolean;
11
11
  timeout?: number;
12
+ browserProfile?: string;
13
+ browserTransport?: "auto" | "playwright" | "relay";
14
+ browserProfilesDirectory?: string;
15
+ browserProfiles?: Record<string, string>;
16
+ browserExtensions?: string[];
17
+ browserExtensionsDirectory?: string;
18
+ browserExtensionsById?: Record<string, string>;
19
+ browserDefaultExtensions?: string[];
20
+ browserRelay?: {
21
+ enabled?: boolean;
22
+ host?: string;
23
+ port?: number;
24
+ requireAuth?: boolean;
25
+ authToken?: string;
26
+ };
12
27
  terminalOwnerId?: string;
13
28
  terminalSessionManager?: TerminalSessionManager;
14
29
  searchConfig?: SearchConfig;
@@ -1,5 +1,6 @@
1
1
  import { createLogger } from "../../logger.js";
2
2
  import { createBackgroundTerminalTool } from "../tools/background_terminal.js";
3
+ import { createBrowserControlTool } from "../tools/browser_control.js";
3
4
  import { createCodeSearchTool } from "../tools/code_search.js";
4
5
  import { createCommandExecuteTool } from "../tools/command_execute.js";
5
6
  import { createGitStatusTool } from "../tools/git_status.js";
@@ -34,6 +35,21 @@ function createTool(name, options = {}) {
34
35
  return createInternetSearchTool(searchConfig);
35
36
  case "web_crawler":
36
37
  return webCrawler;
38
+ case "browser_control":
39
+ return createBrowserControlTool({
40
+ workspace: runtimeWorkspace,
41
+ configWorkspace: workspace,
42
+ launchTimeoutMs: timeout,
43
+ browserProfile: options.browserProfile,
44
+ browserTransport: options.browserTransport,
45
+ profilesRootDir: options.browserProfilesDirectory,
46
+ profilePaths: options.browserProfiles,
47
+ browserExtensions: options.browserExtensions,
48
+ extensionsRootDir: options.browserExtensionsDirectory,
49
+ extensionPaths: options.browserExtensionsById,
50
+ defaultExtensions: options.browserDefaultExtensions,
51
+ relayConfig: options.browserRelay
52
+ });
37
53
  case "command_execute":
38
54
  return createCommandExecuteTool(runtimeWorkspace, process.env, blockedCommands, allowScriptExecution, timeout);
39
55
  case "background_terminal":
@@ -90,6 +106,7 @@ function getAvailableTools() {
90
106
  return [
91
107
  "internet_search",
92
108
  "web_crawler",
109
+ "browser_control",
93
110
  "command_execute",
94
111
  "background_terminal",
95
112
  "think",
@@ -34,7 +34,9 @@ const agentConfig_cjs_namespaceObject = require("../config/agentConfig.cjs");
34
34
  "mv"
35
35
  ],
36
36
  allowScriptExecution: true,
37
- commandTimeout: 300000
37
+ commandTimeout: 300000,
38
+ browserProfile: "trading",
39
+ browserTransport: "relay"
38
40
  };
39
41
  const result = (0, agentConfig_cjs_namespaceObject.validateAgentConfig)(config);
40
42
  (0, external_vitest_namespaceObject.expect)(result.success).toBe(true);
@@ -51,6 +53,8 @@ const agentConfig_cjs_namespaceObject = require("../config/agentConfig.cjs");
51
53
  ]);
52
54
  (0, external_vitest_namespaceObject.expect)(result.data.allowScriptExecution).toBe(true);
53
55
  (0, external_vitest_namespaceObject.expect)(result.data.commandTimeout).toBe(300000);
56
+ (0, external_vitest_namespaceObject.expect)(result.data.browserProfile).toBe("trading");
57
+ (0, external_vitest_namespaceObject.expect)(result.data.browserTransport).toBe("relay");
54
58
  }
55
59
  });
56
60
  (0, external_vitest_namespaceObject.it)("should allow subagents to override models", ()=>{
@@ -189,6 +193,7 @@ const agentConfig_cjs_namespaceObject = require("../config/agentConfig.cjs");
189
193
  const validTools = [
190
194
  "internet_search",
191
195
  "web_crawler",
196
+ "browser_control",
192
197
  "command_execute",
193
198
  "background_terminal",
194
199
  "think",
@@ -32,7 +32,9 @@ describe("Agent Configuration Schema", ()=>{
32
32
  "mv"
33
33
  ],
34
34
  allowScriptExecution: true,
35
- commandTimeout: 300000
35
+ commandTimeout: 300000,
36
+ browserProfile: "trading",
37
+ browserTransport: "relay"
36
38
  };
37
39
  const result = validateAgentConfig(config);
38
40
  expect(result.success).toBe(true);
@@ -49,6 +51,8 @@ describe("Agent Configuration Schema", ()=>{
49
51
  ]);
50
52
  expect(result.data.allowScriptExecution).toBe(true);
51
53
  expect(result.data.commandTimeout).toBe(300000);
54
+ expect(result.data.browserProfile).toBe("trading");
55
+ expect(result.data.browserTransport).toBe("relay");
52
56
  }
53
57
  });
54
58
  it("should allow subagents to override models", ()=>{
@@ -187,6 +191,7 @@ describe("Agent Configuration Schema", ()=>{
187
191
  const validTools = [
188
192
  "internet_search",
189
193
  "web_crawler",
194
+ "browser_control",
190
195
  "command_execute",
191
196
  "background_terminal",
192
197
  "think",
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __webpack_exports__ = {};
3
+ const external_node_fs_namespaceObject = require("node:fs");
4
+ const external_node_os_namespaceObject = require("node:os");
5
+ const external_node_path_namespaceObject = require("node:path");
6
+ const external_vitest_namespaceObject = require("vitest");
7
+ const browser_control_cjs_namespaceObject = require("../tools/browser_control.cjs");
8
+ (0, external_vitest_namespaceObject.describe)("browser_control helpers", ()=>{
9
+ const tempDirs = [];
10
+ (0, external_vitest_namespaceObject.afterEach)(()=>{
11
+ for (const dir of tempDirs)(0, external_node_fs_namespaceObject.rmSync)(dir, {
12
+ recursive: true,
13
+ force: true
14
+ });
15
+ tempDirs.length = 0;
16
+ });
17
+ (0, external_vitest_namespaceObject.it)("removes stale DevToolsActivePort before launch", ()=>{
18
+ const userDataDir = (0, external_node_fs_namespaceObject.mkdtempSync)((0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.tmpdir)(), "wingman-browser-profile-"));
19
+ tempDirs.push(userDataDir);
20
+ const activePortPath = (0, external_node_path_namespaceObject.join)(userDataDir, "DevToolsActivePort");
21
+ (0, external_node_fs_namespaceObject.writeFileSync)(activePortPath, "52145\n/devtools/browser/stale");
22
+ (0, external_vitest_namespaceObject.expect)((0, external_node_fs_namespaceObject.existsSync)(activePortPath)).toBe(true);
23
+ (0, browser_control_cjs_namespaceObject.clearStaleDevtoolsArtifacts)(userDataDir);
24
+ (0, external_vitest_namespaceObject.expect)((0, external_node_fs_namespaceObject.existsSync)(activePortPath)).toBe(false);
25
+ });
26
+ (0, external_vitest_namespaceObject.it)("does not throw when DevToolsActivePort is absent", ()=>{
27
+ const userDataDir = (0, external_node_fs_namespaceObject.mkdtempSync)((0, external_node_path_namespaceObject.join)((0, external_node_os_namespaceObject.tmpdir)(), "wingman-browser-profile-"));
28
+ tempDirs.push(userDataDir);
29
+ (0, external_vitest_namespaceObject.expect)(()=>(0, browser_control_cjs_namespaceObject.clearStaleDevtoolsArtifacts)(userDataDir)).not.toThrow();
30
+ });
31
+ });
32
+ for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
33
+ Object.defineProperty(exports, '__esModule', {
34
+ value: true
35
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import { existsSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { clearStaleDevtoolsArtifacts } from "../tools/browser_control.js";
6
+ describe("browser_control helpers", ()=>{
7
+ const tempDirs = [];
8
+ afterEach(()=>{
9
+ for (const dir of tempDirs)rmSync(dir, {
10
+ recursive: true,
11
+ force: true
12
+ });
13
+ tempDirs.length = 0;
14
+ });
15
+ it("removes stale DevToolsActivePort before launch", ()=>{
16
+ const userDataDir = mkdtempSync(join(tmpdir(), "wingman-browser-profile-"));
17
+ tempDirs.push(userDataDir);
18
+ const activePortPath = join(userDataDir, "DevToolsActivePort");
19
+ writeFileSync(activePortPath, "52145\n/devtools/browser/stale");
20
+ expect(existsSync(activePortPath)).toBe(true);
21
+ clearStaleDevtoolsArtifacts(userDataDir);
22
+ expect(existsSync(activePortPath)).toBe(false);
23
+ });
24
+ it("does not throw when DevToolsActivePort is absent", ()=>{
25
+ const userDataDir = mkdtempSync(join(tmpdir(), "wingman-browser-profile-"));
26
+ tempDirs.push(userDataDir);
27
+ expect(()=>clearStaleDevtoolsArtifacts(userDataDir)).not.toThrow();
28
+ });
29
+ });