@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.
Files changed (83) hide show
  1. package/dist/{ai-model-FM6GWCID.js → ai-model-DP5PKGM6.js} +2 -2
  2. package/dist/{chunk-IGFCYKHC.js → chunk-5CKPPEYP.js} +262 -305
  3. package/dist/chunk-5CKPPEYP.js.map +1 -0
  4. package/dist/{chunk-7UCVPKD4.js → chunk-6FGCPMBU.js} +34 -74
  5. package/dist/chunk-6FGCPMBU.js.map +1 -0
  6. package/dist/{chunk-2BVDAJZT.js → chunk-A5X2VF5G.js} +9 -6
  7. package/dist/chunk-A5X2VF5G.js.map +1 -0
  8. package/dist/{chunk-H47NWH7N.js → chunk-AOCGSFRM.js} +611 -73
  9. package/dist/chunk-AOCGSFRM.js.map +1 -0
  10. package/dist/{chunk-CLYJHKPY.js → chunk-CMWLFQXD.js} +43 -42
  11. package/dist/chunk-CMWLFQXD.js.map +1 -0
  12. package/dist/chunk-GC7I5SGK.js +1146 -0
  13. package/dist/chunk-GC7I5SGK.js.map +1 -0
  14. package/dist/{chunk-WEYR56ZN.js → chunk-HHRHHFSK.js} +4 -4
  15. package/dist/chunk-IGJNT457.js +30 -0
  16. package/dist/chunk-IGJNT457.js.map +1 -0
  17. package/dist/{chunk-UGPXCQY3.js → chunk-KFNW4XR2.js} +13 -4
  18. package/dist/chunk-KFNW4XR2.js.map +1 -0
  19. package/dist/{chunk-RT664YIO.js → chunk-LZDZGI4M.js} +3 -1
  20. package/dist/chunk-LZDZGI4M.js.map +1 -0
  21. package/dist/{chunk-RYIJPYM3.js → chunk-MYITSQYV.js} +25 -8
  22. package/dist/chunk-MYITSQYV.js.map +1 -0
  23. package/dist/chunk-NRKZJVPE.js +74 -0
  24. package/dist/chunk-NRKZJVPE.js.map +1 -0
  25. package/dist/chunk-RBZK7T76.js +349 -0
  26. package/dist/chunk-RBZK7T76.js.map +1 -0
  27. package/dist/{chunk-HQDXLWAY.js → chunk-SDV3X5UN.js} +2 -2
  28. package/dist/{chunk-Z33FCOTZ.js → chunk-VVXNFUPL.js} +4 -2
  29. package/dist/chunk-VVXNFUPL.js.map +1 -0
  30. package/dist/chunk-YTVEYQGA.js +64 -0
  31. package/dist/chunk-YTVEYQGA.js.map +1 -0
  32. package/dist/{chunk-DJVUITRB.js → chunk-ZEBQWBEU.js} +898 -1135
  33. package/dist/chunk-ZEBQWBEU.js.map +1 -0
  34. package/dist/cli.js +5 -5
  35. package/dist/{compose-MTSIJY5D.js → compose-AVX5RU67.js} +9 -7
  36. package/dist/{compose-MTSIJY5D.js.map → compose-AVX5RU67.js.map} +1 -1
  37. package/dist/extraction-prompt-VDCKIFLB.js +17 -0
  38. package/dist/extraction-prompt-VDCKIFLB.js.map +1 -0
  39. package/dist/{fix-runbook-ZSBOTLC2.js → fix-runbook-6L5ZMA5G.js} +12 -10
  40. package/dist/{fix-runbook-ZSBOTLC2.js.map → fix-runbook-6L5ZMA5G.js.map} +1 -1
  41. package/dist/prompts-AGUYYIOM.js +13 -0
  42. package/dist/runbook-builder-2ZLE2AEO.js +11 -0
  43. package/dist/{runbook-data-helpers-KRR2SH76.js → runbook-data-helpers-5UAO65TZ.js} +3 -3
  44. package/dist/{runbook-executor-K7T6RJWJ.js → runbook-executor-OJXJTN6A.js} +41 -444
  45. package/dist/runbook-executor-OJXJTN6A.js.map +1 -0
  46. package/dist/{runbook-generator-MPXJBQ5N.js → runbook-generator-UIHWBEYC.js} +61 -136
  47. package/dist/runbook-generator-UIHWBEYC.js.map +1 -0
  48. package/dist/{runbook-schema-3T6TP3JJ.js → runbook-schema-X7DW725O.js} +2 -2
  49. package/dist/runbook-store-S24PXIHD.js +11 -0
  50. package/dist/{schema-5G6UQSPT.js → schema-XFSD5EWN.js} +2 -2
  51. package/dist/{server-AG3LXQBI.js → server-MULT5ZWG.js} +1176 -128
  52. package/dist/server-MULT5ZWG.js.map +1 -0
  53. package/dist/{tenant-ai-config-QPFEJUVJ.js → tenant-ai-config-4NHKRW7O.js} +4 -4
  54. package/dist/tenant-ai-config-4NHKRW7O.js.map +1 -0
  55. package/dist/yaml-patcher-GOCLYKZZ.js +18 -0
  56. package/dist/yaml-patcher-GOCLYKZZ.js.map +1 -0
  57. package/package.json +3 -2
  58. package/dist/chunk-2BVDAJZT.js.map +0 -1
  59. package/dist/chunk-7UCVPKD4.js.map +0 -1
  60. package/dist/chunk-CLYJHKPY.js.map +0 -1
  61. package/dist/chunk-DJVUITRB.js.map +0 -1
  62. package/dist/chunk-H47NWH7N.js.map +0 -1
  63. package/dist/chunk-IGFCYKHC.js.map +0 -1
  64. package/dist/chunk-RT664YIO.js.map +0 -1
  65. package/dist/chunk-RYIJPYM3.js.map +0 -1
  66. package/dist/chunk-UGPXCQY3.js.map +0 -1
  67. package/dist/chunk-VPK2MQAZ.js +0 -589
  68. package/dist/chunk-VPK2MQAZ.js.map +0 -1
  69. package/dist/chunk-Z33FCOTZ.js.map +0 -1
  70. package/dist/runbook-executor-K7T6RJWJ.js.map +0 -1
  71. package/dist/runbook-generator-MPXJBQ5N.js.map +0 -1
  72. package/dist/runbook-store-G5GUOWRR.js +0 -11
  73. package/dist/server-AG3LXQBI.js.map +0 -1
  74. package/dist/yaml-patcher-VGUS2JGH.js +0 -15
  75. /package/dist/{ai-model-FM6GWCID.js.map → ai-model-DP5PKGM6.js.map} +0 -0
  76. /package/dist/{chunk-WEYR56ZN.js.map → chunk-HHRHHFSK.js.map} +0 -0
  77. /package/dist/{chunk-HQDXLWAY.js.map → chunk-SDV3X5UN.js.map} +0 -0
  78. /package/dist/{runbook-data-helpers-KRR2SH76.js.map → prompts-AGUYYIOM.js.map} +0 -0
  79. /package/dist/{runbook-schema-3T6TP3JJ.js.map → runbook-builder-2ZLE2AEO.js.map} +0 -0
  80. /package/dist/{runbook-store-G5GUOWRR.js.map → runbook-data-helpers-5UAO65TZ.js.map} +0 -0
  81. /package/dist/{schema-5G6UQSPT.js.map → runbook-schema-X7DW725O.js.map} +0 -0
  82. /package/dist/{tenant-ai-config-QPFEJUVJ.js.map → runbook-store-S24PXIHD.js.map} +0 -0
  83. /package/dist/{yaml-patcher-VGUS2JGH.js.map → schema-XFSD5EWN.js.map} +0 -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/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 yes: { type: \"boolean\", short: \"y\" },\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.yes ?? 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 { InMemoryDataStore } from \"../context/data-store\";\nimport { DownloadManager } from \"../context/download-manager\";\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 // 行ごとに DataStore / DownloadManager を作成\n const rowDataStore = new InMemoryDataStore();\n const rowDownloadManager = config.outputDir\n ? new DownloadManager(config.outputDir)\n : undefined;\n\n const report = await execute(rowConfig, runbook, {\n store: rowStore,\n browser: sharedBrowser,\n dataStore: rowDataStore,\n downloadManager: rowDownloadManager,\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 * 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(\"Yes mode: 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 if (!config.skipConfirmation) {\n const confirmed = await confirmPlan();\n if (!confirmed) {\n cancel(t(\"cli.executionCancelled\"));\n process.exit(0);\n }\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"]}
