@masons/runtime-broker 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/broker/broker-daemon.d.ts.map +1 -1
- package/dist/broker/broker-daemon.js +103 -4
- package/dist/broker/entry.d.ts +7 -0
- package/dist/broker/entry.d.ts.map +1 -1
- package/dist/broker/entry.js +38 -3
- package/dist/broker/ipc-server.d.ts +9 -1
- package/dist/broker/ipc-server.d.ts.map +1 -1
- package/dist/broker/ipc-server.js +30 -6
- package/dist/broker/runtime-endpoint-port.d.ts +2 -1
- package/dist/broker/runtime-endpoint-port.d.ts.map +1 -1
- package/dist/broker/version-handshake.d.ts +5 -1
- package/dist/broker/version-handshake.d.ts.map +1 -1
- package/dist/broker/version-handshake.js +2 -1
- package/dist/broker-client/broker-client.d.ts +13 -0
- package/dist/broker-client/broker-client.d.ts.map +1 -1
- package/dist/broker-client/broker-client.js +54 -0
- package/dist/runtime-endpoint-client.d.ts +7 -0
- package/dist/runtime-endpoint-client.d.ts.map +1 -1
- package/dist/runtime-endpoint-client.js +9 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +12 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broker-daemon.d.ts","sourceRoot":"","sources":["../../src/broker/broker-daemon.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAqB,KAAK,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"broker-daemon.d.ts","sourceRoot":"","sources":["../../src/broker/broker-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { spawn as spawnChild } from "node:child_process";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { basename } from "node:path";
|
|
3
4
|
import { createControlEventDispatcher, } from "./control-event-dispatcher.js";
|
|
4
5
|
import { deleteDiscoveryFile, mintBearerToken, writeDiscoveryFile, } from "./discovery-file.js";
|
|
5
6
|
import { EndpointRegistry } from "./endpoint-registry.js";
|
|
@@ -18,6 +19,19 @@ import { createTransitionStateRetryQueue } from "./transition-state-retry-queue.
|
|
|
18
19
|
import { CONTENT_PREVIEW_MAX_CODEPOINTS, truncateContentPreview, } from "./undispatched-changed-event-types.js";
|
|
19
20
|
import { createUndispatchedChangedEmitter, postUndispatchedChangedViaPort, } from "./undispatched-emitter.js";
|
|
20
21
|
import { createUndispatchedInbox, } from "./undispatched-inbox.js";
|
|
22
|
+
function derivePublicDisplayLabel(body) {
|
|
23
|
+
const parts = [
|
|
24
|
+
body.kind,
|
|
25
|
+
body.workspace ? basename(body.workspace) || body.workspace : null,
|
|
26
|
+
body.tracking_ref ?? null,
|
|
27
|
+
].flatMap((part) => {
|
|
28
|
+
const value = part?.trim();
|
|
29
|
+
return value ? [value] : [];
|
|
30
|
+
});
|
|
31
|
+
return parts.length > 0
|
|
32
|
+
? parts.join(" · ")
|
|
33
|
+
: `${body.kind}-${String(body.plugin_pid).slice(-4)}`;
|
|
34
|
+
}
|
|
21
35
|
export async function startBrokerDaemon(opts) {
|
|
22
36
|
const { paths, asNodeId: _asNodeIdReservedForA3, connector, apiPort, logger, closedEndpointLookup, livenessProbe = defaultIsPluginAlive, spawnDriverRegistry, spawnFn = spawnChild, servicesEventClientFactory, } = opts;
|
|
23
37
|
const graceMs = opts.graceMs ?? DEFAULT_GRACE_MS;
|
|
@@ -99,6 +113,7 @@ export async function startBrokerDaemon(opts) {
|
|
|
99
113
|
return;
|
|
100
114
|
replyCorrelationCache.record(endpoint_id, c);
|
|
101
115
|
};
|
|
116
|
+
const channels = new Map();
|
|
102
117
|
let networkPresence = "offline";
|
|
103
118
|
let presenceGraceTimer;
|
|
104
119
|
const applyPresenceTransition = (event) => {
|
|
@@ -136,6 +151,15 @@ export async function startBrokerDaemon(opts) {
|
|
|
136
151
|
ts: Date.now(),
|
|
137
152
|
reason: effect.reason,
|
|
138
153
|
});
|
|
154
|
+
if (channels.size > 0) {
|
|
155
|
+
for (const ws of channels.values()) {
|
|
156
|
+
pushToPlugin(ws, {
|
|
157
|
+
event: "presence_changed",
|
|
158
|
+
presence: effect.presence,
|
|
159
|
+
...(effect.reason ? { reason: effect.reason } : {}),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
139
163
|
if (effect.presence === "online") {
|
|
140
164
|
void retryQueue.flush(async (entry) => {
|
|
141
165
|
await apiPort.transitionState(entry.endpoint_id, entry.params);
|
|
@@ -152,9 +176,54 @@ export async function startBrokerDaemon(opts) {
|
|
|
152
176
|
connector.on("disconnected", () => {
|
|
153
177
|
applyPresenceTransition({ type: "connector_disconnected" });
|
|
154
178
|
});
|
|
155
|
-
const channels = new Map();
|
|
156
179
|
const wsEndpoints = new WeakMap();
|
|
180
|
+
const heartbeatTimers = new Map();
|
|
157
181
|
const displacedWs = new WeakSet();
|
|
182
|
+
const clearHeartbeat = (endpoint_id) => {
|
|
183
|
+
const timer = heartbeatTimers.get(endpoint_id);
|
|
184
|
+
if (!timer)
|
|
185
|
+
return;
|
|
186
|
+
clearTimeout(timer);
|
|
187
|
+
heartbeatTimers.delete(endpoint_id);
|
|
188
|
+
};
|
|
189
|
+
const clearAllHeartbeats = () => {
|
|
190
|
+
for (const endpoint_id of heartbeatTimers.keys()) {
|
|
191
|
+
clearHeartbeat(endpoint_id);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
const scheduleHeartbeat = (endpoint_id, heartbeatAfterSeconds) => {
|
|
195
|
+
clearHeartbeat(endpoint_id);
|
|
196
|
+
if (!Number.isFinite(heartbeatAfterSeconds) || heartbeatAfterSeconds <= 0) {
|
|
197
|
+
logger.warn("endpoint_heartbeat_not_scheduled", {
|
|
198
|
+
endpoint_id,
|
|
199
|
+
heartbeat_after_seconds: heartbeatAfterSeconds,
|
|
200
|
+
});
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const delayMs = Math.max(1, Math.floor(heartbeatAfterSeconds * 1000));
|
|
204
|
+
const timer = setTimeout(() => {
|
|
205
|
+
heartbeatTimers.delete(endpoint_id);
|
|
206
|
+
if (!registry.get(endpoint_id))
|
|
207
|
+
return;
|
|
208
|
+
void apiPort
|
|
209
|
+
.heartbeat(endpoint_id)
|
|
210
|
+
.catch((err) => {
|
|
211
|
+
logger.warn("endpoint_heartbeat_failed", {
|
|
212
|
+
endpoint_id,
|
|
213
|
+
err: err instanceof Error ? err.message : String(err),
|
|
214
|
+
});
|
|
215
|
+
})
|
|
216
|
+
.finally(() => {
|
|
217
|
+
if (registry.get(endpoint_id)) {
|
|
218
|
+
scheduleHeartbeat(endpoint_id, heartbeatAfterSeconds);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}, delayMs);
|
|
222
|
+
const maybeUnref = timer;
|
|
223
|
+
if (typeof maybeUnref.unref === "function")
|
|
224
|
+
maybeUnref.unref();
|
|
225
|
+
heartbeatTimers.set(endpoint_id, timer);
|
|
226
|
+
};
|
|
158
227
|
const emitTransition = (endpoint_id, state, reason) => {
|
|
159
228
|
const params = {
|
|
160
229
|
state,
|
|
@@ -225,6 +294,7 @@ export async function startBrokerDaemon(opts) {
|
|
|
225
294
|
reconnectingBuffers.cleanup(endpoint_id);
|
|
226
295
|
break;
|
|
227
296
|
case "remove_from_registry":
|
|
297
|
+
clearHeartbeat(endpoint_id);
|
|
228
298
|
registry.unregister(endpoint_id);
|
|
229
299
|
replyCorrelationCache.forgetEndpoint(endpoint_id);
|
|
230
300
|
void apiPort.unregister(endpoint_id).catch(() => {
|
|
@@ -394,12 +464,13 @@ export async function startBrokerDaemon(opts) {
|
|
|
394
464
|
const apiResp = await apiPort.register({
|
|
395
465
|
runtime_kind: body.kind,
|
|
396
466
|
endpoint_nonce: randomUUID(),
|
|
397
|
-
display_label: body
|
|
398
|
-
`${body.kind}-${String(body.plugin_pid).slice(-4)}`,
|
|
467
|
+
display_label: derivePublicDisplayLabel(body),
|
|
399
468
|
workspace: body.workspace
|
|
400
469
|
? { root: body.workspace, cwd: body.workspace }
|
|
401
470
|
: undefined,
|
|
402
471
|
tracking_ref: body.tracking_ref,
|
|
472
|
+
session_name: body.session_name,
|
|
473
|
+
task_hint: body.task_hint,
|
|
403
474
|
});
|
|
404
475
|
registry.register({
|
|
405
476
|
endpoint_id: apiResp.endpoint_id,
|
|
@@ -422,6 +493,7 @@ export async function startBrokerDaemon(opts) {
|
|
|
422
493
|
}
|
|
423
494
|
bound.add(apiResp.endpoint_id);
|
|
424
495
|
emitTransition(apiResp.endpoint_id, "active", "register");
|
|
496
|
+
scheduleHeartbeat(apiResp.endpoint_id, apiResp.heartbeat_after_seconds);
|
|
425
497
|
if (typeof body.spawn_token === "string") {
|
|
426
498
|
const pending = spawnCorrelation.consume(body.spawn_token);
|
|
427
499
|
if (pending) {
|
|
@@ -508,7 +580,19 @@ export async function startBrokerDaemon(opts) {
|
|
|
508
580
|
source_endpoint_id: body.endpoint_id,
|
|
509
581
|
require_live: body.require_live ?? false,
|
|
510
582
|
};
|
|
511
|
-
|
|
583
|
+
let ack;
|
|
584
|
+
try {
|
|
585
|
+
ack = await connector.send(body.to, body.content, body.contentType ?? "text", metadata);
|
|
586
|
+
}
|
|
587
|
+
catch (err) {
|
|
588
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
589
|
+
if (msg === "WebSocket not connected" || msg === "SEND_ACK timeout") {
|
|
590
|
+
throw new BrokerHttpError(503, "connector_unavailable", msg, {
|
|
591
|
+
retryable: true,
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
throw err;
|
|
595
|
+
}
|
|
512
596
|
return { messageId: ack.messageId, status: ack.status };
|
|
513
597
|
},
|
|
514
598
|
async reattachEndpoint(endpoint_id, plugin_pid, _ipcWsHint) {
|
|
@@ -589,6 +673,19 @@ export async function startBrokerDaemon(opts) {
|
|
|
589
673
|
length: result.effective.length,
|
|
590
674
|
max: TASK_HINT_MAX_LENGTH,
|
|
591
675
|
});
|
|
676
|
+
if (apiPort.updateDisplayMetadata) {
|
|
677
|
+
try {
|
|
678
|
+
await apiPort.updateDisplayMetadata(body.endpoint_id, {
|
|
679
|
+
task_hint: result.effective,
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
catch (err) {
|
|
683
|
+
logger.warn("task_hint_projection_failed", {
|
|
684
|
+
endpoint_id: body.endpoint_id,
|
|
685
|
+
err: err instanceof Error ? err.message : String(err),
|
|
686
|
+
});
|
|
687
|
+
}
|
|
688
|
+
}
|
|
592
689
|
},
|
|
593
690
|
};
|
|
594
691
|
const bearerToken = mintBearerToken();
|
|
@@ -596,6 +693,7 @@ export async function startBrokerDaemon(opts) {
|
|
|
596
693
|
bearerToken,
|
|
597
694
|
handlers,
|
|
598
695
|
logger,
|
|
696
|
+
getNetworkPresence: () => networkPresence,
|
|
599
697
|
onChannelOpened: (plugin_pid, ws) => {
|
|
600
698
|
const prior = channels.get(plugin_pid);
|
|
601
699
|
if (prior && prior !== ws) {
|
|
@@ -762,6 +860,7 @@ export async function startBrokerDaemon(opts) {
|
|
|
762
860
|
}
|
|
763
861
|
}
|
|
764
862
|
graceTimers.cancelAll();
|
|
863
|
+
clearAllHeartbeats();
|
|
765
864
|
spawnCorrelation.cancelAll();
|
|
766
865
|
if (presenceGraceTimer) {
|
|
767
866
|
clearTimeout(presenceGraceTimer);
|
package/dist/broker/entry.d.ts
CHANGED
|
@@ -6,7 +6,14 @@ interface ResolvedCredentials {
|
|
|
6
6
|
token: string;
|
|
7
7
|
apiHost: string;
|
|
8
8
|
}
|
|
9
|
+
interface RuntimePrincipal {
|
|
10
|
+
ownerUserId?: string;
|
|
11
|
+
subjectType: string;
|
|
12
|
+
subjectId: string;
|
|
13
|
+
carrier?: string;
|
|
14
|
+
}
|
|
9
15
|
export declare function resolveCredentialsFromFile(filePath: string, accountId: string, envApiHost: string | undefined): Promise<ResolvedCredentials>;
|
|
16
|
+
export declare function resolveRuntimePrincipal(apiHost: string, runtimeKey: string, fetchImpl?: typeof globalThis.fetch): Promise<RuntimePrincipal>;
|
|
10
17
|
export declare function buildApiPort(apiHost: string, runtimeKey: string, logger: BrokerLogger): RuntimeEndpointPort;
|
|
11
18
|
export declare function main(): Promise<void>;
|
|
12
19
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/broker/entry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/broker/entry.ts"],"names":[],"mappings":"AAgFA,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;AAEpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAMtE,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;AAaD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,GACnB,mBAAmB,CAgHrB;AAYD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAgG1C"}
|
package/dist/broker/entry.js
CHANGED
|
@@ -2,7 +2,7 @@ import { readFile } from "node:fs/promises";
|
|
|
2
2
|
import { pathToFileURL } from "node:url";
|
|
3
3
|
import { readConfig } from "../config-fs.js";
|
|
4
4
|
import { DEFAULT_API_HOST } from "../platform-client.js";
|
|
5
|
-
import { emitRuntimeNetworkPresenceChanged, emitRuntimeUndispatchedChanged, heartbeatRuntimeEndpoint, registerRuntimeEndpoint, transitionRuntimeEndpointState, unregisterRuntimeEndpoint, } from "../runtime-endpoint-client.js";
|
|
5
|
+
import { emitRuntimeNetworkPresenceChanged, emitRuntimeUndispatchedChanged, heartbeatRuntimeEndpoint, registerRuntimeEndpoint, transitionRuntimeEndpointState, unregisterRuntimeEndpoint, updateRuntimeEndpointDisplayMetadata, } from "../runtime-endpoint-client.js";
|
|
6
6
|
import { startBrokerDaemon } from "./broker-daemon.js";
|
|
7
7
|
import { ClaudeCodeSpawnDriver } from "./claude-code-spawn-driver.js";
|
|
8
8
|
import { CodexSpawnDriverStub } from "./codex-spawn-driver-stub.js";
|
|
@@ -92,6 +92,36 @@ async function resolveCredentials(accountId, envApiHost) {
|
|
|
92
92
|
}
|
|
93
93
|
return resolveCredentialsFromOpenClawConfig(accountId, envApiHost);
|
|
94
94
|
}
|
|
95
|
+
function apiBaseUrl(apiHost) {
|
|
96
|
+
const trimmed = apiHost.replace(/\/+$/, "");
|
|
97
|
+
const origin = /^https?:\/\//.test(trimmed) ? trimmed : `https://${trimmed}`;
|
|
98
|
+
return `${origin}/v1`;
|
|
99
|
+
}
|
|
100
|
+
export async function resolveRuntimePrincipal(apiHost, runtimeKey, fetchImpl = globalThis.fetch) {
|
|
101
|
+
const res = await fetchImpl(`${apiBaseUrl(apiHost)}/whoami`, {
|
|
102
|
+
headers: { Authorization: `Bearer ${runtimeKey}` },
|
|
103
|
+
});
|
|
104
|
+
if (!res.ok) {
|
|
105
|
+
throw new Error(`whoami failed: ${res.status}`);
|
|
106
|
+
}
|
|
107
|
+
const raw = (await res.json());
|
|
108
|
+
const subjectId = raw.subjectId;
|
|
109
|
+
const subjectType = raw.subjectType;
|
|
110
|
+
if (typeof subjectId !== "string" || subjectId.length === 0) {
|
|
111
|
+
throw new Error("whoami response missing subjectId");
|
|
112
|
+
}
|
|
113
|
+
if (subjectType !== "agent-runtime") {
|
|
114
|
+
throw new Error(`runtime broker requires agent-runtime credentials; got ${String(subjectType)}`);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
...(typeof raw.ownerUserId === "string" && {
|
|
118
|
+
ownerUserId: raw.ownerUserId,
|
|
119
|
+
}),
|
|
120
|
+
subjectType,
|
|
121
|
+
subjectId,
|
|
122
|
+
...(typeof raw.carrier === "string" && { carrier: raw.carrier }),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
95
125
|
export function buildApiPort(apiHost, runtimeKey, logger) {
|
|
96
126
|
return {
|
|
97
127
|
async register(params) {
|
|
@@ -132,6 +162,9 @@ export function buildApiPort(apiHost, runtimeKey, logger) {
|
|
|
132
162
|
}
|
|
133
163
|
}
|
|
134
164
|
},
|
|
165
|
+
async updateDisplayMetadata(endpointId, params) {
|
|
166
|
+
await updateRuntimeEndpointDisplayMetadata({ apiHost }, runtimeKey, endpointId, params);
|
|
167
|
+
},
|
|
135
168
|
async emitUndispatchedChanged(event) {
|
|
136
169
|
return emitRuntimeUndispatchedChanged({ apiHost }, runtimeKey, event);
|
|
137
170
|
},
|
|
@@ -158,12 +191,14 @@ export async function main() {
|
|
|
158
191
|
userDataDir: userDataOverride,
|
|
159
192
|
});
|
|
160
193
|
const logger = createBrokerLogger(paths.logDir);
|
|
194
|
+
const principal = await resolveRuntimePrincipal(creds.apiHost, creds.token);
|
|
161
195
|
logger.info("broker_entry_starting", {
|
|
162
196
|
accountId: creds.accountId,
|
|
197
|
+
subjectId: principal.subjectId,
|
|
163
198
|
apiHost: creds.apiHost,
|
|
164
199
|
pid: process.pid,
|
|
165
200
|
});
|
|
166
|
-
const asNodeId =
|
|
201
|
+
const asNodeId = principal.subjectId;
|
|
167
202
|
const connector = new ConnectorWS({
|
|
168
203
|
url: creds.connectorUrl,
|
|
169
204
|
token: creds.token,
|
|
@@ -208,7 +243,7 @@ export async function main() {
|
|
|
208
243
|
servicesEventClientFactory: ({ dispatcher, logger: clientLogger }) => createServicesEventClient({
|
|
209
244
|
apiHost: creds.apiHost,
|
|
210
245
|
runtimeKey: creds.token,
|
|
211
|
-
agentId:
|
|
246
|
+
agentId: principal.subjectId,
|
|
212
247
|
dispatcher,
|
|
213
248
|
logger: clientLogger,
|
|
214
249
|
}),
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type RawData, WebSocket } from "ws";
|
|
2
2
|
import type { BrokerLogger } from "./logger.js";
|
|
3
|
+
import type { NetworkPresence } from "./network-presence.js";
|
|
3
4
|
export interface IPCServerHandlers {
|
|
4
5
|
registerEndpoint(body: RegisterEndpointBody, ipcWs: WebSocket): Promise<RegisterEndpointResponse>;
|
|
5
6
|
heartbeatEndpoint(endpoint_id: string): Promise<void>;
|
|
@@ -46,10 +47,12 @@ export interface SendResponse {
|
|
|
46
47
|
messageId: string;
|
|
47
48
|
status: string;
|
|
48
49
|
}
|
|
50
|
+
export type BrokerHttpErrorExtra = Record<string, unknown>;
|
|
49
51
|
export declare class BrokerHttpError extends Error {
|
|
50
52
|
readonly status: number;
|
|
51
53
|
readonly code: string;
|
|
52
|
-
|
|
54
|
+
readonly extra?: BrokerHttpErrorExtra;
|
|
55
|
+
constructor(status: number, code: string, message: string, extra?: BrokerHttpErrorExtra);
|
|
53
56
|
}
|
|
54
57
|
export interface IPCServerOptions {
|
|
55
58
|
bearerToken: string;
|
|
@@ -57,6 +60,7 @@ export interface IPCServerOptions {
|
|
|
57
60
|
logger: BrokerLogger;
|
|
58
61
|
onChannelOpened?: (plugin_pid: number, ws: WebSocket) => void;
|
|
59
62
|
onChannelClosed?: (plugin_pid: number, ws: WebSocket) => void;
|
|
63
|
+
getNetworkPresence: () => NetworkPresence;
|
|
60
64
|
}
|
|
61
65
|
export interface RunningIPCServer {
|
|
62
66
|
ipcUrl: string;
|
|
@@ -74,6 +78,10 @@ export type PushEvent = {
|
|
|
74
78
|
} | {
|
|
75
79
|
event: "ping";
|
|
76
80
|
ts: string;
|
|
81
|
+
} | {
|
|
82
|
+
event: "presence_changed";
|
|
83
|
+
presence: NetworkPresence;
|
|
84
|
+
reason?: string;
|
|
77
85
|
};
|
|
78
86
|
export declare function parsePluginFrame(data: RawData): unknown;
|
|
79
87
|
//# sourceMappingURL=ipc-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipc-server.d.ts","sourceRoot":"","sources":["../../src/broker/ipc-server.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,KAAK,OAAO,EAAE,SAAS,EAAmB,MAAM,IAAI,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ipc-server.d.ts","sourceRoot":"","sources":["../../src/broker/ipc-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,20 +2,36 @@ import { createServer } from "node:http";
|
|
|
2
2
|
import { WebSocket, WebSocketServer } from "ws";
|
|
3
3
|
import { PLUGIN_VERSION } from "../version.js";
|
|
4
4
|
import { handleInitialize, IPC_PROTOCOL_VERSION, SERVER_CAPABILITIES, } from "./version-handshake.js";
|
|
5
|
+
const BROKER_ERROR_RESERVED_KEYS = new Set(["error", "message"]);
|
|
6
|
+
function sanitizeBrokerErrorExtra(extra) {
|
|
7
|
+
if (!extra)
|
|
8
|
+
return {};
|
|
9
|
+
const out = {};
|
|
10
|
+
for (const [key, value] of Object.entries(extra)) {
|
|
11
|
+
if (BROKER_ERROR_RESERVED_KEYS.has(key))
|
|
12
|
+
continue;
|
|
13
|
+
out[key] = value;
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
5
17
|
export class BrokerHttpError extends Error {
|
|
6
18
|
status;
|
|
7
19
|
code;
|
|
8
|
-
|
|
20
|
+
extra;
|
|
21
|
+
constructor(status, code, message, extra) {
|
|
9
22
|
super(message);
|
|
10
23
|
this.name = "BrokerHttpError";
|
|
11
24
|
this.status = status;
|
|
12
25
|
this.code = code;
|
|
26
|
+
if (extra !== undefined) {
|
|
27
|
+
this.extra = extra;
|
|
28
|
+
}
|
|
13
29
|
}
|
|
14
30
|
}
|
|
15
31
|
export async function startIPCServer(opts) {
|
|
16
|
-
const { bearerToken, handlers, logger, onChannelOpened, onChannelClosed } = opts;
|
|
32
|
+
const { bearerToken, handlers, logger, onChannelOpened, onChannelClosed, getNetworkPresence, } = opts;
|
|
17
33
|
const http = createServer((req, res) => {
|
|
18
|
-
void routeHttp(req, res, bearerToken, handlers, logger);
|
|
34
|
+
void routeHttp(req, res, bearerToken, handlers, logger, getNetworkPresence);
|
|
19
35
|
});
|
|
20
36
|
const wss = new WebSocketServer({ noServer: true });
|
|
21
37
|
http.on("upgrade", (req, socket, head) => {
|
|
@@ -59,7 +75,7 @@ export async function startIPCServer(opts) {
|
|
|
59
75
|
},
|
|
60
76
|
};
|
|
61
77
|
}
|
|
62
|
-
async function routeHttp(req, res, bearerToken, handlers, logger) {
|
|
78
|
+
async function routeHttp(req, res, bearerToken, handlers, logger, getNetworkPresence) {
|
|
63
79
|
const url = req.url ?? "";
|
|
64
80
|
const method = req.method ?? "GET";
|
|
65
81
|
if (method === "GET" && url === "/health") {
|
|
@@ -78,7 +94,9 @@ async function routeHttp(req, res, bearerToken, handlers, logger) {
|
|
|
78
94
|
try {
|
|
79
95
|
if (method === "POST" && url === "/v1/initialize") {
|
|
80
96
|
const body = await readJson(req);
|
|
81
|
-
const result = handleInitialize(body
|
|
97
|
+
const result = handleInitialize(body, {
|
|
98
|
+
networkPresence: getNetworkPresence(),
|
|
99
|
+
});
|
|
82
100
|
sendJson(res, result.status, result.body);
|
|
83
101
|
return;
|
|
84
102
|
}
|
|
@@ -161,14 +179,20 @@ async function routeHttp(req, res, bearerToken, handlers, logger) {
|
|
|
161
179
|
}
|
|
162
180
|
catch (err) {
|
|
163
181
|
if (err instanceof BrokerHttpError) {
|
|
182
|
+
const safeExtra = sanitizeBrokerErrorExtra(err.extra);
|
|
164
183
|
logger.info("ipc_route_rejected", {
|
|
165
184
|
url,
|
|
166
185
|
method,
|
|
167
186
|
status: err.status,
|
|
168
187
|
code: err.code,
|
|
169
188
|
message: err.message,
|
|
189
|
+
...safeExtra,
|
|
190
|
+
});
|
|
191
|
+
sendJson(res, err.status, {
|
|
192
|
+
error: err.code,
|
|
193
|
+
message: err.message,
|
|
194
|
+
...safeExtra,
|
|
170
195
|
});
|
|
171
|
-
sendJson(res, err.status, { error: err.code, message: err.message });
|
|
172
196
|
return;
|
|
173
197
|
}
|
|
174
198
|
logger.error("ipc_route_error", {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RegisterRuntimeEndpointParams, RegisterRuntimeEndpointResponse, TransitionRuntimeEndpointStateParams } from "../runtime-endpoint-client.js";
|
|
1
|
+
import type { RegisterRuntimeEndpointParams, RegisterRuntimeEndpointResponse, TransitionRuntimeEndpointStateParams, UpdateRuntimeEndpointDisplayMetadataParams } from "../runtime-endpoint-client.js";
|
|
2
2
|
import type { NetworkPresenceChangedEvent } from "./network-presence-changed-event-types.js";
|
|
3
3
|
import type { UndispatchedChangedEvent } from "./undispatched-changed-event-types.js";
|
|
4
4
|
export type EmitOutcome = {
|
|
@@ -14,6 +14,7 @@ export interface RuntimeEndpointPort {
|
|
|
14
14
|
heartbeat(endpointId: string): Promise<void>;
|
|
15
15
|
unregister(endpointId: string, asNodeId?: string): Promise<void>;
|
|
16
16
|
transitionState(endpointId: string, params: TransitionRuntimeEndpointStateParams): Promise<void>;
|
|
17
|
+
updateDisplayMetadata?(endpointId: string, params: UpdateRuntimeEndpointDisplayMetadataParams): Promise<void>;
|
|
17
18
|
emitUndispatchedChanged?(event: UndispatchedChangedEvent): Promise<EmitOutcome>;
|
|
18
19
|
emitNetworkPresenceChanged?(event: NetworkPresenceChangedEvent): Promise<EmitOutcome>;
|
|
19
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-endpoint-port.d.ts","sourceRoot":"","sources":["../../src/broker/runtime-endpoint-port.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,6BAA6B,EAC7B,+BAA+B,EAC/B,oCAAoC,
|
|
1
|
+
{"version":3,"file":"runtime-endpoint-port.d.ts","sourceRoot":"","sources":["../../src/broker/runtime-endpoint-port.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,6BAA6B,EAC7B,+BAA+B,EAC/B,oCAAoC,EACpC,0CAA0C,EAC3C,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AAC7F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAWtF,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CACN,MAAM,EAAE,6BAA6B,GACpC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC5C,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAO7C,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAQjE,eAAe,CACb,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,oCAAoC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAAC;IAKjB,qBAAqB,CAAC,CACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,0CAA0C,GACjD,OAAO,CAAC,IAAI,CAAC,CAAC;IAqBjB,uBAAuB,CAAC,CACtB,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,WAAW,CAAC,CAAC;IAYxB,0BAA0B,CAAC,CACzB,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,WAAW,CAAC,CAAC;CACzB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { NetworkPresence } from "./network-presence.js";
|
|
1
2
|
export declare const IPC_PROTOCOL_VERSION = "1.0";
|
|
2
3
|
export interface IpcCapabilities {
|
|
3
4
|
endpoint_metadata_v1?: boolean;
|
|
@@ -15,12 +16,15 @@ export interface InitializeResponseBody {
|
|
|
15
16
|
server_protocol_version: string;
|
|
16
17
|
server_capabilities: IpcCapabilities;
|
|
17
18
|
session_id: string;
|
|
19
|
+
network_presence: NetworkPresence;
|
|
18
20
|
}
|
|
19
21
|
export interface InitializeErrorBody {
|
|
20
22
|
error: "protocol_version_mismatch" | "bad_request";
|
|
21
23
|
message: string;
|
|
22
24
|
}
|
|
23
|
-
export declare function handleInitialize(req: InitializeRequestBody
|
|
25
|
+
export declare function handleInitialize(req: InitializeRequestBody, ctx: {
|
|
26
|
+
networkPresence: NetworkPresence;
|
|
27
|
+
}): {
|
|
24
28
|
status: 200;
|
|
25
29
|
body: InitializeResponseBody;
|
|
26
30
|
} | {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-handshake.d.ts","sourceRoot":"","sources":["../../src/broker/version-handshake.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"version-handshake.d.ts","sourceRoot":"","sources":["../../src/broker/version-handshake.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAM1C,MAAM,WAAW,eAAe;IAE9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAG1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAGD,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,eAAe,CAIxD,CAAC;AAEH,MAAM,WAAW,qBAAqB;IAEpC,uBAAuB,EAAE,MAAM,CAAC;IAEhC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,EAAE,eAAe,CAAC;IAErC,UAAU,EAAE,MAAM,CAAC;IAanB,gBAAgB,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,2BAA2B,GAAG,aAAa,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAUD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,qBAAqB,EAC1B,GAAG,EAAE;IAAE,eAAe,EAAE,eAAe,CAAA;CAAE,GAEvC;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAC7C;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAA;CAAE,CA2C7C"}
|
|
@@ -5,7 +5,7 @@ export const SERVER_CAPABILITIES = Object.freeze({
|
|
|
5
5
|
remote_spawn_v1: false,
|
|
6
6
|
undispatched_inbox_v1: false,
|
|
7
7
|
});
|
|
8
|
-
export function handleInitialize(req) {
|
|
8
|
+
export function handleInitialize(req, ctx) {
|
|
9
9
|
if (typeof req.client_protocol_version !== "string") {
|
|
10
10
|
return {
|
|
11
11
|
status: 400,
|
|
@@ -42,6 +42,7 @@ export function handleInitialize(req) {
|
|
|
42
42
|
server_protocol_version: IPC_PROTOCOL_VERSION,
|
|
43
43
|
server_capabilities: { ...SERVER_CAPABILITIES },
|
|
44
44
|
session_id: randomUUID(),
|
|
45
|
+
network_presence: ctx.networkPresence,
|
|
45
46
|
},
|
|
46
47
|
};
|
|
47
48
|
}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
|
+
import type { NetworkPresence } from "../broker/network-presence.js";
|
|
2
3
|
import { type InitializeResponseBody } from "../broker/version-handshake.js";
|
|
4
|
+
export declare class ConnectorUnavailableError extends Error {
|
|
5
|
+
readonly code: "connector_unavailable";
|
|
6
|
+
readonly retryable: true;
|
|
7
|
+
constructor(message: string);
|
|
8
|
+
}
|
|
3
9
|
export interface BrokerClientDiscoverOptions {
|
|
4
10
|
accountId: string;
|
|
5
11
|
runtimeToken: string;
|
|
@@ -34,6 +40,7 @@ export interface BrokerInboundMessage {
|
|
|
34
40
|
}
|
|
35
41
|
type Events = {
|
|
36
42
|
message_received: (msg: BrokerInboundMessage) => void;
|
|
43
|
+
presence: (presence: NetworkPresence, reason?: string) => void;
|
|
37
44
|
disconnected: () => void;
|
|
38
45
|
error: (err: Error) => void;
|
|
39
46
|
};
|
|
@@ -42,11 +49,13 @@ export declare class BrokerClient extends EventEmitter {
|
|
|
42
49
|
private ws;
|
|
43
50
|
private pluginPid;
|
|
44
51
|
private _sessionId;
|
|
52
|
+
private _networkPresence;
|
|
45
53
|
private constructor();
|
|
46
54
|
static discover(opts: BrokerClientDiscoverOptions): Promise<BrokerClient>;
|
|
47
55
|
get spawnedNew(): boolean;
|
|
48
56
|
get ipcUrl(): string;
|
|
49
57
|
get sessionId(): string | null;
|
|
58
|
+
get networkPresence(): NetworkPresence | null;
|
|
50
59
|
connect(opts: BrokerClientConnectOptions): Promise<InitializeResponseBody>;
|
|
51
60
|
registerEndpoint(args: RegisterEndpointArgs): Promise<RegisterEndpointOutcome>;
|
|
52
61
|
send(endpointId: string, to: string, content: string, contentType?: string, metadata?: Record<string, unknown>): Promise<{
|
|
@@ -56,6 +65,10 @@ export declare class BrokerClient extends EventEmitter {
|
|
|
56
65
|
close(endpointId?: string): Promise<void>;
|
|
57
66
|
on<K extends keyof Events>(event: K, listener: Events[K]): this;
|
|
58
67
|
on(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
68
|
+
once<K extends keyof Events>(event: K, listener: Events[K]): this;
|
|
69
|
+
once(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
70
|
+
off<K extends keyof Events>(event: K, listener: Events[K]): this;
|
|
71
|
+
off(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
59
72
|
emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): boolean;
|
|
60
73
|
emit(event: string | symbol, ...args: unknown[]): boolean;
|
|
61
74
|
private httpJson;
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"broker-client.d.ts","sourceRoot":"","sources":["../../src/broker-client/broker-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,28 @@ 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 { discoverBroker } from "./lazy-spawn.js";
|
|
6
|
+
export class ConnectorUnavailableError extends Error {
|
|
7
|
+
code = "connector_unavailable";
|
|
8
|
+
retryable = true;
|
|
9
|
+
constructor(message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "ConnectorUnavailableError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function safeJsonParse(text) {
|
|
15
|
+
try {
|
|
16
|
+
return JSON.parse(text);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
6
22
|
export class BrokerClient extends EventEmitter {
|
|
7
23
|
handle;
|
|
8
24
|
ws = null;
|
|
9
25
|
pluginPid = null;
|
|
10
26
|
_sessionId = null;
|
|
27
|
+
_networkPresence = null;
|
|
11
28
|
constructor(handle) {
|
|
12
29
|
super();
|
|
13
30
|
this.handle = handle;
|
|
@@ -40,6 +57,9 @@ export class BrokerClient extends EventEmitter {
|
|
|
40
57
|
get sessionId() {
|
|
41
58
|
return this._sessionId;
|
|
42
59
|
}
|
|
60
|
+
get networkPresence() {
|
|
61
|
+
return this._networkPresence;
|
|
62
|
+
}
|
|
43
63
|
async connect(opts) {
|
|
44
64
|
if (this.ws) {
|
|
45
65
|
throw new Error("BrokerClient already connected");
|
|
@@ -52,6 +72,7 @@ export class BrokerClient extends EventEmitter {
|
|
|
52
72
|
capabilities: { endpoint_metadata_v1: true },
|
|
53
73
|
});
|
|
54
74
|
this._sessionId = initRes.session_id;
|
|
75
|
+
this._networkPresence = initRes.network_presence;
|
|
55
76
|
const wsUrl = `${this.handle.record.ipcUrl.replace(/^http/, "ws")}/v1/stream`;
|
|
56
77
|
const ws = new WebSocket(wsUrl, {
|
|
57
78
|
headers: {
|
|
@@ -122,6 +143,12 @@ export class BrokerClient extends EventEmitter {
|
|
|
122
143
|
on(event, listener) {
|
|
123
144
|
return super.on(event, listener);
|
|
124
145
|
}
|
|
146
|
+
once(event, listener) {
|
|
147
|
+
return super.once(event, listener);
|
|
148
|
+
}
|
|
149
|
+
off(event, listener) {
|
|
150
|
+
return super.off(event, listener);
|
|
151
|
+
}
|
|
125
152
|
emit(event, ...args) {
|
|
126
153
|
return super.emit(event, ...args);
|
|
127
154
|
}
|
|
@@ -136,6 +163,17 @@ export class BrokerClient extends EventEmitter {
|
|
|
136
163
|
});
|
|
137
164
|
if (!res.ok) {
|
|
138
165
|
const errText = await res.text().catch(() => "");
|
|
166
|
+
if (res.status === 503) {
|
|
167
|
+
const parsed = safeJsonParse(errText);
|
|
168
|
+
if (parsed !== null &&
|
|
169
|
+
typeof parsed === "object" &&
|
|
170
|
+
"error" in parsed &&
|
|
171
|
+
parsed.error === "connector_unavailable") {
|
|
172
|
+
const msgField = parsed.message;
|
|
173
|
+
const msg = typeof msgField === "string" ? msgField : "Connector unavailable";
|
|
174
|
+
throw new ConnectorUnavailableError(msg);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
139
177
|
throw new Error(`broker ${method} ${path} failed: ${res.status} ${errText}`);
|
|
140
178
|
}
|
|
141
179
|
return (await res.json());
|
|
@@ -160,6 +198,22 @@ export class BrokerClient extends EventEmitter {
|
|
|
160
198
|
contentType: msg.contentType,
|
|
161
199
|
metadata: msg.metadata,
|
|
162
200
|
});
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (event === "presence_changed") {
|
|
204
|
+
const frame = parsed;
|
|
205
|
+
if (frame.presence === "online" ||
|
|
206
|
+
frame.presence === "reconnecting" ||
|
|
207
|
+
frame.presence === "offline") {
|
|
208
|
+
this._networkPresence = frame.presence;
|
|
209
|
+
if (typeof frame.reason === "string") {
|
|
210
|
+
this.emit("presence", frame.presence, frame.reason);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
this.emit("presence", frame.presence);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return;
|
|
163
217
|
}
|
|
164
218
|
}
|
|
165
219
|
}
|
|
@@ -14,6 +14,8 @@ export interface RegisterRuntimeEndpointParams {
|
|
|
14
14
|
runtime_session_id?: string;
|
|
15
15
|
endpoint_nonce: string;
|
|
16
16
|
display_label: string;
|
|
17
|
+
session_name?: string;
|
|
18
|
+
task_hint?: string;
|
|
17
19
|
workspace?: WorkspaceMetadata;
|
|
18
20
|
tracking_ref?: string;
|
|
19
21
|
share_with_peer?: ShareWithPeerField[];
|
|
@@ -55,9 +57,14 @@ export interface TransitionRuntimeEndpointStateParams {
|
|
|
55
57
|
ts: string;
|
|
56
58
|
}
|
|
57
59
|
export type TransitionRuntimeEndpointStateResponse = Record<string, unknown>;
|
|
60
|
+
export interface UpdateRuntimeEndpointDisplayMetadataParams {
|
|
61
|
+
session_name?: string;
|
|
62
|
+
task_hint?: string;
|
|
63
|
+
}
|
|
58
64
|
export declare function registerRuntimeEndpoint(cfg: PlatformClientConfig, runtimeKey: string, params: RegisterRuntimeEndpointParams): Promise<RegisterRuntimeEndpointResponse>;
|
|
59
65
|
export declare function heartbeatRuntimeEndpoint(cfg: PlatformClientConfig, runtimeKey: string, endpointId: string): Promise<HeartbeatRuntimeEndpointResponse>;
|
|
60
66
|
export declare function transitionRuntimeEndpointState(cfg: PlatformClientConfig, runtimeKey: string, endpointId: string, params: TransitionRuntimeEndpointStateParams): Promise<TransitionRuntimeEndpointStateResponse>;
|
|
67
|
+
export declare function updateRuntimeEndpointDisplayMetadata(cfg: PlatformClientConfig, runtimeKey: string, endpointId: string, params: UpdateRuntimeEndpointDisplayMetadataParams): Promise<void>;
|
|
61
68
|
export declare function unregisterRuntimeEndpoint(cfg: PlatformClientConfig, runtimeKey: string, endpointId: string, asNodeId?: string): Promise<UnregisterRuntimeEndpointResponse>;
|
|
62
69
|
export declare function listOwnedRuntimeEndpoints(cfg: PlatformClientConfig, runtimeKey: string, asNodeId: string): Promise<ListOwnedRuntimeEndpointsResponse>;
|
|
63
70
|
export declare function getOwnedRuntimeEndpoint(cfg: PlatformClientConfig, runtimeKey: string, endpointId: string, asNodeId: string): Promise<OwnedRuntimeEndpointView>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-endpoint-client.d.ts","sourceRoot":"","sources":["../src/runtime-endpoint-client.ts"],"names":[],"mappings":"AAuBA,OAAO,EACL,gBAAgB,EAChB,KAAK,oBAAoB,EAC1B,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,CAAC;AAmBvD,MAAM,MAAM,WAAW,GACnB,aAAa,GACb,UAAU,GACV,OAAO,GACP,UAAU,GACV,QAAQ,GACR,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAalB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAeD,MAAM,MAAM,kBAAkB,GAC1B,WAAW,GACX,cAAc,GACd,oBAAoB,GACpB,aAAa,GACb,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAUlB,MAAM,WAAW,6BAA6B;IAQ5C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,WAAW,CAAC;IAO1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,cAAc,EAAE,MAAM,CAAC;IAEvB,aAAa,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-endpoint-client.d.ts","sourceRoot":"","sources":["../src/runtime-endpoint-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,6 +51,15 @@ export async function transitionRuntimeEndpointState(cfg, runtimeKey, endpointId
|
|
|
51
51
|
return ((await res.json().catch(() => ({}))) ??
|
|
52
52
|
{});
|
|
53
53
|
}
|
|
54
|
+
export async function updateRuntimeEndpointDisplayMetadata(cfg, runtimeKey, endpointId, params) {
|
|
55
|
+
const res = await fetch(`${baseUrl(cfg)}/runtime-endpoints/${encodeURIComponent(endpointId)}/display-metadata`, {
|
|
56
|
+
method: "POST",
|
|
57
|
+
headers: jsonHeaders(runtimeKey),
|
|
58
|
+
body: JSON.stringify(params),
|
|
59
|
+
});
|
|
60
|
+
if (!res.ok)
|
|
61
|
+
return handleError(res);
|
|
62
|
+
}
|
|
54
63
|
export async function unregisterRuntimeEndpoint(cfg, runtimeKey, endpointId, asNodeId) {
|
|
55
64
|
const query = asNodeId
|
|
56
65
|
? `?${new URLSearchParams({ as: asNodeId }).toString()}`
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const PLUGIN_VERSION = "0.
|
|
1
|
+
export declare const PLUGIN_VERSION = "0.2.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PLUGIN_VERSION = "0.
|
|
1
|
+
export const PLUGIN_VERSION = "0.2.0";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masons/runtime-broker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
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)",
|
|
@@ -20,15 +20,6 @@
|
|
|
20
20
|
"publishConfig": {
|
|
21
21
|
"access": "public"
|
|
22
22
|
},
|
|
23
|
-
"scripts": {
|
|
24
|
-
"build": "tsc",
|
|
25
|
-
"dev": "tsc --watch",
|
|
26
|
-
"test": "tsc -p test/tsconfig.json && node --test --loader ts-node/esm 'test/**/*.test.ts'",
|
|
27
|
-
"lint": "biome check",
|
|
28
|
-
"format": "biome format --write",
|
|
29
|
-
"prepublishOnly": "bash scripts/check-version.sh && npm run build && npm run test",
|
|
30
|
-
"release": "pnpm publish --access public"
|
|
31
|
-
},
|
|
32
23
|
"files": [
|
|
33
24
|
"dist/"
|
|
34
25
|
],
|
|
@@ -53,8 +44,16 @@
|
|
|
53
44
|
"@types/debug": "^4.1.12",
|
|
54
45
|
"@types/node": "^25",
|
|
55
46
|
"@types/ws": "^8",
|
|
56
|
-
"@workspace/types": "workspace:*",
|
|
57
47
|
"ts-node": "^10",
|
|
58
|
-
"typescript": "^5"
|
|
48
|
+
"typescript": "^5",
|
|
49
|
+
"@workspace/types": "0.0.0"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "tsc",
|
|
53
|
+
"dev": "tsc --watch",
|
|
54
|
+
"test": "tsc -p test/tsconfig.json && node --test --loader ts-node/esm 'test/**/*.test.ts'",
|
|
55
|
+
"lint": "biome check",
|
|
56
|
+
"format": "biome format --write",
|
|
57
|
+
"release": "pnpm publish --access public"
|
|
59
58
|
}
|
|
60
|
-
}
|
|
59
|
+
}
|