@refrainai/cli 0.4.1 → 0.4.3
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/{ai-model-FM6GWCID.js → ai-model-DP5PKGM6.js} +2 -2
- package/dist/{chunk-IGFCYKHC.js → chunk-5CKPPEYP.js} +262 -305
- package/dist/chunk-5CKPPEYP.js.map +1 -0
- package/dist/{chunk-7UCVPKD4.js → chunk-6FGCPMBU.js} +34 -74
- package/dist/chunk-6FGCPMBU.js.map +1 -0
- package/dist/{chunk-2BVDAJZT.js → chunk-A5X2VF5G.js} +9 -6
- package/dist/chunk-A5X2VF5G.js.map +1 -0
- package/dist/{chunk-H47NWH7N.js → chunk-AOCGSFRM.js} +611 -73
- package/dist/chunk-AOCGSFRM.js.map +1 -0
- package/dist/{chunk-CLYJHKPY.js → chunk-CMWLFQXD.js} +43 -42
- package/dist/chunk-CMWLFQXD.js.map +1 -0
- package/dist/chunk-GC7I5SGK.js +1146 -0
- package/dist/chunk-GC7I5SGK.js.map +1 -0
- package/dist/{chunk-WEYR56ZN.js → chunk-HHRHHFSK.js} +4 -4
- package/dist/chunk-IGJNT457.js +30 -0
- package/dist/chunk-IGJNT457.js.map +1 -0
- package/dist/{chunk-UGPXCQY3.js → chunk-KFNW4XR2.js} +13 -4
- package/dist/chunk-KFNW4XR2.js.map +1 -0
- package/dist/{chunk-RT664YIO.js → chunk-LZDZGI4M.js} +3 -1
- package/dist/chunk-LZDZGI4M.js.map +1 -0
- package/dist/{chunk-RYIJPYM3.js → chunk-MYITSQYV.js} +25 -8
- package/dist/chunk-MYITSQYV.js.map +1 -0
- package/dist/chunk-NRKZJVPE.js +74 -0
- package/dist/chunk-NRKZJVPE.js.map +1 -0
- package/dist/chunk-RBZK7T76.js +349 -0
- package/dist/chunk-RBZK7T76.js.map +1 -0
- package/dist/{chunk-HQDXLWAY.js → chunk-SDV3X5UN.js} +2 -2
- package/dist/{chunk-Z33FCOTZ.js → chunk-VVXNFUPL.js} +4 -2
- package/dist/chunk-VVXNFUPL.js.map +1 -0
- package/dist/chunk-YTVEYQGA.js +64 -0
- package/dist/chunk-YTVEYQGA.js.map +1 -0
- package/dist/{chunk-DJVUITRB.js → chunk-ZEBQWBEU.js} +898 -1135
- package/dist/chunk-ZEBQWBEU.js.map +1 -0
- package/dist/cli.js +5 -5
- package/dist/{compose-MTSIJY5D.js → compose-AVX5RU67.js} +9 -7
- package/dist/{compose-MTSIJY5D.js.map → compose-AVX5RU67.js.map} +1 -1
- package/dist/extraction-prompt-VDCKIFLB.js +17 -0
- package/dist/extraction-prompt-VDCKIFLB.js.map +1 -0
- package/dist/{fix-runbook-ZSBOTLC2.js → fix-runbook-6L5ZMA5G.js} +12 -10
- package/dist/{fix-runbook-ZSBOTLC2.js.map → fix-runbook-6L5ZMA5G.js.map} +1 -1
- package/dist/prompts-AGUYYIOM.js +13 -0
- package/dist/runbook-builder-2ZLE2AEO.js +11 -0
- package/dist/{runbook-data-helpers-KRR2SH76.js → runbook-data-helpers-5UAO65TZ.js} +3 -3
- package/dist/{runbook-executor-K7T6RJWJ.js → runbook-executor-OJXJTN6A.js} +41 -444
- package/dist/runbook-executor-OJXJTN6A.js.map +1 -0
- package/dist/{runbook-generator-MPXJBQ5N.js → runbook-generator-UIHWBEYC.js} +61 -136
- package/dist/runbook-generator-UIHWBEYC.js.map +1 -0
- package/dist/{runbook-schema-3T6TP3JJ.js → runbook-schema-X7DW725O.js} +2 -2
- package/dist/runbook-store-S24PXIHD.js +11 -0
- package/dist/{schema-5G6UQSPT.js → schema-XFSD5EWN.js} +2 -2
- package/dist/{server-AG3LXQBI.js → server-MULT5ZWG.js} +1176 -128
- package/dist/server-MULT5ZWG.js.map +1 -0
- package/dist/{tenant-ai-config-QPFEJUVJ.js → tenant-ai-config-4NHKRW7O.js} +4 -4
- package/dist/tenant-ai-config-4NHKRW7O.js.map +1 -0
- package/dist/yaml-patcher-GOCLYKZZ.js +18 -0
- package/dist/yaml-patcher-GOCLYKZZ.js.map +1 -0
- package/package.json +3 -2
- package/dist/chunk-2BVDAJZT.js.map +0 -1
- package/dist/chunk-7UCVPKD4.js.map +0 -1
- package/dist/chunk-CLYJHKPY.js.map +0 -1
- package/dist/chunk-DJVUITRB.js.map +0 -1
- package/dist/chunk-H47NWH7N.js.map +0 -1
- package/dist/chunk-IGFCYKHC.js.map +0 -1
- package/dist/chunk-RT664YIO.js.map +0 -1
- package/dist/chunk-RYIJPYM3.js.map +0 -1
- package/dist/chunk-UGPXCQY3.js.map +0 -1
- package/dist/chunk-VPK2MQAZ.js +0 -589
- package/dist/chunk-VPK2MQAZ.js.map +0 -1
- package/dist/chunk-Z33FCOTZ.js.map +0 -1
- package/dist/runbook-executor-K7T6RJWJ.js.map +0 -1
- package/dist/runbook-generator-MPXJBQ5N.js.map +0 -1
- package/dist/runbook-store-G5GUOWRR.js +0 -11
- package/dist/server-AG3LXQBI.js.map +0 -1
- package/dist/yaml-patcher-VGUS2JGH.js +0 -15
- /package/dist/{ai-model-FM6GWCID.js.map → ai-model-DP5PKGM6.js.map} +0 -0
- /package/dist/{chunk-WEYR56ZN.js.map → chunk-HHRHHFSK.js.map} +0 -0
- /package/dist/{chunk-HQDXLWAY.js.map → chunk-SDV3X5UN.js.map} +0 -0
- /package/dist/{runbook-data-helpers-KRR2SH76.js.map → prompts-AGUYYIOM.js.map} +0 -0
- /package/dist/{runbook-schema-3T6TP3JJ.js.map → runbook-builder-2ZLE2AEO.js.map} +0 -0
- /package/dist/{runbook-store-G5GUOWRR.js.map → runbook-data-helpers-5UAO65TZ.js.map} +0 -0
- /package/dist/{schema-5G6UQSPT.js.map → runbook-schema-X7DW725O.js.map} +0 -0
- /package/dist/{tenant-ai-config-QPFEJUVJ.js.map → runbook-store-S24PXIHD.js.map} +0 -0
- /package/dist/{yaml-patcher-VGUS2JGH.js.map → schema-XFSD5EWN.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
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":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/store/runbook-data-helpers.ts","../../../src/server/store/version-lifecycle.ts"],"sourcesContent":["/**\n * Runbook データ操作の純粋ヘルパー関数\n *\n * RunbookStore / VersionStore の private メソッドを抽出したもの。\n * DB トランザクション内で使用する。\n */\n\nimport { eq } from \"drizzle-orm\";\nimport {\n runbookSettings,\n runbookVariables,\n runbookSecrets,\n runbookSteps,\n jobs,\n} from \"../db/schema.js\";\nimport type { getDb } from \"../db/client.js\";\nimport type { ParsedStep } from \"../../runbook-executor/types.js\";\nimport { resolveDisplayStatus } from \"./version-lifecycle.js\";\n\ntype Db = ReturnType<typeof getDb>;\ntype Tx = Parameters<Parameters<Db[\"transaction\"]>[0]>[0];\n\n/**\n * バージョンデータ(settings, variables, secrets, steps)をコピーする。\n */\nexport async function copyVersionData(\n tx: Tx,\n sourceVersionId: string,\n targetVersionId: string,\n options?: { skipSteps?: boolean },\n) {\n // Settings\n const srcSettings = await tx.query.runbookSettings.findFirst({\n where: eq(runbookSettings.versionId, sourceVersionId),\n });\n if (srcSettings) {\n await tx.insert(runbookSettings).values({\n versionId: targetVersionId,\n defaultTimeout: srcSettings.defaultTimeout,\n pauseBetweenSteps: srcSettings.pauseBetweenSteps,\n stopOnError: srcSettings.stopOnError,\n stepDelay: srcSettings.stepDelay,\n enableSelectorCache: srcSettings.enableSelectorCache,\n enableAgentFallback: srcSettings.enableAgentFallback,\n enableVisionFallback: srcSettings.enableVisionFallback,\n modelId: srcSettings.modelId,\n modelProvider: srcSettings.modelProvider,\n });\n }\n\n // Variables\n const srcVars = await tx.query.runbookVariables.findMany({\n where: eq(runbookVariables.versionId, sourceVersionId),\n });\n if (srcVars.length > 0) {\n await tx.insert(runbookVariables).values(\n srcVars.map((v) => ({\n versionId: targetVersionId,\n name: v.name,\n source: v.source,\n description: v.description,\n required: v.required,\n sensitive: v.sensitive,\n value: v.value,\n })),\n );\n }\n\n // Secrets\n const srcSecrets = await tx.query.runbookSecrets.findMany({\n where: eq(runbookSecrets.versionId, sourceVersionId),\n });\n if (srcSecrets.length > 0) {\n await tx.insert(runbookSecrets).values(\n srcSecrets.map((s) => ({\n versionId: targetVersionId,\n key: s.key,\n encryptedValue: s.encryptedValue,\n })),\n );\n }\n\n // Steps(skipSteps 時はスキップ — 新バージョンでは AI が再生成する)\n if (options?.skipSteps) return;\n\n // Steps(再帰構造をコピー)\n const srcSteps = await tx.query.runbookSteps.findMany({\n where: eq(runbookSteps.versionId, sourceVersionId),\n orderBy: [runbookSteps.ordinal],\n });\n if (srcSteps.length > 0) {\n // ID マッピングを構築\n const idMap = new Map<string, string>();\n for (const s of srcSteps) {\n const [newStep] = await tx.insert(runbookSteps).values({\n versionId: targetVersionId,\n parentStepId: s.parentStepId ? idMap.get(s.parentStepId) ?? null : null,\n ordinal: s.ordinal,\n description: s.description,\n actionType: s.actionType,\n url: s.url,\n riskLevel: s.riskLevel,\n requiresConfirmation: s.requiresConfirmation,\n value: s.value,\n optionText: s.optionText,\n script: s.script,\n keys: s.keys,\n downloadPath: s.downloadPath,\n exportCollection: s.exportCollection,\n exportFormat: s.exportFormat,\n exportPath: s.exportPath,\n selector: s.selector,\n condition: s.condition,\n captures: s.captures,\n memoryOperations: s.memoryOperations,\n loopCondition: s.loopCondition,\n loopForEach: s.loopForEach,\n loopItemVariable: s.loopItemVariable,\n loopIndexVariable: s.loopIndexVariable,\n loopMaxIterations: s.loopMaxIterations,\n loopCounterVariable: s.loopCounterVariable,\n branchValue: s.branchValue,\n branchCaseMatch: s.branchCaseMatch,\n branchIsDefault: s.branchIsDefault,\n }).returning();\n idMap.set(s.id, newStep.id);\n }\n }\n}\n\n/**\n * ステップツリーを再帰的に DB に挿入する。\n */\nexport async function insertSteps(\n tx: Tx,\n versionId: string,\n steps: ParsedStep[],\n parentStepId: string | null,\n branchCaseMatch?: string,\n branchIsDefault?: boolean,\n) {\n for (const step of steps) {\n const [inserted] = await tx\n .insert(runbookSteps)\n .values({\n versionId,\n parentStepId,\n ordinal: step.ordinal,\n description: step.description,\n actionType: step.action.type,\n url: step.url || null,\n riskLevel: step.riskLevel,\n requiresConfirmation: step.requiresConfirmation,\n value: step.action.value ?? null,\n optionText: step.action.optionText ?? null,\n script: step.action.script ?? null,\n keys: step.action.keys ?? null,\n downloadPath: step.action.downloadPath ?? null,\n exportCollection: step.action.exportCollection ?? null,\n exportFormat: step.action.exportFormat ?? null,\n exportPath: step.action.exportPath ?? null,\n selector: step.action.selector ?? null,\n condition: step.condition ?? null,\n captures: step.captures ?? null,\n memoryOperations: step.memoryOperations ?? null,\n loopCondition: step.loop?.condition ?? null,\n loopForEach: step.loop?.forEach ?? null,\n loopItemVariable: step.loop?.itemVariable ?? null,\n loopIndexVariable: step.loop?.indexVariable ?? null,\n loopMaxIterations: step.loop?.maxIterations ?? null,\n loopCounterVariable: step.loop?.counterVariable ?? null,\n branchValue: step.branches?.value ?? null,\n branchCaseMatch: branchCaseMatch ?? null,\n branchIsDefault: branchIsDefault ?? false,\n })\n .returning();\n\n // サブステップ (loop)\n if (step.steps && step.steps.length > 0) {\n await insertSteps(tx, versionId, step.steps, inserted.id);\n }\n\n // ブランチ (cases + default)\n if (step.branches) {\n for (const branchCase of step.branches.cases) {\n await insertSteps(\n tx,\n versionId,\n branchCase.steps,\n inserted.id,\n branchCase.match,\n );\n }\n if (step.branches.default) {\n await insertSteps(\n tx,\n versionId,\n step.branches.default.steps,\n inserted.id,\n undefined,\n true,\n );\n }\n }\n }\n}\n\n/**\n * バージョン詳細(settings, variables, secrets, steps)を読み込む。\n */\nexport async function loadVersionDetail(db: Db, versionId: string) {\n const [settingsRow, variables, secretRows, steps] = await Promise.all([\n db.query.runbookSettings.findFirst({\n where: eq(runbookSettings.versionId, versionId),\n }),\n db.query.runbookVariables.findMany({\n where: eq(runbookVariables.versionId, versionId),\n }),\n db.query.runbookSecrets.findMany({\n where: eq(runbookSecrets.versionId, versionId),\n }),\n db.query.runbookSteps.findMany({\n where: eq(runbookSteps.versionId, versionId),\n orderBy: [runbookSteps.ordinal],\n }),\n ]);\n\n return {\n settings: settingsRow ?? null,\n variables,\n secrets: secretRows,\n steps,\n };\n}\n\n/**\n * DB のバージョン + 子テーブルからフラット構造を構築する(旧 API 互換)。\n */\nexport async function buildFlatRunbook(\n db: Db,\n rb: { id: string; title: string; disabled: boolean; activeVersionId: string | null; createdAt: Date; updatedAt: Date; tenantId: string; createdBy: string | null },\n ver: { id: string; status: string; goal: string; startUrl: string | null; context: string | null; generatedAt: string | null; verificationJobId: string | null; versionNumber: number },\n) {\n const detail = await loadVersionDetail(db, ver.id);\n\n // 検証ジョブのステータスを取得\n let verificationJobStatus: string | null = null;\n if (ver.verificationJobId) {\n const [job] = await db.select({ status: jobs.status }).from(jobs).where(eq(jobs.id, ver.verificationJobId));\n verificationJobStatus = job?.status ?? null;\n }\n\n // ステータスの計算: disabled フラグが true なら \"disabled\"、それ以外はバージョンステータス\n const status = rb.disabled\n ? \"disabled\" as const\n : ver.status === \"active\"\n ? \"active\" as const\n : ver.status === \"pending_verification\"\n ? \"pending_verification\" as const\n : ver.status === \"pending_approval\"\n ? \"pending_verification\" as const // 旧 API 互換\n : \"draft\" as const;\n\n return {\n ...rb,\n // フラット構造互換フィールド(バージョンからコピー)\n goal: ver.goal,\n startUrl: ver.startUrl,\n context: ver.context,\n generatedAt: ver.generatedAt,\n status,\n verificationJobId: ver.verificationJobId,\n verificationJobStatus,\n displayStatus: resolveDisplayStatus(\n rb.disabled ? \"disabled\" : ver.status,\n ver.verificationJobId,\n verificationJobStatus,\n ),\n // 子データ\n ...detail,\n // バージョン情報\n activeVersionId: rb.activeVersionId,\n currentVersionId: ver.id,\n versionNumber: ver.versionNumber,\n versionStatus: ver.status,\n };\n}\n","/**\n * バージョン状態遷移マシン\n *\n * 全てのバージョンステータス遷移ルールを一元管理する。\n * store/handler はここを参照して遷移の妥当性を検証する。\n */\n\nexport type VersionStatus = \"draft\" | \"pending_verification\" | \"pending_approval\" | \"active\" | \"archived\";\n\n/** 許可された状態遷移マップ */\nconst TRANSITIONS: Record<VersionStatus, VersionStatus[]> = {\n draft: [\"pending_verification\"],\n pending_verification: [\"pending_approval\", \"active\"],\n pending_approval: [\"pending_verification\", \"active\"],\n active: [\"archived\"],\n archived: [\"active\"],\n};\n\n/** 遷移が許可されているか */\nexport function canTransition(from: VersionStatus, to: VersionStatus): boolean {\n return TRANSITIONS[from]?.includes(to) ?? false;\n}\n\n/** 遷移を検証し、不正な場合は例外を投げる */\nexport function assertTransition(from: VersionStatus, to: VersionStatus): void {\n if (!canTransition(from, to)) {\n throw new Error(`Invalid transition: ${from} → ${to}`);\n }\n}\n\n/** 編集可能なステータスか(draft | pending_verification) */\nexport function isEditable(status: VersionStatus): boolean {\n return status === \"draft\" || status === \"pending_verification\";\n}\n\n/** 削除可能なステータスか(draft | pending_verification) */\nexport function isDeletable(status: VersionStatus): boolean {\n return status === \"draft\" || status === \"pending_verification\";\n}\n\n/** 検証可能なステータスか(pending_verification) */\nexport function isVerifiable(status: VersionStatus): boolean {\n return status === \"pending_verification\";\n}\n\n// ── 表示ステータス ──\n\nexport type DisplayStatus =\n | \"draft\"\n | \"pendingVerification\"\n | \"verifying\"\n | \"readyToActivate\"\n | \"pendingApproval\"\n | \"active\"\n | \"archived\"\n | \"disabled\";\n\n/**\n * DB ステータス + 検証ジョブ状態から表示用ステータスを解決する。\n * サーバーで計算して返し、フロントエンドはそのまま使う。\n */\nexport function resolveDisplayStatus(\n status: string,\n verificationJobId: string | null,\n verificationJobStatus: string | null,\n): DisplayStatus {\n if (status === \"disabled\") return \"disabled\";\n if (status === \"pending_verification\") {\n if (verificationJobId && verificationJobStatus === \"completed\") return \"readyToActivate\";\n if (\n verificationJobId &&\n verificationJobStatus &&\n ![\"completed\", \"failed\", \"cancelled\"].includes(verificationJobStatus)\n ) return \"verifying\";\n return \"pendingVerification\";\n }\n if (status === \"pending_approval\") return \"pendingApproval\";\n if (status === \"active\") return \"active\";\n if (status === \"archived\") return \"archived\";\n return \"draft\";\n}\n\n/**\n * 公開可能なステータスか\n * requireApproval=true の場合: pending_approval のみ\n * requireApproval=false の場合: pending_verification | pending_approval\n */\nexport function isPublishable(status: VersionStatus, requireApproval: boolean): boolean {\n if (requireApproval) {\n return status === \"pending_approval\";\n }\n return status === \"pending_verification\" || status === \"pending_approval\";\n}\n"],"mappings":";;;;;;;;;;AAOA,SAAS,UAAU;;;ACwBZ,SAAS,WAAW,QAAgC;AACzD,SAAO,WAAW,WAAW,WAAW;AAC1C;AAGO,SAAS,YAAY,QAAgC;AAC1D,SAAO,WAAW,WAAW,WAAW;AAC1C;AAGO,SAAS,aAAa,QAAgC;AAC3D,SAAO,WAAW;AACpB;AAkBO,SAAS,qBACd,QACA,mBACA,uBACe;AACf,MAAI,WAAW,WAAY,QAAO;AAClC,MAAI,WAAW,wBAAwB;AACrC,QAAI,qBAAqB,0BAA0B,YAAa,QAAO;AACvE,QACE,qBACA,yBACA,CAAC,CAAC,aAAa,UAAU,WAAW,EAAE,SAAS,qBAAqB,EACpE,QAAO;AACT,WAAO;AAAA,EACT;AACA,MAAI,WAAW,mBAAoB,QAAO;AAC1C,MAAI,WAAW,SAAU,QAAO;AAChC,MAAI,WAAW,WAAY,QAAO;AAClC,SAAO;AACT;;;ADvDA,eAAsB,gBACpB,IACA,iBACA,iBACA,SACA;AAEA,QAAM,cAAc,MAAM,GAAG,MAAM,gBAAgB,UAAU;AAAA,IAC3D,OAAO,GAAG,gBAAgB,WAAW,eAAe;AAAA,EACtD,CAAC;AACD,MAAI,aAAa;AACf,UAAM,GAAG,OAAO,eAAe,EAAE,OAAO;AAAA,MACtC,WAAW;AAAA,MACX,gBAAgB,YAAY;AAAA,MAC5B,mBAAmB,YAAY;AAAA,MAC/B,aAAa,YAAY;AAAA,MACzB,WAAW,YAAY;AAAA,MACvB,qBAAqB,YAAY;AAAA,MACjC,qBAAqB,YAAY;AAAA,MACjC,sBAAsB,YAAY;AAAA,MAClC,SAAS,YAAY;AAAA,MACrB,eAAe,YAAY;AAAA,IAC7B,CAAC;AAAA,EACH;AAGA,QAAM,UAAU,MAAM,GAAG,MAAM,iBAAiB,SAAS;AAAA,IACvD,OAAO,GAAG,iBAAiB,WAAW,eAAe;AAAA,EACvD,CAAC;AACD,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,GAAG,OAAO,gBAAgB,EAAE;AAAA,MAChC,QAAQ,IAAI,CAAC,OAAO;AAAA,QAClB,WAAW;AAAA,QACX,MAAM,EAAE;AAAA,QACR,QAAQ,EAAE;AAAA,QACV,aAAa,EAAE;AAAA,QACf,UAAU,EAAE;AAAA,QACZ,WAAW,EAAE;AAAA,QACb,OAAO,EAAE;AAAA,MACX,EAAE;AAAA,IACJ;AAAA,EACF;AAGA,QAAM,aAAa,MAAM,GAAG,MAAM,eAAe,SAAS;AAAA,IACxD,OAAO,GAAG,eAAe,WAAW,eAAe;AAAA,EACrD,CAAC;AACD,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,GAAG,OAAO,cAAc,EAAE;AAAA,MAC9B,WAAW,IAAI,CAAC,OAAO;AAAA,QACrB,WAAW;AAAA,QACX,KAAK,EAAE;AAAA,QACP,gBAAgB,EAAE;AAAA,MACpB,EAAE;AAAA,IACJ;AAAA,EACF;AAGA,MAAI,SAAS,UAAW;AAGxB,QAAM,WAAW,MAAM,GAAG,MAAM,aAAa,SAAS;AAAA,IACpD,OAAO,GAAG,aAAa,WAAW,eAAe;AAAA,IACjD,SAAS,CAAC,aAAa,OAAO;AAAA,EAChC,CAAC;AACD,MAAI,SAAS,SAAS,GAAG;AAEvB,UAAM,QAAQ,oBAAI,IAAoB;AACtC,eAAW,KAAK,UAAU;AACxB,YAAM,CAAC,OAAO,IAAI,MAAM,GAAG,OAAO,YAAY,EAAE,OAAO;AAAA,QACrD,WAAW;AAAA,QACX,cAAc,EAAE,eAAe,MAAM,IAAI,EAAE,YAAY,KAAK,OAAO;AAAA,QACnE,SAAS,EAAE;AAAA,QACX,aAAa,EAAE;AAAA,QACf,YAAY,EAAE;AAAA,QACd,KAAK,EAAE;AAAA,QACP,WAAW,EAAE;AAAA,QACb,sBAAsB,EAAE;AAAA,QACxB,OAAO,EAAE;AAAA,QACT,YAAY,EAAE;AAAA,QACd,QAAQ,EAAE;AAAA,QACV,MAAM,EAAE;AAAA,QACR,cAAc,EAAE;AAAA,QAChB,kBAAkB,EAAE;AAAA,QACpB,cAAc,EAAE;AAAA,QAChB,YAAY,EAAE;AAAA,QACd,UAAU,EAAE;AAAA,QACZ,WAAW,EAAE;AAAA,QACb,UAAU,EAAE;AAAA,QACZ,kBAAkB,EAAE;AAAA,QACpB,eAAe,EAAE;AAAA,QACjB,aAAa,EAAE;AAAA,QACf,kBAAkB,EAAE;AAAA,QACpB,mBAAmB,EAAE;AAAA,QACrB,mBAAmB,EAAE;AAAA,QACrB,qBAAqB,EAAE;AAAA,QACvB,aAAa,EAAE;AAAA,QACf,iBAAiB,EAAE;AAAA,QACnB,iBAAiB,EAAE;AAAA,MACrB,CAAC,EAAE,UAAU;AACb,YAAM,IAAI,EAAE,IAAI,QAAQ,EAAE;AAAA,IAC5B;AAAA,EACF;AACF;AAKA,eAAsB,YACpB,IACA,WACA,OACA,cACA,iBACA,iBACA;AACA,aAAW,QAAQ,OAAO;AACxB,UAAM,CAAC,QAAQ,IAAI,MAAM,GACtB,OAAO,YAAY,EACnB,OAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK,OAAO;AAAA,MACxB,KAAK,KAAK,OAAO;AAAA,MACjB,WAAW,KAAK;AAAA,MAChB,sBAAsB,KAAK;AAAA,MAC3B,OAAO,KAAK,OAAO,SAAS;AAAA,MAC5B,YAAY,KAAK,OAAO,cAAc;AAAA,MACtC,QAAQ,KAAK,OAAO,UAAU;AAAA,MAC9B,MAAM,KAAK,OAAO,QAAQ;AAAA,MAC1B,cAAc,KAAK,OAAO,gBAAgB;AAAA,MAC1C,kBAAkB,KAAK,OAAO,oBAAoB;AAAA,MAClD,cAAc,KAAK,OAAO,gBAAgB;AAAA,MAC1C,YAAY,KAAK,OAAO,cAAc;AAAA,MACtC,UAAU,KAAK,OAAO,YAAY;AAAA,MAClC,WAAW,KAAK,aAAa;AAAA,MAC7B,UAAU,KAAK,YAAY;AAAA,MAC3B,kBAAkB,KAAK,oBAAoB;AAAA,MAC3C,eAAe,KAAK,MAAM,aAAa;AAAA,MACvC,aAAa,KAAK,MAAM,WAAW;AAAA,MACnC,kBAAkB,KAAK,MAAM,gBAAgB;AAAA,MAC7C,mBAAmB,KAAK,MAAM,iBAAiB;AAAA,MAC/C,mBAAmB,KAAK,MAAM,iBAAiB;AAAA,MAC/C,qBAAqB,KAAK,MAAM,mBAAmB;AAAA,MACnD,aAAa,KAAK,UAAU,SAAS;AAAA,MACrC,iBAAiB,mBAAmB;AAAA,MACpC,iBAAiB,mBAAmB;AAAA,IACtC,CAAC,EACA,UAAU;AAGb,QAAI,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AACvC,YAAM,YAAY,IAAI,WAAW,KAAK,OAAO,SAAS,EAAE;AAAA,IAC1D;AAGA,QAAI,KAAK,UAAU;AACjB,iBAAW,cAAc,KAAK,SAAS,OAAO;AAC5C,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,SAAS;AAAA,UACT,WAAW;AAAA,QACb;AAAA,MACF;AACA,UAAI,KAAK,SAAS,SAAS;AACzB,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,KAAK,SAAS,QAAQ;AAAA,UACtB,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAsB,kBAAkB,IAAQ,WAAmB;AACjE,QAAM,CAAC,aAAa,WAAW,YAAY,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpE,GAAG,MAAM,gBAAgB,UAAU;AAAA,MACjC,OAAO,GAAG,gBAAgB,WAAW,SAAS;AAAA,IAChD,CAAC;AAAA,IACD,GAAG,MAAM,iBAAiB,SAAS;AAAA,MACjC,OAAO,GAAG,iBAAiB,WAAW,SAAS;AAAA,IACjD,CAAC;AAAA,IACD,GAAG,MAAM,eAAe,SAAS;AAAA,MAC/B,OAAO,GAAG,eAAe,WAAW,SAAS;AAAA,IAC/C,CAAC;AAAA,IACD,GAAG,MAAM,aAAa,SAAS;AAAA,MAC7B,OAAO,GAAG,aAAa,WAAW,SAAS;AAAA,MAC3C,SAAS,CAAC,aAAa,OAAO;AAAA,IAChC,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL,UAAU,eAAe;AAAA,IACzB;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAKA,eAAsB,iBACpB,IACA,IACA,KACA;AACA,QAAM,SAAS,MAAM,kBAAkB,IAAI,IAAI,EAAE;AAGjD,MAAI,wBAAuC;AAC3C,MAAI,IAAI,mBAAmB;AACzB,UAAM,CAAC,GAAG,IAAI,MAAM,GAAG,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE,MAAM,GAAG,KAAK,IAAI,IAAI,iBAAiB,CAAC;AAC1G,4BAAwB,KAAK,UAAU;AAAA,EACzC;AAGA,QAAM,SAAS,GAAG,WACd,aACA,IAAI,WAAW,WACb,WACA,IAAI,WAAW,yBACb,yBACA,IAAI,WAAW,qBACb,yBACA;AAEV,SAAO;AAAA,IACL,GAAG;AAAA;AAAA,IAEH,MAAM,IAAI;AAAA,IACV,UAAU,IAAI;AAAA,IACd,SAAS,IAAI;AAAA,IACb,aAAa,IAAI;AAAA,IACjB;AAAA,IACA,mBAAmB,IAAI;AAAA,IACvB;AAAA,IACA,eAAe;AAAA,MACb,GAAG,WAAW,aAAa,IAAI;AAAA,MAC/B,IAAI;AAAA,MACJ;AAAA,IACF;AAAA;AAAA,IAEA,GAAG;AAAA;AAAA,IAEH,iBAAiB,GAAG;AAAA,IACpB,kBAAkB,IAAI;AAAA,IACtB,eAAe,IAAI;AAAA,IACnB,eAAe,IAAI;AAAA,EACrB;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/runbook-executor/config.ts","../../../src/runbook-executor/yaml-loader.ts","../../../src/runbook-executor/reporter.ts","../../../src/runbook-executor/batch-runner.ts","../../../src/approval/chat-provider.ts","../../../src/approval/index.ts","../../../src/notification/chat-notifier.ts","../../../src/notification/index.ts","../../../src/notification/report-forwarder.ts","../../../src/runbook-executor/self-heal-reporter.ts","../../../src/cli/cli-logger.ts","../../../src/runbook-executor/report-generator.ts","../../../src/runbook-executor/index.ts"],"sourcesContent":["/**\n * runbook-executor CLI引数パース\n */\n\nimport { parseArgs as nodeParseArgs } from \"node:util\";\nimport { cancel } from \"../cli/prompts\";\nimport { t, initLocale } from \"../i18n\";\nimport { getRawArgs, readContextFile, validateNotifyMode, parseModelConfig } from \"../cli/config-helpers\";\nimport { loadSecrets } from \"../cli/secrets-loader\";\nimport { checkHelpFlag } from \"../cli/help\";\nimport type { ExecutorConfig } from \"./types\";\nimport { SELF_HEAL_DEFAULTS } from \"./types\";\n\nexport async function parseArgs(): Promise<ExecutorConfig> {\n checkHelpFlag(\"execute\");\n const args = getRawArgs();\n\n const { values } = nodeParseArgs({\n args,\n options: {\n runbook: { type: \"string\" },\n context: { type: \"string\" },\n headless: { type: \"string\" },\n \"step-delay\": { type: \"string\" },\n screenshots: { type: \"string\" },\n \"skip-confirmation\": { type: \"boolean\" },\n data: { type: \"string\" },\n secrets: { type: \"string\" },\n \"reuse-session\": { type: \"boolean\" },\n \"no-reuse-session\": { type: \"boolean\" },\n \"debug-log\": { type: \"string\" },\n debug: { type: \"boolean\" },\n \"approval-mode\": { type: \"string\" },\n notify: { type: \"string\" },\n \"enable-selector-cache\": { type: \"boolean\" },\n \"enable-agent-fallback\": { type: \"boolean\" },\n \"enable-vision-fallback\": { type: \"boolean\" },\n \"output-dir\": { type: \"string\" },\n \"merge-downloads\": { type: \"boolean\" },\n \"self-heal\": { type: \"boolean\" },\n \"max-retries\": { type: \"string\" },\n \"retry-warning-threshold\": { type: \"string\" },\n report: { type: \"boolean\" },\n model: { type: \"string\" },\n \"model-provider\": { type: \"string\" },\n \"model-base-url\": { type: \"string\" },\n \"model-selector\": { type: \"string\" },\n \"model-extraction\": { type: \"string\" },\n \"model-review\": { type: \"string\" },\n \"model-fallback\": { type: \"string\" },\n \"model-vision\": { type: \"string\" },\n \"api-key\": { type: \"string\" },\n \"api-server-url\": { type: \"string\" },\n \"refresh-key\": { type: \"boolean\" },\n \"callback-port\": { type: \"string\" },\n \"approval-timeout\": { type: \"string\" },\n video: { type: \"string\" },\n locale: { type: \"string\" },\n stealth: { type: \"boolean\" },\n proxy: { type: \"string\" },\n skill: { type: \"string\" },\n },\n strict: true,\n });\n\n initLocale(values.locale);\n\n if (!values.runbook) {\n cancel(t(\"cli.runbookRequired\"));\n process.exit(1);\n }\n\n if (!values.context) {\n cancel(t(\"cli.contextRequired\"));\n process.exit(1);\n }\n\n const contextMarkdown = await readContextFile(values.context);\n const secrets = await loadSecrets(values.secrets);\n const aiModelConfig = parseModelConfig(values);\n\n // reuseSession: --no-reuse-session で false、デフォルト true\n const reuseSession = values[\"no-reuse-session\"] ? false : (values[\"reuse-session\"] ?? true);\n\n // approvalMode のバリデーション\n const rawApprovalMode = values[\"approval-mode\"];\n const validApprovalModes = [\"web\", \"slack\", \"teams\", \"discord\"] as const;\n type ValidApprovalMode = (typeof validApprovalModes)[number];\n let approvalMode: ValidApprovalMode | undefined;\n if (rawApprovalMode) {\n if (!(validApprovalModes as readonly string[]).includes(rawApprovalMode)) {\n cancel(t(\"cli.invalidApprovalMode\"));\n process.exit(1);\n }\n approvalMode = rawApprovalMode as ValidApprovalMode;\n }\n\n const notifyMode = validateNotifyMode(values.notify);\n\n // 承認と通知のプラットフォーム一致チェック\n if (approvalMode && approvalMode !== \"web\" && notifyMode && approvalMode !== notifyMode) {\n cancel(\"--approval-mode and --notify must use the same platform\");\n process.exit(1);\n }\n\n const selfHeal = values[\"self-heal\"] ?? false;\n\n return {\n runbookPath: values.runbook,\n headless: values.headless !== \"false\",\n stepDelay: values[\"step-delay\"]\n ? Number.parseInt(values[\"step-delay\"], 10)\n : undefined,\n screenshotDir: values.screenshots,\n contextMarkdown,\n skipConfirmation: values[\"skip-confirmation\"] ?? selfHeal,\n dataFilePath: values.data,\n secrets,\n reuseSession,\n debugLogPath: values[\"debug-log\"],\n debugConsole: values.debug ?? false,\n approvalMode,\n notifyMode,\n callbackPort: values[\"callback-port\"]\n ? Number.parseInt(values[\"callback-port\"], 10)\n : undefined,\n approvalTimeoutMs: values[\"approval-timeout\"]\n ? Number.parseInt(values[\"approval-timeout\"], 10)\n : undefined,\n enableSelectorCache: values[\"enable-selector-cache\"] ?? (selfHeal ? SELF_HEAL_DEFAULTS.enableSelectorCache : undefined),\n enableAgentFallback: values[\"enable-agent-fallback\"] ?? (selfHeal ? SELF_HEAL_DEFAULTS.enableAgentFallback : undefined),\n enableVisionFallback: values[\"enable-vision-fallback\"] ?? (selfHeal ? SELF_HEAL_DEFAULTS.enableVisionFallback : undefined),\n outputDir: values[\"output-dir\"],\n mergeDownloads: values[\"merge-downloads\"] ?? false,\n selfHeal,\n maxRetries: values[\"max-retries\"]\n ? Number.parseInt(values[\"max-retries\"], 10)\n : selfHeal ? SELF_HEAL_DEFAULTS.maxRetries : undefined,\n retryWarningThreshold: values[\"retry-warning-threshold\"]\n ? Number.parseInt(values[\"retry-warning-threshold\"], 10)\n : selfHeal ? SELF_HEAL_DEFAULTS.retryWarningThreshold : undefined,\n forceReport: values.report ?? false,\n videoDir: values.video,\n aiModelConfig,\n apiKey: values[\"api-key\"],\n apiServerUrl: values[\"api-server-url\"],\n refreshKey: values[\"refresh-key\"] ?? false,\n stealth: values.stealth ?? false,\n proxy: values.proxy,\n skills: values.skill?.split(\",\").map(s => s.trim()).filter(Boolean),\n };\n}\n","/**\n * runbook YAML 読み込み + Zod バリデーション\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { parse } from \"yaml\";\nimport { ParsedRunbookSchema } from \"../schemas/runbook-schema\";\nimport type { ParsedRunbook } from \"./types\";\nimport { log } from \"../cli/prompts\";\nimport { formatDuration } from \"../cli/format\";\n\n/**\n * YAML 手順書を読み込み、メタデータをログ出力する。\n * executor / debugger 共通のエントリポイント。\n */\nexport async function loadAndLogRunbook(path: string): Promise<ParsedRunbook> {\n const loadStart = performance.now();\n const runbook = await loadRunbook(path);\n log.info(`Title: ${runbook.title}`);\n log.info(`Start URL: ${runbook.metadata.startUrl}`);\n log.info(`Steps: ${runbook.steps.length}`);\n log.info(`YAML loaded (${formatDuration(performance.now() - loadStart)})`);\n return runbook;\n}\n\n/**\n * YAML ファイルを読み込み、Zod スキーマで一括バリデーション。\n * 不正なフィールドは Zod のエラーメッセージで即座に検出される。\n */\nexport async function loadRunbook(path: string): Promise<ParsedRunbook> {\n const raw = await readFile(path, \"utf-8\");\n const doc = parse(raw);\n return ParsedRunbookSchema.parse(doc);\n}\n","/**\n * reporter — 実行結果サマリー出力\n */\n\nimport { note, log } from \"../cli/prompts\";\nimport { formatDuration } from \"../cli/format\";\nimport { t, tf } from \"../i18n\";\nimport { computeTotalRealInput, computeCacheRate } from \"../harness/ai-metrics\";\nimport type { ExecutionReport, BatchExecutionReport, StepExecutionResult } from \"./types\";\n\n/** ループ内サブステップも含めてフラット化する */\nfunction flattenSteps(steps: StepExecutionResult[]): StepExecutionResult[] {\n const result: StepExecutionResult[] = [];\n for (const step of steps) {\n result.push(step);\n if (step.subStepResults) {\n for (const iteration of step.subStepResults) {\n result.push(...flattenSteps(iteration));\n }\n }\n }\n return result;\n}\n\nfunction printStepResult(step: StepExecutionResult, indent: string): void {\n const duration = formatDuration(step.durationMs);\n\n // 条件スキップ\n if (step.conditionSkipped) {\n log.warn(`${indent}#${step.ordinal} ${step.description} (${t(\"common.conditionSkipped\")})`);\n return;\n }\n\n // ブランチステップ\n if (step.branchMatch !== undefined) {\n const matchLabel = step.branchMatch || t(\"common.skipped\").toLowerCase();\n const msg = `${indent}#${step.ordinal} ${step.description} (branch: ${matchLabel}, ${duration})`;\n if (step.status === \"success\") {\n log.success(msg);\n } else if (step.status === \"skipped\") {\n log.warn(msg);\n } else {\n log.error(msg);\n }\n if (step.subStepResults) {\n for (const subResults of step.subStepResults) {\n for (const subResult of subResults) {\n printStepResult(subResult, `${indent} `);\n }\n }\n }\n return;\n }\n\n // ループステップ(while + forEach)\n if (step.loopIterations !== undefined) {\n const iterLabel = step.forEachItemCount !== undefined\n ? `forEach: ${step.forEachItemCount} ${t(\"common.items\")}`\n : `${step.loopIterations} ${t(\"common.iterations\")}`;\n const msg = `${indent}#${step.ordinal} ${step.description} (${iterLabel}, ${duration})`;\n if (step.status === \"success\") {\n log.success(msg);\n } else {\n log.error(msg);\n }\n // サブステップ結果をイテレーションごとに表示\n if (step.subStepResults) {\n for (let i = 0; i < step.subStepResults.length; i++) {\n log.info(`${indent} ${t(\"common.iteration\")} ${i}:`);\n for (const subResult of step.subStepResults[i]) {\n printStepResult(subResult, `${indent} `);\n }\n }\n }\n return;\n }\n\n // 通常ステップ\n const msg = `${indent}#${step.ordinal} ${step.description} (${duration})`;\n if (step.status === \"success\") {\n log.success(msg);\n if (step.capturedValues) {\n for (const [name, value] of Object.entries(step.capturedValues)) {\n log.info(`${indent} captured: ${name} = \"${value}\"`);\n }\n }\n if (step.extractedData) {\n const preview = step.extractedData.length > 80\n ? `${step.extractedData.slice(0, 80)}...`\n : step.extractedData;\n log.info(`${indent} extracted: ${preview}`);\n }\n if (step.downloadedFile) {\n log.info(`${indent} downloaded: ${step.downloadedFile}`);\n }\n if (step.exportedFile) {\n log.info(`${indent} exported: ${step.exportedFile}`);\n }\n } else if (step.status === \"failed\") {\n log.error(`${msg} ERROR: ${step.error}`);\n } else {\n log.warn(`${msg} (${t(\"common.skipped\").toLowerCase()})`);\n }\n}\n\nexport function printReport(report: ExecutionReport): void {\n // サマリーを note() で枠付き表示\n const summaryLines = [\n tf(\"reporter.runbook\", { title: report.runbookTitle }),\n tf(\"reporter.startUrl\", { url: report.startUrl }),\n tf(\"reporter.totalSteps\", { count: report.totalSteps }),\n tf(\"reporter.statsLine\", { executed: report.executed, succeeded: report.succeeded, failed: report.failed, skipped: report.skipped }),\n ...(report.aborted ? [t(\"reporter.statusAborted\")] : []),\n tf(\"reporter.totalDuration\", { duration: formatDuration(report.totalDurationMs) }),\n ];\n\n // メモリコレクション情報\n if (report.memoryCollections && Object.keys(report.memoryCollections).length > 0) {\n const memoryInfo = Object.entries(report.memoryCollections)\n .map(([name, count]) => `${name}(${count}${t(\"common.items\")})`)\n .join(\", \");\n summaryLines.push(tf(\"reporter.memory\", { info: memoryInfo }));\n }\n\n // ダウンロードファイル情報\n if (report.downloadedFiles && report.downloadedFiles.length > 0) {\n summaryLines.push(tf(\"reporter.downloads\", { count: report.downloadedFiles.length }));\n }\n\n // AI メトリクスサマリー\n if (report.aiMetrics && report.aiMetrics.totalCalls > 0) {\n const m = report.aiMetrics;\n const totalRealInput = computeTotalRealInput(m);\n const cacheRate = (computeCacheRate(m) * 100).toFixed(1);\n const purposeSummary = Object.entries(m.byPurpose)\n .map(([p, b]) => `${p}(${b.calls})`)\n .join(\" \");\n summaryLines.push(\n `AI: ${m.totalCalls} calls, ` +\n `${totalRealInput.toLocaleString()} in / ${m.totalOutputTokens.toLocaleString()} out, ` +\n `cache ${cacheRate}%, ` +\n `$${m.estimatedCostUsd.toFixed(4)}, ` +\n `${(m.totalDurationMs / 1000).toFixed(1)}s — ${purposeSummary}`,\n );\n if (m.byModel && Object.keys(m.byModel).length > 1) {\n const modelSummary = Object.entries(m.byModel)\n .map(([id, b]) => `${id}($${b.estimatedCostUsd.toFixed(4)})`)\n .join(\" \");\n summaryLines.push(`Models: ${modelSummary}`);\n }\n }\n\n note(summaryLines.join(\"\\n\"), t(\"reporter.executionResult\"));\n\n // Extract 失敗・空結果の要約\n const allFlatSteps = flattenSteps(report.steps);\n const extractFailures = allFlatSteps.filter(\n (s) => s.actionType === \"extract\" && s.status === \"failed\",\n );\n const extractEmpty = allFlatSteps.filter(\n (s) => s.actionType === \"extract\" && s.status === \"success\" && (!s.extractedData || s.extractedData === \"\"),\n );\n if (extractFailures.length > 0) {\n log.error(`Extract failures: ${extractFailures.length} step(s) failed — ${extractFailures.map((s) => `#${s.ordinal}`).join(\", \")}`);\n }\n if (extractEmpty.length > 0) {\n log.warn(`Extract warnings: ${extractEmpty.length} step(s) returned empty results`);\n }\n\n // ステップ詳細: 状態に応じて色分け\n for (const step of report.steps) {\n printStepResult(step, \"\");\n }\n}\n\nexport function printBatchReport(report: BatchExecutionReport): void {\n const summaryLines = [\n tf(\"reporter.runbook\", { title: report.runbookTitle }),\n tf(\"reporter.batchTotalRows\", { count: report.totalRows }),\n tf(\"reporter.batchStats\", { succeeded: report.succeeded, failed: report.failed }),\n tf(\"reporter.totalDuration\", { duration: formatDuration(report.totalDurationMs) }),\n ];\n note(summaryLines.join(\"\\n\"), t(\"reporter.batchResult\"));\n\n // 行ごとの結果\n for (const row of report.rows) {\n const r = row.report;\n const status = r.failed === 0 && !r.aborted ? \"OK\" : \"NG\";\n const duration = formatDuration(r.totalDurationMs);\n const msg = `${row.rowLabel}: ${status} (${r.succeeded}/${r.totalSteps} steps, ${duration})`;\n\n if (status === \"OK\") {\n log.success(msg);\n } else {\n log.error(msg);\n // 失敗ステップの詳細\n for (const step of r.steps) {\n if (step.status === \"failed\") {\n log.error(` #${step.ordinal} ${step.description}: ${step.error}`);\n }\n }\n }\n }\n}\n","/**\n * batch-runner — CSV/JSON からの繰り返し実行\n *\n * dataSource.mapping に従い、行ごとに変数を RuntimeStore にセットして実行する。\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { extname } from \"node:path\";\nimport { AgentBrowser } from \"../browser/browser-client\";\nimport { RuntimeStore } from \"../context/runtime-store\";\nimport { execute } from \"./executor\";\nimport type { Logger, SpinnerLike } from \"../logger\";\nimport { NoopLogger, NoopSpinner } from \"../logger\";\nimport type { ConfirmationProvider } from \"../harness/confirmation\";\nimport type { SelectorCache } from \"../harness/selector-cache\";\nimport { t, tf } from \"../i18n\";\nimport type {\n ExecutorConfig,\n ParsedRunbook,\n BatchExecutionReport,\n} from \"./types\";\n\n/**\n * CSV/JSON ファイルを読み込んで行配列として返す\n */\nexport async function loadDataFile(\n path: string,\n): Promise<Record<string, string>[]> {\n const raw = await readFile(path, \"utf-8\");\n const ext = extname(path).toLowerCase();\n\n if (ext === \".json\") {\n const data = JSON.parse(raw);\n if (!Array.isArray(data)) {\n throw new Error(\"JSON data file must be an array of objects\");\n }\n return data.map((row: Record<string, unknown>) => {\n const result: Record<string, string> = {};\n for (const [k, v] of Object.entries(row)) {\n result[k] = String(v ?? \"\");\n }\n return result;\n });\n }\n\n // CSV パース(シンプルな実装)\n return parseCSV(raw);\n}\n\nfunction parseCSV(raw: string): Record<string, string>[] {\n const lines = raw.split(\"\\n\").filter((line) => line.trim() !== \"\");\n if (lines.length < 2) return [];\n\n const headers = parseCSVLine(lines[0]);\n const rows: Record<string, string>[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const values = parseCSVLine(lines[i]);\n const row: Record<string, string> = {};\n for (let j = 0; j < headers.length; j++) {\n row[headers[j]] = values[j] ?? \"\";\n }\n rows.push(row);\n }\n\n return rows;\n}\n\nfunction parseCSVLine(line: string): string[] {\n const result: string[] = [];\n let current = \"\";\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n if (inQuotes) {\n if (char === '\"') {\n if (i + 1 < line.length && line[i + 1] === '\"') {\n current += '\"';\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n current += char;\n }\n } else {\n if (char === '\"') {\n inQuotes = true;\n } else if (char === \",\") {\n result.push(current.trim());\n current = \"\";\n } else {\n current += char;\n }\n }\n }\n result.push(current.trim());\n return result;\n}\n\nexport interface BatchExecuteOptions {\n confirmationProvider?: ConfirmationProvider;\n selectorCache?: SelectorCache | null;\n /** Logger インスタンス(SDK 用にカスタム可能) */\n logger?: Logger;\n /** SpinnerLike ファクトリ(SDK 用にカスタム可能) */\n createSpinner?: () => SpinnerLike;\n /** ジョブレベルタイムアウト用 AbortSignal */\n abortSignal?: AbortSignal;\n /** Skill インスタンス(Google Sheets 等のドメイン特化スナップショット変換) */\n skills?: import(\"../skills/types\").Skill[];\n}\n\n/**\n * バッチ実行: 行ごとに data 変数をセットして execute\n */\nexport async function executeBatch(\n config: ExecutorConfig,\n runbook: ParsedRunbook,\n baseStore: RuntimeStore,\n dataRows: Record<string, string>[],\n reuseSession: boolean,\n batchOpts: BatchExecuteOptions = {},\n): Promise<BatchExecutionReport> {\n const totalStart = performance.now();\n const logger: Logger = batchOpts.logger ?? new NoopLogger();\n const createSpinner = batchOpts.createSpinner ?? (() => new NoopSpinner());\n const mapping = runbook.dataSource?.mapping ?? {};\n const reverseMapping = new Map<string, string>(); // CSV列ヘッダー → 変数名\n for (const [varName, csvHeader] of Object.entries(mapping)) {\n reverseMapping.set(csvHeader, varName);\n }\n\n const rowReports: BatchExecutionReport[\"rows\"] = [];\n let succeeded = 0;\n let failed = 0;\n\n // 行ごとの動画ディレクトリ(videoDir をそのまま共用。ファイル名はタイムスタンプで区別される)\n\n let sharedBrowser: AgentBrowser | undefined;\n\n if (reuseSession) {\n sharedBrowser = new AgentBrowser();\n const s = createSpinner();\n s.start(\"バッチ用ブラウザを起動中...\");\n await sharedBrowser.open(runbook.metadata.startUrl, {\n headless: config.headless,\n stealth: config.stealth,\n proxy: config.proxy,\n });\n await new Promise((r) => setTimeout(r, 1000));\n s.stop(t(\"executor.batchBrowserReady\"));\n }\n\n try {\n for (let i = 0; i < dataRows.length; i++) {\n const row = dataRows[i];\n const rowLabel = `Row ${i + 1}/${dataRows.length}`;\n logger.info(`\\n── ${rowLabel} ──`);\n\n // reuseSession 時: 行ごとに録画を切り替え(videoDir 共用、タイムスタンプで区別)\n if (reuseSession && sharedBrowser && config.videoDir) {\n if (sharedBrowser.isRecording()) {\n try {\n await sharedBrowser.stopRecording();\n } catch {\n // 停止失敗は無視\n }\n }\n try {\n await sharedBrowser.startRecording(config.videoDir);\n logger.info(tf(\"executor.recordingStarted\", { path: config.videoDir }));\n } catch (e) {\n logger.warn(tf(\"executor.recordingStartFailed\", { error: e instanceof Error ? e.message : String(e) }));\n }\n }\n\n // 行ごとの RuntimeStore を作成(baseStore をコピー + data 値を追加)\n const rowStore = new RuntimeStore();\n // 事前解決値をシード\n const baseEntries = baseStore.entries();\n const baseValues = new Map(baseEntries);\n // base の sensitive キーを引き継ぐ\n const sensitiveKeys = new Set<string>();\n for (const [key] of baseEntries) {\n if (baseStore.isSensitive(key)) {\n sensitiveKeys.add(key);\n }\n }\n\n // data 値をマッピングに従い追加\n for (const [csvHeader, value] of Object.entries(row)) {\n const varName = reverseMapping.get(csvHeader);\n if (varName) {\n baseValues.set(varName, value);\n }\n }\n\n rowStore.seed(baseValues, sensitiveKeys);\n\n // セッション再利用時は startUrl に戻る\n if (reuseSession && sharedBrowser && i > 0) {\n const startUrl = rowStore.resolveTemplate(runbook.metadata.startUrl);\n await sharedBrowser.navigate(startUrl);\n await new Promise((r) => setTimeout(r, 500));\n }\n\n const rowConfig = config;\n\n const report = await execute(rowConfig, runbook, {\n store: rowStore,\n browser: sharedBrowser,\n confirmationProvider: batchOpts.confirmationProvider,\n selectorCache: batchOpts.selectorCache,\n logger,\n createSpinner,\n abortSignal: batchOpts.abortSignal,\n skills: batchOpts.skills,\n });\n\n rowReports.push({ rowIndex: i, rowLabel, report });\n\n if (report.failed === 0 && !report.aborted) {\n succeeded++;\n } else {\n failed++;\n }\n }\n } finally {\n if (sharedBrowser) {\n // 録画停止\n if (sharedBrowser.isRecording()) {\n try {\n await sharedBrowser.stopRecording();\n } catch {\n // 停止失敗は無視\n }\n }\n try {\n await sharedBrowser.close();\n } catch {\n // close失敗は無視\n }\n }\n }\n\n return {\n runbookTitle: runbook.title,\n totalRows: dataRows.length,\n succeeded,\n failed,\n rows: rowReports,\n totalDurationMs: Math.round(performance.now() - totalStart),\n };\n}\n","/**\n * chat-provider --- Chat SDK ベースの承認プロバイダ\n *\n * Chat SDK の Card + Button を使用して承認リクエストを投稿し、\n * onAction() で承認 / スキップ / 中止のボタンクリックを受信する。\n * Slack, Teams, Discord 共通実装。\n */\n\nimport type { ConfirmationProvider, ConfirmationResult, ConfirmationContext } from \"../harness/confirmation\";\nimport type { ParsedStep } from \"../runbook-executor/types\";\nimport { t } from \"../i18n\";\nimport { SharedChatBot, ACTION_IDS, buildApprovalCard, buildApprovalResultCard } from \"../messaging\";\n\nconst RESULT_LABELS: Record<ConfirmationResult, string> = {\n approve: \"\\u2705\", // check mark\n skip: \"\\u23E9\", // fast forward\n abort: \"\\u{1F6D1}\", // stop sign\n};\n\nexport class ChatConfirmationProvider implements ConfirmationProvider {\n private readonly sharedBot: SharedChatBot;\n private readonly timeoutMs: number;\n private actionsRegistered = false;\n private pendingResolve: ((result: ConfirmationResult) => void) | null = null;\n\n constructor(sharedBot: SharedChatBot, timeoutMs: number) {\n this.sharedBot = sharedBot;\n this.timeoutMs = timeoutMs;\n }\n\n async confirm(step: ParsedStep, _stepIndex: number, context?: ConfirmationContext): Promise<ConfirmationResult> {\n await this.sharedBot.ensureInitialized();\n this.registerActionsOnce();\n\n const channel = this.sharedBot.getChannel();\n const card = buildApprovalCard(step, context);\n const sentMessage = await channel.post(card);\n\n console.log(`[Chat] Step ${step.ordinal}: ${t(\"chat.approvalWaiting\")}`);\n\n return new Promise<ConfirmationResult>((resolve) => {\n this.pendingResolve = resolve;\n\n // タイムアウト処理\n const timer = setTimeout(async () => {\n if (this.pendingResolve === resolve) {\n this.pendingResolve = null;\n console.log(`[Chat] Step ${step.ordinal}: ${t(\"chat.approvalTimeout\")}`);\n try {\n await sentMessage.edit(buildApprovalResultCard(step, t(\"chat.approvalTimeout\")));\n } catch { /* メッセージ更新失敗は無視 */ }\n resolve(\"abort\");\n }\n }, this.timeoutMs);\n\n // resolve が先に呼ばれた場合の処理\n const originalResolve = resolve;\n this.pendingResolve = (result: ConfirmationResult) => {\n clearTimeout(timer);\n this.pendingResolve = null;\n\n console.log(`[Chat] Step ${step.ordinal}: ${result}`);\n\n const resultLabel = getResultLabel(result);\n sentMessage.edit(buildApprovalResultCard(step, resultLabel)).catch(() => {});\n originalResolve(result);\n };\n });\n }\n\n async dispose(): Promise<void> {\n // SharedChatBot の dispose は呼び出し元(executor index.ts)が管理\n this.pendingResolve = null;\n this.actionsRegistered = false;\n }\n\n /**\n * onAction ハンドラを一度だけ登録。\n * Chat SDK の onAction は追加式なので、複数回 confirm() を呼んでも\n * ハンドラ登録は初回のみ。pendingResolve で動的にルーティング。\n */\n private registerActionsOnce(): void {\n if (this.actionsRegistered) return;\n this.actionsRegistered = true;\n\n this.sharedBot.onAction(\n [ACTION_IDS.approve, ACTION_IDS.skip, ACTION_IDS.abort],\n (event) => {\n const resultMap: Record<string, ConfirmationResult> = {\n [ACTION_IDS.approve]: \"approve\",\n [ACTION_IDS.skip]: \"skip\",\n [ACTION_IDS.abort]: \"abort\",\n };\n const result = resultMap[event.actionId];\n if (result && this.pendingResolve) {\n this.pendingResolve(result);\n }\n },\n );\n }\n}\n\nfunction getResultLabel(result: ConfirmationResult): string {\n const emoji = RESULT_LABELS[result];\n const keyMap: Record<ConfirmationResult, \"chat.approved\" | \"chat.chatSkipped\" | \"chat.chatAborted\"> = {\n approve: \"chat.approved\",\n skip: \"chat.chatSkipped\",\n abort: \"chat.chatAborted\",\n };\n return `${emoji} ${t(keyMap[result])}`;\n}\n","/**\n * approval --- ConfirmationProvider ファクトリ\n */\n\nimport type { ConfirmationProvider } from \"../harness/confirmation\";\nimport { CliConfirmationProvider } from \"../runbook-executor/confirmation\";\nimport { ChatConfirmationProvider } from \"./chat-provider\";\nimport type { SharedChatBot } from \"../messaging\";\nimport { DEFAULT_APPROVAL_TIMEOUT_MS } from \"../messaging/config\";\n\nexport type ApprovalMode = \"web\" | \"slack\" | \"teams\" | \"discord\";\n\nexport function createConfirmationProvider(\n mode: ApprovalMode,\n sharedBot?: SharedChatBot,\n timeoutMs?: number,\n): ConfirmationProvider {\n switch (mode) {\n case \"web\":\n return new CliConfirmationProvider();\n case \"slack\":\n case \"teams\":\n case \"discord\":\n if (!sharedBot) throw new Error(\"SharedChatBot is required for chat-based approval\");\n return new ChatConfirmationProvider(sharedBot, timeoutMs ?? DEFAULT_APPROVAL_TIMEOUT_MS);\n }\n}\n","/**\n * chat-notifier --- Chat SDK ベースの通知プロバイダ\n *\n * Chat SDK の Card を使用して実行結果通知を投稿する。\n * Slack, Teams, Discord 共通実装。\n */\n\nimport type { NotificationProvider } from \"./index\";\nimport type { ExecutionReport, BatchExecutionReport } from \"../runbook-executor/types\";\nimport type { DebugReport } from \"../runbook-executor/types\";\nimport { SharedChatBot, buildNotificationCard, buildDebugNotificationCard } from \"../messaging\";\n\nexport class ChatNotifier implements NotificationProvider {\n private readonly sharedBot: SharedChatBot;\n\n constructor(sharedBot: SharedChatBot) {\n this.sharedBot = sharedBot;\n }\n\n async notifyComplete(report: ExecutionReport | BatchExecutionReport): Promise<void> {\n await this.sharedBot.ensureInitialized();\n const channel = this.sharedBot.getChannel();\n const card = buildNotificationCard(report);\n await channel.post(card);\n }\n\n async notifyDebugFailure(report: DebugReport): Promise<void> {\n await this.sharedBot.ensureInitialized();\n const channel = this.sharedBot.getChannel();\n const card = buildDebugNotificationCard(report);\n await channel.post(card);\n }\n}\n","/**\n * notification --- NotificationProvider インターフェース + ファクトリ\n */\n\nimport { log } from \"../cli/prompts\";\nimport type { ExecutionReport, BatchExecutionReport } from \"../runbook-executor/types\";\nimport type { DebugReport } from \"../runbook-executor/types\";\nimport { ChatNotifier } from \"./chat-notifier\";\nimport type { SharedChatBot } from \"../messaging\";\n\nexport type NotifyMode = \"slack\" | \"teams\" | \"discord\";\n\nexport interface NotificationProvider {\n notifyComplete(report: ExecutionReport | BatchExecutionReport): Promise<void>;\n /** debug モード: 失敗 or 警告時の詳細通知 */\n notifyDebugFailure?(report: DebugReport): Promise<void>;\n dispose?(): Promise<void>;\n}\n\n/** No-op 実装(--notify 未指定時) */\nclass NoopNotificationProvider implements NotificationProvider {\n async notifyComplete(): Promise<void> {\n // intentionally empty\n }\n async notifyDebugFailure(): Promise<void> {\n // intentionally empty\n }\n}\n\nexport function createNotificationProvider(\n mode?: NotifyMode,\n sharedBot?: SharedChatBot,\n): NotificationProvider {\n if (!mode) return new NoopNotificationProvider();\n\n if (!sharedBot) throw new Error(\"SharedChatBot is required for chat-based notification\");\n return new ChatNotifier(sharedBot);\n}\n\n/** 通知を送信し、失敗しても warn ログのみで続行する共通ラッパー */\nexport async function safeNotify(fn: () => Promise<void>): Promise<void> {\n try {\n await fn();\n } catch (error) {\n log.warn(`Notification failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n","/**\n * report-forwarder --- 社内デバッグ用レポート Slack 転送\n *\n * 実行レポートファイルをベースマキナ社内の固定 Slack チャンネルに転送する。\n * 承認・完了通知(NotificationProvider)とは独立した専用機構。\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { WebClient } from \"@slack/web-api\";\n\nconst REPORT_SLACK_TOKEN =\n \"xoxb-1217504821568-10660041309394-7trkTYm05ifZyTpPXPiifKVh\";\nconst REPORT_SLACK_CHANNEL = \"C0AGXH79JC8\";\n\nlet cachedClient: WebClient | null = null;\n\nfunction getClient(): WebClient {\n if (!cachedClient) {\n cachedClient = new WebClient(REPORT_SLACK_TOKEN);\n }\n return cachedClient;\n}\n\n/**\n * レポートファイルを社内 Slack チャンネルに転送する。\n * 失敗しても warn ログのみで続行する。\n */\nexport async function forwardReportToSlack(\n reportFilePath: string,\n title: string,\n): Promise<void> {\n try {\n const client = getClient();\n const content = await readFile(reportFilePath, \"utf-8\");\n\n await client.filesUploadV2({\n channel_id: REPORT_SLACK_CHANNEL,\n content,\n filename: basename(reportFilePath),\n initial_comment: `:page_facing_up: 実行レポート: ${title}`,\n });\n } catch {\n // サイレントに失敗(社内デバッグ用なのでユーザーに通知しない)\n }\n}\n","/**\n * self-heal-reporter --- 自動修正モード実行結果の CLI 表示\n */\n\nimport { note, log } from \"../cli/prompts\";\nimport { formatDuration } from \"../cli/format\";\nimport { getRecoveryHint } from \"../harness/error-classifier\";\nimport { t, tf } from \"../i18n\";\nimport type { DebugReport } from \"./self-heal-types\";\n\nexport function printDebugReport(report: DebugReport): void {\n const r = report.executionReport;\n const hasFailures = r.failed > 0;\n const hasWarnings = report.warningSteps.length > 0;\n\n if (!hasFailures && !hasWarnings) {\n // 成功: 簡潔に 1 行\n log.success(\n tf(\"selfHeal.allStepsSuccess\", { count: r.totalSteps, duration: formatDuration(r.totalDurationMs) }),\n );\n return;\n }\n\n // サマリー\n const summaryLines = [\n tf(\"reporter.runbook\", { title: r.runbookTitle }),\n tf(\"reporter.startUrl\", { url: r.startUrl }),\n tf(\"reporter.totalSteps\", { count: r.totalSteps }),\n tf(\"reporter.statsLine\", { executed: r.executed, succeeded: r.succeeded, failed: r.failed, skipped: r.skipped }),\n ...(r.aborted ? [t(\"reporter.statusAborted\")] : []),\n tf(\"reporter.totalDuration\", { duration: formatDuration(r.totalDurationMs) }),\n ];\n\n // メモリコレクション情報\n if (r.memoryCollections && Object.keys(r.memoryCollections).length > 0) {\n const memoryInfo = Object.entries(r.memoryCollections)\n .map(([name, count]) => `${name}(${count}${t(\"common.items\")})`)\n .join(\", \");\n summaryLines.push(tf(\"reporter.memory\", { info: memoryInfo }));\n }\n\n // ダウンロードファイル情報\n if (r.downloadedFiles && r.downloadedFiles.length > 0) {\n summaryLines.push(tf(\"reporter.downloads\", { count: r.downloadedFiles.length }));\n }\n\n note(summaryLines.join(\"\\n\"), t(\"selfHeal.debugResult\"));\n\n // 失敗ステップ一覧\n const failedSteps = r.steps.filter((s) => s.status === \"failed\");\n if (failedSteps.length > 0) {\n log.error(t(\"selfHeal.failedSteps\"));\n for (const s of failedSteps) {\n const retries = s.retryCount ? ` (retries: ${s.retryCount})` : \"\";\n const categoryTag = s.failureCategory ? ` [${s.failureCategory}]` : \"\";\n log.error(`#${s.ordinal} ${s.description}: ${s.error}${retries}${categoryTag}`);\n if (s.failureCategory) {\n log.info(` → ${getRecoveryHint(s.failureCategory)}`);\n }\n }\n }\n\n // 手順書の修正提案\n const runbookSuggestions = report.suggestions.filter((s) => s.runbookFix);\n if (runbookSuggestions.length > 0) {\n log.info(\"\");\n log.info(t(\"selfHeal.yamlSuggestions\"));\n for (const s of runbookSuggestions) {\n const prefix = s.severity === \"error\" ? \"✗\" : \"⚠\";\n log.info(`${prefix} #${s.stepOrdinal}: ${s.runbookFix}`);\n }\n }\n\n // コンテキストの修正提案\n const contextSuggestions = report.suggestions.filter((s) => s.contextFix);\n if (contextSuggestions.length > 0) {\n log.info(\"\");\n log.info(t(\"selfHeal.contextSuggestions\"));\n for (const s of contextSuggestions) {\n const prefix = s.severity === \"error\" ? \"✗\" : \"⚠\";\n log.info(`${prefix} #${s.stepOrdinal}: ${s.contextFix}`);\n }\n }\n\n // リトライ警告\n if (report.warningSteps.length > 0) {\n log.info(\"\");\n log.warn(t(\"selfHeal.retryWarnings\"));\n for (const w of report.warningSteps) {\n log.warn(\n tf(\"selfHeal.retryCount\", { ordinal: w.ordinal, description: w.description, count: w.retryCount, threshold: w.threshold }),\n );\n }\n }\n}\n","/**\n * cli/cli-logger — @clack/prompts を Logger インターフェースに適合させるラッパー\n *\n * CLI エントリポイント(runbook-executor/index.ts 等)でのみ使用。\n * SDK からは import されない。\n */\n\nimport * as p from \"@clack/prompts\";\nimport type { Logger, SpinnerLike, LoggerFactory } from \"../logger\";\n\nexport class CliLogger implements Logger {\n step(message: string): void {\n p.log.step(message);\n }\n success(message: string): void {\n p.log.success(message);\n }\n error(message: string): void {\n p.log.error(message);\n }\n warn(message: string): void {\n p.log.warn(message);\n }\n info(message: string): void {\n p.log.info(message);\n }\n debug(message: string): void {\n p.log.info(`[debug] ${message}`);\n }\n}\n\nexport class CliSpinner implements SpinnerLike {\n start(message: string): void {\n p.log.step(message);\n }\n stop(message: string): void {\n p.log.info(message);\n }\n}\n\nexport const cliLoggerFactory: LoggerFactory = {\n createLogger: () => new CliLogger(),\n createSpinner: () => new CliSpinner(),\n};\n","/**\n * report-generator — 実行失敗時の Markdown レポート生成\n *\n * ステップ失敗・中断・例外発生時に、実行結果を Markdown 形式で出力する。\n * フル診断情報(AI プロンプト/レスポンス、スナップショット、リトライ詳細等)を含む。\n */\n\nimport type { ExecutionReport, StepExecutionResult, StepDiagnostics } from \"./types\";\nimport type { DebugSuggestion } from \"./self-heal-types\";\nimport type { SerializedOption } from \"../cli/options-serializer\";\nimport { renderOptionsMarkdown } from \"../cli/options-serializer\";\nimport { getRecoveryHint } from \"../harness/error-classifier\";\nimport {\n readDebugLog,\n type DebugLogEntry,\n formatAiMetricsSection,\n formatRuntimeEnvironment,\n formatSelectorResolutionStats,\n formatRetryDistribution,\n formatFailureCategoryDistribution,\n formatRecoveryEffectiveness,\n formatPerformanceBottlenecks,\n formatAiSelectorQualityIssues,\n formatDebugLogSections,\n} from \"../harness/report-sections\";\n\nexport interface GenerationContext {\n goal: string;\n startUrl: string;\n goalAchieved: boolean;\n generatedAt: string;\n totalSteps: number;\n notes?: string;\n}\n\nexport interface ExecutionReportFileInput {\n runbookPath: string;\n report: ExecutionReport;\n /** 例外で終了した場合のエラーメッセージ */\n errorMessage?: string;\n /** デバッグログファイルパス(--debug-log 指定時) */\n debugLogPath?: string;\n /** CLI オプション(レポートに記録用) */\n cliOptions?: SerializedOption[];\n /** generate 時のコンテキスト情報 */\n generationContext?: GenerationContext;\n /** self-heal-analyzer の修正提案(AI Agent Summary に含める) */\n selfHealSuggestions?: DebugSuggestion[];\n}\n\n\nfunction formatStepResult(step: StepExecutionResult, indent: string): string[] {\n const lines: string[] = [];\n const duration = `${step.durationMs}ms`;\n\n if (step.conditionSkipped) {\n lines.push(`${indent}${step.ordinal}. [SKIPPED] ${step.description} (condition skipped)`);\n return lines;\n }\n\n if (step.branchMatch !== undefined) {\n const tag = step.status === \"success\" ? \"DONE\" : step.status === \"skipped\" ? \"SKIPPED\" : \"FAILED\";\n lines.push(`${indent}${step.ordinal}. [${tag}] ${step.description} (branch: ${step.branchMatch || \"no match\"}, ${duration})`);\n if (step.subStepResults) {\n for (const subResults of step.subStepResults) {\n for (const sub of subResults) {\n lines.push(...formatStepResult(sub, `${indent} `));\n }\n }\n }\n return lines;\n }\n\n if (step.loopIterations !== undefined) {\n const tag = step.status === \"success\" ? \"DONE\" : \"FAILED\";\n const iterLabel = step.forEachItemCount !== undefined\n ? `forEach: ${step.forEachItemCount} items`\n : `${step.loopIterations} iterations`;\n lines.push(`${indent}${step.ordinal}. [${tag}] ${step.description} (${iterLabel}, ${duration})`);\n if (step.subStepResults) {\n for (let i = 0; i < step.subStepResults.length; i++) {\n lines.push(`${indent} iteration ${i}:`);\n for (const sub of step.subStepResults[i]) {\n lines.push(...formatStepResult(sub, `${indent} `));\n }\n }\n }\n return lines;\n }\n\n const tag = step.status === \"success\" ? \"DONE\" : step.status === \"failed\" ? \"FAILED\" : \"SKIPPED\";\n const errorInfo = step.status === \"failed\" && step.error ? ` — Error: ${step.error}` : \"\";\n const category = step.failureCategory ? ` [${step.failureCategory}]` : \"\";\n const retry = step.retryCount ? ` (retries: ${step.retryCount})` : \"\";\n lines.push(`${indent}${step.ordinal}. [${tag}] ${step.description} (${duration})${errorInfo}${category}${retry}`);\n\n return lines;\n}\n\nfunction formatDiagnostics(diag: StepDiagnostics, stepOrdinal: number): string[] {\n const lines: string[] = [];\n\n lines.push(`### Step #${stepOrdinal} — Diagnostics`);\n lines.push(\"\");\n\n // Step Action Definition\n if (diag.stepAction) {\n lines.push(`**Step Action**: type=${diag.stepAction.type}`);\n if (diag.stepAction.value) lines.push(`- value: ${diag.stepAction.value}`);\n if (diag.stepAction.url) lines.push(`- url: ${diag.stepAction.url}`);\n if (diag.stepAction.selector) {\n lines.push(\"- selector:\");\n lines.push(\"```json\");\n lines.push(JSON.stringify(diag.stepAction.selector, null, 2));\n lines.push(\"```\");\n }\n lines.push(\"\");\n }\n\n // Step URL\n if (diag.stepUrl) {\n lines.push(`**Step URL**: ${diag.stepUrl}`);\n lines.push(\"\");\n }\n\n // Recovery Hint\n if (diag.recoveryHint) {\n lines.push(`**Recovery Hint**: ${diag.recoveryHint}`);\n lines.push(\"\");\n }\n\n // Execution Strategy\n if (diag.executionStrategy) {\n const s = diag.executionStrategy;\n lines.push(`**Execution Strategy**: maxRetries=${s.maxRetries}, changeTimeouts=[${s.changeTimeouts.join(\",\")}]ms, finalRetryStabilize=${s.finalRetryStabilizeMs}ms, domStability=${s.domStabilityMs}ms`);\n lines.push(\"\");\n }\n\n // Deterministic Resolve\n if (diag.deterministicResolveResult) {\n lines.push(`**Deterministic Resolve**: ${diag.deterministicResolveResult}`);\n lines.push(\"\");\n }\n\n // Failure History\n if (diag.failureHistory && diag.failureHistory.length > 0) {\n lines.push(\"**Failure History**:\");\n for (const f of diag.failureHistory) {\n lines.push(`- ${f}`);\n }\n lines.push(\"\");\n }\n\n // Validation Warnings\n if (diag.validationWarnings && diag.validationWarnings.length > 0) {\n lines.push(\"**Validation Warnings**:\");\n for (const w of diag.validationWarnings) {\n lines.push(`- ${w}`);\n }\n lines.push(\"\");\n }\n\n // Validation Errors\n if (diag.validationErrors && diag.validationErrors.length > 0) {\n lines.push(\"**Validation Errors**:\");\n for (const e of diag.validationErrors) {\n lines.push(`- ${e}`);\n }\n lines.push(\"\");\n }\n\n // Vision Fallback\n if (diag.visionFallbackResult) {\n const vf = diag.visionFallbackResult;\n lines.push(`**Vision Fallback**: annotations=${vf.annotationCount}, success=${vf.success}`);\n lines.push(`- Reasoning: ${vf.reasoning}`);\n lines.push(\"\");\n }\n\n // Agent Fallback\n if (diag.agentFallbackResult) {\n const fb = diag.agentFallbackResult;\n lines.push(`**Agent Fallback**: strategy=${fb.strategy}, success=${fb.success}`);\n lines.push(`- Analysis: ${fb.analysis}`);\n lines.push(`- Reasoning: ${fb.reasoning}`);\n lines.push(\"\");\n }\n\n // Last AI Response\n if (diag.lastAiResponseText) {\n lines.push(\"**Last AI Response**:\");\n lines.push(\"```json\");\n lines.push(diag.lastAiResponseText);\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n // Last Snapshot Preview\n if (diag.lastSnapshotPreview) {\n lines.push(\"**Last Snapshot Preview** (truncated):\");\n lines.push(\"```\");\n lines.push(diag.lastSnapshotPreview);\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n return lines;\n}\n\nfunction formatRetryDetails(retryDetails: StepExecutionResult[\"retryDetails\"], stepOrdinal: number): string[] {\n if (!retryDetails || retryDetails.length === 0) return [];\n\n const lines: string[] = [];\n lines.push(`### Step #${stepOrdinal} — Retry Details`);\n lines.push(\"\");\n\n for (const detail of retryDetails) {\n lines.push(`#### Attempt ${detail.attempt}`);\n lines.push(`- Snapshot changed: ${detail.snapshotChanged}`);\n lines.push(`- Element count: ${detail.snapshotElementCount}`);\n lines.push(`- Failure reason: ${detail.failureReason}`);\n if (detail.aiReasoning) {\n lines.push(`- AI reasoning: ${detail.aiReasoning}`);\n }\n\n if (detail.aiResponse) {\n lines.push(\"- AI response:\");\n lines.push(\"```json\");\n lines.push(detail.aiResponse);\n lines.push(\"```\");\n }\n\n if (detail.aiPrompt) {\n lines.push(\"\");\n lines.push(\"<details>\");\n lines.push(`<summary>AI Prompt (attempt ${detail.attempt})</summary>`);\n lines.push(\"\");\n lines.push(\"```\");\n lines.push(detail.aiPrompt);\n lines.push(\"```\");\n lines.push(\"</details>\");\n }\n\n if (detail.snapshotPreview) {\n lines.push(\"\");\n lines.push(\"<details>\");\n lines.push(`<summary>Snapshot Preview (attempt ${detail.attempt}, truncated)</summary>`);\n lines.push(\"\");\n lines.push(\"```\");\n lines.push(detail.snapshotPreview);\n lines.push(\"```\");\n lines.push(\"</details>\");\n }\n\n lines.push(\"\");\n }\n\n return lines;\n}\n\n/**\n * AI エージェント向けの構造化サマリーを生成する。\n * AI がこのセクションだけ読めば即座に修正アクションを取れるようにする。\n */\nfunction formatAiAgentSummary(\n failedSteps: StepExecutionResult[],\n input: ExecutionReportFileInput,\n): string[] {\n const lines: string[] = [];\n\n lines.push(\"## AI Agent Summary\");\n lines.push(\"\");\n lines.push(\"以下は AI エージェントが即座に修正アクションを取るための構造化情報です。\");\n lines.push(\"\");\n\n // 失敗ステップと修正指示\n lines.push(\"### 失敗ステップと修正指示\");\n lines.push(\"\");\n\n for (const step of failedSteps) {\n lines.push(`#### Step #${step.ordinal}: ${step.description}`);\n lines.push(\"\");\n lines.push(`- **エラー**: ${step.error ?? \"Unknown\"}`);\n if (step.failureCategory) {\n lines.push(`- **分類**: \\`${step.failureCategory}\\``);\n lines.push(`- **推奨対応**: ${getRecoveryHint(step.failureCategory)}`);\n }\n if (step.retryCount !== undefined && step.retryCount > 0) {\n lines.push(`- **リトライ回数**: ${step.retryCount}`);\n }\n\n // 診断情報から具体的な修正ヒントを抽出\n if (step.diagnostics) {\n const diag = step.diagnostics;\n if (diag.stepAction?.selector) {\n lines.push(`- **現在のセレクタ**:`);\n lines.push(\" ```json\");\n lines.push(` ${JSON.stringify(diag.stepAction.selector)}`);\n lines.push(\" ```\");\n }\n if (diag.lastSnapshotPreview) {\n lines.push(`- **最終スナップショット**:`);\n lines.push(\" <details>\");\n lines.push(\" <summary>スナップショット全文を表示</summary>\");\n lines.push(\"\");\n lines.push(\" ```\");\n lines.push(` ${diag.lastSnapshotPreview}`);\n lines.push(\" ```\");\n lines.push(\" </details>\");\n }\n if (diag.visionFallbackResult) {\n lines.push(`- **Vision Fallback 結果**: annotations=${diag.visionFallbackResult.annotationCount}, success=${diag.visionFallbackResult.success}`);\n lines.push(` - 理由: ${diag.visionFallbackResult.reasoning}`);\n }\n if (diag.agentFallbackResult) {\n lines.push(`- **Agent Fallback 結果**: strategy=${diag.agentFallbackResult.strategy}, success=${diag.agentFallbackResult.success}`);\n lines.push(` - 分析: ${diag.agentFallbackResult.analysis}`);\n }\n }\n\n // self-heal-analyzer からの修正提案があれば含める\n if (input.selfHealSuggestions) {\n const suggestion = input.selfHealSuggestions.find(\n (s) => s.stepOrdinal === step.ordinal,\n );\n if (suggestion) {\n if (suggestion.runbookFix) {\n lines.push(`- **YAML 修正提案**: ${suggestion.runbookFix}`);\n }\n if (suggestion.contextFix) {\n lines.push(`- **Context 修正提案**: ${suggestion.contextFix}`);\n }\n if (suggestion.suggestedStrategy) {\n lines.push(`- **推奨戦略**: ${suggestion.suggestedStrategy}`);\n }\n }\n }\n\n lines.push(\"\");\n }\n\n // 修正対象ファイル\n lines.push(\"### 修正対象ファイル\");\n lines.push(\"\");\n lines.push(`- \\`${input.runbookPath}\\` (Steps: ${failedSteps.map((s) => `#${s.ordinal}`).join(\", \")})`);\n lines.push(\"\");\n\n // 修正後の検証コマンド\n lines.push(\"### 修正後の検証コマンド\");\n lines.push(\"\");\n lines.push(\"```bash\");\n lines.push(`pnpm execute -- --runbook ${input.runbookPath} --self-heal`);\n lines.push(\"```\");\n lines.push(\"\");\n\n return lines;\n}\n\n/**\n * refrain 自体の改善材料となるシステムレベルの分析情報を生成する。\n * 共通モジュール report-sections.ts の関数群に委譲する。\n */\nfunction formatSystemInsights(\n report: ExecutionReport,\n debugEntries: DebugLogEntry[],\n): string[] {\n const lines: string[] = [];\n\n lines.push(\"## System Insights\");\n lines.push(\"\");\n lines.push(\"> refrain の機能改善・バグ修正のための分析情報\");\n lines.push(\"\");\n\n const allSteps = flattenSteps(report.steps);\n\n lines.push(...formatRuntimeEnvironment());\n\n if (report.aiMetrics && report.aiMetrics.totalCalls > 0) {\n lines.push(...formatAiMetricsSection(report.aiMetrics));\n }\n\n lines.push(...formatSelectorResolutionStats(debugEntries, allSteps));\n lines.push(...formatRetryDistribution(allSteps));\n\n const failedSteps = allSteps.filter((s) => s.status === \"failed\");\n lines.push(...formatFailureCategoryDistribution(failedSteps));\n lines.push(...formatRecoveryEffectiveness(debugEntries, allSteps));\n lines.push(...formatPerformanceBottlenecks(allSteps));\n lines.push(...formatAiSelectorQualityIssues(debugEntries));\n\n return lines;\n}\n\n/** ループ内サブステップも含めてフラット化する */\nfunction flattenSteps(steps: StepExecutionResult[]): StepExecutionResult[] {\n const result: StepExecutionResult[] = [];\n for (const step of steps) {\n result.push(step);\n if (step.subStepResults) {\n for (const iteration of step.subStepResults) {\n result.push(...flattenSteps(iteration));\n }\n }\n }\n return result;\n}\n\nexport async function generateExecutionReportFile(input: ExecutionReportFileInput): Promise<string> {\n const { report } = input;\n const lines: string[] = [];\n\n lines.push(\"# Execution Report\");\n lines.push(\"\");\n\n // Session Info\n lines.push(\"## Session Info\");\n lines.push(`- **Date**: ${new Date().toISOString()}`);\n lines.push(`- **Runbook**: ${report.runbookTitle}`);\n lines.push(`- **Runbook Path**: ${input.runbookPath}`);\n lines.push(`- **Start URL**: ${report.startUrl}`);\n const outcome = report.aborted\n ? \"Aborted\"\n : report.failed > 0\n ? \"Failed\"\n : input.errorMessage\n ? \"Error\"\n : \"Success\";\n lines.push(`- **Outcome**: ${outcome}`);\n lines.push(\"\");\n\n // Executor CLI Options\n if (input.cliOptions && input.cliOptions.length > 0) {\n lines.push(\"## Executor CLI Options\");\n lines.push(...renderOptionsMarkdown(input.cliOptions));\n lines.push(\"\");\n }\n\n // Generation Context\n if (input.generationContext) {\n const gc = input.generationContext;\n lines.push(\"## Generation Context\");\n lines.push(`- **Goal**: ${gc.goal}`);\n lines.push(`- **Start URL**: ${gc.startUrl}`);\n lines.push(`- **Goal Achieved (at generation)**: ${gc.goalAchieved}`);\n lines.push(`- **Generated At**: ${gc.generatedAt}`);\n lines.push(`- **Total Steps (generated)**: ${gc.totalSteps}`);\n if (gc.notes) {\n lines.push(\"- **Notes**:\");\n for (const line of gc.notes.split(\"\\n\")) {\n lines.push(` > ${line}`);\n }\n }\n lines.push(\"\");\n }\n\n // Error Details\n if (input.errorMessage) {\n lines.push(\"## Error Details\");\n lines.push(\"```\");\n lines.push(input.errorMessage);\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n // Execution Summary\n lines.push(\"## Execution Summary\");\n lines.push(`- **Total Steps**: ${report.totalSteps}`);\n lines.push(`- **Executed**: ${report.executed}`);\n lines.push(`- **Succeeded**: ${report.succeeded}`);\n lines.push(`- **Failed**: ${report.failed}`);\n lines.push(`- **Skipped**: ${report.skipped}`);\n lines.push(`- **Aborted**: ${report.aborted}`);\n lines.push(`- **Duration**: ${report.totalDurationMs}ms`);\n lines.push(\"\");\n\n // Extract Summary\n const allFlatSteps = flattenSteps(report.steps);\n const extractSteps = allFlatSteps.filter((s) => s.actionType === \"extract\");\n if (extractSteps.length > 0) {\n const extractFailures = extractSteps.filter((s) => s.status === \"failed\");\n const extractEmpty = extractSteps.filter(\n (s) => s.status === \"success\" && (!s.extractedData || s.extractedData === \"\"),\n );\n const extractSuccess = extractSteps.filter(\n (s) => s.status === \"success\" && s.extractedData && s.extractedData !== \"\",\n );\n\n lines.push(\"## Extract Summary\");\n lines.push(\"\");\n lines.push(`- **Total extract steps**: ${extractSteps.length}`);\n lines.push(`- **Succeeded (with data)**: ${extractSuccess.length}`);\n lines.push(`- **Succeeded (empty result)**: ${extractEmpty.length}`);\n lines.push(`- **Failed**: ${extractFailures.length}`);\n lines.push(\"\");\n\n if (extractFailures.length > 0) {\n lines.push(\"### Extract Failures\");\n lines.push(\"\");\n for (const step of extractFailures) {\n lines.push(`- **Step #${step.ordinal}** (${step.description}): ${step.error ?? \"Unknown\"}`);\n }\n lines.push(\"\");\n }\n\n if (extractEmpty.length > 0) {\n lines.push(\"### Extract Empty Results (Warning)\");\n lines.push(\"\");\n for (const step of extractEmpty) {\n lines.push(`- **Step #${step.ordinal}** (${step.description}): Script executed but returned empty`);\n }\n lines.push(\"\");\n }\n }\n\n // Step Results\n if (report.steps.length > 0) {\n lines.push(\"## Step Results\");\n for (const step of report.steps) {\n lines.push(...formatStepResult(step, \"\"));\n }\n lines.push(\"\");\n }\n\n // Failed Step Diagnostics (full details for each failed step)\n const failedSteps = report.steps.filter((s) => s.status === \"failed\");\n if (failedSteps.length > 0) {\n lines.push(\"## Failed Step Diagnostics\");\n lines.push(\"\");\n\n for (const step of failedSteps) {\n // Retry details\n if (step.retryDetails && step.retryDetails.length > 0) {\n lines.push(...formatRetryDetails(step.retryDetails, step.ordinal));\n }\n\n // Full diagnostics\n if (step.diagnostics) {\n lines.push(...formatDiagnostics(step.diagnostics, step.ordinal));\n }\n\n // diagnostics が空でもリトライもない場合(早期リターン系エラー)\n if (!step.diagnostics && (!step.retryDetails || step.retryDetails.length === 0)) {\n lines.push(`### Step #${step.ordinal} — Error Info`);\n lines.push(\"\");\n lines.push(`**Error**: ${step.error ?? \"Unknown\"}`);\n if (step.failureCategory) {\n lines.push(`**Category**: ${step.failureCategory}`);\n }\n lines.push(\"\");\n }\n }\n }\n\n // AI Agent Summary(AI エージェントが即座にアクションを取るための構造化サマリー)\n if (failedSteps.length > 0) {\n lines.push(...formatAiAgentSummary(failedSteps, input));\n }\n\n // デバッグログ読み込み(System Insights と Debug Log セクションで共有)\n const debugEntries = input.debugLogPath ? await readDebugLog(input.debugLogPath) : [];\n\n // System Insights(refrain 改善用の分析情報)\n lines.push(...formatSystemInsights(report, debugEntries));\n\n // Debug Log (from --debug-log JSONL file)\n const failedOrdinals = new Set(failedSteps.map((s) => s.ordinal));\n lines.push(...formatDebugLogSections(debugEntries, {\n showFailedStepEvents: true,\n failedOrdinals,\n }));\n\n return lines.join(\"\\n\");\n}\n","/**\n * runbook-executor CLIエントリポイント\n *\n * Usage:\n * npx tsx src/runbook-executor/index.ts \\\n * --runbook ./runbooks/login-flow.yaml \\\n * --headless false\n *\n * npx tsx src/runbook-executor/index.ts \\\n * --runbook ./v2-runbook.yaml \\\n * --secrets ./secrets.json \\\n * --data ./users.csv \\\n * --headless false\n *\n * npx tsx src/runbook-executor/index.ts \\\n * --runbook ./runbooks/login-flow.yaml \\\n * --self-heal \\\n * --notify slack\n */\n\nimport { parseArgs } from \"./config\";\nimport { initModel } from \"../harness/ai-model\";\nimport {\n resolvePlan,\n getApiKey,\n enforceFeatureGates,\n validateStepLimit,\n validateBatchLimit,\n formatPlanLabel,\n} from \"../plan\";\nimport { globalMetrics } from \"../harness/ai-metrics\";\nimport { loadAndLogRunbook } from \"./yaml-loader\";\nimport { execute } from \"./executor\";\nimport { printReport, printBatchReport } from \"./reporter\";\nimport { planExecution, displayPlan, confirmPlan } from \"./execution-planner\";\nimport { RuntimeStore } from \"../context/runtime-store\";\nimport { InMemoryDataStore } from \"../context/data-store\";\nimport { DownloadManager } from \"../context/download-manager\";\nimport { loadCache, saveCache } from \"../harness/selector-cache\";\nimport { executeBatch, loadDataFile } from \"./batch-runner\";\nimport { createConfirmationProvider } from \"../approval\";\nimport { createNotificationProvider, safeNotify } from \"../notification\";\nimport { SharedChatBot, loadChatConfig } from \"../messaging\";\nimport { forwardReportToSlack } from \"../notification/report-forwarder\";\nimport { initBuiltinSkills, createSkills } from \"../skills/registry\";\nimport { analyzeDebugResult } from \"./self-heal-analyzer\";\nimport { printDebugReport } from \"./self-heal-reporter\";\nimport { applyExecutorDefaults } from \"./types\";\nimport { intro, outro, log, cancel } from \"../cli/prompts\";\nimport { t } from \"../i18n\";\nimport { cliLoggerFactory } from \"../cli/cli-logger\";\nimport { formatDuration } from \"../cli/format\";\nimport { generateExecutionReportFile } from \"./report-generator\";\nimport type { GenerationContext } from \"./report-generator\";\nimport type { SerializedOption } from \"../cli/options-serializer\";\nimport { serializeExecutorOptions } from \"../cli/options-serializer\";\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nasync function writeReportFile(\n runbookPath: string,\n report: import(\"./types\").ExecutionReport,\n options: {\n errorMessage?: string;\n debugLogPath?: string;\n cliOptions?: SerializedOption[];\n generationContext?: GenerationContext;\n selfHealSuggestions?: import(\"./self-heal-types\").DebugSuggestion[];\n },\n): Promise<string> {\n const reportContent = await generateExecutionReportFile({\n runbookPath,\n report,\n errorMessage: options.errorMessage,\n debugLogPath: options.debugLogPath,\n cliOptions: options.cliOptions,\n generationContext: options.generationContext,\n selfHealSuggestions: options.selfHealSuggestions,\n });\n const reportPath = runbookPath.replace(/\\.\\w+$/, \"-report.md\");\n await mkdir(dirname(reportPath), { recursive: true });\n await writeFile(reportPath, reportContent, \"utf-8\");\n return reportPath;\n}\n\nasync function main() {\n const totalStart = performance.now();\n const config = await parseArgs();\n\n // プラン解決 + プランベースのデフォルト適用 + 機能ゲート\n const apiKey = getApiKey(config.apiKey);\n const tierPlan = await resolvePlan(apiKey, {\n serverUrl: config.apiServerUrl,\n forceRefresh: config.refreshKey,\n });\n config.plan = tierPlan;\n\n // self-heal デフォルト適用 + Plan ゲート(デフォルト + 強制 OFF 統合済み)\n applyExecutorDefaults(config);\n enforceFeatureGates(config, tierPlan);\n\n await initModel(config.aiModelConfig);\n const cliOptions = serializeExecutorOptions(config);\n\n // Chat SDK が必要かどうか判定\n const approvalMode = config.approvalMode ?? \"web\";\n const needsChatBot =\n (approvalMode !== \"web\") || !!config.notifyMode;\n\n // SharedChatBot 生成(必要な場合のみ)\n const sharedBot = needsChatBot\n ? new SharedChatBot(\n loadChatConfig(config.notifyMode ?? (approvalMode as \"slack\" | \"teams\" | \"discord\"), {\n callbackPort: config.callbackPort,\n approvalTimeoutMs: config.approvalTimeoutMs,\n }),\n )\n : undefined;\n\n // 承認プロバイダ生成\n const confirmationProvider = createConfirmationProvider(\n approvalMode,\n sharedBot,\n config.approvalTimeoutMs,\n );\n\n // 通知プロバイダ生成\n const notificationProvider = createNotificationProvider(config.notifyMode, sharedBot);\n\n intro(config.selfHeal ? \"runbook-executor (self-heal)\" : \"runbook-executor\");\n log.info(`Plan: ${formatPlanLabel(tierPlan)}`);\n log.info(`Runbook: ${config.runbookPath}`);\n log.info(`Headless: ${config.headless}`);\n if (config.stealth) {\n log.info(t(\"cli.stealthEnabled\"));\n }\n if (config.proxy) {\n log.info(t(\"cli.proxyEnabled\").replace(\"{proxy}\", config.proxy.replace(/:\\/\\/[^@]+@/, \"://***@\")));\n }\n if (config.selfHeal) {\n log.info(\"Mode: self-heal\");\n log.info(`Max retries: ${config.maxRetries ?? 5}`);\n log.info(`Retry warning threshold: ${config.retryWarningThreshold ?? 3}`);\n log.info(`Selector cache: ${config.enableSelectorCache ? \"enabled\" : \"disabled\"}`);\n log.info(`Agent fallback: ${config.enableAgentFallback ? \"enabled\" : \"disabled\"}`);\n log.info(`Vision fallback: ${config.enableVisionFallback ? \"enabled\" : \"disabled\"}`);\n }\n if (config.stepDelay !== undefined) {\n log.info(`Step delay: ${config.stepDelay}ms`);\n }\n if (config.screenshotDir) {\n log.info(`Screenshots: ${config.screenshotDir}`);\n }\n log.info(`Context: loaded (${config.contextMarkdown.split(\"\\n\").length} lines)`);\n if (config.secrets && Object.keys(config.secrets.values).length > 0) {\n log.info(`Secrets: ${Object.keys(config.secrets.values).length} keys loaded`);\n }\n if (config.skipConfirmation) {\n log.info(`Skip confirmation: true`);\n }\n if (approvalMode !== \"web\") {\n log.info(`Approval mode: ${approvalMode}`);\n }\n if (config.notifyMode) {\n log.info(`Notify: ${config.notifyMode}`);\n }\n if (config.forceReport) {\n log.info(\"Report: forced\");\n }\n\n // CLI 用 Logger / Spinner を生成(executor / batch-runner に注入)\n const cliLogger = cliLoggerFactory.createLogger();\n const cliCreateSpinner = () => cliLoggerFactory.createSpinner();\n\n // YAML 読み込み\n const runbook = await loadAndLogRunbook(config.runbookPath);\n\n // YAML の metadata.skills を CLI --skill で上書き可能\n config.skills = (config.skills && config.skills.length > 0) ? config.skills : runbook.metadata.skills;\n // スキルインスタンス初期化\n let skillInstances: import(\"../skills/types\").Skill[] | undefined;\n if (config.skills && config.skills.length > 0) {\n await initBuiltinSkills();\n skillInstances = createSkills(config.skills);\n log.info(`Skills: ${config.skills.join(\", \")}`);\n }\n\n // ステップ数制限チェック\n validateStepLimit(runbook.steps.length, tierPlan);\n\n // generation context の抽出(executor レポートに埋め込み用)\n const generationContext: GenerationContext = {\n goal: runbook.metadata.goal,\n startUrl: runbook.metadata.startUrl,\n goalAchieved: runbook.metadata.goalAchieved,\n generatedAt: runbook.metadata.generatedAt,\n totalSteps: runbook.metadata.totalSteps,\n notes: runbook.notes,\n };\n\n // セレクタキャッシュの読み込み\n const selectorCache = config.enableSelectorCache\n ? await loadCache(config.runbookPath)\n : null;\n\n // ジョブタイムアウト設定\n const jobTimeoutMs = tierPlan.limits.maxJobDurationMs;\n const abortController = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (Number.isFinite(jobTimeoutMs)) {\n timeoutId = setTimeout(() => abortController.abort(), jobTimeoutMs);\n }\n\n try {\n // プランニング: 事前変数を解決\n const plan = await planExecution(runbook, config);\n\n // データファイル読み込み(バッチモード用)\n let dataRows: Record<string, string>[] | undefined;\n if (config.dataFilePath) {\n dataRows = await loadDataFile(config.dataFilePath);\n validateBatchLimit(dataRows.length, tierPlan);\n log.info(`Data file: ${dataRows.length} rows`);\n }\n\n // プラン表示 + 確認\n displayPlan(plan, runbook, dataRows?.length);\n const confirmed = await confirmPlan();\n if (!confirmed) {\n cancel(t(\"cli.executionCancelled\"));\n process.exit(0);\n }\n\n // RuntimeStore 作成 + 事前変数をシード\n const store = new RuntimeStore();\n store.seed(plan.resolvedVariables.values, plan.resolvedVariables.sensitiveKeys);\n\n if (config.dataFilePath && dataRows) {\n // バッチ実行\n const batchReport = await executeBatch(\n config,\n runbook,\n store,\n dataRows,\n config.reuseSession !== false,\n {\n confirmationProvider,\n selectorCache,\n logger: cliLogger,\n createSpinner: cliCreateSpinner,\n abortSignal: abortController.signal,\n skills: skillInstances,\n },\n );\n\n if (config.selfHeal) {\n printBatchReport(batchReport);\n // 失敗した行のみ個別分析\n for (const row of batchReport.rows) {\n if (row.report.failed > 0 || row.report.aborted) {\n const debugReport = await analyzeDebugResult(\n row.report,\n runbook,\n config.retryWarningThreshold ?? 3,\n config.contextMarkdown,\n );\n log.info(`\\n── ${row.rowLabel} Self-Heal Analysis ──`);\n printDebugReport(debugReport);\n }\n }\n await safeNotify(() => notificationProvider.notifyComplete(batchReport));\n } else {\n printBatchReport(batchReport);\n await safeNotify(() => notificationProvider.notifyComplete(batchReport));\n }\n\n // レポートファイル生成(失敗時は自動、--report 時は常時)\n if (batchReport.failed > 0 || config.forceReport) {\n for (const row of batchReport.rows) {\n if (row.report.failed > 0 || row.report.aborted || config.forceReport) {\n const reportPath = await writeReportFile(config.runbookPath, row.report, {\n debugLogPath: config.debugLogPath,\n cliOptions,\n generationContext,\n });\n log.info(`Report written to: ${reportPath} (${row.rowLabel})`);\n // 社内 Slack にレポートファイルを転送\n await forwardReportToSlack(reportPath, batchReport.runbookTitle ?? row.rowLabel);\n if (!config.forceReport) break; // 失敗時は最初の1行のみ\n }\n }\n }\n\n outro(`Total: ${formatDuration(performance.now() - totalStart)}`);\n if (batchReport.failed > 0) process.exit(1);\n } else {\n // 単発実行\n const dataStore = new InMemoryDataStore();\n const downloadManager = config.outputDir\n ? new DownloadManager(config.outputDir)\n : undefined;\n\n const execStart = performance.now();\n const report = await execute(config, runbook, {\n store,\n confirmationProvider,\n dataStore,\n downloadManager,\n selectorCache,\n logger: cliLogger,\n createSpinner: cliCreateSpinner,\n abortSignal: abortController.signal,\n skills: skillInstances,\n });\n log.info(`Execution completed (${formatDuration(performance.now() - execStart)})`);\n\n // AI メトリクスをレポートに付与\n const metricsSummary = globalMetrics.getSummary();\n if (metricsSummary.totalCalls > 0) {\n report.aiMetrics = metricsSummary;\n }\n\n // メモリデータ出力(JSON + CSV)\n if (dataStore.listCollections().length > 0 && config.outputDir) {\n for (const collection of dataStore.listCollections()) {\n await dataStore.writeToFile(collection, `${config.outputDir}/${collection}.json`, \"json\");\n await dataStore.writeToFile(collection, `${config.outputDir}/${collection}.csv`, \"csv\");\n log.info(`Memory data exported: ${config.outputDir}/${collection}.json, ${config.outputDir}/${collection}.csv`);\n }\n }\n\n // CSVマージ\n if (config.mergeDownloads && downloadManager && downloadManager.getAllDownloadIds().length > 0) {\n const ids = downloadManager.getAllDownloadIds();\n const mergedPath = await downloadManager.mergeCSVFiles(ids, \"merged.csv\");\n log.info(`CSV files merged: ${mergedPath}`);\n }\n\n let selfHealSuggestions: import(\"./self-heal-types\").DebugSuggestion[] | undefined;\n\n if (config.selfHeal) {\n // 自動修正モード: 分析 + デバッグレポート + 失敗時通知\n const analysisStart = performance.now();\n const debugReport = await analyzeDebugResult(\n report,\n runbook,\n config.retryWarningThreshold ?? 3,\n config.contextMarkdown,\n );\n log.info(`Analysis completed (${formatDuration(performance.now() - analysisStart)})`);\n\n printDebugReport(debugReport);\n selfHealSuggestions = debugReport.suggestions;\n\n const hasIssues = report.failed > 0 || report.aborted || debugReport.warningSteps.length > 0;\n if (hasIssues) {\n await safeNotify(() => notificationProvider.notifyDebugFailure?.(debugReport) ?? Promise.resolve());\n }\n } else {\n printReport(report);\n await safeNotify(() => notificationProvider.notifyComplete(report));\n }\n\n // レポートファイル生成(失敗・中断時は自動、--report 時は常時)\n if (report.failed > 0 || report.aborted || config.forceReport) {\n const reportPath = await writeReportFile(config.runbookPath, report, {\n debugLogPath: config.debugLogPath,\n cliOptions,\n generationContext,\n selfHealSuggestions,\n });\n log.info(`Report written to: ${reportPath}`);\n // 社内 Slack にレポートファイルを転送\n await forwardReportToSlack(reportPath, report.runbookTitle);\n }\n\n outro(`Total: ${formatDuration(performance.now() - totalStart)}`);\n if (report.failed > 0 || report.aborted) process.exit(1);\n }\n } finally {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n // セレクタキャッシュの保存\n if (selectorCache) {\n await saveCache(selectorCache);\n }\n await confirmationProvider.dispose?.();\n await notificationProvider.dispose?.();\n await sharedBot?.dispose();\n }\n}\n\nmain().catch((error) => {\n cancel(`Fatal error: ${error instanceof Error ? error.message : String(error)}`);\n if (error instanceof Error && error.stack) {\n console.error(error.stack);\n }\n process.exit(1);\n});\n"],"mappings":"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","names":["msg","p","readFile","readFile","readFile","tag","flattenSteps"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/runbook-generator/index.ts","../../../src/runbook-generator/config.ts","../../../src/runbook-generator/review-editor.ts","../../../src/runbook-generator/report-generator.ts"],"sourcesContent":["/**\n * runbook-generator CLIエントリポイント\n *\n * Usage:\n * npx tsx src/runbook-generator/index.ts \\\n * --url \"https://staging.example.com/login\" \\\n * --goal \"メールアドレスとパスワードでログインしてダッシュボードを表示する\" \\\n * --output ./runbooks/login-flow.yaml\n */\n\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { getModel, initModel, trackedGenerateObject } from \"../harness/ai-model\";\nimport { globalMetrics } from \"../harness/ai-metrics\";\nimport { parseArgs } from \"./config\";\nimport { explore } from \"./explorer\";\nimport { buildRunbookYaml } from \"./runbook-builder\";\nimport { createReviewPrompt, reviewResponseSchema } from \"./prompts\";\nimport { promptReviewEdits } from \"./review-editor\";\nimport { intro, outro, log, cancel, promptText } from \"../cli/prompts\";\nimport { t, tf } from \"../i18n\";\nimport { formatDuration } from \"../cli/format\";\nimport { createDebugLogger } from \"../cli/debug-logger\";\nimport { serializeGeneratorOptions } from \"../cli/options-serializer\";\nimport { generateExplorationReport } from \"./report-generator\";\nimport type { ReviewResult } from \"./types\";\n\nasync function main() {\n const totalStart = performance.now();\n const config = await parseArgs();\n await initModel(config.aiModelConfig);\n const cliOptions = serializeGeneratorOptions(config);\n\n intro(\"runbook-generator\");\n log.info(`URL: ${config.url}`);\n log.info(`Goal: ${config.goal}`);\n log.info(`Output: ${config.output}`);\n log.info(`Max iterations: ${config.maxIterations}`);\n log.info(`Step delay: ${config.stepDelay}ms`);\n log.info(`Headless: ${config.headless}`);\n if (config.skills && config.skills.length > 0) {\n log.info(`Skills: ${config.skills.join(\", \")}`);\n }\n log.info(`Context: loaded (${config.contextMarkdown.split(\"\\n\").length} lines)`);\n log.info(\"--- Context Markdown ---\");\n log.info(config.contextMarkdown);\n log.info(\"--- End Context ---\");\n if (config.secrets && Object.keys(config.secrets.values).length > 0) {\n log.info(`Secrets: ${Object.keys(config.secrets.values).length} keys loaded`);\n }\n\n // 探索実行\n const exploreStart = performance.now();\n const { recordedSteps, goalAchieved, additionalGuidance, interventions, cancelled, error: exploreError } = await explore(config);\n\n log.info(`Steps recorded: ${recordedSteps.length}`);\n log.info(`Goal achieved: ${goalAchieved}`);\n if (cancelled) {\n log.warn(\"Exploration was cancelled by user.\");\n }\n if (interventions.length > 0) {\n log.info(`User interventions: ${interventions.length}`);\n }\n log.info(`Exploration completed (${formatDuration(performance.now() - exploreStart)})`);\n\n // エラー終了時のレポート生成\n if (exploreError) {\n log.error(`Exploration failed: ${exploreError.message}`);\n\n const report = await generateExplorationReport({\n goal: config.goal,\n startUrl: config.url,\n outcome: \"error\",\n userFeedback: \"\",\n recordedSteps,\n interventions,\n debugLogPath: config.debugLogPath,\n errorMessage: exploreError.stack ?? exploreError.message,\n cliOptions,\n aiMetrics: globalMetrics.getSummary(),\n totalDurationMs: Math.round(performance.now() - totalStart),\n });\n\n const reportPath = config.output.replace(/\\.\\w+$/, \"-report.md\");\n await mkdir(dirname(reportPath), { recursive: true });\n await writeFile(reportPath, report, \"utf-8\");\n log.info(`Error report written to: ${reportPath}`);\n\n outro(`Exploration failed. Report: ${reportPath}`);\n process.exit(1);\n }\n\n // キャンセルまたはゴール未達成時のレポート生成\n if (cancelled || !goalAchieved) {\n const userFeedback = await promptText(\n t(\"generator.feedbackPrompt\"),\n { validate: () => undefined },\n );\n\n const report = await generateExplorationReport({\n goal: config.goal,\n startUrl: config.url,\n outcome: cancelled ? \"cancelled\" : \"goal_not_achieved\",\n userFeedback: userFeedback?.trim() ?? \"\",\n recordedSteps,\n interventions,\n debugLogPath: config.debugLogPath,\n cliOptions,\n aiMetrics: globalMetrics.getSummary(),\n totalDurationMs: Math.round(performance.now() - totalStart),\n });\n\n const reportPath = config.output.replace(/\\.\\w+$/, \"-report.md\");\n await mkdir(dirname(reportPath), { recursive: true });\n await writeFile(reportPath, report, \"utf-8\");\n log.info(`Report written to: ${reportPath}`);\n\n if (cancelled) {\n outro(t(\"generator.cancelled\"));\n process.exit(0);\n }\n }\n\n if (recordedSteps.length === 0) {\n log.error(\"No steps recorded. Cannot generate runbook.\");\n process.exit(1);\n }\n\n try {\n // デバッグロガー(AI レビュー用)\n const debugLogger = createDebugLogger({\n filePath: config.debugLogPath,\n console: config.debugConsole,\n });\n\n // AIレビュー: 不要ステップ除外・リスク判定・承認要否\n let reviewResult: ReviewResult | undefined;\n try {\n const reviewStart = performance.now();\n log.step(t(\"generator.aiReviewing\"));\n\n const { system: reviewSystem, userPrompt: reviewUserPrompt } = createReviewPrompt(\n config.goal,\n recordedSteps,\n goalAchieved,\n interventions,\n config.locale,\n );\n\n debugLogger.log({\n phase: \"generator\",\n event: \"ai_review\",\n data: { prompt: `${reviewSystem}\\n---\\n${reviewUserPrompt}`.slice(0, 500) },\n });\n\n const { object } = await trackedGenerateObject(\"review\", {\n model: getModel(\"review\"),\n messages: [\n {\n role: \"system\",\n content: reviewSystem,\n providerOptions: {\n anthropic: { cacheControl: { type: \"ephemeral\" } },\n },\n },\n { role: \"user\", content: reviewUserPrompt },\n ],\n schema: reviewResponseSchema,\n temperature: 0,\n });\n\n reviewResult = object as ReviewResult;\n\n debugLogger.log({\n phase: \"generator\",\n event: \"ai_review\",\n data: {\n parsedResult: reviewResult as unknown as Record<string, unknown>,\n },\n });\n\n const kept = reviewResult!.reviewedSteps.filter((s: { keep: boolean }) => s.keep).length;\n const removed = reviewResult!.reviewedSteps.filter((s: { keep: boolean }) => !s.keep).length;\n\n log.info(`AI review done: ${kept} kept, ${removed} removed (${formatDuration(performance.now() - reviewStart)})`);\n log.info(`Summary: ${reviewResult!.summary}`);\n } catch (error) {\n log.warn(tf(\"generator.aiReviewFailed\", { error: error instanceof Error ? error.message : String(error) }));\n reviewResult = undefined;\n }\n\n // 対話的レビュー反映\n let finalGuidance = additionalGuidance;\n if (reviewResult) {\n const edited = await promptReviewEdits(\n reviewResult,\n recordedSteps,\n additionalGuidance,\n );\n reviewResult = edited.reviewResult;\n finalGuidance = edited.humanGuidance;\n }\n\n // 編集内容の確認ログ\n if (reviewResult) {\n const keptWithConfirm = reviewResult.reviewedSteps\n .filter((s) => s.keep && s.requiresConfirmation)\n .map((s) => `#${s.originalOrdinal}`);\n log.info(`Confirmation required for steps: ${keptWithConfirm.join(\", \") || t(\"common.none\")}`);\n }\n\n // YAML生成\n const yamlStart = performance.now();\n const yaml = buildRunbookYaml({\n goal: config.goal,\n startUrl: config.url,\n recordedSteps,\n goalAchieved,\n stepDelay: config.stepDelay,\n contextMarkdown: config.contextMarkdown,\n reviewResult,\n humanGuidance: finalGuidance,\n interventions,\n skills: config.skills,\n });\n\n // ファイル書き出し\n await mkdir(dirname(config.output), { recursive: true });\n await writeFile(config.output, yaml, \"utf-8\");\n log.info(`YAML generation + write (${formatDuration(performance.now() - yamlStart)})`);\n\n await debugLogger.flush();\n\n log.success(`Runbook written to: ${config.output}`);\n if (!goalAchieved) {\n log.warn(\"Goal was NOT fully achieved. Runbook may be incomplete.\");\n }\n\n // AI メトリクスサマリー\n const metrics = globalMetrics.getSummary();\n if (metrics.totalCalls > 0) {\n const purposeSummary = Object.entries(metrics.byPurpose)\n .map(([p, b]) => `${p}(${b.calls})`)\n .join(\" \");\n log.info(\n `AI Metrics: ${metrics.totalCalls} calls, ` +\n `${metrics.totalInputTokens.toLocaleString()} in / ${metrics.totalOutputTokens.toLocaleString()} out tokens, ` +\n `cache ${(metrics.cacheHitRate * 100).toFixed(1)}%, ` +\n `$${metrics.estimatedCostUsd.toFixed(4)}, ` +\n `${(metrics.totalDurationMs / 1000).toFixed(1)}s — ${purposeSummary}`,\n );\n if (metrics.byModel && Object.keys(metrics.byModel).length > 1) {\n const modelSummary = Object.entries(metrics.byModel)\n .map(([id, b]) => `${id}($${b.estimatedCostUsd.toFixed(4)})`)\n .join(\" \");\n log.info(`Models: ${modelSummary}`);\n }\n }\n\n outro(`Total: ${formatDuration(performance.now() - totalStart)}`);\n } catch (postExploreError) {\n const errorMessage = postExploreError instanceof Error\n ? (postExploreError.stack ?? postExploreError.message)\n : String(postExploreError);\n\n log.error(`Post-exploration phase failed: ${errorMessage}`);\n\n const report = await generateExplorationReport({\n goal: config.goal,\n startUrl: config.url,\n outcome: \"error\",\n userFeedback: \"\",\n recordedSteps,\n interventions,\n debugLogPath: config.debugLogPath,\n errorMessage,\n cliOptions,\n aiMetrics: globalMetrics.getSummary(),\n totalDurationMs: Math.round(performance.now() - totalStart),\n });\n\n const reportPath = config.output.replace(/\\.\\w+$/, \"-report.md\");\n await mkdir(dirname(reportPath), { recursive: true });\n await writeFile(reportPath, report, \"utf-8\");\n log.info(`Error report written to: ${reportPath}`);\n\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n cancel(`Fatal error: ${error instanceof Error ? error.message : String(error)}`);\n if (error instanceof Error && error.stack) {\n console.error(error.stack);\n }\n process.exit(1);\n});\n","/**\n * runbook-generator CLI引数パース\n */\n\nimport { parseArgs as nodeParseArgs } from \"node:util\";\nimport { cancel } from \"../cli/prompts\";\nimport { t, initLocale, getLocale } from \"../i18n\";\nimport { getRawArgs, readContextFile, parseModelConfig } from \"../cli/config-helpers\";\nimport { loadSecrets } from \"../cli/secrets-loader\";\nimport { checkHelpFlag } from \"../cli/help\";\nimport type { GeneratorConfig } from \"./types\";\n\nexport async function parseArgs(): Promise<GeneratorConfig> {\n checkHelpFlag(\"generate\");\n const args = getRawArgs();\n\n const { values } = nodeParseArgs({\n args,\n options: {\n url: { type: \"string\" },\n goal: { type: \"string\" },\n output: { type: \"string\" },\n screenshots: { type: \"string\" },\n context: { type: \"string\" },\n secrets: { type: \"string\" },\n \"max-iterations\": { type: \"string\" },\n \"step-delay\": { type: \"string\" },\n \"stall-check-interval\": { type: \"string\" },\n \"history-window\": { type: \"string\" },\n \"max-failures\": { type: \"string\" },\n \"no-snapshot-filter\": { type: \"boolean\" },\n \"debug-log\": { type: \"string\" },\n debug: { type: \"boolean\" },\n headless: { type: \"string\" },\n model: { type: \"string\" },\n \"model-provider\": { type: \"string\" },\n \"model-base-url\": { type: \"string\" },\n \"model-selector\": { type: \"string\" },\n \"model-extraction\": { type: \"string\" },\n \"model-exploration\": { type: \"string\" },\n \"model-review\": { type: \"string\" },\n \"model-fallback\": { type: \"string\" },\n \"model-exploration-light\": { type: \"string\" },\n \"enable-multi-model\": { type: \"boolean\" },\n video: { type: \"string\" },\n locale: { type: \"string\" },\n stealth: { type: \"boolean\" },\n proxy: { type: \"string\" },\n skill: { type: \"string\" },\n },\n strict: true,\n });\n\n initLocale(values.locale);\n\n if (!values.url) {\n cancel(t(\"cli.urlRequired\"));\n process.exit(1);\n }\n\n if (!values.goal) {\n cancel(t(\"cli.goalRequired\"));\n process.exit(1);\n }\n\n if (!values.output) {\n cancel(t(\"cli.outputRequired\"));\n process.exit(1);\n }\n\n if (!values.context) {\n cancel(t(\"cli.contextRequired\"));\n process.exit(1);\n }\n\n const contextMarkdown = await readContextFile(values.context);\n const secrets = await loadSecrets(values.secrets);\n const aiModelConfig = parseModelConfig(values);\n\n return {\n url: values.url,\n goal: values.goal,\n locale: getLocale(),\n output: values.output,\n screenshotDir: values.screenshots,\n contextMarkdown,\n secrets,\n maxIterations: values[\"max-iterations\"]\n ? Number.parseInt(values[\"max-iterations\"], 10)\n : 20,\n stepDelay: values[\"step-delay\"]\n ? Number.parseInt(values[\"step-delay\"], 10)\n : 500,\n headless: values.headless !== \"false\",\n stallCheckInterval: values[\"stall-check-interval\"]\n ? Number.parseInt(values[\"stall-check-interval\"], 10)\n : 3,\n historyWindow: values[\"history-window\"]\n ? Number.parseInt(values[\"history-window\"], 10)\n : 10,\n maxConsecutiveFailures: values[\"max-failures\"]\n ? Number.parseInt(values[\"max-failures\"], 10)\n : 3,\n snapshotFilter: !values[\"no-snapshot-filter\"],\n debugLogPath: values[\"debug-log\"],\n debugConsole: values.debug ?? false,\n videoDir: values.video,\n aiModelConfig,\n enableMultiModel: values[\"enable-multi-model\"] ?? false,\n stealth: values.stealth ?? false,\n proxy: values.proxy,\n skills: values.skill?.split(\",\").map(s => s.trim()).filter(Boolean),\n };\n}\n","/**\n * AIレビュー結果の対話的編集\n *\n * AIレビュー完了後、YAML書き出し前にユーザーがレビュー内容を確認・修正する。\n */\n\nimport {\n promptSelect,\n promptMultiselect,\n promptText,\n note,\n log,\n} from \"../cli/prompts\";\nimport { t, tf } from \"../i18n\";\nimport type { RecordedStep, ReviewResult, SuggestedCapture } from \"./types\";\n\nexport interface ReviewEditorResult {\n reviewResult: ReviewResult;\n humanGuidance: string[];\n}\n\n/**\n * レビューサマリーのテキストを組み立てる\n */\nfunction buildSummaryText(\n reviewResult: ReviewResult,\n recordedSteps: RecordedStep[],\n humanGuidance: string[],\n): string {\n const lines: string[] = [];\n\n // 保持されるステップ\n const keptSteps = reviewResult.reviewedSteps.filter((s) => s.keep);\n if (keptSteps.length > 0) {\n lines.push(t(\"review.keptSteps\"));\n for (const step of keptSteps) {\n const recorded = recordedSteps.find(\n (r) => r.ordinal === step.originalOrdinal,\n );\n const desc = recorded?.action.description ?? t(\"common.unknown\");\n lines.push(\n ` #${step.originalOrdinal}: ${desc} [risk: ${step.riskLevel}]`,\n );\n }\n }\n\n // 承認が必要なステップ\n const confirmSteps = keptSteps.filter((s) => s.requiresConfirmation);\n lines.push(\"\");\n lines.push(t(\"review.confirmationRequired\"));\n if (confirmSteps.length > 0) {\n for (const step of confirmSteps) {\n const recorded = recordedSteps.find(\n (r) => r.ordinal === step.originalOrdinal,\n );\n const desc = recorded?.action.description ?? t(\"common.unknown\");\n const reason = step.confirmationReason\n ? ` — ${step.confirmationReason}`\n : \"\";\n lines.push(\n ` #${step.originalOrdinal}: ${desc} [risk: ${step.riskLevel}]${reason}`,\n );\n }\n } else {\n lines.push(\" \" + t(\"common.none\"));\n }\n\n // 除外されるステップ\n const removedSteps = reviewResult.reviewedSteps.filter((s) => !s.keep);\n if (removedSteps.length > 0) {\n lines.push(\"\");\n lines.push(t(\"review.removedSteps\"));\n for (const step of removedSteps) {\n const recorded = recordedSteps.find(\n (r) => r.ordinal === step.originalOrdinal,\n );\n const desc = recorded?.action.description ?? t(\"common.unknown\");\n const reason = step.removalReason ?? \"\";\n lines.push(` #${step.originalOrdinal}: ${desc} (理由: ${reason})`);\n }\n }\n\n // キャプチャ\n const captureSteps = recordedSteps.filter(\n (r) => r.action.suggestedCaptures && r.action.suggestedCaptures.length > 0,\n );\n if (captureSteps.length > 0) {\n lines.push(\"\");\n lines.push(t(\"review.capturedValues\"));\n for (const r of captureSteps) {\n for (const c of r.action.suggestedCaptures!) {\n lines.push(\n ` Step #${r.ordinal} → ${c.name} (${c.strategy}${c.pattern ? `: ${c.pattern}` : \"\"})`,\n );\n }\n }\n }\n\n // ノート\n lines.push(\"\");\n lines.push(t(\"review.notes\"));\n if (humanGuidance.length > 0) {\n for (const [i, n] of humanGuidance.entries()) {\n lines.push(` ${tf(\"review.guidancePrefix\", { index: i + 1 })} ${n}`);\n }\n } else {\n lines.push(\" \" + t(\"common.none\"));\n }\n\n // サマリー\n lines.push(\"\");\n lines.push(tf(\"review.summaryLabel\", { summary: reviewResult.summary }));\n\n return lines.join(\"\\n\");\n}\n\nfunction cloneReviewResult(r: ReviewResult): ReviewResult {\n return {\n reviewedSteps: r.reviewedSteps.map((s) => ({ ...s })),\n summary: r.summary,\n };\n}\n\n/**\n * ReviewResult から決定的にノート候補を導出する(追加のAI呼び出しなし)\n */\nfunction deriveSuggestedNotes(\n reviewResult: ReviewResult,\n recordedSteps: RecordedStep[],\n): string[] {\n const suggestions: string[] = [];\n\n // high-risk ステップあり\n const highRiskSteps = reviewResult.reviewedSteps.filter(\n (s) => s.keep && s.riskLevel === \"high\",\n );\n if (highRiskSteps.length > 0) {\n const ordinals = highRiskSteps\n .map((s) => `#${s.originalOrdinal}`)\n .join(\", \");\n suggestions.push(tf(\"review.highRiskNote\", { ordinals }));\n }\n\n // credential 入力あり\n const credentialSteps = recordedSteps.filter(\n (r) => r.action.inputCategory === \"credential\",\n );\n if (credentialSteps.length > 0) {\n suggestions.push(t(\"review.credentialNote\"));\n }\n\n // 多数のステップ除外\n const removedCount = reviewResult.reviewedSteps.filter(\n (s) => !s.keep,\n ).length;\n if (removedCount >= 3) {\n suggestions.push(tf(\"review.removedStepsNote\", { count: removedCount }));\n }\n\n // AIレビュー要約\n if (reviewResult.summary) {\n suggestions.push(`AIレビュー要約: ${reviewResult.summary}`);\n }\n\n return suggestions;\n}\n\n/**\n * 承認要否変更: multiselect チェックボックスで選択\n */\nasync function handleToggleConfirmation(\n reviewResult: ReviewResult,\n recordedSteps: RecordedStep[],\n): Promise<void> {\n const keptSteps = reviewResult.reviewedSteps.filter((s) => s.keep);\n if (keptSteps.length === 0) {\n log.warn(\"保持されるステップがありません。\");\n return;\n }\n\n // AIの推奨値が initialValues にプリセット\n const initialValues = keptSteps\n .filter((s) => s.requiresConfirmation)\n .map((s) => s.originalOrdinal);\n\n const selected = await promptMultiselect<number>(\n t(\"review.selectConfirmSteps\"),\n keptSteps.map((step) => {\n const recorded = recordedSteps.find(\n (r) => r.ordinal === step.originalOrdinal,\n );\n const desc = recorded?.action.description ?? t(\"common.unknown\");\n return {\n value: step.originalOrdinal,\n label: `#${step.originalOrdinal}: ${desc}`,\n hint: `risk: ${step.riskLevel}`,\n };\n }),\n { initialValues },\n );\n\n // 選択結果を反映\n for (const step of keptSteps) {\n step.requiresConfirmation = selected.includes(step.originalOrdinal);\n }\n}\n\n/**\n * ノート編集: AI提案ノート + カスタムノート + 削除\n */\nasync function handleEditNotes(\n humanGuidance: string[],\n reviewResult: ReviewResult,\n recordedSteps: RecordedStep[],\n): Promise<void> {\n const suggestions = deriveSuggestedNotes(reviewResult, recordedSteps);\n\n type NoteAction = \"add_custom\" | \"add_suggested\" | \"delete\";\n const options: { value: NoteAction; label: string; hint?: string }[] = [\n { value: \"add_custom\", label: t(\"review.addCustomNote\") },\n ];\n if (suggestions.length > 0) {\n options.push({\n value: \"add_suggested\",\n label: t(\"review.addSuggestedNote\"),\n hint: `${suggestions.length} ${t(\"common.items\")}`,\n });\n }\n if (humanGuidance.length > 0) {\n options.push({\n value: \"delete\",\n label: t(\"review.deleteNote\"),\n hint: `${humanGuidance.length} ${t(\"common.items\")}`,\n });\n }\n\n const action = await promptSelect<NoteAction>(\n t(\"review.selectNotesAction\"),\n options,\n );\n\n switch (action) {\n case \"add_custom\": {\n const content = await promptText(t(\"review.noteContent\"), {\n validate: (v) => (!v?.trim() ? t(\"review.noteContentRequired\") : undefined),\n });\n humanGuidance.push(content.trim());\n log.success(tf(\"review.notesAdded\", { count: 1 }));\n break;\n }\n case \"add_suggested\": {\n const selected = await promptMultiselect<number>(\n \"追加するノートを選択\",\n suggestions.map((s, i) => ({\n value: i,\n label: s,\n })),\n );\n for (const idx of selected) {\n humanGuidance.push(suggestions[idx]);\n }\n log.success(tf(\"review.notesAdded\", { count: selected.length }));\n break;\n }\n case \"delete\": {\n const toDelete = await promptMultiselect<number>(\n \"削除するノートを選択\",\n humanGuidance.map((g, i) => ({\n value: i,\n label: `${tf(\"review.guidancePrefix\", { index: i + 1 })} ${g}`,\n })),\n );\n // 降順で splice して index がずれないようにする\n for (const idx of [...toDelete].sort((a, b) => b - a)) {\n humanGuidance.splice(idx, 1);\n }\n log.success(tf(\"review.notesDeleted\", { count: toDelete.length }));\n break;\n }\n }\n}\n\n/**\n * ページから取得する値の編集: 各ステップの取得値を accept/reject/add\n */\nasync function handleEditCaptures(\n recordedSteps: RecordedStep[],\n): Promise<void> {\n // 既存キャプチャがあるステップ + キャプチャなしのステップ両方対象\n type CaptureAction = \"accept_all\" | \"reject\" | \"add\";\n const action = await promptSelect<CaptureAction>(\n t(\"review.selectCaptureAction\"),\n [\n { value: \"accept_all\", label: t(\"review.acceptAllCaptures\") },\n { value: \"reject\", label: t(\"review.rejectCaptures\") },\n { value: \"add\", label: t(\"review.addCapture\") },\n ],\n );\n\n switch (action) {\n case \"accept_all\": {\n log.success(t(\"review.allCapturesAccepted\"));\n break;\n }\n case \"reject\": {\n const captureSteps = recordedSteps.filter(\n (r) => r.action.suggestedCaptures && r.action.suggestedCaptures.length > 0,\n );\n if (captureSteps.length === 0) {\n log.warn(t(\"review.noCapturesAvailable\"));\n break;\n }\n const allCaptures: { value: string; label: string }[] = [];\n for (const r of captureSteps) {\n for (const c of r.action.suggestedCaptures!) {\n allCaptures.push({\n value: `${r.ordinal}:${c.name}`,\n label: `Step #${r.ordinal} → ${c.name} (${c.strategy})`,\n });\n }\n }\n const toReject = await promptMultiselect<string>(\n t(\"review.selectCapturesToReject\"),\n allCaptures,\n );\n for (const key of toReject) {\n const [ordStr, name] = key.split(\":\");\n const step = recordedSteps.find((r) => r.ordinal === Number(ordStr));\n if (step?.action.suggestedCaptures) {\n step.action.suggestedCaptures = step.action.suggestedCaptures.filter(\n (c) => c.name !== name,\n );\n }\n }\n log.success(tf(\"review.capturesRejected\", { count: toReject.length }));\n break;\n }\n case \"add\": {\n const ordinalStr = await promptText(t(\"review.captureStepNumber\"), {\n validate: (v) => {\n if (!v?.trim()) return t(\"review.captureStepRequired\");\n if (Number.isNaN(Number(v))) return t(\"review.captureStepNumeric\");\n return undefined;\n },\n });\n const ordinal = Number(ordinalStr);\n const step = recordedSteps.find((r) => r.ordinal === ordinal);\n if (!step) {\n log.warn(tf(\"review.stepNotFound\", { ordinal }));\n break;\n }\n\n const name = await promptText(t(\"review.captureVarName\"), {\n validate: (v) => (!v?.trim() ? t(\"review.captureVarRequired\") : undefined),\n });\n const strategy = await promptSelect<SuggestedCapture[\"strategy\"]>(\n t(\"review.captureStrategy\"),\n [\n { value: \"snapshot\", label: t(\"review.strategySnapshot\") },\n { value: \"url\", label: t(\"review.strategyUrl\") },\n { value: \"ai\", label: t(\"review.strategyAi\") },\n { value: \"expression\", label: t(\"review.strategyExpression\") },\n ],\n );\n\n const newCapture: SuggestedCapture = { name, strategy };\n\n if (strategy === \"snapshot\" || strategy === \"url\") {\n newCapture.pattern = await promptText(t(\"review.regexPattern\"));\n } else if (strategy === \"ai\") {\n newCapture.prompt = await promptText(t(\"review.aiExtractionPrompt\"));\n } else if (strategy === \"expression\") {\n newCapture.expression = await promptText(t(\"review.templateExpression\"));\n }\n\n if (!step.action.suggestedCaptures) {\n step.action.suggestedCaptures = [];\n }\n step.action.suggestedCaptures.push(newCapture);\n log.success(tf(\"review.captureAdded\", { ordinal, name }));\n break;\n }\n }\n}\n\n/**\n * AIレビュー結果をユーザーに提示し、対話的に修正を受け付ける。\n * 修正済みの ReviewResult と humanGuidance を返す。\n */\nexport async function promptReviewEdits(\n reviewResult: ReviewResult,\n recordedSteps: RecordedStep[],\n humanGuidance: string[],\n): Promise<ReviewEditorResult> {\n const edited = cloneReviewResult(reviewResult);\n const editedGuidance = [...humanGuidance];\n\n while (true) {\n // サマリー表示\n const summaryText = buildSummaryText(edited, recordedSteps, editedGuidance);\n note(summaryText, t(\"review.reviewResult\"));\n\n type MenuAction = \"confirm\" | \"toggle_confirmation\" | \"edit_captures\" | \"edit_notes\";\n const hasCaptureSteps = recordedSteps.some(\n (r) => r.action.suggestedCaptures && r.action.suggestedCaptures.length > 0,\n );\n const menuOptions: { value: MenuAction; label: string; hint?: string }[] = [\n { value: \"confirm\", label: t(\"review.confirm\"), hint: t(\"review.confirmHint\") },\n {\n value: \"toggle_confirmation\",\n label: t(\"review.toggleConfirmation\"),\n hint: \"multiselect\",\n },\n ...(hasCaptureSteps\n ? [\n {\n value: \"edit_captures\" as const,\n label: t(\"review.editCaptures\"),\n hint: t(\"review.editCapturesHint\"),\n },\n ]\n : []),\n { value: \"edit_notes\", label: t(\"review.editNotes\") },\n ];\n const action = await promptSelect<MenuAction>(\n t(\"review.selectAction\"),\n menuOptions,\n );\n\n if (action === \"confirm\") {\n break;\n }\n\n switch (action) {\n case \"toggle_confirmation\":\n await handleToggleConfirmation(edited, recordedSteps);\n break;\n case \"edit_captures\":\n await handleEditCaptures(recordedSteps);\n break;\n case \"edit_notes\":\n await handleEditNotes(editedGuidance, edited, recordedSteps);\n break;\n }\n }\n\n return {\n reviewResult: edited,\n humanGuidance: editedGuidance,\n };\n}\n","/**\n * report-generator — 探索キャンセル/失敗時のレポート生成\n *\n * 探索が中断・失敗した際に、実行ログ・ステップ・ユーザーフィードバックを\n * Markdown 形式のレポートとして集約する。\n * コーディングエージェントに渡す素材として利用する。\n */\n\nimport type { RecordedStep, InterventionRecord } from \"./types\";\nimport type { SerializedOption } from \"../cli/options-serializer\";\nimport type { AIMetricsSummary } from \"../harness/ai-metrics\";\nimport { renderOptionsMarkdown } from \"../cli/options-serializer\";\nimport {\n readDebugLog,\n formatAiMetricsSection,\n formatRuntimeEnvironment,\n formatFailureCategoryDistribution,\n formatPerformanceBottlenecks,\n formatDebugLogSections,\n type ReportableStep,\n} from \"../harness/report-sections\";\n\nexport interface ExplorationReportInput {\n goal: string;\n startUrl: string;\n outcome: \"cancelled\" | \"goal_achieved\" | \"goal_not_achieved\" | \"error\";\n userFeedback: string;\n recordedSteps: RecordedStep[];\n interventions: InterventionRecord[];\n debugLogPath?: string;\n errorMessage?: string;\n /** CLI オプション(レポートに記録用) */\n cliOptions?: SerializedOption[];\n /** AI メトリクス */\n aiMetrics?: AIMetricsSummary;\n /** 探索全体の所要時間(ms) */\n totalDurationMs?: number;\n}\n\nfunction formatOutcome(outcome: ExplorationReportInput[\"outcome\"]): string {\n switch (outcome) {\n case \"cancelled\":\n return \"Cancelled by user\";\n case \"goal_achieved\":\n return \"Goal achieved\";\n case \"goal_not_achieved\":\n return \"Goal not achieved\";\n case \"error\":\n return \"Error\";\n }\n}\n\n/** RecordedStep を ReportableStep に変換する */\nfunction toReportableSteps(steps: RecordedStep[]): ReportableStep[] {\n return steps.map((s) => ({\n ordinal: s.ordinal + 1,\n description: `${s.action.action}: ${s.action.description}`,\n status: s.success ? \"success\" as const : \"failed\" as const,\n durationMs: s.durationMs ?? 0,\n error: s.error,\n failureCategory: s.failureCategory,\n }));\n}\n\nexport async function generateExplorationReport(\n input: ExplorationReportInput,\n): Promise<string> {\n const lines: string[] = [];\n\n // Header\n lines.push(\"# Exploration Report\");\n lines.push(\"\");\n\n // Session Info\n lines.push(\"## Session Info\");\n lines.push(`- **Date**: ${new Date().toISOString()}`);\n lines.push(`- **Goal**: ${input.goal}`);\n lines.push(`- **Start URL**: ${input.startUrl}`);\n lines.push(`- **Outcome**: ${formatOutcome(input.outcome)}`);\n lines.push(\"\");\n\n // CLI Options\n if (input.cliOptions && input.cliOptions.length > 0) {\n lines.push(\"## CLI Options\");\n lines.push(...renderOptionsMarkdown(input.cliOptions));\n lines.push(\"\");\n }\n\n // User Feedback\n lines.push(\"## User Feedback\");\n if (input.userFeedback) {\n lines.push(input.userFeedback);\n } else {\n lines.push(\"(No feedback provided)\");\n }\n lines.push(\"\");\n\n // Error Details\n if (input.errorMessage) {\n lines.push(\"## Error Details\");\n lines.push(\"```\");\n lines.push(input.errorMessage);\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n // Execution Summary\n const successCount = input.recordedSteps.filter((s) => s.success).length;\n const failedCount = input.recordedSteps.filter((s) => !s.success).length;\n lines.push(\"## Execution Summary\");\n lines.push(`- **Total Steps**: ${input.recordedSteps.length}`);\n lines.push(`- **Successful**: ${successCount}`);\n lines.push(`- **Failed**: ${failedCount}`);\n lines.push(`- **Interventions**: ${input.interventions.length}`);\n if (input.totalDurationMs !== undefined) {\n lines.push(`- **Duration**: ${input.totalDurationMs}ms`);\n }\n lines.push(\"\");\n\n // Recorded Steps\n if (input.recordedSteps.length > 0) {\n lines.push(\"## Recorded Steps\");\n for (const step of input.recordedSteps) {\n const tag = step.success ? \"DONE\" : \"FAILED\";\n const errorInfo =\n !step.success && step.error ? ` — Error: ${step.error}` : \"\";\n const category = step.failureCategory\n ? ` [${step.failureCategory}]`\n : \"\";\n const duration = step.durationMs !== undefined ? ` (${step.durationMs}ms)` : \"\";\n lines.push(\n `${step.ordinal + 1}. [${tag}] ${step.action.action}: ${step.action.description} (URL: ${step.url})${duration}${errorInfo}${category}`,\n );\n }\n lines.push(\"\");\n }\n\n // Interventions\n if (input.interventions.length > 0) {\n lines.push(\"## Interventions\");\n for (const iv of input.interventions) {\n lines.push(\n `- **Step ${iv.stepIndex}** (${iv.timestamp}): \"${iv.userInstruction}\" (URL: ${iv.url})`,\n );\n }\n lines.push(\"\");\n }\n\n // デバッグログ読み込み(System Insights と Debug Log セクションで共有)\n const debugEntries = input.debugLogPath ? await readDebugLog(input.debugLogPath) : [];\n\n // System Insights(共通モジュール利用)\n const reportableSteps = toReportableSteps(input.recordedSteps);\n const hasInsights =\n (input.aiMetrics && input.aiMetrics.totalCalls > 0) ||\n reportableSteps.some((s) => s.status === \"failed\") ||\n reportableSteps.some((s) => s.durationMs > 3000) ||\n debugEntries.length > 0;\n\n if (hasInsights) {\n lines.push(\"## System Insights\");\n lines.push(\"\");\n lines.push(\"> refrain の機能改善・バグ修正のための分析情報\");\n lines.push(\"\");\n\n lines.push(...formatRuntimeEnvironment());\n\n if (input.aiMetrics && input.aiMetrics.totalCalls > 0) {\n lines.push(...formatAiMetricsSection(input.aiMetrics));\n }\n\n const failedSteps = reportableSteps.filter((s) => s.status === \"failed\");\n lines.push(...formatFailureCategoryDistribution(failedSteps));\n lines.push(...formatPerformanceBottlenecks(reportableSteps));\n }\n\n // Debug Log(共通モジュール利用)\n lines.push(...formatDebugLogSections(debugEntries));\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
RunbookStore
|
|
4
|
-
} from "./chunk-WEYR56ZN.js";
|
|
5
|
-
import "./chunk-Z33FCOTZ.js";
|
|
6
|
-
import "./chunk-CLYJHKPY.js";
|
|
7
|
-
import "./chunk-2H7UOFLK.js";
|
|
8
|
-
export {
|
|
9
|
-
RunbookStore
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=runbook-store-G5GUOWRR.js.map
|