@masons/runtime-broker 0.2.0 → 0.2.2
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 +8 -0
- package/dist/broker/broker-daemon.d.ts.map +1 -1
- package/dist/broker/broker-daemon.js +731 -81
- package/dist/broker/connector-ws.d.ts +4 -0
- package/dist/broker/connector-ws.d.ts.map +1 -1
- package/dist/broker/connector-ws.js +12 -0
- package/dist/broker/control-event-dispatcher.d.ts.map +1 -1
- package/dist/broker/control-event-dispatcher.js +34 -16
- package/dist/broker/control-event-types.d.ts +12 -2
- package/dist/broker/control-event-types.d.ts.map +1 -1
- package/dist/broker/delivery-cursor-file.d.ts +8 -0
- package/dist/broker/delivery-cursor-file.d.ts.map +1 -0
- package/dist/broker/delivery-cursor-file.js +71 -0
- package/dist/broker/endpoint-registry.d.ts +7 -0
- package/dist/broker/endpoint-registry.d.ts.map +1 -1
- package/dist/broker/endpoint-registry.js +3 -0
- package/dist/broker/entry.d.ts.map +1 -1
- package/dist/broker/entry.js +7 -1
- package/dist/broker/ipc-server.d.ts +33 -1
- package/dist/broker/ipc-server.d.ts.map +1 -1
- package/dist/broker/ipc-server.js +8 -1
- package/dist/broker/paths.d.ts +1 -0
- package/dist/broker/paths.d.ts.map +1 -1
- package/dist/broker/paths.js +1 -0
- package/dist/broker/reconnecting-buffer.d.ts +3 -0
- package/dist/broker/reconnecting-buffer.d.ts.map +1 -1
- package/dist/broker/reconnecting-buffer.js +3 -0
- package/dist/broker/runtime-endpoint-port.d.ts +4 -0
- package/dist/broker/runtime-endpoint-port.d.ts.map +1 -1
- package/dist/broker/runtime-inbound-routed-emitter.d.ts +22 -0
- package/dist/broker/runtime-inbound-routed-emitter.d.ts.map +1 -0
- package/dist/broker/runtime-inbound-routed-emitter.js +147 -0
- package/dist/broker/runtime-inbound-routed-event-types.d.ts +10 -0
- package/dist/broker/runtime-inbound-routed-event-types.d.ts.map +1 -0
- package/dist/broker/runtime-inbound-routed-event-types.js +1 -0
- package/dist/broker/runtime-processing-state-event-types.d.ts +26 -0
- package/dist/broker/runtime-processing-state-event-types.d.ts.map +1 -0
- package/dist/broker/runtime-processing-state-event-types.js +1 -0
- package/dist/broker/undispatched-changed-event-types.d.ts +1 -0
- package/dist/broker/undispatched-changed-event-types.d.ts.map +1 -1
- package/dist/broker/undispatched-inbox.d.ts +1 -0
- package/dist/broker/undispatched-inbox.d.ts.map +1 -1
- package/dist/broker/version-handshake.js +1 -1
- package/dist/broker-client/broker-client.d.ts +31 -0
- package/dist/broker-client/broker-client.d.ts.map +1 -1
- package/dist/broker-client/broker-client.js +30 -0
- package/dist/connector-client.d.ts +5 -0
- package/dist/connector-client.d.ts.map +1 -1
- package/dist/connector-client.js +47 -5
- package/dist/runtime-endpoint-client.d.ts +14 -0
- package/dist/runtime-endpoint-client.d.ts.map +1 -1
- package/dist/runtime-endpoint-client.js +66 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -38,6 +38,10 @@ export declare class ConnectorWS {
|
|
|
38
38
|
disconnect(): void;
|
|
39
39
|
send(to: string, content: string, contentType?: string, metadata?: Record<string, unknown>): Promise<SendAckEvent>;
|
|
40
40
|
ackDelivery(upTo: string): boolean;
|
|
41
|
+
setDeliveryCursor(seq: number): void;
|
|
42
|
+
getDeliveryCursor(): number | undefined;
|
|
43
|
+
prepareDeliverySeqAccepted(seq: number): number | undefined;
|
|
44
|
+
markDeliverySeqAccepted(seq: number): number | undefined;
|
|
41
45
|
on<E extends ConnectorWSEvent["event"]>(event: E, listener: ListenerFor<E>): this;
|
|
42
46
|
off<E extends ConnectorWSEvent["event"]>(event: E, listener: ListenerFor<E>): this;
|
|
43
47
|
_emitForTesting(e: ConnectorWSEvent): void;
|
|
@@ -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;
|
|
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;CA0BvB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -19,6 +19,18 @@ export class ConnectorWS {
|
|
|
19
19
|
ackDelivery(upTo) {
|
|
20
20
|
return this.client.ackDelivery(upTo);
|
|
21
21
|
}
|
|
22
|
+
setDeliveryCursor(seq) {
|
|
23
|
+
this.client.setDeliveryCursor(seq);
|
|
24
|
+
}
|
|
25
|
+
getDeliveryCursor() {
|
|
26
|
+
return this.client.getDeliveryCursor();
|
|
27
|
+
}
|
|
28
|
+
prepareDeliverySeqAccepted(seq) {
|
|
29
|
+
return this.client.prepareDeliverySeqAccepted(seq);
|
|
30
|
+
}
|
|
31
|
+
markDeliverySeqAccepted(seq) {
|
|
32
|
+
return this.client.markDeliverySeqAccepted(seq);
|
|
33
|
+
}
|
|
22
34
|
on(event, listener) {
|
|
23
35
|
this.bus.on(event, listener);
|
|
24
36
|
return this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-event-dispatcher.d.ts","sourceRoot":"","sources":["../../src/broker/control-event-dispatcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"control-event-dispatcher.d.ts","sourceRoot":"","sources":["../../src/broker/control-event-dispatcher.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAYlD,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,UAAU,CAAA;CAAE,GACnC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,CACvE,KAAK,EAAE,CAAC,KACL,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAElC,MAAM,WAAW,sBAAsB;IAErC,EAAE,CAAC,CAAC,SAAS,YAAY,EACvB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EACf,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC9B,IAAI,CAAC;IAKR,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAE5D,QAAQ,IAAI,MAAM,CAAC;IAEnB,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3C;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,GAAE,6BAAkC,GACvC,sBAAsB,CAmExB"}
|
|
@@ -5,7 +5,19 @@ export function createControlEventDispatcher(opts = {}) {
|
|
|
5
5
|
throw new Error(`ringSize must be positive: ${cap}`);
|
|
6
6
|
const seen = new Set();
|
|
7
7
|
const order = [];
|
|
8
|
+
const inFlight = new Map();
|
|
8
9
|
const handlers = new Map();
|
|
10
|
+
const rememberSuccess = (idempotency_key) => {
|
|
11
|
+
if (seen.has(idempotency_key))
|
|
12
|
+
return;
|
|
13
|
+
seen.add(idempotency_key);
|
|
14
|
+
order.push(idempotency_key);
|
|
15
|
+
if (order.length > cap) {
|
|
16
|
+
const oldest = order.shift();
|
|
17
|
+
if (oldest !== undefined)
|
|
18
|
+
seen.delete(oldest);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
9
21
|
return {
|
|
10
22
|
on(type, handler) {
|
|
11
23
|
handlers.set(type, handler);
|
|
@@ -14,26 +26,32 @@ export function createControlEventDispatcher(opts = {}) {
|
|
|
14
26
|
if (seen.has(event.idempotency_key)) {
|
|
15
27
|
return { ok: true };
|
|
16
28
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const oldest = order.shift();
|
|
21
|
-
if (oldest !== undefined)
|
|
22
|
-
seen.delete(oldest);
|
|
23
|
-
}
|
|
29
|
+
const existing = inFlight.get(event.idempotency_key);
|
|
30
|
+
if (existing)
|
|
31
|
+
return existing;
|
|
24
32
|
const handler = handlers.get(event.type);
|
|
25
33
|
if (!handler) {
|
|
26
34
|
return { ok: false, detail: `no_handler:${event.type}` };
|
|
27
35
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
const pending = (async () => {
|
|
37
|
+
try {
|
|
38
|
+
const outcome = await handler(event);
|
|
39
|
+
if (outcome.ok)
|
|
40
|
+
rememberSuccess(event.idempotency_key);
|
|
41
|
+
return outcome;
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
return {
|
|
45
|
+
ok: false,
|
|
46
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
inFlight.delete(event.idempotency_key);
|
|
51
|
+
}
|
|
52
|
+
})();
|
|
53
|
+
inFlight.set(event.idempotency_key, pending);
|
|
54
|
+
return pending;
|
|
37
55
|
},
|
|
38
56
|
ringSize() {
|
|
39
57
|
return seen.size;
|
|
@@ -7,13 +7,23 @@ export type ControlEvent = DispatchUndispatchedEvent | SpawnRequestEvent | Force
|
|
|
7
7
|
export interface DispatchUndispatchedEvent extends ControlEventBase {
|
|
8
8
|
type: "dispatch_undispatched";
|
|
9
9
|
undispatched_id: string;
|
|
10
|
-
|
|
10
|
+
source_message_id: string;
|
|
11
|
+
target_ref: RuntimeWorkTargetRef;
|
|
12
|
+
delivery_intent: "external_handoff";
|
|
13
|
+
target_endpoint_id?: string;
|
|
14
|
+
}
|
|
15
|
+
export type BackgroundExchangeMode = "resident_endpoint" | "adapter_managed_turn";
|
|
16
|
+
export interface RuntimeWorkTargetRef {
|
|
17
|
+
kind: "projection_endpoint";
|
|
18
|
+
projection_endpoint_id: string;
|
|
19
|
+
runtime_session_id?: string;
|
|
20
|
+
background_exchange_mode: BackgroundExchangeMode;
|
|
11
21
|
}
|
|
12
22
|
export interface SpawnRequestEvent extends ControlEventBase {
|
|
13
23
|
type: "spawn_request";
|
|
14
24
|
prompt: string;
|
|
15
25
|
runtime_kind: "claude-code" | "openclaw" | "codex" | "custom";
|
|
16
|
-
origin: "
|
|
26
|
+
origin: "owner_initiated_spawn";
|
|
17
27
|
}
|
|
18
28
|
export interface ForceUnregisterEvent extends ControlEventBase {
|
|
19
29
|
type: "force_unregister";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-event-types.d.ts","sourceRoot":"","sources":["../../src/broker/control-event-types.ts"],"names":[],"mappings":"AAwCA,MAAM,WAAW,gBAAgB;IAI/B,OAAO,EAAE,CAAC,CAAC;IAWX,eAAe,EAAE,MAAM,CAAC;IAKxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,MAAM,YAAY,GACpB,yBAAyB,GACzB,iBAAiB,GACjB,oBAAoB,CAAC;AAGzB,MAAM,WAAW,yBAA0B,SAAQ,gBAAgB;IACjE,IAAI,EAAE,uBAAuB,CAAC;IAE9B,eAAe,EAAE,MAAM,CAAC;IAExB,kBAAkB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"control-event-types.d.ts","sourceRoot":"","sources":["../../src/broker/control-event-types.ts"],"names":[],"mappings":"AAwCA,MAAM,WAAW,gBAAgB;IAI/B,OAAO,EAAE,CAAC,CAAC;IAWX,eAAe,EAAE,MAAM,CAAC;IAKxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,MAAM,YAAY,GACpB,yBAAyB,GACzB,iBAAiB,GACjB,oBAAoB,CAAC;AAGzB,MAAM,WAAW,yBAA0B,SAAQ,gBAAgB;IACjE,IAAI,EAAE,uBAAuB,CAAC;IAE9B,eAAe,EAAE,MAAM,CAAC;IAExB,iBAAiB,EAAE,MAAM,CAAC;IAE1B,UAAU,EAAE,oBAAoB,CAAC;IAEjC,eAAe,EAAE,kBAAkB,CAAC;IAKpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,sBAAsB,GAC9B,mBAAmB,GACnB,sBAAsB,CAAC;AAE3B,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wBAAwB,EAAE,sBAAsB,CAAC;CAClD;AAGD,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,IAAI,EAAE,eAAe,CAAC;IAEtB,MAAM,EAAE,MAAM,CAAC;IAMf,YAAY,EAAE,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;IAG9D,MAAM,EAAE,uBAAuB,CAAC;CACjC;AAGD,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,IAAI,EAAE,kBAAkB,CAAC;IAEzB,WAAW,EAAE,MAAM,CAAC;IAEpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAwBD,MAAM,WAAW,UAAU;IAEzB,eAAe,EAAE,MAAM,CAAC;IAExB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IAE1C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface DeliveryCursorRecord {
|
|
2
|
+
version: 1;
|
|
3
|
+
lastKnownSeq: number;
|
|
4
|
+
updatedAt: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function readDeliveryCursorFile(path: string): number | null;
|
|
7
|
+
export declare function writeDeliveryCursorFile(path: string, seq: number): void;
|
|
8
|
+
//# sourceMappingURL=delivery-cursor-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-cursor-file.d.ts","sourceRoot":"","sources":["../../src/broker/delivery-cursor-file.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,CAAC,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBlE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAiCvE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { chmodSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
export function readDeliveryCursorFile(path) {
|
|
5
|
+
let raw;
|
|
6
|
+
try {
|
|
7
|
+
raw = readFileSync(path, "utf8");
|
|
8
|
+
}
|
|
9
|
+
catch (err) {
|
|
10
|
+
if (isNodeErr(err, "ENOENT"))
|
|
11
|
+
return null;
|
|
12
|
+
throw err;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const parsed = JSON.parse(raw);
|
|
16
|
+
if (!isDeliveryCursorRecord(parsed))
|
|
17
|
+
return null;
|
|
18
|
+
return parsed.lastKnownSeq;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function writeDeliveryCursorFile(path, seq) {
|
|
25
|
+
if (!Number.isInteger(seq) || seq < 0) {
|
|
26
|
+
throw new Error(`delivery cursor must be a non-negative integer: ${seq}`);
|
|
27
|
+
}
|
|
28
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
29
|
+
const tmp = `${path}.tmp.${process.pid}.${randomBytes(4).toString("hex")}`;
|
|
30
|
+
const record = {
|
|
31
|
+
version: 1,
|
|
32
|
+
lastKnownSeq: seq,
|
|
33
|
+
updatedAt: new Date().toISOString(),
|
|
34
|
+
};
|
|
35
|
+
writeFileSync(tmp, JSON.stringify(record, null, 2), {
|
|
36
|
+
mode: 0o600,
|
|
37
|
+
encoding: "utf8",
|
|
38
|
+
});
|
|
39
|
+
try {
|
|
40
|
+
chmodSync(tmp, 0o600);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
renameSync(tmp, path);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
try {
|
|
49
|
+
unlinkSync(tmp);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
}
|
|
53
|
+
throw err;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function isDeliveryCursorRecord(value) {
|
|
57
|
+
if (typeof value !== "object" || value === null)
|
|
58
|
+
return false;
|
|
59
|
+
const v = value;
|
|
60
|
+
return (v.version === 1 &&
|
|
61
|
+
typeof v.lastKnownSeq === "number" &&
|
|
62
|
+
Number.isInteger(v.lastKnownSeq) &&
|
|
63
|
+
v.lastKnownSeq >= 0 &&
|
|
64
|
+
typeof v.updatedAt === "string");
|
|
65
|
+
}
|
|
66
|
+
function isNodeErr(err, code) {
|
|
67
|
+
return (typeof err === "object" &&
|
|
68
|
+
err !== null &&
|
|
69
|
+
"code" in err &&
|
|
70
|
+
err.code === code);
|
|
71
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type WebSocket from "ws";
|
|
2
|
+
import type { EndpointBackgroundExchangeMode, EndpointExecutionSurface, RuntimeEndpointCapability } from "../runtime-endpoint-client.js";
|
|
2
3
|
import { CorrelationRingBuffer } from "./correlation-ring.js";
|
|
3
4
|
export interface DisplayMetadata {
|
|
4
5
|
session_name?: string;
|
|
@@ -16,6 +17,9 @@ export interface BrokerEndpointEntry {
|
|
|
16
17
|
state: "active" | "reconnecting";
|
|
17
18
|
state_since: Date;
|
|
18
19
|
grace_deadline?: Date;
|
|
20
|
+
runtime_capabilities?: RuntimeEndpointCapability[];
|
|
21
|
+
execution_surface?: EndpointExecutionSurface;
|
|
22
|
+
background_exchange_mode?: EndpointBackgroundExchangeMode;
|
|
19
23
|
display_metadata: DisplayMetadata;
|
|
20
24
|
correlation_ring: CorrelationRingBuffer;
|
|
21
25
|
}
|
|
@@ -24,6 +28,9 @@ export interface RegisterArgs {
|
|
|
24
28
|
agent_id: string;
|
|
25
29
|
plugin_pid: number;
|
|
26
30
|
ipc_ws: WebSocket;
|
|
31
|
+
runtime_capabilities?: RuntimeEndpointCapability[];
|
|
32
|
+
execution_surface?: EndpointExecutionSurface;
|
|
33
|
+
background_exchange_mode?: EndpointBackgroundExchangeMode;
|
|
27
34
|
display_metadata: DisplayMetadata;
|
|
28
35
|
}
|
|
29
36
|
export declare class EndpointRegistry {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint-registry.d.ts","sourceRoot":"","sources":["../../src/broker/endpoint-registry.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,SAAS,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,QAAQ,GAAG,cAAc,CAAC;IACjC,WAAW,EAAE,IAAI,CAAC;IAElB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,gBAAgB,EAAE,eAAe,CAAC;IAClC,gBAAgB,EAAE,qBAAqB,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,gBAAgB,EAAE,eAAe,CAAC;CACnC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0C;IAG/D,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,mBAAmB;
|
|
1
|
+
{"version":3,"file":"endpoint-registry.d.ts","sourceRoot":"","sources":["../../src/broker/endpoint-registry.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,SAAS,MAAM,IAAI,CAAC;AAChC,OAAO,KAAK,EACV,8BAA8B,EAC9B,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,QAAQ,GAAG,cAAc,CAAC;IACjC,WAAW,EAAE,IAAI,CAAC;IAElB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,oBAAoB,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACnD,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAC7C,wBAAwB,CAAC,EAAE,8BAA8B,CAAC;IAC1D,gBAAgB,EAAE,eAAe,CAAC;IAClC,gBAAgB,EAAE,qBAAqB,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,oBAAoB,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACnD,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAC7C,wBAAwB,CAAC,EAAE,8BAA8B,CAAC;IAC1D,gBAAgB,EAAE,eAAe,CAAC;CACnC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0C;IAG/D,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,mBAAmB;IAqBjD,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IAKzD,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IAWhE,gBAAgB,CACd,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,IAAI,GACnB,mBAAmB;IAoBtB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,mBAAmB;IA8BvE,uBAAuB,CACrB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,mBAAmB,GAAG,SAAS;IAYlC,iBAAiB,CACf,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GAEhB;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,mBAAmB,CAAA;KAAE,GACxC;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,kBAAkB,CAAA;KAAE,GACzC;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,uBAAuB,CAAA;KAAE,GAC9C;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,2BAA2B,CAAA;KAAE;IAWtD,IAAI,IAAI,mBAAmB,EAAE;IAK7B,IAAI,IAAI,MAAM;CAGf"}
|
|
@@ -12,6 +12,9 @@ export class EndpointRegistry {
|
|
|
12
12
|
ipc_ws: args.ipc_ws,
|
|
13
13
|
state: "active",
|
|
14
14
|
state_since: new Date(),
|
|
15
|
+
runtime_capabilities: args.runtime_capabilities,
|
|
16
|
+
execution_surface: args.execution_surface,
|
|
17
|
+
background_exchange_mode: args.background_exchange_mode,
|
|
15
18
|
display_metadata: args.display_metadata,
|
|
16
19
|
correlation_ring: new CorrelationRingBuffer(),
|
|
17
20
|
};
|
|
@@ -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":"AAkFA,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,CA8HrB;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, updateRuntimeEndpointDisplayMetadata, } from "../runtime-endpoint-client.js";
|
|
5
|
+
import { emitRuntimeInboundRouted, emitRuntimeNetworkPresenceChanged, emitRuntimeProcessingState, 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";
|
|
@@ -171,6 +171,12 @@ export function buildApiPort(apiHost, runtimeKey, logger) {
|
|
|
171
171
|
async emitNetworkPresenceChanged(event) {
|
|
172
172
|
return emitRuntimeNetworkPresenceChanged({ apiHost }, runtimeKey, event);
|
|
173
173
|
},
|
|
174
|
+
async emitRuntimeInboundRouted(event) {
|
|
175
|
+
return emitRuntimeInboundRouted({ apiHost }, runtimeKey, event);
|
|
176
|
+
},
|
|
177
|
+
async emitRuntimeProcessingState(event) {
|
|
178
|
+
return emitRuntimeProcessingState({ apiHost }, runtimeKey, event);
|
|
179
|
+
},
|
|
174
180
|
};
|
|
175
181
|
}
|
|
176
182
|
function errorStatus(err) {
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { type RawData, WebSocket } from "ws";
|
|
2
|
+
import type { EndpointBackgroundExchangeMode, EndpointExecutionSurface, RuntimeEndpointCapability } from "../runtime-endpoint-client.js";
|
|
2
3
|
import type { BrokerLogger } from "./logger.js";
|
|
3
4
|
import type { NetworkPresence } from "./network-presence.js";
|
|
5
|
+
import type { RuntimeProcessingState, RuntimeWorkTargetRef } from "./runtime-processing-state-event-types.js";
|
|
4
6
|
export interface IPCServerHandlers {
|
|
5
7
|
registerEndpoint(body: RegisterEndpointBody, ipcWs: WebSocket): Promise<RegisterEndpointResponse>;
|
|
6
8
|
heartbeatEndpoint(endpoint_id: string): Promise<void>;
|
|
7
9
|
unregisterEndpoint(endpoint_id: string): Promise<void>;
|
|
8
10
|
send(body: SendBody): Promise<SendResponse>;
|
|
11
|
+
reportProcessingState(body: ProcessingStateBody): Promise<void>;
|
|
9
12
|
reattachEndpoint(endpoint_id: string, plugin_pid: number, ipcWs: WebSocket): Promise<ReattachResponse>;
|
|
10
13
|
listUndispatched(): Promise<UndispatchedListResponse>;
|
|
11
14
|
dispatch(undispatched_id: string, target_endpoint_id: string): Promise<void>;
|
|
@@ -25,6 +28,9 @@ export interface RegisterEndpointBody {
|
|
|
25
28
|
tracking_ref?: string;
|
|
26
29
|
session_name?: string;
|
|
27
30
|
task_hint?: string;
|
|
31
|
+
runtime_capabilities?: RuntimeEndpointCapability[];
|
|
32
|
+
execution_surface?: EndpointExecutionSurface;
|
|
33
|
+
background_exchange_mode?: EndpointBackgroundExchangeMode;
|
|
28
34
|
spawn_token?: string;
|
|
29
35
|
}
|
|
30
36
|
export interface TaskHintBody {
|
|
@@ -47,6 +53,30 @@ export interface SendResponse {
|
|
|
47
53
|
messageId: string;
|
|
48
54
|
status: string;
|
|
49
55
|
}
|
|
56
|
+
export interface ProcessingStateBody {
|
|
57
|
+
endpoint_id: string;
|
|
58
|
+
plugin_pid: number;
|
|
59
|
+
source_message_id: string;
|
|
60
|
+
assignment_id: string;
|
|
61
|
+
state_event_id: string;
|
|
62
|
+
state_sequence: number;
|
|
63
|
+
state: RuntimeProcessingState;
|
|
64
|
+
occurred_at?: number;
|
|
65
|
+
undispatched_id?: string;
|
|
66
|
+
retryable?: boolean;
|
|
67
|
+
reason_code?: string;
|
|
68
|
+
detail?: string;
|
|
69
|
+
reply_request_id?: string;
|
|
70
|
+
outbound_message_id?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface RuntimeAssignmentContext {
|
|
73
|
+
undispatchedId: string;
|
|
74
|
+
sourceMessageId: string;
|
|
75
|
+
assignmentId: string;
|
|
76
|
+
targetRef: RuntimeWorkTargetRef;
|
|
77
|
+
deliveryIntent: "external_handoff";
|
|
78
|
+
replyCorrelationId?: string;
|
|
79
|
+
}
|
|
50
80
|
export type BrokerHttpErrorExtra = Record<string, unknown>;
|
|
51
81
|
export declare class BrokerHttpError extends Error {
|
|
52
82
|
readonly status: number;
|
|
@@ -68,13 +98,15 @@ export interface RunningIPCServer {
|
|
|
68
98
|
close(): Promise<void>;
|
|
69
99
|
}
|
|
70
100
|
export declare function startIPCServer(opts: IPCServerOptions): Promise<RunningIPCServer>;
|
|
71
|
-
export declare function pushToPlugin(ws: WebSocket, event: PushEvent):
|
|
101
|
+
export declare function pushToPlugin(ws: WebSocket, event: PushEvent): boolean;
|
|
72
102
|
export type PushEvent = {
|
|
73
103
|
event: "message_received";
|
|
74
104
|
from: string;
|
|
75
105
|
content: string;
|
|
76
106
|
contentType: string;
|
|
77
107
|
metadata?: Record<string, unknown>;
|
|
108
|
+
sourceMessageId?: string;
|
|
109
|
+
runtimeAssignment?: RuntimeAssignmentContext;
|
|
78
110
|
} | {
|
|
79
111
|
event: "ping";
|
|
80
112
|
ts: string;
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"ipc-server.d.ts","sourceRoot":"","sources":["../../src/broker/ipc-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -135,6 +135,12 @@ async function routeHttp(req, res, bearerToken, handlers, logger, getNetworkPres
|
|
|
135
135
|
sendJson(res, 200, out);
|
|
136
136
|
return;
|
|
137
137
|
}
|
|
138
|
+
if (method === "POST" && url === "/v1/runtime/processing-state") {
|
|
139
|
+
const body = await readJson(req);
|
|
140
|
+
await handlers.reportProcessingState(body);
|
|
141
|
+
sendJson(res, 200, { ok: true });
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
138
144
|
if (method === "GET" && url === "/v1/undispatched") {
|
|
139
145
|
const items = await handlers.listUndispatched();
|
|
140
146
|
sendJson(res, 200, { items });
|
|
@@ -274,8 +280,9 @@ async function closeServer(http, wss) {
|
|
|
274
280
|
}
|
|
275
281
|
export function pushToPlugin(ws, event) {
|
|
276
282
|
if (ws.readyState !== WebSocket.OPEN)
|
|
277
|
-
return;
|
|
283
|
+
return false;
|
|
278
284
|
ws.send(JSON.stringify(event));
|
|
285
|
+
return true;
|
|
279
286
|
}
|
|
280
287
|
export function parsePluginFrame(data) {
|
|
281
288
|
try {
|
package/dist/broker/paths.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/broker/paths.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,iBAAiB;IAEhC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAE1B,aAAa,EAAE,MAAM,CAAC;IAEtB,YAAY,EAAE,MAAM,CAAC;IAErB,MAAM,EAAE,MAAM,CAAC;IAQf,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE,iBAAsB,GAC3B,WAAW,
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/broker/paths.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,iBAAiB;IAEhC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAE1B,aAAa,EAAE,MAAM,CAAC;IAEtB,kBAAkB,EAAE,MAAM,CAAC;IAE3B,YAAY,EAAE,MAAM,CAAC;IAErB,MAAM,EAAE,MAAM,CAAC;IAQf,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE,iBAAsB,GAC3B,WAAW,CAiCb"}
|
package/dist/broker/paths.js
CHANGED
|
@@ -20,6 +20,7 @@ export function resolveBrokerPaths(principal, runtimeToken, opts = {}) {
|
|
|
20
20
|
const buffersDir = join(discoveryDir, "buffers");
|
|
21
21
|
return {
|
|
22
22
|
discoveryFile: join(discoveryDir, "discovery.json"),
|
|
23
|
+
deliveryCursorFile: join(discoveryDir, "delivery-cursor.json"),
|
|
23
24
|
discoveryDir,
|
|
24
25
|
logDir,
|
|
25
26
|
buffersDir,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { RuntimeAssignmentContext } from "./ipc-server.js";
|
|
1
2
|
export interface BufferedMessage {
|
|
2
3
|
id: string;
|
|
3
4
|
arrived_at: string;
|
|
@@ -6,6 +7,8 @@ export interface BufferedMessage {
|
|
|
6
7
|
content: string;
|
|
7
8
|
contentType: string;
|
|
8
9
|
metadata?: Record<string, unknown>;
|
|
10
|
+
sourceMessageId?: string;
|
|
11
|
+
runtimeAssignment?: RuntimeAssignmentContext;
|
|
9
12
|
};
|
|
10
13
|
}
|
|
11
14
|
export interface ReconnectingBuffer {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconnecting-buffer.d.ts","sourceRoot":"","sources":["../../src/broker/reconnecting-buffer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reconnecting-buffer.d.ts","sourceRoot":"","sources":["../../src/broker/reconnecting-buffer.ts"],"names":[],"mappings":"AA8CA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAEhE,MAAM,WAAW,eAAe;IAE9B,EAAE,EAAE,MAAM,CAAC;IAEX,UAAU,EAAE,MAAM,CAAC;IAEnB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;KAC9C,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IAEjC,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAAC;IAEnC,IAAI,IAAI,eAAe,EAAE,CAAC;IAE1B,KAAK,IAAI,eAAe,EAAE,CAAC;IAE3B,MAAM,IAAI,IAAI,CAAC;IAEf,IAAI,IAAI,MAAM,CAAC;CAChB;AAiFD,MAAM,WAAW,yBAAyB;IAExC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAErD,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,MAAM,GACjB,yBAAyB,CAmB3B"}
|
|
@@ -7,6 +7,9 @@ class FileBackedBuffer {
|
|
|
7
7
|
this.path = path;
|
|
8
8
|
}
|
|
9
9
|
append(msg) {
|
|
10
|
+
if (this.read().some((existing) => existing.id === msg.id)) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
10
13
|
const line = `${JSON.stringify(msg)}\n`;
|
|
11
14
|
try {
|
|
12
15
|
mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 });
|
|
@@ -1,5 +1,7 @@
|
|
|
1
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
|
+
import type { RuntimeInboundRoutedEvent } from "./runtime-inbound-routed-event-types.js";
|
|
4
|
+
import type { RuntimeProcessingStateEvent } from "./runtime-processing-state-event-types.js";
|
|
3
5
|
import type { UndispatchedChangedEvent } from "./undispatched-changed-event-types.js";
|
|
4
6
|
export type EmitOutcome = {
|
|
5
7
|
ok: true;
|
|
@@ -17,5 +19,7 @@ export interface RuntimeEndpointPort {
|
|
|
17
19
|
updateDisplayMetadata?(endpointId: string, params: UpdateRuntimeEndpointDisplayMetadataParams): Promise<void>;
|
|
18
20
|
emitUndispatchedChanged?(event: UndispatchedChangedEvent): Promise<EmitOutcome>;
|
|
19
21
|
emitNetworkPresenceChanged?(event: NetworkPresenceChangedEvent): Promise<EmitOutcome>;
|
|
22
|
+
emitRuntimeInboundRouted?(event: RuntimeInboundRoutedEvent): Promise<EmitOutcome>;
|
|
23
|
+
emitRuntimeProcessingState?(event: RuntimeProcessingStateEvent): Promise<EmitOutcome>;
|
|
20
24
|
}
|
|
21
25
|
//# sourceMappingURL=runtime-endpoint-port.d.ts.map
|
|
@@ -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,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
|
+
{"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,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACzF,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;IAMxB,wBAAwB,CAAC,CACvB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,WAAW,CAAC,CAAC;IAMxB,0BAA0B,CAAC,CACzB,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,WAAW,CAAC,CAAC;CACzB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { BrokerLogger } from "./logger.js";
|
|
2
|
+
import type { RuntimeInboundRoutedEvent } from "./runtime-inbound-routed-event-types.js";
|
|
3
|
+
import type { EmitOutcome, RuntimeEndpointPort } from "./runtime-endpoint-port.js";
|
|
4
|
+
export declare const DEFAULT_INBOUND_ROUTED_EMITTER_CAPACITY = 1024;
|
|
5
|
+
export declare const DEFAULT_INBOUND_ROUTED_EMITTER_BACKOFF_INITIAL_MS = 500;
|
|
6
|
+
export declare const DEFAULT_INBOUND_ROUTED_EMITTER_BACKOFF_MAX_MS = 30000;
|
|
7
|
+
export declare const DEFAULT_INBOUND_ROUTED_EMITTER_MAX_RETRIES = 5;
|
|
8
|
+
export interface RuntimeInboundRoutedEmitterOptions {
|
|
9
|
+
capacity?: number;
|
|
10
|
+
backoffInitialMs?: number;
|
|
11
|
+
backoffMaxMs?: number;
|
|
12
|
+
maxRetries?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface RuntimeInboundRoutedEmitter {
|
|
15
|
+
enqueue(event: RuntimeInboundRoutedEvent): boolean;
|
|
16
|
+
size(): number;
|
|
17
|
+
capacity(): number;
|
|
18
|
+
shutdown(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export declare function createRuntimeInboundRoutedEmitter(post: (event: RuntimeInboundRoutedEvent) => Promise<EmitOutcome>, logger: BrokerLogger, opts?: RuntimeInboundRoutedEmitterOptions): RuntimeInboundRoutedEmitter;
|
|
21
|
+
export declare function postRuntimeInboundRoutedViaPort(apiPort: RuntimeEndpointPort): (event: RuntimeInboundRoutedEvent) => Promise<EmitOutcome>;
|
|
22
|
+
//# sourceMappingURL=runtime-inbound-routed-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-inbound-routed-emitter.d.ts","sourceRoot":"","sources":["../../src/broker/runtime-inbound-routed-emitter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AAEpC,eAAO,MAAM,uCAAuC,OAAO,CAAC;AAC5D,eAAO,MAAM,iDAAiD,MAAM,CAAC;AACrE,eAAO,MAAM,6CAA6C,QAAS,CAAC;AACpE,eAAO,MAAM,0CAA0C,IAAI,CAAC;AAE5D,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC;IACnD,IAAI,IAAI,MAAM,CAAC;IACf,QAAQ,IAAI,MAAM,CAAC;IACnB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,OAAO,CAAC,WAAW,CAAC,EAChE,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,kCAAuC,GAC5C,2BAA2B,CAsI7B;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,mBAAmB,GAC3B,CAAC,KAAK,EAAE,yBAAyB,KAAK,OAAO,CAAC,WAAW,CAAC,CAW5D"}
|