diff --git a/packages/opencode/src/session/summary.ts b/packages/opencode/src/session/summary.ts index 370870935ad6..4d03e51c2de7 100644 --- a/packages/opencode/src/session/summary.ts +++ b/packages/opencode/src/session/summary.ts @@ -103,16 +103,14 @@ export const layer = Layer.effect( sessionID: SessionID messageID: MessageID }) { - yield* sessions.setSummary({ - sessionID: input.sessionID, - summary: { - additions: 0, - deletions: 0, - files: 0, - }, - }) - yield* events.publish(Session.Event.Diff, { sessionID: input.sessionID, diff: [] }) - if ((yield* config.get()).snapshot === false) return + if ((yield* config.get()).snapshot === false) { + yield* sessions.setSummary({ + sessionID: input.sessionID, + summary: { additions: 0, deletions: 0, files: 0 }, + }) + yield* events.publish(Session.Event.Diff, { sessionID: input.sessionID, diff: [] }) + return + } const all = yield* sessions.messages({ sessionID: input.sessionID }).pipe(Effect.orDie) if (!all.length) return @@ -124,6 +122,32 @@ export const layer = Layer.effect( const msgDiffs = yield* computeDiff({ messages }) target.info.summary = { ...target.info.summary, diffs: msgDiffs } yield* sessions.updateMessage(target.info) + + // Re-aggregate the session-level summary from the cheap per-message + // turn diffs (already computed above and on prior turns). This restores + // the "Modified Files" sidebar, which reads session.summary, without + // the expensive full-session snapshot diff that #30127 removed. + // Each touched file appears once (last turn wins). + const byFile = new Map() + for (const msg of all) { + if (msg.info.role !== "user") continue + const diffs = msg.info.summary?.diffs + if (!diffs) continue + for (const d of diffs) { + byFile.set(d.file ?? `__nofile_${byFile.size}`, d) + } + } + const aggregate = [...byFile.values()] + yield* sessions.setSummary({ + sessionID: input.sessionID, + summary: { + additions: aggregate.reduce((sum, x) => sum + x.additions, 0), + deletions: aggregate.reduce((sum, x) => sum + x.deletions, 0), + files: aggregate.length, + diffs: aggregate, + }, + }) + yield* events.publish(Session.Event.Diff, { sessionID: input.sessionID, diff: aggregate }) }) const diff = Effect.fn("SessionSummary.diff")(function* (input: { sessionID: SessionID; messageID?: MessageID }) {