@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.
Files changed (163) hide show
  1. package/README.md +94 -110
  2. package/{LICENSE → assets/licenses/browser-use-MIT.txt} +1 -1
  3. package/dist/api-client.d.ts +9 -0
  4. package/dist/api-client.d.ts.map +1 -1
  5. package/dist/api-client.js +11 -0
  6. package/dist/api-client.js.map +1 -1
  7. package/dist/bin.js +7 -1
  8. package/dist/bin.js.map +1 -1
  9. package/dist/bot/broker/admission-context.d.ts +11 -0
  10. package/dist/bot/broker/admission-context.d.ts.map +1 -0
  11. package/dist/bot/broker/admission-context.js +17 -0
  12. package/dist/bot/broker/admission-context.js.map +1 -0
  13. package/dist/bot/broker/authority.d.ts +76 -0
  14. package/dist/bot/broker/authority.d.ts.map +1 -0
  15. package/dist/bot/broker/authority.js +528 -0
  16. package/dist/bot/broker/authority.js.map +1 -0
  17. package/dist/bot/broker/custody.d.ts +20 -0
  18. package/dist/bot/broker/custody.d.ts.map +1 -0
  19. package/dist/bot/broker/custody.js +10 -0
  20. package/dist/bot/broker/custody.js.map +1 -0
  21. package/dist/bot/broker/daemon.d.ts +24 -0
  22. package/dist/bot/broker/daemon.d.ts.map +1 -0
  23. package/dist/bot/broker/daemon.js +371 -0
  24. package/dist/bot/broker/daemon.js.map +1 -0
  25. package/dist/bot/broker/discovery.d.ts +9 -0
  26. package/dist/bot/broker/discovery.d.ts.map +1 -0
  27. package/dist/bot/broker/discovery.js +167 -0
  28. package/dist/bot/broker/discovery.js.map +1 -0
  29. package/dist/bot/broker/dispatch-journal.d.ts +71 -0
  30. package/dist/bot/broker/dispatch-journal.d.ts.map +1 -0
  31. package/dist/bot/broker/dispatch-journal.js +319 -0
  32. package/dist/bot/broker/dispatch-journal.js.map +1 -0
  33. package/dist/bot/broker/forwarder.d.ts +35 -0
  34. package/dist/bot/broker/forwarder.d.ts.map +1 -0
  35. package/dist/bot/broker/forwarder.js +150 -0
  36. package/dist/bot/broker/forwarder.js.map +1 -0
  37. package/dist/bot/broker/identity-lane.d.ts +3 -0
  38. package/dist/bot/broker/identity-lane.d.ts.map +1 -0
  39. package/dist/bot/broker/identity-lane.js +15 -0
  40. package/dist/bot/broker/identity-lane.js.map +1 -0
  41. package/dist/bot/broker/lineage.d.ts +3 -0
  42. package/dist/bot/broker/lineage.d.ts.map +1 -0
  43. package/dist/bot/broker/lineage.js +16 -0
  44. package/dist/bot/broker/lineage.js.map +1 -0
  45. package/dist/bot/broker/maintenance.d.ts +4 -0
  46. package/dist/bot/broker/maintenance.d.ts.map +1 -0
  47. package/dist/bot/broker/maintenance.js +49 -0
  48. package/dist/bot/broker/maintenance.js.map +1 -0
  49. package/dist/bot/broker/operator.d.ts +48 -0
  50. package/dist/bot/broker/operator.d.ts.map +1 -0
  51. package/dist/bot/broker/operator.js +523 -0
  52. package/dist/bot/broker/operator.js.map +1 -0
  53. package/dist/bot/broker/qualification.d.ts +5 -0
  54. package/dist/bot/broker/qualification.d.ts.map +1 -0
  55. package/dist/bot/broker/qualification.js +67 -0
  56. package/dist/bot/broker/qualification.js.map +1 -0
  57. package/dist/bot/broker/runtime.d.ts +36 -0
  58. package/dist/bot/broker/runtime.d.ts.map +1 -0
  59. package/dist/bot/broker/runtime.js +202 -0
  60. package/dist/bot/broker/runtime.js.map +1 -0
  61. package/dist/bot/broker/scheduler.d.ts +20 -0
  62. package/dist/bot/broker/scheduler.d.ts.map +1 -0
  63. package/dist/bot/broker/scheduler.js +94 -0
  64. package/dist/bot/broker/scheduler.js.map +1 -0
  65. package/dist/bot/broker/transport.d.ts +27 -0
  66. package/dist/bot/broker/transport.d.ts.map +1 -0
  67. package/dist/bot/broker/transport.js +265 -0
  68. package/dist/bot/broker/transport.js.map +1 -0
  69. package/dist/bot/browser-process-owner.d.ts +75 -0
  70. package/dist/bot/browser-process-owner.d.ts.map +1 -0
  71. package/dist/bot/browser-process-owner.js +939 -0
  72. package/dist/bot/browser-process-owner.js.map +1 -0
  73. package/dist/bot/browser-process-runtime.d.ts +168 -0
  74. package/dist/bot/browser-process-runtime.d.ts.map +1 -0
  75. package/dist/bot/browser-process-runtime.js +940 -0
  76. package/dist/bot/browser-process-runtime.js.map +1 -0
  77. package/dist/bot/browser-use-capture.d.ts +15 -0
  78. package/dist/bot/browser-use-capture.d.ts.map +1 -0
  79. package/dist/bot/browser-use-capture.js +975 -0
  80. package/dist/bot/browser-use-capture.js.map +1 -0
  81. package/dist/bot/browser-use-paint-order.d.ts +12 -0
  82. package/dist/bot/browser-use-paint-order.d.ts.map +1 -0
  83. package/dist/bot/browser-use-paint-order.js +73 -0
  84. package/dist/bot/browser-use-paint-order.js.map +1 -0
  85. package/dist/bot/browser-use-serializer.d.ts +67 -0
  86. package/dist/bot/browser-use-serializer.d.ts.map +1 -0
  87. package/dist/bot/browser-use-serializer.js +1027 -0
  88. package/dist/bot/browser-use-serializer.js.map +1 -0
  89. package/dist/bot/browser.d.ts +158 -264
  90. package/dist/bot/browser.d.ts.map +1 -1
  91. package/dist/bot/browser.js +1681 -2830
  92. package/dist/bot/browser.js.map +1 -1
  93. package/dist/bot/compact-observation-v2.d.ts +54 -45
  94. package/dist/bot/compact-observation-v2.d.ts.map +1 -1
  95. package/dist/bot/compact-observation-v2.js +454 -165
  96. package/dist/bot/compact-observation-v2.js.map +1 -1
  97. package/dist/bot/credential-shape.d.ts.map +1 -1
  98. package/dist/bot/credential-shape.js +7 -0
  99. package/dist/bot/credential-shape.js.map +1 -1
  100. package/dist/bot/identity-runtime.d.ts +56 -0
  101. package/dist/bot/identity-runtime.d.ts.map +1 -0
  102. package/dist/bot/identity-runtime.js +141 -0
  103. package/dist/bot/identity-runtime.js.map +1 -0
  104. package/dist/bot/mutation-dispatch-evidence.d.ts +13 -0
  105. package/dist/bot/mutation-dispatch-evidence.d.ts.map +1 -0
  106. package/dist/bot/mutation-dispatch-evidence.js +19 -0
  107. package/dist/bot/mutation-dispatch-evidence.js.map +1 -0
  108. package/dist/bot/owned-pages.d.ts +16 -0
  109. package/dist/bot/owned-pages.d.ts.map +1 -0
  110. package/dist/bot/owned-pages.js +58 -0
  111. package/dist/bot/owned-pages.js.map +1 -0
  112. package/dist/bot/page-driver.d.ts +37 -0
  113. package/dist/bot/page-driver.d.ts.map +1 -0
  114. package/dist/bot/page-driver.js +303 -0
  115. package/dist/bot/page-driver.js.map +1 -0
  116. package/dist/bot/pay-operator.d.ts +1 -0
  117. package/dist/bot/pay-operator.d.ts.map +1 -1
  118. package/dist/bot/pay-operator.js +10 -0
  119. package/dist/bot/pay-operator.js.map +1 -1
  120. package/dist/bot/profile.d.ts +9 -0
  121. package/dist/bot/profile.d.ts.map +1 -1
  122. package/dist/bot/profile.js +16 -11
  123. package/dist/bot/profile.js.map +1 -1
  124. package/dist/bot/provision-session.d.ts +32 -7
  125. package/dist/bot/provision-session.d.ts.map +1 -1
  126. package/dist/bot/provision-session.js +1008 -471
  127. package/dist/bot/provision-session.js.map +1 -1
  128. package/dist/bot/session/lifecycle.d.ts +5 -2
  129. package/dist/bot/session/lifecycle.d.ts.map +1 -1
  130. package/dist/bot/session/lifecycle.js +303 -34
  131. package/dist/bot/session/lifecycle.js.map +1 -1
  132. package/dist/bot/session/multisession-flag.d.ts +2 -0
  133. package/dist/bot/session/multisession-flag.d.ts.map +1 -0
  134. package/dist/bot/session/multisession-flag.js +23 -0
  135. package/dist/bot/session/multisession-flag.js.map +1 -0
  136. package/dist/install/cli.d.ts.map +1 -1
  137. package/dist/install/cli.js +2 -1
  138. package/dist/install/cli.js.map +1 -1
  139. package/dist/server-instance-registry.d.ts +18 -6
  140. package/dist/server-instance-registry.d.ts.map +1 -1
  141. package/dist/server-instance-registry.js +49 -28
  142. package/dist/server-instance-registry.js.map +1 -1
  143. package/dist/server.d.ts +6 -3
  144. package/dist/server.d.ts.map +1 -1
  145. package/dist/server.js +122 -29
  146. package/dist/server.js.map +1 -1
  147. package/dist/tools/audit-log.d.ts.map +1 -1
  148. package/dist/tools/audit-log.js +1 -5
  149. package/dist/tools/audit-log.js.map +1 -1
  150. package/dist/tools/audit-rollup.d.ts +2 -5
  151. package/dist/tools/audit-rollup.d.ts.map +1 -1
  152. package/dist/tools/audit-rollup.js +0 -0
  153. package/dist/tools/audit-rollup.js.map +1 -1
  154. package/dist/tools/credential-mutations.d.ts +16 -16
  155. package/dist/tools/index.js +2 -2
  156. package/dist/tools/index.js.map +1 -1
  157. package/dist/tools/operate-pay.d.ts +18 -18
  158. package/dist/tools/provision-drive.d.ts +263 -555
  159. package/dist/tools/provision-drive.d.ts.map +1 -1
  160. package/dist/tools/provision-drive.js +404 -1139
  161. package/dist/tools/provision-drive.js.map +1 -1
  162. package/dist/tools/use-credential.d.ts +6 -6
  163. package/package.json +1 -1
