From 96b6a4311b576917cdee3727bf35e347a9113e7f Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 10 Mar 2026 09:23:51 -0700 Subject: [PATCH] Remove redundant sha from StoredLogEvent type The sha is already encoded in the log filename (releaseSha_timestamp.jsonl), so there's no need to include it per-event. This simplifies the type and storage format. Co-Authored-By: Claude Haiku 4.5 --- packages/spike/src/log.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/spike/src/log.ts b/packages/spike/src/log.ts index 5f9b28b..8310a8c 100644 --- a/packages/spike/src/log.ts +++ b/packages/spike/src/log.ts @@ -18,15 +18,15 @@ export type LogEvent = | { type: "discord-ready" } | { type: "error"; error: unknown; context?: string } -export type StoredLogEvent = LogEvent & { ts: string; sha: string } +export type StoredLogEvent = LogEvent & { ts: string } type Listener = (event: StoredLogEvent) => void const listeners: Listener[] = [] -const sha = process.env.RENDER_GIT_COMMIT?.slice(0, 7) || "dev" +const releaseSha = process.env.RENDER_GIT_COMMIT?.slice(0, 7) || "dev" export function log(event: LogEvent) { - const stored = { ...event, ts: new Date().toISOString(), sha } as StoredLogEvent + const stored = { ...event, ts: new Date().toISOString() } as StoredLogEvent for (const listener of listeners) { listener(stored) } @@ -47,7 +47,7 @@ mkdirSync(logsDir, { recursive: true }) function createLogFile(): string { const timestamp = new Date().toISOString().replace(/[:.]/g, "-") - return `${logsDir}/${sha}_${timestamp}.jsonl` + return `${logsDir}/${releaseSha}_${timestamp}.jsonl` } export function listLogFiles(): string[] { @@ -55,9 +55,11 @@ export function listLogFiles(): string[] { .filter((f) => f.endsWith(".jsonl")) .sort() .reverse() + .slice(0, 20) } export function readLogFile(filename: string): StoredLogEvent[] { + // Reject path traversal attempts (e.g. "../../../etc/passwd") if (filename !== basename(filename)) return [] const path = `${logsDir}/${filename}` try {