@relaycast/engine 5.1.0 → 6.0.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.
Files changed (74) hide show
  1. package/dist/adapters/node/realtime.d.ts +28 -1
  2. package/dist/adapters/node/realtime.d.ts.map +1 -1
  3. package/dist/adapters/node/realtime.js +229 -50
  4. package/dist/adapters/node/realtime.js.map +1 -1
  5. package/dist/auth/tokenKind.d.ts +1 -1
  6. package/dist/auth/tokenKind.d.ts.map +1 -1
  7. package/dist/auth/tokenKind.js +4 -1
  8. package/dist/auth/tokenKind.js.map +1 -1
  9. package/dist/db/migrations/0028_node_providers.sql +55 -0
  10. package/dist/db/schema.d.ts +376 -0
  11. package/dist/db/schema.d.ts.map +1 -1
  12. package/dist/db/schema.js +59 -1
  13. package/dist/db/schema.js.map +1 -1
  14. package/dist/engine/action.d.ts +44 -1
  15. package/dist/engine/action.d.ts.map +1 -1
  16. package/dist/engine/action.js +237 -18
  17. package/dist/engine/action.js.map +1 -1
  18. package/dist/engine/delivery.d.ts.map +1 -1
  19. package/dist/engine/delivery.js +2 -1
  20. package/dist/engine/delivery.js.map +1 -1
  21. package/dist/engine/inboundWebhook.d.ts +24 -0
  22. package/dist/engine/inboundWebhook.d.ts.map +1 -1
  23. package/dist/engine/inboundWebhook.js +74 -0
  24. package/dist/engine/inboundWebhook.js.map +1 -1
  25. package/dist/engine/node.d.ts +71 -28
  26. package/dist/engine/node.d.ts.map +1 -1
  27. package/dist/engine/node.js +230 -106
  28. package/dist/engine/node.js.map +1 -1
  29. package/dist/engine/nodeContext.d.ts.map +1 -1
  30. package/dist/engine/nodeContext.js +17 -6
  31. package/dist/engine/nodeContext.js.map +1 -1
  32. package/dist/engine/nodeDeliver.d.ts.map +1 -1
  33. package/dist/engine/nodeDeliver.js +4 -1
  34. package/dist/engine/nodeDeliver.js.map +1 -1
  35. package/dist/engine/nodeProvider.d.ts +62 -0
  36. package/dist/engine/nodeProvider.d.ts.map +1 -0
  37. package/dist/engine/nodeProvider.js +256 -0
  38. package/dist/engine/nodeProvider.js.map +1 -0
  39. package/dist/engine.d.ts.map +1 -1
  40. package/dist/engine.js +2 -0
  41. package/dist/engine.js.map +1 -1
  42. package/dist/middleware/auth.d.ts +6 -0
  43. package/dist/middleware/auth.d.ts.map +1 -1
  44. package/dist/middleware/auth.js +6 -0
  45. package/dist/middleware/auth.js.map +1 -1
  46. package/dist/middleware/idempotency.d.ts +1 -0
  47. package/dist/middleware/idempotency.d.ts.map +1 -1
  48. package/dist/middleware/idempotency.js +21 -2
  49. package/dist/middleware/idempotency.js.map +1 -1
  50. package/dist/node-control.d.ts +1 -1
  51. package/dist/node-control.d.ts.map +1 -1
  52. package/dist/node-control.js +11 -1
  53. package/dist/node-control.js.map +1 -1
  54. package/dist/ports/auth.d.ts +1 -1
  55. package/dist/ports/auth.d.ts.map +1 -1
  56. package/dist/ports/index.d.ts +6 -0
  57. package/dist/ports/index.d.ts.map +1 -1
  58. package/dist/ports/realtime.d.ts +24 -2
  59. package/dist/ports/realtime.d.ts.map +1 -1
  60. package/dist/routes/deliveryRouting.d.ts +3 -1
  61. package/dist/routes/deliveryRouting.d.ts.map +1 -1
  62. package/dist/routes/deliveryRouting.js +14 -5
  63. package/dist/routes/deliveryRouting.js.map +1 -1
  64. package/dist/routes/message.d.ts.map +1 -1
  65. package/dist/routes/message.js +44 -14
  66. package/dist/routes/message.js.map +1 -1
  67. package/dist/routes/node.d.ts.map +1 -1
  68. package/dist/routes/node.js +89 -3
  69. package/dist/routes/node.js.map +1 -1
  70. package/dist/routes/relayfileInbound.d.ts +41 -0
  71. package/dist/routes/relayfileInbound.d.ts.map +1 -0
  72. package/dist/routes/relayfileInbound.js +446 -0
  73. package/dist/routes/relayfileInbound.js.map +1 -0
  74. package/package.json +3 -3
