@relaycast/engine 6.1.0 → 6.3.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 (69) hide show
  1. package/dist/adapters/node/delivery-maintenance.d.ts +1 -1
  2. package/dist/adapters/node/delivery-maintenance.d.ts.map +1 -1
  3. package/dist/adapters/node/delivery-maintenance.js +4 -4
  4. package/dist/adapters/node/delivery-maintenance.js.map +1 -1
  5. package/dist/adapters/node/index.js +2 -2
  6. package/dist/adapters/node/index.js.map +1 -1
  7. package/dist/adapters/node/realtime.d.ts.map +1 -1
  8. package/dist/adapters/node/realtime.js +45 -3
  9. package/dist/adapters/node/realtime.js.map +1 -1
  10. package/dist/agent-disconnect.d.ts +23 -1
  11. package/dist/agent-disconnect.d.ts.map +1 -1
  12. package/dist/agent-disconnect.js +20 -2
  13. package/dist/agent-disconnect.js.map +1 -1
  14. package/dist/db/migrations/0032_invocation_handler_unreachable.sql +5 -0
  15. package/dist/db/schema.d.ts +17 -0
  16. package/dist/db/schema.d.ts.map +1 -1
  17. package/dist/db/schema.js +4 -0
  18. package/dist/db/schema.js.map +1 -1
  19. package/dist/engine/action.d.ts +34 -13
  20. package/dist/engine/action.d.ts.map +1 -1
  21. package/dist/engine/action.js +323 -57
  22. package/dist/engine/action.js.map +1 -1
  23. package/dist/engine/delivery.d.ts +21 -1
  24. package/dist/engine/delivery.d.ts.map +1 -1
  25. package/dist/engine/delivery.js +79 -9
  26. package/dist/engine/delivery.js.map +1 -1
  27. package/dist/engine/invocationCompletion.d.ts +43 -0
  28. package/dist/engine/invocationCompletion.d.ts.map +1 -1
  29. package/dist/engine/invocationCompletion.js +108 -4
  30. package/dist/engine/invocationCompletion.js.map +1 -1
  31. package/dist/engine/node.d.ts +72 -6
  32. package/dist/engine/node.d.ts.map +1 -1
  33. package/dist/engine/node.js +152 -23
  34. package/dist/engine/node.js.map +1 -1
  35. package/dist/engine/nodeDeliver.d.ts.map +1 -1
  36. package/dist/engine/nodeDeliver.js +5 -0
  37. package/dist/engine/nodeDeliver.js.map +1 -1
  38. package/dist/engine/observerToken.js +1 -1
  39. package/dist/engine/observerToken.js.map +1 -1
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +7 -5
  43. package/dist/index.js.map +1 -1
  44. package/dist/lib/origin.d.ts +44 -0
  45. package/dist/lib/origin.d.ts.map +1 -1
  46. package/dist/lib/origin.js +63 -3
  47. package/dist/lib/origin.js.map +1 -1
  48. package/dist/lib/serverTelemetry.d.ts.map +1 -1
  49. package/dist/lib/serverTelemetry.js +10 -2
  50. package/dist/lib/serverTelemetry.js.map +1 -1
  51. package/dist/node-invocations.d.ts +1 -1
  52. package/dist/node-invocations.d.ts.map +1 -1
  53. package/dist/node-invocations.js +1 -1
  54. package/dist/node-invocations.js.map +1 -1
  55. package/dist/ports/realtime.d.ts +22 -1
  56. package/dist/ports/realtime.d.ts.map +1 -1
  57. package/dist/ports/realtime.js.map +1 -1
  58. package/dist/routes/action.js +11 -5
  59. package/dist/routes/action.js.map +1 -1
  60. package/dist/routes/deliveryRouting.d.ts +20 -1
  61. package/dist/routes/deliveryRouting.d.ts.map +1 -1
  62. package/dist/routes/deliveryRouting.js +116 -17
  63. package/dist/routes/deliveryRouting.js.map +1 -1
  64. package/dist/routes/node.js +3 -2
  65. package/dist/routes/node.js.map +1 -1
  66. package/dist/routes/presence.d.ts.map +1 -1
  67. package/dist/routes/presence.js +15 -4
  68. package/dist/routes/presence.js.map +1 -1
  69. package/package.json +3 -3
@@ -9,6 +9,26 @@ export const ORIGIN_ACTOR_HEADER = "X-Relaycast-Origin-Actor";
9
9
  export const ORIGIN_ACTOR_QUERY = "origin_actor";
10
10
  export const AGENT_RELAY_DISTINCT_ID_HEADER = "X-Agent-Relay-Distinct-Id";
11
11
  export const AGENT_RELAY_DISTINCT_ID_QUERY = "agent_relay_distinct_id";
