@relaycast/engine 5.0.0 → 5.0.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.
Files changed (202) hide show
  1. package/dist/adapters/node/index.d.ts.map +1 -1
  2. package/dist/adapters/node/index.js +0 -1
  3. package/dist/adapters/node/index.js.map +1 -1
  4. package/dist/adapters/node/realtime.d.ts +13 -41
  5. package/dist/adapters/node/realtime.d.ts.map +1 -1
  6. package/dist/adapters/node/realtime.js +68 -230
  7. package/dist/adapters/node/realtime.js.map +1 -1
  8. package/dist/auth/index.d.ts.map +1 -1
  9. package/dist/auth/index.js +31 -9
  10. package/dist/auth/index.js.map +1 -1
  11. package/dist/auth/tokenKind.d.ts +40 -0
  12. package/dist/auth/tokenKind.d.ts.map +1 -0
  13. package/dist/auth/tokenKind.js +89 -0
  14. package/dist/auth/tokenKind.js.map +1 -0
  15. package/dist/db/migrations/0025_node_kind_role_adapter.sql +45 -0
  16. package/dist/db/migrations/0026_observer_tokens.sql +32 -0
  17. package/dist/db/schema.d.ts +329 -0
  18. package/dist/db/schema.d.ts.map +1 -1
  19. package/dist/db/schema.js +32 -3
  20. package/dist/db/schema.js.map +1 -1
  21. package/dist/engine/action.d.ts +2 -2
  22. package/dist/engine/action.d.ts.map +1 -1
  23. package/dist/engine/action.js +182 -7
  24. package/dist/engine/action.js.map +1 -1
  25. package/dist/engine/activity.d.ts +6 -0
  26. package/dist/engine/activity.d.ts.map +1 -1
  27. package/dist/engine/activity.js +9 -2
  28. package/dist/engine/activity.js.map +1 -1
  29. package/dist/engine/agent.d.ts +0 -33
  30. package/dist/engine/agent.d.ts.map +1 -1
  31. package/dist/engine/agent.js +0 -155
  32. package/dist/engine/agent.js.map +1 -1
  33. package/dist/engine/attachments.d.ts +6 -0
  34. package/dist/engine/attachments.d.ts.map +1 -1
  35. package/dist/engine/attachments.js +37 -0
  36. package/dist/engine/attachments.js.map +1 -1
  37. package/dist/engine/console.d.ts +78 -1
  38. package/dist/engine/console.d.ts.map +1 -1
  39. package/dist/engine/console.js +175 -19
  40. package/dist/engine/console.js.map +1 -1
  41. package/dist/engine/delivery.d.ts +2 -0
  42. package/dist/engine/delivery.d.ts.map +1 -1
  43. package/dist/engine/delivery.js +4 -0
  44. package/dist/engine/delivery.js.map +1 -1
  45. package/dist/engine/deliveryWire.d.ts +4 -0
  46. package/dist/engine/deliveryWire.d.ts.map +1 -1
  47. package/dist/engine/deliveryWire.js +2 -0
  48. package/dist/engine/deliveryWire.js.map +1 -1
  49. package/dist/engine/deliveryWrites.d.ts +1 -0
  50. package/dist/engine/deliveryWrites.d.ts.map +1 -1
  51. package/dist/engine/deliveryWrites.js +7 -2
  52. package/dist/engine/deliveryWrites.js.map +1 -1
  53. package/dist/engine/dm.d.ts.map +1 -1
  54. package/dist/engine/dm.js +11 -33
  55. package/dist/engine/dm.js.map +1 -1
  56. package/dist/engine/dmAll.d.ts.map +1 -1
  57. package/dist/engine/dmAll.js +2 -0
  58. package/dist/engine/dmAll.js.map +1 -1
  59. package/dist/engine/groupDm.d.ts +2 -3
  60. package/dist/engine/groupDm.d.ts.map +1 -1
  61. package/dist/engine/groupDm.js +8 -26
  62. package/dist/engine/groupDm.js.map +1 -1
  63. package/dist/engine/invocationCompletion.d.ts +1 -1
  64. package/dist/engine/invocationCompletion.d.ts.map +1 -1
  65. package/dist/engine/invocationCompletion.js +9 -2
  66. package/dist/engine/invocationCompletion.js.map +1 -1
  67. package/dist/engine/message.d.ts.map +1 -1
  68. package/dist/engine/message.js +15 -44
  69. package/dist/engine/message.js.map +1 -1
  70. package/dist/engine/node.d.ts +13 -1
  71. package/dist/engine/node.d.ts.map +1 -1
  72. package/dist/engine/node.js +100 -31
  73. package/dist/engine/node.js.map +1 -1
  74. package/dist/engine/nodeContext.d.ts +6 -1
  75. package/dist/engine/nodeContext.d.ts.map +1 -1
  76. package/dist/engine/nodeContext.js +47 -32
  77. package/dist/engine/nodeContext.js.map +1 -1
  78. package/dist/engine/nodeDeliver.d.ts +23 -0
  79. package/dist/engine/nodeDeliver.d.ts.map +1 -0
  80. package/dist/engine/nodeDeliver.js +81 -0
  81. package/dist/engine/nodeDeliver.js.map +1 -0
  82. package/dist/engine/observerToken.d.ts +110 -0
  83. package/dist/engine/observerToken.d.ts.map +1 -0
  84. package/dist/engine/observerToken.js +528 -0
  85. package/dist/engine/observerToken.js.map +1 -0
  86. package/dist/engine/search.d.ts +4 -0
  87. package/dist/engine/search.d.ts.map +1 -1
  88. package/dist/engine/search.js +6 -1
  89. package/dist/engine/search.js.map +1 -1
  90. package/dist/engine/thread.d.ts +4 -3
  91. package/dist/engine/thread.d.ts.map +1 -1
  92. package/dist/engine/thread.js +8 -0
  93. package/dist/engine/thread.js.map +1 -1
  94. package/dist/engine/wsAuth.d.ts +2 -6
  95. package/dist/engine/wsAuth.d.ts.map +1 -1
  96. package/dist/engine/wsAuth.js +20 -12
  97. package/dist/engine/wsAuth.js.map +1 -1
  98. package/dist/engine/wsTransform.d.ts.map +1 -1
  99. package/dist/engine/wsTransform.js +52 -36
  100. package/dist/engine/wsTransform.js.map +1 -1
  101. package/dist/engine.d.ts.map +1 -1
  102. package/dist/engine.js +4 -26
  103. package/dist/engine.js.map +1 -1
  104. package/dist/entrypoints/node.d.ts.map +1 -1
  105. package/dist/entrypoints/node.js +1 -14
  106. package/dist/entrypoints/node.js.map +1 -1
  107. package/dist/env.d.ts +3 -1
  108. package/dist/env.d.ts.map +1 -1
  109. package/dist/index.d.ts +3 -1
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +2 -0
  112. package/dist/index.js.map +1 -1
  113. package/dist/middleware/auth.d.ts +8 -0
  114. package/dist/middleware/auth.d.ts.map +1 -1
  115. package/dist/middleware/auth.js +62 -0
  116. package/dist/middleware/auth.js.map +1 -1
  117. package/dist/middleware/logger.d.ts.map +1 -1
  118. package/dist/middleware/logger.js +4 -4
  119. package/dist/middleware/logger.js.map +1 -1
  120. package/dist/middleware/planLimits.d.ts.map +1 -1
  121. package/dist/middleware/planLimits.js +9 -2
  122. package/dist/middleware/planLimits.js.map +1 -1
  123. package/dist/middleware/rateLimit.d.ts.map +1 -1
  124. package/dist/middleware/rateLimit.js +13 -1
  125. package/dist/middleware/rateLimit.js.map +1 -1
  126. package/dist/middleware/usageTracker.d.ts.map +1 -1
  127. package/dist/middleware/usageTracker.js +2 -1
  128. package/dist/middleware/usageTracker.js.map +1 -1
  129. package/dist/node-reconnect.d.ts +13 -0
  130. package/dist/node-reconnect.d.ts.map +1 -0
  131. package/dist/node-reconnect.js +15 -0
  132. package/dist/node-reconnect.js.map +1 -0
  133. package/dist/ports/auth.d.ts +6 -2
  134. package/dist/ports/auth.d.ts.map +1 -1
  135. package/dist/ports/entitlements.d.ts +3 -1
  136. package/dist/ports/entitlements.d.ts.map +1 -1
  137. package/dist/ports/index.d.ts +1 -1
  138. package/dist/ports/index.d.ts.map +1 -1
  139. package/dist/ports/presence.d.ts +1 -3
  140. package/dist/ports/presence.d.ts.map +1 -1
  141. package/dist/ports/realtime.d.ts +16 -68
  142. package/dist/ports/realtime.d.ts.map +1 -1
  143. package/dist/ports/realtime.js +9 -9
  144. package/dist/providers/static-entitlements.js +4 -4
  145. package/dist/providers/static-entitlements.js.map +1 -1
  146. package/dist/routes/action.d.ts.map +1 -1
  147. package/dist/routes/action.js +13 -5
  148. package/dist/routes/action.js.map +1 -1
  149. package/dist/routes/agent.d.ts.map +1 -1
  150. package/dist/routes/agent.js +107 -51
  151. package/dist/routes/agent.js.map +1 -1
  152. package/dist/routes/channel.d.ts.map +1 -1
  153. package/dist/routes/channel.js +39 -46
  154. package/dist/routes/channel.js.map +1 -1
  155. package/dist/routes/console.d.ts.map +1 -1
  156. package/dist/routes/console.js +39 -9
  157. package/dist/routes/console.js.map +1 -1
  158. package/dist/routes/deliveryRouting.d.ts.map +1 -1
  159. package/dist/routes/deliveryRouting.js +39 -20
  160. package/dist/routes/deliveryRouting.js.map +1 -1
  161. package/dist/routes/fanout.d.ts +1 -4
  162. package/dist/routes/fanout.d.ts.map +1 -1
  163. package/dist/routes/fanout.js +44 -55
  164. package/dist/routes/fanout.js.map +1 -1
  165. package/dist/routes/file.d.ts.map +1 -1
  166. package/dist/routes/file.js +15 -5
  167. package/dist/routes/file.js.map +1 -1
  168. package/dist/routes/inboundWebhook.js +1 -1
  169. package/dist/routes/inboundWebhook.js.map +1 -1
  170. package/dist/routes/message.d.ts.map +1 -1
  171. package/dist/routes/message.js +22 -4
  172. package/dist/routes/message.js.map +1 -1
  173. package/dist/routes/node.d.ts.map +1 -1
  174. package/dist/routes/node.js +61 -10
  175. package/dist/routes/node.js.map +1 -1
  176. package/dist/routes/observerToken.d.ts +4 -0
  177. package/dist/routes/observerToken.d.ts.map +1 -0
  178. package/dist/routes/observerToken.js +105 -0
  179. package/dist/routes/observerToken.js.map +1 -0
  180. package/dist/routes/presence.d.ts.map +1 -1
  181. package/dist/routes/presence.js +8 -12
  182. package/dist/routes/presence.js.map +1 -1
  183. package/dist/routes/reaction.d.ts.map +1 -1
  184. package/dist/routes/reaction.js +59 -7
  185. package/dist/routes/reaction.js.map +1 -1
  186. package/dist/routes/receipt.d.ts.map +1 -1
  187. package/dist/routes/receipt.js +20 -3
  188. package/dist/routes/receipt.js.map +1 -1
  189. package/dist/routes/search.d.ts.map +1 -1
  190. package/dist/routes/search.js +7 -4
  191. package/dist/routes/search.js.map +1 -1
  192. package/dist/routes/thread.d.ts.map +1 -1
  193. package/dist/routes/thread.js +20 -3
  194. package/dist/routes/thread.js.map +1 -1
  195. package/dist/routes/workspace.d.ts.map +1 -1
  196. package/dist/routes/workspace.js +20 -7
  197. package/dist/routes/workspace.js.map +1 -1
  198. package/package.json +7 -3
  199. package/dist/engine/resyncQuery.d.ts +0 -15
  200. package/dist/engine/resyncQuery.d.ts.map +0 -1
  201. package/dist/engine/resyncQuery.js +0 -125
  202. package/dist/engine/resyncQuery.js.map +0 -1
