diff --git a/packages/app/vite.js b/packages/app/vite.js index f65a68a1cbc0..28f538909a1a 100644 --- a/packages/app/vite.js +++ b/packages/app/vite.js @@ -16,6 +16,7 @@ export default [ resolve: { alias: { "@": fileURLToPath(new URL("./src", import.meta.url)), + "@opencode-ai/core": fileURLToPath(new URL("../core/src", import.meta.url)), }, }, worker: { diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index ba9a4d6f1a0f..77d23a1cfeee 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -1647,12 +1647,23 @@ NOTE: At any point in time through this workflow you should feel free to ask the let structured: unknown let step = 0 const session = yield* sessions.get(sessionID).pipe(Effect.orDie) + let msgs: MessageV2.WithParts[] | undefined + let needsFullReload = true while (true) { yield* status.set(sessionID, { type: "busy" }) yield* slog.info("loop", { step }) - let msgs = yield* MessageV2.filterCompactedEffect(sessionID) + if (needsFullReload || !msgs) { + msgs = yield* MessageV2.filterCompactedEffect(sessionID) + needsFullReload = false + } else { + const fresh = yield* MessageV2.filterCompactedEffect(sessionID) + const knownIDs = new Set(msgs.map((m) => m.info.id)) + for (const m of fresh) { + if (!knownIDs.has(m.info.id)) msgs.push(m) + } + } const { user: lastUser, assistant: lastAssistant, finished: lastFinished, tasks } = MessageV2.latest(msgs) @@ -1692,6 +1703,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the if (task?.type === "subtask") { yield* handleSubtask({ task, model, lastUser, sessionID, session, msgs }) + needsFullReload = true continue } @@ -1704,6 +1716,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the overflow: task.overflow, }) if (result === "stop") break + needsFullReload = true continue } @@ -1713,6 +1726,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the (yield* compaction.isOverflow({ tokens: lastFinished.tokens, model })) ) { yield* compaction.create({ sessionID, agent: lastUser.agent, model: lastUser.model, auto: true }) + needsFullReload = true continue } @@ -1859,6 +1873,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the auto: true, overflow: !handle.message.finish, }) + needsFullReload = true } return "continue" as const }).pipe(