@@ -0,0 +1,76 @@
1
+ export interface BrokerPrincipal {
2
+ accountId: string;
3
+ agentId: string;
4
+ forwarderId?: string;
5
+ clientId: string;
6
+ supervisor?: true;
7
+ }
8
+ export interface TabCapability {
9
+ cellId: string;
10
+ browserEpoch: string;
11
+ sessionId: string;
12
+ targetId: string;
13
+ leaseGeneration: string;
14
+ }
15
+ export interface BrokerSessionPort {
16
+ targetId: string;
17
+ prepare?(name: string, args: Record<string, unknown>): Promise<unknown> | unknown;
18
+ invoke(name: string, args: Record<string, unknown>, signal: AbortSignal, requestId: string, prepared?: unknown): Promise<unknown>;
19
+ /** True only after owned tabs and pending outcome custody are resolved. */
20
+ close(reason?: "finish" | "disconnect" | "expiry"): Promise<boolean>;
21
+ orphan(): Promise<void>;
22
+ }
23
+ export declare const FORWARDER_HANDOFF_TIMEOUT_MS = 120000;
24
+ export declare const DETACHED_EXPIRY_CLOSE_TIMEOUT_MS = 10000;
25
+ export declare const FORWARDER_RECONNECT_GRACE_MS: number;
26
+ /** This object lives only in the broker. No Page, Browser or CDP handle crosses
27
+ * the transport. A principal is established by authenticated connection setup. */
28
+ export declare class BrokerAuthority {
29
+ readonly accountId: string;
30
+ readonly cellId: string;
31
+ private readonly maxSessions;
32
+ private readonly detachedExpiryCloseTimeoutMs;
33
+ private epochValue;
34
+ get epoch(): string;
35
+ rotateEpoch(): void;
36
+ private readonly actors;
37
+ private readonly admissions;
38
+ private readonly expiredAdmissions;
39
+ private readonly forwarderConnections;
40
+ private readonly fencedClients;
41
+ private readonly scheduler;
42
+ private readonly lanes;
43
+ private detachedExpiryHandler;
44
+ constructor(accountId: string, cellId: string, maxSessions?: number, detachedExpiryCloseTimeoutMs?: number);
45
+ setDetachedExpiryHandler(handler: (capability: TabCapability, principal: BrokerPrincipal) => Promise<void> | void): void;
46
+ private assertPrincipal;
47
+ private retireFencedClient;
48
+ claimForwarder(principal: BrokerPrincipal): Promise<void> | void;
49
+ beginForwarderRelease(principal: BrokerPrincipal): void;
50
+ private waitForDetach;
51
+ releaseForwarder(principal: BrokerPrincipal): void;
52
+ open(principal: BrokerPrincipal, resources: readonly string[], create: (sessionId: string, signal: AbortSignal, reserve: (resources: readonly string[]) => void) => Promise<BrokerSessionPort>, cleanupFailedAdmission?: (sessionId: string) => Promise<boolean>, orphanFailedAdmission?: (sessionId: string) => Promise<void>): Promise<TabCapability>;
53
+ private resolve;
54
+ reclaim(principal: BrokerPrincipal): TabCapability[];
55
+ recoverCapability(principal: BrokerPrincipal, sessionId: string): TabCapability | undefined;
56
+ hasCapability(principal: BrokerPrincipal, capability: TabCapability): boolean;
57
+ invoke(principal: BrokerPrincipal, capability: TabCapability, requestId: string, name: string, args: Record<string, unknown>, resources?: readonly string[], lane?: "oauth" | "interactive"): Promise<unknown>;
58
+ close(principal: BrokerPrincipal, capability: TabCapability): Promise<boolean>;
59
+ private closeActor;
60
+ private completeWithinDetachedExpiryTimeout;
61
+ private disposeExpiredAdmission;
62
+ private orphanExpiredActor;
63
+ private disposeExpiredActor;
64
+ disconnect(principal: BrokerPrincipal): Promise<void>;
65
+ detach(principal: BrokerPrincipal, now?: number, graceMs?: number): void;
66
+ expireDetached(now?: number): Promise<void>;
67
+ hasReconnectGrace(now?: number): boolean;
68
+ fenceRuntime(): void;
69
+ retryQuarantined(shouldClose?: (capability: TabCapability, principal: BrokerPrincipal) => Promise<boolean> | boolean): Promise<void>;
70
+ inventory(): {
71
+ active: number;
72
+ quarantined: number;
73
+ admitting: number;
74
+ };
75
+ }
76
+ //# sourceMappingURL=authority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../../../src/bot/broker/authority.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,528 @@
1
+ import { withBrokerIdentityLane } from "./identity-lane.js";
2
+ import { randomUUID } from "node:crypto";
3
+ import { BrokerRefusal, ScopeScheduler } from "./scheduler.js";
4
+ export const FORWARDER_HANDOFF_TIMEOUT_MS = 120_000;
5
+ export const DETACHED_EXPIRY_CLOSE_TIMEOUT_MS = 10_000;
6
+ // Match the durable start-delivery retention window: a socket restart must not
7
+ // destroy the live capability while its acknowledged start is still recoverable.
8
+ export const FORWARDER_RECONNECT_GRACE_MS = 5 * 60_000;
9
+ /** This object lives only in the broker. No Page, Browser or CDP handle crosses
10
+ * the transport. A principal is established by authenticated connection setup. */
11
+ export class BrokerAuthority {
12
+ accountId;
13
+ cellId;
14
+ maxSessions;
15
+ detachedExpiryCloseTimeoutMs;
16
+ epochValue = randomUUID();
17
+ get epoch() {
18
+ return this.epochValue;
19
+ }
20
+ rotateEpoch() {
21
+ if (this.actors.size !== 0 || this.admissions.size !== 0)
22
+ throw new BrokerRefusal("maintenance", "Session custody has not drained");
23
+ this.epochValue = randomUUID();
24
+ }
25
+ actors = new Map();
26
+ admissions = new Map();
27
+ expiredAdmissions = new Map();
28
+ forwarderConnections = new Map();
29
+ fencedClients = new Set();
30
+ scheduler = new ScopeScheduler();
31
+ lanes = new ScopeScheduler();
32
+ detachedExpiryHandler;
33
+ constructor(accountId, cellId, maxSessions = 3, detachedExpiryCloseTimeoutMs = DETACHED_EXPIRY_CLOSE_TIMEOUT_MS) {
34
+ this.accountId = accountId;
35
+ this.cellId = cellId;
36
+ this.maxSessions = maxSessions;
37
+ this.detachedExpiryCloseTimeoutMs = detachedExpiryCloseTimeoutMs;
38
+ }
39
+ setDetachedExpiryHandler(handler) {
40
+ this.detachedExpiryHandler = handler;
41
+ }
42
+ assertPrincipal(principal) {
43
+ if (principal.accountId !== this.accountId ||
44
+ this.fencedClients.has(principal.clientId) ||
45
+ (principal.forwarderId !== undefined &&
46
+ this.forwarderConnections.get(principal.forwarderId)?.clientId !== principal.clientId)) {
47
+ throw new BrokerRefusal("unauthorized", "Client is not admitted to this identity cell");
48
+ }
49
+ }
50
+ retireFencedClient(clientId) {
51
+ if ([...this.admissions.values()].some((admission) => admission.principal.clientId === clientId) ||
52
+ [...this.expiredAdmissions.values()].some((principal) => principal.clientId === clientId) ||
53
+ [...this.actors.values()].some((actor) => actor.principal.clientId === clientId))
54
+ return;
55
+ this.fencedClients.delete(clientId);
56
+ }
57
+ claimForwarder(principal) {
58
+ if (principal.accountId !== this.accountId)
59
+ throw new BrokerRefusal("unauthorized", "Client is not admitted to this identity cell");
60
+ const forwarderId = principal.forwarderId;
61
+ if (forwarderId === undefined)
62
+ throw new BrokerRefusal("unauthorized", "Client has no forwarder lineage");
63
+ const holder = this.forwarderConnections.get(forwarderId);
64
+ if (holder === undefined) {
65
+ this.forwarderConnections.set(forwarderId, { clientId: principal.clientId });
66
+ return;
67
+ }
68
+ if (holder.clientId === principal.clientId)
69
+ return;
70
+ if (holder.detach === undefined)
71
+ throw new BrokerRefusal("forwarder_in_use", "Forwarder identity is already active");
72
+ return this.waitForDetach(holder.detach).then(() => this.claimForwarder(principal));
73
+ }
74
+ beginForwarderRelease(principal) {
75
+ const forwarderId = principal.forwarderId;
76
+ if (forwarderId === undefined)
77
+ return;
78
+ const holder = this.forwarderConnections.get(forwarderId);
79
+ if (holder === undefined ||
80
+ holder.clientId !== principal.clientId ||
81
+ holder.detach !== undefined)
82
+ return;
83
+ let resolve;
84
+ const promise = new Promise((settled) => {
85
+ resolve = settled;
86
+ });
87
+ holder.detach = { promise, resolve };
88
+ }
89
+ async waitForDetach(detach) {
90
+ if (detach === undefined)
91
+ return;
92
+ let timeout;
93
+ try {
94
+ await Promise.race([
95
+ detach.promise,
96
+ new Promise((_, reject) => {
97
+ timeout = setTimeout(() => reject(new BrokerRefusal("forwarder_handoff_timeout", "Forwarder cleanup did not complete")), FORWARDER_HANDOFF_TIMEOUT_MS);
98
+ }),
99
+ ]);
100
+ }
101
+ finally {
102
+ if (timeout !== undefined)
103
+ clearTimeout(timeout);
104
+ }
105
+ }
106
+ releaseForwarder(principal) {
107
+ const forwarderId = principal.forwarderId;
108
+ if (forwarderId === undefined)
109
+ return;
110
+ const holder = this.forwarderConnections.get(forwarderId);
111
+ if (holder?.clientId === principal.clientId) {
112
+ this.forwarderConnections.delete(forwarderId);
113
+ holder.detach?.resolve();
114
+ }
115
+ }
116
+ async open(principal, resources, create, cleanupFailedAdmission, orphanFailedAdmission) {
117
+ this.assertPrincipal(principal);
118
+ if (this.actors.size + this.admissions.size >= this.maxSessions) {
119
+ throw new BrokerRefusal("capacity", "Identity cell is at capacity");
120
+ }
121
+ const id = randomUUID();
122
+ const abort = new AbortController();
123
+ this.admissions.set(id, { principal: { ...principal }, abort });
124
+ let port;
125
+ let creating = false;
126
+ try {
127
+ await this.scheduler.reserve(id, resources, abort.signal);
128
+ if (this.expiredAdmissions.has(id))
129
+ throw new BrokerRefusal("cancelled", "Admission reconnect grace expired");
130
+ if (this.admissions.get(id)?.reconnectDeadline === undefined)
131
+ this.assertPrincipal(principal);
132
+ creating = true;
133
+ port = await create(id, abort.signal, (resources) => this.scheduler.expand(id, resources));
134
+ if (this.expiredAdmissions.has(id)) {
135
+ await this.disposeExpiredAdmission(port);
136
+ throw new BrokerRefusal("cancelled", "Admission reconnect grace expired");
137
+ }
138
+ const capability = {
139
+ cellId: this.cellId,
140
+ browserEpoch: this.epoch,
141
+ sessionId: id,
142
+ targetId: port.targetId,
143
+ leaseGeneration: randomUUID(),
144
+ };
145
+ const actor = {
146
+ principal: { ...principal },
147
+ capability,
148
+ port,
149
+ abort,
150
+ state: "active",
151
+ tail: Promise.resolve(),
152
+ replies: new Map(),
153
+ pending: 0,
154
+ };
155
+ this.actors.set(id, actor);
156
+ const reconnectDeadline = this.admissions.get(id)?.reconnectDeadline;
157
+ if (reconnectDeadline !== undefined) {
158
+ actor.state = "detached";
159
+ actor.closeReason = "disconnect";
160
+ actor.reconnectDeadline = reconnectDeadline;
161
+ }
162
+ else if (abort.signal.aborted || this.fencedClients.has(principal.clientId)) {
163
+ await this.closeActor(actor);
164
+ throw new BrokerRefusal("cancelled", "Client disconnected during admission");
165
+ }
166
+ return { ...capability };
167
+ }
168
+ catch (error) {
169
+ if (this.expiredAdmissions.has(id)) {
170
+ if (port === undefined && creating)
171
+ await this.disposeExpiredAdmission(undefined, id, cleanupFailedAdmission, orphanFailedAdmission);
172
+ this.scheduler.release(id);
173
+ }
174
+ else if (port === undefined && !creating)
175
+ this.scheduler.release(id);
176
+ else if (port === undefined) {
177
+ const reconnectDeadline = this.admissions.get(id)?.reconnectDeadline;
178
+ if (reconnectDeadline !== undefined) {
179
+ await this.disposeExpiredAdmission(undefined, id, cleanupFailedAdmission, orphanFailedAdmission);
180
+ this.scheduler.release(id);
181
+ }
182
+ else {
183
+ const failed = {
184
+ principal: { ...principal },
185
+ capability: {
186
+ cellId: this.cellId,
187
+ browserEpoch: this.epoch,
188
+ sessionId: id,
189
+ targetId: "unproven-admission",
190
+ leaseGeneration: randomUUID(),
191
+ },
192
+ port: {
193
+ targetId: "unproven-admission",
194
+ invoke: async () => {
195
+ throw error;
196
+ },
197
+ close: async () => (await cleanupFailedAdmission?.(id)) ?? false,
198
+ orphan: async () => await orphanFailedAdmission?.(id),
199
+ },
200
+ abort,
201
+ state: "quarantined",
202
+ tail: Promise.resolve(),
203
+ replies: new Map(),
204
+ pending: 0,
205
+ reclaimable: false,
206
+ };
207
+ this.actors.set(id, failed);
208
+ }
209
+ }
210
+ const failed = this.actors.get(id);
211
+ if (port === undefined && failed !== undefined && failed.state !== "detached")
212
+ await this.closeActor(failed);
213
+ throw error;
214
+ }
215
+ finally {
216
+ this.admissions.delete(id);
217
+ this.expiredAdmissions.delete(id);
218
+ this.retireFencedClient(principal.clientId);
219
+ }
220
+ }
221
+ resolve(principal, capability) {
222
+ this.assertPrincipal(principal);
223
+ const actor = this.actors.get(capability.sessionId);
224
+ if (actor === undefined ||
225
+ actor.principal.forwarderId !== principal.forwarderId ||
226
+ actor.principal.agentId !== principal.agentId ||
227
+ capability.cellId !== this.cellId ||
228
+ capability.browserEpoch !== this.epoch ||
229
+ capability.leaseGeneration !== actor.capability.leaseGeneration ||
230
+ capability.targetId !== actor.capability.targetId) {
231
+ throw new BrokerRefusal("stale_lease", "Capability does not name an owned live session");
232
+ }
233
+ if (actor.state === "active" && actor.principal.clientId !== principal.clientId)
234
+ throw new BrokerRefusal("forwarder_in_use", "Forwarder identity is already active");
235
+ actor.principal = { ...principal };
236
+ return actor;
237
+ }
238
+ reclaim(principal) {
239
+ this.assertPrincipal(principal);
240
+ const owned = [...this.actors.values()].filter((actor) => actor.reclaimable !== false && actor.principal.forwarderId === principal.forwarderId);
241
+ if (owned.some((actor) => actor.state === "active" && actor.principal.clientId !== principal.clientId))
242
+ throw new BrokerRefusal("forwarder_in_use", "Forwarder identity is already active");
243
+ const now = Date.now();
244
+ const displacedClients = new Set();
245
+ const capabilities = owned.flatMap((actor) => {
246
+ if (actor.state === "detached" && (actor.reconnectDeadline ?? 0) <= now)
247
+ return [];
248
+ displacedClients.add(actor.principal.clientId);
249
+ actor.principal = { ...principal };
250
+ if (actor.state === "detached") {
251
+ actor.abort = new AbortController();
252
+ actor.state = "active";
253
+ delete actor.reconnectDeadline;
254
+ }
255
+ else if (actor.state === "quarantined") {
256
+ // A failed disconnect cleanup can mean an uncertain payment remains in
257
+ // journal custody. Same-lineage status/reconciliation must stay usable,
258
+ // while the journal continues to block every fresh mutation.
259
+ if (actor.closeReason === "disconnect")
260
+ actor.abort = new AbortController();
261
+ actor.state = "active";
262
+ }
263
+ return [{ ...actor.capability }];
264
+ });
265
+ for (const clientId of displacedClients)
266
+ this.retireFencedClient(clientId);
267
+ return capabilities;
268
+ }
269
+ recoverCapability(principal, sessionId) {
270
+ this.assertPrincipal(principal);
271
+ const actor = this.actors.get(sessionId);
272
+ if (actor === undefined ||
273
+ actor.state !== "active" ||
274
+ actor.principal.forwarderId !== principal.forwarderId ||
275
+ actor.principal.agentId !== principal.agentId)
276
+ return undefined;
277
+ const displacedClientId = actor.principal.clientId;
278
+ actor.principal = { ...principal };
279
+ this.retireFencedClient(displacedClientId);
280
+ return { ...actor.capability };
281
+ }
282
+ hasCapability(principal, capability) {
283
+ this.assertPrincipal(principal);
284
+ const actor = this.actors.get(capability.sessionId);
285
+ return (actor !== undefined &&
286
+ actor.state === "active" &&
287
+ actor.principal.clientId === principal.clientId &&
288
+ actor.principal.forwarderId === principal.forwarderId &&
289
+ actor.principal.agentId === principal.agentId &&
290
+ capability.cellId === this.cellId &&
291
+ capability.browserEpoch === this.epoch &&
292
+ capability.leaseGeneration === actor.capability.leaseGeneration &&
293
+ capability.targetId === actor.capability.targetId);
294
+ }
295
+ invoke(principal, capability, requestId, name, args, resources = [], lane) {
296
+ const actor = this.resolve(principal, capability);
297
+ if (actor.state !== "active")
298
+ throw new BrokerRefusal("session_closing", "Session is fenced");
299
+ const input = JSON.stringify([name, args, resources, lane]);
300
+ // Capture this connection lease. A reconnect installs a fresh controller;
301
+ // queued work from the lost socket must stay aborted rather than becoming
302
+ // executable merely because the actor is active again.
303
+ const invocationLease = actor.abort;
304
+ const previous = actor.replies.get(requestId);
305
+ if (previous !== undefined) {
306
+ if (previous.input !== input)
307
+ throw new BrokerRefusal("request_id_reused", "Request ID has different input");
308
+ return previous.result;
309
+ }
310
+ // Never evict deduplication evidence and make an old submit executable again.
311
+ if (actor.replies.size >= 4096 || actor.pending >= 64) {
312
+ throw new BrokerRefusal("capacity", "Session command budget exhausted");
313
+ }
314
+ const previousTail = actor.tail;
315
+ const preparation = actor.port.prepare === undefined
316
+ ? undefined
317
+ : Promise.resolve().then(() => actor.port.prepare(name, args));
318
+ actor.pending += 1;
319
+ const invokePrepared = async (prepared) => {
320
+ if (actor.state !== "active" || invocationLease.signal.aborted) {
321
+ throw new BrokerRefusal("session_closing", "Command fenced before dispatch");
322
+ }
323
+ this.scheduler.expand(actor.capability.sessionId, resources);
324
+ const laneOwner = randomUUID();
325
+ if (lane !== undefined)
326
+ await this.lanes.reserve(laneOwner, [lane], invocationLease.signal);
327
+ try {
328
+ if (invocationLease.signal.aborted)
329
+ throw new BrokerRefusal("cancelled", "Command fenced before dispatch");
330
+ const execute = async () => await actor.port.invoke(name, args, invocationLease.signal, requestId, prepared);
331
+ return lane === "oauth"
332
+ ? await withBrokerIdentityLane(execute, invocationLease.signal)
333
+ : await execute();
334
+ }
335
+ finally {
336
+ if (lane !== undefined)
337
+ this.lanes.release(laneOwner);
338
+ }
339
+ };
340
+ const result = preparation === undefined
341
+ ? previousTail.then(() => invokePrepared(undefined))
342
+ : preparation.then((prepared) => previousTail.then(() => invokePrepared(prepared)), (error) => previousTail.then(() => {
343
+ throw error;
344
+ }));
345
+ const trackedResult = result.catch((error) => {
346
+ if (error instanceof BrokerRefusal && error.code === "browser_lost") {
347
+ actor.state = "quarantined";
348
+ actor.abort.abort();
349
+ }
350
+ throw error;
351
+ });
352
+ actor.tail = trackedResult
353
+ .then(() => undefined, () => undefined)
354
+ .finally(() => {
355
+ actor.pending -= 1;
356
+ });
357
+ actor.replies.set(requestId, { input, result: trackedResult });
358
+ return trackedResult;
359
+ }
360
+ async close(principal, capability) {
361
+ return await this.closeActor(this.resolve(principal, capability), "finish");
362
+ }
363
+ closeActor(actor, reason = "disconnect") {
364
+ if (actor.closePromise !== undefined)
365
+ return actor.closePromise;
366
+ actor.state = "closing";
367
+ actor.closeReason = reason;
368
+ actor.abort.abort();
369
+ actor.closePromise = (async () => {
370
+ await actor.tail.catch(() => undefined);
371
+ const proven = await actor.port.close(reason).catch(() => false);
372
+ if (!proven) {
373
+ actor.state = "quarantined";
374
+ delete actor.closePromise;
375
+ return false;
376
+ }
377
+ this.actors.delete(actor.capability.sessionId);
378
+ this.scheduler.release(actor.capability.sessionId);
379
+ this.retireFencedClient(actor.principal.clientId);
380
+ return true;
381
+ })();
382
+ return actor.closePromise;
383
+ }
384
+ async completeWithinDetachedExpiryTimeout(work) {
385
+ let timeout;
386
+ try {
387
+ return await Promise.race([
388
+ Promise.resolve()
389
+ .then(work)
390
+ .then((value) => ({ completed: true, value }), () => ({ completed: false })),
391
+ new Promise((resolve) => {
392
+ timeout = setTimeout(() => resolve({ completed: false }), this.detachedExpiryCloseTimeoutMs);
393
+ }),
394
+ ]);
395
+ }
396
+ finally {
397
+ if (timeout !== undefined)
398
+ clearTimeout(timeout);
399
+ }
400
+ }
401
+ async disposeExpiredAdmission(port, id, cleanupFailedAdmission, orphanFailedAdmission) {
402
+ const closed = await this.completeWithinDetachedExpiryTimeout(async () => {
403
+ if (port !== undefined)
404
+ return await port.close("expiry");
405
+ return (await cleanupFailedAdmission?.(id ?? "")) ?? false;
406
+ });
407
+ if (closed.completed && closed.value)
408
+ return;
409
+ await this.completeWithinDetachedExpiryTimeout(async () => {
410
+ if (port !== undefined)
411
+ return await port.orphan();
412
+ await orphanFailedAdmission?.(id ?? "");
413
+ });
414
+ }
415
+ async orphanExpiredActor(actor) {
416
+ await this.completeWithinDetachedExpiryTimeout(async () => await actor.port.orphan());
417
+ this.actors.delete(actor.capability.sessionId);
418
+ this.scheduler.release(actor.capability.sessionId);
419
+ this.retireFencedClient(actor.principal.clientId);
420
+ }
421
+ async disposeExpiredActor(actor) {
422
+ const handled = await this.completeWithinDetachedExpiryTimeout(async () => {
423
+ await this.detachedExpiryHandler?.(actor.capability, actor.principal);
424
+ });
425
+ if (!handled.completed) {
426
+ await this.orphanExpiredActor(actor);
427
+ return;
428
+ }
429
+ const closed = await this.completeWithinDetachedExpiryTimeout(async () => await actor.port.close("expiry"));
430
+ if (closed.completed && closed.value) {
431
+ this.actors.delete(actor.capability.sessionId);
432
+ this.scheduler.release(actor.capability.sessionId);
433
+ this.retireFencedClient(actor.principal.clientId);
434
+ return;
435
+ }
436
+ await this.orphanExpiredActor(actor);
437
+ }
438
+ async disconnect(principal) {
439
+ this.assertPrincipal(principal);
440
+ this.fencedClients.add(principal.clientId);
441
+ for (const admission of this.admissions.values()) {
442
+ if (admission.principal.clientId === principal.clientId)
443
+ admission.abort.abort();
444
+ }
445
+ await Promise.all([...this.actors.values()]
446
+ .filter((actor) => actor.principal.clientId === principal.clientId)
447
+ .map(async (actor) => await this.closeActor(actor)));
448
+ this.retireFencedClient(principal.clientId);
449
+ }
450
+ detach(principal, now = Date.now(), graceMs = FORWARDER_RECONNECT_GRACE_MS) {
451
+ this.assertPrincipal(principal);
452
+ this.fencedClients.add(principal.clientId);
453
+ for (const admission of this.admissions.values()) {
454
+ if (admission.principal.clientId !== principal.clientId)
455
+ continue;
456
+ admission.reconnectDeadline = now + graceMs;
457
+ admission.abort.abort();
458
+ }
459
+ for (const actor of this.actors.values()) {
460
+ if (actor.principal.clientId !== principal.clientId || actor.state !== "active")
461
+ continue;
462
+ actor.state = "detached";
463
+ actor.closeReason = "disconnect";
464
+ actor.reconnectDeadline = now + graceMs;
465
+ actor.abort.abort();
466
+ }
467
+ this.retireFencedClient(principal.clientId);
468
+ }
469
+ async expireDetached(now = Date.now()) {
470
+ for (const [id, admission] of this.admissions) {
471
+ if ((admission.reconnectDeadline ?? Number.POSITIVE_INFINITY) > now)
472
+ continue;
473
+ this.expiredAdmissions.set(id, { ...admission.principal });
474
+ admission.abort.abort();
475
+ this.admissions.delete(id);
476
+ this.scheduler.release(id);
477
+ }
478
+ const expired = [...this.actors.values()].filter((actor) => actor.state === "detached" && (actor.reconnectDeadline ?? Number.POSITIVE_INFINITY) <= now);
479
+ await Promise.all(expired.map(async (actor) => {
480
+ actor.state = "closing";
481
+ actor.closeReason = "disconnect";
482
+ actor.abort.abort();
483
+ let timeout;
484
+ try {
485
+ await Promise.race([
486
+ actor.tail.then(() => undefined, () => undefined),
487
+ new Promise((resolve) => {
488
+ timeout = setTimeout(() => resolve(), this.detachedExpiryCloseTimeoutMs);
489
+ }),
490
+ ]);
491
+ }
492
+ finally {
493
+ if (timeout !== undefined)
494
+ clearTimeout(timeout);
495
+ }
496
+ await this.disposeExpiredActor(actor);
497
+ }));
498
+ }
499
+ hasReconnectGrace(now = Date.now()) {
500
+ return ([...this.admissions.values()].some((admission) => (admission.reconnectDeadline ?? 0) > now) ||
501
+ [...this.actors.values()].some((actor) => actor.state === "detached" && (actor.reconnectDeadline ?? 0) > now));
502
+ }
503
+ fenceRuntime() {
504
+ for (const actor of this.actors.values()) {
505
+ actor.state = "quarantined";
506
+ actor.abort.abort();
507
+ }
508
+ for (const admission of this.admissions.values())
509
+ admission.abort.abort();
510
+ }
511
+ async retryQuarantined(shouldClose = () => true) {
512
+ for (const actor of [...this.actors.values()]) {
513
+ if (actor.state !== "quarantined")
514
+ continue;
515
+ if (!(await shouldClose(actor.capability, actor.principal)))
516
+ continue;
517
+ await this.closeActor(actor, actor.closeReason ?? "disconnect");
518
+ }
519
+ }
520
+ inventory() {
521
+ return {
522
+ active: [...this.actors.values()].filter((actor) => actor.state === "active").length,
523
+ quarantined: [...this.actors.values()].filter((actor) => actor.state === "quarantined" || actor.state === "detached").length,
524
+ admitting: this.admissions.size,
525
+ };
526
+ }
527
+ }
528
+ //# sourceMappingURL=authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authority.js","sourceRoot":"","sources":["../../../src/bot/broker/authority.ts"],"names":[],"mappings":"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"}