@@ -1,54 +1,55 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- buildRunbookYaml,
4
- createReviewPrompt,
5
3
  explore,
6
- reviewResponseSchema
7
- } from "./chunk-IGFCYKHC.js";
4
+ generateExplorationReport,
5
+ generateGenerationReportFile
6
+ } from "./chunk-5CKPPEYP.js";
8
7
  import {
9
- formatAiMetricsSection,
10
- formatDebugLogSections,
11
- formatFailureCategoryDistribution,
12
- formatPerformanceBottlenecks,
13
- formatRuntimeEnvironment,
14
- readDebugLog,
15
- renderOptionsMarkdown,
8
+ createDebugLogger,
9
+ formatDuration,
10
+ loadSecrets,
16
11
  serializeGeneratorOptions
17
- } from "./chunk-VPK2MQAZ.js";
12
+ } from "./chunk-ZEBQWBEU.js";
18
13
  import {
19
14
  checkHelpFlag,
20
15
  getRawArgs,
21
16
  parseModelConfig,
22
17
  readContextFile
23
- } from "./chunk-2BVDAJZT.js";
24
- import {
25
- createDebugLogger,
26
- formatDuration,
27
- loadSecrets
28
- } from "./chunk-DJVUITRB.js";
29
- import "./chunk-XMFCXPYU.js";
30
- import "./chunk-AG3CFMYU.js";
18
+ } from "./chunk-A5X2VF5G.js";
31
19
  import {
32
20
  cancel,
33
- getLocale,
34
- initLocale,
35
21
  intro,
36
22
  log,
37
23
  note,
38
24
  outro,
39
25
  promptMultiselect,
40
26
  promptSelect,
41
- promptText,
42
- t,
43
- tf
44
- } from "./chunk-7UCVPKD4.js";
27
+ promptText
28
+ } from "./chunk-NRKZJVPE.js";
45
29
  import {
46
30
  getModel,
47
31
  globalMetrics,
48
32
  initModel,
49
33
  trackedGenerateObject
50
- } from "./chunk-UGPXCQY3.js";
51
- import "./chunk-RT664YIO.js";
34
+ } from "./chunk-KFNW4XR2.js";
35
+ import "./chunk-XMFCXPYU.js";
36
+ import "./chunk-AG3CFMYU.js";
37
+ import {
38
+ buildRunbookYaml
39
+ } from "./chunk-RBZK7T76.js";
40
+ import "./chunk-YTVEYQGA.js";
41
+ import "./chunk-LZDZGI4M.js";
42
+ import {
43
+ createReviewPrompt,
44
+ reviewResponseSchema
45
+ } from "./chunk-IGJNT457.js";
46
+ import "./chunk-GC7I5SGK.js";
47
+ import {
48
+ getLocale,
49
+ initLocale,
50
+ t,
51
+ tf
52
+ } from "./chunk-6FGCPMBU.js";
52
53
  import "./chunk-2H7UOFLK.js";
