@relaycast/engine 12.0.0 → 12.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/dist/adapters/node/index.d.ts.map +1 -1
  2. package/dist/adapters/node/index.js +1 -0
  3. package/dist/adapters/node/index.js.map +1 -1
  4. package/dist/adapters/node/presence.d.ts +18 -0
  5. package/dist/adapters/node/presence.d.ts.map +1 -1
  6. package/dist/adapters/node/presence.js +82 -0
  7. package/dist/adapters/node/presence.js.map +1 -1
  8. package/dist/adapters/node/realtime.d.ts +4 -0
  9. package/dist/adapters/node/realtime.d.ts.map +1 -1
  10. package/dist/adapters/node/realtime.js +32 -5
  11. package/dist/adapters/node/realtime.js.map +1 -1
  12. package/dist/db/schema.d.ts +2 -2
  13. package/dist/engine/a2a.d.ts +3 -0
  14. package/dist/engine/a2a.d.ts.map +1 -1
  15. package/dist/engine/a2a.js +1 -0
  16. package/dist/engine/a2a.js.map +1 -1
  17. package/dist/engine/action.d.ts +14 -9
  18. package/dist/engine/action.d.ts.map +1 -1
  19. package/dist/engine/action.js +342 -80
  20. package/dist/engine/action.js.map +1 -1
  21. package/dist/engine/agent.d.ts +9 -3
  22. package/dist/engine/agent.d.ts.map +1 -1
  23. package/dist/engine/agent.js +58 -12
  24. package/dist/engine/agent.js.map +1 -1
  25. package/dist/engine/delivery.d.ts.map +1 -1
  26. package/dist/engine/delivery.js +9 -0
  27. package/dist/engine/delivery.js.map +1 -1
  28. package/dist/engine/deliveryWrites.d.ts +23 -0
  29. package/dist/engine/deliveryWrites.d.ts.map +1 -1
  30. package/dist/engine/deliveryWrites.js +50 -8
  31. package/dist/engine/deliveryWrites.js.map +1 -1
  32. package/dist/engine/eventDelivery.d.ts +1 -1
  33. package/dist/engine/groupDm.d.ts.map +1 -1
  34. package/dist/engine/groupDm.js +4 -0
  35. package/dist/engine/groupDm.js.map +1 -1
  36. package/dist/engine/inboundWebhook.d.ts.map +1 -1
  37. package/dist/engine/inboundWebhook.js +20 -4
  38. package/dist/engine/inboundWebhook.js.map +1 -1
  39. package/dist/engine/inbox.d.ts.map +1 -1
  40. package/dist/engine/inbox.js +17 -0
  41. package/dist/engine/inbox.js.map +1 -1
  42. package/dist/engine/invocationClaim.d.ts +32 -0
  43. package/dist/engine/invocationClaim.d.ts.map +1 -0
  44. package/dist/engine/invocationClaim.js +42 -0
  45. package/dist/engine/invocationClaim.js.map +1 -0
  46. package/dist/engine/message.d.ts.map +1 -1
  47. package/dist/engine/message.js +4 -0
  48. package/dist/engine/message.js.map +1 -1
  49. package/dist/engine/messageMetadata.d.ts +2 -0
  50. package/dist/engine/messageMetadata.d.ts.map +1 -1
  51. package/dist/engine/messageMetadata.js +3 -2
  52. package/dist/engine/messageMetadata.js.map +1 -1
  53. package/dist/engine/node.d.ts +59 -44
  54. package/dist/engine/node.d.ts.map +1 -1
  55. package/dist/engine/node.js +179 -26
  56. package/dist/engine/node.js.map +1 -1
  57. package/dist/engine/nodeLiveness.d.ts +34 -0
  58. package/dist/engine/nodeLiveness.d.ts.map +1 -0
  59. package/dist/engine/nodeLiveness.js +52 -0
  60. package/dist/engine/nodeLiveness.js.map +1 -0
  61. package/dist/engine/placement.d.ts.map +1 -1
  62. package/dist/engine/placement.js +15 -18
  63. package/dist/engine/placement.js.map +1 -1
  64. package/dist/engine/presence.d.ts +173 -1
  65. package/dist/engine/presence.d.ts.map +1 -1
  66. package/dist/engine/presence.js +112 -8
  67. package/dist/engine/presence.js.map +1 -1
  68. package/dist/engine/registrationAdmission.d.ts +40 -0
  69. package/dist/engine/registrationAdmission.d.ts.map +1 -0
  70. package/dist/engine/registrationAdmission.js +78 -0
  71. package/dist/engine/registrationAdmission.js.map +1 -0
  72. package/dist/engine/taskInvocation.d.ts +1 -1
  73. package/dist/engine/thread.d.ts.map +1 -1
  74. package/dist/engine/thread.js +8 -0
  75. package/dist/engine/thread.js.map +1 -1
  76. package/dist/engine/workspace.d.ts +26 -1
  77. package/dist/engine/workspace.d.ts.map +1 -1
  78. package/dist/engine/workspace.js +108 -7
  79. package/dist/engine/workspace.js.map +1 -1
  80. package/dist/engine/workspaceDrain.d.ts +38 -0
  81. package/dist/engine/workspaceDrain.d.ts.map +1 -0
  82. package/dist/engine/workspaceDrain.js +202 -0
  83. package/dist/engine/workspaceDrain.js.map +1 -0
  84. package/dist/engine.d.ts.map +1 -1
  85. package/dist/engine.js +31 -0
  86. package/dist/engine.js.map +1 -1
  87. package/dist/index.d.ts +6 -2
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +6 -1
  90. package/dist/index.js.map +1 -1
  91. package/dist/lib/engineDiagnostics.d.ts +26 -0
  92. package/dist/lib/engineDiagnostics.d.ts.map +1 -0
  93. package/dist/lib/engineDiagnostics.js +100 -0
  94. package/dist/lib/engineDiagnostics.js.map +1 -0
  95. package/dist/lib/httpError.d.ts.map +1 -1
  96. package/dist/lib/httpError.js +5 -1
  97. package/dist/lib/httpError.js.map +1 -1
  98. package/dist/middleware/admission.d.ts +7 -0
  99. package/dist/middleware/admission.d.ts.map +1 -1
  100. package/dist/middleware/admission.js +19 -1
  101. package/dist/middleware/admission.js.map +1 -1
  102. package/dist/middleware/rateLimit.d.ts.map +1 -1
  103. package/dist/middleware/rateLimit.js +8 -1
  104. package/dist/middleware/rateLimit.js.map +1 -1
  105. package/dist/ports/admission.d.ts +24 -3
  106. package/dist/ports/admission.d.ts.map +1 -1
  107. package/dist/ports/database.d.ts.map +1 -1
  108. package/dist/ports/database.js +6 -1
  109. package/dist/ports/database.js.map +1 -1
  110. package/dist/ports/diagnostics.d.ts +42 -0
  111. package/dist/ports/diagnostics.d.ts.map +1 -0
  112. package/dist/ports/diagnostics.js +13 -0
  113. package/dist/ports/diagnostics.js.map +1 -0
  114. package/dist/ports/index.d.ts +13 -1
  115. package/dist/ports/index.d.ts.map +1 -1
  116. package/dist/ports/index.js.map +1 -1
  117. package/dist/ports/nodeLiveness.d.ts +23 -0
  118. package/dist/ports/nodeLiveness.d.ts.map +1 -0
  119. package/dist/ports/nodeLiveness.js +12 -0
  120. package/dist/ports/nodeLiveness.js.map +1 -0
  121. package/dist/ports/presence.d.ts +21 -0
  122. package/dist/ports/presence.d.ts.map +1 -1
  123. package/dist/ports/realtime.d.ts +18 -0
  124. package/dist/ports/realtime.d.ts.map +1 -1
  125. package/dist/ports/realtime.js.map +1 -1
  126. package/dist/routes/a2a.d.ts.map +1 -1
  127. package/dist/routes/a2a.js +2 -0
  128. package/dist/routes/a2a.js.map +1 -1
  129. package/dist/routes/action.js +3 -0
  130. package/dist/routes/action.js.map +1 -1
  131. package/dist/routes/agent.d.ts.map +1 -1
  132. package/dist/routes/agent.js +5 -1
  133. package/dist/routes/agent.js.map +1 -1
  134. package/dist/routes/node.d.ts.map +1 -1
  135. package/dist/routes/node.js +2 -1
  136. package/dist/routes/node.js.map +1 -1
  137. package/dist/routes/workspace.js +10 -2
  138. package/dist/routes/workspace.js.map +1 -1
  139. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeLiveness.js","sourceRoot":"","sources":["../../src/engine/nodeLiveness.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../../src/engine/placement.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../../src/engine/placement.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { nodeReady, filterAsync, nodeLivenessAuthority } from './nodeLiveness.js';
