• Mohamed Aziz Mejri's avatar
    Automatically read logs as tool-call (#2012) · 66421906
    Mohamed Aziz Mejri 提交于
    <!-- This is an auto-generated description by cubic. -->
    ---
    ## Summary by cubic
    Add a central log store and a new read_logs tool so the agent can fetch
    recent client, server, build-time, and network logs on demand, with a
    dyad-read-logs UI tag that shows progress and results in chat. This
    improves debugging by giving the agent a filtered snapshot of logs at
    the time of the call.
    
    - **New Features**
      - Central in-memory log store (per app, capped at 1000 entries).
    - PreviewIframe and runtime forward client, network, build-time, and
    server logs to the store via IPC; Supabase logs included.
    - New read_logs agent tool with filters: type, level, searchTerm, limit;
    returns a formatted snapshot and emits dyad-read-logs with results.
    - Added dyad-read-logs custom tag and DyadLogs component for collapsible
    output with pending/aborted indicators and result counts.
    - New IPC channels (add-log, clear-logs) whitelisted in preload, handled
    in main, and exposed via IpcClient.addLog and clearLogs.
      - E2E test for local agent validates filtered log reads.
    
    - **Bug Fixes**
    - Fixed missing forwarding of network-error logs from PreviewIframe to
    the central store.
    - Clear logs on app restart and deletion to prevent stale data and
    memory growth.
    
    <sup>Written for commit ab52f494158cea54f5e996349097abb597b1fd92.
    Summary will update on new commits.</sup>
    
    <!-- End of auto-generated description by cubic. -->
    
    <!-- greptile_comment -->
    
    <h3>Greptile Summary</h3>
    
    
    - Implements centralized log store and `read_logs` agent tool enabling
    AI to fetch console logs on demand for debugging with comprehensive
    filtering options (time window, log type, level, source name, search
    terms)
    - Integrates log collection from client console, network events, and
    server stdout/stderr through IPC channels, forwarding logs to main
    process store with 1000-entry circular buffer per app
    - Adds `dyad-read-logs` UI component for collapsible log display in chat
    with proper state management and visual indicators for
    pending/aborted/completed states
    
    <h3>Important Files Changed</h3>
    
    
    | Filename | Overview |
    |----------|----------|
    | `src/components/preview_panel/PreviewIframe.tsx` | Forwards client
    console and network events to central log store; network-error events
    missing `IpcClient.addLog()` call |
    | `src/pro/main/ipc/handlers/local_agent/tools/read_logs.ts` | New
    read_logs tool with comprehensive filtering, smart stack trace
    truncation, and direct log store access |
    | `src/ipc/handlers/app_handlers.ts` | Added server stdout/stderr to log
    store and registered add-log IPC handler; entry parameter uses `any`
    type instead of `ConsoleEntry` |
    | `src/lib/log_store.ts` | New central in-memory log store with circular
    buffer; duplicate `ConsoleEntry` type definition exists |
    
    <h3>Confidence score: 4/5</h3>
    
    
    - This PR requires attention before merging due to incomplete log
    forwarding that could impact debugging effectiveness
    - Score reduced due to missing network-error log forwarding in
    `PreviewIframe.tsx` lines 414-428, type safety issue in
    `app_handlers.ts` using `any` instead of proper typing, and duplicate
    type definitions that need consolidation
    - Pay close attention to
    `src/components/preview_panel/PreviewIframe.tsx` network-error handler
    and `src/ipc/handlers/app_handlers.ts` type definitions
    
    <h3>Sequence Diagram</h3>
    
    ```mermaid
    sequenceDiagram
        participant User as User
        participant IFrame as PreviewIframe<br/>(Client)
        participant IPC as IpcClient
        participant Main as app_handlers<br/>(Main Process)
        participant LogStore as LogStore
        participant Agent as read_logs tool
        participant UI as DyadReadLogs<br/>(Chat Component)
    
        Note over User,UI: Log Collection Flow
        
        User->>IFrame: "Triggers network/console event"
        IFrame->>IFrame: "Handles event (console-log, network-request, etc.)"
        IFrame->>IPC: "addLog(logEntry)"
        IPC->>Main: 'invoke("add-log", entry)'
        Main->>LogStore: "addLog(entry)"
        LogStore->>LogStore: "Store in Map<appId, ConsoleEntry[]>"
        
        Note over User,UI: Server Log Collection
        Main->>Main: "Process stdout/stderr from app"
        Main->>LogStore: "addLog(serverLogEntry)"
        
        Note over User,UI: Agent Tool Flow
        User->>Agent: "Agent executes read_logs tool"
        Agent->>LogStore: "getLogs(appId)"
        LogStore-->>Agent: "ConsoleEntry[]"
        Agent->>Agent: "Filter by time/type/level/search"
        Agent->>Agent: "Format logs for AI consumption"
        Agent-->>UI: '<dyad-read-logs> XML tag'
        UI->>UI: "Render collapsible log viewer"
    ```
    
    <!-- greptile_other_comments_section -->
    
    **Context used:**
    
    - Context from `dashboard` - .cursor/rules/ipc.mdc
    ([source](https://app.greptile.com/review/custom-context?memory=92de190d-1eac-4167-a0e4-35db6533fe3d))
    - Context from `dashboard` - AGENTS.md
    ([source](https://app.greptile.com/review/custom-context?memory=32c86e9e-6a00-48f2-ac32-69590e8d298c))
    
    <!-- /greptile_comment -->
    
    <!-- CURSOR_SUMMARY -->
    ---
    
    > [!NOTE]
    > Adds an in-memory, per-app log store and wires all major sources into
    it, enabling the agent to fetch filtered log snapshots and render them
    in chat.
    > 
    > - New central store `lib/log_store.ts` with
    `addLog`/`getLogs`/`clearLogs` and `ConsoleEntry` moved to
    `ipc/ipc_types.ts`
    > - IPC: preload whitelists `add-log` and `clear-logs`; main handlers in
    `app_handlers.ts`; renderer API via `IpcClient.addLog`/`clearLogs`
    > - Log producers now forward to store:
    > - `PreviewIframe.tsx`: client console, network request/response/error,
    runtime errors; also keeps UI atom in sync
    > - `useRunApp.ts`: build-time and client-error logs; restart clears
    logs via IPC
    >   - `app_handlers.ts`: server stdout/stderr appended to store
    >   - `useSupabase.ts`: edge function logs appended to store
    > - New agent tool `read_logs` (`pro/main/.../tools/read_logs.ts`) with
    filters (`type`, `level`, `searchTerm`, `limit`), formats results, and
    emits `<dyad-read-logs>` with counts
    > - Chat UI: `DyadLogs` component and parser updates to render
    collapsible results (`dyad-read-logs`)
    > - E2E: fixture and spec validate filtered log reads in local-agent
    mode
    > 
    > <sup>Written by [Cursor
    Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
    d77e209c269ad2de80e2c57ed0c8824a288244a2. This will update automatically
    on new commits. Configure
    [here](https://cursor.com/dashboard?tab=bugbot).</sup>
    <!-- /CURSOR_SUMMARY -->
    66421906
名称
最后提交
最后更新
..
AgentConsentBanner.tsx 正在载入提交数据...
AttachmentsList.tsx 正在载入提交数据...
AuxiliaryActionsMenu.tsx 正在载入提交数据...
ChatActivity.tsx 正在载入提交数据...
ChatError.tsx 正在载入提交数据...
ChatErrorBox.tsx 正在载入提交数据...
ChatHeader.tsx 正在载入提交数据...
ChatInput.tsx 正在载入提交数据...
ChatMessage.tsx 正在载入提交数据...
CodeHighlight.tsx 正在载入提交数据...
ContextLimitBanner.tsx 正在载入提交数据...
DeleteChatDialog.tsx 正在载入提交数据...
DragDropOverlay.tsx 正在载入提交数据...
DyadAddDependency.tsx 正在载入提交数据...
DyadAddIntegration.tsx 正在载入提交数据...
DyadCodeSearch.tsx 正在载入提交数据...
DyadCodeSearchResult.tsx 正在载入提交数据...
DyadCodebaseContext.tsx 正在载入提交数据...
DyadDatabaseSchema.tsx 正在载入提交数据...
DyadDelete.tsx 正在载入提交数据...
DyadEdit.tsx 正在载入提交数据...
DyadExecuteSql.tsx 正在载入提交数据...
DyadListFiles.tsx 正在载入提交数据...
DyadLogs.tsx 正在载入提交数据...
DyadMarkdownParser.tsx 正在载入提交数据...
DyadMcpToolCall.tsx 正在载入提交数据...
DyadMcpToolResult.tsx 正在载入提交数据...
DyadOutput.tsx 正在载入提交数据...
DyadProblemSummary.tsx 正在载入提交数据...
DyadRead.tsx 正在载入提交数据...
DyadRename.tsx 正在载入提交数据...
DyadSearchReplace.tsx 正在载入提交数据...
DyadThink.tsx 正在载入提交数据...
DyadTokenSavings.tsx 正在载入提交数据...
DyadWebCrawl.tsx 正在载入提交数据...
DyadWebSearch.tsx 正在载入提交数据...
DyadWebSearchResult.tsx 正在载入提交数据...
DyadWrite.tsx 正在载入提交数据...
FileAttachmentDropdown.tsx 正在载入提交数据...
FixAllErrorsButton.tsx 正在载入提交数据...
HomeChatInput.tsx 正在载入提交数据...
LexicalChatInput.tsx 正在载入提交数据...
MessagesList.tsx 正在载入提交数据...
PromoMessage.tsx 正在载入提交数据...
RenameChatDialog.tsx 正在载入提交数据...
SelectedComponentDisplay.tsx 正在载入提交数据...
SummarizeInNewChatButton.tsx 正在载入提交数据...
TokenBar.tsx 正在载入提交数据...
VersionPane.tsx 正在载入提交数据...
monaco.ts 正在载入提交数据...
stateTypes.ts 正在载入提交数据...
types.d.ts 正在载入提交数据...