@masons/runtime-broker 0.2.19 → 0.2.20
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/dist/broker/connector-ws.d.ts +1 -0
- package/dist/broker/connector-ws.d.ts.map +1 -1
- package/dist/broker/connector-ws.js +15 -9
- package/dist/broker/entry.d.ts +8 -0
- package/dist/broker/entry.d.ts.map +1 -1
- package/dist/broker/entry.js +47 -1
- package/dist/broker-client/broker-client.d.ts +15 -1
- package/dist/broker-client/broker-client.d.ts.map +1 -1
- package/dist/broker-client/broker-client.js +206 -47
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -46,6 +46,7 @@ export declare class ConnectorWS {
|
|
|
46
46
|
off<E extends ConnectorWSEvent["event"]>(event: E, listener: ListenerFor<E>): this;
|
|
47
47
|
_emitForTesting(e: ConnectorWSEvent): void;
|
|
48
48
|
private wireForwarders;
|
|
49
|
+
private emitBus;
|
|
49
50
|
}
|
|
50
51
|
export { ConnectorError };
|
|
51
52
|
//# sourceMappingURL=connector-ws.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connector-ws.d.ts","sourceRoot":"","sources":["../../src/broker/connector-ws.ts"],"names":[],"mappings":"AAaA,OAAO,EAAmB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,GAC7D;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAC5C;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GAC5D;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,GAC1D;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GAC5D;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,GACzB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AAEvC,KAAK,WAAW,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,IAAI,CACtD,CAAC,EAAE,OAAO,CAAC,gBAAgB,EAAE;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,KACvC,IAAI,CAAC;AAEV,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;gBAE9B,IAAI,EAAE,kBAAkB;IAMpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,UAAU,IAAI,IAAI;IASlB,IAAI,CACF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,WAAW,SAAS,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,YAAY,CAAC;IAKxB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKlC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKpC,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAKvC,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK3D,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIxD,EAAE,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,EACpC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GACvB,IAAI;IAKP,GAAG,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,EACrC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GACvB,IAAI;IAMS,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAI1D,OAAO,CAAC,cAAc;
|
|
1
|
+
{"version":3,"file":"connector-ws.d.ts","sourceRoot":"","sources":["../../src/broker/connector-ws.ts"],"names":[],"mappings":"AAaA,OAAO,EAAmB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,GAC7D;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAC5C;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GAC5D;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,GAC1D;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GAC5D;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,GACzB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AAEvC,KAAK,WAAW,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,IAAI,CACtD,CAAC,EAAE,OAAO,CAAC,gBAAgB,EAAE;IAAE,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,KACvC,IAAI,CAAC;AAEV,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;gBAE9B,IAAI,EAAE,kBAAkB;IAMpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,UAAU,IAAI,IAAI;IASlB,IAAI,CACF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,WAAW,SAAS,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,YAAY,CAAC;IAKxB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKlC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKpC,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAKvC,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK3D,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIxD,EAAE,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,EACpC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GACvB,IAAI;IAKP,GAAG,CAAC,CAAC,SAAS,gBAAgB,CAAC,OAAO,CAAC,EACrC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GACvB,IAAI;IAMS,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAI1D,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,OAAO;CAMhB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -40,33 +40,39 @@ export class ConnectorWS {
|
|
|
40
40
|
return this;
|
|
41
41
|
}
|
|
42
42
|
_emitForTesting(e) {
|
|
43
|
-
this.
|
|
43
|
+
this.emitBus(e);
|
|
44
44
|
}
|
|
45
45
|
wireForwarders() {
|
|
46
46
|
this.client.on("message_received", (payload) => {
|
|
47
|
-
this.
|
|
47
|
+
this.emitBus({ event: "message_received", payload });
|
|
48
48
|
});
|
|
49
49
|
this.client.on("send_ack", (payload) => {
|
|
50
|
-
this.
|
|
50
|
+
this.emitBus({ event: "send_ack", payload });
|
|
51
51
|
});
|
|
52
52
|
this.client.on("delivery_pending", (payload) => {
|
|
53
|
-
this.
|
|
53
|
+
this.emitBus({ event: "delivery_pending", payload });
|
|
54
54
|
});
|
|
55
55
|
this.client.on("delivery_status", (payload) => {
|
|
56
|
-
this.
|
|
56
|
+
this.emitBus({ event: "delivery_status", payload });
|
|
57
57
|
});
|
|
58
58
|
this.client.on("structured_error", (payload) => {
|
|
59
|
-
this.
|
|
59
|
+
this.emitBus({ event: "structured_error", payload });
|
|
60
60
|
});
|
|
61
61
|
this.client.on("connected", () => {
|
|
62
|
-
this.
|
|
62
|
+
this.emitBus({ event: "connected" });
|
|
63
63
|
});
|
|
64
64
|
this.client.on("disconnected", () => {
|
|
65
|
-
this.
|
|
65
|
+
this.emitBus({ event: "disconnected" });
|
|
66
66
|
});
|
|
67
67
|
this.client.on("error", (err) => {
|
|
68
|
-
this.
|
|
68
|
+
this.emitBus({ event: "error", payload: err });
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
|
+
emitBus(e) {
|
|
72
|
+
if (e.event === "error" && this.bus.listenerCount("error") === 0) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return this.bus.emit(e.event, e);
|
|
76
|
+
}
|
|
71
77
|
}
|
|
72
78
|
export { ConnectorError };
|
package/dist/broker/entry.d.ts
CHANGED
|
@@ -14,6 +14,14 @@ interface RuntimePrincipal {
|
|
|
14
14
|
}
|
|
15
15
|
export declare function resolveCredentialsFromFile(filePath: string, accountId: string, envApiHost: string | undefined): Promise<ResolvedCredentials>;
|
|
16
16
|
export declare function resolveRuntimePrincipal(apiHost: string, runtimeKey: string, fetchImpl?: typeof globalThis.fetch): Promise<RuntimePrincipal>;
|
|
17
|
+
export interface ResolveRuntimePrincipalRetryOptions {
|
|
18
|
+
attempts?: number;
|
|
19
|
+
initialDelayMs?: number;
|
|
20
|
+
maxDelayMs?: number;
|
|
21
|
+
fetchImpl?: typeof globalThis.fetch;
|
|
22
|
+
logger?: BrokerLogger;
|
|
23
|
+
}
|
|
24
|
+
export declare function resolveRuntimePrincipalWithRetry(apiHost: string, runtimeKey: string, opts?: ResolveRuntimePrincipalRetryOptions): Promise<RuntimePrincipal>;
|
|
17
25
|
export declare function buildApiPort(apiHost: string, runtimeKey: string, logger: BrokerLogger): RuntimeEndpointPort;
|
|
18
26
|
export declare function installFatalExitHandlers(logger: BrokerLogger): void;
|
|
19
27
|
export declare function main(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/broker/entry.ts"],"names":[],"mappings":"AAyFA,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;AAEpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAOtE,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAUD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CA8F9B;AA2DD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,OAAO,UAAU,CAAC,KAAwB,GACpD,OAAO,CAAC,gBAAgB,CAAC,CA4B3B;
|
|
1
|
+
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/broker/entry.ts"],"names":[],"mappings":"AAyFA,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;AAEpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAOtE,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAUD,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CA8F9B;AA2DD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,OAAO,UAAU,CAAC,KAAwB,GACpD,OAAO,CAAC,gBAAgB,CAAC,CA4B3B;AAED,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IACpC,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAWD,wBAAsB,gCAAgC,CACpD,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,mCAAwC,GAC7C,OAAO,CAAC,gBAAgB,CAAC,CA4B3B;AAgCD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,GACnB,mBAAmB,CA8IrB;AAyCD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAenE;AAED,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAqG1C"}
|
package/dist/broker/entry.js
CHANGED
|
@@ -123,6 +123,52 @@ export async function resolveRuntimePrincipal(apiHost, runtimeKey, fetchImpl = g
|
|
|
123
123
|
...(typeof raw.carrier === "string" && { carrier: raw.carrier }),
|
|
124
124
|
};
|
|
125
125
|
}
|
|
126
|
+
export async function resolveRuntimePrincipalWithRetry(apiHost, runtimeKey, opts = {}) {
|
|
127
|
+
const attempts = Math.max(1, Math.floor(opts.attempts ?? 5));
|
|
128
|
+
const initialDelayMs = Math.max(0, opts.initialDelayMs ?? 500);
|
|
129
|
+
const maxDelayMs = Math.max(initialDelayMs, opts.maxDelayMs ?? 5_000);
|
|
130
|
+
const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
|
|
131
|
+
let delayMs = initialDelayMs;
|
|
132
|
+
let lastErr;
|
|
133
|
+
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
134
|
+
try {
|
|
135
|
+
return await resolveRuntimePrincipal(apiHost, runtimeKey, fetchImpl);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
lastErr = err;
|
|
139
|
+
if (attempt >= attempts || !isRetryableRuntimePrincipalError(err)) {
|
|
140
|
+
throw err;
|
|
141
|
+
}
|
|
142
|
+
opts.logger?.warn("runtime_principal_resolve_retry", {
|
|
143
|
+
attempt,
|
|
144
|
+
next_attempt: attempt + 1,
|
|
145
|
+
delay_ms: delayMs,
|
|
146
|
+
err: err instanceof Error ? err.message : String(err),
|
|
147
|
+
});
|
|
148
|
+
if (delayMs > 0)
|
|
149
|
+
await sleep(delayMs);
|
|
150
|
+
delayMs = delayMs === 0 ? 0 : Math.min(maxDelayMs, delayMs * 2);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));
|
|
154
|
+
}
|
|
155
|
+
function isRetryableRuntimePrincipalError(err) {
|
|
156
|
+
if (!(err instanceof Error))
|
|
157
|
+
return false;
|
|
158
|
+
const cause = err.cause;
|
|
159
|
+
if (cause instanceof Error)
|
|
160
|
+
return true;
|
|
161
|
+
if (err.name === "TypeError" ||
|
|
162
|
+
err.name === "AbortError" ||
|
|
163
|
+
/fetch failed|network|ECONNRESET|ECONNREFUSED|ETIMEDOUT|EAI_AGAIN/i.test(err.message)) {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
const status = /^whoami failed: (\d+)$/.exec(err.message)?.[1];
|
|
167
|
+
if (!status)
|
|
168
|
+
return false;
|
|
169
|
+
const code = Number(status);
|
|
170
|
+
return code === 408 || code === 429 || code >= 500;
|
|
171
|
+
}
|
|
126
172
|
export function buildApiPort(apiHost, runtimeKey, logger) {
|
|
127
173
|
return {
|
|
128
174
|
async register(params) {
|
|
@@ -245,7 +291,7 @@ export async function main() {
|
|
|
245
291
|
});
|
|
246
292
|
const logger = createBrokerLogger(paths.logDir);
|
|
247
293
|
installFatalExitHandlers(logger);
|
|
248
|
-
const principal = await
|
|
294
|
+
const principal = await resolveRuntimePrincipalWithRetry(creds.apiHost, creds.token, { logger });
|
|
249
295
|
logger.info("broker_entry_starting", {
|
|
250
296
|
accountId: creds.accountId,
|
|
251
297
|
subjectId: principal.subjectId,
|
|
@@ -124,8 +124,12 @@ type Events = {
|
|
|
124
124
|
error: (err: Error) => void;
|
|
125
125
|
};
|
|
126
126
|
export declare class BrokerClient extends EventEmitter {
|
|
127
|
-
private
|
|
127
|
+
private handle;
|
|
128
|
+
private readonly discoverOptions;
|
|
128
129
|
private ws;
|
|
130
|
+
private autoRecoverEnabled;
|
|
131
|
+
private recoverInFlight;
|
|
132
|
+
private connectOptions;
|
|
129
133
|
private heartbeatInterval;
|
|
130
134
|
private heartbeatTimeout;
|
|
131
135
|
private heartbeatMisses;
|
|
@@ -139,6 +143,8 @@ export declare class BrokerClient extends EventEmitter {
|
|
|
139
143
|
private _clientKind;
|
|
140
144
|
private _clientVersion;
|
|
141
145
|
private readonly endpointOwnerTokens;
|
|
146
|
+
private readonly endpointAliases;
|
|
147
|
+
private readonly endpointRegistrations;
|
|
142
148
|
private constructor();
|
|
143
149
|
static discover(opts: BrokerClientDiscoverOptions): Promise<BrokerClient>;
|
|
144
150
|
get spawnedNew(): boolean;
|
|
@@ -148,7 +154,9 @@ export declare class BrokerClient extends EventEmitter {
|
|
|
148
154
|
get serverCapabilities(): Readonly<IpcCapabilities>;
|
|
149
155
|
get serverVersion(): string | null;
|
|
150
156
|
connect(opts: BrokerClientConnectOptions): Promise<InitializeResponseBody>;
|
|
157
|
+
private connectCurrentHandle;
|
|
151
158
|
registerEndpoint(args: RegisterEndpointArgs): Promise<RegisterEndpointOutcome>;
|
|
159
|
+
private registerEndpointOnCurrentBroker;
|
|
152
160
|
send(endpointId: string, to: string, content: string, contentType?: string, metadata?: Record<string, unknown>): Promise<{
|
|
153
161
|
messageId: string;
|
|
154
162
|
status: string;
|
|
@@ -172,7 +180,13 @@ export declare class BrokerClient extends EventEmitter {
|
|
|
172
180
|
emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): boolean;
|
|
173
181
|
emit(event: string | symbol, ...args: unknown[]): boolean;
|
|
174
182
|
private httpJson;
|
|
183
|
+
private recoverBrokerConnection;
|
|
184
|
+
private recoverBrokerConnectionOnce;
|
|
185
|
+
private teardownWsForRecovery;
|
|
186
|
+
private reregisterCachedEndpoints;
|
|
187
|
+
private resolveEndpointId;
|
|
175
188
|
private requireEndpointOwnerToken;
|
|
189
|
+
private emitErrorIfObserved;
|
|
176
190
|
private handleFrame;
|
|
177
191
|
private sendPushAck;
|
|
178
192
|
private startHeartbeat;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broker-client.d.ts","sourceRoot":"","sources":["../../src/broker-client/broker-client.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EACL,KAAK,sBAAsB,EAE3B,KAAK,eAAe,EACrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EACV,8BAA8B,EAC9B,wBAAwB,EACxB,gCAAgC,EAChC,yBAAyB,EACzB,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"broker-client.d.ts","sourceRoot":"","sources":["../../src/broker-client/broker-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import WebSocket from "ws";
|
|
|
3
3
|
import { resolveBrokerPaths } from "../broker/paths.js";
|
|
4
4
|
import { IPC_PROTOCOL_VERSION, } from "../broker/version-handshake.js";
|
|
5
5
|
import { PLUGIN_VERSION } from "../version.js";
|
|
6
|
-
import { discoverBroker } from "./lazy-spawn.js";
|
|
6
|
+
import { discoverBroker, } from "./lazy-spawn.js";
|
|
7
7
|
export class ConnectorUnavailableError extends Error {
|
|
8
8
|
code = "connector_unavailable";
|
|
9
9
|
retryable = true;
|
|
@@ -60,9 +60,29 @@ function normalizeRuntimeAssignmentFailureCategory(category) {
|
|
|
60
60
|
}
|
|
61
61
|
return null;
|
|
62
62
|
}
|
|
63
|
+
function isIpcTransportError(err) {
|
|
64
|
+
if (!(err instanceof Error))
|
|
65
|
+
return false;
|
|
66
|
+
const cause = err.cause;
|
|
67
|
+
if (cause instanceof Error) {
|
|
68
|
+
return isIpcTransportError(cause);
|
|
69
|
+
}
|
|
70
|
+
return (err.name === "TypeError" ||
|
|
71
|
+
err.name === "AbortError" ||
|
|
72
|
+
/fetch failed|ECONNRESET|ECONNREFUSED|ECONNABORTED|EPIPE|ETIMEDOUT|socket|WebSocket/i.test(err.message));
|
|
73
|
+
}
|
|
74
|
+
function cacheRegistrationArgs(args) {
|
|
75
|
+
const cached = { ...args };
|
|
76
|
+
delete cached.spawnToken;
|
|
77
|
+
return cached;
|
|
78
|
+
}
|
|
63
79
|
export class BrokerClient extends EventEmitter {
|
|
64
80
|
handle;
|
|
81
|
+
discoverOptions;
|
|
65
82
|
ws = null;
|
|
83
|
+
autoRecoverEnabled = true;
|
|
84
|
+
recoverInFlight = null;
|
|
85
|
+
connectOptions = null;
|
|
66
86
|
heartbeatInterval = null;
|
|
67
87
|
heartbeatTimeout = null;
|
|
68
88
|
heartbeatMisses = 0;
|
|
@@ -76,15 +96,18 @@ export class BrokerClient extends EventEmitter {
|
|
|
76
96
|
_clientKind = null;
|
|
77
97
|
_clientVersion = null;
|
|
78
98
|
endpointOwnerTokens = new Map();
|
|
79
|
-
|
|
99
|
+
endpointAliases = new Map();
|
|
100
|
+
endpointRegistrations = new Map();
|
|
101
|
+
constructor(handle, discoverOptions) {
|
|
80
102
|
super();
|
|
81
103
|
this.handle = handle;
|
|
104
|
+
this.discoverOptions = discoverOptions;
|
|
82
105
|
}
|
|
83
106
|
static async discover(opts) {
|
|
84
107
|
const paths = resolveBrokerPaths(opts.accountId, opts.runtimeToken, {
|
|
85
108
|
userDataDir: opts.userDataDir,
|
|
86
109
|
});
|
|
87
|
-
const
|
|
110
|
+
const discoverOptions = {
|
|
88
111
|
discoveryFile: paths.discoveryFile,
|
|
89
112
|
timeoutMs: opts.timeoutMs,
|
|
90
113
|
brokerEntry: opts.brokerEntry,
|
|
@@ -97,8 +120,9 @@ export class BrokerClient extends EventEmitter {
|
|
|
97
120
|
: {}),
|
|
98
121
|
...(opts.env ?? {}),
|
|
99
122
|
},
|
|
100
|
-
}
|
|
101
|
-
|
|
123
|
+
};
|
|
124
|
+
const handle = await discoverBroker(discoverOptions);
|
|
125
|
+
return new BrokerClient(handle, discoverOptions);
|
|
102
126
|
}
|
|
103
127
|
get spawnedNew() {
|
|
104
128
|
return this.handle.spawned;
|
|
@@ -122,6 +146,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
122
146
|
if (this.ws) {
|
|
123
147
|
throw new Error("BrokerClient already connected");
|
|
124
148
|
}
|
|
149
|
+
this.autoRecoverEnabled = true;
|
|
150
|
+
this.connectOptions = { ...opts };
|
|
151
|
+
return this.connectCurrentHandle(opts, true);
|
|
152
|
+
}
|
|
153
|
+
async connectCurrentHandle(opts, allowRecover) {
|
|
125
154
|
this.pluginPid = opts.pluginPid;
|
|
126
155
|
this._clientKind = opts.clientKind;
|
|
127
156
|
this._clientVersion = opts.clientVersion;
|
|
@@ -136,12 +165,21 @@ export class BrokerClient extends EventEmitter {
|
|
|
136
165
|
.filter(([, enabled]) => enabled === true)
|
|
137
166
|
.map(([name]) => name)
|
|
138
167
|
.join(",");
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
168
|
+
let initRes;
|
|
169
|
+
try {
|
|
170
|
+
initRes = await this.httpJson("POST", "/v1/initialize", {
|
|
171
|
+
client_protocol_version: IPC_PROTOCOL_VERSION,
|
|
172
|
+
client_kind: opts.clientKind,
|
|
173
|
+
client_version: opts.clientVersion,
|
|
174
|
+
capabilities: clientCapabilities,
|
|
175
|
+
}, { allowRecover: false });
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
if (!allowRecover || !isIpcTransportError(err))
|
|
179
|
+
throw err;
|
|
180
|
+
await this.recoverBrokerConnection("initialize_failed", false);
|
|
181
|
+
return this.connectCurrentHandle(opts, false);
|
|
182
|
+
}
|
|
145
183
|
this._sessionId = initRes.session_id;
|
|
146
184
|
this._serverCapabilities = initRes.server_capabilities;
|
|
147
185
|
this._serverVersion =
|
|
@@ -158,26 +196,59 @@ export class BrokerClient extends EventEmitter {
|
|
|
158
196
|
},
|
|
159
197
|
});
|
|
160
198
|
this.ws = ws;
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
199
|
+
try {
|
|
200
|
+
await new Promise((resolve, reject) => {
|
|
201
|
+
const onOpen = () => {
|
|
202
|
+
ws.off("error", onError);
|
|
203
|
+
resolve();
|
|
204
|
+
};
|
|
205
|
+
const onError = (err) => {
|
|
206
|
+
ws.off("open", onOpen);
|
|
207
|
+
reject(err);
|
|
208
|
+
};
|
|
209
|
+
ws.once("open", onOpen);
|
|
210
|
+
ws.once("error", onError);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
this.ws = null;
|
|
215
|
+
try {
|
|
216
|
+
ws.close();
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
}
|
|
220
|
+
if (!allowRecover || !isIpcTransportError(err))
|
|
221
|
+
throw err;
|
|
222
|
+
await this.recoverBrokerConnection("stream_open_failed", false);
|
|
223
|
+
return this.connectCurrentHandle(opts, false);
|
|
224
|
+
}
|
|
225
|
+
ws.on("message", (data) => {
|
|
226
|
+
if (this.ws !== ws)
|
|
227
|
+
return;
|
|
228
|
+
this.handleFrame(data.toString());
|
|
229
|
+
});
|
|
230
|
+
ws.on("pong", () => {
|
|
231
|
+
if (this.ws !== ws)
|
|
232
|
+
return;
|
|
233
|
+
this.markHeartbeatAlive();
|
|
172
234
|
});
|
|
173
|
-
ws.on("message", (data) => this.handleFrame(data.toString()));
|
|
174
|
-
ws.on("pong", () => this.markHeartbeatAlive());
|
|
175
235
|
ws.on("close", () => {
|
|
236
|
+
if (this.ws !== ws)
|
|
237
|
+
return;
|
|
176
238
|
this.clearHeartbeat();
|
|
177
239
|
this.ws = null;
|
|
178
240
|
this.emit("disconnected");
|
|
241
|
+
setTimeout(() => {
|
|
242
|
+
if (!this.autoRecoverEnabled || this.connectOptions === null)
|
|
243
|
+
return;
|
|
244
|
+
void this.recoverBrokerConnection("stream_closed", true).catch((err) => this.emitErrorIfObserved(err instanceof Error ? err : new Error(String(err))));
|
|
245
|
+
}, 0);
|
|
246
|
+
});
|
|
247
|
+
ws.on("error", (err) => {
|
|
248
|
+
if (this.ws !== ws)
|
|
249
|
+
return;
|
|
250
|
+
this.emitErrorIfObserved(err);
|
|
179
251
|
});
|
|
180
|
-
ws.on("error", (err) => this.emit("error", err));
|
|
181
252
|
this.startHeartbeat(opts.heartbeatIntervalMs ?? 30_000);
|
|
182
253
|
return initRes;
|
|
183
254
|
}
|
|
@@ -185,6 +256,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
185
256
|
if (this.pluginPid === null) {
|
|
186
257
|
throw new Error("BrokerClient.connect must be called before registerEndpoint");
|
|
187
258
|
}
|
|
259
|
+
const outcome = await this.registerEndpointOnCurrentBroker(args, true);
|
|
260
|
+
this.endpointRegistrations.set(outcome.endpoint_id, cacheRegistrationArgs(args));
|
|
261
|
+
return outcome;
|
|
262
|
+
}
|
|
263
|
+
async registerEndpointOnCurrentBroker(args, allowRecover) {
|
|
188
264
|
const outcome = await this.httpJson("POST", "/v1/endpoint/register", {
|
|
189
265
|
agent_id: args.agentId,
|
|
190
266
|
plugin_pid: this.pluginPid,
|
|
@@ -200,15 +276,16 @@ export class BrokerClient extends EventEmitter {
|
|
|
200
276
|
execution_surface: args.executionSurface,
|
|
201
277
|
background_exchange_mode: args.backgroundExchangeMode,
|
|
202
278
|
spawn_token: args.spawnToken,
|
|
203
|
-
});
|
|
279
|
+
}, { allowRecover });
|
|
204
280
|
if (typeof outcome.endpoint_owner_token === "string") {
|
|
205
281
|
this.endpointOwnerTokens.set(outcome.endpoint_id, outcome.endpoint_owner_token);
|
|
206
282
|
}
|
|
207
283
|
return outcome;
|
|
208
284
|
}
|
|
209
285
|
async send(endpointId, to, content, contentType = "text", metadata) {
|
|
286
|
+
const resolvedEndpointId = this.resolveEndpointId(endpointId);
|
|
210
287
|
return this.httpJson("POST", "/v1/send", {
|
|
211
|
-
endpoint_id:
|
|
288
|
+
endpoint_id: resolvedEndpointId,
|
|
212
289
|
to,
|
|
213
290
|
content,
|
|
214
291
|
contentType,
|
|
@@ -219,10 +296,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
219
296
|
if (this.pluginPid === null) {
|
|
220
297
|
throw new Error("BrokerClient.connect must be called before sendRuntimeAssignmentReply");
|
|
221
298
|
}
|
|
299
|
+
const endpointId = this.resolveEndpointId(args.endpointId);
|
|
222
300
|
return this.httpJson("POST", "/v1/runtime/assignment-reply", {
|
|
223
|
-
endpoint_id:
|
|
301
|
+
endpoint_id: endpointId,
|
|
224
302
|
plugin_pid: this.pluginPid,
|
|
225
|
-
endpoint_owner_token: this.requireEndpointOwnerToken(
|
|
303
|
+
endpoint_owner_token: this.requireEndpointOwnerToken(endpointId),
|
|
226
304
|
source_message_id: args.sourceMessageId,
|
|
227
305
|
assignment_id: args.assignmentId,
|
|
228
306
|
reply_request_id: args.replyRequestId,
|
|
@@ -234,10 +312,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
234
312
|
if (this.pluginPid === null) {
|
|
235
313
|
throw new Error("BrokerClient.connect must be called before claimRuntimeAssignment");
|
|
236
314
|
}
|
|
315
|
+
const endpointId = this.resolveEndpointId(args.endpointId);
|
|
237
316
|
return this.httpJson("POST", "/v1/runtime/assignment-claim", {
|
|
238
|
-
endpoint_id:
|
|
317
|
+
endpoint_id: endpointId,
|
|
239
318
|
plugin_pid: this.pluginPid,
|
|
240
|
-
endpoint_owner_token: this.requireEndpointOwnerToken(
|
|
319
|
+
endpoint_owner_token: this.requireEndpointOwnerToken(endpointId),
|
|
241
320
|
undispatched_id: args.undispatchedId,
|
|
242
321
|
...(args.recoverExisting === true && { recover_existing: true }),
|
|
243
322
|
});
|
|
@@ -247,7 +326,7 @@ export class BrokerClient extends EventEmitter {
|
|
|
247
326
|
throw new Error("BrokerClient.connect must be called before listUndispatched");
|
|
248
327
|
}
|
|
249
328
|
const path = args?.endpointId
|
|
250
|
-
? `/v1/undispatched?endpoint_id=${encodeURIComponent(args.endpointId)}`
|
|
329
|
+
? `/v1/undispatched?endpoint_id=${encodeURIComponent(this.resolveEndpointId(args.endpointId))}`
|
|
251
330
|
: "/v1/undispatched";
|
|
252
331
|
const res = await this.httpJson("GET", path);
|
|
253
332
|
return res.items ?? [];
|
|
@@ -256,10 +335,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
256
335
|
if (this.pluginPid === null) {
|
|
257
336
|
throw new Error("BrokerClient.connect must be called before reportRuntimeProcessingState");
|
|
258
337
|
}
|
|
338
|
+
const endpointId = this.resolveEndpointId(args.endpointId);
|
|
259
339
|
await this.httpJson("POST", "/v1/runtime/processing-state", {
|
|
260
|
-
endpoint_id:
|
|
340
|
+
endpoint_id: endpointId,
|
|
261
341
|
plugin_pid: this.pluginPid,
|
|
262
|
-
endpoint_owner_token: this.requireEndpointOwnerToken(
|
|
342
|
+
endpoint_owner_token: this.requireEndpointOwnerToken(endpointId),
|
|
263
343
|
source_message_id: args.sourceMessageId,
|
|
264
344
|
assignment_id: args.assignmentId,
|
|
265
345
|
state_event_id: args.stateEventId,
|
|
@@ -275,9 +355,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
275
355
|
});
|
|
276
356
|
}
|
|
277
357
|
async close(endpointId) {
|
|
358
|
+
this.autoRecoverEnabled = false;
|
|
278
359
|
if (endpointId) {
|
|
279
360
|
try {
|
|
280
|
-
|
|
361
|
+
const resolvedEndpointId = this.resolveEndpointId(endpointId);
|
|
362
|
+
await this.httpJson("DELETE", `/v1/endpoint/${encodeURIComponent(resolvedEndpointId)}`, undefined, { allowRecover: false });
|
|
281
363
|
}
|
|
282
364
|
catch {
|
|
283
365
|
}
|
|
@@ -302,18 +384,27 @@ export class BrokerClient extends EventEmitter {
|
|
|
302
384
|
emit(event, ...args) {
|
|
303
385
|
return super.emit(event, ...args);
|
|
304
386
|
}
|
|
305
|
-
async httpJson(method, path, body) {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
387
|
+
async httpJson(method, path, body, opts = {}) {
|
|
388
|
+
let res;
|
|
389
|
+
try {
|
|
390
|
+
res = await fetch(`${this.handle.record.ipcUrl}${path}`, {
|
|
391
|
+
method,
|
|
392
|
+
headers: {
|
|
393
|
+
Authorization: `Bearer ${this.handle.record.bearerToken}`,
|
|
394
|
+
...(this.pluginPid !== null
|
|
395
|
+
? { "x-plugin-pid": String(this.pluginPid) }
|
|
396
|
+
: {}),
|
|
397
|
+
...(body ? { "Content-Type": "application/json" } : {}),
|
|
398
|
+
},
|
|
399
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
catch (err) {
|
|
403
|
+
if (opts.allowRecover !== false && isIpcTransportError(err)) {
|
|
404
|
+
await this.recoverBrokerConnection("ipc_fetch_failed", true);
|
|
405
|
+
}
|
|
406
|
+
throw err;
|
|
407
|
+
}
|
|
317
408
|
if (!res.ok) {
|
|
318
409
|
const errText = await res.text().catch(() => "");
|
|
319
410
|
const parsed = safeJsonParse(errText);
|
|
@@ -375,6 +466,69 @@ export class BrokerClient extends EventEmitter {
|
|
|
375
466
|
}
|
|
376
467
|
return (await res.json());
|
|
377
468
|
}
|
|
469
|
+
async recoverBrokerConnection(reason, reconnect) {
|
|
470
|
+
if (this.recoverInFlight)
|
|
471
|
+
return this.recoverInFlight;
|
|
472
|
+
this.recoverInFlight = this.recoverBrokerConnectionOnce(reason, reconnect).finally(() => {
|
|
473
|
+
this.recoverInFlight = null;
|
|
474
|
+
});
|
|
475
|
+
return this.recoverInFlight;
|
|
476
|
+
}
|
|
477
|
+
async recoverBrokerConnectionOnce(_reason, reconnect) {
|
|
478
|
+
const previousAutoRecover = this.autoRecoverEnabled;
|
|
479
|
+
this.autoRecoverEnabled = false;
|
|
480
|
+
try {
|
|
481
|
+
this.teardownWsForRecovery();
|
|
482
|
+
const handle = await discoverBroker(this.discoverOptions);
|
|
483
|
+
this.handle = handle;
|
|
484
|
+
this._sessionId = null;
|
|
485
|
+
this._serverCapabilities = {};
|
|
486
|
+
this._serverVersion = null;
|
|
487
|
+
this._networkPresence = null;
|
|
488
|
+
this.endpointOwnerTokens.clear();
|
|
489
|
+
const connectOptions = this.connectOptions;
|
|
490
|
+
if (!reconnect || connectOptions === null)
|
|
491
|
+
return;
|
|
492
|
+
await this.connectCurrentHandle(connectOptions, false);
|
|
493
|
+
await this.reregisterCachedEndpoints();
|
|
494
|
+
}
|
|
495
|
+
finally {
|
|
496
|
+
this.autoRecoverEnabled = previousAutoRecover;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
teardownWsForRecovery() {
|
|
500
|
+
this.clearHeartbeat();
|
|
501
|
+
const ws = this.ws;
|
|
502
|
+
this.ws = null;
|
|
503
|
+
if (ws &&
|
|
504
|
+
(ws.readyState === WebSocket.OPEN ||
|
|
505
|
+
ws.readyState === WebSocket.CONNECTING)) {
|
|
506
|
+
try {
|
|
507
|
+
ws.close(1012, "broker_recover");
|
|
508
|
+
}
|
|
509
|
+
catch {
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
async reregisterCachedEndpoints() {
|
|
514
|
+
const entries = Array.from(this.endpointRegistrations.entries()).filter(([endpointId]) => this.resolveEndpointId(endpointId) === endpointId);
|
|
515
|
+
for (const [previousEndpointId, args] of entries) {
|
|
516
|
+
const outcome = await this.registerEndpointOnCurrentBroker(args, false);
|
|
517
|
+
this.endpointRegistrations.set(outcome.endpoint_id, cacheRegistrationArgs(args));
|
|
518
|
+
if (outcome.endpoint_id !== previousEndpointId) {
|
|
519
|
+
this.endpointAliases.set(previousEndpointId, outcome.endpoint_id);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
resolveEndpointId(endpointId) {
|
|
524
|
+
let current = endpointId;
|
|
525
|
+
const seen = new Set();
|
|
526
|
+
while (this.endpointAliases.has(current) && !seen.has(current)) {
|
|
527
|
+
seen.add(current);
|
|
528
|
+
current = this.endpointAliases.get(current) ?? current;
|
|
529
|
+
}
|
|
530
|
+
return current;
|
|
531
|
+
}
|
|
378
532
|
requireEndpointOwnerToken(endpointId) {
|
|
379
533
|
const token = this.endpointOwnerTokens.get(endpointId);
|
|
380
534
|
if (!token) {
|
|
@@ -382,6 +536,11 @@ export class BrokerClient extends EventEmitter {
|
|
|
382
536
|
}
|
|
383
537
|
return token;
|
|
384
538
|
}
|
|
539
|
+
emitErrorIfObserved(err) {
|
|
540
|
+
if (this.listenerCount("error") === 0)
|
|
541
|
+
return false;
|
|
542
|
+
return this.emit("error", err);
|
|
543
|
+
}
|
|
385
544
|
handleFrame(raw) {
|
|
386
545
|
let parsed;
|
|
387
546
|
try {
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const PLUGIN_VERSION = "0.2.
|
|
1
|
+
export declare const PLUGIN_VERSION = "0.2.20";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PLUGIN_VERSION = "0.2.
|
|
1
|
+
export const PLUGIN_VERSION = "0.2.20";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masons/runtime-broker",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.20",
|
|
4
4
|
"description": "MASONS Runtime Broker — local daemon and BrokerClient SDK for multi-session agent runtime coordination.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "MASONS.ai <hello@masons.ai> (https://masons.ai)",
|