network-ai 4.15.2 → 5.0.0

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 (204) hide show
  1. package/INTEGRATION_GUIDE.md +11 -4
  2. package/QUICKSTART.md +31 -4
  3. package/README.md +37 -15
  4. package/bin/dashboard.ts +146 -0
  5. package/bin/mcp-server.ts +3 -2
  6. package/dist/adapters/adapter-registry.d.ts +33 -1
  7. package/dist/adapters/adapter-registry.d.ts.map +1 -1
  8. package/dist/adapters/adapter-registry.js +49 -0
  9. package/dist/adapters/adapter-registry.js.map +1 -1
  10. package/dist/adapters/anthropic-computer-use-adapter.d.ts +132 -0
  11. package/dist/adapters/anthropic-computer-use-adapter.d.ts.map +1 -0
  12. package/dist/adapters/anthropic-computer-use-adapter.js +180 -0
  13. package/dist/adapters/anthropic-computer-use-adapter.js.map +1 -0
  14. package/dist/adapters/browser-agent-adapter.d.ts +121 -0
  15. package/dist/adapters/browser-agent-adapter.d.ts.map +1 -0
  16. package/dist/adapters/browser-agent-adapter.js +219 -0
  17. package/dist/adapters/browser-agent-adapter.js.map +1 -0
  18. package/dist/adapters/copilot-adapter.d.ts +59 -0
  19. package/dist/adapters/copilot-adapter.d.ts.map +1 -0
  20. package/dist/adapters/copilot-adapter.js +132 -0
  21. package/dist/adapters/copilot-adapter.js.map +1 -0
  22. package/dist/adapters/index.d.ts +15 -1
  23. package/dist/adapters/index.d.ts.map +1 -1
  24. package/dist/adapters/index.js +22 -1
  25. package/dist/adapters/index.js.map +1 -1
  26. package/dist/adapters/langgraph-adapter.d.ts +70 -0
  27. package/dist/adapters/langgraph-adapter.d.ts.map +1 -0
  28. package/dist/adapters/langgraph-adapter.js +119 -0
  29. package/dist/adapters/langgraph-adapter.js.map +1 -0
  30. package/dist/adapters/openai-agents-adapter.d.ts +100 -0
  31. package/dist/adapters/openai-agents-adapter.d.ts.map +1 -0
  32. package/dist/adapters/openai-agents-adapter.js +118 -0
  33. package/dist/adapters/openai-agents-adapter.js.map +1 -0
  34. package/dist/adapters/pydantic-ai-adapter.d.ts +104 -0
  35. package/dist/adapters/pydantic-ai-adapter.d.ts.map +1 -0
  36. package/dist/adapters/pydantic-ai-adapter.js +163 -0
  37. package/dist/adapters/pydantic-ai-adapter.js.map +1 -0
  38. package/dist/adapters/vertex-ai-adapter.d.ts +122 -0
  39. package/dist/adapters/vertex-ai-adapter.d.ts.map +1 -0
  40. package/dist/adapters/vertex-ai-adapter.js +166 -0
  41. package/dist/adapters/vertex-ai-adapter.js.map +1 -0
  42. package/dist/bin/dashboard.d.ts +11 -0
  43. package/dist/bin/dashboard.d.ts.map +1 -0
  44. package/dist/bin/dashboard.js +135 -0
  45. package/dist/bin/dashboard.js.map +1 -0
  46. package/dist/bin/mcp-server.js +3 -2
  47. package/dist/bin/mcp-server.js.map +1 -1
  48. package/dist/index.d.ts +103 -559
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +295 -1074
  51. package/dist/index.js.map +1 -1
  52. package/dist/lib/adapter-test-harness.d.ts +88 -0
  53. package/dist/lib/adapter-test-harness.d.ts.map +1 -0
  54. package/dist/lib/adapter-test-harness.js +118 -0
  55. package/dist/lib/adapter-test-harness.js.map +1 -0
  56. package/dist/lib/agent-conversation.d.ts +115 -0
  57. package/dist/lib/agent-conversation.d.ts.map +1 -0
  58. package/dist/lib/agent-conversation.js +155 -0
  59. package/dist/lib/agent-conversation.js.map +1 -0
  60. package/dist/lib/agent-debate.d.ts +115 -0
  61. package/dist/lib/agent-debate.d.ts.map +1 -0
  62. package/dist/lib/agent-debate.js +146 -0
  63. package/dist/lib/agent-debate.js.map +1 -0
  64. package/dist/lib/agent-memory.d.ts +157 -0
  65. package/dist/lib/agent-memory.d.ts.map +1 -0
  66. package/dist/lib/agent-memory.js +336 -0
  67. package/dist/lib/agent-memory.js.map +1 -0
  68. package/dist/lib/agent-vcr.d.ts +133 -0
  69. package/dist/lib/agent-vcr.d.ts.map +1 -0
  70. package/dist/lib/agent-vcr.js +218 -0
  71. package/dist/lib/agent-vcr.js.map +1 -0
  72. package/dist/lib/anomaly-detector.d.ts +112 -0
  73. package/dist/lib/anomaly-detector.d.ts.map +1 -0
  74. package/dist/lib/anomaly-detector.js +178 -0
  75. package/dist/lib/anomaly-detector.js.map +1 -0
  76. package/dist/lib/approval-inbox.d.ts +147 -0
  77. package/dist/lib/approval-inbox.d.ts.map +1 -0
  78. package/dist/lib/approval-inbox.js +385 -0
  79. package/dist/lib/approval-inbox.js.map +1 -0
  80. package/dist/lib/auth-guardian.d.ts +170 -0
  81. package/dist/lib/auth-guardian.d.ts.map +1 -0
  82. package/dist/lib/auth-guardian.js +604 -0
  83. package/dist/lib/auth-guardian.js.map +1 -0
  84. package/dist/lib/auth-validator.d.ts +70 -0
  85. package/dist/lib/auth-validator.d.ts.map +1 -0
  86. package/dist/lib/auth-validator.js +32 -0
  87. package/dist/lib/auth-validator.js.map +1 -0
  88. package/dist/lib/blackboard-validator.d.ts +56 -0
  89. package/dist/lib/blackboard-validator.d.ts.map +1 -1
  90. package/dist/lib/blackboard-validator.js +181 -4
  91. package/dist/lib/blackboard-validator.js.map +1 -1
  92. package/dist/lib/comparison-runner.d.ts +99 -0
  93. package/dist/lib/comparison-runner.d.ts.map +1 -0
  94. package/dist/lib/comparison-runner.js +138 -0
  95. package/dist/lib/comparison-runner.js.map +1 -0
  96. package/dist/lib/config-watcher.d.ts +109 -0
  97. package/dist/lib/config-watcher.d.ts.map +1 -0
  98. package/dist/lib/config-watcher.js +215 -0
  99. package/dist/lib/config-watcher.js.map +1 -0
  100. package/dist/lib/cost-governor.d.ts +105 -0
  101. package/dist/lib/cost-governor.d.ts.map +1 -0
  102. package/dist/lib/cost-governor.js +128 -0
  103. package/dist/lib/cost-governor.js.map +1 -0
  104. package/dist/lib/cost-heatmap.d.ts +104 -0
  105. package/dist/lib/cost-heatmap.d.ts.map +1 -0
  106. package/dist/lib/cost-heatmap.js +161 -0
  107. package/dist/lib/cost-heatmap.js.map +1 -0
  108. package/dist/lib/coverage-reporter.d.ts +92 -0
  109. package/dist/lib/coverage-reporter.d.ts.map +1 -0
  110. package/dist/lib/coverage-reporter.js +177 -0
  111. package/dist/lib/coverage-reporter.js.map +1 -0
  112. package/dist/lib/dashboard-server.d.ts +71 -0
  113. package/dist/lib/dashboard-server.d.ts.map +1 -0
  114. package/dist/lib/dashboard-server.js +403 -0
  115. package/dist/lib/dashboard-server.js.map +1 -0
  116. package/dist/lib/dry-run.d.ts +73 -0
  117. package/dist/lib/dry-run.d.ts.map +1 -0
  118. package/dist/lib/dry-run.js +130 -0
  119. package/dist/lib/dry-run.js.map +1 -0
  120. package/dist/lib/errors.d.ts +15 -0
  121. package/dist/lib/errors.d.ts.map +1 -1
  122. package/dist/lib/errors.js +38 -0
  123. package/dist/lib/errors.js.map +1 -1
  124. package/dist/lib/event-bus.d.ts +167 -0
  125. package/dist/lib/event-bus.d.ts.map +1 -0
  126. package/dist/lib/event-bus.js +229 -0
  127. package/dist/lib/event-bus.js.map +1 -0
  128. package/dist/lib/explainability.d.ts +85 -0
  129. package/dist/lib/explainability.d.ts.map +1 -0
  130. package/dist/lib/explainability.js +102 -0
  131. package/dist/lib/explainability.js.map +1 -0
  132. package/dist/lib/goal-dsl.d.ts +157 -0
  133. package/dist/lib/goal-dsl.d.ts.map +1 -0
  134. package/dist/lib/goal-dsl.js +392 -0
  135. package/dist/lib/goal-dsl.js.map +1 -0
  136. package/dist/lib/job-queue.d.ts +183 -0
  137. package/dist/lib/job-queue.d.ts.map +1 -0
  138. package/dist/lib/job-queue.js +310 -0
  139. package/dist/lib/job-queue.js.map +1 -0
  140. package/dist/lib/learning-loop.d.ts +113 -0
  141. package/dist/lib/learning-loop.d.ts.map +1 -0
  142. package/dist/lib/learning-loop.js +181 -0
  143. package/dist/lib/learning-loop.js.map +1 -0
  144. package/dist/lib/lifecycle-hooks.d.ts +116 -0
  145. package/dist/lib/lifecycle-hooks.d.ts.map +1 -0
  146. package/dist/lib/lifecycle-hooks.js +148 -0
  147. package/dist/lib/lifecycle-hooks.js.map +1 -0
  148. package/dist/lib/locked-blackboard.d.ts.map +1 -1
  149. package/dist/lib/locked-blackboard.js +9 -5
  150. package/dist/lib/locked-blackboard.js.map +1 -1
  151. package/dist/lib/mcp-tool-consumer.d.ts +153 -0
  152. package/dist/lib/mcp-tool-consumer.d.ts.map +1 -0
  153. package/dist/lib/mcp-tool-consumer.js +320 -0
  154. package/dist/lib/mcp-tool-consumer.js.map +1 -0
  155. package/dist/lib/metrics.d.ts +119 -0
  156. package/dist/lib/metrics.d.ts.map +1 -0
  157. package/dist/lib/metrics.js +284 -0
  158. package/dist/lib/metrics.js.map +1 -0
  159. package/dist/lib/orchestrator-types.d.ts +309 -0
  160. package/dist/lib/orchestrator-types.d.ts.map +1 -0
  161. package/dist/lib/orchestrator-types.js +61 -0
  162. package/dist/lib/orchestrator-types.js.map +1 -0
  163. package/dist/lib/otel-bridge.d.ts +74 -0
  164. package/dist/lib/otel-bridge.d.ts.map +1 -0
  165. package/dist/lib/otel-bridge.js +167 -0
  166. package/dist/lib/otel-bridge.js.map +1 -0
  167. package/dist/lib/playground.d.ts +76 -0
  168. package/dist/lib/playground.d.ts.map +1 -0
  169. package/dist/lib/playground.js +224 -0
  170. package/dist/lib/playground.js.map +1 -0
  171. package/dist/lib/quadtree.d.ts +114 -0
  172. package/dist/lib/quadtree.d.ts.map +1 -0
  173. package/dist/lib/quadtree.js +259 -0
  174. package/dist/lib/quadtree.js.map +1 -0
  175. package/dist/lib/shared-blackboard.d.ts +101 -0
  176. package/dist/lib/shared-blackboard.d.ts.map +1 -0
  177. package/dist/lib/shared-blackboard.js +249 -0
  178. package/dist/lib/shared-blackboard.js.map +1 -0
  179. package/dist/lib/speculative-executor.d.ts +89 -0
  180. package/dist/lib/speculative-executor.d.ts.map +1 -0
  181. package/dist/lib/speculative-executor.js +107 -0
  182. package/dist/lib/speculative-executor.js.map +1 -0
  183. package/dist/lib/swarm-transport.d.ts +150 -0
  184. package/dist/lib/swarm-transport.d.ts.map +1 -0
  185. package/dist/lib/swarm-transport.js +307 -0
  186. package/dist/lib/swarm-transport.js.map +1 -0
  187. package/dist/lib/task-decomposer.d.ts +41 -0
  188. package/dist/lib/task-decomposer.d.ts.map +1 -0
  189. package/dist/lib/task-decomposer.js +272 -0
  190. package/dist/lib/task-decomposer.js.map +1 -0
  191. package/dist/lib/timeline-scrubber.d.ts +84 -0
  192. package/dist/lib/timeline-scrubber.d.ts.map +1 -0
  193. package/dist/lib/timeline-scrubber.js +173 -0
  194. package/dist/lib/timeline-scrubber.js.map +1 -0
  195. package/dist/lib/topology.d.ts +361 -0
  196. package/dist/lib/topology.d.ts.map +1 -0
  197. package/dist/lib/topology.js +591 -0
  198. package/dist/lib/topology.js.map +1 -0
  199. package/dist/security.d.ts +95 -0
  200. package/dist/security.d.ts.map +1 -1
  201. package/dist/security.js +267 -5
  202. package/dist/security.js.map +1 -1
  203. package/package.json +7 -5
  204. package/types/agent-adapter.d.ts +5 -0
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Anthropic Computer Use Adapter
3
+ *
4
+ * Integrates Anthropic's Computer Use API (Claude with screen/keyboard/mouse
5
+ * tool use) with the SwarmOrchestrator.
6
+ *
7
+ * This adapter wraps the Anthropic Messages API with computer_use tool
8
+ * definitions, executing multi-step tool-use loops where Claude controls
9
+ * a virtual desktop via user-supplied action handlers.
10
+ *
11
+ * Usage:
12
+ * const adapter = new AnthropicComputerUseAdapter();
13
+ * adapter.registerAgent('browser-agent', {
14
+ * model: 'claude-sonnet-4-20250514',
15
+ * client: anthropicInstance,
16
+ * actionHandler: myScreenHandler,
17
+ * });
18
+ *
19
+ * @module AnthropicComputerUseAdapter
20
+ * @version 1.0.0
21
+ */
22
+ import { BaseAdapter } from './base-adapter';
23
+ import type { AdapterCapabilities, AgentPayload, AgentContext, AgentResult } from '../types/agent-adapter';
24
+ /** Anthropic tool use action types */
25
+ export type ComputerAction = 'screenshot' | 'click' | 'double_click' | 'type' | 'key' | 'scroll' | 'move' | 'drag' | 'wait';
26
+ /** A tool use request from Claude */
27
+ export interface ComputerToolCall {
28
+ /** Tool use ID from the API */
29
+ toolUseId: string;
30
+ /** Action to perform */
31
+ action: ComputerAction;
32
+ /** Coordinates for click/move/drag */
33
+ coordinate?: [number, number];
34
+ /** End coordinates for drag */
35
+ endCoordinate?: [number, number];
36
+ /** Text for type action */
37
+ text?: string;
38
+ /** Key combination for key action */
39
+ key?: string;
40
+ /** Scroll direction and amount */
41
+ scrollDelta?: {
42
+ x: number;
43
+ y: number;
44
+ };
45
+ /** Wait duration in ms */
46
+ waitMs?: number;
47
+ }
48
+ /** Result from executing a tool call */
49
+ export interface ComputerToolResult {
50
+ /** Base64-encoded screenshot after action */
51
+ screenshot?: string;
52
+ /** Text content if applicable */
53
+ text?: string;
54
+ /** Whether the action succeeded */
55
+ success: boolean;
56
+ /** Error message if failed */
57
+ error?: string;
58
+ }
59
+ /**
60
+ * User-supplied handler that executes computer actions.
61
+ * Receives a tool call and returns the result (typically a screenshot).
62
+ */
63
+ export type ComputerActionHandler = (call: ComputerToolCall) => Promise<ComputerToolResult>;
64
+ /**
65
+ * Minimal interface for the Anthropic SDK messages endpoint.
66
+ * Compatible with `new Anthropic().messages`.
67
+ */
68
+ export interface AnthropicMessagesClient {
69
+ create(params: {
70
+ model: string;
71
+ max_tokens: number;
72
+ system?: string;
73
+ messages: Array<{
74
+ role: string;
75
+ content: unknown;
76
+ }>;
77
+ tools?: Array<Record<string, unknown>>;
78
+ }): Promise<{
79
+ id: string;
80
+ content: Array<{
81
+ type: string;
82
+ text?: string;
83
+ id?: string;
84
+ name?: string;
85
+ input?: Record<string, unknown>;
86
+ }>;
87
+ stop_reason: string | null;
88
+ usage?: {
89
+ input_tokens: number;
90
+ output_tokens: number;
91
+ };
92
+ }>;
93
+ }
94
+ /** Configuration for a registered computer-use agent */
95
+ export interface ComputerUseAgentConfig {
96
+ /** Anthropic model (default: 'claude-sonnet-4-20250514') */
97
+ model?: string;
98
+ /** The Anthropic messages client instance */
99
+ client: AnthropicMessagesClient;
100
+ /** Handler that executes computer actions */
101
+ actionHandler: ComputerActionHandler;
102
+ /** System prompt for the agent */
103
+ systemPrompt?: string;
104
+ /** Maximum tool-use loop iterations (default: 20) */
105
+ maxIterations?: number;
106
+ /** Max tokens per API call (default: 4096) */
107
+ maxTokens?: number;
108
+ /** Screen dimensions for the computer_use tool */
109
+ screenSize?: {
110
+ width: number;
111
+ height: number;
112
+ };
113
+ }
114
+ /**
115
+ * Adapter for Anthropic Computer Use (Claude controlling a virtual desktop).
116
+ *
117
+ * Runs a tool-use loop: send prompt → Claude returns tool calls →
118
+ * execute via actionHandler → send results back → repeat until done.
119
+ */
120
+ export declare class AnthropicComputerUseAdapter extends BaseAdapter {
121
+ readonly name = "anthropic-computer-use";
122
+ readonly version = "1.0.0";
123
+ private agents;
124
+ get capabilities(): AdapterCapabilities;
125
+ /**
126
+ * Register an agent that uses Anthropic Computer Use.
127
+ */
128
+ registerComputerAgent(agentId: string, config: ComputerUseAgentConfig): void;
129
+ executeAgent(agentId: string, payload: AgentPayload, _context: AgentContext): Promise<AgentResult>;
130
+ shutdown(): Promise<void>;
131
+ }
132
+ //# sourceMappingURL=anthropic-computer-use-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-computer-use-adapter.d.ts","sourceRoot":"","sources":["../../adapters/anthropic-computer-use-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ /**
3
+ * Anthropic Computer Use Adapter
4
+ *
5
+ * Integrates Anthropic's Computer Use API (Claude with screen/keyboard/mouse
6
+ * tool use) with the SwarmOrchestrator.
7
+ *
8
+ * This adapter wraps the Anthropic Messages API with computer_use tool
9
+ * definitions, executing multi-step tool-use loops where Claude controls
10
+ * a virtual desktop via user-supplied action handlers.
11
+ *
12
+ * Usage:
13
+ * const adapter = new AnthropicComputerUseAdapter();
14
+ * adapter.registerAgent('browser-agent', {
15
+ * model: 'claude-sonnet-4-20250514',
16
+ * client: anthropicInstance,
17
+ * actionHandler: myScreenHandler,
18
+ * });
19
+ *
20
+ * @module AnthropicComputerUseAdapter
21
+ * @version 1.0.0
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.AnthropicComputerUseAdapter = void 0;
25
+ const base_adapter_1 = require("./base-adapter");
26
+ // ---------------------------------------------------------------------------
27
+ // Adapter
28
+ // ---------------------------------------------------------------------------
29
+ /**
30
+ * Adapter for Anthropic Computer Use (Claude controlling a virtual desktop).
31
+ *
32
+ * Runs a tool-use loop: send prompt → Claude returns tool calls →
33
+ * execute via actionHandler → send results back → repeat until done.
34
+ */
35
+ class AnthropicComputerUseAdapter extends base_adapter_1.BaseAdapter {
36
+ name = 'anthropic-computer-use';
37
+ version = '1.0.0';
38
+ agents = new Map();
39
+ get capabilities() {
40
+ return {
41
+ streaming: false,
42
+ parallel: true,
43
+ bidirectional: false,
44
+ discovery: true,
45
+ authentication: true,
46
+ statefulSessions: false,
47
+ };
48
+ }
49
+ // -----------------------------------------------------------------------
50
+ // Agent registration
51
+ // -----------------------------------------------------------------------
52
+ /**
53
+ * Register an agent that uses Anthropic Computer Use.
54
+ */
55
+ registerComputerAgent(agentId, config) {
56
+ this.agents.set(agentId, config);
57
+ this.registerLocalAgent({
58
+ id: agentId,
59
+ name: agentId,
60
+ status: 'available',
61
+ capabilities: ['computer-use', 'tool-use', 'vision'],
62
+ metadata: {
63
+ adapter: 'anthropic-computer-use',
64
+ model: config.model ?? 'claude-sonnet-4-20250514',
65
+ },
66
+ });
67
+ }
68
+ // -----------------------------------------------------------------------
69
+ // Execution
70
+ // -----------------------------------------------------------------------
71
+ async executeAgent(agentId, payload, _context) {
72
+ this.ensureReady();
73
+ const config = this.agents.get(agentId);
74
+ if (!config) {
75
+ return this.errorResult('COMPUTER_USE_AGENT_NOT_FOUND', `No agent registered as '${agentId}'`);
76
+ }
77
+ const model = config.model ?? 'claude-sonnet-4-20250514';
78
+ const maxIterations = config.maxIterations ?? 20;
79
+ const maxTokens = config.maxTokens ?? 4096;
80
+ const screenSize = config.screenSize ?? { width: 1920, height: 1080 };
81
+ const instruction = payload.handoff?.instruction ?? payload.params?.instruction ?? payload.action;
82
+ const systemPrompt = config.systemPrompt ?? 'You are a computer-use agent. Complete the requested task using the available tools.';
83
+ // Computer use tool definition
84
+ const computerTool = {
85
+ type: 'computer_20250124',
86
+ name: 'computer',
87
+ display_width_px: screenSize.width,
88
+ display_height_px: screenSize.height,
89
+ };
90
+ const messages = [
91
+ { role: 'user', content: instruction },
92
+ ];
93
+ const start = Date.now();
94
+ let iterations = 0;
95
+ let totalInputTokens = 0;
96
+ let totalOutputTokens = 0;
97
+ try {
98
+ while (iterations < maxIterations) {
99
+ iterations++;
100
+ const response = await config.client.create({
101
+ model,
102
+ max_tokens: maxTokens,
103
+ system: systemPrompt,
104
+ messages,
105
+ tools: [computerTool],
106
+ });
107
+ if (response.usage) {
108
+ totalInputTokens += response.usage.input_tokens;
109
+ totalOutputTokens += response.usage.output_tokens;
110
+ }
111
+ // Check if Claude is done (no tool use)
112
+ const toolUseBlocks = response.content.filter((b) => b.type === 'tool_use');
113
+ if (toolUseBlocks.length === 0 || response.stop_reason === 'end_turn') {
114
+ const textBlocks = response.content.filter((b) => b.type === 'text');
115
+ const finalText = textBlocks.map((b) => b.text ?? '').join('\n');
116
+ const durationMs = Date.now() - start;
117
+ return this.successResult({
118
+ response: finalText,
119
+ iterations,
120
+ tokensUsed: { input: totalInputTokens, output: totalOutputTokens },
121
+ }, durationMs);
122
+ }
123
+ // Execute tool calls and build result messages
124
+ messages.push({ role: 'assistant', content: response.content });
125
+ const toolResults = [];
126
+ for (const block of toolUseBlocks) {
127
+ const input = block.input ?? {};
128
+ const call = {
129
+ toolUseId: block.id ?? '',
130
+ action: input['action'] ?? 'screenshot',
131
+ coordinate: input['coordinate'],
132
+ endCoordinate: input['end_coordinate'],
133
+ text: input['text'],
134
+ key: input['key'],
135
+ };
136
+ const result = await config.actionHandler(call);
137
+ const content = [];
138
+ if (result.screenshot) {
139
+ content.push({
140
+ type: 'image',
141
+ source: { type: 'base64', media_type: 'image/png', data: result.screenshot },
142
+ });
143
+ }
144
+ if (result.text) {
145
+ content.push({ type: 'text', text: result.text });
146
+ }
147
+ if (result.error) {
148
+ content.push({ type: 'text', text: `Error: ${result.error}` });
149
+ }
150
+ toolResults.push({
151
+ type: 'tool_result',
152
+ tool_use_id: call.toolUseId,
153
+ content: content.length > 0 ? content : [{ type: 'text', text: 'Done' }],
154
+ });
155
+ }
156
+ messages.push({ role: 'user', content: toolResults });
157
+ }
158
+ // Max iterations reached
159
+ const durationMs = Date.now() - start;
160
+ return this.successResult({
161
+ response: 'Max iterations reached',
162
+ iterations,
163
+ tokensUsed: { input: totalInputTokens, output: totalOutputTokens },
164
+ exhausted: true,
165
+ }, durationMs);
166
+ }
167
+ catch (err) {
168
+ return this.errorResult('COMPUTER_USE_EXECUTION_FAILED', err instanceof Error ? err.message : String(err));
169
+ }
170
+ }
171
+ // -----------------------------------------------------------------------
172
+ // Lifecycle
173
+ // -----------------------------------------------------------------------
174
+ async shutdown() {
175
+ this.agents.clear();
176
+ await super.shutdown();
177
+ }
178
+ }
179
+ exports.AnthropicComputerUseAdapter = AnthropicComputerUseAdapter;
180
+ //# sourceMappingURL=anthropic-computer-use-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-computer-use-adapter.js","sourceRoot":"","sources":["../../adapters/anthropic-computer-use-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Browser Agent Adapter
3
+ *
4
+ * Integrates browser automation agents (Playwright, Puppeteer, or
5
+ * any CDP-compatible driver) with the SwarmOrchestrator.
6
+ *
7
+ * Provides a BYOC (bring your own client) interface for browser
8
+ * agents that navigate, scrape, interact with, and test web pages.
9
+ *
10
+ * Usage:
11
+ * const adapter = new BrowserAgentAdapter();
12
+ * adapter.registerBrowser('scraper', {
13
+ * driver: myPlaywrightDriver,
14
+ * mode: 'scrape',
15
+ * });
16
+ *
17
+ * @module BrowserAgentAdapter
18
+ * @version 1.0.0
19
+ */
20
+ import { BaseAdapter } from './base-adapter';
21
+ import type { AdapterCapabilities, AgentPayload, AgentContext, AgentResult } from '../types/agent-adapter';
22
+ /** Browser agent operating mode */
23
+ export type BrowserMode = 'navigate' | 'scrape' | 'interact' | 'test' | 'screenshot';
24
+ /** Navigation/action step for scripted browser agents */
25
+ export interface BrowserStep {
26
+ /** Action type */
27
+ action: 'goto' | 'click' | 'type' | 'select' | 'wait' | 'screenshot' | 'evaluate' | 'scroll';
28
+ /** CSS selector for click/type/select */
29
+ selector?: string;
30
+ /** URL for goto, text for type */
31
+ value?: string;
32
+ /** Wait time in ms for wait action */
33
+ waitMs?: number;
34
+ /** JavaScript to evaluate for evaluate action */
35
+ script?: string;
36
+ }
37
+ /** Result from a browser action */
38
+ export interface BrowserActionResult {
39
+ /** URL after action */
40
+ url: string;
41
+ /** Page title */
42
+ title: string;
43
+ /** Extracted text content (for scrape mode) */
44
+ textContent?: string;
45
+ /** Extracted HTML (for scrape mode) */
46
+ html?: string;
47
+ /** Screenshot as base64 (for screenshot mode) */
48
+ screenshot?: string;
49
+ /** Evaluate result (for evaluate action) */
50
+ evalResult?: unknown;
51
+ /** Console messages captured */
52
+ consoleMessages?: string[];
53
+ /** Network errors captured */
54
+ networkErrors?: string[];
55
+ /** Execution time for this action */
56
+ actionDurationMs?: number;
57
+ }
58
+ /**
59
+ * Browser driver interface — wraps Playwright, Puppeteer, or CDP.
60
+ * Users supply their own driver implementation.
61
+ */
62
+ export interface BrowserDriver {
63
+ /** Navigate to a URL */
64
+ goto(url: string): Promise<BrowserActionResult>;
65
+ /** Click an element */
66
+ click(selector: string): Promise<BrowserActionResult>;
67
+ /** Type text into an element */
68
+ type(selector: string, text: string): Promise<BrowserActionResult>;
69
+ /** Select an option */
70
+ select(selector: string, value: string): Promise<BrowserActionResult>;
71
+ /** Wait for a duration or selector */
72
+ wait(ms: number): Promise<void>;
73
+ /** Take a screenshot */
74
+ screenshot(): Promise<string>;
75
+ /** Evaluate JavaScript in the page */
76
+ evaluate(script: string): Promise<unknown>;
77
+ /** Get the current page text content */
78
+ getTextContent(): Promise<string>;
79
+ /** Get the current URL */
80
+ getCurrentUrl(): Promise<string>;
81
+ /** Get the page title */
82
+ getTitle(): Promise<string>;
83
+ /** Close the browser/page */
84
+ close(): Promise<void>;
85
+ }
86
+ /** Configuration for a registered browser agent */
87
+ export interface BrowserAgentConfig {
88
+ /** The browser driver instance */
89
+ driver: BrowserDriver;
90
+ /** Default mode (default: 'navigate') */
91
+ mode?: BrowserMode;
92
+ /** Default steps for scripted execution */
93
+ steps?: BrowserStep[];
94
+ /** Per-invocation timeout in ms (default: 60000) */
95
+ timeoutMs?: number;
96
+ /** Whether to capture console logs (default: false) */
97
+ captureConsole?: boolean;
98
+ /** Whether to capture screenshots after each step (default: false) */
99
+ screenshotPerStep?: boolean;
100
+ }
101
+ /**
102
+ * Adapter for browser automation agents.
103
+ *
104
+ * Supports scripted step sequences or single-action modes
105
+ * (navigate, scrape, screenshot, interact, test).
106
+ */
107
+ export declare class BrowserAgentAdapter extends BaseAdapter {
108
+ readonly name = "browser-agent";
109
+ readonly version = "1.0.0";
110
+ private browsers;
111
+ get capabilities(): AdapterCapabilities;
112
+ /**
113
+ * Register a browser agent with a driver.
114
+ */
115
+ registerBrowser(agentId: string, config: BrowserAgentConfig): void;
116
+ executeAgent(agentId: string, payload: AgentPayload, _context: AgentContext): Promise<AgentResult>;
117
+ private executeSingleMode;
118
+ private executeSteps;
119
+ shutdown(): Promise<void>;
120
+ }
121
+ //# sourceMappingURL=browser-agent-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-agent-adapter.d.ts","sourceRoot":"","sources":["../../adapters/browser-agent-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ /**
3
+ * Browser Agent Adapter
4
+ *
5
+ * Integrates browser automation agents (Playwright, Puppeteer, or
6
+ * any CDP-compatible driver) with the SwarmOrchestrator.
7
+ *
8
+ * Provides a BYOC (bring your own client) interface for browser
9
+ * agents that navigate, scrape, interact with, and test web pages.
10
+ *
11
+ * Usage:
12
+ * const adapter = new BrowserAgentAdapter();
13
+ * adapter.registerBrowser('scraper', {
14
+ * driver: myPlaywrightDriver,
15
+ * mode: 'scrape',
16
+ * });
17
+ *
18
+ * @module BrowserAgentAdapter
19
+ * @version 1.0.0
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.BrowserAgentAdapter = void 0;
23
+ const base_adapter_1 = require("./base-adapter");
24
+ // ---------------------------------------------------------------------------
25
+ // Adapter
26
+ // ---------------------------------------------------------------------------
27
+ /**
28
+ * Adapter for browser automation agents.
29
+ *
30
+ * Supports scripted step sequences or single-action modes
31
+ * (navigate, scrape, screenshot, interact, test).
32
+ */
33
+ class BrowserAgentAdapter extends base_adapter_1.BaseAdapter {
34
+ name = 'browser-agent';
35
+ version = '1.0.0';
36
+ browsers = new Map();
37
+ get capabilities() {
38
+ return {
39
+ streaming: false,
40
+ parallel: true,
41
+ bidirectional: false,
42
+ discovery: true,
43
+ authentication: false,
44
+ statefulSessions: true,
45
+ };
46
+ }
47
+ // -----------------------------------------------------------------------
48
+ // Registration
49
+ // -----------------------------------------------------------------------
50
+ /**
51
+ * Register a browser agent with a driver.
52
+ */
53
+ registerBrowser(agentId, config) {
54
+ this.browsers.set(agentId, config);
55
+ this.registerLocalAgent({
56
+ id: agentId,
57
+ name: agentId,
58
+ status: 'available',
59
+ capabilities: ['browser', config.mode ?? 'navigate', 'web'],
60
+ metadata: {
61
+ adapter: 'browser-agent',
62
+ mode: config.mode ?? 'navigate',
63
+ },
64
+ });
65
+ }
66
+ // -----------------------------------------------------------------------
67
+ // Execution
68
+ // -----------------------------------------------------------------------
69
+ async executeAgent(agentId, payload, _context) {
70
+ this.ensureReady();
71
+ const config = this.browsers.get(agentId);
72
+ if (!config) {
73
+ return this.errorResult('BROWSER_AGENT_NOT_FOUND', `No browser registered as '${agentId}'`);
74
+ }
75
+ const mode = payload.params?.mode ?? config.mode ?? 'navigate';
76
+ const url = payload.params?.url ?? payload.handoff?.instruction ?? payload.action;
77
+ const steps = payload.params?.steps ?? config.steps;
78
+ const timeoutMs = config.timeoutMs ?? 60_000;
79
+ const start = Date.now();
80
+ try {
81
+ let result;
82
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Browser agent timed out')), timeoutMs));
83
+ if (steps?.length) {
84
+ result = await Promise.race([
85
+ this.executeSteps(config.driver, steps, config.screenshotPerStep ?? false),
86
+ timeoutPromise,
87
+ ]);
88
+ }
89
+ else {
90
+ result = await Promise.race([
91
+ this.executeSingleMode(config.driver, mode, url),
92
+ timeoutPromise,
93
+ ]);
94
+ }
95
+ const durationMs = Date.now() - start;
96
+ return this.successResult({ ...result, mode }, durationMs);
97
+ }
98
+ catch (err) {
99
+ return this.errorResult('BROWSER_EXECUTION_FAILED', err instanceof Error ? err.message : String(err));
100
+ }
101
+ }
102
+ // -----------------------------------------------------------------------
103
+ // Single mode execution
104
+ // -----------------------------------------------------------------------
105
+ async executeSingleMode(driver, mode, target) {
106
+ switch (mode) {
107
+ case 'navigate': {
108
+ const result = await driver.goto(target);
109
+ return { url: result.url, title: result.title };
110
+ }
111
+ case 'scrape': {
112
+ await driver.goto(target);
113
+ const text = await driver.getTextContent();
114
+ const currentUrl = await driver.getCurrentUrl();
115
+ const title = await driver.getTitle();
116
+ return { url: currentUrl, title, textContent: text };
117
+ }
118
+ case 'screenshot': {
119
+ await driver.goto(target);
120
+ const screenshot = await driver.screenshot();
121
+ const ssUrl = await driver.getCurrentUrl();
122
+ return { url: ssUrl, screenshot };
123
+ }
124
+ case 'interact': {
125
+ const result = await driver.goto(target);
126
+ return { url: result.url, title: result.title, ready: true };
127
+ }
128
+ case 'test': {
129
+ await driver.goto(target);
130
+ const testUrl = await driver.getCurrentUrl();
131
+ const testTitle = await driver.getTitle();
132
+ return { url: testUrl, title: testTitle, tested: true };
133
+ }
134
+ default:
135
+ return { error: `Unknown mode: ${mode}` };
136
+ }
137
+ }
138
+ // -----------------------------------------------------------------------
139
+ // Step-based execution
140
+ // -----------------------------------------------------------------------
141
+ async executeSteps(driver, steps, screenshotPerStep) {
142
+ const results = [];
143
+ for (const step of steps) {
144
+ const stepStart = Date.now();
145
+ let stepResult = { action: step.action };
146
+ switch (step.action) {
147
+ case 'goto':
148
+ if (step.value) {
149
+ const r = await driver.goto(step.value);
150
+ stepResult = { ...stepResult, url: r.url, title: r.title };
151
+ }
152
+ break;
153
+ case 'click':
154
+ if (step.selector) {
155
+ const r = await driver.click(step.selector);
156
+ stepResult = { ...stepResult, url: r.url };
157
+ }
158
+ break;
159
+ case 'type':
160
+ if (step.selector && step.value) {
161
+ await driver.type(step.selector, step.value);
162
+ stepResult = { ...stepResult, typed: step.value };
163
+ }
164
+ break;
165
+ case 'select':
166
+ if (step.selector && step.value) {
167
+ await driver.select(step.selector, step.value);
168
+ stepResult = { ...stepResult, selected: step.value };
169
+ }
170
+ break;
171
+ case 'wait':
172
+ await driver.wait(step.waitMs ?? 1000);
173
+ stepResult = { ...stepResult, waited: step.waitMs ?? 1000 };
174
+ break;
175
+ case 'screenshot': {
176
+ const ss = await driver.screenshot();
177
+ stepResult = { ...stepResult, screenshot: ss };
178
+ break;
179
+ }
180
+ case 'evaluate':
181
+ if (step.script) {
182
+ const evalResult = await driver.evaluate(step.script);
183
+ stepResult = { ...stepResult, evalResult };
184
+ }
185
+ break;
186
+ case 'scroll':
187
+ await driver.evaluate(`window.scrollBy(0, ${step.value ? parseInt(step.value, 10) : 500})`);
188
+ stepResult = { ...stepResult, scrolled: true };
189
+ break;
190
+ }
191
+ stepResult['durationMs'] = Date.now() - stepStart;
192
+ if (screenshotPerStep && step.action !== 'screenshot') {
193
+ stepResult['screenshot'] = await driver.screenshot();
194
+ }
195
+ results.push(stepResult);
196
+ }
197
+ const finalUrl = await driver.getCurrentUrl();
198
+ const finalTitle = await driver.getTitle();
199
+ return { steps: results, finalUrl, finalTitle, stepCount: results.length };
200
+ }
201
+ // -----------------------------------------------------------------------
202
+ // Lifecycle
203
+ // -----------------------------------------------------------------------
204
+ async shutdown() {
205
+ // Close all browser drivers
206
+ for (const [, config] of this.browsers) {
207
+ try {
208
+ await config.driver.close();
209
+ }
210
+ catch {
211
+ // Best-effort cleanup
212
+ }
213
+ }
214
+ this.browsers.clear();
215
+ await super.shutdown();
216
+ }
217
+ }
218
+ exports.BrowserAgentAdapter = BrowserAgentAdapter;
219
+ //# sourceMappingURL=browser-agent-adapter.js.map