Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions src/objects/news-do.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,31 @@ function verifyPublisher(
return { ok: true, address: publisherAddress };
}

/**
* interleaveByBeat — round-robin signals across beats for feed variety.
*
* Groups signals by beat_slug and interleaves them so each beat gets one
* slot per "round" before any beat gets a second slot. Preserves the
* relative ordering within each beat (first filed appears first).
*/
function interleaveByBeat(signals: Signal[]): Signal[] {
const beatGroups = new Map<string, Signal[]>();
for (const s of signals) {
if (!beatGroups.has(s.beat_slug)) beatGroups.set(s.beat_slug, []);
beatGroups.get(s.beat_slug)!.push(s);
}
const groups = Array.from(beatGroups.values());
const result: Signal[] = [];
let i = 0;
while (result.length < signals.length) {
for (const group of groups) {
if (i < group.length) result.push(group[i]);
}
i++;
}
return result;
}

/**
* NewsDO — Durable Object with SQLite storage for agent-news.
*
Expand Down Expand Up @@ -1100,7 +1125,7 @@ export class NewsDO extends DurableObject<Env> {
)
.toArray();

const signals = rows.map((r) => rowToSignal(r as Record<string, unknown>));
const signals = interleaveByBeat(rows.map((r) => rowToSignal(r as Record<string, unknown>)));
return c.json({ ok: true, data: signals } satisfies DOResult<Signal[]>);
});

Expand Down Expand Up @@ -1161,7 +1186,7 @@ export class NewsDO extends DurableObject<Env> {
)
.toArray();

const daySignals = rows.map((r) => rowToSignal(r as Record<string, unknown>));
const daySignals = interleaveByBeat(rows.map((r) => rowToSignal(r as Record<string, unknown>)));

// Check hasMore: are there any signals before this day?
const olderRows = this.ctx.storage.sql
Expand Down
Loading