@refrainai/cli 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/ai-model-FM6GWCID.js +37 -0
  2. package/dist/ai-model-FM6GWCID.js.map +1 -0
  3. package/dist/chunk-2BVDAJZT.js +236 -0
  4. package/dist/chunk-2BVDAJZT.js.map +1 -0
  5. package/dist/chunk-2H7UOFLK.js +11 -0
  6. package/dist/chunk-2H7UOFLK.js.map +1 -0
  7. package/dist/chunk-7UCVPKD4.js +902 -0
  8. package/dist/chunk-7UCVPKD4.js.map +1 -0
  9. package/dist/chunk-AG3CFMYU.js +36 -0
  10. package/dist/chunk-AG3CFMYU.js.map +1 -0
  11. package/dist/chunk-CLYJHKPY.js +1131 -0
  12. package/dist/chunk-CLYJHKPY.js.map +1 -0
  13. package/dist/chunk-D5SI2PHK.js +74 -0
  14. package/dist/chunk-D5SI2PHK.js.map +1 -0
  15. package/dist/chunk-DJVUITRB.js +9084 -0
  16. package/dist/chunk-DJVUITRB.js.map +1 -0
  17. package/dist/chunk-H47NWH7N.js +4427 -0
  18. package/dist/chunk-H47NWH7N.js.map +1 -0
  19. package/dist/chunk-HQDXLWAY.js +109 -0
  20. package/dist/chunk-HQDXLWAY.js.map +1 -0
  21. package/dist/chunk-IGFCYKHC.js +1974 -0
  22. package/dist/chunk-IGFCYKHC.js.map +1 -0
  23. package/dist/chunk-RT664YIO.js +245 -0
  24. package/dist/chunk-RT664YIO.js.map +1 -0
  25. package/dist/chunk-RYIJPYM3.js +164 -0
  26. package/dist/chunk-RYIJPYM3.js.map +1 -0
  27. package/dist/chunk-TDSM3UXI.js +40 -0
  28. package/dist/chunk-TDSM3UXI.js.map +1 -0
  29. package/dist/chunk-UGPXCQY3.js +778 -0
  30. package/dist/chunk-UGPXCQY3.js.map +1 -0
  31. package/dist/chunk-VPK2MQAZ.js +589 -0
  32. package/dist/chunk-VPK2MQAZ.js.map +1 -0
  33. package/dist/chunk-WEYR56ZN.js +953 -0
  34. package/dist/chunk-WEYR56ZN.js.map +1 -0
  35. package/dist/chunk-XMFCXPYU.js +275 -0
  36. package/dist/chunk-XMFCXPYU.js.map +1 -0
  37. package/dist/chunk-Z33FCOTZ.js +251 -0
  38. package/dist/chunk-Z33FCOTZ.js.map +1 -0
  39. package/dist/cli.js +59 -0
  40. package/dist/cli.js.map +1 -0
  41. package/dist/compose-MTSIJY5D.js +547 -0
  42. package/dist/compose-MTSIJY5D.js.map +1 -0
  43. package/dist/config-ZSUNCFXR.js +9 -0
  44. package/dist/config-ZSUNCFXR.js.map +1 -0
  45. package/dist/fix-runbook-ZSBOTLC2.js +294 -0
  46. package/dist/fix-runbook-ZSBOTLC2.js.map +1 -0
  47. package/dist/google-sheets-DRWIVEVC.js +482 -0
  48. package/dist/google-sheets-DRWIVEVC.js.map +1 -0
  49. package/dist/registry-LZLYTNDJ.js +17 -0
  50. package/dist/registry-LZLYTNDJ.js.map +1 -0
  51. package/dist/runbook-data-helpers-KRR2SH76.js +16 -0
  52. package/dist/runbook-data-helpers-KRR2SH76.js.map +1 -0
  53. package/dist/runbook-executor-K7T6RJWJ.js +1480 -0
  54. package/dist/runbook-executor-K7T6RJWJ.js.map +1 -0
  55. package/dist/runbook-generator-MPXJBQ5N.js +800 -0
  56. package/dist/runbook-generator-MPXJBQ5N.js.map +1 -0
  57. package/dist/runbook-schema-3T6TP3JJ.js +35 -0
  58. package/dist/runbook-schema-3T6TP3JJ.js.map +1 -0
  59. package/dist/runbook-store-G5GUOWRR.js +11 -0
  60. package/dist/runbook-store-G5GUOWRR.js.map +1 -0
  61. package/dist/schema-5G6UQSPT.js +91 -0
  62. package/dist/schema-5G6UQSPT.js.map +1 -0
  63. package/dist/server-AG3LXQBI.js +8778 -0
  64. package/dist/server-AG3LXQBI.js.map +1 -0
  65. package/dist/tenant-ai-config-QPFEJUVJ.js +14 -0
  66. package/dist/tenant-ai-config-QPFEJUVJ.js.map +1 -0
  67. package/dist/yaml-patcher-VGUS2JGH.js +15 -0
  68. package/dist/yaml-patcher-VGUS2JGH.js.map +1 -0
  69. package/package.json +37 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/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"]}