@relaycast/engine 8.9.1 → 8.10.1

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 (117) hide show
  1. package/dist/adapters/node/index.d.ts.map +1 -1
  2. package/dist/adapters/node/index.js +6 -0
  3. package/dist/adapters/node/index.js.map +1 -1
  4. package/dist/db/migrations/0057_a2a_egress.sql +20 -0
  5. package/dist/db/migrations/0058_a2a_egress_context.sql +8 -0
  6. package/dist/db/migrations/0059_a2a_inbound_admission.sql +26 -0
  7. package/dist/db/schema.d.ts +603 -0
  8. package/dist/db/schema.d.ts.map +1 -1
  9. package/dist/db/schema.js +34 -0
  10. package/dist/db/schema.js.map +1 -1
  11. package/dist/engine/a2a.d.ts +4 -1
  12. package/dist/engine/a2a.d.ts.map +1 -1
  13. package/dist/engine/a2a.js +43 -6
  14. package/dist/engine/a2a.js.map +1 -1
  15. package/dist/engine/a2aEgress.d.ts +19 -0
  16. package/dist/engine/a2aEgress.d.ts.map +1 -0
  17. package/dist/engine/a2aEgress.js +118 -0
  18. package/dist/engine/a2aEgress.js.map +1 -0
  19. package/dist/engine/action.d.ts.map +1 -1
  20. package/dist/engine/action.js +17 -2
  21. package/dist/engine/action.js.map +1 -1
  22. package/dist/engine/delivery.d.ts +2 -0
  23. package/dist/engine/delivery.d.ts.map +1 -1
  24. package/dist/engine/delivery.js +16 -1
  25. package/dist/engine/delivery.js.map +1 -1
  26. package/dist/engine/deliveryWire.d.ts.map +1 -1
  27. package/dist/engine/deliveryWire.js +1 -1
  28. package/dist/engine/deliveryWire.js.map +1 -1
  29. package/dist/engine/deliveryWrites.d.ts +9 -0
  30. package/dist/engine/deliveryWrites.d.ts.map +1 -1
  31. package/dist/engine/deliveryWrites.js +70 -19
  32. package/dist/engine/deliveryWrites.js.map +1 -1
  33. package/dist/engine/dm.d.ts +47 -8
  34. package/dist/engine/dm.d.ts.map +1 -1
  35. package/dist/engine/dm.js +239 -42
  36. package/dist/engine/dm.js.map +1 -1
  37. package/dist/engine/groupDm.d.ts +2 -0
  38. package/dist/engine/groupDm.d.ts.map +1 -1
  39. package/dist/engine/groupDm.js +2 -1
  40. package/dist/engine/groupDm.js.map +1 -1
  41. package/dist/engine/inboundWebhook.d.ts +3 -0
  42. package/dist/engine/inboundWebhook.d.ts.map +1 -1
  43. package/dist/engine/inboundWebhook.js +7 -1
  44. package/dist/engine/inboundWebhook.js.map +1 -1
  45. package/dist/engine/message.d.ts +2 -0
  46. package/dist/engine/message.d.ts.map +1 -1
  47. package/dist/engine/message.js +2 -1
  48. package/dist/engine/message.js.map +1 -1
  49. package/dist/engine/node.d.ts +2 -2
  50. package/dist/engine/thread.d.ts +2 -0
  51. package/dist/engine/thread.d.ts.map +1 -1
  52. package/dist/engine/thread.js +3 -1
  53. package/dist/engine/thread.js.map +1 -1
  54. package/dist/engine/workspaceDeliveryPolicy.d.ts +91 -0
  55. package/dist/engine/workspaceDeliveryPolicy.d.ts.map +1 -0
  56. package/dist/engine/workspaceDeliveryPolicy.js +130 -0
  57. package/dist/engine/workspaceDeliveryPolicy.js.map +1 -0
  58. package/dist/engine/workspaceEvents.d.ts +120 -0
  59. package/dist/engine/workspaceEvents.d.ts.map +1 -1
  60. package/dist/engine/workspaceEvents.js +8 -10
  61. package/dist/engine/workspaceEvents.js.map +1 -1
  62. package/dist/index.d.ts +3 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +2 -0
  65. package/dist/index.js.map +1 -1
  66. package/dist/lib/httpError.d.ts +1 -1
  67. package/dist/lib/httpError.d.ts.map +1 -1
  68. package/dist/lib/httpError.js +2 -0
  69. package/dist/lib/httpError.js.map +1 -1
  70. package/dist/lib/httpResponse.d.ts +6 -6
  71. package/dist/middleware/idempotency.d.ts +15 -10
  72. package/dist/middleware/idempotency.d.ts.map +1 -1
  73. package/dist/middleware/idempotency.js +9 -9
  74. package/dist/middleware/idempotency.js.map +1 -1
  75. package/dist/ports/database.d.ts +4 -20
  76. package/dist/ports/database.d.ts.map +1 -1
  77. package/dist/ports/database.js +28 -7
  78. package/dist/ports/database.js.map +1 -1
  79. package/dist/ports/index.d.ts +9 -0
  80. package/dist/ports/index.d.ts.map +1 -1
  81. package/dist/ports/workspaceDelivery.d.ts +31 -0
  82. package/dist/ports/workspaceDelivery.d.ts.map +1 -0
  83. package/dist/ports/workspaceDelivery.js +2 -0
  84. package/dist/ports/workspaceDelivery.js.map +1 -0
  85. package/dist/routes/a2a.d.ts.map +1 -1
  86. package/dist/routes/a2a.js +162 -26
  87. package/dist/routes/a2a.js.map +1 -1
  88. package/dist/routes/delivery.d.ts.map +1 -1
  89. package/dist/routes/delivery.js +15 -4
  90. package/dist/routes/delivery.js.map +1 -1
  91. package/dist/routes/deliveryRouting.d.ts +1 -1
  92. package/dist/routes/deliveryRouting.d.ts.map +1 -1
  93. package/dist/routes/deliveryRouting.js +8 -7
  94. package/dist/routes/deliveryRouting.js.map +1 -1
  95. package/dist/routes/dm.d.ts.map +1 -1
  96. package/dist/routes/dm.js +27 -8
  97. package/dist/routes/dm.js.map +1 -1
  98. package/dist/routes/fanout.d.ts +1 -1
  99. package/dist/routes/fanout.d.ts.map +1 -1
  100. package/dist/routes/fanout.js +2 -2
  101. package/dist/routes/fanout.js.map +1 -1
  102. package/dist/routes/groupDm.d.ts.map +1 -1
  103. package/dist/routes/groupDm.js +3 -2
  104. package/dist/routes/groupDm.js.map +1 -1
  105. package/dist/routes/inboundWebhook.d.ts.map +1 -1
  106. package/dist/routes/inboundWebhook.js +5 -1
  107. package/dist/routes/inboundWebhook.js.map +1 -1
  108. package/dist/routes/message.d.ts.map +1 -1
  109. package/dist/routes/message.js +3 -1
  110. package/dist/routes/message.js.map +1 -1
  111. package/dist/routes/relayfileInbound.d.ts.map +1 -1
  112. package/dist/routes/relayfileInbound.js +9 -3
  113. package/dist/routes/relayfileInbound.js.map +1 -1
  114. package/dist/routes/thread.d.ts.map +1 -1
  115. package/dist/routes/thread.js +3 -1
  116. package/dist/routes/thread.js.map +1 -1
  117. package/package.json +5 -4