@@ -1,60 +1,31 @@
1
1
  import { eq, and, sql, isNull, lt, gt, inArray } from 'drizzle-orm';
2
- import { messages, agents, reactions, readReceipts, messageAttachments, files } from '../db/schema.js';
2
+ import { messages, agents, reactions, readReceipts, messageAttachments } from '../db/schema.js';
3
3
  import { runAtomicWrites } from '../ports/database.js';
4
4
  import { generateId } from './snowflake.js';
5
5
  import { buildMessageLogWrite } from './console.js';
6
6
  import { buildChannelDeliveryWrite, fetchChannelDeliveryOutcomes, } from './deliveryWrites.js';
7
7
  import { displayAgentName, publicMessageMetadata, sanitizeUserMessageMetadata } from './messageMetadata.js';
8
8
  import { DEFAULT_MAILBOX_DEPTH_CAP, DEFAULT_MAILBOX_TTL_MS } from './mailboxConfig.js';
9
- import { fetchAttachmentsBatch } from './attachments.js';
10
- /**
11
- * Fetch attachment details straight from `files` by id, preserving the
12
- * caller's ordering. Used by the send path, which needs the details *before*
13
- * the `message_attachments` rows exist — the junction insert is part of the
14
- * atomic write batch, so it cannot be joined against mid-send.
15
- */
16
- async function fetchAttachmentDetails(db, fileIds) {
17
- if (fileIds.length === 0)
18
- return [];
19
- const rows = await db
20
- .select({
21
- fileId: files.id,
22
- filename: files.filename,
23
- contentType: files.contentType,
24
- sizeBytes: files.sizeBytes,
25
- })
26
- .from(files)
27
- .where(inArray(files.id, fileIds));
28
- const byId = new Map(rows.map((row) => [row.fileId, row]));
29
- return fileIds
30
- .filter((id) => byId.has(id))
31
- .map((id) => {
32
- const row = byId.get(id);
33
- return {
34
- file_id: row.fileId,
35
- filename: row.filename,
36
- content_type: row.contentType,
37
- size_bytes: row.sizeBytes,
38
- };
39
- });
40
- }
9
+ import { fetchAttachmentsBatch, resolveSendAttachments } from './attachments.js';
41
10
  export async function postMessage(db, workspaceId, channelId, agentId, data, options = {}) {
42
11
  const startedAtMs = Date.now();
43
12
  const messageId = generateId();
44
- // Parse @mentions from text
45
- const mentionPattern = /@(\w+)/g;
46
- const mentionMatches = data.text.match(mentionPattern) || [];
47
- const hasAttachments = !!(data.attachments && data.attachments.length > 0);
13
+ // Parse @mentions from text without treating email domains as handles.
14
+ const mentionPattern = /(?:^|\s)@(\w+)/g;
15
+ const mentionedHandles = new Set();
16
+ for (let match = mentionPattern.exec(data.text); match !== null; match = mentionPattern.exec(data.text)) {
17
+ mentionedHandles.add(match[1]);
18
+ }
48
19
  const metadata = sanitizeUserMessageMetadata(data.data);
49
- const mentionedHandles = new Set(mentionMatches.map((m) => m.slice(1)));
50
20
  const mailbox = options.mailbox ?? {
51
21
  ttlMs: DEFAULT_MAILBOX_TTL_MS,
52
22
  depthCap: DEFAULT_MAILBOX_DEPTH_CAP,
53
23
  };
54
24
  const [attachments, [agent]] = await Promise.all([
55
- fetchAttachmentDetails(db, data.attachments ?? []),
25
+ resolveSendAttachments(db, workspaceId, data.attachments),
56
26
  db.select({ name: agents.name }).from(agents).where(eq(agents.id, agentId)),
57
27
  ]);
28
+ const hasAttachments = attachments.length > 0;
58
29
  // Durable writes run as one atomic unit when the adapter supports it; fanout
59
30
  // stays in routes. Delivery recipients are derived by the delivery insert
60
31
  // itself, so membership changes cannot slip in between a pre-read and commit.
@@ -74,10 +45,10 @@ export async function postMessage(db, workspaceId, channelId, agentId, data, opt
74
45
  })
