@relaycast/engine 5.0.0 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/dist/adapters/node/index.d.ts.map +1 -1
  2. package/dist/adapters/node/index.js +0 -1
  3. package/dist/adapters/node/index.js.map +1 -1
  4. package/dist/adapters/node/realtime.d.ts +13 -41
  5. package/dist/adapters/node/realtime.d.ts.map +1 -1
  6. package/dist/adapters/node/realtime.js +68 -230
  7. package/dist/adapters/node/realtime.js.map +1 -1
  8. package/dist/auth/index.d.ts.map +1 -1
  9. package/dist/auth/index.js +31 -9
  10. package/dist/auth/index.js.map +1 -1
  11. package/dist/auth/tokenKind.d.ts +40 -0
  12. package/dist/auth/tokenKind.d.ts.map +1 -0
  13. package/dist/auth/tokenKind.js +89 -0
  14. package/dist/auth/tokenKind.js.map +1 -0
  15. package/dist/db/migrations/0025_node_kind_role_adapter.sql +45 -0
  16. package/dist/db/migrations/0026_observer_tokens.sql +32 -0
  17. package/dist/db/schema.d.ts +329 -0
  18. package/dist/db/schema.d.ts.map +1 -1
  19. package/dist/db/schema.js +32 -3
  20. package/dist/db/schema.js.map +1 -1
  21. package/dist/engine/action.d.ts +2 -2
  22. package/dist/engine/action.d.ts.map +1 -1
  23. package/dist/engine/action.js +182 -7
  24. package/dist/engine/action.js.map +1 -1
  25. package/dist/engine/activity.d.ts +6 -0
  26. package/dist/engine/activity.d.ts.map +1 -1
  27. package/dist/engine/activity.js +9 -2
  28. package/dist/engine/activity.js.map +1 -1
  29. package/dist/engine/agent.d.ts +0 -33
  30. package/dist/engine/agent.d.ts.map +1 -1
  31. package/dist/engine/agent.js +0 -155
  32. package/dist/engine/agent.js.map +1 -1
  33. package/dist/engine/attachments.d.ts +6 -0
  34. package/dist/engine/attachments.d.ts.map +1 -1
  35. package/dist/engine/attachments.js +37 -0
  36. package/dist/engine/attachments.js.map +1 -1
  37. package/dist/engine/console.d.ts +78 -1
  38. package/dist/engine/console.d.ts.map +1 -1
  39. package/dist/engine/console.js +175 -19
  40. package/dist/engine/console.js.map +1 -1
  41. package/dist/engine/delivery.d.ts +2 -0
  42. package/dist/engine/delivery.d.ts.map +1 -1
  43. package/dist/engine/delivery.js +4 -0
  44. package/dist/engine/delivery.js.map +1 -1
  45. package/dist/engine/deliveryWire.d.ts +4 -0
  46. package/dist/engine/deliveryWire.d.ts.map +1 -1
  47. package/dist/engine/deliveryWire.js +2 -0
  48. package/dist/engine/deliveryWire.js.map +1 -1
  49. package/dist/engine/deliveryWrites.d.ts +1 -0
  50. package/dist/engine/deliveryWrites.d.ts.map +1 -1
  51. package/dist/engine/deliveryWrites.js +7 -2
  52. package/dist/engine/deliveryWrites.js.map +1 -1
  53. package/dist/engine/dm.d.ts.map +1 -1
  54. package/dist/engine/dm.js +11 -33
  55. package/dist/engine/dm.js.map +1 -1
  56. package/dist/engine/dmAll.d.ts.map +1 -1
  57. package/dist/engine/dmAll.js +2 -0
  58. package/dist/engine/dmAll.js.map +1 -1
  59. package/dist/engine/groupDm.d.ts +2 -3
  60. package/dist/engine/groupDm.d.ts.map +1 -1
  61. package/dist/engine/groupDm.js +8 -26
  62. package/dist/engine/groupDm.js.map +1 -1
  63. package/dist/engine/invocationCompletion.d.ts +1 -1
  64. package/dist/engine/invocationCompletion.d.ts.map +1 -1
  65. package/dist/engine/invocationCompletion.js +9 -2
  66. package/dist/engine/invocationCompletion.js.map +1 -1
  67. package/dist/engine/message.d.ts.map +1 -1
  68. package/dist/engine/message.js +15 -44
  69. package/dist/engine/message.js.map +1 -1
  70. package/dist/engine/node.d.ts +13 -1
  71. package/dist/engine/node.d.ts.map +1 -1
  72. package/dist/engine/node.js +100 -31
  73. package/dist/engine/node.js.map +1 -1
  74. package/dist/engine/nodeContext.d.ts +6 -1
  75. package/dist/engine/nodeContext.d.ts.map +1 -1
  76. package/dist/engine/nodeContext.js +47 -32
  77. package/dist/engine/nodeContext.js.map +1 -1
  78. package/dist/engine/nodeDeliver.d.ts +23 -0
  79. package/dist/engine/nodeDeliver.d.ts.map +1 -0
  80. package/dist/engine/nodeDeliver.js +81 -0
  81. package/dist/engine/nodeDeliver.js.map +1 -0
  82. package/dist/engine/observerToken.d.ts +110 -0
  83. package/dist/engine/observerToken.d.ts.map +1 -0
  84. package/dist/engine/observerToken.js +528 -0
  85. package/dist/engine/observerToken.js.map +1 -0
  86. package/dist/engine/search.d.ts +4 -0
  87. package/dist/engine/search.d.ts.map +1 -1
  88. package/dist/engine/search.js +6 -1
  89. package/dist/engine/search.js.map +1 -1
  90. package/dist/engine/thread.d.ts +4 -3
  91. package/dist/engine/thread.d.ts.map +1 -1
  92. package/dist/engine/thread.js +8 -0
  93. package/dist/engine/thread.js.map +1 -1
  94. package/dist/engine/wsAuth.d.ts +2 -6
  95. package/dist/engine/wsAuth.d.ts.map +1 -1
  96. package/dist/engine/wsAuth.js +20 -12
  97. package/dist/engine/wsAuth.js.map +1 -1
  98. package/dist/engine/wsTransform.d.ts.map +1 -1
  99. package/dist/engine/wsTransform.js +52 -36
  100. package/dist/engine/wsTransform.js.map +1 -1
  101. package/dist/engine.d.ts.map +1 -1
  102. package/dist/engine.js +4 -26
  103. package/dist/engine.js.map +1 -1
  104. package/dist/entrypoints/node.d.ts.map +1 -1
  105. package/dist/entrypoints/node.js +1 -14
  106. package/dist/entrypoints/node.js.map +1 -1
  107. package/dist/env.d.ts +3 -1
  108. package/dist/env.d.ts.map +1 -1
  109. package/dist/index.d.ts +3 -1
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +2 -0
  112. package/dist/index.js.map +1 -1
  113. package/dist/middleware/auth.d.ts +8 -0
  114. package/dist/middleware/auth.d.ts.map +1 -1
  115. package/dist/middleware/auth.js +62 -0
  116. package/dist/middleware/auth.js.map +1 -1
  117. package/dist/middleware/logger.d.ts.map +1 -1
  118. package/dist/middleware/logger.js +4 -4
  119. package/dist/middleware/logger.js.map +1 -1
  120. package/dist/middleware/planLimits.d.ts.map +1 -1
  121. package/dist/middleware/planLimits.js +9 -2
  122. package/dist/middleware/planLimits.js.map +1 -1
  123. package/dist/middleware/rateLimit.d.ts.map +1 -1
  124. package/dist/middleware/rateLimit.js +13 -1
  125. package/dist/middleware/rateLimit.js.map +1 -1
  126. package/dist/middleware/usageTracker.d.ts.map +1 -1
  127. package/dist/middleware/usageTracker.js +2 -1
  128. package/dist/middleware/usageTracker.js.map +1 -1
  129. package/dist/node-reconnect.d.ts +13 -0
  130. package/dist/node-reconnect.d.ts.map +1 -0
  131. package/dist/node-reconnect.js +15 -0
  132. package/dist/node-reconnect.js.map +1 -0
  133. package/dist/ports/auth.d.ts +6 -2
  134. package/dist/ports/auth.d.ts.map +1 -1
  135. package/dist/ports/entitlements.d.ts +3 -1
  136. package/dist/ports/entitlements.d.ts.map +1 -1
  137. package/dist/ports/index.d.ts +1 -1
  138. package/dist/ports/index.d.ts.map +1 -1
  139. package/dist/ports/presence.d.ts +1 -3
  140. package/dist/ports/presence.d.ts.map +1 -1
  141. package/dist/ports/realtime.d.ts +16 -68
  142. package/dist/ports/realtime.d.ts.map +1 -1
  143. package/dist/ports/realtime.js +9 -9
  144. package/dist/providers/static-entitlements.js +4 -4
  145. package/dist/providers/static-entitlements.js.map +1 -1
  146. package/dist/routes/action.d.ts.map +1 -1
  147. package/dist/routes/action.js +13 -5
  148. package/dist/routes/action.js.map +1 -1
  149. package/dist/routes/agent.d.ts.map +1 -1
  150. package/dist/routes/agent.js +107 -51
  151. package/dist/routes/agent.js.map +1 -1
  152. package/dist/routes/channel.d.ts.map +1 -1
  153. package/dist/routes/channel.js +39 -46
  154. package/dist/routes/channel.js.map +1 -1
  155. package/dist/routes/console.d.ts.map +1 -1
  156. package/dist/routes/console.js +39 -9
  157. package/dist/routes/console.js.map +1 -1
  158. package/dist/routes/deliveryRouting.d.ts.map +1 -1
  159. package/dist/routes/deliveryRouting.js +39 -20
  160. package/dist/routes/deliveryRouting.js.map +1 -1
  161. package/dist/routes/fanout.d.ts +1 -4
  162. package/dist/routes/fanout.d.ts.map +1 -1
  163. package/dist/routes/fanout.js +44 -55
  164. package/dist/routes/fanout.js.map +1 -1
  165. package/dist/routes/file.d.ts.map +1 -1
  166. package/dist/routes/file.js +15 -5
  167. package/dist/routes/file.js.map +1 -1
  168. package/dist/routes/inboundWebhook.js +1 -1
  169. package/dist/routes/inboundWebhook.js.map +1 -1
  170. package/dist/routes/message.d.ts.map +1 -1
  171. package/dist/routes/message.js +22 -4
  172. package/dist/routes/message.js.map +1 -1
  173. package/dist/routes/node.d.ts.map +1 -1
  174. package/dist/routes/node.js +61 -10
  175. package/dist/routes/node.js.map +1 -1
  176. package/dist/routes/observerToken.d.ts +4 -0
  177. package/dist/routes/observerToken.d.ts.map +1 -0
  178. package/dist/routes/observerToken.js +105 -0
  179. package/dist/routes/observerToken.js.map +1 -0
  180. package/dist/routes/presence.d.ts.map +1 -1
  181. package/dist/routes/presence.js +8 -12
  182. package/dist/routes/presence.js.map +1 -1
  183. package/dist/routes/reaction.d.ts.map +1 -1
  184. package/dist/routes/reaction.js +59 -7
  185. package/dist/routes/reaction.js.map +1 -1
  186. package/dist/routes/receipt.d.ts.map +1 -1
  187. package/dist/routes/receipt.js +20 -3
  188. package/dist/routes/receipt.js.map +1 -1
  189. package/dist/routes/search.d.ts.map +1 -1
  190. package/dist/routes/search.js +7 -4
  191. package/dist/routes/search.js.map +1 -1
  192. package/dist/routes/thread.d.ts.map +1 -1
  193. package/dist/routes/thread.js +20 -3
  194. package/dist/routes/thread.js.map +1 -1
  195. package/dist/routes/workspace.d.ts.map +1 -1
  196. package/dist/routes/workspace.js +20 -7
  197. package/dist/routes/workspace.js.map +1 -1
  198. package/package.json +7 -3
  199. package/dist/engine/resyncQuery.d.ts +0 -15
  200. package/dist/engine/resyncQuery.d.ts.map +0 -1
  201. package/dist/engine/resyncQuery.js +0 -125
  202. package/dist/engine/resyncQuery.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"resyncQuery.d.ts","sourceRoot":"","sources":["../../src/engine/resyncQuery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAG5C,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AAEnC;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CA4HpC"}