@@ -0,0 +1,118 @@
1
+ import { and, eq, or, sql, lte, inArray, asc } from 'drizzle-orm';
2
+ import { a2aAgents, a2aEgress, a2aInbound, messages, agents } from '../db/schema.js';
3
+ import { runAtomicWrites } from '../ports/database.js';
4
+ import { randomUuid } from '../lib/crypto.js';
5
+ import { codedError } from '../lib/httpError.js';
6
+ import { sendToExternalAgent } from './a2a.js';
7
+ /** Same finite retry horizon as HTTP idempotency; payloads never dispatch after it. */
8
+ export const A2A_EGRESS_RETRY_WINDOW_MS = 24 * 60 * 60 * 1000;
9
+ const batchLimit = (limit) => Number.isFinite(limit) ? Math.max(1, Math.min(100, Math.floor(limit))) : 20;
10
+ const expired = (intent) => intent.createdAt.getTime() + A2A_EGRESS_RETRY_WINDOW_MS <= Date.now();
11
+ const notRetained = () => codedError('Accepted A2A message is no longer retained', 'a2a_message_not_retained', 410);
12
+ const targetGone = () => codedError('Accepted A2A target no longer registered at its original endpoint', 'a2a_target_gone', 410);
13
+ const windowExpired = () => codedError('Accepted A2A retry window expired', 'a2a_egress_expired', 410);
14
+ async function validateSource(db, intent) {
15
+ if (expired(intent))
16
+ throw windowExpired();
17
+ const [source] = await db.select({ id: messages.id }).from(messages).where(and(eq(messages.id, intent.messageId), eq(messages.workspaceId, intent.workspaceId)));
18
+ if (!source)
19
+ throw notRetained();
20
+ }
21
+ /** Durable admission and a lease exclude concurrent senders. A crash after remote
22
+ * acceptance can replay the same message_id and HTTP Idempotency-Key; receivers
23
+ * must deduplicate them. Arbitrary receivers still have at-least-once delivery.
24
+ */
25
+ export async function dispatchA2aEgress(db, id) {
26
+ const [existing] = await db.select().from(a2aEgress).where(eq(a2aEgress.id, id));
27
+ if (!existing)
28
+ throw windowExpired();
29
+ if (existing.status === 'failed')
30
+ throw codedError(existing.lastError ?? 'A2A upstream rejected the accepted message', existing.errorCode ?? 'a2a_upstream_rejected', existing.errorStatus ?? 502);
31
+ if (existing.status === 'sent') {
32
+ await validateSource(db, existing);
33
+ return;
34
+ }
35
+ const token = randomUuid();
36
+ const [intent] = await db.update(a2aEgress).set({
37
+ status: 'sending', claimToken: token, leaseUntil: new Date(Date.now() + 120_000),
38
+ attempts: sql `${a2aEgress.attempts} + 1`,
39
+ }).where(and(eq(a2aEgress.id, id), or(and(eq(a2aEgress.status, 'pending'), or(sql `${a2aEgress.leaseUntil} IS NULL`, lte(a2aEgress.leaseUntil, new Date()), lte(a2aEgress.createdAt, new Date(Date.now() - A2A_EGRESS_RETRY_WINDOW_MS)), sql `NOT EXISTS (SELECT 1 FROM messages WHERE id = ${a2aEgress.messageId} AND workspace_id = ${a2aEgress.workspaceId})`, sql `NOT EXISTS (SELECT 1 FROM a2a_agents t JOIN agents a ON a.id = t.relay_agent_id AND a.workspace_id = t.workspace_id
40
+ WHERE t.id = ${a2aEgress.targetId} AND t.workspace_id = ${a2aEgress.workspaceId} AND t.external_url = ${a2aEgress.externalUrl})`)), and(eq(a2aEgress.status, 'sending'), lte(a2aEgress.leaseUntil, new Date()))))).returning();
41
+ if (!intent)
42
+ throw codedError('Accepted A2A message is being sent; retry the same key', 'a2a_egress_in_progress', 409);
43
+ try {
44
+ if (!intent.payload)
45
+ throw notRetained();
46
+ await sendToExternalAgent(intent.externalUrl, intent.payload, undefined, async () => {
47
+ // Read one coherent tuple immediately before EACH fetch, including transport
48
+ // retries. Credentials exist only in memory; never pair a rotated URL with
49
+ // the captured endpoint. A live lease also excludes concurrent cleanup.
50
+ const [current] = await db.select({ intent: a2aEgress, source: messages.id, target: a2aAgents, recipient: agents.id })
51
+ .from(a2aEgress)
52
+ .leftJoin(messages, and(eq(messages.id, a2aEgress.messageId), eq(messages.workspaceId, a2aEgress.workspaceId)))
53
+ .leftJoin(a2aAgents, and(eq(a2aAgents.id, a2aEgress.targetId), eq(a2aAgents.workspaceId, a2aEgress.workspaceId)))
54
+ .leftJoin(agents, and(eq(agents.id, a2aAgents.relayAgentId), eq(agents.workspaceId, a2aEgress.workspaceId)))
55
+ .where(and(eq(a2aEgress.id, id), eq(a2aEgress.claimToken, token), eq(a2aEgress.status, 'sending')));
56
+ if (!current || expired(current.intent))
57
+ throw windowExpired();
58
+ if (!current.source)
59
+ throw notRetained();
60
+ if (!current.target || !current.recipient || current.target.externalUrl !== intent.externalUrl)
61
+ throw targetGone();
62
+ return { scheme: current.target.authScheme, credential: current.target.authCredential };
63
+ }, intent.id);
64
+ }
65
+ catch (error) {
66
+ const failure = error;
67
+ const retryable = failure.retryable === true || (failure.retryable !== false && !(failure.status && failure.status >= 400 && failure.status < 500));
68
+ // Upstream error bodies may contain secrets; persist/report only engine text.
69
+ const message = failure.code === 'a2a_message_not_retained' ? notRetained().message
70
+ : failure.code === 'a2a_target_gone' ? targetGone().message
71
+ : failure.code === 'a2a_egress_expired' ? windowExpired().message
72
+ : 'A2A transport failed for the accepted message';
73
+ await db.update(a2aEgress).set({
74
+ status: retryable ? 'pending' : 'failed', claimToken: null,
75
+ leaseUntil: retryable ? new Date(Date.now() + 30_000) : null,
76
+ ...(retryable ? {} : { payload: null }),
77
+ lastError: message, errorStatus: failure.status ?? 500, errorCode: failure.code ?? 'internal_error',
78
+ }).where(and(eq(a2aEgress.id, id), eq(a2aEgress.claimToken, token)));
79
+ throw codedError(message, failure.code ?? 'internal_error', failure.status ?? 500);
80
+ }
81
+ await runAtomicWrites(db, tx => [
82
+ tx.update(a2aAgents).set({ messagesSent: sql `${a2aAgents.messagesSent} + 1` })
83
+ .where(and(eq(a2aAgents.id, intent.targetId), sql `EXISTS (SELECT 1 FROM a2a_egress WHERE id = ${id} AND claim_token = ${token} AND status = 'sending')`)),
84
+ tx.update(a2aEgress).set({ status: 'sent', payload: null, claimToken: null, leaseUntil: null, lastError: null, errorStatus: null, errorCode: null })
85
+ .where(and(eq(a2aEgress.id, id), eq(a2aEgress.claimToken, token))),
86
+ ], { requireAtomic: true });
87
+ }
88
+ /** Indexed, bounded deletion after the retry horizon. Active transport leases
89
+ * are retained until settlement/lease expiry; cleanup never revokes their claim.
90
+ * After deletion a key is fresh, as with the existing HTTP idempotency contract.
91
+ */
92
+ export async function cleanupA2aEgress(db, limit = 20) {
93
+ const eligible = and(lte(a2aEgress.createdAt, new Date(Date.now() - A2A_EGRESS_RETRY_WINDOW_MS)), or(sql `${a2aEgress.leaseUntil} IS NULL`, lte(a2aEgress.leaseUntil, new Date()), sql `${a2aEgress.status} != 'sending'`));
94
+ const candidates = db.select({ id: a2aEgress.id }).from(a2aEgress).where(eligible)
95
+ .orderBy(asc(a2aEgress.createdAt), asc(a2aEgress.id)).limit(batchLimit(limit));
96
+ const deleted = await db.delete(a2aEgress).where(inArray(a2aEgress.id, candidates)).returning({ id: a2aEgress.id });
97
+ return deleted.length;
98
+ }
99
+ /** Existing Node/HOST maintenance entrypoint includes bounded retention cleanup. */
100
+ export async function sweepPendingA2aEgress(db, limit = 20) {
101
+ const due = await db.select({ id: a2aEgress.id }).from(a2aEgress).where(and(or(eq(a2aEgress.status, 'pending'), eq(a2aEgress.status, 'sending')), or(sql `${a2aEgress.leaseUntil} IS NULL`, lte(a2aEgress.leaseUntil, new Date())))).limit(batchLimit(limit));
102
+ let failed = 0;
103
+ for (const intent of due) {
104
+ try {
105
+ await dispatchA2aEgress(db, intent.id);
106
+ }
107
+ catch {
108
+ failed++;
109
+ }
110
+ }
111
+ await cleanupA2aEgress(db, limit);
112
+ const inboundExpired = db.select({ id: a2aInbound.id }).from(a2aInbound)
113
+ .where(lte(a2aInbound.createdAt, new Date(Date.now() - A2A_EGRESS_RETRY_WINDOW_MS)))
114
+ .orderBy(asc(a2aInbound.createdAt), asc(a2aInbound.id)).limit(batchLimit(limit));
115
+ await db.delete(a2aInbound).where(inArray(a2aInbound.id, inboundExpired));
116
+ return { attempted: due.length, failed };
117
+ }
118
+ //# sourceMappingURL=a2aEgress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2aEgress.js","sourceRoot":"","sources":["../../src/engine/a2aEgress.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/engine/action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAW,iBAAiB,EAAoE,MAAM,iBAAiB,CAAC;AAQ/H,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAMrF,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AAEnC,KAAK,aAAa,GAAG,OAAO,iBAAiB,CAAC,YAAY,CAAC;AAC3D,KAAK,sBAAsB,GAAG,IAAI,CAChC,aAAa,EACb,IAAI,GAAG,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,kBAAkB,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,kBAAkB,GAAG,yBAAyB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,kBAAkB,CACvN,CAAC;AAIF,eAAO,MAAM,0BAA0B,QAAS,CAAC;AACjD;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,SAAU,CAAC;AACzD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,6BAA6B,QAAsB,CAAC;AACjE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,+BAA+B,OAAQ,CAAC;AAIrD,MAAM,WAAW,+BAA+B;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,0DAA0D;IAC1D,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,4DAA4D;IAC5D,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,2EAA2E;IAC3E,cAAc,CAAC,EAAE,wBAAwB,CAAC;CAC3C;AAkPD,wBAAsB,cAAc,CAClC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB,EACD,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,wBAAwB,CAAA;CAAO;;;;;;;;;;;;;;;GAoJ5D;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;;;;;;;;;;;;KAuBjF;AAED,wBAAsB,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;;;;;;;;;;;;UA4B7F;AAED,wBAAsB,YAAY,CAChC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,wBAAwB,CAAA;CAAO,oBAyB5D;AAuPD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE7D;AAmvBD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,EACD,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACxB;;;;;;;;;GAWP;AA6JD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5G,OAAO,GAAE;IAAE,eAAe,CAAC,EAAE,sBAAsB,CAAA;CAAO;;;;;;;;;GAU3D;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,EACD,OAAO,GAAE;IAAE,eAAe,CAAC,EAAE,sBAAsB,CAAA;CAAO;;;;;;;;;GAgE3D;AAED,wBAAsB,YAAY,CAChC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,EACD,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;yEACqE;IACrE,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACxB;;;;;;;;;GAkTP;AAssBD;;;;;;;;;GASG;AACH,wBAAsB,+BAA+B,CACnD,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAYlB;AAkVD,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CA6IjB;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,sBAAsB,EAChC,UAAU,EAAE,sBAAsB,EAClC,IAAI,GAAE;IAAE,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CAAO,oBAyL5E;AAED,wBAAsB,gCAAgC,CACpD,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,mBAiCf;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE;IACJ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;;;;;;;;;;;;;;UA2DF;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,sBAAsB,EAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE;IACJ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EACD,IAAI,CAAC,EAAE,wBAAwB;;;;;;;;;;;;;;UAsGhC;AAiKD,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,sBAAsB,EAChC,IAAI,GAAE,+BAA+B,GAAG,MAAM,GAAG,IAAS,mBAiD3D;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;;;;;;;;;;;;;;UAcxG"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/engine/action.ts"],"names":[],"mappings":"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"}
@@ -1036,10 +1036,25 @@ async function dispatchRelease(args) {
1036
1036
  ?? activeBindings.find((binding) => binding.nodeId === implicitDirectNodeId)?.nodeId
1037
1037
  ?? activeBindings[0]?.nodeId
1038
1038
  ?? (agent.locationType === 'via_node' ? agent.locationNodeId : null);
1039
- const hostLive = !!registry
1039
+ // An implicit direct node has no provider row and the Cloudflare edge adapter
1040
+ // cannot see the DO, so `isHandlerConnectionLive` reports it connected. For a
1041
+ // guarded release the node row is the only liveness signal: a never-attached
1042
+ // ghost (status 'offline', null heartbeat) can never accept the dispatch and
1043
+ // must complete locally; a connected real direct node is 'online' with a fresh
1044
+ // heartbeat and keeps the existing dispatch fence. Scoped to the implicit
1045
+ // direct node so all other node/legacy semantics are unchanged.
1046
+ let hostLive = !!registry
1040
1047
  && !!nodeId
1041
1048
  && await isHandlerConnectionLive(args.db, registry, args.workspaceId, nodeId, agent.providerName);
1042
- if (!hostLive) {
1049
+ if (hostLive && nodeId === implicitDirectNodeId) {
1050
+ const [directNode] = await args.db
1051
+ .select({ status: nodes.status, lastHeartbeatAt: nodes.lastHeartbeatAt })
1052
+ .from(nodes)
1053
+ .where(and(eq(nodes.workspaceId, args.workspaceId), eq(nodes.id, nodeId)));
1054
+ if (!directNode || !isNodeLive(directNode))
1055
+ hostLive = false;
1056
+ }
1057
+ if (!hostLive || !registry) {
1043
1058
  return input.delete_agent === true ? completeLocally() : failClosed();
1044
1059
  }
1045
1060
  // Release is a capacity operation handled by the provider hosting the agent.