/** * The project activity feed (DES-PROJECT-001 §5.2) — a READ-SIDE MERGE, not a new store. * * Two sources, one normalized shape: * - CREW: the durable core-event log of the project's `crew.run`/`crew.chat` members * (`adapter.runEvents` — the same log `/runs/:id/events` serves), entry id `crew::`. * - INTERACTIVE: `wicked.interactive.*` bus events carrying this `project_id`, read through the * engine that holds the bus (`Core.busRead`, core/bus.ts — wicked-core#631), entry id * `bus:`. Crew opens no SQLite of its own: a second SQLite library on the engine's bus * file in the same process drops the engine's POSIX locks on its close (F-E2E-021), which is * why this read used to need a long-lived handle and now needs none. The newest 1000 live * interactive rows for the project are read, expired ones included: the feed is history. * * Newest-first, cursor on `(ts, id)` — an opaque `:` token, base64url. The merge is * recomputed per read; members are few and the log excludes high-volume frames, so the simple * full-merge is the honest v1 (the ADR explicitly rejects a new store here). */ import type { CoreAdapter } from '../core/adapter.js'; import type { ActivityEntry } from '../core/types.js'; /** Opaque cursor: base64url of `:`. */ export declare function encodeCursor(ts: number, id: string): string; export declare function decodeCursor(cursor: string): { ts: number; id: string; } | null; /** Build one page of the merged feed. `refs` = the project's run/chat member refs. */ export declare function buildActivityPage(adapter: CoreAdapter, projectId: string, refs: string[], busDbPath: string | null, cursor: string | undefined, limit: number): Promise<{ entries: ActivityEntry[]; nextCursor: string | null; }>; //# sourceMappingURL=activity.d.ts.map