@vibes.diy/api-svc 9.2.0 → 9.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/evento-handler-manifest.js +3 -0
  2. package/evento-handler-manifest.js.map +1 -1
  3. package/intern/backend-db-callback.js +25 -0
  4. package/intern/backend-db-callback.js.map +1 -1
  5. package/intern/delete-access-gate.js +7 -7
  6. package/intern/delete-access-gate.js.map +1 -1
  7. package/intern/ensure-app-metadata.js +8 -0
  8. package/intern/ensure-app-metadata.js.map +1 -1
  9. package/intern/ensure-chat-id.js +14 -3
  10. package/intern/ensure-chat-id.js.map +1 -1
  11. package/intern/first-message-embedding.d.ts +1 -0
  12. package/intern/first-message-embedding.js +6 -3
  13. package/intern/first-message-embedding.js.map +1 -1
  14. package/intern/pre-allocate.d.ts +13 -1
  15. package/intern/pre-allocate.js +19 -2
  16. package/intern/pre-allocate.js.map +1 -1
  17. package/intern/process-access-bindings.js +32 -1
  18. package/intern/process-access-bindings.js.map +1 -1
  19. package/intern/prompt-assembly.d.ts +2 -0
  20. package/intern/prompt-assembly.js +17 -2
  21. package/intern/prompt-assembly.js.map +1 -1
  22. package/intern/research-vector-arm.d.ts +36 -0
  23. package/intern/research-vector-arm.js +102 -0
  24. package/intern/research-vector-arm.js.map +1 -0
  25. package/package.json +11 -11
  26. package/public/app-documents-head-query.d.ts +11 -0
  27. package/public/app-documents-head-query.js +14 -0
  28. package/public/app-documents-head-query.js.map +1 -0
  29. package/public/app-documents-put-persist.d.ts +1 -0
  30. package/public/app-documents-put-persist.js +4 -7
  31. package/public/app-documents-put-persist.js.map +1 -1
  32. package/public/app-documents-read-eventos.js +12 -55
  33. package/public/app-documents-read-eventos.js.map +1 -1
  34. package/public/app-documents-write-eventos.js +45 -36
  35. package/public/app-documents-write-eventos.js.map +1 -1
  36. package/public/home-feed-common.d.ts +6 -2
  37. package/public/home-feed-common.js +22 -0
  38. package/public/home-feed-common.js.map +1 -1
  39. package/public/llm-dispatch.js +39 -39
  40. package/public/llm-dispatch.js.map +1 -1
  41. package/public/prompt-chat-section.d.ts +2 -2
  42. package/public/prompt-chat-section.js +15 -8
  43. package/public/prompt-chat-section.js.map +1 -1
  44. package/public/related-vibes.js +2 -24
  45. package/public/related-vibes.js.map +1 -1
  46. package/public/seq-allocation.d.ts +12 -0
  47. package/public/seq-allocation.js +40 -46
  48. package/public/seq-allocation.js.map +1 -1
  49. package/public/sync-eventos.d.ts +4 -0
  50. package/public/sync-eventos.js +480 -0
  51. package/public/sync-eventos.js.map +1 -0
  52. package/public/sync-feed.d.ts +50 -0
  53. package/public/sync-feed.js +117 -0
  54. package/public/sync-feed.js.map +1 -0
  55. package/public/sync-pull-core.d.ts +30 -0
  56. package/public/sync-pull-core.js +84 -0
  57. package/public/sync-pull-core.js.map +1 -0
  58. package/public/viewer-channel-resolver.d.ts +19 -0
  59. package/public/viewer-channel-resolver.js +54 -0
  60. package/public/viewer-channel-resolver.js.map +1 -0
  61. package/public/write-front-door.d.ts +24 -0
  62. package/public/write-front-door.js +27 -0
  63. package/public/write-front-door.js.map +1 -0