@@ -1,125 +0,0 @@
1
- import { sql } from 'drizzle-orm';
2
- import { transformForClient } from './wsTransform.js';
3
- /**
4
- * Replay events an agent missed while disconnected, for resync gaps larger than
5
- * the in-memory ring buffer. Queries channel messages, DMs/group DMs, and
6
- * reactions in the agent's scope created after `since`, and returns
7
- * client-shaped event payloads in chronological order (each tagged
8
- * `replayed: true`).
9
- *
10
- * Shared by every {@link ConnectionRegistry} adapter so the gap-fill is
11
- * byte-identical across the Node (SQLite) and Cloudflare (D1) runtimes.
12
- */
13
- export async function replayMissedEvents(db, agentId, workspaceId, since) {
14
- const sinceMs = new Date(since).getTime();
15
- if (!Number.isFinite(sinceMs)) {
16
- // Invalid `since` — return nothing rather than running queries with NaN.
17
- return [];
18
- }
19
- const sinceUnix = Math.floor(sinceMs / 1000);
20
- const events = [];
21
- const buildEvent = (type, data, channelId) => {
22
- const event = {
23
- type,
24
- workspace_id: workspaceId,
25
- channel_id: channelId,
26
- data,
27
- timestamp: new Date().toISOString(),
28
- };
29
- return transformForClient(event);
30
- };
31
- // Channel messages (including thread replies) after `since`.
32
- const channelRows = await db.all(sql `
33
- SELECT m.id, m.channel_id, m.agent_id, m.body, m.thread_id,
34
- m.created_at, c.name AS channel_name, a.name AS agent_name
35
- FROM messages m
36
- JOIN channel_members cm ON cm.channel_id = m.channel_id AND cm.agent_id = ${agentId}
37
- JOIN channels c ON c.id = m.channel_id
38
- LEFT JOIN agents a ON a.id = m.agent_id
39
- WHERE m.workspace_id = ${workspaceId}
40
- AND m.created_at > ${sinceUnix}
41
- ORDER BY m.created_at ASC
42
- LIMIT 1000
43
- `);
44
- for (const row of channelRows) {
45
- const data = {
46
- id: row.id,
47
- channel_id: row.channel_id,
48
- channel_name: row.channel_name,
49
- agent_id: row.agent_id,
50
- from_name: row.agent_name,
51
- text: row.body,
52
- thread_id: row.thread_id,
53
- created_at: new Date(row.created_at * 1000).toISOString(),
54
- };
55
- const type = row.thread_id ? 'thread.reply' : 'message.created';
56
- events.push({
57
- ts: row.created_at * 1000,
58
- payload: { ...buildEvent(type, data, row.channel_id), replayed: true },
59
- });
60
- }
61
- // DM + group DM messages after `since`.
62
- const dmRows = await db.all(sql `
63
- SELECT m.id, m.channel_id, m.agent_id, m.body, m.created_at,
64
- a.name AS agent_name, dc.id AS conversation_id, dc.dm_type
65
- FROM dm_conversations dc
66
- JOIN dm_participants dp ON dp.conversation_id = dc.id AND dp.agent_id = ${agentId} AND dp.left_at IS NULL
67
- JOIN messages m ON m.channel_id = dc.channel_id
68
- LEFT JOIN agents a ON a.id = m.agent_id
69
- WHERE dc.workspace_id = ${workspaceId}
70
- AND m.created_at > ${sinceUnix}
71
- ORDER BY m.created_at ASC
72
- LIMIT 1000
73
- `);
74
- for (const row of dmRows) {
75
- const type = row.dm_type === 'group' ? 'group_dm.received' : 'dm.received';
76
- const data = {
77
- id: row.id,
78
- conversation_id: row.conversation_id,
79
- agent_id: row.agent_id,
80
- from_agent_id: row.agent_id,
81
- from_name: row.agent_name,
82
- text: row.body,
83
- created_at: new Date(row.created_at * 1000).toISOString(),
84
- };
85
- events.push({
86
- ts: row.created_at * 1000,
87
- payload: { ...buildEvent(type, data, row.channel_id), replayed: true },
88
- });
89
- }
90
- // Reaction additions after `since`.
91
- const reactionRows = await db.all(sql `
92
- SELECT r.message_id, r.emoji, r.created_at,
93
- a.name AS agent_name,
94
- m.channel_id, c.name AS channel_name, c.channel_type,
95
- dc.dm_type, dc.id AS conversation_id
96
- FROM reactions r
97
- JOIN messages m ON m.id = r.message_id
98
- JOIN channels c ON c.id = m.channel_id
99
- LEFT JOIN dm_conversations dc ON dc.channel_id = m.channel_id
100
- LEFT JOIN dm_participants dp ON dp.conversation_id = dc.id AND dp.agent_id = ${agentId} AND dp.left_at IS NULL
101
- LEFT JOIN channel_members cm ON cm.channel_id = m.channel_id AND cm.agent_id = ${agentId}
102
- LEFT JOIN agents a ON a.id = r.agent_id
103
- WHERE m.workspace_id = ${workspaceId}
104
- AND r.created_at > ${sinceUnix}
105
- AND (cm.agent_id IS NOT NULL OR dp.agent_id IS NOT NULL)
106
- ORDER BY r.created_at ASC
107
- LIMIT 1000
108
- `);
109
- for (const row of reactionRows) {
110
- const data = {
111
- message_id: row.message_id,
112
- emoji: row.emoji,
113
- agent_name: row.agent_name,
114
- channel_name: row.channel_name,
115
- action: 'added',
116
- };
117
- events.push({
118
- ts: row.created_at * 1000,
119
- payload: { ...buildEvent('message.reacted', data, row.channel_id), replayed: true },
120
- });
121
- }
122
- events.sort((a, b) => a.ts - b.ts);
123
- return events.map((e) => e.payload);
124
- }
125
- //# sourceMappingURL=resyncQuery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resyncQuery.js","sourceRoot":"","sources":["../../src/engine/resyncQuery.ts"],"names":[],"mappings":"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"}