@kernlang/agon 0.1.4 → 0.1.6

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.
Files changed (37) hide show
  1. package/dist/{chunk-FCCH7IPJ.js → chunk-3PDYVGRS.js} +107 -24
  2. package/dist/chunk-3PDYVGRS.js.map +1 -0
  3. package/dist/{chunk-ATUT2BUQ.js → chunk-6IF2AV4Y.js} +28 -10
  4. package/dist/chunk-6IF2AV4Y.js.map +1 -0
  5. package/dist/{chunk-4LVYSUMN.js → chunk-7WZ2O5WZ.js} +6 -27
  6. package/dist/chunk-7WZ2O5WZ.js.map +1 -0
  7. package/dist/{chunk-6ANHPXGZ.js → chunk-HSPQEDHX.js} +1 -1
  8. package/dist/{chunk-6ANHPXGZ.js.map → chunk-HSPQEDHX.js.map} +1 -1
  9. package/dist/{chunk-WE32YJKT.js → chunk-NBV37VMW.js} +2 -2
  10. package/dist/{chunk-WE32YJKT.js.map → chunk-NBV37VMW.js.map} +1 -1
  11. package/dist/{chunk-O6YP55RV.js → chunk-PUNBDLQO.js} +141 -96
  12. package/dist/chunk-PUNBDLQO.js.map +1 -0
  13. package/dist/{chunk-C22VTCS6.js → chunk-TMNHJOKU.js} +1193 -226
  14. package/dist/chunk-TMNHJOKU.js.map +1 -0
  15. package/dist/{chunk-5QMVQPHY.js → chunk-XWHC6VAH.js} +3 -2
  16. package/dist/chunk-XWHC6VAH.js.map +1 -0
  17. package/dist/{dispatch-6LQSMMGI.js → dispatch-S3CR5HKX.js} +2 -2
  18. package/dist/engines/codex.json +3 -0
  19. package/dist/{forge-ES4RN7YM.js → forge-GUOEJ5DJ.js} +6 -6
  20. package/dist/index.js +561 -128
  21. package/dist/index.js.map +1 -1
  22. package/dist/plan-mode-35BONR7S.js +17 -0
  23. package/dist/{src-WJGIOESS.js → src-3NWTITZM.js} +55 -3
  24. package/dist/{update-HHN4PJQI.js → update-H3LE4ZSI.js} +6 -6
  25. package/package.json +5 -4
  26. package/dist/chunk-4LVYSUMN.js.map +0 -1
  27. package/dist/chunk-5QMVQPHY.js.map +0 -1
  28. package/dist/chunk-ATUT2BUQ.js.map +0 -1
  29. package/dist/chunk-C22VTCS6.js.map +0 -1
  30. package/dist/chunk-FCCH7IPJ.js.map +0 -1
  31. package/dist/chunk-O6YP55RV.js.map +0 -1
  32. package/dist/plan-mode-4XRC2ZC7.js +0 -17
  33. /package/dist/{dispatch-6LQSMMGI.js.map → dispatch-S3CR5HKX.js.map} +0 -0
  34. /package/dist/{forge-ES4RN7YM.js.map → forge-GUOEJ5DJ.js.map} +0 -0
  35. /package/dist/{plan-mode-4XRC2ZC7.js.map → plan-mode-35BONR7S.js.map} +0 -0
  36. /package/dist/{src-WJGIOESS.js.map → src-3NWTITZM.js.map} +0 -0
  37. /package/dist/{update-HHN4PJQI.js.map → update-H3LE4ZSI.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/generated/handlers/forge.ts","../src/generated/cesar/judge.ts","../src/generated/models/session-results.ts","../src/generated/cesar/scoreboard.ts","../src/generated/cesar/checkpoint.ts","../src/telemetry/index.ts"],"sourcesContent":["// @generated by kern v3.5.7 — DO NOT EDIT. Source: src/kern/handlers/forge.kern\n\nimport { join } from 'node:path';\n\nimport { existsSync, mkdirSync, readFileSync } from 'node:fs';\n\nimport { execFileSync } from 'node:child_process';\n\nimport { ensureAgonHome, RUNS_DIR, createPlan, approvePlan, startPlan, mergeStepResult, cancelPlan, failPlan, savePlan, scanProjectContext, getActiveWorkspace, snapshotWorkspace, tracker, resolveWorkingDir, loadOrCreateActiveThread, applyPatchWithUndo, acquireApplyLock, releaseApplyLock, headChanged, branchChanged, headSha, currentBranch } from '@kernlang/agon-core';\n\nimport type { Plan, PlanStepInput, ApprovalLevel } from '@kernlang/agon-core';\n\nimport { runForge } from '@kernlang/agon-forge';\n\nimport { ENGINE_COLORS } from '../blocks/output-format.js';\n\nimport type { Dispatch, HandlerContext, EngineProgress } from '../../handlers/types.js';\n\nimport { cesarJudgeForge, cesarConvergeForge, cesarReviewForgeOutcome } from '../../handlers/cesar-brain.js';\n\nimport { sessionResultStore } from '../models/session-results.js';\n\nimport { createScoreboard, scoreboardStartEngine, scoreboardUpdateProgress, scoreboardFinishEngine, scoreboardFailEngine, renderScoreboard } from '../cesar/scoreboard.js';\n\nimport { buildCheckpoint, recordCheckpoint } from '../cesar/checkpoint.js';\n\nimport { recordRun, formatRunSummary } from '../../telemetry/index.js';\n\nimport { filterDefaultOrchestrationEngines } from './engine-filter.js';\n\n// @kern-source: forge:16\nfunction handleForgeEvent(event: any, plan: Plan, engineStatus: Record<string,string>, dispatch: Dispatch, ctx: HandlerContext): Plan {\n if (ctx.currentPlan?.state === 'cancelled') return plan;\n const id = event.engineId ?? '';\n\n switch (event.type) {\n case 'baseline:start':\n plan = mergeStepResult(plan, 'baseline', { state: 'running', attempts: [{ startedAt: new Date().toISOString() }] });\n break;\n case 'baseline:done':\n plan = mergeStepResult(plan, 'baseline', { state: 'completed' });\n if (event.data?.passes) {\n dispatch({ type: 'warning', message: 'Baseline passes — fitness may be non-discriminating. Add a failing regression test, use forge validate mode, or allow no-diff validation.' });\n }\n break;\n case 'stage1:dispatch':\n plan = mergeStepResult(plan, 'dispatch', { state: 'running', attempts: [{ startedAt: new Date().toISOString() }] });\n engineStatus[id] = 'building';\n break;\n case 'stage2:dispatch':\n engineStatus[id] = 'building';\n break;\n case 'engine:worktree': {\n if (id) {\n engineStatus[id] = 'building';\n const worktreePath = String(event.data?.worktreePath ?? '');\n if (worktreePath && engineStatus[`${id}:worktree`] !== worktreePath) {\n engineStatus[`${id}:worktree`] = worktreePath;\n dispatch({ type: 'info', message: `Forge worktree ${id}: ${worktreePath}` });\n }\n }\n break;\n }\n case 'engine:pid':\n dispatch({ type: 'engine-pid', engineId: id, pid: Number(event.data?.pid ?? 0), phase: event.data?.phase } as any);\n break;\n case 'engine:pid-clear':\n dispatch({ type: 'engine-pid-clear', engineId: id } as any);\n break;\n case 'engine:fallback':\n engineStatus[String(event.data?.to ?? '')] = 'fallback';\n dispatch({ type: 'warning', message: `${String(event.data?.from ?? id)} failed during ${String(event.data?.phase ?? 'forge')} — retrying on ${String(event.data?.to ?? 'fallback')}` });\n break;\n case 'engine:failed': {\n engineStatus[id] = 'failed';\n engineStatus[`${id}:score`] = '0';\n const errMsg = String(event.data?.error ?? 'failed');\n engineStatus[`${id}:error`] = errMsg;\n const snippet = errMsg.length > 120 ? errMsg.slice(0, 120) + '…' : errMsg;\n dispatch({ type: 'warning', message: `${id} failed: ${snippet}` });\n dispatch({ type: 'engine-pid-clear', engineId: id } as any);\n break;\n }\n case 'stage1:accepted':\n engineStatus[id] = 'done';\n engineStatus[`${id}:score`] = String(event.data?.score ?? '?');\n break;\n case 'stage1:score':\n case 'stage2:score': {\n if (id) {\n const passed = event.data?.pass !== false;\n engineStatus[id] = passed ? 'done' : 'failed';\n engineStatus[`${id}:score`] = String(event.data?.score ?? '?');\n if (!passed) engineStatus[`${id}:error`] = Number(event.data?.score ?? 0) === 0 ? 'no candidate changes or fitness failed' : 'fitness failed';\n }\n const scoreStep = plan.steps.find((s: any) => s.id === 'score');\n if (scoreStep && scoreStep.result.state === 'pending') {\n plan = mergeStepResult(plan, 'score', { state: 'running', attempts: [{ startedAt: new Date().toISOString() }] });\n }\n break;\n }\n case 'winner:determined': {\n plan = mergeStepResult(plan, 'dispatch', { state: 'completed' });\n plan = mergeStepResult(plan, 'score', { state: 'completed' });\n plan = mergeStepResult(plan, 'winner', { state: 'completed' });\n if (event.data?.winner) {\n const winnerId = String(event.data.winner);\n engineStatus[winnerId] = 'done';\n engineStatus[`${winnerId}:score`] = String(event.data.bestScore ?? '?');\n engineStatus['__winner'] = winnerId;\n }\n break;\n }\n case 'forge:no-candidate-diff': {\n const count = Number(event.data?.count ?? 0);\n const toolLoopLimit = Number(event.data?.toolLoopLimit ?? 0);\n if (toolLoopLimit > 0) {\n dispatch({ type: 'warning', message: `Forge produced no candidate diff: ${toolLoopLimit}/${count} engine(s) hit the tool-loop limit before producing a patch.` });\n } else {\n dispatch({ type: 'warning', message: `Forge produced no candidate diff from ${count} engine(s).` });\n }\n break;\n }\n case 'synthesis:start': {\n plan = mergeStepResult(plan, 'synthesis', { state: 'running', attempts: [{ startedAt: new Date().toISOString() }] });\n const winnerId = id || engineStatus['__winner'] || '';\n if (winnerId) engineStatus[winnerId] = 'synthesizing';\n break;\n }\n case 'synthesis:done': {\n plan = mergeStepResult(plan, 'synthesis', { state: 'completed' });\n const winnerId = id || engineStatus['__winner'] || '';\n if (winnerId && engineStatus[winnerId] === 'synthesizing') engineStatus[winnerId] = 'done';\n break;\n }\n }\n ctx.setCurrentPlan(plan);\n return plan;\n}\n\n/**\n * Auto-apply a winning forge patch to the working tree, guarded against the shared-checkout hazard: a HEAD/branch compare-and-swap (refuse if another session moved the ground since this run started) and an advisory apply-lock (refuse if another apply is in flight here). Both refusals return false so the caller falls back to manual /apply — the patch is never lost.\n */\n// @kern-source: forge:126\nfunction applyForgePatchToWorkspace(winnerId: string, patchContent: string, dispatch: Dispatch, baseSha?: string|null, baseBranch?: string|null): boolean {\n if (!patchContent.trim()) {\n dispatch({ type: 'info', message: `Winner ${winnerId} produced an empty patch.` });\n return true;\n }\n const cwd = resolveWorkingDir();\n\n // HEAD-CAS: if HEAD/branch moved since this run started, another session\n // changed the ground under us — don't auto-apply to the wrong base.\n const movedHead = headChanged(cwd, baseSha ?? null);\n if (movedHead.changed) {\n dispatch({ type: 'warning', message: `HEAD moved (${(baseSha ?? '?').slice(0, 8)} → ${(movedHead.current ?? '?').slice(0, 8)}) since this run started — not auto-applying. Review with /apply.` });\n return false;\n }\n const movedBranch = branchChanged(cwd, baseBranch ?? null);\n if (movedBranch.changed) {\n dispatch({ type: 'warning', message: `Branch changed (${baseBranch} → ${movedBranch.current ?? '?'}) since this run started — not auto-applying. Review with /apply.` });\n return false;\n }\n\n // Advisory apply-lock: serialize concurrent applies in this checkout.\n const lock = acquireApplyLock(cwd, `forge-apply ${winnerId}`);\n if (!lock.acquired) {\n const who = lock.heldBy ? ` (pid ${lock.heldBy.pid}: ${lock.heldBy.action})` : '';\n dispatch({ type: 'warning', message: `Another apply is in progress in this checkout${who} — not auto-applying. Review with /apply once it finishes.` });\n return false;\n }\n try {\n const result = applyPatchWithUndo(cwd, patchContent);\n if (result.ok) {\n dispatch({ type: 'success', message: `Applied winner patch from ${winnerId}` });\n if (result.undoToken) dispatch({ type: 'info', message: 'Undo available: /undo' });\n return true;\n }\n dispatch({ type: 'warning', message: `Winner patch not applied automatically: ${result.error ?? 'unknown error'}` });\n return false;\n } finally {\n if (lock.sessionUUID) releaseApplyLock(cwd, lock.sessionUUID);\n }\n}\n\n/**\n * Parse Cesar's command-only fitness response. Accepts strict JSON first, then a plain one-line command.\n */\n// @kern-source: forge:169\nexport function extractFitnessCommandFromCesarOutput(output: string): string|null {\n let text = String(output ?? '').trim();\n if (!text) return null;\n text = text\n .replace(/^```(?:json|bash|sh)?\\s*/i, '')\n .replace(/\\s*```$/i, '')\n .trim();\n\n let candidate: string | null = null;\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n try {\n const parsed = JSON.parse(jsonMatch[0]);\n if (parsed && typeof parsed.fitnessCmd === 'string') candidate = parsed.fitnessCmd;\n else if (parsed && typeof parsed.command === 'string') candidate = parsed.command;\n } catch {\n // Fall back to plain command parsing below.\n }\n }\n if (!candidate) {\n candidate = text\n .split(/\\r?\\n/)\n .map((line: string) => line.trim())\n .find((line: string) => line.length > 0 && !/^(```|fitnessCmd\\s*:|command\\s*:)/i.test(line)) ?? null;\n }\n if (!candidate) return null;\n candidate = candidate.replace(/^`|`$/g, '').trim();\n candidate = candidate.replace(/^(fitnessCmd|command)\\s*:\\s*/i, '').trim();\n if (!candidate || candidate.length > 500 || /[\\r\\n\\0]/.test(candidate)) return null;\n return candidate;\n}\n\n// @kern-source: forge:203\nfunction extractGithubLiterals(text: string): string[] {\n return [...new Set((String(text ?? '').match(/(?:https?:\\/\\/)?github\\.com\\/[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+/g) ?? []).map((m: string) => m.replace(/^https?:\\/\\//, '').replace(/[).,;:'\"`\\]]+$/g, '')))];\n}\n\n/**\n * Keep literal GitHub repo URLs in Cesar-generated fitness commands aligned with the user's task. Prevents small hallucinated typos from making all engines optimize for the wrong marker.\n */\n// @kern-source: forge:205\nexport function repairFitnessCommandTaskLiterals(task: string, command: string): string {\n const taskUrls = extractGithubLiterals(task);\n if (taskUrls.length === 0) return command;\n const taskUrlSet = new Set(taskUrls);\n let repaired = command;\n for (const cmdUrl of extractGithubLiterals(command)) {\n if (taskUrlSet.has(cmdUrl)) continue;\n const cmdParts = cmdUrl.split('/');\n const replacement = taskUrls.length === 1\n ? taskUrls[0]\n : taskUrls.find((url: string) => {\n const parts = url.split('/');\n return parts[2]?.toLowerCase() === cmdParts[2]?.toLowerCase();\n });\n if (replacement) {\n repaired = repaired.split(cmdUrl).join(replacement);\n }\n }\n return repaired;\n}\n\n// @kern-source: forge:228\nexport function normalizeGithubRemoteLiteral(remote: string): string|null {\n const raw = String(remote ?? '').trim();\n if (!raw) {\n return null;\n }\n const cleaned = raw.replace(/\\.git$/, '');\n const ssh = cleaned.match(/^git@github\\.com:([^/]+)\\/(.+)$/);\n if (ssh) {\n return `github.com/${ssh[1]}/${ssh[2]}`;\n }\n const https = cleaned.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/(.+)$/);\n if (https) {\n return `github.com/${https[1]}/${https[2]}`;\n }\n return null;\n}\n\n// @kern-source: forge:242\nfunction detectGithubRemoteLiteral(cwd: string): string|null {\n try {\n const remote = execFileSync('git', ['remote', 'get-url', 'origin'], { cwd: cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }).trim();\n return normalizeGithubRemoteLiteral(remote);\n } catch (e) {\n return null;\n }\n}\n\n/**\n * For current-repository README/docs checks, prefer the actual git origin over stale chat examples or old repo names.\n */\n// @kern-source: forge:250\nexport function repairFitnessCommandRepositoryLiteral(command: string, repoLiteral: string|null): string {\n if (!repoLiteral) {\n return command;\n }\n let repaired = command;\n for (const cmdUrl of extractGithubLiterals(command)) {\n if (cmdUrl === repoLiteral) {\n continue;\n }\n repaired = repaired.split(cmdUrl).join(repoLiteral);\n }\n return repaired;\n}\n\n// @kern-source: forge:262\nfunction taskExplicitlyMentionsLiteral(task: string, literal: string): boolean {\n const taskLower = String(task ?? '').toLowerCase();\n const literalLower = String(literal ?? '').toLowerCase();\n if (!literalLower) {\n return false;\n }\n if (taskLower.includes(literalLower)) {\n return true;\n }\n const escaped = literalLower.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return new RegExp(`\\\\b(?:no|avoid|without|forbid|exclude|do not mention)\\\\s+${escaped}\\\\b`, 'i').test(taskLower);\n}\n\n/**\n * Decide whether a fitness command may assert a GitHub/repository URL. This is semantic intent, not literal echoing: public README/footer/link tasks can check the local git origin; normal local docs tasks should not.\n */\n// @kern-source: forge:273\nexport function taskWantsRepositoryLinkCheck(task: string): boolean {\n const t = String(task ?? '').toLowerCase();\n if (/github\\.com\\/[a-z0-9_.-]+\\/[a-z0-9_.-]+/i.test(t)) {\n return true;\n }\n return /\\b(?:github|repo(?:sitory)?\\s+(?:url|link)|project\\s+(?:url|link)|source\\s+(?:url|link)|footer\\s+(?:with|containing|link)|public\\s+(?:repo|repository|link|url))\\b/i.test(t);\n}\n\n/**\n * Remove forbidden literals that are local identity facts rather than internal details. Example: avoid KERN compilation must not become forbidden=['KERNlang'] when KERNlang is the GitHub owner.\n */\n// @kern-source: forge:281\nexport function repairOverbroadForbiddenLiterals(task: string, command: string, repoLiteral: string|null): string {\n const forbidden = extractFitnessStringArray(command, 'forbidden');\n if (forbidden.length === 0 || !repoLiteral) return command;\n const parts = repoLiteral.split('/');\n const protectedLiterals = new Set<string>();\n if (parts[1]) protectedLiterals.add(parts[1]);\n if (parts[2]) protectedLiterals.add(parts[2]);\n protectedLiterals.add(repoLiteral);\n protectedLiterals.add(`https://${repoLiteral}`);\n\n const kept = forbidden.filter((f: string) => {\n const isProtected = [...protectedLiterals].some((p: string) => p.toLowerCase() === f.toLowerCase());\n if (!isProtected) return true;\n return taskExplicitlyMentionsLiteral(task, f);\n });\n if (kept.length === forbidden.length) return command;\n\n const serialized = kept.map((v: string) => `'${v.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`).join(',');\n return command.replace(/forbidden\\s*=\\s*\\[[^\\]]*\\]/, `forbidden=[${serialized}]`);\n}\n\n// @kern-source: forge:304\nfunction extractFitnessStringArray(command: string, name: string): string[] {\n const re = new RegExp(`${name}\\\\s*=\\\\s*\\\\[([^\\\\]]*)\\\\]`);\n const match = String(command ?? '').match(re);\n if (!match) return [];\n const values: string[] = [];\n const body = match[1];\n const stringRe = /(['\"])((?:\\\\.|(?!\\1).)*)\\1/g;\n let m;\n while ((m = stringRe.exec(body)) !== null) {\n values.push(m[2].replace(/\\\\(['\"\\\\])/g, '$1'));\n }\n return values;\n}\n\n/**\n * Remove forbidden string literals that are required as part of another fitness assertion. Cesar sometimes requires github.com/KERNlang/agon and also forbids KERNlang, making the check impossible.\n */\n// @kern-source: forge:319\nexport function repairContradictoryFitnessLiterals(command: string): string {\n const required = extractFitnessStringArray(command, 'required');\n const forbidden = extractFitnessStringArray(command, 'forbidden');\n if (required.length === 0 || forbidden.length === 0) return command;\n\n const kept = forbidden.filter((f: string) => {\n const lower = f.toLowerCase();\n return !required.some((r: string) => {\n const req = r.toLowerCase();\n return req.includes(lower) || lower.includes(req);\n });\n });\n if (kept.length === forbidden.length) return command;\n\n const serialized = kept.map((v: string) => `'${v.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`).join(',');\n return command.replace(/forbidden\\s*=\\s*\\[[^\\]]*\\]/, `forbidden=[${serialized}]`);\n}\n\n/**\n * Reject Cesar-generated fitness checks that drift from task intent. Fitness may inspect local files and exact requested literals, but should not add GitHub/repo assertions unless the task semantically asks for a public repo link.\n */\n// @kern-source: forge:339\nexport function validateFitnessCommandIntent(task: string, command: string, repoLiteral: string|null): {ok:boolean,reason?:string} {\n const cmd = String(command ?? '');\n if (!cmd.trim()) {\n return { ok: false, reason: 'empty fitness command' };\n }\n const githubLiterals = extractGithubLiterals(cmd);\n if (githubLiterals.length > 0 && !taskWantsRepositoryLinkCheck(task)) {\n return { ok: false, reason: `fitness added repository URL check without repo-link intent: ${githubLiterals.join(', ')}` };\n }\n const required = extractFitnessStringArray(cmd, 'required');\n const forbidden = extractFitnessStringArray(cmd, 'forbidden');\n for (const r of required) {\n const req = r.toLowerCase();\n for (const f of forbidden) {\n const forb = f.toLowerCase();\n if (req.includes(forb) || forb.includes(req)) {\n return { ok: false, reason: `fitness requires and forbids overlapping literal \"${f}\"` };\n }\n }\n }\n if (repoLiteral) {\n const owner = repoLiteral.split('/')[1] ?? '';\n if (owner) {\n const overbroad = forbidden.find((f: string) => f.toLowerCase() === owner.toLowerCase() && !taskExplicitlyMentionsLiteral(task, f));\n if (overbroad) {\n return { ok: false, reason: `fitness forbids local repo identity \"${overbroad}\" without explicit task intent` };\n }\n }\n }\n return { ok: true };\n}\n\n/**\n * Normalize current-repository GitHub literals in a forge task before displaying the plan or sending the prompt to engines.\n */\n// @kern-source: forge:364\nexport function repairForgeTaskRepositoryLiteral(task: string, cwd: string): string {\n const repoLiteral = detectGithubRemoteLiteral(cwd);\n return repairFitnessCommandRepositoryLiteral(task, repoLiteral);\n}\n\n// @kern-source: forge:370\nfunction describeProjectFitnessOptions(cwd: string): string {\n const lines: string[] = [];\n const packageJsonPath = join(cwd, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf8'));\n const scripts = (pkg && typeof pkg === 'object' && pkg.scripts && typeof pkg.scripts === 'object') ? Object.keys(pkg.scripts as Record<string, unknown>).sort() : [];\n if (scripts.length > 0) {\n lines.push(`package.json scripts: ${scripts.join(', ')}`);\n }\n } catch (e) {\n lines.push('package.json exists but could not be parsed');\n }\n }\n if (existsSync(join(cwd, 'Cargo.toml'))) {\n lines.push('Cargo.toml present');\n }\n if (existsSync(join(cwd, 'go.mod'))) {\n lines.push('go.mod present');\n }\n if (existsSync(join(cwd, 'pyproject.toml'))) {\n lines.push('pyproject.toml present');\n }\n if (existsSync(join(cwd, 'README.md'))) {\n lines.push('README.md present');\n }\n const repoLiteral = detectGithubRemoteLiteral(cwd);\n if (repoLiteral) {\n lines.push(`git origin: ${repoLiteral}`);\n }\n return (lines.length > 0) ? lines.join('\\n') : 'No common project test metadata found.';\n}\n\n/**\n * Ask Cesar to prepare a task-specific fitness command when a forge call omitted one. This keeps UX non-interactive without hardcoding task-specific checks in the handler.\n */\n// @kern-source: forge:395\nexport async function prepareForgeFitnessCommand(task: string, dispatch: Dispatch, ctx: HandlerContext): Promise<string|null> {\n const config = ctx.config;\n const cwd = resolveWorkingDir();\n const cesarEngineId = String((config as any).cesarEngine ?? config.forgeFixedStarter ?? ctx.activeEngines()[0] ?? '').trim();\n if (!cesarEngineId) return null;\n\n let engine: any = null;\n try { engine = ctx.registry.get(cesarEngineId); } catch { return null; }\n if (!engine) return null;\n\n const outputDir = join(RUNS_DIR, `fitness-${Date.now()}`);\n mkdirSync(outputDir, { recursive: true });\n dispatch({ type: 'info', message: `Cesar preparing fitness check with ${cesarEngineId}…` });\n\n const prompt = [\n 'Prepare one shell fitness command for a forge run.',\n '',\n 'Return strict JSON only: {\"fitnessCmd\":\"<command>\",\"reason\":\"<short reason>\"}',\n '',\n 'Rules:',\n '- The command must be non-interactive and suitable to run from the repository root.',\n '- Interpret the task semantically. Do not convert every phrase into a literal grep.',\n '- The command should verify the task requirements as specifically as possible using local files and local project facts.',\n '- Do not add GitHub/repository URL checks unless the task explicitly asks for a public repo link, GitHub URL, or footer/source link.',\n '- If a repo link is needed, use the git origin shown in Project signals as the source of truth.',\n '- Preserve exact literals only when the task actually requires those literals. Do not correct or invent spellings.',\n '- Do not turn broad wording like \"avoid internal build details\" into forbidding local identity names such as the GitHub owner or repo name.',\n '- Prefer existing project scripts when they fit; otherwise write a small shell/node/python check.',\n '- Do not include markdown, prose, or multiple commands outside the JSON string.',\n '',\n `Task:\\n${task}`,\n '',\n `Project signals:\\n${describeProjectFitnessOptions(cwd)}`,\n ].join('\\n');\n\n try {\n const result = await ctx.adapter.dispatch({\n engine,\n prompt,\n cwd,\n mode: 'exec' as any,\n timeout: Math.min((config.timeout ?? 90), 90),\n outputDir,\n });\n const cmd = extractFitnessCommandFromCesarOutput(String(result.stdout ?? ''));\n if (cmd) {\n const repoLiteral = detectGithubRemoteLiteral(cwd);\n const taskRepaired = repairFitnessCommandTaskLiterals(task, cmd);\n const repoRepaired = repairFitnessCommandRepositoryLiteral(taskRepaired, repoLiteral);\n const forbiddenRepaired = repairOverbroadForbiddenLiterals(task, repoRepaired, repoLiteral);\n const repaired = repairContradictoryFitnessLiterals(forbiddenRepaired);\n const validation = validateFitnessCommandIntent(task, repaired, repoLiteral);\n if (!validation.ok) {\n dispatch({ type: 'warning', message: `Rejected Cesar fitness check: ${validation.reason}` });\n return null;\n }\n if (repaired !== cmd) {\n dispatch({ type: 'warning', message: `Repaired Cesar fitness literal: ${cmd} -> ${repaired}` });\n }\n dispatch({ type: 'info', message: `Cesar fitness check: ${repaired}` });\n return repaired;\n }\n } catch (err) {\n dispatch({ type: 'warning', message: `Cesar could not prepare a fitness check: ${err instanceof Error ? err.message : String(err)}` });\n }\n return null;\n}\n\n/**\n * Pick a non-interactive fallback fitness command from the current project when the user or Cesar did not provide one.\n */\n// @kern-source: forge:465\nexport function inferProjectFitnessCommand(cwd: string): string {\n const packageJsonPath = join(cwd, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf8'));\n const scripts = pkg && typeof pkg === 'object' && pkg.scripts && typeof pkg.scripts === 'object'\n ? pkg.scripts as Record<string, unknown>\n : {};\n const hasScript = (name: string) => typeof scripts[name] === 'string' && String(scripts[name]).trim().length > 0;\n if (hasScript('test:ts')) return 'npm run test:ts';\n if (hasScript('test')) return 'npm test';\n if (hasScript('typecheck')) return 'npm run typecheck';\n if (hasScript('build')) return 'npm run build';\n } catch {\n // Fall through to generic checks when package.json cannot be parsed.\n }\n }\n if (existsSync(join(cwd, 'Cargo.toml'))) return 'cargo test';\n if (existsSync(join(cwd, 'go.mod'))) return 'go test ./...';\n if (existsSync(join(cwd, 'pyproject.toml'))) return 'python -m pytest';\n return 'git diff --check';\n}\n\n// @kern-source: forge:490\nexport async function handleForge(task: string, fitnessCmd: string|null, dispatch: Dispatch, ctx: HandlerContext, existingPlan?: Plan, hardened?: boolean, skipPlanApproval?: boolean): Promise<{winner:string|null, patchPath:string|null, manifestPath:string, task:string, fitnessCmd:string}|null> {\n const forgeAbort = new AbortController();\n try {\n ensureAgonHome();\n\n if (!task) {\n dispatch({ type: 'warning', message: 'No task provided. Usage: \"fix the auth bug, test with npm test\"' });\n return null;\n }\n const forgeCwd = resolveWorkingDir();\n // Snapshot HEAD/branch now so auto-apply can refuse if another session\n // moves the working tree out from under this run (the shared-checkout hazard).\n const preflightHead: string | null = (() => { try { return headSha(forgeCwd); } catch { return null; } })();\n const preflightBranch: string | null = (() => { try { return currentBranch(forgeCwd); } catch { return null; } })();\n const originalTask = task;\n task = repairForgeTaskRepositoryLiteral(task, forgeCwd);\n if (task !== originalTask) {\n dispatch({ type: 'warning', message: 'Repaired forge task repository link to match git origin.' });\n }\n\n let fitness = fitnessCmd;\n if (!fitness) {\n fitness = await prepareForgeFitnessCommand(task, dispatch, ctx);\n }\n if (!fitness) {\n fitness = inferProjectFitnessCommand(resolveWorkingDir());\n dispatch({ type: 'warning', message: `Cesar did not provide a fitness check; falling back to: ${fitness}` });\n }\n\n const allEngines = ctx.activeEngines();\n const engines = filterDefaultOrchestrationEngines(allEngines);\n const excluded = allEngines.filter((id: string) => !engines.includes(id));\n if (excluded.length > 0) dispatch({ type: 'info', message: `Skipping disabled orchestration engines: ${excluded.join(', ')}` });\n if (engines.length === 0) {\n dispatch({ type: 'error', message: 'No engines available. Install at least one AI CLI tool.' });\n return null;\n }\n\n const config = ctx.config;\n let plan: Plan;\n\n if (existingPlan) {\n plan = startPlan(existingPlan);\n ctx.setCurrentPlan(plan);\n savePlan(plan);\n } else {\n const ws = getActiveWorkspace();\n const snapshot = ws\n ? snapshotWorkspace(ws)\n : { id: 'cwd', path: forgeCwd, headSha: 'unknown', branch: 'unknown', dirty: false };\n\n const forgeSteps: PlanStepInput[] = [\n { id: 'baseline', kind: 'fitness', label: 'Baseline fitness check', effects: ['exec'] },\n { id: 'dispatch', kind: 'dispatch', label: `Dispatch engines: ${engines.join(', ')}`, effects: ['exec', 'write', 'network'] },\n { id: 'score', kind: 'fitness', label: 'Score engine results', effects: ['exec', 'read'] },\n { id: 'winner', kind: 'dispatch', label: 'Determine winner', effects: ['read'] },\n ];\n if (config.forgeEnableSynthesis) {\n forgeSteps.push({ id: 'synthesis', kind: 'synthesis', label: 'Critique & synthesize', effects: ['exec', 'write', 'network'] });\n }\n\n plan = createPlan(\n { type: 'forge', task, fitnessCmd: fitness, engines, hardened: hardened ?? false },\n snapshot,\n forgeSteps,\n );\n ctx.setCurrentPlan(plan);\n\n dispatch({ type: 'plan', plan });\n\n const approvalLevel = (config.approvalLevel ?? 'plan') as ApprovalLevel;\n if (!skipPlanApproval && approvalLevel !== 'auto') {\n const answer = await ctx.askQuestion('Approve plan? [Y/n]');\n if (answer.trim().toLowerCase() === 'n') {\n plan = cancelPlan(plan);\n ctx.setCurrentPlan(plan);\n savePlan(plan);\n dispatch({ type: 'info', message: 'Plan cancelled.' });\n return null;\n }\n }\n\n plan = approvePlan(plan);\n plan = startPlan(plan);\n ctx.setCurrentPlan(plan);\n savePlan(plan);\n }\n\n const forgeDir = join(RUNS_DIR, `forge-${Date.now()}`);\n mkdirSync(forgeDir, { recursive: true });\n dispatch({ type: 'info', message: `Forge run dir: ${forgeDir}` });\n\n const projectCtx = scanProjectContext(forgeCwd, config.projectContext || undefined, config.contextFormat);\n\n const engineStatus: Record<string, string> = {};\n const startTime = Date.now();\n\n // ── Scoreboard + Checkpoint ──\n const runId = `forge-${Date.now()}`;\n const scoreboard = createScoreboard(runId, 'forge', engines);\n const preCp = buildCheckpoint(runId, 'pre-dispatch', 'forge', engines, { task, fitnessCmd: fitness, hardened: hardened ?? false });\n recordCheckpoint(preCp);\n\n // Phase 5c: pre-compute which engines have agent-mode config, so the\n // progress tick (called every 250ms) doesn't re-query the registry.\n const agentEngineIds = new Set<string>();\n for (const id of engines) {\n try {\n const eng = ctx.registry.get(id);\n if ((eng as any).agent || (eng as any).api) agentEngineIds.add(id);\n } catch { /* engine not resolvable — treat as non-agent */ }\n }\n\n // Re-render guard: the tick fires at 250ms for a smooth scoreboard sync,\n // but the live progress pane only needs a new dispatch when something the\n // user can see actually changed (status/score, or the 1s elapsed counter).\n // Dispatching a fresh array every 250ms when the content is identical churns\n // the Ink live pane at 4Hz for no visible change — the forge shutter. Gate\n // the dispatch on a cheap signature so it fires ~1Hz during steady building\n // and immediately on any real state change.\n let _lastProgressSig = '';\n const progressInterval = setInterval(() => {\n const elapsed = Math.floor((Date.now() - startTime) / 1000);\n const progress: EngineProgress[] = engines.map((id: string) => {\n const status = engineStatus[id] ?? 'preparing';\n return {\n id,\n status: status === 'done' ? `done (${engineStatus[`${id}:score`] ?? '?'})` : status,\n elapsed,\n done: status === 'done',\n failed: status === 'failed',\n score: engineStatus[`${id}:score`],\n isAgent: agentEngineIds.has(id),\n };\n });\n const sig = progress.map((p: EngineProgress) => `${p.id}:${p.status}:${p.score ?? ''}`).join('|') + `@${elapsed}`;\n if (sig !== _lastProgressSig) {\n _lastProgressSig = sig;\n dispatch({ type: 'progress-update', engines: progress });\n }\n // Sync scoreboard with engineStatus for live display\n for (const id of engines) {\n const s = engineStatus[id] ?? 'waiting';\n if (s === 'building') scoreboardUpdateProgress(scoreboard, id, Math.min(95, elapsed * 2));\n else if (s === 'done') scoreboardFinishEngine(scoreboard, id, { score: Number(engineStatus[`${id}:score`]) || undefined });\n else if (s === 'failed') scoreboardFailEngine(scoreboard, id, engineStatus[`${id}:error`] ?? 'failed');\n }\n }, 250);\n\n ctx.setActiveAbort(forgeAbort);\n\n let manifest: any;\n try {\n manifest = await runForge(\n {\n task,\n fitnessCmd: fitness,\n cwd: forgeCwd,\n forgeDir,\n engines,\n context: projectCtx,\n hardened: hardened ?? false,\n // Interactive forge: Cesar synthesizes the best-of-all result (only\n // active when config.forgeEnableSynthesis is on). Falls back to the\n // winner engine if cesarEngine is unset/unknown.\n synthEngine: String((ctx.config as any).cesarEngine ?? '').trim() || undefined,\n synthesize: 'always',\n signal: forgeAbort.signal,\n },\n ctx.registry,\n ctx.adapter,\n (event: any) => {\n plan = handleForgeEvent(event, plan, engineStatus, dispatch, ctx);\n },\n );\n } catch (err) {\n clearInterval(progressInterval);\n dispatch({ type: 'progress-clear' });\n ctx.setActiveAbort(null);\n if (ctx.currentPlan?.state !== 'cancelled') {\n const errorMsg = err instanceof Error ? err.message : String(err);\n plan = failPlan(plan, errorMsg);\n ctx.setCurrentPlan(plan);\n savePlan(plan);\n }\n throw err;\n }\n\n clearInterval(progressInterval);\n dispatch({ type: 'progress-clear' });\n\n // runForge now never throws — it returns a manifest with error set on\n // fatal failure. Surface that as a user-visible warning so the run isn't\n // silently treated as successful with no winner.\n if (manifest.error) {\n dispatch({ type: 'warning', message: `Forge failed: ${manifest.error}` });\n // Cesar narrates the failure with concrete next steps before we exit.\n try { await cesarReviewForgeOutcome(manifest, dispatch, ctx); }\n catch (err) { console.warn(`[agon] Cesar review (error path) failed: ${err instanceof Error ? err.message : String(err)}`); }\n // runForge no longer throws — but plan-mode still expects to see the\n // plan transition to 'failed' on a fatal forge failure. Without this,\n // the plan stays 'started'/'pending' and the orchestrator never moves on.\n if (ctx.currentPlan?.state !== 'cancelled') {\n plan = failPlan(plan, manifest.error);\n ctx.setCurrentPlan(plan);\n savePlan(plan);\n }\n recordRun({\n mode: 'forge',\n intent: task,\n winner: undefined,\n success: false,\n durationMs: Date.now() - startTime,\n engineIds: engines,\n fitnessCmd: fitness ?? undefined,\n completionState: 'crashed',\n error: manifest.error,\n });\n ctx.setActiveAbort(null);\n return null;\n }\n if (manifest.alreadySatisfied) {\n dispatch({ type: 'info', message: 'Forge: task already satisfied — fitness command passes on baseline, no engines dispatched.' });\n try { await cesarReviewForgeOutcome(manifest, dispatch, ctx); }\n catch (err) { console.warn(`[agon] Cesar review (already-satisfied path) failed: ${err instanceof Error ? err.message : String(err)}`); }\n // alreadySatisfied = success, distinct from no-winner. Without this\n // early return, the rest of the handler (scoreboard, judge, plan-finalize)\n // sees an empty manifest.results and reports \"No winner — all engines\n // failed\", marking the plan failed.\n recordRun({\n mode: 'forge',\n intent: task,\n winner: undefined,\n success: true,\n durationMs: Date.now() - startTime,\n engineIds: engines,\n fitnessCmd: fitness ?? undefined,\n completionState: 'completed',\n });\n ctx.setActiveAbort(null);\n return { winner: null, patchPath: null, manifestPath: `${forgeDir}/manifest.json`, task, fitnessCmd: fitness };\n }\n if (manifest.singleSurvivor && manifest.winner) {\n const winner = manifest.winner;\n const score = (manifest.results as any)[winner]?.score ?? 0;\n dispatch({ type: 'warning', message: `Only ${winner} produced a passing result (score ${score}). Other engines failed.` });\n // Cesar reads the surviving patch and tells the user accept/retry.\n try { await cesarReviewForgeOutcome(manifest, dispatch, ctx); }\n catch (err) { console.warn(`[agon] Cesar review (single-survivor path) failed: ${err instanceof Error ? err.message : String(err)}`); }\n }\n // Note: the no-winner-with-no-error case is handled below, after the\n // scoreboard renders, so the user sees the metrics first then Cesar's\n // diagnosis. The cesarJudgeForge call (multi-pass case) stays where it was.\n\n // Finalize scoreboard + post-dispatch checkpoint\n for (const id of engines) {\n const s = engineStatus[id] ?? 'waiting';\n if (s === 'done') scoreboardFinishEngine(scoreboard, id, { score: Number(engineStatus[`${id}:score`]) || undefined });\n else if (s === 'failed') scoreboardFailEngine(scoreboard, id, engineStatus[`${id}:error`] ?? 'failed');\n }\n dispatch({ type: 'info', message: renderScoreboard(scoreboard) });\n const postCp = buildCheckpoint(runId, 'post-dispatch', 'forge', engines, { winner: manifest.winner ?? null, task });\n recordCheckpoint(postCp);\n\n const engineIds = Object.keys(manifest.results);\n const results = Object.values(manifest.results) as any[];\n\n dispatch({\n type: 'scoreboard',\n title: 'Forge Scoreboard',\n engineIds,\n winner: manifest.winner ?? undefined,\n metrics: [\n { label: 'Fitness', values: results.map((r: any) => r.pass ? `PASS (${r.score})` : 'FAIL') },\n { label: 'Score', values: results.map((r: any) => String(r.score)) },\n { label: 'Diff size', values: results.map((r: any) => `${r.diffLines} lines`) },\n { label: 'Files changed', values: results.map((r: any) => String(r.filesChanged)) },\n { label: 'Time', values: results.map((r: any) => `${r.durationSec}s`) },\n ],\n });\n\n // Route through Cesar for judgment + convergence analysis\n let judgment: any = null;\n const passingEngines = Object.values(manifest.results).filter((r: any) => r.pass).length;\n if (passingEngines >= 2 && ctx.cesarSession) {\n try {\n judgment = await cesarJudgeForge(manifest, dispatch, ctx);\n } catch (err) {\n console.warn(`[agon] Cesar judge failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n } else if (passingEngines === 0 && !manifest.alreadySatisfied && ctx.cesarSession) {\n // No-winner-no-error: Cesar diagnoses the failure pattern so the user\n // gets a real next-step instead of just a \"no winner\" scoreboard.\n try { await cesarReviewForgeOutcome(manifest, dispatch, ctx); }\n catch (err) { console.warn(`[agon] Cesar review (no-winner path) failed: ${err instanceof Error ? err.message : String(err)}`); }\n }\n\n // Use Cesar's winner if available, otherwise fall back to automatic\n const finalWinner = judgment?.winner ?? manifest.winner;\n\n // Convergence: if Cesar says merge best-of-breed, synthesize a converged patch\n if (judgment?.shouldConverge && judgment.convergencePlan.length > 0 && finalWinner) {\n dispatch({ type: 'info', message: 'Cesar recommends convergence — synthesizing best-of-breed…' });\n const answer = await ctx.askQuestion('Converge best parts from all engines? [Y/n]');\n if (answer.trim().toLowerCase() !== 'n') {\n try {\n const convergedPath = await cesarConvergeForge(manifest, judgment, dispatch, ctx);\n if (convergedPath) {\n dispatch({ type: 'success', message: 'Convergence complete — merged patch ready' });\n const convergedContent = readFileSync(convergedPath, 'utf-8');\n const applied = applyForgePatchToWorkspace('convergence', convergedContent, dispatch, preflightHead, preflightBranch);\n if (!applied) dispatch({ type: 'patch-review' as any, winnerId: 'convergence', patchPath: convergedPath, patchContent: convergedContent });\n\n if ((ctx.config as any).sessionContinuity === true) {\n try {\n const convergeThread = loadOrCreateActiveThread(resolveWorkingDir());\n const capped = convergedContent.length > 90000\n ? convergedContent.slice(0, 90000) + `\\n\\n[... ${convergedContent.length - 90000} more chars truncated — full patch at ${convergedPath}]`\n : convergedContent;\n convergeThread.append({\n role: 'assistant',\n content: `[forge-convergence-diff] winner: convergence (best-of-breed)\\npatch path: ${convergedPath}\\n\\n${capped}`,\n });\n await convergeThread.save();\n } catch (threadErr) {\n dispatch({ type: 'warning', message: `Convergence diff NOT persisted to thread: ${threadErr instanceof Error ? threadErr.message : String(threadErr)}` });\n }\n }\n\n // Skip normal winner patch — convergence replaces it\n dispatch({ type: 'info', message: `Manifest: ${forgeDir}/manifest.json` });\n dispatch({ type: 'info', message: `Result bundle: ${manifest.resultBundlePath ?? `${forgeDir}/result.json`}` });\n\n for (const step of plan.steps) {\n if (step.result.state === 'pending' || step.result.state === 'running') {\n plan = mergeStepResult(plan, step.id, { state: 'completed' });\n }\n }\n const winnerArtifacts = [\n { type: 'manifest' as const, path: `${forgeDir}/manifest.json` },\n { type: 'patch' as const, path: convergedPath, engineId: 'convergence' },\n ];\n plan = mergeStepResult(plan, 'winner', { state: 'completed', artifacts: winnerArtifacts });\n ctx.setCurrentPlan(plan);\n savePlan(plan);\n dispatch({ type: 'info', message: `Plan: ${plan.id}` });\n sessionResultStore.add({\n type: 'forge',\n timestamp: new Date().toISOString(),\n question: task,\n engines: engineIds,\n winner: 'convergence',\n data: {\n scoreboard: engineIds.map((id: string) => {\n const r = (manifest.results as any)[id];\n return { engineId: id, pass: r.pass, score: r.score, diffLines: r.diffLines, filesChanged: r.filesChanged, durationSec: r.durationSec };\n }),\n winner: 'convergence',\n synthesis: manifest.synthesis ?? undefined,\n },\n });\n for (const [id, r] of Object.entries(manifest.results) as [string, any][]) {\n tracker.record(id, { prompt: task, response: `score:${r.score} diff:${r.diffLines}` });\n }\n recordRun({\n mode: 'forge',\n intent: task,\n winner: 'convergence',\n success: true,\n durationMs: Date.now() - startTime,\n engineIds: engineIds,\n fitnessCmd: fitness ?? undefined,\n completionState: 'completed',\n });\n return {\n winner: 'convergence',\n patchPath: convergedPath,\n manifestPath: `${forgeDir}/manifest.json`,\n task,\n fitnessCmd: fitness!,\n }; // Early return — convergence handled everything\n }\n } catch (err) {\n dispatch({ type: 'warning', message: `Convergence failed: ${err instanceof Error ? err.message : String(err)}. Falling back to winner.` });\n }\n }\n }\n\n if (finalWinner) {\n if (!judgment) dispatch({ type: 'success', message: `Winner: ${finalWinner}` });\n const patchPath = manifest.patches[finalWinner];\n dispatch({ type: 'info', message: `Patch: ${patchPath}` });\n if (patchPath) {\n try {\n const patchContent = readFileSync(patchPath, 'utf-8');\n const applied = applyForgePatchToWorkspace(finalWinner, patchContent, dispatch, preflightHead, preflightBranch);\n if (!applied) dispatch({ type: 'patch-review' as any, winnerId: finalWinner, patchPath, patchContent });\n\n if ((ctx.config as any).sessionContinuity === true) {\n try {\n const cwd = resolveWorkingDir();\n const forgeThread = loadOrCreateActiveThread(cwd);\n const capped = patchContent.length > 90000\n ? patchContent.slice(0, 90000) + `\\n\\n[... ${patchContent.length - 90000} more chars truncated — full patch at ${patchPath}]`\n : patchContent;\n forgeThread.append({\n role: 'assistant',\n content: `[forge-diff] winner: ${finalWinner}\\npatch path: ${patchPath}\\n\\n${capped}`,\n });\n await forgeThread.save();\n } catch (threadErr) {\n dispatch({ type: 'warning', message: `Winner diff NOT persisted to thread: ${threadErr instanceof Error ? threadErr.message : String(threadErr)}` });\n }\n }\n } catch (err) {\n console.warn(`[agon] failed to read winning patch ${patchPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n } else {\n if (manifest.noDiffSummary) {\n const summary = manifest.noDiffSummary as any;\n if (Number(summary.toolLoopLimit ?? 0) > 0) {\n dispatch({ type: 'error', message: `No candidate diff — ${summary.toolLoopLimit}/${summary.count} engine(s) hit the tool-loop limit before producing a patch.` });\n } else {\n dispatch({ type: 'warning', message: 'No candidate diff — engines produced no patch. Use validate/improve mode or a more discriminating fitness command for already-passing work.' });\n }\n } else {\n dispatch({ type: 'error', message: 'No winner — all engines failed' });\n }\n }\n dispatch({ type: 'info', message: `Manifest: ${forgeDir}/manifest.json` });\n dispatch({ type: 'info', message: `Result bundle: ${manifest.resultBundlePath ?? `${forgeDir}/result.json`}` });\n\n for (const step of plan.steps) {\n if (step.result.state === 'pending' || step.result.state === 'running') {\n plan = mergeStepResult(plan, step.id, { state: 'completed' });\n }\n }\n\n const anyPassed = Object.values(manifest.results).some((r: any) => r.pass);\n // Use Cesar's chosen winner (finalWinner) for plan artifacts, not automatic manifest.winner\n const winnerForPlan = finalWinner ?? manifest.winner;\n const winnerArtifacts = [\n { type: 'manifest' as const, path: `${forgeDir}/manifest.json` },\n ...(winnerForPlan && manifest.patches[winnerForPlan]\n ? [{ type: 'patch' as const, path: manifest.patches[winnerForPlan], engineId: winnerForPlan }]\n : []),\n ];\n plan = mergeStepResult(plan, 'winner', { state: 'completed', artifacts: winnerArtifacts });\n\n if (!anyPassed) {\n plan = { ...plan, state: 'failed', currentStepId: null, updatedAt: new Date().toISOString() } as Plan;\n }\n ctx.setCurrentPlan(plan);\n savePlan(plan);\n dispatch({ type: 'info', message: `Plan: ${plan.id}` });\n\n sessionResultStore.add({\n type: 'forge',\n timestamp: new Date().toISOString(),\n question: task,\n engines: engineIds,\n winner: finalWinner ?? null,\n data: {\n scoreboard: engineIds.map((id: string, i: number) => {\n const r = results[i] as any;\n return { engineId: id, pass: r.pass, score: r.score, diffLines: r.diffLines, filesChanged: r.filesChanged, durationSec: r.durationSec };\n }),\n winner: finalWinner ?? null,\n synthesis: manifest.synthesis ?? undefined,\n },\n });\n\n for (const [id, r] of Object.entries(manifest.results) as [string, any][]) {\n tracker.record(id, { prompt: task, response: `score:${r.score} diff:${r.diffLines}` });\n }\n\n const runRecord = recordRun({\n mode: 'forge',\n intent: task,\n winner: finalWinner ?? undefined,\n success: anyPassed,\n durationMs: Date.now() - startTime,\n engineIds: engineIds,\n fitnessCmd: fitness ?? undefined,\n completionState: 'completed',\n });\n if (!process.env.AGON_NO_SUMMARY) {\n dispatch({ type: 'info', message: formatRunSummary(runRecord) });\n }\n\n return {\n winner: finalWinner ?? null,\n patchPath: finalWinner && manifest.patches[finalWinner] ? manifest.patches[finalWinner] : null,\n manifestPath: `${forgeDir}/manifest.json`,\n task,\n fitnessCmd: fitness!,\n };\n } finally {\n ctx.setActiveAbort(null);\n }\n}\n","// @generated by kern v3.5.7 — DO NOT EDIT. Source: src/kern/cesar/judge.kern\n\nimport { join } from 'node:path';\n\nimport { readFileSync, writeFileSync } from 'node:fs';\n\nimport type { ForgeManifest, ForgeJudgment, ConvergenceEntry } from '@kernlang/agon-core';\n\nimport { RUNS_DIR, classifyTask, extractPatchFilePatterns, recordForgeJudgment } from '@kernlang/agon-core';\n\nimport { ENGINE_COLORS } from '../blocks/output-format.js';\n\nimport type { Dispatch, HandlerContext } from '../../handlers/types.js';\n\nimport { parseConfidence, confidenceBadge } from './confidence.js';\n\nimport { ensureCesarSession } from './session.js';\n\n/**\n * Parse Cesar's structured judgment response.\n */\n// @kern-source: judge:10\nfunction parseForgeJudgment(response: string, manifest: ForgeManifest): ForgeJudgment|null {\n // Strip confidence prefix (e.g. ~91%) before parsing structured output\n const stripped = parseConfidence(response).rest;\n const lines = stripped.split('\\n');\n let winner = manifest.winner ?? '';\n const strengths: { engineId: string; category: string; reason: string }[] = [];\n const convergencePlan: ConvergenceEntry[] = [];\n let summary = '';\n let shouldConverge = false;\n for (const line of lines) {\n const trimmed = line.trim();\n // WINNER: engineId\n const winnerMatch = trimmed.match(/^WINNER:\\s*(.+)/i);\n if (winnerMatch) {\n winner = winnerMatch[1].trim();\n }\n // CONVERGE: yes|no\n const convergeMatch = trimmed.match(/^CONVERGE:\\s*(yes|no)/i);\n if (convergeMatch) {\n shouldConverge = convergeMatch[1].toLowerCase() === 'yes';\n }\n // SUMMARY: text\n const summaryMatch = trimmed.match(/^SUMMARY:\\s*(.+)/i);\n if (summaryMatch) {\n summary = summaryMatch[1].trim();\n }\n // Strength: - engineId: category — reason\n const strengthMatch = trimmed.match(/^-\\s+(\\w+):\\s+(.+?)\\s+[—–-]\\s+(.+)/);\n if (strengthMatch && !trimmed.startsWith('- file:')) {\n strengths.push({ engineId: strengthMatch[1], category: strengthMatch[2], reason: strengthMatch[3] });\n }\n // Convergence: - file:path fn:name from:engineId reason:why\n const convMatch = trimmed.match(/^-\\s+file:(\\S+)\\s+fn:(\\S+)\\s+from:(\\S+)\\s+reason:(.+)/);\n if (convMatch) {\n convergencePlan.push({ file: convMatch[1], fn: convMatch[2], from: convMatch[3], reason: convMatch[4].trim() });\n }\n }\n if (!winner) {\n return null;\n }\n return { winner: winner, strengths: strengths, convergencePlan: convergencePlan, summary: summary, shouldConverge: shouldConverge };\n}\n\n/**\n * Run after every forge — narrate the outcome to the user via Cesar so the user always knows what happened. Handles error / already-satisfied / single-survivor / normal multi-pass states. For multi-pass, defers to cesarJudgeForge for full judgment. For single-survivor, asks Cesar to read the surviving patch and recommend accept-or-retry. For error, asks Cesar to explain the failure plainly.\n */\n// @kern-source: judge:47\nexport async function cesarReviewForgeOutcome(manifest: ForgeManifest, dispatch: Dispatch, ctx: HandlerContext): Promise<void> {\n let session;\n try { session = await ensureCesarSession(ctx); }\n catch { return; }\n if (!session.alive) return;\n\n const cesarEngineId = ((ctx.config as any).cesarEngine ?? ctx.config.forgeFixedStarter ?? 'claude');\n const color = ENGINE_COLORS[cesarEngineId] ?? 124;\n\n // ── Fatal forge error ────────────────────────────────────────────\n if (manifest.error) {\n const skippedDetail = manifest.engines.length > 0\n ? `Engines configured: ${manifest.engines.join(', ')}.`\n : 'No engines were dispatched.';\n const errorPrompt = `The forge run failed before producing a winner.\\n\\nTASK: ${manifest.task}\\nFITNESS COMMAND: ${manifest.fitnessCmd}\\nERROR: ${manifest.error}\\n${skippedDetail}\\n\\nIn 2-3 sentences, explain to the user what went wrong and the most likely fix (refresh API keys, install a CLI, check git state, etc.). Be specific and actionable. Do not pad. End with a confidence percentage on whatever fix you suggest.`;\n dispatch({ type: 'spinner-start', message: 'Cesar reading forge failure…', color });\n let response = '';\n try {\n const gen = session.send({ message: errorPrompt, signal: undefined });\n for await (const chunk of gen) {\n if (chunk.type === 'text') response += chunk.content;\n if (chunk.type === 'done' || chunk.type === 'error') break;\n }\n } catch { /* swallow — we already showed a static warning */ }\n dispatch({ type: 'spinner-stop' });\n if (response.trim()) {\n dispatch({ type: 'header', title: 'Cesar — Forge Failure' });\n dispatch({ type: 'engine-block', engineId: cesarEngineId, color, content: response.trim() });\n }\n return;\n }\n\n // ── Already satisfied ────────────────────────────────────────────\n if (manifest.alreadySatisfied) {\n const satisfiedPrompt = `The forge baseline check passed before any engine ran. The task says: ${manifest.task}. The fitness command \"${manifest.fitnessCmd}\" already passes on a clean checkout. In 1-2 sentences, confirm to the user that the task appears already done and suggest next steps (verify, move on, or re-check if the fitness command is too lenient). End with a confidence percentage.`;\n dispatch({ type: 'spinner-start', message: 'Cesar confirming task state…', color });\n let response = '';\n try {\n const gen = session.send({ message: satisfiedPrompt, signal: undefined });\n for await (const chunk of gen) {\n if (chunk.type === 'text') response += chunk.content;\n if (chunk.type === 'done' || chunk.type === 'error') break;\n }\n } catch { /* swallow */ }\n dispatch({ type: 'spinner-stop' });\n if (response.trim()) {\n dispatch({ type: 'header', title: 'Cesar — Already Satisfied' });\n dispatch({ type: 'engine-block', engineId: cesarEngineId, color, content: response.trim() });\n }\n return;\n }\n\n // ── Single survivor ─────────────────────────────────────────────\n if (manifest.singleSurvivor && manifest.winner) {\n const winnerId = manifest.winner;\n const winnerResult = (manifest.results as any)[winnerId];\n let winnerPatch = '';\n const winnerPatchPath = manifest.patches[winnerId];\n if (winnerPatchPath) {\n try {\n const fullPatch = readFileSync(winnerPatchPath, 'utf-8');\n const lines = fullPatch.split('\\n');\n winnerPatch = lines.slice(0, 200).join('\\n');\n if (lines.length > 200) winnerPatch += `\\n... (${lines.length - 200} more lines)`;\n } catch { winnerPatch = '(patch file unreadable)'; }\n }\n const failedList = Object.entries(manifest.results as any)\n .filter(([id, r]) => id !== winnerId && !(r as any).pass)\n .map(([id, r]) => `- ${id}: ${(r as any).durationSec}s, ${(r as any).diffLines ?? 0} lines, ${(r as any).pass ? 'passed' : 'failed'}`)\n .join('\\n');\n\n const survivorPrompt = `Forge produced exactly one passing result. The other engines failed.\n\n TASK: ${manifest.task}\n FITNESS COMMAND: ${manifest.fitnessCmd}\n SOLE SURVIVOR: ${winnerId} (score: ${winnerResult?.score ?? 0})\n OTHER ENGINES:\n ${failedList || '(none reported)'}\n\n ## SURVIVING PATCH (first 200 lines)\n\n \\`\\`\\`diff\n ${winnerPatch}\n \\`\\`\\`\n\n Read the patch carefully. Tell the user:\n 1. **Quality verdict** — does this look like a competent solution to the task? Note specific concerns or strengths.\n 2. **Recommendation** — accept this patch, or run /forge again hoping for more engines? Be specific about why.\n 3. **Apply hint** — if accept-worthy, give the exact path: ${winnerPatchPath ?? '(no patch path)'}\n\n End with a confidence percentage. Don't pad.`;\n\n dispatch({ type: 'spinner-start', message: `Cesar reviewing ${winnerId}'s solo solution…`, color });\n let response = '';\n try {\n const gen = session.send({ message: survivorPrompt, signal: undefined });\n for await (const chunk of gen) {\n if (chunk.type === 'text') response += chunk.content;\n if (chunk.type === 'done' || chunk.type === 'error') break;\n }\n } catch { /* swallow */ }\n dispatch({ type: 'spinner-stop' });\n if (response.trim()) {\n dispatch({ type: 'header', title: `Cesar — Single Survivor (${winnerId})` });\n dispatch({ type: 'engine-block', engineId: cesarEngineId, color, content: response.trim() });\n }\n return;\n }\n\n // ── No winner at all (every engine failed and not all-no-op) ────\n if (!manifest.winner) {\n const noWinnerPrompt = `Forge dispatched ${manifest.enginesDispatched} engine(s) and none produced a passing result for: ${manifest.task}\\n\\nFitness command: ${manifest.fitnessCmd}\\n\\nEngine outcomes:\\n${Object.entries(manifest.results as any).map(([id, r]) => `- ${id}: pass=${(r as any).pass}, score=${(r as any).score}, ${(r as any).diffLines ?? 0} lines`).join('\\n')}\\n\\nIn 2-3 sentences, tell the user the most likely root cause (task too vague, fitness too strict, engines lacking context, etc.) and one concrete next move. End with a confidence percentage.`;\n dispatch({ type: 'spinner-start', message: 'Cesar diagnosing forge failure…', color });\n let response = '';\n try {\n const gen = session.send({ message: noWinnerPrompt, signal: undefined });\n for await (const chunk of gen) {\n if (chunk.type === 'text') response += chunk.content;\n if (chunk.type === 'done' || chunk.type === 'error') break;\n }\n } catch { /* swallow */ }\n dispatch({ type: 'spinner-stop' });\n if (response.trim()) {\n dispatch({ type: 'header', title: 'Cesar — No Winner' });\n dispatch({ type: 'engine-block', engineId: cesarEngineId, color, content: response.trim() });\n }\n return;\n }\n\n // ── Normal multi-pass: defer to existing judge for full verdict ──\n // (Caller can still invoke cesarJudgeForge separately if it wants the\n // structured judgment with strengths + convergence plan.)\n}\n\n/**\n * Send forge results to Cesar for judgment + convergence plan.\n */\n// @kern-source: judge:183\nexport async function cesarJudgeForge(manifest: ForgeManifest, dispatch: Dispatch, ctx: HandlerContext): Promise<ForgeJudgment|null> {\n // Need an alive Cesar session\n let session;\n try {\n session = await ensureCesarSession(ctx);\n } catch {\n return null; // No Cesar available — skip judgment\n }\n if (!session.alive) return null;\n\n const cesarEngineId = ((ctx.config as any).cesarEngine ?? ctx.config.forgeFixedStarter ?? 'claude');\n const color = ENGINE_COLORS[cesarEngineId] ?? 124;\n\n // Build structured judgment prompt with patch summaries\n const engineSummaries: string[] = [];\n const patchTexts: string[] = [];\n for (const [id, result] of Object.entries(manifest.results) as [string, any][]) {\n let patchSummary = '(no patch)';\n const patchPath = manifest.patches[id];\n if (patchPath) {\n try {\n const patch = readFileSync(patchPath, 'utf-8');\n patchTexts.push(patch);\n // Include first 150 lines of patch for evaluation\n const lines = patch.split('\\n');\n patchSummary = lines.slice(0, 150).join('\\n');\n if (lines.length > 150) patchSummary += `\\n... (${lines.length - 150} more lines)`;\n } catch { patchSummary = '(patch unreadable)'; }\n }\n engineSummaries.push(\n `### ${id}\\n` +\n `- Score: ${result.score} | Pass: ${result.pass} | Diff: ${result.diffLines} lines | Files: ${result.filesChanged} | Time: ${result.durationSec}s\\n` +\n `\\`\\`\\`diff\\n${patchSummary}\\n\\`\\`\\``\n );\n }\n\n const judgePrompt = `You are judging forge results. Multiple engines competed on this task.\n\n TASK: ${manifest.task}\n FITNESS COMMAND: ${manifest.fitnessCmd}\n AUTOMATIC WINNER: ${manifest.winner ?? 'none'}\n\n ## ENGINE RESULTS\n\n ${engineSummaries.join('\\n\\n')}\n\n ## YOUR JOB\n\n Evaluate each engine's code. Identify:\n 1. **Overall winner** — who produced the best result and why\n 2. **Per-engine strengths** — where each engine did something BETTER than others (architecture, error handling, tests, edge cases, code style, performance)\n 3. **Convergence plan** — if multiple engines have complementary strengths, list which parts from which engine should be merged. Only suggest convergence if it would genuinely improve the result.\n\n Respond in this EXACT format:\n\n WINNER: {engineId}\n STRENGTHS:\n - {engineId}: {category} — {reason}\n - {engineId}: {category} — {reason}\n CONVERGE: {yes|no}\n CONVERGENCE:\n - file:{path} fn:{name} from:{engineId} reason:{why}\n SUMMARY: {your read — as long or as short as it actually deserves}`;\n\n dispatch({ type: 'spinner-start', message: 'Cesar judging forge results…', color });\n\n let judgeResponse = '';\n try {\n const gen = session.send({ message: judgePrompt, signal: undefined });\n for await (const chunk of gen) {\n if (chunk.type === 'text') judgeResponse += chunk.content;\n if (chunk.type === 'done' || chunk.type === 'error') break;\n }\n } catch {\n dispatch({ type: 'spinner-stop' });\n return null;\n }\n dispatch({ type: 'spinner-stop' });\n\n // Parse structured judgment\n const judgment = parseForgeJudgment(judgeResponse, manifest);\n\n // Show confidence badge if present\n const conf = parseConfidence(judgeResponse);\n if (conf.value !== null) {\n dispatch({ type: 'info', message: confidenceBadge(conf.value) + ' Cesar (judge)' });\n }\n\n // Display judgment\n if (judgment) {\n try {\n recordForgeJudgment(\n judgment.winner,\n manifest.winner ?? null,\n Object.keys(manifest.results),\n classifyTask(manifest.task),\n manifest.forgeId,\n judgment.summary,\n judgment.strengths,\n extractPatchFilePatterns(patchTexts.join('\\n')),\n );\n } catch (err) {\n console.warn(`[agon] failed to record Cesar forge judgment: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n dispatch({ type: 'header', title: 'Cesar\\'s Judgment' });\n dispatch({ type: 'success', message: `Winner: ${judgment.winner}` });\n\n if (judgment.strengths.length > 0) {\n dispatch({ type: 'info', message: 'Per-engine strengths:' });\n for (const s of judgment.strengths) {\n const sColor = ENGINE_COLORS[s.engineId] ?? 124;\n dispatch({ type: 'engine-block', engineId: s.engineId, color: sColor, content: `${s.category} — ${s.reason}` });\n }\n }\n\n dispatch({ type: 'info', message: judgment.summary });\n\n if (judgment.shouldConverge && judgment.convergencePlan.length > 0) {\n dispatch({ type: 'header', title: 'Convergence Plan' });\n for (const entry of judgment.convergencePlan) {\n const eColor = ENGINE_COLORS[entry.from] ?? 124;\n dispatch({ type: 'engine-block', engineId: entry.from, color: eColor, content: `${entry.file}:${entry.fn} — ${entry.reason}` });\n }\n }\n }\n\n return judgment;\n}\n\n/**\n * Cesar synthesizes a converged patch from best-of-breed parts per the convergence plan.\n */\n// @kern-source: judge:315\nexport async function cesarConvergeForge(manifest: ForgeManifest, judgment: ForgeJudgment, dispatch: Dispatch, ctx: HandlerContext): Promise<string|null> {\n let session;\n try {\n session = await ensureCesarSession(ctx);\n } catch { return null; }\n if (!session.alive) return null;\n\n const cesarEngineId = ((ctx.config as any).cesarEngine ?? ctx.config.forgeFixedStarter ?? 'claude');\n const color = ENGINE_COLORS[cesarEngineId] ?? 124;\n\n // Collect relevant patches — always include the winner's patch as the base\n const patchContents: Record<string, string> = {};\n if (judgment.winner && manifest.patches[judgment.winner]) {\n try {\n patchContents[judgment.winner] = readFileSync(manifest.patches[judgment.winner], 'utf-8');\n } catch { /* skip unreadable */ }\n }\n for (const entry of judgment.convergencePlan) {\n if (!patchContents[entry.from] && manifest.patches[entry.from]) {\n try {\n patchContents[entry.from] = readFileSync(manifest.patches[entry.from], 'utf-8');\n } catch { /* skip unreadable */ }\n }\n }\n\n // Build the convergence synthesis prompt\n const patchSections = Object.entries(patchContents).map(([id, content]) => {\n const lines = content.split('\\n');\n const summary = lines.slice(0, 200).join('\\n');\n return `### ${id}'s patch\\n\\`\\`\\`diff\\n${summary}\\n\\`\\`\\``;\n }).join('\\n\\n');\n\n const planLines = judgment.convergencePlan.map(e =>\n `- Take ${e.fn} from ${e.from} (${e.file}) — ${e.reason}`\n ).join('\\n');\n\n const convergePrompt = `You are synthesizing a converged patch from multiple forge competitors.\n\n TASK: ${manifest.task}\n WINNER: ${judgment.winner}\n\n ## CONVERGENCE PLAN\n ${planLines}\n\n ## PATCHES TO MERGE\n ${patchSections}\n\n ## INSTRUCTIONS\n Create a single unified diff that takes the best parts from each engine according to the convergence plan above.\n - Start from the winner's patch as the base\n - Replace specific functions/sections with the better versions from other engines\n - Ensure the merged result is coherent — no duplicate functions, no conflicts\n - Output ONLY the unified diff, nothing else. Start with --- and +++ lines.`;\n\n dispatch({ type: 'spinner-start', message: 'Cesar synthesizing converged patch…', color });\n\n let convergedPatch = '';\n try {\n const gen = session.send({ message: convergePrompt, signal: undefined });\n for await (const chunk of gen) {\n if (chunk.type === 'text') convergedPatch += chunk.content;\n if (chunk.type === 'done' || chunk.type === 'error') break;\n }\n } catch {\n dispatch({ type: 'spinner-stop' });\n return null;\n }\n dispatch({ type: 'spinner-stop' });\n\n // Extract diff from response (strip markdown fences if present)\n let patch = convergedPatch.trim();\n const fenceMatch = patch.match(/```(?:diff)?\\n([\\s\\S]*?)```/);\n if (fenceMatch) patch = fenceMatch[1].trim();\n\n if (!patch || !patch.includes('---')) {\n dispatch({ type: 'warning', message: 'Cesar could not produce a valid converged patch' });\n return null;\n }\n\n // Write converged patch to forge directory\n const convergePath = join(manifest.forgeDir, 'convergence-patch.diff');\n writeFileSync(convergePath, patch, 'utf-8');\n\n return convergePath;\n}\n","// @generated by kern v3.5.7 — DO NOT EDIT. Source: src/kern/models/session-results.kern\n\nimport type { SessionResult } from '@kernlang/agon-core';\n\n// @kern-source: session-results:3\nexport class SessionResultStore {\n results: SessionResult[] = [];\n\n add(result: SessionResult): void {\n this.results.push(result);\n }\n\n getResults(): SessionResult[] {\n return [...this.results];\n }\n\n hasResults(): boolean {\n return this.results.length > 0;\n }\n\n getLatest(): SessionResult|null {\n return (this.results.length > 0) ? this.results[this.results.length - 1] : null;\n }\n\n clear(): void {\n this.results = [];\n }\n}\n\nexport const sessionResultStore = new SessionResultStore();\n","// @generated by kern v3.4.9 — DO NOT EDIT. Source: src/kern/cesar/scoreboard.kern\n\nimport { ENGINE_COLORS } from '../blocks/output-format.js';\n\n// @kern-source: scoreboard:7\nexport type ScoreboardEngineState = 'waiting' | 'running' | 'done' | 'failed' | 'cancelled';\n\n// @kern-source: scoreboard:9\nexport interface ScoreboardEntry {\n engineId: string;\n state: ScoreboardEngineState;\n startedAt?: number;\n finishedAt?: number;\n progress: number;\n score?: number;\n result?: string;\n error?: string;\n}\n\n// @kern-source: scoreboard:19\nexport interface Scoreboard {\n runId: string;\n mode: string;\n startedAt: number;\n entries: ScoreboardEntry[];\n overallState: 'running'|'done'|'failed'|'cancelled';\n}\n\n// @kern-source: scoreboard:26\nexport function createScoreboard(runId: string, mode: string, engineIds: string[]): Scoreboard {\n const now = Date.now();\n return { runId: runId, mode: mode, startedAt: now, entries: engineIds.map((id) => Object.assign({}, { engineId: id, state: 'waiting' as ScoreboardEngineState, progress: 0 })), overallState: 'running' };\n}\n\n// @kern-source: scoreboard:31\nfunction scoreboardFind(board: Scoreboard, engineId: string): ScoreboardEntry|undefined {\n return board.entries.find((e) => e.engineId === engineId);\n}\n\n// @kern-source: scoreboard:33\nexport function scoreboardStartEngine(board: Scoreboard, engineId: string): Scoreboard {\n const entry = scoreboardFind(board, engineId);\n if (!entry) {\n return board;\n }\n entry.state = 'running';\n entry.startedAt = Date.now();\n return board;\n}\n\n// @kern-source: scoreboard:42\nexport function scoreboardUpdateProgress(board: Scoreboard, engineId: string, progress: number): Scoreboard {\n const entry = scoreboardFind(board, engineId);\n if (!entry) {\n return board;\n }\n entry.progress = Math.max(0, Math.min(100, Math.floor(progress)));\n return board;\n}\n\n// @kern-source: scoreboard:50\nexport function scoreboardFinishEngine(board: Scoreboard, engineId: string, opts?: {score?:number,result?:string}): Scoreboard {\n const entry = scoreboardFind(board, engineId);\n if (!entry) {\n return board;\n }\n entry.state = 'done';\n entry.finishedAt = Date.now();\n entry.progress = 100;\n if (opts?.score !== undefined) {\n entry.score = opts.score;\n }\n if (opts?.result !== undefined) {\n entry.result = opts.result;\n }\n scoreboardRecomputeOverall(board);\n return board;\n}\n\n// @kern-source: scoreboard:65\nexport function scoreboardFailEngine(board: Scoreboard, engineId: string, error: string): Scoreboard {\n const entry = scoreboardFind(board, engineId);\n if (!entry) {\n return board;\n }\n entry.state = 'failed';\n entry.finishedAt = Date.now();\n entry.error = error;\n scoreboardRecomputeOverall(board);\n return board;\n}\n\n// @kern-source: scoreboard:76\nexport function scoreboardCancelEngine(board: Scoreboard, engineId: string): Scoreboard {\n const entry = scoreboardFind(board, engineId);\n if (!entry) {\n return board;\n }\n entry.state = 'cancelled';\n entry.finishedAt = Date.now();\n scoreboardRecomputeOverall(board);\n return board;\n}\n\n// @kern-source: scoreboard:86\nfunction scoreboardRecomputeOverall(board: Scoreboard): void {\n if (board.entries.every((e) => e.state === 'done')) {\n board.overallState = 'done';\n } else if (board.entries.every((e) => e.state === 'failed')) {\n board.overallState = 'failed';\n } else if (board.entries.every((e) => e.state === 'done' || e.state === 'failed' || e.state === 'cancelled')) {\n board.overallState = 'done';\n } else if (board.entries.some((e) => e.state === 'running')) {\n board.overallState = 'running';\n }\n}\n\n// @kern-source: scoreboard:100\nexport function formatScoreboardLine(entry: ScoreboardEntry): string {\n // Inline icon literals to avoid loadConfig() dependency in test envs\n const iconMap: Record<ScoreboardEngineState, string> = {\n waiting: '\\u25c7',\n running: '\\u25d0',\n done: '\\u2714',\n failed: '\\u2718',\n cancelled: '\\u25c7',\n };\n const color = ENGINE_COLORS[entry.engineId] ?? 245;\n const icon = iconMap[entry.state];\n const bar = entry.state === 'running'\n ? `${entry.progress}%`\n : (entry.state === 'done' && entry.score != null)\n ? `score ${entry.score}`\n : '';\n const result = entry.result ? ` \\u2014 ${entry.result}` : '';\n const error = entry.error ? ` [${entry.error}]` : '';\n return `\\x1b[38;5;${color}m${icon} ${entry.engineId}${bar ? ` ${bar}` : ''}${result}${error}\\x1b[0m`;\n}\n\n// @kern-source: scoreboard:122\nexport function renderScoreboard(board: Scoreboard): string {\n const lines = board.entries.map((e) => formatScoreboardLine(e));\n return lines.join('\\n');\n}\n","// @generated by kern v3.5.7 — DO NOT EDIT. Source: src/kern/cesar/checkpoint.kern\n\nimport { join } from 'node:path';\n\nimport { mkdirSync, appendFileSync, existsSync, readFileSync } from 'node:fs';\n\nimport { RUNS_DIR, resolveWorkingDir, currentBranch, gitChangedFiles } from '@kernlang/agon-core';\n\n// @kern-source: checkpoint:9\nexport type CheckpointPhase = 'pre-dispatch' | 'post-dispatch' | 'post-judgment' | 'user-pause';\n\n// @kern-source: checkpoint:11\nexport interface Checkpoint {\n id: string;\n runId: string;\n phase: CheckpointPhase;\n ts: number;\n cwd: string;\n branch: string;\n changedFiles: string[];\n mode: string;\n engineIds: string[];\n metadata?: Record<string,unknown>;\n}\n\n// @kern-source: checkpoint:23\nfunction createCheckpointId(): string {\n return `chk-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;\n}\n\n// @kern-source: checkpoint:25\nexport function buildCheckpoint(runId: string, phase: CheckpointPhase, mode: string, engineIds: string[], metadata?: Record<string,unknown>): Checkpoint {\n const cwd = resolveWorkingDir();\n let branch = '';\n let changedFiles: string[] = [];\n try { branch = currentBranch(cwd); } catch { /* noop */ }\n try { changedFiles = gitChangedFiles(cwd); } catch { /* noop */ }\n return {\n id: createCheckpointId(),\n runId,\n phase,\n ts: Date.now(),\n cwd,\n branch,\n changedFiles,\n mode,\n engineIds,\n metadata,\n };\n}\n\n/**\n * Append checkpoint to JSONL. Best-effort: never throws.\n */\n// @kern-source: checkpoint:46\nexport function recordCheckpoint(cp: Checkpoint, runsDir?: string): void {\n try {\n const dir = runsDir ?? RUNS_DIR;\n mkdirSync(dir, { recursive: true });\n appendFileSync(join(dir, 'checkpoints.jsonl'), JSON.stringify(cp) + '\\n');\n } catch { /* checkpoints are advisory */ }\n}\n\n// @kern-source: checkpoint:56\nexport function listCheckpoints(opts?: {runId?:string,phase?:CheckpointPhase,limit?:number,runsDir?:string}): Checkpoint[] {\n const dir = opts?.runsDir ?? RUNS_DIR;\n const path = join(dir, 'checkpoints.jsonl');\n if (!existsSync(path)) return [];\n let raw = '';\n try {\n raw = readFileSync(path, 'utf-8');\n } catch { return []; }\n const out: Checkpoint[] = [];\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed) as Checkpoint;\n if (opts?.runId && parsed.runId !== opts.runId) continue;\n if (opts?.phase && parsed.phase !== opts.phase) continue;\n out.push(parsed);\n } catch { /* skip corrupt */ }\n }\n out.sort((a, b) => b.ts - a.ts);\n const limit = opts?.limit ?? 50;\n return out.slice(0, limit);\n}\n\n// @kern-source: checkpoint:81\nexport function lastCheckpointForRun(runId: string, runsDir?: string): Checkpoint|undefined {\n return listCheckpoints({ runId, limit: 1, runsDir })[0];\n}\n\n// @kern-source: checkpoint:83\nexport function formatCheckpointLine(cp: Checkpoint): string {\n const ago = Math.round((Date.now() - cp.ts) / 1000);\n const agoText = (ago < 60) ? `${ago}s ago` : ((ago < 3600) ? `${Math.round(ago / 60)}m ago` : `${Math.round(ago / 3600)}h ago`);\n const files = (cp.changedFiles.length > 0) ? ` (${cp.changedFiles.length} changed)` : '';\n return `${cp.phase} ${cp.mode} ${cp.engineIds.join('+')}${files} — ${agoText}`;\n}\n","// ── Telemetry Ledger: run records, rolling win rates, task classification ──\n// Persists ~/.agon/telemetry.json. Each run record captures orchestration\n// mode, task type, pass/fail, and timing. Rolling win rates are computed\n// over the last N runs per mode.\n\nimport { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { tracker } from '@kernlang/agon-core';\n\n// ── Types ──────────────────────────────────────────────────────────────\n\nexport type TaskType =\n | 'bugfix'\n | 'feature'\n | 'refactor'\n | 'spec'\n | 'review'\n | 'question'\n | 'build'\n | 'pipeline'\n | 'agent'\n | 'unknown';\n\nexport interface OrchestrationResult {\n mode: string;\n intent?: string;\n winner?: string;\n success: boolean;\n durationMs: number;\n engineIds?: string[];\n fitnessCmd?: string;\n completionState: 'completed' | 'aborted' | 'crashed';\n error?: string;\n}\n\nexport interface RunRecord {\n id: string;\n timestamp: number;\n mode: string;\n taskType: TaskType;\n winner: string | undefined;\n success: boolean;\n durationMs: number;\n engineIds: string[];\n completionState: string;\n costEstimateUsd?: number;\n}\n\nexport interface TelemetryFile {\n version: 1;\n runs: RunRecord[];\n}\n\nexport interface WinRateEntry {\n mode: string;\n total: number;\n wins: number;\n rate: number;\n}\n\nexport const DEFAULT_WINDOW = 50;\n\n// ── Path helpers ───────────────────────────────────────────────────────\n\nfunction getAgonHome(): string {\n const override = process.env.AGON_HOME?.trim();\n return override ? resolve(override) : join(homedir(), '.agon');\n}\n\nfunction telemetryPath(): string {\n return join(getAgonHome(), 'telemetry.json');\n}\n\n// ── classifyTaskType ───────────────────────────────────────────────────\n\n/**\n * Map orchestration mode + intent text to a canonical TaskType.\n * Uses keyword heuristics on intent when available, falls back to mode.\n */\nexport function classifyTaskType(mode: string, intent?: string): TaskType {\n const m = mode.toLowerCase();\n const text = (intent ?? '').toLowerCase();\n\n // Review mode is always review\n if (m === 'review') return 'review';\n\n // Intent-based classification when text is present\n if (text.length > 0) {\n if (/\\b(fix|bug|patch|hotfix|debug|regression|crash|error|issue)\\b/.test(text)) return 'bugfix';\n if (/\\b(add|implement|create|new|feature|support|enable)\\b/.test(text)) return 'feature';\n if (/\\b(refactor|cleanup|clean.?up|restructure|rename|move|extract|simplify|consolidate)\\b/.test(text)) return 'refactor';\n if (/\\b(spec|design|plan|proposal|architect)\\b/.test(text)) return 'spec';\n if (/\\b(question|explain|how|what|why|help|understand|clarify)\\b/.test(text)) return 'question';\n }\n\n // Mode-based fallback\n if (m === 'build' || m === 'agent' || m === 'team-agent' || m === 'agent-solo') return 'build';\n if (m === 'pipeline') return 'pipeline';\n if (m === 'brainstorm' || m === 'team-brainstorm') return 'question';\n if (m === 'tribunal' || m === 'team-tribunal') return 'spec';\n if (m === 'campfire') return 'question';\n if (m === 'forge' || m === 'team-forge' || m === 'speculate') return 'feature';\n\n return 'unknown';\n}\n\n// ── TelemetryLedger ────────────────────────────────────────────────────\n\nexport class TelemetryLedger {\n private filePath: string;\n\n constructor(filePath?: string) {\n this.filePath = filePath ?? telemetryPath();\n }\n\n /** Read the entire ledger file, returning an empty structure if missing/malformed. */\n read(): TelemetryFile {\n try {\n const raw = readFileSync(this.filePath, 'utf-8');\n const parsed = JSON.parse(raw) as TelemetryFile;\n if (parsed && Array.isArray(parsed.runs)) return parsed;\n } catch {\n // file missing or malformed — return empty\n }\n return { version: 1, runs: [] };\n }\n\n /** Persist the ledger to disk atomically. */\n write(data: TelemetryFile): void {\n const dir = join(this.filePath, '..');\n mkdirSync(dir, { recursive: true });\n writeFileSync(this.filePath, JSON.stringify(data, null, 2));\n }\n\n /** Append a single run record. */\n append(record: RunRecord): void {\n const data = this.read();\n this.write({ ...data, runs: [...data.runs, record] });\n }\n\n /** Return the last N runs, optionally filtered by mode. */\n recentRuns(limit: number = DEFAULT_WINDOW, mode?: string): RunRecord[] {\n const data = this.read();\n let runs = data.runs;\n if (mode) runs = runs.filter((r) => r.mode === mode);\n return runs.slice(-limit);\n }\n\n /**\n * Compute rolling win rate over the last `window` runs.\n * Returns entries per mode found in the window, plus an overall entry.\n */\n winRates(window: number = DEFAULT_WINDOW): WinRateEntry[] {\n const runs = this.recentRuns(window);\n const byMode = new Map<string, { total: number; wins: number }>();\n\n for (const r of runs) {\n const entry = byMode.get(r.mode) ?? { total: 0, wins: 0 };\n entry.total += 1;\n if (r.success) entry.wins += 1;\n byMode.set(r.mode, entry);\n }\n\n const entries: WinRateEntry[] = [];\n for (const [mode, { total, wins }] of byMode) {\n entries.push({ mode, total, wins, rate: total > 0 ? wins / total : 0 });\n }\n\n // Overall entry\n const overallTotal = runs.length;\n const overallWins = runs.filter((r) => r.success).length;\n entries.push({\n mode: '__overall__',\n total: overallTotal,\n wins: overallWins,\n rate: overallTotal > 0 ? overallWins / overallTotal : 0,\n });\n\n return entries;\n }\n}\n\n// ── recordRun (convenience) ────────────────────────────────────────────\n\nconst defaultLedger = new TelemetryLedger();\n\n/**\n * Record an orchestration run. Uses a process-wide TelemetryLedger singleton\n * writing to ~/.agon/telemetry.json.\n */\nexport function recordRun(result: OrchestrationResult): RunRecord {\n const stats = typeof tracker?.getStats === 'function' ? tracker.getStats() : null;\n const record: RunRecord = {\n id: `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: Date.now(),\n mode: result.mode,\n taskType: classifyTaskType(result.mode, result.intent),\n winner: result.winner,\n success: result.success,\n durationMs: result.durationMs,\n engineIds: result.engineIds ?? [],\n completionState: result.completionState,\n costEstimateUsd: stats?.totalCostUsd ?? undefined,\n };\n defaultLedger.append(record);\n return record;\n}\n\n// ── formatRunSummary (CLI one-liner) ───────────────────────────────────\n\n/** Format a human-readable post-run summary line. */\nexport function formatRunSummary(record: Pick<RunRecord, 'mode' | 'winner' | 'durationMs' | 'costEstimateUsd'>): string {\n const mode = record.mode;\n const winner = record.winner ?? '—';\n const cost = record.costEstimateUsd && record.costEstimateUsd > 0\n ? `~${record.costEstimateUsd.toFixed(2)}`\n : '';\n const mins = Math.floor(record.durationMs / 60000);\n const secs = Math.floor((record.durationMs % 60000) / 1000);\n const time = mins > 0 ? `${mins}m ${secs}s` : `${secs}s`;\n const costText = cost ? ` · ${cost}` : '';\n return `${mode} complete → ${winner} won${costText} · ${time}`;\n}\n"],"mappings":"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","names":["join","existsSync","mkdirSync","readFileSync","join","readFileSync","join","readFileSync","writeFileSync","mkdirSync","join","join","readFileSync","mkdirSync","writeFileSync","join","existsSync","readFileSync","mkdirSync","winnerArtifacts"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/generated/api/dispatch.ts"],"sourcesContent":["// @generated by kern v3.5.7 — DO NOT EDIT. Source: src/kern/api/dispatch.kern\n\n// @kern-source: dispatch:283\n// @kern-source: dispatch:315\n\nimport { streamText, generateText, jsonSchema } from 'ai';\n\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible';\n\nimport { createAnthropic } from '@ai-sdk/anthropic';\n\nimport type { DispatchResult } from '../models/types.js';\n\n// @kern-source: dispatch:6\nexport interface ApiConfig {\n baseUrl: string;\n apiKeyEnv: string;\n model: string;\n maxTokens?: number;\n format?: 'openai'|'anthropic';\n firstChunkTimeoutMs?: number;\n idleTimeoutMs?: number;\n}\n\n// @kern-source: dispatch:16\nexport const _modelCache: Map<string,{model:any, apiKey:string}> = new Map<string,{model:any, apiKey:string}>();\n\n/**\n * Create AI SDK model instance from ApiConfig — routes to openai-compatible or anthropic provider. Cached by baseUrl+model+format; invalidated if API key changes.\n */\n// @kern-source: dispatch:18\nexport function buildModel(config: ApiConfig): any {\n const apiKey = process.env[config.apiKeyEnv];\n if (!apiKey) return null;\n\n const cacheKey = `${config.baseUrl}|${config.model}|${config.format ?? 'openai'}`;\n const cached = _modelCache.get(cacheKey);\n if (cached && cached.apiKey === apiKey) return cached.model;\n\n const base = config.baseUrl.replace(/\\/$/, '');\n\n let model: any;\n if (config.format === 'anthropic') {\n // createAnthropic baseURL should include /v1 — it appends /messages\n const baseURL = base.endsWith('/v1') ? base : base + '/v1';\n const provider = createAnthropic({ apiKey, baseURL });\n model = provider(config.model);\n } else {\n // OpenAI-compatible: baseURL is used as prefix, SDK appends /chat/completions\n const provider = createOpenAICompatible({\n name: 'agon-api',\n apiKey,\n baseURL: base,\n });\n model = provider.chatModel(config.model);\n }\n\n _modelCache.set(cacheKey, { model, apiKey });\n return model;\n}\n\n/**\n * Convert OpenAI-format tool definitions to AI SDK tool format.\n */\n// @kern-source: dispatch:50\nexport function convertToolsForSdk(tools: Array<{type:string,function:{name:string,description:string,parameters:Record<string,unknown>}}>): Record<string,any> {\n const result: Record<string, any> = {};\n for (const t of tools) {\n result[t.function.name] = {\n description: t.function.description,\n inputSchema: jsonSchema(t.function.parameters as any),\n // No execute — tool execution is handled by the caller (persistent-session)\n };\n }\n return result;\n}\n\n/**\n * Normalize tool call IDs per provider: Anthropic requires [a-zA-Z0-9_], Mistral max 9 chars.\n */\n// @kern-source: dispatch:64\nfunction normalizeToolCallId(id: string, format?: string): string {\n if (!id) {\n return `call_${Date.now()}`;\n }\n if (format === 'anthropic') {\n // Claude: alphanumeric + underscore only\n return id.replace(/[^a-zA-Z0-9_]/g, '_');\n }\n // Mistral: max 9 chars, alphanumeric only\n if (format === 'mistral') {\n return id.replace(/[^a-zA-Z0-9]/g, '').slice(0, 9) || `c${Date.now() % 100000000}`;\n }\n return id;\n}\n\n/**\n * Convert Agon message history (OpenAI wire format) to AI SDK CoreMessage format. Handles per-provider normalization.\n */\n// @kern-source: dispatch:77\nexport function convertMessagesForSdk(messages: Array<{role:string,content:any,tool_calls?:any[],tool_call_id?:string}>, format?: string): any[] {\n // Build original→normalized ID mapping, and record only immediately\n // following tool results for each assistant message. The AI SDK requires\n // every assistant tool-call part to be paired by the contiguous tool-result\n // block that follows it. If an interrupted stream left a dangling or\n // non-contiguous assistant tool_call in history, replay it as plain context\n // instead of letting the SDK throw MissingToolResultsError.\n const idMap = new Map<string, string>();\n for (const msg of messages) {\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n if (tc.id && tc.function?.name) {\n const normalizedId = normalizeToolCallId(tc.id, format);\n idMap.set(tc.id, normalizedId);\n }\n }\n }\n }\n const contiguousResultIdsByAssistantIndex = new Map<number, Set<string>>();\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i] as any;\n if (msg?.role !== 'assistant' || !Array.isArray(msg.tool_calls) || msg.tool_calls.length === 0) continue;\n const resultIds = new Set<string>();\n for (let j = i + 1; j < messages.length; j++) {\n const candidate = messages[j] as any;\n if (candidate?.role !== 'tool') break;\n const originalId = typeof candidate.tool_call_id === 'string' ? candidate.tool_call_id : '';\n if (!originalId) continue;\n resultIds.add(idMap.get(originalId) ?? normalizeToolCallId(originalId, format));\n }\n contiguousResultIdsByAssistantIndex.set(i, resultIds);\n }\n\n const systemParts: string[] = [];\n for (const msg of messages) {\n if (msg.role !== 'system') continue;\n const content = typeof msg.content === 'string' ? msg.content : String(msg.content ?? '');\n if (content.trim()) systemParts.push(content);\n }\n\n const result: any[] = [];\n const activeToolNamesById = new Map<string, string>();\n if (systemParts.length > 0) {\n result.push({ role: 'system', content: systemParts.join('\\n\\n') });\n }\n const pushMessage = (message: any) => {\n const last = result[result.length - 1];\n if (\n message?.role === 'user'\n && last?.role === 'user'\n && typeof message.content === 'string'\n && typeof last.content === 'string'\n ) {\n last.content = `${last.content}\\n\\n${message.content}`;\n return;\n }\n result.push(message);\n };\n\n for (let messageIndex = 0; messageIndex < messages.length; messageIndex++) {\n const msg = messages[messageIndex];\n if (msg.role === 'system') {\n continue;\n } else if (msg.role === 'user') {\n pushMessage({ role: 'user', content: typeof msg.content === 'string' ? msg.content : String(msg.content ?? '') });\n } else if (msg.role === 'assistant') {\n const parts: any[] = [];\n if (msg.content && typeof msg.content === 'string') {\n parts.push({ type: 'text', text: msg.content });\n }\n if (msg.tool_calls) {\n const droppedToolCalls: string[] = [];\n const contiguousResultIds = contiguousResultIdsByAssistantIndex.get(messageIndex) ?? new Set<string>();\n for (const tc of msg.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = typeof tc.function?.arguments === 'string'\n ? JSON.parse(tc.function.arguments)\n : tc.function?.arguments ?? {};\n } catch { args = {}; /* malformed tool_calls JSON — use empty args */ }\n const normalizedId = idMap.get(tc.id) ?? normalizeToolCallId(tc.id ?? `call_${Date.now()}`, format);\n const toolName = tc.function?.name ?? 'unknown';\n if (!contiguousResultIds.has(normalizedId)) {\n droppedToolCalls.push(toolName);\n continue;\n }\n activeToolNamesById.set(normalizedId, toolName);\n parts.push({\n type: 'tool-call',\n toolCallId: normalizedId,\n toolName,\n input: args,\n });\n }\n if (droppedToolCalls.length > 0) {\n parts.push({\n type: 'text',\n text: `[Recovered incomplete tool call${droppedToolCalls.length > 1 ? 's' : ''} omitted from native tool channel: ${droppedToolCalls.join(', ')}]`,\n });\n }\n }\n if (parts.length > 0) {\n pushMessage({ role: 'assistant', content: parts });\n } else {\n pushMessage({ role: 'assistant', content: '' });\n }\n } else if (msg.role === 'tool') {\n const originalId = typeof (msg as any).tool_call_id === 'string' ? (msg as any).tool_call_id : '';\n const toolCallId = originalId ? (idMap.get(originalId) ?? normalizeToolCallId(originalId, format)) : '';\n const toolName = toolCallId ? activeToolNamesById.get(toolCallId) : undefined;\n const outputValue = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n if (!toolCallId || !toolName) {\n pushMessage({\n role: 'user',\n content: `[Recovered orphan tool result omitted from native tool channel]\\n${outputValue}`,\n });\n } else {\n pushMessage({\n role: 'tool',\n content: [{\n type: 'tool-result',\n toolCallId,\n toolName,\n output: {\n type: 'text' as const,\n value: outputValue,\n },\n }],\n });\n activeToolNamesById.delete(toolCallId);\n }\n }\n }\n\n // Mistral quirk: needs a dummy assistant message after consecutive tool results\n if (format === 'mistral') {\n for (let i = 1; i < result.length; i++) {\n if (result[i].role === 'tool' && result[i - 1].role === 'tool') {\n result.splice(i, 0, { role: 'assistant', content: '' });\n i++;\n }\n }\n }\n\n return result;\n}\n\n// @kern-source: dispatch:226\nexport async function apiDispatch(config: ApiConfig, prompt: string, timeout: number, signal?: AbortSignal, systemPrompt?: string): Promise<DispatchResult> {\n const model = buildModel(config);\n if (!model) {\n return {\n exitCode: 1,\n stdout: '',\n stderr: `Missing API key: set ${config.apiKeyEnv} environment variable`,\n durationMs: 0,\n timedOut: false,\n };\n }\n\n const startTime = Date.now();\n const messages: Array<{role: 'system'|'user', content: string}> = [];\n if (systemPrompt) messages.push({ role: 'system', content: systemPrompt });\n messages.push({ role: 'user', content: prompt });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout * 1000);\n if (signal) {\n if (signal.aborted) { clearTimeout(timer); return { exitCode: 130, stdout: '', stderr: 'Aborted', durationMs: 0, timedOut: false }; }\n signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const result = await generateText({\n model,\n messages,\n maxOutputTokens: config.maxTokens ?? 4096,\n abortSignal: controller.signal,\n maxRetries: 5,\n });\n clearTimeout(timer);\n const text = result.text || '';\n const usage = result.usage ? {\n promptTokens: result.usage.inputTokens ?? 0,\n completionTokens: result.usage.outputTokens ?? 0,\n totalTokens: (result.usage.inputTokens ?? 0) + (result.usage.outputTokens ?? 0),\n source: 'sdk' as const,\n } : undefined;\n return { exitCode: 0, stdout: text, stderr: '', durationMs: Date.now() - startTime, timedOut: false, usage };\n } catch (err) {\n clearTimeout(timer);\n const durationMs = Date.now() - startTime;\n if (err instanceof Error && err.name === 'AbortError') {\n return { exitCode: signal?.aborted ? 130 : 124, stdout: '', stderr: 'Request timed out', durationMs, timedOut: !signal?.aborted };\n }\n const isRateLimited = err instanceof Error && (\n err.message.includes('429') || err.message.includes('rate') || err.name === 'AI_RetryError' || err.name === 'RetryError'\n );\n const exitCode = isRateLimited ? 2 : 1;\n const prefix = isRateLimited ? 'API rate limited (retries exhausted)' : 'API request failed';\n return { exitCode, stdout: '', stderr: `${prefix}: ${err instanceof Error ? err.message : String(err)}`, durationMs, timedOut: false };\n }\n}\n\nexport async function* apiStreamDispatch(config: ApiConfig, prompt: string, timeout: number, signal?: AbortSignal, systemPrompt?: string): AsyncGenerator<string, DispatchResult, void> {\n const messages: Array<{role:string, content:string}> = [];\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n return yield * apiStreamDispatchWithHistory(config, messages, timeout, signal);\n}\n\n// @kern-source: dispatch:297\nexport const _formatHintEmitted: Set<string> = new Set<string>();\n\n/**\n * Detect a common misconfiguration: format='anthropic' on a non-Anthropic base URL. Moonshot/Kimi/Groq/Together/DeepInfra etc. claim Anthropic compatibility loosely but actually serve OpenAI-shaped /chat/completions. Returns a one-line hint the first time we hit it for a given host, then null on subsequent calls for that host.\n */\n// @kern-source: dispatch:299\nfunction formatMismatchHint(config: ApiConfig): string|null {\n if (config.format !== 'anthropic') {\n return null;\n }\n try {\n const host = new URL(config.baseUrl).host.toLowerCase();\n if (host === 'api.anthropic.com' || host.endsWith('.anthropic.com')) {\n return null;\n }\n if (_formatHintEmitted.has(host)) {\n return null;\n }\n _formatHintEmitted.add(host);\n return `tip: format='anthropic' on '${host}' — many OpenAI-compat providers (Moonshot/Kimi, Groq, Together, DeepInfra) claim Anthropic but serve OpenAI /chat/completions. Try format='openai' (or remove the field) in the engine config.`;\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Streaming dispatch with full message history + optional native function calling. Uses Vercel AI SDK for robust SSE handling and provider abstraction.\n */\nexport async function* apiStreamDispatchWithHistory(config: ApiConfig, messages: Array<{role:string,content:any,tool_calls?:any[],tool_call_id?:string}>, timeout: number, signal?: AbortSignal, tools?: Array<{type:string,function:{name:string,description:string,parameters:Record<string,unknown>}}>): AsyncGenerator<string, DispatchResult, void> {\n const model = buildModel(config);\n if (!model) {\n return { exitCode: 1, stdout: '', stderr: `Missing API key: set ${config.apiKeyEnv}`, durationMs: 0, timedOut: false };\n }\n\n const startTime = Date.now();\n\n // Convert messages to AI SDK CoreMessage format\n // Detect provider format for per-provider normalization\n const providerFormat = config.format === 'anthropic' ? 'anthropic'\n : config.baseUrl?.includes('mistral') ? 'mistral'\n : undefined;\n const coreMessages = convertMessagesForSdk(messages, providerFormat);\n\n // Set up timeout + external abort\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout * 1000);\n if (signal) {\n if (signal.aborted) { clearTimeout(timer); return { exitCode: 130, stdout: '', stderr: 'Aborted', durationMs: 0, timedOut: false }; }\n signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n let stdout = '';\n // Capture structured parts at stream time — compaction folds over these\n // instead of doing fragile regex extraction on flat text\n const capturedParts: Array<{kind:'text',text:string}|{kind:'reasoning',text:string}|{kind:'tool_call',toolName:string,toolCallId:string,args:Record<string,unknown>}> = [];\n let currentTextBuf = '';\n let currentReasoningBuf = '';\n\n try {\n const streamOpts: any = {\n model,\n messages: coreMessages,\n maxOutputTokens: config.maxTokens ?? 4096,\n abortSignal: controller.signal,\n maxRetries: 5,\n };\n\n if (tools && tools.length > 0) {\n streamOpts.tools = convertToolsForSdk(tools);\n }\n\n // Apply Anthropic cache control: mark system + last 2 messages as ephemeral\n // This saves input tokens on multi-turn conversations\n if (config.format === 'anthropic' && coreMessages.length > 0) {\n // Cache system prompt (stable across turns)\n for (const msg of coreMessages) {\n if ((msg as any).role === 'system') {\n (msg as any).experimental_providerMetadata = {\n anthropic: { cacheControl: { type: 'ephemeral' } },\n };\n break;\n }\n }\n // Cache last 2 user/assistant messages (recent context)\n let cached = 0;\n for (let i = coreMessages.length - 1; i >= 0 && cached < 2; i--) {\n const role = (coreMessages[i] as any).role;\n if (role === 'user' || role === 'assistant') {\n (coreMessages[i] as any).experimental_providerMetadata = {\n anthropic: { cacheControl: { type: 'ephemeral' } },\n };\n cached++;\n }\n }\n }\n\n const result = streamText(streamOpts);\n\n // Two-tier idle timeout: longer patience before first chunk (queuing/cold start),\n // tighter watchdog once streaming starts. Per-engine config overrides defaults.\n // IDLE_TIMEOUT was 15s, which killed API engines during silent reasoning or\n // tool-call phases — a real failure mode observed in agon forge where gemini,\n // kimi-for-coding, and zai-coding produced zero diff because their stream\n // went quiet for >15s while internally working. 90s gives coding engines\n // room to think without breaking the safety net for genuinely hung streams.\n const FIRST_CHUNK_TIMEOUT = config.firstChunkTimeoutMs ?? 60_000; // 60s default\n const IDLE_TIMEOUT = config.idleTimeoutMs ?? 90_000; // 90s default\n const iterator = result.fullStream[Symbol.asyncIterator]();\n let iterDone = false;\n let gotFirstChunk = false;\n\n while (!iterDone) {\n const timeoutMs = gotFirstChunk ? IDLE_TIMEOUT : FIRST_CHUNK_TIMEOUT;\n const next = iterator.next();\n const idle = new Promise<never>((_, reject) => {\n const t = setTimeout(() => reject(new Error('IDLE_TIMEOUT')), timeoutMs);\n next.then(() => clearTimeout(t), () => clearTimeout(t));\n });\n\n let iterResult: IteratorResult<any>;\n try {\n iterResult = await Promise.race([next, idle]);\n } catch (err: any) {\n if (err?.message === 'IDLE_TIMEOUT') {\n const phase = gotFirstChunk ? 'inter-chunk' : 'first-chunk';\n console.warn(`[agon] api-dispatch: ${phase} idle timeout (${timeoutMs / 1000}s) — breaking stream`);\n // First-chunk timeout on a non-Anthropic host using Anthropic format is almost\n // always a config mismatch — surface the hint via stderr so the session UI picks it up.\n if (!gotFirstChunk) {\n const hint = formatMismatchHint(config);\n if (hint) {\n clearTimeout(timer);\n controller.abort();\n return { exitCode: 1, stdout, stderr: `API first-chunk timeout (${timeoutMs / 1000}s). ${hint}`, durationMs: Date.now() - startTime, timedOut: true };\n }\n }\n controller.abort();\n break;\n }\n throw err;\n }\n\n if (iterResult.done) { iterDone = true; break; }\n const part = iterResult.value;\n\n // Any productive event switches to tighter inter-chunk timeout\n if (!gotFirstChunk && (part.type === 'text-delta' || part.type === 'reasoning-delta' || part.type === 'tool-call')) {\n gotFirstChunk = true;\n }\n\n switch (part.type) {\n case 'text-delta': {\n const text = (part as any).text;\n stdout += text;\n currentTextBuf += text;\n yield text;\n break;\n }\n case 'reasoning-delta': {\n const text = (part as any).delta ?? '';\n if (text) {\n currentReasoningBuf += text;\n }\n break;\n }\n case 'tool-call': {\n // Flush accumulated text/reasoning buffers as parts\n if (currentTextBuf) {\n capturedParts.push({ kind: 'text', text: currentTextBuf });\n currentTextBuf = '';\n }\n if (currentReasoningBuf) {\n capturedParts.push({ kind: 'reasoning', text: currentReasoningBuf });\n currentReasoningBuf = '';\n }\n // Capture tool call as structured part\n const toolName = (part as any).toolName ?? 'unknown';\n const toolCallId = (part as any).toolCallId ?? `call_${Date.now()}`;\n const toolInput = (part as any).input ?? {};\n capturedParts.push({ kind: 'tool_call', toolName, toolCallId, args: toolInput });\n\n // Emit as <tool> marker matching Agon's parseToolCalls regex\n const marker = `\\n<tool name=\"${toolName}\">${JSON.stringify(toolInput)}</tool>\\n`;\n stdout += marker;\n yield marker;\n break;\n }\n case 'error': {\n clearTimeout(timer);\n const errStr = String((part as any).error);\n // A 404/not-found before any output is almost always a wrong baseUrl\n // path or a wire-format mismatch (e.g. format='anthropic' on a host\n // whose Anthropic endpoint isn't at /v1/messages — MiniMax, etc.).\n // Surface the actionable hint inline so the user sees the fix rather\n // than a bare 404. (Same hint the idle-timeout + catch paths use.)\n // NOTE: deliberately narrower than brain.kern's deterministic-retry\n // classifier (which also matches 401/403/auth). The format hint says\n // \"try format='openai'\", which is right for a wrong-path/format 404\n // but MISLEADING on a genuine auth 401 — those already get brain.kern's\n // \"check /engines\" hint instead. Do NOT broaden this to auth codes.\n const routingShaped = stdout.length === 0 && /\\b404\\b|not found|no such (?:route|endpoint)/i.test(errStr);\n const hint = routingShaped ? formatMismatchHint(config) : null;\n return { exitCode: 1, stdout, stderr: hint ? `Stream error: ${errStr}\\n${hint}` : `Stream error: ${errStr}`, durationMs: Date.now() - startTime, timedOut: false };\n }\n }\n }\n\n // Flush final text/reasoning buffers\n if (currentTextBuf) capturedParts.push({ kind: 'text', text: currentTextBuf });\n if (currentReasoningBuf) capturedParts.push({ kind: 'reasoning', text: currentReasoningBuf });\n\n clearTimeout(timer);\n\n let usage: DispatchResult['usage'] = undefined;\n try {\n const finalUsage = await (result as any).usage;\n if (finalUsage) {\n usage = {\n promptTokens: finalUsage.inputTokens ?? 0,\n completionTokens: finalUsage.outputTokens ?? 0,\n totalTokens: (finalUsage.inputTokens ?? 0) + (finalUsage.outputTokens ?? 0),\n source: 'sdk' as const,\n };\n }\n } catch { /* usage tokens optional — extraction failure is non-critical */ }\n return { exitCode: 0, stdout, stderr: '', durationMs: Date.now() - startTime, timedOut: false, usage, parts: capturedParts };\n } catch (err) {\n clearTimeout(timer);\n const durationMs = Date.now() - startTime;\n if (err instanceof Error && err.name === 'AbortError') {\n return { exitCode: signal?.aborted ? 130 : 124, stdout, stderr: 'Request timed out', durationMs, timedOut: !signal?.aborted };\n }\n const isRateLimited = err instanceof Error && (\n err.message.includes('429') || err.message.includes('rate') || err.name === 'AI_RetryError' || err.name === 'RetryError'\n );\n const exitCode = isRateLimited ? 2 : 1;\n const prefix = isRateLimited ? 'API rate limited (retries exhausted)' : 'API stream failed';\n const baseMsg = `${prefix}: ${err instanceof Error ? err.message : String(err)}`;\n // Anthropic-format on non-Anthropic host is a common misconfig — append a hint\n // so the user sees it in the error toast instead of silently falling back every turn.\n const hint = stdout.length === 0 && !isRateLimited ? formatMismatchHint(config) : null;\n return { exitCode, stdout, stderr: hint ? `${baseMsg}\\n${hint}` : baseMsg, durationMs, timedOut: false };\n }\n}\n"],"mappings":"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","names":[]}