diff --git a/workflows/solve-issue/lib/spawn-utils.ts b/workflows/solve-issue/lib/spawn-utils.ts deleted file mode 100644 index c196c1b..0000000 --- a/workflows/solve-issue/lib/spawn-utils.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { SpawnError } from "@uncaged/nerve-workflow-utils"; - -export function formatSpawnFailure(error: SpawnError): string { - if (error.kind === "spawn_failed") { - return `spawn_failed: ${error.message}`; - } - if (error.kind === "timeout") { - return `timeout: stdout=${error.stdout.slice(0, 200)} stderr=${error.stderr.slice(0, 200)}`; - } - return `non_zero_exit(${error.exitCode}): stderr=${error.stderr.slice(0, 400)}`; -} diff --git a/workflows/solve-issue/roles/plan/index.ts b/workflows/solve-issue/roles/plan/index.ts index 4b6d4ce..5010330 100644 --- a/workflows/solve-issue/roles/plan/index.ts +++ b/workflows/solve-issue/roles/plan/index.ts @@ -1,10 +1,9 @@ import type { Role, RoleResult, StartStep, WorkflowMessage } from "@uncaged/nerve-core"; -import { cursorAgent, isDryRun, llmExtract } from "@uncaged/nerve-workflow-utils"; import type { LlmProvider } from "@uncaged/nerve-workflow-utils"; +import { createCursorRole } from "@uncaged/nerve-workflow-utils"; import { z } from "zod"; import { resolveRepoCwd } from "../../lib/repo-context.js"; import { threadIdFromStart } from "../../lib/start-meta.js"; -import { formatSpawnFailure } from "../../lib/spawn-utils.js"; import { buildPlanPrompt } from "./prompt.js"; export const planMetaSchema = z.object({ @@ -27,38 +26,24 @@ export function buildPlanRole({ provider, nerveRoot }: BuildPlanDeps): Role({ + cwd, mode: "ask", model: "auto", - cwd, - env: null, + env: {}, timeoutMs: 300_000, - dryRun: dry, + prompt: async () => buildPlanPrompt({ threadId: threadIdFromStart(start), nerveRoot }), + extract: { provider, schema: planMetaSchema }, }); - if (!run.ok) { + try { + return await runRole(start, messages); + } catch (e) { + const msg = e instanceof Error ? e.message : String(e); return { - content: `plan cursor-agent failed: ${formatSpawnFailure(run.error)}`, + content: `plan failed: ${msg}`, meta: { ready: false }, }; } - - const metaR = await llmExtract({ - text: run.value, - schema: planMetaSchema, - provider, - dryRun: dry, - }); - if (!metaR.ok) { - return { - content: `${run.value}\n\n[meta extract failed]`, - meta: { ready: false }, - }; - } - - return { content: run.value, meta: metaR.value }; }; }