@vymalo/opencode-browser 0.7.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/LICENSE +21 -0
- package/README.md +321 -0
- package/dist/agent-client.d.ts +54 -0
- package/dist/agent-client.js +180 -0
- package/dist/agent-client.js.map +1 -0
- package/dist/broker.d.ts +70 -0
- package/dist/broker.js +457 -0
- package/dist/broker.js.map +1 -0
- package/dist/catalog.d.ts +45 -0
- package/dist/catalog.js +532 -0
- package/dist/catalog.js.map +1 -0
- package/dist/endpoint.d.ts +41 -0
- package/dist/endpoint.js +117 -0
- package/dist/endpoint.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.d.ts +12 -0
- package/dist/lib.js +12 -0
- package/dist/lib.js.map +1 -0
- package/dist/logging.d.ts +15 -0
- package/dist/logging.js +69 -0
- package/dist/logging.js.map +1 -0
- package/dist/opencode.d.ts +20 -0
- package/dist/opencode.js +149 -0
- package/dist/opencode.js.map +1 -0
- package/dist/protocol.d.ts +138 -0
- package/dist/protocol.js +126 -0
- package/dist/protocol.js.map +1 -0
- package/dist/schema.d.ts +51 -0
- package/dist/schema.js +50 -0
- package/dist/schema.js.map +1 -0
- package/dist/token-file.d.ts +12 -0
- package/dist/token-file.js +40 -0
- package/dist/token-file.js.map +1 -0
- package/dist/tools.d.ts +24 -0
- package/dist/tools.js +140 -0
- package/dist/tools.js.map +1 -0
- package/dist/transport.d.ts +32 -0
- package/dist/transport.js +71 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +74 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +66 -0
package/dist/broker.js
ADDED
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
import { decodeFrame, encodeFrame, errorFrame, nextId, PROTOCOL_VERSION, resultFrame } from "./protocol.js";
|
|
2
|
+
/** Thrown when a command can't be routed or the executor reports failure. */
|
|
3
|
+
export class BrokerError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
constructor(message, code) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "BrokerError";
|
|
8
|
+
this.code = code;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** Actions that aren't group-scoped — routed to the primary/target executor. */
|
|
12
|
+
const GLOBAL_ACTIONS = new Set(["cookies"]);
|
|
13
|
+
/**
|
|
14
|
+
* Hosts the WebSocket server and routes commands between **agents** (producers:
|
|
15
|
+
* the plugin, the MCP server, guest adapters) and **executors** (the browser
|
|
16
|
+
* extensions), keyed by named-group ownership. Generalizes the old single-client
|
|
17
|
+
* bridge. Runtime-agnostic via the injected transport.
|
|
18
|
+
*/
|
|
19
|
+
export class Broker {
|
|
20
|
+
opts;
|
|
21
|
+
deps;
|
|
22
|
+
executors = new Map();
|
|
23
|
+
executorById = new Map();
|
|
24
|
+
agents = new Map();
|
|
25
|
+
groupOwner = new Map();
|
|
26
|
+
pending = new Map();
|
|
27
|
+
primaryExecutorId = null;
|
|
28
|
+
agentSeq = 0;
|
|
29
|
+
execSeq = 0;
|
|
30
|
+
started = false;
|
|
31
|
+
constructor(opts, deps) {
|
|
32
|
+
this.opts = opts;
|
|
33
|
+
this.deps = deps;
|
|
34
|
+
}
|
|
35
|
+
get executorCount() {
|
|
36
|
+
return this.executorById.size;
|
|
37
|
+
}
|
|
38
|
+
async start() {
|
|
39
|
+
if (this.started) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
await this.deps.transport.listen({ host: this.opts.host, port: this.opts.port }, {
|
|
43
|
+
onOpen: () => { },
|
|
44
|
+
onMessage: (conn, data) => this.onMessage(conn, data),
|
|
45
|
+
onClose: (conn) => this.onClose(conn)
|
|
46
|
+
});
|
|
47
|
+
this.started = true;
|
|
48
|
+
this.deps.logger.info("browser_broker_listening", {
|
|
49
|
+
host: this.opts.host,
|
|
50
|
+
port: this.opts.port
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
stop() {
|
|
54
|
+
this.rejectAllPending(new BrokerError("broker stopped"));
|
|
55
|
+
this.executors.clear();
|
|
56
|
+
this.executorById.clear();
|
|
57
|
+
this.agents.clear();
|
|
58
|
+
this.groupOwner.clear();
|
|
59
|
+
this.primaryExecutorId = null;
|
|
60
|
+
this.started = false;
|
|
61
|
+
this.deps.transport.stop();
|
|
62
|
+
}
|
|
63
|
+
/** An in-process agent (the host adapter's own tools), bypassing a socket. */
|
|
64
|
+
createLocalAgent() {
|
|
65
|
+
const id = `local:${++this.agentSeq}`;
|
|
66
|
+
return {
|
|
67
|
+
send: (action, group, params, signal, target) => this.route(id, { action, group, params, target }, signal),
|
|
68
|
+
release: () => this.releaseForAgent(id)
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// ─── connection handling ───────────────────────────────────────────────────
|
|
72
|
+
onMessage(conn, raw) {
|
|
73
|
+
const frame = decodeFrame(raw);
|
|
74
|
+
if (!frame) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (frame.type === "hello") {
|
|
78
|
+
this.handleHello(conn, frame);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const executor = this.executors.get(conn);
|
|
82
|
+
if (executor) {
|
|
83
|
+
if (frame.type === "result") {
|
|
84
|
+
this.handleResult(frame);
|
|
85
|
+
}
|
|
86
|
+
else if (frame.type === "event") {
|
|
87
|
+
this.routeEvent(frame);
|
|
88
|
+
}
|
|
89
|
+
else if (frame.type === "ping") {
|
|
90
|
+
this.safeSend(conn, { v: PROTOCOL_VERSION, type: "pong" });
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const agent = this.agents.get(conn);
|
|
95
|
+
if (agent) {
|
|
96
|
+
if (frame.type === "command") {
|
|
97
|
+
void this.handleAgentCommand(agent, conn, frame);
|
|
98
|
+
}
|
|
99
|
+
else if (frame.type === "ping") {
|
|
100
|
+
this.safeSend(conn, { v: PROTOCOL_VERSION, type: "pong" });
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this.deps.logger.warn("browser_frame_unauthenticated", { type: frame.type });
|
|
105
|
+
}
|
|
106
|
+
handleHello(conn, frame) {
|
|
107
|
+
if (frame.token !== this.opts.token) {
|
|
108
|
+
this.deps.logger.warn("browser_handshake_rejected", { reason: "bad_token" });
|
|
109
|
+
conn.close();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const role = frame.role ?? "extension";
|
|
113
|
+
if (role === "agent") {
|
|
114
|
+
const id = `agent:${++this.agentSeq}`;
|
|
115
|
+
this.agents.set(conn, { conn, id });
|
|
116
|
+
this.deps.logger.info("browser_agent_connected", { id, client: frame.client });
|
|
117
|
+
this.safeSend(conn, {
|
|
118
|
+
v: PROTOCOL_VERSION,
|
|
119
|
+
type: "ready",
|
|
120
|
+
server: "opencode-browser",
|
|
121
|
+
protocol: PROTOCOL_VERSION,
|
|
122
|
+
role: "agent",
|
|
123
|
+
clientId: id
|
|
124
|
+
});
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const id = frame.id || `exec:${++this.execSeq}`;
|
|
128
|
+
// Replace any stale connection carrying the same id (extension reconnect).
|
|
129
|
+
const prior = this.executorById.get(id);
|
|
130
|
+
if (prior && prior.conn !== conn) {
|
|
131
|
+
this.executors.delete(prior.conn);
|
|
132
|
+
prior.conn.close();
|
|
133
|
+
}
|
|
134
|
+
const info = {
|
|
135
|
+
conn,
|
|
136
|
+
id,
|
|
137
|
+
label: frame.label || id,
|
|
138
|
+
browser: frame.browser || "unknown"
|
|
139
|
+
};
|
|
140
|
+
this.executors.set(conn, info);
|
|
141
|
+
this.executorById.set(id, info);
|
|
142
|
+
if (!this.primaryExecutorId || !this.executorById.has(this.primaryExecutorId)) {
|
|
143
|
+
this.primaryExecutorId = id;
|
|
144
|
+
}
|
|
145
|
+
this.deps.logger.info("browser_executor_connected", {
|
|
146
|
+
id,
|
|
147
|
+
label: info.label,
|
|
148
|
+
browser: info.browser
|
|
149
|
+
});
|
|
150
|
+
this.safeSend(conn, {
|
|
151
|
+
v: PROTOCOL_VERSION,
|
|
152
|
+
type: "ready",
|
|
153
|
+
server: "opencode-browser",
|
|
154
|
+
protocol: PROTOCOL_VERSION,
|
|
155
|
+
role: "extension",
|
|
156
|
+
clientId: id,
|
|
157
|
+
executor: this.opts.executor
|
|
158
|
+
});
|
|
159
|
+
// Rebuild group ownership from the executor's existing tabs (recovers after a
|
|
160
|
+
// broker re-election; groups come back orphaned and are adopted on first use).
|
|
161
|
+
void this.rebuildFromExecutor(info);
|
|
162
|
+
}
|
|
163
|
+
async rebuildFromExecutor(executor) {
|
|
164
|
+
try {
|
|
165
|
+
const data = (await this.sendToExecutor(executor, "broker", {
|
|
166
|
+
action: "tabs",
|
|
167
|
+
group: "",
|
|
168
|
+
params: {}
|
|
169
|
+
}));
|
|
170
|
+
for (const g of data.groups ?? []) {
|
|
171
|
+
if (g.name && !this.groupOwner.has(g.name)) {
|
|
172
|
+
this.groupOwner.set(g.name, { executorId: executor.id, agentId: null });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
/* best-effort */
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
onClose(conn) {
|
|
181
|
+
const executor = this.executors.get(conn);
|
|
182
|
+
if (executor) {
|
|
183
|
+
this.executors.delete(conn);
|
|
184
|
+
// Only forget the id mapping if it still points at this connection.
|
|
185
|
+
if (this.executorById.get(executor.id)?.conn === conn) {
|
|
186
|
+
this.executorById.delete(executor.id);
|
|
187
|
+
for (const [group, owner] of this.groupOwner) {
|
|
188
|
+
if (owner.executorId === executor.id) {
|
|
189
|
+
this.groupOwner.delete(group);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
for (const [reqId, p] of this.pending) {
|
|
193
|
+
if (p.executorId === executor.id) {
|
|
194
|
+
this.settleReject(reqId, new BrokerError("the browser disconnected", "executor_gone"));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (this.primaryExecutorId === executor.id) {
|
|
199
|
+
this.primaryExecutorId = this.executorById.keys().next().value ?? null;
|
|
200
|
+
}
|
|
201
|
+
this.deps.logger.info("browser_executor_disconnected", { id: executor.id });
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const agent = this.agents.get(conn);
|
|
205
|
+
if (agent) {
|
|
206
|
+
this.agents.delete(conn);
|
|
207
|
+
// Orphan this agent's groups (adoptable by the next user) AND send a
|
|
208
|
+
// release frame to the executors it owned, so a guest agent dropping
|
|
209
|
+
// (MCP server / guest OpenCode exit) detaches the CDP debugger/banner
|
|
210
|
+
// instead of leaving it attached until a later manual release.
|
|
211
|
+
this.releaseForAgent(agent.id);
|
|
212
|
+
for (const [reqId, p] of this.pending) {
|
|
213
|
+
if (p.agentId === agent.id) {
|
|
214
|
+
this.settleReject(reqId, new BrokerError("agent disconnected", "agent_gone"));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
this.deps.logger.info("browser_agent_disconnected", { id: agent.id });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// ─── routing ───────────────────────────────────────────────────────────────
|
|
221
|
+
route(agentId, cmd, signal) {
|
|
222
|
+
if (cmd.action === "targets") {
|
|
223
|
+
return Promise.resolve(this.listTargets());
|
|
224
|
+
}
|
|
225
|
+
if (cmd.action === "release") {
|
|
226
|
+
this.releaseForAgent(agentId);
|
|
227
|
+
return Promise.resolve({ ok: true });
|
|
228
|
+
}
|
|
229
|
+
if (cmd.action === "tabs" && !cmd.group) {
|
|
230
|
+
return this.aggregateTabs();
|
|
231
|
+
}
|
|
232
|
+
let executor;
|
|
233
|
+
try {
|
|
234
|
+
executor = GLOBAL_ACTIONS.has(cmd.action)
|
|
235
|
+
? this.pickExecutor(cmd.target)
|
|
236
|
+
: this.resolveExecutor(agentId, cmd);
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
return Promise.reject(err);
|
|
240
|
+
}
|
|
241
|
+
return this.sendToExecutor(executor, agentId, cmd, signal);
|
|
242
|
+
}
|
|
243
|
+
resolveExecutor(agentId, cmd) {
|
|
244
|
+
const owner = this.groupOwner.get(cmd.group);
|
|
245
|
+
if (owner) {
|
|
246
|
+
if (owner.agentId && owner.agentId !== agentId) {
|
|
247
|
+
throw new BrokerError(`group "${cmd.group}" is owned by another client`, "group_owned");
|
|
248
|
+
}
|
|
249
|
+
owner.agentId = agentId; // claim (incl. adopting an orphan)
|
|
250
|
+
const exec = this.executorById.get(owner.executorId);
|
|
251
|
+
if (!exec) {
|
|
252
|
+
throw new BrokerError(`the browser for group "${cmd.group}" is disconnected`, "executor_gone");
|
|
253
|
+
}
|
|
254
|
+
return exec;
|
|
255
|
+
}
|
|
256
|
+
if (cmd.action !== "open") {
|
|
257
|
+
throw new BrokerError(`group "${cmd.group}" has no open tabs — call browser_open first`, "no_group");
|
|
258
|
+
}
|
|
259
|
+
const exec = this.pickExecutor(cmd.target);
|
|
260
|
+
this.groupOwner.set(cmd.group, { executorId: exec.id, agentId });
|
|
261
|
+
return exec;
|
|
262
|
+
}
|
|
263
|
+
pickExecutor(target) {
|
|
264
|
+
if (this.executorById.size === 0) {
|
|
265
|
+
throw new BrokerError("no browser extension is connected to the bridge — open the extension and confirm it shows 'connected'", "not_connected");
|
|
266
|
+
}
|
|
267
|
+
if (target) {
|
|
268
|
+
const byId = this.executorById.get(target);
|
|
269
|
+
if (byId) {
|
|
270
|
+
return byId;
|
|
271
|
+
}
|
|
272
|
+
const byLabel = [...this.executorById.values()].filter((e) => e.label === target);
|
|
273
|
+
if (byLabel.length === 1) {
|
|
274
|
+
return byLabel[0];
|
|
275
|
+
}
|
|
276
|
+
if (byLabel.length > 1) {
|
|
277
|
+
throw new BrokerError(`target "${target}" is ambiguous — use the browser id`, "ambiguous_target");
|
|
278
|
+
}
|
|
279
|
+
throw new BrokerError(`no connected browser matches target "${target}"`, "unknown_target");
|
|
280
|
+
}
|
|
281
|
+
const primary = this.primaryExecutorId
|
|
282
|
+
? this.executorById.get(this.primaryExecutorId)
|
|
283
|
+
: undefined;
|
|
284
|
+
if (primary) {
|
|
285
|
+
return primary;
|
|
286
|
+
}
|
|
287
|
+
for (const exec of this.executorById.values()) {
|
|
288
|
+
return exec;
|
|
289
|
+
}
|
|
290
|
+
throw new BrokerError("no browser extension is connected", "not_connected");
|
|
291
|
+
}
|
|
292
|
+
sendToExecutor(executor, agentId, cmd, signal) {
|
|
293
|
+
if (signal?.aborted) {
|
|
294
|
+
return Promise.reject(new BrokerError("aborted", "aborted"));
|
|
295
|
+
}
|
|
296
|
+
const reqId = nextId();
|
|
297
|
+
const frame = {
|
|
298
|
+
v: PROTOCOL_VERSION,
|
|
299
|
+
type: "command",
|
|
300
|
+
id: reqId,
|
|
301
|
+
action: cmd.action,
|
|
302
|
+
group: cmd.group,
|
|
303
|
+
params: cmd.params
|
|
304
|
+
};
|
|
305
|
+
return new Promise((resolve, reject) => {
|
|
306
|
+
const timer = this.opts.timeoutMs > 0
|
|
307
|
+
? setTimeout(() => this.settleReject(reqId, new BrokerError(`command '${cmd.action}' timed out after ${this.opts.timeoutMs}ms`, "timeout")), this.opts.timeoutMs)
|
|
308
|
+
: null;
|
|
309
|
+
let detachAbort = null;
|
|
310
|
+
if (signal) {
|
|
311
|
+
const onAbort = () => this.settleReject(reqId, new BrokerError("aborted", "aborted"));
|
|
312
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
313
|
+
detachAbort = () => signal.removeEventListener("abort", onAbort);
|
|
314
|
+
}
|
|
315
|
+
this.pending.set(reqId, {
|
|
316
|
+
resolve,
|
|
317
|
+
reject,
|
|
318
|
+
timer,
|
|
319
|
+
detachAbort,
|
|
320
|
+
agentId,
|
|
321
|
+
executorId: executor.id
|
|
322
|
+
});
|
|
323
|
+
try {
|
|
324
|
+
executor.conn.send(encodeFrame(frame));
|
|
325
|
+
}
|
|
326
|
+
catch (err) {
|
|
327
|
+
this.settleReject(reqId, new BrokerError(`failed to deliver '${cmd.action}': ${err instanceof Error ? err.message : String(err)}`, "send_failed"));
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
handleResult(frame) {
|
|
332
|
+
const p = this.pending.get(frame.id);
|
|
333
|
+
if (!p) {
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
this.clearPending(frame.id);
|
|
337
|
+
if (frame.ok) {
|
|
338
|
+
p.resolve(frame.data);
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
p.reject(new BrokerError(frame.error?.message ?? "executor error", frame.error?.code));
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
async handleAgentCommand(agent, conn, frame) {
|
|
345
|
+
try {
|
|
346
|
+
const data = await this.route(agent.id, {
|
|
347
|
+
action: frame.action,
|
|
348
|
+
group: frame.group,
|
|
349
|
+
params: frame.params,
|
|
350
|
+
target: frame.target
|
|
351
|
+
});
|
|
352
|
+
this.safeSend(conn, resultFrame(frame.id, data));
|
|
353
|
+
}
|
|
354
|
+
catch (err) {
|
|
355
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
356
|
+
const code = err instanceof BrokerError ? err.code : undefined;
|
|
357
|
+
this.safeSend(conn, errorFrame(frame.id, message, code));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
routeEvent(frame) {
|
|
361
|
+
// Forward to the owning agent if known, else broadcast to all remote agents.
|
|
362
|
+
const owner = frame.group ? this.groupOwner.get(frame.group) : undefined;
|
|
363
|
+
for (const agent of this.agents.values()) {
|
|
364
|
+
if (!owner || owner.agentId === null || owner.agentId === agent.id) {
|
|
365
|
+
this.safeSend(agent.conn, frame);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
listTargets() {
|
|
370
|
+
return {
|
|
371
|
+
targets: [...this.executorById.values()].map((e) => ({
|
|
372
|
+
id: e.id,
|
|
373
|
+
label: e.label,
|
|
374
|
+
browser: e.browser,
|
|
375
|
+
groups: [...this.groupOwner.entries()]
|
|
376
|
+
.filter(([, o]) => o.executorId === e.id)
|
|
377
|
+
.map(([g]) => g)
|
|
378
|
+
}))
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
async aggregateTabs() {
|
|
382
|
+
const groups = [];
|
|
383
|
+
for (const executor of this.executorById.values()) {
|
|
384
|
+
try {
|
|
385
|
+
const data = (await this.sendToExecutor(executor, "broker", {
|
|
386
|
+
action: "tabs",
|
|
387
|
+
group: "",
|
|
388
|
+
params: {}
|
|
389
|
+
}));
|
|
390
|
+
for (const g of data.groups ?? []) {
|
|
391
|
+
groups.push({ ...g, executor: executor.id });
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
/* skip a browser that errored */
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return { groups };
|
|
399
|
+
}
|
|
400
|
+
releaseForAgent(agentId) {
|
|
401
|
+
const execIds = new Set();
|
|
402
|
+
for (const owner of this.groupOwner.values()) {
|
|
403
|
+
if (owner.agentId === agentId) {
|
|
404
|
+
execIds.add(owner.executorId);
|
|
405
|
+
owner.agentId = null;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
// Only release the executors this agent actually owned. An agent that holds
|
|
409
|
+
// no groups must release nothing — broadcasting to every executor would
|
|
410
|
+
// detach CDP control from other clients' browsers in a shared bridge.
|
|
411
|
+
for (const id of execIds) {
|
|
412
|
+
const exec = this.executorById.get(id);
|
|
413
|
+
if (exec) {
|
|
414
|
+
this.safeSend(exec.conn, { v: PROTOCOL_VERSION, type: "release" });
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// ─── helpers ─────────────────────────────────────────────────────────────────
|
|
419
|
+
safeSend(conn, frame) {
|
|
420
|
+
try {
|
|
421
|
+
conn.send(encodeFrame(frame));
|
|
422
|
+
}
|
|
423
|
+
catch {
|
|
424
|
+
/* connection went away; close handler cleans up */
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
clearPending(reqId) {
|
|
428
|
+
const p = this.pending.get(reqId);
|
|
429
|
+
if (!p) {
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
if (p.timer) {
|
|
433
|
+
clearTimeout(p.timer);
|
|
434
|
+
}
|
|
435
|
+
p.detachAbort?.();
|
|
436
|
+
this.pending.delete(reqId);
|
|
437
|
+
}
|
|
438
|
+
settleReject(reqId, err) {
|
|
439
|
+
const p = this.pending.get(reqId);
|
|
440
|
+
if (!p) {
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
this.clearPending(reqId);
|
|
444
|
+
p.reject(err);
|
|
445
|
+
}
|
|
446
|
+
rejectAllPending(err) {
|
|
447
|
+
for (const [reqId, p] of this.pending) {
|
|
448
|
+
if (p.timer) {
|
|
449
|
+
clearTimeout(p.timer);
|
|
450
|
+
}
|
|
451
|
+
p.detachAbort?.();
|
|
452
|
+
this.pending.delete(reqId);
|
|
453
|
+
p.reject(err);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
//# sourceMappingURL=broker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broker.js","sourceRoot":"","sources":["../src/broker.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,WAAW,EACX,WAAW,EACX,UAAU,EAGV,MAAM,EACN,gBAAgB,EAChB,WAAW,EACZ,MAAM,eAAe,CAAC;AAGvB,6EAA6E;AAC7E,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAU;IACvB,YAAY,OAAe,EAAE,IAAa;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAyDD,gFAAgF;AAChF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,OAAO,MAAM;IAYE;IACA;IAZF,SAAS,GAAG,IAAI,GAAG,EAAkC,CAAC;IACtD,YAAY,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,MAAM,GAAG,IAAI,GAAG,EAA+B,CAAC;IAChD,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC9C,iBAAiB,GAAkB,IAAI,CAAC;IACxC,QAAQ,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,KAAK,CAAC;IAExB,YACmB,IAAmB,EACnB,IAAgB;QADhB,SAAI,GAAJ,IAAI,CAAe;QACnB,SAAI,GAAJ,IAAI,CAAY;IAChC,CAAC;IAEJ,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAC9B,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAC9C;YACE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;YAChB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;YACrD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;SACtC,CACF,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;YAChD,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;SACrB,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,IAAI,CAAC,gBAAgB,CAAC,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,8EAA8E;IAC9E,gBAAgB;QACd,MAAM,EAAE,GAAG,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtC,OAAO;YACL,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAC9C,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC;YAC3D,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;SACxC,CAAC;IACJ,CAAC;IAED,8EAA8E;IACtE,SAAS,CAAC,IAAsB,EAAE,GAAW;QACnD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7B,KAAK,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACnD,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IAEO,WAAW,CAAC,IAAsB,EAAE,KAAgC;QAC1E,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,WAAW,CAAC;QACvC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,EAAE,GAAG,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/E,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAClB,CAAC,EAAE,gBAAgB;gBACnB,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,kBAAkB;gBAC1B,QAAQ,EAAE,gBAAgB;gBAC1B,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAChD,2EAA2E;QAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QACD,MAAM,IAAI,GAAiB;YACzB,IAAI;YACJ,EAAE;YACF,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,SAAS;SACpC,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9E,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;YAClD,EAAE;YACF,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAClB,CAAC,EAAE,gBAAgB;YACnB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,kBAAkB;YAC1B,QAAQ,EAAE,gBAAgB;YAC1B,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;SAC7B,CAAC,CAAC;QACH,8EAA8E;QAC9E,+EAA+E;QAC/E,KAAK,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,QAAsB;QACtD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE;gBAC1D,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,EAAE;aACX,CAAC,CAA0C,CAAC;YAC7C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBAClC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IAEO,OAAO,CAAC,IAAsB;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5B,oEAAoE;YACpE,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;gBACtD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACtC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC7C,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;wBACrC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;gBACD,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACtC,IAAI,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;wBACjC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,WAAW,CAAC,0BAA0B,EAAE,eAAe,CAAC,CAAC,CAAC;oBACzF,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,iBAAiB,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAC3C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC;YACzE,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,qEAAqE;YACrE,qEAAqE;YACrE,sEAAsE;YACtE,+DAA+D;YAC/D,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/B,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACtC,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;oBAC3B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,WAAW,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,8EAA8E;IACtE,KAAK,CACX,OAAe,EACf,GAA+F,EAC/F,MAAoB;QAEpB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,QAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;gBACvC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC/B,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAEO,eAAe,CACrB,OAAe,EACf,GAA8D;QAE9D,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC/C,MAAM,IAAI,WAAW,CAAC,UAAU,GAAG,CAAC,KAAK,8BAA8B,EAAE,aAAa,CAAC,CAAC;YAC1F,CAAC;YACD,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,mCAAmC;YAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,WAAW,CACnB,0BAA0B,GAAG,CAAC,KAAK,mBAAmB,EACtD,eAAe,CAChB,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,WAAW,CACnB,UAAU,GAAG,CAAC,KAAK,8CAA8C,EACjE,UAAU,CACX,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,YAAY,CAAC,MAAe;QAClC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,WAAW,CACnB,uGAAuG,EACvG,eAAe,CAChB,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;YAClF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,WAAW,CACnB,WAAW,MAAM,qCAAqC,EACtD,kBAAkB,CACnB,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,WAAW,CAAC,wCAAwC,MAAM,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB;YACpC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;YAC/C,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,WAAW,CAAC,mCAAmC,EAAE,eAAe,CAAC,CAAC;IAC9E,CAAC;IAEO,cAAc,CACpB,QAAsB,EACtB,OAAe,EACf,GAA8E,EAC9E,MAAoB;QAEpB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC;QACvB,MAAM,KAAK,GAAiB;YAC1B,CAAC,EAAE,gBAAgB;YACnB,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,CAAC;QACF,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9C,MAAM,KAAK,GACT,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC;gBACrB,CAAC,CAAC,UAAU,CACR,GAAG,EAAE,CACH,IAAI,CAAC,YAAY,CACf,KAAK,EACL,IAAI,WAAW,CACb,YAAY,GAAG,CAAC,MAAM,qBAAqB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAClE,SAAS,CACV,CACF,EACH,IAAI,CAAC,IAAI,CAAC,SAAS,CACpB;gBACH,CAAC,CAAC,IAAI,CAAC;YACX,IAAI,WAAW,GAAwB,IAAI,CAAC;YAC5C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;gBACtF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1D,WAAW,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE;gBACtB,OAAO;gBACP,MAAM;gBACN,KAAK;gBACL,WAAW;gBACX,OAAO;gBACP,UAAU,EAAE,QAAQ,CAAC,EAAE;aACxB,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,YAAY,CACf,KAAK,EACL,IAAI,WAAW,CACb,sBAAsB,GAAG,CAAC,MAAM,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACxF,aAAa,CACd,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,KAAiC;QACpD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;YACb,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,gBAAgB,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,KAAgB,EAChB,IAAsB,EACtB,KAAmB;QAEnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE;gBACtC,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,IAAI,GAAG,GAAG,YAAY,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/D,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,KAAiB;QAClC,6EAA6E;QAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;gBACnE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,WAAW;QAGjB,OAAO;YACL,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnD,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;qBACnC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;qBACxC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;aACnB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE;oBAC1D,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,EAAE;iBACX,CAAC,CAA2B,CAAC;gBAC9B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;oBAClC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAI,CAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,iCAAiC;YACnC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;IAEO,eAAe,CAAC,OAAe;QACrC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC9B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YACvB,CAAC;QACH,CAAC;QACD,4EAA4E;QAC5E,wEAAwE;QACxE,sEAAsE;QACtE,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAED,gFAAgF;IACxE,QAAQ,CAAC,IAAsB,EAAE,KAAY;QACnD,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;QACrD,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,KAAa;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACZ,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAEO,YAAY,CAAC,KAAa,EAAE,GAAU;QAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IAEO,gBAAgB,CAAC,GAAU;QACjC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACZ,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;YACD,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { BrowserAction } from "./protocol.js";
|
|
2
|
+
import type { JsonInput, ToolGroup } from "./schema.js";
|
|
3
|
+
export type { ToolGroup } from "./schema.js";
|
|
4
|
+
export declare const TOOL_GROUPS: readonly ToolGroup[];
|
|
5
|
+
/** Groups registered when the operator doesn't specify — `debug` is opt-in. */
|
|
6
|
+
export declare const DEFAULT_GROUPS: readonly ToolGroup[];
|
|
7
|
+
/**
|
|
8
|
+
* Adapter-neutral result of a tool call. The OpenCode adapter renders these to
|
|
9
|
+
* its text-only `{ output, metadata }`; the MCP adapter renders text/json to a
|
|
10
|
+
* TextContent and image to an inline ImageContent block.
|
|
11
|
+
*/
|
|
12
|
+
export type NeutralResult = {
|
|
13
|
+
kind: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
} | {
|
|
16
|
+
kind: "json";
|
|
17
|
+
data: unknown;
|
|
18
|
+
text: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: "image";
|
|
21
|
+
base64: string;
|
|
22
|
+
mimeType: string;
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
partial?: boolean;
|
|
26
|
+
text: string;
|
|
27
|
+
};
|
|
28
|
+
export interface ToolSpec {
|
|
29
|
+
name: string;
|
|
30
|
+
group: ToolGroup;
|
|
31
|
+
/** Wire action sent to the extension. */
|
|
32
|
+
action: BrowserAction;
|
|
33
|
+
description: string;
|
|
34
|
+
input: JsonInput;
|
|
35
|
+
/** Build the command params from validated args (default: the args verbatim). */
|
|
36
|
+
params?: (args: Record<string, unknown>) => Record<string, unknown>;
|
|
37
|
+
/** Shape the extension's reply into a neutral result (default: a short ack). */
|
|
38
|
+
result?: (data: unknown, args: Record<string, unknown>) => NeutralResult;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The single source of truth for the browser tool surface, shared by the
|
|
42
|
+
* OpenCode plugin and the MCP server. Filter by `group` to gate what an agent
|
|
43
|
+
* sees.
|
|
44
|
+
*/
|
|
45
|
+
export declare const BROWSER_TOOLS: readonly ToolSpec[];
|