@rallycry/conveyor-agent 8.12.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runner/task-audit-handler.ts","../src/runner/task-audit-parsing.ts","../src/runner/task-audit-prompts.ts","../src/runner/task-audit-progress.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { createHarness, defineTool } from \"../harness/index.js\";\nimport type { ProjectConnection } from \"../connection/project-connection.js\";\nimport type { TaskAuditRunnerRequest, TaskAuditPayload } from \"@project/shared\";\nimport { textResult } from \"../tools/helpers.js\";\nimport { createServiceLogger } from \"../utils/logger.js\";\nimport {\n type StepCombinedGradingResult,\n type StepHumanResult,\n type StepAnalysisResult,\n extractCombinedGradingResult,\n extractHumanResult,\n extractAnalysisResult,\n mergeStepResults,\n computeGradeCounts,\n addCosts,\n buildErrorResult,\n} from \"./task-audit-parsing.js\";\nimport {\n COMBINED_GRADING_SYSTEM_PROMPT,\n HUMAN_AUDIT_SYSTEM_PROMPT,\n ANALYSIS_SYSTEM_PROMPT,\n buildCombinedGradingPrompt,\n buildHumanAuditPrompt,\n buildAnalysisPrompt,\n} from \"./task-audit-prompts.js\";\nimport { reportProgress, collectResponseFromEvents } from \"./task-audit-progress.js\";\n\nconst logger = createServiceLogger(\"TaskAudit\");\n\nconst FALLBACK_MODEL = \"claude-sonnet-4-6\";\n\n// ── Suggestion MCP tool ─────────────────────────────────────────────────\n\nfunction buildTrackedSuggestionTool(\n connection: ProjectConnection,\n projectId: string,\n suggestionIds: string[],\n) {\n return defineTool(\n \"create_suggestion\",\n \"Suggest a cross-cutting improvement for the project based on patterns found during audit. If a similar suggestion exists, your vote is added instead of creating a duplicate.\",\n {\n title: z.string().describe(\"Short title for the suggestion\"),\n description: z\n .string()\n .optional()\n .describe(\n \"1-2 sentence description of what the project should change and why. Keep concise and task-agnostic.\",\n ),\n },\n async ({ title, description }) => {\n try {\n const result = await connection.call(\"createProjectSuggestion\", {\n projectId,\n title,\n description,\n });\n // Capture ID directly from the typed response object\n const id = result.mergedIntoId ?? result.id;\n if (id) {\n suggestionIds.push(id);\n logger.info(\"Suggestion tracked\", { id, merged: result.merged });\n }\n if (result.merged) {\n return textResult(`Merged into existing suggestion (ID: ${id}).`);\n }\n return textResult(`Suggestion created (ID: ${result.id}).`);\n } catch (error) {\n logger.warn(\"Suggestion creation failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return textResult(\n `Failed to create suggestion: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n );\n}\n\n// ── Fetch model ─────────────────────────────────────────────────────────\n\nasync function fetchModel(connection: ProjectConnection): Promise<string> {\n try {\n const config = await connection.call(\"getProjectFunctionConfig\", {\n projectId: connection.projectId,\n functionId: \"taskAudit\",\n });\n return config.model || FALLBACK_MODEL;\n } catch {\n // Fall back to legacy method for backward compatibility\n try {\n const ctx = await connection.call(\"getProjectAgentContextByRole\", {\n projectId: connection.projectId,\n role: \"reviewer\",\n });\n return ctx.model || FALLBACK_MODEL;\n } catch {\n return FALLBACK_MODEL;\n }\n }\n}\n\n// ── Step runners ────────────────────────────────────────────────────────\n\ninterface StepOptions {\n connection: ProjectConnection;\n requestId: string;\n projectDir: string;\n model: string;\n}\n\nfunction buildQueryOptions(\n systemPrompt: string,\n opts: StepOptions,\n limits: { maxTurns: number; maxBudgetUsd: number },\n mcpServers: Record<string, unknown> = {},\n) {\n return {\n model: opts.model,\n systemPrompt,\n cwd: opts.projectDir,\n permissionMode: \"bypassPermissions\" as const,\n allowDangerouslySkipPermissions: true,\n tools: { type: \"preset\" as const, preset: \"claude_code\" as const },\n mcpServers,\n maxTurns: limits.maxTurns,\n maxBudgetUsd: limits.maxBudgetUsd,\n disallowedTools: [\"Edit\", \"Write\", \"Bash\", \"NotebookEdit\", \"MultiEdit\"],\n };\n}\n\nasync function runCombinedGradingStep(\n taskId: string,\n userPrompt: string,\n limits: { maxTurns: number; maxBudgetUsd: number },\n opts: StepOptions,\n): Promise<{ result: StepCombinedGradingResult; costUsd: number | null; model: string | null }> {\n const harness = createHarness();\n const events = harness.executeQuery({\n prompt: userPrompt,\n options: buildQueryOptions(COMBINED_GRADING_SYSTEM_PROMPT, opts, limits),\n });\n const response = await collectResponseFromEvents(events, opts.connection, opts.requestId, taskId);\n if (!response.text) throw new Error(\"No response from combined grading step\");\n return {\n result: extractCombinedGradingResult(response.text),\n costUsd: response.costUsd,\n model: response.model,\n };\n}\n\nasync function runHumanStep(\n taskId: string,\n userPrompt: string,\n limits: { maxTurns: number; maxBudgetUsd: number },\n opts: StepOptions,\n): Promise<{ result: StepHumanResult; costUsd: number | null }> {\n const harness = createHarness();\n const events = harness.executeQuery({\n prompt: userPrompt,\n options: buildQueryOptions(HUMAN_AUDIT_SYSTEM_PROMPT, opts, limits),\n });\n const response = await collectResponseFromEvents(events, opts.connection, opts.requestId, taskId);\n if (!response.text) throw new Error(\"No response from human evaluation step\");\n return { result: extractHumanResult(response.text), costUsd: response.costUsd };\n}\n\nasync function runAnalysisStep(\n task: TaskAuditPayload,\n gradingResult: StepCombinedGradingResult | null,\n humanResult: StepHumanResult | null,\n projectId: string,\n suggestionIds: string[],\n opts: StepOptions,\n): Promise<{ result: StepAnalysisResult; costUsd: number | null }> {\n const wrappedTool = buildTrackedSuggestionTool(opts.connection, projectId, suggestionIds);\n const harness = createHarness();\n const mcpServer = harness.createMcpServer({ name: \"conveyor\", tools: [wrappedTool] });\n const events = harness.executeQuery({\n prompt: buildAnalysisPrompt(task, gradingResult, humanResult),\n options: buildQueryOptions(\n ANALYSIS_SYSTEM_PROMPT,\n opts,\n { maxTurns: 6, maxBudgetUsd: 1 },\n { conveyor: mcpServer },\n ),\n });\n const response = await collectResponseFromEvents(\n events,\n opts.connection,\n opts.requestId,\n task.taskId,\n );\n if (!response.text) throw new Error(\"No response from analysis step\");\n return { result: extractAnalysisResult(response.text), costUsd: response.costUsd };\n}\n\n// ── Safe step wrapper ──────────────────────────────────────────────────\n\ninterface StepOutput<T> {\n result: T | null;\n costUsd: number | null;\n model: string | null;\n}\n\nconst EMPTY_STEP: StepOutput<never> = { result: null, costUsd: null, model: null };\nconst GRADING_LIMITS = { maxTurns: 24, maxBudgetUsd: 3 };\n\nasync function executeStepSafely<T>(\n stepLabel: string,\n requestId: string,\n taskId: string,\n fn: () => Promise<{ result: T; costUsd: number | null; model?: string | null }>,\n): Promise<StepOutput<T>> {\n try {\n const step = await fn();\n return { result: step.result, costUsd: step.costUsd, model: step.model ?? null };\n } catch (err) {\n logger.warn(`${stepLabel} failed`, {\n requestId,\n taskId,\n error: err instanceof Error ? err.message : String(err),\n });\n return EMPTY_STEP;\n }\n}\n\n// ── Step orchestration ─────────────────────────────────────────────────\n\nasync function executeCombinedGradingStep(\n taskPayload: TaskAuditPayload,\n opts: StepOptions,\n): Promise<StepOutput<StepCombinedGradingResult>> {\n if (taskPayload.agentTrace.length === 0) return EMPTY_STEP;\n reportProgress(\n opts.connection,\n opts.requestId,\n taskPayload.taskId,\n \"status\",\n \"Step 1/3: Auditing full workflow...\",\n );\n return await executeStepSafely(\"Combined grading audit\", opts.requestId, taskPayload.taskId, () =>\n runCombinedGradingStep(\n taskPayload.taskId,\n buildCombinedGradingPrompt(taskPayload),\n GRADING_LIMITS,\n opts,\n ),\n );\n}\n\nasync function executeHumanStep(\n taskPayload: TaskAuditPayload,\n opts: StepOptions,\n): Promise<StepOutput<StepHumanResult>> {\n if (taskPayload.humanMessages.length === 0) return EMPTY_STEP;\n reportProgress(\n opts.connection,\n opts.requestId,\n taskPayload.taskId,\n \"status\",\n \"Step 2/3: Auditing human contributions...\",\n );\n return await executeStepSafely(\"Human audit\", opts.requestId, taskPayload.taskId, () =>\n runHumanStep(\n taskPayload.taskId,\n buildHumanAuditPrompt(taskPayload),\n { maxTurns: 6, maxBudgetUsd: 0.5 },\n opts,\n ),\n );\n}\n\nasync function executeAnalysisStep(\n taskPayload: TaskAuditPayload,\n grading: StepOutput<StepCombinedGradingResult>,\n human: StepOutput<StepHumanResult>,\n projectId: string,\n suggestionIds: string[],\n opts: StepOptions,\n): Promise<StepOutput<StepAnalysisResult>> {\n reportProgress(\n opts.connection,\n opts.requestId,\n taskPayload.taskId,\n \"status\",\n \"Step 3/3: Generating analysis & suggestions...\",\n );\n return await executeStepSafely(\"Analysis\", opts.requestId, taskPayload.taskId, () =>\n runAnalysisStep(taskPayload, grading.result, human.result, projectId, suggestionIds, opts),\n );\n}\n\n// ── Result reporting ───────────────────────────────────────────────────\n\nasync function reportAuditResult(\n connection: ProjectConnection,\n requestId: string,\n taskPayload: TaskAuditPayload,\n steps: {\n grading: StepOutput<StepCombinedGradingResult>;\n human: StepOutput<StepHumanResult>;\n analysis: StepOutput<StepAnalysisResult>;\n },\n suggestionIds: string[],\n): Promise<void> {\n let totalCostUsd: number | null = null;\n for (const step of [steps.grading, steps.human, steps.analysis])\n totalCostUsd = addCosts(totalCostUsd, step.costUsd);\n\n const merged = mergeStepResults(steps.grading.result, steps.human.result, steps.analysis.result);\n\n await connection.call(\"reportTaskAuditResult\", {\n projectId: connection.projectId,\n requestId,\n taskId: taskPayload.taskId,\n summary: merged.summary,\n turnGrades: merged.turnGrades,\n planningAccuracy: merged.planningAccuracy,\n buildingAccuracy: merged.buildingAccuracy,\n humanAccuracy: merged.humanAccuracy,\n humanEvaluations: merged.humanEvaluations,\n ...computeGradeCounts(merged.turnGrades),\n suggestionIds,\n auditCostUsd: totalCostUsd,\n model: steps.grading.model ?? null,\n });\n}\n\n// ── Per-task audit execution ────────────────────────────────────────────\n\nasync function auditSingleTask(\n taskPayload: TaskAuditPayload,\n request: TaskAuditRunnerRequest,\n connection: ProjectConnection,\n projectDir: string,\n model: string,\n): Promise<void> {\n const { requestId, projectId } = request;\n const suggestionIds: string[] = [];\n const opts: StepOptions = { connection, requestId, projectDir, model };\n\n const grading = await executeCombinedGradingStep(taskPayload, opts);\n\n if (!grading.result && taskPayload.agentTrace.length > 0) {\n throw new Error(\"Grading audit step failed\");\n }\n\n const human = await executeHumanStep(taskPayload, opts);\n const analysis = await executeAnalysisStep(\n taskPayload,\n grading,\n human,\n projectId,\n suggestionIds,\n opts,\n );\n\n await reportAuditResult(\n connection,\n requestId,\n taskPayload,\n { grading, human, analysis },\n suggestionIds,\n );\n logger.info(\"Task audit complete\", {\n requestId,\n taskId: taskPayload.taskId,\n suggestions: suggestionIds.length,\n });\n}\n\n// ── Main handler ────────────────────────────────────────────────────────\n\nexport async function handleTaskAudit(\n request: TaskAuditRunnerRequest,\n connection: ProjectConnection,\n projectDir: string,\n): Promise<void> {\n const { requestId } = request;\n\n logger.info(\"Starting task audit\", { requestId, taskCount: request.tasks.length });\n\n const model = await fetchModel(connection);\n\n for (const taskPayload of request.tasks) {\n try {\n await auditSingleTask(taskPayload, request, connection, projectDir, model);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(\"Task audit failed for task\", {\n requestId,\n taskId: taskPayload.taskId,\n error: msg,\n });\n await connection\n .call(\n \"reportTaskAuditResult\",\n buildErrorResult(connection.projectId, requestId, taskPayload.taskId, msg),\n )\n .catch(() => {});\n }\n }\n\n await connection\n .call(\"reportTaskAuditBatchComplete\", { projectId: connection.projectId, requestId })\n .catch(() => {});\n}\n","import type {\n TaskAuditTurnGrade,\n TaskAuditHumanEvaluation,\n TaskAuditPayload,\n TaskAuditPhase,\n} from \"@project/shared\";\n\n// ── Types ──────────────────────────────────────────────────────────────\n\nexport interface AuditJsonResult {\n turnGrades: TaskAuditTurnGrade[];\n summary: string;\n planningAccuracy: number | null;\n buildingAccuracy: number | null;\n humanAccuracy: number | null;\n humanEvaluations: TaskAuditHumanEvaluation[];\n macroEvaluation?: MacroEvaluation | null;\n}\n\nexport interface MacroEvaluation {\n instructionsQuality?: string;\n modelSuitability?: string;\n contextAndPlanning?: string;\n overallResult?: string;\n}\n\n// ── Step-specific result types ────────────────────────────────────────\n\n/** Output from Steps 1 (Planning) and 2 (Building) — grading a trace slice */\nexport interface StepGradingResult {\n turnGrades: TaskAuditTurnGrade[];\n summary: string;\n accuracy: number | null;\n}\n\n/** Output from the combined grading step — holistic assessment of full workflow */\nexport interface StepCombinedGradingResult {\n turnGrades: TaskAuditTurnGrade[];\n summary: string;\n planningAccuracy: number | null;\n buildingAccuracy: number | null;\n}\n\n/** Output from Step 3 (Human) — evaluating human messages */\nexport interface StepHumanResult {\n humanEvaluations: TaskAuditHumanEvaluation[];\n summary: string;\n humanAccuracy: number | null;\n}\n\n/** Output from Step 4 (Analysis) — macro evaluation */\nexport interface StepAnalysisResult {\n summary: string;\n macroEvaluation: MacroEvaluation | null;\n}\n\n/** Merged result from all 4 steps, ready for reportTaskAuditResult */\nexport interface MergedAuditResult {\n turnGrades: TaskAuditTurnGrade[];\n summary: string;\n planningAccuracy: number | null;\n buildingAccuracy: number | null;\n humanAccuracy: number | null;\n humanEvaluations: TaskAuditHumanEvaluation[];\n macroEvaluation: MacroEvaluation | null;\n}\n\n// ── Formatting helpers ─────────────────────────────────────────────────\n\nfunction formatMacroEvaluation(macro: Record<string, unknown> | null | undefined): string | null {\n if (!macro) return null;\n const lines: string[] = [];\n if (macro.instructionsQuality) lines.push(`- Instructions Quality: ${macro.instructionsQuality}`);\n if (macro.modelSuitability) lines.push(`- Model Suitability: ${macro.modelSuitability}`);\n if (macro.contextAndPlanning) lines.push(`- Context & Planning: ${macro.contextAndPlanning}`);\n if (macro.overallResult) lines.push(`- Overall Result: ${macro.overallResult}`);\n return lines.length > 0 ? lines.join(\"\\n\") : null;\n}\n\nfunction formatHumanEvaluations(evals: TaskAuditHumanEvaluation[]): string | null {\n if (evals.length === 0) return null;\n const total = evals.reduce((sum, e) => sum + e.rating, 0);\n const avg = total / evals.length;\n const label = avg > 0.3 ? \"Helpful\" : avg < -0.3 ? \"Unhelpful\" : \"Neutral\";\n const lines = [\n `- Overall: ${label} (avg ${avg.toFixed(2)}, ${evals.length} message${evals.length === 1 ? \"\" : \"s\"})`,\n ];\n for (const e of evals) {\n const ratingLabel = e.rating > 0 ? \"helpful\" : e.rating < 0 ? \"unhelpful\" : \"neutral\";\n lines.push(` - Message ${e.messageIndex}: ${ratingLabel} — ${e.reasoning}`);\n }\n return lines.join(\"\\n\");\n}\n\n// ── JSON parsing ───────────────────────────────────────────────────────\n\nfunction toAuditResult(parsed: Record<string, unknown>): AuditJsonResult | null {\n if (!parsed || !Array.isArray(parsed.turnGrades)) return null;\n\n const macro = parsed.macroEvaluation as Record<string, unknown> | null | undefined;\n const rawHumanEvals = Array.isArray(parsed.humanEvaluations)\n ? (parsed.humanEvaluations as TaskAuditHumanEvaluation[])\n : [];\n const baseSummary = (parsed.summary as string) ?? \"\";\n\n const macroText = formatMacroEvaluation(macro);\n const humanEvalText = formatHumanEvaluations(rawHumanEvals);\n\n let summary = baseSummary;\n if (macroText) summary += `\\n\\n---\\n\\nMacro Evaluation:\\n${macroText}`;\n if (humanEvalText) summary += `\\n\\n---\\n\\nHuman Contributions:\\n${humanEvalText}`;\n\n return {\n turnGrades: parsed.turnGrades as TaskAuditTurnGrade[],\n summary,\n planningAccuracy: (parsed.planningAccuracy as number) ?? null,\n buildingAccuracy: (parsed.buildingAccuracy as number) ?? null,\n humanAccuracy: (parsed.humanAccuracy as number) ?? null,\n humanEvaluations: rawHumanEvals,\n macroEvaluation: macro\n ? {\n instructionsQuality: (macro.instructionsQuality as string) ?? undefined,\n modelSuitability: (macro.modelSuitability as string) ?? undefined,\n contextAndPlanning: (macro.contextAndPlanning as string) ?? undefined,\n overallResult: (macro.overallResult as string) ?? undefined,\n }\n : null,\n };\n}\n\nexport function extractJsonFromResponse(text: string): AuditJsonResult {\n const codeBlockMatch = text.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)```/);\n const jsonStr = codeBlockMatch ? codeBlockMatch[1].trim() : text;\n\n try {\n const result = toAuditResult(JSON.parse(jsonStr));\n if (result) return result;\n } catch {\n // Try fallback: find a JSON object in raw text\n }\n\n const objectMatch = text.match(/\\{[\\s\\S]*\"turnGrades\"[\\s\\S]*\\}/);\n if (objectMatch) {\n try {\n const result = toAuditResult(JSON.parse(objectMatch[0]));\n if (result) return result;\n } catch {\n // Fall through\n }\n }\n\n throw new Error(\"Could not parse task audit grades from Claude response\");\n}\n\n// ── Grade counting ─────────────────────────────────────────────────────\n\nexport function computeGradeCounts(turnGrades: TaskAuditTurnGrade[]) {\n const counts = {\n planningCorrect: 0,\n planningNeutral: 0,\n planningBlunder: 0,\n buildingCorrect: 0,\n buildingNeutral: 0,\n buildingBlunder: 0,\n humanCorrect: 0,\n humanNeutral: 0,\n humanBlunder: 0,\n };\n\n for (const tg of turnGrades) {\n const key =\n `${tg.phase}${tg.grade.charAt(0).toUpperCase()}${tg.grade.slice(1)}` as keyof typeof counts;\n if (key in counts) {\n counts[key]++;\n }\n }\n\n return counts;\n}\n\n// ── Cost helpers ──────────────────────────────────────────────────────\n\nexport function addCosts(base: number | null, addition: number | null): number | null {\n if (base === null) return addition;\n if (addition === null) return base;\n return base + addition;\n}\n\n// ── Error result builder ──────────────────────────────────────────────\n\nexport function buildErrorResult(\n projectId: string,\n requestId: string,\n taskId: string,\n error: string,\n) {\n return {\n projectId,\n requestId,\n taskId,\n summary: \"\",\n turnGrades: [] as TaskAuditTurnGrade[],\n planningAccuracy: null,\n buildingAccuracy: null,\n humanAccuracy: null,\n planningCorrect: 0,\n planningNeutral: 0,\n planningBlunder: 0,\n buildingCorrect: 0,\n buildingNeutral: 0,\n buildingBlunder: 0,\n humanCorrect: 0,\n humanNeutral: 0,\n humanBlunder: 0,\n suggestionIds: [] as string[],\n auditCostUsd: null,\n model: null,\n error,\n };\n}\n\n// ── Step-specific JSON extraction ─────────────────────────────────────\n\nfunction extractJsonBlock(text: string): Record<string, unknown> {\n const codeBlockMatch = text.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)```/);\n const jsonStr = codeBlockMatch ? codeBlockMatch[1].trim() : text;\n\n try {\n const parsed = JSON.parse(jsonStr);\n if (parsed && typeof parsed === \"object\") return parsed as Record<string, unknown>;\n } catch {\n // Fallback: find a JSON object in raw text\n }\n\n const objectMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (objectMatch) {\n try {\n const parsed = JSON.parse(objectMatch[0]);\n if (parsed && typeof parsed === \"object\") return parsed as Record<string, unknown>;\n } catch {\n // Fall through\n }\n }\n\n throw new Error(\"Could not parse JSON from Claude response\");\n}\n\n/**\n * Extract grading result from Steps 1 (Planning) or 2 (Building).\n * The phase is hardcoded by the caller, not determined by the LLM.\n */\nexport function extractGradingResult(text: string, phase: TaskAuditPhase): StepGradingResult {\n const parsed = extractJsonBlock(text);\n const turnGrades = Array.isArray(parsed.turnGrades)\n ? (parsed.turnGrades as TaskAuditTurnGrade[]).map((tg) => ({ ...tg, phase }))\n : [];\n const summary = (parsed.summary as string) ?? \"\";\n const accuracy = typeof parsed.accuracy === \"number\" ? parsed.accuracy : null;\n return { turnGrades, summary, accuracy };\n}\n\nconst VALID_GRADING_PHASES = new Set<TaskAuditPhase>([\"planning\", \"building\"]);\n\n/**\n * Extract combined grading result from the holistic audit step.\n * The LLM labels each turn with phase: \"planning\" | \"building\".\n * Falls back to \"building\" if phase is missing or invalid.\n */\nexport function extractCombinedGradingResult(text: string): StepCombinedGradingResult {\n const parsed = extractJsonBlock(text);\n const turnGrades = Array.isArray(parsed.turnGrades)\n ? (parsed.turnGrades as TaskAuditTurnGrade[]).map((tg) => ({\n ...tg,\n phase: VALID_GRADING_PHASES.has(tg.phase as TaskAuditPhase)\n ? (tg.phase as TaskAuditPhase)\n : (\"building\" as const),\n }))\n : [];\n const summary = (parsed.summary as string) ?? \"\";\n const planningAccuracy =\n typeof parsed.planningAccuracy === \"number\" ? parsed.planningAccuracy : null;\n const buildingAccuracy =\n typeof parsed.buildingAccuracy === \"number\" ? parsed.buildingAccuracy : null;\n return { turnGrades, summary, planningAccuracy, buildingAccuracy };\n}\n\n/**\n * Extract human evaluation result from Step 3.\n */\nexport function extractHumanResult(text: string): StepHumanResult {\n const parsed = extractJsonBlock(text);\n const humanEvaluations = Array.isArray(parsed.humanEvaluations)\n ? (parsed.humanEvaluations as TaskAuditHumanEvaluation[])\n : [];\n const summary = (parsed.summary as string) ?? \"\";\n const humanAccuracy = typeof parsed.humanAccuracy === \"number\" ? parsed.humanAccuracy : null;\n return { humanEvaluations, summary, humanAccuracy };\n}\n\n/**\n * Extract analysis result from Step 4.\n */\nexport function extractAnalysisResult(text: string): StepAnalysisResult {\n const parsed = extractJsonBlock(text);\n const summary = (parsed.summary as string) ?? \"\";\n const macro = parsed.macroEvaluation as Record<string, unknown> | null | undefined;\n return {\n summary,\n macroEvaluation: macro\n ? {\n instructionsQuality: (macro.instructionsQuality as string) ?? undefined,\n modelSuitability: (macro.modelSuitability as string) ?? undefined,\n contextAndPlanning: (macro.contextAndPlanning as string) ?? undefined,\n overallResult: (macro.overallResult as string) ?? undefined,\n }\n : null,\n };\n}\n\n/** Build a combined summary from all step results with optional macro/human sections. */\nfunction buildMergedSummary(\n gradingResult: StepCombinedGradingResult | null,\n humanResult: StepHumanResult | null,\n analysisResult: StepAnalysisResult | null,\n): string {\n const summaryParts: string[] = [];\n if (analysisResult?.summary) {\n summaryParts.push(analysisResult.summary);\n } else {\n if (gradingResult?.summary) summaryParts.push(gradingResult.summary);\n if (humanResult?.summary) summaryParts.push(`Human: ${humanResult.summary}`);\n }\n\n const macroText = analysisResult?.macroEvaluation\n ? formatMacroEvaluation(analysisResult.macroEvaluation as Record<string, unknown>)\n : null;\n const humanEvalText = humanResult ? formatHumanEvaluations(humanResult.humanEvaluations) : null;\n\n let summary = summaryParts.join(\"\\n\\n\");\n if (macroText) summary += `\\n\\n---\\n\\nMacro Evaluation:\\n${macroText}`;\n if (humanEvalText) summary += `\\n\\n---\\n\\nHuman Contributions:\\n${humanEvalText}`;\n return summary;\n}\n\n/**\n * Merge results from all 3 steps into a single result ready for reporting.\n * Turn indices are global (no offset needed since the combined step grades the full trace).\n */\nexport function mergeStepResults(\n gradingResult: StepCombinedGradingResult | null,\n humanResult: StepHumanResult | null,\n analysisResult: StepAnalysisResult | null,\n): MergedAuditResult {\n const agentGrades = gradingResult?.turnGrades ?? [];\n const humanGrades: TaskAuditTurnGrade[] = (humanResult?.humanEvaluations ?? []).map((e) => ({\n turnIndex: e.messageIndex,\n phase: \"human\" as const,\n grade:\n e.rating > 0\n ? (\"correct\" as const)\n : e.rating < 0\n ? (\"blunder\" as const)\n : (\"neutral\" as const),\n reasoning: e.reasoning,\n eventType: \"human_message\",\n eventSummary: `Message ${e.messageIndex}`,\n }));\n\n return {\n turnGrades: [...agentGrades, ...humanGrades],\n summary: buildMergedSummary(gradingResult, humanResult, analysisResult),\n planningAccuracy: gradingResult?.planningAccuracy ?? null,\n buildingAccuracy: gradingResult?.buildingAccuracy ?? null,\n humanAccuracy: humanResult?.humanAccuracy ?? null,\n humanEvaluations: humanResult?.humanEvaluations ?? [],\n macroEvaluation: analysisResult?.macroEvaluation ?? null,\n };\n}\n\n// ── Suggestion prompt builder ─────────────────────────────────────────\n\nexport function buildSuggestionPrompt(parsed: AuditJsonResult, task: TaskAuditPayload): string {\n const parts: string[] = [`# Suggestion Generation for: ${task.taskTitle}\\n`];\n\n parts.push(`## Audit Summary\\n${parsed.summary}\\n`);\n\n if (parsed.macroEvaluation) {\n parts.push(\"## Macro Evaluation\");\n if (parsed.macroEvaluation.instructionsQuality)\n parts.push(`- Instructions Quality: ${parsed.macroEvaluation.instructionsQuality}`);\n if (parsed.macroEvaluation.modelSuitability)\n parts.push(`- Model Suitability: ${parsed.macroEvaluation.modelSuitability}`);\n if (parsed.macroEvaluation.contextAndPlanning)\n parts.push(`- Context & Planning: ${parsed.macroEvaluation.contextAndPlanning}`);\n if (parsed.macroEvaluation.overallResult)\n parts.push(`- Overall Result: ${parsed.macroEvaluation.overallResult}`);\n parts.push(\"\");\n }\n\n const blunders = parsed.turnGrades.filter((tg) => tg.grade === \"blunder\");\n if (blunders.length > 0) {\n parts.push(\"## Notable Blunders\");\n for (const b of blunders.slice(0, 10)) {\n parts.push(`- Turn ${b.turnIndex} (${b.phase}): ${b.reasoning}`);\n }\n parts.push(\"\");\n }\n\n parts.push(\n \"Based on the findings above, call create_suggestion for each actionable cross-cutting improvement.\",\n );\n\n return parts.join(\"\\n\");\n}\n","import type { TaskAuditPayload } from \"@project/shared\";\nimport type { StepHumanResult, StepCombinedGradingResult } from \"./task-audit-parsing.js\";\n\n// ── System prompts (4 focused steps) ────────────────────────────────────\n\nexport const PLANNING_AUDIT_SYSTEM_PROMPT = `You are a chess-style analysis engine grading the PLANNING phase of an AI agent's task execution. You receive only the planning portion of the agent's trace — from the start through the last plan update. Grade each turn objectively.\n\n## Grading Scale\n\n- **Correct** (♟): Sound moves toward understanding the task — reading relevant files, analyzing requirements, logical reasoning about approach, following project patterns\n- **Neutral** (·): No significant positive or negative effect — exploratory reads, minor tangents\n- **Blunder** (??): Wasted effort — reading irrelevant files repeatedly, ignoring requirements, spending many turns without making progress toward a plan\n\n## Specific Blunder Examples\n- Reading the same file 5+ times without advancing understanding\n- Ignoring explicit task requirements or project conventions visible in the code\n- Spending many turns on tangential investigation not related to the task\n- Failing to read key files that are obvious from the task description\n\n## Specific Correct Examples\n- Reading context files before implementation\n- Analyzing requirements and dependencies systematically\n- Identifying relevant code patterns to follow\n- Building understanding incrementally\n\n## Output Format\n\nOutput a JSON block:\n\n\\`\\`\\`json\n{\n \"turnGrades\": [\n {\n \"turnIndex\": 0,\n \"grade\": \"correct\",\n \"reasoning\": \"Read relevant config files to understand project structure\",\n \"eventType\": \"tool_use\",\n \"eventSummary\": \"Read package.json and tsconfig.json\"\n }\n ],\n \"summary\": \"Brief 2-3 sentence assessment of planning quality\",\n \"accuracy\": 0.85\n}\n\\`\\`\\`\n\n**Accuracy Calculation**: accuracy = correct / (correct + blunder). Neutral turns are excluded. Return null if no correct or blunder turns exist.\n\nIMPORTANT: Do NOT include a \"phase\" field in turnGrades — the phase is set programmatically. Only include turnIndex, grade, reasoning, eventType, and eventSummary.`;\n\nexport const BUILDING_AUDIT_SYSTEM_PROMPT = `You are a chess-style analysis engine grading the BUILDING phase of an AI agent's task execution. You receive only the building portion of the agent's trace — from after the plan was finalized through pull request creation. Grade each turn objectively.\n\n## Grading Scale\n\n- **Correct** (♟): Sound implementation moves — proper edits, running tests, fixing errors, following plan steps, adapting to feedback\n- **Neutral** (·): No significant positive or negative effect — exploratory reads during implementation, minor tangents\n- **Blunder** (??): Wasted effort — incorrect edits immediately reverted, repeated failures without adapting, ignoring the plan, using wrong APIs despite visible patterns\n\n## Specific Blunder Examples\n- Making edits that are immediately reverted or overwritten\n- Ignoring explicit plan steps or user corrections\n- Repeated failed tool calls (isError: true) without changing approach\n- Using wrong APIs despite project patterns visible in the trace\n- Spending many turns on tangential work not in the plan\n\n**Multi-session awareness**: If the trace begins with exploration (reads/greps) before any edits, and there is no prior planning trace, these likely represent the agent re-orienting in a new session. Grade initial orientation reads as neutral unless clearly wasteful (e.g., reading the same file 5+ times).\n\n## Specific Correct Examples\n- Following plan steps in logical sequence\n- Proper error handling and recovery after tool failures\n- Adapting approach based on test results or errors\n- Efficient tool usage with clear purpose\n- Running tests to verify changes\n\n## Output Format\n\nOutput a JSON block:\n\n\\`\\`\\`json\n{\n \"turnGrades\": [\n {\n \"turnIndex\": 0,\n \"grade\": \"correct\",\n \"reasoning\": \"Implemented the required changes following the plan\",\n \"eventType\": \"tool_use\",\n \"eventSummary\": \"Edit src/component.tsx\"\n }\n ],\n \"summary\": \"Brief 2-3 sentence assessment of building quality\",\n \"accuracy\": 0.72\n}\n\\`\\`\\`\n\n**Accuracy Calculation**: accuracy = correct / (correct + blunder). Neutral turns are excluded. Return null if no correct or blunder turns exist.\n\nIMPORTANT: Turn indices are 0-based relative to the trace slice provided. Do NOT include a \"phase\" field — the phase is set programmatically. Only include turnIndex, grade, reasoning, eventType, and eventSummary.`;\n\nexport const COMBINED_GRADING_SYSTEM_PROMPT = `You are a chess-style analysis engine performing a holistic audit of an AI agent's full task execution — from initial planning through final implementation. You receive the complete agent trace covering all phases and sessions. Grade each turn objectively.\n\n## Phase Identification\n\nIdentify the boundary between planning and building phases:\n- **Planning phase**: Turns from the start through the last \\`update_task_plan\\` (plan save) call. Includes reading requirements, exploring code, analyzing dependencies, and formulating the plan.\n- **Building phase**: Turns after the last plan save through PR creation (or end of trace). Includes implementation, testing, and PR creation.\n- If no \\`update_task_plan\\` call is found, treat all turns as building phase.\n\nYou MUST label each turn with \\`\"phase\": \"planning\"\\` or \\`\"phase\": \"building\"\\`.\n\n## Multi-Session Awareness\n\nThe trace may contain multiple agent sessions (indicated by \\`session_manifest\\` events). Grade ALL sessions — earlier sessions often contain valuable planning work or reflect restart patterns worth evaluating. If an earlier session was abandoned, grade its turns based on quality (exploration reads may be neutral, repeated failures may be blunders).\n\n## Grading Scale\n\n### Planning Turns\n- **Correct** (♟): Sound moves toward understanding the task — reading relevant files, analyzing requirements, logical reasoning about approach, following project patterns\n- **Neutral** (·): No significant positive or negative effect — exploratory reads, minor tangents\n- **Blunder** (??): Wasted effort — reading irrelevant files repeatedly, ignoring requirements, spending many turns without making progress toward a plan\n\n### Building Turns\n- **Correct** (♟): Sound implementation moves — proper edits, running tests, fixing errors, following plan steps, adapting to feedback\n- **Neutral** (·): No significant positive or negative effect — exploratory reads during implementation, minor tangents\n- **Blunder** (??): Wasted effort — incorrect edits immediately reverted, repeated failures without adapting, ignoring the plan, using wrong APIs despite visible patterns\n\n## Output Format\n\nOutput a JSON block:\n\n\\`\\`\\`json\n{\n \"turnGrades\": [\n {\n \"turnIndex\": 0,\n \"phase\": \"planning\",\n \"grade\": \"correct\",\n \"reasoning\": \"Read relevant config files to understand project structure\",\n \"eventType\": \"tool_use\",\n \"eventSummary\": \"Read package.json and tsconfig.json\"\n }\n ],\n \"summary\": \"Brief 2-3 sentence holistic assessment of the full execution\",\n \"planningAccuracy\": 0.85,\n \"buildingAccuracy\": 0.72\n}\n\\`\\`\\`\n\n**Accuracy Calculation**: For each phase separately: accuracy = correct / (correct + blunder). Neutral turns are excluded. Return null for a phase if it has no correct or blunder turns.\n\nTurn indices are 0-based relative to the full trace provided. Every turn grade MUST include the phase field.`;\n\nexport const HUMAN_AUDIT_SYSTEM_PROMPT = `You are evaluating human contributions to an AI agent's task execution. For each human message, assess whether it helped, hindered, or had no effect on the agent's work.\n\n## Rating Scale\n\n- **Helpful (+1)**: Provided useful context, clear corrections, actionable feedback, or unblocked the agent\n- **Neutral (0)**: Acknowledgements, status checks, or messages with no material impact on execution\n- **Unhelpful (-1)**: Contradictory instructions, incorrect guidance, unnecessary interruptions, or vague requests that caused wasted effort\n\n## Output Format\n\nOutput a JSON block:\n\n\\`\\`\\`json\n{\n \"humanEvaluations\": [\n {\n \"messageIndex\": 0,\n \"rating\": 1,\n \"reasoning\": \"Provided clear context about the bug with reproduction steps\"\n }\n ],\n \"summary\": \"Brief 2-3 sentence assessment of human contributions\",\n \"humanAccuracy\": 0.75\n}\n\\`\\`\\`\n\n**humanAccuracy Calculation**: humanAccuracy = helpful / (helpful + unhelpful). Neutral messages are excluded. Return null if no helpful or unhelpful messages exist.\n\nEvaluate EVERY human message — do not skip any. Each entry in humanEvaluations must have a messageIndex (0-based index into the Human Messages list), rating (+1, 0, or -1), and reasoning.`;\n\nexport const ANALYSIS_SYSTEM_PROMPT = `You are performing a macro-level analysis of an AI agent's task execution and generating improvement suggestions. You receive grading results from planning, building, and human evaluation phases.\n\n## Your Tasks\n\n1. **Write an overall summary** (2-4 sentences) that synthesizes the planning, building, and human evaluation findings into a cohesive assessment.\n\n2. **Perform a macro evaluation** addressing:\n - **Instructions Quality**: Were the agent instructions appropriate? Too vague, too prescriptive, or missing critical guidance?\n - **Model Suitability**: Was the model choice appropriate for the complexity of this task?\n - **Context & Planning**: Was the plan/context sufficient? Were there information gaps that caused wasted effort?\n - **Overall Result**: Did the final result meet requirements? Was the outcome proportional to effort?\n\n3. **Generate suggestions** using the create_suggestion tool. Focus on:\n - Recurring patterns of wasted effort that could be prevented\n - Missing documentation or context that caused confusion\n - Process improvements to prevent common blunders\n - What worked well that should be replicated\n\nSuggestion guidelines:\n- Keep titles short and actionable (e.g. \"Add error handling docs for payment service\")\n- Keep descriptions to 1-2 sentences max — what should change and why\n- Be project-focused: describe what the PROJECT should change, not what happened in this task\n- Never reference specific task details, agent behavior, accuracy scores, or execution phases\n- If this task revealed a general project improvement, frame it as a standalone recommendation anyone could understand without task context\n\nYou MUST call create_suggestion at least once. If the execution was flawless, suggest what made it work well so the pattern can be replicated.\n\n## Output Format\n\nAfter calling create_suggestion, output a JSON block:\n\n\\`\\`\\`json\n{\n \"summary\": \"Overall 2-4 sentence assessment synthesizing all phases\",\n \"macroEvaluation\": {\n \"instructionsQuality\": \"Brief assessment of instruction quality\",\n \"modelSuitability\": \"Brief assessment of model choice\",\n \"contextAndPlanning\": \"Brief assessment of context and planning\",\n \"overallResult\": \"Brief assessment of the outcome\"\n }\n}\n\\`\\`\\``;\n\n// ── Prompt section builders ─────────────────────────────────────────────\n\nfunction buildSessionInfoSection(info: NonNullable<TaskAuditPayload[\"sessionInfo\"]>): string {\n const lines: string[] = [\"## Session Info\"];\n if (info.model) lines.push(`- Model: ${info.model}`);\n if (info.totalCostUsd !== null) lines.push(`- Total Cost: $${info.totalCostUsd.toFixed(4)}`);\n if (info.planningTurns !== null) lines.push(`- Planning Turns: ${info.planningTurns}`);\n if (info.buildingTurns !== null) lines.push(`- Building Turns: ${info.buildingTurns}`);\n if (info.locDiff !== null) lines.push(`- Lines Changed: ${info.locDiff}`);\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction buildTraceSection(trace: TaskAuditPayload[\"agentTrace\"]): string {\n const lines: string[] = [\"## Agent Trace\\n\"];\n if (trace.length === 0) {\n lines.push(\"No agent trace data available.\\n\");\n } else {\n for (let i = 0; i < trace.length; i++) {\n const event = trace[i];\n const dataStr = JSON.stringify(event.data);\n const truncated = dataStr.length > 2000 ? dataStr.slice(0, 2000) + \"...\" : dataStr;\n lines.push(`### Turn ${i} [${event.type}] @ ${event.timestamp}`);\n lines.push(truncated);\n lines.push(\"\");\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction buildTaskContextSection(task: TaskAuditPayload): string {\n const parts: string[] = [];\n if (task.taskDescription) parts.push(`## Description\\n${task.taskDescription}\\n`);\n if (task.taskPlan) parts.push(`## Plan\\n${task.taskPlan}\\n`);\n parts.push(`## Task Status: ${task.taskStatus}`);\n if (task.storyPointValue !== null) parts.push(`## Story Points: ${task.storyPointValue}`);\n parts.push(\"\");\n if (task.sessionInfo) parts.push(buildSessionInfoSection(task.sessionInfo));\n if (task.agentInstructions) parts.push(`## Agent Instructions\\n${task.agentInstructions}\\n`);\n return parts.join(\"\\n\");\n}\n\n// ── Step-specific prompt builders ──────────────────────────────────────\n\nfunction buildMultiSessionNote(task: TaskAuditPayload): string | null {\n const count = task.sessionInfo?.sessionCount;\n if (!count || count <= 1) return null;\n return `> **Note:** This task had ${count} total agent sessions. All sessions are included in the trace below.\\n`;\n}\n\nexport function buildCombinedGradingPrompt(task: TaskAuditPayload): string {\n const parts: string[] = [`# Full Workflow Audit: ${task.taskTitle}\\n`];\n const sessionNote = buildMultiSessionNote(task);\n if (sessionNote) parts.push(sessionNote);\n parts.push(buildTaskContextSection(task));\n parts.push(buildTraceSection(task.agentTrace));\n parts.push(\n \"Grade each turn above with its phase (planning or building), then output the structured JSON result.\",\n );\n return parts.join(\"\\n\");\n}\n\nexport function buildPlanningAuditPrompt(\n task: TaskAuditPayload,\n planningTrace: TaskAuditPayload[\"agentTrace\"],\n): string {\n const parts: string[] = [`# Planning Audit: ${task.taskTitle}\\n`];\n const sessionNote = buildMultiSessionNote(task);\n if (sessionNote) parts.push(sessionNote);\n parts.push(buildTaskContextSection(task));\n parts.push(buildTraceSection(planningTrace));\n parts.push(\"Grade each turn above, then output the structured JSON result.\");\n return parts.join(\"\\n\");\n}\n\nexport function buildBuildingAuditPrompt(\n task: TaskAuditPayload,\n buildingTrace: TaskAuditPayload[\"agentTrace\"],\n): string {\n const parts: string[] = [`# Building Audit: ${task.taskTitle}\\n`];\n const sessionNote = buildMultiSessionNote(task);\n if (sessionNote) parts.push(sessionNote);\n parts.push(buildTaskContextSection(task));\n parts.push(buildTraceSection(buildingTrace));\n parts.push(\"Grade each turn above, then output the structured JSON result.\");\n return parts.join(\"\\n\");\n}\n\nexport function buildHumanAuditPrompt(task: TaskAuditPayload): string {\n const parts: string[] = [`# Human Contribution Evaluation: ${task.taskTitle}\\n`];\n if (task.taskDescription) parts.push(`## Description\\n${task.taskDescription}\\n`);\n if (task.taskPlan) parts.push(`## Plan\\n${task.taskPlan}\\n`);\n parts.push(`## Task Status: ${task.taskStatus}\\n`);\n\n parts.push(\"## Human Messages\\n\");\n for (let i = 0; i < task.humanMessages.length; i++) {\n const msg = task.humanMessages[i];\n parts.push(`### Message ${i} [${msg.createdAt}]`);\n parts.push(`**${msg.role}**: ${msg.content}\\n`);\n }\n\n parts.push(\"Evaluate each human message above, then output the structured JSON result.\");\n return parts.join(\"\\n\");\n}\n\nfunction buildPhaseResultSection(\n label: string,\n grades: import(\"@project/shared\").TaskAuditTurnGrade[],\n accuracy: number | null,\n summary: string,\n): string {\n const correct = grades.filter((g) => g.grade === \"correct\").length;\n const neutral = grades.filter((g) => g.grade === \"neutral\").length;\n const blunder = grades.filter((g) => g.grade === \"blunder\").length;\n const accuracyStr = accuracy === null ? \"N/A\" : accuracy.toFixed(2);\n return [\n `## ${label} Phase Results`,\n `- Summary: ${summary}`,\n `- Accuracy: ${accuracyStr}`,\n `- ${grades.length} turns: ${correct} correct, ${neutral} neutral, ${blunder} blunders`,\n \"\",\n ].join(\"\\n\");\n}\n\nexport function buildAnalysisPrompt(\n task: TaskAuditPayload,\n gradingResult: StepCombinedGradingResult | null,\n humanResult: StepHumanResult | null,\n): string {\n const parts: string[] = [`# Task Analysis: ${task.taskTitle}\\n`];\n\n if (task.taskDescription) parts.push(`## Description\\n${task.taskDescription}\\n`);\n if (task.taskPlan) parts.push(`## Plan\\n${task.taskPlan}\\n`);\n parts.push(`## Task Status: ${task.taskStatus}`);\n if (task.storyPointValue !== null) parts.push(`## Story Points: ${task.storyPointValue}`);\n parts.push(\"\");\n if (task.sessionInfo) parts.push(buildSessionInfoSection(task.sessionInfo));\n\n if (gradingResult) {\n const planGrades = gradingResult.turnGrades.filter((g) => g.phase === \"planning\");\n const buildGrades = gradingResult.turnGrades.filter((g) => g.phase === \"building\");\n if (planGrades.length > 0) {\n parts.push(\n buildPhaseResultSection(\n \"Planning\",\n planGrades,\n gradingResult.planningAccuracy,\n gradingResult.summary,\n ),\n );\n }\n if (buildGrades.length > 0) {\n parts.push(\n buildPhaseResultSection(\n \"Building\",\n buildGrades,\n gradingResult.buildingAccuracy,\n gradingResult.summary,\n ),\n );\n }\n }\n\n if (humanResult) {\n const evals = humanResult.humanEvaluations;\n const helpful = evals.filter((e) => e.rating > 0).length;\n const neutralCount = evals.filter((e) => e.rating === 0).length;\n const unhelpful = evals.filter((e) => e.rating < 0).length;\n parts.push(\"## Human Evaluation Results\");\n parts.push(`- Summary: ${humanResult.summary}`);\n parts.push(\n `- ${evals.length} messages: ${helpful} helpful, ${neutralCount} neutral, ${unhelpful} unhelpful`,\n );\n parts.push(\"\");\n }\n\n const blunders = (gradingResult?.turnGrades ?? []).filter((g) => g.grade === \"blunder\");\n if (blunders.length > 0) {\n parts.push(\"## Notable Blunders\");\n for (const b of blunders.slice(0, 10)) {\n parts.push(`- Turn ${b.turnIndex} (${b.phase}): ${b.reasoning}`);\n }\n parts.push(\"\");\n }\n\n parts.push(\n \"Based on the findings above, call create_suggestion for each actionable improvement, then output the JSON result.\",\n );\n\n return parts.join(\"\\n\");\n}\n","import type { ProjectConnection } from \"../connection/project-connection.js\";\n\n// ── Progress reporting ────────────────────────────────────────────────\n\nexport function reportProgress(\n connection: ProjectConnection,\n requestId: string,\n taskId: string,\n tool: string,\n input?: string,\n): void {\n void connection\n .call(\"reportTaskAuditProgress\", {\n projectId: connection.projectId,\n requestId,\n taskId,\n activity: { tool, input, timestamp: new Date().toISOString() },\n })\n .catch(() => {});\n}\n\n// ── Event stream collection ───────────────────────────────────────────\n\ninterface ProgressContext {\n connection: ProjectConnection;\n requestId: string;\n taskId: string;\n}\n\nfunction processAssistantBlocks(\n blocks: Array<{ type: string; text?: string; name?: string; input?: unknown }>,\n responseParts: string[],\n ctx: ProgressContext,\n reportedFirstText: { value: boolean },\n): void {\n for (const block of blocks) {\n if (block.type === \"text\" && block.text) {\n responseParts.push(block.text);\n if (reportedFirstText.value) continue;\n reportedFirstText.value = true;\n reportProgress(\n ctx.connection,\n ctx.requestId,\n ctx.taskId,\n \"thinking\",\n block.text.slice(0, 200),\n );\n } else if (block.type === \"tool_use\" && block.name) {\n const inputStr = typeof block.input === \"string\" ? block.input : JSON.stringify(block.input);\n reportProgress(ctx.connection, ctx.requestId, ctx.taskId, block.name, inputStr.slice(0, 500));\n }\n }\n}\n\nexport async function collectResponseFromEvents(\n events: AsyncIterable<{ type: string }>,\n connection: ProjectConnection,\n requestId: string,\n taskId: string,\n): Promise<{ text: string; costUsd: number | null; model: string | null }> {\n const responseParts: string[] = [];\n let costUsd: number | null = null;\n let model: string | null = null;\n const reportedFirstText = { value: false };\n const ctx: ProgressContext = { connection, requestId, taskId };\n\n for await (const event of events) {\n if (event.type === \"system\") {\n const sysEvent = event as { type: string; subtype?: string; model?: string };\n if (sysEvent.subtype === \"init\" && sysEvent.model) {\n model = sysEvent.model;\n reportProgress(\n connection,\n requestId,\n taskId,\n \"system\",\n `Initialized model: ${sysEvent.model}`,\n );\n }\n }\n\n if (event.type === \"assistant\") {\n const { message } = event as {\n type: string;\n message: {\n content: Array<{ type: string; text?: string; name?: string; input?: unknown }>;\n };\n };\n processAssistantBlocks(message.content, responseParts, ctx, reportedFirstText);\n }\n\n if (event.type === \"result\") {\n const resultEvent = event as { type: string; subtype?: string; total_cost_usd?: number };\n if (resultEvent.subtype === \"success\" && resultEvent.total_cost_usd !== undefined) {\n costUsd = resultEvent.total_cost_usd;\n }\n const status =\n resultEvent.subtype === \"success\" ? \"success\" : `error: ${resultEvent.subtype}`;\n reportProgress(connection, requestId, taskId, \"complete\", status);\n break;\n }\n }\n\n return { text: responseParts.join(\"\\n\\n\").trim(), costUsd, model };\n}\n"],"mappings":"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","names":[]}