12
+ /**
13
+ * Who — as a machine, a person, and an organization — is behind this request.
14
+ *
15
+ * A relaycast workspace is an API-key row; it has no user table, so the gateway
16
+ * cannot derive a human identity on its own. Callers that *do* know one (the
17
+ * Agent Relay CLI and broker, after `agent-relay cloud login`) forward it here
18
+ * so server-side product events can be grouped by machine, user, and org
19
+ * instead of only by workspace.
20
+ *
21
+ * All four are optional and untrusted: they are analytics dimensions only and
22
+ * must never gate authorization.
23
+ */
24
+ export const AGENT_RELAY_MACHINE_ID_HEADER = "X-Agent-Relay-Machine-Id";
25
+ export const AGENT_RELAY_MACHINE_ID_QUERY = "agent_relay_machine_id";
26
+ export const AGENT_RELAY_USER_ID_HEADER = "X-Agent-Relay-User-Id";
27
+ export const AGENT_RELAY_USER_ID_QUERY = "agent_relay_user_id";
28
+ export const AGENT_RELAY_ORG_ID_HEADER = "X-Agent-Relay-Org-Id";
29
+ export const AGENT_RELAY_ORG_ID_QUERY = "agent_relay_org_id";
30
+ export const AGENT_RELAY_ORG_SLUG_HEADER = "X-Agent-Relay-Org-Slug";
31
+ export const AGENT_RELAY_ORG_SLUG_QUERY = "agent_relay_org_slug";
12
32
  /** Fallback value when the origin actor is missing or invalid. */
13
33
  export const UNKNOWN_ORIGIN_ACTOR = "unknown";
14
34
  /** Upper bound on the origin-actor value — generous enough for a UA-style path. */
@@ -49,8 +69,28 @@ export function extractOriginActor(request) {
49
69
  return trimmed.slice(0, ORIGIN_ACTOR_MAX_LENGTH).toLowerCase();
50
70
  }
