@basemachina/agentic-browser-cli 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-model-NZ7QJNJW.js +32 -0
- package/dist/ai-model-NZ7QJNJW.js.map +1 -0
- package/dist/chunk-KDEQ2AAE.js +93 -0
- package/dist/chunk-KDEQ2AAE.js.map +1 -0
- package/dist/chunk-U6GPCKY3.js +3186 -0
- package/dist/chunk-U6GPCKY3.js.map +1 -0
- package/dist/chunk-VNQYQSMI.js +922 -0
- package/dist/chunk-VNQYQSMI.js.map +1 -0
- package/dist/chunk-XAEHXRUC.js +607 -0
- package/dist/chunk-XAEHXRUC.js.map +1 -0
- package/dist/cli.js +55 -0
- package/dist/cli.js.map +1 -0
- package/dist/compose-EHDWVF7N.js +543 -0
- package/dist/compose-EHDWVF7N.js.map +1 -0
- package/dist/fix-instruction-JLCLTXAN.js +406 -0
- package/dist/fix-instruction-JLCLTXAN.js.map +1 -0
- package/dist/instruction-executor-M5Q6HYSM.js +5202 -0
- package/dist/instruction-executor-M5Q6HYSM.js.map +1 -0
- package/dist/instruction-generator-5RPRYTVR.js +2470 -0
- package/dist/instruction-generator-5RPRYTVR.js.map +1 -0
- package/package.json +29 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/instruction-generator/index.ts","../../../src/instruction-generator/config.ts","../../../src/instruction-generator/exploration-agent.ts","../../../src/instruction-generator/browser-tool.ts","../../../src/harness/loop-detector.ts","../../../src/instruction-generator/intervention-controller.ts","../../../src/instruction-generator/explorer.ts","../../../src/instruction-generator/instruction-builder.ts","../../../src/browser/selector-builder.ts","../../../src/instruction-generator/prompts.ts","../../../src/instruction-generator/review-editor.ts","../../../src/instruction-generator/report-generator.ts"],"sourcesContent":["/**\n * instruction-generator CLIエントリポイント\n *\n * Usage:\n * npx tsx src/instruction-generator/index.ts \\\n * --url \"https://staging.example.com/login\" \\\n * --goal \"メールアドレスとパスワードでログインしてダッシュボードを表示する\" \\\n * --output ./instructions/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 { buildInstructionYaml } from \"./instruction-builder\";\nimport { createReviewPrompt, reviewResponseSchema } from \"./prompts\";\nimport { promptReviewEdits } from \"./review-editor\";\nimport { intro, outro, log, spinner, cancel, promptText } from \"../cli/prompts\";\nimport { t, tf } from \"../i18n\";\nimport { formatDuration } from \"../cli/format\";\nimport { createDebugLogger } from \"../cli/debug-logger\";\nimport { serializeGeneratorOptions } from \"../cli/options-serializer\";\nimport { generateExplorationReport } from \"./report-generator\";\nimport type { ReviewResult } from \"./types\";\n\nasync function main() {\n const totalStart = performance.now();\n const config = await parseArgs();\n await initModel(config.aiModelConfig);\n const cliOptions = serializeGeneratorOptions(config);\n\n intro(\"instruction-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.contextMarkdown) {\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 }\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 instruction.\");\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 const reviewSpinner = spinner();\n try {\n const reviewStart = performance.now();\n reviewSpinner.start(t(\"generator.aiReviewing\"));\n\n const { system: reviewSystem, userPrompt: reviewUserPrompt } = createReviewPrompt(config.goal, recordedSteps, goalAchieved, interventions);\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 reviewSpinner.stop(`AI review done: ${kept} kept, ${removed} removed (${formatDuration(performance.now() - reviewStart)})`);\n log.info(`Summary: ${reviewResult!.summary}`);\n } catch (error) {\n reviewSpinner.stop(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 = buildInstructionYaml({\n goal: config.goal,\n startUrl: config.url,\n recordedSteps,\n goalAchieved,\n stepDelay: config.stepDelay,\n reviewResult,\n humanGuidance: finalGuidance,\n interventions,\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(`Instruction written to: ${config.output}`);\n if (!goalAchieved) {\n log.warn(\"Goal was NOT fully achieved. Instruction may be incomplete.\");\n }\n\n // AI メトリクスサマリー\n const metrics = globalMetrics.getSummary();\n if (metrics.totalCalls > 0) {\n const purposeSummary = Object.entries(metrics.byPurpose)\n .map(([p, b]) => `${p}(${b.calls})`)\n .join(\" \");\n log.info(\n `AI Metrics: ${metrics.totalCalls} calls, ` +\n `${metrics.totalInputTokens.toLocaleString()} in / ${metrics.totalOutputTokens.toLocaleString()} out tokens, ` +\n `cache ${(metrics.cacheHitRate * 100).toFixed(1)}%, ` +\n `$${metrics.estimatedCostUsd.toFixed(4)}, ` +\n `${(metrics.totalDurationMs / 1000).toFixed(1)}s — ${purposeSummary}`,\n );\n if (metrics.byModel && Object.keys(metrics.byModel).length > 1) {\n const modelSummary = Object.entries(metrics.byModel)\n .map(([id, b]) => `${id}($${b.estimatedCostUsd.toFixed(4)})`)\n .join(\" \");\n log.info(`Models: ${modelSummary}`);\n }\n }\n\n outro(`Total: ${formatDuration(performance.now() - totalStart)}`);\n } catch (postExploreError) {\n const errorMessage = postExploreError instanceof Error\n ? (postExploreError.stack ?? postExploreError.message)\n : String(postExploreError);\n\n log.error(`Post-exploration phase failed: ${errorMessage}`);\n\n const report = await generateExplorationReport({\n goal: config.goal,\n startUrl: config.url,\n outcome: \"error\",\n userFeedback: \"\",\n recordedSteps,\n interventions,\n debugLogPath: config.debugLogPath,\n errorMessage,\n cliOptions,\n aiMetrics: globalMetrics.getSummary(),\n totalDurationMs: Math.round(performance.now() - totalStart),\n });\n\n const reportPath = config.output.replace(/\\.\\w+$/, \"-report.md\");\n await mkdir(dirname(reportPath), { recursive: true });\n await writeFile(reportPath, report, \"utf-8\");\n log.info(`Error report written to: ${reportPath}`);\n\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n cancel(`Fatal error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n});\n","/**\n * instruction-generator CLI引数パース\n */\n\nimport { parseArgs as nodeParseArgs } from \"node:util\";\nimport { cancel } from \"../cli/prompts\";\nimport { t, initLocale } from \"../i18n\";\nimport { getRawArgs, readContextFile, parseModelConfig } from \"../cli/config-helpers\";\nimport { loadSecrets } from \"../cli/secrets-loader\";\nimport type { GeneratorConfig } from \"./types\";\n\nexport async function parseArgs(): Promise<GeneratorConfig> {\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 },\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 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 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 };\n}\n","/**\n * exploration-agent — AI SDK generateText による探索ループ\n *\n * browser tool を使って AI がゴール達成まで自律的に探索する。\n * prepareStep で古いスナップショットを刈り取り、トークン消費を抑制する。\n */\n\nimport { stepCountIs, Output, type ModelMessage } from \"ai\";\nimport { z } from \"zod\";\nimport { getModel, trackedGenerateText, type ModelPurpose } from \"../harness/ai-model\";\nimport { createBrowserTool, type BrowserToolConfig, type PaginationTracker } from \"./browser-tool\";\nimport {\n getAgentInstructions,\n getInitialUserMessage,\n} from \"../i18n/prompts\";\nimport type { AgentBrowser } from \"../browser/browser-client\";\nimport type { DebugLogger } from \"../cli/debug-logger\";\nimport type { SecretsData } from \"../cli/secrets-loader\";\nimport type { DataStore, DataAggregator } from \"../context/data-store\";\nimport type { DownloadManager } from \"../context/download-manager\";\nimport type { RecordedStep } from \"./types\";\nimport type { InterventionController } from \"./intervention-controller\";\n\nexport interface ExplorationAgentConfig {\n goal: string;\n contextMarkdown?: string;\n secrets?: SecretsData;\n maxIterations: number;\n stepDelay: number;\n snapshotFilter: boolean;\n screenshotDir?: string;\n debugLogger?: DebugLogger;\n interventionController?: InterventionController;\n /** Maximum number of tool call turns to keep in message history (default: 10) */\n historyWindow: number;\n /** Enable multi-model routing: route routine steps to cheaper model (default: false) */\n enableMultiModel?: boolean;\n}\n\n// getAgentInstructions is now dispatched via i18n/prompts\nexport { getAgentInstructions } from \"../i18n/prompts\";\n\nexport interface ExploreWithAIResult {\n /** 構造化されたゴール達成判定 */\n goalResult: { goalAchieved: boolean; summary: string };\n totalTokens: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\n// ── Multi-model routing ──\n\nexport interface RoutingDecision {\n purpose: \"exploration\" | \"exploration-light\";\n reason: string;\n}\n\n/**\n * 探索ステップごとにモデルをルーティングする。\n *\n * ルーティンなターン(フォーム入力、データ収集、安定操作)は安価なモデルへ、\n * 複雑なターン(初回観測、エラー回復、ページ遷移直後)は高性能モデルへ振り分ける。\n */\nexport function routeExplorationModel(\n stepNumber: number,\n messages: ModelMessage[],\n recordedSteps: RecordedStep[],\n): RoutingDecision {\n // 1. 初回 2 ステップは精度最優先(初回観測 + 最初のアクション)\n if (stepNumber <= 2) {\n return { purpose: \"exploration\", reason: \"initial_observation\" };\n }\n\n // tool メッセージのインデックスを収集(フェーズ検出・直前ステップ解析用)\n const toolIndices: number[] = [];\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === \"tool\") toolIndices.push(i);\n }\n\n // 直前のツール結果を解析\n if (toolIndices.length > 0) {\n const lastToolMsg = messages[toolIndices[toolIndices.length - 1]];\n const lastVal = extractToolOutputValue(lastToolMsg);\n\n if (lastVal) {\n // 2. 直前ステップにエラーがあれば Sonnet(エラー回復に高度な推論が必要)\n const results = lastVal.results as Array<{ success: boolean }> | undefined;\n if (results?.some(r => !r.success)) {\n return { purpose: \"exploration\", reason: \"previous_step_failed\" };\n }\n\n // 3. nudgeMessage があれば Sonnet(ループ検出/ページネーション警告)\n if (lastVal.nudgeMessage) {\n return { purpose: \"exploration\", reason: \"nudge_active\" };\n }\n }\n }\n\n // 4. URL が直前ステップと異なれば Sonnet(新ページの構造理解が必要)\n if (recordedSteps.length >= 2) {\n const last = recordedSteps[recordedSteps.length - 1];\n const prev = recordedSteps[recordedSteps.length - 2];\n if (last.url !== prev.url) {\n return { purpose: \"exploration\", reason: \"page_changed\" };\n }\n }\n\n // 5. フェーズベースのルーティング: form_filling / data_collection は安価モデルへ\n if (toolIndices.length > 0) {\n const phase = detectExplorationPhase(messages, toolIndices);\n if (phase === \"form_filling\") {\n return { purpose: \"exploration-light\", reason: \"routine_form_fill\" };\n }\n if (phase === \"data_collection\") {\n return { purpose: \"exploration-light\", reason: \"routine_data_collection\" };\n }\n }\n\n // 6. 同一 URL 上で 3+ 連続成功なら安価モデル(安定した操作フロー)\n if (recordedSteps.length >= 3) {\n const recent = recordedSteps.slice(-3);\n const allSucceeded = recent.every(s => s.success);\n const sameUrl = recent.every(s => s.url === recent[0].url);\n if (allSucceeded && sameUrl) {\n return { purpose: \"exploration-light\", reason: \"stable_operation\" };\n }\n }\n\n // デフォルト: 高性能モデル\n return { purpose: \"exploration\", reason: \"default\" };\n}\n\n/**\n * AI SDK generateText で探索を実行する。\n * prepareStep で古い tool result のスナップショットを刈り取り、トークン消費を抑制。\n */\nexport async function exploreWithAI(\n browser: AgentBrowser,\n recordedSteps: RecordedStep[],\n config: ExplorationAgentConfig,\n dataStore?: DataStore & DataAggregator,\n downloadManager?: DownloadManager,\n): Promise<ExploreWithAIResult> {\n const paginationTracker: PaginationTracker = { currentPage: 0, totalPages: 0 };\n const toolConfig: BrowserToolConfig = {\n stepDelay: config.stepDelay,\n screenshotDir: config.screenshotDir,\n snapshotFilter: config.snapshotFilter,\n debugLogger: config.debugLogger,\n interventionController: config.interventionController,\n paginationTracker,\n };\n\n const browserTool = createBrowserTool(browser, recordedSteps, toolConfig, dataStore, downloadManager);\n const totalMaxSteps = config.maxIterations * 3;\n\n const systemMessage = {\n role: \"system\" as const,\n content: getAgentInstructions(config.goal, config.contextMarkdown, config.secrets),\n providerOptions: {\n anthropic: { cacheControl: { type: \"ephemeral\" } },\n },\n };\n\n // ── ページネーション停滞検出 ──\n // toolChoice: \"required\" でモデルが非生産的なツール呼び出しを繰り返す場合に制約を解除する\n const STALL_THRESHOLD = 6; // 約2ページ分のバッファ(ページごとに2-3ツール呼び出し)\n let lastProgressPage = 0;\n let stepsWithoutProgress = 0;\n\n const prepareStep = ({ messages, stepNumber }: { messages: ModelMessage[]; stepNumber: number }) => {\n if (stepNumber <= 1) return undefined;\n // 古い tool result から snapshot と extractedData を除去してトークンを節約\n const pruned = pruneOldToolResults(messages, config.historyWindow);\n\n // ページネーション停滞カウンタ更新\n if (paginationTracker.currentPage > lastProgressPage) {\n lastProgressPage = paginationTracker.currentPage;\n stepsWithoutProgress = 0;\n } else {\n stepsWithoutProgress++;\n }\n\n // ページネーション進行中かつ停滞していない場合、ツール呼び出しを強制して\n // モデルが構造化出力を返して探索を打ち切ることを防ぐ\n const paginationInProgress =\n paginationTracker.totalPages > 0 &&\n paginationTracker.currentPage < paginationTracker.totalPages;\n const notStalled = stepsWithoutProgress < STALL_THRESHOLD;\n\n // マルチモデルルーティング: ルーティンステップは安価モデルへ\n if (config.enableMultiModel) {\n const decision = routeExplorationModel(stepNumber, messages, recordedSteps);\n const model = getModel(decision.purpose as ModelPurpose);\n if (paginationInProgress && notStalled) {\n return { messages: pruned, toolChoice: \"required\" as const, model };\n }\n return { messages: pruned, model };\n }\n\n if (paginationInProgress && notStalled) {\n return { messages: pruned, toolChoice: \"required\" as const };\n }\n\n return { messages: pruned };\n };\n\n const result = await trackedGenerateText(\"exploration\", {\n model: getModel(\"exploration\"),\n messages: [\n systemMessage,\n { role: \"user\" as const, content: getInitialUserMessage() },\n ],\n tools: { browser: browserTool },\n output: Output.object({ schema: agentResultSchema }),\n // +1: 構造化出力の生成は追加ステップとしてカウントされる\n stopWhen: [stepCountIs(totalMaxSteps + 1)],\n prepareStep,\n });\n\n const goalResult = result.output ?? parseAgentResultFallback(result.text);\n\n return {\n goalResult,\n totalTokens: {\n promptTokens: result.usage.inputTokens ?? 0,\n completionTokens: result.usage.outputTokens ?? 0,\n totalTokens: (result.usage.inputTokens ?? 0) + (result.usage.outputTokens ?? 0),\n },\n };\n}\n\n/**\n * 古い tool result メッセージを 3 段階で圧縮してトークンを節約する。\n *\n * - 直近 2 ターン: Raw(完全保持)\n * - 3〜4 ターン前: Compact(snapshot 除去 + extractedData 削除)\n * - 5 ターン以上前: Summary(Compact + 成功 results を 1 行に集約)\n *\n * 失敗情報(success: false)、nudgeMessage、scratchpad は全ゾーンで保持する。\n *\n * 適応的圧縮:\n * - フォーム入力フェーズではRawゾーンを拡張(+2ターン)\n * - トークン圧迫時はSummaryゾーンを拡張\n */\nexport function pruneOldToolResults(messages: ModelMessage[], historyWindow = 10): ModelMessage[] {\n let toolIndices: number[] = [];\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === \"tool\") toolIndices.push(i);\n }\n\n if (toolIndices.length <= 2) return messages;\n\n // フェーズ検出: 直近ツール結果から入力フェーズかどうかを推定\n const phase = detectExplorationPhase(messages, toolIndices);\n // フォーム入力フェーズではRawゾーンを拡張\n const rawSize = phase === \"form_filling\" ? 4 : 2;\n const compactSize = phase === \"form_filling\" ? 4 : 2;\n\n // historyWindow を超えるターンを一括ドロップ\n if (toolIndices.length > historyWindow) {\n const cutoffIndex = toolIndices[toolIndices.length - historyWindow];\n // tool メッセージの直前にある assistant メッセージ(tool_use ブロック)を含めないと\n // orphaned tool_result エラーになるため、assistant メッセージから切る\n let startIndex = cutoffIndex;\n if (startIndex > 0 && messages[startIndex - 1].role === \"assistant\") {\n startIndex = startIndex - 1;\n }\n // システムメッセージと初期ユーザーメッセージを保持\n const preamble = messages.filter((m, i) =>\n i < startIndex && (m.role === \"system\" || (m.role === \"user\" && i < 3)),\n );\n const droppedCount = toolIndices.length - historyWindow;\n const summaryMsg: ModelMessage = {\n role: \"user\" as const,\n content: `[${droppedCount} earlier tool turns omitted for context efficiency]`,\n } as ModelMessage;\n messages = [...preamble, summaryMsg, ...messages.slice(startIndex)];\n\n // toolIndices を再計算\n toolIndices = [];\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role === \"tool\") toolIndices.push(i);\n }\n if (toolIndices.length <= 2) return messages;\n }\n\n // トークン圧迫推定: メッセージ総文字数ベースの簡易推定\n const estimatedChars = estimateMessageChars(messages);\n const HIGH_PRESSURE_CHARS = 400_000; // ~100K tokens\n const isHighPressure = estimatedChars > HIGH_PRESSURE_CHARS;\n\n // 高圧迫時はRaw/Compactゾーンを縮小\n const effectiveRawSize = isHighPressure ? Math.max(1, rawSize - 1) : rawSize;\n const effectiveCompactSize = isHighPressure ? Math.max(1, compactSize - 1) : compactSize;\n\n const recentThreshold = toolIndices[Math.max(0, toolIndices.length - effectiveRawSize)];\n const compactThreshold = toolIndices.length > effectiveRawSize + effectiveCompactSize\n ? toolIndices[toolIndices.length - effectiveRawSize - effectiveCompactSize]\n : 0;\n\n return messages.map((msg, i) => {\n if (msg.role !== \"tool\") return msg;\n\n // Raw ゾーン\n if (i >= recentThreshold) return msg;\n\n // Compact ゾーン\n if (i >= compactThreshold) return compactToolResult(msg);\n\n // Summary ゾーン\n return summarizeToolResult(msg);\n });\n}\n\n/**\n * 直近のツール結果から探索フェーズを推定する。\n * AI 呼び出し不要のヒューリスティック。\n * ツール結果の filledFields / extractedData / memoryStatus フィールドの存在で判定。\n */\nfunction detectExplorationPhase(\n messages: ModelMessage[],\n toolIndices: number[],\n): \"form_filling\" | \"data_collection\" | \"exploring\" {\n const recentTools = toolIndices.slice(-3);\n let fillCount = 0;\n let extractCount = 0;\n\n for (const idx of recentTools) {\n const msg = messages[idx];\n const val = extractToolOutputValue(msg);\n if (val) {\n if (\"filledFields\" in val && val.filledFields) fillCount++;\n if (\"extractedData\" in val && val.extractedData) extractCount++;\n if (\"memoryStatus\" in val && val.memoryStatus) extractCount++;\n }\n }\n\n if (fillCount >= 2) return \"form_filling\";\n if (extractCount >= 2) return \"data_collection\";\n return \"exploring\";\n}\n\n/** ツール結果メッセージから output.value を取得 */\nfunction extractToolOutputValue(msg: ModelMessage): Record<string, unknown> | null {\n if (!Array.isArray(msg.content)) return null;\n const parts = msg.content as unknown as Array<{ type: string; output: unknown }>;\n for (const part of parts) {\n if (part.type !== \"tool-result\") continue;\n const output = part.output as { type?: string; value?: unknown } | null;\n if (output?.type === \"json\" && typeof output.value === \"object\" && output.value !== null) {\n return output.value as Record<string, unknown>;\n }\n }\n return null;\n}\n\n/** メッセージ全体の文字数を簡易推定 */\nfunction estimateMessageChars(messages: ModelMessage[]): number {\n let total = 0;\n for (const msg of messages) {\n if (typeof msg.content === \"string\") {\n total += msg.content.length;\n } else if (Array.isArray(msg.content)) {\n total += JSON.stringify(msg.content).length;\n }\n }\n return total;\n}\n\n/** tool-result part の JSON value を変換するユーティリティ */\nfunction mapToolResultValue(\n msg: ModelMessage,\n transform: (val: Record<string, unknown>) => Record<string, unknown>,\n): ModelMessage {\n if (!Array.isArray(msg.content)) return msg;\n\n // ToolModelMessage.content は ToolContent (= Array<ToolResultPart>) だが、\n // ModelMessage の union 型のため直接 .map() すると型が合わない。unknown 経由でキャスト。\n const parts = msg.content as unknown as Array<{ type: string; output: unknown; [k: string]: unknown }>;\n\n const prunedContent = parts.map((part) => {\n if (part.type !== \"tool-result\") return part;\n const output = part.output;\n if (typeof output !== \"object\" || output === null) return part;\n\n const out = output as { type?: string; value?: unknown };\n if (out.type === \"json\" && typeof out.value === \"object\" && out.value !== null) {\n const val = { ...(out.value as Record<string, unknown>) };\n const transformed = transform(val);\n return { ...part, output: { ...out, value: transformed } };\n }\n\n return part;\n });\n\n return { ...msg, content: prunedContent as unknown as ModelMessage[\"content\"] } as ModelMessage;\n}\n\n/** Compact: snapshot を \"[省略]\" に置換、extractedData を削除。他は保持。 */\nfunction compactToolResult(msg: ModelMessage): ModelMessage {\n return mapToolResultValue(msg, (val) => {\n if (\"snapshot\" in val) { val.snapshot = \"[省略]\"; }\n if (\"extractedData\" in val) { delete val.extractedData; }\n return val;\n });\n}\n\n/** Summary: snapshot キー削除 + 成功 results を 1 行に集約。失敗は個別保持。 */\nfunction summarizeToolResult(msg: ModelMessage): ModelMessage {\n return mapToolResultValue(msg, (val) => {\n // snapshot キー自体を削除\n if (\"snapshot\" in val) { delete val.snapshot; }\n if (\"extractedData\" in val) { delete val.extractedData; }\n\n // results を圧縮: 失敗は個別保持、成功は 1 行に集約\n if (\"results\" in val && Array.isArray(val.results)) {\n const results = val.results as Array<{ description: string; success: boolean; error?: string }>;\n const failures = results.filter((r) => !r.success);\n const successes = results.filter((r) => r.success);\n\n const compressed: Array<{ description: string; success: boolean; error?: string }> = [...failures];\n if (successes.length > 0) {\n compressed.push({ description: `${successes.length}件成功`, success: true });\n }\n val.results = compressed;\n }\n\n return val;\n });\n}\n\n/**\n * Output.object が返す構造化出力のスキーマ。\n * exploreWithAI の generateText で使用される。\n */\nconst agentResultSchema = z.object({\n goalAchieved: z.boolean(),\n summary: z.string().default(\"\"),\n});\n\n/**\n * Output.object が null を返した場合のフォールバック。\n * テキストから JSON を抽出し、失敗時は正規表現で推定する。\n */\nexport function parseAgentResultFallback(text: string): {\n goalAchieved: boolean;\n summary: string;\n} {\n // 1. 全体が JSON なら直接パース\n try {\n return agentResultSchema.parse(JSON.parse(text.trim()));\n } catch {\n // fallthrough\n }\n\n // 2. テキスト中の JSON オブジェクトを抽出\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n try {\n return agentResultSchema.parse(JSON.parse(jsonMatch[0]));\n } catch {\n // fallthrough\n }\n }\n\n // 3. JSON解析できない場合はテキストから推定\n const achieved = /ゴール.*達成|goal.*achieved|完了しました/i.test(text);\n return { goalAchieved: achieved, summary: text.slice(0, 200) };\n}\n","/**\n * browser-tool — AgentBrowser を AI SDK tool としてラップ\n *\n * AI SDK generateText の tool-calling ループから呼ばれ、\n * ブラウザ操作の実行 + スナップショット返却 + RecordedStep 記録を行う。\n */\n\nimport { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { AgentBrowser } from \"../browser/browser-client\";\nimport { filterSnapshot } from \"../browser/snapshot-filter\";\nimport { parseAllElements } from \"../browser/snapshot-parser\";\nimport { detectLoop } from \"../harness/loop-detector\";\nimport { classifyFailure } from \"../harness/error-classifier\";\nimport { log } from \"../cli/prompts\";\nimport { tf } from \"../i18n\";\nimport type { DebugLogger } from \"../cli/debug-logger\";\nimport { noopLogger } from \"../cli/debug-logger\";\nimport type { DataStore, DataAggregator } from \"../context/data-store\";\nimport type { DownloadManager } from \"../context/download-manager\";\nimport { parseAndAppendToMemory } from \"../context/memory-operations\";\nimport { sleep } from \"../harness/sleep\";\nimport type { ExplorationAction, RecordedStep } from \"./types\";\nimport type { InterventionController } from \"./intervention-controller\";\n\nconst suggestedCaptureSchema = z.object({\n name: z.string(),\n strategy: z.enum([\"snapshot\", \"url\", \"ai\", \"expression\", \"evaluate\"]),\n description: z.string().optional(),\n pattern: z.string().optional(),\n group: z.number().optional(),\n prompt: z.string().optional(),\n expression: z.string().optional(),\n});\n\nconst aggregationSchema = z.object({\n collection: z.string(),\n field: z.string(),\n operation: z.enum([\"sum\", \"count\", \"concat\", \"min\", \"max\", \"avg\", \"unique_count\"]),\n outputVariable: z.string(),\n});\n\nconst actionSchema = z.object({\n action: z.enum([\n \"click\",\n \"fill\",\n \"type\",\n \"select\",\n \"check\",\n \"uncheck\",\n \"navigate\",\n \"wait\",\n \"scroll\",\n \"extract\",\n \"download\",\n \"export\",\n \"memory_append\",\n \"memory_aggregate\",\n ]),\n selector: z.string().optional(),\n value: z.string().optional(),\n description: z.string(),\n inputCategory: z\n .enum([\"credential\", \"user_data\", \"fixed\", \"navigation\"])\n .optional(),\n variableName: z.string().optional(),\n suggestedCaptures: z.array(suggestedCaptureSchema).optional(),\n /** extract 用: ページ内で実行する JavaScript */\n script: z.string().optional(),\n /** extract 用: AI にデータを抽出させるプロンプト */\n extractPrompt: z.string().optional(),\n /** memory_append 用: 蓄積先コレクション名 */\n memoryCollection: z.string().optional(),\n /** memory_aggregate 用: 集計設定 */\n aggregation: aggregationSchema.optional(),\n /** download 用: 保存先パス */\n downloadPath: z.string().optional(),\n /** export 用: 出力対象コレクション名 */\n exportCollection: z.string().optional(),\n /** export 用: 出力フォーマット */\n exportFormat: z.enum([\"csv\", \"json\"]).optional(),\n /** export 用: 出力先パス */\n exportPath: z.string().optional(),\n});\n\nconst browserInputSchema = z.object({\n actions: z\n .array(actionSchema)\n .describe(\n \"実行するブラウザ操作の配列。空配列なら現在のページスナップショットのみ返す。\",\n ),\n});\n\n/** tool の戻り値の型 */\nexport interface BrowserToolResult {\n results: Array<{ description: string; success: boolean; error?: string }>;\n snapshot: string;\n url: string;\n nudgeMessage?: string;\n stepCount: number;\n memoryStatus?: Record<string, number>;\n extractedData?: string;\n filledFields?: string;\n /** 探索スクラッチパッド: 重要イベントの要約(会話圧縮で失われない知見を保持) */\n scratchpad?: string;\n}\n\n/**\n * 抽出データをプレビュー用に圧縮する。\n * JSON配列の場合は先頭3件 + 合計件数のサマリーに変換。\n */\nfunction truncateExtractedData(data: string, maxLength: number): string {\n try {\n const parsed = JSON.parse(data);\n if (Array.isArray(parsed)) {\n const total = parsed.length;\n const preview = parsed.slice(0, 3);\n if (total <= 3) return JSON.stringify(preview);\n return `${JSON.stringify(preview).slice(0, maxLength)} ... (全${total}件)`;\n }\n } catch {\n // JSON でなければそのまま truncate\n }\n if (data.length <= maxLength) return data;\n return `${data.slice(0, maxLength)}... (${data.length}文字)`;\n}\n\nfunction getActionDelay(action: string, baseDelay: number): number {\n switch (action) {\n case \"navigate\":\n return Math.max(baseDelay, 1000);\n case \"click\":\n return Math.round(baseDelay * 0.6);\n case \"fill\":\n case \"type\":\n return Math.round(baseDelay * 0.2);\n case \"select\":\n return Math.round(baseDelay * 0.4);\n default:\n return baseDelay;\n }\n}\n\nfunction cancellableSleep(\n ms: number,\n ic?: InterventionController,\n): Promise<void> {\n if (!ic) return sleep(ms);\n return new Promise((resolve) => {\n const interval = 50;\n let elapsed = 0;\n const timer = setInterval(() => {\n elapsed += interval;\n if (elapsed >= ms || ic.isCancelRequested() || ic.isPauseRequested()) {\n clearInterval(timer);\n resolve();\n }\n }, interval);\n });\n}\n\nexport interface PaginationTracker {\n currentPage: number;\n totalPages: number;\n}\n\nexport interface BrowserToolConfig {\n stepDelay: number;\n screenshotDir?: string;\n snapshotFilter: boolean;\n debugLogger?: DebugLogger;\n interventionController?: InterventionController;\n paginationTracker?: PaginationTracker;\n}\n\nexport function createBrowserTool(\n browser: AgentBrowser,\n recordedSteps: RecordedStep[],\n config: BrowserToolConfig,\n dataStore?: DataStore & DataAggregator,\n downloadManager?: DownloadManager,\n) {\n let ordinal = 0;\n let nudgeCount = 0;\n let lastSnapshot: string | null = null;\n let lastExtractedData: string | undefined;\n const dl = config.debugLogger;\n /** 入力済みフィールドを追跡(selector → description) */\n const filledFieldsMap = new Map<string, string>();\n const inputActionTypes = new Set([\"fill\", \"type\", \"select\", \"check\", \"uncheck\"]);\n /** 探索スクラッチパッド: 重要イベントの ring buffer */\n const scratchpadEntries: string[] = [];\n const MAX_SCRATCHPAD = 10;\n let lastUrl = \"\";\n\n return tool({\n description:\n \"ブラウザ操作を実行し、操作後のページスナップショットを返す。actionsが空なら現在のページ状態のみ返す。\",\n inputSchema: browserInputSchema,\n execute: async (inputData) => {\n const ic = config.interventionController;\n let interventionNudge: string | undefined;\n\n // ── キャンセルチェック ──\n if (ic?.isCancelRequested()) {\n const snapshot = lastSnapshot ?? (await browser.snapshot());\n const finalSnapshot = config.snapshotFilter\n ? filterSnapshot(snapshot)\n : snapshot;\n return {\n results: [],\n snapshot: finalSnapshot,\n url: await browser.url(),\n nudgeMessage:\n \"ユーザーが探索のキャンセルを要求しました。goalAchieved: false で最終報告を作成してください。\",\n stepCount: recordedSteps.length,\n };\n }\n\n // ── 介入チェック: ユーザーが一時停止を要求していたら対話を行う ──\n if (ic?.isPauseRequested()) {\n const currentUrl = await browser.url();\n const interventionResult = await ic.collectIntervention(\n recordedSteps.length,\n currentUrl,\n );\n\n if (interventionResult.action === \"abort\") {\n const snapshot = lastSnapshot ?? (await browser.snapshot());\n const finalSnapshot = config.snapshotFilter\n ? filterSnapshot(snapshot)\n : snapshot;\n return {\n results: [],\n snapshot: finalSnapshot,\n url: currentUrl,\n nudgeMessage:\n \"ユーザーが探索の中止を要求しました。goalAchieved: false で最終報告を作成してください。\",\n stepCount: recordedSteps.length,\n };\n }\n\n if (interventionResult.guidanceText) {\n interventionNudge = tf(\"browserTool.interventionGuidance\", { text: interventionResult.guidanceText });\n }\n\n dl?.log({\n phase: \"generator\",\n event: \"user_intervention\",\n step: recordedSteps.length,\n data: {\n action: interventionResult.action,\n guidanceText: interventionResult.guidanceText,\n url: currentUrl,\n },\n });\n }\n\n const results: Array<{\n description: string;\n success: boolean;\n error?: string;\n }> = [];\n\n // 空アクション → 観測のみ(初回呼出 or 現在状態確認)\n // snapshot()を呼んでもrefを使う操作がないので安全\n if (inputData.actions.length === 0) {\n const snapshot = await browser.snapshot();\n lastSnapshot = snapshot;\n const currentUrl = await browser.url();\n let finalSnapshot = config.snapshotFilter\n ? filterSnapshot(snapshot)\n : snapshot;\n\n // ページネーション進行中なら nudge + バナーを追加\n let emptyNudge: string | undefined;\n const dataCollectionActionSet = new Set([\"download\", \"extract\", \"memory_append\", \"memory_aggregate\"]);\n const hasDataCollectionHistory = recordedSteps.some(\n s => s.success && dataCollectionActionSet.has(s.action.action),\n );\n if (hasDataCollectionHistory) {\n const pageMatch = snapshot.match(/Page\\s+(\\d+)\\s+(?:of|\\/)\\s+(\\d+)/i);\n if (pageMatch) {\n const cp = Number(pageMatch[1]);\n const tp = Number(pageMatch[2]);\n if (cp < tp) {\n const pp = recordedSteps.filter(\n s => s.success && (s.action.action === \"download\" || s.action.action === \"extract\"),\n ).length;\n emptyNudge = `Pagination progress: Page ${cp} of ${tp} (${pp} pages processed, ${tp - pp} remaining). You MUST continue processing ALL remaining pages — do NOT stop early.`;\n const banner = `[PAGINATION INCOMPLETE: ${pp}/${tp} pages processed. ${tp - pp} pages remaining. You MUST continue — do NOT return goalAchieved yet.]`;\n finalSnapshot = `${banner}\\n${finalSnapshot}`;\n if (config.paginationTracker) {\n config.paginationTracker.currentPage = cp;\n config.paginationTracker.totalPages = tp;\n }\n }\n }\n }\n\n dl?.log({\n phase: \"generator\",\n event: \"snapshot\",\n step: recordedSteps.length,\n data: { url: currentUrl, snapshot, filteredSnapshot: finalSnapshot },\n });\n return {\n results: [],\n snapshot: finalSnapshot,\n url: currentUrl,\n nudgeMessage: emptyNudge,\n stepCount: recordedSteps.length,\n };\n }\n\n // アクションあり → snapshot()を呼ばない(前回のrefマッピングを保持)\n // browser.snapshot()を呼ぶとagent-browser内部の@eNマッピングが再生成され、\n // エージェントが前回のスナップショットで参照した@eNが無効化されてしまう\n const snapshotBefore = lastSnapshot ?? \"\";\n\n for (const action of inputData.actions) {\n // ── アクション間キャンセルチェック ──\n if (ic?.isCancelRequested()) {\n const snapshot = lastSnapshot ?? (await browser.snapshot());\n const finalSnapshot = config.snapshotFilter\n ? filterSnapshot(snapshot)\n : snapshot;\n return {\n results,\n snapshot: finalSnapshot,\n url: await browser.url(),\n nudgeMessage:\n \"ユーザーが探索のキャンセルを要求しました。goalAchieved: false で最終報告を作成してください。\",\n stepCount: recordedSteps.length,\n };\n }\n\n // ── アクション間一時停止チェック ──\n if (ic?.isPauseRequested()) {\n const currentUrl = await browser.url();\n const interventionResult = await ic.collectIntervention(\n recordedSteps.length,\n currentUrl,\n );\n\n if (interventionResult.action === \"abort\") {\n const snapshot = lastSnapshot ?? (await browser.snapshot());\n const finalSnapshot = config.snapshotFilter\n ? filterSnapshot(snapshot)\n : snapshot;\n return {\n results,\n snapshot: finalSnapshot,\n url: currentUrl,\n nudgeMessage:\n \"ユーザーが探索の中止を要求しました。goalAchieved: false で最終報告を作成してください。\",\n stepCount: recordedSteps.length,\n };\n }\n\n if (interventionResult.guidanceText) {\n interventionNudge = tf(\"browserTool.interventionGuidance\", { text: interventionResult.guidanceText });\n }\n\n dl?.log({\n phase: \"generator\",\n event: \"user_intervention\",\n step: recordedSteps.length,\n data: {\n action: interventionResult.action,\n guidanceText: interventionResult.guidanceText,\n url: currentUrl,\n },\n });\n }\n\n log.step(`${action.description} (${action.action} ${action.selector ?? \"\"})`);\n\n // ── メモリ操作(ブラウザ操作不要) ──\n if (action.action === \"memory_append\" && dataStore) {\n const actionStart = performance.now();\n const collection = action.memoryCollection ?? \"default\";\n const rawValue = action.value ?? lastExtractedData ?? \"\";\n const success = true;\n const error: string | undefined = undefined;\n\n parseAndAppendToMemory(rawValue, {\n dataStore,\n debugLogger: dl ?? noopLogger,\n phase: \"generator\",\n step: ordinal,\n collection,\n });\n\n const explorationAction: ExplorationAction = {\n action: action.action,\n value: rawValue,\n description: action.description,\n memoryCollection: collection,\n };\n recordedSteps.push({\n ordinal, action: explorationAction, snapshotBefore,\n url: await browser.url(), success, error,\n durationMs: Math.round(performance.now() - actionStart),\n });\n ordinal++;\n results.push({ description: action.description, success, error });\n // Scratchpad: メモリ蓄積マイルストーン\n const collectionCount = dataStore.count(collection);\n if (collectionCount % 50 === 0 || collectionCount <= 5) {\n addScratchpadEntry(scratchpadEntries, MAX_SCRATCHPAD, `Memory: ${collection} now has ${collectionCount} items`);\n }\n continue;\n }\n\n if (action.action === \"memory_aggregate\" && dataStore && action.aggregation) {\n const actionStart = performance.now();\n const agg = action.aggregation;\n let success = true;\n let error: string | undefined;\n let aggregateResult = \"\";\n\n try {\n aggregateResult = dataStore.aggregate({\n collection: agg.collection,\n field: agg.field,\n operation: agg.operation,\n });\n log.success(`Memory: ${agg.operation}(${agg.collection}.${agg.field}) = \"${aggregateResult}\"`);\n lastExtractedData = aggregateResult;\n } catch (e) {\n success = false;\n error = e instanceof Error ? e.message : String(e);\n log.error(`Memory aggregate failed: ${error}`);\n }\n\n const explorationAction: ExplorationAction = {\n action: action.action,\n description: action.description,\n aggregation: agg,\n };\n recordedSteps.push({\n ordinal, action: explorationAction, snapshotBefore,\n url: await browser.url(), success, error,\n durationMs: Math.round(performance.now() - actionStart),\n });\n ordinal++;\n results.push({ description: action.description, success, error });\n continue;\n }\n\n // ── extract(JavaScript実行またはAI抽出) ──\n if (action.action === \"extract\") {\n const actionStart = performance.now();\n let success = true;\n let error: string | undefined;\n let extractResult = \"\";\n\n try {\n if (action.script) {\n dl?.log({\n phase: \"generator\",\n event: \"extract\",\n step: ordinal,\n data: { script: action.script.slice(0, 200) },\n });\n const result = await browser.evaluate(action.script);\n const isArray = Array.isArray(result);\n const stringifyApplied = typeof result !== \"string\" && result !== null && result !== undefined;\n extractResult = result === null || result === undefined\n ? \"\"\n : typeof result === \"string\" ? result : JSON.stringify(result);\n dl?.log({\n phase: \"generator\",\n event: \"extract_result\",\n step: ordinal,\n data: {\n resultType: result === null ? \"null\" : typeof result,\n isArray,\n arrayLength: isArray ? (result as unknown[]).length : undefined,\n resultPreview: extractResult.slice(0, 200),\n storedLength: extractResult.length,\n stringifyApplied,\n },\n });\n } else if (action.extractPrompt) {\n dl?.log({\n phase: \"generator\",\n event: \"extract\",\n step: ordinal,\n data: { extractPrompt: action.extractPrompt.slice(0, 200) },\n });\n const snapshot = await browser.snapshot();\n const { getModel, trackedGenerateObject } = await import(\"../harness/ai-model\");\n const extractSchema = z.object({ data: z.string() });\n const aiResult = await trackedGenerateObject(\"extraction\", {\n model: getModel(\"extraction\"),\n prompt: `${action.extractPrompt}\\n\\nスナップショット:\\n${snapshot}`,\n schema: extractSchema,\n temperature: 0,\n });\n extractResult = aiResult.object?.data ?? \"\";\n dl?.log({\n phase: \"generator\",\n event: \"extract_result\",\n step: ordinal,\n data: {\n resultType: \"string (AI)\",\n resultPreview: extractResult.slice(0, 200),\n storedLength: extractResult.length,\n },\n });\n }\n lastExtractedData = extractResult;\n log.success(`Extracted: ${extractResult.slice(0, 100)}${extractResult.length > 100 ? \"...\" : \"\"}`);\n // Scratchpad: 抽出マイルストーン\n const extractLen = extractResult.length;\n addScratchpadEntry(scratchpadEntries, MAX_SCRATCHPAD, `Extracted ${extractLen > 200 ? `${extractLen} chars` : \"data\"} via ${action.script ? \"script\" : \"AI prompt\"}`);\n\n } catch (e) {\n success = false;\n error = e instanceof Error ? e.message : String(e);\n log.error(`Extract failed: ${error}`);\n }\n\n const explorationAction: ExplorationAction = {\n action: action.action,\n description: action.description,\n script: action.script,\n extractPrompt: action.extractPrompt,\n };\n recordedSteps.push({\n ordinal, action: explorationAction, snapshotBefore,\n url: await browser.url(), success, error,\n durationMs: Math.round(performance.now() - actionStart),\n });\n ordinal++;\n results.push({ description: action.description, success, error });\n continue;\n }\n\n // ── download(ファイルダウンロード) ──\n if (action.action === \"download\") {\n const actionStart = performance.now();\n let success = true;\n let error: string | undefined;\n const downloadPath = action.downloadPath ?? `/tmp/download-${Date.now()}.bin`;\n\n try {\n if (action.selector) {\n await browser.download(action.selector, downloadPath);\n } else {\n await browser.waitForDownload(downloadPath);\n }\n log.success(`Downloaded: ${downloadPath}`);\n\n if (downloadManager) {\n downloadManager.addDownload({\n path: downloadPath,\n filename: downloadPath.split(\"/\").pop() ?? \"unknown\",\n stepOrdinal: ordinal,\n timestamp: new Date().toISOString(),\n });\n }\n } catch (e) {\n success = false;\n error = e instanceof Error ? e.message : String(e);\n log.error(`Download failed: ${error}`);\n }\n\n const explorationAction: ExplorationAction = {\n action: action.action,\n selector: action.selector,\n description: action.description,\n downloadPath,\n };\n recordedSteps.push({\n ordinal, action: explorationAction, snapshotBefore,\n url: await browser.url(), success, error,\n durationMs: Math.round(performance.now() - actionStart),\n });\n ordinal++;\n results.push({ description: action.description, success, error });\n continue;\n }\n\n // ── export(メモリコレクションをファイルに書き出し) ──\n if (action.action === \"export\" && dataStore) {\n const actionStart = performance.now();\n const collection = action.exportCollection ?? \"default\";\n const format = (action.exportFormat ?? \"csv\") as \"csv\" | \"json\";\n const exportPath = action.exportPath ?? `/tmp/${collection}.${format}`;\n let success = true;\n let error: string | undefined;\n\n try {\n const exportItems = dataStore.getAll(collection);\n const sampleKeys = exportItems.length > 0\n ? JSON.stringify(Object.keys(exportItems[0]))\n : \"N/A\";\n dl?.log({\n phase: \"generator\",\n event: \"export\",\n step: ordinal,\n data: {\n collection,\n itemCount: exportItems.length,\n format,\n path: exportPath,\n sampleKeys,\n },\n });\n await dataStore.writeToFile(collection, exportPath, format);\n log.success(`Exported: ${collection} → ${exportPath} (${format})`);\n lastExtractedData = exportPath;\n\n if (downloadManager) {\n downloadManager.addDownload({\n path: exportPath,\n filename: exportPath.split(\"/\").pop() ?? \"unknown\",\n stepOrdinal: ordinal,\n timestamp: new Date().toISOString(),\n });\n }\n } catch (e) {\n success = false;\n error = e instanceof Error ? e.message : String(e);\n log.error(`Export failed: ${error}`);\n }\n\n const explorationAction: ExplorationAction = {\n action: action.action,\n description: action.description,\n exportCollection: collection,\n exportFormat: format,\n exportPath,\n };\n recordedSteps.push({\n ordinal, action: explorationAction, snapshotBefore,\n url: await browser.url(), success, error,\n durationMs: Math.round(performance.now() - actionStart),\n });\n ordinal++;\n results.push({ description: action.description, success, error });\n continue;\n }\n\n // ── 通常のブラウザ操作 ──\n const explorationAction: ExplorationAction = {\n action: action.action as ExplorationAction[\"action\"],\n selector: action.selector,\n value: action.value,\n description: action.description,\n inputCategory: action.inputCategory,\n variableName: action.variableName,\n suggestedCaptures: action.suggestedCaptures,\n };\n\n const navigatingActions = new Set([\"click\", \"navigate\"]);\n const mayNavigate = navigatingActions.has(action.action);\n\n const urlBeforeAction = mayNavigate ? await browser.url() : \"\";\n const pageCountBefore = mayNavigate ? await browser.pageCount() : 0;\n const result = await browser.executeStep(explorationAction);\n\n if (mayNavigate) {\n await browser.waitForPossibleNavigation(\n urlBeforeAction,\n pageCountBefore,\n );\n }\n\n const stepUrl = await browser.url();\n\n // RecordedStep に記録(失敗時はエラー分類を付与)\n const recorded: RecordedStep = {\n ordinal,\n action: explorationAction,\n snapshotBefore,\n url: stepUrl,\n success: result.success,\n error: result.error,\n durationMs: result.durationMs,\n failureCategory: result.success ? undefined : classifyFailure({\n error: result.error ?? \"unknown error\",\n selectorResolved: !!action.selector,\n actionExecuted: true,\n }),\n };\n recordedSteps.push(recorded);\n ordinal++;\n\n results.push({\n description: action.description,\n success: result.success,\n error: result.error,\n });\n\n dl?.log({\n phase: \"generator\",\n event: \"action\",\n step: ordinal - 1,\n data: {\n action: action.action,\n selector: action.selector,\n value: action.value,\n description: action.description,\n result: {\n success: result.success,\n error: result.error,\n durationMs: result.durationMs,\n },\n url: stepUrl,\n failureCategory: recorded.failureCategory,\n },\n });\n\n if (result.success) {\n log.success(`OK (${result.durationMs}ms)`);\n // 入力操作の成功を追跡(filledFields として AI に提供)\n if (inputActionTypes.has(action.action) && action.selector) {\n filledFieldsMap.set(action.selector, action.description);\n }\n // Scratchpad: URL 遷移を記録\n if (mayNavigate && stepUrl !== urlBeforeAction) {\n addScratchpadEntry(scratchpadEntries, MAX_SCRATCHPAD, `Navigated ${shortenUrl(urlBeforeAction)} → ${shortenUrl(stepUrl)}`);\n lastUrl = stepUrl;\n }\n } else {\n log.error(`FAILED: ${result.error}`);\n // Scratchpad: 失敗を記録\n addScratchpadEntry(scratchpadEntries, MAX_SCRATCHPAD, `${action.action} ${action.selector ?? \"\"} failed: ${(result.error ?? \"unknown\").slice(0, 60)}`);\n }\n\n await cancellableSleep(getActionDelay(action.action, config.stepDelay), ic);\n }\n\n // navigate 使用時の警告: ページ上にリンクがあるなら click を使うべき\n let navigateNudge: string | undefined;\n if (inputData.actions.some(a => a.action === \"navigate\") && lastSnapshot) {\n const linkCount = parseAllElements(lastSnapshot).filter(e => e.role === \"link\").length;\n if (linkCount > 0) {\n navigateNudge = `注意: ページ上に ${linkCount} 個のリンクがあります。navigate でURLを組み立てるのではなく、ページ上のリンクを click で辿ってください。`;\n }\n }\n\n // ループ検出\n let nudgeMessage: string | undefined = navigateNudge;\n if (recordedSteps.length >= 2) {\n const loopResult = detectLoop(recordedSteps, nudgeCount);\n if (loopResult.isLoop) {\n nudgeCount = loopResult.nudgeCount;\n const loopNudge = loopResult.nudgeMessage ?? undefined;\n nudgeMessage = nudgeMessage && loopNudge\n ? `${nudgeMessage}\\n${loopNudge}`\n : loopNudge ?? nudgeMessage;\n log.warn(`Loop detected: ${loopResult.loopType}`);\n dl?.log({\n phase: \"generator\",\n event: \"loop_detection\",\n step: recordedSteps.length - 1,\n data: loopResult as unknown as Record<string, unknown>,\n });\n }\n }\n\n const postSnapshot = await browser.snapshot();\n const currentUrl = await browser.url();\n\n // テキスト入力のみ(fill/type)かつ全成功なら差分スナップショットを試行\n // fill/type はページ構造を変えないため、構造シグネチャが同一なら\n // コンパクトな ref 一覧を返してトークンを節約する。\n const textOnlyActions = new Set([\"fill\", \"type\"]);\n const allTextOnly = inputData.actions.length > 0\n && inputData.actions.every(a => textOnlyActions.has(a.action))\n && results.every(r => r.success);\n\n let finalSnapshot: string;\n\n if (allTextOnly && lastSnapshot) {\n const oldSig = extractStructuralSignature(lastSnapshot);\n const newSig = extractStructuralSignature(postSnapshot);\n\n if (oldSig === newSig) {\n finalSnapshot = buildDiffSnapshot(postSnapshot, filledFieldsMap);\n dl?.log({\n phase: \"generator\",\n event: \"snapshot_diff\",\n step: recordedSteps.length - 1,\n data: { url: currentUrl, reason: \"structure_unchanged\", elementCount: newSig.split(\"\\n\").length },\n });\n } else {\n const filledSelectors = filledFieldsMap.size > 0\n ? new Set(filledFieldsMap.keys()) : undefined;\n finalSnapshot = config.snapshotFilter\n ? filterSnapshot(postSnapshot, { filledSelectors }) : postSnapshot;\n dl?.log({\n phase: \"generator\",\n event: \"snapshot\",\n step: recordedSteps.length - 1,\n data: { url: currentUrl, snapshot: postSnapshot, filteredSnapshot: finalSnapshot },\n });\n }\n } else {\n const filledSelectors = filledFieldsMap.size > 0\n ? new Set(filledFieldsMap.keys()) : undefined;\n finalSnapshot = config.snapshotFilter\n ? filterSnapshot(postSnapshot, { filledSelectors }) : postSnapshot;\n dl?.log({\n phase: \"generator\",\n event: \"snapshot\",\n step: recordedSteps.length - 1,\n data: { url: currentUrl, snapshot: postSnapshot, filteredSnapshot: finalSnapshot },\n });\n }\n\n lastSnapshot = postSnapshot;\n\n // 介入ガイダンスを nudgeMessage に合成\n if (interventionNudge) {\n nudgeMessage = nudgeMessage\n ? `${interventionNudge}\\n${nudgeMessage}`\n : interventionNudge;\n }\n\n // メモリコレクション状態を収集\n const memoryStatus = dataStore\n ? Object.fromEntries(\n dataStore.listCollections().map((c) => [c, dataStore.count(c)]),\n )\n : undefined;\n\n // extractedData は extract/memory_aggregate アクションを含む呼び出しのみ返す\n // AI に渡す際はプレビューに圧縮(生データは lastExtractedData に保持)\n const hasExtractAction = inputData.actions.some(\n a => a.action === \"extract\" || a.action === \"memory_aggregate\",\n );\n const extractedDataPreview = hasExtractAction && lastExtractedData\n ? truncateExtractedData(lastExtractedData, 500)\n : undefined;\n\n // 古い recordedSteps の snapshotBefore をクリア(メモリ節約)\n const keepRecent = 5;\n if (recordedSteps.length > keepRecent) {\n recordedSteps[recordedSteps.length - keepRecent - 1].snapshotBefore = \"\";\n }\n\n // 入力済みフィールドのサマリーを構築\n const filledFieldsSummary = filledFieldsMap.size > 0\n ? [...filledFieldsMap.entries()]\n .map(([sel, desc]) => `${sel}: ${desc}`)\n .join(\", \")\n : undefined;\n\n // ── ページネーション進捗ナッジ ──\n // 過去にデータ収集アクションが1回でも成功していれば、以降の全ツールコールで\n // ページネーション進捗を返す(click のみのコールでも発火させる)\n let paginationCurrentPage = 0;\n let paginationTotalPages = 0;\n let paginationPagesProcessed = 0;\n const dataCollectionActionSet = new Set([\"download\", \"extract\", \"memory_append\", \"memory_aggregate\"]);\n const hasDataCollectionHistory = recordedSteps.some(\n s => s.success && dataCollectionActionSet.has(s.action.action),\n );\n if (hasDataCollectionHistory) {\n const pageMatch = postSnapshot.match(/Page\\s+(\\d+)\\s+(?:of|\\/)\\s+(\\d+)/i);\n if (pageMatch) {\n paginationCurrentPage = Number(pageMatch[1]);\n paginationTotalPages = Number(pageMatch[2]);\n if (paginationCurrentPage < paginationTotalPages) {\n paginationPagesProcessed = recordedSteps.filter(\n s => s.success && (s.action.action === \"download\" || s.action.action === \"extract\"),\n ).length;\n const paginationNudge = `Pagination progress: Page ${paginationCurrentPage} of ${paginationTotalPages} (${paginationPagesProcessed} pages processed, ${paginationTotalPages - paginationPagesProcessed} remaining). You MUST continue processing ALL remaining pages — do NOT stop early.`;\n nudgeMessage = nudgeMessage ? `${nudgeMessage}\\n${paginationNudge}` : paginationNudge;\n // paginationTracker を更新(prepareStep で参照)\n if (config.paginationTracker) {\n config.paginationTracker.currentPage = paginationCurrentPage;\n config.paginationTracker.totalPages = paginationTotalPages;\n }\n }\n }\n }\n\n // 未入力フォームフィールドの検出: フォーム入力が進行中(3件以上入力済み)の場合、\n // まだ未操作のフォーム要素があれば AI にヒントを返す\n if (filledFieldsMap.size >= 3) {\n const formRoles = new Set([\"textbox\", \"combobox\", \"checkbox\", \"spinbutton\"]);\n const filledRefs = new Set(\n [...filledFieldsMap.keys()].map(s => s.replace(\"@\", \"\")),\n );\n const allElements = parseAllElements(postSnapshot);\n const remainingFormElements = allElements.filter(\n e => formRoles.has(e.role) && !filledRefs.has(e.ref),\n );\n\n if (remainingFormElements.length > 0) {\n const names = remainingFormElements\n .map(e => e.name ? `\"${e.name}\"` : `@${e.ref}`)\n .join(\", \");\n const formHint = `Note: ${remainingFormElements.length} form fields not yet filled: ${names}. Fill all remaining fields before submitting.`;\n nudgeMessage = nudgeMessage ? `${nudgeMessage}\\n${formHint}` : formHint;\n }\n }\n\n // ページネーション進捗バナーをスナップショット先頭に埋め込む\n // nudgeMessage とは別に、スナップショット本文の先頭に配置して AI が無視できないようにする\n if (paginationCurrentPage > 0 && paginationCurrentPage < paginationTotalPages) {\n const banner = `[PAGINATION INCOMPLETE: ${paginationPagesProcessed}/${paginationTotalPages} pages processed. ${paginationTotalPages - paginationPagesProcessed} pages remaining. You MUST continue — do NOT return goalAchieved yet.]`;\n finalSnapshot = `${banner}\\n${finalSnapshot}`;\n }\n\n // Build scratchpad string from entries\n const scratchpad = scratchpadEntries.length > 0\n ? scratchpadEntries.join(\"\\n\")\n : undefined;\n\n return {\n results,\n snapshot: finalSnapshot,\n url: currentUrl,\n nudgeMessage,\n stepCount: recordedSteps.length,\n ...(memoryStatus && Object.keys(memoryStatus).length > 0 ? { memoryStatus } : {}),\n ...(extractedDataPreview ? { extractedData: extractedDataPreview } : {}),\n ...(filledFieldsSummary ? { filledFields: filledFieldsSummary } : {}),\n ...(scratchpad ? { scratchpad } : {}),\n };\n },\n });\n}\n\n/** Ring buffer に探索スクラッチパッドエントリを追加 */\nfunction addScratchpadEntry(entries: string[], max: number, entry: string): void {\n entries.push(entry);\n if (entries.length > max) {\n entries.shift();\n }\n}\n\n/** URL をパス部分のみに短縮(ホスト名省略) */\nfunction shortenUrl(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.pathname + (parsed.search ? parsed.search.slice(0, 30) : \"\");\n } catch {\n return url.slice(0, 50);\n }\n}\n\n/**\n * スナップショットから構造シグネチャを抽出。\n * 各行の indent:role:ref を連結した文字列。名前・属性値は無視。\n * fill/type は値のみ変更するため、シグネチャが同一なら構造変化なし。\n */\nfunction extractStructuralSignature(snapshot: string): string {\n return snapshot.split(\"\\n\")\n .map(line => {\n const indent = line.length - line.trimStart().length;\n const trimmed = line.trimStart().replace(/^-\\s+/, \"\");\n const roleMatch = trimmed.match(/^(\\S+)/);\n const refMatch = line.match(/\\[ref=(e\\d+)\\]/);\n return `${indent}:${roleMatch?.[1] ?? \"\"}:${refMatch?.[1] ?? \"\"}`;\n })\n .join(\"\\n\");\n}\n\n/**\n * 構造変化なし時のコンパクトスナップショットを構築。\n * 未入力フィールドを優先表示し、AI が次のアクションを判断しやすくする。\n */\nfunction buildDiffSnapshot(\n snapshot: string,\n filledFieldsMap: Map<string, string>,\n): string {\n const elements = parseAllElements(snapshot);\n const filledRefs = new Set(\n [...filledFieldsMap.keys()].map(sel => sel.replace(\"@\", \"\")),\n );\n\n const unfilled: string[] = [];\n const filled: string[] = [];\n\n for (const el of elements) {\n const label = `@${el.ref} ${el.role}${el.name ? ` \"${el.name}\"` : \"\"}`;\n if (filledRefs.has(el.ref)) {\n filled.push(label);\n } else {\n unfilled.push(label);\n }\n }\n\n const lines = [\n `[Structure unchanged after text input. ${elements.length} interactive elements, all refs valid.]`,\n ];\n if (unfilled.length > 0) {\n lines.push(`Unfilled: ${unfilled.join(\", \")}`);\n }\n if (filled.length > 0) {\n lines.push(`Filled (${filled.length}): ${filled.join(\", \")}`);\n }\n return lines.join(\"\\n\");\n}\n","/**\n * loop-detector — ハッシュベースのループ検出\n *\n * BrowserUse の ActionLoopDetector パターンを参考に、\n * AI stall check の前に高速・無料な決定的ループ検出を行う。\n */\n\nimport type { RecordedStep } from \"../instruction-generator/types\";\n\nexport interface LoopDetectionResult {\n isLoop: boolean;\n loopType: \"exact_repeat\" | \"action_cycle\" | \"url_bounce\" | \"selector_refill\" | null;\n nudgeMessage: string | null;\n nudgeCount: number;\n shouldPromptHuman: boolean;\n}\n\n/**\n * RecordedStep からハッシュ文字列を生成\n * action|selector|urlPath の組み合わせ\n */\nfunction stepHash(step: RecordedStep): string {\n const urlPath = extractPath(step.url);\n return `${step.action.action}|${step.action.selector ?? \"\"}|${urlPath}`;\n}\n\nfunction extractPath(url: string): string {\n try {\n return new URL(url).pathname;\n } catch {\n return url;\n }\n}\n\n/**\n * ループを検出してナッジメッセージを返す\n *\n * @param recordedSteps - これまでの全ステップ\n * @param previousNudgeCount - これまでのナッジ回数\n * @param windowSize - 検出ウィンドウサイズ (default: 4)\n */\nexport function detectLoop(\n recordedSteps: RecordedStep[],\n previousNudgeCount: number,\n windowSize = 4,\n): LoopDetectionResult {\n const noLoop: LoopDetectionResult = {\n isLoop: false,\n loopType: null,\n nudgeMessage: null,\n nudgeCount: previousNudgeCount,\n shouldPromptHuman: false,\n };\n\n if (recordedSteps.length < 2) return noLoop;\n\n // 1. Exact repeat: 直近2アクションのハッシュが同一\n const last = stepHash(recordedSteps[recordedSteps.length - 1]);\n const secondLast = stepHash(recordedSteps[recordedSteps.length - 2]);\n if (last === secondLast) {\n return buildResult(\"exact_repeat\", previousNudgeCount);\n }\n\n // 2. Action cycle: ウィンドウ内のハッシュ列が繰り返し ([A,B,A,B] パターン)\n // ただしデータ収集アクション(download/extract/memory系/export)を含む場合はスキップ\n // → ページネーション走査(download→click→download→click)はループではない\n if (recordedSteps.length >= windowSize) {\n const recentSteps = recordedSteps.slice(-windowSize);\n const dataCollectionActions = new Set([\"download\", \"extract\", \"memory_append\", \"memory_aggregate\", \"export\"]);\n const hasDataCollection = recentSteps.some(s => dataCollectionActions.has(s.action.action));\n\n if (!hasDataCollection) {\n const recentHashes = recentSteps.map(stepHash);\n const halfLen = Math.floor(windowSize / 2);\n const firstHalf = recentHashes.slice(0, halfLen).join(\",\");\n const secondHalf = recentHashes.slice(halfLen, halfLen * 2).join(\",\");\n if (firstHalf === secondHalf) {\n return buildResult(\"action_cycle\", previousNudgeCount);\n }\n }\n }\n\n // 3. URL bounce: 直近4ステップで2URLが交互\n if (recordedSteps.length >= 4) {\n const recentUrls = recordedSteps.slice(-4).map((s) => extractPath(s.url));\n if (\n recentUrls[0] === recentUrls[2] &&\n recentUrls[1] === recentUrls[3] &&\n recentUrls[0] !== recentUrls[1]\n ) {\n return buildResult(\"url_bounce\", previousNudgeCount);\n }\n }\n\n // 4. Selector refill: 同一セレクタへの入力操作が3回以上(大フォームでの再入力ループ検出)\n const inputActions = new Set([\"fill\", \"type\", \"select\", \"check\", \"uncheck\"]);\n const selectorCounts = new Map<string, { count: number; description: string }>();\n for (const step of recordedSteps) {\n if (!step.success) continue;\n if (!inputActions.has(step.action.action)) continue;\n if (!step.action.selector) continue;\n const key = `${step.action.action}|${step.action.selector}`;\n const existing = selectorCounts.get(key);\n if (existing) {\n existing.count++;\n } else {\n selectorCounts.set(key, { count: 1, description: step.action.description });\n }\n }\n\n const refills = [...selectorCounts.entries()]\n .filter(([, v]) => v.count >= 3)\n .map(([k, v]) => ({ selector: k.split(\"|\")[1], count: v.count, description: v.description }));\n\n if (refills.length > 0) {\n const details = refills\n .map((r) => `${r.selector} \"${r.description}\" (${r.count}回)`)\n .join(\", \");\n return buildRefillResult(details, previousNudgeCount);\n }\n\n return noLoop;\n}\n\nfunction buildResult(\n loopType: \"exact_repeat\" | \"action_cycle\" | \"url_bounce\",\n previousNudgeCount: number,\n): LoopDetectionResult {\n const nudgeCount = previousNudgeCount + 1;\n const messages: Record<string, string> = {\n exact_repeat:\n \"同じ操作を繰り返しています。別のアプローチを試してください。\",\n action_cycle:\n \"操作がループしています。異なる戦略を検討してください。\",\n url_bounce:\n \"同じURL間を行き来しています。目的のページに留まって操作を進めてください。\",\n };\n\n return {\n isLoop: true,\n loopType,\n nudgeMessage: messages[loopType],\n nudgeCount,\n // 1回目はナッジのみ、2回目以降は人間に確認\n shouldPromptHuman: nudgeCount >= 2,\n };\n}\n\nfunction buildRefillResult(\n details: string,\n previousNudgeCount: number,\n): LoopDetectionResult {\n const nudgeCount = previousNudgeCount + 1;\n return {\n isLoop: true,\n loopType: \"selector_refill\",\n nudgeMessage: `同じフォームフィールドを繰り返し入力しています。以下は既に入力済みです: ${details}。入力済みフィールドをスキップし、未入力フィールドに進んでください。`,\n nudgeCount,\n shouldPromptHuman: nudgeCount >= 2,\n };\n}\n","/**\n * intervention-controller — 探索中のユーザー介入管理\n *\n * stdin キー押下で一時停止フラグをセットし、\n * browser-tool の execute から呼ばれて介入テキストを収集する。\n */\n\nimport { promptSelect, promptText, log } from \"../cli/prompts\";\nimport type { InterventionRecord } from \"./types\";\n\nexport type InterventionAction = \"guidance\" | \"abort\";\n\nexport interface InterventionResult {\n action: InterventionAction;\n guidanceText?: string;\n}\n\nexport interface InterventionControllerOptions {\n onPause?: () => void;\n onResume?: () => void;\n onCancel?: () => void;\n}\n\nexport class InterventionController {\n private pauseRequested = false;\n private cancelRequested = false;\n private stdinCleanup: (() => void) | null = null;\n private options: InterventionControllerOptions = {};\n readonly interventions: InterventionRecord[] = [];\n\n /**\n * spinner コールバックを後から設定する\n */\n setCallbacks(options: InterventionControllerOptions): void {\n this.options = options;\n }\n\n /**\n * stdin の raw mode キーリスナーを開始。\n * Enter キーまたは p キーで pauseRequested フラグをセット。\n */\n startListening(): void {\n if (!process.stdin.isTTY) return;\n\n const onData = (data: Buffer) => {\n // 'q' key (0x71) or Ctrl+C (0x03) → cancel\n if (data[0] === 0x71 || data[0] === 0x03) {\n if (!this.cancelRequested) {\n this.cancelRequested = true;\n log.warn(\"⏹ キャンセルを要求しました...\");\n this.options.onCancel?.();\n }\n return;\n }\n // Enter key (0x0d) or 'p' key (0x70) → pause\n if (data[0] === 0x0d || data[0] === 0x70) {\n if (!this.pauseRequested) {\n this.pauseRequested = true;\n log.warn(\"⏸ 一時停止を要求しました。次のツール呼び出しで停止します...\");\n }\n }\n };\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on(\"data\", onData);\n\n this.stdinCleanup = () => {\n process.stdin.off(\"data\", onData);\n try {\n process.stdin.setRawMode(false);\n } catch {\n // setRawMode failure is non-critical\n }\n process.stdin.pause();\n };\n }\n\n /**\n * 一時停止が要求されているか確認\n */\n isPauseRequested(): boolean {\n return this.pauseRequested;\n }\n\n /**\n * キャンセルが要求されているか確認\n */\n isCancelRequested(): boolean {\n return this.cancelRequested;\n }\n\n /**\n * 一時停止中にユーザーから介入指示を収集。\n * stdin raw mode を一時的に解除して @clack/prompts を使う。\n */\n async collectIntervention(\n currentStepIndex: number,\n currentUrl: string,\n ): Promise<InterventionResult> {\n this.suspendRawMode();\n this.options.onPause?.();\n\n try {\n log.info(\n `--- 一時停止 (ステップ #${currentStepIndex}, URL: ${currentUrl}) ---`,\n );\n\n const action = await promptSelect<InterventionAction>(\n \"操作を選択してください\",\n [\n {\n value: \"guidance\",\n label: \"ガイダンスを入力して続行\",\n hint: \"AIの探索方針を修正\",\n },\n { value: \"abort\", label: \"探索を中止\" },\n ],\n );\n\n if (action === \"abort\") {\n return { action: \"abort\" };\n }\n\n const guidanceText = await promptText(\"ガイダンス (AIへの指示)\", {\n validate: (v) =>\n !v?.trim() ? \"ガイダンスを入力してください\" : undefined,\n });\n\n const record: InterventionRecord = {\n stepIndex: currentStepIndex,\n userInstruction: guidanceText.trim(),\n url: currentUrl,\n timestamp: new Date().toISOString(),\n };\n this.interventions.push(record);\n\n log.success(`ガイダンスを記録しました: \"${guidanceText.trim()}\"`);\n\n return { action: \"guidance\", guidanceText: guidanceText.trim() };\n } finally {\n this.pauseRequested = false;\n this.resumeRawMode();\n this.options.onResume?.();\n }\n }\n\n /**\n * リスナーを停止しリソースを解放\n */\n dispose(): void {\n if (this.stdinCleanup) {\n this.stdinCleanup();\n this.stdinCleanup = null;\n }\n }\n\n private suspendRawMode(): void {\n if (this.stdinCleanup) {\n try {\n process.stdin.setRawMode(false);\n } catch {\n // non-critical\n }\n process.stdin.pause();\n }\n }\n\n private resumeRawMode(): void {\n if (this.stdinCleanup) {\n try {\n process.stdin.setRawMode(true);\n } catch {\n // non-critical\n }\n process.stdin.resume();\n }\n }\n}\n","/**\n * explorer — AI SDK generateText による探索ループ\n *\n * AgentBrowser を AI SDK tool 化し、generateText の tool-calling ループで\n * ゴール達成まで自律的に探索する。\n * prepareStep で古いスナップショットを刈り取り、トークン消費を抑制。\n */\n\nimport { AgentBrowser } from \"../browser/browser-client\";\nimport { exploreWithAI } from \"./exploration-agent\";\nimport { InMemoryDataStore } from \"../context/data-store\";\nimport { DownloadManager } from \"../context/download-manager\";\nimport { log, spinner } from \"../cli/prompts\";\nimport { formatDuration } from \"../cli/format\";\nimport { createDebugLogger } from \"../cli/debug-logger\";\nimport { InterventionController } from \"./intervention-controller\";\nimport type { GeneratorConfig, RecordedStep, InterventionRecord } from \"./types\";\nimport { sleep } from \"../harness/sleep\";\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport async function explore(config: GeneratorConfig): Promise<{\n recordedSteps: RecordedStep[];\n goalAchieved: boolean;\n additionalGuidance: string[];\n interventions: InterventionRecord[];\n cancelled: boolean;\n error?: Error;\n}> {\n const browser = new AgentBrowser();\n const recordedSteps: RecordedStep[] = [];\n const debugLogger = createDebugLogger({\n filePath: config.debugLogPath,\n console: config.debugConsole,\n });\n const interventionController = new InterventionController();\n\n // スクリーンショットディレクトリの準備\n if (config.screenshotDir) {\n await mkdir(config.screenshotDir, { recursive: true });\n }\n\n try {\n // 初期ページを開く\n const s = spinner();\n s.start(`${config.url} を開いています...`);\n await browser.open(config.url, {\n headless: config.headless,\n stealth: config.stealth,\n proxy: config.proxy,\n });\n await sleep(1000); // ページロード待ち\n s.stop(\"ページ読み込み完了\");\n\n // 動画録画開始\n if (config.videoDir) {\n try {\n await browser.startRecording(config.videoDir);\n log.info(`録画開始: ${config.videoDir}`);\n } catch (e) {\n log.warn(`録画開始に失敗しました: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n // 初期画面のスクリーンショット保存\n if (config.screenshotDir) {\n try {\n const initialPath = join(config.screenshotDir, \"initial.png\");\n await browser.screenshot(initialPath);\n log.step(`Initial screenshot saved: ${initialPath}`);\n } catch {\n // スクリーンショット失敗は無視\n }\n }\n\n // 介入コントローラーに spinner コールバックを設定\n interventionController.setCallbacks({\n onPause: () => s.stop(\"⏸ 一時停止\"),\n onResume: () =>\n s.start(\"エージェント探索中... [Enter: 一時停止 / q: キャンセル]\"),\n onCancel: () => s.stop(\"⏹ キャンセル\"),\n });\n\n // DataStore / DownloadManager 生成\n const dataStore = new InMemoryDataStore();\n const outputDir = config.screenshotDir\n ? join(config.screenshotDir, \"..\")\n : undefined;\n const downloadManager = outputDir\n ? new DownloadManager(outputDir)\n : undefined;\n\n const maxSteps = config.maxIterations * 3;\n\n s.start(\n `エージェント探索中 (最大 ${maxSteps} ステップ)... [Enter: 一時停止 / q: キャンセル]`,\n );\n interventionController.startListening();\n\n const agentStart = performance.now();\n const result = await exploreWithAI(browser, recordedSteps, {\n goal: config.goal,\n contextMarkdown: config.contextMarkdown,\n secrets: config.secrets,\n maxIterations: config.maxIterations,\n stepDelay: config.stepDelay,\n snapshotFilter: config.snapshotFilter,\n screenshotDir: config.screenshotDir,\n debugLogger,\n interventionController,\n historyWindow: config.historyWindow,\n enableMultiModel: config.enableMultiModel,\n }, dataStore, downloadManager);\n interventionController.dispose();\n s.stop(`探索完了 (${formatDuration(performance.now() - agentStart)})`);\n\n // 構造化出力からゴール達成を判定\n const { goalResult } = result;\n log.info(`Goal achieved: ${goalResult.goalAchieved}`);\n log.info(`Summary: ${goalResult.summary}`);\n log.info(`Tokens: prompt=${result.totalTokens.promptTokens}, completion=${result.totalTokens.completionTokens}, total=${result.totalTokens.totalTokens}`);\n\n // メモリデータ出力\n if (dataStore.listCollections().length > 0) {\n log.info(`Memory collections: ${dataStore.listCollections().join(\", \")}`);\n if (outputDir) {\n for (const collection of dataStore.listCollections()) {\n const filePath = join(outputDir, `${collection}.json`);\n await dataStore.writeToFile(collection, filePath, \"json\");\n log.info(`Memory data exported: ${filePath}`);\n }\n }\n }\n\n // ダウンロードファイル一覧\n if (downloadManager && downloadManager.getDownloads().length > 0) {\n log.info(`Downloaded files: ${downloadManager.getDownloads().length}`);\n for (const dl of downloadManager.getDownloads()) {\n log.info(` - ${dl.filename} (${dl.path})`);\n }\n }\n\n await debugLogger.flush();\n\n const interventions = interventionController.interventions;\n const additionalGuidance = interventions.map((iv) => iv.userInstruction);\n\n return {\n recordedSteps,\n goalAchieved: goalResult.goalAchieved,\n additionalGuidance,\n interventions,\n cancelled: interventionController.isCancelRequested(),\n };\n } catch (err) {\n const interventions = interventionController.interventions;\n return {\n recordedSteps,\n goalAchieved: false,\n additionalGuidance: interventions.map((iv) => iv.userInstruction),\n interventions,\n cancelled: interventionController.isCancelRequested(),\n error: err instanceof Error ? err : new Error(String(err)),\n };\n } finally {\n try {\n interventionController.dispose();\n } catch {\n // dispose失敗は無視\n }\n // 動画録画停止\n if (browser.isRecording()) {\n try {\n const result = await browser.stopRecording();\n for (const p of result.paths) {\n log.info(`録画完了: ${p}`);\n }\n } catch (e) {\n log.warn(`録画停止に失敗しました: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n try {\n await browser.close();\n } catch {\n // close失敗は無視\n }\n }\n}\n","/**\n * instruction-builder — RecordedStep[] → YAML指示書変換\n *\n * ブラウザ/AI非依存の純粋関数。\n */\n\nimport { stringify } from \"yaml\";\nimport type { RecordedStep, ReviewResult, SuggestedCapture, InterventionRecord } from \"./types\";\nimport { findElementInSnapshot } from \"../browser/snapshot-parser\";\nimport { buildSelector } from \"../browser/selector-builder\";\nimport type { Selector, VariableSource, StepCapture } from \"../instruction-executor/types\";\nimport { ParsedInstructionSchema } from \"../schemas/instruction-schema\";\n\ninterface InstructionInput {\n goal: string;\n startUrl: string;\n recordedSteps: RecordedStep[];\n goalAchieved: boolean;\n stepDelay: number;\n reviewResult?: ReviewResult;\n humanGuidance?: string[];\n interventions?: InterventionRecord[];\n}\n\n/** ExplorationAction.action → YAML action.type マッピング */\nfunction toActionType(\n action: string,\n): \"click\" | \"input\" | \"select\" | \"navigate\" | \"scroll\" | \"wait\" | \"hover\" | \"extract\" | \"download\" | \"export\" | \"memory\" {\n switch (action) {\n case \"fill\":\n case \"type\":\n return \"input\";\n case \"check\":\n case \"uncheck\":\n case \"click\":\n return \"click\";\n case \"select\":\n return \"select\";\n case \"navigate\":\n return \"navigate\";\n case \"scroll\":\n return \"scroll\";\n case \"wait\":\n return \"wait\";\n case \"extract\":\n return \"extract\";\n case \"download\":\n return \"download\";\n case \"export\":\n return \"export\";\n case \"memory_append\":\n case \"memory_aggregate\":\n return \"memory\";\n default:\n return \"click\";\n }\n}\n\n/** inputCategory → VariableSource マッピング */\nfunction categoryToSource(\n category: \"credential\" | \"user_data\" | \"fixed\" | \"navigation\" | undefined,\n): VariableSource {\n switch (category) {\n case \"credential\":\n return \"prompt\";\n case \"user_data\":\n return \"prompt\";\n case \"fixed\":\n return \"fixed\";\n case \"navigation\":\n return \"fixed\";\n default:\n return \"prompt\";\n }\n}\n\n/**\n * RecordedStep配列からYAML指示書文字列を生成\n */\nexport function buildInstructionYaml(input: InstructionInput): string {\n const { goal, startUrl, recordedSteps, goalAchieved, stepDelay, reviewResult, humanGuidance, interventions } = input;\n\n const successfulSteps = recordedSteps.filter((s) => s.success);\n\n // reviewResult がある場合、keep=true のステップのみ残す\n const reviewMap = new Map(\n reviewResult?.reviewedSteps.map((r) => [r.originalOrdinal, r]),\n );\n const filteredSteps = reviewResult\n ? successfulSteps.filter((s) => reviewMap.get(s.ordinal)?.keep !== false)\n : successfulSteps;\n\n // ── 変数定義の構築 ──\n const variables: Record<string, {\n source: VariableSource;\n description?: string;\n required?: boolean;\n sensitive?: boolean;\n value?: string;\n }> = {};\n\n // 変数名の重複管理(同じ名前の変数は1つだけ定義)\n const usedVariableNames = new Set<string>();\n\n filteredSteps.forEach((recorded) => {\n const { action } = recorded;\n const actionType = toActionType(action.action);\n\n if (actionType === \"input\" && action.value !== undefined) {\n const varName = action.variableName ?? `input_${recorded.ordinal}`;\n if (!usedVariableNames.has(varName)) {\n usedVariableNames.add(varName);\n const source = categoryToSource(action.inputCategory);\n variables[varName] = {\n source,\n description: action.description,\n ...(source === \"prompt\" && {\n required: true,\n sensitive: action.inputCategory === \"credential\",\n }),\n ...(source === \"fixed\" && { value: action.value }),\n };\n }\n }\n });\n\n // ── steps構築 ──\n const steps = filteredSteps.map((recorded, index) => {\n const actionType = toActionType(recorded.action.action);\n const review = reviewMap.get(recorded.ordinal);\n\n // スナップショットから要素を特定してSelectorを構築\n let selector: Selector | undefined;\n if (recorded.action.selector) {\n const ref = recorded.action.selector.replace(\"@\", \"\");\n const element = findElementInSnapshot(recorded.snapshotBefore, ref);\n if (element) {\n selector = buildSelector(element);\n } else {\n selector = { tagName: \"unknown\", ariaLabel: recorded.action.description };\n }\n }\n\n // input値を {{varName}} テンプレートに置換\n let value: string | undefined;\n if (actionType === \"input\" && recorded.action.value !== undefined) {\n const varName = recorded.action.variableName ?? `input_${recorded.ordinal}`;\n value = `{{${varName}}}`;\n }\n\n const step: Record<string, unknown> = {\n ordinal: index,\n description: recorded.action.description,\n action: {\n type: actionType,\n ...(selector && { selector }),\n ...(actionType === \"input\" && value !== undefined && { value }),\n ...(actionType === \"select\" && recorded.action.value !== undefined && {\n optionText: recorded.action.value,\n }),\n ...(actionType === \"navigate\" && recorded.action.value && {\n url: recorded.action.value,\n }),\n ...(actionType === \"extract\" && recorded.action.script && {\n script: recorded.action.script,\n }),\n ...(actionType === \"download\" && recorded.action.downloadPath && {\n downloadPath: recorded.action.downloadPath,\n }),\n ...(actionType === \"export\" && recorded.action.exportCollection && {\n exportCollection: recorded.action.exportCollection,\n }),\n ...(actionType === \"export\" && recorded.action.exportFormat && {\n exportFormat: recorded.action.exportFormat,\n }),\n ...(actionType === \"export\" && recorded.action.exportPath && {\n exportPath: recorded.action.exportPath,\n }),\n },\n url: recorded.url,\n riskLevel: review?.riskLevel ?? \"low\",\n requiresConfirmation: review?.requiresConfirmation ?? false,\n };\n\n // キャプチャ定義\n const captures = buildCaptures(recorded.action.suggestedCaptures);\n if (captures.length > 0) {\n step.captures = captures;\n }\n\n // メモリオペレーション定義\n if (recorded.action.action === \"memory_append\" && recorded.action.memoryCollection) {\n step.memoryOperations = [{\n type: \"append\" as const,\n collection: recorded.action.memoryCollection,\n source: recorded.action.variableName ?? \"extractedData\",\n }];\n } else if (recorded.action.action === \"memory_aggregate\" && recorded.action.aggregation) {\n const agg = recorded.action.aggregation;\n step.memoryOperations = [{\n type: \"aggregate\" as const,\n collection: agg.collection,\n field: agg.field,\n operation: agg.operation,\n outputVariable: agg.outputVariable,\n }];\n }\n\n return step;\n });\n\n // ── YAML構造構築 ──\n const baseUrl = new URL(startUrl).origin;\n\n const instruction: Record<string, unknown> = {\n title: goal,\n settings: {\n baseUrl,\n defaultTimeout: 10000,\n pauseBetweenSteps: stepDelay,\n stopOnError: true,\n },\n metadata: {\n startUrl,\n goal,\n goalAchieved,\n totalSteps: filteredSteps.length,\n generatedAt: new Date().toISOString(),\n },\n };\n\n if (Object.keys(variables).length > 0) {\n instruction.variables = variables;\n }\n\n instruction.steps = steps;\n\n const allNotes: string[] = [];\n if (humanGuidance && humanGuidance.length > 0) {\n allNotes.push(\n ...humanGuidance.map((g, i) => `[方針修正 ${i + 1}] ${g}`),\n );\n }\n if (interventions && interventions.length > 0) {\n allNotes.push(\n ...interventions.map(\n (iv) => `[探索中介入 ステップ#${iv.stepIndex}] ${iv.userInstruction}`,\n ),\n );\n }\n if (allNotes.length > 0) {\n instruction.notes = allNotes.join(\"\\n\");\n }\n\n // ラウンドトリップ検証: 生成した構造が Zod スキーマに適合するか確認\n ParsedInstructionSchema.parse(instruction);\n\n return stringify(instruction, { lineWidth: 120 });\n}\n\n/**\n * SuggestedCapture[] → YAML用キャプチャ定義に変換\n */\nfunction buildCaptures(\n suggested: SuggestedCapture[] | undefined,\n): StepCapture[] {\n if (!suggested || suggested.length === 0) return [];\n\n return suggested.map((c) => ({\n name: c.name,\n strategy: c.strategy,\n required: false,\n ...(c.description && { description: c.description }),\n ...(c.pattern && { pattern: c.pattern }),\n ...(c.group !== undefined && c.group !== 1 && { group: c.group }),\n ...(c.prompt && { prompt: c.prompt }),\n ...(c.expression && { expression: c.expression }),\n }));\n}\n","/**\n * selector-builder — ParsedSnapshotElement → ElementSelector 変換\n *\n * スナップショットのロール/名前からcontractsのElementSelectorへ近似変換。\n * 正確なロケーターではなく、ヒントとしての変換。\n */\n\nimport type { ElementSelector } from \"../schemas/element-selector\";\nimport type { ParsedSnapshotElement } from \"./snapshot-parser\";\n\n/** role → tagName マッピング */\nexport const ROLE_TAG_MAP: Record<\n string,\n { tagName: string; inputType?: string; role?: string }\n> = {\n textbox: { tagName: \"input\", inputType: \"text\" },\n button: { tagName: \"button\", role: \"button\" },\n link: { tagName: \"a\", role: \"link\" },\n checkbox: { tagName: \"input\", inputType: \"checkbox\" },\n radio: { tagName: \"input\", inputType: \"radio\" },\n combobox: { tagName: \"select\", role: \"combobox\" },\n searchbox: { tagName: \"input\", inputType: \"search\" },\n slider: { tagName: \"input\", inputType: \"range\" },\n spinbutton: { tagName: \"input\", inputType: \"number\" },\n switch: { tagName: \"input\", inputType: \"checkbox\", role: \"switch\" },\n tab: { tagName: \"button\", role: \"tab\" },\n menuitem: { tagName: \"button\", role: \"menuitem\" },\n option: { tagName: \"option\", role: \"option\" },\n heading: { tagName: \"h2\", role: \"heading\" },\n img: { tagName: \"img\", role: \"img\" },\n navigation: { tagName: \"nav\", role: \"navigation\" },\n listitem: { tagName: \"li\", role: \"listitem\" },\n};\n\n/**\n * ParsedSnapshotElement を ElementSelector に変換\n */\nexport function buildSelector(\n element: ParsedSnapshotElement,\n): ElementSelector {\n const mapping = ROLE_TAG_MAP[element.role];\n const tagName = mapping?.tagName ?? element.role;\n\n const selector: ElementSelector = { tagName };\n\n // role\n if (mapping?.role) {\n selector.role = mapping.role;\n } else if (element.role !== tagName) {\n selector.role = element.role;\n }\n\n // inputType\n if (mapping?.inputType) {\n selector.inputType = mapping.inputType;\n }\n\n // name → ariaLabel(共通)\n if (element.name) {\n selector.ariaLabel = element.name;\n\n // button/link は innerText も設定\n if (element.role === \"button\" || element.role === \"link\") {\n selector.innerText = element.name.slice(0, 200);\n }\n }\n\n // 属性から追加情報を取得\n if (element.attributes.placeholder) {\n selector.placeholder = element.attributes.placeholder;\n }\n if (element.attributes.name) {\n selector.name = element.attributes.name;\n }\n\n return selector;\n}\n","/**\n * AI プロンプト\n *\n * 探索後のレビュー用プロンプトを提供。\n * 探索ループ自体は Mastra Agent (exploration-agent.ts) が担当。\n */\n\nimport { z } from \"zod\";\nimport {\n getReviewSystemPrompt,\n createReviewUserPrompt,\n} from \"../i18n/prompts\";\nimport type {\n RecordedStep,\n InterventionRecord,\n} from \"./types\";\n\nexport const reviewResponseSchema = z.object({\n reviewedSteps: z.array(z.object({\n originalOrdinal: z.number(),\n keep: z.boolean(),\n removalReason: z.string().optional(),\n riskLevel: z.enum([\"low\", \"medium\", \"high\"]),\n requiresConfirmation: z.boolean(),\n confirmationReason: z.string().optional(),\n })),\n summary: z.string(),\n});\n\n/**\n * ステップレビュー用プロンプトを生成(system / userPrompt 分離)\n */\nexport function createReviewPrompt(\n goal: string,\n recordedSteps: RecordedStep[],\n goalAchieved: boolean,\n interventions?: InterventionRecord[],\n): { system: string; userPrompt: string } {\n const system = getReviewSystemPrompt();\n const userPrompt = createReviewUserPrompt(goal, recordedSteps, goalAchieved, interventions);\n return { system, userPrompt };\n}\n\n","/**\n * AIレビュー結果の対話的編集\n *\n * AIレビュー完了後、YAML書き出し前にユーザーがレビュー内容を確認・修正する。\n */\n\nimport {\n promptSelect,\n promptMultiselect,\n promptText,\n note,\n log,\n} from \"../cli/prompts\";\nimport { t, tf } from \"../i18n\";\nimport type { RecordedStep, ReviewResult, SuggestedCapture } from \"./types\";\n\nexport interface ReviewEditorResult {\n reviewResult: ReviewResult;\n humanGuidance: string[];\n}\n\n/**\n * レビューサマリーのテキストを組み立てる\n */\nfunction buildSummaryText(\n reviewResult: ReviewResult,\n recordedSteps: RecordedStep[],\n humanGuidance: string[],\n): string {\n const lines: string[] = [];\n\n // 保持されるステップ\n const keptSteps = reviewResult.reviewedSteps.filter((s) => s.keep);\n if (keptSteps.length > 0) {\n lines.push(t(\"review.keptSteps\"));\n for (const step of keptSteps) {\n const recorded = recordedSteps.find(\n (r) => r.ordinal === step.originalOrdinal,\n );\n const desc = recorded?.action.description ?? t(\"common.unknown\");\n lines.push(\n ` #${step.originalOrdinal}: ${desc} [risk: ${step.riskLevel}]`,\n );\n }\n }\n\n // 承認が必要なステップ\n const confirmSteps = keptSteps.filter((s) => s.requiresConfirmation);\n lines.push(\"\");\n lines.push(t(\"review.confirmationRequired\"));\n if (confirmSteps.length > 0) {\n for (const step of confirmSteps) {\n const recorded = recordedSteps.find(\n (r) => r.ordinal === step.originalOrdinal,\n );\n const desc = recorded?.action.description ?? t(\"common.unknown\");\n const reason = step.confirmationReason\n ? ` — ${step.confirmationReason}`\n : \"\";\n lines.push(\n ` #${step.originalOrdinal}: ${desc} [risk: ${step.riskLevel}]${reason}`,\n );\n }\n } else {\n lines.push(\" \" + t(\"common.none\"));\n }\n\n // 除外されるステップ\n const removedSteps = reviewResult.reviewedSteps.filter((s) => !s.keep);\n if (removedSteps.length > 0) {\n lines.push(\"\");\n lines.push(t(\"review.removedSteps\"));\n for (const step of removedSteps) {\n const recorded = recordedSteps.find(\n (r) => r.ordinal === step.originalOrdinal,\n );\n const desc = recorded?.action.description ?? t(\"common.unknown\");\n const reason = step.removalReason ?? \"\";\n lines.push(` #${step.originalOrdinal}: ${desc} (理由: ${reason})`);\n }\n }\n\n // キャプチャ\n const captureSteps = recordedSteps.filter(\n (r) => r.action.suggestedCaptures && r.action.suggestedCaptures.length > 0,\n );\n if (captureSteps.length > 0) {\n lines.push(\"\");\n lines.push(t(\"review.capturedValues\"));\n for (const r of captureSteps) {\n for (const c of r.action.suggestedCaptures!) {\n lines.push(\n ` Step #${r.ordinal} → ${c.name} (${c.strategy}${c.pattern ? `: ${c.pattern}` : \"\"})`,\n );\n }\n }\n }\n\n // ノート\n lines.push(\"\");\n lines.push(t(\"review.notes\"));\n if (humanGuidance.length > 0) {\n for (const [i, n] of humanGuidance.entries()) {\n lines.push(` ${tf(\"review.guidancePrefix\", { index: i + 1 })} ${n}`);\n }\n } else {\n lines.push(\" \" + t(\"common.none\"));\n }\n\n // サマリー\n lines.push(\"\");\n lines.push(tf(\"review.summaryLabel\", { summary: reviewResult.summary }));\n\n return lines.join(\"\\n\");\n}\n\nfunction cloneReviewResult(r: ReviewResult): ReviewResult {\n return {\n reviewedSteps: r.reviewedSteps.map((s) => ({ ...s })),\n summary: r.summary,\n };\n}\n\n/**\n * ReviewResult から決定的にノート候補を導出する(追加のAI呼び出しなし)\n */\nfunction deriveSuggestedNotes(\n reviewResult: ReviewResult,\n recordedSteps: RecordedStep[],\n): string[] {\n const suggestions: string[] = [];\n\n // high-risk ステップあり\n const highRiskSteps = reviewResult.reviewedSteps.filter(\n (s) => s.keep && s.riskLevel === \"high\",\n );\n if (highRiskSteps.length > 0) {\n const ordinals = highRiskSteps\n .map((s) => `#${s.originalOrdinal}`)\n .join(\", \");\n suggestions.push(tf(\"review.highRiskNote\", { ordinals }));\n }\n\n // credential 入力あり\n const credentialSteps = recordedSteps.filter(\n (r) => r.action.inputCategory === \"credential\",\n );\n if (credentialSteps.length > 0) {\n suggestions.push(t(\"review.credentialNote\"));\n }\n\n // 多数のステップ除外\n const removedCount = reviewResult.reviewedSteps.filter(\n (s) => !s.keep,\n ).length;\n if (removedCount >= 3) {\n suggestions.push(tf(\"review.removedStepsNote\", { count: removedCount }));\n }\n\n // AIレビュー要約\n if (reviewResult.summary) {\n suggestions.push(`AIレビュー要約: ${reviewResult.summary}`);\n }\n\n return suggestions;\n}\n\n/**\n * 承認要否変更: multiselect チェックボックスで選択\n */\nasync function handleToggleConfirmation(\n reviewResult: ReviewResult,\n recordedSteps: RecordedStep[],\n): Promise<void> {\n const keptSteps = reviewResult.reviewedSteps.filter((s) => s.keep);\n if (keptSteps.length === 0) {\n log.warn(\"保持されるステップがありません。\");\n return;\n }\n\n // AIの推奨値が initialValues にプリセット\n const initialValues = keptSteps\n .filter((s) => s.requiresConfirmation)\n .map((s) => s.originalOrdinal);\n\n const selected = await promptMultiselect<number>(\n t(\"review.selectConfirmSteps\"),\n keptSteps.map((step) => {\n const recorded = recordedSteps.find(\n (r) => r.ordinal === step.originalOrdinal,\n );\n const desc = recorded?.action.description ?? t(\"common.unknown\");\n return {\n value: step.originalOrdinal,\n label: `#${step.originalOrdinal}: ${desc}`,\n hint: `risk: ${step.riskLevel}`,\n };\n }),\n { initialValues },\n );\n\n // 選択結果を反映\n for (const step of keptSteps) {\n step.requiresConfirmation = selected.includes(step.originalOrdinal);\n }\n}\n\n/**\n * ノート編集: AI提案ノート + カスタムノート + 削除\n */\nasync function handleEditNotes(\n humanGuidance: string[],\n reviewResult: ReviewResult,\n recordedSteps: RecordedStep[],\n): Promise<void> {\n const suggestions = deriveSuggestedNotes(reviewResult, recordedSteps);\n\n type NoteAction = \"add_custom\" | \"add_suggested\" | \"delete\";\n const options: { value: NoteAction; label: string; hint?: string }[] = [\n { value: \"add_custom\", label: t(\"review.addCustomNote\") },\n ];\n if (suggestions.length > 0) {\n options.push({\n value: \"add_suggested\",\n label: t(\"review.addSuggestedNote\"),\n hint: `${suggestions.length} ${t(\"common.items\")}`,\n });\n }\n if (humanGuidance.length > 0) {\n options.push({\n value: \"delete\",\n label: t(\"review.deleteNote\"),\n hint: `${humanGuidance.length} ${t(\"common.items\")}`,\n });\n }\n\n const action = await promptSelect<NoteAction>(\n t(\"review.selectNotesAction\"),\n options,\n );\n\n switch (action) {\n case \"add_custom\": {\n const content = await promptText(t(\"review.noteContent\"), {\n validate: (v) => (!v?.trim() ? t(\"review.noteContentRequired\") : undefined),\n });\n humanGuidance.push(content.trim());\n log.success(tf(\"review.notesAdded\", { count: 1 }));\n break;\n }\n case \"add_suggested\": {\n const selected = await promptMultiselect<number>(\n \"追加するノートを選択\",\n suggestions.map((s, i) => ({\n value: i,\n label: s,\n })),\n );\n for (const idx of selected) {\n humanGuidance.push(suggestions[idx]);\n }\n log.success(tf(\"review.notesAdded\", { count: selected.length }));\n break;\n }\n case \"delete\": {\n const toDelete = await promptMultiselect<number>(\n \"削除するノートを選択\",\n humanGuidance.map((g, i) => ({\n value: i,\n label: `${tf(\"review.guidancePrefix\", { index: i + 1 })} ${g}`,\n })),\n );\n // 降順で splice して index がずれないようにする\n for (const idx of [...toDelete].sort((a, b) => b - a)) {\n humanGuidance.splice(idx, 1);\n }\n log.success(tf(\"review.notesDeleted\", { count: toDelete.length }));\n break;\n }\n }\n}\n\n/**\n * ページから取得する値の編集: 各ステップの取得値を accept/reject/add\n */\nasync function handleEditCaptures(\n recordedSteps: RecordedStep[],\n): Promise<void> {\n // 既存キャプチャがあるステップ + キャプチャなしのステップ両方対象\n type CaptureAction = \"accept_all\" | \"reject\" | \"add\";\n const action = await promptSelect<CaptureAction>(\n t(\"review.selectCaptureAction\"),\n [\n { value: \"accept_all\", label: t(\"review.acceptAllCaptures\") },\n { value: \"reject\", label: t(\"review.rejectCaptures\") },\n { value: \"add\", label: t(\"review.addCapture\") },\n ],\n );\n\n switch (action) {\n case \"accept_all\": {\n log.success(t(\"review.allCapturesAccepted\"));\n break;\n }\n case \"reject\": {\n const captureSteps = recordedSteps.filter(\n (r) => r.action.suggestedCaptures && r.action.suggestedCaptures.length > 0,\n );\n if (captureSteps.length === 0) {\n log.warn(t(\"review.noCapturesAvailable\"));\n break;\n }\n const allCaptures: { value: string; label: string }[] = [];\n for (const r of captureSteps) {\n for (const c of r.action.suggestedCaptures!) {\n allCaptures.push({\n value: `${r.ordinal}:${c.name}`,\n label: `Step #${r.ordinal} → ${c.name} (${c.strategy})`,\n });\n }\n }\n const toReject = await promptMultiselect<string>(\n t(\"review.selectCapturesToReject\"),\n allCaptures,\n );\n for (const key of toReject) {\n const [ordStr, name] = key.split(\":\");\n const step = recordedSteps.find((r) => r.ordinal === Number(ordStr));\n if (step?.action.suggestedCaptures) {\n step.action.suggestedCaptures = step.action.suggestedCaptures.filter(\n (c) => c.name !== name,\n );\n }\n }\n log.success(tf(\"review.capturesRejected\", { count: toReject.length }));\n break;\n }\n case \"add\": {\n const ordinalStr = await promptText(t(\"review.captureStepNumber\"), {\n validate: (v) => {\n if (!v?.trim()) return t(\"review.captureStepRequired\");\n if (Number.isNaN(Number(v))) return t(\"review.captureStepNumeric\");\n return undefined;\n },\n });\n const ordinal = Number(ordinalStr);\n const step = recordedSteps.find((r) => r.ordinal === ordinal);\n if (!step) {\n log.warn(tf(\"review.stepNotFound\", { ordinal }));\n break;\n }\n\n const name = await promptText(t(\"review.captureVarName\"), {\n validate: (v) => (!v?.trim() ? t(\"review.captureVarRequired\") : undefined),\n });\n const strategy = await promptSelect<SuggestedCapture[\"strategy\"]>(\n t(\"review.captureStrategy\"),\n [\n { value: \"snapshot\", label: t(\"review.strategySnapshot\") },\n { value: \"url\", label: t(\"review.strategyUrl\") },\n { value: \"ai\", label: t(\"review.strategyAi\") },\n { value: \"expression\", label: t(\"review.strategyExpression\") },\n ],\n );\n\n const newCapture: SuggestedCapture = { name, strategy };\n\n if (strategy === \"snapshot\" || strategy === \"url\") {\n newCapture.pattern = await promptText(t(\"review.regexPattern\"));\n } else if (strategy === \"ai\") {\n newCapture.prompt = await promptText(t(\"review.aiExtractionPrompt\"));\n } else if (strategy === \"expression\") {\n newCapture.expression = await promptText(t(\"review.templateExpression\"));\n }\n\n if (!step.action.suggestedCaptures) {\n step.action.suggestedCaptures = [];\n }\n step.action.suggestedCaptures.push(newCapture);\n log.success(tf(\"review.captureAdded\", { ordinal, name }));\n break;\n }\n }\n}\n\n/**\n * AIレビュー結果をユーザーに提示し、対話的に修正を受け付ける。\n * 修正済みの ReviewResult と humanGuidance を返す。\n */\nexport async function promptReviewEdits(\n reviewResult: ReviewResult,\n recordedSteps: RecordedStep[],\n humanGuidance: string[],\n): Promise<ReviewEditorResult> {\n const edited = cloneReviewResult(reviewResult);\n const editedGuidance = [...humanGuidance];\n\n while (true) {\n // サマリー表示\n const summaryText = buildSummaryText(edited, recordedSteps, editedGuidance);\n note(summaryText, t(\"review.reviewResult\"));\n\n type MenuAction = \"confirm\" | \"toggle_confirmation\" | \"edit_captures\" | \"edit_notes\";\n const hasCaptureSteps = recordedSteps.some(\n (r) => r.action.suggestedCaptures && r.action.suggestedCaptures.length > 0,\n );\n const menuOptions: { value: MenuAction; label: string; hint?: string }[] = [\n { value: \"confirm\", label: t(\"review.confirm\"), hint: t(\"review.confirmHint\") },\n {\n value: \"toggle_confirmation\",\n label: t(\"review.toggleConfirmation\"),\n hint: \"multiselect\",\n },\n ...(hasCaptureSteps\n ? [\n {\n value: \"edit_captures\" as const,\n label: t(\"review.editCaptures\"),\n hint: t(\"review.editCapturesHint\"),\n },\n ]\n : []),\n { value: \"edit_notes\", label: t(\"review.editNotes\") },\n ];\n const action = await promptSelect<MenuAction>(\n t(\"review.selectAction\"),\n menuOptions,\n );\n\n if (action === \"confirm\") {\n break;\n }\n\n switch (action) {\n case \"toggle_confirmation\":\n await handleToggleConfirmation(edited, recordedSteps);\n break;\n case \"edit_captures\":\n await handleEditCaptures(recordedSteps);\n break;\n case \"edit_notes\":\n await handleEditNotes(editedGuidance, edited, recordedSteps);\n break;\n }\n }\n\n return {\n reviewResult: edited,\n humanGuidance: editedGuidance,\n };\n}\n","/**\n * report-generator — 探索キャンセル/失敗時のレポート生成\n *\n * 探索が中断・失敗した際に、実行ログ・ステップ・ユーザーフィードバックを\n * Markdown 形式のレポートとして集約する。\n * コーディングエージェントに渡す素材として利用する。\n */\n\nimport type { RecordedStep, InterventionRecord } from \"./types\";\nimport type { SerializedOption } from \"../cli/options-serializer\";\nimport type { AIMetricsSummary } from \"../harness/ai-metrics\";\nimport { renderOptionsMarkdown } from \"../cli/options-serializer\";\nimport {\n readDebugLog,\n formatAiMetricsSection,\n formatRuntimeEnvironment,\n formatFailureCategoryDistribution,\n formatPerformanceBottlenecks,\n formatDebugLogSections,\n type ReportableStep,\n} from \"../harness/report-sections\";\n\nexport interface ExplorationReportInput {\n goal: string;\n startUrl: string;\n outcome: \"cancelled\" | \"goal_achieved\" | \"goal_not_achieved\" | \"error\";\n userFeedback: string;\n recordedSteps: RecordedStep[];\n interventions: InterventionRecord[];\n debugLogPath?: string;\n errorMessage?: string;\n /** CLI オプション(レポートに記録用) */\n cliOptions?: SerializedOption[];\n /** AI メトリクス */\n aiMetrics?: AIMetricsSummary;\n /** 探索全体の所要時間(ms) */\n totalDurationMs?: number;\n}\n\nfunction formatOutcome(outcome: ExplorationReportInput[\"outcome\"]): string {\n switch (outcome) {\n case \"cancelled\":\n return \"Cancelled by user\";\n case \"goal_achieved\":\n return \"Goal achieved\";\n case \"goal_not_achieved\":\n return \"Goal not achieved\";\n case \"error\":\n return \"Error\";\n }\n}\n\n/** RecordedStep を ReportableStep に変換する */\nfunction toReportableSteps(steps: RecordedStep[]): ReportableStep[] {\n return steps.map((s) => ({\n ordinal: s.ordinal + 1,\n description: `${s.action.action}: ${s.action.description}`,\n status: s.success ? \"success\" as const : \"failed\" as const,\n durationMs: s.durationMs ?? 0,\n error: s.error,\n failureCategory: s.failureCategory,\n }));\n}\n\nexport async function generateExplorationReport(\n input: ExplorationReportInput,\n): Promise<string> {\n const lines: string[] = [];\n\n // Header\n lines.push(\"# Exploration Report\");\n lines.push(\"\");\n\n // Session Info\n lines.push(\"## Session Info\");\n lines.push(`- **Date**: ${new Date().toISOString()}`);\n lines.push(`- **Goal**: ${input.goal}`);\n lines.push(`- **Start URL**: ${input.startUrl}`);\n lines.push(`- **Outcome**: ${formatOutcome(input.outcome)}`);\n lines.push(\"\");\n\n // CLI Options\n if (input.cliOptions && input.cliOptions.length > 0) {\n lines.push(\"## CLI Options\");\n lines.push(...renderOptionsMarkdown(input.cliOptions));\n lines.push(\"\");\n }\n\n // User Feedback\n lines.push(\"## User Feedback\");\n if (input.userFeedback) {\n lines.push(input.userFeedback);\n } else {\n lines.push(\"(No feedback provided)\");\n }\n lines.push(\"\");\n\n // Error Details\n if (input.errorMessage) {\n lines.push(\"## Error Details\");\n lines.push(\"```\");\n lines.push(input.errorMessage);\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n // Execution Summary\n const successCount = input.recordedSteps.filter((s) => s.success).length;\n const failedCount = input.recordedSteps.filter((s) => !s.success).length;\n lines.push(\"## Execution Summary\");\n lines.push(`- **Total Steps**: ${input.recordedSteps.length}`);\n lines.push(`- **Successful**: ${successCount}`);\n lines.push(`- **Failed**: ${failedCount}`);\n lines.push(`- **Interventions**: ${input.interventions.length}`);\n if (input.totalDurationMs !== undefined) {\n lines.push(`- **Duration**: ${input.totalDurationMs}ms`);\n }\n lines.push(\"\");\n\n // Recorded Steps\n if (input.recordedSteps.length > 0) {\n lines.push(\"## Recorded Steps\");\n for (const step of input.recordedSteps) {\n const tag = step.success ? \"DONE\" : \"FAILED\";\n const errorInfo =\n !step.success && step.error ? ` — Error: ${step.error}` : \"\";\n const category = step.failureCategory\n ? ` [${step.failureCategory}]`\n : \"\";\n const duration = step.durationMs !== undefined ? ` (${step.durationMs}ms)` : \"\";\n lines.push(\n `${step.ordinal + 1}. [${tag}] ${step.action.action}: ${step.action.description} (URL: ${step.url})${duration}${errorInfo}${category}`,\n );\n }\n lines.push(\"\");\n }\n\n // Interventions\n if (input.interventions.length > 0) {\n lines.push(\"## Interventions\");\n for (const iv of input.interventions) {\n lines.push(\n `- **Step ${iv.stepIndex}** (${iv.timestamp}): \"${iv.userInstruction}\" (URL: ${iv.url})`,\n );\n }\n lines.push(\"\");\n }\n\n // デバッグログ読み込み(System Insights と Debug Log セクションで共有)\n const debugEntries = input.debugLogPath ? await readDebugLog(input.debugLogPath) : [];\n\n // System Insights(共通モジュール利用)\n const reportableSteps = toReportableSteps(input.recordedSteps);\n const hasInsights =\n (input.aiMetrics && input.aiMetrics.totalCalls > 0) ||\n reportableSteps.some((s) => s.status === \"failed\") ||\n reportableSteps.some((s) => s.durationMs > 3000) ||\n debugEntries.length > 0;\n\n if (hasInsights) {\n lines.push(\"## System Insights\");\n lines.push(\"\");\n lines.push(\"> agentic-browser の機能改善・バグ修正のための分析情報\");\n lines.push(\"\");\n\n lines.push(...formatRuntimeEnvironment());\n\n if (input.aiMetrics && input.aiMetrics.totalCalls > 0) {\n lines.push(...formatAiMetricsSection(input.aiMetrics));\n }\n\n const failedSteps = reportableSteps.filter((s) => s.status === \"failed\");\n lines.push(...formatFailureCategoryDistribution(failedSteps));\n lines.push(...formatPerformanceBottlenecks(reportableSteps));\n }\n\n // Debug Log(共通モジュール利用)\n lines.push(...formatDebugLogSections(debugEntries));\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["mkdir","z","finalSnapshot","currentUrl","dataCollectionActionSet","hasDataCollectionHistory","explorationAction","result","getModel","trackedGenerateObject","z","z","z","mkdir"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@basemachina/agentic-browser-cli",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "CLI for agentic browser automation — generate and execute instruction YAMLs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"agentic-browser": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=18.0.0"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@ai-sdk/amazon-bedrock": "^4.0.63",
|
|
17
|
+
"@ai-sdk/anthropic": "^3.0.46",
|
|
18
|
+
"@ai-sdk/google-vertex": "^4.0.61",
|
|
19
|
+
"@ai-sdk/openai-compatible": "^2.0.30",
|
|
20
|
+
"@clack/prompts": "^1.0.0",
|
|
21
|
+
"@hono/node-server": "^1.19.9",
|
|
22
|
+
"@slack/web-api": "^7.14.1",
|
|
23
|
+
"agent-browser": "^0.12.0",
|
|
24
|
+
"ai": "^6.0.97",
|
|
25
|
+
"hono": "^4.11.9",
|
|
26
|
+
"yaml": "^2.8.2",
|
|
27
|
+
"zod": "^4.1.13"
|
|
28
|
+
}
|
|
29
|
+
}
|