@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.
- package/dist/{chunk-FCCH7IPJ.js → chunk-3PDYVGRS.js} +107 -24
- package/dist/chunk-3PDYVGRS.js.map +1 -0
- package/dist/{chunk-ATUT2BUQ.js → chunk-6IF2AV4Y.js} +28 -10
- package/dist/chunk-6IF2AV4Y.js.map +1 -0
- package/dist/{chunk-4LVYSUMN.js → chunk-7WZ2O5WZ.js} +6 -27
- package/dist/chunk-7WZ2O5WZ.js.map +1 -0
- package/dist/{chunk-6ANHPXGZ.js → chunk-HSPQEDHX.js} +1 -1
- package/dist/{chunk-6ANHPXGZ.js.map → chunk-HSPQEDHX.js.map} +1 -1
- package/dist/{chunk-WE32YJKT.js → chunk-NBV37VMW.js} +2 -2
- package/dist/{chunk-WE32YJKT.js.map → chunk-NBV37VMW.js.map} +1 -1
- package/dist/{chunk-O6YP55RV.js → chunk-PUNBDLQO.js} +141 -96
- package/dist/chunk-PUNBDLQO.js.map +1 -0
- package/dist/{chunk-C22VTCS6.js → chunk-TMNHJOKU.js} +1193 -226
- package/dist/chunk-TMNHJOKU.js.map +1 -0
- package/dist/{chunk-5QMVQPHY.js → chunk-XWHC6VAH.js} +3 -2
- package/dist/chunk-XWHC6VAH.js.map +1 -0
- package/dist/{dispatch-6LQSMMGI.js → dispatch-S3CR5HKX.js} +2 -2
- package/dist/engines/codex.json +3 -0
- package/dist/{forge-ES4RN7YM.js → forge-GUOEJ5DJ.js} +6 -6
- package/dist/index.js +561 -128
- package/dist/index.js.map +1 -1
- package/dist/plan-mode-35BONR7S.js +17 -0
- package/dist/{src-WJGIOESS.js → src-3NWTITZM.js} +55 -3
- package/dist/{update-HHN4PJQI.js → update-H3LE4ZSI.js} +6 -6
- package/package.json +5 -4
- package/dist/chunk-4LVYSUMN.js.map +0 -1
- package/dist/chunk-5QMVQPHY.js.map +0 -1
- package/dist/chunk-ATUT2BUQ.js.map +0 -1
- package/dist/chunk-C22VTCS6.js.map +0 -1
- package/dist/chunk-FCCH7IPJ.js.map +0 -1
- package/dist/chunk-O6YP55RV.js.map +0 -1
- package/dist/plan-mode-4XRC2ZC7.js +0 -17
- /package/dist/{dispatch-6LQSMMGI.js.map → dispatch-S3CR5HKX.js.map} +0 -0
- /package/dist/{forge-ES4RN7YM.js.map → forge-GUOEJ5DJ.js.map} +0 -0
- /package/dist/{plan-mode-4XRC2ZC7.js.map → plan-mode-35BONR7S.js.map} +0 -0
- /package/dist/{src-WJGIOESS.js.map → src-3NWTITZM.js.map} +0 -0
- /package/dist/{update-HHN4PJQI.js.map → update-H3LE4ZSI.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generated/signals/icons.ts","../src/generated/blocks/output-format.ts","../src/generated/blocks/markdown.ts"],"sourcesContent":["// @generated by kern v3.5.7 — DO NOT EDIT. Source: src/kern/signals/icons.kern\n\nimport { loadConfig } from '@kernlang/agon-core';\n\n// @kern-source: icons:3\nexport interface IconSet {\n read: string;\n edit: string;\n write: string;\n bash: string;\n search: string;\n find: string;\n tool: string;\n campfire: string;\n brainstorm: string;\n tribunal: string;\n image: string;\n queue: string;\n prompt: string;\n winner: string;\n success: string;\n fail: string;\n warning: string;\n header: string;\n nero: string;\n dotOn: string;\n dotOff: string;\n play: string;\n refresh: string;\n flag: string;\n check: string;\n cross: string;\n spinner: string;\n}\n\n// @kern-source: icons:32\nexport const ROMAN_ICONS: IconSet = ({ read: '\\u039e', edit: '\\u270e', write: '\\u2712', bash: '\\u03df', search: '\\u2609', find: '\\u2295', tool: '\\u2692', campfire: '\\u2632', brainstorm: '\\u2609', tribunal: '\\u2696', image: '\\u229e', queue: '\\u231b', prompt: '\\u25bb', winner: '\\u2605', success: '\\u2714', fail: '\\u2718', warning: '\\u26a0', header: '\\u25b8', nero: '\\u2020', dotOn: '\\u25c6', dotOff: '\\u25c7', play: '\\u25b6', refresh: '\\u21bb', flag: '\\u2691', check: '\\u2714', cross: '\\u2718', spinner: '\\u25d0' });\n\n// @kern-source: icons:34\nexport const CLASSIC_ICONS: IconSet = ({ read: '\\ud83d\\udcc4', edit: '\\u270f\\ufe0f', write: '\\ud83d\\udcdd', bash: '\\u26a1', search: '\\ud83d\\udd0d', find: '\\ud83d\\udcc2', tool: '\\ud83d\\udd27', campfire: '\\ud83d\\udd25', brainstorm: '\\ud83d\\udca1', tribunal: '\\u2696', image: '\\ud83d\\udcce', queue: '\\u23f3', prompt: '\\u276f', winner: '\\u2605', success: '\\u2714', fail: '\\u2718', warning: '\\u26a0', header: '\\u25b8', nero: '\\u2694', dotOn: '\\u25cf', dotOff: '\\u25cb', play: '\\u25b6', refresh: '\\u21bb', flag: '\\u2691', check: '\\u2714', cross: '\\u2718', spinner: '\\u25d0' });\n\n/**\n * Resolve icon set from config. Call once per render cycle.\n */\n// @kern-source: icons:36\nexport function icons(): IconSet {\n const theme = loadConfig().iconTheme ?? 'roman';\n return (theme === 'classic') ? CLASSIC_ICONS : ROMAN_ICONS;\n}\n","// @generated by kern v3.5.7 — DO NOT EDIT. Source: src/kern/blocks/output-format.kern\n\nimport { icons } from '../signals/icons.js';\n\n// ── Module: OutputFormatting ──\n\nexport const BOLD: string = '\\x1b[1m';\n\nexport const DIM: string = '\\x1b[2m';\n\nexport const ITALIC: string = '\\x1b[3m';\n\nexport const GREEN: string = '\\x1b[32m';\n\nexport const RED: string = '\\x1b[31m';\n\nexport const YELLOW: string = '\\x1b[33m';\n\nexport const BLUE: string = '\\x1b[34m';\n\nexport const MAGENTA: string = '\\x1b[35m';\n\nexport const CYAN: string = '\\x1b[36m';\n\nexport const WHITE: string = '\\x1b[37m';\n\nexport const RESET: string = '\\x1b[0m';\n\nexport const LOGO_COLORS: number[] = [208, 214, 220, 226, 228, 230, 255];\n\nexport const ENGINE_COLORS: Record<string, number> = { claude: 208, codex: 34, agy: 33, ollama: 255, aider: 141, openrouter: 197, qwen: 45, mistral: 75, opencode: 156, minimax: 124, zai: 124 };\n\nexport function fg256(code: number, text: string): string {\n return `\\x1b[38;5;${code}m${text}${RESET}`;\n}\n\nexport function bgFg(bg: number, fg: number, text: string): string {\n return `\\x1b[48;5;${bg};38;5;${fg}m${text}${RESET}`;\n}\n\nexport function bold(text: string): string {\n return `${BOLD}${text}${RESET}`;\n}\n\nexport function dim(text: string): string {\n return `${DIM}${text}${RESET}`;\n}\n\nexport function green(text: string): string {\n return `${GREEN}${text}${RESET}`;\n}\n\nexport function red(text: string): string {\n return `${RED}${text}${RESET}`;\n}\n\nexport function yellow(text: string): string {\n return `${YELLOW}${text}${RESET}`;\n}\n\nexport function cyan(text: string): string {\n return `${CYAN}${text}${RESET}`;\n}\n\nexport function blue(text: string): string {\n return `${BLUE}${text}${RESET}`;\n}\n\nexport function magenta(text: string): string {\n return `${MAGENTA}${text}${RESET}`;\n}\n\nexport function white(text: string): string {\n return `${WHITE}${text}${RESET}`;\n}\n\nexport function italic(text: string): string {\n return `${ITALIC}${text}${RESET}`;\n}\n\nfunction stripAnsi(str: string): string {\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\nfunction visibleLength(str: string): number {\n return stripAnsi(str).length;\n}\n\nexport function gradientText(text: string, colors: number[]): string {\n let result = '';\n const step = Math.max(1, Math.floor(text.length / colors.length));\n for (let i = 0; i < text.length; i++) {\n const colorIdx = Math.min(Math.floor(i / step), colors.length - 1);\n result += fg256(colors[colorIdx], text[i]);\n }\n return result;\n}\n\nexport function header(text: string): void {\n const { header: h } = icons();\n console.log(`\\n${BOLD}${CYAN}${h} ${text}${RESET}`);\n}\n\nexport function success(text: string): void {\n const { success: s } = icons();\n console.log(`${GREEN}${s}${RESET} ${text}`);\n}\n\nexport function fail(text: string): void {\n const { fail: f } = icons();\n console.log(`${RED}${f}${RESET} ${text}`);\n}\n\nexport function warn(text: string): void {\n const { warning: w } = icons();\n console.log(`${YELLOW}${w}${RESET} ${text}`);\n}\n\nexport function info(text: string): void {\n console.log(`${DIM}${text}${RESET}`);\n}\n\nexport function scoreboard(title: string, engineIds: string[], metrics: Array<{label:string,values:string[]}>, winnerId?: string|null): void {\n const labelWidth = Math.max(14, ...metrics.map((m: {label:string}) => m.label.length));\n const colWidths = engineIds.map((id: string, col: number) =>\n Math.max(\n visibleLength(id) + 2,\n ...metrics.map((m: {values:string[]}) => visibleLength(m.values[col] ?? '') + 2),\n ),\n );\n console.log(`\\n ${BOLD}${WHITE}${title}${RESET}`);\n const headerCells = engineIds.map((id: string, i: number) => {\n const color = ENGINE_COLORS[id] ?? 124;\n const name = id === winnerId ? `${icons().winner} ${id}` : id;\n const styled = fg256(color, BOLD + name + RESET);\n const pad = colWidths[i] - visibleLength(name);\n return styled + ' '.repeat(Math.max(0, pad));\n });\n console.log(` ${''.padEnd(labelWidth)} ${headerCells.join(' ')}`);\n const sepWidth = labelWidth + colWidths.reduce((s: number, w: number) => s + w + 2, 0) + 2;\n console.log(` ${DIM}${'─'.repeat(sepWidth)}${RESET}`);\n for (const metric of metrics) {\n const label = `${BOLD}${metric.label.padEnd(labelWidth)}${RESET}`;\n const cells = metric.values.map((val: string, i: number) => {\n const pad = colWidths[i] - visibleLength(val);\n return val + ' '.repeat(Math.max(0, pad));\n });\n console.log(` ${label} ${cells.join(' ')}`);\n }\n console.log('');\n}\n\nexport function table(headers: string[], rows: string[][]): void {\n const widths = headers.map((h: string, i: number) =>\n Math.max(visibleLength(h), ...rows.map((r: string[]) => visibleLength(r[i] ?? ''))),\n );\n const headerLine = headers\n .map((h: string, i: number) => h.padEnd(widths[i]))\n .join(' ');\n const separator = widths.map((w: number) => '─'.repeat(w)).join('──');\n console.log(` ${bold(headerLine)}`);\n console.log(` ${dim(separator)}`);\n for (const row of rows) {\n const line = row.map((cell: string, i: number) => {\n const pad = widths[i] - visibleLength(cell);\n return cell + ' '.repeat(Math.max(0, pad));\n }).join(' ');\n console.log(` ${line}`);\n }\n}\n\nexport function shortToolPath(filePath: string): string {\n const home = process.env.HOME; const stripped = String(filePath ?? '').replace(`${process.cwd()}/`, ''); return home ? stripped.replace(home, '~') : stripped;\n}\n\nexport function isCesarTelemetryLine(message: string): boolean {\n const text = String(message ?? '').trim();\n return text.startsWith('Cesar route:') || text.startsWith('What happened:');\n}\n\nexport function formatConfidenceToolLabel(parsed: any, rawInput: string): string {\n const rawValue = parsed?.value ?? parsed?.confidence ?? parsed?.score;\n let value = Number(rawValue);\n if (!Number.isFinite(value)) {\n const text = String(rawInput ?? '');\n const match = text.match(/\"value\"\\s*:\\s*(\\d{1,3}(?:\\.\\d+)?)/) || text.match(/(\\d{1,3})\\s*%/);\n if (match) {\n value = Number(match[1]);\n }\n }\n if (Number.isFinite(value)) {\n const pct = (value <= 1 && value > 0) ? Math.round(value * 100) : Math.round(value);\n if (pct >= 0 && pct <= 100) {\n const reasoning = String(parsed?.reasoning ?? parsed?.reason ?? parsed?.thought ?? '').replace(/\\s+/g, ' ').trim();\n const shortReasoning = (reasoning.length > 180) ? `${reasoning.slice(0, 177)}…` : reasoning;\n return shortReasoning ? `${pct}% confidence · ${shortReasoning}` : `${pct}% confidence`;\n }\n }\n return 'confidence';\n}\n","// @generated by kern v3.5.7 — DO NOT EDIT. Source: src/kern/blocks/markdown.kern\n\n// ── Module: MarkdownParsing ──\n\n// @kern-source: markdown:2\nexport interface ContentSegment {\n type: 'prose'|'code'|'table';\n text: string|undefined;\n language: string|undefined;\n code: string|undefined;\n index: number|undefined;\n headers: string[]|undefined;\n rows: string[][]|undefined;\n alignments: ('left'|'center'|'right')[]|undefined;\n}\n\n// @kern-source: markdown:12\nexport const FENCE_OPEN: RegExp = /^```(\\w*)\\s*$/;\n\n// @kern-source: markdown:14\nexport const FENCE_CLOSE: RegExp = /^```\\s*$/;\n\n// @kern-source: markdown:16\nfunction isTableSeparator(line: string): boolean {\n return /^\\|[\\s:_-]+(\\|[\\s:_-]+)*\\|?\\s*$/.test(line.trim());\n}\n\n// @kern-source: markdown:18\nfunction isTableRow(line: string): boolean {\n const t = line.trim();\n return t.startsWith('|') && t.includes('|', 1);\n}\n\n// @kern-source: markdown:23\nfunction parseTableAlignment(sepLine: string): ('left'|'center'|'right')[] {\n const cells = sepLine.trim().replace(/^\\||\\|$/g, '').split('|');\n return cells.map((c: string) => {\n const t = c.trim();\n if (t.startsWith(':') && t.endsWith(':')) return 'center' as const;\n if (t.endsWith(':')) return 'right' as const;\n return 'left' as const;\n });\n}\n\n// @kern-source: markdown:34\nfunction parseTableCells(line: string): string[] {\n return line.trim().replace(/^\\||\\|$/g, '').split('|').map((c: string) => c.trim());\n}\n\n// @kern-source: markdown:36\nfunction emitProseWithTables(proseLines: string[], segments: ContentSegment[]): void {\n let i = 0;\n let buffered: string[] = [];\n\n function flushProse(): void {\n const text = buffered.join('\\n');\n if (text.trim()) {\n segments.push({ type: 'prose', text, language: undefined, code: undefined, index: undefined, headers: undefined, rows: undefined, alignments: undefined });\n }\n buffered = [];\n }\n\n while (i < proseLines.length) {\n // Check for table: current line is a table row AND next line is a separator\n if (isTableRow(proseLines[i]) && i + 1 < proseLines.length && isTableSeparator(proseLines[i + 1])) {\n flushProse();\n const headers = parseTableCells(proseLines[i]);\n const alignments = parseTableAlignment(proseLines[i + 1]);\n const rows: string[][] = [];\n i += 2; // skip header + separator\n while (i < proseLines.length && isTableRow(proseLines[i]) && !isTableSeparator(proseLines[i])) {\n rows.push(parseTableCells(proseLines[i]));\n i++;\n }\n segments.push({ type: 'table', text: undefined, language: undefined, code: undefined, index: undefined, headers, rows, alignments });\n continue;\n }\n\n buffered.push(proseLines[i]);\n i++;\n }\n flushProse();\n}\n\n// @kern-source: markdown:71\nexport const _mdCache: Map<string, ContentSegment[]> = new Map();\n\n// @kern-source: markdown:73\nexport const _MD_CACHE_MAX: number = 500;\n\n// @kern-source: markdown:75\nexport function parseMarkdownBlocks(text: string): ContentSegment[] {\n // LRU cache — avoid re-parsing identical content during streaming\n // Use djb2 hash for large strings to avoid collisions\n let key: string;\n if (text.length < 500) {\n key = text;\n } else {\n let hash = 5381;\n for (let i = 0; i < text.length; i++) {\n hash = ((hash << 5) + hash + text.charCodeAt(i)) | 0;\n }\n key = `h:${hash}:${text.length}`;\n }\n const cached = _mdCache.get(key);\n if (cached) return cached;\n\n const lines = text.split('\\n');\n const segments: ContentSegment[] = [];\n\n let inCode = false;\n let codeLang = '';\n let codeLines: string[] = [];\n let proseLines: string[] = [];\n let codeIndex = 0;\n\n for (const line of lines) {\n const trimmed = line.trimStart();\n\n if (!inCode) {\n const openMatch = trimmed.match(FENCE_OPEN);\n if (openMatch) {\n emitProseWithTables(proseLines, segments);\n proseLines = [];\n inCode = true;\n codeLang = openMatch[1] ?? '';\n codeLines = [];\n continue;\n }\n proseLines.push(line);\n } else {\n if (FENCE_CLOSE.test(trimmed)) {\n if (codeLines.length > 0) {\n codeIndex++;\n segments.push({ type: 'code', language: codeLang, code: codeLines.join('\\n'), text: undefined, index: codeIndex, headers: undefined, rows: undefined, alignments: undefined });\n }\n inCode = false;\n codeLang = '';\n codeLines = [];\n continue;\n }\n codeLines.push(line);\n }\n }\n\n if (inCode && codeLines.length > 0) {\n codeIndex++;\n segments.push({ type: 'code', language: codeLang, code: codeLines.join('\\n'), text: undefined, index: codeIndex, headers: undefined, rows: undefined, alignments: undefined });\n } else if (proseLines.length > 0) {\n emitProseWithTables(proseLines, segments);\n }\n\n // Store in cache, evict oldest if full\n if (_mdCache.size >= _MD_CACHE_MAX) {\n const firstKey = _mdCache.keys().next().value;\n if (firstKey !== undefined) _mdCache.delete(firstKey);\n }\n _mdCache.set(key, segments);\n\n return segments;\n}\n\n// @kern-source: markdown:147\nexport function truncateCodeLine(line: string, maxWidth: number): string {\n if (line.length <= maxWidth) {\n return line;\n }\n const overflow = line.length - maxWidth + 1;\n return line.slice(0, maxWidth - 1) + `…+${overflow}`;\n}\n\n// @kern-source: markdown:154\nfunction extractCodexStructured(text: string): string|null {\n const summaryMatch = text.match(/summary:\\s*\"([\\s\\S]*?)\"\\s*(?:sections\\s*\\{|$)/);\n const contentMatches = [...text.matchAll(/content:\\s*\"([\\s\\S]*?)\"\\s*\\}/g)];\n if (!summaryMatch || contentMatches.length === 0) {\n return null;\n }\n const parts: string[] = [summaryMatch[1]];\n const sectionMatches = [...text.matchAll(/\\d+:\\s*\"([^\"]+)\"\\s*\\{\\s*content:\\s*\"([\\s\\S]*?)\"\\s*\\}/g)];\n for (const m of sectionMatches) {\n parts.push(`\\n## ${m[1]}\\n${m[2]}`);\n }\n return parts.join('\\n').replace(/\\\\n/g, '\\n').trim();\n}\n\n// @kern-source: markdown:166\nfunction parseStreamJsonLine(trimmed: string): {action:'use'|'skip'|'keep', content?:string} {\n try {\n const parsed = JSON.parse(trimmed);\n if (!parsed.type) return { action: 'keep' };\n\n // Extract actual text content from streaming events\n if (parsed.type === 'assistant' && parsed.message?.content) {\n const content = typeof parsed.message.content === 'string'\n ? parsed.message.content\n : Array.isArray(parsed.message.content)\n ? parsed.message.content.filter((b: any) => b.type === 'text').map((b: any) => b.text).join('\\n')\n : '';\n return content ? { action: 'use', content } : { action: 'skip' };\n }\n\n // OpenCode: text events with actual content in part.text\n if (parsed.type === 'text' && parsed.part?.text) {\n return { action: 'use', content: parsed.part.text };\n }\n\n // Result events — extract content if present, skip error metadata\n if (parsed.type === 'result') {\n if (parsed.subtype === 'error_max_turns' || parsed.is_error) return { action: 'skip' };\n if (parsed.result && typeof parsed.result === 'string') return { action: 'use', content: parsed.result };\n return { action: 'skip' };\n }\n\n // Skip ALL known streaming metadata types (Claude, OpenCode, Codex, Gemini)\n const skipTypes = [\n 'system', 'hook_started', 'hook_response', 'tool_use', 'tool_result',\n 'user', 'rate_limit_event', 'message_start', 'message_stop', 'message_delta',\n 'content_block_start', 'content_block_stop', 'content_block_delta',\n 'step_start', 'step_finish', 'step-start', 'step-finish',\n 'ping', 'error', 'init', 'session_start', 'session_end',\n ];\n if (skipTypes.includes(parsed.type)) return { action: 'skip' };\n if (parsed.type?.startsWith('hook_')) return { action: 'skip' };\n if (parsed.type?.startsWith('step_')) return { action: 'skip' };\n if (parsed.subtype === 'system') return { action: 'skip' };\n\n // Any JSON with sessionID, session_id, or uuid is streaming metadata — skip\n if (parsed.sessionID || parsed.session_id || parsed.uuid) return { action: 'skip' };\n\n } catch {\n // Not valid JSON — keep as text\n }\n return { action: 'keep' };\n}\n\n/**\n * Remove inline sentence repetition like 'Hello.Hello.' within a single line.\n */\n// @kern-source: markdown:216\nfunction deduplicateInline(line: string): string {\n // Check if the line is a repeated substring (e.g. \"abcabc\" → \"abc\")\n const len = line.length;\n if (len < 10) return line;\n for (let half = Math.floor(len / 2); half >= 5; half--) {\n const candidate = line.slice(0, half);\n // Check if the rest of the line starts with the same candidate\n if (line.slice(half).startsWith(candidate)) {\n return candidate + line.slice(half + candidate.length);\n }\n }\n return line;\n}\n\n/**\n * Remove consecutive duplicate paragraphs/sentences from buddy streaming output.\n */\n// @kern-source: markdown:232\nfunction deduplicateParagraphs(text: string): string {\n // First: deduplicate within each line (streaming chunk concatenation artifacts)\n const lines = text.split('\\n');\n const dedupedLines = lines.map((l: string) => deduplicateInline(l));\n const joined = dedupedLines.join('\\n');\n // Then: deduplicate consecutive paragraphs\n const paragraphs = joined.split(/\\n{2,}/);\n const seen = new Set<string>();\n const deduped: string[] = [];\n for (const para of paragraphs) {\n const normalized = para.trim().replace(/\\s+/g, ' ');\n if (!normalized) {\n continue;\n }\n if (seen.has(normalized)) {\n continue;\n }\n seen.add(normalized);\n deduped.push(para.trim());\n }\n return deduped.join('\\n\\n');\n}\n\n/**\n * Strip progressive thinking/status updates that duplicate as streaming chunks.\n */\n// @kern-source: markdown:253\nfunction stripBuddyThinkingNoise(text: string): string {\n const lines = text.split('\\n');\n const result: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Skip raw command output metadata from Codex\n if (trimmed.startsWith('Command:') && trimmed.includes('/bin/')) continue;\n if (trimmed.startsWith('Chunk ID:')) continue;\n if (trimmed.startsWith('Wall time:')) continue;\n if (trimmed.startsWith('Process exited with code')) continue;\n if (trimmed.startsWith('Original token count:')) continue;\n if (trimmed === 'Output:') continue;\n\n // Skip lines that are exact substrings of the next line (progressive thinking)\n if (i + 1 < lines.length) {\n const next = lines[i + 1].trim();\n if (trimmed.length > 20 && next.startsWith(trimmed)) continue;\n }\n\n result.push(line);\n }\n\n return result.join('\\n');\n}\n\n// @kern-source: markdown:283\nfunction shortenFilePaths(text: string): string {\n // Only shorten paths in prose — skip fenced code blocks\n const fenceRe = /^```[\\s\\S]*?^```/gm;\n const fences: Array<{ start: number; end: number }> = [];\n let fm: RegExpExecArray | null;\n while ((fm = fenceRe.exec(text)) !== null) {\n fences.push({ start: fm.index, end: fm.index + fm[0].length });\n }\n function insideFence(pos: number): boolean {\n return fences.some(f => pos >= f.start && pos < f.end);\n }\n\n const cwd = process.cwd();\n const home = process.env.HOME ?? '';\n\n const exts = 'tsx|jsx|ts|js|json|kern|md|py|rs|go|yaml|yml|toml|sh|css|html|svelte|vue|rb|java|cpp|c|h';\n const pathRe = new RegExp('(?<!`)(?:~/|/)[A-Za-z0-9._\\\\-/]+\\\\.(?:' + exts + ')(?::[0-9]+(?::[0-9]+)?|#L[0-9]+)?(?!`)', 'g');\n\n return text.replace(pathRe, (match, offset: number) => {\n // Never rewrite paths inside fenced code blocks\n if (insideFence(offset)) return match;\n // Skip if too short or doesn't look like a real path\n if (match.length < 10) return match;\n if (!match.includes('/')) return match;\n\n let shortened = match;\n\n // Expand ~/ to home\n if (shortened.startsWith('~/') && home) {\n shortened = home + shortened.slice(1);\n }\n\n // Strip cwd prefix → relative path\n if (shortened.startsWith(cwd + '/')) {\n shortened = shortened.slice(cwd.length + 1);\n }\n // Strip home prefix → ~/...\n else if (home && shortened.startsWith(home + '/')) {\n shortened = '~/' + shortened.slice(home.length + 1);\n }\n\n // Collapse to just filename:line for inline references\n // packages/cli/src/generated/handlers-cesar-brain.ts:91 → handlers-cesar-brain.ts:91\n const parts = shortened.split('/');\n if (parts.length > 2) {\n shortened = parts[parts.length - 1];\n }\n\n // Wrap in backticks for inline-code (purple) styling\n return '`' + shortened + '`';\n });\n}\n\n/**\n * Gently insert paragraph breaks in very dense text walls — only when truly needed.\n */\n// @kern-source: markdown:337\nfunction addParagraphBreaks(text: string): string {\n const paragraphs = text.split(/\\n{2,}/);\n const result: string[] = [];\n\n for (const para of paragraphs) {\n const lines = para.split('\\n');\n // Skip if already has markdown structure (headers, real lists) or is short\n const isStructured = lines.some(l => /^(#{1,3}\\s|[-*]\\s+\\w|\\d+\\.\\s+\\w|>\\s)/.test(l.trimStart()));\n const totalLen = lines.reduce((sum, l) => sum + l.length, 0);\n if (isStructured || totalLen < 250) {\n result.push(para);\n continue;\n }\n\n // Split dense blocks at sentence boundaries\n const joined = lines.join(' ');\n const sentences = joined.split(/(?<=\\.\\s)(?=[A-Z])/);\n if (sentences.length <= 2) {\n result.push(para);\n continue;\n }\n\n // Group into chunks of 3 sentences\n const chunks: string[] = [];\n let current = '';\n let count = 0;\n for (const sentence of sentences) {\n current += sentence;\n count++;\n if (count >= 3 || current.length > 250) {\n chunks.push(current.trim());\n current = '';\n count = 0;\n }\n }\n if (current.trim()) chunks.push(current.trim());\n result.push(chunks.join('\\n\\n'));\n }\n\n return result.join('\\n\\n');\n}\n\n// @kern-source: markdown:381\nexport const _cleanCache: Map<string, string> = new Map();\n\n// @kern-source: markdown:383\nexport function cleanEngineOutput(raw: string): string {\n // Key by raw content — different streams can share lengths, so length alone collides.\n const cached = _cleanCache.get(raw);\n if (cached !== undefined) {\n return cached;\n }\n const lines = raw.split('\\n');\n const cleaned: string[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n if (cleaned.length === 0 && !trimmed) {\n continue;\n }\n if (trimmed.startsWith('{') && trimmed.includes('\"type\"')) {\n const result = parseStreamJsonLine(trimmed);\n if (result.action === 'skip') {\n continue;\n }\n if (result.action === 'use') {\n cleaned.push(result.content!);\n continue;\n }\n }\n cleaned.push(line);\n }\n let result = cleaned.join('\\n').trim();\n const codexResult = extractCodexStructured(result);\n if (codexResult) {\n result = codexResult;\n }\n // Strip XML tool tags — engines embed <tool>, <tool_result>, <invoke> in text\n result = result.replace(/<tool\\s+name=\"[^\"]*\">[\\s\\S]*?<\\/tool>/g, '');\n result = result.replace(/<tool\\s+name=\"[^\"]*\">[\\s\\S]*?<\\/invoke>(\\s*<\\/[a-zA-Z_:]+>)*/g, '');\n result = result.replace(/<tool_result[\\s\\S]*?<\\/tool_result>/g, '');\n result = result.replace(/<\\/minimax:tool_call>/g, '');\n result = result.replace(/<parameter\\s+name=\"[^\"]*\">[^<]*<\\/parameter>/g, '');\n result = result.replace(/<tool_calls>[\\s\\S]*?<\\/tool_calls>/gi, '');\n result = result.replace(/<(Read|Write|Edit|Bash|Grep|Glob|LS|ListPlans|Retrieve)\\b[\\s\\S]*?<\\/\\1>/g, '');\n result = result.replace(/<\\/?(file_path|path|pattern|command|query|content|old_string|new_string|start_line|end_line|id)>\\s*/g, '');\n // Strip reasoning tags from models that use <think>...</think> (MiniMax, DeepSeek, Qwen, etc.)\n result = result.replace(/<think>[\\s\\S]*?<\\/think>\\s*/gi, '');\n // R7: Strip narration stems — companion engines narrate their research process\n result = result.replace(/^(I'm checking|I'm looking|I'm reading|I'm searching|I'm inspecting|Let me check|Let me look|Let me read|Let me search|Let me inspect|I've confirmed|I've verified|I've checked|I'll now|I will now|Now I'm|Now let me|First,? I'll|First,? let me|Next,? I'll|Next,? let me)\\b[^.\\n]*[.\\n]\\s*/gim, '');\n // Clean buddy streaming artifacts\n result = stripBuddyThinkingNoise(result);\n result = deduplicateParagraphs(result);\n // Break dense walls of text into paragraphs at sentence boundaries\n result = addParagraphBreaks(result);\n // Shorten absolute file paths → relative, backtick-wrapped for purple styling\n result = shortenFilePaths(result);\n // Cache and evict old entries\n if (_cleanCache.size > 200) {\n _cleanCache.clear();\n }\n _cleanCache.set(raw, result);\n return result;\n}\n"],"mappings":"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","names":["result"]}
|
|
1
|
+
{"version":3,"sources":["../src/generated/signals/icons.ts","../src/generated/blocks/output-format.ts","../src/generated/blocks/markdown.ts"],"sourcesContent":["// @generated by kern v3.5.7 — DO NOT EDIT. Source: src/kern/signals/icons.kern\n\nimport { loadConfig } from '@kernlang/agon-core';\n\n// @kern-source: icons:3\nexport interface IconSet {\n read: string;\n edit: string;\n write: string;\n bash: string;\n search: string;\n find: string;\n tool: string;\n campfire: string;\n brainstorm: string;\n tribunal: string;\n image: string;\n queue: string;\n prompt: string;\n winner: string;\n success: string;\n fail: string;\n warning: string;\n header: string;\n nero: string;\n dotOn: string;\n dotOff: string;\n play: string;\n refresh: string;\n flag: string;\n check: string;\n cross: string;\n spinner: string;\n}\n\n// @kern-source: icons:32\nexport const ROMAN_ICONS: IconSet = ({ read: '\\u039e', edit: '\\u270e', write: '\\u2712', bash: '\\u03df', search: '\\u2609', find: '\\u2295', tool: '\\u2692', campfire: '\\u2632', brainstorm: '\\u2609', tribunal: '\\u2696', image: '\\u229e', queue: '\\u231b', prompt: '\\u25bb', winner: '\\u2605', success: '\\u2714', fail: '\\u2718', warning: '\\u26a0', header: '\\u25b8', nero: '\\u2020', dotOn: '\\u25c6', dotOff: '\\u25c7', play: '\\u25b6', refresh: '\\u21bb', flag: '\\u2691', check: '\\u2714', cross: '\\u2718', spinner: '\\u25d0' });\n\n// @kern-source: icons:34\nexport const CLASSIC_ICONS: IconSet = ({ read: '\\ud83d\\udcc4', edit: '\\u270f\\ufe0f', write: '\\ud83d\\udcdd', bash: '\\u26a1', search: '\\ud83d\\udd0d', find: '\\ud83d\\udcc2', tool: '\\ud83d\\udd27', campfire: '\\ud83d\\udd25', brainstorm: '\\ud83d\\udca1', tribunal: '\\u2696', image: '\\ud83d\\udcce', queue: '\\u23f3', prompt: '\\u276f', winner: '\\u2605', success: '\\u2714', fail: '\\u2718', warning: '\\u26a0', header: '\\u25b8', nero: '\\u2694', dotOn: '\\u25cf', dotOff: '\\u25cb', play: '\\u25b6', refresh: '\\u21bb', flag: '\\u2691', check: '\\u2714', cross: '\\u2718', spinner: '\\u25d0' });\n\n/**\n * Resolve icon set from config. Call once per render cycle.\n */\n// @kern-source: icons:36\nexport function icons(): IconSet {\n const theme = loadConfig().iconTheme ?? 'roman';\n return (theme === 'classic') ? CLASSIC_ICONS : ROMAN_ICONS;\n}\n","// @generated by kern v3.5.8 — DO NOT EDIT. Source: src/kern/blocks/output-format.kern\n\nimport { icons } from '../signals/icons.js';\n\n// ── Module: OutputFormatting ──\n\nexport const BOLD: string = '\\x1b[1m';\n\nexport const DIM: string = '\\x1b[2m';\n\nexport const ITALIC: string = '\\x1b[3m';\n\nexport const GREEN: string = '\\x1b[32m';\n\nexport const RED: string = '\\x1b[31m';\n\nexport const YELLOW: string = '\\x1b[33m';\n\nexport const BLUE: string = '\\x1b[34m';\n\nexport const MAGENTA: string = '\\x1b[35m';\n\nexport const CYAN: string = '\\x1b[36m';\n\nexport const WHITE: string = '\\x1b[37m';\n\nexport const RESET: string = '\\x1b[0m';\n\nexport const LOGO_COLORS: number[] = [208, 214, 220, 226, 228, 230, 255];\n\nexport const ENGINE_COLORS: Record<string, number> = { claude: 208, codex: 34, agy: 33, ollama: 255, aider: 141, openrouter: 197, qwen: 45, mistral: 75, opencode: 156, minimax: 124, zai: 124 };\n\nexport function fg256(code: number, text: string): string {\n return `\\x1b[38;5;${code}m${text}${RESET}`;\n}\n\nexport function bgFg(bg: number, fg: number, text: string): string {\n return `\\x1b[48;5;${bg};38;5;${fg}m${text}${RESET}`;\n}\n\nexport function bold(text: string): string {\n return `${BOLD}${text}${RESET}`;\n}\n\nexport function dim(text: string): string {\n return `${DIM}${text}${RESET}`;\n}\n\nexport function green(text: string): string {\n return `${GREEN}${text}${RESET}`;\n}\n\nexport function red(text: string): string {\n return `${RED}${text}${RESET}`;\n}\n\nexport function yellow(text: string): string {\n return `${YELLOW}${text}${RESET}`;\n}\n\nexport function cyan(text: string): string {\n return `${CYAN}${text}${RESET}`;\n}\n\nexport function blue(text: string): string {\n return `${BLUE}${text}${RESET}`;\n}\n\nexport function magenta(text: string): string {\n return `${MAGENTA}${text}${RESET}`;\n}\n\nexport function white(text: string): string {\n return `${WHITE}${text}${RESET}`;\n}\n\nexport function italic(text: string): string {\n return `${ITALIC}${text}${RESET}`;\n}\n\nfunction stripAnsi(str: string): string {\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\nfunction visibleLength(str: string): number {\n return stripAnsi(str).length;\n}\n\nexport function gradientText(text: string, colors: number[]): string {\n let result = '';\n const step = Math.max(1, Math.floor(text.length / colors.length));\n for (let i = 0; i < text.length; i++) {\n const colorIdx = Math.min(Math.floor(i / step), colors.length - 1);\n result += fg256(colors[colorIdx], text[i]);\n }\n return result;\n}\n\nexport function header(text: string): void {\n const { header: h } = icons();\n console.log(`\\n${BOLD}${CYAN}${h} ${text}${RESET}`);\n}\n\nexport function success(text: string): void {\n const { success: s } = icons();\n console.log(`${GREEN}${s}${RESET} ${text}`);\n}\n\nexport function fail(text: string): void {\n const { fail: f } = icons();\n console.log(`${RED}${f}${RESET} ${text}`);\n}\n\nexport function warn(text: string): void {\n const { warning: w } = icons();\n console.log(`${YELLOW}${w}${RESET} ${text}`);\n}\n\nexport function info(text: string): void {\n console.log(`${DIM}${text}${RESET}`);\n}\n\nexport function scoreboard(title: string, engineIds: string[], metrics: Array<{label:string,values:string[]}>, winnerId?: string|null): void {\n const labelWidth = Math.max(14, ...metrics.map((m: {label:string}) => m.label.length));\n const colWidths = engineIds.map((id: string, col: number) =>\n Math.max(\n visibleLength(id) + 2,\n ...metrics.map((m: {values:string[]}) => visibleLength(m.values[col] ?? '') + 2),\n ),\n );\n console.log(`\\n ${BOLD}${WHITE}${title}${RESET}`);\n const headerCells = engineIds.map((id: string, i: number) => {\n const color = ENGINE_COLORS[id] ?? 124;\n const name = id === winnerId ? `${icons().winner} ${id}` : id;\n const styled = fg256(color, BOLD + name + RESET);\n const pad = colWidths[i] - visibleLength(name);\n return styled + ' '.repeat(Math.max(0, pad));\n });\n console.log(` ${''.padEnd(labelWidth)} ${headerCells.join(' ')}`);\n const sepWidth = labelWidth + colWidths.reduce((s: number, w: number) => s + w + 2, 0) + 2;\n console.log(` ${DIM}${'─'.repeat(sepWidth)}${RESET}`);\n for (const metric of metrics) {\n const label = `${BOLD}${metric.label.padEnd(labelWidth)}${RESET}`;\n const cells = metric.values.map((val: string, i: number) => {\n const pad = colWidths[i] - visibleLength(val);\n return val + ' '.repeat(Math.max(0, pad));\n });\n console.log(` ${label} ${cells.join(' ')}`);\n }\n console.log('');\n}\n\nexport function table(headers: string[], rows: string[][]): void {\n const widths = headers.map((h: string, i: number) =>\n Math.max(visibleLength(h), ...rows.map((r: string[]) => visibleLength(r[i] ?? ''))),\n );\n const headerLine = headers\n .map((h: string, i: number) => h.padEnd(widths[i]))\n .join(' ');\n const separator = widths.map((w: number) => '─'.repeat(w)).join('──');\n console.log(` ${bold(headerLine)}`);\n console.log(` ${dim(separator)}`);\n for (const row of rows) {\n const line = row.map((cell: string, i: number) => {\n const pad = widths[i] - visibleLength(cell);\n return cell + ' '.repeat(Math.max(0, pad));\n }).join(' ');\n console.log(` ${line}`);\n }\n}\n\nexport function shortToolPath(filePath: string): string {\n const home = process.env.HOME; const stripped = String(filePath ?? '').replace(`${process.cwd()}/`, ''); return home ? stripped.replace(home, '~') : stripped;\n}\n\nexport function isCesarTelemetryLine(message: string): boolean {\n const text = String(message ?? '').trim();\n return text.startsWith('Cesar route:') || text.startsWith('What happened:');\n}\n\nexport function formatConfidenceToolLabel(parsed: any, rawInput: string): string {\n const rawValue = parsed?.value ?? parsed?.confidence ?? parsed?.score;\n let value = Number(rawValue);\n if (!Number.isFinite(value)) {\n const text = String(rawInput ?? '');\n const match = text.match(/\"value\"\\s*:\\s*(\\d{1,3}(?:\\.\\d+)?)/) || text.match(/(\\d{1,3})\\s*%/);\n if (match) {\n value = Number(match[1]);\n }\n }\n if (Number.isFinite(value)) {\n const pct = (value <= 1 && value > 0) ? Math.round(value * 100) : Math.round(value);\n if (pct >= 0 && pct <= 100) {\n const reasoning = String(parsed?.reasoning ?? parsed?.reason ?? parsed?.thought ?? '').replace(/\\s+/g, ' ').trim();\n const shortReasoning = (reasoning.length > 180) ? `${reasoning.slice(0, 177)}…` : reasoning;\n return shortReasoning ? `${pct}% confidence · ${shortReasoning}` : `${pct}% confidence`;\n }\n }\n return 'confidence';\n}\n","// @generated by kern v3.5.8 — DO NOT EDIT. Source: src/kern/blocks/markdown.kern\n\n// ── Module: MarkdownParsing ──\n\n// @kern-source: markdown:2\nexport interface ContentSegment {\n type: 'prose'|'code'|'table';\n text: string|undefined;\n language: string|undefined;\n code: string|undefined;\n index: number|undefined;\n headers: string[]|undefined;\n rows: string[][]|undefined;\n alignments: ('left'|'center'|'right')[]|undefined;\n}\n\n// @kern-source: markdown:12\nexport const FENCE_OPEN: RegExp = /^```(\\w*)\\s*$/;\n\n// @kern-source: markdown:14\nexport const FENCE_CLOSE: RegExp = /^```\\s*$/;\n\n// @kern-source: markdown:16\nfunction isTableSeparator(line: string): boolean {\n return /^\\|[\\s:_-]+(\\|[\\s:_-]+)*\\|?\\s*$/.test(line.trim());\n}\n\n// @kern-source: markdown:18\nfunction isTableRow(line: string): boolean {\n const t = line.trim();\n return t.startsWith('|') && t.includes('|', 1);\n}\n\n// @kern-source: markdown:23\nfunction parseTableAlignment(sepLine: string): ('left'|'center'|'right')[] {\n const cells = sepLine.trim().replace(/^\\||\\|$/g, '').split('|');\n return cells.map((c: string) => {\n const t = c.trim();\n if (t.startsWith(':') && t.endsWith(':')) return 'center' as const;\n if (t.endsWith(':')) return 'right' as const;\n return 'left' as const;\n });\n}\n\n// @kern-source: markdown:34\nfunction parseTableCells(line: string): string[] {\n return line.trim().replace(/^\\||\\|$/g, '').split('|').map((c: string) => c.trim());\n}\n\n// @kern-source: markdown:36\nfunction emitProseWithTables(proseLines: string[], segments: ContentSegment[]): void {\n let i = 0;\n let buffered: string[] = [];\n\n function flushProse(): void {\n const text = buffered.join('\\n');\n if (text.trim()) {\n segments.push({ type: 'prose', text, language: undefined, code: undefined, index: undefined, headers: undefined, rows: undefined, alignments: undefined });\n }\n buffered = [];\n }\n\n while (i < proseLines.length) {\n // Check for table: current line is a table row AND next line is a separator\n if (isTableRow(proseLines[i]) && i + 1 < proseLines.length && isTableSeparator(proseLines[i + 1])) {\n flushProse();\n const headers = parseTableCells(proseLines[i]);\n const alignments = parseTableAlignment(proseLines[i + 1]);\n const rows: string[][] = [];\n i += 2; // skip header + separator\n while (i < proseLines.length && isTableRow(proseLines[i]) && !isTableSeparator(proseLines[i])) {\n rows.push(parseTableCells(proseLines[i]));\n i++;\n }\n segments.push({ type: 'table', text: undefined, language: undefined, code: undefined, index: undefined, headers, rows, alignments });\n continue;\n }\n\n buffered.push(proseLines[i]);\n i++;\n }\n flushProse();\n}\n\n// @kern-source: markdown:71\nexport const _mdCache: Map<string, ContentSegment[]> = new Map();\n\n// @kern-source: markdown:73\nexport const _MD_CACHE_MAX: number = 500;\n\n// @kern-source: markdown:75\nexport function parseMarkdownBlocks(text: string): ContentSegment[] {\n // LRU cache — avoid re-parsing identical content during streaming\n // Use djb2 hash for large strings to avoid collisions\n let key: string;\n if (text.length < 500) {\n key = text;\n } else {\n let hash = 5381;\n for (let i = 0; i < text.length; i++) {\n hash = ((hash << 5) + hash + text.charCodeAt(i)) | 0;\n }\n key = `h:${hash}:${text.length}`;\n }\n const cached = _mdCache.get(key);\n if (cached) return cached;\n\n const lines = text.split('\\n');\n const segments: ContentSegment[] = [];\n\n let inCode = false;\n let codeLang = '';\n let codeLines: string[] = [];\n let proseLines: string[] = [];\n let codeIndex = 0;\n\n for (const line of lines) {\n const trimmed = line.trimStart();\n\n if (!inCode) {\n const openMatch = trimmed.match(FENCE_OPEN);\n if (openMatch) {\n emitProseWithTables(proseLines, segments);\n proseLines = [];\n inCode = true;\n codeLang = openMatch[1] ?? '';\n codeLines = [];\n continue;\n }\n proseLines.push(line);\n } else {\n if (FENCE_CLOSE.test(trimmed)) {\n if (codeLines.length > 0) {\n codeIndex++;\n segments.push({ type: 'code', language: codeLang, code: codeLines.join('\\n'), text: undefined, index: codeIndex, headers: undefined, rows: undefined, alignments: undefined });\n }\n inCode = false;\n codeLang = '';\n codeLines = [];\n continue;\n }\n codeLines.push(line);\n }\n }\n\n if (inCode && codeLines.length > 0) {\n codeIndex++;\n segments.push({ type: 'code', language: codeLang, code: codeLines.join('\\n'), text: undefined, index: codeIndex, headers: undefined, rows: undefined, alignments: undefined });\n } else if (proseLines.length > 0) {\n emitProseWithTables(proseLines, segments);\n }\n\n // Store in cache, evict oldest if full\n if (_mdCache.size >= _MD_CACHE_MAX) {\n const firstKey = _mdCache.keys().next().value;\n if (firstKey !== undefined) _mdCache.delete(firstKey);\n }\n _mdCache.set(key, segments);\n\n return segments;\n}\n\n// @kern-source: markdown:147\nexport function truncateCodeLine(line: string, maxWidth: number): string {\n if (line.length <= maxWidth) {\n return line;\n }\n const overflow = line.length - maxWidth + 1;\n return line.slice(0, maxWidth - 1) + `…+${overflow}`;\n}\n\n// @kern-source: markdown:154\nfunction extractCodexStructured(text: string): string|null {\n const summaryMatch = text.match(/summary:\\s*\"([\\s\\S]*?)\"\\s*(?:sections\\s*\\{|$)/);\n const contentMatches = [...text.matchAll(/content:\\s*\"([\\s\\S]*?)\"\\s*\\}/g)];\n if (!summaryMatch || contentMatches.length === 0) {\n return null;\n }\n const parts: string[] = [summaryMatch[1]];\n const sectionMatches = [...text.matchAll(/\\d+:\\s*\"([^\"]+)\"\\s*\\{\\s*content:\\s*\"([\\s\\S]*?)\"\\s*\\}/g)];\n for (const m of sectionMatches) {\n parts.push(`\\n## ${m[1]}\\n${m[2]}`);\n }\n return parts.join('\\n').replace(/\\\\n/g, '\\n').trim();\n}\n\n// @kern-source: markdown:166\nfunction parseStreamJsonLine(trimmed: string): {action:'use'|'skip'|'keep', content?:string} {\n try {\n const parsed = JSON.parse(trimmed);\n if (!parsed.type) return { action: 'keep' };\n\n // Extract actual text content from streaming events\n if (parsed.type === 'assistant' && parsed.message?.content) {\n const content = typeof parsed.message.content === 'string'\n ? parsed.message.content\n : Array.isArray(parsed.message.content)\n ? parsed.message.content.filter((b: any) => b.type === 'text').map((b: any) => b.text).join('\\n')\n : '';\n return content ? { action: 'use', content } : { action: 'skip' };\n }\n\n // OpenCode: text events with actual content in part.text\n if (parsed.type === 'text' && parsed.part?.text) {\n return { action: 'use', content: parsed.part.text };\n }\n\n // Result events — extract content if present, skip error metadata\n if (parsed.type === 'result') {\n if (parsed.subtype === 'error_max_turns' || parsed.is_error) return { action: 'skip' };\n if (parsed.result && typeof parsed.result === 'string') return { action: 'use', content: parsed.result };\n return { action: 'skip' };\n }\n\n // Skip ALL known streaming metadata types (Claude, OpenCode, Codex, Gemini)\n const skipTypes = [\n 'system', 'hook_started', 'hook_response', 'tool_use', 'tool_result',\n 'user', 'rate_limit_event', 'message_start', 'message_stop', 'message_delta',\n 'content_block_start', 'content_block_stop', 'content_block_delta',\n 'step_start', 'step_finish', 'step-start', 'step-finish',\n 'ping', 'error', 'init', 'session_start', 'session_end',\n ];\n if (skipTypes.includes(parsed.type)) return { action: 'skip' };\n if (parsed.type?.startsWith('hook_')) return { action: 'skip' };\n if (parsed.type?.startsWith('step_')) return { action: 'skip' };\n if (parsed.subtype === 'system') return { action: 'skip' };\n\n // Any JSON with sessionID, session_id, or uuid is streaming metadata — skip\n if (parsed.sessionID || parsed.session_id || parsed.uuid) return { action: 'skip' };\n\n } catch {\n // Not valid JSON — keep as text\n }\n return { action: 'keep' };\n}\n\n/**\n * Remove inline sentence repetition like 'Hello.Hello.' within a single line.\n */\n// @kern-source: markdown:216\nfunction deduplicateInline(line: string): string {\n // Check if the line is a repeated substring (e.g. \"abcabc\" → \"abc\")\n const len = line.length;\n if (len < 10) return line;\n for (let half = Math.floor(len / 2); half >= 5; half--) {\n const candidate = line.slice(0, half);\n // Check if the rest of the line starts with the same candidate\n if (line.slice(half).startsWith(candidate)) {\n return candidate + line.slice(half + candidate.length);\n }\n }\n return line;\n}\n\n/**\n * Remove consecutive duplicate paragraphs/sentences from buddy streaming output.\n */\n// @kern-source: markdown:232\nfunction deduplicateParagraphs(text: string): string {\n // First: deduplicate within each line (streaming chunk concatenation artifacts)\n const lines = text.split('\\n');\n const dedupedLines = lines.map((l: string) => deduplicateInline(l));\n const joined = dedupedLines.join('\\n');\n // Then: deduplicate consecutive paragraphs\n const paragraphs = joined.split(/\\n{2,}/);\n const seen = new Set<string>();\n const deduped: string[] = [];\n for (const para of paragraphs) {\n const normalized = para.trim().replace(/\\s+/g, ' ');\n if (!normalized) {\n continue;\n }\n if (seen.has(normalized)) {\n continue;\n }\n seen.add(normalized);\n deduped.push(para.trim());\n }\n return deduped.join('\\n\\n');\n}\n\n/**\n * Strip progressive thinking/status updates that duplicate as streaming chunks.\n */\n// @kern-source: markdown:253\nfunction stripBuddyThinkingNoise(text: string): string {\n const lines = text.split('\\n');\n const result: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Skip raw command output metadata from Codex\n if (trimmed.startsWith('Command:') && trimmed.includes('/bin/')) continue;\n if (trimmed.startsWith('Chunk ID:')) continue;\n if (trimmed.startsWith('Wall time:')) continue;\n if (trimmed.startsWith('Process exited with code')) continue;\n if (trimmed.startsWith('Original token count:')) continue;\n if (trimmed === 'Output:') continue;\n\n // Skip lines that are exact substrings of the next line (progressive thinking)\n if (i + 1 < lines.length) {\n const next = lines[i + 1].trim();\n if (trimmed.length > 20 && next.startsWith(trimmed)) continue;\n }\n\n result.push(line);\n }\n\n return result.join('\\n');\n}\n\n// @kern-source: markdown:283\nfunction shortenFilePaths(text: string): string {\n // Only shorten paths in prose — skip fenced code blocks\n const fenceRe = /^```[\\s\\S]*?^```/gm;\n const fences: Array<{ start: number; end: number }> = [];\n let fm: RegExpExecArray | null;\n while ((fm = fenceRe.exec(text)) !== null) {\n fences.push({ start: fm.index, end: fm.index + fm[0].length });\n }\n function insideFence(pos: number): boolean {\n return fences.some(f => pos >= f.start && pos < f.end);\n }\n\n const cwd = process.cwd();\n const home = process.env.HOME ?? '';\n\n const exts = 'tsx|jsx|ts|js|json|kern|md|py|rs|go|yaml|yml|toml|sh|css|html|svelte|vue|rb|java|cpp|c|h';\n const pathRe = new RegExp('(?<!`)(?:~/|/)[A-Za-z0-9._\\\\-/]+\\\\.(?:' + exts + ')(?::[0-9]+(?::[0-9]+)?|#L[0-9]+)?(?!`)', 'g');\n\n return text.replace(pathRe, (match, offset: number) => {\n // Never rewrite paths inside fenced code blocks\n if (insideFence(offset)) return match;\n // Skip if too short or doesn't look like a real path\n if (match.length < 10) return match;\n if (!match.includes('/')) return match;\n\n let shortened = match;\n\n // Expand ~/ to home\n if (shortened.startsWith('~/') && home) {\n shortened = home + shortened.slice(1);\n }\n\n // Strip cwd prefix → relative path\n if (shortened.startsWith(cwd + '/')) {\n shortened = shortened.slice(cwd.length + 1);\n }\n // Strip home prefix → ~/...\n else if (home && shortened.startsWith(home + '/')) {\n shortened = '~/' + shortened.slice(home.length + 1);\n }\n\n // Collapse to just filename:line for inline references\n // packages/cli/src/generated/handlers-cesar-brain.ts:91 → handlers-cesar-brain.ts:91\n const parts = shortened.split('/');\n if (parts.length > 2) {\n shortened = parts[parts.length - 1];\n }\n\n // Wrap in backticks for inline-code (purple) styling\n return '`' + shortened + '`';\n });\n}\n\n/**\n * Gently insert paragraph breaks in very dense text walls — only when truly needed.\n */\n// @kern-source: markdown:337\nfunction addParagraphBreaks(text: string): string {\n const paragraphs = text.split(/\\n{2,}/);\n const result: string[] = [];\n\n for (const para of paragraphs) {\n const lines = para.split('\\n');\n // Skip if already has markdown structure (headers, real lists) or is short\n const isStructured = lines.some(l => /^(#{1,3}\\s|[-*]\\s+\\w|\\d+\\.\\s+\\w|>\\s)/.test(l.trimStart()));\n const totalLen = lines.reduce((sum, l) => sum + l.length, 0);\n if (isStructured || totalLen < 250) {\n result.push(para);\n continue;\n }\n\n // Split dense blocks at sentence boundaries\n const joined = lines.join(' ');\n const sentences = joined.split(/(?<=\\.\\s)(?=[A-Z])/);\n if (sentences.length <= 2) {\n result.push(para);\n continue;\n }\n\n // Group into chunks of 3 sentences\n const chunks: string[] = [];\n let current = '';\n let count = 0;\n for (const sentence of sentences) {\n current += sentence;\n count++;\n if (count >= 3 || current.length > 250) {\n chunks.push(current.trim());\n current = '';\n count = 0;\n }\n }\n if (current.trim()) chunks.push(current.trim());\n result.push(chunks.join('\\n\\n'));\n }\n\n return result.join('\\n\\n');\n}\n\n// @kern-source: markdown:381\nexport const _cleanCache: Map<string, string> = new Map();\n\n// @kern-source: markdown:383\nexport function cleanEngineOutput(raw: string): string {\n // Key by raw content — different streams can share lengths, so length alone collides.\n const cached = _cleanCache.get(raw);\n if (cached !== undefined) {\n return cached;\n }\n const lines = raw.split('\\n');\n const cleaned: string[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n if (cleaned.length === 0 && !trimmed) {\n continue;\n }\n if (trimmed.startsWith('{') && trimmed.includes('\"type\"')) {\n const result = parseStreamJsonLine(trimmed);\n if (result.action === 'skip') {\n continue;\n }\n if (result.action === 'use') {\n cleaned.push(result.content!);\n continue;\n }\n }\n cleaned.push(line);\n }\n let result = cleaned.join('\\n').trim();\n const codexResult = extractCodexStructured(result);\n if (codexResult) {\n result = codexResult;\n }\n // Strip XML tool tags — engines embed <tool>, <tool_result>, <invoke> in text\n result = result.replace(/<tool\\s+name=\"[^\"]*\">[\\s\\S]*?<\\/tool>/g, '');\n result = result.replace(/<tool\\s+name=\"[^\"]*\">[\\s\\S]*?<\\/invoke>(\\s*<\\/[a-zA-Z_:]+>)*/g, '');\n result = result.replace(/<tool_result[\\s\\S]*?<\\/tool_result>/g, '');\n result = result.replace(/<\\/minimax:tool_call>/g, '');\n result = result.replace(/<parameter\\s+name=\"[^\"]*\">[^<]*<\\/parameter>/g, '');\n result = result.replace(/<tool_calls>[\\s\\S]*?<\\/tool_calls>/gi, '');\n result = result.replace(/<(Read|Write|Edit|Bash|Grep|Glob|LS|ListPlans|Retrieve)\\b[\\s\\S]*?<\\/\\1>/g, '');\n result = result.replace(/<\\/?(file_path|path|pattern|command|query|content|old_string|new_string|start_line|end_line|id)>\\s*/g, '');\n // Strip reasoning tags from models that use <think>...</think> (MiniMax, DeepSeek, Qwen, etc.)\n result = result.replace(/<think>[\\s\\S]*?<\\/think>\\s*/gi, '');\n // R7: Strip narration stems — companion engines narrate their research process\n result = result.replace(/^(I'm checking|I'm looking|I'm reading|I'm searching|I'm inspecting|Let me check|Let me look|Let me read|Let me search|Let me inspect|I've confirmed|I've verified|I've checked|I'll now|I will now|Now I'm|Now let me|First,? I'll|First,? let me|Next,? I'll|Next,? let me)\\b[^.\\n]*[.\\n]\\s*/gim, '');\n // Clean buddy streaming artifacts\n result = stripBuddyThinkingNoise(result);\n result = deduplicateParagraphs(result);\n // Break dense walls of text into paragraphs at sentence boundaries\n result = addParagraphBreaks(result);\n // Shorten absolute file paths → relative, backtick-wrapped for purple styling\n result = shortenFilePaths(result);\n // Cache and evict old entries\n if (_cleanCache.size > 200) {\n _cleanCache.clear();\n }\n _cleanCache.set(raw, result);\n return result;\n}\n"],"mappings":"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","names":["result"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
stripReasoning,
|
|
4
4
|
stripTuiChrome
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-HSPQEDHX.js";
|
|
6
6
|
import {
|
|
7
7
|
filterDefaultOrchestrationEngines,
|
|
8
8
|
getSessionAllowList,
|
|
@@ -11,11 +11,13 @@ import {
|
|
|
11
11
|
runCampfire,
|
|
12
12
|
runDelegate,
|
|
13
13
|
runForge,
|
|
14
|
-
runTribunal
|
|
15
|
-
|
|
14
|
+
runTribunal,
|
|
15
|
+
sessionResultStore
|
|
16
|
+
} from "./chunk-3PDYVGRS.js";
|
|
16
17
|
import {
|
|
17
|
-
ENGINE_COLORS
|
|
18
|
-
|
|
18
|
+
ENGINE_COLORS,
|
|
19
|
+
icons
|
|
20
|
+
} from "./chunk-NBV37VMW.js";
|
|
19
21
|
import {
|
|
20
22
|
AgentSession,
|
|
21
23
|
AgentTeam,
|
|
@@ -42,20 +44,20 @@ import {
|
|
|
42
44
|
formatCesarPlanMarkdown,
|
|
43
45
|
isReadOnlyCommand,
|
|
44
46
|
loadOrCreateActiveThread,
|
|
45
|
-
planCostEstimator,
|
|
46
47
|
rankByTaskClass,
|
|
47
48
|
readPatchFromPath,
|
|
48
49
|
resolveWorkingDir,
|
|
49
50
|
runAgentInvestigateSynthesis,
|
|
50
51
|
runAgentTeamSynthesis,
|
|
51
52
|
runPostSynthesisFitnessCheck,
|
|
53
|
+
sanitizePlanSteps,
|
|
52
54
|
saveCesarPlan,
|
|
53
55
|
scanProjectContext,
|
|
54
56
|
scoreAgentTeamResult,
|
|
55
57
|
spawnWithTimeout,
|
|
56
58
|
tracker,
|
|
57
59
|
worktreeChangedDiff
|
|
58
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-TMNHJOKU.js";
|
|
59
61
|
|
|
60
62
|
// src/generated/handlers/plan-mode.ts
|
|
61
63
|
import { writeFileSync as writeFileSync2, mkdirSync as mkdirSync3 } from "fs";
|
|
@@ -641,6 +643,50 @@ ${repairBlock}`;
|
|
|
641
643
|
const severityCounts = summarizeReviewFindings(response);
|
|
642
644
|
return { response, blocking, parseFailed, unstructured, severityCounts, usage };
|
|
643
645
|
}
|
|
646
|
+
function stripMachineBlock(response) {
|
|
647
|
+
const idx = response.lastIndexOf(REVIEW_SENTINEL);
|
|
648
|
+
if (idx < 0) return response;
|
|
649
|
+
return response.slice(0, idx).trimEnd();
|
|
650
|
+
}
|
|
651
|
+
function reviewOutcome(engineId, response, status, note) {
|
|
652
|
+
if (status !== "ok") return { engine: engineId, status, findings: [], note };
|
|
653
|
+
const raw = (extractReviewFindings(response) || []).filter((x) => x && typeof x === "object");
|
|
654
|
+
const findings = raw.map((x) => ({
|
|
655
|
+
engine: engineId,
|
|
656
|
+
severity: typeof x.severity === "string" ? x.severity : x.blocking ? "blocking" : "nit",
|
|
657
|
+
blocking: x.blocking,
|
|
658
|
+
confidence: x.confidence,
|
|
659
|
+
file: x.file,
|
|
660
|
+
lines: x.lines,
|
|
661
|
+
problem: x.problem,
|
|
662
|
+
minimalFix: x.minimalFix
|
|
663
|
+
}));
|
|
664
|
+
return { engine: engineId, status: "ok", findings };
|
|
665
|
+
}
|
|
666
|
+
function buildReviewConsensusLines(consensus) {
|
|
667
|
+
const fmt = (f) => ` \u2022 [${f.severity} ${f.maxConfidence.toFixed(2)} \xD7${f.engines.length}${f.pairVotes >= 2 ? " pair" : ""}] ${f.problem}${f.file ? ` (${f.file}${f.lines ? ":" + f.lines : ""})` : ""}`;
|
|
668
|
+
const lines = [`Consensus \u2014 ${consensus.summary}`];
|
|
669
|
+
if (consensus.verified.length) {
|
|
670
|
+
lines.push("VERIFIED (actionable):");
|
|
671
|
+
for (const f of consensus.verified) lines.push(fmt(f));
|
|
672
|
+
}
|
|
673
|
+
if (consensus.needsCheck.length) {
|
|
674
|
+
lines.push("NEEDS-CHECK (want a second opinion):");
|
|
675
|
+
for (const f of consensus.needsCheck) lines.push(fmt(f));
|
|
676
|
+
}
|
|
677
|
+
if (consensus.speculative.length) lines.push(`SPECULATIVE: ${consensus.speculative.length} low-confidence finding(s) \u2014 likely noise.`);
|
|
678
|
+
if (consensus.nits.length) lines.push(`NITS: ${consensus.nits.length}.`);
|
|
679
|
+
if (consensus.engineFailures.length) lines.push(`FAILED (no machine verdict): ${consensus.engineFailures.map((e) => `${e.engine} (${e.status})`).join(", ")}.`);
|
|
680
|
+
return lines;
|
|
681
|
+
}
|
|
682
|
+
function formatReviewCounts(c) {
|
|
683
|
+
if (!c || c.total === 0) return "no findings";
|
|
684
|
+
const parts = [];
|
|
685
|
+
if (c.blocking) parts.push(`${c.blocking} blocking`);
|
|
686
|
+
if (c.important) parts.push(`${c.important} important`);
|
|
687
|
+
if (c.nit) parts.push(`${c.nit} ${c.nit === 1 ? "nit" : "nits"}`);
|
|
688
|
+
return parts.join(", ");
|
|
689
|
+
}
|
|
644
690
|
async function handleReview(dispatch, ctx, target, requestedEngine) {
|
|
645
691
|
const abort = new AbortController();
|
|
646
692
|
try {
|
|
@@ -670,15 +716,8 @@ async function handleReview(dispatch, ctx, target, requestedEngine) {
|
|
|
670
716
|
dispatch({ type: "spinner-start", message: `${engineId} reviewing ${label}\u2026`, color });
|
|
671
717
|
let response = "";
|
|
672
718
|
let unstructured = false;
|
|
673
|
-
let streaming = false;
|
|
674
719
|
try {
|
|
675
|
-
const result = await runReviewCore(diff, label, engineId, ctx, abort.signal
|
|
676
|
-
if (!streaming) {
|
|
677
|
-
dispatch({ type: "spinner-stop" });
|
|
678
|
-
streaming = true;
|
|
679
|
-
}
|
|
680
|
-
dispatch({ type: "streaming-chunk", engineId, chunk });
|
|
681
|
-
});
|
|
720
|
+
const result = await runReviewCore(diff, label, engineId, ctx, abort.signal);
|
|
682
721
|
response = result.response;
|
|
683
722
|
unstructured = result.unstructured;
|
|
684
723
|
} catch (err) {
|
|
@@ -686,32 +725,51 @@ async function handleReview(dispatch, ctx, target, requestedEngine) {
|
|
|
686
725
|
dispatch({ type: "error", message: `${engineId}: ${err instanceof Error ? err.message : String(err)}` });
|
|
687
726
|
return;
|
|
688
727
|
}
|
|
728
|
+
dispatch({ type: "spinner-stop" });
|
|
689
729
|
if (abort.signal.aborted) {
|
|
690
|
-
dispatch({ type: "spinner-stop" });
|
|
691
730
|
return;
|
|
692
731
|
}
|
|
693
|
-
if (!
|
|
694
|
-
dispatch({ type: "engine-block", engineId, color, content: response });
|
|
695
|
-
}
|
|
696
|
-
if (streaming) {
|
|
697
|
-
dispatch({ type: "streaming-end", engineId });
|
|
698
|
-
}
|
|
699
|
-
if (response) {
|
|
700
|
-
appendMessage(ctx.chatSession, { role: "user", content: `[review ${label}]`, timestamp: (/* @__PURE__ */ new Date()).toISOString() });
|
|
701
|
-
appendMessage(ctx.chatSession, { role: "engine", engineId, content: response, timestamp: (/* @__PURE__ */ new Date()).toISOString() });
|
|
702
|
-
tracker.record(engineId, { prompt: `[review ${label}]`, response });
|
|
703
|
-
ctx.lastReviewResult = {
|
|
704
|
-
engineId,
|
|
705
|
-
target: target ?? "uncommitted",
|
|
706
|
-
label,
|
|
707
|
-
diff,
|
|
708
|
-
reviewOutput: response,
|
|
709
|
-
timestamp: Date.now()
|
|
710
|
-
};
|
|
711
|
-
dispatch({ type: "info", message: unstructured ? `Review complete (unstructured \u2014 findings weren't machine-parseable, but the review above is valid). Say "fix it" or "fix it with <engine>" to address it.` : `Review complete. Say "fix it" or "fix it with <engine>" to address the findings.` });
|
|
712
|
-
} else {
|
|
732
|
+
if (!response) {
|
|
713
733
|
dispatch({ type: "warning", message: `${engineId} returned no review output.` });
|
|
734
|
+
return;
|
|
714
735
|
}
|
|
736
|
+
appendMessage(ctx.chatSession, { role: "user", content: `[review ${label}]`, timestamp: (/* @__PURE__ */ new Date()).toISOString() });
|
|
737
|
+
appendMessage(ctx.chatSession, { role: "engine", engineId, content: response, timestamp: (/* @__PURE__ */ new Date()).toISOString() });
|
|
738
|
+
tracker.record(engineId, { prompt: `[review ${label}]`, response });
|
|
739
|
+
ctx.lastReviewResult = {
|
|
740
|
+
engineId,
|
|
741
|
+
target: target ?? "uncommitted",
|
|
742
|
+
label,
|
|
743
|
+
diff,
|
|
744
|
+
reviewOutput: response,
|
|
745
|
+
timestamp: Date.now()
|
|
746
|
+
};
|
|
747
|
+
const status = unstructured ? "unstructured" : "ok";
|
|
748
|
+
let consensusSummary;
|
|
749
|
+
let blocking = false;
|
|
750
|
+
if (status === "ok") {
|
|
751
|
+
const consensus = buildConsensus([reviewOutcome(engineId, response, status)]);
|
|
752
|
+
consensusSummary = buildReviewConsensusLines(consensus).join("\n");
|
|
753
|
+
blocking = consensus.autoBlock;
|
|
754
|
+
dispatch({ type: blocking ? "warning" : "info", message: consensusSummary });
|
|
755
|
+
} else {
|
|
756
|
+
consensusSummary = `${engineId}: unstructured review \u2014 no machine-parseable findings (the prose is valid).`;
|
|
757
|
+
dispatch({ type: "info", message: consensusSummary });
|
|
758
|
+
}
|
|
759
|
+
sessionResultStore.add({
|
|
760
|
+
type: "review",
|
|
761
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
762
|
+
question: label,
|
|
763
|
+
engines: [engineId],
|
|
764
|
+
winner: null,
|
|
765
|
+
data: {
|
|
766
|
+
label,
|
|
767
|
+
consensusSummary,
|
|
768
|
+
blocking,
|
|
769
|
+
reviews: [{ engineId, status, reviewOutput: stripMachineBlock(response) }]
|
|
770
|
+
}
|
|
771
|
+
});
|
|
772
|
+
dispatch({ type: "info", message: unstructured ? `Review complete (unstructured \u2014 no machine verdict, but the review is valid). Ctrl+R for the full review \xB7 say "fix it" to address it.` : `Review complete. Ctrl+R for the full review \xB7 say "fix it" or "fix it with <engine>" to address the findings.` });
|
|
715
773
|
} finally {
|
|
716
774
|
dispatch({ type: "spinner-stop" });
|
|
717
775
|
ctx.setActiveAbort(null);
|
|
@@ -759,7 +817,6 @@ async function handleReviewMany(dispatch, ctx, target, requestedEngines) {
|
|
|
759
817
|
timedOut = true;
|
|
760
818
|
controller.abort();
|
|
761
819
|
}, timeoutSec * 1e3);
|
|
762
|
-
const color = ENGINE_COLORS[engineId] ?? 124;
|
|
763
820
|
try {
|
|
764
821
|
const result = await runReviewCore(diff, label, engineId, ctx, controller.signal);
|
|
765
822
|
const response = (result.response ?? "").trim();
|
|
@@ -771,10 +828,11 @@ async function handleReviewMany(dispatch, ctx, target, requestedEngines) {
|
|
|
771
828
|
dispatch({ type: "warning", message: `${engineId} returned no review output.` });
|
|
772
829
|
return { engineId, reviewOutput: "", unstructured: false, status: "error", note: "no output" };
|
|
773
830
|
}
|
|
774
|
-
|
|
831
|
+
const status = result.unstructured ? "unstructured" : "ok";
|
|
832
|
+
dispatch({ type: "info", message: result.unstructured ? `${icons().success} ${engineId}: unstructured (no machine verdict)` : `${icons().success} ${engineId}: ${formatReviewCounts(result.severityCounts)}` });
|
|
775
833
|
appendMessage(ctx.chatSession, { role: "engine", engineId, content: response, timestamp: (/* @__PURE__ */ new Date()).toISOString() });
|
|
776
834
|
tracker.record(engineId, { prompt: `[review ${label}]`, response });
|
|
777
|
-
return { engineId, reviewOutput: response, unstructured: result.unstructured, status
|
|
835
|
+
return { engineId, reviewOutput: response, unstructured: result.unstructured, status };
|
|
778
836
|
} catch (err) {
|
|
779
837
|
if (timedOut) {
|
|
780
838
|
dispatch({ type: "warning", message: `${engineId}: timed out after ${timeoutSec}s \u2014 skipped.` });
|
|
@@ -794,36 +852,10 @@ async function handleReviewMany(dispatch, ctx, target, requestedEngines) {
|
|
|
794
852
|
dispatch({ type: "warning", message: `No review output returned from ${engineIds.join(", ")}.` });
|
|
795
853
|
return;
|
|
796
854
|
}
|
|
797
|
-
const outcomes = all.map((c) =>
|
|
798
|
-
if (c.status !== "ok") return { engine: c.engineId, status: c.status, findings: [], note: c.note };
|
|
799
|
-
const raw = extractReviewFindings(c.reviewOutput) || [];
|
|
800
|
-
const findings = raw.map((x) => ({
|
|
801
|
-
engine: c.engineId,
|
|
802
|
-
severity: typeof x.severity === "string" ? x.severity : x.blocking ? "blocking" : "nit",
|
|
803
|
-
blocking: x.blocking,
|
|
804
|
-
confidence: x.confidence,
|
|
805
|
-
file: x.file,
|
|
806
|
-
lines: x.lines,
|
|
807
|
-
problem: x.problem,
|
|
808
|
-
minimalFix: x.minimalFix
|
|
809
|
-
}));
|
|
810
|
-
return { engine: c.engineId, status: "ok", findings };
|
|
811
|
-
});
|
|
855
|
+
const outcomes = all.map((c) => reviewOutcome(c.engineId, c.reviewOutput, c.status, c.note));
|
|
812
856
|
const consensus = buildConsensus(outcomes);
|
|
813
|
-
const
|
|
814
|
-
|
|
815
|
-
if (consensus.verified.length) {
|
|
816
|
-
lines.push("VERIFIED (actionable):");
|
|
817
|
-
for (const f of consensus.verified) lines.push(fmt(f));
|
|
818
|
-
}
|
|
819
|
-
if (consensus.needsCheck.length) {
|
|
820
|
-
lines.push("NEEDS-CHECK (want a second opinion):");
|
|
821
|
-
for (const f of consensus.needsCheck) lines.push(fmt(f));
|
|
822
|
-
}
|
|
823
|
-
if (consensus.speculative.length) lines.push(`SPECULATIVE: ${consensus.speculative.length} low-confidence finding(s) \u2014 likely noise.`);
|
|
824
|
-
if (consensus.nits.length) lines.push(`NITS: ${consensus.nits.length}.`);
|
|
825
|
-
if (consensus.engineFailures.length) lines.push(`FAILED (no machine verdict): ${consensus.engineFailures.map((e) => `${e.engine} (${e.status})`).join(", ")}.`);
|
|
826
|
-
dispatch({ type: consensus.autoBlock ? "warning" : "info", message: lines.join("\n") });
|
|
857
|
+
const consensusSummary = buildReviewConsensusLines(consensus).join("\n");
|
|
858
|
+
dispatch({ type: consensus.autoBlock ? "warning" : "info", message: consensusSummary });
|
|
827
859
|
const anyUnstructured = collected.some((c) => c.unstructured);
|
|
828
860
|
ctx.lastReviewResult = {
|
|
829
861
|
engineId: collected.map((r) => r.engineId).join(", "),
|
|
@@ -835,7 +867,20 @@ async function handleReviewMany(dispatch, ctx, target, requestedEngines) {
|
|
|
835
867
|
${r.reviewOutput}`).join("\n\n---\n\n"),
|
|
836
868
|
timestamp: Date.now()
|
|
837
869
|
};
|
|
838
|
-
|
|
870
|
+
sessionResultStore.add({
|
|
871
|
+
type: "review",
|
|
872
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
873
|
+
question: label,
|
|
874
|
+
engines: collected.map((r) => r.engineId),
|
|
875
|
+
winner: null,
|
|
876
|
+
data: {
|
|
877
|
+
label,
|
|
878
|
+
consensusSummary,
|
|
879
|
+
blocking: consensus.autoBlock,
|
|
880
|
+
reviews: collected.map((r) => ({ engineId: r.engineId, status: r.status, reviewOutput: stripMachineBlock(r.reviewOutput) }))
|
|
881
|
+
}
|
|
882
|
+
});
|
|
883
|
+
dispatch({ type: "info", message: `Multi-review complete (${collected.map((r) => r.engineId).join(", ")}).${anyUnstructured ? " Some reviews were unstructured (no machine verdict) but valid." : ""} Ctrl+R for the full reviews \xB7 say "fix it" or "fix it with <engine>" to address the findings.` });
|
|
839
884
|
} finally {
|
|
840
885
|
ctx.setActiveAbort(null);
|
|
841
886
|
}
|
|
@@ -1969,31 +2014,10 @@ ${clipAgentText(winnerAnalysis, 4e3)}`);
|
|
|
1969
2014
|
|
|
1970
2015
|
// src/generated/handlers/plan-mode.ts
|
|
1971
2016
|
async function handleProposePlan(args, dispatch, ctx) {
|
|
1972
|
-
const
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
};
|
|
1977
|
-
const steps = (args.steps ?? []).map((s, i) => {
|
|
1978
|
-
const est = planCostEstimator.estimate(s.type, s.engines ?? []);
|
|
1979
|
-
return {
|
|
1980
|
-
id: sanitizeId(s.id, `step-${i}-${Math.random().toString(36).slice(2, 8)}`),
|
|
1981
|
-
type: s.type,
|
|
1982
|
-
description: s.description,
|
|
1983
|
-
engines: s.engines,
|
|
1984
|
-
engine: s.engine,
|
|
1985
|
-
fitnessCmd: s.fitnessCmd,
|
|
1986
|
-
tribunalMode: s.tribunalMode,
|
|
1987
|
-
parallel: s.parallel ?? false,
|
|
1988
|
-
dependsOn: s.dependsOn,
|
|
1989
|
-
exports: typeof s.exports === "string" ? [s.exports] : s.exports,
|
|
1990
|
-
imports: typeof s.imports === "string" ? [s.imports] : s.imports,
|
|
1991
|
-
estimatedTokens: est.tokens,
|
|
1992
|
-
estimatedCostUsd: est.costUsd,
|
|
1993
|
-
rationale: s.rationale,
|
|
1994
|
-
verifyCmd: s.verifyCmd
|
|
1995
|
-
};
|
|
1996
|
-
});
|
|
2017
|
+
const { steps, dropped } = sanitizePlanSteps(args.steps);
|
|
2018
|
+
if (dropped > 0 && dispatch) {
|
|
2019
|
+
dispatch({ type: "info", message: `Dropped ${dropped} malformed plan step${dropped === 1 ? "" : "s"} from the proposal.` });
|
|
2020
|
+
}
|
|
1997
2021
|
let plan = createCesarPlan(args.intent, steps);
|
|
1998
2022
|
plan = {
|
|
1999
2023
|
...plan,
|
|
@@ -2213,11 +2237,32 @@ ${tail}` };
|
|
|
2213
2237
|
"",
|
|
2214
2238
|
"When the step is complete, finish with a concise recap of what changed and what remains."
|
|
2215
2239
|
].join("\n");
|
|
2216
|
-
|
|
2240
|
+
let outcome = await handleCesarBrain(prompt, stepDispatch, ctx, []);
|
|
2241
|
+
let retryOutputStart = captured.length;
|
|
2242
|
+
if (outcome.awaitingUserInput && !signal?.aborted) {
|
|
2243
|
+
stepDispatch({ type: "warning", message: "Cesar stalled awaiting input on a pre-approved step \u2014 forcing one retry." });
|
|
2244
|
+
const overridePrompt = [
|
|
2245
|
+
"[EXECUTOR OVERRIDE] This plan step is ALREADY APPROVED by the user. Proceed and DO IT NOW.",
|
|
2246
|
+
"Do NOT ask for approval, a greenlight, or confirmation. Do NOT say you are holding or waiting.",
|
|
2247
|
+
"Use the available tools to complete the step. If you are TRULY blocked, end with one concrete question.",
|
|
2248
|
+
`Step ${step.id}: ${task}`
|
|
2249
|
+
].join("\n");
|
|
2250
|
+
retryOutputStart = captured.length;
|
|
2251
|
+
outcome = await handleCesarBrain(overridePrompt, stepDispatch, ctx, []);
|
|
2252
|
+
}
|
|
2217
2253
|
const after2 = snapshotTokens();
|
|
2218
2254
|
if (signal?.aborted || outcome.decisionReason === "aborted") {
|
|
2219
2255
|
return { result: { status: "failure", actualTokens: after2.tokens - before.tokens, actualCostUsd: after2.cost - before.cost, durationMs: Date.now() - startTime, output: captured.join("\n").trim(), error: "cancelled" } };
|
|
2220
2256
|
}
|
|
2257
|
+
if (outcome.awaitingUserInput) {
|
|
2258
|
+
const retryLines = captured.slice(retryOutputStart);
|
|
2259
|
+
const ask = (retryLines.length ? retryLines : captured).join("\n").trim().split("\n").filter((l) => l.trim()).slice(-4).join("\n");
|
|
2260
|
+
stepDispatch({ type: "warning", message: `\u23F8 Plan paused \u2014 Cesar is waiting on you before continuing:
|
|
2261
|
+
${ask}
|
|
2262
|
+
|
|
2263
|
+
Type your answer, then /plan resume to continue (or /cancel).` });
|
|
2264
|
+
return { result: { status: "paused", actualTokens: after2.tokens - before.tokens, actualCostUsd: after2.cost - before.cost, durationMs: Date.now() - startTime, output: captured.join("\n").trim(), error: "Cesar is awaiting your input on this approved step" } };
|
|
2265
|
+
}
|
|
2221
2266
|
const output = captured.join("\n").trim() || `Cesar completed step ${step.id}.`;
|
|
2222
2267
|
if (step.verifyCmd) stepDispatch({ type: "info", message: `Verifying step ${step.id}: ${step.verifyCmd}` });
|
|
2223
2268
|
const verified = await runVerifyGate();
|
|
@@ -2635,4 +2680,4 @@ export {
|
|
|
2635
2680
|
handleExitPlanMode,
|
|
2636
2681
|
buildStepExecutors
|
|
2637
2682
|
};
|
|
2638
|
-
//# sourceMappingURL=chunk-
|
|
2683
|
+
//# sourceMappingURL=chunk-PUNBDLQO.js.map
|