@@ -26,14 +26,31 @@ export interface SocketHandle {
26
26
  export declare class InProcessRealtime implements RealtimeBus, ConnectionRegistry, NodeConnectionRegistry {
27
27
  private readonly db;
28
28
  private readonly workspaceSockets;
29
- private readonly nodeSockets;
29
+ /** Every attached node control connection, keyed by its registry connection id. */
30
+ private readonly nodeConnections;
31
+ /** All connection ids attached to a node (bound to a provider or not yet). */
32
+ private readonly nodeConnIndex;
33
+ /** Per node, the connection id currently bound to each provider name. */
34
+ private readonly providerIndex;
35
+ /** Per-provider queued `action.invoke` frames (`workspace:node::provider`). */
30
36
  private readonly nodeQueues;
31
37
  /** Serializes drains per node so concurrent triggers never overlap. */
32
38
  private readonly nodeDrainChains;
33
39
  private nodeCompletionDeps;
40
+ private connectionSeq;
34
41
  constructor(db: EngineDb);
35
42
  setNodeCompletionDeps(deps: InvocationCompletionDeps): void;
36
43
  private nodeKey;
44
+ private providerQueueKey;
45
+ private providerConnId;
46
+ private providerSocket;
47
+ /**
48
+ * The provider a node-addressed message targets when none is specified: the
49
+ * `default` provider if attached, otherwise any currently-attached provider.
50
+ * Never returns a name that is not in the index, so node-level sends do not
51
+ * silently target a phantom provider. `undefined` means nothing is attached.
52
+ */
53
+ private defaultProviderName;
37
54
  publishToWorkspaceStream(args: {
38
55
  workspaceId: string;
39
56
  event: EngineEvent;
@@ -48,12 +65,22 @@ export declare class InProcessRealtime implements RealtimeBus, ConnectionRegistr
48
65
  upgrade(_args: UpgradeArgs): Promise<Response>;
49
66
  upgradeNode(_args: NodeUpgradeArgs): Promise<Response>;
50
67
  sendToNode(workspaceId: string, nodeId: string, message: FleetRelaycastToBrokerMessage): Promise<boolean>;
68
+ sendToProvider(workspaceId: string, nodeId: string, providerName: string, message: FleetRelaycastToBrokerMessage): Promise<boolean>;
51
69
  isNodeConnected(workspaceId: string, nodeId: string): boolean;
70
+ isProviderConnected(workspaceId: string, nodeId: string, providerName: string): boolean;
71
+ providerNameForConnection(connectionId: string): string | undefined;
72
+ providerAttachConflict(workspaceId: string, nodeId: string, providerName: string, _instanceId: string, connectionId: string): {
73
+ code: string;
74
+ message: string;
75
+ } | null;
76
+ attachProvider(workspaceId: string, nodeId: string, providerName: string, instanceId: string, connectionId: string): void;
77
+ detachProvider(workspaceId: string, nodeId: string, providerName: string): void;
52
78
  disconnectNode(workspaceId: string, nodeId: string): Promise<void>;
53
79
  /** Register a live workspace-stream socket; returns handlers the transport drives. */
54
80
  attachWorkspaceSocket(workspaceId: string, socket: EngineSocket, observerToken?: ObserverToken): SocketHandle;
55
81
  /** Register a live fleet node control socket; returns handlers the transport drives. */
56
82
  attachNodeSocket(workspaceId: string, nodeId: string, socket: EngineSocket): SocketHandle;
83
+ private onNodeConnectionClose;
57
84
  /**
58
85
  * Public, serialized drain entrypoint. Concurrent calls for the same node are
59
86
  * chained so two drains never run at once (which could double-reserve spawn
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/realtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,eAAe,EAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAKxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AA0BD;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,WAAW,EAAE,kBAAkB,EAAE,sBAAsB;IAQnF,OAAO,CAAC,QAAQ,CAAC,EAAE;IAP/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyC;IAC1E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0C;IACrE,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IACpE,OAAO,CAAC,kBAAkB,CAAuC;gBAEpC,EAAE,EAAE,QAAQ;IAEzC,qBAAqB,CAAC,IAAI,EAAE,wBAAwB,GAAG,IAAI;IAI3D,OAAO,CAAC,OAAO;IAIT,wBAAwB,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsChG;;;;;OAKG;YACW,uBAAuB;IAmB/B,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAS9C,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAItD,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,OAAO,CAAC;IA0BnB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAIvD,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxE,sFAAsF;IACtF,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,YAAY;IAqB7G,wFAAwF;IACxF,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,YAAY;IAoCzF;;;;OAIG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAW/C,cAAc;YAQd,kBAAkB;CAQjC"}
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/realtime.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { and, eq, gt, isNull, or } from 'drizzle-orm';
2
2
  import { observerTokens } from '../../db/schema.js';
3
- import { handleNodeControlMessage, markNodeOffline } from '../../engine/node.js';
3
+ import { handleNodeControlMessage, handleProviderDisconnect, markNodeOffline } from '../../engine/node.js';
4
+ import { DEFAULT_PROVIDER_NAME } from '../../engine/nodeProvider.js';
5
+ import { NODE_LIVENESS_TTL_MS } from '../../engine/placement.js';
4
6
  import { drainNodeInvocations } from '../../engine/action.js';
5
7
  import { observerAllowsEvent } from '../../engine/observerToken.js';
6
8
  /**
@@ -18,11 +20,18 @@ const OBSERVER_TOKEN_REVALIDATE_MS = 5_000;
18
20
  export class InProcessRealtime {
19
21
  db;
20
22
  workspaceSockets = new Map();
21
- nodeSockets = new Map();
23
+ /** Every attached node control connection, keyed by its registry connection id. */
24
+ nodeConnections = new Map();
25
+ /** All connection ids attached to a node (bound to a provider or not yet). */
26
+ nodeConnIndex = new Map();
27
+ /** Per node, the connection id currently bound to each provider name. */
28
+ providerIndex = new Map();
29
+ /** Per-provider queued `action.invoke` frames (`workspace:node::provider`). */
22
30
  nodeQueues = new Map();
23
31
  /** Serializes drains per node so concurrent triggers never overlap. */
24
32
  nodeDrainChains = new Map();
25
33
  nodeCompletionDeps;
34
+ connectionSeq = 0;
26
35
  constructor(db) {
27
36
  this.db = db;
28
37
  }
@@ -32,6 +41,47 @@ export class InProcessRealtime {
32
41
  nodeKey(workspaceId, nodeId) {
33
42
  return `${workspaceId}:${nodeId}`;
34
43
  }
44
+ providerQueueKey(nodeKey, providerName) {
45
+ return `${nodeKey}::${providerName}`;
46
+ }
47
+ providerConnId(nodeKey, providerName) {
48
+ return this.providerIndex.get(nodeKey)?.get(providerName);
49
+ }
50
+ providerSocket(nodeKey, providerName) {
51
+ const connId = this.providerConnId(nodeKey, providerName);
52
+ if (connId)
53
+ return this.nodeConnections.get(connId)?.socket;
54
+ // Reconnect-before-reregister applies only to the synthetic `default`
55
+ // provider (the legacy single-socket broker): its sole live connection is
56
+ // addressable even before it re-registers, so queued frames drain to it. A
57
+ // named provider's queue never drains to an unbound connection whose
58
+ // identity isn't yet established — that could misroute to a different
59
+ // provider that happens to be reconnecting.
60
+ if (providerName !== DEFAULT_PROVIDER_NAME)
61
+ return undefined;
62
+ const conns = this.nodeConnIndex.get(nodeKey);
63
+ if (conns && conns.size === 1) {
64
+ const [only] = [...conns];
65
+ const conn = this.nodeConnections.get(only);
66
+ if (conn && !conn.providerName)
67
+ return conn.socket;
68
+ }
69
+ return undefined;
70
+ }
71
+ /**
72
+ * The provider a node-addressed message targets when none is specified: the
73
+ * `default` provider if attached, otherwise any currently-attached provider.
74
+ * Never returns a name that is not in the index, so node-level sends do not
75
+ * silently target a phantom provider. `undefined` means nothing is attached.
76
+ */
77
+ defaultProviderName(nodeKey) {
78
+ const providers = this.providerIndex.get(nodeKey);
79
+ if (!providers || providers.size === 0)
80
+ return undefined;
81
+ if (providers.has(DEFAULT_PROVIDER_NAME))
82
+ return DEFAULT_PROVIDER_NAME;
83
+ return [...providers.keys()][0];
84
+ }
35
85
  async publishToWorkspaceStream(args) {
36
86
  const set = this.workspaceSockets.get(args.workspaceId);
37
87
  if (!set || set.size === 0)
@@ -100,45 +150,138 @@ export class InProcessRealtime {
100
150
  return new Response('WebSocket upgrade is handled by the Node server', { status: 426 });
101
151
  }
102
152
  async sendToNode(workspaceId, nodeId, message) {
103
- const key = this.nodeKey(workspaceId, nodeId);
104
- const current = this.nodeSockets.get(key)?.socket;
105
- if (current) {
153
+ const nodeKey = this.nodeKey(workspaceId, nodeId);
154
+ const providerName = this.defaultProviderName(nodeKey) ?? DEFAULT_PROVIDER_NAME;
155
+ return this.sendToProvider(workspaceId, nodeId, providerName, message);
156
+ }
157
+ async sendToProvider(workspaceId, nodeId, providerName, message) {
158
+ const nodeKey = this.nodeKey(workspaceId, nodeId);
159
+ const socket = this.providerSocket(nodeKey, providerName);
160
+ if (socket) {
106
161
  try {
107
- current.send(JSON.stringify(message));
162
+ socket.send(JSON.stringify(message));
108
163
  return true;
109
164
  }
110
165
  catch {
111
- this.nodeSockets.delete(key);
166
+ this.detachProvider(workspaceId, nodeId, providerName);
112
167
  }
113
168
  }
114
169
  if (message.type !== 'action.invoke') {
115
170
  return false;
116
171
  }
117
- const queue = this.nodeQueues.get(key) ?? [];
118
- const queueKey = `${message.type}:${message.invocation_id}`;
119
- if (!queue.some((item) => item.key === queueKey)) {
120
- queue.push({ key: queueKey, message });
172
+ const queueKey = this.providerQueueKey(nodeKey, providerName);
173
+ const queue = this.nodeQueues.get(queueKey) ?? [];
174
+ const dedupKey = `${message.type}:${message.invocation_id}`;
175
+ if (!queue.some((item) => item.key === dedupKey)) {
176
+ queue.push({ key: dedupKey, message });
121
177
  }
122
178
  while (queue.length > 100)
123
179
  queue.shift();
124
- this.nodeQueues.set(key, queue);
180
+ this.nodeQueues.set(queueKey, queue);
125
181
  return true;
126
182
  }
127
183
  isNodeConnected(workspaceId, nodeId) {
128
- return !!this.nodeSockets.get(this.nodeKey(workspaceId, nodeId));
184
+ const conns = this.nodeConnIndex.get(this.nodeKey(workspaceId, nodeId));
185
+ return !!conns && conns.size > 0;
129
186
  }
130
- async disconnectNode(workspaceId, nodeId) {
131
- const key = this.nodeKey(workspaceId, nodeId);
132
- const conn = this.nodeSockets.get(key);
187
+ isProviderConnected(workspaceId, nodeId, providerName) {
188
+ return !!this.providerSocket(this.nodeKey(workspaceId, nodeId), providerName);
189
+ }
190
+ providerNameForConnection(connectionId) {
191
+ return this.nodeConnections.get(connectionId)?.providerName;
192
+ }
193
+ providerAttachConflict(workspaceId, nodeId, providerName, _instanceId, connectionId) {
194
+ const nodeKey = this.nodeKey(workspaceId, nodeId);
195
+ const existingConnId = this.providerConnId(nodeKey, providerName);
196
+ if (!existingConnId || existingConnId === connectionId)
197
+ return null;
198
+ const existing = this.nodeConnections.get(existingConnId);
199
+ if (!existing)
200
+ return null;
201
+ // A still-live instance owns the name (duplicate process). A dropped or
202
+ // silent (stale) instance is a reconnect and gets replaced on attach.
203
+ if (Date.now() - existing.lastSeen <= NODE_LIVENESS_TTL_MS) {
204
+ return {
205
+ code: 'provider_instance_conflict',
206
+ message: `Provider "${providerName}" is already connected on this node`,
207
+ };
208
+ }
209
+ return null;
210
+ }
211
+ attachProvider(workspaceId, nodeId, providerName, instanceId, connectionId) {
212
+ const conn = this.nodeConnections.get(connectionId);
133
213
  if (!conn)
134
214
  return;
135
- this.nodeSockets.delete(key);
136
- try {
137
- conn.socket.close(1000, 'force-disconnect');
215
+ const nodeKey = this.nodeKey(workspaceId, nodeId);
216
+ let providers = this.providerIndex.get(nodeKey);
217
+ if (!providers) {
218
+ providers = new Map();
219
+ this.providerIndex.set(nodeKey, providers);
138
220
  }
139
- catch {
140
- // already closed
221
+ const existingConnId = providers.get(providerName);
222
+ if (existingConnId && existingConnId !== connectionId) {
223
+ const superseded = this.nodeConnections.get(existingConnId);
224
+ this.nodeConnections.delete(existingConnId);
225
+ const conns = this.nodeConnIndex.get(nodeKey);
226
+ if (conns) {
227
+ conns.delete(existingConnId);
228
+ if (conns.size === 0)
229
+ this.nodeConnIndex.delete(nodeKey);
230
+ }
231
+ if (superseded) {
232
+ superseded.providerName = undefined;
233
+ try {
234
+ superseded.socket.close(1000, 'superseded');
235
+ }
236
+ catch {
237
+ // already closed
238
+ }
239
+ }
240
+ }
241
+ conn.providerName = providerName;
242
+ conn.instanceId = instanceId;
243
+ conn.lastSeen = Date.now();
244
+ providers.set(providerName, connectionId);
245
+ }
246
+ detachProvider(workspaceId, nodeId, providerName) {
247
+ const nodeKey = this.nodeKey(workspaceId, nodeId);
248
+ const providers = this.providerIndex.get(nodeKey);
249
+ const connId = providers?.get(providerName);
250
+ if (providers) {
251
+ providers.delete(providerName);
252
+ if (providers.size === 0)
253
+ this.providerIndex.delete(nodeKey);
254
+ }
255
+ if (connId) {
256
+ const conn = this.nodeConnections.get(connId);
257
+ if (conn)
258
+ conn.providerName = undefined;
259
+ }
260
+ this.nodeQueues.delete(this.providerQueueKey(nodeKey, providerName));
261
+ }
262
+ async disconnectNode(workspaceId, nodeId) {
263
+ const nodeKey = this.nodeKey(workspaceId, nodeId);
264
+ const providers = this.providerIndex.get(nodeKey);
265
+ const connIds = new Set(providers ? providers.values() : []);
266
+ // Also close any connections bound to this node that never registered.
267
+ for (const [connId, conn] of this.nodeConnections) {
268
+ if (conn.nodeId === nodeId && conn.workspaceId === workspaceId)
269
+ connIds.add(connId);
270
+ }
271
+ for (const connId of connIds) {
272
+ const conn = this.nodeConnections.get(connId);
273
+ this.nodeConnections.delete(connId);
274
+ if (conn) {
275
+ try {
276
+ conn.socket.close(1000, 'force-disconnect');
277
+ }
278
+ catch {
279
+ // already closed
280
+ }
281
+ }
141
282
  }
283
+ this.providerIndex.delete(nodeKey);
284
+ this.nodeConnIndex.delete(nodeKey);
142
285
  }
143
286
  /* --------------------- Node transport attach helpers ----------------- */
144
287
  /** Register a live workspace-stream socket; returns handlers the transport drives. */
@@ -164,34 +307,37 @@ export class InProcessRealtime {
164
307
  }
165
308
  /** Register a live fleet node control socket; returns handlers the transport drives. */
166
309
  attachNodeSocket(workspaceId, nodeId, socket) {
167
- const key = this.nodeKey(workspaceId, nodeId);
168
- const previous = this.nodeSockets.get(key)?.socket;
169
- this.nodeSockets.set(key, { socket });
170
- if (previous && previous !== socket) {
171
- try {
172
- previous.close(1000, 'superseded');
173
- }
174
- catch {
175
- // already closed
176
- }
310
+ const connectionId = `nconn_${++this.connectionSeq}`;
311
+ const nodeKey = this.nodeKey(workspaceId, nodeId);
312
+ this.nodeConnections.set(connectionId, {
313
+ socket,
314
+ workspaceId,
315
+ nodeId,
316
+ lastSeen: Date.now(),
317
+ });
318
+ let conns = this.nodeConnIndex.get(nodeKey);
319
+ if (!conns) {
320
+ conns = new Set();
321
+ this.nodeConnIndex.set(nodeKey, conns);
177
322
  }
323
+ conns.add(connectionId);
178
324
  const handle = {
179
- handleMessage: async (raw) => handleNodeControlMessage({
180
- db: this.db,
181
- registry: this,
182
- completionDeps: this.nodeCompletionDeps,
183
- workspaceId,
184
- nodeId,
185
- socket,
186
- raw,
187
- }),
188
- handleClose: async () => {
189
- const conn = this.nodeSockets.get(key);
190
- if (conn?.socket === socket) {
191
- this.nodeSockets.delete(key);
192
- await markNodeOffline(this.db, this, workspaceId, nodeId).catch(() => { });
193
- }
325
+ handleMessage: async (raw) => {
326
+ const conn = this.nodeConnections.get(connectionId);
327
+ if (conn)
328
+ conn.lastSeen = Date.now();
329
+ return handleNodeControlMessage({
330
+ db: this.db,
331
+ registry: this,
332
+ completionDeps: this.nodeCompletionDeps,
333
+ workspaceId,
334
+ nodeId,
335
+ socket,
336
+ connectionId,
337
+ raw,
338
+ });
194
339
  },
340
+ handleClose: async () => this.onNodeConnectionClose(connectionId),
195
341
  };
196
342
  // Best-effort early flush (covers non-spawn frames that need no capacity);
197
343
  // the authoritative drain fires post node.register/heartbeat once the node
@@ -199,6 +345,35 @@ export class InProcessRealtime {
199
345
  void this.drainNode(workspaceId, nodeId);
200
346
  return handle;
201
347
  }
348
+ async onNodeConnectionClose(connectionId) {
349
+ const conn = this.nodeConnections.get(connectionId);
350
+ if (!conn)
351
+ return;
352
+ this.nodeConnections.delete(connectionId);
353
+ const { workspaceId, nodeId, providerName } = conn;
354
+ const nodeKey = this.nodeKey(workspaceId, nodeId);
355
+ const conns = this.nodeConnIndex.get(nodeKey);
356
+ if (conns) {
357
+ conns.delete(connectionId);
358
+ if (conns.size === 0)
359
+ this.nodeConnIndex.delete(nodeKey);
360
+ }
361
+ const providers = this.providerIndex.get(nodeKey);
362
+ if (providerName && providers?.get(providerName) === connectionId) {
363
+ providers.delete(providerName);
364
+ if (providers.size === 0)
365
+ this.providerIndex.delete(nodeKey);
366
+ this.nodeQueues.delete(this.providerQueueKey(nodeKey, providerName));
367
+ }
368
+ const hasRemaining = this.isNodeConnected(workspaceId, nodeId);
369
+ if (providerName) {
370
+ await handleProviderDisconnect(this.db, this, workspaceId, nodeId, providerName, hasRemaining).catch(() => { });
371
+ }
372
+ else if (!hasRemaining) {
373
+ // Connection dropped before it bound a provider and it was the node's last.
374
+ await markNodeOffline(this.db, this, workspaceId, nodeId).catch(() => { });
375
+ }
376
+ }
202
377
  /**
203
378
  * Public, serialized drain entrypoint. Concurrent calls for the same node are
204
379
  * chained so two drains never run at once (which could double-reserve spawn
@@ -216,12 +391,16 @@ export class InProcessRealtime {
216
391
  return next;
217
392
  }
218
393
  async drainNodeQueue(workspaceId, nodeId) {
219
- const key = this.nodeKey(workspaceId, nodeId);
220
- const conn = this.nodeSockets.get(key)?.socket;
221
- if (!conn)
394
+ if (!this.isNodeConnected(workspaceId, nodeId))
222
395
  return;
223
396
  await drainNodeInvocations(this.db, this, workspaceId, nodeId);
224
- this.nodeQueues.delete(key);
397
+ // The authoritative re-dispatch is DB-driven; clear the per-provider
398
+ // in-memory buffers now that their frames have been re-sent.
399
+ const nodeKey = this.nodeKey(workspaceId, nodeId);
400
+ for (const queueKey of [...this.nodeQueues.keys()]) {
401
+ if (queueKey.startsWith(`${nodeKey}::`))
402
+ this.nodeQueues.delete(queueKey);
403
+ }
225
404
  }
226
405
  async onWorkspaceMessage(socket, raw) {
227
406
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../../src/adapters/node/realtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../../src/adapters/node/realtime.ts"],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ export declare const authTokenSchema: z.ZodUnion<readonly [z.ZodPipe<z.ZodString
27
27
  export type ParsedAuthToken = z.infer<typeof authTokenSchema>;
28
28
  export declare function parseAuthToken(token: string): ParsedAuthToken | undefined;
29
29
  export declare function getAuthTokenKind(token: string): AuthTokenKind | undefined;
30
- export declare function requiredTokenMessage(kind: Exclude<AuthRequire, 'any'>): string;
30
+ export declare function requiredTokenMessage(kind: Exclude<AuthRequire, 'any' | 'sender'>): string;
31
31
  export type AuthRequirementValidation = {
32
32
  ok: true;
33
33
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"tokenKind.d.ts","sourceRoot":"","sources":["../../src/auth/tokenKind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;CAiBX,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,eAAe,CAAC;AAEzD,KAAK,cAAc,CAAC,IAAI,SAAS,aAAa,IAAI;IAChD,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAsBF,eAAO,MAAM,eAAe,iUAK1B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAGzE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEzE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,CAE9E;AAYD,MAAM,MAAM,yBAAyB,GACjC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,WAAW,GACnB,yBAAyB,CA+B3B"}
1
+ {"version":3,"file":"tokenKind.d.ts","sourceRoot":"","sources":["../../src/auth/tokenKind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;CAiBX,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,eAAe,CAAC;AAEzD,KAAK,cAAc,CAAC,IAAI,SAAS,aAAa,IAAI;IAChD,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAsBF,eAAO,MAAM,eAAe,iUAK1B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAGzE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEzE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,GAAG,QAAQ,CAAC,GAAG,MAAM,CAEzF;AAeD,MAAM,MAAM,yBAAyB,GACjC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,WAAW,GACnB,yBAAyB,CA+B3B"}
@@ -57,6 +57,9 @@ const allowedKindsByRequire = {
57
57
  // `any` intentionally means user/workspace API credentials, not transport-only
58
58
  // node credentials or scoped observer credentials.
59
59
  any: ['workspace', 'agent'],
60
+ // `sender` is a principal that can post a message: a workspace key, an agent
61
+ // (posts as itself), or a node token (posts as an explicit `from` agent).
62
+ sender: ['workspace', 'agent', 'node'],
60
63
  };
61
64
  export function validateTokenRequirement(tokenKind, require) {
62
65
  const allowedKinds = allowedKindsByRequire[require];
@@ -77,7 +80,7 @@ export function validateTokenRequirement(tokenKind, require) {
77
80
  message: 'Observer token cannot perform this operation',
78
81
  };
79
82
  }
80
- if (require === 'any') {
83
+ if (require === 'any' || require === 'sender') {
81
84
  return { ok: false, code: 'unauthorized', message: 'Invalid token format' };
82
85
  }
83
86
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"tokenKind.js","sourceRoot":"","sources":["../../src/auth/tokenKind.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokenKind.js","sourceRoot":"","sources":["../../src/auth/tokenKind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ -- Multi-provider nodes and node-scoped actions.
2
+ --
3
+ -- A node hosts N providers (the broker plus capability providers). Provider
4
+ -- capability sets persist in node_providers so an offline node still shows its
5
+ -- full manifest, and per-provider liveness/capacity aggregates onto the nodes
6
+ -- row. Actions become node-scoped with a recorded handler provider; a node
7
+ -- action may claim a workspace-global alias.
8
+
9
+ ALTER TABLE nodes ADD COLUMN machine_id TEXT DEFAULT NULL;
10
+ ALTER TABLE agents ADD COLUMN provider_name TEXT NOT NULL DEFAULT 'default';
11
+ ALTER TABLE actions ADD COLUMN handler_provider TEXT DEFAULT NULL;
12
+ ALTER TABLE actions ADD COLUMN is_global INTEGER NOT NULL DEFAULT 0;
13
+ ALTER TABLE actions ADD COLUMN queue INTEGER NOT NULL DEFAULT 0;
14
+
15
+ CREATE TABLE node_providers (
16
+ id TEXT PRIMARY KEY,
17
+ workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
18
+ node_id TEXT NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
19
+ name TEXT NOT NULL,
20
+ instance_id TEXT NOT NULL,
21
+ capabilities TEXT NOT NULL DEFAULT '[]',
22
+ max_agents INTEGER NOT NULL DEFAULT 0,
23
+ active_agents INTEGER NOT NULL DEFAULT 0,
24
+ load REAL NOT NULL DEFAULT 0,
25
+ handlers_live INTEGER NOT NULL DEFAULT 0,
26
+ status TEXT NOT NULL DEFAULT 'offline',
27
+ version TEXT NOT NULL DEFAULT 'unknown',
28
+ last_heartbeat_at INTEGER DEFAULT NULL,
29
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
30
+ );
31
+
32
+ CREATE UNIQUE INDEX node_providers_node_name_unique ON node_providers (workspace_id, node_id, name);
33
+ CREATE INDEX idx_node_providers_node ON node_providers (workspace_id, node_id);
34
+
35
+ -- Existing node-hosted actions were owned by the broker; record it and let them
36
+ -- keep resolving through the workspace-scoped invoke as global aliases.
37
+ UPDATE actions SET handler_provider = 'default', is_global = 1 WHERE handler_node_id IS NOT NULL;
38
+
39
+ -- Every broker node becomes its own `default` provider carrying its manifest.
40
+ INSERT INTO node_providers (
41
+ id, workspace_id, node_id, name, instance_id, capabilities,
42
+ max_agents, active_agents, load, handlers_live, status, version, last_heartbeat_at, created_at
43
+ )
44
+ SELECT
45
+ 'nprov_' || id, workspace_id, id, 'default', 'migrated', capabilities,
46
+ max_agents, active_agents, load, handlers_live, status, version, last_heartbeat_at, created_at
47
+ FROM nodes
48
+ WHERE role = 'broker';
49
+
50
+ -- Node-scoped uniqueness replaces the workspace-global unique; agent-hosted and
51
+ -- global-alias uniqueness are enforced by partial indexes.
52
+ DROP INDEX IF EXISTS actions_workspace_name_unique;
53
+ CREATE UNIQUE INDEX actions_workspace_node_name_unique ON actions (workspace_id, handler_node_id, name);
54
+ CREATE UNIQUE INDEX actions_workspace_agent_name_unique ON actions (workspace_id, name) WHERE handler_node_id IS NULL;
55
+ CREATE UNIQUE INDEX actions_workspace_global_name_unique ON actions (workspace_id, name) WHERE is_global = 1;