@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.
- package/dist/adapters/node/realtime.d.ts +9 -1
- package/dist/adapters/node/realtime.d.ts.map +1 -1
- package/dist/adapters/node/realtime.js +64 -7
- package/dist/adapters/node/realtime.js.map +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +31 -9
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/tokenKind.d.ts +40 -0
- package/dist/auth/tokenKind.d.ts.map +1 -0
- package/dist/auth/tokenKind.js +89 -0
- package/dist/auth/tokenKind.js.map +1 -0
- package/dist/db/migrations/0025_node_kind_role_adapter.sql +45 -0
- package/dist/db/migrations/0026_observer_tokens.sql +32 -0
- package/dist/db/schema.d.ts +329 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +32 -3
- package/dist/db/schema.js.map +1 -1
- package/dist/engine/action.d.ts +2 -2
- package/dist/engine/action.d.ts.map +1 -1
- package/dist/engine/action.js +182 -7
- package/dist/engine/action.js.map +1 -1
- package/dist/engine/activity.d.ts +6 -0
- package/dist/engine/activity.d.ts.map +1 -1
- package/dist/engine/activity.js +9 -2
- package/dist/engine/activity.js.map +1 -1
- package/dist/engine/agent.d.ts +0 -33
- package/dist/engine/agent.d.ts.map +1 -1
- package/dist/engine/agent.js +0 -155
- package/dist/engine/agent.js.map +1 -1
- package/dist/engine/attachments.d.ts +6 -0
- package/dist/engine/attachments.d.ts.map +1 -1
- package/dist/engine/attachments.js +37 -0
- package/dist/engine/attachments.js.map +1 -1
- package/dist/engine/console.d.ts +78 -1
- package/dist/engine/console.d.ts.map +1 -1
- package/dist/engine/console.js +175 -19
- package/dist/engine/console.js.map +1 -1
- package/dist/engine/delivery.d.ts +2 -0
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +4 -0
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/deliveryWire.d.ts +4 -0
- package/dist/engine/deliveryWire.d.ts.map +1 -1
- package/dist/engine/deliveryWire.js +2 -0
- package/dist/engine/deliveryWire.js.map +1 -1
- package/dist/engine/deliveryWrites.d.ts +1 -0
- package/dist/engine/deliveryWrites.d.ts.map +1 -1
- package/dist/engine/deliveryWrites.js +7 -2
- package/dist/engine/deliveryWrites.js.map +1 -1
- package/dist/engine/dm.d.ts.map +1 -1
- package/dist/engine/dm.js +11 -33
- package/dist/engine/dm.js.map +1 -1
- package/dist/engine/dmAll.d.ts.map +1 -1
- package/dist/engine/dmAll.js +2 -0
- package/dist/engine/dmAll.js.map +1 -1
- package/dist/engine/groupDm.d.ts +2 -3
- package/dist/engine/groupDm.d.ts.map +1 -1
- package/dist/engine/groupDm.js +8 -26
- package/dist/engine/groupDm.js.map +1 -1
- package/dist/engine/invocationCompletion.d.ts +1 -1
- package/dist/engine/invocationCompletion.d.ts.map +1 -1
- package/dist/engine/invocationCompletion.js +9 -2
- package/dist/engine/invocationCompletion.js.map +1 -1
- package/dist/engine/message.d.ts.map +1 -1
- package/dist/engine/message.js +15 -44
- package/dist/engine/message.js.map +1 -1
- package/dist/engine/node.d.ts +13 -1
- package/dist/engine/node.d.ts.map +1 -1
- package/dist/engine/node.js +100 -31
- package/dist/engine/node.js.map +1 -1
- package/dist/engine/nodeContext.d.ts.map +1 -1
- package/dist/engine/nodeContext.js +8 -32
- package/dist/engine/nodeContext.js.map +1 -1
- package/dist/engine/nodeDeliver.d.ts +23 -0
- package/dist/engine/nodeDeliver.d.ts.map +1 -0
- package/dist/engine/nodeDeliver.js +81 -0
- package/dist/engine/nodeDeliver.js.map +1 -0
- package/dist/engine/observerToken.d.ts +110 -0
- package/dist/engine/observerToken.d.ts.map +1 -0
- package/dist/engine/observerToken.js +528 -0
- package/dist/engine/observerToken.js.map +1 -0
- package/dist/engine/search.d.ts +4 -0
- package/dist/engine/search.d.ts.map +1 -1
- package/dist/engine/search.js +6 -1
- package/dist/engine/search.js.map +1 -1
- package/dist/engine/thread.d.ts +4 -3
- package/dist/engine/thread.d.ts.map +1 -1
- package/dist/engine/thread.js +8 -0
- package/dist/engine/thread.js.map +1 -1
- package/dist/engine/wsAuth.d.ts +2 -6
- package/dist/engine/wsAuth.d.ts.map +1 -1
- package/dist/engine/wsAuth.js +20 -12
- package/dist/engine/wsAuth.js.map +1 -1
- package/dist/engine/wsTransform.d.ts.map +1 -1
- package/dist/engine/wsTransform.js +52 -36
- package/dist/engine/wsTransform.js.map +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +4 -25
- package/dist/engine.js.map +1 -1
- package/dist/entrypoints/node.d.ts.map +1 -1
- package/dist/entrypoints/node.js +1 -14
- package/dist/entrypoints/node.js.map +1 -1
- package/dist/env.d.ts +3 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/middleware/auth.d.ts +8 -0
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +62 -0
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/logger.d.ts.map +1 -1
- package/dist/middleware/logger.js +4 -4
- package/dist/middleware/logger.js.map +1 -1
- package/dist/middleware/planLimits.d.ts.map +1 -1
- package/dist/middleware/planLimits.js +9 -2
- package/dist/middleware/planLimits.js.map +1 -1
- package/dist/middleware/rateLimit.d.ts.map +1 -1
- package/dist/middleware/rateLimit.js +13 -1
- package/dist/middleware/rateLimit.js.map +1 -1
- package/dist/middleware/usageTracker.d.ts.map +1 -1
- package/dist/middleware/usageTracker.js +2 -1
- package/dist/middleware/usageTracker.js.map +1 -1
- package/dist/ports/auth.d.ts +6 -2
- package/dist/ports/auth.d.ts.map +1 -1
- package/dist/ports/entitlements.d.ts +3 -1
- package/dist/ports/entitlements.d.ts.map +1 -1
- package/dist/ports/realtime.d.ts +4 -1
- package/dist/ports/realtime.d.ts.map +1 -1
- package/dist/providers/static-entitlements.js +4 -4
- package/dist/providers/static-entitlements.js.map +1 -1
- package/dist/routes/action.d.ts.map +1 -1
- package/dist/routes/action.js +13 -5
- package/dist/routes/action.js.map +1 -1
- package/dist/routes/agent.d.ts.map +1 -1
- package/dist/routes/agent.js +107 -51
- package/dist/routes/agent.js.map +1 -1
- package/dist/routes/channel.d.ts.map +1 -1
- package/dist/routes/channel.js +38 -12
- package/dist/routes/channel.js.map +1 -1
- package/dist/routes/console.d.ts.map +1 -1
- package/dist/routes/console.js +39 -9
- package/dist/routes/console.js.map +1 -1
- package/dist/routes/deliveryRouting.js +28 -19
- package/dist/routes/deliveryRouting.js.map +1 -1
- package/dist/routes/fanout.d.ts.map +1 -1
- package/dist/routes/fanout.js +26 -18
- package/dist/routes/fanout.js.map +1 -1
- package/dist/routes/file.d.ts.map +1 -1
- package/dist/routes/file.js +15 -5
- package/dist/routes/file.js.map +1 -1
- package/dist/routes/message.d.ts.map +1 -1
- package/dist/routes/message.js +22 -4
- package/dist/routes/message.js.map +1 -1
- package/dist/routes/node.d.ts.map +1 -1
- package/dist/routes/node.js +61 -10
- package/dist/routes/node.js.map +1 -1
- package/dist/routes/observerToken.d.ts +4 -0
- package/dist/routes/observerToken.d.ts.map +1 -0
- package/dist/routes/observerToken.js +105 -0
- package/dist/routes/observerToken.js.map +1 -0
- package/dist/routes/presence.d.ts.map +1 -1
- package/dist/routes/presence.js +6 -3
- package/dist/routes/presence.js.map +1 -1
- package/dist/routes/reaction.d.ts.map +1 -1
- package/dist/routes/reaction.js +59 -7
- package/dist/routes/reaction.js.map +1 -1
- package/dist/routes/receipt.d.ts.map +1 -1
- package/dist/routes/receipt.js +20 -3
- package/dist/routes/receipt.js.map +1 -1
- package/dist/routes/search.d.ts.map +1 -1
- package/dist/routes/search.js +7 -4
- package/dist/routes/search.js.map +1 -1
- package/dist/routes/thread.d.ts.map +1 -1
- package/dist/routes/thread.js +20 -3
- package/dist/routes/thread.js.map +1 -1
- package/dist/routes/workspace.d.ts.map +1 -1
- package/dist/routes/workspace.js +20 -7
- package/dist/routes/workspace.js.map +1 -1
- 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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"}
|
package/dist/engine/search.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/engine/search.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAM,EACN,WAAmB,EACnB,IAOC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE3D,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEzB,kCAAkC;IAClC,IAAI,SAA6B,CAAC;IAClC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE;aAClB,MAAM,EAAE;aACR,IAAI,CAAC,QAAQ,CAAC;aACd,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtF,6EAA6E;QAC7E,qDAAqD;QACrD,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACnB,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC;IACpB,CAAC;IAED,IAAI,OAA2B,CAAC;IAChC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE;aACrB,MAAM,EAAE;aACR,IAAI,CAAC,MAAM,CAAC;aACZ,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;IACrB,CAAC;IAED,+CAA+C;IAC/C,sEAAsE;IACtE,iDAAiD;IACjD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/engine/search.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/thread.d.ts
CHANGED
|
@@ -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
|
|
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"}
|