@@ -60,21 +60,40 @@ function buildAtomicInsert(p) {
60
60
  const { row, flavour } = p;
61
61
  const dataParam = flavour === "pg" ? sql `${row.data}` : sql `${JSON.stringify(row.data)}`;
62
62
  return sql `
63
- INSERT INTO ${TABLE} ("userSlug","appSlug","dbName","docId","seq","userId","data","deleted","created")
63
+ INSERT INTO ${TABLE} ("userSlug","appSlug","dbName","docId","seq","userId","data","deleted","created","baseSeq")
64
64
  SELECT ${row.ownerHandle}, ${row.appSlug}, ${row.dbName}, ${row.docId},
65
- COALESCE(MAX("seq"),0)+1, ${row.userId}, ${dataParam}, ${row.deleted}, ${row.created}
65
+ COALESCE(MAX("seq"),0)+1, ${row.userId}, ${dataParam}, ${row.deleted}, ${row.created}, ${row.baseSeq ?? null}
66
66
  FROM ${TABLE}
67
67
  WHERE "userSlug"=${row.ownerHandle} AND "appSlug"=${row.appSlug}
68
68
  AND "dbName"=${row.dbName} AND "docId"=${row.docId}
69
69
  RETURNING "seq"
70
70
  `;
71
71
  }