53
54
 
54
55
  // src/runbook-generator/index.ts
@@ -92,7 +93,8 @@ async function parseArgs() {
92
93
  locale: { type: "string" },
93
94
  stealth: { type: "boolean" },
94
95
  proxy: { type: "string" },
95
- skill: { type: "string" }
96
+ skill: { type: "string" },
97
+ report: { type: "boolean" }
96
98
  },
97
99
  strict: true
98
100
  });
@@ -138,7 +140,8 @@ async function parseArgs() {
138
140
  enableMultiModel: values["enable-multi-model"] ?? false,
139
141
  stealth: values.stealth ?? false,
140
142
  proxy: values.proxy,
141
- skills: values.skill?.split(",").map((s) => s.trim()).filter(Boolean)
143
+ skills: values.skill?.split(",").map((s) => s.trim()).filter(Boolean),
144
+ forceReport: values.report ?? false
142
145
  };
143
146
  }
144
147
 
@@ -475,111 +478,6 @@ async function promptReviewEdits(reviewResult, recordedSteps, humanGuidance) {
475
478
  };
476
479
  }
477
480
 
478
- // src/runbook-generator/report-generator.ts
479
- function formatOutcome(outcome) {
480
- switch (outcome) {
481
- case "cancelled":
482
- return "Cancelled by user";
483
- case "goal_achieved":
484
- return "Goal achieved";
485
- case "goal_not_achieved":
486
- return "Goal not achieved";
487
- case "error":
488
- return "Error";
489
- }
490
- }
491
- function toReportableSteps(steps) {
492
- return steps.map((s) => ({
493
- ordinal: s.ordinal + 1,
494
- description: `${s.action.action}: ${s.action.description}`,
495
- status: s.success ? "success" : "failed",
496
- durationMs: s.durationMs ?? 0,
497
- error: s.error,
498
- failureCategory: s.failureCategory
499
- }));
500
- }
501
- async function generateExplorationReport(input) {
502
- const lines = [];
503
- lines.push("# Exploration Report");
504
- lines.push("");
505
- lines.push("## Session Info");
506
- lines.push(`- **Date**: ${(/* @__PURE__ */ new Date()).toISOString()}`);
507
- lines.push(`- **Goal**: ${input.goal}`);
508
- lines.push(`- **Start URL**: ${input.startUrl}`);
509
- lines.push(`- **Outcome**: ${formatOutcome(input.outcome)}`);
510
- lines.push("");
511
- if (input.cliOptions && input.cliOptions.length > 0) {
512
- lines.push("## CLI Options");
513
- lines.push(...renderOptionsMarkdown(input.cliOptions));
514
- lines.push("");
515
- }
516
- lines.push("## User Feedback");
517
- if (input.userFeedback) {
518
- lines.push(input.userFeedback);
519
- } else {
520
- lines.push("(No feedback provided)");
521
- }
522
- lines.push("");
523
- if (input.errorMessage) {
524
- lines.push("## Error Details");
525
- lines.push("```");
526
- lines.push(input.errorMessage);
527
- lines.push("```");
528
- lines.push("");
529
- }
530
- const successCount = input.recordedSteps.filter((s) => s.success).length;
531
- const failedCount = input.recordedSteps.filter((s) => !s.success).length;
532
- lines.push("## Execution Summary");
533
- lines.push(`- **Total Steps**: ${input.recordedSteps.length}`);
534
- lines.push(`- **Successful**: ${successCount}`);
535
- lines.push(`- **Failed**: ${failedCount}`);
536
- lines.push(`- **Interventions**: ${input.interventions.length}`);
537
- if (input.totalDurationMs !== void 0) {
538
- lines.push(`- **Duration**: ${input.totalDurationMs}ms`);
539
- }
540
- lines.push("");
541
- if (input.recordedSteps.length > 0) {
542
- lines.push("## Recorded Steps");
543
- for (const step of input.recordedSteps) {
544
- const tag = step.success ? "DONE" : "FAILED";
545
- const errorInfo = !step.success && step.error ? ` \u2014 Error: ${step.error}` : "";
546
- const category = step.failureCategory ? ` [${step.failureCategory}]` : "";
547
- const duration = step.durationMs !== void 0 ? ` (${step.durationMs}ms)` : "";
548
- lines.push(
549
- `${step.ordinal + 1}. [${tag}] ${step.action.action}: ${step.action.description} (URL: ${step.url})${duration}${errorInfo}${category}`
550
- );
551
- }
552
- lines.push("");
553
- }
554
- if (input.interventions.length > 0) {
555
- lines.push("## Interventions");
556
- for (const iv of input.interventions) {
557
- lines.push(
558
- `- **Step ${iv.stepIndex}** (${iv.timestamp}): "${iv.userInstruction}" (URL: ${iv.url})`
559
- );
560
- }
561
- lines.push("");
562
- }
563
- const debugEntries = input.debugLogPath ? await readDebugLog(input.debugLogPath) : [];
564
- const reportableSteps = toReportableSteps(input.recordedSteps);
565
- const hasInsights = input.aiMetrics && input.aiMetrics.totalCalls > 0 || reportableSteps.some((s) => s.status === "failed") || reportableSteps.some((s) => s.durationMs > 3e3) || debugEntries.length > 0;
566
- if (hasInsights) {
567
- lines.push("## System Insights");
568
- lines.push("");
569
- lines.push("> refrain \u306E\u6A5F\u80FD\u6539\u5584\u30FB\u30D0\u30B0\u4FEE\u6B63\u306E\u305F\u3081\u306E\u5206\u6790\u60C5\u5831");
570
- lines.push("");
571
- lines.push(...formatRuntimeEnvironment());
572
- if (input.aiMetrics && input.aiMetrics.totalCalls > 0) {
573
- lines.push(...formatAiMetricsSection(input.aiMetrics));
574
- }
575
- const failedSteps = reportableSteps.filter((s) => s.status === "failed");
576
- lines.push(...formatFailureCategoryDistribution(failedSteps));
577
- lines.push(...formatPerformanceBottlenecks(reportableSteps));
578
- }
579
- lines.push(...formatDebugLogSections(debugEntries));
580
- return lines.join("\n");
581
- }
582
-
583
481
  // src/runbook-generator/index.ts
