@relaycast/engine 5.0.0 → 5.0.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 (177) hide show
  1. package/dist/adapters/node/realtime.d.ts +9 -1
  2. package/dist/adapters/node/realtime.d.ts.map +1 -1
  3. package/dist/adapters/node/realtime.js +64 -7
  4. package/dist/adapters/node/realtime.js.map +1 -1
  5. package/dist/auth/index.d.ts.map +1 -1
  6. package/dist/auth/index.js +31 -9
  7. package/dist/auth/index.js.map +1 -1
  8. package/dist/auth/tokenKind.d.ts +40 -0
  9. package/dist/auth/tokenKind.d.ts.map +1 -0
  10. package/dist/auth/tokenKind.js +89 -0
  11. package/dist/auth/tokenKind.js.map +1 -0
  12. package/dist/db/migrations/0025_node_kind_role_adapter.sql +45 -0
  13. package/dist/db/migrations/0026_observer_tokens.sql +32 -0
  14. package/dist/db/schema.d.ts +329 -0
  15. package/dist/db/schema.d.ts.map +1 -1
  16. package/dist/db/schema.js +32 -3
  17. package/dist/db/schema.js.map +1 -1
  18. package/dist/engine/action.d.ts +2 -2
  19. package/dist/engine/action.d.ts.map +1 -1
  20. package/dist/engine/action.js +182 -7
  21. package/dist/engine/action.js.map +1 -1
  22. package/dist/engine/activity.d.ts +6 -0
  23. package/dist/engine/activity.d.ts.map +1 -1
  24. package/dist/engine/activity.js +9 -2
  25. package/dist/engine/activity.js.map +1 -1
  26. package/dist/engine/agent.d.ts +0 -33
  27. package/dist/engine/agent.d.ts.map +1 -1
  28. package/dist/engine/agent.js +0 -155
  29. package/dist/engine/agent.js.map +1 -1
  30. package/dist/engine/attachments.d.ts +6 -0
  31. package/dist/engine/attachments.d.ts.map +1 -1
  32. package/dist/engine/attachments.js +37 -0
  33. package/dist/engine/attachments.js.map +1 -1
  34. package/dist/engine/console.d.ts +78 -1
  35. package/dist/engine/console.d.ts.map +1 -1
  36. package/dist/engine/console.js +175 -19
  37. package/dist/engine/console.js.map +1 -1
  38. package/dist/engine/delivery.d.ts +2 -0
  39. package/dist/engine/delivery.d.ts.map +1 -1
  40. package/dist/engine/delivery.js +4 -0
  41. package/dist/engine/delivery.js.map +1 -1
  42. package/dist/engine/deliveryWire.d.ts +4 -0
  43. package/dist/engine/deliveryWire.d.ts.map +1 -1
  44. package/dist/engine/deliveryWire.js +2 -0
  45. package/dist/engine/deliveryWire.js.map +1 -1
  46. package/dist/engine/deliveryWrites.d.ts +1 -0
  47. package/dist/engine/deliveryWrites.d.ts.map +1 -1
  48. package/dist/engine/deliveryWrites.js +7 -2
  49. package/dist/engine/deliveryWrites.js.map +1 -1
  50. package/dist/engine/dm.d.ts.map +1 -1
  51. package/dist/engine/dm.js +11 -33
  52. package/dist/engine/dm.js.map +1 -1
  53. package/dist/engine/dmAll.d.ts.map +1 -1
  54. package/dist/engine/dmAll.js +2 -0
  55. package/dist/engine/dmAll.js.map +1 -1
  56. package/dist/engine/groupDm.d.ts +2 -3
  57. package/dist/engine/groupDm.d.ts.map +1 -1
  58. package/dist/engine/groupDm.js +8 -26
  59. package/dist/engine/groupDm.js.map +1 -1
  60. package/dist/engine/invocationCompletion.d.ts +1 -1
  61. package/dist/engine/invocationCompletion.d.ts.map +1 -1
  62. package/dist/engine/invocationCompletion.js +9 -2
  63. package/dist/engine/invocationCompletion.js.map +1 -1
  64. package/dist/engine/message.d.ts.map +1 -1
  65. package/dist/engine/message.js +15 -44
  66. package/dist/engine/message.js.map +1 -1
  67. package/dist/engine/node.d.ts +13 -1
  68. package/dist/engine/node.d.ts.map +1 -1
  69. package/dist/engine/node.js +100 -31
  70. package/dist/engine/node.js.map +1 -1
  71. package/dist/engine/nodeContext.d.ts.map +1 -1
  72. package/dist/engine/nodeContext.js +8 -32
  73. package/dist/engine/nodeContext.js.map +1 -1
  74. package/dist/engine/nodeDeliver.d.ts +23 -0
  75. package/dist/engine/nodeDeliver.d.ts.map +1 -0
  76. package/dist/engine/nodeDeliver.js +81 -0
  77. package/dist/engine/nodeDeliver.js.map +1 -0
  78. package/dist/engine/observerToken.d.ts +110 -0
  79. package/dist/engine/observerToken.d.ts.map +1 -0
  80. package/dist/engine/observerToken.js +528 -0
  81. package/dist/engine/observerToken.js.map +1 -0
  82. package/dist/engine/search.d.ts +4 -0
  83. package/dist/engine/search.d.ts.map +1 -1
  84. package/dist/engine/search.js +6 -1
  85. package/dist/engine/search.js.map +1 -1
  86. package/dist/engine/thread.d.ts +4 -3
  87. package/dist/engine/thread.d.ts.map +1 -1
  88. package/dist/engine/thread.js +8 -0
  89. package/dist/engine/thread.js.map +1 -1
  90. package/dist/engine/wsAuth.d.ts +2 -6
  91. package/dist/engine/wsAuth.d.ts.map +1 -1
  92. package/dist/engine/wsAuth.js +20 -12
  93. package/dist/engine/wsAuth.js.map +1 -1
  94. package/dist/engine/wsTransform.d.ts.map +1 -1
  95. package/dist/engine/wsTransform.js +52 -36
  96. package/dist/engine/wsTransform.js.map +1 -1
  97. package/dist/engine.d.ts.map +1 -1
  98. package/dist/engine.js +4 -25
  99. package/dist/engine.js.map +1 -1
  100. package/dist/entrypoints/node.d.ts.map +1 -1
  101. package/dist/entrypoints/node.js +1 -14
  102. package/dist/entrypoints/node.js.map +1 -1
  103. package/dist/env.d.ts +3 -1
  104. package/dist/env.d.ts.map +1 -1
  105. package/dist/middleware/auth.d.ts +8 -0
  106. package/dist/middleware/auth.d.ts.map +1 -1
  107. package/dist/middleware/auth.js +62 -0
  108. package/dist/middleware/auth.js.map +1 -1
  109. package/dist/middleware/logger.d.ts.map +1 -1
  110. package/dist/middleware/logger.js +4 -4
  111. package/dist/middleware/logger.js.map +1 -1
  112. package/dist/middleware/planLimits.d.ts.map +1 -1
  113. package/dist/middleware/planLimits.js +9 -2
  114. package/dist/middleware/planLimits.js.map +1 -1
  115. package/dist/middleware/rateLimit.d.ts.map +1 -1
  116. package/dist/middleware/rateLimit.js +13 -1
  117. package/dist/middleware/rateLimit.js.map +1 -1
  118. package/dist/middleware/usageTracker.d.ts.map +1 -1
  119. package/dist/middleware/usageTracker.js +2 -1
  120. package/dist/middleware/usageTracker.js.map +1 -1
  121. package/dist/ports/auth.d.ts +6 -2
  122. package/dist/ports/auth.d.ts.map +1 -1
  123. package/dist/ports/entitlements.d.ts +3 -1
  124. package/dist/ports/entitlements.d.ts.map +1 -1
  125. package/dist/ports/realtime.d.ts +4 -1
  126. package/dist/ports/realtime.d.ts.map +1 -1
  127. package/dist/providers/static-entitlements.js +4 -4
  128. package/dist/providers/static-entitlements.js.map +1 -1
  129. package/dist/routes/action.d.ts.map +1 -1
  130. package/dist/routes/action.js +13 -5
  131. package/dist/routes/action.js.map +1 -1
  132. package/dist/routes/agent.d.ts.map +1 -1
  133. package/dist/routes/agent.js +107 -51
  134. package/dist/routes/agent.js.map +1 -1
  135. package/dist/routes/channel.d.ts.map +1 -1
  136. package/dist/routes/channel.js +38 -12
  137. package/dist/routes/channel.js.map +1 -1
  138. package/dist/routes/console.d.ts.map +1 -1
  139. package/dist/routes/console.js +39 -9
  140. package/dist/routes/console.js.map +1 -1
  141. package/dist/routes/deliveryRouting.js +28 -19
  142. package/dist/routes/deliveryRouting.js.map +1 -1
  143. package/dist/routes/fanout.d.ts.map +1 -1
  144. package/dist/routes/fanout.js +26 -18
  145. package/dist/routes/fanout.js.map +1 -1
  146. package/dist/routes/file.d.ts.map +1 -1
  147. package/dist/routes/file.js +15 -5
  148. package/dist/routes/file.js.map +1 -1
  149. package/dist/routes/message.d.ts.map +1 -1
  150. package/dist/routes/message.js +22 -4
  151. package/dist/routes/message.js.map +1 -1
  152. package/dist/routes/node.d.ts.map +1 -1
  153. package/dist/routes/node.js +61 -10
  154. package/dist/routes/node.js.map +1 -1
  155. package/dist/routes/observerToken.d.ts +4 -0
  156. package/dist/routes/observerToken.d.ts.map +1 -0
  157. package/dist/routes/observerToken.js +105 -0
  158. package/dist/routes/observerToken.js.map +1 -0
  159. package/dist/routes/presence.d.ts.map +1 -1
  160. package/dist/routes/presence.js +6 -3
  161. package/dist/routes/presence.js.map +1 -1
  162. package/dist/routes/reaction.d.ts.map +1 -1
  163. package/dist/routes/reaction.js +59 -7
  164. package/dist/routes/reaction.js.map +1 -1
  165. package/dist/routes/receipt.d.ts.map +1 -1
  166. package/dist/routes/receipt.js +20 -3
  167. package/dist/routes/receipt.js.map +1 -1
  168. package/dist/routes/search.d.ts.map +1 -1
  169. package/dist/routes/search.js +7 -4
  170. package/dist/routes/search.js.map +1 -1
  171. package/dist/routes/thread.d.ts.map +1 -1
  172. package/dist/routes/thread.js +20 -3
  173. package/dist/routes/thread.js.map +1 -1
  174. package/dist/routes/workspace.d.ts.map +1 -1
  175. package/dist/routes/workspace.js +20 -7
  176. package/dist/routes/workspace.js.map +1 -1
  177. package/package.json +3 -3
