From faf2f65c2e2a6809b62e14e41939172fad6818a1 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Thu, 22 Oct 2026 18:32:10 +0800 Subject: [PATCH 1/2] fix(research): read saved findings from original Goal sources Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- apps/presentation/dashboard/src/data/chat.ts | 3 +- .../goal-explore-results.tsx | 4 +- .../evidence/source-findings/desktop.png | Bin 0 -> 113747 bytes .../evidence/source-findings/mobile.png | Bin 0 -> 52612 bytes .../research-history.mjs | 28 +++++ loopx/control_plane/status/goal_source.py | 19 +++ loopx/presentation/explore_results_api.py | 46 +++++--- loopx/presentation/runtime_workspace.py | 12 +- tests/presentation/test_explore_history.py | 6 + tests/presentation/test_goal_source.py | 6 + .../presentation/test_linked_goal_sources.py | 111 +++++++++++++++++- tests/presentation/test_runtime_workspace.py | 7 +- tests/test_chat_explore_results.py | 51 ++++---- 13 files changed, 242 insertions(+), 51 deletions(-) create mode 100644 examples/personal-workspace-browser/evidence/source-findings/desktop.png create mode 100644 examples/personal-workspace-browser/evidence/source-findings/mobile.png diff --git a/apps/presentation/dashboard/src/data/chat.ts b/apps/presentation/dashboard/src/data/chat.ts index 57b13fc2ff..205e3edcf2 100644 --- a/apps/presentation/dashboard/src/data/chat.ts +++ b/apps/presentation/dashboard/src/data/chat.ts @@ -2668,6 +2668,7 @@ const exploreResultPageSchema = z.object({ node_id: z.string(), question: z.string(), scope: z.string(), agent_id: z.string(), evidence_refs: z.array(z.string()), last_updated_at: z.string(), measurements: z.unknown().transform(normalizeExploreMeasurements).optional(), + linked_todos_available: z.boolean().optional(), linked_todos: z.array(z.object({ todo_id: z.string(), text: z.string(), status: z.string(), claimed_by: z.string(), })), @@ -2675,7 +2676,7 @@ const exploreResultPageSchema = z.object({ }); export type ExploreResultPage = z.infer; export async function fetchExploreResults(goalId: string, cursor?: string, readSourceUrl?: string) { - const query = new URLSearchParams({goal_id: goalId, ...(cursor ? {cursor} : {})}); + const query = new URLSearchParams({goal_id: goalId, view: "findings", ...(cursor ? {cursor} : {})}); const page = exploreResultPageSchema.parse(await requestJson(sourceReadApiUrl(readSourceUrl, `/api/chat/explore-results?${query}`))); if (page.goal_id !== goalId) throw new Error("Explore result Goal mismatch"); return page; diff --git a/apps/presentation/dashboard/src/features/personal-workspace/goal-explore-results.tsx b/apps/presentation/dashboard/src/features/personal-workspace/goal-explore-results.tsx index e55a22465f..2ddbe099f7 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/goal-explore-results.tsx +++ b/apps/presentation/dashboard/src/features/personal-workspace/goal-explore-results.tsx @@ -78,8 +78,8 @@ export function GoalExploreResults({goalId, zh, active = true, readSourceUrl}: {
{zh ? "记录标识" : "Record identifiers"}
{selected.finding_id} · {selected.node_id}
{sections ?
{zh ? "完整原文" : "Full original text"}

{selected.summary}

: null} -
{zh ? "关联任务" : "Linked tasks"} · {selected.linked_todos.length} - {selected.linked_todos.length ?