584
482
  async function main() {
585
483
  const totalStart = performance.now();
@@ -755,6 +653,33 @@ ${reviewUserPrompt}`.slice(0, 500) }
755
653
  if (!goalAchieved) {
756
654
  log.warn("Goal was NOT fully achieved. Runbook may be incomplete.");
757
655
  }
656
+ if (config.forceReport) {
657
+ const reportContent = await generateGenerationReportFile({
658
+ goal: config.goal,
659
+ startUrl: config.url,
660
+ goalAchieved,
661
+ recordedSteps,
662
+ reviewResult: reviewResult ? {
663
+ summary: reviewResult.summary,
664
+ yamlContent: yaml,
665
+ goalAchieved,
666
+ reviewedSteps: reviewResult.reviewedSteps
667
+ } : void 0,
668
+ generateConfig: {
669
+ maxIterations: config.maxIterations,
670
+ modelId: config.aiModelConfig.modelId,
671
+ modelProvider: config.aiModelConfig.provider,
672
+ headless: config.headless,
673
+ stealth: config.stealth ?? false,
674
+ snapshotFilter: config.snapshotFilter
675
+ },
676
+ aiMetrics: globalMetrics.getSummary()
677
+ });
678
+ const reportPath = config.output.replace(/\.\w+$/, "-report.md");
679
+ await mkdir(dirname(reportPath), { recursive: true });
680
+ await writeFile(reportPath, reportContent, "utf-8");
681
+ log.info(`Report written to: ${reportPath}`);
682
+ }
758
683
  const metrics = globalMetrics.getSummary();
759
684
  if (metrics.totalCalls > 0) {
760
685
  const purposeSummary = Object.entries(metrics.byPurpose).map(([p, b]) => `${p}(${b.calls})`).join(" ");
@@ -797,4 +722,4 @@ main().catch((error) => {
797
722
  }
798
723
  process.exit(1);
799
724
  });
800
- //# sourceMappingURL=runbook-generator-MPXJBQ5N.js.map
725
+ //# sourceMappingURL=runbook-generator-UIHWBEYC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/runbook-generator/index.ts","../../../src/runbook-generator/config.ts","../../../src/runbook-generator/review-editor.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, generateGenerationReportFile } from \"./report-generator\";\nimport type { ReviewResult } from \"./types\";\n\nasync function main() {\n const totalStart = performance.now();\n const config = await parseArgs();\n\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 // --report: 成功時にもレポートファイルを出力\n if (config.forceReport) {\n const reportContent = await generateGenerationReportFile({\n goal: config.goal,\n startUrl: config.url,\n goalAchieved,\n recordedSteps,\n reviewResult: reviewResult\n ? {\n summary: reviewResult.summary,\n yamlContent: yaml,\n goalAchieved,\n reviewedSteps: reviewResult.reviewedSteps,\n }\n : undefined,\n generateConfig: {\n maxIterations: config.maxIterations,\n modelId: config.aiModelConfig.modelId,\n modelProvider: config.aiModelConfig.provider,\n headless: config.headless,\n stealth: config.stealth ?? false,\n snapshotFilter: config.snapshotFilter,\n },\n aiMetrics: globalMetrics.getSummary(),\n });\n const reportPath = config.output.replace(/\\.\\w+$/, \"-report.md\");\n await mkdir(dirname(reportPath), { recursive: true });\n await writeFile(reportPath, reportContent, \"utf-8\");\n log.info(`Report written to: ${reportPath}`);\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 report: { type: \"boolean\" },\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 forceReport: values.report ?? false,\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"],"mappings":"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","names":[]}
@@ -14,7 +14,7 @@ import {
14
14
  StepCaptureSchema,
15
15
  VariableDefinitionSchema,
16
16
  VariableSourceSchema
17
- } from "./chunk-RT664YIO.js";
17
+ } from "./chunk-LZDZGI4M.js";
18
18
  import "./chunk-2H7UOFLK.js";
19
19
  export {
20
20
  ActionTypeSchema,
@@ -32,4 +32,4 @@ export {
32
32
  VariableDefinitionSchema,
33
33
  VariableSourceSchema
34
34
  };
35
- //# sourceMappingURL=runbook-schema-3T6TP3JJ.js.map
35
+ //# sourceMappingURL=runbook-schema-X7DW725O.js.map
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ RunbookStore
4
+ } from "./chunk-HHRHHFSK.js";
5
+ import "./chunk-VVXNFUPL.js";
6
+ import "./chunk-CMWLFQXD.js";
7
+ import "./chunk-2H7UOFLK.js";
8
+ export {
9
+ RunbookStore
10
+ };
11
+ //# sourceMappingURL=runbook-store-S24PXIHD.js.map
@@ -42,7 +42,7 @@ import {
42
42
  tenants,
43
43
  user,
44
44
  verification
45
- } from "./chunk-CLYJHKPY.js";
45
+ } from "./chunk-CMWLFQXD.js";
46
46
  import "./chunk-2H7UOFLK.js";
47
47
  export {
48
48
  account,
@@ -88,4 +88,4 @@ export {
88
88
  user,
89
89
  verification
90
90
  };
91
- //# sourceMappingURL=schema-5G6UQSPT.js.map
91
+ //# sourceMappingURL=schema-XFSD5EWN.js.map