72
- function runReturning(db, flavour, stmt) {
72
+ export function runReturning(db, flavour, stmt) {
73
73
  if (flavour === "pg") {
74
74
  return db.execute(stmt);
75
75
  }
76
76
  return db.run(stmt);
77
77
  }
78
+ export async function runLockedAllocation(args) {
79
+ if (args.flavour === "pg") {
80
+ return asTxRunner(args.db).transaction(async (tx) => {
81
+ await tx.execute(sql `SELECT pg_advisory_xact_lock(hashtextextended(${args.lockKey}, 0))`);
82
+ return args.attempt(tx);
83
+ });
84
+ }
85
+ for (let i = 0; i < args.maxAttempts; i++) {
86
+ try {
87
+ return args.needsTxnOnSqlite ? await asTxRunner(args.db).transaction((tx) => args.attempt(tx)) : await args.attempt(args.db);
88
+ }
89
+ catch (err) {
90
+ if (!isRetryableConflict(err))
91
+ throw err;
92
+ await new Promise((r) => setTimeout(r, Math.floor(Math.random() * (8 << i))));
93
+ }
94
+ }
95
+ return args.onSqliteExhausted();
96
+ }
78
97
  async function headSeqWith(exec, p) {
79
98
  const r = await exec
80
99
  .select({ maxSeq: sql `COALESCE(MAX(${p.table.seq}),0)` })
@@ -97,51 +116,26 @@ async function assertHeadSeq(exec, p) {
97
116
  function asTxRunner(db) {
98
117
  return db;
99
118
  }
100
- async function allocateSqlite(p) {
101
- const attempts = p.maxAttempts ?? 3;
102
- const needsTxn = p.skipIf !== undefined || p.ifHeadSeq !== undefined;
103
- for (let i = 0; i < attempts; i++) {
104
- try {
105
- if (needsTxn) {
106
- const skipIf = p.skipIf;
107
- return await asTxRunner(p.db).transaction(async (tx) => {
108
- await assertHeadSeq(tx, p);
109
- if (skipIf && (await skipIf(tx)))
110
- return { seq: await headSeqWith(tx, p), inserted: false };
111
- const seq = extractReturnedSeq(await runReturning(tx, p.flavour, buildAtomicInsert(p)));
112
- if (p.sidecar)
113
- await p.sidecar(seq, tx);
114
- return { seq, inserted: true };
115
- });
116
- }
117
- const seq = extractReturnedSeq(await runReturning(p.db, p.flavour, buildAtomicInsert(p)));
118
- if (p.sidecar)
119
- await p.sidecar(seq, p.db);
120
- return { seq, inserted: true };
121
- }
122
- catch (err) {
123
- if (!isRetryableConflict(err))
124
- throw err;
125
- await new Promise((r) => setTimeout(r, Math.floor(Math.random() * (8 << i))));
126
- }
127
- }
128
- throw new SeqConflictError(await currentHeadSeq(p));
129
- }
130
- async function allocatePg(p) {
131
- const key = docLockKey(p.row.ownerHandle, p.row.appSlug, p.row.dbName, p.row.docId);
132
- return asTxRunner(p.db).transaction(async (tx) => {
133
- await tx.execute(sql `SELECT pg_advisory_xact_lock(hashtextextended(${key}, 0))`);
134
- await assertHeadSeq(tx, p);
135
- if (p.skipIf && (await p.skipIf(tx))) {
136
- return { seq: await headSeqWith(tx, p), inserted: false };
137
- }
138
- const seq = extractReturnedSeq(await runReturning(tx, "pg", buildAtomicInsert(p)));
119
+ export async function allocateAndInsertRevision(p) {
120
+ const attempt = async (exec) => {
121
+ await assertHeadSeq(exec, p);
122
+ if (p.skipIf && (await p.skipIf(exec)))
123
+ return { seq: await headSeqWith(exec, p), inserted: false };
124
+ const seq = extractReturnedSeq(await runReturning(exec, p.flavour, buildAtomicInsert(p)));
139
125
  if (p.sidecar)
140
- await p.sidecar(seq, tx);
126
+ await p.sidecar(seq, exec);
141
127
  return { seq, inserted: true };
128
+ };
129
+ return runLockedAllocation({
130
+ db: p.db,
131
+ flavour: p.flavour,
132
+ lockKey: docLockKey(p.row.ownerHandle, p.row.appSlug, p.row.dbName, p.row.docId),
133
+ needsTxnOnSqlite: p.skipIf !== undefined || p.ifHeadSeq !== undefined,
134
+ maxAttempts: p.maxAttempts ?? 3,
135
+ attempt,
136
+ onSqliteExhausted: async () => {
137
+ throw new SeqConflictError(await currentHeadSeq(p));
138
+ },
142
139
  });
143
140
  }
144
- export async function allocateAndInsertRevision(p) {
145
- return p.flavour === "pg" ? allocatePg(p) : allocateSqlite(p);
146
- }
147
141
  //# sourceMappingURL=seq-allocation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"seq-allocation.js","sourceRoot":"","sources":["../../jsr/public/seq-allocation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seq-allocation.js","sourceRoot":"","sources":["../../jsr/public/seq-allocation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { EventoHandler } from "@adviser/cement";
2
+ import { MsgBase, ReqSyncPull, ResSyncPull, ReqSyncPush, ResSyncPush, VibesDiyError, W3CWebSocketEvent } from "@vibes.diy/api-types";
3
+ export declare const syncPullEvento: EventoHandler<W3CWebSocketEvent, MsgBase<ReqSyncPull>, ResSyncPull | VibesDiyError>;
4
+ export declare const syncPushEvento: EventoHandler<W3CWebSocketEvent, MsgBase<ReqSyncPush>, ResSyncPush | VibesDiyError>;
@@ -0,0 +1,480 @@
1
+ import { Result, Option, EventoResult } from "@adviser/cement";
2
+ import { reqSyncPull, reqSyncPush, isDirectChannel, } from "@vibes.diy/api-types";
3
+ import { unwrapMsgBase } from "../unwrap-msg-base.js";
4
+ import { optAuth } from "../check-auth.js";
5
+ import { aliasedTable, and, eq, gt, inArray, max, or } from "drizzle-orm";
6
+ import { type } from "arktype";
7
+ import { checkDocAccess } from "./access-helpers.js";
8
+ import { resolveDbAcl } from "./db-acl-resolver.js";
9
+ import { resolveAccessBinding } from "./access-binding-resolver.js";
10
+ import { mintFilesUrls } from "./files-url-mint.js";
11
+ import { readAllowed, connectionAdminMode, clientWsSend } from "./app-documents-shared.js";
12
+ import { normalizeChannels } from "./normalize-channels.js";
13
+ import { audienceChannelsOf, hasInheritChannel, inheritChannelOf, INHERIT_CAPABILITY_CHANNEL } from "./audience-channels.js";
14
+ import { decodeAccessOutputRows } from "./access-output-decoder.js";
15
+ import { hasGrantBearingDescriptor, resolveViewerChannels } from "./viewer-channel-resolver.js";
16
+ import { loadHeadDocs } from "./app-documents-head-query.js";
17
+ import { resolveWriteAclVerdict, resolveWriterContext } from "./write-front-door.js";
18
+ import { runPutAccessGate } from "../intern/put-access-gate.js";
19
+ import { runDeleteAccessGate } from "../intern/delete-access-gate.js";
20
+ import { persistPutRevision } from "./app-documents-put-persist.js";
21
+ import { bestEffortAppendDelete, bestEffortChannelChange, channelSetOfDescriptor, loadDocChannels } from "./sync-feed.js";
22
+ import { allocateAndInsertRevision, SeqConflictError } from "./seq-allocation.js";
23
+ import { emitBackendOnChange } from "../intern/emit-backend-onchange.js";
24
+ import { purgeRootHtmlCacheSameColo } from "../intern/swr-purge.js";
25
+ import { notifyDocChangedFanOut, notifyViewerGrantsChangedFanOut, emitDmWriteEffects, emitCommentPostedEvent, } from "./app-documents-broadcast.js";
26
+ import { notifyViewerGrantDeltaIfChanged } from "./app-documents-grant-delta.js";
27
+ import { computeSyncPull } from "./sync-pull-core.js";
28
+ const BARE_DB_CHANNEL = "*";
29
+ export const syncPullEvento = {
30
+ hash: "sync-pull",
31
+ validate: unwrapMsgBase(async (msg) => {
32
+ const ret = reqSyncPull(msg.payload);
33
+ if (ret instanceof type.errors)
34
+ return Result.Ok(Option.None());
35
+ return Result.Ok(Option.Some({ ...msg, payload: ret }));
36
+ }),
37
+ handle: optAuth(async (ctx) => {
38
+ const req = ctx.validated.payload;
39
+ const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
40
+ const afbRow = await resolveAccessBinding(vctx, req.ownerHandle, req.appSlug, req.dbName);
41
+ const isDm = isDirectChannel(req.ownerHandle);
42
+ let access = "none";
43
+ if (!isDm) {
44
+ const reqAdmin = req.adminMode === true;
45
+ ({ access } = req._auth
46
+ ? await checkDocAccess(vctx, req._auth.verifiedAuth.claims.userId, req.appSlug, req.ownerHandle, connectionAdminMode(ctx) || reqAdmin)
47
+ : { access: "none" });
48
+ const rAcl = await resolveDbAcl({ vctx, ownerHandle: req.ownerHandle, appSlug: req.appSlug, dbName: req.dbName });
49
+ if (rAcl.isErr() ||
50
+ !(await readAllowed({ vctx, acl: rAcl.Ok(), access, appSlug: req.appSlug, ownerHandle: req.ownerHandle }))) {
51
+ await ctx.send.send(ctx, { type: "vibes.diy.res-error", error: { message: "Access denied" } });
52
+ return Result.Ok(EventoResult.Continue);
53
+ }
54
+ }
55
+ const feed = await loadFeed(vctx, req, req.cursors);
56
+ const tOutputs = vctx.sql.tables.accessFnOutputs;
57
+ const headRowsQuery = loadHeadDocs(vctx, { ownerHandle: req.ownerHandle, appSlug: req.appSlug, dbName: req.dbName });
58
+ const outputsQuery = afbRow?.accessFnCid
59
+ ? vctx.sql.db
60
+ .select({ docId: tOutputs.docId, output: tOutputs.output })
61
+ .from(tOutputs)
62
+ .where(and(eq(tOutputs.ownerHandle, req.ownerHandle), eq(tOutputs.appSlug, req.appSlug), eq(tOutputs.dbName, req.dbName)))
63
+ : Promise.resolve([]);
64
+ const [headRows, allOutputs] = await Promise.all([headRowsQuery, outputsQuery]);
65
+ const grantedChannels = [];
66
+ let liveDocs;
67
+ let adminOverride = false;
68
+ if (!afbRow?.accessFnCid) {
69
+ grantedChannels.push(BARE_DB_CHANNEL);
70
+ liveDocs = headRows.map((row) => ({
71
+ docId: row.docId,
72
+ seq: row.seq,
73
+ doc: mintDoc(vctx, req, row),
74
+ channels: [BARE_DB_CHANNEL],
75
+ }));
76
+ }
77
+ else {
78
+ const decodedOutputs = decodeAccessOutputRows(allOutputs);
79
+ const { effectiveChannels, publicChannels } = await resolveViewerChannels(vctx, {
80
+ ownerHandle: req.ownerHandle,
81
+ appSlug: req.appSlug,
82
+ userId: req._auth?.verifiedAuth.claims.userId ?? null,
83
+ isDm,
84
+ access,
85
+ decodedOutputs,
86
+ });
87
+ const docChannels = new Map();
88
+ for (const { row, descriptor } of decodedOutputs) {
89
+ const channels = channelSetOfDescriptor(descriptor);
90
+ if (channels.length > 0)
91
+ docChannels.set(row.docId, channels);
92
+ }
93
+ const grantedSet = new Set([...effectiveChannels, ...publicChannels]);
94
+ grantedChannels.push(...grantedSet);
95
+ adminOverride = access === "override";
96
+ liveDocs = (adminOverride ? headRows : headRows.filter((row) => docChannels.has(row.docId))).map((row) => ({
97
+ docId: row.docId,
98
+ seq: row.seq,
99
+ doc: mintDoc(vctx, req, row),
100
+ channels: docChannels.get(row.docId) ?? [],
101
+ }));
102
+ }
103
+ const result = computeSyncPull({ feed, cursors: req.cursors, grantedChannels, liveDocs, adminOverride });
104
+ await ctx.send.send(ctx, {
105
+ type: "vibes.diy.res-sync-pull",
106
+ status: "ok",
107
+ mode: result.mode,
108
+ entries: result.entries,
109
+ cursors: result.cursors,
110
+ grantedChannels: result.grantedChannels,
111
+ });
112
+ return Result.Ok(EventoResult.Continue);
113
+ }),
114
+ };
115
+ function mintDoc(vctx, req, row) {
116
+ const doc = mintFilesUrls(row.data, {
117
+ ownerHandle: req.ownerHandle,
118
+ appSlug: req.appSlug,
119
+ dbName: req.dbName,
120
+ docId: row.docId,
121
+ svc: vctx.params.vibes.svc,
122
+ });
123
+ return { _id: row.docId, ...doc };
124
+ }
125
+ async function loadFeed(vctx, req, cursors) {
126
+ const f = vctx.sql.tables.syncFeed;
127
+ let minCursor = 0;
128
+ let first = true;
129
+ for (const raw of Object.values(cursors)) {
130
+ const v = Number.isFinite(raw) && raw >= 0 ? raw : 0;
131
+ if (first || v < minCursor)
132
+ minCursor = v;
133
+ first = false;
134
+ }
135
+ const rows = await vctx.sql.db
136
+ .select({ syncSeq: f.syncSeq, kind: f.kind, docId: f.docId, seq: f.seq, channel: f.channel })
137
+ .from(f)
138
+ .where(and(eq(f.ownerHandle, req.ownerHandle), eq(f.appSlug, req.appSlug), eq(f.dbName, req.dbName), or(gt(f.syncSeq, minCursor), eq(f.kind, "delete"))));
139
+ return rows.map((r) => ({
140
+ syncSeq: r.syncSeq,
141
+ kind: r.kind,
142
+ docId: r.docId,
143
+ seq: r.seq,
144
+ channel: r.channel,
145
+ }));
146
+ }
147
+ export const syncPushEvento = {
148
+ hash: "sync-push",
149
+ validate: unwrapMsgBase(async (msg) => {
150
+ const ret = reqSyncPush(msg.payload);
151
+ if (ret instanceof type.errors)
152
+ return Result.Ok(Option.None());
153
+ return Result.Ok(Option.Some({ ...msg, payload: ret }));
154
+ }),
155
+ handle: optAuth(async (ctx) => {
156
+ const req = ctx.validated.payload;
157
+ const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
158
+ const userId = req._auth?.verifiedAuth.claims.userId ?? null;
159
+ const isDm = isDirectChannel(req.ownerHandle);
160
+ const adminRequested = connectionAdminMode(ctx) || req.adminMode === true;
161
+ const afbRow = await resolveAccessBinding(vctx, req.ownerHandle, req.appSlug, req.dbName);
162
+ const { aclWriteAllowed, adminActive } = await resolveWriteAclVerdict(vctx, {
163
+ ownerHandle: req.ownerHandle,
164
+ appSlug: req.appSlug,
165
+ dbName: req.dbName,
166
+ userId,
167
+ isDm,
168
+ adminRequested,
169
+ });
170
+ if (userId !== null && !isDm && !aclWriteAllowed) {
171
+ await ctx.send.send(ctx, { type: "vibes.diy.res-sync-push", status: "ok", accepted: [] });
172
+ return Result.Ok(EventoResult.Continue);
173
+ }
174
+ const { userContext } = await resolveWriterContext(vctx, { userId, isDm, ownerHandle: req.ownerHandle });
175
+ const accepted = [];
176
+ const senderConnId = clientWsSend(ctx).connId;
177
+ const email = req._auth?.verifiedAuth.claims.params.email;
178
+ const putDocIds = req.writes.filter((w) => !w.deleted).map((w) => w.docId);
179
+ const headByDoc = afbRow?.accessFnCid ? await currentHeads(vctx, req, putDocIds) : new Map();
180
+ for (const w of req.writes) {
181
+ if (w.deleted) {
182
+ if (!userId)
183
+ continue;
184
+ const delGate = await runDeleteAccessGate(vctx, {
185
+ ownerHandle: req.ownerHandle,
186
+ appSlug: req.appSlug,
187
+ dbName: req.dbName,
188
+ docId: w.docId,
189
+ userId,
190
+ adminMode: adminRequested,
191
+ });
192
+ if (delGate.kind === "deny")
193
+ continue;
194
+ const tombstoned = await tryTombstone(vctx, req, w.docId, userId);
195
+ if (!tombstoned)
196
+ continue;
197
+ accepted.push({ docId: tombstoned.docId, seq: tombstoned.seq, syncSeq: tombstoned.syncSeq });
198
+ await runPushDeleteEffects(vctx, {
199
+ ownerHandle: req.ownerHandle,
200
+ appSlug: req.appSlug,
201
+ dbName: req.dbName,
202
+ docId: w.docId,
203
+ seq: tombstoned.seq,
204
+ channels: tombstoned.channels,
205
+ deletedDocHadGrants: tombstoned.deletedDocHadGrants,
206
+ writerUserId: userId,
207
+ senderConnId,
208
+ });
209
+ continue;
210
+ }
211
+ let descriptor;
212
+ let grantsReduceBefore;
213
+ if (afbRow?.accessFnCid) {
214
+ if (!vctx.invokeAccessFn)
215
+ continue;
216
+ const gate = await runPutAccessGate(vctx, {
217
+ ownerHandle: req.ownerHandle,
218
+ appSlug: req.appSlug,
219
+ dbName: req.dbName,
220
+ fnCid: afbRow.accessFnCid,
221
+ accessFnAssetUri: afbRow.accessFnAssetUri,
222
+ accessFnDbName: afbRow.dbName,
223
+ docId: w.docId,
224
+ doc: w.doc,
225
+ oldDoc: headByDoc.get(w.docId) ?? null,
226
+ userContext,
227
+ adminMode: adminActive,
228
+ });
229
+ if (gate.kind === "deny")
230
+ continue;
231
+ descriptor = gate.descriptor;
232
+ grantsReduceBefore = gate.grantsReduceBefore;
233
+ }
234
+ else if (!userId) {
235
+ continue;
236
+ }
237
+ const persisted = await tryPersist(vctx, req, w, userId, descriptor, afbRow?.accessFnCid);
238
+ if (!persisted)
239
+ continue;
240
+ accepted.push(persisted);
241
+ await runPushPutEffects(vctx, {
242
+ ownerHandle: req.ownerHandle,
243
+ appSlug: req.appSlug,
244
+ dbName: req.dbName,
245
+ docId: w.docId,
246
+ seq: persisted.seq,
247
+ doc: w.doc,
248
+ userId,
249
+ email,
250
+ descriptor,
251
+ grantsReduceBefore,
252
+ senderConnId,
253
+ });
254
+ }
255
+ await ctx.send.send(ctx, { type: "vibes.diy.res-sync-push", status: "ok", accepted });
256
+ return Result.Ok(EventoResult.Continue);
257
+ }),
258
+ };
259
+ async function currentHeads(vctx, req, docIds) {
260
+ if (docIds.length === 0)
261
+ return new Map();
262
+ const t = vctx.sql.tables.appDocuments;
263
+ const t2 = aliasedTable(t, "headdata");
264
+ const rows = await vctx.sql.db
265
+ .select({ docId: t.docId, data: t.data })
266
+ .from(t)
267
+ .where(and(eq(t.ownerHandle, req.ownerHandle), eq(t.appSlug, req.appSlug), eq(t.dbName, req.dbName), inArray(t.docId, [...docIds]), eq(t.seq, vctx.sql.db
268
+ .select({ m: max(t2.seq) })
269
+ .from(t2)
270
+ .where(and(eq(t2.ownerHandle, req.ownerHandle), eq(t2.appSlug, req.appSlug), eq(t2.dbName, req.dbName), eq(t2.docId, t.docId))))));
271
+ return new Map(rows.map((r) => [r.docId, r.data]));
272
+ }
273
+ async function tryPersist(vctx, req, w, userId, descriptor, accessFnCid) {
274
+ const now = new Date().toISOString();
275
+ const oldChannels = accessFnCid ? await loadDocChannels(vctx, { ...req, docId: w.docId }) : [];
276
+ let seq;
277
+ try {
278
+ const persisted = await persistPutRevision(vctx, {
279
+ ownerHandle: req.ownerHandle,
280
+ appSlug: req.appSlug,
281
+ dbName: req.dbName,
282
+ docId: w.docId,
283
+ doc: w.doc,
284
+ userId,
285
+ now,
286
+ accessResult: descriptor,
287
+ accessFnCid,
288
+ mightNoop: false,
289
+ baseSeq: w.baseSeq,
290
+ });
291
+ if (!persisted.alloc.inserted)
292
+ return undefined;
293
+ if (persisted.grantUpsertErr) {
294
+ console.warn("sync push: AccessFnOutputs upsert failed, dropping write (client retries):", persisted.grantUpsertErr);
295
+ return undefined;
296
+ }
297
+ seq = persisted.alloc.seq;
298
+ }
299
+ catch (err) {
300
+ if (err instanceof SeqConflictError)
301
+ return undefined;
302
+ throw err;
303
+ }
304
+ const syncSeq = await bestEffortChannelChange({
305
+ db: vctx.sql.db,
306
+ flavour: vctx.sql.flavour,
307
+ ownerHandle: req.ownerHandle,
308
+ appSlug: req.appSlug,
309
+ dbName: req.dbName,
310
+ docId: w.docId,
311
+ seq,
312
+ oldChannels,
313
+ newChannels: channelSetOfDescriptor(descriptor),
314
+ alwaysPut: true,
315
+ created: now,
316
+ });
317
+ if (syncSeq === undefined)
318
+ return undefined;
319
+ return { docId: w.docId, seq, syncSeq };
320
+ }
321
+ async function runPushPutEffects(vctx, p) {
322
+ const now = new Date().toISOString();
323
+ await emitBackendOnChange(vctx, {
324
+ ownerHandle: p.ownerHandle,
325
+ appSlug: p.appSlug,
326
+ dbName: p.dbName,
327
+ docId: p.docId,
328
+ seq: p.seq,
329
+ deleted: false,
330
+ doc: p.doc,
331
+ originDepth: 0,
332
+ writerUserId: p.userId,
333
+ });
334
+ await emitDmWriteEffects(vctx, {
335
+ ownerHandle: p.ownerHandle,
336
+ docId: p.docId,
337
+ userId: p.userId,
338
+ nextSeq: p.seq,
339
+ now,
340
+ doc: p.doc,
341
+ });
342
+ await emitCommentPostedEvent(vctx, {
343
+ ownerHandle: p.ownerHandle,
344
+ appSlug: p.appSlug,
345
+ dbName: p.dbName,
346
+ docId: p.docId,
347
+ userId: p.userId,
348
+ email: p.email,
349
+ nextSeq: p.seq,
350
+ now,
351
+ });
352
+ const channels = [
353
+ ...normalizeChannels(p.descriptor?.channels ?? []),
354
+ ...(p.descriptor === undefined ? [] : audienceChannelsOf(p.descriptor)),
355
+ ...(p.descriptor === undefined ? [] : inheritChannelOf(p.descriptor)),
356
+ ];
357
+ if (hasInheritChannel(channels))
358
+ channels.push(INHERIT_CAPABILITY_CHANNEL);
359
+ notifyDocChangedFanOut(vctx, {
360
+ ownerHandle: p.ownerHandle,
361
+ appSlug: p.appSlug,
362
+ dbName: p.dbName,
363
+ docId: p.docId,
364
+ channels,
365
+ senderConnId: p.senderConnId,
366
+ });
367
+ if (p.descriptor && p.grantsReduceBefore) {
368
+ const outputHasGrants = hasGrantBearingDescriptor(p.descriptor) ? 1 : 0;
369
+ notifyViewerGrantDeltaIfChanged(vctx, {
370
+ ownerHandle: p.ownerHandle,
371
+ appSlug: p.appSlug,
372
+ docId: p.docId,
373
+ descriptor: p.descriptor,
374
+ outputHasGrants,
375
+ grantsReduceBefore: p.grantsReduceBefore,
376
+ senderConnId: p.senderConnId,
377
+ });
378
+ }
379
+ }
380
+ async function runPushDeleteEffects(vctx, p) {
381
+ await emitBackendOnChange(vctx, {
382
+ ownerHandle: p.ownerHandle,
383
+ appSlug: p.appSlug,
384
+ dbName: p.dbName,
385
+ docId: p.docId,
386
+ seq: p.seq,
387
+ deleted: true,
388
+ doc: {},
389
+ originDepth: 0,
390
+ writerUserId: p.writerUserId,
391
+ });
392
+ notifyDocChangedFanOut(vctx, {
393
+ ownerHandle: p.ownerHandle,
394
+ appSlug: p.appSlug,
395
+ dbName: p.dbName,
396
+ docId: p.docId,
397
+ channels: p.channels,
398
+ senderConnId: p.senderConnId,
399
+ });
400
+ if (p.deletedDocHadGrants) {
401
+ notifyViewerGrantsChangedFanOut(vctx, {
402
+ ownerHandle: p.ownerHandle,
403
+ appSlug: p.appSlug,
404
+ senderConnId: p.senderConnId,
405
+ });
406
+ }
407
+ purgeRootHtmlCacheSameColo(vctx, p.ownerHandle, p.appSlug);
408
+ }
409
+ async function tryTombstone(vctx, req, docId, userId) {
410
+ const now = new Date().toISOString();
411
+ const t = vctx.sql.tables.appDocuments;
412
+ const tOutputs = vctx.sql.tables.accessFnOutputs;
413
+ let seq;
414
+ let channels = [];
415
+ let deletedDocHadGrants = false;
416
+ try {
417
+ const alloc = await allocateAndInsertRevision({
418
+ db: vctx.sql.db,
419
+ flavour: vctx.sql.flavour,
420
+ table: t,
421
+ row: {
422
+ ownerHandle: req.ownerHandle,
423
+ appSlug: req.appSlug,
424
+ dbName: req.dbName,
425
+ docId,
426
+ userId,
427
+ data: {},
428
+ deleted: 1,
429
+ created: now,
430
+ },
431
+ sidecar: async (_seq, exec) => {
432
+ const outRow = await exec
433
+ .select({ output: tOutputs.output, hasGrants: tOutputs.hasGrants })
434
+ .from(tOutputs)
435
+ .where(and(eq(tOutputs.ownerHandle, req.ownerHandle), eq(tOutputs.appSlug, req.appSlug), eq(tOutputs.dbName, req.dbName), eq(tOutputs.docId, docId)))
436
+ .limit(1)
437
+ .then((r) => r[0]);
438
+ if (outRow) {
439
+ deletedDocHadGrants = outRow.hasGrants === 1;
440
+ if (outRow.output) {
441
+ try {
442
+ const parsed = JSON.parse(outRow.output);
443
+ channels = channelSetOfDescriptor(parsed);
444
+ if (hasInheritChannel(channels))
445
+ channels.push(INHERIT_CAPABILITY_CHANNEL);
446
+ }
447
+ catch (e) {
448
+ console.error("push delete stored-channels parse error:", e);
449
+ }
450
+ }
451
+ }
452
+ await exec
453
+ .delete(tOutputs)
454
+ .where(and(eq(tOutputs.ownerHandle, req.ownerHandle), eq(tOutputs.appSlug, req.appSlug), eq(tOutputs.dbName, req.dbName), eq(tOutputs.docId, docId)));
455
+ },
456
+ });
457
+ if (!alloc.inserted)
458
+ return undefined;
459
+ seq = alloc.seq;
460
+ }
461
+ catch (err) {
462
+ if (err instanceof SeqConflictError)
463
+ return undefined;
464
+ throw err;
465
+ }
466
+ const syncSeq = await bestEffortAppendDelete({
467
+ db: vctx.sql.db,
468
+ flavour: vctx.sql.flavour,
469
+ ownerHandle: req.ownerHandle,
470
+ appSlug: req.appSlug,
471
+ dbName: req.dbName,
472
+ docId,
473
+ seq,
474
+ created: now,
475
+ });
476
+ if (syncSeq === undefined)
477
+ return undefined;
478
+ return { docId, seq, syncSeq, channels, deletedDocHadGrants };
479
+ }
480
+ //# sourceMappingURL=sync-eventos.js.map