@refrainai/cli 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/ai-model-FM6GWCID.js +37 -0
  2. package/dist/ai-model-FM6GWCID.js.map +1 -0
  3. package/dist/chunk-2BVDAJZT.js +236 -0
  4. package/dist/chunk-2BVDAJZT.js.map +1 -0
  5. package/dist/chunk-2H7UOFLK.js +11 -0
  6. package/dist/chunk-2H7UOFLK.js.map +1 -0
  7. package/dist/chunk-7UCVPKD4.js +902 -0
  8. package/dist/chunk-7UCVPKD4.js.map +1 -0
  9. package/dist/chunk-AG3CFMYU.js +36 -0
  10. package/dist/chunk-AG3CFMYU.js.map +1 -0
  11. package/dist/chunk-CLYJHKPY.js +1131 -0
  12. package/dist/chunk-CLYJHKPY.js.map +1 -0
  13. package/dist/chunk-D5SI2PHK.js +74 -0
  14. package/dist/chunk-D5SI2PHK.js.map +1 -0
  15. package/dist/chunk-DJVUITRB.js +9084 -0
  16. package/dist/chunk-DJVUITRB.js.map +1 -0
  17. package/dist/chunk-H47NWH7N.js +4427 -0
  18. package/dist/chunk-H47NWH7N.js.map +1 -0
  19. package/dist/chunk-HQDXLWAY.js +109 -0
  20. package/dist/chunk-HQDXLWAY.js.map +1 -0
  21. package/dist/chunk-IGFCYKHC.js +1974 -0
  22. package/dist/chunk-IGFCYKHC.js.map +1 -0
  23. package/dist/chunk-RT664YIO.js +245 -0
  24. package/dist/chunk-RT664YIO.js.map +1 -0
  25. package/dist/chunk-RYIJPYM3.js +164 -0
  26. package/dist/chunk-RYIJPYM3.js.map +1 -0
  27. package/dist/chunk-TDSM3UXI.js +40 -0
  28. package/dist/chunk-TDSM3UXI.js.map +1 -0
  29. package/dist/chunk-UGPXCQY3.js +778 -0
  30. package/dist/chunk-UGPXCQY3.js.map +1 -0
  31. package/dist/chunk-VPK2MQAZ.js +589 -0
  32. package/dist/chunk-VPK2MQAZ.js.map +1 -0
  33. package/dist/chunk-WEYR56ZN.js +953 -0
  34. package/dist/chunk-WEYR56ZN.js.map +1 -0
  35. package/dist/chunk-XMFCXPYU.js +275 -0
  36. package/dist/chunk-XMFCXPYU.js.map +1 -0
  37. package/dist/chunk-Z33FCOTZ.js +251 -0
  38. package/dist/chunk-Z33FCOTZ.js.map +1 -0
  39. package/dist/cli.js +59 -0
  40. package/dist/cli.js.map +1 -0
  41. package/dist/compose-MTSIJY5D.js +547 -0
  42. package/dist/compose-MTSIJY5D.js.map +1 -0
  43. package/dist/config-ZSUNCFXR.js +9 -0
  44. package/dist/config-ZSUNCFXR.js.map +1 -0
  45. package/dist/fix-runbook-ZSBOTLC2.js +294 -0
  46. package/dist/fix-runbook-ZSBOTLC2.js.map +1 -0
  47. package/dist/google-sheets-DRWIVEVC.js +482 -0
  48. package/dist/google-sheets-DRWIVEVC.js.map +1 -0
  49. package/dist/registry-LZLYTNDJ.js +17 -0
  50. package/dist/registry-LZLYTNDJ.js.map +1 -0
  51. package/dist/runbook-data-helpers-KRR2SH76.js +16 -0
  52. package/dist/runbook-data-helpers-KRR2SH76.js.map +1 -0
  53. package/dist/runbook-executor-K7T6RJWJ.js +1480 -0
  54. package/dist/runbook-executor-K7T6RJWJ.js.map +1 -0
  55. package/dist/runbook-generator-MPXJBQ5N.js +800 -0
  56. package/dist/runbook-generator-MPXJBQ5N.js.map +1 -0
  57. package/dist/runbook-schema-3T6TP3JJ.js +35 -0
  58. package/dist/runbook-schema-3T6TP3JJ.js.map +1 -0
  59. package/dist/runbook-store-G5GUOWRR.js +11 -0
  60. package/dist/runbook-store-G5GUOWRR.js.map +1 -0
  61. package/dist/schema-5G6UQSPT.js +91 -0
  62. package/dist/schema-5G6UQSPT.js.map +1 -0
  63. package/dist/server-AG3LXQBI.js +8778 -0
  64. package/dist/server-AG3LXQBI.js.map +1 -0
  65. package/dist/tenant-ai-config-QPFEJUVJ.js +14 -0
  66. package/dist/tenant-ai-config-QPFEJUVJ.js.map +1 -0
  67. package/dist/yaml-patcher-VGUS2JGH.js +15 -0
  68. package/dist/yaml-patcher-VGUS2JGH.js.map +1 -0
  69. package/package.json +37 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/options-serializer.ts","../../../src/harness/report-sections.ts"],"sourcesContent":["/**\n * options-serializer — CLI オプションを Markdown レポート向けにシリアライズ\n *\n * secrets の値は出力せず件数のみ、contextMarkdown は行数のみ表示する。\n */\n\nimport type { GeneratorConfig } from \"../runbook-generator/types\";\nimport type { ExecutorConfig } from \"../runbook-executor/types\";\nimport type { AIModelConfig } from \"../harness/ai-model\";\n\nexport interface SerializedOption {\n name: string;\n value: string;\n}\n\nexport function serializeGeneratorOptions(config: GeneratorConfig): SerializedOption[] {\n const opts: SerializedOption[] = [];\n\n opts.push({ name: \"--url\", value: config.url });\n opts.push({ name: \"--goal\", value: config.goal });\n opts.push({ name: \"--output\", value: config.output });\n opts.push({ name: \"--headless\", value: String(config.headless) });\n opts.push({ name: \"--max-iterations\", value: String(config.maxIterations) });\n opts.push({ name: \"--step-delay\", value: `${config.stepDelay}ms` });\n opts.push({ name: \"--stall-check-interval\", value: String(config.stallCheckInterval) });\n opts.push({ name: \"--history-window\", value: String(config.historyWindow) });\n opts.push({ name: \"--max-failures\", value: String(config.maxConsecutiveFailures) });\n opts.push({ name: \"--snapshot-filter\", value: String(config.snapshotFilter) });\n\n if (config.screenshotDir) {\n opts.push({ name: \"--screenshots\", value: config.screenshotDir });\n }\n if (config.contextMarkdown) {\n opts.push({ name: \"--context\", value: `loaded (${config.contextMarkdown.split(\"\\n\").length} lines)` });\n }\n if (config.secrets && Object.keys(config.secrets.values).length > 0) {\n opts.push({ name: \"--secrets\", value: `${Object.keys(config.secrets.values).length} keys` });\n }\n if (config.debugLogPath) {\n opts.push({ name: \"--debug-log\", value: config.debugLogPath });\n }\n if (config.debugConsole) {\n opts.push({ name: \"--debug\", value: \"true\" });\n }\n if (config.stealth) {\n opts.push({ name: \"--stealth\", value: \"true\" });\n }\n if (config.proxy) {\n opts.push({ name: \"--proxy\", value: config.proxy });\n }\n if (config.videoDir) {\n opts.push({ name: \"--video\", value: config.videoDir });\n }\n if (config.skills && config.skills.length > 0) {\n opts.push({ name: \"--skill\", value: config.skills.join(\", \") });\n }\n\n serializeModelConfig(opts, config.aiModelConfig);\n\n return opts;\n}\n\nexport function serializeExecutorOptions(config: ExecutorConfig): SerializedOption[] {\n const opts: SerializedOption[] = [];\n\n opts.push({ name: \"--runbook\", value: config.runbookPath });\n opts.push({ name: \"--headless\", value: String(config.headless) });\n\n if (config.stepDelay !== undefined) {\n opts.push({ name: \"--step-delay\", value: `${config.stepDelay}ms` });\n }\n if (config.screenshotDir) {\n opts.push({ name: \"--screenshots\", value: config.screenshotDir });\n }\n if (config.contextMarkdown) {\n opts.push({ name: \"--context\", value: `loaded (${config.contextMarkdown.split(\"\\n\").length} lines)` });\n }\n if (config.secrets && Object.keys(config.secrets.values).length > 0) {\n opts.push({ name: \"--secrets\", value: `${Object.keys(config.secrets.values).length} keys` });\n }\n if (config.skipConfirmation) {\n opts.push({ name: \"--skip-confirmation\", value: \"true\" });\n }\n if (config.dataFilePath) {\n opts.push({ name: \"--data\", value: config.dataFilePath });\n }\n if (config.reuseSession === false) {\n opts.push({ name: \"--no-reuse-session\", value: \"true\" });\n }\n if (config.debugLogPath) {\n opts.push({ name: \"--debug-log\", value: config.debugLogPath });\n }\n if (config.debugConsole) {\n opts.push({ name: \"--debug\", value: \"true\" });\n }\n if (config.approvalMode && config.approvalMode !== \"web\") {\n opts.push({ name: \"--approval-mode\", value: config.approvalMode });\n }\n if (config.notifyMode) {\n opts.push({ name: \"--notify\", value: config.notifyMode });\n }\n if (config.enableSelectorCache) {\n opts.push({ name: \"--enable-selector-cache\", value: \"true\" });\n }\n if (config.enableAgentFallback) {\n opts.push({ name: \"--enable-agent-fallback\", value: \"true\" });\n }\n if (config.enableVisionFallback) {\n opts.push({ name: \"--enable-vision-fallback\", value: \"true\" });\n }\n if (config.outputDir) {\n opts.push({ name: \"--output-dir\", value: config.outputDir });\n }\n if (config.mergeDownloads) {\n opts.push({ name: \"--merge-downloads\", value: \"true\" });\n }\n if (config.selfHeal) {\n opts.push({ name: \"--self-heal\", value: \"true\" });\n }\n if (config.maxRetries !== undefined) {\n opts.push({ name: \"--max-retries\", value: String(config.maxRetries) });\n }\n if (config.retryWarningThreshold !== undefined) {\n opts.push({ name: \"--retry-warning-threshold\", value: String(config.retryWarningThreshold) });\n }\n if (config.forceReport) {\n opts.push({ name: \"--report\", value: \"true\" });\n }\n if (config.videoDir) {\n opts.push({ name: \"--video\", value: config.videoDir });\n }\n if (config.callbackPort !== undefined) {\n opts.push({ name: \"--callback-port\", value: String(config.callbackPort) });\n }\n if (config.approvalTimeoutMs !== undefined) {\n opts.push({ name: \"--approval-timeout\", value: `${config.approvalTimeoutMs}ms` });\n }\n if (config.stealth) {\n opts.push({ name: \"--stealth\", value: \"true\" });\n }\n if (config.proxy) {\n opts.push({ name: \"--proxy\", value: config.proxy });\n }\n if (config.skills && config.skills.length > 0) {\n opts.push({ name: \"--skill\", value: config.skills.join(\", \") });\n }\n\n serializeModelConfig(opts, config.aiModelConfig);\n\n return opts;\n}\n\nconst MODEL_OVERRIDE_FLAGS: Record<string, string> = {\n selector: \"--model-selector\",\n extraction: \"--model-extraction\",\n exploration: \"--model-exploration\",\n review: \"--model-review\",\n fallback: \"--model-fallback\",\n vision: \"--model-vision\",\n};\n\nfunction serializeModelConfig(opts: SerializedOption[], aiModelConfig?: AIModelConfig): void {\n if (!aiModelConfig) return;\n opts.push({ name: \"--model\", value: aiModelConfig.modelId });\n opts.push({ name: \"--model-provider\", value: aiModelConfig.provider });\n if (aiModelConfig.baseURL) {\n opts.push({ name: \"--model-base-url\", value: aiModelConfig.baseURL });\n }\n if (aiModelConfig.modelOverrides) {\n for (const [purpose, modelId] of Object.entries(aiModelConfig.modelOverrides)) {\n const flag = MODEL_OVERRIDE_FLAGS[purpose];\n if (flag && modelId) {\n opts.push({ name: flag, value: modelId });\n }\n }\n }\n}\n\nexport function renderOptionsMarkdown(options: SerializedOption[]): string[] {\n if (options.length === 0) return [];\n\n const lines: string[] = [];\n for (const opt of options) {\n lines.push(`- \\`${opt.name}\\`: ${opt.value}`);\n }\n return lines;\n}\n","/**\n * report-sections — 実行レポートと探索レポートで共通のセクション生成関数群\n *\n * AI Metrics、デバッグログ、セレクタ解決統計、リトライ分布、\n * 失敗カテゴリ分布、回復機構有効性、パフォーマンスボトルネック等を\n * Markdown セクションとしてフォーマットする。\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { computeTotalRealInput, computeCacheRate, type AIMetricsSummary } from \"./ai-metrics\";\nimport { getModelId, getModelProvider } from \"./ai-model\";\nimport { getRecoveryHint } from \"./error-classifier\";\n\n// ── 型定義 ──\n\nexport interface DebugLogEntry {\n phase?: string;\n event?: string;\n step?: number;\n data?: Record<string, unknown>;\n timestamp?: string;\n}\n\n/** 両レポートで共通利用できるステップ情報の最小インターフェース */\nexport interface ReportableStep {\n ordinal: number;\n description: string;\n status: \"success\" | \"failed\" | \"skipped\";\n durationMs: number;\n error?: string;\n failureCategory?: string;\n retryCount?: number;\n actionType?: string;\n diagnostics?: {\n stepAction?: { selector?: Record<string, unknown> };\n deterministicResolveResult?: string;\n };\n}\n\n// ── デバッグログ ──\n\nexport async function readDebugLog(\n filePath: string,\n): Promise<DebugLogEntry[]> {\n try {\n const content = await readFile(filePath, \"utf-8\");\n return content\n .trim()\n .split(\"\\n\")\n .filter((line) => line.trim())\n .map((line) => {\n try {\n return JSON.parse(line) as DebugLogEntry;\n } catch {\n return {};\n }\n });\n } catch {\n return [];\n }\n}\n\n// ── AI Metrics ──\n\nexport function formatAiMetricsSection(aiMetrics: AIMetricsSummary): string[] {\n const lines: string[] = [];\n if (aiMetrics.totalCalls <= 0) return lines;\n\n const m = aiMetrics;\n const totalRealInput = computeTotalRealInput(m);\n const cacheRate = (computeCacheRate(m) * 100).toFixed(1);\n\n lines.push(\"### AI Metrics\");\n lines.push(\"\");\n lines.push(\"| メトリクス | 値 |\");\n lines.push(\"|-----------|-----|\");\n lines.push(`| Total calls | ${m.totalCalls} |`);\n lines.push(`| Total input tokens | ${totalRealInput.toLocaleString()} |`);\n lines.push(`| Output tokens | ${m.totalOutputTokens.toLocaleString()} |`);\n lines.push(`| Cache read tokens | ${m.totalCachedInputTokens.toLocaleString()} |`);\n lines.push(`| Cache write tokens | ${m.totalCacheCreationTokens.toLocaleString()} |`);\n lines.push(`| Cache hit rate | ${cacheRate}% |`);\n lines.push(`| Estimated cost | $${m.estimatedCostUsd.toFixed(4)} |`);\n lines.push(`| Total AI duration | ${(m.totalDurationMs / 1000).toFixed(1)}s |`);\n lines.push(\"\");\n\n // キャッシュヒット率の診断\n const cacheHitRate = computeCacheRate(m);\n if (cacheHitRate < 0.3 && m.totalCalls >= 3) {\n lines.push(`> **:warning: キャッシュヒット率が低い (${cacheRate}%)**`);\n lines.push(\"> AI プロンプトキャッシュの活用が少なく、コスト効率が悪い可能性があります。\");\n lines.push(\"> 考えられる原因: プロンプトの先頭部分が毎回異なる、スナップショットが大きく変動する、同一セレクタの再解決が発生していない。\");\n lines.push(\"\");\n }\n\n if (Object.keys(m.byPurpose).length > 0) {\n lines.push(\"**By purpose:**\");\n lines.push(\"\");\n lines.push(\"| Purpose | Calls | Input | Output | Cache Read | Cache Write | Duration |\");\n lines.push(\"|---------|-------|-------|--------|------------|-------------|----------|\");\n for (const [purpose, b] of Object.entries(m.byPurpose)) {\n const purposeRealInput = computeTotalRealInput(b);\n lines.push(\n `| ${purpose} | ${b.calls} | ${purposeRealInput.toLocaleString()} | ${b.outputTokens.toLocaleString()} | ${b.cachedInputTokens.toLocaleString()} | ${b.cacheCreationTokens.toLocaleString()} | ${(b.durationMs / 1000).toFixed(1)}s |`,\n );\n }\n lines.push(\"\");\n }\n\n if (m.byModel && Object.keys(m.byModel).length > 0) {\n lines.push(\"**By model:**\");\n lines.push(\"\");\n lines.push(\"| Model | Calls | Input | Output | Cache Read | Cache Write | Cost | Duration |\");\n lines.push(\"|-------|-------|-------|--------|------------|-------------|------|----------|\");\n for (const [modelId, b] of Object.entries(m.byModel)) {\n const modelRealInput = computeTotalRealInput(b);\n lines.push(\n `| ${modelId} | ${b.calls} | ${modelRealInput.toLocaleString()} | ${b.outputTokens.toLocaleString()} | ${b.cachedInputTokens.toLocaleString()} | ${b.cacheCreationTokens.toLocaleString()} | $${b.estimatedCostUsd.toFixed(4)} | ${(b.durationMs / 1000).toFixed(1)}s |`,\n );\n }\n lines.push(\"\");\n }\n\n return lines;\n}\n\n// ── Runtime Environment ──\n\nexport function formatRuntimeEnvironment(): string[] {\n const lines: string[] = [];\n lines.push(\"### Runtime Environment\");\n lines.push(\"\");\n lines.push(`- **AI Model**: ${getModelId()} (${getModelProvider()})`);\n lines.push(`- **Node.js**: ${process.version}`);\n lines.push(`- **Platform**: ${process.platform} ${process.arch}`);\n lines.push(\"\");\n return lines;\n}\n\n// ── Selector Resolution Statistics ──\n\nexport function formatSelectorResolutionStats(\n debugEntries: DebugLogEntry[],\n allSteps: ReportableStep[],\n): string[] {\n const lines: string[] = [];\n\n lines.push(\"### Selector Resolution Statistics\");\n lines.push(\"\");\n\n const stepsWithSelector = allSteps.filter(\n (s) => s.diagnostics?.stepAction?.selector || s.diagnostics?.deterministicResolveResult,\n );\n\n const deterministicHits = debugEntries.filter((e) => e.event === \"deterministic_resolve\").length;\n const deterministicMisses = debugEntries.filter((e) => e.event === \"deterministic_resolve_miss\").length;\n const aiResolves = debugEntries.filter((e) => e.event === \"selector_resolve\").length;\n const cacheHits = debugEntries.filter((e) => e.event === \"selector_cache_hit\").length;\n const cacheStales = debugEntries.filter((e) => e.event === \"selector_cache_stale\").length;\n const retryEvents = debugEntries.filter((e) => e.event === \"selector_retry\").length;\n const recoveryAttempts = debugEntries.filter((e) => e.event === \"recovery_attempt\").length;\n const agentFallbackStarts = debugEntries.filter((e) => e.event === \"agent_fallback_start\").length;\n const agentFallbackResults = debugEntries.filter((e) => e.event === \"agent_fallback_result\");\n const agentFallbackSuccesses = agentFallbackResults.filter(\n (e) => e.data && (e.data as Record<string, unknown>).success === true,\n ).length;\n\n const totalResolveAttempts = deterministicHits + deterministicMisses + cacheHits;\n\n if (totalResolveAttempts > 0 || stepsWithSelector.length > 0) {\n lines.push(\"| メトリクス | 件数 |\");\n lines.push(\"|-----------|------|\");\n if (totalResolveAttempts > 0) {\n lines.push(`| 決定論的解決 成功 | ${deterministicHits} |`);\n lines.push(`| 決定論的解決 失敗→AI委譲 | ${deterministicMisses} |`);\n lines.push(`| AI セレクタ解決 | ${aiResolves} |`);\n if (cacheHits > 0 || cacheStales > 0) {\n lines.push(`| キャッシュヒット | ${cacheHits} |`);\n lines.push(`| キャッシュ stale(自動無効化) | ${cacheStales} |`);\n }\n lines.push(`| セレクタリトライ | ${retryEvents} |`);\n if (recoveryAttempts > 0) {\n lines.push(`| スクロール回復 | ${recoveryAttempts} |`);\n }\n const visionFbStarts = debugEntries.filter((e) => e.event === \"vision_fallback_start\").length;\n if (visionFbStarts > 0) {\n const visionFbSuccesses = debugEntries.filter(\n (e) => e.event === \"vision_fallback_result\" && e.data && (e.data as Record<string, unknown>).ref,\n ).length;\n lines.push(`| Vision Fallback 発動 | ${visionFbStarts} |`);\n lines.push(`| Vision Fallback 成功 | ${visionFbSuccesses} |`);\n }\n if (agentFallbackStarts > 0) {\n lines.push(`| Agent Fallback 発動 | ${agentFallbackStarts} |`);\n lines.push(`| Agent Fallback 成功 | ${agentFallbackSuccesses} |`);\n }\n } else {\n const totalRetries = allSteps.reduce((sum, s) => sum + (s.retryCount ?? 0), 0);\n const stepsWithRetry = allSteps.filter((s) => s.retryCount && s.retryCount > 0);\n lines.push(`| セレクタ解決対象ステップ | ${stepsWithSelector.length} |`);\n lines.push(`| リトライ発生ステップ | ${stepsWithRetry.length} |`);\n lines.push(`| 合計リトライ回数 | ${totalRetries} |`);\n }\n lines.push(\"\");\n\n if (totalResolveAttempts > 0) {\n const deterministicRate =\n deterministicHits + deterministicMisses > 0\n ? Math.round((deterministicHits / (deterministicHits + deterministicMisses)) * 100)\n : 0;\n lines.push(`**決定論的解決率**: ${deterministicRate}% — `);\n if (deterministicRate < 50) {\n lines.push(\"低い。`deterministic-resolver.ts` のパターンマッチング精度改善の余地あり。\");\n } else if (deterministicRate < 80) {\n lines.push(\"中程度。頻出のマッチ失敗パターンを分析し追加すると AI 呼び出しを削減できる。\");\n } else {\n lines.push(\"高い。決定論的解決が有効に機能している。\");\n }\n lines.push(\"\");\n }\n }\n\n return lines;\n}\n\n// ── Retry Distribution ──\n\nexport function formatRetryDistribution(allSteps: ReportableStep[]): string[] {\n const lines: string[] = [];\n\n lines.push(\"### Retry Distribution\");\n lines.push(\"\");\n\n const retryDistribution = new Map<number, number>();\n for (const step of allSteps) {\n const count = step.retryCount ?? 0;\n retryDistribution.set(count, (retryDistribution.get(count) ?? 0) + 1);\n }\n\n if (retryDistribution.size > 0) {\n lines.push(\"| リトライ回数 | ステップ数 |\");\n lines.push(\"|-------------|-----------|\");\n for (const [count, steps] of [...retryDistribution.entries()].sort((a, b) => a[0] - b[0])) {\n lines.push(`| ${count} | ${steps} |`);\n }\n lines.push(\"\");\n }\n\n return lines;\n}\n\n// ── Failure Category Distribution ──\n\nexport function getSystemImprovementHint(category: string): string {\n switch (category) {\n case \"element_not_found\":\n return \"決定論的解決のパターン追加、スナップショットフィルタの見直し\";\n case \"element_stale\":\n return \"キャッシュ無効化ロジックの改善、DOM安定化待機の調整\";\n case \"page_structure_changed\":\n return \"スナップショット差分検知の感度調整、動的コンテンツ対応\";\n case \"navigation_timeout\":\n return \"ナビゲーション待機の段階的タイムアウト調整、SPA検知の改善\";\n case \"action_failed\":\n return \"アクションバリデーションの網羅性向上、role互換マッピングの拡充\";\n case \"unknown\":\n return \"エラー分類ロジックへの新カテゴリ追加を検討\";\n default:\n return \"新しいカテゴリ — error-classifier.ts に追加を検討\";\n }\n}\n\nexport function formatFailureCategoryDistribution(\n failedSteps: ReportableStep[],\n): string[] {\n const lines: string[] = [];\n\n if (failedSteps.length === 0) return lines;\n\n lines.push(\"### Failure Category Distribution\");\n lines.push(\"\");\n\n const categoryCount = new Map<string, number>();\n for (const step of failedSteps) {\n const cat = step.failureCategory ?? \"unclassified\";\n categoryCount.set(cat, (categoryCount.get(cat) ?? 0) + 1);\n }\n\n lines.push(\"| カテゴリ | 件数 | 改善ヒント |\");\n lines.push(\"|---------|------|-----------|\");\n for (const [cat, count] of [...categoryCount.entries()].sort((a, b) => b[1] - a[1])) {\n const hint = getSystemImprovementHint(cat);\n lines.push(`| \\`${cat}\\` | ${count} | ${hint} |`);\n }\n lines.push(\"\");\n\n return lines;\n}\n\n// ── Recovery Mechanism Effectiveness ──\n\nexport function analyzeRecoveryEffectiveness(\n entries: DebugLogEntry[],\n allSteps: ReportableStep[],\n): { name: string; total: number; success: number }[] {\n const results: { name: string; total: number; success: number }[] = [];\n\n // スマートリトライ\n const retrySteps = allSteps.filter((s) => s.retryCount && s.retryCount > 0);\n if (retrySteps.length > 0) {\n const retrySuccesses = retrySteps.filter((s) => s.status === \"success\").length;\n results.push({ name: \"スマートリトライ\", total: retrySteps.length, success: retrySuccesses });\n }\n\n // スクロール回復\n const scrollRecoveries = entries.filter((e) => e.event === \"recovery_attempt\");\n if (scrollRecoveries.length > 0) {\n const scrollStepOrdinals = new Set(scrollRecoveries.map((e) => e.step).filter((s) => s !== undefined));\n const scrollSuccesses = allSteps.filter(\n (s) => scrollStepOrdinals.has(s.ordinal) && s.status === \"success\",\n ).length;\n results.push({ name: \"スクロール回復\", total: scrollRecoveries.length, success: scrollSuccesses });\n }\n\n // Vision Fallback\n const visionFallbackStarts = entries.filter((e) => e.event === \"vision_fallback_start\").length;\n if (visionFallbackStarts > 0) {\n const visionSuccesses = entries.filter(\n (e) => e.event === \"vision_fallback_result\" && e.data && (e.data as Record<string, unknown>).ref,\n ).length;\n results.push({ name: \"Vision Fallback\", total: visionFallbackStarts, success: visionSuccesses });\n }\n\n // Agent Fallback\n const fbStarts = entries.filter((e) => e.event === \"agent_fallback_start\").length;\n if (fbStarts > 0) {\n const fbSuccesses = entries.filter(\n (e) => e.event === \"agent_fallback_result\" && e.data && (e.data as Record<string, unknown>).success === true,\n ).length;\n results.push({ name: \"Agent Fallback\", total: fbStarts, success: fbSuccesses });\n }\n\n // 決定論的解決フォールバック\n const deterministicMisses = entries.filter((e) => e.event === \"deterministic_resolve_miss\");\n if (deterministicMisses.length > 0) {\n const missStepOrdinals = new Set(deterministicMisses.map((e) => e.step).filter((s) => s !== undefined));\n const aiRecoveries = allSteps.filter(\n (s) => missStepOrdinals.has(s.ordinal) && s.status === \"success\",\n ).length;\n results.push({ name: \"AI フォールバック(決定論的失敗後)\", total: deterministicMisses.length, success: aiRecoveries });\n }\n\n return results;\n}\n\nexport function formatRecoveryEffectiveness(\n entries: DebugLogEntry[],\n allSteps: ReportableStep[],\n): string[] {\n const lines: string[] = [];\n\n if (entries.length === 0) return lines;\n\n const recoveryResults = analyzeRecoveryEffectiveness(entries, allSteps);\n if (recoveryResults.length === 0) return lines;\n\n lines.push(\"### Recovery Mechanism Effectiveness\");\n lines.push(\"\");\n lines.push(\"| 回復機構 | 発動回数 | 成功 | 失敗 | 成功率 |\");\n lines.push(\"|---------|---------|------|------|--------|\");\n for (const r of recoveryResults) {\n const rate = r.total > 0 ? Math.round((r.success / r.total) * 100) : 0;\n lines.push(`| ${r.name} | ${r.total} | ${r.success} | ${r.total - r.success} | ${rate}% |`);\n }\n lines.push(\"\");\n\n return lines;\n}\n\n// ── Performance Bottlenecks ──\n\nexport function formatPerformanceBottlenecks(allSteps: ReportableStep[]): string[] {\n const lines: string[] = [];\n\n const slowSteps = [...allSteps]\n .filter((s) => s.durationMs > 0)\n .sort((a, b) => b.durationMs - a.durationMs)\n .slice(0, 5);\n\n if (slowSteps.length > 0 && slowSteps[0].durationMs > 3000) {\n lines.push(\"### Performance Bottlenecks\");\n lines.push(\"\");\n lines.push(\"| Step | 所要時間 | リトライ | 状態 | 説明 |\");\n lines.push(\"|------|---------|---------|------|------|\");\n for (const step of slowSteps) {\n if (step.durationMs <= 3000) break;\n const status = step.status === \"failed\" ? \":x:\" : \":white_check_mark:\";\n lines.push(\n `| #${step.ordinal} | ${(step.durationMs / 1000).toFixed(1)}s | ${step.retryCount ?? 0} | ${status} | ${step.description} |`,\n );\n }\n lines.push(\"\");\n }\n\n return lines;\n}\n\n// ── AI Selector Quality Issues ──\n\nexport function analyzeAiSelectorQuality(\n entries: DebugLogEntry[],\n): { step: number; description: string }[] {\n const issues: { step: number; description: string }[] = [];\n\n // 同一ステップで AI が複数回呼ばれた\n const aiResponses = entries.filter((e) => e.event === \"ai_selector_response\");\n const stepAiCounts = new Map<number, number>();\n for (const e of aiResponses) {\n if (e.step !== undefined) {\n stepAiCounts.set(e.step, (stepAiCounts.get(e.step) ?? 0) + 1);\n }\n }\n for (const [step, count] of stepAiCounts) {\n if (count > 1) {\n issues.push({\n step,\n description: `AI が ${count} 回呼び出された(前回応答が不正確)。プロンプトの改善余地あり`,\n });\n }\n }\n\n // スナップショット未変化時の AI 再呼び出し\n const unchangedRetries = entries.filter(\n (e) => e.event === \"snapshot_unchanged\" && e.data && !(e.data as Record<string, unknown>).skippingAI,\n );\n if (unchangedRetries.length > 0) {\n for (const e of unchangedRetries) {\n if (e.step !== undefined) {\n issues.push({\n step: e.step,\n description: \"スナップショット未変化なのに AI が再呼び出しされた。スキップロジックの確認が必要\",\n });\n }\n }\n }\n\n // AI が空 ref を返した\n const emptyRefResponses = entries.filter(\n (e) =>\n e.event === \"ai_selector_response\" &&\n e.data &&\n typeof (e.data as Record<string, unknown>).parsedResult === \"object\" &&\n (e.data as Record<string, unknown>).parsedResult !== null &&\n ((e.data as Record<string, unknown>).parsedResult as Record<string, unknown>).ref === \"\",\n );\n if (emptyRefResponses.length > 0) {\n const steps = [...new Set(emptyRefResponses.map((e) => e.step).filter((s): s is number => s !== undefined))];\n for (const step of steps) {\n issues.push({\n step,\n description: \"AI が空 ref を返した(要素不在判定)。スナップショットフィルタが要素を除去していないか確認\",\n });\n }\n }\n\n return issues;\n}\n\nexport function formatAiSelectorQualityIssues(entries: DebugLogEntry[]): string[] {\n const lines: string[] = [];\n\n const aiQualityIssues = analyzeAiSelectorQuality(entries);\n if (aiQualityIssues.length === 0) return lines;\n\n lines.push(\"### AI Selector Resolution Issues\");\n lines.push(\"\");\n lines.push(\"> AI セレクタ解決で問題が検出されたケース。プロンプト改善の材料。\");\n lines.push(\"\");\n for (const issue of aiQualityIssues.slice(0, 5)) {\n lines.push(`- **Step #${issue.step}**: ${issue.description}`);\n }\n lines.push(\"\");\n\n return lines;\n}\n\n// ── Debug Log Sections ──\n\nexport interface DebugLogSectionOptions {\n /** 失敗ステップのイベントを表示するか(executor のみ) */\n showFailedStepEvents?: boolean;\n /** 失敗ステップの ordinal セット */\n failedOrdinals?: Set<number>;\n /** エラーイベントの最大表示数 (default: 20) */\n maxErrors?: number;\n /** 直近イベントの最大表示数 (default: 15) */\n maxRecent?: number;\n /** 直近イベントに含めるイベントタイプ */\n recentEventTypes?: string[];\n}\n\nconst DEFAULT_RECENT_EVENT_TYPES = [\n \"action\", \"snapshot\", \"selector_resolve\", \"selector_retry\",\n \"selector_cache_hit\", \"selector_cache_stale\",\n \"deterministic_resolve\", \"deterministic_resolve_miss\",\n \"vision_fallback_start\", \"vision_fallback_result\",\n \"agent_fallback_start\", \"agent_fallback_result\",\n \"recovery_attempt\", \"extract\", \"extract_result\", \"memory_operation\",\n];\n\nexport function formatDebugLogSections(\n entries: DebugLogEntry[],\n options: DebugLogSectionOptions = {},\n): string[] {\n const lines: string[] = [];\n\n if (entries.length === 0) return lines;\n\n const maxErrors = options.maxErrors ?? 20;\n const maxRecent = options.maxRecent ?? 15;\n const recentEventTypes = options.recentEventTypes ?? DEFAULT_RECENT_EVENT_TYPES;\n\n // 失敗ステップに関連するイベント\n if (options.showFailedStepEvents && options.failedOrdinals && options.failedOrdinals.size > 0) {\n const failedStepEntries = entries.filter(\n (e) => e.step !== undefined && options.failedOrdinals!.has(e.step),\n );\n if (failedStepEntries.length > 0) {\n lines.push(\"## Debug Log (Failed Step Events)\");\n lines.push(\"```json\");\n for (const entry of failedStepEntries.slice(-30)) {\n lines.push(JSON.stringify(entry));\n }\n lines.push(\"```\");\n lines.push(\"\");\n }\n }\n\n // エラーイベント\n const errorEntries = entries.filter(\n (e) =>\n e.event === \"error\" ||\n e.event === \"step_error\" ||\n e.event === \"validation_failed\" ||\n (e.data &&\n typeof e.data === \"object\" &&\n \"result\" in e.data &&\n typeof e.data.result === \"object\" &&\n e.data.result !== null &&\n \"success\" in (e.data.result as Record<string, unknown>) &&\n (e.data.result as Record<string, unknown>).success === false),\n );\n\n if (errorEntries.length > 0) {\n lines.push(\"## Debug Log (Error Events)\");\n lines.push(\"```json\");\n for (const entry of errorEntries.slice(-maxErrors)) {\n lines.push(JSON.stringify(entry));\n }\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n // 直近のアクション/スナップショットイベント\n const actionEntries = entries.filter(\n (e) => e.event !== undefined && recentEventTypes.includes(e.event),\n );\n const recentActions = actionEntries.slice(-maxRecent);\n\n if (recentActions.length > 0) {\n lines.push(\"## Debug Log (Recent Events)\");\n lines.push(\"```json\");\n for (const entry of recentActions) {\n lines.push(JSON.stringify(entry));\n }\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n return lines;\n}\n"],"mappings":"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","names":[]}