@vibes.diy/vibe-runtime 10.1.0 → 10.2.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.
@@ -0,0 +1,124 @@
1
+ import type { Result } from "@adviser/cement";
2
+ import { type DocResponse, type DocTypes, type DocWithId, type FireflyQueryDatabase, type IndexRow, type ListenerFn, type MapFnArg, type QueryOpts, type QueryResponse } from "./firefly-database.js";
3
+ import type { IndexedDbStore } from "./indexeddb-store.js";
4
+ import { type MirrorOp, type MirrorWriteOp, type ResMirrorSubscribe, type ResMirrorWrite } from "@vibes.diy/vibe-types";
5
+ export interface DeltaResult {
6
+ readonly applied: DocWithId[];
7
+ readonly gap: boolean;
8
+ }
9
+ export interface LocalResult {
10
+ readonly changed: DocWithId[];
11
+ readonly ids: string[];
12
+ readonly priors: (DocWithId | undefined)[];
13
+ }
14
+ export declare class MirrorDocSet {
15
+ private readonly docs;
16
+ private readonly outstanding;
17
+ private _seq;
18
+ constructor(seedDocs?: DocWithId[]);
19
+ get seq(): number;
20
+ get size(): number;
21
+ applySnapshot(docs: DocWithId[], seq: number): DocWithId[];
22
+ applyDelta(delta: {
23
+ seq: number;
24
+ ops: MirrorOp[];
25
+ originRuntimeId?: string;
26
+ }, selfRuntimeId?: string): DeltaResult;
27
+ applyResume(ops: MirrorOp[], seq: number): DocWithId[];
28
+ applyLocal(writes: MirrorWriteOp[]): LocalResult;
29
+ revertLocal(ids: string[], priors: (DocWithId | undefined)[]): DocWithId[];
30
+ foldSeedDocs(seedDocs: DocWithId[]): DocWithId[];
31
+ snapshot<T extends DocTypes = DocTypes>(): DocWithId<T>[];
32
+ get(id: string): DocWithId | undefined;
33
+ private applyOps;
34
+ }
35
+ export interface MirrorTransport {
36
+ readonly runtimeId: string;
37
+ ackMirrorProto(): Promise<number | undefined>;
38
+ mirrorSubscribe(dbName: string, fromSeq?: number): Promise<Result<ResMirrorSubscribe>>;
39
+ mirrorWrite(dbName: string, originRuntimeId: string, writes: MirrorWriteOp[]): Promise<Result<ResMirrorWrite>>;
40
+ onMsg(fn: (event: {
41
+ data: unknown;
42
+ }) => void): unknown;
43
+ }
44
+ export interface MirrorStoreOptions {
45
+ readonly app?: string;
46
+ readonly name: string;
47
+ readonly seedDocs?: DocWithId[];
48
+ readonly api: MirrorTransport;
49
+ readonly legacyBackend: () => IndexedDbStore;
50
+ }
51
+ export declare class MirrorStore implements FireflyQueryDatabase {
52
+ readonly name: string;
53
+ seedDocs?: DocWithId[];
54
+ private readonly app?;
55
+ private readonly api;
56
+ private readonly legacyBackendFactory;
57
+ private readonly mirror;
58
+ private readonly listeners;
59
+ private readonly readyFuture;
60
+ private backend;
61
+ private legacy?;
62
+ private legacyUnsub?;
63
+ private resubscribing;
64
+ private ephemeral?;
65
+ private ephemeralBroadcast?;
66
+ constructor(opts: MirrorStoreOptions);
67
+ private resolveBackend;
68
+ private degradeToLegacy;
69
+ private wireMirrorInbound;
70
+ private applySubscribeResult;
71
+ private resubscribeFromSeq;
72
+ ready(): Promise<void>;
73
+ get<T extends DocTypes>(id: string): Promise<DocWithId<T>>;
74
+ put<T extends DocTypes>(doc: T & {
75
+ _id?: string;
76
+ }): Promise<DocResponse>;
77
+ del(id: string): Promise<DocResponse>;
78
+ private reliableMirrorWrite;
79
+ private revertFailedWrite;
80
+ remove(id: string): Promise<DocResponse>;
81
+ bulk<T extends DocTypes>(docs: (T & {
82
+ _id?: string;
83
+ })[]): Promise<{
84
+ ids: string[];
85
+ }>;
86
+ query<T extends DocTypes>(mapFn: MapFnArg<T>, opts?: QueryOpts): Promise<QueryResponse<T>>;
87
+ queryLive<T extends DocTypes>(mapFn: MapFnArg<T>, opts?: QueryOpts): Promise<{
88
+ result: QueryResponse<T>;
89
+ serverDocs: DocWithId<T>[];
90
+ }>;
91
+ materializeLive<T extends DocTypes>(serverDocs: DocWithId<T>[], mapFn: MapFnArg<T>, opts?: QueryOpts): QueryResponse<T>;
92
+ materializeAllDocs<T extends DocTypes>(serverDocs: DocWithId<T>[], opts?: {
93
+ limit?: number;
94
+ offset?: number;
95
+ descending?: boolean;
96
+ }): {
97
+ rows: IndexRow<T>[];
98
+ docs: DocWithId<T>[];
99
+ };
100
+ allDocs<T extends DocTypes>(opts?: {
101
+ limit?: number;
102
+ offset?: number;
103
+ descending?: boolean;
104
+ }): Promise<{
105
+ rows: IndexRow<T>[];
106
+ docs: DocWithId<T>[];
107
+ }>;
108
+ changes<T extends DocTypes>(): Promise<{
109
+ rows: IndexRow<T>[];
110
+ docs: DocWithId<T>[];
111
+ }>;
112
+ snapshot<T extends DocTypes = DocTypes>(): DocWithId<T>[];
113
+ subscribe<T extends DocTypes>(listener: ListenerFn<T>): () => void;
114
+ resubscribe(): void;
115
+ foldSeedDocs(seedDocs: DocWithId[]): void;
116
+ enableEphemeral(broadcast: (docId: string, doc: Record<string, unknown>) => void): void;
117
+ applyEphemeral(docId: string, doc: Record<string, unknown>, originPeer: string): void;
118
+ dropEphemeralPeer(originPeer: string): void;
119
+ broadcastEphemeral(docId: string, doc: Record<string, unknown>): void;
120
+ compact(): Promise<void>;
121
+ close(): Promise<void>;
122
+ private foldEphemeral;
123
+ private notify;
124
+ }
@@ -0,0 +1,417 @@
1
+ import { Future, exception2Result } from "@adviser/cement";
2
+ import { materializeQuery, newOptimisticId, } from "./firefly-database.js";
3
+ import { EphemeralOverlay } from "./ephemeral-overlay.js";
4
+ import { MIRROR_PROTO, isEvtMirrorDelta, isEvtMirrorReset, } from "@vibes.diy/vibe-types";
5
+ export class MirrorDocSet {
6
+ docs = new Map();
7
+ outstanding = new Set();
8
+ _seq = 0;
9
+ constructor(seedDocs) {
10
+ for (const doc of seedDocs ?? [])
11
+ this.docs.set(doc._id, { ...doc });
12
+ }
13
+ get seq() {
14
+ return this._seq;
15
+ }
16
+ get size() {
17
+ return this.docs.size;
18
+ }
19
+ applySnapshot(docs, seq) {
20
+ const changed = [];
21
+ const nextIds = new Set(docs.map((d) => d._id));
22
+ for (const id of [...this.docs.keys()]) {
23
+ if (!nextIds.has(id)) {
24
+ if (this.outstanding.has(id))
25
+ continue;
26
+ this.docs.delete(id);
27
+ changed.push({ _id: id, _deleted: true });
28
+ }
29
+ }
30
+ for (const doc of docs) {
31
+ if (this.outstanding.has(doc._id))
32
+ continue;
33
+ const saved = { ...doc };
34
+ this.docs.set(saved._id, saved);
35
+ changed.push(saved);
36
+ }
37
+ this._seq = seq;
38
+ return changed;
39
+ }
40
+ applyDelta(delta, selfRuntimeId) {
41
+ if (delta.seq <= this._seq)
42
+ return { applied: [], gap: false };
43
+ if (delta.seq > this._seq + 1)
44
+ return { applied: [], gap: true };
45
+ const changed = this.applyOps(delta.ops);
46
+ for (const op of delta.ops)
47
+ this.outstanding.delete(op.docId);
48
+ this._seq = delta.seq;
49
+ if (delta.originRuntimeId !== undefined && delta.originRuntimeId === selfRuntimeId) {
50
+ return { applied: [], gap: false };
51
+ }
52
+ return { applied: changed, gap: false };
53
+ }
54
+ applyResume(ops, seq) {
55
+ const changed = this.applyOps(ops);
56
+ for (const op of ops)
57
+ this.outstanding.delete(op.docId);
58
+ this._seq = seq;
59
+ return changed;
60
+ }
61
+ applyLocal(writes) {
62
+ const changed = [];
63
+ const ids = [];
64
+ const priors = [];
65
+ for (const w of writes) {
66
+ if (w.op === "put") {
67
+ const id = w.docId ?? w.doc._id ?? newOptimisticId();
68
+ priors.push(this.docs.get(id));
69
+ const saved = { ...w.doc, _id: id };
70
+ this.docs.set(id, saved);
71
+ changed.push(saved);
72
+ ids.push(id);
73
+ this.outstanding.add(id);
74
+ }
75
+ else {
76
+ priors.push(this.docs.get(w.docId));
77
+ this.docs.delete(w.docId);
78
+ changed.push({ _id: w.docId, _deleted: true });
79
+ ids.push(w.docId);
80
+ this.outstanding.add(w.docId);
81
+ }
82
+ }
83
+ return { changed, ids, priors };
84
+ }
85
+ revertLocal(ids, priors) {
86
+ const changed = [];
87
+ for (let i = 0; i < ids.length; i += 1) {
88
+ const id = ids[i];
89
+ if (!this.outstanding.has(id))
90
+ continue;
91
+ this.outstanding.delete(id);
92
+ const prior = priors[i];
93
+ if (prior === undefined) {
94
+ this.docs.delete(id);
95
+ changed.push({ _id: id, _deleted: true });
96
+ }
97
+ else {
98
+ const restored = { ...prior };
99
+ this.docs.set(id, restored);
100
+ changed.push(restored);
101
+ }
102
+ }
103
+ return changed;
104
+ }
105
+ foldSeedDocs(seedDocs) {
106
+ const added = [];
107
+ for (const doc of seedDocs) {
108
+ if (!this.docs.has(doc._id)) {
109
+ const saved = { ...doc };
110
+ this.docs.set(doc._id, saved);
111
+ added.push(saved);
112
+ }
113
+ }
114
+ return added;
115
+ }
116
+ snapshot() {
117
+ return [...this.docs.values()].map((doc) => ({ ...doc }));
118
+ }
119
+ get(id) {
120
+ const doc = this.docs.get(id);
121
+ return doc === undefined ? undefined : { ...doc };
122
+ }
123
+ applyOps(ops) {
124
+ const changed = [];
125
+ for (const op of ops) {
126
+ if (op.op === "put") {
127
+ const saved = { ...op.doc, _id: op.docId };
128
+ this.docs.set(op.docId, saved);
129
+ changed.push(saved);
130
+ }
131
+ else {
132
+ this.docs.delete(op.docId);
133
+ changed.push({ _id: op.docId, _deleted: true });
134
+ }
135
+ }
136
+ return changed;
137
+ }
138
+ }
139
+ const MIRROR_WRITE_MAX_ATTEMPTS = 3;
140
+ export class MirrorStore {
141
+ name;
142
+ seedDocs;
143
+ app;
144
+ api;
145
+ legacyBackendFactory;
146
+ mirror;
147
+ listeners = new Set();
148
+ readyFuture = new Future();
149
+ backend = "pending";
150
+ legacy;
151
+ legacyUnsub;
152
+ resubscribing = false;
153
+ ephemeral;
154
+ ephemeralBroadcast;
155
+ constructor(opts) {
156
+ this.app = opts.app;
157
+ this.name = opts.name;
158
+ this.seedDocs = opts.seedDocs;
159
+ this.api = opts.api;
160
+ this.legacyBackendFactory = opts.legacyBackend;
161
+ this.mirror = new MirrorDocSet(opts.seedDocs);
162
+ void this.resolveBackend();
163
+ }
164
+ async resolveBackend() {
165
+ const proto = await this.api.ackMirrorProto();
166
+ if (proto !== MIRROR_PROTO) {
167
+ this.degradeToLegacy(proto === undefined ? "host advertised no mirror proto" : `mirror proto skew (host ${proto}, self ${MIRROR_PROTO})`);
168
+ return;
169
+ }
170
+ this.backend = "mirror";
171
+ this.wireMirrorInbound();
172
+ const res = await this.api.mirrorSubscribe(this.name);
173
+ if (res.isErr()) {
174
+ this.degradeToLegacy(`mirror subscribe failed: ${String(res.Err())}`);
175
+ return;
176
+ }
177
+ const ok = res.Ok();
178
+ if (ok.status === "error") {
179
+ this.degradeToLegacy(`mirror subscribe rejected: ${ok.message ?? "unknown"}`);
180
+ return;
181
+ }
182
+ this.applySubscribeResult(ok);
183
+ this.readyFuture.resolve();
184
+ }
185
+ degradeToLegacy(reason) {
186
+ if (this.backend === "legacy")
187
+ return;
188
+ this.backend = "legacy";
189
+ console.warn(`[mirror] ${this.name}: degrading to the legacy iframe-local store — ${reason}`);
190
+ const legacy = this.legacyBackendFactory();
191
+ this.legacy = legacy;
192
+ if (this.ephemeralBroadcast !== undefined)
193
+ legacy.enableEphemeral(this.ephemeralBroadcast);
194
+ this.legacyUnsub = legacy.subscribe((docs, meta) => this.notify(docs, meta));
195
+ void legacy.ready().then(() => this.readyFuture.resolve());
196
+ }
197
+ wireMirrorInbound() {
198
+ this.api.onMsg((event) => {
199
+ const data = event.data;
200
+ if (isEvtMirrorDelta(data) && data.dbName === this.name) {
201
+ const { applied, gap } = this.mirror.applyDelta({ seq: data.seq, ops: data.ops, originRuntimeId: data.originRuntimeId }, this.api.runtimeId);
202
+ if (gap) {
203
+ void this.resubscribeFromSeq();
204
+ return;
205
+ }
206
+ if (applied.length > 0)
207
+ this.notify(applied);
208
+ }
209
+ else if (isEvtMirrorReset(data) && data.dbName === this.name) {
210
+ const changed = this.mirror.applySnapshot(data.docs, data.seq);
211
+ if (changed.length > 0)
212
+ this.notify(changed);
213
+ }
214
+ });
215
+ }
216
+ applySubscribeResult(res) {
217
+ if (res.mode === "resume") {
218
+ const changed = this.mirror.applyResume((res.ops ?? []), res.seq ?? this.mirror.seq);
219
+ if (changed.length > 0)
220
+ this.notify(changed);
221
+ }
222
+ else {
223
+ const changed = this.mirror.applySnapshot((res.docs ?? []), res.seq ?? 0);
224
+ if (changed.length > 0)
225
+ this.notify(changed);
226
+ }
227
+ }
228
+ async resubscribeFromSeq() {
229
+ if (this.resubscribing)
230
+ return;
231
+ this.resubscribing = true;
232
+ try {
233
+ const res = await this.api.mirrorSubscribe(this.name, this.mirror.seq);
234
+ if (res.isErr())
235
+ return;
236
+ const ok = res.Ok();
237
+ if (ok.status === "error")
238
+ return;
239
+ this.applySubscribeResult(ok);
240
+ }
241
+ finally {
242
+ this.resubscribing = false;
243
+ }
244
+ }
245
+ async ready() {
246
+ await this.readyFuture.asPromise();
247
+ }
248
+ async get(id) {
249
+ await this.ready();
250
+ if (this.legacy !== undefined)
251
+ return this.legacy.get(id);
252
+ const folded = this.foldEphemeral(this.mirror.snapshot()).find((d) => d._id === id);
253
+ if (folded !== undefined)
254
+ return { ...folded };
255
+ throw new Error(`Failed to get document: ${id} (not found)`);
256
+ }
257
+ async put(doc) {
258
+ await this.ready();
259
+ if (this.legacy !== undefined)
260
+ return this.legacy.put(doc);
261
+ const write = doc._id !== undefined ? { op: "put", doc, docId: doc._id } : { op: "put", doc };
262
+ const { changed, ids, priors } = this.mirror.applyLocal([write]);
263
+ const id = ids[0];
264
+ this.notify(changed);
265
+ const ok = await this.reliableMirrorWrite([{ op: "put", doc: { ...doc, _id: id }, docId: id }]);
266
+ if (!ok)
267
+ return this.revertFailedWrite(id, priors[0]);
268
+ return { id, ok: true };
269
+ }
270
+ async del(id) {
271
+ await this.ready();
272
+ if (this.legacy !== undefined)
273
+ return this.legacy.del(id);
274
+ const { changed, priors } = this.mirror.applyLocal([{ op: "del", docId: id }]);
275
+ this.notify(changed);
276
+ const ok = await this.reliableMirrorWrite([{ op: "del", docId: id }]);
277
+ if (!ok)
278
+ return this.revertFailedWrite(id, priors[0]);
279
+ return { id, ok: true };
280
+ }
281
+ async reliableMirrorWrite(writes) {
282
+ for (let attempt = 0; attempt < MIRROR_WRITE_MAX_ATTEMPTS; attempt += 1) {
283
+ const settled = await exception2Result(() => this.api.mirrorWrite(this.name, this.api.runtimeId, writes));
284
+ if (settled.isOk()) {
285
+ const ack = settled.Ok();
286
+ if (ack.status === "ok" && ack.results.every((r) => r.ok))
287
+ return true;
288
+ }
289
+ }
290
+ return false;
291
+ }
292
+ revertFailedWrite(id, prior) {
293
+ const reverted = this.mirror.revertLocal([id], [prior]);
294
+ if (reverted.length > 0)
295
+ this.notify(reverted);
296
+ return { id, ok: false };
297
+ }
298
+ async remove(id) {
299
+ return this.del(id);
300
+ }
301
+ async bulk(docs) {
302
+ const ids = [];
303
+ for (const doc of docs)
304
+ ids.push((await this.put(doc)).id);
305
+ return { ids };
306
+ }
307
+ async query(mapFn, opts = {}) {
308
+ await this.ready();
309
+ if (this.legacy !== undefined)
310
+ return this.legacy.query(mapFn, opts);
311
+ return materializeQuery(this.foldEphemeral(this.mirror.snapshot()), mapFn, opts);
312
+ }
313
+ async queryLive(mapFn, opts = {}) {
314
+ await this.ready();
315
+ if (this.legacy !== undefined)
316
+ return this.legacy.queryLive(mapFn, opts);
317
+ const serverDocs = this.mirror.snapshot();
318
+ return { result: materializeQuery(this.foldEphemeral(serverDocs), mapFn, opts), serverDocs };
319
+ }
320
+ materializeLive(serverDocs, mapFn, opts = {}) {
321
+ if (this.legacy !== undefined)
322
+ return this.legacy.materializeLive(serverDocs, mapFn, opts);
323
+ return materializeQuery(this.foldEphemeral(serverDocs), mapFn, opts);
324
+ }
325
+ materializeAllDocs(serverDocs, opts = {}) {
326
+ if (this.legacy !== undefined)
327
+ return this.legacy.materializeAllDocs(serverDocs, opts);
328
+ let docs = [...this.foldEphemeral(serverDocs)].sort((a, b) => (a._id < b._id ? -1 : a._id > b._id ? 1 : 0));
329
+ if (opts.descending)
330
+ docs.reverse();
331
+ if (opts.offset)
332
+ docs = docs.slice(opts.offset);
333
+ if (opts.limit !== undefined)
334
+ docs = docs.slice(0, opts.limit);
335
+ return { rows: docs.map((doc) => ({ key: doc._id, value: doc, doc })), docs };
336
+ }
337
+ async allDocs(opts = {}) {
338
+ await this.ready();
339
+ if (this.legacy !== undefined)
340
+ return this.legacy.allDocs(opts);
341
+ return this.materializeAllDocs(this.mirror.snapshot(), opts);
342
+ }
343
+ async changes() {
344
+ return { rows: [], docs: [] };
345
+ }
346
+ snapshot() {
347
+ if (this.legacy !== undefined)
348
+ return this.legacy.snapshot();
349
+ return this.mirror.snapshot();
350
+ }
351
+ subscribe(listener) {
352
+ const fn = listener;
353
+ this.listeners.add(fn);
354
+ return () => this.listeners.delete(fn);
355
+ }
356
+ resubscribe() {
357
+ return;
358
+ }
359
+ foldSeedDocs(seedDocs) {
360
+ this.seedDocs = seedDocs;
361
+ if (this.legacy !== undefined) {
362
+ this.legacy.foldSeedDocs(seedDocs);
363
+ return;
364
+ }
365
+ const added = this.mirror.foldSeedDocs(seedDocs);
366
+ if (added.length > 0)
367
+ this.notify(this.mirror.snapshot());
368
+ }
369
+ enableEphemeral(broadcast) {
370
+ this.ephemeralBroadcast = broadcast;
371
+ if (this.legacy !== undefined) {
372
+ this.legacy.enableEphemeral(broadcast);
373
+ return;
374
+ }
375
+ if (this.ephemeral !== undefined)
376
+ return;
377
+ this.ephemeral = new EphemeralOverlay({
378
+ onChange: (docIds) => this.notify(docIds.map((id) => ({ _id: id })), { ephemeral: true }),
379
+ });
380
+ }
381
+ applyEphemeral(docId, doc, originPeer) {
382
+ if (this.legacy !== undefined) {
383
+ this.legacy.applyEphemeral(docId, doc, originPeer);
384
+ return;
385
+ }
386
+ this.ephemeral?.apply(docId, doc, originPeer);
387
+ }
388
+ dropEphemeralPeer(originPeer) {
389
+ if (this.legacy !== undefined) {
390
+ this.legacy.dropEphemeralPeer(originPeer);
391
+ return;
392
+ }
393
+ this.ephemeral?.dropPeer(originPeer);
394
+ }
395
+ broadcastEphemeral(docId, doc) {
396
+ this.ephemeralBroadcast?.(docId, doc);
397
+ }
398
+ async compact() {
399
+ return;
400
+ }
401
+ async close() {
402
+ this.legacyUnsub?.();
403
+ this.ephemeral?.stop();
404
+ await this.legacy?.close();
405
+ }
406
+ foldEphemeral(docs) {
407
+ return this.ephemeral === undefined ? docs : this.ephemeral.merge(docs);
408
+ }
409
+ notify(docs, meta) {
410
+ for (const listener of this.listeners) {
411
+ const called = exception2Result(() => (meta === undefined ? listener(docs) : listener(docs, meta)));
412
+ if (called.isErr())
413
+ continue;
414
+ }
415
+ }
416
+ }
417
+ //# sourceMappingURL=mirror-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirror-store.js","sourceRoot":"","sources":["../jsr/mirror-store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibes.diy/vibe-runtime",
3
- "version": "10.1.0",
3
+ "version": "10.2.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -8,6 +8,7 @@
8
8
  ".": "./index.js",
