Просмотр исходного кода

Add diagnostic logging command for reasoning replay

darknessomi 1 месяц назад
Родитель
Сommit
f029e63bf8

+ 6 - 0
src-tauri/src/lib.rs

@@ -21,6 +21,11 @@ fn log_error(message: String, stack: String, component_stack: String) {
     }
 }
 
+#[tauri::command]
+fn log_diagnostic(message: String) {
+    eprintln!("[frontend-diagnostic] message: {}", message);
+}
+
 pub fn run() {
     tauri::Builder::default()
         .plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| {
@@ -122,6 +127,7 @@ pub fn run() {
             commands::writing_wake_lock::release_writing_wake_lock,
             set_proxy_env,
             log_error,
+            log_diagnostic,
         ])
         .on_window_event(|window, event| {
             if let tauri::WindowEvent::CloseRequested { api, .. } = event {

+ 6 - 0
src-tauri/src/main.rs

@@ -23,6 +23,11 @@ fn log_error(message: String, stack: String, component_stack: String) {
     }
 }
 
+#[tauri::command]
+fn log_diagnostic(message: String) {
+    eprintln!("[frontend-diagnostic] message: {}", message);
+}
+
 fn main() {
     tauri::Builder::default()
         .plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| {
@@ -124,6 +129,7 @@ fn main() {
             commands::writing_wake_lock::release_writing_wake_lock,
             set_proxy_env,
             log_error,
+            log_diagnostic,
         ])
         .on_window_event(|window, event| {
             if let tauri::WindowEvent::CloseRequested { api, .. } = event {

+ 30 - 1
src/lib/reasoning-replay-debug.spec.ts

@@ -1,10 +1,22 @@
-import { describe, expect, it } from "vitest"
+import { afterEach, describe, expect, it, vi } from "vitest"
+
+const invokeMock = vi.hoisted(() => vi.fn().mockResolvedValue(undefined))
+
+vi.mock("@tauri-apps/api/core", () => ({ invoke: invokeMock }))
+vi.mock("./platform", () => ({ isTauri: () => true }))
+
 import {
   formatReasoningReplayRiskForError,
   isReasoningContentRequiredError,
+  logReasoningReplay,
   summarizeReasoningReplayRisk,
 } from "./reasoning-replay-debug"
 
+afterEach(() => {
+  invokeMock.mockClear()
+  vi.restoreAllMocks()
+})
+
 describe("reasoning replay debug", () => {
   it("detects the DeepSeek/Kimi reasoning_content 400 message", () => {
     expect(isReasoningContentRequiredError(
@@ -42,4 +54,21 @@ describe("reasoning replay debug", () => {
     expect(formatReasoningReplayRiskForError(summary)).toContain("missing=1")
     expect(formatReasoningReplayRiskForError(summary)).toContain("reasoning=MISSING")
   })
+
+  it("forwards collection diagnostics without using the frontend error channel", async () => {
+    vi.spyOn(console, "warn").mockImplementation(() => {})
+
+    logReasoningReplay("stream.collected", {
+      model: "deepseek/deepseek-v4-flash",
+      contentCharsEmitted: 499,
+      reasoningCharsObserved: 469,
+    })
+
+    await vi.waitFor(() => {
+      expect(invokeMock).toHaveBeenCalledWith("log_diagnostic", {
+        message: expect.stringContaining("[reasoning-replay] stream.collected"),
+      })
+    })
+    expect(invokeMock).not.toHaveBeenCalledWith("log_error", expect.anything())
+  })
 })

+ 1 - 3
src/lib/reasoning-replay-debug.ts

@@ -70,10 +70,8 @@ export function probeReasoningMessages(messages: ChatMessage[]): ReasoningMessag
 function emitToTauriTerminal(line: string): void {
   if (!isTauri()) return
   void import("@tauri-apps/api/core")
-    .then(({ invoke }) => invoke("log_error", {
+    .then(({ invoke }) => invoke("log_diagnostic", {
       message: line,
-      stack: "",
-      componentStack: "",
     }))
     .catch(() => {})
 }