51
71
  export function extractAgentRelayDistinctId(request) {
52
- const raw = request.headers.get(AGENT_RELAY_DISTINCT_ID_HEADER) ??
53
- new URL(request.url).searchParams.get(AGENT_RELAY_DISTINCT_ID_QUERY);
72
+ return readIdentityValue(request, AGENT_RELAY_DISTINCT_ID_HEADER, AGENT_RELAY_DISTINCT_ID_QUERY, { maxLength: 128, onOversize: "truncate" });
73
+ }
74
+ /**
75
+ * Read one identity dimension from a header, falling back to a query param —
76
+ * WebSocket upgrades from browsers can't set custom headers, so the SDK forwards
77
+ * these on the query string (mirrors how `origin_actor` works).
78
+ *
79
+ * Anything outside the distinct-id charset is dropped, which keeps a malformed
80
+ * upstream value from smuggling a header injection or a misleading id into
81
+ * analytics.
82
+ *
83
+ * `onOversize` differs by dimension on purpose:
84
+ * - `reject` for the actor dimensions. A truncated user or org id is a
85
+ * *different* id that can collide with a real one and attribute usage to
86
+ * the wrong person or company, so no attribution beats wrong attribution.
87
+ * Every SDK caps well below these limits, so only a malformed caller hits it.
88
+ * - `truncate` for `agent_relay_distinct_id`, whose cap-at-128 behaviour is
89
+ * already shipped and covered by a test; changing it is out of scope here.
90
+ */
91
+ function readIdentityValue(request, header, query, { maxLength, onOversize }) {
92
+ const raw = request.headers.get(header) ??
93
+ new URL(request.url).searchParams.get(query);
54
94
  if (!raw)
55
95
  return undefined;
56
96
  const trimmed = raw.trim();
@@ -58,7 +98,27 @@ export function extractAgentRelayDistinctId(request) {
58
98
  return undefined;
59
99
  if (!AGENT_RELAY_DISTINCT_ID_ALLOWED.test(trimmed))
60
100
  return undefined;
61
- return trimmed.slice(0, 128);
101
+ if (trimmed.length > maxLength) {
102
+ return onOversize === "reject" ? undefined : trimmed.slice(0, maxLength);
103
+ }
104
+ return trimmed;
105
+ }
106
+ /**
107
+ * Extract the caller-declared user/org identity. Returns an object with only the
108
+ * fields that were present and well-formed, so it can be spread straight into
109
+ * telemetry properties without emitting empty values.
110
+ */
111
+ export function extractActorIdentity(request) {
112
+ const machineId = readIdentityValue(request, AGENT_RELAY_MACHINE_ID_HEADER, AGENT_RELAY_MACHINE_ID_QUERY, { maxLength: 128, onOversize: "reject" });
113
+ const userId = readIdentityValue(request, AGENT_RELAY_USER_ID_HEADER, AGENT_RELAY_USER_ID_QUERY, { maxLength: 128, onOversize: "reject" });
114
+ const orgId = readIdentityValue(request, AGENT_RELAY_ORG_ID_HEADER, AGENT_RELAY_ORG_ID_QUERY, { maxLength: 128, onOversize: "reject" });
115
+ const orgSlug = readIdentityValue(request, AGENT_RELAY_ORG_SLUG_HEADER, AGENT_RELAY_ORG_SLUG_QUERY, { maxLength: 120, onOversize: "reject" });
116
+ return {
117
+ ...(machineId ? { actor_machine_id: machineId } : {}),
118
+ ...(userId ? { actor_user_id: userId } : {}),
119
+ ...(orgId ? { actor_org_id: orgId } : {}),
120
+ ...(orgSlug ? { actor_org_slug: orgSlug } : {}),
121
+ };
62
122
  }
63
123
  function sanitizeOriginPart(value, maxLen) {
64
124
  if (!value)
@@ -1 +1 @@
1
- {"version":3,"file":"origin.js","sourceRoot":"","sources":["../../src/lib/origin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"origin.js","sourceRoot":"","sources":["../../src/lib/origin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"serverTelemetry.d.ts","sourceRoot":"","sources":["../../src/lib/serverTelemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAQxC,KAAK,WAAW,GAAG,oBAAoB,MAAM,EAAE,CAAC;AAEhD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBpE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAClB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,IAAI,CA6BN"}
1
+ {"version":3,"file":"serverTelemetry.d.ts","sourceRoot":"","sources":["../../src/lib/serverTelemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AASxC,KAAK,WAAW,GAAG,oBAAoB,MAAM,EAAE,CAAC;AAEhD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBpE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAClB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,IAAI,CAqCN"}
@@ -1,4 +1,4 @@
1
- import { extractAgentRelayDistinctId, extractOriginActor, requiredOriginInfo, UNKNOWN_ORIGIN_ACTOR, } from "./origin.js";
1
+ import { extractActorIdentity, extractAgentRelayDistinctId, extractOriginActor, requiredOriginInfo, UNKNOWN_ORIGIN_ACTOR, } from "./origin.js";
2
2
  export function normalizeRoutePathForTelemetry(value) {
3
3
  const withoutQuery = value.split(/[?#]/)[0] ?? value;
4
4
  const compact = withoutQuery.replace(/\/+/g, "/").trim();
@@ -32,14 +32,22 @@ export function emitServerEvent(c, workspaceId, event, properties) {
32
32
  const originActor = c.get("originActor") ?? extractOriginActor(c.req.raw) ?? UNKNOWN_ORIGIN_ACTOR;
33
33
  const origin = requiredOriginInfo(c.req.raw);
34
34
  const clientDistinctId = extractAgentRelayDistinctId(c.req.raw);
35
+ // Caller-declared user/org. Analytics dimensions only — never authorization.
36
+ const actor = extractActorIdentity(c.req.raw);
35
37
  c.get("engine").telemetry.capture({
36
38
  name: event,
37
- distinctId: clientDistinctId ?? workspaceId,
39
+ // Prefer the caller's user id: it puts these server events on the same
40
+ // PostHog person as that user's CLI/broker events. `client_distinct_id` is
41
+ // already the user id when the CLI is signed in; the explicit fallback
42
+ // chain also covers callers that send only one of the two headers.
43
+ distinctId: actor.actor_user_id ?? clientDistinctId ?? workspaceId,
38
44
  properties: {
39
45
  app: "relaycast-server",
40
46
  surface: "cloud",
41
47
  workspace_id: workspaceId,
42
48
  ...(clientDistinctId ? { client_distinct_id: clientDistinctId } : {}),
49
+ is_authenticated: Boolean(actor.actor_user_id),
50
+ ...actor,
43
51
  origin_actor: originActor,
44
52
  origin_client: origin.origin_client,
45
53
  origin_version: origin.origin_version,
@@ -1 +1 @@
1
- {"version":3,"file":"serverTelemetry.js","sourceRoot":"","sources":["../../src/lib/serverTelemetry.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAIrB,MAAM,UAAU,8BAA8B,CAAC,KAAa;IAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IACrD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAG,gBAAgB;SAC9B,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,IACE,4EAA4E,CAAC,IAAI,CAC/E,OAAO,CACR;YAED,OAAO,KAAK,CAAC;QACf,IAAI,0CAA0C,CAAC,IAAI,CAAC,OAAO,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IACL,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,CAAkB,EAClB,WAAmB,EACnB,KAAkB,EAClB,UAAmC;IAEnC,MAAM,oBAAoB,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;IAC/C,IAAI,OAAO,oBAAoB,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACxD,oBAAoB,CAAC,UAAU,GAAG,8BAA8B,CAC9D,oBAAoB,CAAC,UAAU,CAChC,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,WAAW,GACf,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,oBAAoB,CAAC;IAEhF,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;QAChC,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,gBAAgB,IAAI,WAAW;QAC3C,UAAU,EAAE;YACV,GAAG,EAAE,kBAAkB;YACvB,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,WAAW;YACzB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,YAAY,EAAE,WAAW;YACzB,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,GAAG,oBAAoB;SACxB;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"serverTelemetry.js","sourceRoot":"","sources":["../../src/lib/serverTelemetry.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAIrB,MAAM,UAAU,8BAA8B,CAAC,KAAa;IAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IACrD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAG,gBAAgB;SAC9B,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,IACE,4EAA4E,CAAC,IAAI,CAC/E,OAAO,CACR;YAED,OAAO,KAAK,CAAC;QACf,IAAI,0CAA0C,CAAC,IAAI,CAAC,OAAO,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IACL,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,CAAkB,EAClB,WAAmB,EACnB,KAAkB,EAClB,UAAmC;IAEnC,MAAM,oBAAoB,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;IAC/C,IAAI,OAAO,oBAAoB,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACxD,oBAAoB,CAAC,UAAU,GAAG,8BAA8B,CAC9D,oBAAoB,CAAC,UAAU,CAChC,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,WAAW,GACf,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,oBAAoB,CAAC;IAEhF,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChE,6EAA6E;IAC7E,MAAM,KAAK,GAAG,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;QAChC,IAAI,EAAE,KAAK;QACX,uEAAuE;QACvE,2EAA2E;QAC3E,uEAAuE;QACvE,mEAAmE;QACnE,UAAU,EAAE,KAAK,CAAC,aAAa,IAAI,gBAAgB,IAAI,WAAW;QAClE,UAAU,EAAE;YACV,GAAG,EAAE,kBAAkB;YACvB,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,WAAW;YACzB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,gBAAgB,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;YAC9C,GAAG,KAAK;YACR,YAAY,EAAE,WAAW;YACzB,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,GAAG,oBAAoB;SACxB;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -1,2 +1,2 @@
1
- export { drainNodeInvocations, sweepTimedOutInvocations, type SweepTimedOutInvocationsOptions, } from './engine/action.js';
1
+ export { ACTION_HANDLER_UNREACHABLE_TTL_MS, drainNodeInvocations, sweepTimedOutInvocations, type SweepTimedOutInvocationsOptions, } from './engine/action.js';
2
2
  //# sourceMappingURL=node-invocations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-invocations.d.ts","sourceRoot":"","sources":["../src/node-invocations.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,KAAK,+BAA+B,GACrC,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"node-invocations.d.ts","sourceRoot":"","sources":["../src/node-invocations.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,oBAAoB,EACpB,wBAAwB,EACxB,KAAK,+BAA+B,GACrC,MAAM,oBAAoB,CAAC"}
@@ -1,2 +1,2 @@
1
- export { drainNodeInvocations, sweepTimedOutInvocations, } from './engine/action.js';
1
+ export { ACTION_HANDLER_UNREACHABLE_TTL_MS, drainNodeInvocations, sweepTimedOutInvocations, } from './engine/action.js';
2
2
  //# sourceMappingURL=node-invocations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-invocations.js","sourceRoot":"","sources":["../src/node-invocations.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GAEzB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"node-invocations.js","sourceRoot":"","sources":["../src/node-invocations.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,oBAAoB,EACpB,wBAAwB,GAEzB,MAAM,oBAAoB,CAAC"}
@@ -95,12 +95,33 @@ export interface NodeConnectionRegistry {
95
95
  code: string;
96
96
  message: string;
97
97
  } | null;
98
- /** Bind a provider name to a connection, superseding a stale prior attachment. */
98
+ /**
99
+ * Bind a provider name to a connection, superseding a stale prior attachment.
100
+ * When the connection was already bound to a DIFFERENT provider identity —
101
+ * another provider name, or another instance id (a same-socket re-register by
102
+ * a restarted provider whose broker-side cursors are gone) — reset its
103
+ * delivery ready-set so the following {@link setProviderDeliveryReadiness}
104
+ * `agent_scoped` call starts empty and every identity must re-announce, and
105
+ * drop the old name's index entry if it still points at this connection. Only
106
+ * a same-name, same-instance re-register keeps the ready-set.
107
+ */
99
108
  attachProvider?(workspaceId: string, nodeId: string, providerName: string, instanceId: string, connectionId: string): void;
100
109
  /**
101
110
  * Configure durable-delivery readiness for the active provider connection.
102
111
  * Cursor-negotiated connections start agent-scoped with no ready identities;
103
112
  * legacy connections are immediately ready for every hosted agent.
113
+ *
114
+ * `agent_scoped` must PRESERVE any identities already marked ready on the
115
+ * resolved connection, but ONLY for a same-connection, same-name,
116
+ * SAME-instance re-register: that is a reconnect and does not invalidate
117
+ * broker-side cursors, so wiping the ready-set would silently gate every
118
+ * in-flight delivery until each agent is re-announced. A re-register with a
119
+ * NEW provider name or instance id is a different/restarted provider —
120
+ * {@link attachProvider} clears the ready-set first, so this call starts a
121
+ * fresh empty agent-scoped set. A genuinely new
122
+ * connection has no ready-set yet, so it also starts empty; a transition from
123
+ * `immediate` resets to an empty agent-scoped set. Out-of-process implementers
124
+ * (relaycast-cloud NodeDO) must mirror this.
104
125
  */
105
126
  setProviderDeliveryReadiness?(workspaceId: string, nodeId: string, providerName: string, connectionId: string | undefined, mode: 'immediate' | 'agent_scoped'): void;
106
127
  /** Mark identities ready after their cursor-bearing reply is on the socket. */
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/ports/realtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/ports/realtime.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../src/ports/realtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA6JH,oFAAoF;AACpF,MAAM,UAAU,4BAA4B,CAC1C,QAAgC,EAChC,WAAmB,EACnB,MAAc,EACd,YAAoB,EACpB,OAAe;IAEf,OAAO,QAAQ,CAAC,4BAA4B,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC;AACrG,CAAC"}
1
+ {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../src/ports/realtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAkLH,oFAAoF;AACpF,MAAM,UAAU,4BAA4B,CAC1C,QAAgC,EAChC,WAAmB,EACnB,MAAc,EACd,YAAoB,EACpB,OAAe;IAEf,OAAO,QAAQ,CAAC,4BAA4B,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC;AACrG,CAAC"}
@@ -59,14 +59,18 @@ actionRoutes.post('/actions', requireAuth, rateLimit, async (c) => {
59
59
  if (callerAgent && parsed.data.handler_agent !== callerAgent.name) {
60
60
  return jsonError(c, 'forbidden', `Agent "${callerAgent.name}" may only register actions it will handle itself`, 403);
61
61
  }
62
- const result = await actionEngine.registerAction(db, workspace.id, parsed.data);
62
+ const { created, action } = await actionEngine.registerAction(db, workspace.id, parsed.data, {
63
+ completionDeps: c.get('engine'),
64
+ });
63
65
  emitServerEvent(c, workspace.id, 'relaycast_server_action_registered', {
64
- action_name: result.name,
66
+ action_name: action.name,
65
67
  handler_agent_name: parsed.data.handler_agent ?? null,
66
68
  handler_node_name: parsed.data.handler_node ?? null,
67
69
  });
68
- runInBackground(c, fanoutToWorkspace(c, 'action.registered', { action_name: result.name }), 'fanout action.registered');
69
- return jsonCreated(c, result);
70
+ runInBackground(c, fanoutToWorkspace(c, 'action.registered', { action_name: action.name }), 'fanout action.registered');
71
+ // 201 when the action was created, 200 when an existing registration was
72
+ // refreshed (idempotent re-register).
73
+ return created ? jsonCreated(c, action) : jsonOk(c, action);
70
74
  }
71
75
  catch (err) {
72
76
  return errorResponse(c, err);
@@ -106,7 +110,9 @@ actionRoutes.delete('/actions/:name', requireAuth, rateLimit, async (c) => {
106
110
  try {
107
111
  const db = c.get('db');
108
112
  const workspace = c.get('workspace');
109
- const deleted = await actionEngine.deleteAction(db, workspace.id, c.req.param('name'));
113
+ const deleted = await actionEngine.deleteAction(db, workspace.id, c.req.param('name'), {
114
+ completionDeps: c.get('engine'),
115
+ });
110
116
  if (!deleted) {
111
117
  return jsonNotFound(c, 'action_not_found', 'Action not found');
112
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/routes/action.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/routes/action.ts"],"names":[],"mappings":"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"}
@@ -6,11 +6,30 @@ type HonoContext = Context<AppEnv>;
6
6
  export declare function routeDeliveryOutcomes(c: HonoContext, deliveries: DeliveryFanoutRecord[], eventType: string, eventData: Record<string, unknown>, opts?: {
7
7
  workspaceId?: string;
8
8
  }): Promise<void>;
9
- export declare function sweepDueHttpPushDeliveries(engine: EngineDeps, opts?: {
9
+ /**
10
+ * Periodic redrive for queued node deliveries whose `next_attempt_at` is due (or
11
+ * was never stamped). Covers http_push rows (their agent never connects to pull)
12
+ * and ws-node rows whose single background dispatch was lost or failed.
13
+ *
14
+ * http_push rows are independent single-shot webhooks with no ordering
15
+ * relationship, so they are dispatched concurrently per row (each re-routed
16
+ * through {@link routeOneDeliveryOutcome}). ws-node rows for the same agent form
17
+ * a monotonic `seq` stream that the broker injects in order, so they are grouped
18
+ * per agent and redriven serially in ascending seq (see
19
+ * {@link redriveWsBacklogForAgent}); different agents (and different nodes) are
20
+ * still processed concurrently. Returns the number of due rows the sweep found.
21
+ */
22
+ export declare function sweepDueNodeDeliveries(engine: EngineDeps, opts?: {
10
23
  workspaceId?: string;
11
24
  now?: Date;
12
25
  limit?: number;
13
26
  }): Promise<number>;
27
+ /**
28
+ * @deprecated Renamed to {@link sweepDueNodeDeliveries}, which also sweeps queued
29
+ * ws-node rows. Kept as a thin alias because relaycast-cloud's cron imports this
30
+ * name; delete once that host migrates.
31
+ */
32
+ export declare const sweepDueHttpPushDeliveries: typeof sweepDueNodeDeliveries;
14
33
  /**
15
34
  * Scheduled TTL expiry maintenance. Each workspace advances by at most one
16
35
  * D1-safe delivery batch per invocation; adapters call this on a cadence rather
@@ -1 +1 @@
1
- {"version":3,"file":"deliveryRouting.d.ts","sourceRoot":"","sources":["../../src/routes/deliveryRouting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,WAAW,CAAC;AAGvD,OAAO,KAAK,EACV,oBAAoB,EACpB,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAA+C,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIjG,KAAK,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAqcnC,wBAAsB,qBAAqB,CACzC,CAAC,EAAE,WAAW,EACd,UAAU,EAAE,oBAAoB,EAAE,EAClC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,UAAU,EAClB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9D,OAAO,CAAC,MAAM,CAAC,CAWjB;AAoBD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,UAAU,EAClB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAO,GAC9C,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,wBAAwB,CAC5C,CAAC,EAAE,WAAW,EACd,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,uBAAuB,EAAE,GACpC,OAAO,CAAC,IAAI,CAAC,CAaf"}
1
+ {"version":3,"file":"deliveryRouting.d.ts","sourceRoot":"","sources":["../../src/routes/deliveryRouting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,WAAW,CAAC;AAGvD,OAAO,KAAK,EACV,oBAAoB,EACpB,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAA+C,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIjG,KAAK,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AA6enC,wBAAsB,qBAAqB,CACzC,CAAC,EAAE,WAAW,EACd,UAAU,EAAE,oBAAoB,EAAE,EAClC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,IAAI,CAAC,CAEf;AA4CD;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,UAAU,EAClB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9D,OAAO,CAAC,MAAM,CAAC,CAsCjB;AAED;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,+BAAyB,CAAC;AAoBjE;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,UAAU,EAClB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAO,GAC9C,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,wBAAwB,CAC5C,CAAC,EAAE,WAAW,EACd,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,uBAAuB,EAAE,GACpC,OAAO,CAAC,IAAI,CAAC,CAaf"}
@@ -9,7 +9,7 @@ import { isProviderAgentDeliveryReady } from '../ports/index.js';
9
9
  import { fanoutToAgents } from './fanout.js';
10
10
  import { sendNodeContextToAgents } from '../engine/nodeContext.js';
11
11
  import { appendAndPublishWorkspaceEvent } from '../engine/workspaceEvents.js';
12
- const HTTP_PUSH_RETRY_DELAY_MS = 30_000;
12
+ const DISPATCH_RETRY_DELAY_MS = 30_000;
13
13
  function routingContextFromHono(c, workspaceIdOverride) {
14
14
  const workspaceId = workspaceIdOverride ?? c.get('workspace')?.id;
15
15
  if (!workspaceId) {
@@ -156,13 +156,13 @@ function normalizeDeliveryAdapter(adapter, nodeKind) {
156
156
  return 'http.basic.v1';
157
157
  return null;
158
158
  }
159
- async function recordHttpPushRetry(ctx, deliveryId, error, opts = {}) {
159
+ async function recordDispatchRetry(ctx, deliveryId, error, opts = {}) {
160
160
  await ctx.db
161
161
  .update(deliveryRows)
162
162
  .set({
163
163
  ...(opts.incrementAttempts ? { dispatchAttempts: sql `coalesce(${deliveryRows.dispatchAttempts}, 0) + 1` } : {}),
164
164
  lastDispatchError: error,
165
- nextAttemptAt: new Date(Date.now() + HTTP_PUSH_RETRY_DELAY_MS),
165
+ nextAttemptAt: new Date(Date.now() + DISPATCH_RETRY_DELAY_MS),
166
166
  updatedAt: new Date(),
167
167
  })
168
168
  .where(and(eq(deliveryRows.workspaceId, ctx.workspaceId), eq(deliveryRows.id, deliveryId), eq(deliveryRows.status, 'queued')));
@@ -171,11 +171,11 @@ async function dispatchHttpPush(args) {
171
171
  const config = args.target.deliveryConfig ?? {};
172
172
  const url = typeof config.url === 'string' ? config.url : null;
173
173
  if (!url) {
174
- await recordHttpPushRetry(args.ctx, args.delivery.id, 'invalid http_push delivery config: missing url', { incrementAttempts: true });
174
+ await recordDispatchRetry(args.ctx, args.delivery.id, 'invalid http_push delivery config: missing url', { incrementAttempts: true });
175
175
  return 'failed';
176
176
  }
177
177
  if (!isSafeExternalUrl(url, { strict: strictExternalUrl(args.ctx.engine) })) {
178
- await recordHttpPushRetry(args.ctx, args.delivery.id, 'unsafe http_push delivery url', { incrementAttempts: true });
178
+ await recordDispatchRetry(args.ctx, args.delivery.id, 'unsafe http_push delivery url', { incrementAttempts: true });
179
179
  return 'failed';
180
180
  }
181
181
  // Optional egress proxy: when the node opts in with `use_proxy`, route the POST
@@ -186,7 +186,7 @@ async function dispatchHttpPush(args) {
186
186
  // above; the proxy requires both a url and a secret.
187
187
  const proxied = resolveHttpPushProxy(url, config, args.ctx.engine.config?.httpPushProxy);
188
188
  if (!proxied.ok) {
189
- await recordHttpPushRetry(args.ctx, args.delivery.id, proxied.reason, { incrementAttempts: true });
189
+ await recordDispatchRetry(args.ctx, args.delivery.id, proxied.reason, { incrementAttempts: true });
190
190
  return 'failed';
191
191
  }
192
192
  const requestUrl = proxied.requestUrl;
@@ -231,7 +231,7 @@ async function dispatchHttpPush(args) {
231
231
  .set({
232
232
  dispatchAttempts: sql `coalesce(${deliveryRows.dispatchAttempts}, 0) + 1`,
233
233
  lastDispatchError: null,
234
- nextAttemptAt: new Date(Date.now() + HTTP_PUSH_RETRY_DELAY_MS),
234
+ nextAttemptAt: new Date(Date.now() + DISPATCH_RETRY_DELAY_MS),
235
235
  updatedAt: new Date(),
236
236
  })
237
237
  .where(and(...claimConditions))
@@ -256,11 +256,11 @@ async function dispatchHttpPush(args) {
256
256
  // `redirect: 'manual'` surfaces a redirect as a 3xx status (or an
257
257
  // opaqueredirect response with status 0); treat both as a hard failure.
258
258
  if (response.type === 'opaqueredirect' || (response.status >= 300 && response.status < 400)) {
259
- await recordHttpPushRetry(args.ctx, args.delivery.id, `redirect not allowed (HTTP ${response.status})`);
259
+ await recordDispatchRetry(args.ctx, args.delivery.id, `redirect not allowed (HTTP ${response.status})`);
260
260
  return 'failed';
261
261
  }
262
262
  if (!response.ok) {
263
- await recordHttpPushRetry(args.ctx, args.delivery.id, `HTTP ${response.status}`);
263
+ await recordDispatchRetry(args.ctx, args.delivery.id, `HTTP ${response.status}`);
264
264
  return 'failed';
265
265
  }
266
266
  if (ackMode === 'on_2xx') {
@@ -288,13 +288,13 @@ async function dispatchHttpPush(args) {
288
288
  return 'acked';
289
289
  }
290
290
  }
291
- await recordHttpPushRetry(args.ctx, args.delivery.id, 'response ack not signaled');
291
+ await recordDispatchRetry(args.ctx, args.delivery.id, 'response ack not signaled');
292
292
  return 'failed';
293
293
  }
294
294
  return 'delivered';
295
295
  }
296
296
  catch (err) {
297
- await recordHttpPushRetry(args.ctx, args.delivery.id, err instanceof Error ? err.message : 'HTTP delivery failed');
297
+ await recordDispatchRetry(args.ctx, args.delivery.id, err instanceof Error ? err.message : 'HTTP delivery failed');
298
298
  return 'failed';
299
299
  }
300
300
  }
@@ -309,7 +309,20 @@ async function routeOneDeliveryOutcome(ctx, liveLocations, recordedTargets, deli
309
309
  if (locationType === 'via_node' && locationNodeId && deliveryAdapter === 'ws.node.v1') {
310
310
  const providerName = liveLocation?.providerName ?? recordedTarget?.providerName ?? 'default';
311
311
  if (!isProviderAgentDeliveryReady(ctx.engine.nodeConnections, ctx.workspaceId, locationNodeId, providerName, delivery.agentId)) {
312
- return;
312
+ // The provider connection has not marked this identity delivery-ready
313
+ // (cursor negotiation pending). Leave the row queued but stamp it so the
314
+ // skip is observable and a later sweep retries it, instead of the row
315
+ // silently sitting until its mailbox TTL dead-letters it. This is a skip,
316
+ // not a dispatch attempt, so dispatch_attempts is not incremented.
317
+ await recordDispatchRetry(ctx, delivery.id, 'provider connection not delivery-ready for agent');
318
+ console.warn('[delivery.route] provider not delivery-ready; delivery deferred', {
319
+ workspace_id: ctx.workspaceId,
320
+ node_id: locationNodeId,
321
+ provider_name: providerName,
322
+ agent_id: delivery.agentId,
323
+ delivery_id: delivery.id,
324
+ });
325
+ return 'deferred';
313
326
  }
314
327
  const sent = await ctx.engine.nodeConnections.sendToProvider(ctx.workspaceId, locationNodeId, providerName, buildDeliverFrame({
315
328
  delivery_id: delivery.id,
@@ -322,19 +335,36 @@ async function routeOneDeliveryOutcome(ctx, liveLocations, recordedTargets, deli
322
335
  }));
323
336
  if (sent) {
324
337
  await deliveryEngine.markDeliveriesDelivered(ctx.db, ctx.workspaceId, [delivery.id]);
338
+ return 'delivered';
325
339
  }
326
- return;
340
+ // The provider was delivery-ready but the live send did not land (no open
341
+ // socket, the provider detached mid-send, or `socket.send` threw). Leave the
342
+ // row queued but stamp it so the periodic node sweep re-attempts with ~30s
343
+ // spacing, instead of the row sitting silently until its mailbox TTL
344
+ // dead-letters it. Unlike the readiness skip above this is a real dispatch
345
+ // attempt, so it counts toward dispatch_attempts.
346
+ await recordDispatchRetry(ctx, delivery.id, 'node socket send failed', { incrementAttempts: true });
347
+ console.warn('[delivery.route] node send failed; delivery deferred', {
348
+ workspace_id: ctx.workspaceId,
349
+ node_id: locationNodeId,
350
+ provider_name: providerName,
351
+ agent_id: delivery.agentId,
352
+ delivery_id: delivery.id,
353
+ });
354
+ return 'deferred';
327
355
  }
328
356
  if (locationType === 'via_node' && locationNodeId && nodeKind === 'http_push' && target) {
329
357
  const result = await dispatchHttpPush({ ctx, delivery, target, eventType, eventData });
330
358
  if (result === 'delivered') {
331
359
  await deliveryEngine.markDeliveriesDelivered(ctx.db, ctx.workspaceId, [delivery.id]);
360
+ return 'delivered';
332
361
  }
333
- return;
362
+ return 'deferred';
334
363
  }
335
364
  // No agent-owned realtime socket exists anymore. If a legacy/unbound row
336
365
  // reaches this point, leave it queued so a later node binding/replay can
337
366
  // deliver it instead of falsely marking it delivered.
367
+ return 'noop';
338
368
  }
339
369
  async function routeDeliveryOutcomesForContext(ctx, deliveries, eventType, eventData) {
340
370
  if (deliveries.length === 0)
@@ -346,11 +376,80 @@ async function routeDeliveryOutcomesForContext(ctx, deliveries, eventType, event
346
376
  export async function routeDeliveryOutcomes(c, deliveries, eventType, eventData, opts = {}) {
347
377
  await routeDeliveryOutcomesForContext(routingContextFromHono(c, opts.workspaceId), deliveries, eventType, eventData);
348
378
  }
349
- export async function sweepDueHttpPushDeliveries(engine, opts = {}) {
350
- const due = await deliveryEngine.fetchDueHttpPushDeliveryEvents(engine.db, opts);
351
- await Promise.allSettled(due.map((event) => (routeDeliveryOutcomesForContext({ db: engine.db, workspaceId: event.workspaceId, engine }, [event.delivery], event.eventType, event.eventData))));
379
+ /**
380
+ * Redrive a single ws-node agent's queued backlog in ascending `seq` order,
381
+ * serially, stopping at the first row that does not deliver.
382
+ *
383
+ * A `ws.node.v1` deliver frame whose `seq != received_up_to_seq + 1` is treated
384
+ * by the broker as a Gap and is NOT injected (it waits for the missing earlier
385
+ * seq), while the engine's `sendToProvider` returns `true` on a successful
386
+ * socket write — so a naive concurrent/unordered redrive can mark a higher seq
387
+ * "delivered" while the broker silently held it, stranding the row until
388
+ * reconnect replay or the mailbox TTL. To avoid that we always redrive from the
389
+ * agent's LOWEST queued seq regardless of the individual row's `next_attempt_at`
390
+ * due-ness (matching {@link deliverPendingToNode}'s replay ordering): once ANY
391
+ * of the agent's rows is due, the whole queued backlog is re-attempted in order.
392
+ * The moment a row cannot be delivered (readiness skip or failed send —
393
+ * `routeOneDeliveryOutcome` has already stamped it for the next retry) we stop,
394
+ * so a later seq can never outrun an earlier undelivered one.
395
+ */
396
+ async function redriveWsBacklogForAgent(ctx, agentId, now) {
397
+ const backlog = await deliveryEngine.fetchQueuedWsBacklogEvents(ctx.db, ctx.workspaceId, agentId, { now });
398
+ if (backlog.length === 0)
399
+ return;
400
+ const backlogDeliveries = backlog.map((event) => event.delivery);
401
+ const liveLocations = await resolveLiveLocations(ctx, backlogDeliveries);
402
+ const recordedTargets = await resolveRecordedTargets(ctx, backlogDeliveries);
403
+ for (const event of backlog) {
404
+ const outcome = await routeOneDeliveryOutcome(ctx, liveLocations, recordedTargets, event.delivery, event.eventType, event.eventData);
405
+ if (outcome !== 'delivered')
406
+ break;
407
+ }
408
+ }
409
+ /**
410
+ * Periodic redrive for queued node deliveries whose `next_attempt_at` is due (or
411
+ * was never stamped). Covers http_push rows (their agent never connects to pull)
412
+ * and ws-node rows whose single background dispatch was lost or failed.
413
+ *
414
+ * http_push rows are independent single-shot webhooks with no ordering
415
+ * relationship, so they are dispatched concurrently per row (each re-routed
416
+ * through {@link routeOneDeliveryOutcome}). ws-node rows for the same agent form
417
+ * a monotonic `seq` stream that the broker injects in order, so they are grouped
418
+ * per agent and redriven serially in ascending seq (see
419
+ * {@link redriveWsBacklogForAgent}); different agents (and different nodes) are
420
+ * still processed concurrently. Returns the number of due rows the sweep found.
421
+ */
422
+ export async function sweepDueNodeDeliveries(engine, opts = {}) {
423
+ const now = opts.now ?? new Date();
424
+ const due = await deliveryEngine.fetchDueNodeDeliveryEvents(engine.db, { ...opts, now });
425
+ const httpPushEvents = [];
426
+ const wsAgents = [];
427
+ const seenWsAgents = new Set();
428
+ for (const event of due) {
429
+ if (event.delivery.routeNodeKind === 'http_push') {
430
+ httpPushEvents.push(event);
431
+ continue;
432
+ }
433
+ // Collision-safe key: workspace and agent ids are free-form, so encode the
434
+ // tuple rather than joining on a separator (matches groupByNodeProvider).
435
+ const key = JSON.stringify([event.workspaceId, event.delivery.agentId]);
436
+ if (seenWsAgents.has(key))
437
+ continue;
438
+ seenWsAgents.add(key);
439
+ wsAgents.push({ workspaceId: event.workspaceId, agentId: event.delivery.agentId });
440
+ }
441
+ await Promise.allSettled([
442
+ ...httpPushEvents.map((event) => (routeDeliveryOutcomesForContext({ db: engine.db, workspaceId: event.workspaceId, engine }, [event.delivery], event.eventType, event.eventData))),
443
+ ...wsAgents.map((agent) => (redriveWsBacklogForAgent({ db: engine.db, workspaceId: agent.workspaceId, engine }, agent.agentId, now))),
444
+ ]);
352
445
  return due.length;
353
446
  }
447
+ /**
448
+ * @deprecated Renamed to {@link sweepDueNodeDeliveries}, which also sweeps queued
449
+ * ws-node rows. Kept as a thin alias because relaycast-cloud's cron imports this
450
+ * name; delete once that host migrates.
451
+ */
452
+ export const sweepDueHttpPushDeliveries = sweepDueNodeDeliveries;
354
453
  async function notifyDeliveryFailuresForContext(ctx, notices) {
355
454
  for (const notice of notices) {
356
455
  await fanoutToAgentsForContext(ctx, [notice.sender_agent_id], 'delivery.failed', {