@@ -0,0 +1,528 @@
1
+ import { and, eq, or, gt, isNull, inArray, ne } from 'drizzle-orm';
2
+ import { OBSERVER_SCOPES } from '@relaycast/types';
3
+ import { channels, dmConversations, files as fileRows, messageAttachments, messages, observerTokens } from '../db/schema.js';
4
+ import { randomHex, sha256Hex } from '../lib/crypto.js';
5
+ import { codedError } from '../lib/httpError.js';
6
+ import { generateId } from './snowflake.js';
7
+ const LAST_USED_DEBOUNCE_MS = 30_000;
8
+ export { OBSERVER_SCOPES };
9
+ export const OBSERVER_SCOPE_SET = new Set(OBSERVER_SCOPES);
10
+ function parseExpiresAt(value) {
11
+ if (value == null)
12
+ return null;
13
+ const date = new Date(value);
14
+ if (Number.isNaN(date.getTime())) {
15
+ throw codedError('expires_at must be an ISO-8601 timestamp', 'invalid_request', 400);
16
+ }
17
+ if (date.getTime() <= Date.now()) {
18
+ throw codedError('expires_at must be in the future', 'invalid_request', 400);
19
+ }
20
+ return date;
21
+ }
22
+ export function normalizeObserverFilters(filters) {
23
+ return {
24
+ ...(filters?.channel_ids?.length ? { channel_ids: [...new Set(filters.channel_ids)] } : {}),
25
+ ...(filters?.channel_names?.length ? { channel_names: [...new Set(filters.channel_names)] } : {}),
26
+ include_dms: filters?.include_dms === true,
27
+ ...(filters?.dm_conversation_ids?.length ? { dm_conversation_ids: [...new Set(filters.dm_conversation_ids)] } : {}),
28
+ ...(filters?.agent_ids?.length ? { agent_ids: [...new Set(filters.agent_ids)] } : {}),
29
+ ...(filters?.event_types?.length ? { event_types: [...new Set(filters.event_types)] } : {}),
30
+ ...(filters?.created_after ? { created_after: filters.created_after } : {}),
31
+ };
32
+ }
33
+ function normalizeScopes(scopes) {
34
+ const unique = [...new Set(scopes)];
35
+ const invalid = unique.filter((scope) => !OBSERVER_SCOPE_SET.has(scope));
36
+ if (invalid.length > 0) {
37
+ throw codedError(`Invalid observer scopes: ${invalid.join(', ')}`, 'invalid_request', 400);
38
+ }
39
+ if (unique.length === 0) {
40
+ throw codedError('At least one observer scope is required', 'invalid_request', 400);
41
+ }
42
+ return unique;
43
+ }
44
+ function publicScopes(scopes) {
45
+ const unique = [...new Set(scopes ?? [])];
46
+ return unique.filter((scope) => OBSERVER_SCOPE_SET.has(scope));
47
+ }
48
+ function publicObserverToken(row, token) {
49
+ return {
50
+ id: row.id,
51
+ name: row.name,
52
+ description: row.description,
53
+ scopes: publicScopes(row.scopes),
54
+ filters: normalizeObserverFilters(row.filters),
55
+ status: row.status,
56
+ expires_at: row.expiresAt?.toISOString() ?? null,
57
+ created_at: row.createdAt.toISOString(),
58
+ updated_at: row.updatedAt?.toISOString() ?? null,
59
+ revoked_at: row.revokedAt?.toISOString() ?? null,
60
+ last_used_at: row.lastUsedAt?.toISOString() ?? null,
61
+ ...(token ? { token } : {}),
62
+ };
63
+ }
64
+ function isObserverTokenNameConflict(err) {
65
+ const candidate = err;
66
+ const message = candidate.message ?? '';
67
+ return (candidate.code === 'SQLITE_CONSTRAINT'
68
+ || candidate.code === 'SQLITE_CONSTRAINT_UNIQUE'
69
+ || message.includes('observer_tokens_workspace_name_unique')
70
+ || message.includes('observer_tokens.workspace_id, observer_tokens.name'));
71
+ }
72
+ function observerTokenNameConflict() {
73
+ throw codedError('Observer token name already exists in this workspace', 'observer_token_name_conflict', 409);
74
+ }
75
+ export async function createObserverToken(db, workspaceId, input) {
76
+ const token = `ot_live_${randomHex(24)}`;
77
+ const tokenHash = await sha256Hex(token);
78
+ const expiresAt = parseExpiresAt(input.expires_at);
79
+ const scopes = normalizeScopes(input.scopes);
80
+ const filters = normalizeObserverFilters(input.filters);
81
+ let created;
82
+ try {
83
+ [created] = await db
84
+ .insert(observerTokens)
85
+ .values({
86
+ id: `ot_${generateId()}`,
87
+ workspaceId,
88
+ name: input.name,
89
+ description: input.description ?? null,
90
+ tokenHash,
91
+ scopes,
92
+ filters,
93
+ expiresAt,
94
+ createdBy: workspaceId,
95
+ createdByType: 'workspace',
96
+ })
97
+ .returning();
98
+ }
99
+ catch (err) {
100
+ if (isObserverTokenNameConflict(err))
101
+ observerTokenNameConflict();
102
+ throw err;
103
+ }
104
+ if (!created) {
105
+ throw codedError('Failed to create observer token', 'internal_error', 500);
106
+ }
107
+ return publicObserverToken(created, token);
108
+ }
109
+ export async function listObserverTokens(db, workspaceId) {
110
+ const rows = await db
111
+ .select()
112
+ .from(observerTokens)
113
+ .where(eq(observerTokens.workspaceId, workspaceId));
114
+ return rows.map((row) => publicObserverToken(row));
115
+ }
116
+ export async function getObserverToken(db, workspaceId, id) {
117
+ const [row] = await db
118
+ .select()
119
+ .from(observerTokens)
120
+ .where(and(eq(observerTokens.workspaceId, workspaceId), eq(observerTokens.id, id)));
121
+ return row ? publicObserverToken(row) : null;
122
+ }
123
+ export async function updateObserverToken(db, workspaceId, id, input) {
124
+ const update = {
125
+ updatedAt: new Date(),
126
+ };
127
+ if (input.name !== undefined)
128
+ update.name = input.name;
129
+ if (input.description !== undefined)
130
+ update.description = input.description;
131
+ if (input.scopes !== undefined)
132
+ update.scopes = normalizeScopes(input.scopes);
133
+ if (input.filters !== undefined)
134
+ update.filters = normalizeObserverFilters(input.filters);
135
+ if (input.expires_at !== undefined)
136
+ update.expiresAt = parseExpiresAt(input.expires_at);
137
+ let row;
138
+ try {
139
+ [row] = await db
140
+ .update(observerTokens)
141
+ .set(update)
142
+ .where(and(eq(observerTokens.workspaceId, workspaceId), eq(observerTokens.id, id), eq(observerTokens.status, 'active')))
143
+ .returning();
144
+ }
145
+ catch (err) {
146
+ if (isObserverTokenNameConflict(err))
147
+ observerTokenNameConflict();
148
+ throw err;
149
+ }
150
+ return row ? publicObserverToken(row) : null;
151
+ }
152
+ export async function rotateObserverToken(db, workspaceId, id) {
153
+ const token = `ot_live_${randomHex(24)}`;
154
+ const tokenHash = await sha256Hex(token);
155
+ const [row] = await db
156
+ .update(observerTokens)
157
+ .set({ tokenHash, updatedAt: new Date(), lastUsedAt: null })
158
+ .where(and(eq(observerTokens.workspaceId, workspaceId), eq(observerTokens.id, id), eq(observerTokens.status, 'active')))
159
+ .returning();
160
+ return row ? publicObserverToken(row, token) : null;
161
+ }
162
+ export async function revokeObserverToken(db, workspaceId, id) {
163
+ const now = new Date();
164
+ const [row] = await db
165
+ .update(observerTokens)
166
+ .set({ status: 'revoked', revokedAt: now, updatedAt: now })
167
+ .where(and(eq(observerTokens.workspaceId, workspaceId), eq(observerTokens.id, id), eq(observerTokens.status, 'active')))
168
+ .returning({ id: observerTokens.id });
169
+ return Boolean(row);
170
+ }
171
+ export async function getActiveObserverTokenByHash(db, tokenHash) {
172
+ const now = new Date();
173
+ const [row] = await db
174
+ .select()
175
+ .from(observerTokens)
176
+ .where(and(eq(observerTokens.tokenHash, tokenHash), eq(observerTokens.status, 'active'), or(isNull(observerTokens.expiresAt), gt(observerTokens.expiresAt, now))));
177
+ if (!row)
178
+ return null;
179
+ if (!row.lastUsedAt || now.getTime() - row.lastUsedAt.getTime() > LAST_USED_DEBOUNCE_MS) {
180
+ void (async () => {
181
+ try {
182
+ await db
183
+ .update(observerTokens)
184
+ .set({ lastUsedAt: now })
185
+ .where(eq(observerTokens.id, row.id));
186
+ }
187
+ catch {
188
+ // last_used_at is best-effort audit metadata; authentication should not fail
189
+ // solely because a read replica or adapter rejects this update.
190
+ }
191
+ })();
192
+ }
193
+ return row;
194
+ }
195
+ export function hasObserverScope(observer, scope) {
196
+ return publicScopes(observer.scopes).includes(scope);
197
+ }
198
+ export function hasAnyObserverScope(observer, scopes) {
199
+ return scopes.some((scope) => hasObserverScope(observer, scope));
200
+ }
201
+ function filterList(values) {
202
+ return values && values.length > 0 ? new Set(values) : null;
203
+ }
204
+ function hasChannelOrDmFilter(filters) {
205
+ return Boolean(filters.channel_ids?.length
206
+ || filters.channel_names?.length
207
+ || filters.dm_conversation_ids?.length
208
+ || filters.include_dms);
209
+ }
210
+ export function observerAllowsChannel(observer, channel) {
211
+ if (!observer)
212
+ return true;
213
+ if (channel.channel_type != null && channel.channel_type !== 0)
214
+ return false;
215
+ const filters = normalizeObserverFilters(observer.filters);
216
+ const ids = filterList(filters.channel_ids);
217
+ const names = filterList(filters.channel_names);
218
+ if (!ids && !names)
219
+ return true;
220
+ return Boolean((channel.id && ids?.has(channel.id)) || (channel.name && names?.has(channel.name)));
221
+ }
222
+ export function observerAllowsConversation(observer, conversationId) {
223
+ if (!observer)
224
+ return true;
225
+ const filters = normalizeObserverFilters(observer.filters);
226
+ if (!hasObserverScope(observer, 'dms:read'))
227
+ return false;
228
+ if (!filters.include_dms)
229
+ return false;
230
+ const ids = filterList(filters.dm_conversation_ids);
231
+ if (!ids)
232
+ return true;
233
+ return Boolean(conversationId && ids.has(conversationId));
234
+ }
235
+ export function observerAllowsAgent(observer, agentId) {
236
+ if (!observer)
237
+ return true;
238
+ const ids = filterList(normalizeObserverFilters(observer.filters).agent_ids);
239
+ if (!ids)
240
+ return true;
241
+ return Boolean(agentId && ids.has(agentId));
242
+ }
243
+ function timestampMillis(value) {
244
+ if (value == null)
245
+ return null;
246
+ if (value instanceof Date)
247
+ return value.getTime();
248
+ if (typeof value === 'number')
249
+ return Number.isFinite(value) ? value : null;
250
+ const parsed = new Date(value).getTime();
251
+ return Number.isNaN(parsed) ? null : parsed;
252
+ }
253
+ export function observerAllowsCreatedAt(observer, createdAt) {
254
+ if (!observer)
255
+ return true;
256
+ const cutoff = normalizeObserverFilters(observer.filters).created_after;
257
+ if (!cutoff)
258
+ return true;
259
+ const cutoffMs = timestampMillis(cutoff);
260
+ const createdMs = timestampMillis(createdAt);
261
+ if (cutoffMs == null || createdMs == null)
262
+ return false;
263
+ return createdMs >= cutoffMs;
264
+ }
265
+ export function observerAllowsMessage(observer, message) {
266
+ return observerAllowsAgent(observer, message.agent_id)
267
+ && observerAllowsCreatedAt(observer, message.created_at);
268
+ }
269
+ export function observerAllowsMessageResource(observer, resource, options = {}) {
270
+ if (!observer)
271
+ return true;
272
+ if (!observerAllowsMessage(observer, resource))
273
+ return false;
274
+ if (resource.channel_type !== 0) {
275
+ return observerAllowsConversation(observer, resource.conversation_id);
276
+ }
277
+ if (options.normalScope && !hasObserverScope(observer, options.normalScope))
278
+ return false;
279
+ return observerAllowsChannel(observer, {
280
+ id: resource.channel_id,
281
+ name: resource.channel_name,
282
+ channel_type: resource.channel_type,
283
+ });
284
+ }
285
+ export function observerAllowsFile(observer, file) {
286
+ if (!observer)
287
+ return true;
288
+ if (!observerAllowsAgent(observer, file.uploaded_by_id))
289
+ return false;
290
+ if (!observerAllowsCreatedAt(observer, file.created_at))
291
+ return false;
292
+ if (file.attachments.length === 0) {
293
+ return !hasChannelOrDmFilter(normalizeObserverFilters(observer.filters));
294
+ }
295
+ return file.attachments.some((attachment) => (attachment.conversation_id
296
+ ? observerAllowsConversation(observer, attachment.conversation_id)
297
+ : observerAllowsChannel(observer, {
298
+ id: attachment.channel_id,
299
+ name: attachment.channel_name,
300
+ channel_type: attachment.channel_type,
301
+ })));
302
+ }
303
+ function nestedRecord(value) {
304
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
305
+ }
306
+ function eventChannelName(event) {
307
+ const channel = event.channel;
308
+ if (typeof channel === 'string')
309
+ return channel;
310
+ const channelObject = nestedRecord(channel);
311
+ return typeof channelObject.name === 'string' ? channelObject.name : null;
312
+ }
313
+ function eventAgentId(event) {
314
+ const message = nestedRecord(event.message);
315
+ const agent = nestedRecord(event.agent);
316
+ return (typeof event.agent_id === 'string' ? event.agent_id : null)
317
+ ?? (typeof event.subject_agent_id === 'string' ? event.subject_agent_id : null)
318
+ ?? (typeof message.agent_id === 'string' ? message.agent_id : null)
319
+ ?? (typeof agent.id === 'string' ? agent.id : null);
320
+ }
321
+ function eventCreatedAt(event) {
322
+ const message = nestedRecord(event.message);
323
+ return (typeof event.created_at === 'string' ? event.created_at : null)
324
+ ?? (typeof event.timestamp === 'string' ? event.timestamp : null)
325
+ ?? (typeof message.created_at === 'string' ? message.created_at : null)
326
+ ?? null;
327
+ }
328
+ /**
329
+ * Event types that are intrinsically scoped to a single channel. These must
330
+ * carry channel metadata to be visible to a channel-filtered observer; if the
331
+ * metadata is missing they are rejected (fail closed). Workspace-wide events
332
+ * (e.g. `agent.status.*`, `delivery.*`, `node.*`) are not channel-bound, so the
333
+ * channel filter only applies to them when they actually reference a channel.
334
+ */
335
+ function isChannelScopedEventType(type) {
336
+ return (type === 'message.created'
337
+ || type === 'message.updated'
338
+ || type === 'message.read'
339
+ || type === 'message.reacted'
340
+ || type === 'thread.reply'
341
+ || type === 'webhook.received'
342
+ || type.startsWith('member.')
343
+ || type.startsWith('channel.'));
344
+ }
345
+ function eventRequiredScopes(type) {
346
+ if (type === 'message.created' || type === 'message.updated' || type === 'message.read' || type === 'webhook.received')
347
+ return ['messages:read'];
348
+ if (type === 'thread.reply')
349
+ return ['threads:read'];
350
+ if (type === 'message.reacted')
351
+ return ['reactions:read'];
352
+ if (type === 'dm.received' || type === 'group_dm.received')
353
+ return ['dms:read'];
354
+ if (type === 'file.uploaded')
355
+ return ['files:read'];
356
+ if (type.startsWith('agent.status.'))
357
+ return ['agents:read'];
358
+ if (type.startsWith('member.') || type.startsWith('channel.'))
359
+ return ['channels:read'];
360
+ if (type.startsWith('delivery.'))
361
+ return ['deliveries:read'];
362
+ if (type.startsWith('node.'))
363
+ return ['nodes:read'];
364
+ return ['activity:read'];
365
+ }
366
+ export function observerAllowsAnyEventType(observer, eventTypes) {
367
+ if (!observer)
368
+ return true;
369
+ const filters = normalizeObserverFilters(observer.filters);
370
+ if (!filters.event_types?.length)
371
+ return true;
372
+ return eventTypes.some((type) => filters.event_types?.includes(type));
373
+ }
374
+ export function observerAllowsEvent(observer, event) {
375
+ if (!observer)
376
+ return true;
377
+ const filters = normalizeObserverFilters(observer.filters);
378
+ const type = typeof event.type === 'string' ? event.type : '';
379
+ if (filters.event_types?.length && !filters.event_types.includes(type)) {
380
+ return false;
381
+ }
382
+ if (!hasAnyObserverScope(observer, eventRequiredScopes(type))) {
383
+ return false;
384
+ }
385
+ if (!observerAllowsCreatedAt(observer, eventCreatedAt(event))) {
386
+ return false;
387
+ }
388
+ const conversationId = typeof event.conversation_id === 'string' ? event.conversation_id : null;
389
+ const isDm = conversationId !== null || type === 'dm.received' || type === 'group_dm.received';
390
+ if (isDm) {
391
+ if (!observerAllowsConversation(observer, conversationId)) {
392
+ return false;
393
+ }
394
+ }
395
+ else {
396
+ const channelId = typeof event.channel_id === 'string' ? event.channel_id : null;
397
+ const channelName = eventChannelName(event);
398
+ const hasChannelContext = Boolean(channelId || channelName);
399
+ // Only apply the channel filter when the event carries channel context, or
400
+ // when its type is intrinsically channel-scoped (so missing metadata fails
401
+ // closed). Workspace-wide events with no channel context skip this check so
402
+ // agent_id matching can still apply.
403
+ if ((hasChannelContext || isChannelScopedEventType(type))
404
+ && !observerAllowsChannel(observer, { id: channelId, name: channelName })) {
405
+ return false;
406
+ }
407
+ }
408
+ return observerAllowsAgent(observer, eventAgentId(event));
409
+ }
410
+ export async function getMessageObserverResource(db, workspaceId, messageId) {
411
+ const [row] = await db
412
+ .select({
413
+ channel_id: channels.id,
414
+ channel_name: channels.name,
415
+ channel_type: channels.channelType,
416
+ conversation_id: dmConversations.id,
417
+ agent_id: messages.agentId,
418
+ created_at: messages.createdAt,
419
+ })
420
+ .from(messages)
421
+ .innerJoin(channels, eq(messages.channelId, channels.id))
422
+ .leftJoin(dmConversations, eq(dmConversations.channelId, channels.id))
423
+ .where(and(eq(messages.id, messageId), eq(messages.workspaceId, workspaceId)));
424
+ return row ? { ...row, created_at: row.created_at.toISOString() } : null;
425
+ }
426
+ export async function getChannelObserverResource(db, workspaceId, name) {
427
+ const [row] = await db
428
+ .select({ id: channels.id, name: channels.name, channel_type: channels.channelType })
429
+ .from(channels)
430
+ .where(and(eq(channels.workspaceId, workspaceId), eq(channels.name, name)));
431
+ return row ?? null;
432
+ }
433
+ export async function getFileObserverResource(db, workspaceId, fileId) {
434
+ return (await getFileObserverResources(db, workspaceId, [fileId])).get(fileId) ?? null;
435
+ }
436
+ export async function getFileObserverResources(db, workspaceId, fileIds) {
437
+ const ids = [...new Set(fileIds)].filter((id) => id.length > 0);
438
+ const resources = new Map();
439
+ if (ids.length === 0)
440
+ return resources;
441
+ const files = await db
442
+ .select({
443
+ id: fileRows.id,
444
+ uploaded_by_id: fileRows.uploadedBy,
445
+ created_at: fileRows.createdAt,
446
+ })
447
+ .from(fileRows)
448
+ .where(and(eq(fileRows.workspaceId, workspaceId), ne(fileRows.status, 'deleted'), inArray(fileRows.id, ids)));
449
+ for (const file of files) {
450
+ resources.set(file.id, {
451
+ id: file.id,
452
+ uploaded_by_id: file.uploaded_by_id,
453
+ created_at: file.created_at.toISOString(),
454
+ attachments: [],
455
+ });
456
+ }
457
+ if (resources.size === 0)
458
+ return resources;
459
+ const attachments = await db
460
+ .select({
461
+ file_id: messageAttachments.fileId,
462
+ channel_id: channels.id,
463
+ channel_name: channels.name,
464
+ channel_type: channels.channelType,
465
+ conversation_id: dmConversations.id,
466
+ })
467
+ .from(messageAttachments)
468
+ .innerJoin(messages, eq(messageAttachments.messageId, messages.id))
469
+ .innerJoin(channels, eq(messages.channelId, channels.id))
470
+ .leftJoin(dmConversations, eq(dmConversations.channelId, channels.id))
471
+ .where(and(eq(messages.workspaceId, workspaceId), inArray(messageAttachments.fileId, [...resources.keys()])));
472
+ for (const attachment of attachments) {
473
+ const resource = resources.get(attachment.file_id);
474
+ if (!resource)
475
+ continue;
476
+ resource.attachments.push({
477
+ channel_id: attachment.channel_id,
478
+ channel_name: attachment.channel_name,
479
+ channel_type: attachment.channel_type,
480
+ conversation_id: attachment.conversation_id,
481
+ });
482
+ }
483
+ return resources;
484
+ }
485
+ export async function filterObserverFileResults(db, workspaceId, observer, results) {
486
+ if (!observer || results.length === 0)
487
+ return results;
488
+ const resources = await getFileObserverResources(db, workspaceId, results.map((result) => result.id));
489
+ return results.filter((result) => {
490
+ const resource = resources.get(result.id);
491
+ return Boolean(resource && observerAllowsFile(observer, resource));
492
+ });
493
+ }
494
+ export async function filterObserverSearchResults(db, workspaceId, observer, results, opts = {}) {
495
+ if (!observer || results.length === 0)
496
+ return results;
497
+ const missingChannelIds = [...new Set(results
498
+ .filter((result) => !result.channel_name && result.channel_id)
499
+ .map((result) => result.channel_id))];
500
+ const channelsById = new Map();
501
+ if (missingChannelIds.length > 0) {
502
+ const rows = await db
503
+ .select({ id: channels.id, name: channels.name, channel_type: channels.channelType })
504
+ .from(channels)
505
+ .where(and(eq(channels.workspaceId, workspaceId), inArray(channels.id, missingChannelIds)));
506
+ for (const row of rows)
507
+ channelsById.set(row.id, { name: row.name, channel_type: row.channel_type });
508
+ }
509
+ return results.filter((result) => {
510
+ if (opts.eventTypes && !observerAllowsAnyEventType(observer, opts.eventTypes(result)))
511
+ return false;
512
+ if (!observerAllowsMessage(observer, result))
513
+ return false;
514
+ if (result.conversation_id) {
515
+ return observerAllowsConversation(observer, result.conversation_id);
516
+ }
517
+ const channel = result.channel_id ? channelsById.get(result.channel_id) : undefined;
518
+ return observerAllowsChannel(observer, {
519
+ id: result.channel_id,
520
+ name: result.channel_name ?? channel?.name,
521
+ channel_type: result.channel_type ?? channel?.channel_type,
522
+ });
523
+ });
524
+ }
525
+ export function getObserverTokenFromContext(c) {
526
+ return c.get('observerToken');
527
+ }
528
+ //# sourceMappingURL=observerToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observerToken.js","sourceRoot":"","sources":["../../src/engine/observerToken.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,11 @@ export declare function searchMessages(db: Db, workspaceId: string, opts: {
9
9
  after?: string;