1
2
  import { and, eq, sql } from 'drizzle-orm';
2
3
  import { agents, nodes } from '../db/schema.js';
3
4
  import { codedError } from '../lib/httpError.js';
@@ -128,7 +129,7 @@ export async function reserveNodeCapacity(db, workspaceId, nodeId) {
128
129
  .set({
129
130
  reservedAgents: sql `coalesce(${nodes.reservedAgents}, 0) + 1`,
130
131
  })
131
- .where(and(eq(nodes.workspaceId, workspaceId), eq(nodes.id, nodeId), eq(nodes.status, 'online'), eq(nodes.handlersLive, true), sql `(${nodes.maxAgents} = 0 OR (${nodes.activeAgents} + coalesce(${nodes.reservedAgents}, 0)) < ${nodes.maxAgents})`))
132
+ .where(and(eq(nodes.workspaceId, workspaceId), eq(nodes.id, nodeId), nodeLivenessAuthority(db) ? undefined : eq(nodes.status, 'online'), nodeLivenessAuthority(db) ? undefined : eq(nodes.handlersLive, true), sql `(${nodes.maxAgents} = 0 OR (${nodes.activeAgents} + coalesce(${nodes.reservedAgents}, 0)) < ${nodes.maxAgents})`))
132
133
  .returning();
133
134
  return updated ?? null;
134
135
  }