9
9
  "./sync-engine.js": "./sync-engine.js",
10
10
  "./indexeddb-store.js": "./indexeddb-store.js",
11
+ "./mirror-store.js": "./mirror-store.js",
11
12
  "./bare-specifier-rewrite.js": "./bare-specifier-rewrite.js",
12
13
  "./vibe-executor.js": "./vibe-executor.js",
13
14
  "./worker-loader-executor.js": "./worker-loader-executor.js",
@@ -25,8 +26,8 @@
25
26
  },
26
27
  "dependencies": {
27
28
  "@adviser/cement": "~0.5.34",
28
- "@vibes.diy/base": "10.1.0",
29
- "@vibes.diy/vibe-types": "10.1.0",
29
+ "@vibes.diy/base": "10.2.0",
30
+ "@vibes.diy/vibe-types": "10.2.0",
30
31
  "arktype": "~2.2.3",
31
32
  "charwise": "~3.0.1",
32
33
  "es-module-lexer": "~2.3.1",
@@ -1,4 +1,4 @@
1
- import { ResCallAI, ResImgGen, type ImgGenTarget, ResPutDoc, ResGetDoc, ResQueryDocs, ResDeleteDoc, ResSubscribeDocs, ResSyncPull, ReqSyncPush, ResSyncPush, ResListDbNames, ResVibePutAsset, ResVibeWhoAmI, ResVibeLookupHandles, type ResVibeAccessFnSource, type ResVibeUpdateAvatarCid, type EvtVibeViewerChanged, type EvtVibeSocialChanged, type ReqVibeSocial, type ResVibeSocial, type ResVibeRequestFollowersAccess, type ResVibeSetVisibility, type ResVibeSocialInvite, type ResSetDbAcl, type DbAcl, type QueryFilter } from "@vibes.diy/vibe-types";
1
+ import { ResCallAI, ResImgGen, type ImgGenTarget, ResPutDoc, ResGetDoc, ResQueryDocs, ResDeleteDoc, ResSubscribeDocs, ResSyncPull, ReqSyncPush, ResSyncPush, ResListDbNames, ResVibePutAsset, ResVibeWhoAmI, ResVibeLookupHandles, type ResVibeAccessFnSource, type ResVibeUpdateAvatarCid, type EvtVibeViewerChanged, type EvtVibeSocialChanged, type ReqVibeSocial, type ResVibeSocial, type ResVibeRequestFollowersAccess, type ResVibeSetVisibility, type ResVibeSocialInvite, type ResSetDbAcl, type DbAcl, type QueryFilter, type ResMirrorSubscribe, type ResMirrorWrite, type MirrorWriteOp } from "@vibes.diy/vibe-types";
2
2
  import { Future, Result } from "@adviser/cement";
3
3
  import { CallAIOpts } from "./call-ai.js";
4
4
  export interface VibeApp {
@@ -28,7 +28,9 @@ export declare class VibeSandboxApi {
28
28
  readonly runtimeId: `${string}-${string}-${string}-${string}-${string}`;
29
29
  readonly ackReady: Future<void, void>;
30
30
  acked: boolean;
31
+ ackedMirrorProto: number | undefined;
31
32
  readonly handleMessage: (event: MessageEvent) => void;
33
+ ackMirrorProto(): Promise<number | undefined>;
32
34
  request<Q, S>(msg: Omit<Q, "tid">, opts: RequestOpts): Promise<Result<S>>;
33
35
  private requestIdle;
34
36
  readonly onMsg: import("@adviser/cement").ReturnOnFunc<[event: MessageEvent<any>], unknown, unknown>;
@@ -45,6 +47,8 @@ export declare class VibeSandboxApi {
45
47
  queryDocs(dbName?: string, filter?: QueryFilter): Promise<Result<ResQueryDocs>>;
46
48
  deleteDoc(docId: string, dbName?: string): Promise<Result<ResDeleteDoc>>;
47
49
  subscribeDocs(dbName?: string): Promise<Result<ResSubscribeDocs>>;
50
+ mirrorSubscribe(dbName: string, fromSeq?: number): Promise<Result<ResMirrorSubscribe>>;
51
+ mirrorWrite(dbName: string, originRuntimeId: string, writes: MirrorWriteOp[]): Promise<Result<ResMirrorWrite>>;
48
52
  syncPull(cursors: Record<string, number>, dbName?: string): Promise<Result<ResSyncPull>>;
49
53
  syncPush(writes: ReqSyncPush["writes"], dbName?: string): Promise<Result<ResSyncPush>>;
50
54
  onSyncReconnected(fn: () => void): () => void;