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.
- package/INTEGRATION_GUIDE.md +11 -4
- package/QUICKSTART.md +31 -4
- package/README.md +37 -15
- package/bin/dashboard.ts +146 -0
- package/bin/mcp-server.ts +3 -2
- package/dist/adapters/adapter-registry.d.ts +33 -1
- package/dist/adapters/adapter-registry.d.ts.map +1 -1
- package/dist/adapters/adapter-registry.js +49 -0
- package/dist/adapters/adapter-registry.js.map +1 -1
- package/dist/adapters/anthropic-computer-use-adapter.d.ts +132 -0
- package/dist/adapters/anthropic-computer-use-adapter.d.ts.map +1 -0
- package/dist/adapters/anthropic-computer-use-adapter.js +180 -0
- package/dist/adapters/anthropic-computer-use-adapter.js.map +1 -0
- package/dist/adapters/browser-agent-adapter.d.ts +121 -0
- package/dist/adapters/browser-agent-adapter.d.ts.map +1 -0
- package/dist/adapters/browser-agent-adapter.js +219 -0
- package/dist/adapters/browser-agent-adapter.js.map +1 -0
- package/dist/adapters/copilot-adapter.d.ts +59 -0
- package/dist/adapters/copilot-adapter.d.ts.map +1 -0
- package/dist/adapters/copilot-adapter.js +132 -0
- package/dist/adapters/copilot-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +15 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +22 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/langgraph-adapter.d.ts +70 -0
- package/dist/adapters/langgraph-adapter.d.ts.map +1 -0
- package/dist/adapters/langgraph-adapter.js +119 -0
- package/dist/adapters/langgraph-adapter.js.map +1 -0
- package/dist/adapters/openai-agents-adapter.d.ts +100 -0
- package/dist/adapters/openai-agents-adapter.d.ts.map +1 -0
- package/dist/adapters/openai-agents-adapter.js +118 -0
- package/dist/adapters/openai-agents-adapter.js.map +1 -0
- package/dist/adapters/pydantic-ai-adapter.d.ts +104 -0
- package/dist/adapters/pydantic-ai-adapter.d.ts.map +1 -0
- package/dist/adapters/pydantic-ai-adapter.js +163 -0
- package/dist/adapters/pydantic-ai-adapter.js.map +1 -0
- package/dist/adapters/vertex-ai-adapter.d.ts +122 -0
- package/dist/adapters/vertex-ai-adapter.d.ts.map +1 -0
- package/dist/adapters/vertex-ai-adapter.js +166 -0
- package/dist/adapters/vertex-ai-adapter.js.map +1 -0
- package/dist/bin/dashboard.d.ts +11 -0
- package/dist/bin/dashboard.d.ts.map +1 -0
- package/dist/bin/dashboard.js +135 -0
- package/dist/bin/dashboard.js.map +1 -0
- package/dist/bin/mcp-server.js +3 -2
- package/dist/bin/mcp-server.js.map +1 -1
- package/dist/index.d.ts +103 -559
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +295 -1074
- package/dist/index.js.map +1 -1
- package/dist/lib/adapter-test-harness.d.ts +88 -0
- package/dist/lib/adapter-test-harness.d.ts.map +1 -0
- package/dist/lib/adapter-test-harness.js +118 -0
- package/dist/lib/adapter-test-harness.js.map +1 -0
- package/dist/lib/agent-conversation.d.ts +115 -0
- package/dist/lib/agent-conversation.d.ts.map +1 -0
- package/dist/lib/agent-conversation.js +155 -0
- package/dist/lib/agent-conversation.js.map +1 -0
- package/dist/lib/agent-debate.d.ts +115 -0
- package/dist/lib/agent-debate.d.ts.map +1 -0
- package/dist/lib/agent-debate.js +146 -0
- package/dist/lib/agent-debate.js.map +1 -0
- package/dist/lib/agent-memory.d.ts +157 -0
- package/dist/lib/agent-memory.d.ts.map +1 -0
- package/dist/lib/agent-memory.js +336 -0
- package/dist/lib/agent-memory.js.map +1 -0
- package/dist/lib/agent-vcr.d.ts +133 -0
- package/dist/lib/agent-vcr.d.ts.map +1 -0
- package/dist/lib/agent-vcr.js +218 -0
- package/dist/lib/agent-vcr.js.map +1 -0
- package/dist/lib/anomaly-detector.d.ts +112 -0
- package/dist/lib/anomaly-detector.d.ts.map +1 -0
- package/dist/lib/anomaly-detector.js +178 -0
- package/dist/lib/anomaly-detector.js.map +1 -0
- package/dist/lib/approval-inbox.d.ts +147 -0
- package/dist/lib/approval-inbox.d.ts.map +1 -0
- package/dist/lib/approval-inbox.js +385 -0
- package/dist/lib/approval-inbox.js.map +1 -0
- package/dist/lib/auth-guardian.d.ts +170 -0
- package/dist/lib/auth-guardian.d.ts.map +1 -0
- package/dist/lib/auth-guardian.js +604 -0
- package/dist/lib/auth-guardian.js.map +1 -0
- package/dist/lib/auth-validator.d.ts +70 -0
- package/dist/lib/auth-validator.d.ts.map +1 -0
- package/dist/lib/auth-validator.js +32 -0
- package/dist/lib/auth-validator.js.map +1 -0
- package/dist/lib/blackboard-validator.d.ts +56 -0
- package/dist/lib/blackboard-validator.d.ts.map +1 -1
- package/dist/lib/blackboard-validator.js +181 -4
- package/dist/lib/blackboard-validator.js.map +1 -1
- package/dist/lib/comparison-runner.d.ts +99 -0
- package/dist/lib/comparison-runner.d.ts.map +1 -0
- package/dist/lib/comparison-runner.js +138 -0
- package/dist/lib/comparison-runner.js.map +1 -0
- package/dist/lib/config-watcher.d.ts +109 -0
- package/dist/lib/config-watcher.d.ts.map +1 -0
- package/dist/lib/config-watcher.js +215 -0
- package/dist/lib/config-watcher.js.map +1 -0
- package/dist/lib/cost-governor.d.ts +105 -0
- package/dist/lib/cost-governor.d.ts.map +1 -0
- package/dist/lib/cost-governor.js +128 -0
- package/dist/lib/cost-governor.js.map +1 -0
- package/dist/lib/cost-heatmap.d.ts +104 -0
- package/dist/lib/cost-heatmap.d.ts.map +1 -0
- package/dist/lib/cost-heatmap.js +161 -0
- package/dist/lib/cost-heatmap.js.map +1 -0
- package/dist/lib/coverage-reporter.d.ts +92 -0
- package/dist/lib/coverage-reporter.d.ts.map +1 -0
- package/dist/lib/coverage-reporter.js +177 -0
- package/dist/lib/coverage-reporter.js.map +1 -0
- package/dist/lib/dashboard-server.d.ts +71 -0
- package/dist/lib/dashboard-server.d.ts.map +1 -0
- package/dist/lib/dashboard-server.js +403 -0
- package/dist/lib/dashboard-server.js.map +1 -0
- package/dist/lib/dry-run.d.ts +73 -0
- package/dist/lib/dry-run.d.ts.map +1 -0
- package/dist/lib/dry-run.js +130 -0
- package/dist/lib/dry-run.js.map +1 -0
- package/dist/lib/errors.d.ts +15 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +38 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/event-bus.d.ts +167 -0
- package/dist/lib/event-bus.d.ts.map +1 -0
- package/dist/lib/event-bus.js +229 -0
- package/dist/lib/event-bus.js.map +1 -0
- package/dist/lib/explainability.d.ts +85 -0
- package/dist/lib/explainability.d.ts.map +1 -0
- package/dist/lib/explainability.js +102 -0
- package/dist/lib/explainability.js.map +1 -0
- package/dist/lib/goal-dsl.d.ts +157 -0
- package/dist/lib/goal-dsl.d.ts.map +1 -0
- package/dist/lib/goal-dsl.js +392 -0
- package/dist/lib/goal-dsl.js.map +1 -0
- package/dist/lib/job-queue.d.ts +183 -0
- package/dist/lib/job-queue.d.ts.map +1 -0
- package/dist/lib/job-queue.js +310 -0
- package/dist/lib/job-queue.js.map +1 -0
- package/dist/lib/learning-loop.d.ts +113 -0
- package/dist/lib/learning-loop.d.ts.map +1 -0
- package/dist/lib/learning-loop.js +181 -0
- package/dist/lib/learning-loop.js.map +1 -0
- package/dist/lib/lifecycle-hooks.d.ts +116 -0
- package/dist/lib/lifecycle-hooks.d.ts.map +1 -0
- package/dist/lib/lifecycle-hooks.js +148 -0
- package/dist/lib/lifecycle-hooks.js.map +1 -0
- package/dist/lib/locked-blackboard.d.ts.map +1 -1
- package/dist/lib/locked-blackboard.js +9 -5
- package/dist/lib/locked-blackboard.js.map +1 -1
- package/dist/lib/mcp-tool-consumer.d.ts +153 -0
- package/dist/lib/mcp-tool-consumer.d.ts.map +1 -0
- package/dist/lib/mcp-tool-consumer.js +320 -0
- package/dist/lib/mcp-tool-consumer.js.map +1 -0
- package/dist/lib/metrics.d.ts +119 -0
- package/dist/lib/metrics.d.ts.map +1 -0
- package/dist/lib/metrics.js +284 -0
- package/dist/lib/metrics.js.map +1 -0
- package/dist/lib/orchestrator-types.d.ts +309 -0
- package/dist/lib/orchestrator-types.d.ts.map +1 -0
- package/dist/lib/orchestrator-types.js +61 -0
- package/dist/lib/orchestrator-types.js.map +1 -0
- package/dist/lib/otel-bridge.d.ts +74 -0
- package/dist/lib/otel-bridge.d.ts.map +1 -0
- package/dist/lib/otel-bridge.js +167 -0
- package/dist/lib/otel-bridge.js.map +1 -0
- package/dist/lib/playground.d.ts +76 -0
- package/dist/lib/playground.d.ts.map +1 -0
- package/dist/lib/playground.js +224 -0
- package/dist/lib/playground.js.map +1 -0
- package/dist/lib/quadtree.d.ts +114 -0
- package/dist/lib/quadtree.d.ts.map +1 -0
- package/dist/lib/quadtree.js +259 -0
- package/dist/lib/quadtree.js.map +1 -0
- package/dist/lib/shared-blackboard.d.ts +101 -0
- package/dist/lib/shared-blackboard.d.ts.map +1 -0
- package/dist/lib/shared-blackboard.js +249 -0
- package/dist/lib/shared-blackboard.js.map +1 -0
- package/dist/lib/speculative-executor.d.ts +89 -0
- package/dist/lib/speculative-executor.d.ts.map +1 -0
- package/dist/lib/speculative-executor.js +107 -0
- package/dist/lib/speculative-executor.js.map +1 -0
- package/dist/lib/swarm-transport.d.ts +150 -0
- package/dist/lib/swarm-transport.d.ts.map +1 -0
- package/dist/lib/swarm-transport.js +307 -0
- package/dist/lib/swarm-transport.js.map +1 -0
- package/dist/lib/task-decomposer.d.ts +41 -0
- package/dist/lib/task-decomposer.d.ts.map +1 -0
- package/dist/lib/task-decomposer.js +272 -0
- package/dist/lib/task-decomposer.js.map +1 -0
- package/dist/lib/timeline-scrubber.d.ts +84 -0
- package/dist/lib/timeline-scrubber.d.ts.map +1 -0
- package/dist/lib/timeline-scrubber.js +173 -0
- package/dist/lib/timeline-scrubber.js.map +1 -0
- package/dist/lib/topology.d.ts +361 -0
- package/dist/lib/topology.d.ts.map +1 -0
- package/dist/lib/topology.js +591 -0
- package/dist/lib/topology.js.map +1 -0
- package/dist/security.d.ts +95 -0
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +267 -5
- package/dist/security.js.map +1 -1
- package/package.json +7 -5
- 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
|