From d8bf177af7e32aad0c1a33c6569604e77ea28fe5 Mon Sep 17 00:00:00 2001 From: can1357 Date: Sat, 27 Jun 2026 16:37:36 +0200 Subject: [PATCH] refactor(coding-agent/task): moved taskToolRenderer to separate module - Extracted taskToolRenderer to a dedicated renderer file to resolve circular dependencies. - Updated all references to the renderer to point to the new location. --- packages/coding-agent/src/task/render.ts | 8 +------- packages/coding-agent/src/task/renderer.ts | 14 ++++++++++++++ packages/coding-agent/src/tools/renderers.ts | 2 +- .../coding-agent/test/task/render-call.test.ts | 2 +- .../test/task/render-nested-live.test.ts | 2 +- .../test/task/render-yield-shape.test.ts | 2 +- .../test/task/task-progress-render.test.ts | 2 +- 7 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 packages/coding-agent/src/task/renderer.ts diff --git a/packages/coding-agent/src/task/render.ts b/packages/coding-agent/src/task/render.ts index 34f6b4435..3cd42f344 100644 --- a/packages/coding-agent/src/task/render.ts +++ b/packages/coding-agent/src/task/render.ts @@ -1685,13 +1685,7 @@ function renderNestedTaskTree( return lines; } -export const taskToolRenderer = { - renderCall, - renderResult, - mergeCallAndResult: true, -}; - -// Register after export to avoid circular dependency issues +// Register task tool subprocess handler subprocessToolRegistry.register("task", { extractData: event => { const details = event.result?.details; diff --git a/packages/coding-agent/src/task/renderer.ts b/packages/coding-agent/src/task/renderer.ts new file mode 100644 index 000000000..7506301d4 --- /dev/null +++ b/packages/coding-agent/src/task/renderer.ts @@ -0,0 +1,14 @@ +/** + * Task tool renderer export. + * + * Separated from render.ts to avoid circular dependency issues with + * tools/renderers.ts. This module has no side effects and can be safely + * imported without triggering the subprocessToolRegistry registration. + */ +import { renderCall, renderResult } from "./render"; + +export const taskToolRenderer = { + renderCall, + renderResult, + mergeCallAndResult: true, +} as const; diff --git a/packages/coding-agent/src/tools/renderers.ts b/packages/coding-agent/src/tools/renderers.ts index db308a3d8..cbcdf46e0 100644 --- a/packages/coding-agent/src/tools/renderers.ts +++ b/packages/coding-agent/src/tools/renderers.ts @@ -9,7 +9,7 @@ import type { RenderResultOptions } from "../extensibility/custom-tools/types"; import { goalToolRenderer } from "../goals/tools/goal-tool"; import { lspToolRenderer } from "../lsp/render"; import type { Theme } from "../modes/theme/theme"; -import { taskToolRenderer } from "../task/render"; +import { taskToolRenderer } from "../task/renderer"; import { webSearchToolRenderer } from "../web/search/render"; import { askToolRenderer } from "./ask"; import { astEditToolRenderer } from "./ast-edit"; diff --git a/packages/coding-agent/test/task/render-call.test.ts b/packages/coding-agent/test/task/render-call.test.ts index b0d05118c..c25c43198 100644 --- a/packages/coding-agent/test/task/render-call.test.ts +++ b/packages/coding-agent/test/task/render-call.test.ts @@ -2,7 +2,7 @@ import { afterAll, beforeAll, describe, expect, it } from "bun:test"; import { resetSettingsForTest, Settings } from "@oh-my-pi/pi-coding-agent/config/settings"; import { getThemeByName, setThemeInstance, type Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme"; import type { TaskParams } from "@oh-my-pi/pi-coding-agent/task"; -import { taskToolRenderer } from "@oh-my-pi/pi-coding-agent/task/render"; +import { taskToolRenderer } from "@oh-my-pi/pi-coding-agent/task/renderer"; describe("task renderer: streaming call preview", () => { let theme: Theme; diff --git a/packages/coding-agent/test/task/render-nested-live.test.ts b/packages/coding-agent/test/task/render-nested-live.test.ts index db1ad0c38..3ba5539a7 100644 --- a/packages/coding-agent/test/task/render-nested-live.test.ts +++ b/packages/coding-agent/test/task/render-nested-live.test.ts @@ -2,7 +2,7 @@ import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from "bun:te import { resetSettingsForTest, Settings } from "@oh-my-pi/pi-coding-agent/config/settings"; import { getThemeByName, setThemeInstance } from "@oh-my-pi/pi-coding-agent/modes/theme/theme"; import type { AgentProgress, SingleResult, TaskToolDetails } from "@oh-my-pi/pi-coding-agent/task"; -import { taskToolRenderer } from "@oh-my-pi/pi-coding-agent/task/render"; +import { taskToolRenderer } from "@oh-my-pi/pi-coding-agent/task/renderer"; import { formatDuration, formatNumber } from "@oh-my-pi/pi-utils"; describe("task renderer: nested live rendering", () => { diff --git a/packages/coding-agent/test/task/render-yield-shape.test.ts b/packages/coding-agent/test/task/render-yield-shape.test.ts index 0fdf19783..e3cc91af4 100644 --- a/packages/coding-agent/test/task/render-yield-shape.test.ts +++ b/packages/coding-agent/test/task/render-yield-shape.test.ts @@ -2,7 +2,7 @@ import { afterAll, beforeAll, describe, expect, it } from "bun:test"; import { resetSettingsForTest, Settings } from "@oh-my-pi/pi-coding-agent/config/settings"; import { getThemeByName, setThemeInstance } from "@oh-my-pi/pi-coding-agent/modes/theme/theme"; import type { AgentProgress, SingleResult, TaskToolDetails } from "@oh-my-pi/pi-coding-agent/task"; -import { taskToolRenderer } from "@oh-my-pi/pi-coding-agent/task/render"; +import { taskToolRenderer } from "@oh-my-pi/pi-coding-agent/task/renderer"; // Regression for #1987: when a subagent stores a non-array value in // `extractedToolData.yield`, the renderer cast it to `Array<{ data }>` and diff --git a/packages/coding-agent/test/task/task-progress-render.test.ts b/packages/coding-agent/test/task/task-progress-render.test.ts index 1a3c2a04d..7413e9991 100644 --- a/packages/coding-agent/test/task/task-progress-render.test.ts +++ b/packages/coding-agent/test/task/task-progress-render.test.ts @@ -3,7 +3,7 @@ import type { RenderResultOptions } from "@oh-my-pi/pi-agent-core"; import type { SettingPath, SettingValue } from "@oh-my-pi/pi-coding-agent/config/settings"; import { resetSettingsForTest, Settings } from "@oh-my-pi/pi-coding-agent/config/settings"; import { getThemeByName, setThemeInstance } from "@oh-my-pi/pi-coding-agent/modes/theme/theme"; -import { taskToolRenderer } from "@oh-my-pi/pi-coding-agent/task/render"; +import { taskToolRenderer } from "@oh-my-pi/pi-coding-agent/task/renderer"; import type { AgentProgress, SingleResult, TaskToolDetails } from "@oh-my-pi/pi-coding-agent/task/types"; function runningProgress(overrides: Partial = {}): AgentProgress {