75
46
  .returning(),
76
47
  ];
77
- if (data.attachments && data.attachments.length > 0) {
78
- const attachmentValues = data.attachments.map((fileId, idx) => ({
48
+ if (attachments.length > 0) {
49
+ const attachmentValues = attachments.map((attachment, idx) => ({
79
50
  messageId,
80
- fileId,
51
+ fileId: attachment.file_id,
81
52
  position: idx,
82
53
  }));
83
54
  writes.push(writeDb.insert(messageAttachments).values(attachmentValues));
@@ -105,7 +76,7 @@ export async function postMessage(db, workspaceId, channelId, agentId, data, opt
105
76
  injection_mode: data.mode ?? 'wait',
106
77
  },
107
78
  attachmentCount: attachments.length,
108
- mentionCount: mentionMatches.length,
79
+ mentionCount: mentionedHandles.size,
109
80
  latencyMs: Date.now() - startedAtMs,
110
81
  }));
111
82
  return writes;
@@ -128,7 +99,7 @@ export async function postMessage(db, workspaceId, channelId, agentId, data, opt
128
99
  has_attachments: message.hasAttachments,
129
100
  thread_id: message.threadId,
130
101
  created_at: message.createdAt.toISOString(),
131
- mentions: mentionMatches.map((m) => m.slice(1)),
102
+ mentions: Array.from(mentionedHandles),
132
103
  attachments,
133
104
  injection_mode: data.mode ?? 'wait',
134
105
  _deliveries: deliveryOutcomes.deliveries,
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/engine/message.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/engine/message.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,8 @@ import type { NodeConnectionRegistry } from '../ports/realtime.js';
5
5
  import type { InvocationCompletionDeps } from './invocationCompletion.js';
6
6
  type Db = ReturnType<typeof getDb>;
7
7
  type AgentRow = typeof agents.$inferSelect;
8
- type NodeKind = 'fleet_ws' | 'http_push' | 'direct_ws' | 'poll';
8
+ type NodeKind = 'ws' | 'http_push' | 'poll';
9
+ type NodeRole = 'direct' | 'broker';
9
10
  interface NodeSocketLike {
10
11
  send(data: string): void;
11
12
  }
@@ -15,6 +16,7 @@ export declare function createNodeToken(db: Db, workspaceId: string, data: {
15
16
  node_id?: string;
16
17
  name: string;
17
18
  kind?: NodeKind;
19
+ role?: NodeRole;
18
20
  delivery_adapter?: string;
19
21
  delivery?: Record<string, unknown> | null;
20
22
  capabilities?: CapabilityLike[];
@@ -26,6 +28,7 @@ export declare function createNodeToken(db: Db, workspaceId: string, data: {
26
28
  id: string;
27
29
  name: string;
28
30
  kind: string;
31
+ role: string;
29
32
  delivery_adapter: string;
30
33
  delivery: Record<string, unknown> | null;
31
34
  capabilities: {
@@ -50,6 +53,7 @@ export declare function getNodeByTokenHash(db: Db, tokenHash: string): Promise<{
50
53
  name: string;
51
54
  tokenHash: string;
52
55
  kind: string;
56
+ role: string;
53
57
  deliveryAdapter: string;
54
58
  deliveryConfig: Record<string, unknown> | null;
55
59
  capabilities: {
@@ -74,6 +78,7 @@ export declare function getNodeByName(db: Db, workspaceId: string, name: string)
74
78
  name: string;
75
79
  tokenHash: string;
76
80
  kind: string;
81
+ role: string;
77
82
  deliveryAdapter: string;
78
83
  deliveryConfig: Record<string, unknown> | null;
79
84
  capabilities: {
@@ -96,6 +101,7 @@ export declare function registerNode(db: Db, workspaceId: string, authenticatedN
96
101
  id: string;
97
102
  name: string;
98
103
  kind: string;
104
+ role: string;
99
105
  delivery_adapter: string;
100
106
  delivery: Record<string, unknown> | null;
101
107
  capabilities: {
@@ -118,6 +124,7 @@ export declare function heartbeatNode(db: Db, workspaceId: string, nodeId: strin
118
124
  id: string;
119
125
  name: string;
120
126
  kind: string;
127
+ role: string;
121
128
  delivery_adapter: string;
122
129
  delivery: Record<string, unknown> | null;
123
130
  capabilities: {
@@ -147,6 +154,7 @@ export declare function ensureDirectNodeForAgent(db: Db, workspaceId: string, ag
147
154
  id: string;
148
155
  name: string;
149
156
  kind: string;
157
+ role: string;
150
158
  delivery_adapter: string;
151
159
  delivery: Record<string, unknown> | null;
152
160
  capabilities: {
@@ -176,6 +184,7 @@ export declare function bindAgentToNode(db: Db, workspaceId: string, nodeName: s
176
184
  node_id: string;
177
185
  node_name: string;
178
186
  node_kind: string;
187
+ node_role: string;
179
188
  status: string;
180
189
  session_ref: string | null;
181
190
  priority: number;
@@ -190,6 +199,7 @@ export declare function listNodeAgents(db: Db, workspaceId: string, nodeName: st
190
199
  node_id: string;
191
200
  node_name: string;
192
201
  node_kind: string;
202
+ node_role: string;
193
203
  status: string;
194
204
  session_ref: string | null;
195
205
  priority: number;
@@ -233,6 +243,7 @@ export declare function listNodes(db: Db, workspaceId: string, filters?: {
233
243
  id: string;
234
244
  name: string;
235
245
  kind: string;
246
+ role: string;
236
247
  delivery_adapter: string;
237
248
  delivery: Record<string, unknown> | null;
238
249
  capabilities: {
@@ -255,6 +266,7 @@ export declare function getPublicNode(db: Db, workspaceId: string, name: string)
255
266
  id: string;
256
267
  name: string;
257
268
  kind: string;
269
+ role: string;
258
270
  delivery_adapter: string;
259
271
  delivery: Record<string, unknown> | null;
260
272
  capabilities: {
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/engine/node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/engine/node.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,9 @@ export function directNodeIdForAgent(agentId) {
15
15
  function directNodeNameForAgent(agentId) {
16
16
  return `direct-${agentId}`;
17
17
  }
18
+ function isImplicitDirectLocation(agent) {
19
+ return agent.locationNodeId === directNodeIdForAgent(agent.id);
20
+ }
18
21
  function capabilityName(capability) {
19
22
  if (typeof capability === 'string')
20
23
  return capability;
@@ -32,6 +35,7 @@ function publicNode(row) {
32
35
  id: row.id,
33
36
  name: row.name,
34
37
  kind: row.kind,
38
+ role: row.role,
35
39
  delivery_adapter: row.deliveryAdapter,
36
40
  delivery: redactDeliveryConfig(row.deliveryConfig),
37
41
  capabilities: row.capabilities,
@@ -71,11 +75,20 @@ function redactDeliveryConfig(config) {
71
75
  return null;
72
76
  return redactDeliveryValue(null, config);
73
77
  }
74
- function defaultAdapter(kind, deliveryConfig) {
78
+ function normalizeLegacyNodeShape(kind, role) {
75
79
  if (kind === 'fleet_ws')
76
- return 'fleet.ws.v1';
80
+ return { kind: 'ws', role: 'broker' };
77
81
  if (kind === 'direct_ws')
78
- return 'direct.ws.v1';
82
+ return { kind: 'ws', role: 'direct' };
83
+ if (kind === 'http_push')
84
+ return { kind: 'http_push', role: role === 'broker' ? 'broker' : 'direct' };
85
+ if (kind === 'poll')
86
+ return { kind: 'poll', role: role === 'broker' ? 'broker' : 'direct' };
87
+ return { kind: 'ws', role: role === 'direct' ? 'direct' : 'broker' };
88
+ }
89
+ function defaultAdapter(kind, deliveryConfig) {
90
+ if (kind === 'ws')
91
+ return 'ws.node.v1';
79
92
  if (kind === 'poll')
80
93
  return 'poll.v1';
81
94
  const auth = deliveryConfig?.auth;
@@ -90,6 +103,13 @@ function defaultAdapter(kind, deliveryConfig) {
90
103
  return 'http.static_headers.v1';
91
104
  return 'http.basic.v1';
92
105
  }
106
+ function normalizeLegacyAdapter(adapter) {
107
+ if (!adapter)
108
+ return undefined;
109
+ if (adapter === 'fleet.ws.v1' || adapter === 'direct.ws.v1')
110
+ return 'ws.node.v1';
111
+ return adapter;
112
+ }
93
113
  async function ensureCapabilityActions(db, workspaceId, nodeId, capabilities) {
94
114
  for (const capability of capabilities) {
95
115
  const name = capabilityName(capability);
@@ -125,18 +145,32 @@ export async function createNodeToken(db, workspaceId, data) {
125
145
  const tokenHash = await sha256Hex(token);
126
146
  const existing = await getNodeByName(db, workspaceId, data.name);
127
147
  const now = new Date();
128
- const kind = data.kind ?? existing?.kind ?? 'fleet_ws';
148
+ const existingShape = existing ? normalizeLegacyNodeShape(existing.kind, existing.role) : null;
149
+ const normalized = normalizeLegacyNodeShape(data.kind ?? existing?.kind ?? 'ws', data.role ?? existing?.role ?? (data.max_agents !== undefined && data.max_agents > 1 ? 'broker' : undefined));
150
+ const kind = normalized.kind;
151
+ const role = normalized.role;
152
+ // When the node shape (transport or role) changes on update, recompute the
153
+ // delivery adapter and capacity instead of reusing the stale values: rotating
154
+ // an http_push node to ws must not keep an http.* adapter, and switching a
155
+ // broker to direct must not retain a capacity > 1.
156
+ const shapeChanged = !!existingShape && (existingShape.kind !== kind || existingShape.role !== role);
129
157
  const deliveryConfig = data.delivery === undefined ? existing?.deliveryConfig ?? null : data.delivery;
130
158
  const deliveryAdapter = data.delivery_adapter
131
- ?? (data.delivery === undefined ? existing?.deliveryAdapter : undefined)
159
+ ?? (!shapeChanged && data.delivery === undefined ? normalizeLegacyAdapter(existing?.deliveryAdapter) : undefined)
132
160
  ?? defaultAdapter(kind, deliveryConfig);
133
- const maxAgents = data.max_agents ?? existing?.maxAgents ?? (kind === 'http_push' ? 1 : 0);
161
+ const maxAgents = role === 'direct'
162
+ ? (data.max_agents ?? 1)
163
+ : (data.max_agents ?? existing?.maxAgents ?? 0);
164
+ if (role === 'direct' && maxAgents !== 1) {
165
+ throw codedError('Direct nodes can bind at most one agent', 'direct_node_capacity_exceeded', 400);
166
+ }
134
167
  if (existing) {
135
168
  const [updated] = await db
136
169
  .update(nodes)
137
170
  .set({
138
171
  tokenHash,
139
172
  kind,
173
+ role,
140
174
  deliveryAdapter,
141
175
  deliveryConfig,
142
176
  capabilities: normalizeCapabilities(data.capabilities ?? existing.capabilities),
@@ -158,6 +192,7 @@ export async function createNodeToken(db, workspaceId, data) {
158
192
  name: data.name,
159
193
  tokenHash,
160
194
  kind,
195
+ role,
161
196
  deliveryAdapter,
162
197
  deliveryConfig,
163
198
  capabilities: normalizeCapabilities(data.capabilities ?? []),
@@ -190,6 +225,13 @@ export async function registerNode(db, workspaceId, authenticatedNodeId, message
190
225
  throw codedError('node_id does not match the authenticated node token', 'node_id_mismatch', 403);
191
226
  }
192
227
  const now = new Date();
228
+ const [existing] = await db
229
+ .select()
230
+ .from(nodes)
231
+ .where(and(eq(nodes.workspaceId, workspaceId), eq(nodes.id, authenticatedNodeId)));
232
+ if (!existing) {
233
+ throw codedError('Node token is not enrolled in this workspace', 'node_not_found', 404);
234
+ }
193
235
  const [existingByName] = await db
194
236
  .select()
195
237
  .from(nodes)
@@ -197,27 +239,31 @@ export async function registerNode(db, workspaceId, authenticatedNodeId, message
197
239
  if (existingByName && existingByName.id !== authenticatedNodeId) {
198
240
  throw codedError(`Node name "${message.name}" is already enrolled`, 'node_name_conflict', 409);
199
241
  }
242
+ const role = existing.role === 'direct' ? 'direct' : 'broker';
243
+ const capabilities = role === 'direct' ? [] : normalizeCapabilities(message.capabilities);
244
+ const maxAgents = role === 'direct' ? 1 : message.max_agents;
200
245
  const [updated] = await db
201
246
  .update(nodes)
202
247
  .set({
203
248
  name: message.name,
204
- capabilities: message.capabilities,
205
- kind: 'fleet_ws',
206
- deliveryAdapter: 'fleet.ws.v1',
207
- deliveryConfig: null,
208
- maxAgents: message.max_agents,
209
- tags: message.tags,
249
+ capabilities,
250
+ kind: 'ws',
251
+ role,
252
+ deliveryAdapter: 'ws.node.v1',
253
+ deliveryConfig: role === 'direct' ? existing.deliveryConfig : null,
254
+ maxAgents,
255
+ activeAgents: role === 'direct' ? 1 : existing.activeAgents,
256
+ tags: role === 'direct' ? existing.tags : message.tags,
210
257
  version: message.version,
211
258
  status: 'online',
212
- handlersLive: message.capabilities.length > 0,
259
+ handlersLive: role === 'broker' && capabilities.length > 0,
213
260
  lastHeartbeatAt: now,
214
261
  })
215
262
  .where(and(eq(nodes.workspaceId, workspaceId), eq(nodes.id, authenticatedNodeId)))
216
263
  .returning();
217
- if (!updated) {
218
- throw codedError('Node token is not enrolled in this workspace', 'node_not_found', 404);
264
+ if (role === 'broker') {
265
+ await ensureCapabilityActions(db, workspaceId, updated.id, capabilities);
219
266
  }
220
- await ensureCapabilityActions(db, workspaceId, updated.id, message.capabilities);
221
267
  return publicNode(updated);
222
268
  }
223
269
  export async function heartbeatNode(db, workspaceId, nodeId, message) {
@@ -235,10 +281,21 @@ export async function heartbeatNode(db, workspaceId, nodeId, message) {
235
281
  if (message.name !== undefined)
236
282
  rosterUpdate.name = message.name;
237
283
  if (message.capabilities !== undefined) {
238
- rosterUpdate.capabilities = normalizeCapabilities(message.capabilities);
284
+ const [node] = await db
285
+ .select({ role: nodes.role })
286
+ .from(nodes)
287
+ .where(and(eq(nodes.workspaceId, workspaceId), eq(nodes.id, nodeId)));
288
+ if (node?.role !== 'direct') {
289
+ rosterUpdate.capabilities = normalizeCapabilities(message.capabilities);
290
+ }
291
+ }
292
+ if (message.max_agents !== undefined) {
293
+ const [node] = await db
294
+ .select({ role: nodes.role })
295
+ .from(nodes)
296
+ .where(and(eq(nodes.workspaceId, workspaceId), eq(nodes.id, nodeId)));
297
+ rosterUpdate.maxAgents = node?.role === 'direct' ? 1 : message.max_agents;
239
298
  }
240
- if (message.max_agents !== undefined)
241
- rosterUpdate.maxAgents = message.max_agents;
242
299
  if (message.version !== undefined)
243
300
  rosterUpdate.version = message.version;
244
301
  const [updated] = await db
@@ -253,7 +310,7 @@ export async function heartbeatNode(db, workspaceId, nodeId, message) {
253
310
  })
254
311
  .where(and(eq(nodes.workspaceId, workspaceId), eq(nodes.id, nodeId)))
255
312
  .returning();
256
- if (updated && message.capabilities !== undefined) {
313
+ if (updated && updated.role !== 'direct' && message.capabilities !== undefined) {
257
314
  await ensureCapabilityActions(db, workspaceId, updated.id, message.capabilities);
258
315
  }
259
316
  return updated ? publicNode(updated) : null;
@@ -387,8 +444,9 @@ async function ensureDirectNodeForAgentInTx(db, workspaceId, agent, opts = {}) {
387
444
  if (!opts.force && alreadyDirect && existingDirect && agent.locationNodeId === nodeId) {
388
445
  const update = {
389
446
  name: directNodeNameForAgent(agent.id),
390
- kind: 'direct_ws',
391
- deliveryAdapter: 'direct.ws.v1',
447
+ kind: 'ws',
448
+ role: 'direct',
449
+ deliveryAdapter: 'ws.node.v1',
392
450
  deliveryConfig: {
393
451
  implicit: true,
394
452
  agent_id: agent.id,
@@ -397,7 +455,7 @@ async function ensureDirectNodeForAgentInTx(db, workspaceId, agent, opts = {}) {
397
455
  capabilities: [],
398
456
  maxAgents: 1,
399
457
  activeAgents: 1,
400
- tags: ['implicit', 'direct_ws'],
458
+ tags: ['implicit', 'direct'],
401
459
  version: 'implicit',
402
460
  handlersLive: false,
403
461
  load: 0,
@@ -429,8 +487,9 @@ async function ensureDirectNodeForAgentInTx(db, workspaceId, agent, opts = {}) {
429
487
  workspaceId,
430
488
  name: directNodeNameForAgent(agent.id),
431
489
  tokenHash,
432
- kind: 'direct_ws',
433
- deliveryAdapter: 'direct.ws.v1',
490
+ kind: 'ws',
491
+ role: 'direct',
492
+ deliveryAdapter: 'ws.node.v1',
434
493
  deliveryConfig: {
435
494
  implicit: true,
436
495
  agent_id: agent.id,
@@ -439,7 +498,7 @@ async function ensureDirectNodeForAgentInTx(db, workspaceId, agent, opts = {}) {
439
498
  capabilities: [],
440
499
  maxAgents: 1,
441
500
  activeAgents: 0,
442
- tags: ['implicit', 'direct_ws'],
501
+ tags: ['implicit', 'direct'],
443
502
  version: 'implicit',
444
503
  status: opts.online ? 'online' : 'offline',
445
504
  handlersLive: false,
@@ -452,8 +511,9 @@ async function ensureDirectNodeForAgentInTx(db, workspaceId, agent, opts = {}) {
452
511
  else {
453
512
  const update = {
454
513
  name: directNodeNameForAgent(agent.id),
455
- kind: 'direct_ws',
456
- deliveryAdapter: 'direct.ws.v1',
514
+ kind: 'ws',
515
+ role: 'direct',
516
+ deliveryAdapter: 'ws.node.v1',
457
517
  deliveryConfig: {
458
518
  implicit: true,
459
519
  agent_id: agent.id,
@@ -461,7 +521,7 @@ async function ensureDirectNodeForAgentInTx(db, workspaceId, agent, opts = {}) {
461
521
  },
462
522
  capabilities: [],
463
523
  maxAgents: 1,
464
- tags: ['implicit', 'direct_ws'],
524
+ tags: ['implicit', 'direct'],
465
525
  version: 'implicit',
466
526
  handlersLive: false,
467
527
  load: 0,
@@ -516,6 +576,7 @@ function serializeBinding(row) {
516
576
  node_id: row.nodeId,
517
577
  node_name: row.nodeName,
518
578
  node_kind: row.nodeKind,
579
+ node_role: row.nodeRole,
519
580
  status: row.status,
520
581
  session_ref: row.sessionRef,
521
582
  priority: row.priority,
@@ -562,6 +623,7 @@ export async function bindAgentToNode(db, workspaceId, nodeName, agentName, opts
562
623
  nodeId: agentNodeBindings.nodeId,
563
624
  nodeName: nodes.name,
564
625
  nodeKind: nodes.kind,
626
+ nodeRole: nodes.role,
565
627
  status: agentNodeBindings.status,
566
628
  sessionRef: agentNodeBindings.sessionRef,
567
629
  priority: agentNodeBindings.priority,
@@ -612,6 +674,7 @@ export async function listNodeAgents(db, workspaceId, nodeName) {
612
674
  nodeId: agentNodeBindings.nodeId,
613
675
  nodeName: nodes.name,
614
676
  nodeKind: nodes.kind,
677
+ nodeRole: nodes.role,
615
678
  status: agentNodeBindings.status,
616
679
  sessionRef: agentNodeBindings.sessionRef,
617
680
  priority: agentNodeBindings.priority,
@@ -671,7 +734,7 @@ export async function registerAgentViaNode(db, workspaceId, nodeId, message) {
671
734
  resumable: message.resumable ?? false,
672
735
  sessionRef: message.session_ref ?? null,
673
736
  },
674
- setWhere: or(ne(agents.status, 'active'), and(eq(agents.locationType, 'via_node'), eq(agents.locationNodeId, nodeId))),
737
+ setWhere: or(ne(agents.status, 'active'), and(eq(agents.locationType, 'via_node'), or(eq(agents.locationNodeId, nodeId), sql `${agents.locationNodeId} = 'node_direct_' || ${agents.id}`))),
675
738
  })
676
739
  .returning();
677
740
  if (!result) {
@@ -772,7 +835,9 @@ export async function reconcileInventory(db, registry, workspaceId, nodeId, inve
772
835
  .from(nodes)
773
836
  .where(and(eq(nodes.workspaceId, workspaceId), eq(nodes.id, existing.locationNodeId ?? '')));
774
837
  const boundNodeLive = !!boundNode && isNodeLive(boundNode);
775
- const conflict = existing.locationType !== 'via_node' || !existing.locationNodeId || (existing.locationNodeId !== nodeId && boundNodeLive);
838
+ const conflict = existing.locationType !== 'via_node'
839
+ || !existing.locationNodeId
840
+ || (existing.locationNodeId !== nodeId && boundNodeLive && !isImplicitDirectLocation(existing));
776
841
  if (conflict) {
777
842
  console.warn('[node.inventory] rejected active-name claim', {
778
843
  workspace_id: workspaceId,
@@ -941,6 +1006,10 @@ export async function handleNodeControlMessage(args) {
941
1006
  // Node is now marked online: flush any queued action.invoke frames so
942
1007
  // spawns queued while it was offline can reserve capacity and dispatch.
943
1008
  await args.registry.drainNode(args.workspaceId, args.nodeId);
1009
+ // The success reply was already sent above; keep the pending flush
1010
+ // best-effort so a delivery error cannot trigger a second error reply
1011
+ // for the same request id from the outer catch.
1012
+ await deliverPendingToNode(args.db, args.registry, args.workspaceId, args.nodeId).catch(() => { });
944
1013
  return;
945
1014
  }
946
1015
  case 'node.heartbeat':