From c5ac667e863050c91a5308f55d62cb8eeabf05fd Mon Sep 17 00:00:00 2001 From: Hypatia May Date: Tue, 14 Jul 2026 17:20:57 +0800 Subject: [PATCH] refactor(session-query): simplify tracing helpers --- .../session-query/session-query/src/index.ts | 8 ++++---- .../session-query/src/tracing.ts | 19 ++++++++----------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/session-query/session-query/src/index.ts b/packages/session-query/session-query/src/index.ts index e5659c554a..bd35b51442 100644 --- a/packages/session-query/session-query/src/index.ts +++ b/packages/session-query/session-query/src/index.ts @@ -22,7 +22,7 @@ import { type Config, } from './config.ts' import { SessionCorpus } from './corpus.ts' -import { eventRecords, traceEventLog, traceLineage } from './tracing.ts' +import * as tracing from './tracing.ts' export type * from './types.ts' export type { Config, SessionQueryErrorCode } from './config.ts' @@ -71,7 +71,7 @@ export class SessionQueryService extends Service { */ async listEvents(sessionId: SessionId): Promise { const loaded = await this._corpus.load(sessionId) - return eventRecords(sessionId, loaded.events) + return tracing.eventRecords(sessionId, loaded.events) } /** @@ -82,7 +82,7 @@ export class SessionQueryService extends Service { */ async traceSession(sessionId: SessionId): Promise { const records = await this._corpus.listSessions() - return traceLineage(records, sessionId) + return tracing.traceSession(records, sessionId) } /** @@ -93,7 +93,7 @@ export class SessionQueryService extends Service { */ async traceEvent(request: SessionEventTraceRequest): Promise { const loaded = await this._corpus.load(request.sessionId) - return traceEventLog(request.sessionId, loaded.events, request.seq) + return tracing.traceEvent(request.sessionId, loaded.events, request.seq) } /** diff --git a/packages/session-query/session-query/src/tracing.ts b/packages/session-query/session-query/src/tracing.ts index c7b5143b67..2f422d6c26 100644 --- a/packages/session-query/session-query/src/tracing.ts +++ b/packages/session-query/session-query/src/tracing.ts @@ -37,7 +37,7 @@ export function eventRecords( * @param seq - target event seq. * @returns direct surface and provenance relationships. */ -export function traceEventLog( +export function traceEvent( sessionId: SessionId, events: readonly SessionEvent[], seq: number, @@ -59,7 +59,6 @@ export function traceEventLog( replacement = analysis.replacedBy.get(replacement) } - const sourceEventSeqs = eventSources(target) const derivedEventSeqs: number[] = [] for (const event of events) { if (event.seq <= seq) continue @@ -71,11 +70,11 @@ export function traceEventLog( const targetRecord = analysis.records[seq]! const replacedBy = analysis.replacedBy.get(seq) return { - target: { ...targetRecord }, + target: targetRecord, ...replacedBy === undefined ? {} : { replacedBy }, replacementChain, - replacedEventSeqs: [...(analysis.replacedEventSeqs.get(seq) ?? [])], - sourceEventSeqs: [...sourceEventSeqs], + replacedEventSeqs: analysis.replacedEventSeqs.get(seq) ?? [], + sourceEventSeqs: [...eventSources(target)], derivedEventSeqs, } } @@ -86,7 +85,7 @@ export function traceEventLog( * @param sessionId - target session id. * @returns complete or explicitly partial lineage. */ -export function traceLineage( +export function traceSession( records: readonly SessionRecord[], sessionId: SessionId, ): SessionLineageTrace { @@ -164,14 +163,12 @@ function analyzeEventLog( ) } const current = new Set(folded.nodes.map(node => node.seq)) - const shadowed = new Set() const replacedBy = new Map() const replacedEventSeqs = new Map() for (const replacement of folded.replacements) { - const removed = [...replacement.shadowedSeqs] + const removed = replacement.shadowedSeqs replacedEventSeqs.set(replacement.seq, removed) for (const removedSeq of removed) { - shadowed.add(removedSeq) replacedBy.set(removedSeq, replacement.seq) } } @@ -183,14 +180,14 @@ function analyzeEventLog( time: event.time, surface: current.has(event.seq) ? 'current' - : shadowed.has(event.seq) ? 'shadowed' : 'log-only', + : replacedBy.has(event.seq) ? 'shadowed' : 'log-only', })), replacedBy, replacedEventSeqs, } } -function eventSources(event: SessionEvent): number[] { +function eventSources(event: SessionEvent): readonly number[] { return (event as SessionEvent).sourceEventSeqs ?? [] }