@kb-labs/agent-entry 2.119.0-canary.f8394d5fd β 2.119.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/diff.js.map +1 -1
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/quality-report.js.map +1 -1
- package/dist/cli/commands/rollback.js.map +1 -1
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/trace-context.js.map +1 -1
- package/dist/cli/commands/trace-diagnose.js.map +1 -1
- package/dist/cli/commands/trace-event-normalizer.js.map +1 -1
- package/dist/cli/commands/trace-filter.js.map +1 -1
- package/dist/cli/commands/trace-iteration.js.map +1 -1
- package/dist/cli/commands/trace-stats.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/manifest.js +1 -1
- package/dist/manifest.js.map +1 -1
- package/dist/rest/handlers/approve-handler.js.map +1 -1
- package/dist/rest/handlers/approve-session-plan-handler.js.map +1 -1
- package/dist/rest/handlers/correct-handler.js.map +1 -1
- package/dist/rest/handlers/create-session-handler.js.map +1 -1
- package/dist/rest/handlers/execute-session-plan-handler.js.map +1 -1
- package/dist/rest/handlers/generate-spec-handler.js.map +1 -1
- package/dist/rest/handlers/get-file-diff-handler.js.map +1 -1
- package/dist/rest/handlers/get-session-handler.js.map +1 -1
- package/dist/rest/handlers/get-session-plan-handler.js.map +1 -1
- package/dist/rest/handlers/get-session-turns-handler.js.map +1 -1
- package/dist/rest/handlers/get-spec-handler.js.map +1 -1
- package/dist/rest/handlers/list-file-changes-handler.js.map +1 -1
- package/dist/rest/handlers/list-sessions-handler.js.map +1 -1
- package/dist/rest/handlers/rollback-handler.js.map +1 -1
- package/dist/rest/handlers/run-handler.js.map +1 -1
- package/dist/rest/handlers/sessions-handler.js.map +1 -1
- package/dist/rest/handlers/status-handler.js.map +1 -1
- package/dist/rest/handlers/stop-handler.js.map +1 -1
- package/dist/ws/session-stream-handler.js.map +1 -1
- package/package.json +14 -14
- package/dist/manifest.json +0 -685
- package/dist/widgets/117.js +0 -32
- package/dist/widgets/165.js +0 -1
- package/dist/widgets/326.js +0 -1
- package/dist/widgets/370.js +0 -1
- package/dist/widgets/405.js +0 -1
- package/dist/widgets/46.js +0 -445
- package/dist/widgets/50.js +0 -1
- package/dist/widgets/546.js +0 -1
- package/dist/widgets/648.js +0 -1
- package/dist/widgets/669.js +0 -1
- package/dist/widgets/707.js +0 -1
- package/dist/widgets/775.js +0 -1
- package/dist/widgets/78.js +0 -1
- package/dist/widgets/832.js +0 -96
- package/dist/widgets/875.js +0 -25
- package/dist/widgets/945.js +0 -1
- package/dist/widgets/968.js +0 -9
- package/dist/widgets/__federation_expose_AgentsPage.js +0 -1
- package/dist/widgets/mf-manifest.json +0 -229
- package/dist/widgets/mf-stats.json +0 -256
- package/dist/widgets/remoteEntry.js +0 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/diff.ts"],"names":["fs"],"mappings":"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","file":"diff.js","sourcesContent":["/**\n * agent:diff - Show diff for specific file change\n *\n * Usage:\n * pnpm kb agent:diff --change-id={id}\n * pnpm kb agent:diff --change-id={id} --json\n */\n\nimport { defineCommand, useLogger } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport type { PluginContextV3 } from '@kb-labs/sdk';\nimport { promises as fs } from 'fs';\nimport path from 'path';\n\ntype DiffInput = {\n changeId?: string;\n 'change-id'?: string;\n json?: boolean;\n};\n\ntype DiffResult = CommandResult<unknown>;\n\ntype DiffChange =\n | { type: 'add'; line: number; content: string }\n | { type: 'delete'; line: number; content: string }\n | { type: 'change'; line: number; before: string; after: string };\n\nexport default defineCommand({\n id: 'diff',\n description: 'Show diff for specific file change',\n\n handler: {\n async execute(ctx: PluginContextV3, input: DiffInput): Promise<DiffResult> {\n const logger = useLogger();\n const flags = (input as { flags?: DiffInput }).flags ?? input;\n\n const changeId = flags['change-id'] ?? flags.changeId;\n if (!changeId) {\n const err = { success: false, error: 'Missing required --change-id flag' };\n ctx.ui?.json?.(err);\n return { ok: false, error: 'Command failed', result: err };\n }\n\n try {\n const basePath = path.join(process.cwd(), '.kb', 'agents', 'sessions');\n\n // Search all sessions for this change ID\n const sessions = await fs.readdir(basePath);\n let snapshot = null;\n let foundSessionId = null;\n\n for (const sessionId of sessions) {\n const snapshotPath = path.join(basePath, sessionId, 'snapshots', `${changeId}.json`);\n\n try {\n const content = await fs.readFile(snapshotPath, 'utf-8');\n snapshot = JSON.parse(content);\n foundSessionId = sessionId;\n break;\n } catch {\n // Try next session\n continue;\n }\n }\n\n if (!snapshot) {\n const err = { success: false, error: `Change not found: ${changeId}` };\n ctx.ui?.json?.(err);\n return { ok: false, error: 'Command failed', result: err };\n }\n\n // Calculate diff\n const diff = calculateDiff(snapshot);\n\n const response = {\n success: true,\n changeId,\n sessionId: foundSessionId,\n data: {\n ...snapshot,\n diff,\n },\n };\n\n if (flags.json) {\n ctx.ui?.json?.(response);\n } else {\n printDiff(ctx, snapshot, diff);\n }\n\n return { ok: true, result: response };\n } catch (err) {\n logger.error('agent:diff error:', err instanceof Error ? err : undefined);\n const errResponse = {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n ctx.ui?.json?.(errResponse);\n return { ok: false, error: 'Command failed', result: errResponse };\n }\n },\n },\n});\n\ntype DiffSummary = { additions: number; deletions: number; changes: DiffChange[] };\ntype Snapshot = {\n id: string;\n filePath: string;\n operation: string;\n agentId: string;\n timestamp: number;\n before?: { content: string };\n after?: { content: string };\n metadata?: {\n startLine?: number;\n endLine?: number;\n linesAdded?: number;\n linesRemoved?: number;\n isOverwrite?: boolean;\n };\n};\n\n/**\n * Calculate line-by-line diff\n */\nfunction calculateDiff(snapshot: Snapshot): DiffSummary {\n const beforeContent = snapshot.before?.content || '';\n const afterContent = snapshot.after?.content || '';\n\n const beforeLines = beforeContent.split('\\n');\n const afterLines = afterContent.split('\\n');\n\n const diff: DiffSummary = {\n additions: 0,\n deletions: 0,\n changes: [],\n };\n\n // Simple line-by-line comparison\n const maxLines = Math.max(beforeLines.length, afterLines.length);\n\n for (let i = 0; i < maxLines; i++) {\n const before = beforeLines[i];\n const after = afterLines[i];\n\n if (before === undefined && after !== undefined) {\n // Line added\n diff.additions++;\n diff.changes.push({\n type: 'add',\n line: i + 1,\n content: after,\n });\n } else if (before !== undefined && after === undefined) {\n // Line deleted\n diff.deletions++;\n diff.changes.push({\n type: 'delete',\n line: i + 1,\n content: before,\n });\n } else if (before !== after && before !== undefined && after !== undefined) {\n // Line changed\n diff.deletions++;\n diff.additions++;\n diff.changes.push({\n type: 'change',\n line: i + 1,\n before,\n after,\n });\n }\n }\n\n return diff;\n}\n\n/**\n * Print diff in human-readable format\n */\nfunction printDiff(ctx: PluginContextV3, snapshot: Snapshot, diff: DiffSummary): void {\n ctx.ui.write('\\n');\n ctx.ui.write('π File Change Diff\\n');\n ctx.ui.write('\\n');\n\n const timestamp = new Date(snapshot.timestamp).toLocaleString();\n const operation = snapshot.operation.toUpperCase();\n\n ctx.ui.write(`Change ID: ${snapshot.id}\\n`);\n ctx.ui.write(`File: ${snapshot.filePath}\\n`);\n ctx.ui.write(`Operation: ${operation}\\n`);\n ctx.ui.write(`Agent: ${snapshot.agentId}\\n`);\n ctx.ui.write(`Timestamp: ${timestamp}\\n`);\n ctx.ui.write('\\n');\n\n if (snapshot.metadata) {\n if (snapshot.metadata.startLine !== undefined) {\n ctx.ui.write(\n `Patch: lines ${snapshot.metadata.startLine}-${snapshot.metadata.endLine}\\n`\n );\n }\n if (snapshot.metadata.linesAdded !== undefined) {\n ctx.ui.write(\n `Changes: +${snapshot.metadata.linesAdded} -${snapshot.metadata.linesRemoved}\\n`\n );\n }\n if (snapshot.metadata.isOverwrite) {\n ctx.ui.write('Overwrote existing file\\n');\n }\n ctx.ui.write('\\n');\n }\n\n ctx.ui.write(`Summary: +${diff.additions} -${diff.deletions}\\n`);\n ctx.ui.write('\\n');\n\n // Print diff\n ctx.ui.write('β'.repeat(60) + '\\n');\n\n if (snapshot.operation === 'write' && !snapshot.before) {\n // New file - show full content\n ctx.ui.write('New file created:\\n');\n ctx.ui.write('\\n');\n const lines = (snapshot.after?.content ?? '').split('\\n');\n for (let i = 0; i < Math.min(lines.length, 50); i++) {\n ctx.ui.write(`+ ${(i + 1).toString().padStart(4)} | ${lines[i]}\\n`);\n }\n if (lines.length > 50) {\n ctx.ui.write(`... (${lines.length - 50} more lines)\\n`);\n }\n } else {\n // Show diff\n for (const change of diff.changes) {\n if (change.type === 'add') {\n ctx.ui.write(`+ ${change.line.toString().padStart(4)} | ${change.content}\\n`);\n } else if (change.type === 'delete') {\n ctx.ui.write(`- ${change.line.toString().padStart(4)} | ${change.content}\\n`);\n } else if (change.type === 'change') {\n ctx.ui.write(`- ${change.line.toString().padStart(4)} | ${change.before}\\n`);\n ctx.ui.write(`+ ${change.line.toString().padStart(4)} | ${change.after}\\n`);\n }\n }\n }\n\n ctx.ui.write('β'.repeat(60) + '\\n');\n ctx.ui.write('\\n');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/agents/entry/src/cli/commands/diff.ts"],"names":["fs"],"mappings":"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","file":"diff.js","sourcesContent":["/**\n * agent:diff - Show diff for specific file change\n *\n * Usage:\n * pnpm kb agent:diff --change-id={id}\n * pnpm kb agent:diff --change-id={id} --json\n */\n\nimport { defineCommand, useLogger } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport type { PluginContextV3 } from '@kb-labs/sdk';\nimport { promises as fs } from 'fs';\nimport path from 'path';\n\ntype DiffInput = {\n changeId?: string;\n 'change-id'?: string;\n json?: boolean;\n};\n\ntype DiffResult = CommandResult<unknown>;\n\ntype DiffChange =\n | { type: 'add'; line: number; content: string }\n | { type: 'delete'; line: number; content: string }\n | { type: 'change'; line: number; before: string; after: string };\n\nexport default defineCommand({\n id: 'diff',\n description: 'Show diff for specific file change',\n\n handler: {\n async execute(ctx: PluginContextV3, input: DiffInput): Promise<DiffResult> {\n const logger = useLogger();\n const flags = (input as { flags?: DiffInput }).flags ?? input;\n\n const changeId = flags['change-id'] ?? flags.changeId;\n if (!changeId) {\n const err = { success: false, error: 'Missing required --change-id flag' };\n ctx.ui?.json?.(err);\n return { ok: false, error: 'Command failed', result: err };\n }\n\n try {\n const basePath = path.join(process.cwd(), '.kb', 'agents', 'sessions');\n\n // Search all sessions for this change ID\n const sessions = await fs.readdir(basePath);\n let snapshot = null;\n let foundSessionId = null;\n\n for (const sessionId of sessions) {\n const snapshotPath = path.join(basePath, sessionId, 'snapshots', `${changeId}.json`);\n\n try {\n const content = await fs.readFile(snapshotPath, 'utf-8');\n snapshot = JSON.parse(content);\n foundSessionId = sessionId;\n break;\n } catch {\n // Try next session\n continue;\n }\n }\n\n if (!snapshot) {\n const err = { success: false, error: `Change not found: ${changeId}` };\n ctx.ui?.json?.(err);\n return { ok: false, error: 'Command failed', result: err };\n }\n\n // Calculate diff\n const diff = calculateDiff(snapshot);\n\n const response = {\n success: true,\n changeId,\n sessionId: foundSessionId,\n data: {\n ...snapshot,\n diff,\n },\n };\n\n if (flags.json) {\n ctx.ui?.json?.(response);\n } else {\n printDiff(ctx, snapshot, diff);\n }\n\n return { ok: true, result: response };\n } catch (err) {\n logger.error('agent:diff error:', err instanceof Error ? err : undefined);\n const errResponse = {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n ctx.ui?.json?.(errResponse);\n return { ok: false, error: 'Command failed', result: errResponse };\n }\n },\n },\n});\n\ntype DiffSummary = { additions: number; deletions: number; changes: DiffChange[] };\ntype Snapshot = {\n id: string;\n filePath: string;\n operation: string;\n agentId: string;\n timestamp: number;\n before?: { content: string };\n after?: { content: string };\n metadata?: {\n startLine?: number;\n endLine?: number;\n linesAdded?: number;\n linesRemoved?: number;\n isOverwrite?: boolean;\n };\n};\n\n/**\n * Calculate line-by-line diff\n */\nfunction calculateDiff(snapshot: Snapshot): DiffSummary {\n const beforeContent = snapshot.before?.content || '';\n const afterContent = snapshot.after?.content || '';\n\n const beforeLines = beforeContent.split('\\n');\n const afterLines = afterContent.split('\\n');\n\n const diff: DiffSummary = {\n additions: 0,\n deletions: 0,\n changes: [],\n };\n\n // Simple line-by-line comparison\n const maxLines = Math.max(beforeLines.length, afterLines.length);\n\n for (let i = 0; i < maxLines; i++) {\n const before = beforeLines[i];\n const after = afterLines[i];\n\n if (before === undefined && after !== undefined) {\n // Line added\n diff.additions++;\n diff.changes.push({\n type: 'add',\n line: i + 1,\n content: after,\n });\n } else if (before !== undefined && after === undefined) {\n // Line deleted\n diff.deletions++;\n diff.changes.push({\n type: 'delete',\n line: i + 1,\n content: before,\n });\n } else if (before !== after && before !== undefined && after !== undefined) {\n // Line changed\n diff.deletions++;\n diff.additions++;\n diff.changes.push({\n type: 'change',\n line: i + 1,\n before,\n after,\n });\n }\n }\n\n return diff;\n}\n\n/**\n * Print diff in human-readable format\n */\nfunction printDiff(ctx: PluginContextV3, snapshot: Snapshot, diff: DiffSummary): void {\n ctx.ui.write('\\n');\n ctx.ui.write('π File Change Diff\\n');\n ctx.ui.write('\\n');\n\n const timestamp = new Date(snapshot.timestamp).toLocaleString();\n const operation = snapshot.operation.toUpperCase();\n\n ctx.ui.write(`Change ID: ${snapshot.id}\\n`);\n ctx.ui.write(`File: ${snapshot.filePath}\\n`);\n ctx.ui.write(`Operation: ${operation}\\n`);\n ctx.ui.write(`Agent: ${snapshot.agentId}\\n`);\n ctx.ui.write(`Timestamp: ${timestamp}\\n`);\n ctx.ui.write('\\n');\n\n if (snapshot.metadata) {\n if (snapshot.metadata.startLine !== undefined) {\n ctx.ui.write(\n `Patch: lines ${snapshot.metadata.startLine}-${snapshot.metadata.endLine}\\n`\n );\n }\n if (snapshot.metadata.linesAdded !== undefined) {\n ctx.ui.write(\n `Changes: +${snapshot.metadata.linesAdded} -${snapshot.metadata.linesRemoved}\\n`\n );\n }\n if (snapshot.metadata.isOverwrite) {\n ctx.ui.write('Overwrote existing file\\n');\n }\n ctx.ui.write('\\n');\n }\n\n ctx.ui.write(`Summary: +${diff.additions} -${diff.deletions}\\n`);\n ctx.ui.write('\\n');\n\n // Print diff\n ctx.ui.write('β'.repeat(60) + '\\n');\n\n if (snapshot.operation === 'write' && !snapshot.before) {\n // New file - show full content\n ctx.ui.write('New file created:\\n');\n ctx.ui.write('\\n');\n const lines = (snapshot.after?.content ?? '').split('\\n');\n for (let i = 0; i < Math.min(lines.length, 50); i++) {\n ctx.ui.write(`+ ${(i + 1).toString().padStart(4)} | ${lines[i]}\\n`);\n }\n if (lines.length > 50) {\n ctx.ui.write(`... (${lines.length - 50} more lines)\\n`);\n }\n } else {\n // Show diff\n for (const change of diff.changes) {\n if (change.type === 'add') {\n ctx.ui.write(`+ ${change.line.toString().padStart(4)} | ${change.content}\\n`);\n } else if (change.type === 'delete') {\n ctx.ui.write(`- ${change.line.toString().padStart(4)} | ${change.content}\\n`);\n } else if (change.type === 'change') {\n ctx.ui.write(`- ${change.line.toString().padStart(4)} | ${change.before}\\n`);\n ctx.ui.write(`+ ${change.line.toString().padStart(4)} | ${change.after}\\n`);\n }\n }\n }\n\n ctx.ui.write('β'.repeat(60) + '\\n');\n ctx.ui.write('\\n');\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/history.ts"],"names":[],"mappings":"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","file":"history.js","sourcesContent":["/**\n * agent:history - Show file change history for agent sessions\n */\n\nimport { defineCommand, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport { SessionManager } from '@kb-labs/agent-core';\nimport type { FileChangeSummary, Turn } from '@kb-labs/agent-contracts';\n\ntype HistoryInput = {\n sessionId?: string;\n 'session-id'?: string;\n file?: string;\n agentId?: string;\n 'agent-id'?: string;\n json?: boolean;\n};\n\ntype HistoryResult = CommandResult<unknown>;\n\ntype ChangeRow = FileChangeSummary & {\n sessionId: string;\n turnId: string;\n turnSequence: number;\n agentId: string;\n};\n\nexport default defineCommand({\n id: 'history',\n description: 'Show file change history for agent sessions',\n\n handler: {\n async execute(ctx: PluginContextV3, input: HistoryInput): Promise<HistoryResult> {\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: HistoryInput }).flags\n : input;\n const manager = new SessionManager(process.cwd());\n\n try {\n const sessionId = flags['session-id'] ?? flags.sessionId;\n const agentId = flags['agent-id'] ?? flags.agentId;\n if (sessionId) {\n return showSessionHistory(ctx, manager, String(sessionId), Boolean(flags.json));\n }\n if (flags.file) {\n return showFileHistory(ctx, manager, String(flags.file), Boolean(flags.json));\n }\n if (agentId) {\n return showAgentHistory(ctx, manager, String(agentId), Boolean(flags.json));\n }\n return listAllSessions(ctx, manager, Boolean(flags.json));\n } catch (error) {\n const response = {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n ctx.ui?.json?.(response);\n return { ok: false, error: 'Command failed', result: response };\n }\n },\n },\n});\n\nasync function showSessionHistory(\n ctx: PluginContextV3,\n manager: SessionManager,\n sessionId: string,\n asJson: boolean\n): Promise<HistoryResult> {\n const info = await manager.getSessionInfo(sessionId);\n if (!info) {\n const err = { success: false, error: `Session not found: ${sessionId}` };\n ctx.ui?.json?.(err);\n return { ok: false, error: 'Command failed', result: err };\n }\n\n const turns = await manager.getTurns(sessionId);\n const changes = collectChanges(sessionId, turns);\n changes.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n\n const response = {\n success: true,\n sessionId,\n runCount: info.runCount,\n changes: changes.length,\n data: changes,\n };\n\n if (asJson) {\n ctx.ui?.json?.(response);\n } else {\n ctx.ui.write(`Session: ${sessionId}\\n`);\n ctx.ui.write(`Runs: ${info.runCount} | Changes: ${changes.length}\\n\\n`);\n for (const c of changes) {\n const ts = new Date(c.timestamp).toLocaleString();\n ctx.ui.write(`[${ts}] ${c.operation.toUpperCase()} ${c.filePath}\\n`);\n ctx.ui.write(` Agent: ${c.agentId} | Turn: #${c.turnSequence}\\n`);\n ctx.ui.write(` Change ID: ${c.changeId}\\n\\n`);\n }\n }\n\n return { ok: true, result: response };\n}\n\nasync function showFileHistory(\n ctx: PluginContextV3,\n manager: SessionManager,\n filePath: string,\n asJson: boolean\n): Promise<HistoryResult> {\n const sessions = await manager.listSessions({ limit: 1000, offset: 0 });\n const allChanges: ChangeRow[] = [];\n\n for (const s of sessions.sessions) {\n const turns = await manager.getTurns(s.id);\n const changes = collectChanges(s.id, turns).filter((c) => c.filePath === filePath);\n allChanges.push(...changes);\n }\n\n allChanges.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n const response = {\n success: true,\n filePath,\n changes: allChanges.length,\n data: allChanges,\n };\n\n if (asJson) {\n ctx.ui?.json?.(response);\n } else {\n ctx.ui.write(`File: ${filePath}\\n`);\n ctx.ui.write(`Changes: ${allChanges.length}\\n\\n`);\n for (const c of allChanges) {\n const ts = new Date(c.timestamp).toLocaleString();\n ctx.ui.write(`[${ts}] ${c.operation.toUpperCase()} (${c.sessionId})\\n`);\n ctx.ui.write(` Agent: ${c.agentId} | Change ID: ${c.changeId}\\n\\n`);\n }\n }\n\n return { ok: true, result: response };\n}\n\nasync function showAgentHistory(\n ctx: PluginContextV3,\n manager: SessionManager,\n agentId: string,\n asJson: boolean\n): Promise<HistoryResult> {\n const sessions = await manager.listSessions({ limit: 1000, offset: 0 });\n const allChanges: ChangeRow[] = [];\n\n for (const s of sessions.sessions) {\n const turns = await manager.getTurns(s.id);\n const changes = collectChanges(s.id, turns).filter((c) => c.agentId === agentId);\n allChanges.push(...changes);\n }\n\n allChanges.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n const response = {\n success: true,\n agentId,\n changes: allChanges.length,\n data: allChanges,\n };\n\n if (asJson) {\n ctx.ui?.json?.(response);\n } else {\n ctx.ui.write(`Agent: ${agentId}\\n`);\n ctx.ui.write(`Changes: ${allChanges.length}\\n\\n`);\n for (const c of allChanges) {\n const ts = new Date(c.timestamp).toLocaleString();\n ctx.ui.write(`[${ts}] ${c.operation.toUpperCase()} ${c.filePath} (${c.sessionId})\\n`);\n }\n ctx.ui.write('\\n');\n }\n\n return { ok: true, result: response };\n}\n\nasync function listAllSessions(\n ctx: PluginContextV3,\n manager: SessionManager,\n asJson: boolean\n): Promise<HistoryResult> {\n const sessions = await manager.listSessions({ limit: 1000, offset: 0 });\n const uniqueSessions = dedupeSessionsById(sessions.sessions);\n const data = await Promise.all(\n uniqueSessions.map(async (s) => {\n const turns = await manager.getTurns(s.id);\n return {\n sessionId: s.id,\n status: s.status,\n runCount: s.runCount,\n lastActivityAt: s.lastActivityAt,\n changes: collectChanges(s.id, turns).length,\n };\n }),\n );\n\n const response = {\n success: true,\n sessions: data.length,\n data,\n };\n\n if (asJson) {\n ctx.ui?.json?.(response);\n } else {\n ctx.ui.write(`Sessions: ${data.length}\\n\\n`);\n for (const s of data) {\n ctx.ui.write(`${s.sessionId}\\n`);\n ctx.ui.write(` Runs: ${s.runCount} | Changes: ${s.changes} | Status: ${s.status}\\n`);\n ctx.ui.write(` Last activity: ${new Date(s.lastActivityAt).toLocaleString()}\\n\\n`);\n }\n }\n\n return { ok: true, result: response };\n}\n\nfunction dedupeSessionsById<T extends { id: string; status?: string; runCount: number; lastActivityAt: string }>(sessions: T[]): T[] {\n const byId = new Map<string, T>();\n for (const session of sessions) {\n const existing = byId.get(session.id);\n if (!existing) {\n byId.set(session.id, session);\n continue;\n }\n\n const existingTs = Date.parse(existing.lastActivityAt);\n const incomingTs = Date.parse(session.lastActivityAt);\n if (incomingTs > existingTs || (incomingTs === existingTs && session.runCount > existing.runCount)) {\n byId.set(session.id, session);\n }\n }\n return Array.from(byId.values()).sort((a, b) => Date.parse(b.lastActivityAt) - Date.parse(a.lastActivityAt));\n}\n\nfunction collectChanges(sessionId: string, turns: Turn[]): ChangeRow[] {\n const rows: ChangeRow[] = [];\n for (const turn of turns) {\n if (turn.type !== 'assistant') {\n continue;\n }\n const changes = turn.metadata.fileChanges ?? [];\n for (const change of changes) {\n rows.push({\n ...change,\n sessionId,\n turnId: turn.id,\n turnSequence: turn.sequence,\n agentId: turn.metadata.agentId,\n });\n }\n }\n return rows;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/agents/entry/src/cli/commands/history.ts"],"names":[],"mappings":"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","file":"history.js","sourcesContent":["/**\n * agent:history - Show file change history for agent sessions\n */\n\nimport { defineCommand, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport { SessionManager } from '@kb-labs/agent-core';\nimport type { FileChangeSummary, Turn } from '@kb-labs/agent-contracts';\n\ntype HistoryInput = {\n sessionId?: string;\n 'session-id'?: string;\n file?: string;\n agentId?: string;\n 'agent-id'?: string;\n json?: boolean;\n};\n\ntype HistoryResult = CommandResult<unknown>;\n\ntype ChangeRow = FileChangeSummary & {\n sessionId: string;\n turnId: string;\n turnSequence: number;\n agentId: string;\n};\n\nexport default defineCommand({\n id: 'history',\n description: 'Show file change history for agent sessions',\n\n handler: {\n async execute(ctx: PluginContextV3, input: HistoryInput): Promise<HistoryResult> {\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: HistoryInput }).flags\n : input;\n const manager = new SessionManager(process.cwd());\n\n try {\n const sessionId = flags['session-id'] ?? flags.sessionId;\n const agentId = flags['agent-id'] ?? flags.agentId;\n if (sessionId) {\n return showSessionHistory(ctx, manager, String(sessionId), Boolean(flags.json));\n }\n if (flags.file) {\n return showFileHistory(ctx, manager, String(flags.file), Boolean(flags.json));\n }\n if (agentId) {\n return showAgentHistory(ctx, manager, String(agentId), Boolean(flags.json));\n }\n return listAllSessions(ctx, manager, Boolean(flags.json));\n } catch (error) {\n const response = {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n ctx.ui?.json?.(response);\n return { ok: false, error: 'Command failed', result: response };\n }\n },\n },\n});\n\nasync function showSessionHistory(\n ctx: PluginContextV3,\n manager: SessionManager,\n sessionId: string,\n asJson: boolean\n): Promise<HistoryResult> {\n const info = await manager.getSessionInfo(sessionId);\n if (!info) {\n const err = { success: false, error: `Session not found: ${sessionId}` };\n ctx.ui?.json?.(err);\n return { ok: false, error: 'Command failed', result: err };\n }\n\n const turns = await manager.getTurns(sessionId);\n const changes = collectChanges(sessionId, turns);\n changes.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n\n const response = {\n success: true,\n sessionId,\n runCount: info.runCount,\n changes: changes.length,\n data: changes,\n };\n\n if (asJson) {\n ctx.ui?.json?.(response);\n } else {\n ctx.ui.write(`Session: ${sessionId}\\n`);\n ctx.ui.write(`Runs: ${info.runCount} | Changes: ${changes.length}\\n\\n`);\n for (const c of changes) {\n const ts = new Date(c.timestamp).toLocaleString();\n ctx.ui.write(`[${ts}] ${c.operation.toUpperCase()} ${c.filePath}\\n`);\n ctx.ui.write(` Agent: ${c.agentId} | Turn: #${c.turnSequence}\\n`);\n ctx.ui.write(` Change ID: ${c.changeId}\\n\\n`);\n }\n }\n\n return { ok: true, result: response };\n}\n\nasync function showFileHistory(\n ctx: PluginContextV3,\n manager: SessionManager,\n filePath: string,\n asJson: boolean\n): Promise<HistoryResult> {\n const sessions = await manager.listSessions({ limit: 1000, offset: 0 });\n const allChanges: ChangeRow[] = [];\n\n for (const s of sessions.sessions) {\n const turns = await manager.getTurns(s.id);\n const changes = collectChanges(s.id, turns).filter((c) => c.filePath === filePath);\n allChanges.push(...changes);\n }\n\n allChanges.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n const response = {\n success: true,\n filePath,\n changes: allChanges.length,\n data: allChanges,\n };\n\n if (asJson) {\n ctx.ui?.json?.(response);\n } else {\n ctx.ui.write(`File: ${filePath}\\n`);\n ctx.ui.write(`Changes: ${allChanges.length}\\n\\n`);\n for (const c of allChanges) {\n const ts = new Date(c.timestamp).toLocaleString();\n ctx.ui.write(`[${ts}] ${c.operation.toUpperCase()} (${c.sessionId})\\n`);\n ctx.ui.write(` Agent: ${c.agentId} | Change ID: ${c.changeId}\\n\\n`);\n }\n }\n\n return { ok: true, result: response };\n}\n\nasync function showAgentHistory(\n ctx: PluginContextV3,\n manager: SessionManager,\n agentId: string,\n asJson: boolean\n): Promise<HistoryResult> {\n const sessions = await manager.listSessions({ limit: 1000, offset: 0 });\n const allChanges: ChangeRow[] = [];\n\n for (const s of sessions.sessions) {\n const turns = await manager.getTurns(s.id);\n const changes = collectChanges(s.id, turns).filter((c) => c.agentId === agentId);\n allChanges.push(...changes);\n }\n\n allChanges.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n const response = {\n success: true,\n agentId,\n changes: allChanges.length,\n data: allChanges,\n };\n\n if (asJson) {\n ctx.ui?.json?.(response);\n } else {\n ctx.ui.write(`Agent: ${agentId}\\n`);\n ctx.ui.write(`Changes: ${allChanges.length}\\n\\n`);\n for (const c of allChanges) {\n const ts = new Date(c.timestamp).toLocaleString();\n ctx.ui.write(`[${ts}] ${c.operation.toUpperCase()} ${c.filePath} (${c.sessionId})\\n`);\n }\n ctx.ui.write('\\n');\n }\n\n return { ok: true, result: response };\n}\n\nasync function listAllSessions(\n ctx: PluginContextV3,\n manager: SessionManager,\n asJson: boolean\n): Promise<HistoryResult> {\n const sessions = await manager.listSessions({ limit: 1000, offset: 0 });\n const uniqueSessions = dedupeSessionsById(sessions.sessions);\n const data = await Promise.all(\n uniqueSessions.map(async (s) => {\n const turns = await manager.getTurns(s.id);\n return {\n sessionId: s.id,\n status: s.status,\n runCount: s.runCount,\n lastActivityAt: s.lastActivityAt,\n changes: collectChanges(s.id, turns).length,\n };\n }),\n );\n\n const response = {\n success: true,\n sessions: data.length,\n data,\n };\n\n if (asJson) {\n ctx.ui?.json?.(response);\n } else {\n ctx.ui.write(`Sessions: ${data.length}\\n\\n`);\n for (const s of data) {\n ctx.ui.write(`${s.sessionId}\\n`);\n ctx.ui.write(` Runs: ${s.runCount} | Changes: ${s.changes} | Status: ${s.status}\\n`);\n ctx.ui.write(` Last activity: ${new Date(s.lastActivityAt).toLocaleString()}\\n\\n`);\n }\n }\n\n return { ok: true, result: response };\n}\n\nfunction dedupeSessionsById<T extends { id: string; status?: string; runCount: number; lastActivityAt: string }>(sessions: T[]): T[] {\n const byId = new Map<string, T>();\n for (const session of sessions) {\n const existing = byId.get(session.id);\n if (!existing) {\n byId.set(session.id, session);\n continue;\n }\n\n const existingTs = Date.parse(existing.lastActivityAt);\n const incomingTs = Date.parse(session.lastActivityAt);\n if (incomingTs > existingTs || (incomingTs === existingTs && session.runCount > existing.runCount)) {\n byId.set(session.id, session);\n }\n }\n return Array.from(byId.values()).sort((a, b) => Date.parse(b.lastActivityAt) - Date.parse(a.lastActivityAt));\n}\n\nfunction collectChanges(sessionId: string, turns: Turn[]): ChangeRow[] {\n const rows: ChangeRow[] = [];\n for (const turn of turns) {\n if (turn.type !== 'assistant') {\n continue;\n }\n const changes = turn.metadata.fileChanges ?? [];\n for (const change of changes) {\n rows.push({\n ...change,\n sessionId,\n turnId: turn.id,\n turnSequence: turn.sequence,\n agentId: turn.metadata.agentId,\n });\n }\n }\n return rows;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/quality-report.ts"],"names":["execFileCb","fs"],"mappings":"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","file":"quality-report.js","sourcesContent":["/**\n * agent:quality:report - Agent execution quality control report\n *\n * Usage:\n * pnpm kb agent quality report\n * pnpm kb agent quality report --days=3\n * pnpm kb agent quality report --session-id=session-123\n * pnpm kb agent quality report --json\n */\n\nimport { defineCommand, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport { execFile as execFileCb } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFile = promisify(execFileCb);\n\ntype QualityReportInput = {\n days?: number;\n limit?: number;\n sessionId?: string;\n 'session-id'?: string;\n json?: boolean;\n};\n\ntype KpiRunEvent = {\n type: string;\n ts?: string;\n payload?: {\n sessionId?: string;\n success?: boolean;\n task?: string;\n summaryPreview?: string;\n tokensUsed?: number;\n durationMs?: number;\n iterationsUsed?: number;\n iterationBudget?: number;\n iterationUtilization?: number;\n toolCallsTotal?: number;\n toolErrorRate?: number;\n todoUsed?: boolean;\n evidenceDensity?: number;\n driftRate?: number;\n startTier?: 'small' | 'medium' | 'large';\n finalTier?: 'small' | 'medium' | 'large';\n escalated?: boolean;\n escalationCount?: number;\n escalationReasons?: string[];\n escalationPath?: string[];\n qualityGate?: {\n status?: 'pass' | 'partial';\n score?: number;\n reasons?: string[];\n };\n qualityGateStatus?: 'pass' | 'partial';\n };\n};\n\ntype RegressionEvent = {\n type: string;\n ts?: string;\n payload?: {\n sessionId?: string;\n reasons?: string[];\n metrics?: {\n driftRate?: number;\n evidenceDensity?: number;\n toolErrorRate?: number;\n iterationsUsed?: number;\n iterationBudget?: number;\n };\n };\n};\n\ntype RunSnapshot = {\n ts: string;\n sessionId: string;\n success: boolean;\n task: string;\n summaryPreview: string;\n tokensUsed: number;\n durationMs: number;\n iterationsUsed: number;\n iterationBudget: number;\n iterationUtilization: number;\n toolCallsTotal: number;\n toolErrorRate: number;\n todoUsed: boolean;\n evidenceDensity: number;\n driftRate: number;\n qualityStatus: 'pass' | 'partial';\n qualityScore: number;\n qualityReasons: string[];\n startTier: 'small' | 'medium' | 'large';\n finalTier: 'small' | 'medium' | 'large';\n escalated: boolean;\n escalationCount: number;\n escalationReasons: string[];\n escalationPath: string[];\n};\n\nfunction deriveQualityStatus(payload: KpiRunEvent['payload'] | undefined): 'pass' | 'partial' {\n if (payload?.qualityGate?.status === 'pass' || payload?.qualityGate?.status === 'partial') {\n return payload.qualityGate.status;\n }\n if (payload?.qualityGateStatus === 'pass' || payload?.qualityGateStatus === 'partial') {\n return payload.qualityGateStatus;\n }\n return payload?.success ? 'pass' : 'partial';\n}\n\nexport default defineCommand({\n id: 'quality:report',\n description: 'Show quality control report for agent runs (quality, tokens, tools, drift, regressions)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: QualityReportInput): Promise<CommandResult<unknown>> {\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: QualityReportInput }).flags\n : input;\n const days = Number(flags.days ?? 1);\n const limit = Number(flags.limit ?? 200);\n const rawSessionId = flags['session-id'] ?? flags.sessionId;\n const sessionIdFilter = typeof rawSessionId === 'string' ? rawSessionId : undefined;\n const json = Boolean(flags.json);\n\n if (!Number.isFinite(days) || days <= 0) {\n const err = { success: false, error: '--days must be a positive number' };\n ctx.ui?.json?.(err);\n return { ok: false, error: 'Command failed', result: err };\n }\n\n const analyticsDir = path.join(process.cwd(), '.kb', 'analytics', 'buffer');\n const files = await listEventFiles(analyticsDir, days);\n if (files.length === 0) {\n const out = { success: true, message: 'No analytics files found for selected period', runs: 0 };\n ctx.ui?.json?.(out);\n return { ok: true, result: out };\n }\n\n const since = Date.now() - days * 24 * 60 * 60 * 1000;\n let { runs, regressions } = await readEvents(files, since, sessionIdFilter, limit);\n if (runs.length === 0) {\n const sqlitePath = path.join(process.cwd(), '.kb', 'analytics', 'analytics.sqlite');\n const sqliteEvents = await readEventsFromSqlite(sqlitePath, since, sessionIdFilter, limit);\n runs = sqliteEvents.runs;\n regressions = sqliteEvents.regressions;\n }\n const report = buildReport(runs, regressions, { days, sessionIdFilter });\n\n if (json) {\n ctx.ui?.json?.({ success: true, report });\n } else {\n printReport(ctx, report);\n }\n\n return { ok: true, result: report };\n },\n },\n});\n\nasync function listEventFiles(dir: string, days: number): Promise<string[]> {\n try {\n const entries = await fs.readdir(dir);\n const candidates = entries\n .filter((name) => /^events-\\d{8}\\.jsonl$/.test(name))\n .sort();\n\n const keep = Math.max(1, Math.min(candidates.length, days + 2));\n return candidates.slice(-keep).map((name) => path.join(dir, name));\n } catch {\n return [];\n }\n}\n\nasync function readEvents(\n files: string[],\n sinceMs: number,\n sessionIdFilter: string | undefined,\n limit: number\n): Promise<{ runs: RunSnapshot[]; regressions: RegressionEvent[] }> {\n const runs: RunSnapshot[] = [];\n const regressions: RegressionEvent[] = [];\n\n for (const file of files) {\n const content = await fs.readFile(file, 'utf-8');\n const lines = content.split('\\n').filter(Boolean);\n\n for (const line of lines) {\n let rawParsed: unknown;\n try {\n rawParsed = JSON.parse(line);\n } catch {\n continue;\n }\n if (!rawParsed || typeof rawParsed !== 'object') {\n continue;\n }\n const raw = rawParsed as Record<string, unknown>;\n\n const ts = typeof raw['ts'] === 'string' ? Date.parse(raw['ts']) : NaN;\n if (!Number.isFinite(ts) || ts < sinceMs) {\n continue;\n }\n\n if (raw['type'] === 'agent.kpi.run_completed') {\n const event = raw as unknown as KpiRunEvent;\n const p = event.payload || {};\n const sessionId = p.sessionId || 'unknown';\n if (sessionIdFilter && sessionId !== sessionIdFilter) {\n continue;\n }\n\n runs.push({\n ts: event.ts || new Date(ts).toISOString(),\n sessionId,\n success: Boolean(p.success),\n task: p.task || '',\n summaryPreview: p.summaryPreview || '',\n tokensUsed: Number(p.tokensUsed || 0),\n durationMs: Number(p.durationMs || 0),\n iterationsUsed: Number(p.iterationsUsed || 0),\n iterationBudget: Number(p.iterationBudget || 0),\n iterationUtilization: Number(p.iterationUtilization || 0),\n toolCallsTotal: Number(p.toolCallsTotal || 0),\n toolErrorRate: Number(p.toolErrorRate || 0),\n todoUsed: Boolean(p.todoUsed),\n evidenceDensity: Number(p.evidenceDensity || 0),\n driftRate: Number(p.driftRate || 0),\n qualityStatus: deriveQualityStatus(p),\n qualityScore: Number(p.qualityGate?.score ?? (p.success ? 1 : 0)),\n qualityReasons: Array.isArray(p.qualityGate?.reasons) ? p.qualityGate!.reasons! : [],\n startTier: (p.startTier === 'small' || p.startTier === 'large') ? p.startTier : 'medium',\n finalTier: (p.finalTier === 'small' || p.finalTier === 'large') ? p.finalTier : 'medium',\n escalated: Boolean(p.escalated),\n escalationCount: Number(p.escalationCount || 0),\n escalationReasons: Array.isArray(p.escalationReasons)\n ? p.escalationReasons.filter((v): v is string => typeof v === 'string')\n : [],\n escalationPath: Array.isArray(p.escalationPath)\n ? p.escalationPath.filter((v): v is string => typeof v === 'string')\n : [],\n });\n } else if (raw['type'] === 'agent.kpi.quality_regression') {\n const event = raw as unknown as RegressionEvent;\n const sessionId = event.payload?.sessionId;\n if (sessionIdFilter && sessionId !== sessionIdFilter) {\n continue;\n }\n regressions.push(event);\n }\n }\n }\n\n runs.sort((a, b) => Date.parse(b.ts) - Date.parse(a.ts));\n const trimmedRuns = runs.slice(0, Math.max(1, limit));\n return { runs: trimmedRuns, regressions };\n}\n\nasync function readEventsFromSqlite(\n sqlitePath: string,\n sinceMs: number,\n sessionIdFilter: string | undefined,\n limit: number,\n): Promise<{ runs: RunSnapshot[]; regressions: RegressionEvent[] }> {\n try {\n await fs.access(sqlitePath);\n } catch {\n return { runs: [], regressions: [] };\n }\n\n const sinceIso = new Date(sinceMs).toISOString();\n const sql = [\n 'SELECT type, ts, payload',\n 'FROM events',\n `WHERE ts >= '${sinceIso}'`,\n \" AND type IN ('agent.kpi.run_completed', 'agent.kpi.quality_regression')\",\n 'ORDER BY ts DESC',\n `LIMIT ${Math.max(limit * 5, 500)};`,\n ].join(' ');\n\n try {\n const { stdout } = await execFile('sqlite3', ['-json', sqlitePath, sql], {\n maxBuffer: 20 * 1024 * 1024,\n });\n const rows = JSON.parse(stdout || '[]') as Array<{\n type?: string;\n ts?: string;\n payload?: string;\n }>;\n const pseudoFileEvents = rows.map((row) => ({\n type: row.type ?? '',\n ts: row.ts,\n payload: parseJsonSafe(row.payload),\n }));\n return readInMemoryEvents(pseudoFileEvents, sinceMs, sessionIdFilter, limit);\n } catch {\n return { runs: [], regressions: [] };\n }\n}\n\nfunction parseJsonSafe(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object') {\n return value as Record<string, unknown>;\n }\n if (typeof value !== 'string') {\n return {};\n }\n try {\n const parsed = JSON.parse(value) as Record<string, unknown>;\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction readInMemoryEvents(\n rows: Array<{ type: string; ts?: string; payload?: Record<string, unknown> }>,\n sinceMs: number,\n sessionIdFilter: string | undefined,\n limit: number\n): { runs: RunSnapshot[]; regressions: RegressionEvent[] } {\n const runs: RunSnapshot[] = [];\n const regressions: RegressionEvent[] = [];\n\n for (const raw of rows) {\n const ts = typeof raw.ts === 'string' ? Date.parse(raw.ts) : NaN;\n if (!Number.isFinite(ts) || ts < sinceMs) {\n continue;\n }\n\n if (raw.type === 'agent.kpi.run_completed') {\n const p = (raw.payload || {}) as KpiRunEvent['payload'];\n const sessionId = p?.sessionId || 'unknown';\n if (sessionIdFilter && sessionId !== sessionIdFilter) {\n continue;\n }\n runs.push({\n ts: raw.ts || new Date(ts).toISOString(),\n sessionId,\n success: Boolean(p?.success),\n task: p?.task || '',\n summaryPreview: p?.summaryPreview || '',\n tokensUsed: Number(p?.tokensUsed || 0),\n durationMs: Number(p?.durationMs || 0),\n iterationsUsed: Number(p?.iterationsUsed || 0),\n iterationBudget: Number(p?.iterationBudget || 0),\n iterationUtilization: Number(p?.iterationUtilization || 0),\n toolCallsTotal: Number(p?.toolCallsTotal || 0),\n toolErrorRate: Number(p?.toolErrorRate || 0),\n todoUsed: Boolean(p?.todoUsed),\n evidenceDensity: Number(p?.evidenceDensity || 0),\n driftRate: Number(p?.driftRate || 0),\n qualityStatus: deriveQualityStatus(p),\n qualityScore: Number(p?.qualityGate?.score ?? (p?.success ? 1 : 0)),\n qualityReasons: Array.isArray(p?.qualityGate?.reasons) ? p?.qualityGate.reasons : [],\n startTier: (p?.startTier === 'small' || p?.startTier === 'large') ? p.startTier : 'medium',\n finalTier: (p?.finalTier === 'small' || p?.finalTier === 'large') ? p.finalTier : 'medium',\n escalated: Boolean(p?.escalated),\n escalationCount: Number(p?.escalationCount || 0),\n escalationReasons: Array.isArray(p?.escalationReasons)\n ? p.escalationReasons.filter((v): v is string => typeof v === 'string')\n : [],\n escalationPath: Array.isArray(p?.escalationPath)\n ? p.escalationPath.filter((v): v is string => typeof v === 'string')\n : [],\n });\n continue;\n }\n\n if (raw.type === 'agent.kpi.quality_regression') {\n const event: RegressionEvent = {\n type: raw.type,\n ts: raw.ts,\n payload: raw.payload as RegressionEvent['payload'],\n };\n const sessionId = event.payload?.sessionId;\n if (sessionIdFilter && sessionId !== sessionIdFilter) {\n continue;\n }\n regressions.push(event);\n }\n }\n\n runs.sort((a, b) => Date.parse(b.ts) - Date.parse(a.ts));\n return { runs: runs.slice(0, Math.max(1, limit)), regressions };\n}\n\nfunction buildReport(\n runs: RunSnapshot[],\n regressions: RegressionEvent[],\n meta: { days: number; sessionIdFilter?: string }\n) {\n const count = runs.length;\n if (count === 0) {\n return {\n periodDays: meta.days,\n sessionId: meta.sessionIdFilter,\n runs: 0,\n message: 'No agent.kpi.run_completed events in selected period',\n };\n }\n\n const scorecard = scorecardOf(runs);\n\n const topTokenRuns = [...runs].sort((a, b) => b.tokensUsed - a.tokensUsed).slice(0, 5);\n const worstQualityRuns = [...runs]\n .sort((a, b) => a.qualityScore - b.qualityScore || b.tokensUsed - a.tokensUsed)\n .slice(0, 5);\n\n const alerts: string[] = [];\n if (scorecard.successRate < 0.85) {alerts.push(`Low success rate: ${(scorecard.successRate * 100).toFixed(1)}%`);}\n if (scorecard.qualityPassRate < 0.9) {alerts.push(`Quality pass rate below target: ${(scorecard.qualityPassRate * 100).toFixed(1)}%`);}\n if (scorecard.avgToolErrorRate > 0.05) {alerts.push(`High tool error rate: ${(scorecard.avgToolErrorRate * 100).toFixed(1)}%`);}\n if (scorecard.avgDriftRate > 0.08) {alerts.push(`Scope drift is elevated: ${(scorecard.avgDriftRate * 100).toFixed(1)}%`);}\n if (scorecard.nearBudgetRate > 0.35) {alerts.push(`Too many runs near iteration budget: ${(scorecard.nearBudgetRate * 100).toFixed(1)}%`);}\n if (scorecard.escalationRate > 0.55) {alerts.push(`Escalation rate too high: ${(scorecard.escalationRate * 100).toFixed(1)}%`);}\n if (scorecard.escalationRate > 0.2 && scorecard.escalationSuccessRate < 0.7) {\n alerts.push(`Escalation effectiveness is low: ${(scorecard.escalationSuccessRate * 100).toFixed(1)}%`);\n }\n if (regressions.length > 0) {alerts.push(`Quality regression events observed: ${regressions.length}`);}\n\n const sliceSize = Math.max(3, Math.min(10, Math.floor(runs.length / 2)));\n const latestSlice = runs.slice(0, sliceSize);\n const previousSlice = runs.slice(sliceSize, sliceSize * 2);\n const latestScorecard = scorecardOf(latestSlice);\n const previousScorecard = scorecardOf(previousSlice);\n\n const slices = previousSlice.length > 0\n ? {\n sliceSize,\n latest: latestScorecard,\n previous: previousScorecard,\n delta: {\n successRate: latestScorecard.successRate - previousScorecard.successRate,\n qualityPassRate: latestScorecard.qualityPassRate - previousScorecard.qualityPassRate,\n avgQualityScore: latestScorecard.avgQualityScore - previousScorecard.avgQualityScore,\n avgTokens: latestScorecard.avgTokens - previousScorecard.avgTokens,\n p95Tokens: latestScorecard.p95Tokens - previousScorecard.p95Tokens,\n avgDurationMs: latestScorecard.avgDurationMs - previousScorecard.avgDurationMs,\n avgToolCalls: latestScorecard.avgToolCalls - previousScorecard.avgToolCalls,\n avgToolErrorRate: latestScorecard.avgToolErrorRate - previousScorecard.avgToolErrorRate,\n avgDriftRate: latestScorecard.avgDriftRate - previousScorecard.avgDriftRate,\n avgEvidenceDensity: latestScorecard.avgEvidenceDensity - previousScorecard.avgEvidenceDensity,\n nearBudgetRate: latestScorecard.nearBudgetRate - previousScorecard.nearBudgetRate,\n escalationRate: latestScorecard.escalationRate - previousScorecard.escalationRate,\n escalationSuccessRate: latestScorecard.escalationSuccessRate - previousScorecard.escalationSuccessRate,\n avgEscalationCount: latestScorecard.avgEscalationCount - previousScorecard.avgEscalationCount,\n },\n }\n : null;\n\n return {\n periodDays: meta.days,\n sessionId: meta.sessionIdFilter,\n runs: count,\n regressions: regressions.length,\n scorecard,\n slices,\n alerts,\n topTokenRuns: topTokenRuns.map(toRunBrief),\n worstQualityRuns: worstQualityRuns.map(toRunBrief),\n };\n}\n\nfunction toRunBrief(run: RunSnapshot) {\n return {\n ts: run.ts,\n sessionId: run.sessionId,\n task: run.task.slice(0, 120),\n tokensUsed: run.tokensUsed,\n durationMs: run.durationMs,\n toolCallsTotal: run.toolCallsTotal,\n qualityStatus: run.qualityStatus,\n qualityScore: run.qualityScore,\n qualityReasons: run.qualityReasons,\n startTier: run.startTier,\n finalTier: run.finalTier,\n escalated: run.escalated,\n escalationCount: run.escalationCount,\n escalationReasons: run.escalationReasons,\n };\n}\n\nfunction avg(values: number[]): number {\n if (values.length === 0) {return 0;}\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n}\n\nfunction p95(values: number[]): number {\n if (values.length === 0) {return 0;}\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.max(0, Math.min(sorted.length - 1, Math.ceil(sorted.length * 0.95) - 1));\n return sorted[index] || 0;\n}\n\nfunction scorecardOf(runs: RunSnapshot[]) {\n const escalatedRuns = runs.filter((r) => r.escalated);\n const nonEscalatedRuns = runs.filter((r) => !r.escalated);\n\n return {\n successRate: avg(runs.map((r) => (r.success ? 1 : 0))),\n qualityPassRate: avg(runs.map((r) => (r.qualityStatus === 'pass' ? 1 : 0))),\n avgQualityScore: avg(runs.map((r) => r.qualityScore)),\n avgTokens: avg(runs.map((r) => r.tokensUsed)),\n p95Tokens: p95(runs.map((r) => r.tokensUsed)),\n avgDurationMs: avg(runs.map((r) => r.durationMs)),\n avgToolCalls: avg(runs.map((r) => r.toolCallsTotal)),\n avgToolErrorRate: avg(runs.map((r) => r.toolErrorRate)),\n avgDriftRate: avg(runs.map((r) => r.driftRate)),\n avgEvidenceDensity: avg(runs.map((r) => r.evidenceDensity)),\n nearBudgetRate: avg(runs.map((r) => (r.iterationUtilization >= 0.9 ? 1 : 0))),\n escalationRate: avg(runs.map((r) => (r.escalated ? 1 : 0))),\n escalationSuccessRate: escalatedRuns.length > 0 ? avg(escalatedRuns.map((r) => (r.success ? 1 : 0))) : 0,\n avgEscalationCount: avg(runs.map((r) => r.escalationCount)),\n avgTokensEscalated: escalatedRuns.length > 0 ? avg(escalatedRuns.map((r) => r.tokensUsed)) : 0,\n avgTokensNonEscalated: nonEscalatedRuns.length > 0 ? avg(nonEscalatedRuns.map((r) => r.tokensUsed)) : 0,\n avgQualityEscalated: escalatedRuns.length > 0 ? avg(escalatedRuns.map((r) => r.qualityScore)) : 0,\n avgQualityNonEscalated: nonEscalatedRuns.length > 0 ? avg(nonEscalatedRuns.map((r) => r.qualityScore)) : 0,\n };\n}\n\nfunction printReport(ctx: PluginContextV3, report: ReturnType<typeof buildReport>): void {\n if (report.runs === 0) {\n ctx.ui.write(`No KPI runs for selected period (${report.periodDays}d)\\n`);\n return;\n }\n\n if (!('scorecard' in report)) { return; }\n const s = report.scorecard;\n if (s === undefined) { return; }\n ctx.ui.write('βββ Agent Quality Control Report\\n');\n ctx.ui.write(`β Period: ${report.periodDays}d\\n`);\n if (report.sessionId) {\n ctx.ui.write(`β Session: ${report.sessionId}\\n`);\n }\n ctx.ui.write(`β Runs: ${report.runs} | Regressions: ${report.regressions}\\n`);\n ctx.ui.write('β\\n');\n ctx.ui.write(`β Success Rate: ${(s.successRate * 100).toFixed(1)}%\\n`);\n ctx.ui.write(`β Quality Pass: ${(s.qualityPassRate * 100).toFixed(1)}% | Avg score: ${s.avgQualityScore.toFixed(2)}\\n`);\n ctx.ui.write(`β Tokens: avg ${Math.round(s.avgTokens)} | p95 ${Math.round(s.p95Tokens)}\\n`);\n ctx.ui.write(`β Duration: avg ${(s.avgDurationMs / 1000).toFixed(1)}s\\n`);\n ctx.ui.write(`β Tools: avg ${s.avgToolCalls.toFixed(1)} | error ${(s.avgToolErrorRate * 100).toFixed(2)}%\\n`);\n ctx.ui.write(`β Drift: ${(s.avgDriftRate * 100).toFixed(2)}% | Evidence density: ${s.avgEvidenceDensity.toFixed(2)}\\n`);\n ctx.ui.write(`β Near budget rate: ${(s.nearBudgetRate * 100).toFixed(1)}%\\n`);\n ctx.ui.write(`β Escalation: ${(s.escalationRate * 100).toFixed(1)}% runs | success ${(s.escalationSuccessRate * 100).toFixed(1)}% | avg count ${s.avgEscalationCount.toFixed(2)}\\n`);\n if (s.escalationRate > 0 && s.escalationRate < 1) {\n const tokenDelta = s.avgTokensEscalated - s.avgTokensNonEscalated;\n const qualityDelta = s.avgQualityEscalated - s.avgQualityNonEscalated;\n ctx.ui.write(`β Escalated vs non-escalated: Ξtokens ${tokenDelta >= 0 ? '+' : ''}${Math.round(tokenDelta)} | Ξquality ${qualityDelta >= 0 ? '+' : ''}${qualityDelta.toFixed(2)}\\n`);\n } else {\n ctx.ui.write('β Escalated vs non-escalated: n/a (need both escalated and non-escalated runs)\\n');\n }\n\n if (report.slices) {\n const d = report.slices.delta;\n ctx.ui.write('β\\n');\n ctx.ui.write(`β Slices (${report.slices.sliceSize} latest vs previous):\\n`);\n ctx.ui.write(`β Ξ Quality score: ${d.avgQualityScore >= 0 ? '+' : ''}${d.avgQualityScore.toFixed(2)}\\n`);\n ctx.ui.write(`β Ξ Avg tokens: ${d.avgTokens >= 0 ? '+' : ''}${Math.round(d.avgTokens)}\\n`);\n ctx.ui.write(`β Ξ Avg duration: ${d.avgDurationMs >= 0 ? '+' : ''}${(d.avgDurationMs / 1000).toFixed(1)}s\\n`);\n ctx.ui.write(`β Ξ Tool errors: ${d.avgToolErrorRate >= 0 ? '+' : ''}${(d.avgToolErrorRate * 100).toFixed(2)}%\\n`);\n ctx.ui.write(`β Ξ Drift: ${d.avgDriftRate >= 0 ? '+' : ''}${(d.avgDriftRate * 100).toFixed(2)}%\\n`);\n ctx.ui.write(`β Ξ Escalation rate: ${d.escalationRate >= 0 ? '+' : ''}${(d.escalationRate * 100).toFixed(1)}%\\n`);\n ctx.ui.write(`β Ξ Escalation success: ${d.escalationSuccessRate >= 0 ? '+' : ''}${(d.escalationSuccessRate * 100).toFixed(1)}%\\n`);\n ctx.ui.write(`β Ξ Escalation count: ${d.avgEscalationCount >= 0 ? '+' : ''}${d.avgEscalationCount.toFixed(2)}\\n`);\n }\n\n if (report.alerts.length > 0) {\n ctx.ui.write('β\\n');\n ctx.ui.write('β Alerts:\\n');\n for (const alert of report.alerts) {\n ctx.ui.write(`β - ${alert}\\n`);\n }\n }\n\n ctx.ui.write('β\\n');\n ctx.ui.write('β Top expensive runs:\\n');\n for (const run of report.topTokenRuns) {\n const esc = run.escalated ? ` | esc=${run.escalationCount}` : '';\n ctx.ui.write(`β - ${run.ts} | tok=${run.tokensUsed} | q=${run.qualityScore.toFixed(2)}${esc} | ${run.task}\\n`);\n }\n\n ctx.ui.write('β\\n');\n ctx.ui.write('β Worst quality runs:\\n');\n for (const run of report.worstQualityRuns) {\n const reasons = (run.qualityReasons || []).join(', ');\n ctx.ui.write(`β - ${run.ts} | q=${run.qualityScore.toFixed(2)} | tok=${run.tokensUsed} | reasons=${reasons || 'n/a'}\\n`);\n }\n ctx.ui.write('βββ\\n');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/agents/entry/src/cli/commands/quality-report.ts"],"names":["execFileCb","fs"],"mappings":";;;;;;;AAiBA,IAAM,QAAA,GAAW,UAAUA,UAAU,CAAA;AAsFrC,SAAS,oBAAoB,OAAA,EAAiE;AAC5F,EAAA,IAAI,SAAS,WAAA,EAAa,MAAA,KAAW,UAAU,OAAA,EAAS,WAAA,EAAa,WAAW,SAAA,EAAW;AACzF,IAAA,OAAO,QAAQ,WAAA,CAAY,MAAA;AAAA,EAC7B;AACA,EAAA,IAAI,OAAA,EAAS,iBAAA,KAAsB,MAAA,IAAU,OAAA,EAAS,sBAAsB,SAAA,EAAW;AACrF,IAAA,OAAO,OAAA,CAAQ,iBAAA;AAAA,EACjB;AACA,EAAA,OAAO,OAAA,EAAS,UAAU,MAAA,GAAS,SAAA;AACrC;AAEA,IAAO,yBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,gBAAA;AAAA,EACJ,WAAA,EAAa,yFAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA4D;AAC9F,MAAA,MAAM,KAAA,GAAS,OAAA,IAAW,KAAA,IAAS,OAAQ,KAAA,CAA8B,KAAA,KAAU,QAAA,IAAa,KAAA,CAA8B,KAAA,KAAU,IAAA,GACnI,KAAA,CAAwC,KAAA,GACzC,KAAA;AACJ,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,CAAC,CAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,IAAS,GAAG,CAAA;AACvC,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAY,CAAA,IAAK,KAAA,CAAM,SAAA;AAClD,MAAA,MAAM,eAAA,GAAkB,OAAO,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,MAAA;AAC1E,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAE/B,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,QAAQ,CAAA,EAAG;AACvC,QAAA,MAAM,GAAA,GAAM,EAAE,OAAA,EAAS,KAAA,EAAO,OAAO,kCAAA,EAAmC;AACxE,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,GAAG,CAAA;AAClB,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAkB,QAAQ,GAAA,EAAI;AAAA,MAC3D;AAEA,MAAA,MAAM,YAAA,GAAe,KAAK,IAAA,CAAK,OAAA,CAAQ,KAAI,EAAG,KAAA,EAAO,aAAa,QAAQ,CAAA;AAC1E,MAAA,MAAM,KAAA,GAAQ,MAAM,cAAA,CAAe,YAAA,EAAc,IAAI,CAAA;AACrD,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,MAAM,MAAM,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,8CAAA,EAAgD,MAAM,CAAA,EAAE;AAC9F,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,GAAG,CAAA;AAClB,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,MACjC;AAEA,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,KAAQ,IAAA,GAAO,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AACjD,MAAA,IAAI,EAAE,MAAM,WAAA,EAAY,GAAI,MAAM,UAAA,CAAW,KAAA,EAAO,KAAA,EAAO,eAAA,EAAiB,KAAK,CAAA;AACjF,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,QAAA,MAAM,UAAA,GAAa,KAAK,IAAA,CAAK,OAAA,CAAQ,KAAI,EAAG,KAAA,EAAO,aAAa,kBAAkB,CAAA;AAClF,QAAA,MAAM,eAAe,MAAM,oBAAA,CAAqB,UAAA,EAAY,KAAA,EAAO,iBAAiB,KAAK,CAAA;AACzF,QAAA,IAAA,GAAO,YAAA,CAAa,IAAA;AACpB,QAAA,WAAA,GAAc,YAAA,CAAa,WAAA;AAAA,MAC7B;AACA,MAAA,MAAM,SAAS,WAAA,CAAY,IAAA,EAAM,aAAa,EAAE,IAAA,EAAM,iBAAiB,CAAA;AAEvE,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAQ,CAAA;AAAA,MAC1C,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,MACzB;AAEA,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO;AAAA,IACpC;AAAA;AAEJ,CAAC;AAED,eAAe,cAAA,CAAe,KAAa,IAAA,EAAiC;AAC1E,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMC,QAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AACpC,IAAA,MAAM,UAAA,GAAa,OAAA,CAChB,MAAA,CAAO,CAAC,IAAA,KAAS,wBAAwB,IAAA,CAAK,IAAI,CAAC,CAAA,CACnD,IAAA,EAAK;AAER,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,UAAA,CAAW,MAAA,EAAQ,IAAA,GAAO,CAAC,CAAC,CAAA;AAC9D,IAAA,OAAO,UAAA,CAAW,KAAA,CAAM,CAAC,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EACnE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,eAAe,UAAA,CACb,KAAA,EACA,OAAA,EACA,eAAA,EACA,KAAA,EACkE;AAClE,EAAA,MAAM,OAAsB,EAAC;AAC7B,EAAA,MAAM,cAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,MAAMA,QAAA,CAAG,QAAA,CAAS,MAAM,OAAO,CAAA;AAC/C,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,OAAO,OAAO,CAAA;AAEhD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI;AACF,QAAA,SAAA,GAAY,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MAC7B,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC/C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,SAAA;AAEZ,MAAA,MAAM,EAAA,GAAK,OAAO,GAAA,CAAI,IAAI,CAAA,KAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAC,CAAA,GAAI,GAAA;AACnE,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,IAAK,KAAK,OAAA,EAAS;AACxC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,CAAI,MAAM,CAAA,KAAM,yBAAA,EAA2B;AAC7C,QAAA,MAAM,KAAA,GAAQ,GAAA;AACd,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,IAAW,EAAC;AAC5B,QAAA,MAAM,SAAA,GAAY,EAAE,SAAA,IAAa,SAAA;AACjC,QAAA,IAAI,eAAA,IAAmB,cAAc,eAAA,EAAiB;AACpD,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,IAAI,KAAA,CAAM,EAAA,IAAM,IAAI,IAAA,CAAK,EAAE,EAAE,WAAA,EAAY;AAAA,UACzC,SAAA;AAAA,UACA,OAAA,EAAS,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA;AAAA,UAC1B,IAAA,EAAM,EAAE,IAAA,IAAQ,EAAA;AAAA,UAChB,cAAA,EAAgB,EAAE,cAAA,IAAkB,EAAA;AAAA,UACpC,UAAA,EAAY,MAAA,CAAO,CAAA,CAAE,UAAA,IAAc,CAAC,CAAA;AAAA,UACpC,UAAA,EAAY,MAAA,CAAO,CAAA,CAAE,UAAA,IAAc,CAAC,CAAA;AAAA,UACpC,cAAA,EAAgB,MAAA,CAAO,CAAA,CAAE,cAAA,IAAkB,CAAC,CAAA;AAAA,UAC5C,eAAA,EAAiB,MAAA,CAAO,CAAA,CAAE,eAAA,IAAmB,CAAC,CAAA;AAAA,UAC9C,oBAAA,EAAsB,MAAA,CAAO,CAAA,CAAE,oBAAA,IAAwB,CAAC,CAAA;AAAA,UACxD,cAAA,EAAgB,MAAA,CAAO,CAAA,CAAE,cAAA,IAAkB,CAAC,CAAA;AAAA,UAC5C,aAAA,EAAe,MAAA,CAAO,CAAA,CAAE,aAAA,IAAiB,CAAC,CAAA;AAAA,UAC1C,QAAA,EAAU,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA;AAAA,UAC5B,eAAA,EAAiB,MAAA,CAAO,CAAA,CAAE,eAAA,IAAmB,CAAC,CAAA;AAAA,UAC9C,SAAA,EAAW,MAAA,CAAO,CAAA,CAAE,SAAA,IAAa,CAAC,CAAA;AAAA,UAClC,aAAA,EAAe,oBAAoB,CAAC,CAAA;AAAA,UACpC,YAAA,EAAc,OAAO,CAAA,CAAE,WAAA,EAAa,UAAU,CAAA,CAAE,OAAA,GAAU,IAAI,CAAA,CAAE,CAAA;AAAA,UAChE,cAAA,EAAgB,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,WAAA,EAAa,OAAO,CAAA,GAAI,CAAA,CAAE,WAAA,CAAa,OAAA,GAAW,EAAC;AAAA,UACnF,SAAA,EAAY,EAAE,SAAA,KAAc,OAAA,IAAW,EAAE,SAAA,KAAc,OAAA,GAAW,EAAE,SAAA,GAAY,QAAA;AAAA,UAChF,SAAA,EAAY,EAAE,SAAA,KAAc,OAAA,IAAW,EAAE,SAAA,KAAc,OAAA,GAAW,EAAE,SAAA,GAAY,QAAA;AAAA,UAChF,SAAA,EAAW,OAAA,CAAQ,CAAA,CAAE,SAAS,CAAA;AAAA,UAC9B,eAAA,EAAiB,MAAA,CAAO,CAAA,CAAE,eAAA,IAAmB,CAAC,CAAA;AAAA,UAC9C,iBAAA,EAAmB,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,iBAAiB,CAAA,GAChD,CAAA,CAAE,iBAAA,CAAkB,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,IACpE,EAAC;AAAA,UACL,cAAA,EAAgB,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,cAAc,CAAA,GAC1C,CAAA,CAAE,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,IACjE;AAAC,SACN,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,GAAA,CAAI,MAAM,CAAA,KAAM,8BAAA,EAAgC;AACzD,QAAA,MAAM,KAAA,GAAQ,GAAA;AACd,QAAA,MAAM,SAAA,GAAY,MAAM,OAAA,EAAS,SAAA;AACjC,QAAA,IAAI,eAAA,IAAmB,cAAc,eAAA,EAAiB;AACpD,UAAA;AAAA,QACF;AACA,QAAA,WAAA,CAAY,KAAK,KAAK,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,KAAK,KAAA,CAAM,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AACpD,EAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,WAAA,EAAY;AAC1C;AAEA,eAAe,oBAAA,CACb,UAAA,EACA,OAAA,EACA,eAAA,EACA,KAAA,EACkE;AAClE,EAAA,IAAI;AACF,IAAA,MAAMA,QAAA,CAAG,OAAO,UAAU,CAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAA,EAAM,EAAC,EAAG,WAAA,EAAa,EAAC,EAAE;AAAA,EACrC;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,OAAO,EAAE,WAAA,EAAY;AAC/C,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,0BAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAgB,QAAQ,CAAA,CAAA,CAAA;AAAA,IACxB,2EAAA;AAAA,IACA,kBAAA;AAAA,IACA,SAAS,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,GACnC,CAAE,KAAK,GAAG,CAAA;AAEV,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,QAAA,CAAS,WAAW,CAAC,OAAA,EAAS,UAAA,EAAY,GAAG,CAAA,EAAG;AAAA,MACvE,SAAA,EAAW,KAAK,IAAA,GAAO;AAAA,KACxB,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAI,CAAA;AAKtC,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAC1C,IAAA,EAAM,IAAI,IAAA,IAAQ,EAAA;AAAA,MAClB,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,OAAA,EAAS,aAAA,CAAc,GAAA,CAAI,OAAO;AAAA,KACpC,CAAE,CAAA;AACF,IAAA,OAAO,kBAAA,CAAmB,gBAAA,EAAkB,OAAA,EAAS,eAAA,EAAiB,KAAK,CAAA;AAAA,EAC7E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAA,EAAM,EAAC,EAAG,WAAA,EAAa,EAAC,EAAE;AAAA,EACrC;AACF;AAEA,SAAS,cAAc,KAAA,EAAyC;AAC9D,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC/B,IAAA,OAAO,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,EAAC;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,kBAAA,CACP,IAAA,EACA,OAAA,EACA,eAAA,EACA,KAAA,EACyD;AACzD,EAAA,MAAM,OAAsB,EAAC;AAC7B,EAAA,MAAM,cAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,EAAA,GAAK,OAAO,GAAA,CAAI,EAAA,KAAO,WAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,GAAI,GAAA;AAC7D,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,IAAK,KAAK,OAAA,EAAS;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,SAAS,yBAAA,EAA2B;AAC1C,MAAA,MAAM,CAAA,GAAK,GAAA,CAAI,OAAA,IAAW,EAAC;AAC3B,MAAA,MAAM,SAAA,GAAY,GAAG,SAAA,IAAa,SAAA;AAClC,MAAA,IAAI,eAAA,IAAmB,cAAc,eAAA,EAAiB;AACpD,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,IAAI,GAAA,CAAI,EAAA,IAAM,IAAI,IAAA,CAAK,EAAE,EAAE,WAAA,EAAY;AAAA,QACvC,SAAA;AAAA,QACA,OAAA,EAAS,OAAA,CAAQ,CAAA,EAAG,OAAO,CAAA;AAAA,QAC3B,IAAA,EAAM,GAAG,IAAA,IAAQ,EAAA;AAAA,QACjB,cAAA,EAAgB,GAAG,cAAA,IAAkB,EAAA;AAAA,QACrC,UAAA,EAAY,MAAA,CAAO,CAAA,EAAG,UAAA,IAAc,CAAC,CAAA;AAAA,QACrC,UAAA,EAAY,MAAA,CAAO,CAAA,EAAG,UAAA,IAAc,CAAC,CAAA;AAAA,QACrC,cAAA,EAAgB,MAAA,CAAO,CAAA,EAAG,cAAA,IAAkB,CAAC,CAAA;AAAA,QAC7C,eAAA,EAAiB,MAAA,CAAO,CAAA,EAAG,eAAA,IAAmB,CAAC,CAAA;AAAA,QAC/C,oBAAA,EAAsB,MAAA,CAAO,CAAA,EAAG,oBAAA,IAAwB,CAAC,CAAA;AAAA,QACzD,cAAA,EAAgB,MAAA,CAAO,CAAA,EAAG,cAAA,IAAkB,CAAC,CAAA;AAAA,QAC7C,aAAA,EAAe,MAAA,CAAO,CAAA,EAAG,aAAA,IAAiB,CAAC,CAAA;AAAA,QAC3C,QAAA,EAAU,OAAA,CAAQ,CAAA,EAAG,QAAQ,CAAA;AAAA,QAC7B,eAAA,EAAiB,MAAA,CAAO,CAAA,EAAG,eAAA,IAAmB,CAAC,CAAA;AAAA,QAC/C,SAAA,EAAW,MAAA,CAAO,CAAA,EAAG,SAAA,IAAa,CAAC,CAAA;AAAA,QACnC,aAAA,EAAe,oBAAoB,CAAC,CAAA;AAAA,QACpC,YAAA,EAAc,OAAO,CAAA,EAAG,WAAA,EAAa,UAAU,CAAA,EAAG,OAAA,GAAU,IAAI,CAAA,CAAE,CAAA;AAAA,QAClE,cAAA,EAAgB,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,WAAA,EAAa,OAAO,CAAA,GAAI,CAAA,EAAG,WAAA,CAAY,OAAA,GAAU,EAAC;AAAA,QACnF,SAAA,EAAY,GAAG,SAAA,KAAc,OAAA,IAAW,GAAG,SAAA,KAAc,OAAA,GAAW,EAAE,SAAA,GAAY,QAAA;AAAA,QAClF,SAAA,EAAY,GAAG,SAAA,KAAc,OAAA,IAAW,GAAG,SAAA,KAAc,OAAA,GAAW,EAAE,SAAA,GAAY,QAAA;AAAA,QAClF,SAAA,EAAW,OAAA,CAAQ,CAAA,EAAG,SAAS,CAAA;AAAA,QAC/B,eAAA,EAAiB,MAAA,CAAO,CAAA,EAAG,eAAA,IAAmB,CAAC,CAAA;AAAA,QAC/C,iBAAA,EAAmB,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,iBAAiB,CAAA,GACjD,CAAA,CAAE,iBAAA,CAAkB,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,IACpE,EAAC;AAAA,QACL,cAAA,EAAgB,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,cAAc,CAAA,GAC3C,CAAA,CAAE,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,IACjE;AAAC,OACN,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,SAAS,8BAAA,EAAgC;AAC/C,MAAA,MAAM,KAAA,GAAyB;AAAA,QAC7B,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,SAAS,GAAA,CAAI;AAAA,OACf;AACA,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,EAAS,SAAA;AACjC,MAAA,IAAI,eAAA,IAAmB,cAAc,eAAA,EAAiB;AACpD,QAAA;AAAA,MACF;AACA,MAAA,WAAA,CAAY,KAAK,KAAK,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACvD,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA,EAAG,WAAA,EAAY;AAChE;AAEA,SAAS,WAAA,CACP,IAAA,EACA,WAAA,EACA,IAAA,EACA;AACA,EAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO;AAAA,MACL,YAAY,IAAA,CAAK,IAAA;AAAA,MACjB,WAAW,IAAA,CAAK,eAAA;AAAA,MAChB,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,YAAY,IAAI,CAAA;AAElC,EAAA,MAAM,eAAe,CAAC,GAAG,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA,CAAE,UAAU,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AACrF,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAG,IAAI,EAC9B,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,eAAe,CAAA,CAAE,YAAA,IAAgB,EAAE,UAAA,GAAa,CAAA,CAAE,UAAU,CAAA,CAC7E,KAAA,CAAM,GAAG,CAAC,CAAA;AAEb,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,SAAA,CAAU,cAAc,IAAA,EAAM;AAAC,IAAA,MAAA,CAAO,IAAA,CAAK,sBAAsB,SAAA,CAAU,WAAA,GAAc,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAAE;AACjH,EAAA,IAAI,SAAA,CAAU,kBAAkB,GAAA,EAAK;AAAC,IAAA,MAAA,CAAO,IAAA,CAAK,oCAAoC,SAAA,CAAU,eAAA,GAAkB,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAAE;AACtI,EAAA,IAAI,SAAA,CAAU,mBAAmB,IAAA,EAAM;AAAC,IAAA,MAAA,CAAO,IAAA,CAAK,0BAA0B,SAAA,CAAU,gBAAA,GAAmB,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAAE;AAC/H,EAAA,IAAI,SAAA,CAAU,eAAe,IAAA,EAAM;AAAC,IAAA,MAAA,CAAO,IAAA,CAAK,6BAA6B,SAAA,CAAU,YAAA,GAAe,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAAE;AAC1H,EAAA,IAAI,SAAA,CAAU,iBAAiB,IAAA,EAAM;AAAC,IAAA,MAAA,CAAO,IAAA,CAAK,yCAAyC,SAAA,CAAU,cAAA,GAAiB,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAAE;AAC1I,EAAA,IAAI,SAAA,CAAU,iBAAiB,IAAA,EAAM;AAAC,IAAA,MAAA,CAAO,IAAA,CAAK,8BAA8B,SAAA,CAAU,cAAA,GAAiB,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAAE;AAC/H,EAAA,IAAI,SAAA,CAAU,cAAA,GAAiB,GAAA,IAAO,SAAA,CAAU,wBAAwB,GAAA,EAAK;AAC3E,IAAA,MAAA,CAAO,IAAA,CAAK,qCAAqC,SAAA,CAAU,qBAAA,GAAwB,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EACvG;AACA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAAC,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,oCAAA,EAAuC,WAAA,CAAY,MAAM,CAAA,CAAE,CAAA;AAAA,EAAE;AAEtG,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAC,CAAA;AACvE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AAC3C,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,YAAY,CAAC,CAAA;AACzD,EAAA,MAAM,eAAA,GAAkB,YAAY,WAAW,CAAA;AAC/C,EAAA,MAAM,iBAAA,GAAoB,YAAY,aAAa,CAAA;AAEnD,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,GAAS,CAAA,GAClC;AAAA,IACA,SAAA;AAAA,IACA,MAAA,EAAQ,eAAA;AAAA,IACR,QAAA,EAAU,iBAAA;AAAA,IACV,KAAA,EAAO;AAAA,MACL,WAAA,EAAa,eAAA,CAAgB,WAAA,GAAc,iBAAA,CAAkB,WAAA;AAAA,MAC7D,eAAA,EAAiB,eAAA,CAAgB,eAAA,GAAkB,iBAAA,CAAkB,eAAA;AAAA,MACrE,eAAA,EAAiB,eAAA,CAAgB,eAAA,GAAkB,iBAAA,CAAkB,eAAA;AAAA,MACrE,SAAA,EAAW,eAAA,CAAgB,SAAA,GAAY,iBAAA,CAAkB,SAAA;AAAA,MACzD,SAAA,EAAW,eAAA,CAAgB,SAAA,GAAY,iBAAA,CAAkB,SAAA;AAAA,MACzD,aAAA,EAAe,eAAA,CAAgB,aAAA,GAAgB,iBAAA,CAAkB,aAAA;AAAA,MACjE,YAAA,EAAc,eAAA,CAAgB,YAAA,GAAe,iBAAA,CAAkB,YAAA;AAAA,MAC/D,gBAAA,EAAkB,eAAA,CAAgB,gBAAA,GAAmB,iBAAA,CAAkB,gBAAA;AAAA,MACvE,YAAA,EAAc,eAAA,CAAgB,YAAA,GAAe,iBAAA,CAAkB,YAAA;AAAA,MAC/D,kBAAA,EAAoB,eAAA,CAAgB,kBAAA,GAAqB,iBAAA,CAAkB,kBAAA;AAAA,MAC3E,cAAA,EAAgB,eAAA,CAAgB,cAAA,GAAiB,iBAAA,CAAkB,cAAA;AAAA,MACnE,cAAA,EAAgB,eAAA,CAAgB,cAAA,GAAiB,iBAAA,CAAkB,cAAA;AAAA,MACnE,qBAAA,EAAuB,eAAA,CAAgB,qBAAA,GAAwB,iBAAA,CAAkB,qBAAA;AAAA,MACjF,kBAAA,EAAoB,eAAA,CAAgB,kBAAA,GAAqB,iBAAA,CAAkB;AAAA;AAC7E,GACF,GACE,IAAA;AAEJ,EAAA,OAAO;AAAA,IACL,YAAY,IAAA,CAAK,IAAA;AAAA,IACjB,WAAW,IAAA,CAAK,eAAA;AAAA,IAChB,IAAA,EAAM,KAAA;AAAA,IACN,aAAa,WAAA,CAAY,MAAA;AAAA,IACzB,SAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA,EAAc,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AAAA,IACzC,gBAAA,EAAkB,gBAAA,CAAiB,GAAA,CAAI,UAAU;AAAA,GACnD;AACF;AAEA,SAAS,WAAW,GAAA,EAAkB;AACpC,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,IAC3B,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,gBAAgB,GAAA,CAAI,cAAA;AAAA,IACpB,eAAe,GAAA,CAAI,aAAA;AAAA,IACnB,cAAc,GAAA,CAAI,YAAA;AAAA,IAClB,gBAAgB,GAAA,CAAI,cAAA;AAAA,IACpB,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,iBAAiB,GAAA,CAAI,eAAA;AAAA,IACrB,mBAAmB,GAAA,CAAI;AAAA,GACzB;AACF;AAEA,SAAS,IAAI,MAAA,EAA0B;AACrC,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,CAAA;AAAA,EAAE;AACnC,EAAA,OAAO,MAAA,CAAO,OAAO,CAAC,GAAA,EAAK,UAAU,GAAA,GAAM,KAAA,EAAO,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA;AAChE;AAEA,SAAS,IAAI,MAAA,EAA0B;AACrC,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,CAAA;AAAA,EAAE;AACnC,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC/C,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAK,MAAA,CAAO,MAAA,GAAS,IAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAC1F,EAAA,OAAO,MAAA,CAAO,KAAK,CAAA,IAAK,CAAA;AAC1B;AAEA,SAAS,YAAY,IAAA,EAAqB;AACxC,EAAA,MAAM,gBAAgB,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACpD,EAAA,MAAM,mBAAmB,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,SAAS,CAAA;AAExD,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,OAAA,GAAU,CAAA,GAAI,CAAE,CAAC,CAAA;AAAA,IACrD,eAAA,EAAiB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,aAAA,KAAkB,MAAA,GAAS,CAAA,GAAI,CAAE,CAAC,CAAA;AAAA,IAC1E,eAAA,EAAiB,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAC,CAAA;AAAA,IACpD,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IAC5C,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IAC5C,aAAA,EAAe,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IAChD,YAAA,EAAc,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,CAAC,CAAA;AAAA,IACnD,gBAAA,EAAkB,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAC,CAAA;AAAA,IACtD,YAAA,EAAc,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,IAC9C,kBAAA,EAAoB,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,CAAC,CAAA;AAAA,IAC1D,cAAA,EAAgB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,oBAAA,IAAwB,GAAA,GAAM,CAAA,GAAI,CAAE,CAAC,CAAA;AAAA,IAC5E,cAAA,EAAgB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,SAAA,GAAY,CAAA,GAAI,CAAE,CAAC,CAAA;AAAA,IAC1D,qBAAA,EAAuB,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,IAAI,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,OAAA,GAAU,CAAA,GAAI,CAAE,CAAC,CAAA,GAAI,CAAA;AAAA,IACvG,kBAAA,EAAoB,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,CAAC,CAAA;AAAA,IAC1D,kBAAA,EAAoB,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA,GAAI,CAAA;AAAA,IAC7F,qBAAA,EAAuB,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA,GAAI,CAAA;AAAA,IACtG,mBAAA,EAAqB,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAC,CAAA,GAAI,CAAA;AAAA,IAChG,sBAAA,EAAwB,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,CAAC,CAAA,GAAI;AAAA,GAC3G;AACF;AAEA,SAAS,WAAA,CAAY,KAAsB,MAAA,EAA8C;AACvF,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,iCAAA,EAAoC,MAAA,CAAO,UAAU,CAAA;AAAA,CAAM,CAAA;AACxE,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,EAAE,eAAe,MAAA,CAAA,EAAS;AAAE,IAAA;AAAA,EAAQ;AACxC,EAAA,MAAM,IAAI,MAAA,CAAO,SAAA;AACjB,EAAA,IAAI,MAAM,MAAA,EAAW;AAAE,IAAA;AAAA,EAAQ;AAC/B,EAAA,GAAA,CAAI,EAAA,CAAG,MAAM,mDAAoC,CAAA;AACjD,EAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,gBAAA,EAAc,MAAA,CAAO,UAAU,CAAA;AAAA,CAAK,CAAA;AACjD,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,iBAAA,EAAe,MAAA,CAAO,SAAS;AAAA,CAAI,CAAA;AAAA,EAClD;AACA,EAAA,GAAA,CAAI,GAAG,KAAA,CAAM,CAAA,cAAA,EAAY,OAAO,IAAI,CAAA,gBAAA,EAAmB,OAAO,WAAW;AAAA,CAAI,CAAA;AAC7E,EAAA,GAAA,CAAI,EAAA,CAAG,MAAM,UAAK,CAAA;AAClB,EAAA,GAAA,CAAI,EAAA,CAAG,MAAM,CAAA,sBAAA,EAAA,CAAqB,CAAA,CAAE,cAAc,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,CAAK,CAAA;AACtE,EAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,sBAAA,EAAA,CAAqB,CAAA,CAAE,kBAAkB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,eAAA,EAAkB,CAAA,CAAE,eAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC;AAAA,CAAI,CAAA;AACvH,EAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,oBAAA,EAAkB,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,SAAS,CAAC,CAAA,OAAA,EAAU,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,SAAS,CAAC;AAAA,CAAI,CAAA;AAC3F,EAAA,GAAA,CAAI,EAAA,CAAG,MAAM,CAAA,sBAAA,EAAA,CAAqB,CAAA,CAAE,gBAAgB,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,CAAK,CAAA;AACzE,EAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,mBAAA,EAAiB,CAAA,CAAE,aAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,SAAA,EAAA,CAAa,CAAA,CAAE,gBAAA,GAAmB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,CAAK,CAAA;AAC7G,EAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,eAAA,EAAA,CAAc,CAAA,CAAE,eAAe,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,sBAAA,EAAyB,CAAA,CAAE,kBAAA,CAAmB,OAAA,CAAQ,CAAC,CAAC;AAAA,CAAI,CAAA;AACvH,EAAA,GAAA,CAAI,EAAA,CAAG,MAAM,CAAA,0BAAA,EAAA,CAAyB,CAAA,CAAE,iBAAiB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,CAAK,CAAA;AAC7E,EAAA,GAAA,CAAI,EAAA,CAAG,MAAM,CAAA,oBAAA,EAAA,CAAmB,CAAA,CAAE,iBAAiB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,iBAAA,EAAA,CAAqB,EAAE,qBAAA,GAAwB,GAAA,EAAK,QAAQ,CAAC,CAAC,iBAAiB,CAAA,CAAE,kBAAA,CAAmB,OAAA,CAAQ,CAAC,CAAC;AAAA,CAAI,CAAA;AACpL,EAAA,IAAI,CAAA,CAAE,cAAA,GAAiB,CAAA,IAAK,CAAA,CAAE,iBAAiB,CAAA,EAAG;AAChD,IAAA,MAAM,UAAA,GAAa,CAAA,CAAE,kBAAA,GAAqB,CAAA,CAAE,qBAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,CAAA,CAAE,mBAAA,GAAsB,CAAA,CAAE,sBAAA;AAC/C,IAAA,GAAA,CAAI,EAAA,CAAG,MAAM,CAAA,iDAAA,EAA0C,UAAA,IAAc,IAAI,GAAA,GAAM,EAAE,GAAG,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,CAAA,iBAAA,EAAe,gBAAgB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC;AAAA,CAAI,CAAA;AAAA,EACrL,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,EAAA,CAAG,MAAM,wFAAmF,CAAA;AAAA,EAClG;AAEA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,MAAM,CAAA,GAAI,OAAO,MAAA,CAAO,KAAA;AACxB,IAAA,GAAA,CAAI,EAAA,CAAG,MAAM,UAAK,CAAA;AAClB,IAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,gBAAA,EAAc,MAAA,CAAO,OAAO,SAAS,CAAA;AAAA,CAAyB,CAAA;AAC3E,IAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,8BAAA,EAAuB,CAAA,CAAE,eAAA,IAAmB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,CAAA,CAAE,eAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC;AAAA,CAAI,CAAA;AACxG,IAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,2BAAA,EAAoB,CAAA,CAAE,SAAA,IAAa,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,SAAS,CAAC;AAAA,CAAI,CAAA;AAC1F,IAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,6BAAA,EAAsB,CAAA,CAAE,iBAAiB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAA,CAAI,CAAA,CAAE,aAAA,GAAgB,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,CAAK,CAAA;AAC7G,IAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,4BAAA,EAAqB,CAAA,CAAE,oBAAoB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAA,CAAI,CAAA,CAAE,gBAAA,GAAmB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,CAAK,CAAA;AACjH,IAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,sBAAA,EAAe,CAAA,CAAE,gBAAgB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAA,CAAI,CAAA,CAAE,YAAA,GAAe,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,CAAK,CAAA;AACnG,IAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,gCAAA,EAAyB,CAAA,CAAE,kBAAkB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAA,CAAI,CAAA,CAAE,cAAA,GAAiB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,CAAK,CAAA;AACjH,IAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,mCAAA,EAA4B,CAAA,CAAE,yBAAyB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAA,CAAI,CAAA,CAAE,qBAAA,GAAwB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,CAAK,CAAA;AAClI,IAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,iCAAA,EAA0B,CAAA,CAAE,kBAAA,IAAsB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,CAAA,CAAE,kBAAA,CAAmB,OAAA,CAAQ,CAAC,CAAC;AAAA,CAAI,CAAA;AAAA,EACnH;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC5B,IAAA,GAAA,CAAI,EAAA,CAAG,MAAM,UAAK,CAAA;AAClB,IAAA,GAAA,CAAI,EAAA,CAAG,MAAM,mBAAc,CAAA;AAC3B,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,CAAA,UAAA,EAAQ,KAAK;AAAA,CAAI,CAAA;AAAA,IAChC;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,EAAA,CAAG,MAAM,UAAK,CAAA;AAClB,EAAA,GAAA,CAAI,EAAA,CAAG,MAAM,+BAA0B,CAAA;AACvC,EAAA,KAAA,MAAW,GAAA,IAAO,OAAO,YAAA,EAAc;AACrC,IAAA,MAAM,MAAM,GAAA,CAAI,SAAA,GAAY,CAAA,OAAA,EAAU,GAAA,CAAI,eAAe,CAAA,CAAA,GAAK,EAAA;AAC9D,IAAA,GAAA,CAAI,GAAG,KAAA,CAAM,CAAA,UAAA,EAAQ,IAAI,EAAE,CAAA,OAAA,EAAU,IAAI,UAAU,CAAA,KAAA,EAAQ,GAAA,CAAI,YAAA,CAAa,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAA,GAAA,EAAM,IAAI,IAAI;AAAA,CAAI,CAAA;AAAA,EAChH;AAEA,EAAA,GAAA,CAAI,EAAA,CAAG,MAAM,UAAK,CAAA;AAClB,EAAA,GAAA,CAAI,EAAA,CAAG,MAAM,+BAA0B,CAAA;AACvC,EAAA,KAAA,MAAW,GAAA,IAAO,OAAO,gBAAA,EAAkB;AACzC,IAAA,MAAM,WAAW,GAAA,CAAI,cAAA,IAAkB,EAAC,EAAG,KAAK,IAAI,CAAA;AACpD,IAAA,GAAA,CAAI,GAAG,KAAA,CAAM,CAAA,UAAA,EAAQ,GAAA,CAAI,EAAE,QAAQ,GAAA,CAAI,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,OAAA,EAAU,GAAA,CAAI,UAAU,CAAA,WAAA,EAAc,WAAW,KAAK;AAAA,CAAI,CAAA;AAAA,EAC1H;AACA,EAAA,GAAA,CAAI,EAAA,CAAG,MAAM,sBAAO,CAAA;AACtB","file":"quality-report.js","sourcesContent":["/**\n * agent:quality:report - Agent execution quality control report\n *\n * Usage:\n * pnpm kb agent quality report\n * pnpm kb agent quality report --days=3\n * pnpm kb agent quality report --session-id=session-123\n * pnpm kb agent quality report --json\n */\n\nimport { defineCommand, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport { execFile as execFileCb } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFile = promisify(execFileCb);\n\ntype QualityReportInput = {\n days?: number;\n limit?: number;\n sessionId?: string;\n 'session-id'?: string;\n json?: boolean;\n};\n\ntype KpiRunEvent = {\n type: string;\n ts?: string;\n payload?: {\n sessionId?: string;\n success?: boolean;\n task?: string;\n summaryPreview?: string;\n tokensUsed?: number;\n durationMs?: number;\n iterationsUsed?: number;\n iterationBudget?: number;\n iterationUtilization?: number;\n toolCallsTotal?: number;\n toolErrorRate?: number;\n todoUsed?: boolean;\n evidenceDensity?: number;\n driftRate?: number;\n startTier?: 'small' | 'medium' | 'large';\n finalTier?: 'small' | 'medium' | 'large';\n escalated?: boolean;\n escalationCount?: number;\n escalationReasons?: string[];\n escalationPath?: string[];\n qualityGate?: {\n status?: 'pass' | 'partial';\n score?: number;\n reasons?: string[];\n };\n qualityGateStatus?: 'pass' | 'partial';\n };\n};\n\ntype RegressionEvent = {\n type: string;\n ts?: string;\n payload?: {\n sessionId?: string;\n reasons?: string[];\n metrics?: {\n driftRate?: number;\n evidenceDensity?: number;\n toolErrorRate?: number;\n iterationsUsed?: number;\n iterationBudget?: number;\n };\n };\n};\n\ntype RunSnapshot = {\n ts: string;\n sessionId: string;\n success: boolean;\n task: string;\n summaryPreview: string;\n tokensUsed: number;\n durationMs: number;\n iterationsUsed: number;\n iterationBudget: number;\n iterationUtilization: number;\n toolCallsTotal: number;\n toolErrorRate: number;\n todoUsed: boolean;\n evidenceDensity: number;\n driftRate: number;\n qualityStatus: 'pass' | 'partial';\n qualityScore: number;\n qualityReasons: string[];\n startTier: 'small' | 'medium' | 'large';\n finalTier: 'small' | 'medium' | 'large';\n escalated: boolean;\n escalationCount: number;\n escalationReasons: string[];\n escalationPath: string[];\n};\n\nfunction deriveQualityStatus(payload: KpiRunEvent['payload'] | undefined): 'pass' | 'partial' {\n if (payload?.qualityGate?.status === 'pass' || payload?.qualityGate?.status === 'partial') {\n return payload.qualityGate.status;\n }\n if (payload?.qualityGateStatus === 'pass' || payload?.qualityGateStatus === 'partial') {\n return payload.qualityGateStatus;\n }\n return payload?.success ? 'pass' : 'partial';\n}\n\nexport default defineCommand({\n id: 'quality:report',\n description: 'Show quality control report for agent runs (quality, tokens, tools, drift, regressions)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: QualityReportInput): Promise<CommandResult<unknown>> {\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: QualityReportInput }).flags\n : input;\n const days = Number(flags.days ?? 1);\n const limit = Number(flags.limit ?? 200);\n const rawSessionId = flags['session-id'] ?? flags.sessionId;\n const sessionIdFilter = typeof rawSessionId === 'string' ? rawSessionId : undefined;\n const json = Boolean(flags.json);\n\n if (!Number.isFinite(days) || days <= 0) {\n const err = { success: false, error: '--days must be a positive number' };\n ctx.ui?.json?.(err);\n return { ok: false, error: 'Command failed', result: err };\n }\n\n const analyticsDir = path.join(process.cwd(), '.kb', 'analytics', 'buffer');\n const files = await listEventFiles(analyticsDir, days);\n if (files.length === 0) {\n const out = { success: true, message: 'No analytics files found for selected period', runs: 0 };\n ctx.ui?.json?.(out);\n return { ok: true, result: out };\n }\n\n const since = Date.now() - days * 24 * 60 * 60 * 1000;\n let { runs, regressions } = await readEvents(files, since, sessionIdFilter, limit);\n if (runs.length === 0) {\n const sqlitePath = path.join(process.cwd(), '.kb', 'analytics', 'analytics.sqlite');\n const sqliteEvents = await readEventsFromSqlite(sqlitePath, since, sessionIdFilter, limit);\n runs = sqliteEvents.runs;\n regressions = sqliteEvents.regressions;\n }\n const report = buildReport(runs, regressions, { days, sessionIdFilter });\n\n if (json) {\n ctx.ui?.json?.({ success: true, report });\n } else {\n printReport(ctx, report);\n }\n\n return { ok: true, result: report };\n },\n },\n});\n\nasync function listEventFiles(dir: string, days: number): Promise<string[]> {\n try {\n const entries = await fs.readdir(dir);\n const candidates = entries\n .filter((name) => /^events-\\d{8}\\.jsonl$/.test(name))\n .sort();\n\n const keep = Math.max(1, Math.min(candidates.length, days + 2));\n return candidates.slice(-keep).map((name) => path.join(dir, name));\n } catch {\n return [];\n }\n}\n\nasync function readEvents(\n files: string[],\n sinceMs: number,\n sessionIdFilter: string | undefined,\n limit: number\n): Promise<{ runs: RunSnapshot[]; regressions: RegressionEvent[] }> {\n const runs: RunSnapshot[] = [];\n const regressions: RegressionEvent[] = [];\n\n for (const file of files) {\n const content = await fs.readFile(file, 'utf-8');\n const lines = content.split('\\n').filter(Boolean);\n\n for (const line of lines) {\n let rawParsed: unknown;\n try {\n rawParsed = JSON.parse(line);\n } catch {\n continue;\n }\n if (!rawParsed || typeof rawParsed !== 'object') {\n continue;\n }\n const raw = rawParsed as Record<string, unknown>;\n\n const ts = typeof raw['ts'] === 'string' ? Date.parse(raw['ts']) : NaN;\n if (!Number.isFinite(ts) || ts < sinceMs) {\n continue;\n }\n\n if (raw['type'] === 'agent.kpi.run_completed') {\n const event = raw as unknown as KpiRunEvent;\n const p = event.payload || {};\n const sessionId = p.sessionId || 'unknown';\n if (sessionIdFilter && sessionId !== sessionIdFilter) {\n continue;\n }\n\n runs.push({\n ts: event.ts || new Date(ts).toISOString(),\n sessionId,\n success: Boolean(p.success),\n task: p.task || '',\n summaryPreview: p.summaryPreview || '',\n tokensUsed: Number(p.tokensUsed || 0),\n durationMs: Number(p.durationMs || 0),\n iterationsUsed: Number(p.iterationsUsed || 0),\n iterationBudget: Number(p.iterationBudget || 0),\n iterationUtilization: Number(p.iterationUtilization || 0),\n toolCallsTotal: Number(p.toolCallsTotal || 0),\n toolErrorRate: Number(p.toolErrorRate || 0),\n todoUsed: Boolean(p.todoUsed),\n evidenceDensity: Number(p.evidenceDensity || 0),\n driftRate: Number(p.driftRate || 0),\n qualityStatus: deriveQualityStatus(p),\n qualityScore: Number(p.qualityGate?.score ?? (p.success ? 1 : 0)),\n qualityReasons: Array.isArray(p.qualityGate?.reasons) ? p.qualityGate!.reasons! : [],\n startTier: (p.startTier === 'small' || p.startTier === 'large') ? p.startTier : 'medium',\n finalTier: (p.finalTier === 'small' || p.finalTier === 'large') ? p.finalTier : 'medium',\n escalated: Boolean(p.escalated),\n escalationCount: Number(p.escalationCount || 0),\n escalationReasons: Array.isArray(p.escalationReasons)\n ? p.escalationReasons.filter((v): v is string => typeof v === 'string')\n : [],\n escalationPath: Array.isArray(p.escalationPath)\n ? p.escalationPath.filter((v): v is string => typeof v === 'string')\n : [],\n });\n } else if (raw['type'] === 'agent.kpi.quality_regression') {\n const event = raw as unknown as RegressionEvent;\n const sessionId = event.payload?.sessionId;\n if (sessionIdFilter && sessionId !== sessionIdFilter) {\n continue;\n }\n regressions.push(event);\n }\n }\n }\n\n runs.sort((a, b) => Date.parse(b.ts) - Date.parse(a.ts));\n const trimmedRuns = runs.slice(0, Math.max(1, limit));\n return { runs: trimmedRuns, regressions };\n}\n\nasync function readEventsFromSqlite(\n sqlitePath: string,\n sinceMs: number,\n sessionIdFilter: string | undefined,\n limit: number,\n): Promise<{ runs: RunSnapshot[]; regressions: RegressionEvent[] }> {\n try {\n await fs.access(sqlitePath);\n } catch {\n return { runs: [], regressions: [] };\n }\n\n const sinceIso = new Date(sinceMs).toISOString();\n const sql = [\n 'SELECT type, ts, payload',\n 'FROM events',\n `WHERE ts >= '${sinceIso}'`,\n \" AND type IN ('agent.kpi.run_completed', 'agent.kpi.quality_regression')\",\n 'ORDER BY ts DESC',\n `LIMIT ${Math.max(limit * 5, 500)};`,\n ].join(' ');\n\n try {\n const { stdout } = await execFile('sqlite3', ['-json', sqlitePath, sql], {\n maxBuffer: 20 * 1024 * 1024,\n });\n const rows = JSON.parse(stdout || '[]') as Array<{\n type?: string;\n ts?: string;\n payload?: string;\n }>;\n const pseudoFileEvents = rows.map((row) => ({\n type: row.type ?? '',\n ts: row.ts,\n payload: parseJsonSafe(row.payload),\n }));\n return readInMemoryEvents(pseudoFileEvents, sinceMs, sessionIdFilter, limit);\n } catch {\n return { runs: [], regressions: [] };\n }\n}\n\nfunction parseJsonSafe(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object') {\n return value as Record<string, unknown>;\n }\n if (typeof value !== 'string') {\n return {};\n }\n try {\n const parsed = JSON.parse(value) as Record<string, unknown>;\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction readInMemoryEvents(\n rows: Array<{ type: string; ts?: string; payload?: Record<string, unknown> }>,\n sinceMs: number,\n sessionIdFilter: string | undefined,\n limit: number\n): { runs: RunSnapshot[]; regressions: RegressionEvent[] } {\n const runs: RunSnapshot[] = [];\n const regressions: RegressionEvent[] = [];\n\n for (const raw of rows) {\n const ts = typeof raw.ts === 'string' ? Date.parse(raw.ts) : NaN;\n if (!Number.isFinite(ts) || ts < sinceMs) {\n continue;\n }\n\n if (raw.type === 'agent.kpi.run_completed') {\n const p = (raw.payload || {}) as KpiRunEvent['payload'];\n const sessionId = p?.sessionId || 'unknown';\n if (sessionIdFilter && sessionId !== sessionIdFilter) {\n continue;\n }\n runs.push({\n ts: raw.ts || new Date(ts).toISOString(),\n sessionId,\n success: Boolean(p?.success),\n task: p?.task || '',\n summaryPreview: p?.summaryPreview || '',\n tokensUsed: Number(p?.tokensUsed || 0),\n durationMs: Number(p?.durationMs || 0),\n iterationsUsed: Number(p?.iterationsUsed || 0),\n iterationBudget: Number(p?.iterationBudget || 0),\n iterationUtilization: Number(p?.iterationUtilization || 0),\n toolCallsTotal: Number(p?.toolCallsTotal || 0),\n toolErrorRate: Number(p?.toolErrorRate || 0),\n todoUsed: Boolean(p?.todoUsed),\n evidenceDensity: Number(p?.evidenceDensity || 0),\n driftRate: Number(p?.driftRate || 0),\n qualityStatus: deriveQualityStatus(p),\n qualityScore: Number(p?.qualityGate?.score ?? (p?.success ? 1 : 0)),\n qualityReasons: Array.isArray(p?.qualityGate?.reasons) ? p?.qualityGate.reasons : [],\n startTier: (p?.startTier === 'small' || p?.startTier === 'large') ? p.startTier : 'medium',\n finalTier: (p?.finalTier === 'small' || p?.finalTier === 'large') ? p.finalTier : 'medium',\n escalated: Boolean(p?.escalated),\n escalationCount: Number(p?.escalationCount || 0),\n escalationReasons: Array.isArray(p?.escalationReasons)\n ? p.escalationReasons.filter((v): v is string => typeof v === 'string')\n : [],\n escalationPath: Array.isArray(p?.escalationPath)\n ? p.escalationPath.filter((v): v is string => typeof v === 'string')\n : [],\n });\n continue;\n }\n\n if (raw.type === 'agent.kpi.quality_regression') {\n const event: RegressionEvent = {\n type: raw.type,\n ts: raw.ts,\n payload: raw.payload as RegressionEvent['payload'],\n };\n const sessionId = event.payload?.sessionId;\n if (sessionIdFilter && sessionId !== sessionIdFilter) {\n continue;\n }\n regressions.push(event);\n }\n }\n\n runs.sort((a, b) => Date.parse(b.ts) - Date.parse(a.ts));\n return { runs: runs.slice(0, Math.max(1, limit)), regressions };\n}\n\nfunction buildReport(\n runs: RunSnapshot[],\n regressions: RegressionEvent[],\n meta: { days: number; sessionIdFilter?: string }\n) {\n const count = runs.length;\n if (count === 0) {\n return {\n periodDays: meta.days,\n sessionId: meta.sessionIdFilter,\n runs: 0,\n message: 'No agent.kpi.run_completed events in selected period',\n };\n }\n\n const scorecard = scorecardOf(runs);\n\n const topTokenRuns = [...runs].sort((a, b) => b.tokensUsed - a.tokensUsed).slice(0, 5);\n const worstQualityRuns = [...runs]\n .sort((a, b) => a.qualityScore - b.qualityScore || b.tokensUsed - a.tokensUsed)\n .slice(0, 5);\n\n const alerts: string[] = [];\n if (scorecard.successRate < 0.85) {alerts.push(`Low success rate: ${(scorecard.successRate * 100).toFixed(1)}%`);}\n if (scorecard.qualityPassRate < 0.9) {alerts.push(`Quality pass rate below target: ${(scorecard.qualityPassRate * 100).toFixed(1)}%`);}\n if (scorecard.avgToolErrorRate > 0.05) {alerts.push(`High tool error rate: ${(scorecard.avgToolErrorRate * 100).toFixed(1)}%`);}\n if (scorecard.avgDriftRate > 0.08) {alerts.push(`Scope drift is elevated: ${(scorecard.avgDriftRate * 100).toFixed(1)}%`);}\n if (scorecard.nearBudgetRate > 0.35) {alerts.push(`Too many runs near iteration budget: ${(scorecard.nearBudgetRate * 100).toFixed(1)}%`);}\n if (scorecard.escalationRate > 0.55) {alerts.push(`Escalation rate too high: ${(scorecard.escalationRate * 100).toFixed(1)}%`);}\n if (scorecard.escalationRate > 0.2 && scorecard.escalationSuccessRate < 0.7) {\n alerts.push(`Escalation effectiveness is low: ${(scorecard.escalationSuccessRate * 100).toFixed(1)}%`);\n }\n if (regressions.length > 0) {alerts.push(`Quality regression events observed: ${regressions.length}`);}\n\n const sliceSize = Math.max(3, Math.min(10, Math.floor(runs.length / 2)));\n const latestSlice = runs.slice(0, sliceSize);\n const previousSlice = runs.slice(sliceSize, sliceSize * 2);\n const latestScorecard = scorecardOf(latestSlice);\n const previousScorecard = scorecardOf(previousSlice);\n\n const slices = previousSlice.length > 0\n ? {\n sliceSize,\n latest: latestScorecard,\n previous: previousScorecard,\n delta: {\n successRate: latestScorecard.successRate - previousScorecard.successRate,\n qualityPassRate: latestScorecard.qualityPassRate - previousScorecard.qualityPassRate,\n avgQualityScore: latestScorecard.avgQualityScore - previousScorecard.avgQualityScore,\n avgTokens: latestScorecard.avgTokens - previousScorecard.avgTokens,\n p95Tokens: latestScorecard.p95Tokens - previousScorecard.p95Tokens,\n avgDurationMs: latestScorecard.avgDurationMs - previousScorecard.avgDurationMs,\n avgToolCalls: latestScorecard.avgToolCalls - previousScorecard.avgToolCalls,\n avgToolErrorRate: latestScorecard.avgToolErrorRate - previousScorecard.avgToolErrorRate,\n avgDriftRate: latestScorecard.avgDriftRate - previousScorecard.avgDriftRate,\n avgEvidenceDensity: latestScorecard.avgEvidenceDensity - previousScorecard.avgEvidenceDensity,\n nearBudgetRate: latestScorecard.nearBudgetRate - previousScorecard.nearBudgetRate,\n escalationRate: latestScorecard.escalationRate - previousScorecard.escalationRate,\n escalationSuccessRate: latestScorecard.escalationSuccessRate - previousScorecard.escalationSuccessRate,\n avgEscalationCount: latestScorecard.avgEscalationCount - previousScorecard.avgEscalationCount,\n },\n }\n : null;\n\n return {\n periodDays: meta.days,\n sessionId: meta.sessionIdFilter,\n runs: count,\n regressions: regressions.length,\n scorecard,\n slices,\n alerts,\n topTokenRuns: topTokenRuns.map(toRunBrief),\n worstQualityRuns: worstQualityRuns.map(toRunBrief),\n };\n}\n\nfunction toRunBrief(run: RunSnapshot) {\n return {\n ts: run.ts,\n sessionId: run.sessionId,\n task: run.task.slice(0, 120),\n tokensUsed: run.tokensUsed,\n durationMs: run.durationMs,\n toolCallsTotal: run.toolCallsTotal,\n qualityStatus: run.qualityStatus,\n qualityScore: run.qualityScore,\n qualityReasons: run.qualityReasons,\n startTier: run.startTier,\n finalTier: run.finalTier,\n escalated: run.escalated,\n escalationCount: run.escalationCount,\n escalationReasons: run.escalationReasons,\n };\n}\n\nfunction avg(values: number[]): number {\n if (values.length === 0) {return 0;}\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n}\n\nfunction p95(values: number[]): number {\n if (values.length === 0) {return 0;}\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.max(0, Math.min(sorted.length - 1, Math.ceil(sorted.length * 0.95) - 1));\n return sorted[index] || 0;\n}\n\nfunction scorecardOf(runs: RunSnapshot[]) {\n const escalatedRuns = runs.filter((r) => r.escalated);\n const nonEscalatedRuns = runs.filter((r) => !r.escalated);\n\n return {\n successRate: avg(runs.map((r) => (r.success ? 1 : 0))),\n qualityPassRate: avg(runs.map((r) => (r.qualityStatus === 'pass' ? 1 : 0))),\n avgQualityScore: avg(runs.map((r) => r.qualityScore)),\n avgTokens: avg(runs.map((r) => r.tokensUsed)),\n p95Tokens: p95(runs.map((r) => r.tokensUsed)),\n avgDurationMs: avg(runs.map((r) => r.durationMs)),\n avgToolCalls: avg(runs.map((r) => r.toolCallsTotal)),\n avgToolErrorRate: avg(runs.map((r) => r.toolErrorRate)),\n avgDriftRate: avg(runs.map((r) => r.driftRate)),\n avgEvidenceDensity: avg(runs.map((r) => r.evidenceDensity)),\n nearBudgetRate: avg(runs.map((r) => (r.iterationUtilization >= 0.9 ? 1 : 0))),\n escalationRate: avg(runs.map((r) => (r.escalated ? 1 : 0))),\n escalationSuccessRate: escalatedRuns.length > 0 ? avg(escalatedRuns.map((r) => (r.success ? 1 : 0))) : 0,\n avgEscalationCount: avg(runs.map((r) => r.escalationCount)),\n avgTokensEscalated: escalatedRuns.length > 0 ? avg(escalatedRuns.map((r) => r.tokensUsed)) : 0,\n avgTokensNonEscalated: nonEscalatedRuns.length > 0 ? avg(nonEscalatedRuns.map((r) => r.tokensUsed)) : 0,\n avgQualityEscalated: escalatedRuns.length > 0 ? avg(escalatedRuns.map((r) => r.qualityScore)) : 0,\n avgQualityNonEscalated: nonEscalatedRuns.length > 0 ? avg(nonEscalatedRuns.map((r) => r.qualityScore)) : 0,\n };\n}\n\nfunction printReport(ctx: PluginContextV3, report: ReturnType<typeof buildReport>): void {\n if (report.runs === 0) {\n ctx.ui.write(`No KPI runs for selected period (${report.periodDays}d)\\n`);\n return;\n }\n\n if (!('scorecard' in report)) { return; }\n const s = report.scorecard;\n if (s === undefined) { return; }\n ctx.ui.write('βββ Agent Quality Control Report\\n');\n ctx.ui.write(`β Period: ${report.periodDays}d\\n`);\n if (report.sessionId) {\n ctx.ui.write(`β Session: ${report.sessionId}\\n`);\n }\n ctx.ui.write(`β Runs: ${report.runs} | Regressions: ${report.regressions}\\n`);\n ctx.ui.write('β\\n');\n ctx.ui.write(`β Success Rate: ${(s.successRate * 100).toFixed(1)}%\\n`);\n ctx.ui.write(`β Quality Pass: ${(s.qualityPassRate * 100).toFixed(1)}% | Avg score: ${s.avgQualityScore.toFixed(2)}\\n`);\n ctx.ui.write(`β Tokens: avg ${Math.round(s.avgTokens)} | p95 ${Math.round(s.p95Tokens)}\\n`);\n ctx.ui.write(`β Duration: avg ${(s.avgDurationMs / 1000).toFixed(1)}s\\n`);\n ctx.ui.write(`β Tools: avg ${s.avgToolCalls.toFixed(1)} | error ${(s.avgToolErrorRate * 100).toFixed(2)}%\\n`);\n ctx.ui.write(`β Drift: ${(s.avgDriftRate * 100).toFixed(2)}% | Evidence density: ${s.avgEvidenceDensity.toFixed(2)}\\n`);\n ctx.ui.write(`β Near budget rate: ${(s.nearBudgetRate * 100).toFixed(1)}%\\n`);\n ctx.ui.write(`β Escalation: ${(s.escalationRate * 100).toFixed(1)}% runs | success ${(s.escalationSuccessRate * 100).toFixed(1)}% | avg count ${s.avgEscalationCount.toFixed(2)}\\n`);\n if (s.escalationRate > 0 && s.escalationRate < 1) {\n const tokenDelta = s.avgTokensEscalated - s.avgTokensNonEscalated;\n const qualityDelta = s.avgQualityEscalated - s.avgQualityNonEscalated;\n ctx.ui.write(`β Escalated vs non-escalated: Ξtokens ${tokenDelta >= 0 ? '+' : ''}${Math.round(tokenDelta)} | Ξquality ${qualityDelta >= 0 ? '+' : ''}${qualityDelta.toFixed(2)}\\n`);\n } else {\n ctx.ui.write('β Escalated vs non-escalated: n/a (need both escalated and non-escalated runs)\\n');\n }\n\n if (report.slices) {\n const d = report.slices.delta;\n ctx.ui.write('β\\n');\n ctx.ui.write(`β Slices (${report.slices.sliceSize} latest vs previous):\\n`);\n ctx.ui.write(`β Ξ Quality score: ${d.avgQualityScore >= 0 ? '+' : ''}${d.avgQualityScore.toFixed(2)}\\n`);\n ctx.ui.write(`β Ξ Avg tokens: ${d.avgTokens >= 0 ? '+' : ''}${Math.round(d.avgTokens)}\\n`);\n ctx.ui.write(`β Ξ Avg duration: ${d.avgDurationMs >= 0 ? '+' : ''}${(d.avgDurationMs / 1000).toFixed(1)}s\\n`);\n ctx.ui.write(`β Ξ Tool errors: ${d.avgToolErrorRate >= 0 ? '+' : ''}${(d.avgToolErrorRate * 100).toFixed(2)}%\\n`);\n ctx.ui.write(`β Ξ Drift: ${d.avgDriftRate >= 0 ? '+' : ''}${(d.avgDriftRate * 100).toFixed(2)}%\\n`);\n ctx.ui.write(`β Ξ Escalation rate: ${d.escalationRate >= 0 ? '+' : ''}${(d.escalationRate * 100).toFixed(1)}%\\n`);\n ctx.ui.write(`β Ξ Escalation success: ${d.escalationSuccessRate >= 0 ? '+' : ''}${(d.escalationSuccessRate * 100).toFixed(1)}%\\n`);\n ctx.ui.write(`β Ξ Escalation count: ${d.avgEscalationCount >= 0 ? '+' : ''}${d.avgEscalationCount.toFixed(2)}\\n`);\n }\n\n if (report.alerts.length > 0) {\n ctx.ui.write('β\\n');\n ctx.ui.write('β Alerts:\\n');\n for (const alert of report.alerts) {\n ctx.ui.write(`β - ${alert}\\n`);\n }\n }\n\n ctx.ui.write('β\\n');\n ctx.ui.write('β Top expensive runs:\\n');\n for (const run of report.topTokenRuns) {\n const esc = run.escalated ? ` | esc=${run.escalationCount}` : '';\n ctx.ui.write(`β - ${run.ts} | tok=${run.tokensUsed} | q=${run.qualityScore.toFixed(2)}${esc} | ${run.task}\\n`);\n }\n\n ctx.ui.write('β\\n');\n ctx.ui.write('β Worst quality runs:\\n');\n for (const run of report.worstQualityRuns) {\n const reasons = (run.qualityReasons || []).join(', ');\n ctx.ui.write(`β - ${run.ts} | q=${run.qualityScore.toFixed(2)} | tok=${run.tokensUsed} | reasons=${reasons || 'n/a'}\\n`);\n }\n ctx.ui.write('βββ\\n');\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/agents/entry/src/cli/commands/rollback.ts"],"names":["fsp"],"mappings":"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","file":"rollback.js","sourcesContent":["/**\n * agent:rollback β Rollback file changes made by agents.\n *\n * Uses ChangeStore from @kb-labs/agent-history.\n * All rollback logic is in ChangeTrackingMiddleware.rollbackRun() or handled here via ChangeStore.\n *\n * Usage:\n * pnpm kb agent:rollback --run-id={id} --session-id={id}\n * pnpm kb agent:rollback --file=src/index.ts --session-id={id}\n * pnpm kb agent:rollback --session-id={id}\n * pnpm kb agent:rollback --run-id={id} --session-id={id} --dry-run\n */\n\nimport { defineCommand, useLogger , type CommandResult} from '@kb-labs/sdk';\nimport type { PluginContextV3 } from '@kb-labs/sdk';\nimport { ChangeStore } from '@kb-labs/agent-history';\nimport type { FileChange } from '@kb-labs/agent-history';\nimport { promises as fsp } from 'node:fs';\nimport path from 'node:path';\n\ntype RollbackInput = {\n 'run-id'?: string;\n runId?: string;\n 'session-id'?: string;\n sessionId?: string;\n file?: string;\n 'dry-run'?: boolean;\n dryRun?: boolean;\n json?: boolean;\n};\n\nexport default defineCommand({\n id: 'rollback',\n description: 'Rollback file changes made by agents in a session or run',\n\n handler: {\n async execute(ctx: PluginContextV3, input: RollbackInput): Promise<CommandResult> {\n const logger = useLogger();\n const flags = ((input as Record<string, unknown>).flags ?? input) as Record<string, unknown>;\n\n const sessionId = (flags['session-id'] ?? flags['sessionId']) as string | undefined;\n const runId = (flags['run-id'] ?? flags['runId']) as string | undefined;\n const filePath = flags['file'] as string | undefined;\n const dryRun = Boolean(flags['dry-run'] ?? flags['dryRun']);\n const asJson = Boolean(flags['json']);\n\n if (!sessionId) {\n return output(ctx, asJson, { success: false, error: 'Missing --session-id' }, false);\n }\n\n const workingDir = process.cwd();\n const store = new ChangeStore(workingDir);\n\n try {\n let changes: FileChange[];\n\n if (runId && !filePath) {\n changes = await store.listRun(sessionId, runId);\n } else if (filePath) {\n changes = await store.listFile(sessionId, filePath);\n if (runId) {\n changes = changes.filter((c) => c.runId === runId);\n }\n } else {\n changes = await store.listSession(sessionId);\n }\n\n if (changes.length === 0) {\n return output(ctx, asJson, { success: true, rolledBack: 0, message: 'No changes to rollback' }, true);\n }\n\n // Process in reverse chronological order\n const ordered = [...changes].sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n\n if (dryRun) {\n const preview = ordered.map((c) => ({\n filePath: c.filePath,\n operation: c.operation,\n action: !c.before ? 'delete (was new file)' : 'restore to before state',\n }));\n return output(ctx, asJson, { success: true, dryRun: true, wouldRollback: preview }, true);\n }\n\n let rolledBack = 0;\n const errors: string[] = [];\n\n for (const change of ordered) {\n const fullPath = path.join(workingDir, change.filePath);\n try {\n if (!change.before) {\n // File was created by agent β delete it\n await fsp.unlink(fullPath).catch((e: NodeJS.ErrnoException) => {\n if (e.code !== 'ENOENT') {throw e;}\n });\n } else {\n // Restore to before state\n await fsp.mkdir(path.dirname(fullPath), { recursive: true });\n await fsp.writeFile(fullPath, change.before.content, 'utf-8');\n }\n rolledBack++;\n } catch (e) {\n errors.push(`${change.filePath}: ${String(e)}`);\n }\n }\n\n return output(ctx, asJson, { success: errors.length === 0, rolledBack, errors }, errors.length === 0);\n } catch (e) {\n logger.error('agent:rollback error', e instanceof Error ? e : undefined);\n return output(ctx, asJson, { success: false, error: String(e) }, false);\n }\n },\n },\n});\n\nfunction output(ctx: PluginContextV3, asJson: boolean, data: unknown, success: boolean): CommandResult<unknown> {\n if (asJson) {\n ctx.ui?.json?.(data);\n } else {\n const d = data as Record<string, unknown>;\n if (d['success']) {\n if (d['dryRun']) {\n ctx.ui.write(`[DRY RUN] Would rollback:\\n`);\n for (const p of (d['wouldRollback'] as Array<Record<string, string>>) ?? []) {\n ctx.ui.write(` ${p['operation']?.toUpperCase()} ${p['filePath']} β ${p['action']}\\n`);\n }\n } else {\n ctx.ui.write(`β
Rolled back ${d['rolledBack']} change(s)\\n`);\n for (const e of (d['errors'] as string[]) ?? []) {\n ctx.ui.write(` β οΈ ${e}\\n`);\n }\n }\n } else {\n ctx.ui.write(`β ${d['error']}\\n`);\n }\n }\n return success\n ? { ok: true, result: data }\n : { ok: false, error: 'Command failed', result: data };\n}\n"]}
|