10
10
  }): Promise<{
11
11
  id: string;
12
+ channel_id: string;
12
13
  channel_name: string;
14
+ channel_type: number;
15
+ conversation_id: string | null;
16
+ agent_id: string;
13
17
  agent_name: string;
14
18
  text: string;
15
19
  created_at: string;
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/engine/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAI5C,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AAEnC,wBAAsB,cAAc,CAClC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IACJ,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;;;;;;;KAmEF"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/engine/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAI5C,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AAEnC,wBAAsB,cAAc,CAClC,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IACJ,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;;;;;;;;;;;KA0EF"}
@@ -33,11 +33,12 @@ export async function searchMessages(db, workspaceId, opts) {
33
33
  // bm25() returns negative values where more negative = more relevant,
34
34
  // so ORDER BY rank ASC gives best results first.
35
35
  const rows = await db.all(sql `
36
- SELECT m.id, m.channel_id, c.name AS channel_name, m.agent_id, a.name AS agent_name, m.body, m.created_at,
36
+ SELECT m.id, m.channel_id, c.name AS channel_name, c.channel_type, dc.id AS conversation_id, m.agent_id, a.name AS agent_name, m.body, m.created_at,
37
37
  bm25(messages_fts) AS rank
38
38
  FROM messages_fts fts
39
39
  JOIN messages m ON m.id = fts.id
40
40
  JOIN channels c ON c.id = m.channel_id
41
+ LEFT JOIN dm_conversations dc ON dc.channel_id = c.id
41
42
  LEFT JOIN agents a ON a.id = m.agent_id
42
43
  WHERE messages_fts MATCH ${ftsQuery}
43
44
  AND m.workspace_id = ${workspaceId}
@@ -50,7 +51,11 @@ export async function searchMessages(db, workspaceId, opts) {
50
51
  `);
51
52
  return rows.map((row) => ({
52
53
  id: row.id,
54
+ channel_id: row.channel_id,
53
55
  channel_name: row.channel_name || 'unknown',
56
+ channel_type: row.channel_type,
57
+ conversation_id: row.conversation_id,
58
+ agent_id: row.agent_id,
54
59
  agent_name: row.agent_name || 'unknown',
55
60
  text: row.body,
56
61
  created_at: new Date(row.created_at * 1000).toISOString(),
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/engine/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/engine/search.ts"],"names":[],"mappings":"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"}
@@ -8,9 +8,6 @@ export declare function postReply(db: Db, workspaceId: string, parentId: string,
8
8
  }, options?: {
9
9
  mailbox?: MailboxConfig;
10
10
  }): Promise<{
11
- id: string;
12
- channel_id: string;
13
- channel_name: string;
14
11
  agent_id: string;
15
12
  agent_name: string;
16
13
  thread_id: string | null;
@@ -21,6 +18,10 @@ export declare function postReply(db: Db, workspaceId: string, parentId: string,
21
18
  created_at: string;
22
19
  _deliveries: import("./deliveryWrites.js").DeliveryFanoutRecord[];
23
20
  _delivery_rejections: import("./deliveryWrites.js").DeliveryRejectionRecord[];
21
+ conversation_id?: string | undefined;
22
+ id: string;
23
+ channel_id: string;
24
+ channel_name: string;
24
25
  }>;
25
26
  export declare function getThread(db: Db, workspaceId: string, parentId: string, opts?: {
26
27
  limit?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../src/engine/thread.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAY5C,OAAO,EAAqD,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG3G,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AAEnC,wBAAsB,SAAS,CAC7B,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAAE,EACxF,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,aAAa,CAAA;CAAO;;;;;;;;;;;;;;GAyG1C;AAED,wBAAsB,SAAS,CAC7B,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;;;;;;;;;;;;;;;;;;;;;;GA2F/D"}
1
+ {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../src/engine/thread.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAY5C,OAAO,EAAqD,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG3G,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AAEnC,wBAAsB,SAAS,CAC7B,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAAE,EACxF,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,aAAa,CAAA;CAAO;;;;;;;;;;;;;;;GAiH1C;AAED,wBAAsB,SAAS,CAC7B,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;;;;;;;;;;;;;;;;;;;;;;GA2F/D"}