@trusty-squire/mcp 1.1.13 → 1.1.14-rc.10
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/README.md +94 -110
- package/{LICENSE → assets/licenses/browser-use-MIT.txt} +1 -1
- package/dist/api-client.d.ts +9 -0
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +11 -0
- package/dist/api-client.js.map +1 -1
- package/dist/bin.js +7 -1
- package/dist/bin.js.map +1 -1
- package/dist/bot/broker/admission-context.d.ts +11 -0
- package/dist/bot/broker/admission-context.d.ts.map +1 -0
- package/dist/bot/broker/admission-context.js +17 -0
- package/dist/bot/broker/admission-context.js.map +1 -0
- package/dist/bot/broker/authority.d.ts +76 -0
- package/dist/bot/broker/authority.d.ts.map +1 -0
- package/dist/bot/broker/authority.js +528 -0
- package/dist/bot/broker/authority.js.map +1 -0
- package/dist/bot/broker/custody.d.ts +20 -0
- package/dist/bot/broker/custody.d.ts.map +1 -0
- package/dist/bot/broker/custody.js +10 -0
- package/dist/bot/broker/custody.js.map +1 -0
- package/dist/bot/broker/daemon.d.ts +24 -0
- package/dist/bot/broker/daemon.d.ts.map +1 -0
- package/dist/bot/broker/daemon.js +371 -0
- package/dist/bot/broker/daemon.js.map +1 -0
- package/dist/bot/broker/discovery.d.ts +9 -0
- package/dist/bot/broker/discovery.d.ts.map +1 -0
- package/dist/bot/broker/discovery.js +167 -0
- package/dist/bot/broker/discovery.js.map +1 -0
- package/dist/bot/broker/dispatch-journal.d.ts +71 -0
- package/dist/bot/broker/dispatch-journal.d.ts.map +1 -0
- package/dist/bot/broker/dispatch-journal.js +319 -0
- package/dist/bot/broker/dispatch-journal.js.map +1 -0
- package/dist/bot/broker/forwarder.d.ts +35 -0
- package/dist/bot/broker/forwarder.d.ts.map +1 -0
- package/dist/bot/broker/forwarder.js +150 -0
- package/dist/bot/broker/forwarder.js.map +1 -0
- package/dist/bot/broker/identity-lane.d.ts +3 -0
- package/dist/bot/broker/identity-lane.d.ts.map +1 -0
- package/dist/bot/broker/identity-lane.js +15 -0
- package/dist/bot/broker/identity-lane.js.map +1 -0
- package/dist/bot/broker/lineage.d.ts +3 -0
- package/dist/bot/broker/lineage.d.ts.map +1 -0
- package/dist/bot/broker/lineage.js +16 -0
- package/dist/bot/broker/lineage.js.map +1 -0
- package/dist/bot/broker/maintenance.d.ts +4 -0
- package/dist/bot/broker/maintenance.d.ts.map +1 -0
- package/dist/bot/broker/maintenance.js +49 -0
- package/dist/bot/broker/maintenance.js.map +1 -0
- package/dist/bot/broker/operator.d.ts +48 -0
- package/dist/bot/broker/operator.d.ts.map +1 -0
- package/dist/bot/broker/operator.js +523 -0
- package/dist/bot/broker/operator.js.map +1 -0
- package/dist/bot/broker/qualification.d.ts +5 -0
- package/dist/bot/broker/qualification.d.ts.map +1 -0
- package/dist/bot/broker/qualification.js +67 -0
- package/dist/bot/broker/qualification.js.map +1 -0
- package/dist/bot/broker/runtime.d.ts +36 -0
- package/dist/bot/broker/runtime.d.ts.map +1 -0
- package/dist/bot/broker/runtime.js +202 -0
- package/dist/bot/broker/runtime.js.map +1 -0
- package/dist/bot/broker/scheduler.d.ts +20 -0
- package/dist/bot/broker/scheduler.d.ts.map +1 -0
- package/dist/bot/broker/scheduler.js +94 -0
- package/dist/bot/broker/scheduler.js.map +1 -0
- package/dist/bot/broker/transport.d.ts +27 -0
- package/dist/bot/broker/transport.d.ts.map +1 -0
- package/dist/bot/broker/transport.js +265 -0
- package/dist/bot/broker/transport.js.map +1 -0
- package/dist/bot/browser-process-owner.d.ts +75 -0
- package/dist/bot/browser-process-owner.d.ts.map +1 -0
- package/dist/bot/browser-process-owner.js +939 -0
- package/dist/bot/browser-process-owner.js.map +1 -0
- package/dist/bot/browser-process-runtime.d.ts +168 -0
- package/dist/bot/browser-process-runtime.d.ts.map +1 -0
- package/dist/bot/browser-process-runtime.js +940 -0
- package/dist/bot/browser-process-runtime.js.map +1 -0
- package/dist/bot/browser-use-capture.d.ts +15 -0
- package/dist/bot/browser-use-capture.d.ts.map +1 -0
- package/dist/bot/browser-use-capture.js +975 -0
- package/dist/bot/browser-use-capture.js.map +1 -0
- package/dist/bot/browser-use-paint-order.d.ts +12 -0
- package/dist/bot/browser-use-paint-order.d.ts.map +1 -0
- package/dist/bot/browser-use-paint-order.js +73 -0
- package/dist/bot/browser-use-paint-order.js.map +1 -0
- package/dist/bot/browser-use-serializer.d.ts +67 -0
- package/dist/bot/browser-use-serializer.d.ts.map +1 -0
- package/dist/bot/browser-use-serializer.js +1027 -0
- package/dist/bot/browser-use-serializer.js.map +1 -0
- package/dist/bot/browser.d.ts +158 -264
- package/dist/bot/browser.d.ts.map +1 -1
- package/dist/bot/browser.js +1681 -2830
- package/dist/bot/browser.js.map +1 -1
- package/dist/bot/compact-observation-v2.d.ts +54 -45
- package/dist/bot/compact-observation-v2.d.ts.map +1 -1
- package/dist/bot/compact-observation-v2.js +454 -165
- package/dist/bot/compact-observation-v2.js.map +1 -1
- package/dist/bot/credential-shape.d.ts.map +1 -1
- package/dist/bot/credential-shape.js +7 -0
- package/dist/bot/credential-shape.js.map +1 -1
- package/dist/bot/identity-runtime.d.ts +56 -0
- package/dist/bot/identity-runtime.d.ts.map +1 -0
- package/dist/bot/identity-runtime.js +141 -0
- package/dist/bot/identity-runtime.js.map +1 -0
- package/dist/bot/mutation-dispatch-evidence.d.ts +13 -0
- package/dist/bot/mutation-dispatch-evidence.d.ts.map +1 -0
- package/dist/bot/mutation-dispatch-evidence.js +19 -0
- package/dist/bot/mutation-dispatch-evidence.js.map +1 -0
- package/dist/bot/owned-pages.d.ts +16 -0
- package/dist/bot/owned-pages.d.ts.map +1 -0
- package/dist/bot/owned-pages.js +58 -0
- package/dist/bot/owned-pages.js.map +1 -0
- package/dist/bot/page-driver.d.ts +37 -0
- package/dist/bot/page-driver.d.ts.map +1 -0
- package/dist/bot/page-driver.js +303 -0
- package/dist/bot/page-driver.js.map +1 -0
- package/dist/bot/pay-operator.d.ts +1 -0
- package/dist/bot/pay-operator.d.ts.map +1 -1
- package/dist/bot/pay-operator.js +10 -0
- package/dist/bot/pay-operator.js.map +1 -1
- package/dist/bot/profile.d.ts +9 -0
- package/dist/bot/profile.d.ts.map +1 -1
- package/dist/bot/profile.js +16 -11
- package/dist/bot/profile.js.map +1 -1
- package/dist/bot/provision-session.d.ts +32 -7
- package/dist/bot/provision-session.d.ts.map +1 -1
- package/dist/bot/provision-session.js +1008 -471
- package/dist/bot/provision-session.js.map +1 -1
- package/dist/bot/session/lifecycle.d.ts +5 -2
- package/dist/bot/session/lifecycle.d.ts.map +1 -1
- package/dist/bot/session/lifecycle.js +303 -34
- package/dist/bot/session/lifecycle.js.map +1 -1
- package/dist/bot/session/multisession-flag.d.ts +2 -0
- package/dist/bot/session/multisession-flag.d.ts.map +1 -0
- package/dist/bot/session/multisession-flag.js +23 -0
- package/dist/bot/session/multisession-flag.js.map +1 -0
- package/dist/install/cli.d.ts.map +1 -1
- package/dist/install/cli.js +2 -1
- package/dist/install/cli.js.map +1 -1
- package/dist/server-instance-registry.d.ts +18 -6
- package/dist/server-instance-registry.d.ts.map +1 -1
- package/dist/server-instance-registry.js +49 -28
- package/dist/server-instance-registry.js.map +1 -1
- package/dist/server.d.ts +6 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +122 -29
- package/dist/server.js.map +1 -1
- package/dist/tools/audit-log.d.ts.map +1 -1
- package/dist/tools/audit-log.js +1 -5
- package/dist/tools/audit-log.js.map +1 -1
- package/dist/tools/audit-rollup.d.ts +2 -5
- package/dist/tools/audit-rollup.d.ts.map +1 -1
- package/dist/tools/audit-rollup.js +0 -0
- package/dist/tools/audit-rollup.js.map +1 -1
- package/dist/tools/credential-mutations.d.ts +16 -16
- package/dist/tools/index.js +2 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/operate-pay.d.ts +18 -18
- package/dist/tools/provision-drive.d.ts +263 -555
- package/dist/tools/provision-drive.d.ts.map +1 -1
- package/dist/tools/provision-drive.js +404 -1139
- package/dist/tools/provision-drive.js.map +1 -1
- package/dist/tools/use-credential.d.ts +6 -6
- package/package.json +1 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { BrowserController } from "../browser.js";
|
|
2
|
+
import type { BrokerBrowserCustody } from "./custody.js";
|
|
3
|
+
/** Physical custody belongs to the broker. The otherwise-unused root controller
|
|
4
|
+
* configures the context once and never becomes an operate session. */
|
|
5
|
+
export declare class BrokerRuntime implements BrokerBrowserCustody {
|
|
6
|
+
private readonly accountId;
|
|
7
|
+
private readonly runtimeIdentity;
|
|
8
|
+
private readonly sessions;
|
|
9
|
+
private readonly admissionIds;
|
|
10
|
+
private readonly pendingAdmissions;
|
|
11
|
+
private readonly releases;
|
|
12
|
+
private lease;
|
|
13
|
+
private leaseProfile;
|
|
14
|
+
private owner;
|
|
15
|
+
private closing;
|
|
16
|
+
private pending;
|
|
17
|
+
constructor(accountId: string);
|
|
18
|
+
claimProfile(profileDir?: string): void;
|
|
19
|
+
identity<T>(operation: () => Promise<T>): Promise<T>;
|
|
20
|
+
acquire(options: {
|
|
21
|
+
profileDir?: string;
|
|
22
|
+
proxyUrl?: string;
|
|
23
|
+
}): Promise<{
|
|
24
|
+
browser: BrowserController;
|
|
25
|
+
profileDir: string;
|
|
26
|
+
}>;
|
|
27
|
+
cleanupAdmission(sessionId: string): Promise<boolean>;
|
|
28
|
+
orphanAdmission(sessionId: string): Promise<void>;
|
|
29
|
+
orphan(browser: BrowserController): Promise<void>;
|
|
30
|
+
release(browser: BrowserController): Promise<void>;
|
|
31
|
+
private releaseOnce;
|
|
32
|
+
browserLost(): boolean;
|
|
33
|
+
resume(): void;
|
|
34
|
+
close(): Promise<boolean>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/bot/broker/runtime.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AASlD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAQzD;uEACuE;AACvE,qBAAa,aAAc,YAAW,oBAAoB;IAY5C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAXtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsD;IACtF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4C;IACrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IACrE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6B;IAC/D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+C;IACxE,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAK;gBAES,SAAS,EAAE,MAAM;IAE9C,YAAY,CAAC,UAAU,SAAqB,GAAG,IAAI;IAW7C,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIpD,OAAO,CAAC,OAAO,EAAE;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,iBAAiB,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA6FzD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;YAY1C,WAAW;IAWzB,WAAW,IAAI,OAAO;IAMtB,MAAM,IAAI,IAAI;IAMR,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;CAiBhC"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { brokerAdmissionId } from "./admission-context.js";
|
|
2
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { withBrokerIdentityLane } from "./identity-lane.js";
|
|
5
|
+
import { BrowserController } from "../browser.js";
|
|
6
|
+
import { IdentityRuntime } from "../identity-runtime.js";
|
|
7
|
+
import { acquireProfileOperationGuard, profilePathIdentity, CHROME_PROFILE_DIR, waitForProfileFree, } from "../profile.js";
|
|
8
|
+
import { BrokerRefusal } from "./scheduler.js";
|
|
9
|
+
/** Physical custody belongs to the broker. The otherwise-unused root controller
|
|
10
|
+
* configures the context once and never becomes an operate session. */
|
|
11
|
+
export class BrokerRuntime {
|
|
12
|
+
accountId;
|
|
13
|
+
runtimeIdentity = new IdentityRuntime();
|
|
14
|
+
sessions = new Map();
|
|
15
|
+
admissionIds = new Map();
|
|
16
|
+
pendingAdmissions = new Map();
|
|
17
|
+
releases = new Map();
|
|
18
|
+
lease;
|
|
19
|
+
leaseProfile;
|
|
20
|
+
owner;
|
|
21
|
+
closing = false;
|
|
22
|
+
pending = 0;
|
|
23
|
+
constructor(accountId) {
|
|
24
|
+
this.accountId = accountId;
|
|
25
|
+
}
|
|
26
|
+
claimProfile(profileDir = CHROME_PROFILE_DIR) {
|
|
27
|
+
const identity = profilePathIdentity(profileDir);
|
|
28
|
+
if (this.lease !== undefined) {
|
|
29
|
+
if (this.leaseProfile !== identity)
|
|
30
|
+
throw new BrokerRefusal("incompatible_runtime", "Broker is pinned to one physical profile");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this.lease = acquireProfileOperationGuard(identity);
|
|
34
|
+
this.leaseProfile = identity;
|
|
35
|
+
}
|
|
36
|
+
async identity(operation) {
|
|
37
|
+
return await withBrokerIdentityLane(operation);
|
|
38
|
+
}
|
|
39
|
+
async acquire(options) {
|
|
40
|
+
if (this.closing)
|
|
41
|
+
throw new BrokerRefusal("maintenance", "Identity cell is draining");
|
|
42
|
+
if ((process.env.BOT_CDP_ENDPOINT ?? "").trim() !== "")
|
|
43
|
+
throw new BrokerRefusal("incompatible_runtime", "Broker requires a locally owned browser");
|
|
44
|
+
const profileDir = profilePathIdentity(options.profileDir ?? CHROME_PROFILE_DIR);
|
|
45
|
+
const admissionId = brokerAdmissionId();
|
|
46
|
+
if (admissionId !== undefined)
|
|
47
|
+
this.pendingAdmissions.set(admissionId, (this.pendingAdmissions.get(admissionId) ?? 0) + 1);
|
|
48
|
+
this.pending++;
|
|
49
|
+
try {
|
|
50
|
+
const acquired = await this.runtimeIdentity.acquire({ profileDir, ...(options.proxyUrl === undefined ? {} : { proxyUrl: options.proxyUrl }) }, async (settings) => {
|
|
51
|
+
this.claimProfile(settings.profileDir);
|
|
52
|
+
try {
|
|
53
|
+
if (!(await waitForProfileFree(settings.profileDir, { deadlineMs: 0 })))
|
|
54
|
+
throw new BrokerRefusal("profile_busy", "Profile is already open");
|
|
55
|
+
await mkdir(settings.profileDir, { recursive: true, mode: 0o700 });
|
|
56
|
+
const bindingPath = join(settings.profileDir, "trusty-squire-broker-account.json");
|
|
57
|
+
try {
|
|
58
|
+
await writeFile(bindingPath, JSON.stringify({ version: 1, accountId: this.accountId }), { flag: "wx", mode: 0o600 });
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error.code !== "EEXIST")
|
|
62
|
+
throw error;
|
|
63
|
+
const binding = JSON.parse(await readFile(bindingPath, "utf8"));
|
|
64
|
+
if (binding.version !== 1 || binding.accountId !== this.accountId)
|
|
65
|
+
throw new BrokerRefusal("account_mismatch", "Profile is enrolled to a different account");
|
|
66
|
+
}
|
|
67
|
+
const owner = new BrowserController(settings);
|
|
68
|
+
this.owner = owner;
|
|
69
|
+
let timer;
|
|
70
|
+
try {
|
|
71
|
+
await Promise.race([
|
|
72
|
+
owner.start(),
|
|
73
|
+
new Promise((_resolve, reject) => {
|
|
74
|
+
timer = setTimeout(() => reject(new BrokerRefusal("launch_timeout", "Broker browser launch timed out")), Number(process.env.BOT_START_TIMEOUT_MS) || 600_000);
|
|
75
|
+
}),
|
|
76
|
+
]);
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
if (timer !== undefined)
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
}
|
|
82
|
+
await owner.enableBrokerRouting();
|
|
83
|
+
return owner;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const closed = this.owner === undefined ||
|
|
87
|
+
(await this.owner.close({ cancelStart: true }).catch(() => "unknown")) === "closed";
|
|
88
|
+
if (closed) {
|
|
89
|
+
this.lease?.release();
|
|
90
|
+
this.lease = undefined;
|
|
91
|
+
this.leaseProfile = undefined;
|
|
92
|
+
this.owner = undefined;
|
|
93
|
+
}
|
|
94
|
+
else
|
|
95
|
+
this.closing = true;
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
let browser;
|
|
100
|
+
try {
|
|
101
|
+
if (this.closing)
|
|
102
|
+
throw new BrokerRefusal("maintenance", "Identity cell is draining");
|
|
103
|
+
browser = await BrowserController.attachSessionPage(acquired.handle, options);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
acquired.releaseTabs();
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
this.sessions.set(browser, acquired.releaseTabs);
|
|
110
|
+
if (admissionId !== undefined)
|
|
111
|
+
this.admissionIds.set(browser, admissionId);
|
|
112
|
+
return { browser, profileDir };
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
this.pending--;
|
|
116
|
+
if (admissionId !== undefined) {
|
|
117
|
+
const count = (this.pendingAdmissions.get(admissionId) ?? 1) - 1;
|
|
118
|
+
if (count === 0)
|
|
119
|
+
this.pendingAdmissions.delete(admissionId);
|
|
120
|
+
else
|
|
121
|
+
this.pendingAdmissions.set(admissionId, count);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async cleanupAdmission(sessionId) {
|
|
126
|
+
if (this.pendingAdmissions.has(sessionId))
|
|
127
|
+
return false;
|
|
128
|
+
for (const [browser, id] of this.admissionIds) {
|
|
129
|
+
if (id === sessionId)
|
|
130
|
+
await this.release(browser);
|
|
131
|
+
}
|
|
132
|
+
// An incomplete physical launch retains the profile until process closure
|
|
133
|
+
// is independently proven. Successful siblings must never be closed here.
|
|
134
|
+
if (this.closing && this.sessions.size === 0)
|
|
135
|
+
return await this.close();
|
|
136
|
+
return !this.closing;
|
|
137
|
+
}
|
|
138
|
+
async orphanAdmission(sessionId) {
|
|
139
|
+
if (this.pendingAdmissions.has(sessionId))
|
|
140
|
+
return;
|
|
141
|
+
await Promise.all([...this.admissionIds]
|
|
142
|
+
.filter(([, id]) => id === sessionId)
|
|
143
|
+
.map(async ([browser]) => await this.orphan(browser)));
|
|
144
|
+
}
|
|
145
|
+
async orphan(browser) {
|
|
146
|
+
const release = this.sessions.get(browser);
|
|
147
|
+
if (release === undefined)
|
|
148
|
+
return;
|
|
149
|
+
this.sessions.delete(browser);
|
|
150
|
+
this.admissionIds.delete(browser);
|
|
151
|
+
release();
|
|
152
|
+
}
|
|
153
|
+
async release(browser) {
|
|
154
|
+
const existing = this.releases.get(browser);
|
|
155
|
+
if (existing !== undefined)
|
|
156
|
+
return await existing;
|
|
157
|
+
const operation = this.releaseOnce(browser);
|
|
158
|
+
this.releases.set(browser, operation);
|
|
159
|
+
try {
|
|
160
|
+
await operation;
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
this.releases.delete(browser);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async releaseOnce(browser) {
|
|
167
|
+
const release = this.sessions.get(browser);
|
|
168
|
+
if (release === undefined)
|
|
169
|
+
return;
|
|
170
|
+
const state = await browser.closeOwnPagesOnly();
|
|
171
|
+
if (state !== "closed")
|
|
172
|
+
throw new BrokerRefusal("cleanup_unknown", "Tab family remains quarantined");
|
|
173
|
+
this.sessions.delete(browser);
|
|
174
|
+
this.admissionIds.delete(browser);
|
|
175
|
+
release();
|
|
176
|
+
}
|
|
177
|
+
browserLost() {
|
|
178
|
+
return (this.owner !== undefined && !this.runtimeIdentity.isLaunching() && !this.owner.isConnected());
|
|
179
|
+
}
|
|
180
|
+
resume() {
|
|
181
|
+
if (this.owner !== undefined || this.pending !== 0 || this.sessions.size !== 0)
|
|
182
|
+
throw new BrokerRefusal("maintenance", "Physical browser has not drained");
|
|
183
|
+
this.closing = false;
|
|
184
|
+
}
|
|
185
|
+
async close() {
|
|
186
|
+
this.closing = true;
|
|
187
|
+
if (this.pending > 0 || this.sessions.size > 0)
|
|
188
|
+
return false;
|
|
189
|
+
if (this.owner !== undefined &&
|
|
190
|
+
(await this.owner.close().catch(() => "unknown")) !== "closed") {
|
|
191
|
+
if ((await this.owner.forceCloseOwnedProcessTree().catch(() => "unknown")) !== "closed")
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
this.lease?.release();
|
|
195
|
+
this.lease = undefined;
|
|
196
|
+
this.leaseProfile = undefined;
|
|
197
|
+
this.owner = undefined;
|
|
198
|
+
this.runtimeIdentity.forgetAfterShutdown();
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/bot/broker/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare class BrokerRefusal extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
constructor(code: string, message: string);
|
|
4
|
+
}
|
|
5
|
+
/** State domains, not tab URLs. Private suffixes isolate hosted tenants. */
|
|
6
|
+
export declare function siteResources(hosts: readonly string[]): string[];
|
|
7
|
+
/** One scheduler atomically reserves complete sets. Expansion never waits while
|
|
8
|
+
* retaining a conflicting set: the caller gets a resumable refusal before action. */
|
|
9
|
+
export declare class ScopeScheduler {
|
|
10
|
+
private readonly maxQueued;
|
|
11
|
+
private readonly held;
|
|
12
|
+
private readonly queue;
|
|
13
|
+
constructor(maxQueued?: number);
|
|
14
|
+
private conflicts;
|
|
15
|
+
reserve(owner: string, resources: readonly string[], signal?: AbortSignal): Promise<void>;
|
|
16
|
+
expand(owner: string, resources: readonly string[]): void;
|
|
17
|
+
release(owner: string): void;
|
|
18
|
+
private drain;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/bot/broker/scheduler.ts"],"names":[],"mappings":"AAEA,qBAAa,aAAc,SAAQ,KAAK;IAEpC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKlB;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAShE;AAUD;qFACqF;AACrF,qBAAa,cAAc;IAIb,OAAO,CAAC,QAAQ,CAAC,SAAS;IAHtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkC;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;gBAET,SAAS,SAAK;IAE3C,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCzF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAazD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5B,OAAO,CAAC,KAAK;CAgBd"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { getDomain } from "tldts";
|
|
2
|
+
export class BrokerRefusal extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = "BrokerRefusal";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/** State domains, not tab URLs. Private suffixes isolate hosted tenants. */
|
|
11
|
+
export function siteResources(hosts) {
|
|
12
|
+
return [
|
|
13
|
+
...new Set(hosts.map((value) => {
|
|
14
|
+
const host = new URL(value.includes("://") ? value : `https://${value}`).hostname;
|
|
15
|
+
return `site:${getDomain(host, { allowPrivateDomains: true }) ?? host}`;
|
|
16
|
+
})),
|
|
17
|
+
].sort();
|
|
18
|
+
}
|
|
19
|
+
/** One scheduler atomically reserves complete sets. Expansion never waits while
|
|
20
|
+
* retaining a conflicting set: the caller gets a resumable refusal before action. */
|
|
21
|
+
export class ScopeScheduler {
|
|
22
|
+
maxQueued;
|
|
23
|
+
held = new Map();
|
|
24
|
+
queue = [];
|
|
25
|
+
constructor(maxQueued = 64) {
|
|
26
|
+
this.maxQueued = maxQueued;
|
|
27
|
+
}
|
|
28
|
+
conflicts(owner, resources) {
|
|
29
|
+
return [...this.held].some(([other, held]) => other !== owner && resources.some((resource) => held.has(resource)));
|
|
30
|
+
}
|
|
31
|
+
reserve(owner, resources, signal) {
|
|
32
|
+
if (signal?.aborted)
|
|
33
|
+
return Promise.reject(new BrokerRefusal("cancelled", "Reservation cancelled"));
|
|
34
|
+
if (this.held.has(owner) || this.queue.some((entry) => entry.owner === owner)) {
|
|
35
|
+
return Promise.reject(new BrokerRefusal("duplicate_reservation", "Owner already admitted or queued"));
|
|
36
|
+
}
|
|
37
|
+
if (this.queue.length >= this.maxQueued) {
|
|
38
|
+
return Promise.reject(new BrokerRefusal("queue_full", "Broker admission queue is full"));
|
|
39
|
+
}
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
const abort = () => {
|
|
42
|
+
const index = this.queue.indexOf(waiter);
|
|
43
|
+
if (index < 0)
|
|
44
|
+
return;
|
|
45
|
+
this.queue.splice(index, 1);
|
|
46
|
+
waiter.dispose();
|
|
47
|
+
reject(new BrokerRefusal("cancelled", "Reservation cancelled"));
|
|
48
|
+
this.drain();
|
|
49
|
+
};
|
|
50
|
+
const waiter = {
|
|
51
|
+
owner,
|
|
52
|
+
resources: [...new Set(resources)],
|
|
53
|
+
resolve,
|
|
54
|
+
reject,
|
|
55
|
+
dispose: () => signal?.removeEventListener("abort", abort),
|
|
56
|
+
};
|
|
57
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
58
|
+
this.queue.push(waiter);
|
|
59
|
+
this.drain();
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
expand(owner, resources) {
|
|
63
|
+
const held = this.held.get(owner);
|
|
64
|
+
if (held === undefined)
|
|
65
|
+
throw new BrokerRefusal("stale_lease", "Reservation no longer exists");
|
|
66
|
+
const added = resources.filter((resource) => !held.has(resource));
|
|
67
|
+
if (this.conflicts(owner, added) ||
|
|
68
|
+
this.queue.some((w) => w.resources.some((r) => added.includes(r)))) {
|
|
69
|
+
throw new BrokerRefusal("scope_conflict", "Scope is busy; action was not dispatched");
|
|
70
|
+
}
|
|
71
|
+
for (const resource of added)
|
|
72
|
+
held.add(resource);
|
|
73
|
+
}
|
|
74
|
+
release(owner) {
|
|
75
|
+
this.held.delete(owner);
|
|
76
|
+
this.drain();
|
|
77
|
+
}
|
|
78
|
+
drain() {
|
|
79
|
+
const earlier = new Set();
|
|
80
|
+
for (const waiter of [...this.queue]) {
|
|
81
|
+
if (this.conflicts(waiter.owner, waiter.resources) ||
|
|
82
|
+
waiter.resources.some((r) => earlier.has(r))) {
|
|
83
|
+
for (const resource of waiter.resources)
|
|
84
|
+
earlier.add(resource);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
this.queue.splice(this.queue.indexOf(waiter), 1);
|
|
88
|
+
this.held.set(waiter.owner, new Set(waiter.resources));
|
|
89
|
+
waiter.dispose();
|
|
90
|
+
waiter.resolve();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/bot/broker/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type BrokerPrincipal, type TabCapability } from "./authority.js";
|
|
2
|
+
export interface BrokerTransportPort {
|
|
3
|
+
authenticate(token: string, agentId?: string, lineageCredential?: string, supervisor?: boolean): Promise<Omit<BrokerPrincipal, "clientId"> | null>;
|
|
4
|
+
connected?(principal: BrokerPrincipal): Promise<void> | void;
|
|
5
|
+
call(principal: BrokerPrincipal, method: string, params: Record<string, unknown>, requestId: string): Promise<unknown>;
|
|
6
|
+
disconnect(principal: BrokerPrincipal, explicit?: boolean): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
/** Endpoint election is bind-exclusive. Never unlink an existing socket to win
|
|
9
|
+
* election: its incumbent may still own Chrome, even if it is unresponsive. */
|
|
10
|
+
export declare function listenBroker(path: string, port: BrokerTransportPort): Promise<{
|
|
11
|
+
close(): Promise<void>;
|
|
12
|
+
}>;
|
|
13
|
+
export declare class BrokerClient {
|
|
14
|
+
private readonly socket;
|
|
15
|
+
private readonly pending;
|
|
16
|
+
private ended;
|
|
17
|
+
private constructor();
|
|
18
|
+
static connect(path: string, token: string, lineageCredential?: string, supervisor?: boolean): Promise<BrokerClient>;
|
|
19
|
+
static connectSupervisor(path: string, token: string): Promise<BrokerClient>;
|
|
20
|
+
call(method: string, params: Record<string, unknown>, id?: string): Promise<unknown>;
|
|
21
|
+
acknowledge(requestId: string): Promise<void>;
|
|
22
|
+
confirmStartDelivery(capability: TabCapability): Promise<void>;
|
|
23
|
+
isConnected(): boolean;
|
|
24
|
+
close(): Promise<void>;
|
|
25
|
+
release(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/bot/broker/transport.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AAgDxB,MAAM,WAAW,mBAAmB;IAClC,YAAY,CACV,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;IACrD,SAAS,CAAC,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7D,IAAI,CACF,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,UAAU,CAAC,SAAS,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAED;+EAC+E;AAC/E,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC;IACT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC,CA+HD;AAED,qBAAa,YAAY;IAMH,OAAO,CAAC,QAAQ,CAAC,MAAM;IAL3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGpB;IACJ,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO;WA6BM,OAAO,CAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,iBAAiB,CAAC,EAAE,MAAM,EAC1B,UAAU,UAAQ,GACjB,OAAO,CAAC,YAAY,CAAC;WA0BX,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAGlF,IAAI,CACF,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,EAAE,GAAE,MAAqB,GACxB,OAAO,CAAC,OAAO,CAAC;IAYb,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAG7C,oBAAoB,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAGpE,WAAW,IAAI,OAAO;IAIhB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B"}
|