@@ -153,7 +154,7 @@ export async function claimSpawnNode(db, workspaceId, request) {
153
154
  return null;
154
155
  if (!nodeHasCapability(node, capability) || excluded.has(node.id))
155
156
  return null;
156
- if (!isNodeLive(node) || !node.handlersLive)
157
+ if (!(await nodeReady(db, node)))
157
158
  return { node, capability, queued: true };
158
159
  const reserved = await reserveNodeCapacity(tx, workspaceId, node.id);
159
160
  if (!reserved) {
@@ -173,7 +174,7 @@ export async function claimSpawnNode(db, workspaceId, request) {
173
174
  throw codedError(`Node "${node.name}" is unavailable for retry`, 'handler_unavailable', 503);
174
175
  }
175
176
  if (node && nodeHasCapability(node, capability)) {
176
- return { node, capability, queued: !isNodeLive(node) || !node.handlersLive };
177
+ return { node, capability, queued: !(await nodeReady(db, node)) };
177
178
  }
178
179
  }
179
180
  if (target === 'self') {
@@ -206,7 +207,7 @@ export async function claimSpawnNode(db, workspaceId, request) {
206
207
  if (!nodeHasCapability(node, capability)) {
207
208
  throw codedError(`Node "${node.name}" does not provide ${capability}`, 'capability_mismatch', 409);
208
209
  }
209
- return { node, capability, queued: !isNodeLive(node) || !node.handlersLive };
210
+ return { node, capability, queued: !(await nodeReady(db, node)) };
210
211
  }
211
212
  if (target) {
212
213
  const [node] = await tx
@@ -225,15 +226,13 @@ export async function claimSpawnNode(db, workspaceId, request) {
225
226
  if (!nodeHasCapability(node, capability)) {
226
227
  throw codedError(`Node "${target}" does not provide ${capability}`, 'capability_mismatch', 409);
227
228
  }
228
- return { node, capability, queued: !isNodeLive(node) || !node.handlersLive };
229
+ return { node, capability, queued: !(await nodeReady(db, node)) };
229
230
  }
230
231
  const rows = await tx.select().from(nodes).where(eq(nodes.workspaceId, workspaceId));
231
- const eligible = rows
232
- .filter((node) => !excluded.has(node.id) &&
232
+ const eligible = (await filterAsync(rows, async (node) => !excluded.has(node.id) &&
233
233
  nodeHasCapability(node, capability) &&
234
- isNodeLive(node) &&
235
- node.handlersLive &&
236
- nodeHasCapacity(node))
234
+ (await nodeReady(db, node)) &&
235
+ nodeHasCapacity(node)))
237
236
  .sort(compareNodeCapacityLoad);
238
237
  for (const node of eligible) {
239
238
  const reserved = await reserveNodeCapacity(tx, workspaceId, node.id);
@@ -257,7 +256,7 @@ export async function chooseNodeForAction(db, workspaceId, request) {
257
256
  return {
258
257
  node,
259
258
  capability,
260
- queued: !isNodeLive(node) || !node.handlersLive,
259
+ queued: !(await nodeReady(db, node)),
261
260
  };
262
261
  }
263
262
  if (node && excluded.has(node.id)) {
@@ -294,7 +293,7 @@ export async function chooseNodeForAction(db, workspaceId, request) {
294
293
  return {
295
294
  node,
296
295
  capability,
297
- queued: !isNodeLive(node) || !node.handlersLive,
296
+ queued: !(await nodeReady(db, node)),
298
297
  };
299
298
  }
300
299
  if (target) {
@@ -314,16 +313,14 @@ export async function chooseNodeForAction(db, workspaceId, request) {
314
313
  return {
315
314
  node,
316
315
  capability,
317
- queued: !isNodeLive(node) || !node.handlersLive,
316
+ queued: !(await nodeReady(db, node)),
318
317
  };
319
318
  }
320
319
  const rows = await db.select().from(nodes).where(eq(nodes.workspaceId, workspaceId));
321
- const eligible = rows
322
- .filter((node) => !excluded.has(node.id) &&
320
+ const eligible = (await filterAsync(rows, async (node) => !excluded.has(node.id) &&
323
321
  nodeHasCapability(node, capability) &&
324
- isNodeLive(node) &&
325
- node.handlersLive &&
326
- nodeHasCapacity(node))
322
+ (await nodeReady(db, node)) &&
323
+ nodeHasCapacity(node)))
327
324
  .sort(compareNodeCapacityLoad);
328
325
  const node = eligible[0];
329
326
  if (!node) {
@@ -1 +1 @@
1
- {"version":3,"file":"placement.js","sourceRoot":"","sources":["../../src/engine/placement.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"placement.js","sourceRoot":"","sources":["../../src/engine/placement.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,184 @@
1
1
  import type { getDb } from '../db/index.js';
2
2
  import type { PresenceTracker } from '../ports/presence.js';
3
+ type Db = ReturnType<typeof getDb>;
4
+ /**
5
+ * Active bindings on nodes that might pass {@link isNodeLive}.
6
+ *
7
+ * One join for the whole roster: `idx_nodes_status_heartbeat` ranges the live
8
+ * heartbeat window, then `idx_agent_node_bindings_node` seeks each node's
9
+ * active bindings. The agent seek is its primary key, and the provider seek is
10
+ * `node_providers_node_name_unique` for `agents.provider_name`. A nested
11
+ * `EXISTS` on `idx_node_providers_node` tells a provider-less direct node from
12
+ * a broker whose provider row is simply missing. SQLite stores heartbeats as
13
+ * whole seconds, so the lower bound is up to 999ms wider than the millisecond
14
+ * TTL; {@link isNodeLive} and {@link isProviderLive} are the decisions and drop
15
+ * that extra second. The read does not write.
16
+ */
17
+ export declare function nodeHostedPresenceQuery(db: Db, workspaceId: string, now: number): Omit<import("drizzle-orm/sqlite-core").SQLiteSelectBase<undefined, "async", unknown, {
18
+ agentId: import("drizzle-orm").SQL<string>;
19
+ nodeLastHeartbeatAt: import("drizzle-orm").SQL<Date>;
20
+ nodeHasProviders: import("drizzle-orm").SQL<number>;
21
+ providerStatus: import("drizzle-orm/sqlite-core").SQLiteColumn<{
22
+ name: "status";
23
+ tableName: "node_providers";
24
+ dataType: "string";
25
+ columnType: "SQLiteText";
26
+ data: string;
27
+ driverParam: string;
28
+ notNull: true;
29
+ hasDefault: true;
30
+ isPrimaryKey: false;
31
+ isAutoincrement: false;
32
+ hasRuntimeDefault: false;
33
+ enumValues: [string, ...string[]];
34
+ baseColumn: never;
35
+ identity: undefined;
36
+ generated: undefined;
37
+ }, {}, {
38
+ length: number | undefined;
39
+ }>;
40
+ providerHandlersLive: import("drizzle-orm/sqlite-core").SQLiteColumn<{
41
+ name: "handlers_live";
42
+ tableName: "node_providers";
43
+ dataType: "boolean";
44
+ columnType: "SQLiteBoolean";
45
+ data: boolean;
46
+ driverParam: number;
47
+ notNull: true;
48
+ hasDefault: true;
49
+ isPrimaryKey: false;
50
+ isAutoincrement: false;
51
+ hasRuntimeDefault: false;
52
+ enumValues: undefined;
53
+ baseColumn: never;
54
+ identity: undefined;
55
+ generated: undefined;
56
+ }, {}, {}>;
57
+ providerLastHeartbeatAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
58
+ name: "last_heartbeat_at";
59
+ tableName: "node_providers";
60
+ dataType: "date";
61
+ columnType: "SQLiteTimestamp";
62
+ data: Date;
63
+ driverParam: number;
64
+ notNull: false;
65
+ hasDefault: false;
66
+ isPrimaryKey: false;
67
+ isAutoincrement: false;
68
+ hasRuntimeDefault: false;
69
+ enumValues: undefined;
70
+ baseColumn: never;
71
+ identity: undefined;
72
+ generated: undefined;
73
+ }, {}, {}>;
74
+ }, "partial", {
75
+ agents: "not-null";
76
+ } & {
77
+ node_providers: "nullable";
78
+ }, false, "where", {
79
+ agentId: string;
80
+ nodeLastHeartbeatAt: Date;
81
+ nodeHasProviders: number;
82
+ providerStatus: string | null;
83
+ providerHandlersLive: boolean | null;
84
+ providerLastHeartbeatAt: Date | null;
85
+ }[], {
86
+ agentId: import("drizzle-orm").DrizzleTypeError<"You cannot reference this field without assigning it an alias first - use `.as(<alias>)`">;
87
+ nodeLastHeartbeatAt: import("drizzle-orm").DrizzleTypeError<"You cannot reference this field without assigning it an alias first - use `.as(<alias>)`">;
88
+ nodeHasProviders: import("drizzle-orm").DrizzleTypeError<"You cannot reference this field without assigning it an alias first - use `.as(<alias>)`">;
89
+ providerStatus: import("drizzle-orm").Column<import("drizzle-orm").UpdateColConfig<import("drizzle-orm").ColumnTypeConfig<{
90
+ name: "status";
91
+ tableName: "node_providers";
92
+ dataType: "string";
93
+ columnType: "SQLiteText";
94
+ data: string;
95
+ driverParam: string;
96
+ notNull: true;
97
+ hasDefault: true;
98
+ isPrimaryKey: false;
99
+ isAutoincrement: false;
100
+ hasRuntimeDefault: false;
101
+ enumValues: [string, ...string[]];
102
+ baseColumn: never;
103
+ identity: undefined;
104
+ generated: undefined;
105
+ }, {
106
+ length: number | undefined;
107
+ } & {
108
+ dialect: "sqlite";
109
+ }>, {
110
+ notNull: false;
111
+ }>, object, object>;
112
+ providerHandlersLive: import("drizzle-orm").Column<import("drizzle-orm").UpdateColConfig<import("drizzle-orm").ColumnTypeConfig<{
113
+ name: "handlers_live";
114
+ tableName: "node_providers";
115
+ dataType: "boolean";
116
+ columnType: "SQLiteBoolean";
117
+ data: boolean;
118
+ driverParam: number;
119
+ notNull: true;
120
+ hasDefault: true;
121
+ isPrimaryKey: false;
122
+ isAutoincrement: false;
123
+ hasRuntimeDefault: false;
124
+ enumValues: undefined;
125
+ baseColumn: never;
126
+ identity: undefined;
127
+ generated: undefined;
128
+ }, {} & {
129
+ dialect: "sqlite";
130
+ }>, {
131
+ notNull: false;
132
+ }>, object, object>;
133
+ providerLastHeartbeatAt: import("drizzle-orm").Column<import("drizzle-orm").UpdateColConfig<import("drizzle-orm").ColumnTypeConfig<{
134
+ name: "last_heartbeat_at";
135
+ tableName: "node_providers";
136
+ dataType: "date";
137
+ columnType: "SQLiteTimestamp";
138
+ data: Date;
139
+ driverParam: number;
140
+ notNull: false;
141
+ hasDefault: false;
142
+ isPrimaryKey: false;
143
+ isAutoincrement: false;
144
+ hasRuntimeDefault: false;
145
+ enumValues: undefined;
146
+ baseColumn: never;
147
+ identity: undefined;
148
+ generated: undefined;
149
+ }, {} & {
150
+ dialect: "sqlite";
151
+ }>, {
152
+ notNull: false;
153
+ }>, object, object>;
154
+ }>, "where">;
155
+ type NodeHostedPresenceRow = {
156
+ agentId: string;
157
+ nodeLastHeartbeatAt: Date | null;
158
+ nodeHasProviders: number | boolean;
159
+ providerStatus: string | null;
160
+ providerHandlersLive: boolean | null;
161
+ providerLastHeartbeatAt: Date | null;
162
+ };
163
+ /**
164
+ * A bound agent is online when its node is live and, on a node that has
165
+ * provider rows, the provider named by `agents.provider_name` is live too.
166
+ * Implicit direct nodes have no provider row; node liveness is the whole
167
+ * signal. A sibling provider's heartbeat must not count an agent whose own
168
+ * provider is disconnected or absent.
169
+ */
170
+ export declare function nodeHostedAgentOnline(row: NodeHostedPresenceRow, now: number): boolean;
3
171
  /**
4
172
  * Get presence status for all agents in a workspace.
5
173
  * Queries the presence tracker for online agents and merges with the DB roster.
174
+ * An agent located on a live node, with an active binding there, is online even
175
+ * when it has never heartbeated over HTTP — unless it explicitly disconnected,
176
+ * or its own provider (when the node has any) is not live.
6
177
  */
7
- export declare function getPresence(db: ReturnType<typeof getDb>, presence: PresenceTracker, workspaceId: string): Promise<Array<{
178
+ export declare function getPresence(db: Db, presence: PresenceTracker, workspaceId: string, now?: number): Promise<Array<{
8
179
  agent_id: string;
9
180
  agent_name: string;
10
181
  status: 'online' | 'offline';
11
182
  }>>;
183
+ export {};
12
184
  //# sourceMappingURL=presence.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/engine/presence.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,EAC5B,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC,CAoBxF"}
1
+ {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../src/engine/presence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAK5D,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AAEnC;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA4C/E;AAED,KAAK,qBAAqB,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,IAAI,GAAG,IAAI,CAAC;IACjC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,oBAAoB,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,uBAAuB,EAAE,IAAI,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,qBAAqB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAYtF;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,MAAM,EACnB,GAAG,SAAa,GACf,OAAO,CAAC,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC,CAoCxF"}
@@ -1,27 +1,131 @@
1
- import { and, eq, ne } from 'drizzle-orm';
2
- import { agents } from '../db/schema.js';
1
+ import { nodeLivenessAuthority, inspectNodeLiveness, filterAsync, snapshotOnline } from './nodeLiveness.js';
2
+ import { and, eq, ne, sql } from 'drizzle-orm';
3
+ import { agentNodeBindings, agents, nodeProviders, nodes } from '../db/schema.js';
3
4
  import { RELEASED_AGENT_STATUS } from './agent.js';
5
+ import { isProviderLive } from './nodeProvider.js';
6
+ import { isNodeLive, NODE_LIVENESS_TTL_MS } from './placement.js';
7
+ /**
8
+ * Active bindings on nodes that might pass {@link isNodeLive}.
9
+ *
10
+ * One join for the whole roster: `idx_nodes_status_heartbeat` ranges the live
11
+ * heartbeat window, then `idx_agent_node_bindings_node` seeks each node's
12
+ * active bindings. The agent seek is its primary key, and the provider seek is
13
+ * `node_providers_node_name_unique` for `agents.provider_name`. A nested
14
+ * `EXISTS` on `idx_node_providers_node` tells a provider-less direct node from
15
+ * a broker whose provider row is simply missing. SQLite stores heartbeats as
16
+ * whole seconds, so the lower bound is up to 999ms wider than the millisecond
17
+ * TTL; {@link isNodeLive} and {@link isProviderLive} are the decisions and drop
18
+ * that extra second. The read does not write.
19
+ */
20
+ export function nodeHostedPresenceQuery(db, workspaceId, now) {
21
+ const newestSecond = Math.floor(now / 1000);
22
+ const oldestSecond = Math.floor((now - NODE_LIVENESS_TTL_MS) / 1000);
23
+ // CROSS JOIN is not reordered by SQLite, so the live-node index stays the
24
+ // outer loop and each node's bindings are a seek. INNER JOIN would let the
25
+ // planner start at every active binding in the workspace.
26
+ return db
27
+ .select({
28
+ // `nodes` and `agent_node_bindings` are indexed-by fragments, so their
29
+ // columns are not join-tracked Column fields. mapWith keeps the driver
30
+ // codecs (dates, text) the table columns already declare.
31
+ agentId: sql `${agentNodeBindings.agentId}`.mapWith(agentNodeBindings.agentId),
32
+ nodeLastHeartbeatAt: sql `${nodes.lastHeartbeatAt}`.mapWith(nodes.lastHeartbeatAt),
33
+ nodeHasProviders: sql `EXISTS (
34
+ SELECT 1 FROM node_providers AS np
35
+ WHERE np.workspace_id = ${nodes.workspaceId}
36
+ AND np.node_id = ${nodes.id}
37
+ )`.mapWith(Number),
38
+ providerStatus: nodeProviders.status,
39
+ providerHandlersLive: nodeProviders.handlersLive,
40
+ providerLastHeartbeatAt: nodeProviders.lastHeartbeatAt,
41
+ })
42
+ .from(sql `${nodes} INDEXED BY idx_nodes_status_heartbeat`)
43
+ .crossJoin(sql `${agentNodeBindings} INDEXED BY idx_agent_node_bindings_node`)
44
+ .crossJoin(agents)
45
+ .leftJoin(nodeProviders, and(eq(nodeProviders.workspaceId, workspaceId), eq(nodeProviders.nodeId, nodes.id), eq(nodeProviders.name, agents.providerName)))
46
+ .where(and(eq(nodes.workspaceId, workspaceId), eq(nodes.status, 'online'), sql `${nodes.lastHeartbeatAt} >= ${oldestSecond}`, sql `${nodes.lastHeartbeatAt} <= ${newestSecond}`, eq(agentNodeBindings.workspaceId, workspaceId), eq(agentNodeBindings.nodeId, nodes.id), eq(agentNodeBindings.status, 'active'), eq(agents.workspaceId, workspaceId), eq(agents.id, agentNodeBindings.agentId), eq(agents.locationType, 'via_node'), eq(agents.locationNodeId, nodes.id), ne(agents.status, RELEASED_AGENT_STATUS)));
47
+ }
48
+ /**
49
+ * A bound agent is online when its node is live and, on a node that has
50
+ * provider rows, the provider named by `agents.provider_name` is live too.
51
+ * Implicit direct nodes have no provider row; node liveness is the whole
52
+ * signal. A sibling provider's heartbeat must not count an agent whose own
53
+ * provider is disconnected or absent.
54
+ */
55
+ export function nodeHostedAgentOnline(row, now) {
56
+ if (!isNodeLive({ status: 'online', lastHeartbeatAt: row.nodeLastHeartbeatAt }, now))
57
+ return false;
58
+ const hasProviders = row.nodeHasProviders === true || Number(row.nodeHasProviders) === 1;
59
+ if (!hasProviders)
60
+ return true;
61
+ if (row.providerStatus == null || row.providerHandlersLive == null || row.providerLastHeartbeatAt == null) {
62
+ return false;
63
+ }
64
+ return isProviderLive({
65
+ status: row.providerStatus,
66
+ handlersLive: row.providerHandlersLive,
67
+ lastHeartbeatAt: row.providerLastHeartbeatAt,
68
+ }, now);
69
+ }
4
70
  /**
5
71
  * Get presence status for all agents in a workspace.
6
72
  * Queries the presence tracker for online agents and merges with the DB roster.
73
+ * An agent located on a live node, with an active binding there, is online even
74
+ * when it has never heartbeated over HTTP — unless it explicitly disconnected,
75
+ * or its own provider (when the node has any) is not live.
7
76
  */
8
- export async function getPresence(db, presence, workspaceId) {
9
- const [allAgents, onlineIds] = await Promise.all([
77
+ export async function getPresence(db, presence, workspaceId, now = Date.now()) {
78
+ const [allAgents, onlineIds, nodeHosted, suppressedIds] = await Promise.all([
10
79
  db
11
- .select({ id: agents.id, name: agents.name })
80
+ .select({ id: agents.id, name: agents.name, locationType: agents.locationType, locationNodeId: agents.locationNodeId, nodeRole: nodes.role })
12
81
  .from(agents)
82
+ .leftJoin(nodes, and(eq(nodes.workspaceId, workspaceId), eq(nodes.id, agents.locationNodeId)))
13
83
  // Released rows are tombstones kept only so history stays attributable.
14
84
  // They are not roster members and must not appear as presence entries.
15
85
  .where(and(eq(agents.workspaceId, workspaceId), ne(agents.status, RELEASED_AGENT_STATUS))),
16
- presence.getOnline(workspaceId),
86
+ nodeLivenessAuthority(db) && presence.getTrackedOnline
87
+ ? presence.getTrackedOnline(workspaceId)
88
+ : presence.getOnline(workspaceId),
89
+ nodeLivenessAuthority(db) ? authoritativePresence(db, workspaceId) : nodeHostedPresenceQuery(db, workspaceId, now),
90
+ presence.explicitlyDisconnected?.(workspaceId) ?? Promise.resolve([]),
17
91
  ]);
18
92
  if (allAgents.length === 0)
19
93
  return [];
20
- const onlineSet = new Set(onlineIds);
94
+ // HTTP-only/direct clients retain the REST presence port. A broker-hosted
95
+ // agent must prove its own provider lease; sibling/old tracker entries do
96
+ // not certify that route.
97
+ const fallbackIds = nodeLivenessAuthority(db)
98
+ ? new Set(allAgents.filter(a => a.locationType !== 'via_node' || !a.locationNodeId || a.nodeRole === 'direct').map(a => a.id))
99
+ : undefined;
100
+ const onlineSet = new Set(onlineIds.filter(id => !fallbackIds || fallbackIds.has(id)));
101
+ const suppressed = new Set(suppressedIds);
102
+ for (const row of nodeHosted) {
103
+ if (suppressed.has(row.agentId))
104
+ continue;
105
+ if ('authorityOnline' in row ? row.authorityOnline : nodeHostedAgentOnline(row, now))
106
+ onlineSet.add(row.agentId);
107
+ }
21
108
  return allAgents.map((agent) => ({
22
109
  agent_id: agent.id,
23
110
  agent_name: agent.name,
24
- status: onlineSet.has(agent.id) ? 'online' : 'offline',
111
+ status: onlineSet.has(agent.id) && !suppressed.has(agent.id) ? 'online' : 'offline',
25
112
  }));
26
113
  }
114
+ /** Catalog bindings survive stale/offline projections; only receipt authority decides. */
115
+ async function authoritativePresence(db, workspaceId) {
116
+ const bindings = await db.select({ agentId: agents.id, nodeId: nodes.id, providerName: agents.providerName, role: nodes.role })
117
+ .from(agents).innerJoin(agentNodeBindings, and(eq(agentNodeBindings.workspaceId, workspaceId), eq(agentNodeBindings.agentId, agents.id), eq(agentNodeBindings.status, 'active')))
118
+ .innerJoin(nodes, and(eq(nodes.workspaceId, workspaceId), eq(nodes.id, agentNodeBindings.nodeId)))
119
+ .where(and(eq(agents.workspaceId, workspaceId), ne(agents.status, RELEASED_AGENT_STATUS), eq(agents.locationType, 'via_node'), eq(agents.locationNodeId, nodes.id)));
120
+ const byNode = new Map();
121
+ await filterAsync([...new Set(bindings.map(b => b.nodeId))], async (nodeId) => {
122
+ byNode.set(nodeId, await inspectNodeLiveness(db, workspaceId, nodeId));
123
+ return true;
124
+ });
125
+ return bindings.map(b => {
126
+ const snapshot = byNode.get(b.nodeId);
127
+ const now = Date.now();
128
+ return { agentId: b.agentId, authorityOnline: !!snapshot && snapshotOnline(snapshot) && snapshot.providers.some(p => p.name === b.providerName && p.live && (b.role === 'direct' || p.handlers_live) && p.expires_at > now && p.last_received_at <= now) };
129
+ });
130
+ }
27
131
  //# sourceMappingURL=presence.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"presence.js","sourceRoot":"","sources":["../../src/engine/presence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAA4B,EAC5B,QAAyB,EACzB,WAAmB;IAEnB,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/C,EAAE;aACC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;aAC5C,IAAI,CAAC,MAAM,CAAC;YACb,wEAAwE;YACxE,uEAAuE;aACtE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAC5F,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC;KAChC,CAAC,CAAC;IAEH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAErC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/B,QAAQ,EAAE,KAAK,CAAC,EAAE;QAClB,UAAU,EAAE,KAAK,CAAC,IAAI;QACtB,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,QAAkB,CAAC,CAAC,CAAE,SAAmB;KAC7E,CAAC,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"presence.js","sourceRoot":"","sources":["../../src/engine/presence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { EngineDb } from '../ports/database.js';
2
+ import type { AdmissionHooks, RegistrationAdmissionAction } from '../ports/admission.js';
3
+ import type { Workspace } from '../ports/auth.js';
4
+ /**
5
+ * How many of `action`'s kind the workspace currently has registered — the
6
+ * `registered` count a registration is admitted against.
7
+ *
8
+ * - `register_device`: every node a host enrolled, whatever its role or
9
+ * transport. Every agent also owns an implicit direct node
10
+ * (`node_direct_<agent id>`) for its own WebSocket; those are not devices.
11
+ * The prefix is reserved at enrollment (`createNodeToken`), so a host cannot
12
+ * enroll into it.
13
+ * - `register_agent`: non-human identities that have not been released, except
14
+ * the engine-provisioned inbound-webhook identity ({@link WEBHOOK_AGENT_NAME}).
15
+ * `createWebhook` provisions it on a workspace's first webhook; no caller
16
+ * registers it, and its name is reserved at registration
17
+ * (`assertRegistrableAgentName`), so it never holds a slot.
18
+ * - `register_human`: `type = 'human'` identities that have not been released.
19
+ */
20
+ export declare function countRegistrations(db: EngineDb, workspaceId: string, action: RegistrationAdmissionAction): Promise<number>;
21
+ /**
22
+ * Admits a NEW registration through the host's `admit` hook, throwing
23
+ * {@link AdmissionDeniedError} on a denial. Callers invoke it only on the
24
+ * create path — re-registering an existing node or agent is never new.
25
+ */
26
+ export type RegistrationAdmission = (action: RegistrationAdmissionAction) => Promise<void>;
27
+ export interface RegistrationAdmissionArgs {
28
+ db: EngineDb;
29
+ admission: AdmissionHooks | undefined;
30
+ /** The authenticated workspace row, or its id when the caller only has that. */
31
+ workspace: Workspace | string;
32
+ }
33
+ /**
34
+ * Build the admission check the registration paths run before inserting a
35
+ * node or agent, or `undefined` when the host has no `admit` hook (nothing to
36
+ * count for). A hook or count that throws admits the registration, like every
37
+ * other admission: a host's metering outage must not block registration.
38
+ */
39
+ export declare function createRegistrationAdmission(args: RegistrationAdmissionArgs): RegistrationAdmission | undefined;
40
+ //# sourceMappingURL=registrationAdmission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registrationAdmission.d.ts","sourceRoot":"","sources":["../../src/engine/registrationAdmission.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAKlD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,QAAQ,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,MAAM,EAAE,2BAA2B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3F,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,QAAQ,CAAC;IACb,SAAS,EAAE,cAAc,GAAG,SAAS,CAAC;IACtC,gFAAgF;IAChF,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC;CAC/B;AAQD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,yBAAyB,GAAG,qBAAqB,GAAG,SAAS,CAoB9G"}