diff --git a/.gitignore b/.gitignore index 9fc5e0beef87f27828f6661f92913a996c9ac2a0..701ad4089f55fdb0b000940f882b50036edd2fc6 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ packages/*/dist .env .env.local build/ +.logs/ diff --git a/apps/desktop/src/providerManager.ts b/apps/desktop/src/providerManager.ts index 2a9f37bcb2013647a86bd0b20d554037bb8f854b..0700daa65888fb6b31e58d35180bf5fd52412f2a 100644 --- a/apps/desktop/src/providerManager.ts +++ b/apps/desktop/src/providerManager.ts @@ -1,4 +1,6 @@ import { EventEmitter } from "node:events"; +import fs from "node:fs"; +import path from "node:path"; import { type ProviderEvent, @@ -21,10 +23,22 @@ export interface ProviderManagerEvents { export class ProviderManager extends EventEmitter { private readonly codex = new CodexAppServerManager(); + private readonly logStream: fs.WriteStream; constructor() { super(); - this.codex.on("event", (event) => this.emit("event", event)); + + const logsDir = path.resolve(process.cwd(), ".logs"); + fs.mkdirSync(logsDir, { recursive: true }); + this.logStream = fs.createWriteStream( + path.join(logsDir, "events.txt"), + { flags: "a" }, + ); + + this.codex.on("event", (event) => { + this.logStream.write(`${JSON.stringify(event)}\n`); + this.emit("event", event); + }); } async startSession(raw: ProviderSessionStartInput): Promise { diff --git a/apps/renderer/src/components/ChatView.tsx b/apps/renderer/src/components/ChatView.tsx index 38c2bc784783c99d35ac7c9de299d5a8b7f65698..444cf8c881a3a513b4e600741c606794025249d1 100644 --- a/apps/renderer/src/components/ChatView.tsx +++ b/apps/renderer/src/components/ChatView.tsx @@ -36,10 +36,10 @@ function statusLabel(phase: string): string { } function workToneClass(tone: "thinking" | "tool" | "info" | "error"): string { - if (tone === "thinking") return "text-sky-100"; - if (tone === "tool") return "text-emerald-100"; - if (tone === "error") return "text-rose-100"; - return "text-[#d8d8d8]"; + if (tone === "error") return "text-rose-300/50"; + if (tone === "tool") return "text-[#8a8a8a]"; + if (tone === "thinking") return "text-[#707070]"; + return "text-[#606060]"; } export default function ChatView() { @@ -341,53 +341,6 @@ export default function ChatView() { ) : (
- {isWorking && ( -
-
-
- - - - - Model is working -
- - {recentWorkLogEntries.length} event - {recentWorkLogEntries.length === 1 ? "" : "s"} - -
- {recentWorkLogEntries.length === 0 ? ( -

- Waiting for tool/preamble updates... -

- ) : ( -
- {recentWorkLogEntries.map((entry) => ( -
-
-

- {entry.label} -

- - {formatTimestamp(entry.createdAt)} - -
- {entry.detail && ( -

- {entry.detail} -

- )} -
- ))} -
- )} -
- )} {activeThread.messages.map((msg) => (
{msg.role === "user" ? ( @@ -433,6 +386,35 @@ export default function ChatView() { )}
))} + {/* Inline activity feed */} + {isWorking && ( +
+ {recentWorkLogEntries.map((entry) => ( +

+ {entry.detail ? ( + <> + {entry.label} + + {entry.detail} + + + ) : ( + entry.label + )} +

+ ))} +
+ + + + + +
+
+ )}
)} diff --git a/bun.lock b/bun.lock index 046e58cfcd5a9766804632d38defa3c672c273c3..c07bf700d845e7604ccdd254a1ec000722fd4cbb 100644 --- a/bun.lock +++ b/bun.lock @@ -42,6 +42,7 @@ "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", "@vitejs/plugin-react": "^4.3.4", + "babel-plugin-react-compiler": "^19.0.0-beta-e552027-20250112", "tailwindcss": "^4.0.0", "typescript": "^5.7.3", "vite": "^6.0.5", @@ -368,6 +369,8 @@ "axios": ["axios@1.13.4", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg=="], + "babel-plugin-react-compiler": ["babel-plugin-react-compiler@19.0.0-beta-ebf51a3-20250411", "", { "dependencies": { "@babel/types": "^7.26.0" } }, "sha512-q84bNR9JG1crykAlJUt5Ud0/5BUyMFuQww/mrwIQDFBaxsikqBDj3f/FNDsVd2iR26A1HvXKWPEIfgJDv8/V2g=="], + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],