fix(context): Use direct message fetch instead of consumer API

Simpler approach that avoids TypeScript issues with consumer options
This commit is contained in:
Claudia 2026-02-02 10:45:50 +01:00
parent 093260b47e
commit 37f34e0536

View file

@ -93,12 +93,12 @@ async function queryEvents(
const nc = await connect({ servers: config.natsUrl }); const nc = await connect({ servers: config.natsUrl });
try { try {
const js = nc.jetstream();
const jsm = await nc.jetstreamManager(); const jsm = await nc.jetstreamManager();
// Check if stream exists // Check if stream exists and get info
let streamInfo;
try { try {
await jsm.streams.info(config.streamName); streamInfo = await jsm.streams.info(config.streamName);
} catch { } catch {
console.log("[event-context] Stream not found, returning empty context"); console.log("[event-context] Stream not found, returning empty context");
return []; return [];
@ -109,30 +109,31 @@ async function queryEvents(
const maxEvents = options.maxEvents ?? 1000; const maxEvents = options.maxEvents ?? 1000;
const startTime = Date.now() - hoursBack * 60 * 60 * 1000; const startTime = Date.now() - hoursBack * 60 * 60 * 1000;
// Create ephemeral consumer for querying // Get message count
const consumerName = `context-query-${Date.now()}`; const lastSeq = streamInfo.state.last_seq;
if (lastSeq === 0) {
return [];
}
// Build subject filter // Start from end and go back
const subject = options.agent const startSeq = Math.max(1, lastSeq - maxEvents);
? `${config.subjectPrefix}.${options.agent}.>`
: `${config.subjectPrefix}.>`;
const consumer = await js.consumers.get(config.streamName, { // Fetch messages by sequence
name: consumerName, for (let seq = startSeq; seq <= lastSeq && events.length < maxEvents; seq++) {
ack_policy: AckPolicy.None,
deliver_policy: DeliverPolicy.StartTime,
opt_start_time: new Date(startTime).toISOString(),
filter_subject: subject,
inactive_threshold: 30_000_000_000, // 30 seconds in nanos
});
// Fetch messages
const messages = await consumer.fetch({ max_messages: maxEvents, expires: 5000 });
for await (const msg of messages) {
try { try {
const msg = await jsm.streams.getMessage(config.streamName, { seq });
const data = JSON.parse(sc.decode(msg.data)) as StoredEvent; const data = JSON.parse(sc.decode(msg.data)) as StoredEvent;
// Filter by timestamp
if (data.timestamp < startTime) {
continue;
}
// Filter by agent if specified
if (options.agent && data.agent !== options.agent && data.agent !== "agent") {
continue;
}
// Filter by session if specified // Filter by session if specified
if (options.sessionKey && data.session !== options.sessionKey) { if (options.sessionKey && data.session !== options.sessionKey) {
continue; continue;
@ -144,16 +145,10 @@ async function queryEvents(
} }
events.push(data); events.push(data);
} catch (err) {
console.error("[event-context] Failed to parse event:", err);
}
}
// Delete ephemeral consumer
try {
await jsm.consumers.delete(config.streamName, consumerName);
} catch { } catch {
// Ignore - may have auto-deleted // Message may have been deleted
continue;
}
} }
return events; return events;