@wellgrow/cli 0.1.3 → 0.2.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config/index.ts","../src/config/types.ts","../src/core/agent-loop.ts","../src/ai/retry.ts","../src/ai/cache.ts","../src/logging.ts","../src/tools/errors.ts","../src/core/tool-executor.ts","../src/core/context.ts","../src/tools/ask-user.ts","../src/tools/definition.ts","../src/agents/resolver.ts","../src/agents/loader.ts","../src/agents/types.ts","../src/ai/template-vars.ts","../src/ai/system-prompt.ts","../src/tools/registry.ts","../src/tools/read.ts","../src/tools/constants.ts","../src/tools/write.ts","../src/tools/edit.ts","../src/tools/bash.ts","../src/signals.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/todo-write.ts","../src/tools/index.ts","../src/tools/pipeline.ts","../src/ai/providers.ts","../src/extensions/mcp.ts","../src/extensions/oauth.ts","../src/extensions/skills.ts","../src/extensions/hook-engine.ts","../src/core/session.ts","../src/core/history.ts","../src/ui/app.tsx","../src/ui/header.tsx","../src/ui/colors.ts","../src/ui/message-list.tsx","../src/ui/markdown.ts","../src/ui/todo-list.tsx","../src/ui/ask-user-prompt.tsx","../src/ui/approval-prompt.tsx","../src/ui/input-prompt.tsx","../src/ui/thinking-indicator.tsx","../src/hooks/use-chat.ts","../src/hooks/use-chat-session.ts","../src/hooks/use-chat-messages.ts","../src/hooks/use-ask-user-queue.ts","../src/hooks/slash-commands.ts","../src/commands/config.ts","../src/commands/history.ts","../src/commands/doctor.ts","../src/commands/skills.ts","../src/ui/onboarding-wizard.tsx"],"sourcesContent":["import { render } from \"ink\";\nimport { createElement } from \"react\";\nimport { Command } from \"commander\";\nimport { randomUUID } from \"node:crypto\";\nimport { loadConfig, initConfig, isFirstRun, saveOnboardingResult, ConfigLoadError } from \"./config/index.js\";\nimport { createSession, sendMessage } from \"./core/session.js\";\nimport { getModelDisplayName } from \"./ai/providers.js\";\nimport { createSessionRecorder } from \"./core/history.js\";\nimport { formatErrorMessage } from \"./ai/retry.js\";\nimport { initLogger } from \"./logging.js\";\nimport { App } from \"./ui/app.js\";\nimport { setupSignalHandlers, createAbortController, setActiveSession } from \"./signals.js\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerHistoryCommand } from \"./commands/history.js\";\nimport { registerInitCommand } from \"./commands/init.js\";\nimport { registerDoctorCommand } from \"./commands/doctor.js\";\nimport { registerSkillsCommand } from \"./commands/skills.js\";\nimport { runOnboardingWizard } from \"./ui/onboarding-wizard.js\";\nimport type { Mode } from \"./tools/pipeline.js\";\n\ndeclare const PKG_VERSION: string;\n\nconst VALID_MODES: Mode[] = [\"plan\", \"auto\"];\n\nasync function readStdin(): Promise<string> {\n if (process.stdin.isTTY) return \"\";\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n return Buffer.concat(chunks).toString(\"utf-8\").trim();\n}\n\nasync function runOneShot(\n effectivePrompt: string,\n opts: { model?: string; agent?: string; mode?: string; verbose?: boolean },\n): Promise<void> {\n const config = await loadConfig();\n const agentName = opts.agent ?? config.default.agent;\n const mode = (opts.mode as Mode | undefined) ?? config.default.mode;\n\n const session = await createSession({\n agentName,\n modelOverride: opts.model,\n modeOverride: mode,\n });\n setActiveSession(session.ctx, session.agent.hookEngine);\n\n const verbose = opts.verbose ?? config.logging.verbose;\n if (verbose) {\n session.ctx.logFile = await initLogger(randomUUID(), config.logging.log_dir);\n }\n\n const modelName = getModelDisplayName(session.agent.modelId);\n const recorder = await createSessionRecorder(modelName, agentName);\n await recorder.recordUser(effectivePrompt);\n\n if (mode === \"plan\") {\n process.stderr.write(\n \"Policy: one-shot の plan モードでは承認が必要なツール実行を自動拒否します。\\n\",\n );\n }\n\n const ac = createAbortController(session.ctx.abort, config.api.timeout);\n let lastText = \"\";\n try {\n const result = await sendMessage(session, effectivePrompt, {\n onMessageUpdate: (parts) => {\n const text = parts\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n const delta = text.slice(lastText.length);\n if (delta) process.stdout.write(delta);\n lastText = text;\n },\n onRetry: (attempt, maxRetries, delayMs) => {\n process.stderr.write(\n `⟳ API エラー。リトライ中... (${attempt}/${maxRetries}, ${Math.round(delayMs / 1000)}秒後)\\n`,\n );\n },\n onContextExceeded: () => {\n process.stderr.write(\n \"コンテキストウィンドウの上限に達しました。入力を短くして再試行してください。\\n\",\n );\n },\n onApprovalRequest:\n mode === \"plan\"\n ? async () => ({ action: \"deny\" as const })\n : undefined,\n }, {\n abortSignal: ac.signal,\n maxRetries: config.api.max_retries,\n maxOutputTokens: config.default.max_output_tokens,\n });\n process.stdout.write(\"\\n\");\n\n await recorder.recordAssistant(result.fullText);\n await recorder.finalize(2);\n } catch (error) {\n process.stderr.write(`\\nError: ${formatErrorMessage(error)}\\n`);\n process.exitCode = 1;\n }\n}\n\nconst program = new Command();\n\nprogram\n .name(\"wellgrow\")\n .description(\"WellGrow CLI — AI chat assistant\")\n .version(PKG_VERSION)\n .argument(\"[prompt]\", \"ワンショット質問(省略でインタラクティブモード)\")\n .option(\"--model <model>\", \"使用するモデル\")\n .option(\"-a, --agent <agent>\", \"使用するエージェント\")\n .option(\n \"--mode <mode>\",\n \"モード (plan, auto)\",\n )\n .option(\"--verbose\", \"詳細ログを出力\")\n .option(\"-p, --pipe\", \"パイプ入力モード(stdinからの入力を受け付ける)\")\n .action(async (prompt: string | undefined, opts: { model?: string; agent?: string; mode?: string; verbose?: boolean; pipe?: boolean }) => {\n try {\n setupSignalHandlers();\n\n const firstRun = await isFirstRun();\n\n if (firstRun && !prompt && !opts.pipe) {\n const result = await runOnboardingWizard();\n await saveOnboardingResult(result);\n await initConfig();\n const config = await loadConfig();\n const verbose = opts.verbose ?? config.logging.verbose;\n render(createElement(App, {\n agentName: \"wellgrow-onboarding\",\n config,\n initialMessage: \"セットアップを始めてください\",\n verbose,\n }));\n return;\n }\n\n await initConfig();\n\n if (opts.mode && !VALID_MODES.includes(opts.mode as Mode)) {\n process.stderr.write(\n `Error: 無効なモードです: ${opts.mode}\\n有効な値: ${VALID_MODES.join(\", \")}\\n`,\n );\n process.exit(1);\n }\n\n if (opts.pipe) {\n const stdinData = await readStdin();\n const effectivePrompt = prompt && stdinData\n ? `${prompt}\\n\\n${stdinData}`\n : stdinData || prompt;\n if (!effectivePrompt) {\n process.stderr.write(\"Error: -p オプション使用時はパイプ入力またはプロンプトが必要です\\n\");\n process.exit(1);\n }\n await runOneShot(effectivePrompt, opts);\n return;\n }\n\n if (prompt) {\n await runOneShot(prompt, opts);\n return;\n }\n\n const config = await loadConfig();\n const verbose = opts.verbose ?? config.logging.verbose;\n const mode = opts.mode as Mode | undefined;\n render(createElement(App, {\n agentName: opts.agent,\n modelOverride: opts.model,\n config,\n mode,\n verbose,\n }));\n } catch (error) {\n if (error instanceof ConfigLoadError) {\n process.stderr.write(`Error: ${error.message}\\n`);\n } else {\n process.stderr.write(\n `Error: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n }\n process.exit(1);\n }\n });\n\nregisterConfigCommand(program);\nregisterHistoryCommand(program);\nregisterInitCommand(program);\nregisterDoctorCommand(program);\nregisterSkillsCommand(program);\n\nprogram.parse();\n","import { readFile, writeFile, mkdir, appendFile, access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { parse, stringify } from \"smol-toml\";\nimport { wellGrowConfigSchema, type WellGrowConfig } from \"./types.js\";\n\nexport interface OnboardingResult {\n name: string;\n apiKey: string | null;\n}\n\nconst CONFIG_DIR = join(homedir(), \".wellgrow\");\nconst CONFIG_PATH = join(CONFIG_DIR, \"config.toml\");\n\nexport class ConfigLoadError extends Error {\n readonly cause: unknown;\n\n constructor(message: string, cause: unknown) {\n super(message);\n this.name = \"ConfigLoadError\";\n this.cause = cause;\n }\n}\n\nconst DEFAULT_CONFIG: WellGrowConfig = {\n default: {\n model: \"claude-opus-4-6\",\n provider: \"anthropic\",\n agent: \"joy\",\n mode: \"auto\",\n max_turns: 100,\n max_output_tokens: 16384,\n },\n permissions: {\n allowed_mcps: [],\n },\n providers: {\n anthropic: { api_key_env: \"ANTHROPIC_API_KEY\" },\n google: { api_key_env: \"GOOGLE_GENERATIVE_AI_API_KEY\" },\n openai: { api_key_env: \"OPENAI_API_KEY\" },\n },\n api: {\n max_retries: 2,\n timeout: 600000,\n },\n skills: {\n paths: [],\n },\n mcp: {\n paths: [],\n },\n hooks: {\n paths: [],\n },\n logging: {\n verbose: false,\n log_dir: \"~/.wellgrow/logs\",\n },\n history: {\n storage: \"local\",\n max_sessions: 1000,\n },\n};\n\nexport async function loadConfig(): Promise<WellGrowConfig> {\n let content: string;\n try {\n content = await readFile(CONFIG_PATH, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return DEFAULT_CONFIG;\n }\n throw new ConfigLoadError(\n `設定ファイルを読み込めませんでした: ${CONFIG_PATH}`,\n error,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = parse(content);\n } catch (error) {\n throw new ConfigLoadError(\n `設定ファイルの TOML 形式が不正です: ${CONFIG_PATH}`,\n error,\n );\n }\n\n try {\n const merged = deepMerge(DEFAULT_CONFIG, parsed as Partial<WellGrowConfig>);\n return wellGrowConfigSchema.parse(merged);\n } catch (error) {\n throw new ConfigLoadError(\n `設定ファイルの内容が不正です: ${CONFIG_PATH}`,\n error,\n );\n }\n}\n\nexport async function ensureConfigDir(): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n}\n\nexport async function initConfig(): Promise<void> {\n await ensureConfigDir();\n try {\n await readFile(CONFIG_PATH, \"utf-8\");\n } catch {\n await writeFile(CONFIG_PATH, stringify(DEFAULT_CONFIG as unknown as Record<string, unknown>), \"utf-8\");\n }\n\n const { autoInitIfNeeded } = await import(\"../commands/init.js\");\n await autoInitIfNeeded();\n}\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nexport async function isFirstRun(): Promise<boolean> {\n try {\n await access(CONFIG_PATH);\n return false;\n } catch {\n return true;\n }\n}\n\nexport async function saveOnboardingResult(result: OnboardingResult): Promise<void> {\n const config = { ...DEFAULT_CONFIG, user: { name: result.name } };\n await mkdir(CONFIG_DIR, { recursive: true });\n await writeFile(CONFIG_PATH, stringify(config as unknown as Record<string, unknown>), \"utf-8\");\n\n if (result.apiKey) {\n process.env.ANTHROPIC_API_KEY = result.apiKey;\n const rcFile = process.env.SHELL?.includes(\"zsh\")\n ? join(homedir(), \".zshrc\")\n : join(homedir(), \".bashrc\");\n await appendFile(rcFile, `\\nexport ANTHROPIC_API_KEY=\"${result.apiKey}\"\\n`, \"utf-8\");\n }\n}\n\nexport async function updateConfigField(\n section: string,\n key: string,\n value: unknown,\n): Promise<void> {\n const content = await readFile(CONFIG_PATH, \"utf-8\");\n const parsed = parse(content) as Record<string, unknown>;\n const sectionObj = (parsed[section] ?? {}) as Record<string, unknown>;\n sectionObj[key] = value;\n parsed[section] = sectionObj;\n await writeFile(CONFIG_PATH, stringify(parsed), \"utf-8\");\n}\n\nexport async function addAllowedMcp(serverName: string): Promise<void> {\n const config = await loadConfig();\n if (config.permissions.allowed_mcps.includes(serverName)) return;\n const updated = [...config.permissions.allowed_mcps, serverName];\n await updateConfigField(\"permissions\", \"allowed_mcps\", updated);\n}\n\nfunction deepMerge<T>(base: T, override: Partial<T>): T {\n const result = { ...base } as Record<string, unknown>;\n const src = override as Record<string, unknown>;\n for (const key of Object.keys(src)) {\n const val = src[key];\n if (val && typeof val === \"object\" && !Array.isArray(val) && typeof result[key] === \"object\") {\n result[key] = deepMerge(\n result[key] as Record<string, unknown>,\n val as Record<string, unknown>,\n );\n } else if (val !== undefined) {\n result[key] = val;\n }\n }\n return result as T;\n}\n","import { z } from \"zod\";\n\nconst providerConfigSchema = z.object({\n api_key: z.string().optional(),\n api_key_env: z.string(),\n});\n\nexport const wellGrowConfigSchema = z.object({\n default: z.object({\n model: z.string(),\n provider: z.string(),\n agent: z.string(),\n mode: z.enum([\"plan\", \"auto\"]),\n max_turns: z.number().int().positive(),\n max_output_tokens: z.number().int().positive(),\n }),\n permissions: z.object({\n allowed_mcps: z.array(z.string()),\n }),\n providers: z.object({\n anthropic: providerConfigSchema.optional(),\n google: providerConfigSchema.optional(),\n openai: providerConfigSchema.optional(),\n }),\n api: z.object({\n max_retries: z.number().int().nonnegative(),\n timeout: z.number().int().positive(),\n }),\n skills: z.object({\n paths: z.array(z.string()),\n }),\n mcp: z.object({\n paths: z.array(z.string()),\n }),\n hooks: z.object({\n paths: z.array(z.string()),\n }),\n user: z.object({\n name: z.string().optional(),\n }).optional(),\n logging: z.object({\n verbose: z.boolean(),\n log_dir: z.string(),\n }),\n history: z.object({\n storage: z.string(),\n max_sessions: z.number().int().positive(),\n }),\n});\n\nexport type WellGrowConfig = z.infer<typeof wellGrowConfigSchema>;\n","import {\n streamText,\n type ModelMessage,\n type ToolModelMessage,\n} from \"ai\";\nimport type { LanguageModel } from \"ai\";\nimport type { MessagePart } from \"../ui/message-list.js\";\nimport { evaluateRetry, sleep } from \"../ai/retry.js\";\nimport { prepareCachedMessages, type TurnUsage } from \"../ai/cache.js\";\nimport {\n logRequest,\n logResponse,\n logUsage,\n logRetry,\n} from \"../logging.js\";\nimport {\n executeToolCalls,\n type ToolExecutorConfig,\n type ToolExecutorCallbacks,\n type ToolCall,\n} from \"./tool-executor.js\";\n\nexport type {\n ToolApprovalDecision,\n ToolExecutionHooks,\n ToolCall,\n ToolExecutorConfig,\n ToolExecutorCallbacks,\n} from \"./tool-executor.js\";\n\nconst DEFAULT_MAX_TURNS = 100;\nconst TEXT_FLUSH_INTERVAL = 30;\nconst FIRST_FLUSH_INTERVAL = 4;\nconst TEXT_PART_SPLIT_THRESHOLD = 1500;\n\nexport interface AgentLoopCallbacks extends ToolExecutorCallbacks {\n onRetry?: (attempt: number, maxRetries: number, delayMs: number) => void;\n onContextExceeded?: () => void;\n onUsage?: (usage: TurnUsage) => void;\n}\n\nexport interface AgentLoopConfig extends ToolExecutorConfig {\n model: LanguageModel;\n system: string;\n onStop?: (lastMessage: string) => Promise<{\n blocked: boolean;\n reason?: string;\n }>;\n maxTurns?: number;\n maxRetries?: number;\n maxOutputTokens?: number;\n isAbortedByUser?: () => boolean;\n}\n\nexport async function runAgentLoop(\n messages: ModelMessage[],\n config: AgentLoopConfig,\n callbacks: AgentLoopCallbacks,\n): Promise<{ fullText: string; parts: MessagePart[] }> {\n let turnsUsed = 0;\n const maxTurns = config.maxTurns ?? DEFAULT_MAX_TURNS;\n let fullText = \"\";\n const parts: MessagePart[] = [];\n\n while (turnsUsed < maxTurns) {\n if (turnsUsed > 0) {\n parts.push({ type: \"step-start\" });\n callbacks.onMessageUpdate([...parts]);\n }\n\n const turnResult = await executeTurn(messages, config, callbacks, parts);\n\n fullText += turnResult.text;\n\n if (turnResult.finishReason !== \"tool-calls\") {\n if (config.onStop) {\n const stopResult = await config.onStop(turnResult.text);\n if (stopResult.blocked && stopResult.reason) {\n messages.push({\n role: \"user\",\n content: stopResult.reason,\n });\n turnsUsed++;\n continue;\n }\n }\n break;\n }\n\n const toolResults = await executeToolCalls(\n turnResult.toolCalls,\n parts,\n config,\n callbacks,\n );\n\n const toolMessage: ToolModelMessage = {\n role: \"tool\",\n content: toolResults,\n };\n messages.push(toolMessage);\n\n turnsUsed++;\n }\n\n return { fullText, parts };\n}\n\n// ---------------------------------------------------------------------------\n// Turn execution with retry\n// ---------------------------------------------------------------------------\n\ninterface TurnResult {\n text: string;\n finishReason: string;\n toolCalls: ToolCall[];\n}\n\nasync function executeTurn(\n messages: ModelMessage[],\n config: AgentLoopConfig,\n callbacks: AgentLoopCallbacks,\n parts: MessagePart[],\n): Promise<TurnResult> {\n const maxRetries = config.maxRetries ?? 2;\n let attempt = 0;\n\n while (true) {\n try {\n return await streamTurn(messages, config, callbacks, parts);\n } catch (error) {\n const retryResult = evaluateRetry(error, attempt, {\n maxRetries,\n isAbortedByUser: config.isAbortedByUser,\n });\n\n if (retryResult.isUserAborted) {\n return { text: \"\", finishReason: \"stop\", toolCalls: [] };\n }\n\n if (retryResult.isContextExceeded) {\n callbacks.onContextExceeded?.();\n return {\n text: retryResult.errorMessage,\n finishReason: \"stop\",\n toolCalls: [],\n };\n }\n\n if (!retryResult.shouldRetry) {\n throw error;\n }\n\n callbacks.onRetry?.(attempt + 1, maxRetries, retryResult.delay);\n if (config.logFile) {\n logRetry(config.logFile, attempt + 1, maxRetries, retryResult.delay);\n }\n await sleep(retryResult.delay);\n attempt++;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Streaming helpers\n// ---------------------------------------------------------------------------\n\nfunction appendText(parts: MessagePart[], text: string): void {\n const last = parts[parts.length - 1];\n if (last?.type === \"text\" && last.state === \"streaming\") {\n last.text += text;\n if (last.text.length > TEXT_PART_SPLIT_THRESHOLD) {\n const splitPos = findParagraphBoundary(last.text);\n if (splitPos > 0) {\n const remainder = last.text.slice(splitPos);\n last.text = last.text.slice(0, splitPos);\n last.state = \"done\";\n parts.push({ type: \"text\", text: remainder, state: \"streaming\" });\n }\n }\n } else {\n parts.push({ type: \"text\", text, state: \"streaming\" });\n }\n}\n\nfunction findParagraphBoundary(text: string): number {\n let fenceCount = 0;\n let lastSafeSplit = -1;\n let i = 0;\n while (i < text.length) {\n if (text.startsWith(\"```\", i)) {\n fenceCount++;\n i += 3;\n continue;\n }\n if (text.startsWith(\"\\n\\n\", i) && fenceCount % 2 === 0) {\n lastSafeSplit = i;\n }\n i++;\n }\n return lastSafeSplit > 0 ? lastSafeSplit : -1;\n}\n\nfunction appendReasoning(parts: MessagePart[], text: string): void {\n const last = parts[parts.length - 1];\n if (last?.type === \"reasoning\" && last.state === \"streaming\") {\n last.text += text;\n } else {\n parts.push({ type: \"reasoning\", text, state: \"streaming\" });\n }\n}\n\nfunction finalizeStreamingParts(parts: MessagePart[]): void {\n for (const p of parts) {\n if (\n (p.type === \"text\" || p.type === \"reasoning\") &&\n p.state === \"streaming\"\n ) {\n p.state = \"done\";\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Single streaming turn\n// ---------------------------------------------------------------------------\n\nasync function streamTurn(\n messages: ModelMessage[],\n config: AgentLoopConfig,\n callbacks: AgentLoopCallbacks,\n parts: MessagePart[],\n): Promise<TurnResult> {\n const turnStart = Date.now();\n const modelId =\n typeof config.model === \"string\"\n ? config.model\n : config.model.modelId;\n\n if (config.logFile) {\n logRequest(config.logFile, modelId);\n }\n\n const cachedMessages = prepareCachedMessages(config.system, messages);\n\n const result = streamText({\n model: config.model,\n messages: cachedMessages,\n tools: config.registry.schemas,\n maxOutputTokens: config.maxOutputTokens,\n abortSignal: config.abortSignal,\n maxRetries: 0,\n });\n\n let text = \"\";\n const toolCalls: ToolCall[] = [];\n let textBuffer = \"\";\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n let isFirstTextChunk = true;\n\n function flushTextBuffer(): void {\n if (flushTimer) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n if (!textBuffer) return;\n appendText(parts, textBuffer);\n textBuffer = \"\";\n callbacks.onMessageUpdate([...parts]);\n }\n\n for await (const chunk of result.fullStream) {\n switch (chunk.type) {\n case \"text-delta\":\n text += chunk.text;\n textBuffer += chunk.text;\n if (!flushTimer) {\n const interval = isFirstTextChunk ? FIRST_FLUSH_INTERVAL : TEXT_FLUSH_INTERVAL;\n isFirstTextChunk = false;\n flushTimer = setTimeout(flushTextBuffer, interval);\n }\n break;\n\n case \"reasoning-delta\":\n flushTextBuffer();\n appendReasoning(parts, chunk.text);\n callbacks.onMessageUpdate([...parts]);\n break;\n\n case \"tool-call\":\n flushTextBuffer();\n toolCalls.push({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n args: chunk.input as Record<string, unknown>,\n });\n parts.push({\n type: \"tool\",\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-available\",\n input: chunk.input,\n });\n callbacks.onMessageUpdate([...parts]);\n break;\n\n case \"source\": {\n flushTextBuffer();\n const src = chunk as unknown as Record<string, unknown>;\n if (\"url\" in src && typeof src.url === \"string\") {\n parts.push({\n type: \"source-url\",\n url: src.url,\n title: typeof src.title === \"string\" ? src.title : undefined,\n });\n callbacks.onMessageUpdate([...parts]);\n }\n break;\n }\n }\n }\n\n if (flushTimer) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n if (textBuffer) {\n appendText(parts, textBuffer);\n textBuffer = \"\";\n }\n finalizeStreamingParts(parts);\n callbacks.onMessageUpdate([...parts]);\n\n const [response, finishReason, usage] = await Promise.all([\n result.response,\n result.finishReason,\n result.usage,\n ]);\n messages.push(...(response.messages as ModelMessage[]));\n\n const turnUsage: TurnUsage = {\n inputTokens: usage.inputTokens ?? 0,\n outputTokens: usage.outputTokens ?? 0,\n cacheWriteTokens: usage.inputTokenDetails.cacheWriteTokens ?? undefined,\n cacheReadTokens: usage.inputTokenDetails.cacheReadTokens ?? undefined,\n };\n callbacks.onUsage?.(turnUsage);\n\n if (config.logFile) {\n logResponse(config.logFile, 200, Date.now() - turnStart);\n logUsage(config.logFile, turnUsage);\n }\n\n return { text, finishReason, toolCalls };\n}\n","const DEFAULT_MAX_RETRIES = 2;\nconst MAX_BACKOFF_MS = 8000;\n\ninterface RetryConfig {\n maxRetries?: number;\n isAbortedByUser?: () => boolean;\n}\n\nfunction isRetryableStatus(status: number): boolean {\n if (status === 408 || status === 409 || status === 429) return true;\n if (status >= 500) return true;\n return false;\n}\n\nfunction unwrapError(error: unknown): unknown {\n if (!error || typeof error !== \"object\") return error;\n const err = error as Record<string, unknown>;\n if (err.reason === \"maxRetriesExceeded\" && err.lastError) {\n return err.lastError;\n }\n return error;\n}\n\nfunction isRetryableError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n\n const err = error as Record<string, unknown>;\n\n if (err.statusCode && typeof err.statusCode === \"number\") {\n return isRetryableStatus(err.statusCode);\n }\n\n if (err.code === \"ECONNRESET\" || err.code === \"ETIMEDOUT\" || err.code === \"ECONNREFUSED\") {\n return true;\n }\n\n const message = String(err.message ?? \"\");\n if (message.includes(\"timeout\") || message.includes(\"ECONNRESET\")) {\n return true;\n }\n\n return false;\n}\n\nfunction getErrorStatusCode(error: unknown): number | undefined {\n if (!error || typeof error !== \"object\") return undefined;\n const code = (error as Record<string, unknown>).statusCode;\n return typeof code === \"number\" ? code : undefined;\n}\n\nexport function formatErrorMessage(error: unknown): string {\n const unwrapped = unwrapError(error);\n const status = getErrorStatusCode(unwrapped);\n\n if (status === 529 || status === 503) {\n return \"APIサーバーが混み合っています。しばらく待ってから再試行してください。\";\n }\n if (status === 429) {\n return \"APIのレート制限に達しました。しばらく待ってから再試行してください。\";\n }\n if (status === 401) {\n return \"APIキーが無効です。設定を確認してください。\";\n }\n if (status === 403) {\n return \"APIへのアクセスが拒否されました。APIキーの権限を確認してください。\";\n }\n if (status !== undefined && status >= 500) {\n return \"APIサーバーでエラーが発生しました。しばらく待ってから再試行してください。\";\n }\n\n const message = unwrapped instanceof Error ? unwrapped.message : String(unwrapped ?? \"\");\n if (message.includes(\"ECONNREFUSED\") || message.includes(\"ECONNRESET\") || message.includes(\"ETIMEDOUT\")) {\n return \"APIサーバーに接続できません。ネットワーク接続を確認してください。\";\n }\n\n if (error instanceof Error) return error.message;\n const str = error != null ? String(error) : \"\";\n return str || \"不明なエラーが発生しました\";\n}\n\nfunction isContextLengthError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n\n const err = error as Record<string, unknown>;\n const status = err.statusCode;\n const message = String(err.message ?? err.responseBody ?? \"\");\n\n return status === 400 && message.includes(\"context_length\");\n}\n\nfunction isAbortError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const err = error as Record<string, unknown>;\n return err.name === \"AbortError\" || err.code === \"ABORT_ERR\";\n}\n\nfunction getRetryDelay(attempt: number, error: unknown): number {\n const err = error as Record<string, unknown>;\n const responseHeaders = err.responseHeaders as Record<string, string> | undefined;\n\n if (responseHeaders) {\n const retryAfter = responseHeaders[\"retry-after\"];\n const retryAfterMs = responseHeaders[\"retry-after-ms\"];\n\n if (retryAfterMs) {\n const ms = parseInt(retryAfterMs);\n if (!isNaN(ms) && ms <= 60000) return ms;\n }\n if (retryAfter) {\n const seconds = parseInt(retryAfter);\n if (!isNaN(seconds) && seconds <= 60) return seconds * 1000;\n }\n }\n\n const baseDelay = 500 * Math.pow(2, attempt);\n const jitter = 0.75 + Math.random() * 0.25;\n return Math.min(baseDelay * jitter, MAX_BACKOFF_MS);\n}\n\nexport interface RetryResult {\n shouldRetry: boolean;\n isContextExceeded: boolean;\n isUserAborted: boolean;\n delay: number;\n attempt: number;\n errorMessage: string;\n}\n\nexport function evaluateRetry(\n error: unknown,\n attempt: number,\n config?: RetryConfig,\n): RetryResult {\n const maxRetries = config?.maxRetries ?? DEFAULT_MAX_RETRIES;\n const unwrapped = unwrapError(error);\n\n if (isAbortError(unwrapped)) {\n const userAborted = config?.isAbortedByUser ? config.isAbortedByUser() : true;\n if (userAborted) {\n return {\n shouldRetry: false,\n isContextExceeded: false,\n isUserAborted: true,\n delay: 0,\n attempt,\n errorMessage: \"\",\n };\n }\n const retryable = attempt < maxRetries;\n return {\n shouldRetry: retryable,\n isContextExceeded: false,\n isUserAborted: false,\n delay: retryable ? getRetryDelay(attempt, unwrapped) : 0,\n attempt,\n errorMessage: \"リクエストがタイムアウトしました\",\n };\n }\n\n if (isContextLengthError(unwrapped)) {\n return {\n shouldRetry: false,\n isContextExceeded: true,\n isUserAborted: false,\n delay: 0,\n attempt,\n errorMessage: \"コンテキストウィンドウの上限に達しました。\\n→ /clear で新しいセッションを開始してください。\",\n };\n }\n\n const retryable = isRetryableError(unwrapped) && attempt < maxRetries;\n\n return {\n shouldRetry: retryable,\n isContextExceeded: false,\n isUserAborted: false,\n delay: retryable ? getRetryDelay(attempt, unwrapped) : 0,\n attempt,\n errorMessage: formatErrorMessage(error),\n };\n}\n\nexport async function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { ModelMessage } from \"ai\";\n\nconst ANTHROPIC_CACHE_BREAKPOINT = {\n anthropic: { cacheControl: { type: \"ephemeral\" as const } },\n};\n\nexport interface TurnUsage {\n inputTokens: number;\n outputTokens: number;\n cacheWriteTokens?: number;\n cacheReadTokens?: number;\n}\n\n/**\n * Prepend a cached system message and place a cache breakpoint\n * on the last user/tool message so the conversation prefix is reused.\n *\n * Breakpoint placement (Anthropic caches everything from the start\n * up to each breakpoint):\n * 1. system message — static per session\n * 2. last user/tool — growing conversation prefix\n */\nexport function prepareCachedMessages(\n system: string,\n messages: readonly ModelMessage[],\n): ModelMessage[] {\n const systemMessage: ModelMessage = {\n role: \"system\",\n content: system,\n providerOptions: ANTHROPIC_CACHE_BREAKPOINT,\n };\n\n let lastBreakpointIdx = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n const role = messages[i].role;\n if (role === \"user\" || role === \"tool\") {\n lastBreakpointIdx = i;\n break;\n }\n }\n\n const cached = messages.map((msg, i) => {\n if (i !== lastBreakpointIdx) return msg;\n return {\n ...msg,\n providerOptions: {\n ...(msg.providerOptions ?? {}),\n ...ANTHROPIC_CACHE_BREAKPOINT,\n },\n } as ModelMessage;\n });\n\n return [systemMessage, ...cached];\n}\n","import { appendFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport async function initLogger(sessionId: string, logDir?: string): Promise<string> {\n const dir = logDir?.replace(/^~/, homedir()) ?? join(homedir(), \".wellgrow\", \"logs\");\n await mkdir(dir, { recursive: true });\n return join(dir, `${sessionId}.log`);\n}\n\nfunction timestamp(): string {\n return new Date().toISOString().replace(\"T\", \" \").slice(11, 19);\n}\n\nfunction log(logFile: string, message: string): void {\n appendFile(logFile, `[${timestamp()}] ${message}\\n`, \"utf-8\").catch(() => {});\n}\n\nexport function logRequest(logFile: string, model: string, tokenEstimate?: number): void {\n log(logFile, `REQ model=${model}${tokenEstimate ? ` tokens=${tokenEstimate}` : \"\"}`);\n}\n\nexport function logResponse(logFile: string, status: number, durationMs: number): void {\n log(logFile, `RES status=${status} duration=${durationMs}ms`);\n}\n\nexport function logRetry(logFile: string, attempt: number, maxRetries: number, waitMs: number): void {\n log(logFile, `RES retry=${attempt}/${maxRetries} wait=${(waitMs / 1000).toFixed(1)}s`);\n}\n\nexport function logToolCall(logFile: string, toolName: string, detail: string): void {\n log(logFile, `TOOL ${toolName} ${detail}`);\n}\n\nexport function logToolResult(logFile: string, toolName: string, status: string, durationMs: number): void {\n log(logFile, `TOOL ${toolName} result=${status} duration=${durationMs}ms`);\n}\n\nexport function logUsage(\n logFile: string,\n usage: { inputTokens: number; outputTokens: number; cacheWriteTokens?: number; cacheReadTokens?: number },\n): void {\n let msg = `USE in=${usage.inputTokens} out=${usage.outputTokens}`;\n if (usage.cacheWriteTokens != null) {\n msg += ` cache_write=${usage.cacheWriteTokens}`;\n }\n if (usage.cacheReadTokens != null) {\n msg += ` cache_read=${usage.cacheReadTokens}`;\n }\n log(logFile, msg);\n}\n","export type ToolErrorCode =\n | \"FILE_NOT_READ\"\n | \"FILE_NOT_FOUND\"\n | \"PERMISSION_DENIED\"\n | \"VALIDATION_ERROR\"\n | \"OLD_STRING_NOT_FOUND\"\n | \"OLD_STRING_NOT_UNIQUE\"\n | \"COMMAND_NOT_FOUND\"\n | \"COMMAND_PERMISSION\"\n | \"SPAWN_ERROR\"\n | \"DISK_FULL\"\n | \"IS_DIRECTORY\"\n | \"OUTPUT_TOO_LARGE\"\n | \"INTERNAL_ERROR\";\n\nconst RECOVERY_HINTS: Partial<Record<ToolErrorCode, string>> = {\n FILE_NOT_READ:\n \"Read ツールで先にファイルを読んでください\",\n FILE_NOT_FOUND:\n \"Glob ツールでファイルパスを確認してください\",\n PERMISSION_DENIED:\n \"ファイルの権限を確認してください (ls -la)\",\n OLD_STRING_NOT_FOUND:\n \"Read ツールで最新の内容を確認してください\",\n OLD_STRING_NOT_UNIQUE:\n \"より多くのコンテキストを含めてユニークにするか、replace_all: true を使用してください\",\n COMMAND_NOT_FOUND:\n \"wellgrow doctor でツールのインストール状況を確認するか、別のコマンドを使用してください\",\n COMMAND_PERMISSION:\n \"ファイルの実行権限を確認してください (chmod +x)\",\n OUTPUT_TOO_LARGE:\n \"head_limit で制限するか、出力の少ないコマンドを使用してください\",\n};\n\nexport class ToolError extends Error {\n readonly code: ToolErrorCode;\n readonly tool: string;\n\n constructor(tool: string, code: ToolErrorCode, message: string) {\n const hint = RECOVERY_HINTS[code];\n const fullMessage = hint ? `${message}。${hint}` : message;\n super(fullMessage);\n this.name = \"ToolError\";\n this.tool = tool;\n this.code = code;\n }\n}\n\nfunction mapErrnoToToolError(\n err: NodeJS.ErrnoException,\n): { code: ToolErrorCode; message: string } | null {\n switch (err.code) {\n case \"ENOENT\":\n return { code: \"FILE_NOT_FOUND\", message: `ファイルが見つかりません: ${err.path ?? err.message}` };\n case \"EACCES\":\n case \"EPERM\":\n return { code: \"PERMISSION_DENIED\", message: `アクセス権限がありません: ${err.path ?? err.message}` };\n case \"EISDIR\":\n return { code: \"IS_DIRECTORY\", message: `ディレクトリに対する操作はできません: ${err.path ?? err.message}` };\n case \"ENOSPC\":\n return { code: \"DISK_FULL\", message: \"ディスク容量が不足しています\" };\n case \"ERR_CHILD_PROCESS_STDIO_MAXBUFFER\":\n return { code: \"OUTPUT_TOO_LARGE\", message: \"出力が大きすぎます\" };\n default:\n return null;\n }\n}\n\nexport function formatToolError(error: unknown): string {\n if (error instanceof ToolError) {\n return `Error: [${error.code}] ${error.message}`;\n }\n\n if (error && typeof error === \"object\" && \"issues\" in error) {\n const issues = (\n error as {\n issues: Array<{ path: (string | number)[]; message: string }>;\n }\n ).issues;\n const details = issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\", \");\n return `Error: [VALIDATION_ERROR] 入力パラメータが不正です: ${details}`;\n }\n\n if (!error || typeof error !== \"object\") {\n return `Error: ツール実行エラー: ${String(error)}`;\n }\n\n const err = error as NodeJS.ErrnoException;\n\n const mapped = mapErrnoToToolError(err);\n if (mapped) {\n const hint = RECOVERY_HINTS[mapped.code];\n const base = `Error: [${mapped.code}] ${mapped.message}`;\n return hint ? `${base}。${hint}` : base;\n }\n\n return `Error: ${err.message ?? String(error)}`;\n}\n","import type { ToolResultPart } from \"ai\";\nimport type { ToolRegistry, ToolHandlerContext } from \"../tools/registry.js\";\nimport type { ToolUIEvent } from \"../tools/definition.js\";\nimport type { ToolPipeline } from \"../tools/pipeline.js\";\nimport type { MessagePart } from \"../ui/message-list.js\";\nimport type {\n ApprovalRequest,\n ApprovalDecision,\n} from \"../ui/approval-prompt.js\";\nimport { addAllowedMcp } from \"../config/index.js\";\nimport { formatToolError } from \"../tools/errors.js\";\nimport { logToolCall, logToolResult } from \"../logging.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ToolApprovalDecision =\n | {\n decision: \"allow\";\n updatedInput?: Record<string, unknown>;\n additionalContext?: string;\n }\n | { decision: \"deny\"; reason: string }\n | { decision: \"ask\" };\n\nexport interface ToolExecutionHooks {\n beforeExecute?: (\n toolCall: ToolCall,\n meta: { category: string; source: string },\n ) => Promise<ToolApprovalDecision>;\n afterExecute?: (\n toolCall: ToolCall,\n result: { success: boolean; output?: unknown; error?: string },\n ) => Promise<{ feedback?: string } | void>;\n onPermissionRequest?: (\n toolCall: ToolCall,\n meta: { category: string; source: string },\n ) => Promise<{\n behavior: \"allow\" | \"deny\";\n updatedInput?: Record<string, unknown>;\n } | null>;\n}\n\nexport interface ToolCall {\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n}\n\nexport interface ToolExecutorConfig {\n registry: ToolRegistry;\n pipeline: ToolPipeline;\n executionHooks?: ToolExecutionHooks;\n abortSignal?: AbortSignal;\n logFile?: string | null;\n}\n\nexport interface ToolExecutorCallbacks {\n onMessageUpdate: (parts: MessagePart[]) => void;\n onToolUIEvent?: (event: ToolUIEvent) => void;\n onApprovalRequest?: (request: ApprovalRequest) => Promise<ApprovalDecision>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction updateToolPart(\n parts: MessagePart[],\n toolCallId: string,\n state: \"output-available\" | \"output-error\" | \"output-denied\",\n output?: unknown,\n errorText?: string,\n): void {\n const idx = parts.findIndex(\n (p) => p.type === \"tool\" && p.toolCallId === toolCallId,\n );\n if (idx >= 0) {\n const part = parts[idx] as Extract<MessagePart, { type: \"tool\" }>;\n parts[idx] = { ...part, state, output, errorText };\n }\n}\n\nfunction approvalDecisionToToolDecision(\n ad: ApprovalDecision,\n): ToolApprovalDecision {\n if (ad.action === \"allow\") {\n return { decision: \"allow\" };\n }\n return { decision: \"deny\", reason: \"ユーザーがツールの実行を拒否しました\" };\n}\n\nasync function requestApproval(\n tc: ToolCall,\n meta: { category: string; source: string },\n pipeline: ToolPipeline,\n callbacks: ToolExecutorCallbacks,\n): Promise<ToolApprovalDecision> {\n if (!callbacks.onApprovalRequest) {\n return { decision: \"allow\" };\n }\n\n const decision = await callbacks.onApprovalRequest({\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args,\n source: meta.source,\n category: meta.category,\n });\n\n if (decision.action === \"allow\" && meta.source === \"mcp\") {\n const serverName = tc.toolName.split(\"__\")[1];\n if (serverName) {\n pipeline.markMcpAllowed(serverName);\n await addAllowedMcp(serverName).catch(() => {});\n }\n }\n\n return approvalDecisionToToolDecision(decision);\n}\n\nfunction toToolOutput(value: unknown): ToolResultPart[\"output\"] {\n if (typeof value === \"string\") {\n return { type: \"text\" as const, value };\n }\n return { type: \"json\" as const, value: value as import(\"ai\").JSONValue };\n}\n\n// ---------------------------------------------------------------------------\n// Single tool execution\n// ---------------------------------------------------------------------------\n\nasync function executeSingleTool(\n tc: ToolCall,\n parts: MessagePart[],\n config: ToolExecutorConfig,\n callbacks: ToolExecutorCallbacks,\n needsApproval: boolean,\n): Promise<ToolResultPart> {\n const { registry, pipeline, executionHooks } = config;\n const handler = registry.handlers[tc.toolName];\n\n if (!handler) {\n const errorMsg = `不明なツール: ${tc.toolName}`;\n updateToolPart(parts, tc.toolCallId, \"output-error\", undefined, errorMsg);\n callbacks.onMessageUpdate([...parts]);\n return {\n type: \"tool-result\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n output: { type: \"error-text\", value: `Error: ${errorMsg}` },\n };\n }\n\n const meta = registry.getMeta(tc.toolName);\n const metaInfo = {\n category: meta?.category ?? \"execute\",\n source: meta?.source ?? \"builtin\",\n };\n\n // PreToolUse runs first — can deny early or escalate to user approval\n if (executionHooks?.beforeExecute) {\n const hookResult = await executionHooks.beforeExecute(tc, metaInfo);\n if (hookResult.decision === \"deny\") {\n updateToolPart(\n parts,\n tc.toolCallId,\n \"output-denied\",\n undefined,\n hookResult.reason,\n );\n callbacks.onMessageUpdate([...parts]);\n return pipeline.createDeniedResult(\n tc.toolCallId,\n tc.toolName,\n hookResult.reason,\n );\n }\n\n if (hookResult.decision === \"ask\") {\n needsApproval = true;\n }\n\n if (hookResult.decision === \"allow\" && hookResult.updatedInput) {\n tc = { ...tc, args: { ...tc.args, ...hookResult.updatedInput } };\n }\n }\n\n if (needsApproval) {\n let approved = false;\n\n if (executionHooks?.onPermissionRequest) {\n const hookDecision = await executionHooks.onPermissionRequest(\n tc,\n metaInfo,\n );\n if (hookDecision) {\n if (hookDecision.behavior === \"deny\") {\n const reason = \"フックにより拒否されました\";\n updateToolPart(parts, tc.toolCallId, \"output-denied\", undefined, reason);\n callbacks.onMessageUpdate([...parts]);\n return pipeline.createDeniedResult(tc.toolCallId, tc.toolName, reason);\n }\n if (hookDecision.updatedInput) {\n tc = { ...tc, args: { ...tc.args, ...hookDecision.updatedInput } };\n }\n approved = true;\n }\n }\n\n if (!approved) {\n const approval = await requestApproval(tc, metaInfo, pipeline, callbacks);\n if (approval.decision === \"deny\") {\n updateToolPart(\n parts,\n tc.toolCallId,\n \"output-denied\",\n undefined,\n approval.reason,\n );\n callbacks.onMessageUpdate([...parts]);\n return pipeline.createDeniedResult(\n tc.toolCallId,\n tc.toolName,\n approval.reason,\n );\n }\n }\n }\n\n try {\n const toolStart = Date.now();\n if (config.logFile) {\n const detail =\n tc.toolName === \"Bash\"\n ? `command=\"${(tc.args as { command: string }).command}\"`\n : \"\";\n logToolCall(config.logFile, tc.toolName, detail);\n }\n\n const handlerCtx: ToolHandlerContext = {\n toolCallId: tc.toolCallId,\n abortSignal: config.abortSignal,\n };\n const resultPromise = handler(tc.args, handlerCtx);\n\n const uiHooks = meta?.uiHooks;\n const startEvent = uiHooks?.onStart?.(tc.args, tc.toolCallId);\n if (startEvent && callbacks.onToolUIEvent) {\n callbacks.onToolUIEvent(startEvent);\n }\n\n const toolResult = await resultPromise;\n updateToolPart(parts, tc.toolCallId, \"output-available\", toolResult);\n callbacks.onMessageUpdate([...parts]);\n\n if (config.logFile) {\n logToolResult(config.logFile, tc.toolName, \"success\", Date.now() - toolStart);\n }\n\n const completeEvent = uiHooks?.onComplete?.(tc.args, toolResult);\n if (completeEvent && callbacks.onToolUIEvent) {\n callbacks.onToolUIEvent(completeEvent);\n }\n\n const afterResult = await executionHooks?.afterExecute?.(tc, {\n success: true,\n output: toolResult,\n });\n\n const output = toToolOutput(toolResult);\n if (afterResult?.feedback) {\n const feedbackOutput = toToolOutput(\n `${typeof toolResult === \"string\" ? toolResult : JSON.stringify(toolResult)}\\n\\n[Hook feedback]: ${afterResult.feedback}`,\n );\n return {\n type: \"tool-result\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n output: feedbackOutput,\n };\n }\n\n return {\n type: \"tool-result\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n output,\n };\n } catch (error) {\n const errorMsg = formatToolError(error);\n updateToolPart(parts, tc.toolCallId, \"output-error\", undefined, errorMsg);\n callbacks.onMessageUpdate([...parts]);\n\n const afterResult = await executionHooks?.afterExecute?.(tc, {\n success: false,\n error: errorMsg,\n });\n\n const errorOutput = afterResult?.feedback\n ? `${errorMsg}\\n\\n[Hook feedback]: ${afterResult.feedback}`\n : errorMsg;\n\n return {\n type: \"tool-result\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n output: { type: \"error-text\", value: errorOutput },\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Batch tool execution (classify → parallel auto / sequential approval)\n// ---------------------------------------------------------------------------\n\nexport async function executeToolCalls(\n toolCalls: ToolCall[],\n parts: MessagePart[],\n config: ToolExecutorConfig,\n callbacks: ToolExecutorCallbacks,\n): Promise<ToolResultPart[]> {\n const { registry, pipeline } = config;\n\n const autoApprove: ToolCall[] = [];\n const needsApproval: ToolCall[] = [];\n const blocked: { tc: ToolCall; reason: string }[] = [];\n\n for (const tc of toolCalls) {\n const meta = registry.getMeta(tc.toolName);\n const evaluation = pipeline.evaluate(tc.toolName, meta, tc.args);\n switch (evaluation.action) {\n case \"block\":\n blocked.push({ tc, reason: evaluation.reason });\n break;\n case \"auto\":\n autoApprove.push(tc);\n break;\n case \"approve\":\n needsApproval.push(tc);\n break;\n }\n }\n\n const blockedResults: ToolResultPart[] = blocked.map(({ tc, reason }) => {\n updateToolPart(parts, tc.toolCallId, \"output-denied\", undefined, reason);\n callbacks.onMessageUpdate([...parts]);\n return pipeline.createDeniedResult(tc.toolCallId, tc.toolName, reason);\n });\n\n const autoResults = await Promise.all(\n autoApprove.map((tc) =>\n executeSingleTool(tc, parts, config, callbacks, false),\n ),\n );\n\n const sequentialResults: ToolResultPart[] = [];\n for (const tc of needsApproval) {\n const result = await executeSingleTool(tc, parts, config, callbacks, true);\n sequentialResults.push(result);\n }\n\n const resultMap = new Map<string, ToolResultPart>();\n for (const r of [...blockedResults, ...autoResults, ...sequentialResults]) {\n resultMap.set(r.toolCallId, r);\n }\n return toolCalls.map((tc) => resultMap.get(tc.toolCallId)!);\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createAskUserState, type AskUserState } from \"../tools/ask-user.js\";\nimport type { TodoItem } from \"../tools/todo-write.js\";\nimport type { McpManager } from \"../extensions/mcp.js\";\n\nexport interface AgentContext {\n readFiles: Map<string, string>;\n todos: TodoItem[];\n askUser: AskUserState;\n}\n\nexport interface AbortState {\n userAbortController: AbortController | null;\n timeoutAbortController: AbortController | null;\n timeoutTimer: ReturnType<typeof setTimeout> | null;\n}\n\nexport interface SessionContext {\n sessionId: string;\n cwd: string;\n nextTerminalId: number;\n logFile: string | null;\n\n abort: AbortState;\n mcpManager: McpManager | null;\n\n agent: AgentContext;\n}\n\nexport function createAbortState(): AbortState {\n return {\n userAbortController: null,\n timeoutAbortController: null,\n timeoutTimer: null,\n };\n}\n\nexport function createAgentContext(): AgentContext {\n return {\n readFiles: new Map(),\n todos: [],\n askUser: createAskUserState(),\n };\n}\n\nexport function createSessionContext(): SessionContext {\n return {\n sessionId: randomUUID(),\n cwd: process.cwd(),\n nextTerminalId: 1,\n logFile: null,\n abort: createAbortState(),\n mcpManager: null,\n agent: createAgentContext(),\n };\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"./definition.js\";\n\nexport interface AskUserQuestion {\n question: string;\n header: string;\n options: { label: string; description: string; markdown?: string }[];\n multiSelect: boolean;\n}\n\nexport interface AskUserAnswer {\n selected: string[];\n otherText?: string;\n}\n\nexport interface AskUserOutput {\n questions: AskUserQuestion[];\n answers: Record<string, AskUserAnswer>;\n}\n\ninterface PendingAskUser {\n toolCallId: string;\n questions: AskUserQuestion[];\n resolve: (answers: Record<string, AskUserAnswer>) => void;\n reject: (reason: Error) => void;\n}\n\nexport interface AskUserState {\n pendingMap: Map<string, PendingAskUser>;\n pendingOrder: string[];\n}\n\nexport function createAskUserState(): AskUserState {\n return { pendingMap: new Map(), pendingOrder: [] };\n}\n\nconst inputSchema = z.object({\n questions: z\n .array(\n z.object({\n question: z.string().describe(\"質問文\"),\n header: z\n .string()\n .describe(\"ラベル(最大12文字、UIのチップ表示用)\"),\n options: z\n .array(\n z.object({\n label: z.string().describe(\"選択肢のラベル\"),\n description: z.string().describe(\"選択肢の説明\"),\n markdown: z\n .string()\n .optional()\n .describe(\"プレビュー用マークダウン\"),\n }),\n )\n .describe(\"選択肢(2-4個、「Other」は自動追加される)\"),\n multiSelect: z.boolean().describe(\"複数選択を許可するか\"),\n }),\n )\n .describe(\"質問リスト(1-4個)\"),\n});\n\nexport const AskUserTool = defineTool({\n name: \"AskUser\",\n category: \"interactive\",\n description: `ユーザーに選択肢付きの質問を投げます。\n情報の収集、曖昧さの解消、好みの確認、意思決定の支援に使用してください。\n- 1-4個の質問を一度に送信可能\n- 各質問に2-4個の選択肢を設定(「Other」は自動追加されます)\n- header はUIのラベル表示に使われます(最大12文字)\n- markdown フィールドでコードプレビューなどのリッチ表示が可能`,\n inputSchema,\n execute: async (input, ctx) => {\n return executeAskUser(ctx.session.agent.askUser, {\n toolCallId: ctx.toolCallId,\n questions: input.questions,\n });\n },\n uiHooks: {\n onStart: (input, toolCallId) => ({\n type: \"askUser\" as const,\n toolCallId,\n questions: input.questions,\n }),\n },\n});\n\nfunction executeAskUser(\n state: AskUserState,\n args: { toolCallId: string; questions: AskUserQuestion[] },\n): Promise<AskUserOutput> {\n return new Promise<AskUserOutput>((resolve, reject) => {\n const entry: PendingAskUser = {\n toolCallId: args.toolCallId,\n questions: args.questions,\n resolve: (answers) => resolve({ questions: args.questions, answers }),\n reject,\n };\n state.pendingMap.set(args.toolCallId, entry);\n state.pendingOrder.push(args.toolCallId);\n });\n}\n\nexport function getNextPendingAskUser(\n state: AskUserState,\n): { toolCallId: string; questions: AskUserQuestion[] } | null {\n if (state.pendingOrder.length === 0) return null;\n const id = state.pendingOrder[0];\n const entry = state.pendingMap.get(id);\n if (!entry) return null;\n return { toolCallId: entry.toolCallId, questions: entry.questions };\n}\n\nexport function getPendingAskUserCount(state: AskUserState): number {\n return state.pendingOrder.length;\n}\n\nexport function resolveAskUser(\n state: AskUserState,\n toolCallId: string,\n answers: Record<string, AskUserAnswer>,\n): void {\n const entry = state.pendingMap.get(toolCallId);\n if (!entry) return;\n\n state.pendingMap.delete(toolCallId);\n const idx = state.pendingOrder.indexOf(toolCallId);\n if (idx !== -1) state.pendingOrder.splice(idx, 1);\n\n entry.resolve(answers);\n}\n\nexport function cancelAllPendingAskUser(state: AskUserState): void {\n const error = new Error(\"AskUser cancelled\");\n for (const entry of state.pendingMap.values()) {\n entry.reject(error);\n }\n state.pendingMap.clear();\n state.pendingOrder.length = 0;\n}\n","import type { ZodType } from \"zod\";\nimport type { SessionContext } from \"../core/context.js\";\nimport type { TodoItem } from \"./todo-write.js\";\nimport type { AskUserQuestion } from \"./ask-user.js\";\n\nexport type ToolCategory =\n | \"read\"\n | \"write\"\n | \"execute\"\n | \"interactive\"\n | \"internal\";\n\nexport interface ToolExecutionContext {\n session: SessionContext;\n toolCallId: string;\n abortSignal?: AbortSignal;\n}\n\nexport interface ToolDefinition<TInput = unknown, TOutput = unknown> {\n name: string;\n description: string;\n category: ToolCategory;\n inputSchema: ZodType<TInput>;\n execute: (\n input: TInput,\n ctx: ToolExecutionContext,\n ) => Promise<TOutput> | TOutput;\n uiHooks?: {\n onStart?: (input: TInput, toolCallId: string) => ToolUIEvent | null;\n onComplete?: (input: TInput, output: TOutput) => ToolUIEvent | null;\n };\n}\n\nexport type ToolUIEvent =\n | { type: \"todoUpdate\"; todos: TodoItem[] }\n | { type: \"askUser\"; toolCallId: string; questions: AskUserQuestion[] };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ErasedToolDefinition = ToolDefinition<any, any>;\n\nexport function defineTool<TInput, TOutput>(\n def: ToolDefinition<TInput, TOutput>,\n): ToolDefinition<TInput, TOutput> {\n return def;\n}\n","import { join } from \"node:path\";\nimport type { LanguageModel } from \"ai\";\nimport { loadAgentConfig, getAgentDir } from \"./loader.js\";\nimport type { AgentConfig } from \"./types.js\";\nimport { buildTemplateVars } from \"../ai/template-vars.js\";\nimport { detectEnvironment } from \"../ai/environment.js\";\nimport { buildSystemPrompt } from \"../ai/system-prompt.js\";\nimport { createToolRegistryBuilder, type ToolRegistry } from \"../tools/registry.js\";\nimport { builtinTools } from \"../tools/index.js\";\nimport { createToolPipeline, type ToolPipeline, type Mode } from \"../tools/pipeline.js\";\nimport { getModel } from \"../ai/providers.js\";\nimport { loadConfig } from \"../config/index.js\";\nimport type { WellGrowConfig } from \"../config/types.js\";\nimport type { SessionContext } from \"../core/context.js\";\nimport {\n McpManager,\n loadGlobalMcpConfig,\n type McpConnectionResult,\n} from \"../extensions/mcp.js\";\nimport { discoverSkills } from \"../extensions/skills.js\";\nimport { HookEngine, loadHooksConfig } from \"../extensions/hook-engine.js\";\n\nexport interface ResolvedAgent {\n name: string;\n icon: string;\n description: string;\n model: LanguageModel;\n modelId: string;\n systemPrompt: string;\n registry: ToolRegistry;\n pipeline: ToolPipeline;\n mcpManager: McpManager | null;\n hookEngine: HookEngine | null;\n maxTurns: number;\n}\n\nexport interface ResolveAgentOptions {\n agentName: string;\n modelOverride?: string;\n modeOverride?: Mode;\n config?: WellGrowConfig;\n onMcpConnection?: (result: McpConnectionResult) => void;\n}\n\nexport async function resolveAgent(\n options: ResolveAgentOptions,\n sessionCtx: SessionContext,\n): Promise<ResolvedAgent> {\n const config = options.config ?? await loadConfig();\n\n let agentConfig: AgentConfig;\n try {\n agentConfig = await loadAgentConfig(options.agentName);\n } catch {\n agentConfig = {\n agent: {\n name: options.agentName,\n description: \"\",\n icon: \"🤖\",\n },\n };\n }\n\n const modelId = options.modelOverride ?? agentConfig.agent.model ?? config.default.model;\n const mode: Mode = options.modeOverride ?? agentConfig.agent.mode ?? config.default.mode;\n const maxTurns = agentConfig.agent.max_turns ?? config.default.max_turns;\n\n const model = getModel(modelId, config);\n const agentDir = getAgentDir(options.agentName);\n\n const environment = await detectEnvironment();\n\n const templateVars = await buildTemplateVars({\n agentName: agentConfig.agent.name,\n agentDir,\n config,\n environment,\n });\n\n const skillPaths = [\n join(agentDir, \"skills\"),\n ...config.skills.paths,\n ...(agentConfig.skills?.paths ?? []),\n ];\n const skills = await discoverSkills(skillPaths);\n\n const systemPrompt = await buildSystemPrompt({\n agentName: options.agentName,\n templateVars,\n skills,\n });\n\n // --- Build tool registry ---\n const builder = createToolRegistryBuilder(sessionCtx).addBuiltinTools(builtinTools);\n\n if (agentConfig.tools?.builtin) {\n builder.filterBuiltins(agentConfig.tools.builtin);\n }\n\n // --- MCP ---\n let mcpManager: McpManager | null = null;\n\n const mcpPaths = [\n ...config.mcp.paths,\n ...(agentConfig.mcp?.paths ?? []),\n ];\n const mcpConfig = await loadGlobalMcpConfig(mcpPaths);\n const serverCount = Object.keys(mcpConfig.mcpServers).length;\n\n const mcpFailures: string[] = [];\n\n if (serverCount > 0) {\n mcpManager = new McpManager();\n const connectionResults = await mcpManager.connectAll(mcpConfig.mcpServers, options.onMcpConnection);\n\n for (const r of connectionResults) {\n if (!r.success) {\n mcpFailures.push(`${r.name}: 接続失敗 (${r.error})`);\n }\n }\n\n const { toolSets, errors: toolErrors } = await mcpManager.getAllToolSets();\n for (const [serverName, toolSet] of toolSets) {\n builder.addMcpTools(toolSet, serverName);\n }\n for (const e of toolErrors) {\n mcpFailures.push(`${e.name}: ${e.error}`);\n }\n\n sessionCtx.mcpManager = mcpManager;\n }\n\n const registry = builder.build();\n\n const pipeline = createToolPipeline({\n mode,\n allowedMcps: config.permissions.allowed_mcps,\n });\n\n // --- Hooks ---\n const hookPaths = [\n ...config.hooks.paths,\n ...(agentConfig.hooks?.paths ?? []),\n ];\n const hooksConfig = await loadHooksConfig(hookPaths);\n\n let hookEngine: HookEngine | null = null;\n if (Object.keys(hooksConfig.hooks).length > 0) {\n hookEngine = new HookEngine(hooksConfig, {\n sessionId: sessionCtx.sessionId,\n cwd: sessionCtx.cwd,\n config,\n });\n }\n\n let finalSystemPrompt = systemPrompt;\n if (mcpFailures.length > 0) {\n finalSystemPrompt += `\\n\\n<mcp_status>\\n以下の MCP サーバーは利用できません。これらのツールは使用しないでください:\\n${mcpFailures.map((f) => `- ${f}`).join(\"\\n\")}\\n</mcp_status>`;\n }\n\n return {\n name: agentConfig.agent.name,\n icon: agentConfig.agent.icon,\n description: agentConfig.agent.description,\n model,\n modelId,\n systemPrompt: finalSystemPrompt,\n registry,\n pipeline,\n mcpManager,\n hookEngine,\n maxTurns,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { parse } from \"smol-toml\";\nimport { agentConfigSchema, type AgentConfig, type AgentSummary } from \"./types.js\";\n\nconst AGENTS_DIR = join(homedir(), \".wellgrow\", \"agents\");\n\nexport function getAgentsDir(): string {\n return AGENTS_DIR;\n}\n\nexport function getAgentDir(agentName: string): string {\n return join(AGENTS_DIR, agentName);\n}\n\nexport async function loadAgentConfig(agentName: string): Promise<AgentConfig> {\n const tomlPath = join(AGENTS_DIR, agentName, \"agent.toml\");\n const raw = await readFile(tomlPath, \"utf-8\");\n const parsed = parse(raw);\n return agentConfigSchema.parse(parsed);\n}\n\nexport async function loadAgentPrompt(agentName: string): Promise<string | null> {\n const promptPath = join(AGENTS_DIR, agentName, \"system-prompt.md\");\n try {\n const content = await readFile(promptPath, \"utf-8\");\n return content.trim() || null;\n } catch {\n process.stderr.write(\n `⚠ ${agentName}: system-prompt.md が見つかりません。エージェントの動作を定義するために作成を推奨します。\\n`,\n );\n return null;\n }\n}\n\nexport async function listAgents(): Promise<AgentSummary[]> {\n let entries: string[];\n try {\n entries = await readdir(AGENTS_DIR);\n } catch {\n return [];\n }\n\n const agents: AgentSummary[] = [];\n\n for (const entry of entries) {\n try {\n const config = await loadAgentConfig(entry);\n agents.push({\n id: entry,\n name: config.agent.name,\n description: config.agent.description,\n icon: config.agent.icon,\n });\n } catch {\n // skip invalid agent directories\n }\n }\n\n return agents;\n}\n","import { z } from \"zod\";\n\nexport const agentConfigSchema = z.object({\n agent: z.object({\n name: z.string(),\n description: z.string(),\n icon: z.string().optional().default(\"🤖\"),\n model: z.string().optional(),\n mode: z.enum([\"plan\", \"auto\"]).optional(),\n max_turns: z.number().int().positive().optional(),\n }),\n tools: z\n .object({\n builtin: z.array(z.string()).optional(),\n })\n .optional(),\n mcp: z\n .object({\n paths: z.array(z.string()).optional(),\n })\n .optional(),\n skills: z\n .object({\n paths: z.array(z.string()).optional(),\n })\n .optional(),\n hooks: z\n .object({\n paths: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nexport type AgentConfig = z.infer<typeof agentConfigSchema>;\n\nexport interface AgentSummary {\n id: string;\n name: string;\n description: string;\n icon: string;\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir, platform, release } from \"node:os\";\nimport type { WellGrowConfig } from \"../config/types.js\";\n\nconst WELLGROW_HOME = join(homedir(), \".wellgrow\");\nconst MANUAL_DIR = join(WELLGROW_HOME, \"manual\");\n\nconst DAY_NAMES = [\n \"日曜日\", \"月曜日\", \"火曜日\", \"水曜日\", \"木曜日\", \"金曜日\", \"土曜日\",\n];\n\nexport interface TemplateVarContext {\n agentName: string;\n agentDir: string;\n config: WellGrowConfig;\n environment?: string;\n}\n\nasync function buildManualListing(): Promise<string> {\n let entries: string[];\n try {\n entries = (await readdir(MANUAL_DIR)).filter((e) => e.endsWith(\".md\")).sort();\n } catch {\n return \"\";\n }\n if (entries.length === 0) return \"\";\n\n const lines = entries.map((e) => `- ${MANUAL_DIR}/${e}`);\n return lines.join(\"\\n\");\n}\n\nexport async function buildTemplateVars(ctx: TemplateVarContext): Promise<Record<string, string>> {\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const localDate = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;\n\n const vars: Record<string, string> = {\n WELLGROW_HOME: WELLGROW_HOME,\n AGENT_NAME: ctx.agentName,\n AGENT_DIR: ctx.agentDir,\n CURRENT_DATE: `${localDate} ${pad(now.getHours())}:00`,\n CURRENT_DATETIME: now.toISOString(),\n DAY_OF_WEEK: DAY_NAMES[now.getDay()],\n OS: `${platform()} ${release()}`,\n SHELL: process.env.SHELL ?? \"unknown\",\n CWD: process.cwd(),\n HOME: homedir(),\n };\n\n if (ctx.config.user?.name) {\n vars.USER_NAME = ctx.config.user.name;\n }\n\n if (ctx.environment) {\n vars.ENVIRONMENT = ctx.environment;\n }\n\n const manualListing = await buildManualListing();\n if (manualListing) {\n vars.WELLGROW_MANUAL = manualListing;\n }\n\n return vars;\n}\n\nexport function expandTemplate(\n template: string,\n vars: Record<string, string>,\n): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string) => vars[key] ?? match);\n}\n","import { loadAgentPrompt } from \"../agents/loader.js\";\nimport { expandTemplate } from \"./template-vars.js\";\n\nexport interface SkillMetadata {\n name: string;\n description: string;\n location: string;\n}\n\nexport interface SystemPromptOptions {\n agentName: string;\n templateVars: Record<string, string>;\n skills?: SkillMetadata[];\n}\n\nfunction buildAvailableSkillsSection(skills: SkillMetadata[]): string {\n const entries = skills\n .map(\n (s) =>\n `<skill>\\n <name>${s.name}</name>\\n <description>${s.description}</description>\\n <location>${s.location}</location>\\n</skill>`,\n )\n .join(\"\\n\");\n\n return `## Skills\n\n利用可能なスキルが <available_skills> に列挙されている。\nユーザーの要求に関連するスキルがあると判断した場合、まず Read ツールで該当する SKILL.md を読み、その指示に従うこと。\nスキルは編集・追加できる。手順は \\`~/.wellgrow/manual/skills.md\\` を参照。\n\n<available_skills>\n${entries}\n</available_skills>`;\n}\n\nexport async function buildSystemPrompt(\n options: SystemPromptOptions,\n): Promise<string> {\n const rawPrompt = await loadAgentPrompt(options.agentName);\n\n const parts: string[] = [];\n\n if (rawPrompt) {\n parts.push(expandTemplate(rawPrompt, options.templateVars));\n }\n\n if (options.skills?.length) {\n parts.push(buildAvailableSkillsSection(options.skills));\n }\n\n return parts.join(\"\\n\\n\");\n}\n","import { tool, type Tool } from \"ai\";\nimport type {\n ErasedToolDefinition,\n ToolExecutionContext,\n ToolCategory,\n ToolUIEvent,\n} from \"./definition.js\";\nimport type { SessionContext } from \"../core/context.js\";\n\nexport type ToolSource = \"builtin\" | \"mcp\" | \"custom\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyTool = Tool<any, any>;\n\nexport interface ToolHandlerContext {\n toolCallId: string;\n abortSignal?: AbortSignal;\n}\n\ntype ToolHandler = (\n args: Record<string, unknown>,\n ctx: ToolHandlerContext,\n) => Promise<unknown> | unknown;\n\nexport interface ToolMeta {\n category: ToolCategory;\n source: ToolSource;\n uiHooks?: {\n onStart?: (input: unknown, toolCallId: string) => ToolUIEvent | null;\n onComplete?: (input: unknown, output: unknown) => ToolUIEvent | null;\n };\n}\n\nexport interface ToolRegistry {\n schemas: Record<string, AnyTool>;\n handlers: Record<string, ToolHandler>;\n getMeta(toolName: string): ToolMeta | undefined;\n}\n\nexport interface ToolRegistryBuilder {\n addBuiltinTools(tools: ErasedToolDefinition[]): ToolRegistryBuilder;\n addMcpTools(\n mcpToolSet: Record<string, AnyTool>,\n serverName: string,\n ): ToolRegistryBuilder;\n filterBuiltins(allowed: string[]): ToolRegistryBuilder;\n build(): ToolRegistry;\n}\n\nexport function createToolRegistryBuilder(\n sessionCtx: SessionContext,\n): ToolRegistryBuilder {\n const schemas: Record<string, AnyTool> = {};\n const handlers: Record<string, ToolHandler> = {};\n const metaMap = new Map<string, ToolMeta>();\n\n const builder: ToolRegistryBuilder = {\n addBuiltinTools(tools) {\n for (const t of tools) {\n schemas[t.name] = tool({\n description: t.description,\n inputSchema: t.inputSchema,\n });\n\n handlers[t.name] = async (args, handlerCtx) => {\n const input = t.inputSchema.parse(args);\n const execCtx: ToolExecutionContext = {\n session: sessionCtx,\n toolCallId: handlerCtx.toolCallId,\n abortSignal: handlerCtx.abortSignal,\n };\n return t.execute(input, execCtx);\n };\n\n metaMap.set(t.name, {\n category: t.category,\n source: \"builtin\",\n uiHooks: t.uiHooks,\n });\n }\n return builder;\n },\n\n addMcpTools(mcpToolSet, serverName) {\n for (const [name, mcpTool] of Object.entries(mcpToolSet)) {\n const qualifiedName = `mcp__${serverName}__${name}`;\n\n schemas[qualifiedName] = tool({\n description: mcpTool.description ?? \"\",\n inputSchema: mcpTool.inputSchema,\n });\n\n if (typeof mcpTool.execute === \"function\") {\n const executeFn = mcpTool.execute;\n handlers[qualifiedName] = (args, handlerCtx) =>\n executeFn(args, {\n toolCallId: handlerCtx.toolCallId,\n messages: [],\n });\n }\n\n metaMap.set(qualifiedName, {\n category: \"execute\",\n source: \"mcp\",\n });\n }\n return builder;\n },\n\n filterBuiltins(allowed) {\n const allowSet = new Set(allowed);\n for (const [name, meta] of metaMap) {\n if (meta.source === \"builtin\" && !allowSet.has(name)) {\n delete schemas[name];\n delete handlers[name];\n metaMap.delete(name);\n }\n }\n return builder;\n },\n\n build() {\n return {\n schemas: { ...schemas },\n handlers: { ...handlers },\n getMeta: (name: string) => metaMap.get(name),\n };\n },\n };\n\n return builder;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { MAX_READ_LINES, LINE_TRUNCATION } from \"./constants.js\";\nimport { defineTool } from \"./definition.js\";\n\nexport interface ReadOutput {\n filePath: string;\n content: string;\n numLines: number;\n startLine: number;\n totalLines: number;\n}\n\nconst inputSchema = z.object({\n file_path: z.string().describe(\"ファイルの絶対パス\"),\n offset: z\n .number()\n .optional()\n .describe(\"開始行番号(1-indexed、負の値は末尾からの相対位置)\"),\n limit: z.number().optional().describe(\"読み取り行数\"),\n});\n\nexport const ReadTool = defineTool({\n name: \"Read\",\n category: \"read\",\n description: `ファイルの内容を読み取ります。\n- テキストファイルのみ対応(ディレクトリは読み取れません)\n- デフォルトで先頭2000行まで読み取り、2000文字を超える行は切り詰められます\n- 出力は LINE_NUMBER|LINE_CONTENT 形式(行番号は1から開始)\n- offset に負の値を指定すると末尾からの相対位置で読み取ります\n- 大きなファイルは offset + limit で部分読み取り可能\n- 複数ファイルを並列で読み取ることを推奨します\n- ファイルパスは絶対パスで指定してください\n- 存在しないファイルを読もうとするとエラーが返ります`,\n inputSchema,\n execute: async (input, ctx) => {\n const raw = await readFile(input.file_path, \"utf-8\");\n ctx.session.agent.readFiles.set(\n input.file_path,\n createHash(\"md5\").update(raw).digest(\"hex\"),\n );\n return formatReadOutput(input.file_path, raw, input.offset, input.limit);\n },\n});\n\nfunction formatReadOutput(\n filePath: string,\n raw: string,\n offset?: number,\n limit?: number,\n): ReadOutput {\n const lines = raw.split(\"\\n\");\n const totalLines = lines.length;\n\n let startLine: number;\n if (offset !== undefined) {\n startLine = offset < 0 ? Math.max(1, totalLines + offset + 1) : offset;\n } else {\n startLine = 1;\n }\n\n const effectiveLimit = Math.min(limit ?? MAX_READ_LINES, MAX_READ_LINES);\n const endLine = Math.min(startLine + effectiveLimit - 1, totalLines);\n const selectedLines = lines.slice(startLine - 1, endLine);\n\n const formatted = selectedLines\n .map((line, i) => {\n const lineNum = String(startLine + i).padStart(6, \" \");\n const truncated =\n line.length > LINE_TRUNCATION\n ? line.slice(0, LINE_TRUNCATION) + \"...\"\n : line;\n return `${lineNum}|${truncated}`;\n })\n .join(\"\\n\");\n\n return {\n filePath,\n content: formatted,\n numLines: selectedLines.length,\n startLine,\n totalLines,\n };\n}\n","export const MAX_READ_LINES = 2000;\nexport const LINE_TRUNCATION = 2000;\nexport const MAX_BASH_OUTPUT_CHARS = 30000;\nexport const MAX_BASH_OUTPUT_BYTES = 1_048_576; // 1 MiB hard cap during accumulation (OOM prevention)\nexport const BASH_DEFAULT_TIMEOUT = 120000;\nexport const BASH_MAX_TIMEOUT = 600000;\nexport const BASH_IO_DRAIN_TIMEOUT = 2000; // ms to wait for remaining I/O after process exit\nexport const BASH_BACKGROUND_FLUSH_INTERVAL = 500;\nexport const GLOB_MAX_FILES = 100;\n","import { writeFile, readFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { structuredPatch } from \"diff\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { z } from \"zod\";\nimport { ToolError } from \"./errors.js\";\nimport { defineTool } from \"./definition.js\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface PatchHunk {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: string[];\n}\n\ninterface GitDiffInfo {\n filename: string;\n status: \"modified\" | \"added\";\n additions: number;\n deletions: number;\n changes: number;\n patch: string;\n}\n\nexport interface WriteOutput {\n type: \"create\" | \"update\";\n filePath: string;\n structuredPatch: PatchHunk[];\n gitDiff?: GitDiffInfo;\n}\n\nconst inputSchema = z.object({\n file_path: z.string().describe(\"ファイルの絶対パス\"),\n content: z.string().describe(\"ファイルの全内容\"),\n});\n\nexport const WriteTool = defineTool({\n name: \"Write\",\n category: \"write\",\n description: `ファイルを新規作成または全体上書きします。\n- 既存ファイルの編集には Edit を優先してください\n- 既存ファイルを上書きする場合、先に Read で内容を確認してください(未読ならエラー)\n- 親ディレクトリが存在しない場合は自動作成されます\n- ドキュメントファイル(.md, README)は明示的に要求されない限り作成しないでください\n- ファイルパスは絶対パスで指定してください`,\n inputSchema,\n execute: async (input, ctx) => {\n return executeWrite(input, ctx.session.agent.readFiles);\n },\n});\n\nfunction generateStructuredPatch(\n filePath: string,\n oldContent: string,\n newContent: string,\n): PatchHunk[] {\n const patch = structuredPatch(filePath, filePath, oldContent, newContent);\n return patch.hunks.map((h) => ({\n oldStart: h.oldStart,\n oldLines: h.oldLines,\n newStart: h.newStart,\n newLines: h.newLines,\n lines: h.lines,\n }));\n}\n\nasync function getGitDiff(filePath: string, status: \"modified\" | \"added\"): Promise<GitDiffInfo | undefined> {\n try {\n const { stdout } = await execFileAsync(\"git\", [\"diff\", \"--\", filePath], {\n timeout: 5000,\n });\n if (!stdout.trim()) return undefined;\n const additions = (stdout.match(/^\\+[^+]/gm) ?? []).length;\n const deletions = (stdout.match(/^-[^-]/gm) ?? []).length;\n return {\n filename: filePath,\n status,\n additions,\n deletions,\n changes: additions + deletions,\n patch: stdout,\n };\n } catch {\n return undefined;\n }\n}\n\nasync function executeWrite(\n args: { file_path: string; content: string },\n readFiles: Map<string, string>,\n): Promise<WriteOutput> {\n let originalContent: string | null = null;\n\n try {\n originalContent = await readFile(args.file_path, \"utf-8\");\n } catch {\n originalContent = null;\n }\n\n const isUpdate = originalContent !== null;\n\n if (isUpdate && !readFiles.has(args.file_path)) {\n throw new ToolError(\n \"Write\",\n \"FILE_NOT_READ\",\n `${args.file_path} を上書きする前に確認が必要です`,\n );\n }\n\n await mkdir(dirname(args.file_path), { recursive: true });\n await writeFile(args.file_path, args.content, \"utf-8\");\n\n const hash = createHash(\"md5\").update(args.content).digest(\"hex\");\n readFiles.set(args.file_path, hash);\n\n const patches = generateStructuredPatch(\n args.file_path,\n originalContent ?? \"\",\n args.content,\n );\n\n const gitDiff = await getGitDiff(\n args.file_path,\n isUpdate ? \"modified\" : \"added\",\n );\n\n return {\n type: isUpdate ? \"update\" : \"create\",\n filePath: args.file_path,\n structuredPatch: patches,\n gitDiff,\n };\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { structuredPatch } from \"diff\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { z } from \"zod\";\nimport { ToolError } from \"./errors.js\";\nimport { defineTool } from \"./definition.js\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface PatchHunk {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: string[];\n}\n\ninterface GitDiffInfo {\n filename: string;\n status: \"modified\" | \"added\";\n additions: number;\n deletions: number;\n changes: number;\n patch: string;\n}\n\nexport interface EditOutput {\n filePath: string;\n oldString: string;\n newString: string;\n structuredPatch: PatchHunk[];\n userModified: boolean;\n replaceAll: boolean;\n gitDiff?: GitDiffInfo;\n}\n\nfunction hashContent(content: string): string {\n return createHash(\"md5\").update(content).digest(\"hex\");\n}\n\nfunction generateStructuredPatch(\n filePath: string,\n oldContent: string,\n newContent: string,\n): PatchHunk[] {\n const patch = structuredPatch(filePath, filePath, oldContent, newContent);\n return patch.hunks.map((h) => ({\n oldStart: h.oldStart,\n oldLines: h.oldLines,\n newStart: h.newStart,\n newLines: h.newLines,\n lines: h.lines,\n }));\n}\n\nasync function getGitDiff(filePath: string): Promise<GitDiffInfo | undefined> {\n try {\n const { stdout } = await execFileAsync(\"git\", [\"diff\", \"--\", filePath], {\n timeout: 5000,\n });\n if (!stdout.trim()) return undefined;\n const additions = (stdout.match(/^\\+[^+]/gm) ?? []).length;\n const deletions = (stdout.match(/^-[^-]/gm) ?? []).length;\n return {\n filename: filePath,\n status: \"modified\",\n additions,\n deletions,\n changes: additions + deletions,\n patch: stdout,\n };\n } catch {\n return undefined;\n }\n}\n\nconst inputSchema = z.object({\n file_path: z.string().describe(\"ファイルの絶対パス\"),\n old_string: z.string().describe(\"置換対象の文字列(ユニークであること)\"),\n new_string: z.string().describe(\"置換後の文字列\"),\n replace_all: z\n .boolean()\n .optional()\n .describe(\"全出現箇所を置換するか(デフォルト: false)\"),\n});\n\nexport const EditTool = defineTool({\n name: \"Edit\",\n category: \"write\",\n description: `既存ファイルの部分編集(文字列置換)を行います。\n- 編集前に必ず Read でファイルを読んでおくこと(未読ならエラー)\n- Read 出力のインデント(タブ/スペース)を正確に保持すること\n- old_string はファイル内でユニークであること(複数箇所にある場合はエラー)\n → コンテキストを多く含めてユニークにするか、replace_all: true を使用\n- replace_all はファイル全体のリネーム・一括置換に使用\n- 既存ファイルの編集には Write でなくこのツールを優先すること`,\n inputSchema,\n execute: async (input, ctx) => {\n return executeEdit(input, ctx.session.agent.readFiles);\n },\n});\n\nasync function executeEdit(\n args: {\n file_path: string;\n old_string: string;\n new_string: string;\n replace_all?: boolean;\n },\n readFiles: Map<string, string>,\n): Promise<EditOutput> {\n if (!readFiles.has(args.file_path)) {\n throw new ToolError(\n \"Edit\",\n \"FILE_NOT_READ\",\n `${args.file_path} を編集する前に確認が必要です`,\n );\n }\n\n const content = await readFile(args.file_path, \"utf-8\");\n\n const currentHash = hashContent(content);\n const savedHash = readFiles.get(args.file_path) ?? \"\";\n const userModified = savedHash !== \"\" && currentHash !== savedHash;\n\n if (!content.includes(args.old_string)) {\n throw new ToolError(\n \"Edit\",\n \"OLD_STRING_NOT_FOUND\",\n `old_string がファイル内に見つかりません`,\n );\n }\n\n if (!args.replace_all) {\n const firstIndex = content.indexOf(args.old_string);\n const lastIndex = content.lastIndexOf(args.old_string);\n if (firstIndex !== lastIndex) {\n throw new ToolError(\n \"Edit\",\n \"OLD_STRING_NOT_UNIQUE\",\n `old_string がファイル内に複数箇所あります`,\n );\n }\n }\n\n let newContent: string;\n\n if (args.replace_all) {\n newContent = content.split(args.old_string).join(args.new_string);\n } else {\n newContent = content.replace(args.old_string, args.new_string);\n }\n\n await writeFile(args.file_path, newContent, \"utf-8\");\n\n readFiles.set(args.file_path, hashContent(newContent));\n\n const patches = generateStructuredPatch(args.file_path, content, newContent);\n const gitDiff = await getGitDiff(args.file_path);\n\n return {\n filePath: args.file_path,\n oldString: args.old_string,\n newString: args.new_string,\n structuredPatch: patches,\n userModified,\n replaceAll: args.replace_all ?? false,\n gitDiff,\n };\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { writeFile, mkdir, stat } from \"node:fs/promises\";\nimport { join, resolve, isAbsolute } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport {\n MAX_BASH_OUTPUT_CHARS,\n MAX_BASH_OUTPUT_BYTES,\n BASH_DEFAULT_TIMEOUT,\n BASH_MAX_TIMEOUT,\n BASH_IO_DRAIN_TIMEOUT,\n BASH_BACKGROUND_FLUSH_INTERVAL,\n} from \"./constants.js\";\nimport { registerBackgroundProcess } from \"../signals.js\";\nimport { defineTool } from \"./definition.js\";\n\nexport interface BashState {\n cwd: string;\n nextTerminalId: number;\n}\n\n// Process-level cache: user's shell doesn't change during process lifetime\nlet cachedShell: { path: string; name: string } | null = null;\nconst dirStack: string[] = [];\n\nexport interface BashOutput {\n stdout: string;\n stderr: string;\n exitCode: number | null;\n interrupted: boolean;\n backgroundTaskId?: string;\n backgroundedByUser?: boolean;\n returnCodeInterpretation?: string;\n noOutputExpected?: boolean;\n persistedOutputPath?: string;\n persistedOutputSize?: number;\n}\n\nasync function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\n// ---------------------------------------------------------------------------\n// Output masking — sensitive env var values are redacted from tool output\n// so they never reach the LLM context or logs, while still being available\n// to child processes.\n// ---------------------------------------------------------------------------\n\nconst SENSITIVE_ENV_PATTERNS = [\n /key/i,\n /secret/i,\n /token/i,\n /password/i,\n /credential/i,\n];\n\nconst MIN_SECRET_LENGTH = 8;\n\nconst sensitiveValues: string[] = [];\nfor (const [key, value] of Object.entries(process.env)) {\n if (!value || value.length < MIN_SECRET_LENGTH) continue;\n if (SENSITIVE_ENV_PATTERNS.some((p) => p.test(key))) {\n sensitiveValues.push(value);\n }\n}\nsensitiveValues.sort((a, b) => b.length - a.length);\n\nfunction maskSensitiveOutput(text: string): string {\n let masked = text;\n for (const secret of sensitiveValues) {\n masked = masked.replaceAll(secret, \"***\");\n }\n return masked;\n}\n\nconst spawnEnv: Record<string, string> = {\n ...(process.env as Record<string, string>),\n TERM: \"dumb\",\n NO_COLOR: \"1\",\n FORCE_COLOR: \"0\",\n CI: \"1\",\n NODE_NO_READLINE: \"1\",\n};\n\n// ---------------------------------------------------------------------------\n// User shell detection\n// ---------------------------------------------------------------------------\n\nfunction detectShell(): { path: string; name: string } {\n if (cachedShell) return cachedShell;\n\n const shellPath = process.env.SHELL;\n if (shellPath) {\n const name = shellPath.split(\"/\").pop() ?? \"sh\";\n if (name === \"zsh\" || name === \"bash\") {\n cachedShell = { path: shellPath, name };\n return cachedShell;\n }\n }\n\n cachedShell = { path: \"sh\", name: \"sh\" };\n return cachedShell;\n}\n\nfunction buildShellArgs(shellName: string, command: string): string[] {\n if (shellName === \"zsh\") {\n // -l で .zprofile を読み込む(高速・安定重視)\n return [\"-l\", \"-c\", command];\n }\n if (shellName === \"bash\") {\n // -l で .bash_profile を読み込む(大抵 .bashrc もソースされる)\n return [\"-l\", \"-c\", command];\n }\n return [\"-c\", command];\n}\n\nfunction spawnShell(\n command: string,\n options: { cwd: string; detached?: boolean },\n): ChildProcess {\n const shell = detectShell();\n return spawn(shell.path, buildShellArgs(shell.name, command), {\n cwd: options.cwd,\n env: spawnEnv as NodeJS.ProcessEnv,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: options.detached,\n });\n}\n\n// ---------------------------------------------------------------------------\n// CWD tracking\n// Parses chain operators (;, &&, ||, newlines) and tracks cd/pushd/popd\n// through command sequences. Subshells and pipelines are ignored since\n// directory changes within them don't affect the parent shell.\n// ---------------------------------------------------------------------------\n\nfunction containsDirChange(command: string): boolean {\n return /\\b(cd|pushd|popd)\\b/.test(command);\n}\n\nfunction splitChainSegments(command: string): string[] {\n const segments: string[] = [];\n let current = \"\";\n let inSingle = false;\n let inDouble = false;\n let parenDepth = 0;\n\n for (let i = 0; i < command.length; i++) {\n const ch = command[i];\n const prev = i > 0 ? command[i - 1] : \"\";\n\n if (ch === \"'\" && !inDouble && prev !== \"\\\\\") {\n inSingle = !inSingle;\n current += ch;\n continue;\n }\n if (ch === '\"' && !inSingle && prev !== \"\\\\\") {\n inDouble = !inDouble;\n current += ch;\n continue;\n }\n if (inSingle || inDouble) {\n current += ch;\n continue;\n }\n\n if (ch === \"(\") {\n parenDepth++;\n current += ch;\n continue;\n }\n if (ch === \")\") {\n parenDepth = Math.max(0, parenDepth - 1);\n current += ch;\n continue;\n }\n if (parenDepth > 0) {\n current += ch;\n continue;\n }\n\n if (ch === \";\" || ch === \"\\n\") {\n segments.push(current);\n current = \"\";\n continue;\n }\n if (ch === \"&\" && command[i + 1] === \"&\") {\n segments.push(current);\n current = \"\";\n i++;\n continue;\n }\n if (ch === \"|\" && command[i + 1] === \"|\") {\n segments.push(current);\n current = \"\";\n i++;\n continue;\n }\n\n current += ch;\n }\n\n if (current.trim()) segments.push(current);\n return segments;\n}\n\nfunction extractDirCommand(\n segment: string,\n): { type: \"cd\" | \"pushd\" | \"popd\"; target?: string } | null {\n const trimmed = segment.trim();\n\n // cd in a pipeline runs in a subshell — ignore\n if (/(?<!\\|)\\|(?!\\|)/.test(trimmed)) return null;\n\n const cdMatch = trimmed.match(\n /^cd(?:\\s+(?:\"([^\"]*)\"|'([^']*)'|(\\S+)))?(?:\\s|$)/,\n );\n if (cdMatch) {\n return { type: \"cd\", target: cdMatch[1] ?? cdMatch[2] ?? cdMatch[3] };\n }\n\n const pushdMatch = trimmed.match(\n /^pushd(?:\\s+(?:\"([^\"]*)\"|'([^']*)'|(\\S+)))?(?:\\s|$)/,\n );\n if (pushdMatch) {\n return {\n type: \"pushd\",\n target: pushdMatch[1] ?? pushdMatch[2] ?? pushdMatch[3],\n };\n }\n\n if (/^popd(?:\\s|$)/.test(trimmed)) {\n return { type: \"popd\" };\n }\n\n return null;\n}\n\nasync function trackCwdChanges(\n state: BashState,\n command: string,\n cwd: string,\n): Promise<void> {\n if (!containsDirChange(command)) return;\n\n const segments = splitChainSegments(command);\n let effectiveCwd = cwd;\n\n for (const segment of segments) {\n const dirCmd = extractDirCommand(segment);\n if (!dirCmd) continue;\n\n if (dirCmd.type === \"popd\") {\n const popped = dirStack.pop();\n if (popped) effectiveCwd = popped;\n continue;\n }\n\n let target = dirCmd.target;\n if (!target) {\n if (dirCmd.type === \"cd\") {\n effectiveCwd = homedir();\n }\n continue;\n }\n if (target === \"-\") continue;\n\n target = target.replace(/^~(?=\\/|$)/, homedir());\n const resolved = isAbsolute(target) ? target : resolve(effectiveCwd, target);\n\n try {\n const s = await stat(resolved);\n if (s.isDirectory()) {\n if (dirCmd.type === \"pushd\") {\n dirStack.push(effectiveCwd);\n }\n effectiveCwd = resolved;\n }\n } catch {\n // directory not accessible\n }\n }\n\n state.cwd = effectiveCwd;\n}\n\n// ---------------------------------------------------------------------------\n// Error formatting\n// ---------------------------------------------------------------------------\n\nfunction formatSpawnError(error: NodeJS.ErrnoException): string {\n switch (error.code) {\n case \"ENOENT\":\n return `コマンドが見つかりません: ${error.path ?? \"unknown\"}。wellgrow doctor でインストール状況を確認するか、別のコマンドを使用してください`;\n case \"EACCES\":\n return `実行権限がありません: ${error.path ?? \"unknown\"}。chmod +x で実行権限を付与してください`;\n case \"EPERM\":\n return `操作が許可されていません: ${error.message}。sudo が必要か、または別の方法を検討してください`;\n default:\n return `プロセス起動エラー: ${error.message}`;\n }\n}\n\nfunction attachSpawnErrorHandler(\n child: ChildProcess,\n resolve: (value: BashOutput) => void,\n timer?: ReturnType<typeof setTimeout>,\n): void {\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n if (timer) clearTimeout(timer);\n resolve({\n stdout: \"\",\n stderr: formatSpawnError(error),\n exitCode: 1,\n interrupted: false,\n });\n });\n}\n\n// ---------------------------------------------------------------------------\n// Output truncation\n// ---------------------------------------------------------------------------\n\nfunction truncateMiddle(\n text: string,\n maxChars: number,\n): { truncated: string; totalLines: number } {\n const totalLines = text.split(\"\\n\").length;\n if (text.length <= maxChars) return { truncated: text, totalLines };\n\n const leftBudget = Math.floor(maxChars / 2);\n const rightBudget = maxChars - leftBudget;\n\n const left = text.slice(0, leftBudget);\n const right = text.slice(-rightBudget);\n const removedChars = text.length - leftBudget - rightBudget;\n\n const truncated = `${left}\\n\\n…${removedChars}文字省略…\\n\\n${right}`;\n return { truncated, totalLines };\n}\n\n// ---------------------------------------------------------------------------\n// Memory-capped buffer accumulation\n// ---------------------------------------------------------------------------\n\nfunction appendCapped(\n current: string,\n chunk: string,\n maxBytes: number,\n): string {\n const currentBytes = Buffer.byteLength(current, \"utf-8\");\n if (currentBytes >= maxBytes) return current;\n const remaining = maxBytes - currentBytes;\n const chunkBytes = Buffer.byteLength(chunk, \"utf-8\");\n if (chunkBytes <= remaining) return current + chunk;\n const buf = Buffer.from(chunk, \"utf-8\");\n return current + buf.subarray(0, remaining).toString(\"utf-8\");\n}\n\n// ---------------------------------------------------------------------------\n// Tool definition\n// ---------------------------------------------------------------------------\n\nconst inputSchema = z.object({\n command: z.string().describe(\"実行するシェルコマンド\"),\n description: z\n .string()\n .optional()\n .describe(\"コマンドの簡潔な説明(5-10語、ユーザーへの表示用)\"),\n working_directory: z\n .string()\n .optional()\n .describe(\"実行ディレクトリの絶対パス\"),\n timeout: z\n .number()\n .optional()\n .describe(\"タイムアウト(ミリ秒、デフォルト: 120000、最大: 600000)\"),\n run_in_background: z\n .boolean()\n .optional()\n .describe(\"バックグラウンド実行フラグ\"),\n});\n\nexport const BashTool = defineTool({\n name: \"Bash\",\n category: \"execute\",\n description: `シェルコマンドを実行します。作業ディレクトリは呼び出し間で永続化されますが、シェル状態(変数、エイリアス等)は永続化されません。\n\n重要: ファイル操作には専用ツールを使ってください:\n- ファイル読み取り → Read(cat, head, tail は使わない)\n- ファイル検索 → Glob(find は使わない)\n- テキスト検索 → Grep(grep, rg は使わない)\n- ファイル作成 → Write(echo やリダイレクトは使わない)\n- ファイル編集 → Edit(sed, awk は使わない)\n\n実行前のチェック:\n1. ディレクトリ確認: ファイルやディレクトリを新規作成する場合、先に Glob や Bash(ls) で親ディレクトリの存在を確認すること\n2. パスのクォーティング: スペースを含むパスは必ずダブルクォートで囲むこと\n\nガイドライン:\n- 独立したコマンドは並列で複数の Bash 呼び出しにしてください\n- 依存するコマンドは && でチェインしてください\n- description パラメータでユーザーに何をしているか伝えてください\n- タイムアウト: デフォルト120秒、最大600秒。超過時はバックグラウンドに自動移行\n- 出力が30000文字を超える場合は切り詰められ、完全な出力はファイルに保存されます\n- セキュリティのためAPIキーや環境変数やパスワードは自動でマスキングがかかる仕様です\n- run_in_background: true でバックグラウンド実行。出力は ~/.wellgrow/terminals/ に保存\n → Read ツールでターミナルファイルを定期的に確認してモニタリングできます`,\n inputSchema,\n execute: async (input, ctx) => {\n const state: BashState = {\n cwd: ctx.session.cwd,\n nextTerminalId: ctx.session.nextTerminalId,\n };\n const result = await executeBash(state, input, ctx.abortSignal);\n ctx.session.cwd = state.cwd;\n ctx.session.nextTerminalId = state.nextTerminalId;\n return result;\n },\n});\n\n// ---------------------------------------------------------------------------\n// Main execution\n// ---------------------------------------------------------------------------\n\nexport async function executeBash(\n state: BashState,\n args: {\n command: string;\n description?: string;\n working_directory?: string;\n timeout?: number;\n run_in_background?: boolean;\n },\n abortSignal?: AbortSignal,\n): Promise<BashOutput> {\n const cwd = args.working_directory ?? state.cwd;\n const timeout = Math.min(\n args.timeout ?? BASH_DEFAULT_TIMEOUT,\n BASH_MAX_TIMEOUT,\n );\n\n if (args.run_in_background) {\n const result = await runInBackground(state, args.command, cwd);\n result.backgroundedByUser = true;\n return result;\n }\n\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let interrupted = false;\n let resolved = false;\n let building = false;\n let exitedCode: number | null = null;\n let closeTimer: ReturnType<typeof setTimeout> | null = null;\n\n const safeResolve = (value: BashOutput) => {\n if (resolved) return;\n resolved = true;\n if (closeTimer) clearTimeout(closeTimer);\n resolve(value);\n };\n\n const child = spawnShell(args.command, { cwd });\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (!child.killed) child.kill(\"SIGKILL\");\n }, 3000);\n }, timeout);\n\n if (abortSignal) {\n const onAbort = () => {\n if (!resolved && !interrupted) {\n interrupted = true;\n child.kill(\"SIGINT\");\n setTimeout(() => {\n if (!child.killed && !resolved) child.kill(\"SIGKILL\");\n }, 3000);\n }\n };\n if (abortSignal.aborted) {\n onAbort();\n } else {\n abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n attachSpawnErrorHandler(child, safeResolve, timer);\n\n child.stdout!.on(\"data\", (data: Buffer) => {\n stdout = appendCapped(stdout, data.toString(), MAX_BASH_OUTPUT_BYTES);\n });\n\n child.stderr!.on(\"data\", (data: Buffer) => {\n stderr = appendCapped(stderr, data.toString(), MAX_BASH_OUTPUT_BYTES);\n });\n\n const finalize = async (code: number | null) => {\n if (building || resolved) return;\n building = true;\n clearTimeout(timer);\n if (closeTimer) clearTimeout(closeTimer);\n\n if (timedOut) {\n safeResolve(await runInBackground(state, args.command, cwd));\n return;\n }\n\n await trackCwdChanges(state, args.command, cwd);\n\n let finalStdout = stdout;\n let persistedOutputPath: string | undefined;\n let persistedOutputSize: number | undefined;\n\n if (finalStdout.length > MAX_BASH_OUTPUT_CHARS) {\n const hash = createHash(\"md5\")\n .update(finalStdout)\n .digest(\"hex\")\n .slice(0, 12);\n const outputsDir = join(homedir(), \".wellgrow\", \"outputs\");\n await ensureDir(outputsDir);\n persistedOutputPath = join(outputsDir, `${hash}.txt`);\n await writeFile(persistedOutputPath, finalStdout, \"utf-8\");\n persistedOutputSize = Buffer.byteLength(finalStdout, \"utf-8\");\n\n const { truncated, totalLines } = truncateMiddle(\n finalStdout,\n MAX_BASH_OUTPUT_CHARS,\n );\n finalStdout =\n `[出力が${MAX_BASH_OUTPUT_CHARS}文字を超えたため切り詰めました (全${totalLines}行)]\\n` +\n `完全な出力: ${persistedOutputPath} (${persistedOutputSize} bytes)\\n` +\n `Read ツールで参照できます。\\n\\n${truncated}`;\n }\n\n let returnCodeInterpretation: string | undefined;\n if (code !== null && code > 128) {\n const signal = code - 128;\n const signalNames: Record<number, string> = {\n 1: \"SIGHUP\",\n 2: \"SIGINT\",\n 9: \"SIGKILL\",\n 15: \"SIGTERM\",\n };\n returnCodeInterpretation = `killed by ${signalNames[signal] ?? `signal ${signal}`}`;\n }\n\n const noOutputExpected = !stdout && !stderr && code === 0;\n\n finalStdout = maskSensitiveOutput(finalStdout);\n const maskedStderr = maskSensitiveOutput(stderr);\n\n safeResolve({\n stdout: interrupted\n ? `${finalStdout}\\n[ユーザーにより中断されました]`\n : finalStdout,\n stderr: maskedStderr,\n exitCode: code,\n interrupted,\n persistedOutputPath,\n persistedOutputSize,\n returnCodeInterpretation,\n noOutputExpected,\n });\n };\n\n // I/O drain strategy:\n // 'exit' fires when the process terminates; 'close' fires after all stdio\n // streams are destroyed. Grandchild processes may keep pipes open, causing\n // 'close' to hang indefinitely. We set a drain timeout on 'exit' and\n // forcefully destroy streams if 'close' doesn't arrive in time.\n child.on(\"exit\", (code) => {\n exitedCode = code;\n closeTimer = setTimeout(() => {\n child.stdout?.destroy();\n child.stderr?.destroy();\n finalize(exitedCode);\n }, BASH_IO_DRAIN_TIMEOUT);\n });\n\n child.on(\"close\", (code) => {\n finalize(code ?? exitedCode);\n });\n });\n}\n\n// ---------------------------------------------------------------------------\n// Background execution\n// ---------------------------------------------------------------------------\n\nasync function runInBackground(\n state: BashState,\n command: string,\n cwd: string,\n): Promise<BashOutput> {\n const terminalId = state.nextTerminalId++;\n const terminalsDir = join(homedir(), \".wellgrow\", \"terminals\");\n await ensureDir(terminalsDir);\n const terminalFile = join(terminalsDir, `${terminalId}.txt`);\n\n let child: ChildProcess;\n try {\n child = spawnShell(command, { cwd, detached: true });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n return {\n stdout: \"\",\n stderr: formatSpawnError(err),\n exitCode: 1,\n interrupted: false,\n };\n }\n\n registerBackgroundProcess(child);\n\n const pid = child.pid;\n const startTime = Date.now();\n\n let header = `---\\npid: ${pid}\\ncwd: ${cwd}\\nlast_command: ${command}\\nrunning_for_ms: 0\\n---\\n> ${command}\\n\\n`;\n await writeFile(terminalFile, header, \"utf-8\");\n\n let output = \"\";\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n const flushToFile = async () => {\n const runningFor = Date.now() - startTime;\n header =\n `---\\npid: ${pid}\\ncwd: ${cwd}\\nlast_command: ${command}\\n` +\n `running_for_ms: ${runningFor}\\n---\\n> ${command}\\n\\n`;\n await writeFile(terminalFile, header + maskSensitiveOutput(output), \"utf-8\").catch(() => {});\n };\n\n const scheduleFlush = () => {\n if (flushTimer) return;\n flushTimer = setTimeout(async () => {\n flushTimer = null;\n await flushToFile();\n }, BASH_BACKGROUND_FLUSH_INTERVAL);\n };\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n if (flushTimer) clearTimeout(flushTimer);\n const elapsed = Date.now() - startTime;\n const footer = `\\n---\\nerror: ${formatSpawnError(error)}\\nexit_code: 1\\nelapsed_ms: ${elapsed}\\n---\\n`;\n writeFile(terminalFile, header + maskSensitiveOutput(output) + footer, \"utf-8\").catch(() => {});\n });\n\n child.stdout!.on(\"data\", (data: Buffer) => {\n output = appendCapped(output, data.toString(), MAX_BASH_OUTPUT_BYTES);\n scheduleFlush();\n });\n\n child.stderr!.on(\"data\", (data: Buffer) => {\n output = appendCapped(output, data.toString(), MAX_BASH_OUTPUT_BYTES);\n scheduleFlush();\n });\n\n child.on(\"close\", async (code) => {\n if (flushTimer) clearTimeout(flushTimer);\n const elapsed = Date.now() - startTime;\n const footer = `\\n---\\nexit_code: ${code}\\nelapsed_ms: ${elapsed}\\n---\\n`;\n await writeFile(terminalFile, header + maskSensitiveOutput(output) + footer, \"utf-8\").catch(\n () => {},\n );\n });\n\n child.unref();\n\n return {\n stdout: `コマンドをバックグラウンドに移行しました。\\nターミナルファイル: ${terminalFile}`,\n stderr: \"\",\n exitCode: null,\n interrupted: false,\n backgroundTaskId: String(terminalId),\n };\n}\n","import type { ChildProcess } from \"node:child_process\";\nimport type { SessionContext, AbortState } from \"./core/context.js\";\nimport type { HookEngine } from \"./extensions/hook-engine.js\";\n\ntype ShutdownHandler = () => Promise<void>;\n\nconst shutdownHandlers: ShutdownHandler[] = [];\nconst backgroundProcesses = new Set<ChildProcess>();\nlet isShuttingDown = false;\nlet lastSigintTime = 0;\n\nlet activeCtx: SessionContext | null = null;\nlet activeHookEngine: HookEngine | null = null;\n\nexport function setActiveSession(\n ctx: SessionContext | null,\n hookEngine: HookEngine | null,\n): void {\n activeCtx = ctx;\n activeHookEngine = hookEngine;\n}\n\nexport function registerShutdownHandler(handler: ShutdownHandler): void {\n shutdownHandlers.push(handler);\n}\n\nexport function registerBackgroundProcess(child: ChildProcess): void {\n backgroundProcesses.add(child);\n child.on(\"close\", () => backgroundProcesses.delete(child));\n}\n\nexport function createAbortController(abort: AbortState, timeoutMs = 600000): AbortController {\n abort.userAbortController = new AbortController();\n abort.timeoutAbortController = new AbortController();\n\n if (abort.timeoutTimer) clearTimeout(abort.timeoutTimer);\n abort.timeoutTimer = setTimeout(() => {\n abort.timeoutAbortController?.abort();\n }, timeoutMs);\n\n const combined = new AbortController();\n const onAbort = () => {\n if (!combined.signal.aborted) combined.abort();\n };\n abort.userAbortController.signal.addEventListener(\"abort\", onAbort);\n abort.timeoutAbortController.signal.addEventListener(\"abort\", onAbort);\n\n return combined;\n}\n\nexport function clearAbortState(abort: AbortState): void {\n if (abort.timeoutTimer) {\n clearTimeout(abort.timeoutTimer);\n abort.timeoutTimer = null;\n }\n abort.userAbortController = null;\n abort.timeoutAbortController = null;\n}\n\nasync function cleanupBackgroundProcesses(): Promise<void> {\n for (const child of backgroundProcesses) {\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // already dead\n }\n }\n\n if (backgroundProcesses.size > 0) {\n await new Promise((r) => setTimeout(r, 3000));\n for (const child of backgroundProcesses) {\n try {\n child.kill(\"SIGKILL\");\n } catch {\n // already dead\n }\n }\n }\n}\n\nasync function cleanupMcpClients(): Promise<void> {\n if (!activeCtx?.mcpManager) return;\n try {\n await Promise.race([\n activeCtx.mcpManager.disconnectAll(),\n new Promise((r) => setTimeout(r, 3000)),\n ]);\n } catch {\n // ignore MCP cleanup errors\n }\n}\n\nasync function fireSessionEndHook(reason: string): Promise<void> {\n if (!activeHookEngine) return;\n try {\n await Promise.race([\n activeHookEngine.fire(\"SessionEnd\", { reason }),\n new Promise((r) => setTimeout(r, 5000)),\n ]);\n } catch {\n // ignore hook errors during shutdown\n }\n}\n\nasync function gracefulShutdown(_reason: string): Promise<void> {\n if (isShuttingDown) {\n process.exit(1);\n }\n isShuttingDown = true;\n\n const hookReason =\n _reason === \"sigint\" || _reason === \"sigint_double\"\n ? \"prompt_input_exit\"\n : \"other\";\n await fireSessionEndHook(hookReason);\n\n for (const handler of shutdownHandlers) {\n try {\n await Promise.race([handler(), new Promise((r) => setTimeout(r, 5000))]);\n } catch {\n // ignore errors during shutdown\n }\n }\n\n await cleanupBackgroundProcesses();\n await cleanupMcpClients();\n\n process.exit(0);\n}\n\nexport function setupSignalHandlers(): void {\n process.on(\"SIGINT\", () => {\n const now = Date.now();\n if (now - lastSigintTime < 500) {\n gracefulShutdown(\"sigint_double\");\n return;\n }\n lastSigintTime = now;\n\n const ua = activeCtx?.abort.userAbortController;\n if (ua && !ua.signal.aborted) {\n ua.abort();\n } else {\n gracefulShutdown(\"sigint\");\n }\n });\n\n process.on(\"SIGTERM\", () => gracefulShutdown(\"sigterm\"));\n process.on(\"SIGHUP\", () => gracefulShutdown(\"sighup\"));\n}\n","import { glob } from \"glob\";\nimport { stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { GLOB_MAX_FILES } from \"./constants.js\";\nimport { ToolError } from \"./errors.js\";\nimport { defineTool } from \"./definition.js\";\n\nexport interface GlobOutput {\n numFiles: number;\n filenames: string[];\n truncated: boolean;\n durationMs: number;\n}\n\nconst inputSchema = z.object({\n pattern: z\n .string()\n .describe(\"glob パターン(例: '*.ts', 'src/**/*.tsx')\"),\n path: z.string().optional().describe(\"検索ディレクトリの絶対パス\"),\n});\n\nexport const GlobTool = defineTool({\n name: \"Glob\",\n category: \"read\",\n description: `ファイル名パターンでファイルを検索します(ファイル内容は見ません)。\n- ファイル検索には必ず Glob を使い、Bash で find を実行しないでください\n- '**/' で始まらないパターンは自動的に '**/' が付与されます(例: '*.ts' → '**/*.ts')\n- 結果は更新日時順(最新が先)、上限100件\n- node_modules と .git は自動除外\n- ファイル名や拡張子でファイルを探すときに使用してください`,\n inputSchema,\n execute: async (input, ctx) => {\n return executeGlob(input, ctx.session.cwd);\n },\n});\n\nasync function executeGlob(\n args: { pattern: string; path?: string },\n sessionCwd: string,\n): Promise<GlobOutput> {\n const startTime = Date.now();\n const cwd = resolve(args.path ?? sessionCwd);\n\n try {\n await stat(cwd);\n } catch {\n throw new ToolError(\"Glob\", \"FILE_NOT_FOUND\", `検索ディレクトリが見つかりません: ${cwd}`);\n }\n\n let pattern = args.pattern;\n if (!pattern.startsWith(\"**/\") && !pattern.startsWith(\"/\")) {\n pattern = `**/${pattern}`;\n }\n\n const files = await glob(pattern, {\n cwd,\n absolute: true,\n nodir: true,\n dot: false,\n ignore: [\"**/node_modules/**\", \"**/.git/**\"],\n });\n\n const withStats = await Promise.all(\n files.map(async (f) => {\n try {\n const s = await stat(f);\n return { path: f, mtime: s.mtimeMs };\n } catch {\n return { path: f, mtime: 0 };\n }\n }),\n );\n withStats.sort((a, b) => b.mtime - a.mtime);\n\n const truncated = withStats.length > GLOB_MAX_FILES;\n const result = withStats.slice(0, GLOB_MAX_FILES).map((f) => f.path);\n\n return {\n numFiles: result.length,\n filenames: result,\n truncated,\n durationMs: Date.now() - startTime,\n };\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { z } from \"zod\";\nimport { ToolError } from \"./errors.js\";\nimport { defineTool } from \"./definition.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport type GrepMode = \"content\" | \"files_with_matches\" | \"count\";\n\nexport interface GrepOutput {\n mode: GrepMode;\n numFiles: number;\n filenames: string[];\n content?: string;\n numLines?: number;\n numMatches?: number;\n appliedLimit?: number;\n appliedOffset?: number;\n}\n\nexport interface GrepArgs {\n pattern: string;\n path?: string;\n glob?: string;\n output_mode?: GrepMode;\n before_context?: number;\n after_context?: number;\n context?: number;\n case_insensitive?: boolean;\n type?: string;\n head_limit?: number;\n offset?: number;\n multiline?: boolean;\n}\n\nconst inputSchema = z.object({\n pattern: z.string().min(1).describe(\"正規表現パターン(ripgrep 構文)\"),\n path: z.string().optional().describe(\"検索対象の絶対パス\"),\n glob: z\n .string()\n .optional()\n .describe(\"ファイルフィルタ(例: '*.ts', '*.{ts,tsx}')\"),\n output_mode: z\n .enum([\"content\", \"files_with_matches\", \"count\"])\n .optional()\n .describe(\n \"出力モード(デフォルト: files_with_matches)。content: マッチ行とコンテキストを返す。files_with_matches: マッチしたファイルパスのみ返す。count: ファイルごとのマッチ数を返す\",\n ),\n before_context: z\n .number()\n .optional()\n .describe(\"マッチ前の行数(ripgrep -B)\"),\n after_context: z\n .number()\n .optional()\n .describe(\"マッチ後の行数(ripgrep -A)\"),\n context: z\n .number()\n .optional()\n .describe(\"前後のコンテキスト行数(ripgrep -C)\"),\n case_insensitive: z\n .boolean()\n .optional()\n .describe(\"大文字小文字を区別しない(ripgrep -i)\"),\n type: z\n .string()\n .optional()\n .describe(\"ファイルタイプ(rg --type、例: js, py, ts)\"),\n head_limit: z\n .number()\n .optional()\n .describe(\n \"結果の先頭N件に制限。content モードではマッチ行数、files_with_matches/count モードではファイル数が対象\",\n ),\n offset: z\n .number()\n .optional()\n .describe(\n \"先頭N件をスキップ。head_limit と組み合わせてページネーション的に使用可能\",\n ),\n multiline: z\n .boolean()\n .optional()\n .describe(\"マルチライン検索モード(ripgrep -U --multiline-dotall)\"),\n});\n\nexport const GrepTool = defineTool({\n name: \"Grep\",\n category: \"read\",\n description: `ファイル内のテキストをパターンで検索します(ripgrep ベース)。\n- テキスト検索には必ず Grep を使い、Bash で grep や rg を実行しないでください\n- 正規表現構文をサポート(例: \"log.*Error\", \"function\\\\s+\\\\w+\")\n- リテラルのブレースはエスケープが必要(例: interface\\\\{\\\\})\n- output_mode のデフォルトは files_with_matches(ファイルパスのみ)\n - content: マッチ行とコンテキストを表示(before_context/after_context/context で行数指定)\n - count: ファイルごとのマッチ数を表示\n- head_limit + offset でページネーション的な使い方が可能\n- multiline: true で複数行にまたがるパターンを検索可能`,\n inputSchema,\n execute: async (input, ctx) => {\n return executeGrep(input, ctx.session.cwd);\n },\n});\n\nfunction parseRgOutput(\n stdout: string,\n mode: GrepMode,\n offset?: number,\n limit?: number,\n): GrepOutput {\n const allLines = stdout.trim().split(\"\\n\").filter(Boolean);\n const appliedOffset = offset ?? 0;\n const appliedLimit = limit;\n\n if (mode === \"files_with_matches\") {\n let files = allLines;\n if (appliedOffset) files = files.slice(appliedOffset);\n if (appliedLimit) files = files.slice(0, appliedLimit);\n return { mode, numFiles: files.length, filenames: files, appliedOffset, appliedLimit };\n }\n\n if (mode === \"count\") {\n const entries = allLines.map((l) => {\n const lastColon = l.lastIndexOf(\":\");\n return {\n file: l.slice(0, lastColon),\n count: parseInt(l.slice(lastColon + 1)) || 0,\n };\n });\n const uniqueFiles = [...new Set(entries.map((e) => e.file))];\n const totalMatches = entries.reduce((sum, e) => sum + e.count, 0);\n return { mode, numFiles: uniqueFiles.length, filenames: uniqueFiles, numMatches: totalMatches, appliedOffset, appliedLimit };\n }\n\n let lines = allLines;\n if (appliedOffset) lines = lines.slice(appliedOffset);\n if (appliedLimit) lines = lines.slice(0, appliedLimit);\n const filenames = [\n ...new Set(\n lines\n .filter((l) => l.includes(\":\"))\n .map((l) => l.split(\":\")[0]),\n ),\n ];\n return { mode, numFiles: filenames.length, filenames, content: lines.join(\"\\n\"), numLines: lines.length, appliedOffset, appliedLimit };\n}\n\nasync function executeGrep(args: GrepArgs, sessionCwd: string): Promise<GrepOutput> {\n const mode: GrepMode = args.output_mode ?? \"files_with_matches\";\n const rgArgs: string[] = [];\n\n if (mode === \"files_with_matches\") rgArgs.push(\"-l\");\n if (mode === \"count\") rgArgs.push(\"--count\");\n if (mode === \"content\") rgArgs.push(\"-n\");\n if (args.case_insensitive) rgArgs.push(\"-i\");\n if (args.before_context !== undefined) rgArgs.push(\"-B\", String(args.before_context));\n if (args.after_context !== undefined) rgArgs.push(\"-A\", String(args.after_context));\n if (args.context !== undefined) rgArgs.push(\"-C\", String(args.context));\n if (args.glob) rgArgs.push(\"--glob\", args.glob);\n if (args.type) rgArgs.push(\"--type\", args.type);\n if (args.multiline) rgArgs.push(\"-U\", \"--multiline-dotall\");\n\n rgArgs.push(\"--\", args.pattern);\n rgArgs.push(args.path ?? sessionCwd);\n\n async function runRg(extraArgs: string[] = []): Promise<string> {\n const { stdout } = await execFileAsync(\"rg\", [...extraArgs, ...rgArgs], {\n maxBuffer: 1024 * 1024,\n });\n return stdout;\n }\n\n try {\n const stdout = await runRg();\n return parseRgOutput(stdout, mode, args.offset, args.head_limit);\n } catch (error: unknown) {\n const err = error as { code?: number; stderr?: string };\n if (err.code === 1) {\n return { mode, numFiles: 0, filenames: [] };\n }\n\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new ToolError(\"Grep\", \"COMMAND_NOT_FOUND\", \"ripgrep (rg) がインストールされていません\");\n }\n\n const stderrStr = String(err.stderr ?? \"\");\n if (stderrStr.includes(\"EAGAIN\") || (err as NodeJS.ErrnoException).code === \"EAGAIN\") {\n try {\n const stdout = await runRg([\"-j1\"]);\n return parseRgOutput(stdout, mode, args.offset, args.head_limit);\n } catch (retryError: unknown) {\n if ((retryError as { code?: number }).code === 1) {\n return { mode, numFiles: 0, filenames: [] };\n }\n throw retryError;\n }\n }\n\n throw error;\n }\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"./definition.js\";\n\nexport interface TodoItem {\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n activeForm: string;\n}\n\nexport interface TodoWriteOutput {\n oldTodos: TodoItem[];\n newTodos: TodoItem[];\n}\n\nconst inputSchema = z.object({\n todos: z\n .array(\n z.object({\n content: z.string().describe(\"TODO の内容\"),\n status: z\n .enum([\"pending\", \"in_progress\", \"completed\"])\n .describe(\"ステータス\"),\n activeForm: z\n .string()\n .describe(\n \"進行中のスピナー表示テキスト(例: 'ファイルを読み取り中')\",\n ),\n }),\n )\n .describe(\"TODO アイテムの配列(リスト全体を毎回上書き)\"),\n});\n\nexport const TodoWriteTool = defineTool({\n name: \"TodoWrite\",\n category: \"internal\",\n description: `タスクリストを管理します。リスト全体を毎回上書きする設計です。\n複雑な複数ステップのタスク(3ステップ以上)の追跡に使用してください。\n- 3段階ステータス: pending → in_progress → completed\n- 同時に in_progress にするのは1つだけにすること\n- activeForm は in_progress 時のスピナー表示テキスト(例: \"ファイルを読み取り中\")\n- 単純なタスク(1-2ステップ)には使用しないでください`,\n inputSchema,\n execute: (input, ctx) => {\n return executeWriteTodos(ctx.session.agent, {\n todos: input.todos as TodoItem[],\n });\n },\n uiHooks: {\n onComplete: (_input, output) => ({\n type: \"todoUpdate\" as const,\n todos: output.newTodos,\n }),\n },\n});\n\nfunction executeWriteTodos(\n state: { todos: TodoItem[] },\n args: { todos: TodoItem[] },\n): TodoWriteOutput {\n const oldTodos = [...state.todos];\n state.todos = args.todos;\n return { oldTodos, newTodos: state.todos };\n}\n\nexport function getCurrentTodos(state: { todos: TodoItem[] }): TodoItem[] {\n return state.todos;\n}\n","import type { ErasedToolDefinition } from \"./definition.js\";\nimport { ReadTool } from \"./read.js\";\nimport { WriteTool } from \"./write.js\";\nimport { EditTool } from \"./edit.js\";\nimport { BashTool } from \"./bash.js\";\nimport { GlobTool } from \"./glob.js\";\nimport { GrepTool } from \"./grep.js\";\nimport { AskUserTool } from \"./ask-user.js\";\nimport { TodoWriteTool } from \"./todo-write.js\";\n\nexport const builtinTools: ErasedToolDefinition[] = [\n ReadTool,\n WriteTool,\n EditTool,\n BashTool,\n GlobTool,\n GrepTool,\n AskUserTool,\n TodoWriteTool,\n];\n","import type { ToolResultPart } from \"ai\";\nimport type { ToolMeta } from \"./registry.js\";\n\nexport type Mode = \"plan\" | \"auto\";\n\nexport type ToolEvaluation =\n | { action: \"auto\" }\n | { action: \"approve\" }\n | { action: \"block\"; reason: string };\n\nexport interface ToolPipelineConfig {\n mode: Mode;\n allowedMcps?: string[];\n}\n\nexport interface ToolPipeline {\n readonly mode: Mode;\n evaluate(\n toolName: string,\n meta: ToolMeta | undefined,\n args?: Record<string, unknown>,\n ): ToolEvaluation;\n markMcpAllowed(serverName: string): void;\n createDeniedResult(\n toolCallId: string,\n toolName: string,\n reason: string,\n ): ToolResultPart;\n setMode(mode: Mode): void;\n}\n\n// ---------------------------------------------------------------------------\n// Bash read-only command whitelist\n// ---------------------------------------------------------------------------\n\nconst READ_ONLY_COMMANDS = new Set([\n \"ls\", \"pwd\", \"cat\", \"echo\", \"which\", \"type\", \"env\",\n \"printenv\", \"date\", \"uname\", \"whoami\", \"id\", \"df\", \"du\",\n \"wc\", \"file\", \"stat\", \"head\", \"tail\", \"less\", \"tree\",\n \"find\", \"rg\", \"grep\", \"awk\", \"sed\", \"sort\", \"uniq\",\n \"diff\", \"basename\", \"dirname\", \"realpath\", \"readlink\",\n \"true\", \"false\", \"test\", \"expr\", \"seq\", \"tr\", \"cut\",\n \"paste\", \"tee\", \"xargs\", \"printf\", \"jq\", \"yq\",\n]);\n\nconst READ_ONLY_GIT_SUBCOMMANDS = new Set([\n \"status\", \"log\", \"diff\", \"show\", \"branch\", \"tag\", \"remote\",\n \"rev-parse\", \"describe\", \"shortlog\", \"stash\", \"config\",\n \"ls-files\", \"ls-tree\", \"cat-file\", \"blame\", \"reflog\",\n]);\n\nconst REDIRECT_PATTERN = /(?:^|[^\\\\])(?:>>?|[0-9]+>>?)/;\n\nexport function isBashReadOnly(command: string): boolean {\n if (REDIRECT_PATTERN.test(command)) return false;\n\n const segments = command.split(/\\s*\\|\\s*/);\n for (const segment of segments) {\n const trimmed = segment.trim();\n if (!trimmed) continue;\n\n const tokens = trimmed.split(/\\s+/);\n const cmd = tokens[0];\n if (!cmd) return false;\n\n if (cmd === \"git\") {\n const subCmd = tokens[1];\n if (!subCmd || !READ_ONLY_GIT_SUBCOMMANDS.has(subCmd)) return false;\n continue;\n }\n\n if (!READ_ONLY_COMMANDS.has(cmd)) return false;\n }\n\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Dangerous command patterns (always blocked regardless of mode)\n// ---------------------------------------------------------------------------\n\nconst DANGEROUS_PATTERNS = [\n /^rm\\s+-rf\\s+\\//,\n /chmod\\s+777/,\n /:\\(\\)\\{\\s*:\\|:&\\s*\\};:/,\n />\\s*\\/dev\\/sd/,\n /^mkfs/,\n /dd\\s+if=.*of=\\/dev/,\n];\n\nfunction isDangerous(args?: Record<string, unknown>): boolean {\n const command = args?.command;\n if (typeof command !== \"string\") return false;\n return DANGEROUS_PATTERNS.some((p) => p.test(command));\n}\n\n// ---------------------------------------------------------------------------\n// Auto-approve categories for plan mode\n// ---------------------------------------------------------------------------\n\nconst AUTO_CATEGORIES = new Set([\"read\", \"interactive\", \"internal\"]);\n\n// ---------------------------------------------------------------------------\n// Pipeline factory\n// ---------------------------------------------------------------------------\n\nexport function createToolPipeline(config: ToolPipelineConfig): ToolPipeline {\n let currentMode = config.mode;\n const allowedMcps = new Set(config.allowedMcps ?? []);\n\n function isToolAllowed(toolName: string): boolean {\n if (!toolName.startsWith(\"mcp__\")) return true;\n const serverName = toolName.split(\"__\")[1];\n return serverName ? allowedMcps.has(serverName) : false;\n }\n\n return {\n get mode() {\n return currentMode;\n },\n\n evaluate(toolName, meta, args) {\n if (toolName === \"Bash\" && isDangerous(args)) {\n return { action: \"block\", reason: \"危険なコマンドです\" };\n }\n\n if (meta?.source === \"mcp\" && !isToolAllowed(toolName)) {\n return { action: \"approve\" };\n }\n\n if (currentMode === \"auto\") {\n return { action: \"auto\" };\n }\n\n // plan mode\n if (!meta) return { action: \"approve\" };\n\n if (AUTO_CATEGORIES.has(meta.category)) {\n return { action: \"auto\" };\n }\n\n if (toolName === \"Bash\" && meta.category === \"execute\") {\n const command = args?.command;\n if (typeof command === \"string\" && isBashReadOnly(command)) {\n return { action: \"auto\" };\n }\n return { action: \"approve\" };\n }\n\n return { action: \"approve\" };\n },\n\n markMcpAllowed(serverName) {\n allowedMcps.add(serverName);\n },\n\n createDeniedResult(toolCallId, toolName, reason) {\n return {\n type: \"tool-result\",\n toolCallId,\n toolName,\n output: {\n type: \"execution-denied\",\n reason,\n },\n };\n },\n\n setMode(mode) {\n currentMode = mode;\n },\n };\n}\n","import { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport type { LanguageModel } from \"ai\";\nimport type { WellGrowConfig } from \"../config/types.js\";\n\ntype Provider = \"anthropic\" | \"google\" | \"openai\";\n\nexport interface ModelEntry {\n id: string;\n label: string;\n}\n\nexport const MODEL_LIST: ModelEntry[] = [\n { id: \"claude-sonnet-4-6\", label: \"Sonnet 4.6\" },\n { id: \"claude-opus-4-6\", label: \"Opus 4.6\" },\n { id: \"claude-haiku-4-5-20251001\", label: \"Haiku 4.5\" },\n { id: \"gemini-3.1-pro-preview\", label: \"Gemini 3.1 Pro\" },\n { id: \"gpt-5.2\", label: \"GPT-5.2\" },\n];\n\nfunction inferProvider(modelId: string): Provider | null {\n if (modelId.startsWith(\"claude-\")) return \"anthropic\";\n if (modelId.startsWith(\"gemini-\")) return \"google\";\n if (modelId.startsWith(\"gpt-\") || modelId.startsWith(\"o1-\") || modelId.startsWith(\"o3-\"))\n return \"openai\";\n return null;\n}\n\nfunction resolveApiKey(\n providerConfig: { api_key?: string; api_key_env: string } | undefined,\n defaultEnv: string,\n): string | undefined {\n if (providerConfig?.api_key) return providerConfig.api_key;\n const envName = providerConfig?.api_key_env ?? defaultEnv;\n return process.env[envName];\n}\n\nexport function getModel(\n modelId: string,\n config: WellGrowConfig,\n): LanguageModel {\n const inferred = inferProvider(modelId);\n if (!inferred) {\n throw new Error(\n `不明なモデル: ${modelId}\\n` +\n `利用可能なモデル形式: claude-*, gemini-*, gpt-*, o1-*, o3-*`,\n );\n }\n\n switch (inferred) {\n case \"anthropic\": {\n const key = resolveApiKey(config.providers?.anthropic, \"ANTHROPIC_API_KEY\");\n const isOAuth = key?.startsWith(\"sk-ant-oat01-\");\n const anthropic = createAnthropic(\n isOAuth\n ? { authToken: key, headers: { \"anthropic-beta\": \"oauth-2025-04-20\" } }\n : { apiKey: key },\n );\n return anthropic(modelId);\n }\n case \"google\": {\n const apiKey = resolveApiKey(config.providers?.google, \"GOOGLE_GENERATIVE_AI_API_KEY\");\n const google = createGoogleGenerativeAI({ apiKey });\n return google(modelId);\n }\n case \"openai\": {\n const apiKey = resolveApiKey(config.providers?.openai, \"OPENAI_API_KEY\");\n const openai = createOpenAI({ apiKey });\n return openai(modelId);\n }\n default:\n throw new Error(`不明なプロバイダー: ${inferred satisfies never}`);\n }\n}\n\nexport function getModelDisplayName(modelId: string): string {\n return modelId;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport {\n createMCPClient,\n auth,\n type MCPClient,\n type MCPTransport,\n type OAuthClientProvider,\n} from \"@ai-sdk/mcp\";\nimport { Experimental_StdioMCPTransport } from \"@ai-sdk/mcp/mcp-stdio\";\nimport type { Tool } from \"ai\";\nimport { CliOAuthProvider } from \"./oauth.js\";\n\nconst MCP_TIMEOUT_DEFAULT = 10_000;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyTool = Tool<any, any>;\n\nexport interface McpServerConfig {\n type?: \"stdio\" | \"http\" | \"sse\";\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n url?: string;\n headers?: Record<string, string>;\n}\n\nexport interface McpConfig {\n mcpServers: Record<string, McpServerConfig>;\n}\n\nexport type McpToolSet = Record<string, AnyTool>;\n\n// --- .mcp.json parser ---\n\nconst EMPTY_CONFIG: McpConfig = { mcpServers: {} };\n\nexport async function loadMcpConfigFile(filePath: string): Promise<McpConfig> {\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n\n if (parsed.mcpServers && typeof parsed.mcpServers === \"object\") {\n return { mcpServers: parsed.mcpServers as Record<string, McpServerConfig> };\n }\n\n // Flat format (plugin-style): treat top-level keys as server entries\n const hasServerLike = Object.values(parsed).some(\n (v) => v && typeof v === \"object\" && (\"command\" in (v as object) || \"url\" in (v as object)),\n );\n if (hasServerLike) {\n return { mcpServers: parsed as Record<string, McpServerConfig> };\n }\n\n return EMPTY_CONFIG;\n } catch {\n return EMPTY_CONFIG;\n }\n}\n\nexport function mergeMcpConfigs(...configs: McpConfig[]): McpConfig {\n const merged: Record<string, McpServerConfig> = {};\n for (const config of configs) {\n Object.assign(merged, config.mcpServers);\n }\n return { mcpServers: merged };\n}\n\nfunction resolveTildePath(p: string): string {\n if (p.startsWith(\"~/\")) {\n return join(homedir(), p.slice(2));\n }\n return p;\n}\n\nexport async function loadGlobalMcpConfig(\n mcpPaths: string[],\n): Promise<McpConfig> {\n const configs = await Promise.all(\n mcpPaths.map((p) => loadMcpConfigFile(resolveTildePath(p))),\n );\n return mergeMcpConfigs(...configs);\n}\n\n\n\ntype HttpTransportConfig = {\n type: \"sse\" | \"http\";\n url: string;\n headers?: Record<string, string>;\n authProvider?: OAuthClientProvider;\n};\n\nfunction createTransport(\n config: McpServerConfig,\n authProvider?: OAuthClientProvider,\n): MCPTransport | HttpTransportConfig {\n const type = config.type ?? \"stdio\";\n\n switch (type) {\n case \"stdio\": {\n if (!config.command) {\n throw new Error(\"stdio transport requires 'command'\");\n }\n return new Experimental_StdioMCPTransport({\n command: config.command,\n args: config.args,\n env: { ...process.env, ...config.env } as Record<string, string>,\n cwd: config.cwd,\n stderr: \"ignore\",\n });\n }\n case \"http\":\n case \"sse\": {\n if (!config.url) {\n throw new Error(`${type} transport requires 'url'`);\n }\n return { type, url: config.url, headers: config.headers, authProvider };\n }\n default:\n throw new Error(`Unknown transport type: ${type}`);\n }\n}\n\nasync function preAuthenticate(\n provider: CliOAuthProvider,\n serverUrl: string,\n): Promise<void> {\n const tokens = await provider.tokens();\n if (tokens) return;\n\n await provider.startCallbackServer();\n\n const result = await auth(provider, { serverUrl });\n if (result === \"AUTHORIZED\") return;\n\n const code = provider.getReceivedAuthCode();\n if (!code) {\n throw new Error(\"OAuth 認証コードを取得できませんでした\");\n }\n\n const result2 = await auth(provider, { serverUrl, authorizationCode: code });\n if (result2 !== \"AUTHORIZED\") {\n throw new Error(\"OAuth トークン交換に失敗しました\");\n }\n}\n\n// --- McpManager ---\n\nexport interface McpConnectionResult {\n name: string;\n success: boolean;\n error?: string;\n}\n\nexport class McpManager {\n private clients = new Map<string, MCPClient>();\n\n async connectAll(\n configs: Record<string, McpServerConfig>,\n onResult?: (result: McpConnectionResult) => void,\n ): Promise<McpConnectionResult[]> {\n const results: McpConnectionResult[] = [];\n\n const entries = Object.entries(configs);\n if (entries.length === 0) return results;\n\n const timeoutMs = getTimeoutMs();\n\n const tasks = entries.map(async ([name, config]) => {\n const result = await this.connectSingle(name, config, timeoutMs);\n results.push(result);\n onResult?.(result);\n });\n\n await Promise.allSettled(tasks);\n return results;\n }\n\n async connect(name: string, config: McpServerConfig): Promise<void> {\n const result = await this.connectSingle(name, config, getTimeoutMs());\n if (!result.success) {\n throw new Error(result.error);\n }\n }\n\n private async connectSingle(\n name: string,\n config: McpServerConfig,\n timeoutMs: number,\n ): Promise<McpConnectionResult> {\n try {\n let authProvider: CliOAuthProvider | undefined;\n const type = config.type ?? \"stdio\";\n\n if ((type === \"http\" || type === \"sse\") && config.url) {\n authProvider = new CliOAuthProvider(name, config.url);\n try {\n await preAuthenticate(authProvider, config.url);\n } catch {\n // OAuth not supported by this server — continue without auth\n authProvider = undefined;\n }\n }\n\n const transport = createTransport(config, authProvider);\n\n const clientPromise = createMCPClient({\n transport,\n name: `wellgrow-cli/${name}`,\n onUncaughtError: (error) => {\n process.stderr.write(\n `[MCP] ${name}: uncaught error: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n },\n });\n\n const client = await Promise.race([\n clientPromise,\n timeout(timeoutMs, `MCP server '${name}' connection timed out (${timeoutMs}ms)`),\n ]);\n\n if (this.clients.has(name)) {\n await this.clients.get(name)!.close().catch(() => {});\n }\n this.clients.set(name, client);\n\n return { name, success: true };\n } catch (error) {\n return {\n name,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async disconnect(name: string): Promise<void> {\n const client = this.clients.get(name);\n if (!client) return;\n this.clients.delete(name);\n try {\n await Promise.race([client.close(), timeout(3000, \"close timeout\")]);\n } catch {\n // ignore close errors\n }\n }\n\n async disconnectAll(): Promise<void> {\n const names = [...this.clients.keys()];\n await Promise.allSettled(names.map((name) => this.disconnect(name)));\n }\n\n async getAllToolSets(): Promise<{ toolSets: Map<string, McpToolSet>; errors: McpConnectionResult[] }> {\n const toolSets = new Map<string, McpToolSet>();\n const errors: McpConnectionResult[] = [];\n\n for (const [name, client] of this.clients) {\n try {\n const toolSet = await client.tools();\n toolSets.set(name, toolSet as McpToolSet);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[MCP] ${name}: failed to load tools: ${message}\\n`);\n errors.push({ name, success: false, error: `ツール読み込み失敗: ${message}` });\n }\n }\n\n return { toolSets, errors };\n }\n\n getConnectedServers(): string[] {\n return [...this.clients.keys()];\n }\n\n hasConnections(): boolean {\n return this.clients.size > 0;\n }\n}\n\n// --- Helpers ---\n\nfunction getTimeoutMs(): number {\n const envVal = process.env.MCP_TIMEOUT;\n if (envVal) {\n const parsed = Number(envVal);\n if (!Number.isNaN(parsed) && parsed > 0) return parsed;\n }\n return MCP_TIMEOUT_DEFAULT;\n}\n\nfunction timeout(ms: number, message: string): Promise<never> {\n return new Promise((_, reject) =>\n setTimeout(() => reject(new Error(message)), ms),\n );\n}\n","import { createServer, type Server } from \"node:http\";\nimport { readFile, writeFile, mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport type {\n OAuthClientProvider,\n OAuthClientInformation,\n OAuthClientMetadata,\n OAuthTokens,\n} from \"@ai-sdk/mcp\";\n\nconst OAUTH_DIR = join(homedir(), \".wellgrow\", \"oauth\");\n\nfunction serverDir(serverName: string): string {\n return join(OAUTH_DIR, serverName);\n}\n\nasync function readJson<T>(path: string): Promise<T | undefined> {\n try {\n return JSON.parse(await readFile(path, \"utf-8\")) as T;\n } catch {\n return undefined;\n }\n}\n\nasync function writeJson(path: string, data: unknown): Promise<void> {\n const dir = join(path, \"..\");\n await mkdir(dir, { recursive: true });\n await writeFile(path, JSON.stringify(data, null, 2), \"utf-8\");\n}\n\nexport class CliOAuthProvider implements OAuthClientProvider {\n private server: Server | null = null;\n private port = 0;\n private receivedCode: string | null = null;\n private codePromise: Promise<string> | null = null;\n private resolveCode: ((code: string) => void) | null = null;\n private readonly dir: string;\n\n constructor(\n private readonly serverName: string,\n private readonly serverUrl: string,\n options?: { baseDir?: string },\n ) {\n this.dir = options?.baseDir\n ? join(options.baseDir, serverName)\n : serverDir(serverName);\n }\n\n // --- Token persistence ---\n\n async tokens(): Promise<OAuthTokens | undefined> {\n return readJson<OAuthTokens>(join(this.dir, \"tokens.json\"));\n }\n\n async saveTokens(tokens: OAuthTokens): Promise<void> {\n await writeJson(join(this.dir, \"tokens.json\"), tokens);\n }\n\n // --- Client registration persistence ---\n\n async clientInformation(): Promise<OAuthClientInformation | undefined> {\n return readJson<OAuthClientInformation>(join(this.dir, \"client.json\"));\n }\n\n async saveClientInformation(info: OAuthClientInformation): Promise<void> {\n await writeJson(join(this.dir, \"client.json\"), info);\n }\n\n // --- PKCE code verifier ---\n\n async codeVerifier(): Promise<string> {\n const data = await readFile(join(this.dir, \"verifier.txt\"), \"utf-8\");\n return data.trim();\n }\n\n async saveCodeVerifier(verifier: string): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n await writeFile(join(this.dir, \"verifier.txt\"), verifier, \"utf-8\");\n }\n\n // --- Redirect URL & client metadata ---\n\n get redirectUrl(): string {\n return `http://127.0.0.1:${this.port}/callback`;\n }\n\n get clientMetadata(): OAuthClientMetadata {\n return {\n redirect_uris: [this.redirectUrl],\n client_name: \"WellGrow CLI\",\n token_endpoint_auth_method: \"none\",\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n };\n }\n\n // --- State ---\n\n async state(): Promise<string> {\n return randomUUID();\n }\n\n // --- Credential invalidation ---\n\n async invalidateCredentials(\n scope: \"all\" | \"client\" | \"tokens\" | \"verifier\",\n ): Promise<void> {\n const targets: string[] = [];\n if (scope === \"all\" || scope === \"tokens\")\n targets.push(join(this.dir, \"tokens.json\"));\n if (scope === \"all\" || scope === \"client\")\n targets.push(join(this.dir, \"client.json\"));\n if (scope === \"all\" || scope === \"verifier\")\n targets.push(join(this.dir, \"verifier.txt\"));\n\n await Promise.allSettled(targets.map((t) => rm(t, { force: true })));\n }\n\n // --- Callback server & browser redirect ---\n\n async startCallbackServer(): Promise<void> {\n if (this.server) return;\n\n this.codePromise = new Promise<string>((resolve) => {\n this.resolveCode = resolve;\n });\n\n this.server = createServer((req, res) => {\n if (!req.url?.startsWith(\"/callback\")) {\n res.writeHead(404);\n res.end();\n return;\n }\n\n const url = new URL(req.url, `http://127.0.0.1:${this.port}`);\n const code = url.searchParams.get(\"code\");\n const error = url.searchParams.get(\"error\");\n\n if (error) {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(\n `<html><body><h2>認証エラー</h2><p>${error}</p><p>ターミナルに戻ってください。</p></body></html>`,\n );\n this.resolveCode?.(\"\");\n return;\n }\n\n if (code) {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(\n \"<html><body><h2>認証完了</h2><p>このタブを閉じて、ターミナルに戻ってください。</p></body></html>\",\n );\n this.resolveCode?.(code);\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(\n \"<html><body><h2>エラー</h2><p>認証コードが見つかりません。</p></body></html>\",\n );\n }\n });\n\n await new Promise<void>((resolve, reject) => {\n this.server!.listen(0, \"127.0.0.1\", () => resolve());\n this.server!.on(\"error\", reject);\n });\n\n const addr = this.server.address();\n if (addr && typeof addr === \"object\") {\n this.port = addr.port;\n }\n }\n\n async redirectToAuthorization(authorizationUrl: URL): Promise<void> {\n process.stderr.write(\n `[OAuth] ブラウザで認証してください: ${authorizationUrl.toString()}\\n`,\n );\n\n const open = (await import(\"open\")).default;\n await open(authorizationUrl.toString());\n\n if (this.codePromise) {\n const code = await this.codePromise;\n if (code) {\n this.receivedCode = code;\n }\n }\n\n this.cleanup();\n }\n\n getReceivedAuthCode(): string | null {\n return this.receivedCode;\n }\n\n private cleanup(): void {\n if (this.server) {\n this.server.close();\n this.server = null;\n }\n this.resolveCode = null;\n this.codePromise = null;\n }\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport matter from \"gray-matter\";\nimport type { SkillMetadata } from \"../ai/system-prompt.js\";\n\nfunction expandTilde(p: string): string {\n return p.startsWith(\"~\") ? join(homedir(), p.slice(1)) : p;\n}\n\nasync function loadSkillMetadata(\n skillDir: string,\n): Promise<SkillMetadata | null> {\n const skillPath = join(skillDir, \"SKILL.md\");\n try {\n const content = await readFile(skillPath, \"utf-8\");\n const { data } = matter(content);\n if (!data.name || !data.description) return null;\n return {\n name: data.name as string,\n description: (data.description as string).trim(),\n location: skillPath,\n };\n } catch {\n return null;\n }\n}\n\nexport async function discoverSkills(\n paths: string[],\n): Promise<SkillMetadata[]> {\n const skills: SkillMetadata[] = [];\n const seen = new Set<string>();\n\n for (const rawPath of paths) {\n const resolved = resolve(expandTilde(rawPath));\n\n const direct = await loadSkillMetadata(resolved);\n if (direct) {\n if (!seen.has(direct.name)) {\n seen.add(direct.name);\n skills.push(direct);\n }\n continue;\n }\n\n let entries: string[];\n try {\n entries = await readdir(resolved);\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const meta = await loadSkillMetadata(join(resolved, entry));\n if (meta && !seen.has(meta.name)) {\n seen.add(meta.name);\n skills.push(meta);\n }\n }\n }\n\n return skills;\n}\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport type { Dirent, Stats } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { spawn } from \"node:child_process\";\nimport { z } from \"zod\";\nimport { generateText } from \"ai\";\nimport type { LanguageModel } from \"ai\";\nimport type { WellGrowConfig } from \"../config/types.js\";\nimport { getModel } from \"../ai/providers.js\";\nimport type {\n ToolApprovalDecision,\n ToolExecutionHooks,\n ToolCall,\n} from \"../core/agent-loop.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type HookEventName =\n | \"SessionStart\"\n | \"UserPromptSubmit\"\n | \"PreToolUse\"\n | \"PermissionRequest\"\n | \"PostToolUse\"\n | \"PostToolUseFailure\"\n | \"Stop\"\n | \"SessionEnd\";\n\nexport interface CommandHook {\n type: \"command\";\n command: string;\n timeout?: number;\n async?: boolean;\n statusMessage?: string;\n}\n\nexport interface PromptHook {\n type: \"prompt\";\n prompt: string;\n model?: string;\n timeout?: number;\n}\n\nexport type HookDefinition = CommandHook | PromptHook;\n\nexport interface HookGroup {\n matcher?: string;\n hooks: HookDefinition[];\n}\n\nexport interface HooksFileConfig {\n hooks: Partial<Record<HookEventName, HookGroup[]>>;\n}\n\nexport interface HookInput {\n session_id: string;\n cwd: string;\n hook_event_name: HookEventName;\n source?: string;\n prompt?: string;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n tool_use_id?: string;\n tool_response?: unknown;\n error?: string;\n stop_hook_active?: boolean;\n last_assistant_message?: string;\n reason?: string;\n}\n\nexport interface HookResult {\n blocked: boolean;\n reason?: string;\n feedback?: string;\n additionalContext?: string;\n updatedInput?: Record<string, unknown>;\n askUser?: boolean;\n stopDecision?: \"block\" | \"approve\";\n}\n\nexport type { ToolExecutionHooks } from \"../core/agent-loop.js\";\n\n// ---------------------------------------------------------------------------\n// Validation schemas\n// ---------------------------------------------------------------------------\n\nconst hookDefinitionSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"command\"),\n command: z.string(),\n timeout: z.number().positive().optional(),\n async: z.boolean().optional(),\n statusMessage: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"prompt\"),\n prompt: z.string(),\n model: z.string().optional(),\n timeout: z.number().positive().optional(),\n }),\n]);\n\nconst hookGroupSchema = z.object({\n matcher: z.string().optional(),\n hooks: z.array(hookDefinitionSchema),\n});\n\nconst hooksFileConfigSchema = z.object({\n hooks: z.record(z.array(hookGroupSchema)).default({}),\n});\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_HOOK_MODEL = \"claude-haiku-4-5-20251001\";\nconst DEFAULT_COMMAND_TIMEOUT_SEC = 30;\nconst MAX_HOOK_OUTPUT_BYTES = 1024 * 1024;\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction expandTilde(p: string): string {\n return p.startsWith(\"~\") ? join(homedir(), p.slice(1)) : p;\n}\n\nfunction hookKey(hook: HookDefinition): string {\n switch (hook.type) {\n case \"command\":\n return `command:${hook.command}:async=${hook.async ?? false}`;\n case \"prompt\":\n return `prompt:${hook.prompt}:${hook.model ?? \"default\"}`;\n }\n}\n\nfunction warnHook(message: string): void {\n process.stderr.write(`[hooks] ${message}\\n`);\n}\n\n// ---------------------------------------------------------------------------\n// Parser — load, merge, and deduplicate hooks.json files\n// ---------------------------------------------------------------------------\n\nasync function loadHooksFile(filePath: string): Promise<HooksFileConfig> {\n let content: string;\n try {\n content = await readFile(expandTilde(filePath), \"utf-8\");\n } catch {\n return { hooks: {} };\n }\n\n let raw: unknown;\n try {\n raw = JSON.parse(content);\n } catch (error) {\n warnHook(\n `${filePath} のJSON解析に失敗: ${error instanceof Error ? error.message : String(error)}`,\n );\n return { hooks: {} };\n }\n\n const result = hooksFileConfigSchema.safeParse(raw);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\", \");\n warnHook(`${filePath} のスキーマが不正: ${issues}`);\n return { hooks: {} };\n }\n\n return { hooks: result.data.hooks as HooksFileConfig[\"hooks\"] };\n}\n\nasync function resolveHookFiles(pathInput: string): Promise<string[]> {\n const resolvedPath = expandTilde(pathInput);\n\n let stats: Stats;\n try {\n stats = await stat(resolvedPath);\n } catch {\n return [];\n }\n\n if (stats.isFile()) {\n return [resolvedPath];\n }\n\n if (!stats.isDirectory()) {\n return [];\n }\n\n let entries: Dirent[];\n try {\n entries = await readdir(resolvedPath, { withFileTypes: true });\n } catch {\n return [];\n }\n\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map((entry) => join(resolvedPath, entry.name))\n .sort((a, b) => a.localeCompare(b));\n}\n\nfunction mergeHooksConfig(\n target: HooksFileConfig,\n source: HooksFileConfig,\n): void {\n const events = Object.keys(source.hooks) as HookEventName[];\n for (const event of events) {\n const sourceGroups = source.hooks[event] ?? [];\n const currentGroups = target.hooks[event] ?? [];\n target.hooks[event] = [...currentGroups, ...sourceGroups];\n }\n}\n\nexport async function loadHooksConfig(\n pathsOrGlobalPath: string[] | string,\n agentPath?: string,\n): Promise<HooksFileConfig> {\n const pathList = Array.isArray(pathsOrGlobalPath)\n ? pathsOrGlobalPath\n : [pathsOrGlobalPath, ...(agentPath ? [agentPath] : [])];\n\n const merged: HooksFileConfig = { hooks: {} };\n\n for (const pathEntry of pathList) {\n const files = await resolveHookFiles(pathEntry);\n for (const filePath of files) {\n const config = await loadHooksFile(filePath);\n mergeHooksConfig(merged, config);\n }\n }\n\n return merged;\n}\n\n// ---------------------------------------------------------------------------\n// Matcher — regex-based hook targeting with cache\n// ---------------------------------------------------------------------------\n\nconst regexCache = new Map<string, RegExp | null>();\n\nfunction getCachedRegex(pattern: string): RegExp | null {\n const cached = regexCache.get(pattern);\n if (cached !== undefined) return cached;\n\n try {\n const regex = new RegExp(`^(?:${pattern})$`);\n regexCache.set(pattern, regex);\n return regex;\n } catch {\n regexCache.set(pattern, null);\n return null;\n }\n}\n\nfunction matchesTarget(\n matcher: string | undefined,\n target: string | null,\n): boolean {\n if (!matcher || matcher === \"\" || matcher === \"*\") return true;\n if (target === null) return true;\n\n const regex = getCachedRegex(matcher);\n if (regex) return regex.test(target);\n\n return matcher === target;\n}\n\nfunction getMatchTarget(\n event: HookEventName,\n input: HookInput,\n): string | null {\n switch (event) {\n case \"PreToolUse\":\n case \"PostToolUse\":\n case \"PostToolUseFailure\":\n case \"PermissionRequest\":\n return input.tool_name ?? null;\n case \"SessionStart\":\n return input.source ?? null;\n case \"SessionEnd\":\n return input.reason ?? null;\n case \"UserPromptSubmit\":\n case \"Stop\":\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Command Hook Executor\n// ---------------------------------------------------------------------------\n\nfunction executeCommandHook(\n hook: CommandHook,\n input: HookInput,\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n return new Promise((resolve) => {\n const timeoutMs = (hook.timeout ?? DEFAULT_COMMAND_TIMEOUT_SEC) * 1000;\n const command = expandTilde(hook.command);\n\n const child = spawn(\"sh\", [\"-c\", command], {\n env: { ...process.env },\n timeout: timeoutMs,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (data: Buffer) => {\n if (stdout.length < MAX_HOOK_OUTPUT_BYTES) {\n stdout += data.toString();\n }\n });\n child.stderr.on(\"data\", (data: Buffer) => {\n if (stderr.length < MAX_HOOK_OUTPUT_BYTES) {\n stderr += data.toString();\n }\n });\n\n child.stdin.on(\"error\", () => {});\n child.stdin.write(JSON.stringify(input));\n child.stdin.end();\n\n child.on(\"close\", (code) => {\n resolve({ stdout, stderr, exitCode: code ?? 1 });\n });\n child.on(\"error\", (err) => {\n warnHook(`コマンドhook実行エラー (${hook.command}): ${err.message}`);\n resolve({ stdout, stderr, exitCode: 1 });\n });\n });\n}\n\n// ---------------------------------------------------------------------------\n// LLM Hook Executor (unified prompt hook)\n// ---------------------------------------------------------------------------\n\nasync function executeLLMHook(\n hook: PromptHook,\n input: HookInput,\n resolveModel: (modelId?: string) => LanguageModel,\n): Promise<{ ok: boolean; reason?: string }> {\n const prompt = hook.prompt.replace(/\\$ARGUMENTS/g, JSON.stringify(input));\n const model = resolveModel(hook.model);\n\n try {\n const result = await generateText({\n model,\n prompt,\n maxOutputTokens: 500,\n ...(hook.timeout\n ? { abortSignal: AbortSignal.timeout(hook.timeout * 1000) }\n : {}),\n });\n\n const text = result.text.trim();\n try {\n const parsed = JSON.parse(text) as { ok?: boolean; reason?: string };\n return { ok: parsed.ok !== false, reason: parsed.reason };\n } catch {\n warnHook(\n `Prompt hookのレスポンスがJSON形式ではありません: ${text.slice(0, 200)}`,\n );\n return { ok: true };\n }\n } catch (error) {\n warnHook(\n `Prompt hook実行エラー: ${error instanceof Error ? error.message : String(error)}`,\n );\n return { ok: true };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Output normalisation helpers\n// ---------------------------------------------------------------------------\n\nfunction normalizeCommandOutput(\n event: HookEventName,\n stdout: string,\n stderr: string,\n exitCode: number,\n): HookResult {\n if (exitCode === 2) {\n return {\n blocked: true,\n reason: stderr.trim() || \"フックによりブロックされました\",\n feedback: stderr.trim() || undefined,\n };\n }\n\n if (exitCode !== 0) {\n return { blocked: false };\n }\n\n const trimmed = stdout.trim();\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n if (event === \"SessionStart\" && trimmed) {\n return { blocked: false, additionalContext: trimmed };\n }\n return { blocked: false };\n }\n\n const hso = parsed.hookSpecificOutput as\n | Record<string, unknown>\n | undefined;\n\n switch (event) {\n case \"PreToolUse\": {\n const decision = hso?.permissionDecision as string | undefined;\n if (decision === \"deny\") {\n return {\n blocked: true,\n reason:\n (hso?.permissionDecisionReason as string) ??\n \"フックによりブロックされました\",\n };\n }\n if (decision === \"ask\") {\n return { blocked: false, askUser: true };\n }\n return {\n blocked: false,\n updatedInput: hso?.updatedInput as\n | Record<string, unknown>\n | undefined,\n additionalContext: hso?.additionalContext as string | undefined,\n };\n }\n\n case \"PermissionRequest\": {\n const decision = hso?.decision as\n | { behavior?: string; updatedInput?: Record<string, unknown> }\n | undefined;\n if (decision?.behavior === \"deny\") {\n return { blocked: true, reason: \"フックにより拒否されました\" };\n }\n if (decision?.behavior === \"allow\") {\n return { blocked: false, updatedInput: decision.updatedInput };\n }\n return { blocked: false };\n }\n\n case \"Stop\": {\n if (parsed.decision === \"block\") {\n return {\n blocked: true,\n stopDecision: \"block\",\n reason:\n (parsed.reason as string) ??\n \"フックにより続行が要求されました\",\n };\n }\n return { blocked: false, stopDecision: \"approve\" };\n }\n\n case \"SessionStart\": {\n const ctx =\n (hso?.additionalContext as string | undefined) ?? trimmed;\n return { blocked: false, additionalContext: ctx || undefined };\n }\n\n default:\n return { blocked: false };\n }\n}\n\nfunction normalizePromptOutput(\n ok: boolean,\n reason?: string,\n): HookResult {\n if (!ok) {\n return {\n blocked: true,\n reason: reason ?? \"フックによりブロックされました\",\n };\n }\n return { blocked: false };\n}\n\n// ---------------------------------------------------------------------------\n// Result merging — combine outputs from parallel hooks\n// ---------------------------------------------------------------------------\n\nfunction mergeResults(results: HookResult[]): HookResult {\n const merged: HookResult = { blocked: false };\n\n for (const r of results) {\n if (r.blocked) {\n merged.blocked = true;\n merged.reason = r.reason ?? merged.reason;\n }\n\n if (r.stopDecision) merged.stopDecision = r.stopDecision;\n if (r.askUser) merged.askUser = true;\n\n if (r.feedback) {\n merged.feedback = merged.feedback\n ? `${merged.feedback}\\n${r.feedback}`\n : r.feedback;\n }\n\n if (r.additionalContext) {\n merged.additionalContext = merged.additionalContext\n ? `${merged.additionalContext}\\n${r.additionalContext}`\n : r.additionalContext;\n }\n\n if (r.updatedInput) {\n merged.updatedInput = { ...merged.updatedInput, ...r.updatedInput };\n }\n }\n\n return merged;\n}\n\n// ---------------------------------------------------------------------------\n// HookEngine\n// ---------------------------------------------------------------------------\n\nexport interface HookEngineOptions {\n sessionId: string;\n cwd: string;\n config: WellGrowConfig;\n}\n\nexport class HookEngine {\n private readonly hooksConfig: HooksFileConfig;\n private readonly options: HookEngineOptions;\n private readonly _hasHooks: boolean;\n\n constructor(hooksConfig: HooksFileConfig, options: HookEngineOptions) {\n this.hooksConfig = hooksConfig;\n this.options = options;\n this._hasHooks = Object.keys(hooksConfig.hooks).length > 0;\n }\n\n get hasHooks(): boolean {\n return this._hasHooks;\n }\n\n async fire(\n event: HookEventName,\n eventInput: Partial<HookInput> = {},\n ): Promise<HookResult> {\n const groups = this.hooksConfig.hooks[event];\n if (!groups || groups.length === 0) {\n return { blocked: false };\n }\n\n const input: HookInput = {\n session_id: this.options.sessionId,\n cwd: this.options.cwd,\n hook_event_name: event,\n ...eventInput,\n };\n\n const matchTarget = getMatchTarget(event, input);\n const matchingGroups = groups.filter((g) =>\n matchesTarget(g.matcher, matchTarget),\n );\n\n if (matchingGroups.length === 0) {\n return { blocked: false };\n }\n\n const seen = new Set<string>();\n const syncHooks: HookDefinition[] = [];\n const asyncHooks: CommandHook[] = [];\n\n for (const group of matchingGroups) {\n for (const hook of group.hooks) {\n const key = hookKey(hook);\n if (seen.has(key)) continue;\n seen.add(key);\n\n if (hook.type === \"command\" && hook.async) {\n asyncHooks.push(hook);\n } else {\n syncHooks.push(hook);\n }\n }\n }\n\n for (const hook of asyncHooks) {\n this.executeOne(hook, event, input).catch((error) => {\n warnHook(\n `非同期hook実行エラー (${hook.command}): ${error instanceof Error ? error.message : String(error)}`,\n );\n });\n }\n\n if (syncHooks.length === 0) {\n return { blocked: false };\n }\n\n const results = await Promise.all(\n syncHooks.map((hook) => this.executeOne(hook, event, input)),\n );\n\n return mergeResults(results);\n }\n\n // ----- Bridge to ToolExecutionHooks (agent-loop.ts) -----\n\n createToolExecutionHooks(): ToolExecutionHooks {\n return {\n beforeExecute: async (\n toolCall: ToolCall,\n _meta: { category: string; source: string },\n ): Promise<ToolApprovalDecision> => {\n const result = await this.fire(\"PreToolUse\", {\n tool_name: toolCall.toolName,\n tool_input: toolCall.args,\n tool_use_id: toolCall.toolCallId,\n });\n\n if (result.blocked) {\n return {\n decision: \"deny\",\n reason:\n result.reason ?? \"フックによりブロックされました\",\n };\n }\n\n if (result.askUser) {\n return { decision: \"ask\" };\n }\n\n return {\n decision: \"allow\",\n updatedInput: result.updatedInput,\n additionalContext: result.additionalContext,\n };\n },\n\n afterExecute: async (\n toolCall: ToolCall,\n result: { success: boolean; output?: unknown; error?: string },\n ): Promise<{ feedback?: string } | void> => {\n const event: HookEventName = result.success\n ? \"PostToolUse\"\n : \"PostToolUseFailure\";\n const hookResult = await this.fire(event, {\n tool_name: toolCall.toolName,\n tool_input: toolCall.args,\n tool_use_id: toolCall.toolCallId,\n ...(result.success\n ? { tool_response: result.output }\n : { error: result.error }),\n });\n\n if (hookResult.feedback) {\n return { feedback: hookResult.feedback };\n }\n },\n\n onPermissionRequest: async (\n toolCall: ToolCall,\n _meta: { category: string; source: string },\n ) => {\n const result = await this.fire(\"PermissionRequest\", {\n tool_name: toolCall.toolName,\n tool_input: toolCall.args,\n });\n\n if (result.blocked) {\n return { behavior: \"deny\" as const };\n }\n\n if (result.updatedInput !== undefined) {\n return {\n behavior: \"allow\" as const,\n updatedInput: result.updatedInput,\n };\n }\n\n return null;\n },\n };\n }\n\n // ----- Private helpers -----\n\n private async executeOne(\n hook: HookDefinition,\n event: HookEventName,\n input: HookInput,\n ): Promise<HookResult> {\n switch (hook.type) {\n case \"command\": {\n const { stdout, stderr, exitCode } = await executeCommandHook(\n hook,\n input,\n );\n return normalizeCommandOutput(event, stdout, stderr, exitCode);\n }\n case \"prompt\": {\n const { ok, reason } = await executeLLMHook(hook, input, (id) =>\n this.resolveModel(id),\n );\n return normalizePromptOutput(ok, reason);\n }\n }\n }\n\n private resolveModel(modelId?: string): LanguageModel {\n return getModel(modelId ?? DEFAULT_HOOK_MODEL, this.options.config);\n }\n}\n","import { type ModelMessage } from \"ai\";\nimport { runAgentLoop, type AgentLoopCallbacks } from \"./agent-loop.js\";\nimport { loadConfig } from \"../config/index.js\";\nimport { createSessionContext, createAgentContext, type SessionContext } from \"./context.js\";\nimport {\n resolveAgent,\n type ResolvedAgent,\n} from \"../agents/resolver.js\";\nimport type { Mode } from \"../tools/pipeline.js\";\nimport type { McpConnectionResult } from \"../extensions/mcp.js\";\nimport type { MessagePart } from \"../ui/message-list.js\";\n\nexport type { ResolvedAgent } from \"../agents/resolver.js\";\n\nexport interface Session {\n ctx: SessionContext;\n messages: ModelMessage[];\n agent: ResolvedAgent;\n}\n\nexport interface CreateSessionOptions {\n agentName?: string;\n modelOverride?: string;\n modeOverride?: Mode;\n sessionStartSource?: string;\n onMcpConnection?: (result: McpConnectionResult) => void;\n}\n\nexport async function createSession(\n options: CreateSessionOptions,\n): Promise<Session> {\n const config = await loadConfig();\n const agentName = options.agentName ?? config.default.agent;\n\n const ctx = createSessionContext();\n const agent = await resolveAgent(\n {\n agentName,\n modelOverride: options.modelOverride,\n modeOverride: options.modeOverride,\n config,\n onMcpConnection: options.onMcpConnection,\n },\n ctx,\n );\n\n if (agent.hookEngine) {\n await agent.hookEngine.fire(\"SessionStart\", {\n source: options.sessionStartSource ?? \"startup\",\n });\n }\n\n return { ctx, messages: [], agent };\n}\n\nexport async function switchAgent(\n session: Session,\n newAgentName: string,\n options?: {\n onMcpConnection?: (result: McpConnectionResult) => void;\n },\n): Promise<void> {\n if (session.agent.hookEngine) {\n await session.agent.hookEngine.fire(\"SessionEnd\", {\n reason: \"agent_switch\",\n });\n }\n\n if (session.agent.mcpManager) {\n await session.agent.mcpManager.disconnectAll();\n session.ctx.mcpManager = null;\n }\n\n session.ctx.agent = createAgentContext();\n session.messages = [];\n\n const config = await loadConfig();\n session.agent = await resolveAgent(\n {\n agentName: newAgentName,\n config,\n onMcpConnection: options?.onMcpConnection,\n },\n session.ctx,\n );\n}\n\nexport interface SendMessageOptions {\n abortSignal?: AbortSignal;\n maxTurns?: number;\n maxRetries?: number;\n maxOutputTokens?: number;\n}\n\nexport interface SendMessageResult {\n fullText: string;\n parts: MessagePart[];\n}\n\nexport async function sendMessage(\n session: Session,\n userMessage: string,\n callbacks: AgentLoopCallbacks,\n options?: SendMessageOptions,\n): Promise<SendMessageResult> {\n const hookEngine = session.agent.hookEngine;\n\n if (hookEngine) {\n const submitResult = await hookEngine.fire(\"UserPromptSubmit\", {\n prompt: userMessage,\n });\n if (submitResult.blocked) {\n return {\n fullText: submitResult.reason ?? \"\",\n parts: [],\n };\n }\n }\n\n session.messages.push({ role: \"user\", content: userMessage });\n\n const executionHooks = hookEngine?.createToolExecutionHooks();\n\n const onStop = hookEngine\n ? async (lastMessage: string) => {\n const result = await hookEngine.fire(\"Stop\", {\n stop_hook_active: true,\n last_assistant_message: lastMessage,\n });\n return {\n blocked: result.blocked,\n reason: result.reason,\n };\n }\n : undefined;\n\n return runAgentLoop(\n session.messages,\n {\n model: session.agent.model,\n system: session.agent.systemPrompt,\n registry: session.agent.registry,\n pipeline: session.agent.pipeline,\n executionHooks,\n onStop,\n abortSignal: options?.abortSignal,\n maxTurns: options?.maxTurns ?? session.agent.maxTurns,\n maxRetries: options?.maxRetries,\n maxOutputTokens: options?.maxOutputTokens,\n logFile: session.ctx.logFile,\n isAbortedByUser: () =>\n session.ctx.abort.userAbortController?.signal.aborted ?? false,\n },\n callbacks,\n );\n}\n","import { appendFile, readFile, mkdir, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\n\nconst WELLGROW_DIR = join(homedir(), \".wellgrow\");\nconst HISTORY_FILE = join(WELLGROW_DIR, \"history.jsonl\");\n\nexport interface HistoryEntry {\n session_id: string;\n agent: string;\n model: string;\n timestamp: string;\n summary: string;\n message_count: number;\n}\n\nexport interface SessionRecorder {\n sessionId: string;\n recordUser: (content: string) => Promise<void>;\n recordAssistant: (content: string) => Promise<void>;\n finalize: (messageCount: number) => Promise<void>;\n}\n\nexport async function createSessionRecorder(\n model: string,\n agent: string,\n): Promise<SessionRecorder> {\n const sessionId = randomUUID();\n const now = new Date();\n const dateDir = join(\n WELLGROW_DIR,\n \"sessions\",\n String(now.getFullYear()),\n String(now.getMonth() + 1).padStart(2, \"0\"),\n String(now.getDate()).padStart(2, \"0\"),\n );\n await mkdir(dateDir, { recursive: true });\n\n const sessionFile = join(dateDir, `${sessionId}.jsonl`);\n let firstUserMessage = \"\";\n\n const meta = JSON.stringify({\n type: \"meta\",\n agent,\n model,\n timestamp: now.toISOString(),\n });\n await appendFile(sessionFile, meta + \"\\n\", \"utf-8\");\n\n return {\n sessionId,\n\n async recordUser(content: string) {\n if (!firstUserMessage) {\n firstUserMessage = content.slice(0, 50);\n }\n const entry = JSON.stringify({\n type: \"user\",\n timestamp: new Date().toISOString(),\n content,\n });\n await appendFile(sessionFile, entry + \"\\n\", \"utf-8\");\n },\n\n async recordAssistant(content: string) {\n const entry = JSON.stringify({\n type: \"assistant\",\n timestamp: new Date().toISOString(),\n content: content.slice(0, 500),\n });\n await appendFile(sessionFile, entry + \"\\n\", \"utf-8\");\n },\n\n async finalize(messageCount: number) {\n await mkdir(WELLGROW_DIR, { recursive: true });\n const historyEntry = JSON.stringify({\n session_id: sessionId,\n agent,\n model,\n timestamp: now.toISOString(),\n summary: firstUserMessage || \"(空セッション)\",\n message_count: messageCount,\n } satisfies HistoryEntry);\n await appendFile(HISTORY_FILE, historyEntry + \"\\n\", \"utf-8\");\n },\n };\n}\n\nexport async function listHistory(limit = 20): Promise<HistoryEntry[]> {\n try {\n const content = await readFile(HISTORY_FILE, \"utf-8\");\n const lines = content.trim().split(\"\\n\").filter(Boolean);\n return lines\n .map((line) => JSON.parse(line) as HistoryEntry)\n .reverse()\n .slice(0, limit);\n } catch {\n return [];\n }\n}\n\nexport async function getSessionContent(sessionId: string): Promise<string | null> {\n const sessionsDir = join(WELLGROW_DIR, \"sessions\");\n try {\n const years = await readdir(sessionsDir);\n for (const year of years) {\n const months = await readdir(join(sessionsDir, year));\n for (const month of months) {\n const days = await readdir(join(sessionsDir, year, month));\n for (const day of days) {\n const files = await readdir(join(sessionsDir, year, month, day));\n const match = files.find((f) => f.startsWith(sessionId));\n if (match) {\n return readFile(join(sessionsDir, year, month, day, match), \"utf-8\");\n }\n }\n }\n }\n } catch {\n // ignore\n }\n return null;\n}\n","import { useMemo } from \"react\";\nimport { Box, Text, Static, useApp } from \"ink\";\nimport { Header } from \"./header.js\";\nimport { MessageItem, type DisplayMessage } from \"./message-list.js\";\nimport { TodoList } from \"./todo-list.js\";\nimport { AskUserPrompt } from \"./ask-user-prompt.js\";\nimport { ApprovalPrompt } from \"./approval-prompt.js\";\nimport { InputPrompt } from \"./input-prompt.js\";\nimport { ThinkingIndicator } from \"./thinking-indicator.js\";\nimport { useChat } from \"../hooks/use-chat.js\";\nimport { MODEL_LIST } from \"../ai/providers.js\";\nimport type { WellGrowConfig } from \"../config/types.js\";\n\nconst MODEL_OPTIONS = MODEL_LIST.map((m) => ({ value: m.id, label: m.label }));\nimport type { Mode } from \"../tools/pipeline.js\";\nimport { colors } from \"./colors.js\";\n\ntype StaticEntry =\n | { kind: \"header\"; id: string }\n | { kind: \"message\"; id: string; data: DisplayMessage };\n\ninterface AppProps {\n agentName?: string;\n modelOverride?: string;\n config: WellGrowConfig;\n mode?: Mode;\n verbose?: boolean;\n initialMessage?: string;\n}\n\nexport function App({ agentName, modelOverride, config, mode, verbose, initialMessage }: AppProps) {\n const { exit } = useApp();\n const {\n messages,\n todos,\n retryInfo,\n status,\n isReady,\n currentModelName,\n currentAgentName,\n currentAgentIcon,\n mode: currentMode,\n agents,\n activeAskUser,\n askUserQueueSize,\n activeApproval,\n handleSubmit,\n handleModeToggle,\n handleAskUserComplete,\n handleApprovalDecision,\n } = useChat({\n agentName,\n modelOverride,\n config,\n mode,\n verbose,\n initialMessage,\n onExit: exit,\n });\n\n const isActive = status === \"submitted\" || status === \"streaming\";\n const completedMessages = useMemo(\n () => (isActive ? messages.slice(0, -1) : messages),\n [messages, isActive],\n );\n const streamingMessage = isActive\n ? messages[messages.length - 1]\n : null;\n\n const staticItems = useMemo(\n (): StaticEntry[] => [\n { kind: \"header\", id: \"__header__\" },\n ...completedMessages.map(\n (m): StaticEntry => ({ kind: \"message\", id: m.id, data: m }),\n ),\n ],\n [completedMessages],\n );\n\n if (!isReady) return null;\n\n return (\n <Box flexDirection=\"column\">\n <Static items={staticItems}>\n {(item) => {\n if (item.kind === \"header\") {\n return (\n <Box key={item.id}>\n <Header\n agentName={currentAgentName}\n agentIcon={currentAgentIcon}\n modelName={currentModelName}\n />\n </Box>\n );\n }\n return (\n <Box\n key={item.id}\n flexDirection=\"column\"\n marginBottom={item.data.sealed ? 0 : 1}\n >\n <MessageItem message={item.data} />\n </Box>\n );\n }}\n </Static>\n {retryInfo && (\n <Text color={colors.energy}>\n ⟳ API エラー。リトライ中... ({retryInfo.attempt}/\n {retryInfo.maxRetries},{\" \"}\n {Math.round(retryInfo.delayMs / 1000)}秒後)\n </Text>\n )}\n {status === \"submitted\" && <ThinkingIndicator />}\n {status === \"streaming\" && streamingMessage && !activeAskUser && !activeApproval && (\n <MessageItem message={streamingMessage} />\n )}\n <TodoList todos={todos} />\n {activeApproval && (\n <ApprovalPrompt\n request={activeApproval}\n onDecision={handleApprovalDecision}\n />\n )}\n {activeAskUser && !activeApproval && (\n <AskUserPrompt\n questions={activeAskUser.questions}\n queueSize={askUserQueueSize}\n onComplete={handleAskUserComplete}\n />\n )}\n {status === \"ready\" && !activeAskUser && !activeApproval && (\n <InputPrompt\n onSubmit={handleSubmit}\n onModeToggle={handleModeToggle}\n agents={agents}\n models={MODEL_OPTIONS}\n mode={currentMode}\n />\n )}\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport { colors } from \"./colors.js\";\n\ninterface HeaderProps {\n agentName?: string;\n agentIcon?: string;\n modelName: string;\n}\nexport function Header({ agentName, agentIcon, modelName }: HeaderProps) {\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={colors.signature}\n paddingX={1}\n marginBottom={1}\n >\n <Text bold color={colors.signature}> WellGrow </Text>\n {agentName && (\n <>\n <Text color={colors.fog}>│</Text>\n <Text color={colors.energy}> {agentIcon ?? \"🤖\"} {agentName} </Text>\n </>\n )}\n <Text color={colors.fog}>│</Text>\n <Text color={colors.insight}> {modelName} </Text>\n </Box>\n );\n}\n","export const colors = {\n signature: \"#7FDDC2\", // Mint Breeze — ブランドラベル\n accent: \"#6722FF\", // Electric Violet — 見出しアクセント\n growth: \"#00B254\", // Vivid Green — 完了・成長\n energy: \"#FF6C22\", // Blaze Orange — エラー・警告\n insight: \"#FFCD05\", // Vivid Yellow — 進行中\n flow: \"#5DADE2\", // Flow Blue\n joy: \"#F575AB\", // Bubblegum Pink — プロンプト・ユーザー\n fog: \"#999999\", // Fog — 補助テキスト・ツール実行\n} as const;\n","import { Box, Text } from \"ink\";\nimport remend from \"remend\";\nimport { renderMarkdown } from \"./markdown.js\";\nimport { colors } from \"./colors.js\";\n\nexport type MessagePart =\n | { type: \"text\"; text: string; state?: \"streaming\" | \"done\" }\n | { type: \"reasoning\"; text: string; state?: \"streaming\" | \"done\" }\n | {\n type: \"tool\";\n toolCallId: string;\n toolName: string;\n state:\n | \"input-streaming\"\n | \"input-available\"\n | \"output-available\"\n | \"output-error\"\n | \"output-denied\";\n input?: unknown;\n output?: unknown;\n errorText?: string;\n }\n | { type: \"step-start\" }\n | { type: \"source-url\"; url: string; title?: string };\n\nexport interface DisplayMessage {\n id: string;\n role: \"user\" | \"assistant\";\n parts: MessagePart[];\n interrupted?: boolean;\n sealed?: boolean;\n}\n\ninterface MessageItemProps {\n message: DisplayMessage;\n}\n\nexport function MessageItem({ message }: MessageItemProps) {\n if (message.role === \"user\") {\n const text = message.parts\n .filter(\n (p): p is Extract<MessagePart, { type: \"text\" }> => p.type === \"text\",\n )\n .map((p) => p.text)\n .join(\"\");\n\n return (\n <Box\n borderStyle=\"bold\"\n borderLeft\n borderTop={false}\n borderBottom={false}\n borderRight={false}\n borderColor={colors.joy}\n paddingLeft={1}\n >\n <Text>{text}</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {message.parts.map((part, i) => {\n switch (part.type) {\n case \"text\":\n return part.text ? (\n <Text key={`text-${i}`}>\n {renderMarkdown(\n part.state === \"streaming\"\n ? remend(part.text)\n : part.text,\n )}\n </Text>\n ) : null;\n case \"reasoning\":\n return part.text ? (\n <Text key={`reasoning-${i}`} color={colors.fog} dimColor>\n {part.text}\n </Text>\n ) : null;\n case \"tool\":\n return <ToolStatus key={part.toolCallId} part={part} />;\n case \"step-start\":\n return i > 0 ? (\n <Text key={`step-${i}`} color={colors.fog}>\n ✦\n </Text>\n ) : null;\n case \"source-url\":\n return (\n <Text key={`source-${i}`} color={colors.fog}>\n 📎 {part.title ?? part.url}\n </Text>\n );\n }\n })}\n {message.interrupted && (\n <Text color={colors.fog}>⏎ 中断しました</Text>\n )}\n </Box>\n );\n}\n\nfunction ToolStatus({\n part,\n}: {\n part: Extract<MessagePart, { type: \"tool\" }>;\n}) {\n switch (part.state) {\n case \"input-streaming\":\n case \"input-available\":\n return (\n <Text color={colors.fog}>\n ⋯ {part.toolName}\n </Text>\n );\n case \"output-available\":\n return null;\n case \"output-denied\":\n return (\n <Text color={colors.fog}>\n ⊘ {part.toolName}{part.errorText ? `: ${part.errorText}` : \"\"}\n </Text>\n );\n case \"output-error\":\n return (\n <Box flexDirection=\"column\">\n <Text color={colors.energy}>\n ✗ {part.toolName}\n </Text>\n {part.errorText && (\n <Text color={colors.energy} dimColor>\n {\" \"}{part.errorText}\n </Text>\n )}\n </Box>\n );\n }\n}\n","import { marked } from \"marked\";\nimport { colors } from \"./colors.js\";\n\n// marked-terminal は内部で chalk を使用しており、chalk は ESM モジュール\n// 初期化時に NO_COLOR / FORCE_COLOR 環境変数でカラーレベルを決定する。\n// static import では環境変数操作が間に合わないため、dynamic import で\n// chalk 初期化前に FORCE_COLOR=1 を設定してカラーレンダリングを有効にする。\nlet initialized = false;\n\nasync function ensureInitialized(): Promise<void> {\n if (initialized) return;\n initialized = true;\n\n const savedNoColor = process.env.NO_COLOR;\n const savedForceColor = process.env.FORCE_COLOR;\n delete process.env.NO_COLOR;\n process.env.FORCE_COLOR = \"1\";\n\n const { markedTerminal } = await import(\"marked-terminal\");\n const chalk = (await import(\"chalk\")).default;\n\n marked.use(\n markedTerminal({\n firstHeading: chalk.hex(colors.growth).bold,\n heading: chalk.hex(colors.growth).bold,\n code: chalk.hex(\"#e5c07b\"),\n codespan: chalk.hex(\"#e5c07b\"),\n link: chalk.hex(\"#569cd6\"),\n href: chalk.hex(\"#569cd6\").underline,\n blockquote: chalk.hex(colors.fog).italic,\n del: chalk.hex(colors.fog).strikethrough,\n }),\n );\n\n if (savedNoColor !== undefined) {\n process.env.NO_COLOR = savedNoColor;\n }\n if (savedForceColor !== undefined) {\n process.env.FORCE_COLOR = savedForceColor;\n } else {\n delete process.env.FORCE_COLOR;\n }\n}\n\n// アプリ起動時に呼び出して初期化を完了させる\nexport const markdownReady = ensureInitialized();\n\nexport function renderMarkdown(text: string): string {\n try {\n const result = marked.parse(text);\n if (typeof result === \"string\") {\n return result.trimEnd();\n }\n return text;\n } catch {\n return text;\n }\n}\n","import { memo } from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { TodoItem } from \"../tools/todo-write.js\";\nimport { colors } from \"./colors.js\";\n\ninterface TodoListProps {\n todos: TodoItem[];\n}\n\nexport const TodoList = memo(function TodoList({ todos }: TodoListProps) {\n if (todos.length === 0) return null;\n\n const completed = todos.filter((t) => t.status === \"completed\").length;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={colors.insight}\n paddingX={1}\n marginTop={1}\n >\n <Text color={colors.insight} bold>\n 📋 Tasks ({completed}/{todos.length})\n </Text>\n {todos.map((todo, i) => (\n <Box key={i}>\n {todo.status === \"pending\" && (\n <Text color={colors.fog}>○ {todo.content}</Text>\n )}\n {todo.status === \"in_progress\" && (\n <Text color={colors.insight}>▸ {todo.activeForm}</Text>\n )}\n {todo.status === \"completed\" && (\n <Text color={colors.growth}>✓ {todo.content}</Text>\n )}\n </Box>\n ))}\n </Box>\n );\n});\n","import { useState, useCallback, useMemo } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport type { AskUserQuestion, AskUserAnswer } from \"../tools/ask-user.js\";\nimport { colors } from \"./colors.js\";\n\ninterface AskUserPromptProps {\n questions: AskUserQuestion[];\n queueSize?: number;\n onComplete: (answers: Record<string, AskUserAnswer>) => void;\n}\n\nconst OTHER_OPTION = { label: \"Other\", description: \"自由入力で回答\" };\n\nexport function AskUserPrompt({ questions, queueSize = 0, onComplete }: AskUserPromptProps) {\n const [currentIdx, setCurrentIdx] = useState(0);\n const [cursorIdx, setCursorIdx] = useState(0);\n const [selectedSet, setSelectedSet] = useState<Set<number>>(new Set());\n const [isOtherInput, setIsOtherInput] = useState(false);\n const [otherText, setOtherText] = useState(\"\");\n const [answers, setAnswers] = useState<Record<string, AskUserAnswer>>({});\n\n const question = questions[currentIdx];\n\n const optionsWithOther = useMemo(\n () => (question ? [...question.options, OTHER_OPTION] : []),\n [question],\n );\n const otherIdx = optionsWithOther.length - 1;\n\n const advanceQuestion = useCallback(\n (answer: AskUserAnswer) => {\n if (!question) return;\n const newAnswers = { ...answers, [question.header]: answer };\n setAnswers(newAnswers);\n\n if (currentIdx < questions.length - 1) {\n setCurrentIdx((prev) => prev + 1);\n setCursorIdx(0);\n setSelectedSet(new Set());\n setIsOtherInput(false);\n setOtherText(\"\");\n } else {\n onComplete(newAnswers);\n }\n },\n [answers, currentIdx, question, questions.length, onComplete],\n );\n\n const handleOtherSubmit = useCallback(\n (value: string) => {\n const text = value.trim();\n if (!text || !question) return;\n if (question.multiSelect) {\n const selected = [...selectedSet]\n .filter((i) => i !== otherIdx)\n .map((i) => optionsWithOther[i].label);\n advanceQuestion({ selected, otherText: text });\n } else {\n advanceQuestion({ selected: [OTHER_OPTION.label], otherText: text });\n }\n },\n [question, selectedSet, otherIdx, optionsWithOther, advanceQuestion],\n );\n\n useInput(\n (input, key) => {\n if (!question || isOtherInput) return;\n\n if (key.upArrow) {\n setCursorIdx((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIdx((prev) => Math.min(optionsWithOther.length - 1, prev + 1));\n } else if (question.multiSelect && input === \" \") {\n setSelectedSet((prev) => {\n const next = new Set(prev);\n if (next.has(cursorIdx)) {\n next.delete(cursorIdx);\n } else {\n next.add(cursorIdx);\n }\n return next;\n });\n } else if (key.return) {\n if (question.multiSelect) {\n if (selectedSet.has(otherIdx)) {\n setIsOtherInput(true);\n return;\n }\n const selected = [...selectedSet].map(\n (i) => optionsWithOther[i].label,\n );\n if (selected.length === 0) return;\n advanceQuestion({ selected });\n } else {\n if (cursorIdx === otherIdx) {\n setIsOtherInput(true);\n return;\n }\n advanceQuestion({ selected: [optionsWithOther[cursorIdx].label] });\n }\n }\n },\n { isActive: !!question && !isOtherInput },\n );\n\n if (!question) return null;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={colors.joy}\n paddingX={1}\n marginTop={1}\n >\n <Box>\n <Text color={colors.joy} bold>💬 質問</Text>\n {questions.length > 1 && (\n <Text color={colors.fog}> ({currentIdx + 1}/{questions.length})</Text>\n )}\n {queueSize > 1 && (\n <Text color={colors.fog}> — 残り {queueSize - 1} 件待機中</Text>\n )}\n </Box>\n <Text color={colors.accent} bold>\n {question.question}\n </Text>\n {question.multiSelect && (\n <Text color={colors.fog}>(Space で選択/解除、Enter で確定)</Text>\n )}\n <Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n {optionsWithOther.map((opt, i) => {\n const isCursor = i === cursorIdx;\n const isSelected = selectedSet.has(i);\n const prefix = question.multiSelect\n ? `${isCursor ? \"❯\" : \" \"} ${isSelected ? \"◉\" : \"○\"}`\n : `${isCursor ? \"❯\" : \" \"}`;\n return (\n <Box key={i}>\n <Text color={isCursor ? colors.joy : undefined}>\n {prefix} {opt.label}\n </Text>\n <Text color={colors.fog}> — {opt.description}</Text>\n </Box>\n );\n })}\n </Box>\n {isOtherInput && (\n <Box marginLeft={2} marginTop={1}>\n <Text color={colors.insight}>自由入力: </Text>\n <TextInput\n value={otherText}\n onChange={setOtherText}\n onSubmit={handleOtherSubmit}\n />\n </Box>\n )}\n </Box>\n );\n}\n","import { Box, Text, useInput } from \"ink\";\nimport { colors } from \"./colors.js\";\n\nexport interface ApprovalRequest {\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n source: string;\n category: string;\n}\n\nexport type ApprovalDecision =\n | { action: \"allow\" }\n | { action: \"deny\" };\n\ninterface ApprovalPromptProps {\n request: ApprovalRequest;\n onDecision: (decision: ApprovalDecision) => void;\n}\n\nfunction formatToolPreview(toolName: string, args: Record<string, unknown>): string {\n if (toolName === \"Bash\") {\n return String(args.command ?? \"\");\n }\n if (toolName === \"Write\" || toolName === \"Edit\" || toolName === \"Read\") {\n return String(args.file_path ?? args.path ?? \"\");\n }\n if (toolName === \"Glob\") {\n return String(args.pattern ?? args.glob_pattern ?? \"\");\n }\n if (toolName === \"Grep\") {\n return String(args.pattern ?? \"\");\n }\n if (toolName.startsWith(\"mcp__\")) {\n const parts = toolName.split(\"__\");\n const server = parts[1] ?? \"\";\n const tool = parts.slice(2).join(\"__\");\n return `${server}/${tool}`;\n }\n return JSON.stringify(args).slice(0, 120);\n}\n\nexport function ApprovalPrompt({ request, onDecision }: ApprovalPromptProps) {\n useInput((input) => {\n const key = input.toLowerCase();\n if (key === \"y\") onDecision({ action: \"allow\" });\n if (key === \"n\") onDecision({ action: \"deny\" });\n });\n\n const preview = formatToolPreview(request.toolName, request.args);\n const sourceLabel = request.source === \"mcp\" ? \" (MCP)\" : \"\";\n const displayName = request.toolName.startsWith(\"mcp__\")\n ? request.toolName.replace(/^mcp__/, \"\").replace(/__/g, \"/\")\n : request.toolName;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={colors.energy}\n paddingX={1}\n marginTop={1}\n >\n <Text color={colors.energy} bold>\n 承認が必要です{sourceLabel}\n </Text>\n <Box marginTop={1}>\n <Text color={colors.insight} bold>{displayName}</Text>\n </Box>\n {preview && (\n <Box marginLeft={2}>\n <Text color={colors.fog}>{preview}</Text>\n </Box>\n )}\n <Box marginTop={1} gap={2}>\n <Text>\n <Text color={colors.growth} bold>[Y]</Text>\n <Text color={colors.fog}> 許可</Text>\n </Text>\n <Text>\n <Text color={colors.energy} bold>[N]</Text>\n <Text color={colors.fog}> 拒否</Text>\n </Text>\n </Box>\n </Box>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport { colors } from \"./colors.js\";\nimport type { Mode } from \"../tools/pipeline.js\";\n\ninterface ArgOption {\n value: string;\n label: string;\n}\n\ninterface SlashCommand {\n name: string;\n description: string;\n hasArgs: boolean;\n args?: ArgOption[];\n}\n\nconst MODE_ARGS: ArgOption[] = [\n { value: \"plan\", label: \"ツール実行前に承認\" },\n { value: \"auto\", label: \"すべて自動実行\" },\n];\n\ninterface InputPromptProps {\n onSubmit: (text: string) => void;\n onModeToggle?: () => void;\n agents?: { id: string; name: string; icon: string }[];\n models?: { value: string; label: string }[];\n mode?: Mode;\n}\n\nexport function InputPrompt({\n onSubmit,\n onModeToggle,\n agents,\n models,\n mode,\n}: InputPromptProps) {\n const [value, setValue] = useState(\"\");\n const [selectedIdx, setSelectedIdx] = useState(0);\n\n const commands = useMemo((): SlashCommand[] => {\n const agentArgs: ArgOption[] = (agents ?? []).map((a) => ({\n value: a.id,\n label: `${a.icon} ${a.name}`,\n }));\n const modelArgs: ArgOption[] = models ?? [];\n return [\n { name: \"/agent\", description: \"エージェントを表示/切り替え\", hasArgs: true, args: agentArgs },\n { name: \"/clear\", description: \"セッションをクリア\", hasArgs: false },\n { name: \"/mode\", description: \"モードを表示/切り替え (plan, auto)\", hasArgs: true, args: MODE_ARGS },\n { name: \"/model\", description: \"モデルを切り替え\", hasArgs: true, args: modelArgs },\n ];\n }, [agents, models]);\n\n const spaceIdx = value.indexOf(\" \");\n const isArgPhase = spaceIdx > 0;\n const isCmdPhase = value.startsWith(\"/\") && !isArgPhase;\n\n const cmdSuggestions = isCmdPhase\n ? commands.filter((cmd) => cmd.name.startsWith(value))\n : [];\n\n const argSuggestions = useMemo((): ArgOption[] => {\n if (!isArgPhase) return [];\n const cmdName = value.slice(0, spaceIdx);\n const argPrefix = value.slice(spaceIdx + 1);\n const cmd = commands.find((c) => c.name === cmdName);\n if (!cmd?.args) return [];\n return cmd.args.filter((a) => a.value.startsWith(argPrefix));\n }, [value, isArgPhase, spaceIdx, commands]);\n\n const hasSuggestions = cmdSuggestions.length > 0 || argSuggestions.length > 0;\n\n useInput((input, key) => {\n if (key.tab && key.shift) {\n onModeToggle?.();\n return;\n }\n\n if (key.return) {\n if (argSuggestions.length > 0) {\n const arg = argSuggestions[Math.min(selectedIdx, argSuggestions.length - 1)];\n const cmdName = value.slice(0, spaceIdx);\n onSubmit(`${cmdName} ${arg.value}`);\n setValue(\"\");\n setSelectedIdx(0);\n return;\n }\n if (cmdSuggestions.length > 0) {\n const cmd = cmdSuggestions[Math.min(selectedIdx, cmdSuggestions.length - 1)];\n if (cmd.hasArgs) {\n setValue(cmd.name + \" \");\n setSelectedIdx(0);\n } else {\n onSubmit(cmd.name);\n setValue(\"\");\n setSelectedIdx(0);\n }\n return;\n }\n if (value.trim()) {\n onSubmit(value);\n }\n setValue(\"\");\n setSelectedIdx(0);\n return;\n }\n\n if (key.tab) {\n if (argSuggestions.length > 0) {\n const arg = argSuggestions[Math.min(selectedIdx, argSuggestions.length - 1)];\n const cmdName = value.slice(0, spaceIdx);\n setValue(`${cmdName} ${arg.value}`);\n setSelectedIdx(0);\n return;\n }\n if (cmdSuggestions.length > 0) {\n const cmd = cmdSuggestions[Math.min(selectedIdx, cmdSuggestions.length - 1)];\n setValue(cmd.name + (cmd.hasArgs ? \" \" : \"\"));\n setSelectedIdx(0);\n return;\n }\n return;\n }\n\n if (hasSuggestions) {\n const len = argSuggestions.length || cmdSuggestions.length;\n if (key.upArrow) {\n setSelectedIdx((prev) => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow) {\n setSelectedIdx((prev) => Math.min(len - 1, prev + 1));\n return;\n }\n }\n\n if (key.escape && hasSuggestions) {\n setValue(\"\");\n setSelectedIdx(0);\n return;\n }\n\n if (key.backspace || key.delete) {\n setValue((prev) => prev.slice(0, -1));\n setSelectedIdx(0);\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setValue((prev) => prev + input);\n setSelectedIdx(0);\n }\n });\n\n const modeHint = mode ? ` [${mode}]` : \"\";\n\n return (\n <Box flexDirection=\"column\">\n <Text>\n <Text color={colors.joy}>❯ </Text>\n <Text>{value}</Text>\n <Text color={colors.fog}>█</Text>\n {!value && onModeToggle && (\n <Text color={colors.fog}> Shift+Tab: モード切替{modeHint}</Text>\n )}\n </Text>\n {cmdSuggestions.length > 0 && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {cmdSuggestions.map((cmd, i) => {\n const active = i === selectedIdx;\n return (\n <Box key={cmd.name}>\n <Text color={active ? colors.joy : undefined} bold={active}>\n {active ? \"❯ \" : \" \"}{cmd.name}\n </Text>\n <Text color={colors.fog}> — {cmd.description}</Text>\n </Box>\n );\n })}\n </Box>\n )}\n {argSuggestions.length > 0 && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {argSuggestions.map((arg, i) => {\n const active = i === selectedIdx;\n return (\n <Box key={arg.value}>\n <Text color={active ? colors.joy : undefined} bold={active}>\n {active ? \"❯ \" : \" \"}{arg.value}\n </Text>\n <Text color={colors.fog}> — {arg.label}</Text>\n </Box>\n );\n })}\n </Box>\n )}\n </Box>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport { Text } from \"ink\";\nimport { colors } from \"./colors.js\";\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\nexport function ThinkingIndicator() {\n const [frame, setFrame] = useState(0);\n const [elapsed, setElapsed] = useState(0);\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame((prev) => (prev + 1) % SPINNER_FRAMES.length);\n }, 80);\n return () => clearInterval(timer);\n }, []);\n\n useEffect(() => {\n const timer = setInterval(() => {\n setElapsed((prev) => prev + 1);\n }, 1000);\n return () => clearInterval(timer);\n }, []);\n\n return (\n <Text>\n <Text color={colors.signature}>{SPINNER_FRAMES[frame]}</Text>\n {elapsed >= 2 && <Text color={colors.fog} dimColor> {elapsed}s</Text>}\n </Text>\n );\n}\n","import { useState, useCallback, useRef, useEffect } from \"react\";\nimport { useInput } from \"ink\";\nimport { sendMessage } from \"../core/session.js\";\nimport type { TurnUsage } from \"../ai/cache.js\";\nimport type { TodoItem } from \"../tools/todo-write.js\";\nimport type { WellGrowConfig } from \"../config/types.js\";\nimport type {\n ApprovalRequest,\n ApprovalDecision,\n} from \"../ui/approval-prompt.js\";\nimport type { Mode } from \"../tools/pipeline.js\";\nimport {\n createAbortController,\n clearAbortState,\n} from \"../signals.js\";\nimport { formatErrorMessage } from \"../ai/retry.js\";\nimport { useChatSession } from \"./use-chat-session.js\";\nimport { useChatMessages, extractText } from \"./use-chat-messages.js\";\nimport { useAskUserQueue } from \"./use-ask-user-queue.js\";\nimport { handleSlashCommand } from \"./slash-commands.js\";\n\nexport type ChatStatus = \"ready\" | \"submitted\" | \"streaming\" | \"error\";\n\nexport interface RetryInfo {\n attempt: number;\n maxRetries: number;\n delayMs: number;\n}\n\nexport interface UseChatOptions {\n agentName?: string;\n modelOverride?: string;\n config: WellGrowConfig;\n mode?: Mode;\n verbose?: boolean;\n initialMessage?: string;\n onExit: () => void;\n}\n\nexport function useChat({\n agentName,\n modelOverride,\n config,\n mode: initialMode,\n verbose,\n initialMessage,\n onExit,\n}: UseChatOptions) {\n const {\n session,\n recorder,\n isReady,\n currentModelName,\n currentAgentName,\n currentAgentIcon,\n agents,\n messageCountRef,\n switchModel,\n switchAgent,\n resetSession,\n } = useChatSession({\n agentName,\n modelOverride,\n config,\n mode: initialMode,\n verbose,\n });\n\n const {\n messages,\n messagesRef,\n addUserAndAssistant,\n updateAssistantParts,\n markInterrupted,\n setAssistantError,\n addSystemMessage,\n clearMessages,\n } = useChatMessages();\n\n const {\n activeAskUser,\n askUserQueueSize,\n advanceQueue,\n handleComplete: handleAskUserComplete,\n cancelAll: cancelAllAskUser,\n } = useAskUserQueue(\n useCallback(\n () => session?.ctx.agent.askUser ?? null,\n [session],\n ),\n );\n\n const [todos, setTodos] = useState<TodoItem[]>([]);\n const [retryInfo, setRetryInfo] = useState<RetryInfo | null>(null);\n const [status, setStatus] = useState<ChatStatus>(\"ready\");\n const [activeApproval, setActiveApproval] = useState<ApprovalRequest | null>(\n null,\n );\n const [mode, setMode] = useState<Mode>(\n initialMode ?? config.default.mode,\n );\n\n const approvalResolverRef = useRef<\n ((decision: ApprovalDecision) => void) | null\n >(null);\n\n const interruptedRef = useRef(false);\n const lastUsageRef = useRef<TurnUsage | null>(null);\n const streamStartedRef = useRef(false);\n const initialMessageSentRef = useRef(false);\n const handleSubmitRef = useRef<(text: string) => void>(() => {});\n\n useInput(\n (_input, key) => {\n if (key.escape) {\n const ac = session?.ctx.abort.userAbortController;\n if (ac && !ac.signal.aborted) {\n interruptedRef.current = true;\n ac.abort();\n }\n }\n },\n {\n isActive:\n (status === \"submitted\" || status === \"streaming\") &&\n !activeAskUser &&\n !activeApproval,\n },\n );\n\n const handleApprovalDecision = useCallback((decision: ApprovalDecision) => {\n setActiveApproval(null);\n approvalResolverRef.current?.(decision);\n approvalResolverRef.current = null;\n }, []);\n\n const handleModeToggle = useCallback(() => {\n if (!session) return;\n const newMode: Mode = mode === \"plan\" ? \"auto\" : \"plan\";\n session.agent.pipeline.setMode(newMode);\n setMode(newMode);\n }, [session, mode]);\n\n const handleSubmit = useCallback(\n async (text: string) => {\n const trimmed = text.trim();\n if (!trimmed || !session) return;\n\n const handled = await handleSlashCommand(trimmed, {\n session,\n status,\n mode,\n currentAgentName,\n currentAgentIcon,\n recorder,\n messageCountRef,\n cancelAllAskUser,\n resetSession,\n clearMessages,\n setTodos,\n setMode,\n switchModel,\n switchAgent,\n addSystemMessage,\n onExit,\n });\n if (handled) return;\n\n addUserAndAssistant(trimmed);\n setStatus(\"submitted\");\n streamStartedRef.current = false;\n setRetryInfo(null);\n interruptedRef.current = false;\n\n recorder?.recordUser(trimmed).catch(() => {});\n messageCountRef.current++;\n\n const ac = createAbortController(session.ctx.abort, config.api.timeout);\n try {\n const { fullText, parts: finalParts } = await sendMessage(\n session,\n trimmed,\n {\n onMessageUpdate: (parts) => {\n if (!streamStartedRef.current) {\n streamStartedRef.current = true;\n setStatus(\"streaming\");\n }\n updateAssistantParts(parts);\n },\n onRetry: (attempt, maxRetries, delayMs) => {\n setRetryInfo({ attempt, maxRetries, delayMs });\n },\n onUsage: (usage) => {\n lastUsageRef.current = usage;\n },\n onToolUIEvent: (event) => {\n switch (event.type) {\n case \"todoUpdate\":\n setTodos(event.todos as TodoItem[]);\n break;\n case \"askUser\":\n advanceQueue();\n break;\n }\n },\n onApprovalRequest: (request) => {\n return new Promise<ApprovalDecision>((resolve) => {\n approvalResolverRef.current = resolve;\n setActiveApproval(request);\n });\n },\n },\n {\n abortSignal: ac.signal,\n maxRetries: config.api.max_retries,\n maxOutputTokens: config.default.max_output_tokens,\n },\n );\n\n const wasInterrupted = interruptedRef.current;\n\n if (wasInterrupted) {\n markInterrupted();\n }\n\n const contentForRecording = wasInterrupted\n ? (() => {\n const lastMsg =\n messagesRef.current[messagesRef.current.length - 1];\n return lastMsg ? extractText(lastMsg) : \"\";\n })()\n : fullText;\n\n if (contentForRecording) {\n recorder?.recordAssistant(contentForRecording).catch(() => {});\n messageCountRef.current++;\n }\n\n updateAssistantParts(finalParts);\n } catch (error) {\n if (interruptedRef.current) {\n markInterrupted();\n const lastMsg =\n messagesRef.current[messagesRef.current.length - 1];\n const partialText = lastMsg ? extractText(lastMsg) : \"\";\n if (partialText) {\n await recorder\n ?.recordAssistant(partialText)\n .catch(() => {});\n messageCountRef.current++;\n }\n } else {\n setAssistantError(formatErrorMessage(error));\n }\n } finally {\n interruptedRef.current = false;\n clearAbortState(session.ctx.abort);\n setTodos([]);\n setRetryInfo(null);\n setActiveApproval(null);\n approvalResolverRef.current = null;\n setStatus(\"ready\");\n }\n },\n [\n session,\n recorder,\n onExit,\n config,\n status,\n mode,\n currentAgentName,\n currentAgentIcon,\n messageCountRef,\n cancelAllAskUser,\n resetSession,\n clearMessages,\n switchModel,\n switchAgent,\n addSystemMessage,\n addUserAndAssistant,\n updateAssistantParts,\n markInterrupted,\n setAssistantError,\n messagesRef,\n advanceQueue,\n ],\n );\n\n handleSubmitRef.current = handleSubmit;\n\n useEffect(() => {\n if (isReady && initialMessage && !initialMessageSentRef.current) {\n initialMessageSentRef.current = true;\n void handleSubmitRef.current(initialMessage);\n }\n }, [isReady, initialMessage]);\n\n return {\n messages,\n todos,\n retryInfo,\n status,\n isReady,\n currentModelName,\n currentAgentName,\n currentAgentIcon,\n mode,\n agents,\n activeAskUser,\n askUserQueueSize,\n activeApproval,\n lastUsage: lastUsageRef.current,\n handleSubmit,\n handleModeToggle,\n handleAskUserComplete,\n handleApprovalDecision,\n };\n}\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { randomUUID } from \"node:crypto\";\nimport type { LanguageModel } from \"ai\";\nimport {\n createSession,\n switchAgent as switchAgentSession,\n type Session,\n} from \"../core/session.js\";\nimport {\n createSessionRecorder,\n type SessionRecorder,\n} from \"../core/history.js\";\nimport { getModel, getModelDisplayName } from \"../ai/providers.js\";\nimport { listAgents } from \"../agents/loader.js\";\nimport type { AgentSummary } from \"../agents/types.js\";\nimport {\n registerShutdownHandler,\n setActiveSession,\n} from \"../signals.js\";\nimport { initLogger } from \"../logging.js\";\nimport { markdownReady } from \"../ui/markdown.js\";\nimport type { WellGrowConfig } from \"../config/types.js\";\nimport type { Mode } from \"../tools/pipeline.js\";\n\nexport interface ChatSessionState {\n session: Session | null;\n recorder: SessionRecorder | null;\n isReady: boolean;\n currentModelName: string;\n currentAgentName: string;\n currentAgentIcon: string;\n agents: AgentSummary[];\n currentModelRef: React.MutableRefObject<LanguageModel | null>;\n messageCountRef: React.MutableRefObject<number>;\n switchModel: (\n modelId: string,\n ) => { success: boolean; message: string };\n switchAgent: (\n agentName: string,\n ) => Promise<{ success: boolean; message: string }>;\n resetSession: () => Promise<void>;\n}\n\nexport interface UseChatSessionOptions {\n agentName?: string;\n modelOverride?: string;\n config: WellGrowConfig;\n mode?: Mode;\n verbose?: boolean;\n}\n\nexport function useChatSession({\n agentName: initialAgentName,\n modelOverride,\n config,\n mode,\n verbose,\n}: UseChatSessionOptions): ChatSessionState {\n const [isReady, setIsReady] = useState(false);\n const [currentModelName, setCurrentModelName] = useState(\"\");\n const [currentAgentName, setCurrentAgentName] = useState(\"\");\n const [currentAgentIcon, setCurrentAgentIcon] = useState(\"🤖\");\n const [agents, setAgents] = useState<AgentSummary[]>([]);\n\n const sessionRef = useRef<Session | null>(null);\n const recorderRef = useRef<SessionRecorder | null>(null);\n const messageCountRef = useRef(0);\n const currentModelRef = useRef<LanguageModel | null>(null);\n const currentAgentIdRef = useRef(initialAgentName ?? config.default.agent);\n\n useEffect(() => {\n let cancelled = false;\n const agentId = initialAgentName ?? config.default.agent;\n currentAgentIdRef.current = agentId;\n\n async function initialize(): Promise<void> {\n const [s, , agentList] = await Promise.all([\n createSession({\n agentName: agentId,\n modelOverride,\n modeOverride: mode,\n }),\n markdownReady,\n listAgents(),\n ]);\n\n if (cancelled) return;\n\n if (verbose) {\n s.ctx.logFile = await initLogger(\n randomUUID(),\n config.logging.log_dir,\n );\n }\n\n const recorder = await createSessionRecorder(\n getModelDisplayName(s.agent.modelId),\n agentId,\n );\n\n if (cancelled) return;\n\n sessionRef.current = s;\n recorderRef.current = recorder;\n currentModelRef.current = s.agent.model;\n setCurrentModelName(getModelDisplayName(s.agent.modelId));\n setCurrentAgentName(s.agent.name);\n setCurrentAgentIcon(s.agent.icon);\n setAgents(agentList);\n setActiveSession(s.ctx, s.agent.hookEngine);\n registerShutdownHandler(async () => {\n if (recorderRef.current) {\n await recorderRef.current.finalize(messageCountRef.current);\n }\n });\n setIsReady(true);\n }\n\n void initialize().catch((error) => {\n if (cancelled) return;\n process.stderr.write(\n `セッション初期化エラー: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n });\n return () => {\n cancelled = true;\n };\n }, [initialAgentName, config, modelOverride, mode, verbose]);\n\n const switchModel = useCallback(\n (modelId: string): { success: boolean; message: string } => {\n try {\n const newModel = getModel(modelId, config);\n currentModelRef.current = newModel;\n setCurrentModelName(getModelDisplayName(modelId));\n if (sessionRef.current) {\n sessionRef.current.agent.model = newModel;\n (sessionRef.current.agent as { modelId: string }).modelId = modelId;\n }\n return {\n success: true,\n message: `モデルを ${modelId} に切り替えました。`,\n };\n } catch (error) {\n return {\n success: false,\n message: `モデル切り替えエラー: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n },\n [config],\n );\n\n const switchAgent = useCallback(\n async (\n newAgentName: string,\n ): Promise<{ success: boolean; message: string }> => {\n const session = sessionRef.current;\n if (!session) {\n return { success: false, message: \"セッションが初期化されていません。\" };\n }\n\n try {\n if (recorderRef.current) {\n await recorderRef.current.finalize(messageCountRef.current);\n }\n\n await switchAgentSession(session, newAgentName);\n currentAgentIdRef.current = newAgentName;\n\n currentModelRef.current = session.agent.model;\n setCurrentModelName(getModelDisplayName(session.agent.modelId));\n setCurrentAgentName(session.agent.name);\n setCurrentAgentIcon(session.agent.icon);\n setActiveSession(session.ctx, session.agent.hookEngine);\n\n recorderRef.current = await createSessionRecorder(\n getModelDisplayName(session.agent.modelId),\n newAgentName,\n );\n messageCountRef.current = 0;\n\n return {\n success: true,\n message: `エージェントを ${session.agent.icon} ${session.agent.name} に切り替えました。`,\n };\n } catch (error) {\n return {\n success: false,\n message: `エージェント切り替えエラー: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n },\n [],\n );\n\n const resetSession = useCallback(async () => {\n const session = sessionRef.current;\n if (!session) return;\n\n if (session.agent.hookEngine) {\n await session.agent.hookEngine.fire(\"SessionEnd\", { reason: \"clear\" });\n }\n\n if (recorderRef.current) {\n await recorderRef.current.finalize(messageCountRef.current);\n }\n\n const currentAgentId = currentAgentIdRef.current;\n const newSession = await createSession({\n agentName: currentAgentId,\n modelOverride,\n modeOverride: mode,\n sessionStartSource: \"clear\",\n });\n if (verbose) {\n newSession.ctx.logFile = await initLogger(\n randomUUID(),\n config.logging.log_dir,\n );\n }\n sessionRef.current = newSession;\n currentModelRef.current = newSession.agent.model;\n setCurrentModelName(getModelDisplayName(newSession.agent.modelId));\n setCurrentAgentName(newSession.agent.name);\n setCurrentAgentIcon(newSession.agent.icon);\n setActiveSession(newSession.ctx, newSession.agent.hookEngine);\n recorderRef.current = await createSessionRecorder(\n getModelDisplayName(newSession.agent.modelId),\n currentAgentId,\n );\n messageCountRef.current = 0;\n }, [verbose, config, modelOverride, mode]);\n\n return {\n session: sessionRef.current,\n recorder: recorderRef.current,\n isReady,\n currentModelName,\n currentAgentName,\n currentAgentIcon,\n agents,\n currentModelRef,\n messageCountRef,\n switchModel,\n switchAgent,\n resetSession,\n };\n}\n","import { useState, useCallback, useRef } from \"react\";\nimport { randomUUID } from \"node:crypto\";\nimport type { DisplayMessage, MessagePart } from \"../ui/message-list.js\";\n\nfunction makeMessage(\n role: \"user\" | \"assistant\",\n text: string,\n): DisplayMessage {\n return {\n id: randomUUID(),\n role,\n parts: text ? [{ type: \"text\", text, state: \"done\" as const }] : [],\n };\n}\n\nfunction isPartCompleted(part: MessagePart): boolean {\n switch (part.type) {\n case \"text\":\n case \"reasoning\":\n return part.state === \"done\";\n case \"tool\":\n return part.state === \"output-available\"\n || part.state === \"output-error\"\n || part.state === \"output-denied\";\n case \"step-start\":\n case \"source-url\":\n return true;\n }\n}\n\nfunction countCompletedLeadingParts(parts: MessagePart[]): number {\n let count = 0;\n for (const p of parts) {\n if (isPartCompleted(p)) count++;\n else break;\n }\n return count;\n}\n\nexport function extractText(message: DisplayMessage): string {\n return message.parts\n .filter(\n (p): p is Extract<MessagePart, { type: \"text\" }> => p.type === \"text\",\n )\n .map((p) => p.text)\n .join(\"\");\n}\n\nexport interface ChatMessagesState {\n messages: DisplayMessage[];\n messagesRef: React.MutableRefObject<DisplayMessage[]>;\n addUserAndAssistant: (userText: string) => void;\n updateAssistantParts: (parts: MessagePart[]) => void;\n markInterrupted: () => void;\n setAssistantError: (errorMessage: string) => void;\n addSystemMessage: (text: string) => void;\n clearMessages: () => void;\n}\n\nexport function useChatMessages(): ChatMessagesState {\n const [messages, setMessages] = useState<DisplayMessage[]>([]);\n const messagesRef = useRef<DisplayMessage[]>([]);\n messagesRef.current = messages;\n const sealedCountRef = useRef(0);\n\n const addUserAndAssistant = useCallback((userText: string) => {\n sealedCountRef.current = 0;\n setMessages((prev) => [\n ...prev,\n makeMessage(\"user\", userText),\n { id: randomUUID(), role: \"assistant\", parts: [] },\n ]);\n }, []);\n\n const updateAssistantParts = useCallback((parts: MessagePart[]) => {\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (!last || last.role !== \"assistant\") return prev;\n\n const completedCount = countCompletedLeadingParts(parts);\n const alreadySealed = sealedCountRef.current;\n\n if (completedCount > alreadySealed && completedCount < parts.length) {\n const sealed: DisplayMessage = {\n id: `${last.id}-sealed-${completedCount}`,\n role: \"assistant\",\n parts: parts.slice(alreadySealed, completedCount),\n sealed: true,\n };\n sealedCountRef.current = completedCount;\n return [\n ...prev.slice(0, -1),\n sealed,\n { ...last, parts: parts.slice(completedCount) },\n ];\n }\n\n return [\n ...prev.slice(0, -1),\n { ...last, parts: parts.slice(alreadySealed) },\n ];\n });\n }, []);\n\n const markInterrupted = useCallback(() => {\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (!last || last.role !== \"assistant\") return prev;\n return [...prev.slice(0, -1), { ...last, interrupted: true }];\n });\n }, []);\n\n const setAssistantError = useCallback((errorMessage: string) => {\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (!last || last.role !== \"assistant\") return prev;\n return [\n ...prev.slice(0, -1),\n {\n ...last,\n parts: [\n {\n type: \"text\" as const,\n text: errorMessage,\n state: \"done\" as const,\n },\n ],\n },\n ];\n });\n }, []);\n\n const addSystemMessage = useCallback((text: string) => {\n setMessages((prev) => [...prev, makeMessage(\"assistant\", text)]);\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n }, []);\n\n return {\n messages,\n messagesRef,\n addUserAndAssistant,\n updateAssistantParts,\n markInterrupted,\n setAssistantError,\n addSystemMessage,\n clearMessages,\n };\n}\n","import { useState, useCallback } from \"react\";\nimport type { AskUserQuestion, AskUserAnswer } from \"../tools/ask-user.js\";\nimport {\n resolveAskUser,\n getNextPendingAskUser,\n getPendingAskUserCount,\n cancelAllPendingAskUser,\n type AskUserState,\n} from \"../tools/ask-user.js\";\n\nexport interface AskUserQueueState {\n activeAskUser: {\n toolCallId: string;\n questions: AskUserQuestion[];\n } | null;\n askUserQueueSize: number;\n advanceQueue: () => void;\n handleComplete: (answers: Record<string, AskUserAnswer>) => void;\n cancelAll: () => void;\n}\n\nexport function useAskUserQueue(\n getAskUserState: () => AskUserState | null,\n): AskUserQueueState {\n const [activeAskUser, setActiveAskUser] = useState<{\n toolCallId: string;\n questions: AskUserQuestion[];\n } | null>(null);\n const [askUserQueueSize, setAskUserQueueSize] = useState(0);\n\n const advanceQueue = useCallback(() => {\n const state = getAskUserState();\n if (!state) return;\n const next = getNextPendingAskUser(state);\n if (next) {\n setActiveAskUser(next);\n setAskUserQueueSize(getPendingAskUserCount(state));\n } else {\n setActiveAskUser(null);\n setAskUserQueueSize(0);\n }\n }, [getAskUserState]);\n\n const handleComplete = useCallback(\n (answers: Record<string, AskUserAnswer>) => {\n const state = getAskUserState();\n if (activeAskUser && state) {\n resolveAskUser(state, activeAskUser.toolCallId, answers);\n }\n advanceQueue();\n },\n [activeAskUser, advanceQueue, getAskUserState],\n );\n\n const cancelAll = useCallback(() => {\n const state = getAskUserState();\n if (state) {\n cancelAllPendingAskUser(state);\n }\n setActiveAskUser(null);\n setAskUserQueueSize(0);\n }, [getAskUserState]);\n\n return {\n activeAskUser,\n askUserQueueSize,\n advanceQueue,\n handleComplete,\n cancelAll,\n };\n}\n","import type { Session } from \"../core/session.js\";\nimport type { SessionRecorder } from \"../core/history.js\";\nimport type { TodoItem } from \"../tools/todo-write.js\";\nimport type { Mode } from \"../tools/pipeline.js\";\n\nexport interface SlashCommandContext {\n session: Session;\n status: \"ready\" | \"submitted\" | \"streaming\" | \"error\";\n mode: Mode;\n currentAgentName: string;\n currentAgentIcon: string;\n recorder: SessionRecorder | null;\n messageCountRef: { current: number };\n cancelAllAskUser: () => void;\n resetSession: () => Promise<void>;\n clearMessages: () => void;\n setTodos: (todos: TodoItem[]) => void;\n setMode: (mode: Mode) => void;\n switchModel: (modelId: string) => { message: string };\n switchAgent: (\n agentName: string,\n ) => Promise<{ success: boolean; message: string }>;\n addSystemMessage: (text: string) => void;\n onExit: () => void;\n}\n\nexport async function handleSlashCommand(\n text: string,\n ctx: SlashCommandContext,\n): Promise<boolean> {\n if (text === \"exit\" || text === \"quit\") {\n ctx.cancelAllAskUser();\n if (ctx.session.agent.hookEngine) {\n await ctx.session.agent.hookEngine\n .fire(\"SessionEnd\", { reason: \"prompt_input_exit\" })\n .catch(() => {});\n }\n if (ctx.recorder) {\n await ctx.recorder.finalize(ctx.messageCountRef.current);\n }\n ctx.onExit();\n return true;\n }\n\n if (text === \"/clear\") {\n ctx.cancelAllAskUser();\n await ctx.resetSession();\n ctx.clearMessages();\n ctx.setTodos([]);\n return true;\n }\n\n const agentMatch = text.match(/^\\/agent(?:\\s+(.+))?$/);\n if (agentMatch) {\n const newAgent = agentMatch[1]?.trim();\n if (!newAgent) {\n ctx.addSystemMessage(\n `現在のエージェント: ${ctx.currentAgentIcon} ${ctx.currentAgentName}`,\n );\n return true;\n }\n if (ctx.status !== \"ready\") {\n ctx.addSystemMessage(\n \"推論中はエージェントを切り替えられません。完了後に再度お試しください。\",\n );\n return true;\n }\n ctx.cancelAllAskUser();\n ctx.clearMessages();\n ctx.setTodos([]);\n const result = await ctx.switchAgent(newAgent);\n if (result.success) {\n ctx.setMode(ctx.session.agent.pipeline.mode);\n }\n ctx.addSystemMessage(result.message);\n return true;\n }\n\n const modeMatch = text.match(/^\\/mode(?:\\s+(.+))?$/);\n if (modeMatch) {\n const newMode = modeMatch[1]?.trim() as Mode | undefined;\n if (!newMode) {\n ctx.addSystemMessage(`現在のモード: ${ctx.mode}`);\n return true;\n }\n const valid: Mode[] = [\"plan\", \"auto\"];\n if (!valid.includes(newMode)) {\n ctx.addSystemMessage(\n `無効なモードです。有効な値: ${valid.join(\", \")}`,\n );\n return true;\n }\n ctx.session.agent.pipeline.setMode(newMode);\n ctx.setMode(newMode);\n ctx.addSystemMessage(`モードを ${newMode} に切り替えました。`);\n return true;\n }\n\n const modelMatch = text.match(/^\\/model\\s+(.+)/);\n if (modelMatch) {\n if (ctx.status !== \"ready\") {\n ctx.addSystemMessage(\n \"推論中はモデルを切り替えられません。完了後に再度お試しください。\",\n );\n return true;\n }\n const result = ctx.switchModel(modelMatch[1].trim());\n ctx.addSystemMessage(result.message);\n return true;\n }\n\n return false;\n}\n","import { Command } from \"commander\";\nimport {\n loadConfig,\n updateConfigField,\n ConfigLoadError,\n} from \"../config/index.js\";\n\nexport function registerConfigCommand(program: Command): void {\n const configCmd = program\n .command(\"config\")\n .description(\"設定の管理\");\n\n configCmd\n .command(\"show\")\n .description(\"現在の設定を表示\")\n .action(async () => {\n try {\n const config = await loadConfig();\n console.log(JSON.stringify(config, null, 2));\n } catch (error) {\n if (error instanceof ConfigLoadError) {\n console.error(error.message);\n return;\n }\n throw error;\n }\n });\n\n configCmd\n .command(\"model\")\n .description(\"デフォルトモデルを変更\")\n .argument(\"[model-id]\", \"設定するモデルID\")\n .action(async (modelId?: string) => {\n try {\n if (!modelId) {\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n modelId = await new Promise<string>((resolve) => {\n rl.question(\"モデルID (例: claude-sonnet-4-20250514, gemini-2.5-pro): \", (answer: string) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n }\n\n if (!modelId) {\n console.error(\"モデルIDを指定してください\");\n return;\n }\n\n await updateConfigField(\"default\", \"model\", modelId);\n console.log(`デフォルトモデルを ${modelId} に変更しました。`);\n } catch (error) {\n if (error instanceof ConfigLoadError) {\n console.error(error.message);\n return;\n }\n console.error(\"設定ファイルの更新に失敗しました。\");\n }\n });\n\n configCmd\n .action(async () => {\n try {\n const config = await loadConfig();\n console.log(`モデル: ${config.default.model}`);\n console.log(`プロバイダー: ${config.default.provider}`);\n console.log(`エージェント: ${config.default.agent}`);\n console.log(`モード: ${config.default.mode}`);\n } catch (error) {\n if (error instanceof ConfigLoadError) {\n console.error(error.message);\n return;\n }\n throw error;\n }\n });\n}\n","import { Command } from \"commander\";\nimport { listHistory, getSessionContent } from \"../core/history.js\";\n\nexport function registerHistoryCommand(program: Command): void {\n const historyCmd = program\n .command(\"history\")\n .description(\"セッション履歴\");\n\n historyCmd\n .argument(\"[session-id]\", \"セッションIDで詳細表示\")\n .action(async (sessionId?: string) => {\n if (sessionId) {\n const content = await getSessionContent(sessionId);\n if (content) {\n console.log(content);\n } else {\n console.error(`セッション ${sessionId} が見つかりません`);\n }\n return;\n }\n\n const entries = await listHistory();\n if (entries.length === 0) {\n console.log(\"履歴がありません\");\n return;\n }\n\n for (const entry of entries) {\n const date = new Date(entry.timestamp).toLocaleString(\"ja-JP\");\n console.log(`${date} ${entry.model} ${entry.summary}`);\n console.log(` ID: ${entry.session_id}`);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { platform } from \"node:os\";\nimport { checkRecommendedTools, type DoctorResult } from \"../config/recommended-tools.js\";\n\nfunction getPackageManagerKey(): string {\n const os = platform();\n if (os === \"darwin\") return \"brew\";\n return \"apt\";\n}\n\nfunction formatDoctorResult(result: DoctorResult): string {\n const pmKey = getPackageManagerKey();\n const lines: string[] = [];\n\n lines.push(\"🩺 WellGrow Doctor — 推奨ツールチェック\\n\");\n\n for (const cat of result.categories) {\n lines.push(` ${cat.label}`);\n for (const tool of cat.tools) {\n if (tool.installed) {\n const ver = tool.version ? ` (${tool.version})` : \"\";\n lines.push(` ✅ ${tool.name}${ver} — ${tool.description}`);\n } else {\n const installCmd = tool.install[pmKey] ?? Object.values(tool.install)[0] ?? \"\";\n lines.push(` ❌ ${tool.name} — ${tool.description}`);\n lines.push(` → ${installCmd}`);\n }\n }\n lines.push(\"\");\n }\n\n lines.push(\n ` 結果: ${result.installedCount} インストール済 / ${result.missingCount} 未インストール`,\n );\n\n if (result.missingCount > 0) {\n lines.push(\"\");\n lines.push(\" 一括インストール:\");\n\n const missing = result.categories\n .flatMap((c) => c.tools)\n .filter((t) => !t.installed);\n\n if (pmKey === \"brew\") {\n const names = missing\n .map((t) => {\n const cmd = t.install.brew;\n if (!cmd) return null;\n return cmd.replace(\"brew install \", \"\");\n })\n .filter(Boolean);\n if (names.length > 0) {\n lines.push(` brew install ${names.join(\" \")}`);\n }\n } else {\n const aptTools = missing.filter((t) => t.install.apt?.startsWith(\"sudo apt\"));\n const otherTools = missing.filter((t) => !t.install.apt?.startsWith(\"sudo apt\"));\n\n if (aptTools.length > 0) {\n const names = aptTools\n .map((t) => t.install.apt!.replace(\"sudo apt install -y \", \"\"))\n .filter(Boolean);\n lines.push(` sudo apt install -y ${names.join(\" \")}`);\n }\n for (const t of otherTools) {\n const cmd = t.install.apt ?? Object.values(t.install)[0] ?? \"\";\n if (cmd) lines.push(` ${cmd}`);\n }\n }\n }\n\n if (result.missingCount === 0) {\n lines.push(\"\\n 🎉 すべての推奨ツールがインストール済みです!\");\n }\n\n return lines.join(\"\\n\");\n}\n\nexport async function runDoctor(): Promise<DoctorResult> {\n const result = await checkRecommendedTools();\n process.stdout.write(formatDoctorResult(result) + \"\\n\");\n return result;\n}\n\nexport function registerDoctorCommand(program: Command): void {\n program\n .command(\"doctor\")\n .description(\"推奨ツールのインストール状況を確認する\")\n .action(async () => {\n await runDoctor();\n });\n}\n","import { Command } from \"commander\";\nimport {\n readFile,\n readdir,\n mkdir,\n cp,\n rm,\n mkdtemp,\n stat,\n} from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport matter from \"gray-matter\";\n\nconst execFileAsync = promisify(execFile);\nconst WELLGROW_HOME = join(homedir(), \".wellgrow\");\nconst SKILLS_DIR = join(WELLGROW_HOME, \"skills\");\n\nconst SKIP_DIRS = new Set([\".git\", \"node_modules\", \".github\", \".husky\"]);\n\nexport interface SkillInfo {\n name: string;\n description: string;\n sourceDir: string;\n}\n\nexport function parseSource(source: string): { url: string; ref?: string } {\n if (source.startsWith(\"./\") || source.startsWith(\"../\")) {\n return { url: resolve(source) };\n }\n\n if (/^[\\w.-]+\\/[\\w.-]+$/.test(source)) {\n return { url: `https://github.com/${source}.git` };\n }\n\n if (source.startsWith(\"https://\") || source.startsWith(\"git@\")) {\n const treeMatch = source.match(\n /github\\.com\\/([^/]+\\/[^/]+)\\/tree\\/([^/]+)/,\n );\n if (treeMatch) {\n return {\n url: `https://github.com/${treeMatch[1]}.git`,\n ref: treeMatch[2],\n };\n }\n return { url: source.replace(/\\/$/, \"\") };\n }\n\n return { url: resolve(source) };\n}\n\nexport async function discoverSkillsInRepo(dir: string): Promise<SkillInfo[]> {\n const skills: SkillInfo[] = [];\n const seen = new Set<string>();\n\n async function scan(currentDir: string, depth: number): Promise<void> {\n if (depth > 3) return;\n\n try {\n const content = await readFile(join(currentDir, \"SKILL.md\"), \"utf-8\");\n const { data } = matter(content);\n if (data.name && data.description && !seen.has(data.name as string)) {\n seen.add(data.name as string);\n skills.push({\n name: data.name as string,\n description: (data.description as string).trim(),\n sourceDir: currentDir,\n });\n }\n return;\n } catch {\n // No SKILL.md here — scan subdirectories\n }\n\n try {\n const entries = await readdir(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || SKIP_DIRS.has(entry.name)) continue;\n await scan(join(currentDir, entry.name), depth + 1);\n }\n } catch {\n // Can't read directory\n }\n }\n\n await scan(dir, 0);\n return skills;\n}\n\nasync function fetchSource(\n source: string,\n): Promise<{ dir: string; isTemp: boolean }> {\n const parsed = parseSource(source);\n\n if (!parsed.url.startsWith(\"https://\") && !parsed.url.startsWith(\"git@\")) {\n return { dir: parsed.url, isTemp: false };\n }\n\n const tmpDir = await mkdtemp(join(tmpdir(), \"wellgrow-skills-\"));\n const args = [\"clone\", \"--depth\", \"1\"];\n if (parsed.ref) {\n args.push(\"--branch\", parsed.ref);\n }\n args.push(parsed.url, tmpDir);\n\n try {\n await execFileAsync(\"git\", args, { timeout: 30_000 });\n } catch (error) {\n await rm(tmpDir, { recursive: true, force: true }).catch(() => {});\n throw new Error(\n `リポジトリのクローンに失敗: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n return { dir: tmpDir, isTemp: true };\n}\n\nexport function registerSkillsCommand(program: Command): void {\n const skills = program\n .command(\"skills\")\n .description(\"スキルの管理\");\n\n // --- add ---\n skills\n .command(\"add <source>\")\n .description(\"GitHub リポジトリからスキルをインストール\")\n .option(\"-s, --skill <names...>\", \"特定のスキルのみインストール\")\n .option(\"-l, --list\", \"インストールせずにスキル一覧を表示\")\n .action(async (source: string, opts: { skill?: string[]; list?: boolean }) => {\n process.stdout.write(`\\n📦 ${source} からスキルを取得中...\\n`);\n\n let fetched: { dir: string; isTemp: boolean } | null = null;\n try {\n fetched = await fetchSource(source);\n\n const found = await discoverSkillsInRepo(fetched.dir);\n if (found.length === 0) {\n process.stderr.write(\"スキルが見つかりませんでした。\\n\");\n return;\n }\n\n if (opts.list) {\n process.stdout.write(\n `\\n${found.length} 個のスキルが見つかりました:\\n\\n`,\n );\n for (const s of found) {\n process.stdout.write(` ${s.name}\\n ${s.description}\\n\\n`);\n }\n return;\n }\n\n let toInstall = found;\n if (opts.skill) {\n const names = new Set(opts.skill);\n toInstall = found.filter((s) => names.has(s.name));\n const missing = opts.skill.filter(\n (n) => !found.some((s) => s.name === n),\n );\n if (missing.length > 0) {\n process.stderr.write(\n `⚠ 見つからないスキル: ${missing.join(\", \")}\\n`,\n );\n }\n }\n\n if (toInstall.length === 0) {\n process.stderr.write(\"インストールするスキルがありません。\\n\");\n return;\n }\n\n await mkdir(SKILLS_DIR, { recursive: true });\n\n process.stdout.write(\n `\\n${toInstall.length} 個のスキルをインストール:\\n\\n`,\n );\n for (const skill of toInstall) {\n const dest = join(SKILLS_DIR, skill.name);\n await cp(skill.sourceDir, dest, { recursive: true, force: true });\n process.stdout.write(` ✓ ${skill.name}\\n`);\n }\n\n process.stdout.write(\n `\\n✅ ${SKILLS_DIR} にインストールしました。\\n`,\n );\n } catch (error) {\n process.stderr.write(\n `✗ ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exitCode = 1;\n } finally {\n if (fetched?.isTemp) {\n await rm(fetched.dir, { recursive: true, force: true }).catch(\n () => {},\n );\n }\n }\n });\n\n // --- list ---\n skills\n .command(\"list\")\n .alias(\"ls\")\n .description(\"インストール済みスキルを一覧表示\")\n .action(async () => {\n let dirs: string[];\n try {\n const entries = await readdir(SKILLS_DIR, { withFileTypes: true });\n dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n dirs = [];\n }\n\n if (dirs.length === 0) {\n process.stdout.write(\"インストール済みのスキルはありません。\\n\");\n return;\n }\n\n process.stdout.write(`\\n${dirs.length} 個のスキル (${SKILLS_DIR}):\\n\\n`);\n for (const name of dirs) {\n try {\n const content = await readFile(\n join(SKILLS_DIR, name, \"SKILL.md\"),\n \"utf-8\",\n );\n const { data } = matter(content);\n process.stdout.write(\n ` ${data.name ?? name}\\n ${(data.description as string | undefined)?.trim() ?? \"\"}\\n\\n`,\n );\n } catch {\n process.stdout.write(` ${name}\\n (SKILL.md なし)\\n\\n`);\n }\n }\n });\n\n // --- remove ---\n skills\n .command(\"remove <name>\")\n .alias(\"rm\")\n .description(\"スキルを削除\")\n .action(async (name: string) => {\n const skillDir = join(SKILLS_DIR, name);\n try {\n await stat(skillDir);\n } catch {\n process.stderr.write(`スキル \"${name}\" が見つかりません。\\n`);\n process.exitCode = 1;\n return;\n }\n\n await rm(skillDir, { recursive: true, force: true });\n process.stdout.write(`✓ ${name} を削除しました。\\n`);\n });\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { render, Box, Text, useInput } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport { createElement } from \"react\";\nimport { colors } from \"./colors.js\";\n\nexport interface OnboardingResult {\n name: string;\n apiKey: string | null;\n}\n\ninterface Props {\n onComplete: (result: OnboardingResult) => void;\n}\n\ntype Step =\n | \"welcome\"\n | \"name\"\n | \"nameSubmitted\"\n | \"apiKeyCheck\"\n | \"apiKeyMethod\"\n | \"setupTokenGuide\"\n | \"setupTokenInput\"\n | \"apiKeyInput\"\n | \"apiKeySubmitted\"\n | \"saving\"\n | \"done\";\n\nexport type ApiKeyMethod = \"setup-token\" | \"api-key\";\n\nexport function isValidName(value: string): boolean {\n return value.trim().length > 0;\n}\n\nexport function isValidApiKey(value: string): boolean {\n const trimmed = value.trim();\n return trimmed.length > 0 && trimmed.startsWith(\"sk-ant-\");\n}\n\n// ink-text-input v6 has a paste truncation bug on Linux/WSL where long pasted\n// strings are split across multiple input events, losing characters (Issue #90).\n// This component uses useInput directly to handle paste correctly.\nfunction MaskedInput({ onSubmit, placeholder }: { onSubmit: (value: string) => void; placeholder?: string }) {\n const [value, setValue] = useState(\"\");\n\n useInput((input, key) => {\n if (key.return) {\n onSubmit(value);\n return;\n }\n if (key.backspace || key.delete) {\n setValue((prev) => prev.slice(0, -1));\n return;\n }\n if (key.ctrl || key.meta || key.escape || key.upArrow || key.downArrow || key.leftArrow || key.rightArrow || key.tab) {\n return;\n }\n setValue((prev) => prev + input);\n });\n\n if (value.length === 0 && placeholder) {\n return <Text dimColor>{placeholder}</Text>;\n }\n return <Text>{\"*\".repeat(value.length)}</Text>;\n}\n\nconst API_KEY_OPTIONS: { id: ApiKeyMethod; label: string; description: string }[] = [\n {\n id: \"setup-token\",\n label: \"setup-token\",\n description: \"Claude Code を使っている方に推奨\",\n },\n {\n id: \"api-key\",\n label: \"API キー\",\n description: \"Anthropic API キーを直接入力\",\n },\n];\n\nfunction BotMessage({ children }: { children: React.ReactNode }) {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n {children}\n </Box>\n );\n}\n\nfunction UserMessage({ text }: { text: string }) {\n return (\n <Box\n borderStyle=\"bold\"\n borderLeft\n borderTop={false}\n borderBottom={false}\n borderRight={false}\n borderColor={colors.joy}\n paddingLeft={1}\n marginBottom={1}\n >\n <Text>{text}</Text>\n </Box>\n );\n}\n\ninterface MethodSelectorProps {\n onSelect: (method: ApiKeyMethod) => void;\n}\n\nfunction MethodSelector({ onSelect }: MethodSelectorProps) {\n const [cursor, setCursor] = useState(0);\n\n useInput((_input, key) => {\n if (key.upArrow) setCursor((prev) => Math.max(0, prev - 1));\n if (key.downArrow) setCursor((prev) => Math.min(API_KEY_OPTIONS.length - 1, prev + 1));\n if (key.return) onSelect(API_KEY_OPTIONS[cursor].id);\n });\n\n return (\n <Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n {API_KEY_OPTIONS.map((opt, i) => {\n const active = i === cursor;\n return (\n <Box key={opt.id}>\n <Text color={active ? colors.joy : undefined} bold={active}>\n {active ? \"❯ \" : \" \"}\n {opt.label}\n </Text>\n <Text color={colors.fog}> — {opt.description}</Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nfunction OnboardingWizard({ onComplete }: Props) {\n const [step, setStep] = useState<Step>(\"welcome\");\n const [name, setName] = useState(\"\");\n const [nameValue, setNameValue] = useState(\"\");\n const [apiKey, setApiKey] = useState(\"\");\n const [hasEnvKey, setHasEnvKey] = useState(false);\n const [chosenMethod, setChosenMethod] = useState<ApiKeyMethod | null>(null);\n\n useEffect(() => {\n const timer = setTimeout(() => setStep(\"name\"), 800);\n return () => clearTimeout(timer);\n }, []);\n\n useEffect(() => {\n if (step === \"nameSubmitted\") {\n const timer = setTimeout(() => {\n if (process.env.ANTHROPIC_API_KEY) {\n setHasEnvKey(true);\n setStep(\"apiKeyCheck\");\n } else {\n setStep(\"apiKeyMethod\");\n }\n }, 400);\n return () => clearTimeout(timer);\n }\n\n if (step === \"apiKeyCheck\") {\n const timer = setTimeout(() => setStep(\"saving\"), 800);\n return () => clearTimeout(timer);\n }\n\n if (step === \"apiKeySubmitted\") {\n const timer = setTimeout(() => setStep(\"saving\"), 400);\n return () => clearTimeout(timer);\n }\n\n if (step === \"saving\") {\n const timer = setTimeout(() => setStep(\"done\"), 600);\n return () => clearTimeout(timer);\n }\n\n if (step === \"done\") {\n const timer = setTimeout(() => {\n onComplete({\n name,\n apiKey: hasEnvKey ? null : apiKey || null,\n });\n }, 400);\n return () => clearTimeout(timer);\n }\n }, [step, name, apiKey, hasEnvKey, onComplete]);\n\n const handleNameSubmit = useCallback((value: string) => {\n if (!isValidName(value)) return;\n setName(value.trim());\n setStep(\"nameSubmitted\");\n }, []);\n\n const handleMethodSelect = useCallback((method: ApiKeyMethod) => {\n setChosenMethod(method);\n if (method === \"setup-token\") {\n setStep(\"setupTokenGuide\");\n } else {\n setStep(\"apiKeyInput\");\n }\n }, []);\n\n const handleApiKeySubmit = useCallback((value: string) => {\n const trimmed = value.trim();\n if (trimmed.length === 0) return;\n if (chosenMethod === \"api-key\" && !trimmed.startsWith(\"sk-ant-\")) return;\n setApiKey(trimmed);\n setStep(\"apiKeySubmitted\");\n }, [chosenMethod]);\n\n const pastNameSteps: Step[] = [\n \"nameSubmitted\", \"apiKeyCheck\", \"apiKeyMethod\",\n \"setupTokenGuide\", \"setupTokenInput\",\n \"apiKeyInput\", \"apiKeySubmitted\", \"saving\", \"done\",\n ];\n\n const pastMethodSteps: Step[] = [\n \"setupTokenGuide\", \"setupTokenInput\",\n \"apiKeyInput\", \"apiKeySubmitted\", \"saving\", \"done\",\n ];\n\n return (\n <Box flexDirection=\"column\">\n <BotMessage>\n <Text>やっほぉー!✨ ようこそ!</Text>\n <Text>あなただけのAIアシスタントをセットアップしよう 😊</Text>\n </BotMessage>\n\n {step === \"welcome\" && (\n <Text color={colors.fog}>...</Text>\n )}\n\n {step !== \"welcome\" && (\n <BotMessage>\n <Text>まず、お名前を教えてくれるかな? 🌈</Text>\n </BotMessage>\n )}\n\n {step === \"name\" && (\n <Box>\n <Text color={colors.joy}>{\"❯ \"}</Text>\n <TextInput\n value={nameValue}\n onChange={setNameValue}\n onSubmit={handleNameSubmit}\n placeholder=\"名前を入力...\"\n />\n </Box>\n )}\n\n {name && <UserMessage text={name} />}\n\n {pastNameSteps.includes(step) && (\n <BotMessage>\n <Text>{name}さんだね!よろしくね〜!🎉</Text>\n </BotMessage>\n )}\n\n {/* API key method selection */}\n {step === \"apiKeyMethod\" && (\n <>\n <BotMessage>\n <Text>次に、AIと会話するためのAPIキーを設定するよ!💪</Text>\n <Text>取得方法を選んでね:</Text>\n </BotMessage>\n <MethodSelector onSelect={handleMethodSelect} />\n </>\n )}\n\n {/* Show chosen method as user message */}\n {chosenMethod && pastMethodSteps.includes(step) && (\n <UserMessage\n text={chosenMethod === \"setup-token\" ? \"setup-token\" : \"API キー\"}\n />\n )}\n\n {/* setup-token guide */}\n {step === \"setupTokenGuide\" && (\n <BotMessage>\n <Text>別のターミナルで、このコマンドを実行してね:</Text>\n <Text />\n <Text color={colors.insight}>{\" $ \"}<Text bold>claude setup-token</Text></Text>\n <Text />\n <Text>出てきた sk-ant- で始まるAPIキーを貼り付けてね!✨</Text>\n <Text color={colors.fog}>(※ Authentication Code じゃなくて、その後に表示されるAPIキーだよ)</Text>\n </BotMessage>\n )}\n\n {(step === \"setupTokenGuide\" || step === \"setupTokenInput\") && (\n <Box>\n <Text color={colors.joy}>{\"❯ \"}</Text>\n <MaskedInput onSubmit={handleApiKeySubmit} placeholder=\"sk-ant-...\" />\n </Box>\n )}\n\n {/* Direct API key input */}\n {step === \"apiKeyInput\" && (\n <>\n <BotMessage>\n <Text>Anthropic の API キーを入力してね!</Text>\n <Text />\n <Text color={colors.insight}>\n {\"💡 \"}\n <Text color={colors.flow} underline>\n https://console.anthropic.com/settings/keys\n </Text>\n {\" から取得できるよ\"}\n </Text>\n </BotMessage>\n <Box>\n <Text color={colors.joy}>{\"❯ \"}</Text>\n <MaskedInput onSubmit={handleApiKeySubmit} placeholder=\"sk-ant-...\" />\n </Box>\n </>\n )}\n\n {step === \"apiKeySubmitted\" && (\n <BotMessage>\n <Text>APIキーを設定してるよ... ⏳</Text>\n </BotMessage>\n )}\n\n {step === \"apiKeyCheck\" && (\n <BotMessage>\n <Text color={colors.growth}>{\"✓ \"}<Text>APIキーはもう設定されてるね!</Text></Text>\n </BotMessage>\n )}\n\n {(step === \"saving\" || step === \"done\") && (\n <BotMessage>\n <Text color={colors.growth}>{\"✓ \"}<Text>設定完了!わぉおぉぉ!🎊</Text></Text>\n <Text />\n <Text>これからAIアシスタントがセットアップの続きをお手伝いするね!✨</Text>\n </BotMessage>\n )}\n\n {step === \"done\" && (\n <Text color={colors.fog}>──────────────────────────────────────</Text>\n )}\n </Box>\n );\n}\n\nexport async function runOnboardingWizard(): Promise<OnboardingResult> {\n return new Promise((resolve) => {\n const { unmount } = render(\n createElement(OnboardingWizard, {\n onComplete: (result) => {\n unmount();\n resolve(result);\n },\n }),\n );\n });\n}\n"],"mappings":"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","names":["render","createElement","randomUUID","retryable","resolve","appendFile","mkdir","join","homedir","tool","z","z","resolve","join","readFile","join","homedir","parse","z","join","homedir","join","readFile","parse","readdir","join","homedir","readFile","z","inputSchema","z","readFile","writeFile","readFile","mkdir","createHash","z","inputSchema","z","readFile","mkdir","writeFile","createHash","readFile","writeFile","createHash","structuredPatch","execFile","promisify","z","execFileAsync","promisify","execFile","createHash","generateStructuredPatch","structuredPatch","getGitDiff","inputSchema","z","readFile","writeFile","writeFile","mkdir","join","homedir","createHash","z","mkdir","homedir","resolve","inputSchema","z","timeout","createHash","join","writeFile","stat","resolve","z","inputSchema","z","resolve","stat","execFile","promisify","z","execFileAsync","promisify","execFile","inputSchema","z","z","inputSchema","z","readFile","join","homedir","readFile","writeFile","mkdir","join","homedir","randomUUID","resolve","readFile","join","homedir","readFile","readdir","join","resolve","homedir","readFile","readdir","stat","join","homedir","spawn","z","z","expandTilde","join","homedir","readFile","stat","readdir","resolve","spawn","join","appendFile","readFile","mkdir","readdir","join","homedir","randomUUID","useMemo","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsxs","TodoList","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","useInput","jsx","jsxs","tool","useInput","Box","Text","useState","useMemo","Box","Text","useInput","jsx","jsxs","useState","useMemo","useInput","Box","Text","useState","Text","jsx","jsxs","useState","Text","useState","useCallback","useRef","useEffect","useInput","useState","useEffect","useCallback","randomUUID","useState","useEffect","randomUUID","useCallback","switchAgent","useState","useCallback","useRef","randomUUID","useState","useCallback","useState","useCallback","switchAgent","useCallback","useState","useRef","useInput","resolve","useEffect","jsx","jsxs","useMemo","Box","Text","program","resolve","program","platform","platform","tool","program","readFile","readdir","mkdir","rm","stat","join","resolve","homedir","execFile","promisify","matter","execFileAsync","WELLGROW_HOME","program","useState","useEffect","useCallback","Box","Text","useInput","TextInput","Fragment","jsx","jsxs","useState","useInput","jsx","Text","Box","jsxs","useEffect","useCallback","TextInput","Fragment","resolve","randomUUID","config","verbose","render","createElement"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config/index.ts","../src/config/types.ts","../src/core/agent-loop.ts","../src/ai/retry.ts","../src/ai/cache.ts","../src/logging.ts","../src/tools/errors.ts","../src/core/tool-executor.ts","../src/core/context.ts","../src/tools/ask-user.ts","../src/tools/definition.ts","../src/agents/resolver.ts","../src/agents/loader.ts","../src/agents/types.ts","../src/ai/template-vars.ts","../src/ai/system-prompt.ts","../src/tools/registry.ts","../src/tools/read.ts","../src/tools/constants.ts","../src/tools/write.ts","../src/tools/edit.ts","../src/tools/bash.ts","../src/signals.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/todo-write.ts","../src/tools/index.ts","../src/tools/pipeline.ts","../src/ai/providers.ts","../src/extensions/mcp.ts","../src/extensions/oauth.ts","../src/extensions/skills.ts","../src/core/session.ts","../src/core/history.ts","../src/ui/app.tsx","../src/ui/header.tsx","../src/ui/colors.ts","../src/ui/message-list.tsx","../src/ui/markdown.ts","../src/ui/todo-list.tsx","../src/ui/ask-user-prompt.tsx","../src/ui/approval-prompt.tsx","../src/ui/input-prompt.tsx","../src/ui/thinking-indicator.tsx","../src/hooks/use-chat.ts","../src/hooks/use-chat-session.ts","../src/hooks/use-chat-messages.ts","../src/hooks/use-ask-user-queue.ts","../src/hooks/slash-commands.ts","../src/commands/config.ts","../src/commands/history.ts","../src/commands/doctor.ts","../src/commands/skills.ts","../src/ui/onboarding-wizard.tsx"],"sourcesContent":["import { render } from \"ink\";\nimport { createElement } from \"react\";\nimport { Command } from \"commander\";\nimport { randomUUID } from \"node:crypto\";\nimport { loadConfig, initConfig, isFirstRun, saveOnboardingResult, ConfigLoadError } from \"./config/index.js\";\nimport { createSession, sendMessage } from \"./core/session.js\";\nimport { getModelDisplayName } from \"./ai/providers.js\";\nimport { createSessionRecorder } from \"./core/history.js\";\nimport { formatErrorMessage } from \"./ai/retry.js\";\nimport { initLogger } from \"./logging.js\";\nimport { App } from \"./ui/app.js\";\nimport { setupSignalHandlers, createAbortController, setActiveSession } from \"./signals.js\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerHistoryCommand } from \"./commands/history.js\";\nimport { registerInitCommand } from \"./commands/init.js\";\nimport { registerDoctorCommand } from \"./commands/doctor.js\";\nimport { registerSkillsCommand } from \"./commands/skills.js\";\nimport { runOnboardingWizard } from \"./ui/onboarding-wizard.js\";\nimport type { Mode } from \"./tools/pipeline.js\";\n\ndeclare const PKG_VERSION: string;\n\nconst VALID_MODES: Mode[] = [\"plan\", \"auto\"];\n\nasync function readStdin(): Promise<string> {\n if (process.stdin.isTTY) return \"\";\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n return Buffer.concat(chunks).toString(\"utf-8\").trim();\n}\n\nasync function runOneShot(\n effectivePrompt: string,\n opts: { model?: string; agent?: string; mode?: string; verbose?: boolean },\n): Promise<void> {\n const config = await loadConfig();\n const agentName = opts.agent ?? config.default.agent;\n const mode = (opts.mode as Mode | undefined) ?? config.default.mode;\n\n const session = await createSession({\n agentName,\n modelOverride: opts.model,\n modeOverride: mode,\n });\n setActiveSession(session.ctx, session.agent.hookEngine);\n\n const verbose = opts.verbose ?? config.logging.verbose;\n if (verbose) {\n session.ctx.logFile = await initLogger(randomUUID(), config.logging.log_dir);\n }\n\n const modelName = getModelDisplayName(session.agent.modelId);\n const recorder = await createSessionRecorder(modelName, agentName);\n await recorder.recordUser(effectivePrompt);\n\n if (mode === \"plan\") {\n process.stderr.write(\n \"Policy: one-shot の plan モードでは承認が必要なツール実行を自動拒否します。\\n\",\n );\n }\n\n const ac = createAbortController(session.ctx.abort, config.api.timeout);\n let lastText = \"\";\n try {\n const result = await sendMessage(session, effectivePrompt, {\n onMessageUpdate: (parts) => {\n const text = parts\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n const delta = text.slice(lastText.length);\n if (delta) process.stdout.write(delta);\n lastText = text;\n },\n onRetry: (attempt, maxRetries, delayMs) => {\n process.stderr.write(\n `⟳ API エラー。リトライ中... (${attempt}/${maxRetries}, ${Math.round(delayMs / 1000)}秒後)\\n`,\n );\n },\n onContextExceeded: () => {\n process.stderr.write(\n \"コンテキストウィンドウの上限に達しました。入力を短くして再試行してください。\\n\",\n );\n },\n onApprovalRequest:\n mode === \"plan\"\n ? async () => ({ action: \"deny\" as const })\n : undefined,\n }, {\n abortSignal: ac.signal,\n maxRetries: config.api.max_retries,\n maxOutputTokens: config.default.max_output_tokens,\n });\n process.stdout.write(\"\\n\");\n\n await recorder.recordAssistant(result.fullText);\n await recorder.finalize(2);\n } catch (error) {\n process.stderr.write(`\\nError: ${formatErrorMessage(error)}\\n`);\n process.exitCode = 1;\n }\n}\n\nconst program = new Command();\n\nprogram\n .name(\"wellgrow\")\n .description(\"WellGrow CLI — AI chat assistant\")\n .version(PKG_VERSION)\n .argument(\"[prompt]\", \"ワンショット質問(省略でインタラクティブモード)\")\n .option(\"--model <model>\", \"使用するモデル\")\n .option(\"-a, --agent <agent>\", \"使用するエージェント\")\n .option(\n \"--mode <mode>\",\n \"モード (plan, auto)\",\n )\n .option(\"--verbose\", \"詳細ログを出力\")\n .option(\"-p, --pipe\", \"パイプ入力モード(stdinからの入力を受け付ける)\")\n .action(async (prompt: string | undefined, opts: { model?: string; agent?: string; mode?: string; verbose?: boolean; pipe?: boolean }) => {\n try {\n setupSignalHandlers();\n\n const firstRun = await isFirstRun();\n\n if (firstRun && !prompt && !opts.pipe) {\n const result = await runOnboardingWizard();\n await saveOnboardingResult(result);\n await initConfig();\n const config = await loadConfig();\n const verbose = opts.verbose ?? config.logging.verbose;\n render(createElement(App, {\n agentName: \"wellgrow-onboarding\",\n config,\n initialMessage: \"セットアップを始めてください\",\n verbose,\n }));\n return;\n }\n\n await initConfig();\n\n if (opts.mode && !VALID_MODES.includes(opts.mode as Mode)) {\n process.stderr.write(\n `Error: 無効なモードです: ${opts.mode}\\n有効な値: ${VALID_MODES.join(\", \")}\\n`,\n );\n process.exit(1);\n }\n\n if (opts.pipe) {\n const stdinData = await readStdin();\n const effectivePrompt = prompt && stdinData\n ? `${prompt}\\n\\n${stdinData}`\n : stdinData || prompt;\n if (!effectivePrompt) {\n process.stderr.write(\"Error: -p オプション使用時はパイプ入力またはプロンプトが必要です\\n\");\n process.exit(1);\n }\n await runOneShot(effectivePrompt, opts);\n return;\n }\n\n if (prompt) {\n await runOneShot(prompt, opts);\n return;\n }\n\n const config = await loadConfig();\n const verbose = opts.verbose ?? config.logging.verbose;\n const mode = opts.mode as Mode | undefined;\n render(createElement(App, {\n agentName: opts.agent,\n modelOverride: opts.model,\n config,\n mode,\n verbose,\n }));\n } catch (error) {\n if (error instanceof ConfigLoadError) {\n process.stderr.write(`Error: ${error.message}\\n`);\n } else {\n process.stderr.write(\n `Error: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n }\n process.exit(1);\n }\n });\n\nregisterConfigCommand(program);\nregisterHistoryCommand(program);\nregisterInitCommand(program);\nregisterDoctorCommand(program);\nregisterSkillsCommand(program);\n\nprogram.parse();\n","import { readFile, writeFile, mkdir, appendFile, access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { parse, stringify } from \"smol-toml\";\nimport { wellGrowConfigSchema, type WellGrowConfig } from \"./types.js\";\n\nexport interface OnboardingResult {\n name: string;\n apiKey: string | null;\n}\n\nconst CONFIG_DIR = join(homedir(), \".wellgrow\");\nconst CONFIG_PATH = join(CONFIG_DIR, \"config.toml\");\n\nexport class ConfigLoadError extends Error {\n readonly cause: unknown;\n\n constructor(message: string, cause: unknown) {\n super(message);\n this.name = \"ConfigLoadError\";\n this.cause = cause;\n }\n}\n\nconst DEFAULT_CONFIG: WellGrowConfig = {\n default: {\n model: \"claude-opus-4-6\",\n provider: \"anthropic\",\n agent: \"joy\",\n mode: \"auto\",\n max_turns: 100,\n max_output_tokens: 16384,\n },\n permissions: {\n allowed_mcps: [],\n },\n providers: {\n anthropic: { api_key_env: \"ANTHROPIC_API_KEY\" },\n google: { api_key_env: \"GOOGLE_GENERATIVE_AI_API_KEY\" },\n openai: { api_key_env: \"OPENAI_API_KEY\" },\n },\n api: {\n max_retries: 2,\n timeout: 600000,\n },\n skills: {\n paths: [],\n },\n mcp: {\n paths: [],\n },\n logging: {\n verbose: false,\n log_dir: \"~/.wellgrow/logs\",\n },\n history: {\n storage: \"local\",\n max_sessions: 1000,\n },\n};\n\nexport async function loadConfig(): Promise<WellGrowConfig> {\n let content: string;\n try {\n content = await readFile(CONFIG_PATH, \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return DEFAULT_CONFIG;\n }\n throw new ConfigLoadError(\n `設定ファイルを読み込めませんでした: ${CONFIG_PATH}`,\n error,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = parse(content);\n } catch (error) {\n throw new ConfigLoadError(\n `設定ファイルの TOML 形式が不正です: ${CONFIG_PATH}`,\n error,\n );\n }\n\n try {\n const merged = deepMerge(DEFAULT_CONFIG, parsed as Partial<WellGrowConfig>);\n return wellGrowConfigSchema.parse(merged);\n } catch (error) {\n throw new ConfigLoadError(\n `設定ファイルの内容が不正です: ${CONFIG_PATH}`,\n error,\n );\n }\n}\n\nexport async function ensureConfigDir(): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n}\n\nexport async function initConfig(): Promise<void> {\n await ensureConfigDir();\n try {\n await readFile(CONFIG_PATH, \"utf-8\");\n } catch {\n await writeFile(CONFIG_PATH, stringify(DEFAULT_CONFIG as unknown as Record<string, unknown>), \"utf-8\");\n }\n\n const { autoInitIfNeeded } = await import(\"../commands/init.js\");\n await autoInitIfNeeded();\n}\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nexport async function isFirstRun(): Promise<boolean> {\n try {\n await access(CONFIG_PATH);\n return false;\n } catch {\n return true;\n }\n}\n\nexport async function saveOnboardingResult(result: OnboardingResult): Promise<void> {\n const config = { ...DEFAULT_CONFIG, user: { name: result.name } };\n await mkdir(CONFIG_DIR, { recursive: true });\n await writeFile(CONFIG_PATH, stringify(config as unknown as Record<string, unknown>), \"utf-8\");\n\n if (result.apiKey) {\n process.env.ANTHROPIC_API_KEY = result.apiKey;\n const rcFile = process.env.SHELL?.includes(\"zsh\")\n ? join(homedir(), \".zshrc\")\n : join(homedir(), \".bashrc\");\n await appendFile(rcFile, `\\nexport ANTHROPIC_API_KEY=\"${result.apiKey}\"\\n`, \"utf-8\");\n }\n}\n\nexport async function updateConfigField(\n section: string,\n key: string,\n value: unknown,\n): Promise<void> {\n const content = await readFile(CONFIG_PATH, \"utf-8\");\n const parsed = parse(content) as Record<string, unknown>;\n const sectionObj = (parsed[section] ?? {}) as Record<string, unknown>;\n sectionObj[key] = value;\n parsed[section] = sectionObj;\n await writeFile(CONFIG_PATH, stringify(parsed), \"utf-8\");\n}\n\nexport async function addAllowedMcp(serverName: string): Promise<void> {\n const config = await loadConfig();\n if (config.permissions.allowed_mcps.includes(serverName)) return;\n const updated = [...config.permissions.allowed_mcps, serverName];\n await updateConfigField(\"permissions\", \"allowed_mcps\", updated);\n}\n\nfunction deepMerge<T>(base: T, override: Partial<T>): T {\n const result = { ...base } as Record<string, unknown>;\n const src = override as Record<string, unknown>;\n for (const key of Object.keys(src)) {\n const val = src[key];\n if (val && typeof val === \"object\" && !Array.isArray(val) && typeof result[key] === \"object\") {\n result[key] = deepMerge(\n result[key] as Record<string, unknown>,\n val as Record<string, unknown>,\n );\n } else if (val !== undefined) {\n result[key] = val;\n }\n }\n return result as T;\n}\n","import { z } from \"zod\";\n\nconst providerConfigSchema = z.object({\n api_key: z.string().optional(),\n api_key_env: z.string(),\n});\n\nexport const wellGrowConfigSchema = z.object({\n default: z.object({\n model: z.string(),\n provider: z.string(),\n agent: z.string(),\n mode: z.enum([\"plan\", \"auto\"]),\n max_turns: z.number().int().positive(),\n max_output_tokens: z.number().int().positive(),\n }),\n permissions: z.object({\n allowed_mcps: z.array(z.string()),\n }),\n providers: z.object({\n anthropic: providerConfigSchema.optional(),\n google: providerConfigSchema.optional(),\n openai: providerConfigSchema.optional(),\n }),\n api: z.object({\n max_retries: z.number().int().nonnegative(),\n timeout: z.number().int().positive(),\n }),\n skills: z.object({\n paths: z.array(z.string()),\n }),\n mcp: z.object({\n paths: z.array(z.string()),\n }),\n user: z.object({\n name: z.string().optional(),\n }).optional(),\n logging: z.object({\n verbose: z.boolean(),\n log_dir: z.string(),\n }),\n history: z.object({\n storage: z.string(),\n max_sessions: z.number().int().positive(),\n }),\n});\n\nexport type WellGrowConfig = z.infer<typeof wellGrowConfigSchema>;\n","import {\n streamText,\n type ModelMessage,\n type ToolModelMessage,\n} from \"ai\";\nimport type { LanguageModel } from \"ai\";\nimport type { MessagePart } from \"../ui/message-list.js\";\nimport { evaluateRetry, sleep } from \"../ai/retry.js\";\nimport { prepareCachedMessages, type TurnUsage } from \"../ai/cache.js\";\nimport {\n logRequest,\n logResponse,\n logUsage,\n logRetry,\n} from \"../logging.js\";\nimport {\n executeToolCalls,\n type ToolExecutorConfig,\n type ToolExecutorCallbacks,\n type ToolCall,\n} from \"./tool-executor.js\";\n\nexport type {\n ToolCall,\n ToolExecutorConfig,\n ToolExecutorCallbacks,\n} from \"./tool-executor.js\";\n\nconst DEFAULT_MAX_TURNS = 100;\nconst TEXT_FLUSH_INTERVAL = 30;\nconst FIRST_FLUSH_INTERVAL = 4;\nconst TEXT_PART_SPLIT_THRESHOLD = 1500;\n\nexport interface AgentLoopCallbacks extends ToolExecutorCallbacks {\n onRetry?: (attempt: number, maxRetries: number, delayMs: number) => void;\n onContextExceeded?: () => void;\n onUsage?: (usage: TurnUsage) => void;\n}\n\nexport interface AgentLoopConfig extends ToolExecutorConfig {\n model: LanguageModel;\n system: string;\n maxTurns?: number;\n maxRetries?: number;\n maxOutputTokens?: number;\n isAbortedByUser?: () => boolean;\n}\n\nexport async function runAgentLoop(\n messages: ModelMessage[],\n config: AgentLoopConfig,\n callbacks: AgentLoopCallbacks,\n): Promise<{ fullText: string; parts: MessagePart[] }> {\n let turnsUsed = 0;\n const maxTurns = config.maxTurns ?? DEFAULT_MAX_TURNS;\n let fullText = \"\";\n const parts: MessagePart[] = [];\n\n while (turnsUsed < maxTurns) {\n if (turnsUsed > 0) {\n parts.push({ type: \"step-start\" });\n callbacks.onMessageUpdate([...parts]);\n }\n\n const turnResult = await executeTurn(messages, config, callbacks, parts);\n\n fullText += turnResult.text;\n\n if (turnResult.finishReason !== \"tool-calls\") {\n break;\n }\n\n const toolResults = await executeToolCalls(\n turnResult.toolCalls,\n parts,\n config,\n callbacks,\n );\n\n const toolMessage: ToolModelMessage = {\n role: \"tool\",\n content: toolResults,\n };\n messages.push(toolMessage);\n\n turnsUsed++;\n }\n\n return { fullText, parts };\n}\n\n// ---------------------------------------------------------------------------\n// Turn execution with retry\n// ---------------------------------------------------------------------------\n\ninterface TurnResult {\n text: string;\n finishReason: string;\n toolCalls: ToolCall[];\n}\n\nasync function executeTurn(\n messages: ModelMessage[],\n config: AgentLoopConfig,\n callbacks: AgentLoopCallbacks,\n parts: MessagePart[],\n): Promise<TurnResult> {\n const maxRetries = config.maxRetries ?? 2;\n let attempt = 0;\n\n while (true) {\n try {\n return await streamTurn(messages, config, callbacks, parts);\n } catch (error) {\n const retryResult = evaluateRetry(error, attempt, {\n maxRetries,\n isAbortedByUser: config.isAbortedByUser,\n });\n\n if (retryResult.isUserAborted) {\n return { text: \"\", finishReason: \"stop\", toolCalls: [] };\n }\n\n if (retryResult.isContextExceeded) {\n callbacks.onContextExceeded?.();\n return {\n text: retryResult.errorMessage,\n finishReason: \"stop\",\n toolCalls: [],\n };\n }\n\n if (!retryResult.shouldRetry) {\n throw error;\n }\n\n callbacks.onRetry?.(attempt + 1, maxRetries, retryResult.delay);\n if (config.logFile) {\n logRetry(config.logFile, attempt + 1, maxRetries, retryResult.delay);\n }\n await sleep(retryResult.delay);\n attempt++;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Streaming helpers\n// ---------------------------------------------------------------------------\n\nfunction appendText(parts: MessagePart[], text: string): void {\n const last = parts[parts.length - 1];\n if (last?.type === \"text\" && last.state === \"streaming\") {\n last.text += text;\n if (last.text.length > TEXT_PART_SPLIT_THRESHOLD) {\n const splitPos = findParagraphBoundary(last.text);\n if (splitPos > 0) {\n const remainder = last.text.slice(splitPos);\n last.text = last.text.slice(0, splitPos);\n last.state = \"done\";\n parts.push({ type: \"text\", text: remainder, state: \"streaming\" });\n }\n }\n } else {\n parts.push({ type: \"text\", text, state: \"streaming\" });\n }\n}\n\nfunction findParagraphBoundary(text: string): number {\n let fenceCount = 0;\n let lastSafeSplit = -1;\n let i = 0;\n while (i < text.length) {\n if (text.startsWith(\"```\", i)) {\n fenceCount++;\n i += 3;\n continue;\n }\n if (text.startsWith(\"\\n\\n\", i) && fenceCount % 2 === 0) {\n lastSafeSplit = i;\n }\n i++;\n }\n return lastSafeSplit > 0 ? lastSafeSplit : -1;\n}\n\nfunction appendReasoning(parts: MessagePart[], text: string): void {\n const last = parts[parts.length - 1];\n if (last?.type === \"reasoning\" && last.state === \"streaming\") {\n last.text += text;\n } else {\n parts.push({ type: \"reasoning\", text, state: \"streaming\" });\n }\n}\n\nfunction finalizeStreamingParts(parts: MessagePart[]): void {\n for (const p of parts) {\n if (\n (p.type === \"text\" || p.type === \"reasoning\") &&\n p.state === \"streaming\"\n ) {\n p.state = \"done\";\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Single streaming turn\n// ---------------------------------------------------------------------------\n\nasync function streamTurn(\n messages: ModelMessage[],\n config: AgentLoopConfig,\n callbacks: AgentLoopCallbacks,\n parts: MessagePart[],\n): Promise<TurnResult> {\n const turnStart = Date.now();\n const modelId =\n typeof config.model === \"string\"\n ? config.model\n : config.model.modelId;\n\n if (config.logFile) {\n logRequest(config.logFile, modelId);\n }\n\n const cachedMessages = prepareCachedMessages(config.system, messages);\n\n const result = streamText({\n model: config.model,\n messages: cachedMessages,\n tools: config.registry.schemas,\n maxOutputTokens: config.maxOutputTokens,\n abortSignal: config.abortSignal,\n maxRetries: 0,\n });\n\n let text = \"\";\n const toolCalls: ToolCall[] = [];\n let textBuffer = \"\";\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n let isFirstTextChunk = true;\n\n function flushTextBuffer(): void {\n if (flushTimer) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n if (!textBuffer) return;\n appendText(parts, textBuffer);\n textBuffer = \"\";\n callbacks.onMessageUpdate([...parts]);\n }\n\n for await (const chunk of result.fullStream) {\n switch (chunk.type) {\n case \"text-delta\":\n text += chunk.text;\n textBuffer += chunk.text;\n if (!flushTimer) {\n const interval = isFirstTextChunk ? FIRST_FLUSH_INTERVAL : TEXT_FLUSH_INTERVAL;\n isFirstTextChunk = false;\n flushTimer = setTimeout(flushTextBuffer, interval);\n }\n break;\n\n case \"reasoning-delta\":\n flushTextBuffer();\n appendReasoning(parts, chunk.text);\n callbacks.onMessageUpdate([...parts]);\n break;\n\n case \"tool-call\":\n flushTextBuffer();\n toolCalls.push({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n args: chunk.input as Record<string, unknown>,\n });\n parts.push({\n type: \"tool\",\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n state: \"input-available\",\n input: chunk.input,\n });\n callbacks.onMessageUpdate([...parts]);\n break;\n\n case \"source\": {\n flushTextBuffer();\n const src = chunk as unknown as Record<string, unknown>;\n if (\"url\" in src && typeof src.url === \"string\") {\n parts.push({\n type: \"source-url\",\n url: src.url,\n title: typeof src.title === \"string\" ? src.title : undefined,\n });\n callbacks.onMessageUpdate([...parts]);\n }\n break;\n }\n }\n }\n\n if (flushTimer) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n if (textBuffer) {\n appendText(parts, textBuffer);\n textBuffer = \"\";\n }\n finalizeStreamingParts(parts);\n callbacks.onMessageUpdate([...parts]);\n\n const [response, finishReason, usage] = await Promise.all([\n result.response,\n result.finishReason,\n result.usage,\n ]);\n messages.push(...(response.messages as ModelMessage[]));\n\n const turnUsage: TurnUsage = {\n inputTokens: usage.inputTokens ?? 0,\n outputTokens: usage.outputTokens ?? 0,\n cacheWriteTokens: usage.inputTokenDetails.cacheWriteTokens ?? undefined,\n cacheReadTokens: usage.inputTokenDetails.cacheReadTokens ?? undefined,\n };\n callbacks.onUsage?.(turnUsage);\n\n if (config.logFile) {\n logResponse(config.logFile, 200, Date.now() - turnStart);\n logUsage(config.logFile, turnUsage);\n }\n\n return { text, finishReason, toolCalls };\n}\n","const DEFAULT_MAX_RETRIES = 2;\nconst MAX_BACKOFF_MS = 8000;\n\ninterface RetryConfig {\n maxRetries?: number;\n isAbortedByUser?: () => boolean;\n}\n\nfunction isRetryableStatus(status: number): boolean {\n if (status === 408 || status === 409 || status === 429) return true;\n if (status >= 500) return true;\n return false;\n}\n\nfunction unwrapError(error: unknown): unknown {\n if (!error || typeof error !== \"object\") return error;\n const err = error as Record<string, unknown>;\n if (err.reason === \"maxRetriesExceeded\" && err.lastError) {\n return err.lastError;\n }\n return error;\n}\n\nfunction isRetryableError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n\n const err = error as Record<string, unknown>;\n\n if (err.statusCode && typeof err.statusCode === \"number\") {\n return isRetryableStatus(err.statusCode);\n }\n\n if (err.code === \"ECONNRESET\" || err.code === \"ETIMEDOUT\" || err.code === \"ECONNREFUSED\") {\n return true;\n }\n\n const message = String(err.message ?? \"\");\n if (message.includes(\"timeout\") || message.includes(\"ECONNRESET\")) {\n return true;\n }\n\n return false;\n}\n\nfunction getErrorStatusCode(error: unknown): number | undefined {\n if (!error || typeof error !== \"object\") return undefined;\n const code = (error as Record<string, unknown>).statusCode;\n return typeof code === \"number\" ? code : undefined;\n}\n\nexport function formatErrorMessage(error: unknown): string {\n const unwrapped = unwrapError(error);\n const status = getErrorStatusCode(unwrapped);\n\n if (status === 529 || status === 503) {\n return \"APIサーバーが混み合っています。しばらく待ってから再試行してください。\";\n }\n if (status === 429) {\n return \"APIのレート制限に達しました。しばらく待ってから再試行してください。\";\n }\n if (status === 401) {\n return \"APIキーが無効です。設定を確認してください。\";\n }\n if (status === 403) {\n return \"APIへのアクセスが拒否されました。APIキーの権限を確認してください。\";\n }\n if (status !== undefined && status >= 500) {\n return \"APIサーバーでエラーが発生しました。しばらく待ってから再試行してください。\";\n }\n\n const message = unwrapped instanceof Error ? unwrapped.message : String(unwrapped ?? \"\");\n if (message.includes(\"ECONNREFUSED\") || message.includes(\"ECONNRESET\") || message.includes(\"ETIMEDOUT\")) {\n return \"APIサーバーに接続できません。ネットワーク接続を確認してください。\";\n }\n\n if (error instanceof Error) return error.message;\n const str = error != null ? String(error) : \"\";\n return str || \"不明なエラーが発生しました\";\n}\n\nfunction isContextLengthError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n\n const err = error as Record<string, unknown>;\n const status = err.statusCode;\n const message = String(err.message ?? err.responseBody ?? \"\");\n\n return status === 400 && message.includes(\"context_length\");\n}\n\nfunction isAbortError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const err = error as Record<string, unknown>;\n return err.name === \"AbortError\" || err.code === \"ABORT_ERR\";\n}\n\nfunction getRetryDelay(attempt: number, error: unknown): number {\n const err = error as Record<string, unknown>;\n const responseHeaders = err.responseHeaders as Record<string, string> | undefined;\n\n if (responseHeaders) {\n const retryAfter = responseHeaders[\"retry-after\"];\n const retryAfterMs = responseHeaders[\"retry-after-ms\"];\n\n if (retryAfterMs) {\n const ms = parseInt(retryAfterMs);\n if (!isNaN(ms) && ms <= 60000) return ms;\n }\n if (retryAfter) {\n const seconds = parseInt(retryAfter);\n if (!isNaN(seconds) && seconds <= 60) return seconds * 1000;\n }\n }\n\n const baseDelay = 500 * Math.pow(2, attempt);\n const jitter = 0.75 + Math.random() * 0.25;\n return Math.min(baseDelay * jitter, MAX_BACKOFF_MS);\n}\n\nexport interface RetryResult {\n shouldRetry: boolean;\n isContextExceeded: boolean;\n isUserAborted: boolean;\n delay: number;\n attempt: number;\n errorMessage: string;\n}\n\nexport function evaluateRetry(\n error: unknown,\n attempt: number,\n config?: RetryConfig,\n): RetryResult {\n const maxRetries = config?.maxRetries ?? DEFAULT_MAX_RETRIES;\n const unwrapped = unwrapError(error);\n\n if (isAbortError(unwrapped)) {\n const userAborted = config?.isAbortedByUser ? config.isAbortedByUser() : true;\n if (userAborted) {\n return {\n shouldRetry: false,\n isContextExceeded: false,\n isUserAborted: true,\n delay: 0,\n attempt,\n errorMessage: \"\",\n };\n }\n const retryable = attempt < maxRetries;\n return {\n shouldRetry: retryable,\n isContextExceeded: false,\n isUserAborted: false,\n delay: retryable ? getRetryDelay(attempt, unwrapped) : 0,\n attempt,\n errorMessage: \"リクエストがタイムアウトしました\",\n };\n }\n\n if (isContextLengthError(unwrapped)) {\n return {\n shouldRetry: false,\n isContextExceeded: true,\n isUserAborted: false,\n delay: 0,\n attempt,\n errorMessage: \"コンテキストウィンドウの上限に達しました。\\n→ /clear で新しいセッションを開始してください。\",\n };\n }\n\n const retryable = isRetryableError(unwrapped) && attempt < maxRetries;\n\n return {\n shouldRetry: retryable,\n isContextExceeded: false,\n isUserAborted: false,\n delay: retryable ? getRetryDelay(attempt, unwrapped) : 0,\n attempt,\n errorMessage: formatErrorMessage(error),\n };\n}\n\nexport async function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { ModelMessage } from \"ai\";\n\nconst ANTHROPIC_CACHE_BREAKPOINT = {\n anthropic: { cacheControl: { type: \"ephemeral\" as const } },\n};\n\nexport interface TurnUsage {\n inputTokens: number;\n outputTokens: number;\n cacheWriteTokens?: number;\n cacheReadTokens?: number;\n}\n\n/**\n * Prepend a cached system message and place a cache breakpoint\n * on the last user/tool message so the conversation prefix is reused.\n *\n * Breakpoint placement (Anthropic caches everything from the start\n * up to each breakpoint):\n * 1. system message — static per session\n * 2. last user/tool — growing conversation prefix\n */\nexport function prepareCachedMessages(\n system: string,\n messages: readonly ModelMessage[],\n): ModelMessage[] {\n const systemMessage: ModelMessage = {\n role: \"system\",\n content: system,\n providerOptions: ANTHROPIC_CACHE_BREAKPOINT,\n };\n\n let lastBreakpointIdx = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n const role = messages[i].role;\n if (role === \"user\" || role === \"tool\") {\n lastBreakpointIdx = i;\n break;\n }\n }\n\n const cached = messages.map((msg, i) => {\n if (i !== lastBreakpointIdx) return msg;\n return {\n ...msg,\n providerOptions: {\n ...(msg.providerOptions ?? {}),\n ...ANTHROPIC_CACHE_BREAKPOINT,\n },\n } as ModelMessage;\n });\n\n return [systemMessage, ...cached];\n}\n","import { appendFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport async function initLogger(sessionId: string, logDir?: string): Promise<string> {\n const dir = logDir?.replace(/^~/, homedir()) ?? join(homedir(), \".wellgrow\", \"logs\");\n await mkdir(dir, { recursive: true });\n return join(dir, `${sessionId}.log`);\n}\n\nfunction timestamp(): string {\n return new Date().toISOString().replace(\"T\", \" \").slice(11, 19);\n}\n\nfunction log(logFile: string, message: string): void {\n appendFile(logFile, `[${timestamp()}] ${message}\\n`, \"utf-8\").catch(() => {});\n}\n\nexport function logRequest(logFile: string, model: string, tokenEstimate?: number): void {\n log(logFile, `REQ model=${model}${tokenEstimate ? ` tokens=${tokenEstimate}` : \"\"}`);\n}\n\nexport function logResponse(logFile: string, status: number, durationMs: number): void {\n log(logFile, `RES status=${status} duration=${durationMs}ms`);\n}\n\nexport function logRetry(logFile: string, attempt: number, maxRetries: number, waitMs: number): void {\n log(logFile, `RES retry=${attempt}/${maxRetries} wait=${(waitMs / 1000).toFixed(1)}s`);\n}\n\nexport function logToolCall(logFile: string, toolName: string, detail: string): void {\n log(logFile, `TOOL ${toolName} ${detail}`);\n}\n\nexport function logToolResult(logFile: string, toolName: string, status: string, durationMs: number): void {\n log(logFile, `TOOL ${toolName} result=${status} duration=${durationMs}ms`);\n}\n\nexport function logUsage(\n logFile: string,\n usage: { inputTokens: number; outputTokens: number; cacheWriteTokens?: number; cacheReadTokens?: number },\n): void {\n let msg = `USE in=${usage.inputTokens} out=${usage.outputTokens}`;\n if (usage.cacheWriteTokens != null) {\n msg += ` cache_write=${usage.cacheWriteTokens}`;\n }\n if (usage.cacheReadTokens != null) {\n msg += ` cache_read=${usage.cacheReadTokens}`;\n }\n log(logFile, msg);\n}\n","export type ToolErrorCode =\n | \"FILE_NOT_READ\"\n | \"FILE_NOT_FOUND\"\n | \"PERMISSION_DENIED\"\n | \"VALIDATION_ERROR\"\n | \"OLD_STRING_NOT_FOUND\"\n | \"OLD_STRING_NOT_UNIQUE\"\n | \"COMMAND_NOT_FOUND\"\n | \"COMMAND_PERMISSION\"\n | \"SPAWN_ERROR\"\n | \"DISK_FULL\"\n | \"IS_DIRECTORY\"\n | \"OUTPUT_TOO_LARGE\"\n | \"INTERNAL_ERROR\";\n\nconst RECOVERY_HINTS: Partial<Record<ToolErrorCode, string>> = {\n FILE_NOT_READ:\n \"Read ツールで先にファイルを読んでください\",\n FILE_NOT_FOUND:\n \"Glob ツールでファイルパスを確認してください\",\n PERMISSION_DENIED:\n \"ファイルの権限を確認してください (ls -la)\",\n OLD_STRING_NOT_FOUND:\n \"Read ツールで最新の内容を確認してください\",\n OLD_STRING_NOT_UNIQUE:\n \"より多くのコンテキストを含めてユニークにするか、replace_all: true を使用してください\",\n COMMAND_NOT_FOUND:\n \"wellgrow doctor でツールのインストール状況を確認するか、別のコマンドを使用してください\",\n COMMAND_PERMISSION:\n \"ファイルの実行権限を確認してください (chmod +x)\",\n OUTPUT_TOO_LARGE:\n \"head_limit で制限するか、出力の少ないコマンドを使用してください\",\n};\n\nexport class ToolError extends Error {\n readonly code: ToolErrorCode;\n readonly tool: string;\n\n constructor(tool: string, code: ToolErrorCode, message: string) {\n const hint = RECOVERY_HINTS[code];\n const fullMessage = hint ? `${message}。${hint}` : message;\n super(fullMessage);\n this.name = \"ToolError\";\n this.tool = tool;\n this.code = code;\n }\n}\n\nfunction mapErrnoToToolError(\n err: NodeJS.ErrnoException,\n): { code: ToolErrorCode; message: string } | null {\n switch (err.code) {\n case \"ENOENT\":\n return { code: \"FILE_NOT_FOUND\", message: `ファイルが見つかりません: ${err.path ?? err.message}` };\n case \"EACCES\":\n case \"EPERM\":\n return { code: \"PERMISSION_DENIED\", message: `アクセス権限がありません: ${err.path ?? err.message}` };\n case \"EISDIR\":\n return { code: \"IS_DIRECTORY\", message: `ディレクトリに対する操作はできません: ${err.path ?? err.message}` };\n case \"ENOSPC\":\n return { code: \"DISK_FULL\", message: \"ディスク容量が不足しています\" };\n case \"ERR_CHILD_PROCESS_STDIO_MAXBUFFER\":\n return { code: \"OUTPUT_TOO_LARGE\", message: \"出力が大きすぎます\" };\n default:\n return null;\n }\n}\n\nexport function formatToolError(error: unknown): string {\n if (error instanceof ToolError) {\n return `Error: [${error.code}] ${error.message}`;\n }\n\n if (error && typeof error === \"object\" && \"issues\" in error) {\n const issues = (\n error as {\n issues: Array<{ path: (string | number)[]; message: string }>;\n }\n ).issues;\n const details = issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\", \");\n return `Error: [VALIDATION_ERROR] 入力パラメータが不正です: ${details}`;\n }\n\n if (!error || typeof error !== \"object\") {\n return `Error: ツール実行エラー: ${String(error)}`;\n }\n\n const err = error as NodeJS.ErrnoException;\n\n const mapped = mapErrnoToToolError(err);\n if (mapped) {\n const hint = RECOVERY_HINTS[mapped.code];\n const base = `Error: [${mapped.code}] ${mapped.message}`;\n return hint ? `${base}。${hint}` : base;\n }\n\n return `Error: ${err.message ?? String(error)}`;\n}\n","import type { ToolResultPart } from \"ai\";\nimport type { ToolRegistry, ToolHandlerContext } from \"../tools/registry.js\";\nimport type { ToolUIEvent } from \"../tools/definition.js\";\nimport type { ToolPipeline } from \"../tools/pipeline.js\";\nimport type { MessagePart } from \"../ui/message-list.js\";\nimport type { ApprovalRequest, ApprovalDecision } from \"../ui/approval-prompt.js\";\nimport { addAllowedMcp } from \"../config/index.js\";\nimport { formatToolError } from \"../tools/errors.js\";\nimport { logToolCall, logToolResult } from \"../logging.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ToolCall {\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n}\n\nexport interface ToolExecutorConfig {\n registry: ToolRegistry;\n pipeline: ToolPipeline;\n abortSignal?: AbortSignal;\n logFile?: string | null;\n}\n\nexport interface ToolExecutorCallbacks {\n onMessageUpdate: (parts: MessagePart[]) => void;\n onToolUIEvent?: (event: ToolUIEvent) => void;\n onApprovalRequest?: (request: ApprovalRequest) => Promise<ApprovalDecision>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction updateToolPart(\n parts: MessagePart[],\n toolCallId: string,\n state: \"output-available\" | \"output-error\" | \"output-denied\",\n output?: unknown,\n errorText?: string,\n): void {\n const idx = parts.findIndex(\n (p) => p.type === \"tool\" && p.toolCallId === toolCallId,\n );\n if (idx >= 0) {\n const part = parts[idx] as Extract<MessagePart, { type: \"tool\" }>;\n parts[idx] = { ...part, state, output, errorText };\n }\n}\n\nasync function requestApproval(\n tc: ToolCall,\n meta: { category: string; source: string },\n pipeline: ToolPipeline,\n callbacks: ToolExecutorCallbacks,\n): Promise<boolean> {\n if (!callbacks.onApprovalRequest) {\n return true;\n }\n\n const decision = await callbacks.onApprovalRequest({\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args,\n source: meta.source,\n category: meta.category,\n });\n\n if (decision.action === \"allow\" && meta.source === \"mcp\") {\n const serverName = tc.toolName.split(\"__\")[1];\n if (serverName) {\n pipeline.markMcpAllowed(serverName);\n await addAllowedMcp(serverName).catch(() => {});\n }\n }\n\n return decision.action === \"allow\";\n}\n\nfunction toToolOutput(value: unknown): ToolResultPart[\"output\"] {\n if (typeof value === \"string\") {\n return { type: \"text\" as const, value };\n }\n return { type: \"json\" as const, value: value as import(\"ai\").JSONValue };\n}\n\n// ---------------------------------------------------------------------------\n// Single tool execution\n// ---------------------------------------------------------------------------\n\nasync function executeSingleTool(\n tc: ToolCall,\n parts: MessagePart[],\n config: ToolExecutorConfig,\n callbacks: ToolExecutorCallbacks,\n needsApproval: boolean,\n): Promise<ToolResultPart> {\n const { registry, pipeline } = config;\n const handler = registry.handlers[tc.toolName];\n\n if (!handler) {\n const errorMsg = `不明なツール: ${tc.toolName}`;\n updateToolPart(parts, tc.toolCallId, \"output-error\", undefined, errorMsg);\n callbacks.onMessageUpdate([...parts]);\n return {\n type: \"tool-result\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n output: { type: \"error-text\", value: `Error: ${errorMsg}` },\n };\n }\n\n if (needsApproval) {\n const meta = registry.getMeta(tc.toolName);\n const metaInfo = {\n category: meta?.category ?? \"execute\",\n source: meta?.source ?? \"builtin\",\n };\n const approved = await requestApproval(tc, metaInfo, pipeline, callbacks);\n if (!approved) {\n const reason = \"ユーザーがツールの実行を拒否しました\";\n updateToolPart(parts, tc.toolCallId, \"output-denied\", undefined, reason);\n callbacks.onMessageUpdate([...parts]);\n return pipeline.createDeniedResult(tc.toolCallId, tc.toolName, reason);\n }\n }\n\n try {\n const toolStart = Date.now();\n if (config.logFile) {\n const detail =\n tc.toolName === \"Bash\"\n ? `command=\"${(tc.args as { command: string }).command}\"`\n : \"\";\n logToolCall(config.logFile, tc.toolName, detail);\n }\n\n const handlerCtx: ToolHandlerContext = {\n toolCallId: tc.toolCallId,\n abortSignal: config.abortSignal,\n };\n const resultPromise = handler(tc.args, handlerCtx);\n\n const meta = registry.getMeta(tc.toolName);\n const uiHooks = meta?.uiHooks;\n const startEvent = uiHooks?.onStart?.(tc.args, tc.toolCallId);\n if (startEvent && callbacks.onToolUIEvent) {\n callbacks.onToolUIEvent(startEvent);\n }\n\n const toolResult = await resultPromise;\n updateToolPart(parts, tc.toolCallId, \"output-available\", toolResult);\n callbacks.onMessageUpdate([...parts]);\n\n if (config.logFile) {\n logToolResult(config.logFile, tc.toolName, \"success\", Date.now() - toolStart);\n }\n\n const completeEvent = uiHooks?.onComplete?.(tc.args, toolResult);\n if (completeEvent && callbacks.onToolUIEvent) {\n callbacks.onToolUIEvent(completeEvent);\n }\n\n return {\n type: \"tool-result\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n output: toToolOutput(toolResult),\n };\n } catch (error) {\n const errorMsg = formatToolError(error);\n updateToolPart(parts, tc.toolCallId, \"output-error\", undefined, errorMsg);\n callbacks.onMessageUpdate([...parts]);\n\n return {\n type: \"tool-result\",\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n output: { type: \"error-text\", value: errorMsg },\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Batch tool execution (classify → parallel auto / sequential approval)\n// ---------------------------------------------------------------------------\n\nexport async function executeToolCalls(\n toolCalls: ToolCall[],\n parts: MessagePart[],\n config: ToolExecutorConfig,\n callbacks: ToolExecutorCallbacks,\n): Promise<ToolResultPart[]> {\n const { registry, pipeline } = config;\n\n const autoApprove: ToolCall[] = [];\n const needsApproval: ToolCall[] = [];\n const blocked: { tc: ToolCall; reason: string }[] = [];\n\n for (const tc of toolCalls) {\n const meta = registry.getMeta(tc.toolName);\n const evaluation = pipeline.evaluate(tc.toolName, meta, tc.args);\n switch (evaluation.action) {\n case \"block\":\n blocked.push({ tc, reason: evaluation.reason });\n break;\n case \"auto\":\n autoApprove.push(tc);\n break;\n case \"approve\":\n needsApproval.push(tc);\n break;\n }\n }\n\n const blockedResults: ToolResultPart[] = blocked.map(({ tc, reason }) => {\n updateToolPart(parts, tc.toolCallId, \"output-denied\", undefined, reason);\n callbacks.onMessageUpdate([...parts]);\n return pipeline.createDeniedResult(tc.toolCallId, tc.toolName, reason);\n });\n\n const autoResults = await Promise.all(\n autoApprove.map((tc) =>\n executeSingleTool(tc, parts, config, callbacks, false),\n ),\n );\n\n const sequentialResults: ToolResultPart[] = [];\n for (const tc of needsApproval) {\n const result = await executeSingleTool(tc, parts, config, callbacks, true);\n sequentialResults.push(result);\n }\n\n const resultMap = new Map<string, ToolResultPart>();\n for (const r of [...blockedResults, ...autoResults, ...sequentialResults]) {\n resultMap.set(r.toolCallId, r);\n }\n return toolCalls.map((tc) => resultMap.get(tc.toolCallId)!);\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createAskUserState, type AskUserState } from \"../tools/ask-user.js\";\nimport type { TodoItem } from \"../tools/todo-write.js\";\nimport type { McpManager } from \"../extensions/mcp.js\";\n\nexport interface AgentContext {\n readFiles: Map<string, string>;\n todos: TodoItem[];\n askUser: AskUserState;\n}\n\nexport interface AbortState {\n userAbortController: AbortController | null;\n timeoutAbortController: AbortController | null;\n timeoutTimer: ReturnType<typeof setTimeout> | null;\n}\n\nexport interface SessionContext {\n sessionId: string;\n cwd: string;\n nextTerminalId: number;\n logFile: string | null;\n\n abort: AbortState;\n mcpManager: McpManager | null;\n\n agent: AgentContext;\n}\n\nexport function createAbortState(): AbortState {\n return {\n userAbortController: null,\n timeoutAbortController: null,\n timeoutTimer: null,\n };\n}\n\nexport function createAgentContext(): AgentContext {\n return {\n readFiles: new Map(),\n todos: [],\n askUser: createAskUserState(),\n };\n}\n\nexport function createSessionContext(): SessionContext {\n return {\n sessionId: randomUUID(),\n cwd: process.cwd(),\n nextTerminalId: 1,\n logFile: null,\n abort: createAbortState(),\n mcpManager: null,\n agent: createAgentContext(),\n };\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"./definition.js\";\n\nexport interface AskUserQuestion {\n question: string;\n header: string;\n options: { label: string; description: string; markdown?: string }[];\n multiSelect: boolean;\n}\n\nexport interface AskUserAnswer {\n selected: string[];\n otherText?: string;\n}\n\nexport interface AskUserOutput {\n questions: AskUserQuestion[];\n answers: Record<string, AskUserAnswer>;\n}\n\ninterface PendingAskUser {\n toolCallId: string;\n questions: AskUserQuestion[];\n resolve: (answers: Record<string, AskUserAnswer>) => void;\n reject: (reason: Error) => void;\n}\n\nexport interface AskUserState {\n pendingMap: Map<string, PendingAskUser>;\n pendingOrder: string[];\n}\n\nexport function createAskUserState(): AskUserState {\n return { pendingMap: new Map(), pendingOrder: [] };\n}\n\nconst inputSchema = z.object({\n questions: z\n .array(\n z.object({\n question: z.string().describe(\"質問文\"),\n header: z\n .string()\n .describe(\"ラベル(最大12文字、UIのチップ表示用)\"),\n options: z\n .array(\n z.object({\n label: z.string().describe(\"選択肢のラベル\"),\n description: z.string().describe(\"選択肢の説明\"),\n markdown: z\n .string()\n .optional()\n .describe(\"プレビュー用マークダウン\"),\n }),\n )\n .describe(\"選択肢(2-4個、「Other」は自動追加される)\"),\n multiSelect: z.boolean().describe(\"複数選択を許可するか\"),\n }),\n )\n .describe(\"質問リスト(1-4個)\"),\n});\n\nexport const AskUserTool = defineTool({\n name: \"AskUser\",\n category: \"interactive\",\n description: `ユーザーに選択肢付きの質問を投げます。\n情報の収集、曖昧さの解消、好みの確認、意思決定の支援に使用してください。\n- 1-4個の質問を一度に送信可能\n- 各質問に2-4個の選択肢を設定(「Other」は自動追加されます)\n- header はUIのラベル表示に使われます(最大12文字)\n- markdown フィールドでコードプレビューなどのリッチ表示が可能`,\n inputSchema,\n execute: async (input, ctx) => {\n return executeAskUser(ctx.session.agent.askUser, {\n toolCallId: ctx.toolCallId,\n questions: input.questions,\n });\n },\n uiHooks: {\n onStart: (input, toolCallId) => ({\n type: \"askUser\" as const,\n toolCallId,\n questions: input.questions,\n }),\n },\n});\n\nfunction executeAskUser(\n state: AskUserState,\n args: { toolCallId: string; questions: AskUserQuestion[] },\n): Promise<AskUserOutput> {\n return new Promise<AskUserOutput>((resolve, reject) => {\n const entry: PendingAskUser = {\n toolCallId: args.toolCallId,\n questions: args.questions,\n resolve: (answers) => resolve({ questions: args.questions, answers }),\n reject,\n };\n state.pendingMap.set(args.toolCallId, entry);\n state.pendingOrder.push(args.toolCallId);\n });\n}\n\nexport function getNextPendingAskUser(\n state: AskUserState,\n): { toolCallId: string; questions: AskUserQuestion[] } | null {\n if (state.pendingOrder.length === 0) return null;\n const id = state.pendingOrder[0];\n const entry = state.pendingMap.get(id);\n if (!entry) return null;\n return { toolCallId: entry.toolCallId, questions: entry.questions };\n}\n\nexport function getPendingAskUserCount(state: AskUserState): number {\n return state.pendingOrder.length;\n}\n\nexport function resolveAskUser(\n state: AskUserState,\n toolCallId: string,\n answers: Record<string, AskUserAnswer>,\n): void {\n const entry = state.pendingMap.get(toolCallId);\n if (!entry) return;\n\n state.pendingMap.delete(toolCallId);\n const idx = state.pendingOrder.indexOf(toolCallId);\n if (idx !== -1) state.pendingOrder.splice(idx, 1);\n\n entry.resolve(answers);\n}\n\nexport function cancelAllPendingAskUser(state: AskUserState): void {\n const error = new Error(\"AskUser cancelled\");\n for (const entry of state.pendingMap.values()) {\n entry.reject(error);\n }\n state.pendingMap.clear();\n state.pendingOrder.length = 0;\n}\n","import type { ZodType } from \"zod\";\nimport type { SessionContext } from \"../core/context.js\";\nimport type { TodoItem } from \"./todo-write.js\";\nimport type { AskUserQuestion } from \"./ask-user.js\";\n\nexport type ToolCategory =\n | \"read\"\n | \"write\"\n | \"execute\"\n | \"interactive\"\n | \"internal\";\n\nexport interface ToolExecutionContext {\n session: SessionContext;\n toolCallId: string;\n abortSignal?: AbortSignal;\n}\n\nexport interface ToolDefinition<TInput = unknown, TOutput = unknown> {\n name: string;\n description: string;\n category: ToolCategory;\n inputSchema: ZodType<TInput>;\n execute: (\n input: TInput,\n ctx: ToolExecutionContext,\n ) => Promise<TOutput> | TOutput;\n uiHooks?: {\n onStart?: (input: TInput, toolCallId: string) => ToolUIEvent | null;\n onComplete?: (input: TInput, output: TOutput) => ToolUIEvent | null;\n };\n}\n\nexport type ToolUIEvent =\n | { type: \"todoUpdate\"; todos: TodoItem[] }\n | { type: \"askUser\"; toolCallId: string; questions: AskUserQuestion[] };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ErasedToolDefinition = ToolDefinition<any, any>;\n\nexport function defineTool<TInput, TOutput>(\n def: ToolDefinition<TInput, TOutput>,\n): ToolDefinition<TInput, TOutput> {\n return def;\n}\n","import { join } from \"node:path\";\nimport type { LanguageModel } from \"ai\";\nimport { loadAgentConfig, getAgentDir } from \"./loader.js\";\nimport type { AgentConfig } from \"./types.js\";\nimport { buildTemplateVars } from \"../ai/template-vars.js\";\nimport { detectEnvironment } from \"../ai/environment.js\";\nimport { buildSystemPrompt } from \"../ai/system-prompt.js\";\nimport { createToolRegistryBuilder, type ToolRegistry } from \"../tools/registry.js\";\nimport { builtinTools } from \"../tools/index.js\";\nimport { createToolPipeline, type ToolPipeline, type Mode } from \"../tools/pipeline.js\";\nimport { getModel } from \"../ai/providers.js\";\nimport { loadConfig } from \"../config/index.js\";\nimport type { WellGrowConfig } from \"../config/types.js\";\nimport type { SessionContext } from \"../core/context.js\";\nimport {\n McpManager,\n loadGlobalMcpConfig,\n type McpConnectionResult,\n} from \"../extensions/mcp.js\";\nimport { discoverSkills } from \"../extensions/skills.js\";\n\nexport interface ResolvedAgent {\n name: string;\n icon: string;\n description: string;\n model: LanguageModel;\n modelId: string;\n systemPrompt: string;\n registry: ToolRegistry;\n pipeline: ToolPipeline;\n mcpManager: McpManager | null;\n maxTurns: number;\n}\n\nexport interface ResolveAgentOptions {\n agentName: string;\n modelOverride?: string;\n modeOverride?: Mode;\n config?: WellGrowConfig;\n onMcpConnection?: (result: McpConnectionResult) => void;\n}\n\nexport async function resolveAgent(\n options: ResolveAgentOptions,\n sessionCtx: SessionContext,\n): Promise<ResolvedAgent> {\n const config = options.config ?? await loadConfig();\n\n let agentConfig: AgentConfig;\n try {\n agentConfig = await loadAgentConfig(options.agentName);\n } catch {\n agentConfig = {\n agent: {\n name: options.agentName,\n description: \"\",\n icon: \"🤖\",\n },\n };\n }\n\n const modelId = options.modelOverride ?? agentConfig.agent.model ?? config.default.model;\n const mode: Mode = options.modeOverride ?? agentConfig.agent.mode ?? config.default.mode;\n const maxTurns = agentConfig.agent.max_turns ?? config.default.max_turns;\n\n const model = getModel(modelId, config);\n const agentDir = getAgentDir(options.agentName);\n\n const environment = await detectEnvironment();\n\n const templateVars = await buildTemplateVars({\n agentName: agentConfig.agent.name,\n agentDir,\n config,\n environment,\n });\n\n const skillPaths = [\n join(agentDir, \"skills\"),\n ...config.skills.paths,\n ...(agentConfig.skills?.paths ?? []),\n ];\n const skills = await discoverSkills(skillPaths);\n\n const systemPrompt = await buildSystemPrompt({\n agentName: options.agentName,\n templateVars,\n skills,\n });\n\n // --- Build tool registry ---\n const builder = createToolRegistryBuilder(sessionCtx).addBuiltinTools(builtinTools);\n\n if (agentConfig.tools?.builtin) {\n builder.filterBuiltins(agentConfig.tools.builtin);\n }\n\n // --- MCP ---\n let mcpManager: McpManager | null = null;\n\n const mcpPaths = [\n ...config.mcp.paths,\n ...(agentConfig.mcp?.paths ?? []),\n ];\n const mcpConfig = await loadGlobalMcpConfig(mcpPaths);\n const serverCount = Object.keys(mcpConfig.mcpServers).length;\n\n const mcpFailures: string[] = [];\n\n if (serverCount > 0) {\n mcpManager = new McpManager();\n const connectionResults = await mcpManager.connectAll(mcpConfig.mcpServers, options.onMcpConnection);\n\n for (const r of connectionResults) {\n if (!r.success) {\n mcpFailures.push(`${r.name}: 接続失敗 (${r.error})`);\n }\n }\n\n const { toolSets, errors: toolErrors } = await mcpManager.getAllToolSets();\n for (const [serverName, toolSet] of toolSets) {\n builder.addMcpTools(toolSet, serverName);\n }\n for (const e of toolErrors) {\n mcpFailures.push(`${e.name}: ${e.error}`);\n }\n\n sessionCtx.mcpManager = mcpManager;\n }\n\n const registry = builder.build();\n\n const pipeline = createToolPipeline({\n mode,\n allowedMcps: config.permissions.allowed_mcps,\n });\n\n let finalSystemPrompt = systemPrompt;\n if (mcpFailures.length > 0) {\n finalSystemPrompt += `\\n\\n<mcp_status>\\n以下の MCP サーバーは利用できません。これらのツールは使用しないでください:\\n${mcpFailures.map((f) => `- ${f}`).join(\"\\n\")}\\n</mcp_status>`;\n }\n\n return {\n name: agentConfig.agent.name,\n icon: agentConfig.agent.icon,\n description: agentConfig.agent.description,\n model,\n modelId,\n systemPrompt: finalSystemPrompt,\n registry,\n pipeline,\n mcpManager,\n maxTurns,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { parse } from \"smol-toml\";\nimport { agentConfigSchema, type AgentConfig, type AgentSummary } from \"./types.js\";\n\nconst AGENTS_DIR = join(homedir(), \".wellgrow\", \"agents\");\n\nexport function getAgentsDir(): string {\n return AGENTS_DIR;\n}\n\nexport function getAgentDir(agentName: string): string {\n return join(AGENTS_DIR, agentName);\n}\n\nexport async function loadAgentConfig(agentName: string): Promise<AgentConfig> {\n const tomlPath = join(AGENTS_DIR, agentName, \"agent.toml\");\n const raw = await readFile(tomlPath, \"utf-8\");\n const parsed = parse(raw);\n return agentConfigSchema.parse(parsed);\n}\n\nexport async function loadAgentPrompt(agentName: string): Promise<string | null> {\n const promptPath = join(AGENTS_DIR, agentName, \"system-prompt.md\");\n try {\n const content = await readFile(promptPath, \"utf-8\");\n return content.trim() || null;\n } catch {\n process.stderr.write(\n `⚠ ${agentName}: system-prompt.md が見つかりません。エージェントの動作を定義するために作成を推奨します。\\n`,\n );\n return null;\n }\n}\n\nexport async function listAgents(): Promise<AgentSummary[]> {\n let entries: string[];\n try {\n entries = await readdir(AGENTS_DIR);\n } catch {\n return [];\n }\n\n const agents: AgentSummary[] = [];\n\n for (const entry of entries) {\n try {\n const config = await loadAgentConfig(entry);\n agents.push({\n id: entry,\n name: config.agent.name,\n description: config.agent.description,\n icon: config.agent.icon,\n });\n } catch {\n // skip invalid agent directories\n }\n }\n\n return agents;\n}\n","import { z } from \"zod\";\n\nexport const agentConfigSchema = z.object({\n agent: z.object({\n name: z.string(),\n description: z.string(),\n icon: z.string().optional().default(\"🤖\"),\n model: z.string().optional(),\n mode: z.enum([\"plan\", \"auto\"]).optional(),\n max_turns: z.number().int().positive().optional(),\n }),\n tools: z\n .object({\n builtin: z.array(z.string()).optional(),\n })\n .optional(),\n mcp: z\n .object({\n paths: z.array(z.string()).optional(),\n })\n .optional(),\n skills: z\n .object({\n paths: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nexport type AgentConfig = z.infer<typeof agentConfigSchema>;\n\nexport interface AgentSummary {\n id: string;\n name: string;\n description: string;\n icon: string;\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir, platform, release } from \"node:os\";\nimport type { WellGrowConfig } from \"../config/types.js\";\n\nconst WELLGROW_HOME = join(homedir(), \".wellgrow\");\nconst MANUAL_DIR = join(WELLGROW_HOME, \"manual\");\n\nconst DAY_NAMES = [\n \"日曜日\", \"月曜日\", \"火曜日\", \"水曜日\", \"木曜日\", \"金曜日\", \"土曜日\",\n];\n\nexport interface TemplateVarContext {\n agentName: string;\n agentDir: string;\n config: WellGrowConfig;\n environment?: string;\n}\n\nasync function buildManualListing(): Promise<string> {\n let entries: string[];\n try {\n entries = (await readdir(MANUAL_DIR)).filter((e) => e.endsWith(\".md\")).sort();\n } catch {\n return \"\";\n }\n if (entries.length === 0) return \"\";\n\n const lines = entries.map((e) => `- ${MANUAL_DIR}/${e}`);\n return lines.join(\"\\n\");\n}\n\nexport async function buildTemplateVars(ctx: TemplateVarContext): Promise<Record<string, string>> {\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const localDate = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;\n\n const vars: Record<string, string> = {\n WELLGROW_HOME: WELLGROW_HOME,\n AGENT_NAME: ctx.agentName,\n AGENT_DIR: ctx.agentDir,\n CURRENT_DATE: `${localDate} ${pad(now.getHours())}:00`,\n CURRENT_DATETIME: now.toISOString(),\n DAY_OF_WEEK: DAY_NAMES[now.getDay()],\n OS: `${platform()} ${release()}`,\n SHELL: process.env.SHELL ?? \"unknown\",\n CWD: process.cwd(),\n HOME: homedir(),\n };\n\n if (ctx.config.user?.name) {\n vars.USER_NAME = ctx.config.user.name;\n }\n\n if (ctx.environment) {\n vars.ENVIRONMENT = ctx.environment;\n }\n\n const manualListing = await buildManualListing();\n if (manualListing) {\n vars.WELLGROW_MANUAL = manualListing;\n }\n\n return vars;\n}\n\nexport function expandTemplate(\n template: string,\n vars: Record<string, string>,\n): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string) => vars[key] ?? match);\n}\n","import { loadAgentPrompt } from \"../agents/loader.js\";\nimport { expandTemplate } from \"./template-vars.js\";\n\nexport interface SkillMetadata {\n name: string;\n description: string;\n location: string;\n}\n\nexport interface SystemPromptOptions {\n agentName: string;\n templateVars: Record<string, string>;\n skills?: SkillMetadata[];\n}\n\nfunction buildAvailableSkillsSection(skills: SkillMetadata[]): string {\n const entries = skills\n .map(\n (s) =>\n `<skill>\\n <name>${s.name}</name>\\n <description>${s.description}</description>\\n <location>${s.location}</location>\\n</skill>`,\n )\n .join(\"\\n\");\n\n return `## Skills\n\n利用可能なスキルが <available_skills> に列挙されている。\nユーザーの要求に関連するスキルがあると判断した場合、まず Read ツールで該当する SKILL.md を読み、その指示に従うこと。\nスキルは編集・追加できる。手順は \\`~/.wellgrow/manual/skills.md\\` を参照。\n\n<available_skills>\n${entries}\n</available_skills>`;\n}\n\nexport async function buildSystemPrompt(\n options: SystemPromptOptions,\n): Promise<string> {\n const rawPrompt = await loadAgentPrompt(options.agentName);\n\n const parts: string[] = [];\n\n if (rawPrompt) {\n parts.push(expandTemplate(rawPrompt, options.templateVars));\n }\n\n if (options.skills?.length) {\n parts.push(buildAvailableSkillsSection(options.skills));\n }\n\n return parts.join(\"\\n\\n\");\n}\n","import { tool, type Tool } from \"ai\";\nimport type {\n ErasedToolDefinition,\n ToolExecutionContext,\n ToolCategory,\n ToolUIEvent,\n} from \"./definition.js\";\nimport type { SessionContext } from \"../core/context.js\";\n\nexport type ToolSource = \"builtin\" | \"mcp\" | \"custom\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyTool = Tool<any, any>;\n\nexport interface ToolHandlerContext {\n toolCallId: string;\n abortSignal?: AbortSignal;\n}\n\ntype ToolHandler = (\n args: Record<string, unknown>,\n ctx: ToolHandlerContext,\n) => Promise<unknown> | unknown;\n\nexport interface ToolMeta {\n category: ToolCategory;\n source: ToolSource;\n uiHooks?: {\n onStart?: (input: unknown, toolCallId: string) => ToolUIEvent | null;\n onComplete?: (input: unknown, output: unknown) => ToolUIEvent | null;\n };\n}\n\nexport interface ToolRegistry {\n schemas: Record<string, AnyTool>;\n handlers: Record<string, ToolHandler>;\n getMeta(toolName: string): ToolMeta | undefined;\n}\n\nexport interface ToolRegistryBuilder {\n addBuiltinTools(tools: ErasedToolDefinition[]): ToolRegistryBuilder;\n addMcpTools(\n mcpToolSet: Record<string, AnyTool>,\n serverName: string,\n ): ToolRegistryBuilder;\n filterBuiltins(allowed: string[]): ToolRegistryBuilder;\n build(): ToolRegistry;\n}\n\nexport function createToolRegistryBuilder(\n sessionCtx: SessionContext,\n): ToolRegistryBuilder {\n const schemas: Record<string, AnyTool> = {};\n const handlers: Record<string, ToolHandler> = {};\n const metaMap = new Map<string, ToolMeta>();\n\n const builder: ToolRegistryBuilder = {\n addBuiltinTools(tools) {\n for (const t of tools) {\n schemas[t.name] = tool({\n description: t.description,\n inputSchema: t.inputSchema,\n });\n\n handlers[t.name] = async (args, handlerCtx) => {\n const input = t.inputSchema.parse(args);\n const execCtx: ToolExecutionContext = {\n session: sessionCtx,\n toolCallId: handlerCtx.toolCallId,\n abortSignal: handlerCtx.abortSignal,\n };\n return t.execute(input, execCtx);\n };\n\n metaMap.set(t.name, {\n category: t.category,\n source: \"builtin\",\n uiHooks: t.uiHooks,\n });\n }\n return builder;\n },\n\n addMcpTools(mcpToolSet, serverName) {\n for (const [name, mcpTool] of Object.entries(mcpToolSet)) {\n const qualifiedName = `mcp__${serverName}__${name}`;\n\n schemas[qualifiedName] = tool({\n description: mcpTool.description ?? \"\",\n inputSchema: mcpTool.inputSchema,\n });\n\n if (typeof mcpTool.execute === \"function\") {\n const executeFn = mcpTool.execute;\n handlers[qualifiedName] = (args, handlerCtx) =>\n executeFn(args, {\n toolCallId: handlerCtx.toolCallId,\n messages: [],\n });\n }\n\n metaMap.set(qualifiedName, {\n category: \"execute\",\n source: \"mcp\",\n });\n }\n return builder;\n },\n\n filterBuiltins(allowed) {\n const allowSet = new Set(allowed);\n for (const [name, meta] of metaMap) {\n if (meta.source === \"builtin\" && !allowSet.has(name)) {\n delete schemas[name];\n delete handlers[name];\n metaMap.delete(name);\n }\n }\n return builder;\n },\n\n build() {\n return {\n schemas: { ...schemas },\n handlers: { ...handlers },\n getMeta: (name: string) => metaMap.get(name),\n };\n },\n };\n\n return builder;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { MAX_READ_LINES, LINE_TRUNCATION } from \"./constants.js\";\nimport { defineTool } from \"./definition.js\";\n\nexport interface ReadOutput {\n filePath: string;\n content: string;\n numLines: number;\n startLine: number;\n totalLines: number;\n}\n\nconst inputSchema = z.object({\n file_path: z.string().describe(\"ファイルの絶対パス\"),\n offset: z\n .number()\n .optional()\n .describe(\"開始行番号(1-indexed、負の値は末尾からの相対位置)\"),\n limit: z.number().optional().describe(\"読み取り行数\"),\n});\n\nexport const ReadTool = defineTool({\n name: \"Read\",\n category: \"read\",\n description: `ファイルの内容を読み取ります。\n- テキストファイルのみ対応(ディレクトリは読み取れません)\n- デフォルトで先頭2000行まで読み取り、2000文字を超える行は切り詰められます\n- 出力は LINE_NUMBER|LINE_CONTENT 形式(行番号は1から開始)\n- offset に負の値を指定すると末尾からの相対位置で読み取ります\n- 大きなファイルは offset + limit で部分読み取り可能\n- 複数ファイルを並列で読み取ることを推奨します\n- ファイルパスは絶対パスで指定してください\n- 存在しないファイルを読もうとするとエラーが返ります`,\n inputSchema,\n execute: async (input, ctx) => {\n const raw = await readFile(input.file_path, \"utf-8\");\n ctx.session.agent.readFiles.set(\n input.file_path,\n createHash(\"md5\").update(raw).digest(\"hex\"),\n );\n return formatReadOutput(input.file_path, raw, input.offset, input.limit);\n },\n});\n\nfunction formatReadOutput(\n filePath: string,\n raw: string,\n offset?: number,\n limit?: number,\n): ReadOutput {\n const lines = raw.split(\"\\n\");\n const totalLines = lines.length;\n\n let startLine: number;\n if (offset !== undefined) {\n startLine = offset < 0 ? Math.max(1, totalLines + offset + 1) : offset;\n } else {\n startLine = 1;\n }\n\n const effectiveLimit = Math.min(limit ?? MAX_READ_LINES, MAX_READ_LINES);\n const endLine = Math.min(startLine + effectiveLimit - 1, totalLines);\n const selectedLines = lines.slice(startLine - 1, endLine);\n\n const formatted = selectedLines\n .map((line, i) => {\n const lineNum = String(startLine + i).padStart(6, \" \");\n const truncated =\n line.length > LINE_TRUNCATION\n ? line.slice(0, LINE_TRUNCATION) + \"...\"\n : line;\n return `${lineNum}|${truncated}`;\n })\n .join(\"\\n\");\n\n return {\n filePath,\n content: formatted,\n numLines: selectedLines.length,\n startLine,\n totalLines,\n };\n}\n","export const MAX_READ_LINES = 2000;\nexport const LINE_TRUNCATION = 2000;\nexport const MAX_BASH_OUTPUT_CHARS = 30000;\nexport const MAX_BASH_OUTPUT_BYTES = 1_048_576; // 1 MiB hard cap during accumulation (OOM prevention)\nexport const BASH_DEFAULT_TIMEOUT = 120000;\nexport const BASH_MAX_TIMEOUT = 600000;\nexport const BASH_IO_DRAIN_TIMEOUT = 2000; // ms to wait for remaining I/O after process exit\nexport const BASH_BACKGROUND_FLUSH_INTERVAL = 500;\nexport const GLOB_MAX_FILES = 100;\n","import { writeFile, readFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { structuredPatch } from \"diff\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { z } from \"zod\";\nimport { ToolError } from \"./errors.js\";\nimport { defineTool } from \"./definition.js\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface PatchHunk {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: string[];\n}\n\ninterface GitDiffInfo {\n filename: string;\n status: \"modified\" | \"added\";\n additions: number;\n deletions: number;\n changes: number;\n patch: string;\n}\n\nexport interface WriteOutput {\n type: \"create\" | \"update\";\n filePath: string;\n structuredPatch: PatchHunk[];\n gitDiff?: GitDiffInfo;\n}\n\nconst inputSchema = z.object({\n file_path: z.string().describe(\"ファイルの絶対パス\"),\n content: z.string().describe(\"ファイルの全内容\"),\n});\n\nexport const WriteTool = defineTool({\n name: \"Write\",\n category: \"write\",\n description: `ファイルを新規作成または全体上書きします。\n- 既存ファイルの編集には Edit を優先してください\n- 既存ファイルを上書きする場合、先に Read で内容を確認してください(未読ならエラー)\n- 親ディレクトリが存在しない場合は自動作成されます\n- ドキュメントファイル(.md, README)は明示的に要求されない限り作成しないでください\n- ファイルパスは絶対パスで指定してください`,\n inputSchema,\n execute: async (input, ctx) => {\n return executeWrite(input, ctx.session.agent.readFiles);\n },\n});\n\nfunction generateStructuredPatch(\n filePath: string,\n oldContent: string,\n newContent: string,\n): PatchHunk[] {\n const patch = structuredPatch(filePath, filePath, oldContent, newContent);\n return patch.hunks.map((h) => ({\n oldStart: h.oldStart,\n oldLines: h.oldLines,\n newStart: h.newStart,\n newLines: h.newLines,\n lines: h.lines,\n }));\n}\n\nasync function getGitDiff(filePath: string, status: \"modified\" | \"added\"): Promise<GitDiffInfo | undefined> {\n try {\n const { stdout } = await execFileAsync(\"git\", [\"diff\", \"--\", filePath], {\n timeout: 5000,\n });\n if (!stdout.trim()) return undefined;\n const additions = (stdout.match(/^\\+[^+]/gm) ?? []).length;\n const deletions = (stdout.match(/^-[^-]/gm) ?? []).length;\n return {\n filename: filePath,\n status,\n additions,\n deletions,\n changes: additions + deletions,\n patch: stdout,\n };\n } catch {\n return undefined;\n }\n}\n\nasync function executeWrite(\n args: { file_path: string; content: string },\n readFiles: Map<string, string>,\n): Promise<WriteOutput> {\n let originalContent: string | null = null;\n\n try {\n originalContent = await readFile(args.file_path, \"utf-8\");\n } catch {\n originalContent = null;\n }\n\n const isUpdate = originalContent !== null;\n\n if (isUpdate && !readFiles.has(args.file_path)) {\n throw new ToolError(\n \"Write\",\n \"FILE_NOT_READ\",\n `${args.file_path} を上書きする前に確認が必要です`,\n );\n }\n\n await mkdir(dirname(args.file_path), { recursive: true });\n await writeFile(args.file_path, args.content, \"utf-8\");\n\n const hash = createHash(\"md5\").update(args.content).digest(\"hex\");\n readFiles.set(args.file_path, hash);\n\n const patches = generateStructuredPatch(\n args.file_path,\n originalContent ?? \"\",\n args.content,\n );\n\n const gitDiff = await getGitDiff(\n args.file_path,\n isUpdate ? \"modified\" : \"added\",\n );\n\n return {\n type: isUpdate ? \"update\" : \"create\",\n filePath: args.file_path,\n structuredPatch: patches,\n gitDiff,\n };\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { structuredPatch } from \"diff\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { z } from \"zod\";\nimport { ToolError } from \"./errors.js\";\nimport { defineTool } from \"./definition.js\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface PatchHunk {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: string[];\n}\n\ninterface GitDiffInfo {\n filename: string;\n status: \"modified\" | \"added\";\n additions: number;\n deletions: number;\n changes: number;\n patch: string;\n}\n\nexport interface EditOutput {\n filePath: string;\n oldString: string;\n newString: string;\n structuredPatch: PatchHunk[];\n userModified: boolean;\n replaceAll: boolean;\n gitDiff?: GitDiffInfo;\n}\n\nfunction hashContent(content: string): string {\n return createHash(\"md5\").update(content).digest(\"hex\");\n}\n\nfunction generateStructuredPatch(\n filePath: string,\n oldContent: string,\n newContent: string,\n): PatchHunk[] {\n const patch = structuredPatch(filePath, filePath, oldContent, newContent);\n return patch.hunks.map((h) => ({\n oldStart: h.oldStart,\n oldLines: h.oldLines,\n newStart: h.newStart,\n newLines: h.newLines,\n lines: h.lines,\n }));\n}\n\nasync function getGitDiff(filePath: string): Promise<GitDiffInfo | undefined> {\n try {\n const { stdout } = await execFileAsync(\"git\", [\"diff\", \"--\", filePath], {\n timeout: 5000,\n });\n if (!stdout.trim()) return undefined;\n const additions = (stdout.match(/^\\+[^+]/gm) ?? []).length;\n const deletions = (stdout.match(/^-[^-]/gm) ?? []).length;\n return {\n filename: filePath,\n status: \"modified\",\n additions,\n deletions,\n changes: additions + deletions,\n patch: stdout,\n };\n } catch {\n return undefined;\n }\n}\n\nconst inputSchema = z.object({\n file_path: z.string().describe(\"ファイルの絶対パス\"),\n old_string: z.string().describe(\"置換対象の文字列(ユニークであること)\"),\n new_string: z.string().describe(\"置換後の文字列\"),\n replace_all: z\n .boolean()\n .optional()\n .describe(\"全出現箇所を置換するか(デフォルト: false)\"),\n});\n\nexport const EditTool = defineTool({\n name: \"Edit\",\n category: \"write\",\n description: `既存ファイルの部分編集(文字列置換)を行います。\n- 編集前に必ず Read でファイルを読んでおくこと(未読ならエラー)\n- Read 出力のインデント(タブ/スペース)を正確に保持すること\n- old_string はファイル内でユニークであること(複数箇所にある場合はエラー)\n → コンテキストを多く含めてユニークにするか、replace_all: true を使用\n- replace_all はファイル全体のリネーム・一括置換に使用\n- 既存ファイルの編集には Write でなくこのツールを優先すること`,\n inputSchema,\n execute: async (input, ctx) => {\n return executeEdit(input, ctx.session.agent.readFiles);\n },\n});\n\nasync function executeEdit(\n args: {\n file_path: string;\n old_string: string;\n new_string: string;\n replace_all?: boolean;\n },\n readFiles: Map<string, string>,\n): Promise<EditOutput> {\n if (!readFiles.has(args.file_path)) {\n throw new ToolError(\n \"Edit\",\n \"FILE_NOT_READ\",\n `${args.file_path} を編集する前に確認が必要です`,\n );\n }\n\n const content = await readFile(args.file_path, \"utf-8\");\n\n const currentHash = hashContent(content);\n const savedHash = readFiles.get(args.file_path) ?? \"\";\n const userModified = savedHash !== \"\" && currentHash !== savedHash;\n\n if (!content.includes(args.old_string)) {\n throw new ToolError(\n \"Edit\",\n \"OLD_STRING_NOT_FOUND\",\n `old_string がファイル内に見つかりません`,\n );\n }\n\n if (!args.replace_all) {\n const firstIndex = content.indexOf(args.old_string);\n const lastIndex = content.lastIndexOf(args.old_string);\n if (firstIndex !== lastIndex) {\n throw new ToolError(\n \"Edit\",\n \"OLD_STRING_NOT_UNIQUE\",\n `old_string がファイル内に複数箇所あります`,\n );\n }\n }\n\n let newContent: string;\n\n if (args.replace_all) {\n newContent = content.split(args.old_string).join(args.new_string);\n } else {\n newContent = content.replace(args.old_string, args.new_string);\n }\n\n await writeFile(args.file_path, newContent, \"utf-8\");\n\n readFiles.set(args.file_path, hashContent(newContent));\n\n const patches = generateStructuredPatch(args.file_path, content, newContent);\n const gitDiff = await getGitDiff(args.file_path);\n\n return {\n filePath: args.file_path,\n oldString: args.old_string,\n newString: args.new_string,\n structuredPatch: patches,\n userModified,\n replaceAll: args.replace_all ?? false,\n gitDiff,\n };\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { writeFile, mkdir, stat } from \"node:fs/promises\";\nimport { join, resolve, isAbsolute } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport {\n MAX_BASH_OUTPUT_CHARS,\n MAX_BASH_OUTPUT_BYTES,\n BASH_DEFAULT_TIMEOUT,\n BASH_MAX_TIMEOUT,\n BASH_IO_DRAIN_TIMEOUT,\n BASH_BACKGROUND_FLUSH_INTERVAL,\n} from \"./constants.js\";\nimport { registerBackgroundProcess } from \"../signals.js\";\nimport { defineTool } from \"./definition.js\";\n\nexport interface BashState {\n cwd: string;\n nextTerminalId: number;\n}\n\n// Process-level cache: user's shell doesn't change during process lifetime\nlet cachedShell: { path: string; name: string } | null = null;\nconst dirStack: string[] = [];\n\nexport interface BashOutput {\n stdout: string;\n stderr: string;\n exitCode: number | null;\n interrupted: boolean;\n backgroundTaskId?: string;\n backgroundedByUser?: boolean;\n returnCodeInterpretation?: string;\n noOutputExpected?: boolean;\n persistedOutputPath?: string;\n persistedOutputSize?: number;\n}\n\nasync function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\n// ---------------------------------------------------------------------------\n// Output masking — sensitive env var values are redacted from tool output\n// so they never reach the LLM context or logs, while still being available\n// to child processes.\n// ---------------------------------------------------------------------------\n\nconst SENSITIVE_ENV_PATTERNS = [\n /key/i,\n /secret/i,\n /token/i,\n /password/i,\n /credential/i,\n];\n\nconst MIN_SECRET_LENGTH = 8;\n\nconst sensitiveValues: string[] = [];\nfor (const [key, value] of Object.entries(process.env)) {\n if (!value || value.length < MIN_SECRET_LENGTH) continue;\n if (SENSITIVE_ENV_PATTERNS.some((p) => p.test(key))) {\n sensitiveValues.push(value);\n }\n}\nsensitiveValues.sort((a, b) => b.length - a.length);\n\nfunction maskSensitiveOutput(text: string): string {\n let masked = text;\n for (const secret of sensitiveValues) {\n masked = masked.replaceAll(secret, \"***\");\n }\n return masked;\n}\n\nconst spawnEnv: Record<string, string> = {\n ...(process.env as Record<string, string>),\n TERM: \"dumb\",\n NO_COLOR: \"1\",\n FORCE_COLOR: \"0\",\n CI: \"1\",\n NODE_NO_READLINE: \"1\",\n};\n\n// ---------------------------------------------------------------------------\n// User shell detection\n// ---------------------------------------------------------------------------\n\nfunction detectShell(): { path: string; name: string } {\n if (cachedShell) return cachedShell;\n\n const shellPath = process.env.SHELL;\n if (shellPath) {\n const name = shellPath.split(\"/\").pop() ?? \"sh\";\n if (name === \"zsh\" || name === \"bash\") {\n cachedShell = { path: shellPath, name };\n return cachedShell;\n }\n }\n\n cachedShell = { path: \"sh\", name: \"sh\" };\n return cachedShell;\n}\n\nfunction buildShellArgs(shellName: string, command: string): string[] {\n if (shellName === \"zsh\") {\n // -l で .zprofile を読み込む(高速・安定重視)\n return [\"-l\", \"-c\", command];\n }\n if (shellName === \"bash\") {\n // -l で .bash_profile を読み込む(大抵 .bashrc もソースされる)\n return [\"-l\", \"-c\", command];\n }\n return [\"-c\", command];\n}\n\nfunction spawnShell(\n command: string,\n options: { cwd: string; detached?: boolean },\n): ChildProcess {\n const shell = detectShell();\n return spawn(shell.path, buildShellArgs(shell.name, command), {\n cwd: options.cwd,\n env: spawnEnv as NodeJS.ProcessEnv,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: options.detached,\n });\n}\n\n// ---------------------------------------------------------------------------\n// CWD tracking\n// Parses chain operators (;, &&, ||, newlines) and tracks cd/pushd/popd\n// through command sequences. Subshells and pipelines are ignored since\n// directory changes within them don't affect the parent shell.\n// ---------------------------------------------------------------------------\n\nfunction containsDirChange(command: string): boolean {\n return /\\b(cd|pushd|popd)\\b/.test(command);\n}\n\nfunction splitChainSegments(command: string): string[] {\n const segments: string[] = [];\n let current = \"\";\n let inSingle = false;\n let inDouble = false;\n let parenDepth = 0;\n\n for (let i = 0; i < command.length; i++) {\n const ch = command[i];\n const prev = i > 0 ? command[i - 1] : \"\";\n\n if (ch === \"'\" && !inDouble && prev !== \"\\\\\") {\n inSingle = !inSingle;\n current += ch;\n continue;\n }\n if (ch === '\"' && !inSingle && prev !== \"\\\\\") {\n inDouble = !inDouble;\n current += ch;\n continue;\n }\n if (inSingle || inDouble) {\n current += ch;\n continue;\n }\n\n if (ch === \"(\") {\n parenDepth++;\n current += ch;\n continue;\n }\n if (ch === \")\") {\n parenDepth = Math.max(0, parenDepth - 1);\n current += ch;\n continue;\n }\n if (parenDepth > 0) {\n current += ch;\n continue;\n }\n\n if (ch === \";\" || ch === \"\\n\") {\n segments.push(current);\n current = \"\";\n continue;\n }\n if (ch === \"&\" && command[i + 1] === \"&\") {\n segments.push(current);\n current = \"\";\n i++;\n continue;\n }\n if (ch === \"|\" && command[i + 1] === \"|\") {\n segments.push(current);\n current = \"\";\n i++;\n continue;\n }\n\n current += ch;\n }\n\n if (current.trim()) segments.push(current);\n return segments;\n}\n\nfunction extractDirCommand(\n segment: string,\n): { type: \"cd\" | \"pushd\" | \"popd\"; target?: string } | null {\n const trimmed = segment.trim();\n\n // cd in a pipeline runs in a subshell — ignore\n if (/(?<!\\|)\\|(?!\\|)/.test(trimmed)) return null;\n\n const cdMatch = trimmed.match(\n /^cd(?:\\s+(?:\"([^\"]*)\"|'([^']*)'|(\\S+)))?(?:\\s|$)/,\n );\n if (cdMatch) {\n return { type: \"cd\", target: cdMatch[1] ?? cdMatch[2] ?? cdMatch[3] };\n }\n\n const pushdMatch = trimmed.match(\n /^pushd(?:\\s+(?:\"([^\"]*)\"|'([^']*)'|(\\S+)))?(?:\\s|$)/,\n );\n if (pushdMatch) {\n return {\n type: \"pushd\",\n target: pushdMatch[1] ?? pushdMatch[2] ?? pushdMatch[3],\n };\n }\n\n if (/^popd(?:\\s|$)/.test(trimmed)) {\n return { type: \"popd\" };\n }\n\n return null;\n}\n\nasync function trackCwdChanges(\n state: BashState,\n command: string,\n cwd: string,\n): Promise<void> {\n if (!containsDirChange(command)) return;\n\n const segments = splitChainSegments(command);\n let effectiveCwd = cwd;\n\n for (const segment of segments) {\n const dirCmd = extractDirCommand(segment);\n if (!dirCmd) continue;\n\n if (dirCmd.type === \"popd\") {\n const popped = dirStack.pop();\n if (popped) effectiveCwd = popped;\n continue;\n }\n\n let target = dirCmd.target;\n if (!target) {\n if (dirCmd.type === \"cd\") {\n effectiveCwd = homedir();\n }\n continue;\n }\n if (target === \"-\") continue;\n\n target = target.replace(/^~(?=\\/|$)/, homedir());\n const resolved = isAbsolute(target) ? target : resolve(effectiveCwd, target);\n\n try {\n const s = await stat(resolved);\n if (s.isDirectory()) {\n if (dirCmd.type === \"pushd\") {\n dirStack.push(effectiveCwd);\n }\n effectiveCwd = resolved;\n }\n } catch {\n // directory not accessible\n }\n }\n\n state.cwd = effectiveCwd;\n}\n\n// ---------------------------------------------------------------------------\n// Error formatting\n// ---------------------------------------------------------------------------\n\nfunction formatSpawnError(error: NodeJS.ErrnoException): string {\n switch (error.code) {\n case \"ENOENT\":\n return `コマンドが見つかりません: ${error.path ?? \"unknown\"}。wellgrow doctor でインストール状況を確認するか、別のコマンドを使用してください`;\n case \"EACCES\":\n return `実行権限がありません: ${error.path ?? \"unknown\"}。chmod +x で実行権限を付与してください`;\n case \"EPERM\":\n return `操作が許可されていません: ${error.message}。sudo が必要か、または別の方法を検討してください`;\n default:\n return `プロセス起動エラー: ${error.message}`;\n }\n}\n\nfunction attachSpawnErrorHandler(\n child: ChildProcess,\n resolve: (value: BashOutput) => void,\n timer?: ReturnType<typeof setTimeout>,\n): void {\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n if (timer) clearTimeout(timer);\n resolve({\n stdout: \"\",\n stderr: formatSpawnError(error),\n exitCode: 1,\n interrupted: false,\n });\n });\n}\n\n// ---------------------------------------------------------------------------\n// Output truncation\n// ---------------------------------------------------------------------------\n\nfunction truncateMiddle(\n text: string,\n maxChars: number,\n): { truncated: string; totalLines: number } {\n const totalLines = text.split(\"\\n\").length;\n if (text.length <= maxChars) return { truncated: text, totalLines };\n\n const leftBudget = Math.floor(maxChars / 2);\n const rightBudget = maxChars - leftBudget;\n\n const left = text.slice(0, leftBudget);\n const right = text.slice(-rightBudget);\n const removedChars = text.length - leftBudget - rightBudget;\n\n const truncated = `${left}\\n\\n…${removedChars}文字省略…\\n\\n${right}`;\n return { truncated, totalLines };\n}\n\n// ---------------------------------------------------------------------------\n// Memory-capped buffer accumulation\n// ---------------------------------------------------------------------------\n\nfunction appendCapped(\n current: string,\n chunk: string,\n maxBytes: number,\n): string {\n const currentBytes = Buffer.byteLength(current, \"utf-8\");\n if (currentBytes >= maxBytes) return current;\n const remaining = maxBytes - currentBytes;\n const chunkBytes = Buffer.byteLength(chunk, \"utf-8\");\n if (chunkBytes <= remaining) return current + chunk;\n const buf = Buffer.from(chunk, \"utf-8\");\n return current + buf.subarray(0, remaining).toString(\"utf-8\");\n}\n\n// ---------------------------------------------------------------------------\n// Tool definition\n// ---------------------------------------------------------------------------\n\nconst inputSchema = z.object({\n command: z.string().describe(\"実行するシェルコマンド\"),\n description: z\n .string()\n .optional()\n .describe(\"コマンドの簡潔な説明(5-10語、ユーザーへの表示用)\"),\n working_directory: z\n .string()\n .optional()\n .describe(\"実行ディレクトリの絶対パス\"),\n timeout: z\n .number()\n .optional()\n .describe(\"タイムアウト(ミリ秒、デフォルト: 120000、最大: 600000)\"),\n run_in_background: z\n .boolean()\n .optional()\n .describe(\"バックグラウンド実行フラグ\"),\n});\n\nexport const BashTool = defineTool({\n name: \"Bash\",\n category: \"execute\",\n description: `シェルコマンドを実行します。作業ディレクトリは呼び出し間で永続化されますが、シェル状態(変数、エイリアス等)は永続化されません。\n\n重要: ファイル操作には専用ツールを使ってください:\n- ファイル読み取り → Read(cat, head, tail は使わない)\n- ファイル検索 → Glob(find は使わない)\n- テキスト検索 → Grep(grep, rg は使わない)\n- ファイル作成 → Write(echo やリダイレクトは使わない)\n- ファイル編集 → Edit(sed, awk は使わない)\n\n実行前のチェック:\n1. ディレクトリ確認: ファイルやディレクトリを新規作成する場合、先に Glob や Bash(ls) で親ディレクトリの存在を確認すること\n2. パスのクォーティング: スペースを含むパスは必ずダブルクォートで囲むこと\n\nガイドライン:\n- 独立したコマンドは並列で複数の Bash 呼び出しにしてください\n- 依存するコマンドは && でチェインしてください\n- description パラメータでユーザーに何をしているか伝えてください\n- タイムアウト: デフォルト120秒、最大600秒。超過時はバックグラウンドに自動移行\n- 出力が30000文字を超える場合は切り詰められ、完全な出力はファイルに保存されます\n- セキュリティのためAPIキーや環境変数やパスワードは自動でマスキングがかかる仕様です\n- run_in_background: true でバックグラウンド実行。出力は ~/.wellgrow/terminals/ に保存\n → Read ツールでターミナルファイルを定期的に確認してモニタリングできます`,\n inputSchema,\n execute: async (input, ctx) => {\n const state: BashState = {\n cwd: ctx.session.cwd,\n nextTerminalId: ctx.session.nextTerminalId,\n };\n const result = await executeBash(state, input, ctx.abortSignal);\n ctx.session.cwd = state.cwd;\n ctx.session.nextTerminalId = state.nextTerminalId;\n return result;\n },\n});\n\n// ---------------------------------------------------------------------------\n// Main execution\n// ---------------------------------------------------------------------------\n\nexport async function executeBash(\n state: BashState,\n args: {\n command: string;\n description?: string;\n working_directory?: string;\n timeout?: number;\n run_in_background?: boolean;\n },\n abortSignal?: AbortSignal,\n): Promise<BashOutput> {\n const cwd = args.working_directory ?? state.cwd;\n const timeout = Math.min(\n args.timeout ?? BASH_DEFAULT_TIMEOUT,\n BASH_MAX_TIMEOUT,\n );\n\n if (args.run_in_background) {\n const result = await runInBackground(state, args.command, cwd);\n result.backgroundedByUser = true;\n return result;\n }\n\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let interrupted = false;\n let resolved = false;\n let building = false;\n let exitedCode: number | null = null;\n let closeTimer: ReturnType<typeof setTimeout> | null = null;\n\n const safeResolve = (value: BashOutput) => {\n if (resolved) return;\n resolved = true;\n if (closeTimer) clearTimeout(closeTimer);\n resolve(value);\n };\n\n const child = spawnShell(args.command, { cwd });\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (!child.killed) child.kill(\"SIGKILL\");\n }, 3000);\n }, timeout);\n\n if (abortSignal) {\n const onAbort = () => {\n if (!resolved && !interrupted) {\n interrupted = true;\n child.kill(\"SIGINT\");\n setTimeout(() => {\n if (!child.killed && !resolved) child.kill(\"SIGKILL\");\n }, 3000);\n }\n };\n if (abortSignal.aborted) {\n onAbort();\n } else {\n abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n attachSpawnErrorHandler(child, safeResolve, timer);\n\n child.stdout!.on(\"data\", (data: Buffer) => {\n stdout = appendCapped(stdout, data.toString(), MAX_BASH_OUTPUT_BYTES);\n });\n\n child.stderr!.on(\"data\", (data: Buffer) => {\n stderr = appendCapped(stderr, data.toString(), MAX_BASH_OUTPUT_BYTES);\n });\n\n const finalize = async (code: number | null) => {\n if (building || resolved) return;\n building = true;\n clearTimeout(timer);\n if (closeTimer) clearTimeout(closeTimer);\n\n if (timedOut) {\n safeResolve(await runInBackground(state, args.command, cwd));\n return;\n }\n\n await trackCwdChanges(state, args.command, cwd);\n\n let finalStdout = stdout;\n let persistedOutputPath: string | undefined;\n let persistedOutputSize: number | undefined;\n\n if (finalStdout.length > MAX_BASH_OUTPUT_CHARS) {\n const hash = createHash(\"md5\")\n .update(finalStdout)\n .digest(\"hex\")\n .slice(0, 12);\n const outputsDir = join(homedir(), \".wellgrow\", \"outputs\");\n await ensureDir(outputsDir);\n persistedOutputPath = join(outputsDir, `${hash}.txt`);\n await writeFile(persistedOutputPath, finalStdout, \"utf-8\");\n persistedOutputSize = Buffer.byteLength(finalStdout, \"utf-8\");\n\n const { truncated, totalLines } = truncateMiddle(\n finalStdout,\n MAX_BASH_OUTPUT_CHARS,\n );\n finalStdout =\n `[出力が${MAX_BASH_OUTPUT_CHARS}文字を超えたため切り詰めました (全${totalLines}行)]\\n` +\n `完全な出力: ${persistedOutputPath} (${persistedOutputSize} bytes)\\n` +\n `Read ツールで参照できます。\\n\\n${truncated}`;\n }\n\n let returnCodeInterpretation: string | undefined;\n if (code !== null && code > 128) {\n const signal = code - 128;\n const signalNames: Record<number, string> = {\n 1: \"SIGHUP\",\n 2: \"SIGINT\",\n 9: \"SIGKILL\",\n 15: \"SIGTERM\",\n };\n returnCodeInterpretation = `killed by ${signalNames[signal] ?? `signal ${signal}`}`;\n }\n\n const noOutputExpected = !stdout && !stderr && code === 0;\n\n finalStdout = maskSensitiveOutput(finalStdout);\n const maskedStderr = maskSensitiveOutput(stderr);\n\n safeResolve({\n stdout: interrupted\n ? `${finalStdout}\\n[ユーザーにより中断されました]`\n : finalStdout,\n stderr: maskedStderr,\n exitCode: code,\n interrupted,\n persistedOutputPath,\n persistedOutputSize,\n returnCodeInterpretation,\n noOutputExpected,\n });\n };\n\n // I/O drain strategy:\n // 'exit' fires when the process terminates; 'close' fires after all stdio\n // streams are destroyed. Grandchild processes may keep pipes open, causing\n // 'close' to hang indefinitely. We set a drain timeout on 'exit' and\n // forcefully destroy streams if 'close' doesn't arrive in time.\n child.on(\"exit\", (code) => {\n exitedCode = code;\n closeTimer = setTimeout(() => {\n child.stdout?.destroy();\n child.stderr?.destroy();\n finalize(exitedCode);\n }, BASH_IO_DRAIN_TIMEOUT);\n });\n\n child.on(\"close\", (code) => {\n finalize(code ?? exitedCode);\n });\n });\n}\n\n// ---------------------------------------------------------------------------\n// Background execution\n// ---------------------------------------------------------------------------\n\nasync function runInBackground(\n state: BashState,\n command: string,\n cwd: string,\n): Promise<BashOutput> {\n const terminalId = state.nextTerminalId++;\n const terminalsDir = join(homedir(), \".wellgrow\", \"terminals\");\n await ensureDir(terminalsDir);\n const terminalFile = join(terminalsDir, `${terminalId}.txt`);\n\n let child: ChildProcess;\n try {\n child = spawnShell(command, { cwd, detached: true });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n return {\n stdout: \"\",\n stderr: formatSpawnError(err),\n exitCode: 1,\n interrupted: false,\n };\n }\n\n registerBackgroundProcess(child);\n\n const pid = child.pid;\n const startTime = Date.now();\n\n let header = `---\\npid: ${pid}\\ncwd: ${cwd}\\nlast_command: ${command}\\nrunning_for_ms: 0\\n---\\n> ${command}\\n\\n`;\n await writeFile(terminalFile, header, \"utf-8\");\n\n let output = \"\";\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n const flushToFile = async () => {\n const runningFor = Date.now() - startTime;\n header =\n `---\\npid: ${pid}\\ncwd: ${cwd}\\nlast_command: ${command}\\n` +\n `running_for_ms: ${runningFor}\\n---\\n> ${command}\\n\\n`;\n await writeFile(terminalFile, header + maskSensitiveOutput(output), \"utf-8\").catch(() => {});\n };\n\n const scheduleFlush = () => {\n if (flushTimer) return;\n flushTimer = setTimeout(async () => {\n flushTimer = null;\n await flushToFile();\n }, BASH_BACKGROUND_FLUSH_INTERVAL);\n };\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n if (flushTimer) clearTimeout(flushTimer);\n const elapsed = Date.now() - startTime;\n const footer = `\\n---\\nerror: ${formatSpawnError(error)}\\nexit_code: 1\\nelapsed_ms: ${elapsed}\\n---\\n`;\n writeFile(terminalFile, header + maskSensitiveOutput(output) + footer, \"utf-8\").catch(() => {});\n });\n\n child.stdout!.on(\"data\", (data: Buffer) => {\n output = appendCapped(output, data.toString(), MAX_BASH_OUTPUT_BYTES);\n scheduleFlush();\n });\n\n child.stderr!.on(\"data\", (data: Buffer) => {\n output = appendCapped(output, data.toString(), MAX_BASH_OUTPUT_BYTES);\n scheduleFlush();\n });\n\n child.on(\"close\", async (code) => {\n if (flushTimer) clearTimeout(flushTimer);\n const elapsed = Date.now() - startTime;\n const footer = `\\n---\\nexit_code: ${code}\\nelapsed_ms: ${elapsed}\\n---\\n`;\n await writeFile(terminalFile, header + maskSensitiveOutput(output) + footer, \"utf-8\").catch(\n () => {},\n );\n });\n\n child.unref();\n\n return {\n stdout: `コマンドをバックグラウンドに移行しました。\\nターミナルファイル: ${terminalFile}`,\n stderr: \"\",\n exitCode: null,\n interrupted: false,\n backgroundTaskId: String(terminalId),\n };\n}\n","import type { ChildProcess } from \"node:child_process\";\nimport type { SessionContext, AbortState } from \"./core/context.js\";\n\ntype ShutdownHandler = () => Promise<void>;\n\nconst shutdownHandlers: ShutdownHandler[] = [];\nconst backgroundProcesses = new Set<ChildProcess>();\nlet isShuttingDown = false;\nlet lastSigintTime = 0;\n\nlet activeCtx: SessionContext | null = null;\n\nexport function setActiveSession(ctx: SessionContext | null): void {\n activeCtx = ctx;\n}\n\nexport function registerShutdownHandler(handler: ShutdownHandler): void {\n shutdownHandlers.push(handler);\n}\n\nexport function registerBackgroundProcess(child: ChildProcess): void {\n backgroundProcesses.add(child);\n child.on(\"close\", () => backgroundProcesses.delete(child));\n}\n\nexport function createAbortController(abort: AbortState, timeoutMs = 600000): AbortController {\n abort.userAbortController = new AbortController();\n abort.timeoutAbortController = new AbortController();\n\n if (abort.timeoutTimer) clearTimeout(abort.timeoutTimer);\n abort.timeoutTimer = setTimeout(() => {\n abort.timeoutAbortController?.abort();\n }, timeoutMs);\n\n const combined = new AbortController();\n const onAbort = () => {\n if (!combined.signal.aborted) combined.abort();\n };\n abort.userAbortController.signal.addEventListener(\"abort\", onAbort);\n abort.timeoutAbortController.signal.addEventListener(\"abort\", onAbort);\n\n return combined;\n}\n\nexport function clearAbortState(abort: AbortState): void {\n if (abort.timeoutTimer) {\n clearTimeout(abort.timeoutTimer);\n abort.timeoutTimer = null;\n }\n abort.userAbortController = null;\n abort.timeoutAbortController = null;\n}\n\nasync function cleanupBackgroundProcesses(): Promise<void> {\n for (const child of backgroundProcesses) {\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // already dead\n }\n }\n\n if (backgroundProcesses.size > 0) {\n await new Promise((r) => setTimeout(r, 3000));\n for (const child of backgroundProcesses) {\n try {\n child.kill(\"SIGKILL\");\n } catch {\n // already dead\n }\n }\n }\n}\n\nasync function cleanupMcpClients(): Promise<void> {\n if (!activeCtx?.mcpManager) return;\n try {\n await Promise.race([\n activeCtx.mcpManager.disconnectAll(),\n new Promise((r) => setTimeout(r, 3000)),\n ]);\n } catch {\n // ignore MCP cleanup errors\n }\n}\n\nasync function gracefulShutdown(_reason: string): Promise<void> {\n if (isShuttingDown) {\n process.exit(1);\n }\n isShuttingDown = true;\n\n for (const handler of shutdownHandlers) {\n try {\n await Promise.race([handler(), new Promise((r) => setTimeout(r, 5000))]);\n } catch {\n // ignore errors during shutdown\n }\n }\n\n await cleanupBackgroundProcesses();\n await cleanupMcpClients();\n\n process.exit(0);\n}\n\nexport function setupSignalHandlers(): void {\n process.on(\"SIGINT\", () => {\n const now = Date.now();\n if (now - lastSigintTime < 500) {\n gracefulShutdown(\"sigint_double\");\n return;\n }\n lastSigintTime = now;\n\n const ua = activeCtx?.abort.userAbortController;\n if (ua && !ua.signal.aborted) {\n ua.abort();\n } else {\n gracefulShutdown(\"sigint\");\n }\n });\n\n process.on(\"SIGTERM\", () => gracefulShutdown(\"sigterm\"));\n process.on(\"SIGHUP\", () => gracefulShutdown(\"sighup\"));\n}\n","import { glob } from \"glob\";\nimport { stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { GLOB_MAX_FILES } from \"./constants.js\";\nimport { ToolError } from \"./errors.js\";\nimport { defineTool } from \"./definition.js\";\n\nexport interface GlobOutput {\n numFiles: number;\n filenames: string[];\n truncated: boolean;\n durationMs: number;\n}\n\nconst inputSchema = z.object({\n pattern: z\n .string()\n .describe(\"glob パターン(例: '*.ts', 'src/**/*.tsx')\"),\n path: z.string().optional().describe(\"検索ディレクトリの絶対パス\"),\n});\n\nexport const GlobTool = defineTool({\n name: \"Glob\",\n category: \"read\",\n description: `ファイル名パターンでファイルを検索します(ファイル内容は見ません)。\n- ファイル検索には必ず Glob を使い、Bash で find を実行しないでください\n- '**/' で始まらないパターンは自動的に '**/' が付与されます(例: '*.ts' → '**/*.ts')\n- 結果は更新日時順(最新が先)、上限100件\n- node_modules と .git は自動除外\n- ファイル名や拡張子でファイルを探すときに使用してください`,\n inputSchema,\n execute: async (input, ctx) => {\n return executeGlob(input, ctx.session.cwd);\n },\n});\n\nasync function executeGlob(\n args: { pattern: string; path?: string },\n sessionCwd: string,\n): Promise<GlobOutput> {\n const startTime = Date.now();\n const cwd = resolve(args.path ?? sessionCwd);\n\n try {\n await stat(cwd);\n } catch {\n throw new ToolError(\"Glob\", \"FILE_NOT_FOUND\", `検索ディレクトリが見つかりません: ${cwd}`);\n }\n\n let pattern = args.pattern;\n if (!pattern.startsWith(\"**/\") && !pattern.startsWith(\"/\")) {\n pattern = `**/${pattern}`;\n }\n\n const files = await glob(pattern, {\n cwd,\n absolute: true,\n nodir: true,\n dot: false,\n ignore: [\"**/node_modules/**\", \"**/.git/**\"],\n });\n\n const withStats = await Promise.all(\n files.map(async (f) => {\n try {\n const s = await stat(f);\n return { path: f, mtime: s.mtimeMs };\n } catch {\n return { path: f, mtime: 0 };\n }\n }),\n );\n withStats.sort((a, b) => b.mtime - a.mtime);\n\n const truncated = withStats.length > GLOB_MAX_FILES;\n const result = withStats.slice(0, GLOB_MAX_FILES).map((f) => f.path);\n\n return {\n numFiles: result.length,\n filenames: result,\n truncated,\n durationMs: Date.now() - startTime,\n };\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { z } from \"zod\";\nimport { ToolError } from \"./errors.js\";\nimport { defineTool } from \"./definition.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport type GrepMode = \"content\" | \"files_with_matches\" | \"count\";\n\nexport interface GrepOutput {\n mode: GrepMode;\n numFiles: number;\n filenames: string[];\n content?: string;\n numLines?: number;\n numMatches?: number;\n appliedLimit?: number;\n appliedOffset?: number;\n}\n\nexport interface GrepArgs {\n pattern: string;\n path?: string;\n glob?: string;\n output_mode?: GrepMode;\n before_context?: number;\n after_context?: number;\n context?: number;\n case_insensitive?: boolean;\n type?: string;\n head_limit?: number;\n offset?: number;\n multiline?: boolean;\n}\n\nconst inputSchema = z.object({\n pattern: z.string().min(1).describe(\"正規表現パターン(ripgrep 構文)\"),\n path: z.string().optional().describe(\"検索対象の絶対パス\"),\n glob: z\n .string()\n .optional()\n .describe(\"ファイルフィルタ(例: '*.ts', '*.{ts,tsx}')\"),\n output_mode: z\n .enum([\"content\", \"files_with_matches\", \"count\"])\n .optional()\n .describe(\n \"出力モード(デフォルト: files_with_matches)。content: マッチ行とコンテキストを返す。files_with_matches: マッチしたファイルパスのみ返す。count: ファイルごとのマッチ数を返す\",\n ),\n before_context: z\n .number()\n .optional()\n .describe(\"マッチ前の行数(ripgrep -B)\"),\n after_context: z\n .number()\n .optional()\n .describe(\"マッチ後の行数(ripgrep -A)\"),\n context: z\n .number()\n .optional()\n .describe(\"前後のコンテキスト行数(ripgrep -C)\"),\n case_insensitive: z\n .boolean()\n .optional()\n .describe(\"大文字小文字を区別しない(ripgrep -i)\"),\n type: z\n .string()\n .optional()\n .describe(\"ファイルタイプ(rg --type、例: js, py, ts)\"),\n head_limit: z\n .number()\n .optional()\n .describe(\n \"結果の先頭N件に制限。content モードではマッチ行数、files_with_matches/count モードではファイル数が対象\",\n ),\n offset: z\n .number()\n .optional()\n .describe(\n \"先頭N件をスキップ。head_limit と組み合わせてページネーション的に使用可能\",\n ),\n multiline: z\n .boolean()\n .optional()\n .describe(\"マルチライン検索モード(ripgrep -U --multiline-dotall)\"),\n});\n\nexport const GrepTool = defineTool({\n name: \"Grep\",\n category: \"read\",\n description: `ファイル内のテキストをパターンで検索します(ripgrep ベース)。\n- テキスト検索には必ず Grep を使い、Bash で grep や rg を実行しないでください\n- 正規表現構文をサポート(例: \"log.*Error\", \"function\\\\s+\\\\w+\")\n- リテラルのブレースはエスケープが必要(例: interface\\\\{\\\\})\n- output_mode のデフォルトは files_with_matches(ファイルパスのみ)\n - content: マッチ行とコンテキストを表示(before_context/after_context/context で行数指定)\n - count: ファイルごとのマッチ数を表示\n- head_limit + offset でページネーション的な使い方が可能\n- multiline: true で複数行にまたがるパターンを検索可能`,\n inputSchema,\n execute: async (input, ctx) => {\n return executeGrep(input, ctx.session.cwd);\n },\n});\n\nfunction parseRgOutput(\n stdout: string,\n mode: GrepMode,\n offset?: number,\n limit?: number,\n): GrepOutput {\n const allLines = stdout.trim().split(\"\\n\").filter(Boolean);\n const appliedOffset = offset ?? 0;\n const appliedLimit = limit;\n\n if (mode === \"files_with_matches\") {\n let files = allLines;\n if (appliedOffset) files = files.slice(appliedOffset);\n if (appliedLimit) files = files.slice(0, appliedLimit);\n return { mode, numFiles: files.length, filenames: files, appliedOffset, appliedLimit };\n }\n\n if (mode === \"count\") {\n const entries = allLines.map((l) => {\n const lastColon = l.lastIndexOf(\":\");\n return {\n file: l.slice(0, lastColon),\n count: parseInt(l.slice(lastColon + 1)) || 0,\n };\n });\n const uniqueFiles = [...new Set(entries.map((e) => e.file))];\n const totalMatches = entries.reduce((sum, e) => sum + e.count, 0);\n return { mode, numFiles: uniqueFiles.length, filenames: uniqueFiles, numMatches: totalMatches, appliedOffset, appliedLimit };\n }\n\n let lines = allLines;\n if (appliedOffset) lines = lines.slice(appliedOffset);\n if (appliedLimit) lines = lines.slice(0, appliedLimit);\n const filenames = [\n ...new Set(\n lines\n .filter((l) => l.includes(\":\"))\n .map((l) => l.split(\":\")[0]),\n ),\n ];\n return { mode, numFiles: filenames.length, filenames, content: lines.join(\"\\n\"), numLines: lines.length, appliedOffset, appliedLimit };\n}\n\nasync function executeGrep(args: GrepArgs, sessionCwd: string): Promise<GrepOutput> {\n const mode: GrepMode = args.output_mode ?? \"files_with_matches\";\n const rgArgs: string[] = [];\n\n if (mode === \"files_with_matches\") rgArgs.push(\"-l\");\n if (mode === \"count\") rgArgs.push(\"--count\");\n if (mode === \"content\") rgArgs.push(\"-n\");\n if (args.case_insensitive) rgArgs.push(\"-i\");\n if (args.before_context !== undefined) rgArgs.push(\"-B\", String(args.before_context));\n if (args.after_context !== undefined) rgArgs.push(\"-A\", String(args.after_context));\n if (args.context !== undefined) rgArgs.push(\"-C\", String(args.context));\n if (args.glob) rgArgs.push(\"--glob\", args.glob);\n if (args.type) rgArgs.push(\"--type\", args.type);\n if (args.multiline) rgArgs.push(\"-U\", \"--multiline-dotall\");\n\n rgArgs.push(\"--\", args.pattern);\n rgArgs.push(args.path ?? sessionCwd);\n\n async function runRg(extraArgs: string[] = []): Promise<string> {\n const { stdout } = await execFileAsync(\"rg\", [...extraArgs, ...rgArgs], {\n maxBuffer: 1024 * 1024,\n });\n return stdout;\n }\n\n try {\n const stdout = await runRg();\n return parseRgOutput(stdout, mode, args.offset, args.head_limit);\n } catch (error: unknown) {\n const err = error as { code?: number; stderr?: string };\n if (err.code === 1) {\n return { mode, numFiles: 0, filenames: [] };\n }\n\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new ToolError(\"Grep\", \"COMMAND_NOT_FOUND\", \"ripgrep (rg) がインストールされていません\");\n }\n\n const stderrStr = String(err.stderr ?? \"\");\n if (stderrStr.includes(\"EAGAIN\") || (err as NodeJS.ErrnoException).code === \"EAGAIN\") {\n try {\n const stdout = await runRg([\"-j1\"]);\n return parseRgOutput(stdout, mode, args.offset, args.head_limit);\n } catch (retryError: unknown) {\n if ((retryError as { code?: number }).code === 1) {\n return { mode, numFiles: 0, filenames: [] };\n }\n throw retryError;\n }\n }\n\n throw error;\n }\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"./definition.js\";\n\nexport interface TodoItem {\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n activeForm: string;\n}\n\nexport interface TodoWriteOutput {\n oldTodos: TodoItem[];\n newTodos: TodoItem[];\n}\n\nconst inputSchema = z.object({\n todos: z\n .array(\n z.object({\n content: z.string().describe(\"TODO の内容\"),\n status: z\n .enum([\"pending\", \"in_progress\", \"completed\"])\n .describe(\"ステータス\"),\n activeForm: z\n .string()\n .describe(\n \"進行中のスピナー表示テキスト(例: 'ファイルを読み取り中')\",\n ),\n }),\n )\n .describe(\"TODO アイテムの配列(リスト全体を毎回上書き)\"),\n});\n\nexport const TodoWriteTool = defineTool({\n name: \"TodoWrite\",\n category: \"internal\",\n description: `タスクリストを管理します。リスト全体を毎回上書きする設計です。\n複雑な複数ステップのタスク(3ステップ以上)の追跡に使用してください。\n- 3段階ステータス: pending → in_progress → completed\n- 同時に in_progress にするのは1つだけにすること\n- activeForm は in_progress 時のスピナー表示テキスト(例: \"ファイルを読み取り中\")\n- 単純なタスク(1-2ステップ)には使用しないでください`,\n inputSchema,\n execute: (input, ctx) => {\n return executeWriteTodos(ctx.session.agent, {\n todos: input.todos as TodoItem[],\n });\n },\n uiHooks: {\n onComplete: (_input, output) => ({\n type: \"todoUpdate\" as const,\n todos: output.newTodos,\n }),\n },\n});\n\nfunction executeWriteTodos(\n state: { todos: TodoItem[] },\n args: { todos: TodoItem[] },\n): TodoWriteOutput {\n const oldTodos = [...state.todos];\n state.todos = args.todos;\n return { oldTodos, newTodos: state.todos };\n}\n\nexport function getCurrentTodos(state: { todos: TodoItem[] }): TodoItem[] {\n return state.todos;\n}\n","import type { ErasedToolDefinition } from \"./definition.js\";\nimport { ReadTool } from \"./read.js\";\nimport { WriteTool } from \"./write.js\";\nimport { EditTool } from \"./edit.js\";\nimport { BashTool } from \"./bash.js\";\nimport { GlobTool } from \"./glob.js\";\nimport { GrepTool } from \"./grep.js\";\nimport { AskUserTool } from \"./ask-user.js\";\nimport { TodoWriteTool } from \"./todo-write.js\";\n\nexport const builtinTools: ErasedToolDefinition[] = [\n ReadTool,\n WriteTool,\n EditTool,\n BashTool,\n GlobTool,\n GrepTool,\n AskUserTool,\n TodoWriteTool,\n];\n","import type { ToolResultPart } from \"ai\";\nimport type { ToolMeta } from \"./registry.js\";\n\nexport type Mode = \"plan\" | \"auto\";\n\nexport type ToolEvaluation =\n | { action: \"auto\" }\n | { action: \"approve\" }\n | { action: \"block\"; reason: string };\n\nexport interface ToolPipelineConfig {\n mode: Mode;\n allowedMcps?: string[];\n}\n\nexport interface ToolPipeline {\n readonly mode: Mode;\n evaluate(\n toolName: string,\n meta: ToolMeta | undefined,\n args?: Record<string, unknown>,\n ): ToolEvaluation;\n markMcpAllowed(serverName: string): void;\n createDeniedResult(\n toolCallId: string,\n toolName: string,\n reason: string,\n ): ToolResultPart;\n setMode(mode: Mode): void;\n}\n\n// ---------------------------------------------------------------------------\n// Bash read-only command whitelist\n// ---------------------------------------------------------------------------\n\nconst READ_ONLY_COMMANDS = new Set([\n \"ls\", \"pwd\", \"cat\", \"echo\", \"which\", \"type\", \"env\",\n \"printenv\", \"date\", \"uname\", \"whoami\", \"id\", \"df\", \"du\",\n \"wc\", \"file\", \"stat\", \"head\", \"tail\", \"less\", \"tree\",\n \"find\", \"rg\", \"grep\", \"awk\", \"sed\", \"sort\", \"uniq\",\n \"diff\", \"basename\", \"dirname\", \"realpath\", \"readlink\",\n \"true\", \"false\", \"test\", \"expr\", \"seq\", \"tr\", \"cut\",\n \"paste\", \"tee\", \"xargs\", \"printf\", \"jq\", \"yq\",\n]);\n\nconst READ_ONLY_GIT_SUBCOMMANDS = new Set([\n \"status\", \"log\", \"diff\", \"show\", \"branch\", \"tag\", \"remote\",\n \"rev-parse\", \"describe\", \"shortlog\", \"stash\", \"config\",\n \"ls-files\", \"ls-tree\", \"cat-file\", \"blame\", \"reflog\",\n]);\n\nconst REDIRECT_PATTERN = /(?:^|[^\\\\])(?:>>?|[0-9]+>>?)/;\n\nexport function isBashReadOnly(command: string): boolean {\n if (REDIRECT_PATTERN.test(command)) return false;\n\n const segments = command.split(/\\s*\\|\\s*/);\n for (const segment of segments) {\n const trimmed = segment.trim();\n if (!trimmed) continue;\n\n const tokens = trimmed.split(/\\s+/);\n const cmd = tokens[0];\n if (!cmd) return false;\n\n if (cmd === \"git\") {\n const subCmd = tokens[1];\n if (!subCmd || !READ_ONLY_GIT_SUBCOMMANDS.has(subCmd)) return false;\n continue;\n }\n\n if (!READ_ONLY_COMMANDS.has(cmd)) return false;\n }\n\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Dangerous command patterns (always blocked regardless of mode)\n// ---------------------------------------------------------------------------\n\nconst DANGEROUS_PATTERNS = [\n /^rm\\s+-rf\\s+\\//,\n /chmod\\s+777/,\n /:\\(\\)\\{\\s*:\\|:&\\s*\\};:/,\n />\\s*\\/dev\\/sd/,\n /^mkfs/,\n /dd\\s+if=.*of=\\/dev/,\n];\n\nfunction isDangerous(args?: Record<string, unknown>): boolean {\n const command = args?.command;\n if (typeof command !== \"string\") return false;\n return DANGEROUS_PATTERNS.some((p) => p.test(command));\n}\n\n// ---------------------------------------------------------------------------\n// Auto-approve categories for plan mode\n// ---------------------------------------------------------------------------\n\nconst AUTO_CATEGORIES = new Set([\"read\", \"interactive\", \"internal\"]);\n\n// ---------------------------------------------------------------------------\n// Pipeline factory\n// ---------------------------------------------------------------------------\n\nexport function createToolPipeline(config: ToolPipelineConfig): ToolPipeline {\n let currentMode = config.mode;\n const allowedMcps = new Set(config.allowedMcps ?? []);\n\n function isToolAllowed(toolName: string): boolean {\n if (!toolName.startsWith(\"mcp__\")) return true;\n const serverName = toolName.split(\"__\")[1];\n return serverName ? allowedMcps.has(serverName) : false;\n }\n\n return {\n get mode() {\n return currentMode;\n },\n\n evaluate(toolName, meta, args) {\n if (toolName === \"Bash\" && isDangerous(args)) {\n return { action: \"block\", reason: \"危険なコマンドです\" };\n }\n\n if (meta?.source === \"mcp\" && !isToolAllowed(toolName)) {\n return { action: \"approve\" };\n }\n\n if (currentMode === \"auto\") {\n return { action: \"auto\" };\n }\n\n // plan mode\n if (!meta) return { action: \"approve\" };\n\n if (AUTO_CATEGORIES.has(meta.category)) {\n return { action: \"auto\" };\n }\n\n if (toolName === \"Bash\" && meta.category === \"execute\") {\n const command = args?.command;\n if (typeof command === \"string\" && isBashReadOnly(command)) {\n return { action: \"auto\" };\n }\n return { action: \"approve\" };\n }\n\n return { action: \"approve\" };\n },\n\n markMcpAllowed(serverName) {\n allowedMcps.add(serverName);\n },\n\n createDeniedResult(toolCallId, toolName, reason) {\n return {\n type: \"tool-result\",\n toolCallId,\n toolName,\n output: {\n type: \"execution-denied\",\n reason,\n },\n };\n },\n\n setMode(mode) {\n currentMode = mode;\n },\n };\n}\n","import { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport type { LanguageModel } from \"ai\";\nimport type { WellGrowConfig } from \"../config/types.js\";\n\ntype Provider = \"anthropic\" | \"google\" | \"openai\";\n\nexport interface ModelEntry {\n id: string;\n label: string;\n}\n\nexport const MODEL_LIST: ModelEntry[] = [\n { id: \"claude-sonnet-4-6\", label: \"Sonnet 4.6\" },\n { id: \"claude-opus-4-6\", label: \"Opus 4.6\" },\n { id: \"claude-haiku-4-5-20251001\", label: \"Haiku 4.5\" },\n { id: \"gemini-3.1-pro-preview\", label: \"Gemini 3.1 Pro\" },\n { id: \"gpt-5.2\", label: \"GPT-5.2\" },\n];\n\nfunction inferProvider(modelId: string): Provider | null {\n if (modelId.startsWith(\"claude-\")) return \"anthropic\";\n if (modelId.startsWith(\"gemini-\")) return \"google\";\n if (modelId.startsWith(\"gpt-\") || modelId.startsWith(\"o1-\") || modelId.startsWith(\"o3-\"))\n return \"openai\";\n return null;\n}\n\nfunction resolveApiKey(\n providerConfig: { api_key?: string; api_key_env: string } | undefined,\n defaultEnv: string,\n): string | undefined {\n if (providerConfig?.api_key) return providerConfig.api_key;\n const envName = providerConfig?.api_key_env ?? defaultEnv;\n return process.env[envName];\n}\n\nexport function getModel(\n modelId: string,\n config: WellGrowConfig,\n): LanguageModel {\n const inferred = inferProvider(modelId);\n if (!inferred) {\n throw new Error(\n `不明なモデル: ${modelId}\\n` +\n `利用可能なモデル形式: claude-*, gemini-*, gpt-*, o1-*, o3-*`,\n );\n }\n\n switch (inferred) {\n case \"anthropic\": {\n const key = resolveApiKey(config.providers?.anthropic, \"ANTHROPIC_API_KEY\");\n const isOAuth = key?.startsWith(\"sk-ant-oat01-\");\n const anthropic = createAnthropic(\n isOAuth\n ? { authToken: key, headers: { \"anthropic-beta\": \"oauth-2025-04-20\" } }\n : { apiKey: key },\n );\n return anthropic(modelId);\n }\n case \"google\": {\n const apiKey = resolveApiKey(config.providers?.google, \"GOOGLE_GENERATIVE_AI_API_KEY\");\n const google = createGoogleGenerativeAI({ apiKey });\n return google(modelId);\n }\n case \"openai\": {\n const apiKey = resolveApiKey(config.providers?.openai, \"OPENAI_API_KEY\");\n const openai = createOpenAI({ apiKey });\n return openai(modelId);\n }\n default:\n throw new Error(`不明なプロバイダー: ${inferred satisfies never}`);\n }\n}\n\nexport function getModelDisplayName(modelId: string): string {\n return modelId;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport {\n createMCPClient,\n auth,\n type MCPClient,\n type MCPTransport,\n type OAuthClientProvider,\n} from \"@ai-sdk/mcp\";\nimport { Experimental_StdioMCPTransport } from \"@ai-sdk/mcp/mcp-stdio\";\nimport type { Tool } from \"ai\";\nimport { CliOAuthProvider } from \"./oauth.js\";\n\nconst MCP_TIMEOUT_DEFAULT = 10_000;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyTool = Tool<any, any>;\n\nexport interface McpServerConfig {\n type?: \"stdio\" | \"http\" | \"sse\";\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n url?: string;\n headers?: Record<string, string>;\n}\n\nexport interface McpConfig {\n mcpServers: Record<string, McpServerConfig>;\n}\n\nexport type McpToolSet = Record<string, AnyTool>;\n\n// --- .mcp.json parser ---\n\nconst EMPTY_CONFIG: McpConfig = { mcpServers: {} };\n\nexport async function loadMcpConfigFile(filePath: string): Promise<McpConfig> {\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n\n if (parsed.mcpServers && typeof parsed.mcpServers === \"object\") {\n return { mcpServers: parsed.mcpServers as Record<string, McpServerConfig> };\n }\n\n // Flat format (plugin-style): treat top-level keys as server entries\n const hasServerLike = Object.values(parsed).some(\n (v) => v && typeof v === \"object\" && (\"command\" in (v as object) || \"url\" in (v as object)),\n );\n if (hasServerLike) {\n return { mcpServers: parsed as Record<string, McpServerConfig> };\n }\n\n return EMPTY_CONFIG;\n } catch {\n return EMPTY_CONFIG;\n }\n}\n\nexport function mergeMcpConfigs(...configs: McpConfig[]): McpConfig {\n const merged: Record<string, McpServerConfig> = {};\n for (const config of configs) {\n Object.assign(merged, config.mcpServers);\n }\n return { mcpServers: merged };\n}\n\nfunction resolveTildePath(p: string): string {\n if (p.startsWith(\"~/\")) {\n return join(homedir(), p.slice(2));\n }\n return p;\n}\n\nexport async function loadGlobalMcpConfig(\n mcpPaths: string[],\n): Promise<McpConfig> {\n const configs = await Promise.all(\n mcpPaths.map((p) => loadMcpConfigFile(resolveTildePath(p))),\n );\n return mergeMcpConfigs(...configs);\n}\n\n\n\ntype HttpTransportConfig = {\n type: \"sse\" | \"http\";\n url: string;\n headers?: Record<string, string>;\n authProvider?: OAuthClientProvider;\n};\n\nfunction createTransport(\n config: McpServerConfig,\n authProvider?: OAuthClientProvider,\n): MCPTransport | HttpTransportConfig {\n const type = config.type ?? \"stdio\";\n\n switch (type) {\n case \"stdio\": {\n if (!config.command) {\n throw new Error(\"stdio transport requires 'command'\");\n }\n return new Experimental_StdioMCPTransport({\n command: config.command,\n args: config.args,\n env: { ...process.env, ...config.env } as Record<string, string>,\n cwd: config.cwd,\n stderr: \"ignore\",\n });\n }\n case \"http\":\n case \"sse\": {\n if (!config.url) {\n throw new Error(`${type} transport requires 'url'`);\n }\n return { type, url: config.url, headers: config.headers, authProvider };\n }\n default:\n throw new Error(`Unknown transport type: ${type}`);\n }\n}\n\nasync function preAuthenticate(\n provider: CliOAuthProvider,\n serverUrl: string,\n): Promise<void> {\n const tokens = await provider.tokens();\n if (tokens) return;\n\n await provider.startCallbackServer();\n\n const result = await auth(provider, { serverUrl });\n if (result === \"AUTHORIZED\") return;\n\n const code = provider.getReceivedAuthCode();\n if (!code) {\n throw new Error(\"OAuth 認証コードを取得できませんでした\");\n }\n\n const result2 = await auth(provider, { serverUrl, authorizationCode: code });\n if (result2 !== \"AUTHORIZED\") {\n throw new Error(\"OAuth トークン交換に失敗しました\");\n }\n}\n\n// --- McpManager ---\n\nexport interface McpConnectionResult {\n name: string;\n success: boolean;\n error?: string;\n}\n\nexport class McpManager {\n private clients = new Map<string, MCPClient>();\n\n async connectAll(\n configs: Record<string, McpServerConfig>,\n onResult?: (result: McpConnectionResult) => void,\n ): Promise<McpConnectionResult[]> {\n const results: McpConnectionResult[] = [];\n\n const entries = Object.entries(configs);\n if (entries.length === 0) return results;\n\n const timeoutMs = getTimeoutMs();\n\n const tasks = entries.map(async ([name, config]) => {\n const result = await this.connectSingle(name, config, timeoutMs);\n results.push(result);\n onResult?.(result);\n });\n\n await Promise.allSettled(tasks);\n return results;\n }\n\n async connect(name: string, config: McpServerConfig): Promise<void> {\n const result = await this.connectSingle(name, config, getTimeoutMs());\n if (!result.success) {\n throw new Error(result.error);\n }\n }\n\n private async connectSingle(\n name: string,\n config: McpServerConfig,\n timeoutMs: number,\n ): Promise<McpConnectionResult> {\n try {\n let authProvider: CliOAuthProvider | undefined;\n const type = config.type ?? \"stdio\";\n\n if ((type === \"http\" || type === \"sse\") && config.url) {\n authProvider = new CliOAuthProvider(name, config.url);\n try {\n await preAuthenticate(authProvider, config.url);\n } catch {\n // OAuth not supported by this server — continue without auth\n authProvider = undefined;\n }\n }\n\n const transport = createTransport(config, authProvider);\n\n const clientPromise = createMCPClient({\n transport,\n name: `wellgrow-cli/${name}`,\n onUncaughtError: (error) => {\n process.stderr.write(\n `[MCP] ${name}: uncaught error: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n },\n });\n\n const client = await Promise.race([\n clientPromise,\n timeout(timeoutMs, `MCP server '${name}' connection timed out (${timeoutMs}ms)`),\n ]);\n\n if (this.clients.has(name)) {\n await this.clients.get(name)!.close().catch(() => {});\n }\n this.clients.set(name, client);\n\n return { name, success: true };\n } catch (error) {\n return {\n name,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async disconnect(name: string): Promise<void> {\n const client = this.clients.get(name);\n if (!client) return;\n this.clients.delete(name);\n try {\n await Promise.race([client.close(), timeout(3000, \"close timeout\")]);\n } catch {\n // ignore close errors\n }\n }\n\n async disconnectAll(): Promise<void> {\n const names = [...this.clients.keys()];\n await Promise.allSettled(names.map((name) => this.disconnect(name)));\n }\n\n async getAllToolSets(): Promise<{ toolSets: Map<string, McpToolSet>; errors: McpConnectionResult[] }> {\n const toolSets = new Map<string, McpToolSet>();\n const errors: McpConnectionResult[] = [];\n\n for (const [name, client] of this.clients) {\n try {\n const toolSet = await client.tools();\n toolSets.set(name, toolSet as McpToolSet);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[MCP] ${name}: failed to load tools: ${message}\\n`);\n errors.push({ name, success: false, error: `ツール読み込み失敗: ${message}` });\n }\n }\n\n return { toolSets, errors };\n }\n\n getConnectedServers(): string[] {\n return [...this.clients.keys()];\n }\n\n hasConnections(): boolean {\n return this.clients.size > 0;\n }\n}\n\n// --- Helpers ---\n\nfunction getTimeoutMs(): number {\n const envVal = process.env.MCP_TIMEOUT;\n if (envVal) {\n const parsed = Number(envVal);\n if (!Number.isNaN(parsed) && parsed > 0) return parsed;\n }\n return MCP_TIMEOUT_DEFAULT;\n}\n\nfunction timeout(ms: number, message: string): Promise<never> {\n return new Promise((_, reject) =>\n setTimeout(() => reject(new Error(message)), ms),\n );\n}\n","import { createServer, type Server } from \"node:http\";\nimport { readFile, writeFile, mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport type {\n OAuthClientProvider,\n OAuthClientInformation,\n OAuthClientMetadata,\n OAuthTokens,\n} from \"@ai-sdk/mcp\";\n\nconst OAUTH_DIR = join(homedir(), \".wellgrow\", \"oauth\");\n\nfunction serverDir(serverName: string): string {\n return join(OAUTH_DIR, serverName);\n}\n\nasync function readJson<T>(path: string): Promise<T | undefined> {\n try {\n return JSON.parse(await readFile(path, \"utf-8\")) as T;\n } catch {\n return undefined;\n }\n}\n\nasync function writeJson(path: string, data: unknown): Promise<void> {\n const dir = join(path, \"..\");\n await mkdir(dir, { recursive: true });\n await writeFile(path, JSON.stringify(data, null, 2), \"utf-8\");\n}\n\nexport class CliOAuthProvider implements OAuthClientProvider {\n private server: Server | null = null;\n private port = 0;\n private receivedCode: string | null = null;\n private codePromise: Promise<string> | null = null;\n private resolveCode: ((code: string) => void) | null = null;\n private readonly dir: string;\n\n constructor(\n private readonly serverName: string,\n private readonly serverUrl: string,\n options?: { baseDir?: string },\n ) {\n this.dir = options?.baseDir\n ? join(options.baseDir, serverName)\n : serverDir(serverName);\n }\n\n // --- Token persistence ---\n\n async tokens(): Promise<OAuthTokens | undefined> {\n return readJson<OAuthTokens>(join(this.dir, \"tokens.json\"));\n }\n\n async saveTokens(tokens: OAuthTokens): Promise<void> {\n await writeJson(join(this.dir, \"tokens.json\"), tokens);\n }\n\n // --- Client registration persistence ---\n\n async clientInformation(): Promise<OAuthClientInformation | undefined> {\n return readJson<OAuthClientInformation>(join(this.dir, \"client.json\"));\n }\n\n async saveClientInformation(info: OAuthClientInformation): Promise<void> {\n await writeJson(join(this.dir, \"client.json\"), info);\n }\n\n // --- PKCE code verifier ---\n\n async codeVerifier(): Promise<string> {\n const data = await readFile(join(this.dir, \"verifier.txt\"), \"utf-8\");\n return data.trim();\n }\n\n async saveCodeVerifier(verifier: string): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n await writeFile(join(this.dir, \"verifier.txt\"), verifier, \"utf-8\");\n }\n\n // --- Redirect URL & client metadata ---\n\n get redirectUrl(): string {\n return `http://127.0.0.1:${this.port}/callback`;\n }\n\n get clientMetadata(): OAuthClientMetadata {\n return {\n redirect_uris: [this.redirectUrl],\n client_name: \"WellGrow CLI\",\n token_endpoint_auth_method: \"none\",\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n };\n }\n\n // --- State ---\n\n async state(): Promise<string> {\n return randomUUID();\n }\n\n // --- Credential invalidation ---\n\n async invalidateCredentials(\n scope: \"all\" | \"client\" | \"tokens\" | \"verifier\",\n ): Promise<void> {\n const targets: string[] = [];\n if (scope === \"all\" || scope === \"tokens\")\n targets.push(join(this.dir, \"tokens.json\"));\n if (scope === \"all\" || scope === \"client\")\n targets.push(join(this.dir, \"client.json\"));\n if (scope === \"all\" || scope === \"verifier\")\n targets.push(join(this.dir, \"verifier.txt\"));\n\n await Promise.allSettled(targets.map((t) => rm(t, { force: true })));\n }\n\n // --- Callback server & browser redirect ---\n\n async startCallbackServer(): Promise<void> {\n if (this.server) return;\n\n this.codePromise = new Promise<string>((resolve) => {\n this.resolveCode = resolve;\n });\n\n this.server = createServer((req, res) => {\n if (!req.url?.startsWith(\"/callback\")) {\n res.writeHead(404);\n res.end();\n return;\n }\n\n const url = new URL(req.url, `http://127.0.0.1:${this.port}`);\n const code = url.searchParams.get(\"code\");\n const error = url.searchParams.get(\"error\");\n\n if (error) {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(\n `<html><body><h2>認証エラー</h2><p>${error}</p><p>ターミナルに戻ってください。</p></body></html>`,\n );\n this.resolveCode?.(\"\");\n return;\n }\n\n if (code) {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(\n \"<html><body><h2>認証完了</h2><p>このタブを閉じて、ターミナルに戻ってください。</p></body></html>\",\n );\n this.resolveCode?.(code);\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(\n \"<html><body><h2>エラー</h2><p>認証コードが見つかりません。</p></body></html>\",\n );\n }\n });\n\n await new Promise<void>((resolve, reject) => {\n this.server!.listen(0, \"127.0.0.1\", () => resolve());\n this.server!.on(\"error\", reject);\n });\n\n const addr = this.server.address();\n if (addr && typeof addr === \"object\") {\n this.port = addr.port;\n }\n }\n\n async redirectToAuthorization(authorizationUrl: URL): Promise<void> {\n process.stderr.write(\n `[OAuth] ブラウザで認証してください: ${authorizationUrl.toString()}\\n`,\n );\n\n const open = (await import(\"open\")).default;\n await open(authorizationUrl.toString());\n\n if (this.codePromise) {\n const code = await this.codePromise;\n if (code) {\n this.receivedCode = code;\n }\n }\n\n this.cleanup();\n }\n\n getReceivedAuthCode(): string | null {\n return this.receivedCode;\n }\n\n private cleanup(): void {\n if (this.server) {\n this.server.close();\n this.server = null;\n }\n this.resolveCode = null;\n this.codePromise = null;\n }\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport matter from \"gray-matter\";\nimport type { SkillMetadata } from \"../ai/system-prompt.js\";\n\nfunction expandTilde(p: string): string {\n return p.startsWith(\"~\") ? join(homedir(), p.slice(1)) : p;\n}\n\nasync function loadSkillMetadata(\n skillDir: string,\n): Promise<SkillMetadata | null> {\n const skillPath = join(skillDir, \"SKILL.md\");\n try {\n const content = await readFile(skillPath, \"utf-8\");\n const { data } = matter(content);\n if (!data.name || !data.description) return null;\n return {\n name: data.name as string,\n description: (data.description as string).trim(),\n location: skillPath,\n };\n } catch {\n return null;\n }\n}\n\nexport async function discoverSkills(\n paths: string[],\n): Promise<SkillMetadata[]> {\n const skills: SkillMetadata[] = [];\n const seen = new Set<string>();\n\n for (const rawPath of paths) {\n const resolved = resolve(expandTilde(rawPath));\n\n const direct = await loadSkillMetadata(resolved);\n if (direct) {\n if (!seen.has(direct.name)) {\n seen.add(direct.name);\n skills.push(direct);\n }\n continue;\n }\n\n let entries: string[];\n try {\n entries = await readdir(resolved);\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const meta = await loadSkillMetadata(join(resolved, entry));\n if (meta && !seen.has(meta.name)) {\n seen.add(meta.name);\n skills.push(meta);\n }\n }\n }\n\n return skills;\n}\n","import { type ModelMessage } from \"ai\";\nimport { runAgentLoop, type AgentLoopCallbacks } from \"./agent-loop.js\";\nimport { loadConfig } from \"../config/index.js\";\nimport { createSessionContext, createAgentContext, type SessionContext } from \"./context.js\";\nimport {\n resolveAgent,\n type ResolvedAgent,\n} from \"../agents/resolver.js\";\nimport type { Mode } from \"../tools/pipeline.js\";\nimport type { McpConnectionResult } from \"../extensions/mcp.js\";\nimport type { MessagePart } from \"../ui/message-list.js\";\n\nexport type { ResolvedAgent } from \"../agents/resolver.js\";\n\nexport interface Session {\n ctx: SessionContext;\n messages: ModelMessage[];\n agent: ResolvedAgent;\n}\n\nexport interface CreateSessionOptions {\n agentName?: string;\n modelOverride?: string;\n modeOverride?: Mode;\n onMcpConnection?: (result: McpConnectionResult) => void;\n}\n\nexport async function createSession(\n options: CreateSessionOptions,\n): Promise<Session> {\n const config = await loadConfig();\n const agentName = options.agentName ?? config.default.agent;\n\n const ctx = createSessionContext();\n const agent = await resolveAgent(\n {\n agentName,\n modelOverride: options.modelOverride,\n modeOverride: options.modeOverride,\n config,\n onMcpConnection: options.onMcpConnection,\n },\n ctx,\n );\n\n return { ctx, messages: [], agent };\n}\n\nexport async function switchAgent(\n session: Session,\n newAgentName: string,\n options?: {\n onMcpConnection?: (result: McpConnectionResult) => void;\n },\n): Promise<void> {\n if (session.agent.mcpManager) {\n await session.agent.mcpManager.disconnectAll();\n session.ctx.mcpManager = null;\n }\n\n session.ctx.agent = createAgentContext();\n session.messages = [];\n\n const config = await loadConfig();\n session.agent = await resolveAgent(\n {\n agentName: newAgentName,\n config,\n onMcpConnection: options?.onMcpConnection,\n },\n session.ctx,\n );\n}\n\nexport interface SendMessageOptions {\n abortSignal?: AbortSignal;\n maxTurns?: number;\n maxRetries?: number;\n maxOutputTokens?: number;\n}\n\nexport interface SendMessageResult {\n fullText: string;\n parts: MessagePart[];\n}\n\nexport async function sendMessage(\n session: Session,\n userMessage: string,\n callbacks: AgentLoopCallbacks,\n options?: SendMessageOptions,\n): Promise<SendMessageResult> {\n session.messages.push({ role: \"user\", content: userMessage });\n\n return runAgentLoop(\n session.messages,\n {\n model: session.agent.model,\n system: session.agent.systemPrompt,\n registry: session.agent.registry,\n pipeline: session.agent.pipeline,\n abortSignal: options?.abortSignal,\n maxTurns: options?.maxTurns ?? session.agent.maxTurns,\n maxRetries: options?.maxRetries,\n maxOutputTokens: options?.maxOutputTokens,\n logFile: session.ctx.logFile,\n isAbortedByUser: () =>\n session.ctx.abort.userAbortController?.signal.aborted ?? false,\n },\n callbacks,\n );\n}\n","import { appendFile, readFile, mkdir, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\n\nconst WELLGROW_DIR = join(homedir(), \".wellgrow\");\nconst HISTORY_FILE = join(WELLGROW_DIR, \"history.jsonl\");\n\nexport interface HistoryEntry {\n session_id: string;\n agent: string;\n model: string;\n timestamp: string;\n summary: string;\n message_count: number;\n}\n\nexport interface SessionRecorder {\n sessionId: string;\n recordUser: (content: string) => Promise<void>;\n recordAssistant: (content: string) => Promise<void>;\n finalize: (messageCount: number) => Promise<void>;\n}\n\nexport async function createSessionRecorder(\n model: string,\n agent: string,\n): Promise<SessionRecorder> {\n const sessionId = randomUUID();\n const now = new Date();\n const dateDir = join(\n WELLGROW_DIR,\n \"sessions\",\n String(now.getFullYear()),\n String(now.getMonth() + 1).padStart(2, \"0\"),\n String(now.getDate()).padStart(2, \"0\"),\n );\n await mkdir(dateDir, { recursive: true });\n\n const sessionFile = join(dateDir, `${sessionId}.jsonl`);\n let firstUserMessage = \"\";\n\n const meta = JSON.stringify({\n type: \"meta\",\n agent,\n model,\n timestamp: now.toISOString(),\n });\n await appendFile(sessionFile, meta + \"\\n\", \"utf-8\");\n\n return {\n sessionId,\n\n async recordUser(content: string) {\n if (!firstUserMessage) {\n firstUserMessage = content.slice(0, 50);\n }\n const entry = JSON.stringify({\n type: \"user\",\n timestamp: new Date().toISOString(),\n content,\n });\n await appendFile(sessionFile, entry + \"\\n\", \"utf-8\");\n },\n\n async recordAssistant(content: string) {\n const entry = JSON.stringify({\n type: \"assistant\",\n timestamp: new Date().toISOString(),\n content: content.slice(0, 500),\n });\n await appendFile(sessionFile, entry + \"\\n\", \"utf-8\");\n },\n\n async finalize(messageCount: number) {\n await mkdir(WELLGROW_DIR, { recursive: true });\n const historyEntry = JSON.stringify({\n session_id: sessionId,\n agent,\n model,\n timestamp: now.toISOString(),\n summary: firstUserMessage || \"(空セッション)\",\n message_count: messageCount,\n } satisfies HistoryEntry);\n await appendFile(HISTORY_FILE, historyEntry + \"\\n\", \"utf-8\");\n },\n };\n}\n\nexport async function listHistory(limit = 20): Promise<HistoryEntry[]> {\n try {\n const content = await readFile(HISTORY_FILE, \"utf-8\");\n const lines = content.trim().split(\"\\n\").filter(Boolean);\n return lines\n .map((line) => JSON.parse(line) as HistoryEntry)\n .reverse()\n .slice(0, limit);\n } catch {\n return [];\n }\n}\n\nexport async function getSessionContent(sessionId: string): Promise<string | null> {\n const sessionsDir = join(WELLGROW_DIR, \"sessions\");\n try {\n const years = await readdir(sessionsDir);\n for (const year of years) {\n const months = await readdir(join(sessionsDir, year));\n for (const month of months) {\n const days = await readdir(join(sessionsDir, year, month));\n for (const day of days) {\n const files = await readdir(join(sessionsDir, year, month, day));\n const match = files.find((f) => f.startsWith(sessionId));\n if (match) {\n return readFile(join(sessionsDir, year, month, day, match), \"utf-8\");\n }\n }\n }\n }\n } catch {\n // ignore\n }\n return null;\n}\n","import { useMemo } from \"react\";\nimport { Box, Text, Static, useApp } from \"ink\";\nimport { Header } from \"./header.js\";\nimport { MessageItem, type DisplayMessage } from \"./message-list.js\";\nimport { TodoList } from \"./todo-list.js\";\nimport { AskUserPrompt } from \"./ask-user-prompt.js\";\nimport { ApprovalPrompt } from \"./approval-prompt.js\";\nimport { InputPrompt } from \"./input-prompt.js\";\nimport { ThinkingIndicator } from \"./thinking-indicator.js\";\nimport { useChat } from \"../hooks/use-chat.js\";\nimport { MODEL_LIST } from \"../ai/providers.js\";\nimport type { WellGrowConfig } from \"../config/types.js\";\n\nconst MODEL_OPTIONS = MODEL_LIST.map((m) => ({ value: m.id, label: m.label }));\nimport type { Mode } from \"../tools/pipeline.js\";\nimport { colors } from \"./colors.js\";\n\ntype StaticEntry =\n | { kind: \"header\"; id: string }\n | { kind: \"message\"; id: string; data: DisplayMessage };\n\ninterface AppProps {\n agentName?: string;\n modelOverride?: string;\n config: WellGrowConfig;\n mode?: Mode;\n verbose?: boolean;\n initialMessage?: string;\n}\n\nexport function App({ agentName, modelOverride, config, mode, verbose, initialMessage }: AppProps) {\n const { exit } = useApp();\n const {\n messages,\n todos,\n retryInfo,\n status,\n isReady,\n currentModelName,\n currentAgentName,\n currentAgentIcon,\n mode: currentMode,\n agents,\n activeAskUser,\n askUserQueueSize,\n activeApproval,\n handleSubmit,\n handleModeToggle,\n handleAskUserComplete,\n handleApprovalDecision,\n } = useChat({\n agentName,\n modelOverride,\n config,\n mode,\n verbose,\n initialMessage,\n onExit: exit,\n });\n\n const isActive = status === \"submitted\" || status === \"streaming\";\n const completedMessages = useMemo(\n () => (isActive ? messages.slice(0, -1) : messages),\n [messages, isActive],\n );\n const streamingMessage = isActive\n ? messages[messages.length - 1]\n : null;\n\n const staticItems = useMemo(\n (): StaticEntry[] => [\n { kind: \"header\", id: \"__header__\" },\n ...completedMessages.map(\n (m): StaticEntry => ({ kind: \"message\", id: m.id, data: m }),\n ),\n ],\n [completedMessages],\n );\n\n if (!isReady) return null;\n\n return (\n <Box flexDirection=\"column\">\n <Static items={staticItems}>\n {(item) => {\n if (item.kind === \"header\") {\n return (\n <Box key={item.id}>\n <Header\n agentName={currentAgentName}\n agentIcon={currentAgentIcon}\n modelName={currentModelName}\n />\n </Box>\n );\n }\n return (\n <Box\n key={item.id}\n flexDirection=\"column\"\n marginBottom={item.data.sealed ? 0 : 1}\n >\n <MessageItem message={item.data} />\n </Box>\n );\n }}\n </Static>\n {retryInfo && (\n <Text color={colors.energy}>\n ⟳ API エラー。リトライ中... ({retryInfo.attempt}/\n {retryInfo.maxRetries},{\" \"}\n {Math.round(retryInfo.delayMs / 1000)}秒後)\n </Text>\n )}\n {status === \"submitted\" && <ThinkingIndicator />}\n {status === \"streaming\" && streamingMessage && !activeAskUser && !activeApproval && (\n <MessageItem message={streamingMessage} />\n )}\n <TodoList todos={todos} />\n {activeApproval && (\n <ApprovalPrompt\n request={activeApproval}\n onDecision={handleApprovalDecision}\n />\n )}\n {activeAskUser && !activeApproval && (\n <AskUserPrompt\n questions={activeAskUser.questions}\n queueSize={askUserQueueSize}\n onComplete={handleAskUserComplete}\n />\n )}\n {status === \"ready\" && !activeAskUser && !activeApproval && (\n <InputPrompt\n onSubmit={handleSubmit}\n onModeToggle={handleModeToggle}\n agents={agents}\n models={MODEL_OPTIONS}\n mode={currentMode}\n />\n )}\n </Box>\n );\n}\n","import { Box, Text } from \"ink\";\nimport { colors } from \"./colors.js\";\n\ninterface HeaderProps {\n agentName?: string;\n agentIcon?: string;\n modelName: string;\n}\nexport function Header({ agentName, agentIcon, modelName }: HeaderProps) {\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={colors.signature}\n paddingX={1}\n marginBottom={1}\n >\n <Text bold color={colors.signature}> WellGrow </Text>\n {agentName && (\n <>\n <Text color={colors.fog}>│</Text>\n <Text color={colors.energy}> {agentIcon ?? \"🤖\"} {agentName} </Text>\n </>\n )}\n <Text color={colors.fog}>│</Text>\n <Text color={colors.insight}> {modelName} </Text>\n </Box>\n );\n}\n","export const colors = {\n signature: \"#7FDDC2\", // Mint Breeze — ブランドラベル\n accent: \"#6722FF\", // Electric Violet — 見出しアクセント\n growth: \"#00B254\", // Vivid Green — 完了・成長\n energy: \"#FF6C22\", // Blaze Orange — エラー・警告\n insight: \"#FFCD05\", // Vivid Yellow — 進行中\n flow: \"#5DADE2\", // Flow Blue\n joy: \"#F575AB\", // Bubblegum Pink — プロンプト・ユーザー\n fog: \"#999999\", // Fog — 補助テキスト・ツール実行\n} as const;\n","import { Box, Text } from \"ink\";\nimport remend from \"remend\";\nimport { renderMarkdown } from \"./markdown.js\";\nimport { colors } from \"./colors.js\";\n\nexport type MessagePart =\n | { type: \"text\"; text: string; state?: \"streaming\" | \"done\" }\n | { type: \"reasoning\"; text: string; state?: \"streaming\" | \"done\" }\n | {\n type: \"tool\";\n toolCallId: string;\n toolName: string;\n state:\n | \"input-streaming\"\n | \"input-available\"\n | \"output-available\"\n | \"output-error\"\n | \"output-denied\";\n input?: unknown;\n output?: unknown;\n errorText?: string;\n }\n | { type: \"step-start\" }\n | { type: \"source-url\"; url: string; title?: string };\n\nexport interface DisplayMessage {\n id: string;\n role: \"user\" | \"assistant\";\n parts: MessagePart[];\n interrupted?: boolean;\n sealed?: boolean;\n}\n\ninterface MessageItemProps {\n message: DisplayMessage;\n}\n\nexport function MessageItem({ message }: MessageItemProps) {\n if (message.role === \"user\") {\n const text = message.parts\n .filter(\n (p): p is Extract<MessagePart, { type: \"text\" }> => p.type === \"text\",\n )\n .map((p) => p.text)\n .join(\"\");\n\n return (\n <Box\n borderStyle=\"bold\"\n borderLeft\n borderTop={false}\n borderBottom={false}\n borderRight={false}\n borderColor={colors.joy}\n paddingLeft={1}\n >\n <Text>{text}</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {message.parts.map((part, i) => {\n switch (part.type) {\n case \"text\":\n return part.text ? (\n <Text key={`text-${i}`}>\n {renderMarkdown(\n part.state === \"streaming\"\n ? remend(part.text)\n : part.text,\n )}\n </Text>\n ) : null;\n case \"reasoning\":\n return part.text ? (\n <Text key={`reasoning-${i}`} color={colors.fog} dimColor>\n {part.text}\n </Text>\n ) : null;\n case \"tool\":\n return <ToolStatus key={part.toolCallId} part={part} />;\n case \"step-start\":\n return i > 0 ? (\n <Text key={`step-${i}`} color={colors.fog}>\n ✦\n </Text>\n ) : null;\n case \"source-url\":\n return (\n <Text key={`source-${i}`} color={colors.fog}>\n 📎 {part.title ?? part.url}\n </Text>\n );\n }\n })}\n {message.interrupted && (\n <Text color={colors.fog}>⏎ 中断しました</Text>\n )}\n </Box>\n );\n}\n\nfunction ToolStatus({\n part,\n}: {\n part: Extract<MessagePart, { type: \"tool\" }>;\n}) {\n switch (part.state) {\n case \"input-streaming\":\n case \"input-available\":\n return (\n <Text color={colors.fog}>\n ⋯ {part.toolName}\n </Text>\n );\n case \"output-available\":\n return null;\n case \"output-denied\":\n return (\n <Text color={colors.fog}>\n ⊘ {part.toolName}{part.errorText ? `: ${part.errorText}` : \"\"}\n </Text>\n );\n case \"output-error\":\n return (\n <Box flexDirection=\"column\">\n <Text color={colors.energy}>\n ✗ {part.toolName}\n </Text>\n {part.errorText && (\n <Text color={colors.energy} dimColor>\n {\" \"}{part.errorText}\n </Text>\n )}\n </Box>\n );\n }\n}\n","import { marked } from \"marked\";\nimport { colors } from \"./colors.js\";\n\n// marked-terminal は内部で chalk を使用しており、chalk は ESM モジュール\n// 初期化時に NO_COLOR / FORCE_COLOR 環境変数でカラーレベルを決定する。\n// static import では環境変数操作が間に合わないため、dynamic import で\n// chalk 初期化前に FORCE_COLOR=1 を設定してカラーレンダリングを有効にする。\nlet initialized = false;\n\nasync function ensureInitialized(): Promise<void> {\n if (initialized) return;\n initialized = true;\n\n const savedNoColor = process.env.NO_COLOR;\n const savedForceColor = process.env.FORCE_COLOR;\n delete process.env.NO_COLOR;\n process.env.FORCE_COLOR = \"1\";\n\n const { markedTerminal } = await import(\"marked-terminal\");\n const chalk = (await import(\"chalk\")).default;\n\n marked.use(\n markedTerminal({\n firstHeading: chalk.hex(colors.growth).bold,\n heading: chalk.hex(colors.growth).bold,\n code: chalk.hex(\"#e5c07b\"),\n codespan: chalk.hex(\"#e5c07b\"),\n link: chalk.hex(\"#569cd6\"),\n href: chalk.hex(\"#569cd6\").underline,\n blockquote: chalk.hex(colors.fog).italic,\n del: chalk.hex(colors.fog).strikethrough,\n }),\n );\n\n if (savedNoColor !== undefined) {\n process.env.NO_COLOR = savedNoColor;\n }\n if (savedForceColor !== undefined) {\n process.env.FORCE_COLOR = savedForceColor;\n } else {\n delete process.env.FORCE_COLOR;\n }\n}\n\n// アプリ起動時に呼び出して初期化を完了させる\nexport const markdownReady = ensureInitialized();\n\nexport function renderMarkdown(text: string): string {\n try {\n const result = marked.parse(text);\n if (typeof result === \"string\") {\n return result.trimEnd();\n }\n return text;\n } catch {\n return text;\n }\n}\n","import { memo } from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { TodoItem } from \"../tools/todo-write.js\";\nimport { colors } from \"./colors.js\";\n\ninterface TodoListProps {\n todos: TodoItem[];\n}\n\nexport const TodoList = memo(function TodoList({ todos }: TodoListProps) {\n if (todos.length === 0) return null;\n\n const completed = todos.filter((t) => t.status === \"completed\").length;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={colors.insight}\n paddingX={1}\n marginTop={1}\n >\n <Text color={colors.insight} bold>\n 📋 Tasks ({completed}/{todos.length})\n </Text>\n {todos.map((todo, i) => (\n <Box key={i}>\n {todo.status === \"pending\" && (\n <Text color={colors.fog}>○ {todo.content}</Text>\n )}\n {todo.status === \"in_progress\" && (\n <Text color={colors.insight}>▸ {todo.activeForm}</Text>\n )}\n {todo.status === \"completed\" && (\n <Text color={colors.growth}>✓ {todo.content}</Text>\n )}\n </Box>\n ))}\n </Box>\n );\n});\n","import { useState, useCallback, useMemo } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport type { AskUserQuestion, AskUserAnswer } from \"../tools/ask-user.js\";\nimport { colors } from \"./colors.js\";\n\ninterface AskUserPromptProps {\n questions: AskUserQuestion[];\n queueSize?: number;\n onComplete: (answers: Record<string, AskUserAnswer>) => void;\n}\n\nconst OTHER_OPTION = { label: \"Other\", description: \"自由入力で回答\" };\n\nexport function AskUserPrompt({ questions, queueSize = 0, onComplete }: AskUserPromptProps) {\n const [currentIdx, setCurrentIdx] = useState(0);\n const [cursorIdx, setCursorIdx] = useState(0);\n const [selectedSet, setSelectedSet] = useState<Set<number>>(new Set());\n const [isOtherInput, setIsOtherInput] = useState(false);\n const [otherText, setOtherText] = useState(\"\");\n const [answers, setAnswers] = useState<Record<string, AskUserAnswer>>({});\n\n const question = questions[currentIdx];\n\n const optionsWithOther = useMemo(\n () => (question ? [...question.options, OTHER_OPTION] : []),\n [question],\n );\n const otherIdx = optionsWithOther.length - 1;\n\n const advanceQuestion = useCallback(\n (answer: AskUserAnswer) => {\n if (!question) return;\n const newAnswers = { ...answers, [question.header]: answer };\n setAnswers(newAnswers);\n\n if (currentIdx < questions.length - 1) {\n setCurrentIdx((prev) => prev + 1);\n setCursorIdx(0);\n setSelectedSet(new Set());\n setIsOtherInput(false);\n setOtherText(\"\");\n } else {\n onComplete(newAnswers);\n }\n },\n [answers, currentIdx, question, questions.length, onComplete],\n );\n\n const handleOtherSubmit = useCallback(\n (value: string) => {\n const text = value.trim();\n if (!text || !question) return;\n if (question.multiSelect) {\n const selected = [...selectedSet]\n .filter((i) => i !== otherIdx)\n .map((i) => optionsWithOther[i].label);\n advanceQuestion({ selected, otherText: text });\n } else {\n advanceQuestion({ selected: [OTHER_OPTION.label], otherText: text });\n }\n },\n [question, selectedSet, otherIdx, optionsWithOther, advanceQuestion],\n );\n\n useInput(\n (input, key) => {\n if (!question || isOtherInput) return;\n\n if (key.upArrow) {\n setCursorIdx((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIdx((prev) => Math.min(optionsWithOther.length - 1, prev + 1));\n } else if (question.multiSelect && input === \" \") {\n setSelectedSet((prev) => {\n const next = new Set(prev);\n if (next.has(cursorIdx)) {\n next.delete(cursorIdx);\n } else {\n next.add(cursorIdx);\n }\n return next;\n });\n } else if (key.return) {\n if (question.multiSelect) {\n if (selectedSet.has(otherIdx)) {\n setIsOtherInput(true);\n return;\n }\n const selected = [...selectedSet].map(\n (i) => optionsWithOther[i].label,\n );\n if (selected.length === 0) return;\n advanceQuestion({ selected });\n } else {\n if (cursorIdx === otherIdx) {\n setIsOtherInput(true);\n return;\n }\n advanceQuestion({ selected: [optionsWithOther[cursorIdx].label] });\n }\n }\n },\n { isActive: !!question && !isOtherInput },\n );\n\n if (!question) return null;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={colors.joy}\n paddingX={1}\n marginTop={1}\n >\n <Box>\n <Text color={colors.joy} bold>💬 質問</Text>\n {questions.length > 1 && (\n <Text color={colors.fog}> ({currentIdx + 1}/{questions.length})</Text>\n )}\n {queueSize > 1 && (\n <Text color={colors.fog}> — 残り {queueSize - 1} 件待機中</Text>\n )}\n </Box>\n <Text color={colors.accent} bold>\n {question.question}\n </Text>\n {question.multiSelect && (\n <Text color={colors.fog}>(Space で選択/解除、Enter で確定)</Text>\n )}\n <Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n {optionsWithOther.map((opt, i) => {\n const isCursor = i === cursorIdx;\n const isSelected = selectedSet.has(i);\n const prefix = question.multiSelect\n ? `${isCursor ? \"❯\" : \" \"} ${isSelected ? \"◉\" : \"○\"}`\n : `${isCursor ? \"❯\" : \" \"}`;\n return (\n <Box key={i}>\n <Text color={isCursor ? colors.joy : undefined}>\n {prefix} {opt.label}\n </Text>\n <Text color={colors.fog}> — {opt.description}</Text>\n </Box>\n );\n })}\n </Box>\n {isOtherInput && (\n <Box marginLeft={2} marginTop={1}>\n <Text color={colors.insight}>自由入力: </Text>\n <TextInput\n value={otherText}\n onChange={setOtherText}\n onSubmit={handleOtherSubmit}\n />\n </Box>\n )}\n </Box>\n );\n}\n","import { Box, Text, useInput } from \"ink\";\nimport { colors } from \"./colors.js\";\n\nexport interface ApprovalRequest {\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n source: string;\n category: string;\n}\n\nexport type ApprovalDecision =\n | { action: \"allow\" }\n | { action: \"deny\" };\n\ninterface ApprovalPromptProps {\n request: ApprovalRequest;\n onDecision: (decision: ApprovalDecision) => void;\n}\n\nfunction formatToolPreview(toolName: string, args: Record<string, unknown>): string {\n if (toolName === \"Bash\") {\n return String(args.command ?? \"\");\n }\n if (toolName === \"Write\" || toolName === \"Edit\" || toolName === \"Read\") {\n return String(args.file_path ?? args.path ?? \"\");\n }\n if (toolName === \"Glob\") {\n return String(args.pattern ?? args.glob_pattern ?? \"\");\n }\n if (toolName === \"Grep\") {\n return String(args.pattern ?? \"\");\n }\n if (toolName.startsWith(\"mcp__\")) {\n const parts = toolName.split(\"__\");\n const server = parts[1] ?? \"\";\n const tool = parts.slice(2).join(\"__\");\n return `${server}/${tool}`;\n }\n return JSON.stringify(args).slice(0, 120);\n}\n\nexport function ApprovalPrompt({ request, onDecision }: ApprovalPromptProps) {\n useInput((input) => {\n const key = input.toLowerCase();\n if (key === \"y\") onDecision({ action: \"allow\" });\n if (key === \"n\") onDecision({ action: \"deny\" });\n });\n\n const preview = formatToolPreview(request.toolName, request.args);\n const sourceLabel = request.source === \"mcp\" ? \" (MCP)\" : \"\";\n const displayName = request.toolName.startsWith(\"mcp__\")\n ? request.toolName.replace(/^mcp__/, \"\").replace(/__/g, \"/\")\n : request.toolName;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={colors.energy}\n paddingX={1}\n marginTop={1}\n >\n <Text color={colors.energy} bold>\n 承認が必要です{sourceLabel}\n </Text>\n <Box marginTop={1}>\n <Text color={colors.insight} bold>{displayName}</Text>\n </Box>\n {preview && (\n <Box marginLeft={2}>\n <Text color={colors.fog}>{preview}</Text>\n </Box>\n )}\n <Box marginTop={1} gap={2}>\n <Text>\n <Text color={colors.growth} bold>[Y]</Text>\n <Text color={colors.fog}> 許可</Text>\n </Text>\n <Text>\n <Text color={colors.energy} bold>[N]</Text>\n <Text color={colors.fog}> 拒否</Text>\n </Text>\n </Box>\n </Box>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport { colors } from \"./colors.js\";\nimport type { Mode } from \"../tools/pipeline.js\";\n\ninterface ArgOption {\n value: string;\n label: string;\n}\n\ninterface SlashCommand {\n name: string;\n description: string;\n hasArgs: boolean;\n args?: ArgOption[];\n}\n\nconst MODE_ARGS: ArgOption[] = [\n { value: \"plan\", label: \"ツール実行前に承認\" },\n { value: \"auto\", label: \"すべて自動実行\" },\n];\n\ninterface InputPromptProps {\n onSubmit: (text: string) => void;\n onModeToggle?: () => void;\n agents?: { id: string; name: string; icon: string }[];\n models?: { value: string; label: string }[];\n mode?: Mode;\n}\n\nexport function InputPrompt({\n onSubmit,\n onModeToggle,\n agents,\n models,\n mode,\n}: InputPromptProps) {\n const [value, setValue] = useState(\"\");\n const [selectedIdx, setSelectedIdx] = useState(0);\n\n const commands = useMemo((): SlashCommand[] => {\n const agentArgs: ArgOption[] = (agents ?? []).map((a) => ({\n value: a.id,\n label: `${a.icon} ${a.name}`,\n }));\n const modelArgs: ArgOption[] = models ?? [];\n return [\n { name: \"/agent\", description: \"エージェントを表示/切り替え\", hasArgs: true, args: agentArgs },\n { name: \"/clear\", description: \"セッションをクリア\", hasArgs: false },\n { name: \"/mode\", description: \"モードを表示/切り替え (plan, auto)\", hasArgs: true, args: MODE_ARGS },\n { name: \"/model\", description: \"モデルを切り替え\", hasArgs: true, args: modelArgs },\n ];\n }, [agents, models]);\n\n const spaceIdx = value.indexOf(\" \");\n const isArgPhase = spaceIdx > 0;\n const isCmdPhase = value.startsWith(\"/\") && !isArgPhase;\n\n const cmdSuggestions = isCmdPhase\n ? commands.filter((cmd) => cmd.name.startsWith(value))\n : [];\n\n const argSuggestions = useMemo((): ArgOption[] => {\n if (!isArgPhase) return [];\n const cmdName = value.slice(0, spaceIdx);\n const argPrefix = value.slice(spaceIdx + 1);\n const cmd = commands.find((c) => c.name === cmdName);\n if (!cmd?.args) return [];\n return cmd.args.filter((a) => a.value.startsWith(argPrefix));\n }, [value, isArgPhase, spaceIdx, commands]);\n\n const hasSuggestions = cmdSuggestions.length > 0 || argSuggestions.length > 0;\n\n useInput((input, key) => {\n if (key.tab && key.shift) {\n onModeToggle?.();\n return;\n }\n\n if (key.return) {\n if (argSuggestions.length > 0) {\n const arg = argSuggestions[Math.min(selectedIdx, argSuggestions.length - 1)];\n const cmdName = value.slice(0, spaceIdx);\n onSubmit(`${cmdName} ${arg.value}`);\n setValue(\"\");\n setSelectedIdx(0);\n return;\n }\n if (cmdSuggestions.length > 0) {\n const cmd = cmdSuggestions[Math.min(selectedIdx, cmdSuggestions.length - 1)];\n if (cmd.hasArgs) {\n setValue(cmd.name + \" \");\n setSelectedIdx(0);\n } else {\n onSubmit(cmd.name);\n setValue(\"\");\n setSelectedIdx(0);\n }\n return;\n }\n if (value.trim()) {\n onSubmit(value);\n }\n setValue(\"\");\n setSelectedIdx(0);\n return;\n }\n\n if (key.tab) {\n if (argSuggestions.length > 0) {\n const arg = argSuggestions[Math.min(selectedIdx, argSuggestions.length - 1)];\n const cmdName = value.slice(0, spaceIdx);\n setValue(`${cmdName} ${arg.value}`);\n setSelectedIdx(0);\n return;\n }\n if (cmdSuggestions.length > 0) {\n const cmd = cmdSuggestions[Math.min(selectedIdx, cmdSuggestions.length - 1)];\n setValue(cmd.name + (cmd.hasArgs ? \" \" : \"\"));\n setSelectedIdx(0);\n return;\n }\n return;\n }\n\n if (hasSuggestions) {\n const len = argSuggestions.length || cmdSuggestions.length;\n if (key.upArrow) {\n setSelectedIdx((prev) => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow) {\n setSelectedIdx((prev) => Math.min(len - 1, prev + 1));\n return;\n }\n }\n\n if (key.escape && hasSuggestions) {\n setValue(\"\");\n setSelectedIdx(0);\n return;\n }\n\n if (key.backspace || key.delete) {\n setValue((prev) => prev.slice(0, -1));\n setSelectedIdx(0);\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setValue((prev) => prev + input);\n setSelectedIdx(0);\n }\n });\n\n const modeHint = mode ? ` [${mode}]` : \"\";\n\n return (\n <Box flexDirection=\"column\">\n <Text>\n <Text color={colors.joy}>❯ </Text>\n <Text>{value}</Text>\n <Text color={colors.fog}>█</Text>\n {!value && onModeToggle && (\n <Text color={colors.fog}> Shift+Tab: モード切替{modeHint}</Text>\n )}\n </Text>\n {cmdSuggestions.length > 0 && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {cmdSuggestions.map((cmd, i) => {\n const active = i === selectedIdx;\n return (\n <Box key={cmd.name}>\n <Text color={active ? colors.joy : undefined} bold={active}>\n {active ? \"❯ \" : \" \"}{cmd.name}\n </Text>\n <Text color={colors.fog}> — {cmd.description}</Text>\n </Box>\n );\n })}\n </Box>\n )}\n {argSuggestions.length > 0 && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {argSuggestions.map((arg, i) => {\n const active = i === selectedIdx;\n return (\n <Box key={arg.value}>\n <Text color={active ? colors.joy : undefined} bold={active}>\n {active ? \"❯ \" : \" \"}{arg.value}\n </Text>\n <Text color={colors.fog}> — {arg.label}</Text>\n </Box>\n );\n })}\n </Box>\n )}\n </Box>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport { Text } from \"ink\";\nimport { colors } from \"./colors.js\";\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\nexport function ThinkingIndicator() {\n const [frame, setFrame] = useState(0);\n const [elapsed, setElapsed] = useState(0);\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame((prev) => (prev + 1) % SPINNER_FRAMES.length);\n }, 80);\n return () => clearInterval(timer);\n }, []);\n\n useEffect(() => {\n const timer = setInterval(() => {\n setElapsed((prev) => prev + 1);\n }, 1000);\n return () => clearInterval(timer);\n }, []);\n\n return (\n <Text>\n <Text color={colors.signature}>{SPINNER_FRAMES[frame]}</Text>\n {elapsed >= 2 && <Text color={colors.fog} dimColor> {elapsed}s</Text>}\n </Text>\n );\n}\n","import { useState, useCallback, useRef, useEffect } from \"react\";\nimport { useInput } from \"ink\";\nimport { sendMessage } from \"../core/session.js\";\nimport type { TurnUsage } from \"../ai/cache.js\";\nimport type { TodoItem } from \"../tools/todo-write.js\";\nimport type { WellGrowConfig } from \"../config/types.js\";\nimport type {\n ApprovalRequest,\n ApprovalDecision,\n} from \"../ui/approval-prompt.js\";\nimport type { Mode } from \"../tools/pipeline.js\";\nimport {\n createAbortController,\n clearAbortState,\n} from \"../signals.js\";\nimport { formatErrorMessage } from \"../ai/retry.js\";\nimport { useChatSession } from \"./use-chat-session.js\";\nimport { useChatMessages, extractText } from \"./use-chat-messages.js\";\nimport { useAskUserQueue } from \"./use-ask-user-queue.js\";\nimport { handleSlashCommand } from \"./slash-commands.js\";\n\nexport type ChatStatus = \"ready\" | \"submitted\" | \"streaming\" | \"error\";\n\nexport interface RetryInfo {\n attempt: number;\n maxRetries: number;\n delayMs: number;\n}\n\nexport interface UseChatOptions {\n agentName?: string;\n modelOverride?: string;\n config: WellGrowConfig;\n mode?: Mode;\n verbose?: boolean;\n initialMessage?: string;\n onExit: () => void;\n}\n\nexport function useChat({\n agentName,\n modelOverride,\n config,\n mode: initialMode,\n verbose,\n initialMessage,\n onExit,\n}: UseChatOptions) {\n const {\n session,\n recorder,\n isReady,\n currentModelName,\n currentAgentName,\n currentAgentIcon,\n agents,\n messageCountRef,\n switchModel,\n switchAgent,\n resetSession,\n } = useChatSession({\n agentName,\n modelOverride,\n config,\n mode: initialMode,\n verbose,\n });\n\n const {\n messages,\n messagesRef,\n addUserAndAssistant,\n updateAssistantParts,\n markInterrupted,\n setAssistantError,\n addSystemMessage,\n clearMessages,\n } = useChatMessages();\n\n const {\n activeAskUser,\n askUserQueueSize,\n advanceQueue,\n handleComplete: handleAskUserComplete,\n cancelAll: cancelAllAskUser,\n } = useAskUserQueue(\n useCallback(\n () => session?.ctx.agent.askUser ?? null,\n [session],\n ),\n );\n\n const [todos, setTodos] = useState<TodoItem[]>([]);\n const [retryInfo, setRetryInfo] = useState<RetryInfo | null>(null);\n const [status, setStatus] = useState<ChatStatus>(\"ready\");\n const [activeApproval, setActiveApproval] = useState<ApprovalRequest | null>(\n null,\n );\n const [mode, setMode] = useState<Mode>(\n initialMode ?? config.default.mode,\n );\n\n const approvalResolverRef = useRef<\n ((decision: ApprovalDecision) => void) | null\n >(null);\n\n const interruptedRef = useRef(false);\n const lastUsageRef = useRef<TurnUsage | null>(null);\n const streamStartedRef = useRef(false);\n const initialMessageSentRef = useRef(false);\n const handleSubmitRef = useRef<(text: string) => void>(() => {});\n\n useInput(\n (_input, key) => {\n if (key.escape) {\n const ac = session?.ctx.abort.userAbortController;\n if (ac && !ac.signal.aborted) {\n interruptedRef.current = true;\n ac.abort();\n }\n }\n },\n {\n isActive:\n (status === \"submitted\" || status === \"streaming\") &&\n !activeAskUser &&\n !activeApproval,\n },\n );\n\n const handleApprovalDecision = useCallback((decision: ApprovalDecision) => {\n setActiveApproval(null);\n approvalResolverRef.current?.(decision);\n approvalResolverRef.current = null;\n }, []);\n\n const handleModeToggle = useCallback(() => {\n if (!session) return;\n const newMode: Mode = mode === \"plan\" ? \"auto\" : \"plan\";\n session.agent.pipeline.setMode(newMode);\n setMode(newMode);\n }, [session, mode]);\n\n const handleSubmit = useCallback(\n async (text: string) => {\n const trimmed = text.trim();\n if (!trimmed || !session) return;\n\n const handled = await handleSlashCommand(trimmed, {\n session,\n status,\n mode,\n currentAgentName,\n currentAgentIcon,\n recorder,\n messageCountRef,\n cancelAllAskUser,\n resetSession,\n clearMessages,\n setTodos,\n setMode,\n switchModel,\n switchAgent,\n addSystemMessage,\n onExit,\n });\n if (handled) return;\n\n addUserAndAssistant(trimmed);\n setStatus(\"submitted\");\n streamStartedRef.current = false;\n setRetryInfo(null);\n interruptedRef.current = false;\n\n recorder?.recordUser(trimmed).catch(() => {});\n messageCountRef.current++;\n\n const ac = createAbortController(session.ctx.abort, config.api.timeout);\n try {\n const { fullText, parts: finalParts } = await sendMessage(\n session,\n trimmed,\n {\n onMessageUpdate: (parts) => {\n if (!streamStartedRef.current) {\n streamStartedRef.current = true;\n setStatus(\"streaming\");\n }\n updateAssistantParts(parts);\n },\n onRetry: (attempt, maxRetries, delayMs) => {\n setRetryInfo({ attempt, maxRetries, delayMs });\n },\n onUsage: (usage) => {\n lastUsageRef.current = usage;\n },\n onToolUIEvent: (event) => {\n switch (event.type) {\n case \"todoUpdate\":\n setTodos(event.todos as TodoItem[]);\n break;\n case \"askUser\":\n advanceQueue();\n break;\n }\n },\n onApprovalRequest: (request) => {\n return new Promise<ApprovalDecision>((resolve) => {\n approvalResolverRef.current = resolve;\n setActiveApproval(request);\n });\n },\n },\n {\n abortSignal: ac.signal,\n maxRetries: config.api.max_retries,\n maxOutputTokens: config.default.max_output_tokens,\n },\n );\n\n const wasInterrupted = interruptedRef.current;\n\n if (wasInterrupted) {\n markInterrupted();\n }\n\n const contentForRecording = wasInterrupted\n ? (() => {\n const lastMsg =\n messagesRef.current[messagesRef.current.length - 1];\n return lastMsg ? extractText(lastMsg) : \"\";\n })()\n : fullText;\n\n if (contentForRecording) {\n recorder?.recordAssistant(contentForRecording).catch(() => {});\n messageCountRef.current++;\n }\n\n updateAssistantParts(finalParts);\n } catch (error) {\n if (interruptedRef.current) {\n markInterrupted();\n const lastMsg =\n messagesRef.current[messagesRef.current.length - 1];\n const partialText = lastMsg ? extractText(lastMsg) : \"\";\n if (partialText) {\n await recorder\n ?.recordAssistant(partialText)\n .catch(() => {});\n messageCountRef.current++;\n }\n } else {\n setAssistantError(formatErrorMessage(error));\n }\n } finally {\n interruptedRef.current = false;\n clearAbortState(session.ctx.abort);\n setTodos([]);\n setRetryInfo(null);\n setActiveApproval(null);\n approvalResolverRef.current = null;\n setStatus(\"ready\");\n }\n },\n [\n session,\n recorder,\n onExit,\n config,\n status,\n mode,\n currentAgentName,\n currentAgentIcon,\n messageCountRef,\n cancelAllAskUser,\n resetSession,\n clearMessages,\n switchModel,\n switchAgent,\n addSystemMessage,\n addUserAndAssistant,\n updateAssistantParts,\n markInterrupted,\n setAssistantError,\n messagesRef,\n advanceQueue,\n ],\n );\n\n handleSubmitRef.current = handleSubmit;\n\n useEffect(() => {\n if (isReady && initialMessage && !initialMessageSentRef.current) {\n initialMessageSentRef.current = true;\n void handleSubmitRef.current(initialMessage);\n }\n }, [isReady, initialMessage]);\n\n return {\n messages,\n todos,\n retryInfo,\n status,\n isReady,\n currentModelName,\n currentAgentName,\n currentAgentIcon,\n mode,\n agents,\n activeAskUser,\n askUserQueueSize,\n activeApproval,\n lastUsage: lastUsageRef.current,\n handleSubmit,\n handleModeToggle,\n handleAskUserComplete,\n handleApprovalDecision,\n };\n}\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { randomUUID } from \"node:crypto\";\nimport type { LanguageModel } from \"ai\";\nimport {\n createSession,\n switchAgent as switchAgentSession,\n type Session,\n} from \"../core/session.js\";\nimport {\n createSessionRecorder,\n type SessionRecorder,\n} from \"../core/history.js\";\nimport { getModel, getModelDisplayName } from \"../ai/providers.js\";\nimport { listAgents } from \"../agents/loader.js\";\nimport type { AgentSummary } from \"../agents/types.js\";\nimport {\n registerShutdownHandler,\n setActiveSession,\n} from \"../signals.js\";\nimport { initLogger } from \"../logging.js\";\nimport { markdownReady } from \"../ui/markdown.js\";\nimport type { WellGrowConfig } from \"../config/types.js\";\nimport type { Mode } from \"../tools/pipeline.js\";\n\nexport interface ChatSessionState {\n session: Session | null;\n recorder: SessionRecorder | null;\n isReady: boolean;\n currentModelName: string;\n currentAgentName: string;\n currentAgentIcon: string;\n agents: AgentSummary[];\n currentModelRef: React.MutableRefObject<LanguageModel | null>;\n messageCountRef: React.MutableRefObject<number>;\n switchModel: (\n modelId: string,\n ) => { success: boolean; message: string };\n switchAgent: (\n agentName: string,\n ) => Promise<{ success: boolean; message: string }>;\n resetSession: () => Promise<void>;\n}\n\nexport interface UseChatSessionOptions {\n agentName?: string;\n modelOverride?: string;\n config: WellGrowConfig;\n mode?: Mode;\n verbose?: boolean;\n}\n\nexport function useChatSession({\n agentName: initialAgentName,\n modelOverride,\n config,\n mode,\n verbose,\n}: UseChatSessionOptions): ChatSessionState {\n const [isReady, setIsReady] = useState(false);\n const [currentModelName, setCurrentModelName] = useState(\"\");\n const [currentAgentName, setCurrentAgentName] = useState(\"\");\n const [currentAgentIcon, setCurrentAgentIcon] = useState(\"🤖\");\n const [agents, setAgents] = useState<AgentSummary[]>([]);\n\n const sessionRef = useRef<Session | null>(null);\n const recorderRef = useRef<SessionRecorder | null>(null);\n const messageCountRef = useRef(0);\n const currentModelRef = useRef<LanguageModel | null>(null);\n const currentAgentIdRef = useRef(initialAgentName ?? config.default.agent);\n\n useEffect(() => {\n let cancelled = false;\n const agentId = initialAgentName ?? config.default.agent;\n currentAgentIdRef.current = agentId;\n\n async function initialize(): Promise<void> {\n const [s, , agentList] = await Promise.all([\n createSession({\n agentName: agentId,\n modelOverride,\n modeOverride: mode,\n }),\n markdownReady,\n listAgents(),\n ]);\n\n if (cancelled) return;\n\n if (verbose) {\n s.ctx.logFile = await initLogger(\n randomUUID(),\n config.logging.log_dir,\n );\n }\n\n const recorder = await createSessionRecorder(\n getModelDisplayName(s.agent.modelId),\n agentId,\n );\n\n if (cancelled) return;\n\n sessionRef.current = s;\n recorderRef.current = recorder;\n currentModelRef.current = s.agent.model;\n setCurrentModelName(getModelDisplayName(s.agent.modelId));\n setCurrentAgentName(s.agent.name);\n setCurrentAgentIcon(s.agent.icon);\n setAgents(agentList);\n setActiveSession(s.ctx);\n registerShutdownHandler(async () => {\n if (recorderRef.current) {\n await recorderRef.current.finalize(messageCountRef.current);\n }\n });\n setIsReady(true);\n }\n\n void initialize().catch((error) => {\n if (cancelled) return;\n process.stderr.write(\n `セッション初期化エラー: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n });\n return () => {\n cancelled = true;\n };\n }, [initialAgentName, config, modelOverride, mode, verbose]);\n\n const switchModel = useCallback(\n (modelId: string): { success: boolean; message: string } => {\n try {\n const newModel = getModel(modelId, config);\n currentModelRef.current = newModel;\n setCurrentModelName(getModelDisplayName(modelId));\n if (sessionRef.current) {\n sessionRef.current.agent.model = newModel;\n (sessionRef.current.agent as { modelId: string }).modelId = modelId;\n }\n return {\n success: true,\n message: `モデルを ${modelId} に切り替えました。`,\n };\n } catch (error) {\n return {\n success: false,\n message: `モデル切り替えエラー: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n },\n [config],\n );\n\n const switchAgent = useCallback(\n async (\n newAgentName: string,\n ): Promise<{ success: boolean; message: string }> => {\n const session = sessionRef.current;\n if (!session) {\n return { success: false, message: \"セッションが初期化されていません。\" };\n }\n\n try {\n if (recorderRef.current) {\n await recorderRef.current.finalize(messageCountRef.current);\n }\n\n await switchAgentSession(session, newAgentName);\n currentAgentIdRef.current = newAgentName;\n\n currentModelRef.current = session.agent.model;\n setCurrentModelName(getModelDisplayName(session.agent.modelId));\n setCurrentAgentName(session.agent.name);\n setCurrentAgentIcon(session.agent.icon);\n setActiveSession(session.ctx);\n\n recorderRef.current = await createSessionRecorder(\n getModelDisplayName(session.agent.modelId),\n newAgentName,\n );\n messageCountRef.current = 0;\n\n return {\n success: true,\n message: `エージェントを ${session.agent.icon} ${session.agent.name} に切り替えました。`,\n };\n } catch (error) {\n return {\n success: false,\n message: `エージェント切り替えエラー: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n },\n [],\n );\n\n const resetSession = useCallback(async () => {\n const session = sessionRef.current;\n if (!session) return;\n\n if (recorderRef.current) {\n await recorderRef.current.finalize(messageCountRef.current);\n }\n\n const currentAgentId = currentAgentIdRef.current;\n const newSession = await createSession({\n agentName: currentAgentId,\n modelOverride,\n modeOverride: mode,\n });\n if (verbose) {\n newSession.ctx.logFile = await initLogger(\n randomUUID(),\n config.logging.log_dir,\n );\n }\n sessionRef.current = newSession;\n currentModelRef.current = newSession.agent.model;\n setCurrentModelName(getModelDisplayName(newSession.agent.modelId));\n setCurrentAgentName(newSession.agent.name);\n setCurrentAgentIcon(newSession.agent.icon);\n setActiveSession(newSession.ctx);\n recorderRef.current = await createSessionRecorder(\n getModelDisplayName(newSession.agent.modelId),\n currentAgentId,\n );\n messageCountRef.current = 0;\n }, [verbose, config, modelOverride, mode]);\n\n return {\n session: sessionRef.current,\n recorder: recorderRef.current,\n isReady,\n currentModelName,\n currentAgentName,\n currentAgentIcon,\n agents,\n currentModelRef,\n messageCountRef,\n switchModel,\n switchAgent,\n resetSession,\n };\n}\n","import { useState, useCallback, useRef } from \"react\";\nimport { randomUUID } from \"node:crypto\";\nimport type { DisplayMessage, MessagePart } from \"../ui/message-list.js\";\n\nfunction makeMessage(\n role: \"user\" | \"assistant\",\n text: string,\n): DisplayMessage {\n return {\n id: randomUUID(),\n role,\n parts: text ? [{ type: \"text\", text, state: \"done\" as const }] : [],\n };\n}\n\nfunction isPartCompleted(part: MessagePart): boolean {\n switch (part.type) {\n case \"text\":\n case \"reasoning\":\n return part.state === \"done\";\n case \"tool\":\n return part.state === \"output-available\"\n || part.state === \"output-error\"\n || part.state === \"output-denied\";\n case \"step-start\":\n case \"source-url\":\n return true;\n }\n}\n\nfunction countCompletedLeadingParts(parts: MessagePart[]): number {\n let count = 0;\n for (const p of parts) {\n if (isPartCompleted(p)) count++;\n else break;\n }\n return count;\n}\n\nexport function extractText(message: DisplayMessage): string {\n return message.parts\n .filter(\n (p): p is Extract<MessagePart, { type: \"text\" }> => p.type === \"text\",\n )\n .map((p) => p.text)\n .join(\"\");\n}\n\nexport interface ChatMessagesState {\n messages: DisplayMessage[];\n messagesRef: React.MutableRefObject<DisplayMessage[]>;\n addUserAndAssistant: (userText: string) => void;\n updateAssistantParts: (parts: MessagePart[]) => void;\n markInterrupted: () => void;\n setAssistantError: (errorMessage: string) => void;\n addSystemMessage: (text: string) => void;\n clearMessages: () => void;\n}\n\nexport function useChatMessages(): ChatMessagesState {\n const [messages, setMessages] = useState<DisplayMessage[]>([]);\n const messagesRef = useRef<DisplayMessage[]>([]);\n messagesRef.current = messages;\n const sealedCountRef = useRef(0);\n\n const addUserAndAssistant = useCallback((userText: string) => {\n sealedCountRef.current = 0;\n setMessages((prev) => [\n ...prev,\n makeMessage(\"user\", userText),\n { id: randomUUID(), role: \"assistant\", parts: [] },\n ]);\n }, []);\n\n const updateAssistantParts = useCallback((parts: MessagePart[]) => {\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (!last || last.role !== \"assistant\") return prev;\n\n const completedCount = countCompletedLeadingParts(parts);\n const alreadySealed = sealedCountRef.current;\n\n if (completedCount > alreadySealed && completedCount < parts.length) {\n const sealed: DisplayMessage = {\n id: `${last.id}-sealed-${completedCount}`,\n role: \"assistant\",\n parts: parts.slice(alreadySealed, completedCount),\n sealed: true,\n };\n sealedCountRef.current = completedCount;\n return [\n ...prev.slice(0, -1),\n sealed,\n { ...last, parts: parts.slice(completedCount) },\n ];\n }\n\n return [\n ...prev.slice(0, -1),\n { ...last, parts: parts.slice(alreadySealed) },\n ];\n });\n }, []);\n\n const markInterrupted = useCallback(() => {\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (!last || last.role !== \"assistant\") return prev;\n return [...prev.slice(0, -1), { ...last, interrupted: true }];\n });\n }, []);\n\n const setAssistantError = useCallback((errorMessage: string) => {\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (!last || last.role !== \"assistant\") return prev;\n return [\n ...prev.slice(0, -1),\n {\n ...last,\n parts: [\n {\n type: \"text\" as const,\n text: errorMessage,\n state: \"done\" as const,\n },\n ],\n },\n ];\n });\n }, []);\n\n const addSystemMessage = useCallback((text: string) => {\n setMessages((prev) => [...prev, makeMessage(\"assistant\", text)]);\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n }, []);\n\n return {\n messages,\n messagesRef,\n addUserAndAssistant,\n updateAssistantParts,\n markInterrupted,\n setAssistantError,\n addSystemMessage,\n clearMessages,\n };\n}\n","import { useState, useCallback } from \"react\";\nimport type { AskUserQuestion, AskUserAnswer } from \"../tools/ask-user.js\";\nimport {\n resolveAskUser,\n getNextPendingAskUser,\n getPendingAskUserCount,\n cancelAllPendingAskUser,\n type AskUserState,\n} from \"../tools/ask-user.js\";\n\nexport interface AskUserQueueState {\n activeAskUser: {\n toolCallId: string;\n questions: AskUserQuestion[];\n } | null;\n askUserQueueSize: number;\n advanceQueue: () => void;\n handleComplete: (answers: Record<string, AskUserAnswer>) => void;\n cancelAll: () => void;\n}\n\nexport function useAskUserQueue(\n getAskUserState: () => AskUserState | null,\n): AskUserQueueState {\n const [activeAskUser, setActiveAskUser] = useState<{\n toolCallId: string;\n questions: AskUserQuestion[];\n } | null>(null);\n const [askUserQueueSize, setAskUserQueueSize] = useState(0);\n\n const advanceQueue = useCallback(() => {\n const state = getAskUserState();\n if (!state) return;\n const next = getNextPendingAskUser(state);\n if (next) {\n setActiveAskUser(next);\n setAskUserQueueSize(getPendingAskUserCount(state));\n } else {\n setActiveAskUser(null);\n setAskUserQueueSize(0);\n }\n }, [getAskUserState]);\n\n const handleComplete = useCallback(\n (answers: Record<string, AskUserAnswer>) => {\n const state = getAskUserState();\n if (activeAskUser && state) {\n resolveAskUser(state, activeAskUser.toolCallId, answers);\n }\n advanceQueue();\n },\n [activeAskUser, advanceQueue, getAskUserState],\n );\n\n const cancelAll = useCallback(() => {\n const state = getAskUserState();\n if (state) {\n cancelAllPendingAskUser(state);\n }\n setActiveAskUser(null);\n setAskUserQueueSize(0);\n }, [getAskUserState]);\n\n return {\n activeAskUser,\n askUserQueueSize,\n advanceQueue,\n handleComplete,\n cancelAll,\n };\n}\n","import type { Session } from \"../core/session.js\";\nimport type { SessionRecorder } from \"../core/history.js\";\nimport type { TodoItem } from \"../tools/todo-write.js\";\nimport type { Mode } from \"../tools/pipeline.js\";\n\nexport interface SlashCommandContext {\n session: Session;\n status: \"ready\" | \"submitted\" | \"streaming\" | \"error\";\n mode: Mode;\n currentAgentName: string;\n currentAgentIcon: string;\n recorder: SessionRecorder | null;\n messageCountRef: { current: number };\n cancelAllAskUser: () => void;\n resetSession: () => Promise<void>;\n clearMessages: () => void;\n setTodos: (todos: TodoItem[]) => void;\n setMode: (mode: Mode) => void;\n switchModel: (modelId: string) => { message: string };\n switchAgent: (\n agentName: string,\n ) => Promise<{ success: boolean; message: string }>;\n addSystemMessage: (text: string) => void;\n onExit: () => void;\n}\n\nexport async function handleSlashCommand(\n text: string,\n ctx: SlashCommandContext,\n): Promise<boolean> {\n if (text === \"exit\" || text === \"quit\") {\n ctx.cancelAllAskUser();\n if (ctx.recorder) {\n await ctx.recorder.finalize(ctx.messageCountRef.current);\n }\n ctx.onExit();\n return true;\n }\n\n if (text === \"/clear\") {\n ctx.cancelAllAskUser();\n await ctx.resetSession();\n ctx.clearMessages();\n ctx.setTodos([]);\n return true;\n }\n\n const agentMatch = text.match(/^\\/agent(?:\\s+(.+))?$/);\n if (agentMatch) {\n const newAgent = agentMatch[1]?.trim();\n if (!newAgent) {\n ctx.addSystemMessage(\n `現在のエージェント: ${ctx.currentAgentIcon} ${ctx.currentAgentName}`,\n );\n return true;\n }\n if (ctx.status !== \"ready\") {\n ctx.addSystemMessage(\n \"推論中はエージェントを切り替えられません。完了後に再度お試しください。\",\n );\n return true;\n }\n ctx.cancelAllAskUser();\n ctx.clearMessages();\n ctx.setTodos([]);\n const result = await ctx.switchAgent(newAgent);\n if (result.success) {\n ctx.setMode(ctx.session.agent.pipeline.mode);\n }\n ctx.addSystemMessage(result.message);\n return true;\n }\n\n const modeMatch = text.match(/^\\/mode(?:\\s+(.+))?$/);\n if (modeMatch) {\n const newMode = modeMatch[1]?.trim() as Mode | undefined;\n if (!newMode) {\n ctx.addSystemMessage(`現在のモード: ${ctx.mode}`);\n return true;\n }\n const valid: Mode[] = [\"plan\", \"auto\"];\n if (!valid.includes(newMode)) {\n ctx.addSystemMessage(\n `無効なモードです。有効な値: ${valid.join(\", \")}`,\n );\n return true;\n }\n ctx.session.agent.pipeline.setMode(newMode);\n ctx.setMode(newMode);\n ctx.addSystemMessage(`モードを ${newMode} に切り替えました。`);\n return true;\n }\n\n const modelMatch = text.match(/^\\/model\\s+(.+)/);\n if (modelMatch) {\n if (ctx.status !== \"ready\") {\n ctx.addSystemMessage(\n \"推論中はモデルを切り替えられません。完了後に再度お試しください。\",\n );\n return true;\n }\n const result = ctx.switchModel(modelMatch[1].trim());\n ctx.addSystemMessage(result.message);\n return true;\n }\n\n return false;\n}\n","import { Command } from \"commander\";\nimport {\n loadConfig,\n updateConfigField,\n ConfigLoadError,\n} from \"../config/index.js\";\n\nexport function registerConfigCommand(program: Command): void {\n const configCmd = program\n .command(\"config\")\n .description(\"設定の管理\");\n\n configCmd\n .command(\"show\")\n .description(\"現在の設定を表示\")\n .action(async () => {\n try {\n const config = await loadConfig();\n console.log(JSON.stringify(config, null, 2));\n } catch (error) {\n if (error instanceof ConfigLoadError) {\n console.error(error.message);\n return;\n }\n throw error;\n }\n });\n\n configCmd\n .command(\"model\")\n .description(\"デフォルトモデルを変更\")\n .argument(\"[model-id]\", \"設定するモデルID\")\n .action(async (modelId?: string) => {\n try {\n if (!modelId) {\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n modelId = await new Promise<string>((resolve) => {\n rl.question(\"モデルID (例: claude-sonnet-4-20250514, gemini-2.5-pro): \", (answer: string) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n }\n\n if (!modelId) {\n console.error(\"モデルIDを指定してください\");\n return;\n }\n\n await updateConfigField(\"default\", \"model\", modelId);\n console.log(`デフォルトモデルを ${modelId} に変更しました。`);\n } catch (error) {\n if (error instanceof ConfigLoadError) {\n console.error(error.message);\n return;\n }\n console.error(\"設定ファイルの更新に失敗しました。\");\n }\n });\n\n configCmd\n .action(async () => {\n try {\n const config = await loadConfig();\n console.log(`モデル: ${config.default.model}`);\n console.log(`プロバイダー: ${config.default.provider}`);\n console.log(`エージェント: ${config.default.agent}`);\n console.log(`モード: ${config.default.mode}`);\n } catch (error) {\n if (error instanceof ConfigLoadError) {\n console.error(error.message);\n return;\n }\n throw error;\n }\n });\n}\n","import { Command } from \"commander\";\nimport { listHistory, getSessionContent } from \"../core/history.js\";\n\nexport function registerHistoryCommand(program: Command): void {\n const historyCmd = program\n .command(\"history\")\n .description(\"セッション履歴\");\n\n historyCmd\n .argument(\"[session-id]\", \"セッションIDで詳細表示\")\n .action(async (sessionId?: string) => {\n if (sessionId) {\n const content = await getSessionContent(sessionId);\n if (content) {\n console.log(content);\n } else {\n console.error(`セッション ${sessionId} が見つかりません`);\n }\n return;\n }\n\n const entries = await listHistory();\n if (entries.length === 0) {\n console.log(\"履歴がありません\");\n return;\n }\n\n for (const entry of entries) {\n const date = new Date(entry.timestamp).toLocaleString(\"ja-JP\");\n console.log(`${date} ${entry.model} ${entry.summary}`);\n console.log(` ID: ${entry.session_id}`);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { platform } from \"node:os\";\nimport { checkRecommendedTools, type DoctorResult } from \"../config/recommended-tools.js\";\n\nfunction getPackageManagerKey(): string {\n const os = platform();\n if (os === \"darwin\") return \"brew\";\n return \"apt\";\n}\n\nfunction formatDoctorResult(result: DoctorResult): string {\n const pmKey = getPackageManagerKey();\n const lines: string[] = [];\n\n lines.push(\"🩺 WellGrow Doctor — 推奨ツールチェック\\n\");\n\n for (const cat of result.categories) {\n lines.push(` ${cat.label}`);\n for (const tool of cat.tools) {\n if (tool.installed) {\n const ver = tool.version ? ` (${tool.version})` : \"\";\n lines.push(` ✅ ${tool.name}${ver} — ${tool.description}`);\n } else {\n const installCmd = tool.install[pmKey] ?? Object.values(tool.install)[0] ?? \"\";\n lines.push(` ❌ ${tool.name} — ${tool.description}`);\n lines.push(` → ${installCmd}`);\n }\n }\n lines.push(\"\");\n }\n\n lines.push(\n ` 結果: ${result.installedCount} インストール済 / ${result.missingCount} 未インストール`,\n );\n\n if (result.missingCount > 0) {\n lines.push(\"\");\n lines.push(\" 一括インストール:\");\n\n const missing = result.categories\n .flatMap((c) => c.tools)\n .filter((t) => !t.installed);\n\n if (pmKey === \"brew\") {\n const names = missing\n .map((t) => {\n const cmd = t.install.brew;\n if (!cmd) return null;\n return cmd.replace(\"brew install \", \"\");\n })\n .filter(Boolean);\n if (names.length > 0) {\n lines.push(` brew install ${names.join(\" \")}`);\n }\n } else {\n const aptTools = missing.filter((t) => t.install.apt?.startsWith(\"sudo apt\"));\n const otherTools = missing.filter((t) => !t.install.apt?.startsWith(\"sudo apt\"));\n\n if (aptTools.length > 0) {\n const names = aptTools\n .map((t) => t.install.apt!.replace(\"sudo apt install -y \", \"\"))\n .filter(Boolean);\n lines.push(` sudo apt install -y ${names.join(\" \")}`);\n }\n for (const t of otherTools) {\n const cmd = t.install.apt ?? Object.values(t.install)[0] ?? \"\";\n if (cmd) lines.push(` ${cmd}`);\n }\n }\n }\n\n if (result.missingCount === 0) {\n lines.push(\"\\n 🎉 すべての推奨ツールがインストール済みです!\");\n }\n\n return lines.join(\"\\n\");\n}\n\nexport async function runDoctor(): Promise<DoctorResult> {\n const result = await checkRecommendedTools();\n process.stdout.write(formatDoctorResult(result) + \"\\n\");\n return result;\n}\n\nexport function registerDoctorCommand(program: Command): void {\n program\n .command(\"doctor\")\n .description(\"推奨ツールのインストール状況を確認する\")\n .action(async () => {\n await runDoctor();\n });\n}\n","import { Command } from \"commander\";\nimport {\n readFile,\n readdir,\n mkdir,\n cp,\n rm,\n mkdtemp,\n stat,\n} from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport matter from \"gray-matter\";\n\nconst execFileAsync = promisify(execFile);\nconst WELLGROW_HOME = join(homedir(), \".wellgrow\");\nconst SKILLS_DIR = join(WELLGROW_HOME, \"skills\");\n\nconst SKIP_DIRS = new Set([\".git\", \"node_modules\", \".github\", \".husky\"]);\n\nexport interface SkillInfo {\n name: string;\n description: string;\n sourceDir: string;\n}\n\nexport function parseSource(source: string): { url: string; ref?: string } {\n if (source.startsWith(\"./\") || source.startsWith(\"../\")) {\n return { url: resolve(source) };\n }\n\n if (/^[\\w.-]+\\/[\\w.-]+$/.test(source)) {\n return { url: `https://github.com/${source}.git` };\n }\n\n if (source.startsWith(\"https://\") || source.startsWith(\"git@\")) {\n const treeMatch = source.match(\n /github\\.com\\/([^/]+\\/[^/]+)\\/tree\\/([^/]+)/,\n );\n if (treeMatch) {\n return {\n url: `https://github.com/${treeMatch[1]}.git`,\n ref: treeMatch[2],\n };\n }\n return { url: source.replace(/\\/$/, \"\") };\n }\n\n return { url: resolve(source) };\n}\n\nexport async function discoverSkillsInRepo(dir: string): Promise<SkillInfo[]> {\n const skills: SkillInfo[] = [];\n const seen = new Set<string>();\n\n async function scan(currentDir: string, depth: number): Promise<void> {\n if (depth > 3) return;\n\n try {\n const content = await readFile(join(currentDir, \"SKILL.md\"), \"utf-8\");\n const { data } = matter(content);\n if (data.name && data.description && !seen.has(data.name as string)) {\n seen.add(data.name as string);\n skills.push({\n name: data.name as string,\n description: (data.description as string).trim(),\n sourceDir: currentDir,\n });\n }\n return;\n } catch {\n // No SKILL.md here — scan subdirectories\n }\n\n try {\n const entries = await readdir(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory() || SKIP_DIRS.has(entry.name)) continue;\n await scan(join(currentDir, entry.name), depth + 1);\n }\n } catch {\n // Can't read directory\n }\n }\n\n await scan(dir, 0);\n return skills;\n}\n\nasync function fetchSource(\n source: string,\n): Promise<{ dir: string; isTemp: boolean }> {\n const parsed = parseSource(source);\n\n if (!parsed.url.startsWith(\"https://\") && !parsed.url.startsWith(\"git@\")) {\n return { dir: parsed.url, isTemp: false };\n }\n\n const tmpDir = await mkdtemp(join(tmpdir(), \"wellgrow-skills-\"));\n const args = [\"clone\", \"--depth\", \"1\"];\n if (parsed.ref) {\n args.push(\"--branch\", parsed.ref);\n }\n args.push(parsed.url, tmpDir);\n\n try {\n await execFileAsync(\"git\", args, { timeout: 30_000 });\n } catch (error) {\n await rm(tmpDir, { recursive: true, force: true }).catch(() => {});\n throw new Error(\n `リポジトリのクローンに失敗: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n return { dir: tmpDir, isTemp: true };\n}\n\nexport function registerSkillsCommand(program: Command): void {\n const skills = program\n .command(\"skills\")\n .description(\"スキルの管理\");\n\n // --- add ---\n skills\n .command(\"add <source>\")\n .description(\"GitHub リポジトリからスキルをインストール\")\n .option(\"-s, --skill <names...>\", \"特定のスキルのみインストール\")\n .option(\"-l, --list\", \"インストールせずにスキル一覧を表示\")\n .action(async (source: string, opts: { skill?: string[]; list?: boolean }) => {\n process.stdout.write(`\\n📦 ${source} からスキルを取得中...\\n`);\n\n let fetched: { dir: string; isTemp: boolean } | null = null;\n try {\n fetched = await fetchSource(source);\n\n const found = await discoverSkillsInRepo(fetched.dir);\n if (found.length === 0) {\n process.stderr.write(\"スキルが見つかりませんでした。\\n\");\n return;\n }\n\n if (opts.list) {\n process.stdout.write(\n `\\n${found.length} 個のスキルが見つかりました:\\n\\n`,\n );\n for (const s of found) {\n process.stdout.write(` ${s.name}\\n ${s.description}\\n\\n`);\n }\n return;\n }\n\n let toInstall = found;\n if (opts.skill) {\n const names = new Set(opts.skill);\n toInstall = found.filter((s) => names.has(s.name));\n const missing = opts.skill.filter(\n (n) => !found.some((s) => s.name === n),\n );\n if (missing.length > 0) {\n process.stderr.write(\n `⚠ 見つからないスキル: ${missing.join(\", \")}\\n`,\n );\n }\n }\n\n if (toInstall.length === 0) {\n process.stderr.write(\"インストールするスキルがありません。\\n\");\n return;\n }\n\n await mkdir(SKILLS_DIR, { recursive: true });\n\n process.stdout.write(\n `\\n${toInstall.length} 個のスキルをインストール:\\n\\n`,\n );\n for (const skill of toInstall) {\n const dest = join(SKILLS_DIR, skill.name);\n await cp(skill.sourceDir, dest, { recursive: true, force: true });\n process.stdout.write(` ✓ ${skill.name}\\n`);\n }\n\n process.stdout.write(\n `\\n✅ ${SKILLS_DIR} にインストールしました。\\n`,\n );\n } catch (error) {\n process.stderr.write(\n `✗ ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exitCode = 1;\n } finally {\n if (fetched?.isTemp) {\n await rm(fetched.dir, { recursive: true, force: true }).catch(\n () => {},\n );\n }\n }\n });\n\n // --- list ---\n skills\n .command(\"list\")\n .alias(\"ls\")\n .description(\"インストール済みスキルを一覧表示\")\n .action(async () => {\n let dirs: string[];\n try {\n const entries = await readdir(SKILLS_DIR, { withFileTypes: true });\n dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n dirs = [];\n }\n\n if (dirs.length === 0) {\n process.stdout.write(\"インストール済みのスキルはありません。\\n\");\n return;\n }\n\n process.stdout.write(`\\n${dirs.length} 個のスキル (${SKILLS_DIR}):\\n\\n`);\n for (const name of dirs) {\n try {\n const content = await readFile(\n join(SKILLS_DIR, name, \"SKILL.md\"),\n \"utf-8\",\n );\n const { data } = matter(content);\n process.stdout.write(\n ` ${data.name ?? name}\\n ${(data.description as string | undefined)?.trim() ?? \"\"}\\n\\n`,\n );\n } catch {\n process.stdout.write(` ${name}\\n (SKILL.md なし)\\n\\n`);\n }\n }\n });\n\n // --- remove ---\n skills\n .command(\"remove <name>\")\n .alias(\"rm\")\n .description(\"スキルを削除\")\n .action(async (name: string) => {\n const skillDir = join(SKILLS_DIR, name);\n try {\n await stat(skillDir);\n } catch {\n process.stderr.write(`スキル \"${name}\" が見つかりません。\\n`);\n process.exitCode = 1;\n return;\n }\n\n await rm(skillDir, { recursive: true, force: true });\n process.stdout.write(`✓ ${name} を削除しました。\\n`);\n });\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { render, Box, Text, useInput } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport { createElement } from \"react\";\nimport { colors } from \"./colors.js\";\n\nexport interface OnboardingResult {\n name: string;\n apiKey: string | null;\n}\n\ninterface Props {\n onComplete: (result: OnboardingResult) => void;\n}\n\ntype Step =\n | \"welcome\"\n | \"name\"\n | \"nameSubmitted\"\n | \"apiKeyCheck\"\n | \"apiKeyMethod\"\n | \"setupTokenGuide\"\n | \"setupTokenInput\"\n | \"apiKeyInput\"\n | \"apiKeySubmitted\"\n | \"saving\"\n | \"done\";\n\nexport type ApiKeyMethod = \"setup-token\" | \"api-key\";\n\nexport function isValidName(value: string): boolean {\n return value.trim().length > 0;\n}\n\nexport function isValidApiKey(value: string): boolean {\n const trimmed = value.trim();\n return trimmed.length > 0 && trimmed.startsWith(\"sk-ant-\");\n}\n\n// ink-text-input v6 has a paste truncation bug on Linux/WSL where long pasted\n// strings are split across multiple input events, losing characters (Issue #90).\n// This component uses useInput directly to handle paste correctly.\nfunction MaskedInput({ onSubmit, placeholder }: { onSubmit: (value: string) => void; placeholder?: string }) {\n const [value, setValue] = useState(\"\");\n\n useInput((input, key) => {\n if (key.return) {\n onSubmit(value);\n return;\n }\n if (key.backspace || key.delete) {\n setValue((prev) => prev.slice(0, -1));\n return;\n }\n if (key.ctrl || key.meta || key.escape || key.upArrow || key.downArrow || key.leftArrow || key.rightArrow || key.tab) {\n return;\n }\n setValue((prev) => prev + input);\n });\n\n if (value.length === 0 && placeholder) {\n return <Text dimColor>{placeholder}</Text>;\n }\n return <Text>{\"*\".repeat(value.length)}</Text>;\n}\n\nconst API_KEY_OPTIONS: { id: ApiKeyMethod; label: string; description: string }[] = [\n {\n id: \"setup-token\",\n label: \"setup-token\",\n description: \"Claude Code を使っている方に推奨\",\n },\n {\n id: \"api-key\",\n label: \"API キー\",\n description: \"Anthropic API キーを直接入力\",\n },\n];\n\nfunction BotMessage({ children }: { children: React.ReactNode }) {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n {children}\n </Box>\n );\n}\n\nfunction UserMessage({ text }: { text: string }) {\n return (\n <Box\n borderStyle=\"bold\"\n borderLeft\n borderTop={false}\n borderBottom={false}\n borderRight={false}\n borderColor={colors.joy}\n paddingLeft={1}\n marginBottom={1}\n >\n <Text>{text}</Text>\n </Box>\n );\n}\n\ninterface MethodSelectorProps {\n onSelect: (method: ApiKeyMethod) => void;\n}\n\nfunction MethodSelector({ onSelect }: MethodSelectorProps) {\n const [cursor, setCursor] = useState(0);\n\n useInput((_input, key) => {\n if (key.upArrow) setCursor((prev) => Math.max(0, prev - 1));\n if (key.downArrow) setCursor((prev) => Math.min(API_KEY_OPTIONS.length - 1, prev + 1));\n if (key.return) onSelect(API_KEY_OPTIONS[cursor].id);\n });\n\n return (\n <Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n {API_KEY_OPTIONS.map((opt, i) => {\n const active = i === cursor;\n return (\n <Box key={opt.id}>\n <Text color={active ? colors.joy : undefined} bold={active}>\n {active ? \"❯ \" : \" \"}\n {opt.label}\n </Text>\n <Text color={colors.fog}> — {opt.description}</Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n\nfunction OnboardingWizard({ onComplete }: Props) {\n const [step, setStep] = useState<Step>(\"welcome\");\n const [name, setName] = useState(\"\");\n const [nameValue, setNameValue] = useState(\"\");\n const [apiKey, setApiKey] = useState(\"\");\n const [hasEnvKey, setHasEnvKey] = useState(false);\n const [chosenMethod, setChosenMethod] = useState<ApiKeyMethod | null>(null);\n\n useEffect(() => {\n const timer = setTimeout(() => setStep(\"name\"), 800);\n return () => clearTimeout(timer);\n }, []);\n\n useEffect(() => {\n if (step === \"nameSubmitted\") {\n const timer = setTimeout(() => {\n if (process.env.ANTHROPIC_API_KEY) {\n setHasEnvKey(true);\n setStep(\"apiKeyCheck\");\n } else {\n setStep(\"apiKeyMethod\");\n }\n }, 400);\n return () => clearTimeout(timer);\n }\n\n if (step === \"apiKeyCheck\") {\n const timer = setTimeout(() => setStep(\"saving\"), 800);\n return () => clearTimeout(timer);\n }\n\n if (step === \"apiKeySubmitted\") {\n const timer = setTimeout(() => setStep(\"saving\"), 400);\n return () => clearTimeout(timer);\n }\n\n if (step === \"saving\") {\n const timer = setTimeout(() => setStep(\"done\"), 600);\n return () => clearTimeout(timer);\n }\n\n if (step === \"done\") {\n const timer = setTimeout(() => {\n onComplete({\n name,\n apiKey: hasEnvKey ? null : apiKey || null,\n });\n }, 400);\n return () => clearTimeout(timer);\n }\n }, [step, name, apiKey, hasEnvKey, onComplete]);\n\n const handleNameSubmit = useCallback((value: string) => {\n if (!isValidName(value)) return;\n setName(value.trim());\n setStep(\"nameSubmitted\");\n }, []);\n\n const handleMethodSelect = useCallback((method: ApiKeyMethod) => {\n setChosenMethod(method);\n if (method === \"setup-token\") {\n setStep(\"setupTokenGuide\");\n } else {\n setStep(\"apiKeyInput\");\n }\n }, []);\n\n const handleApiKeySubmit = useCallback((value: string) => {\n const trimmed = value.trim();\n if (trimmed.length === 0) return;\n if (chosenMethod === \"api-key\" && !trimmed.startsWith(\"sk-ant-\")) return;\n setApiKey(trimmed);\n setStep(\"apiKeySubmitted\");\n }, [chosenMethod]);\n\n const pastNameSteps: Step[] = [\n \"nameSubmitted\", \"apiKeyCheck\", \"apiKeyMethod\",\n \"setupTokenGuide\", \"setupTokenInput\",\n \"apiKeyInput\", \"apiKeySubmitted\", \"saving\", \"done\",\n ];\n\n const pastMethodSteps: Step[] = [\n \"setupTokenGuide\", \"setupTokenInput\",\n \"apiKeyInput\", \"apiKeySubmitted\", \"saving\", \"done\",\n ];\n\n return (\n <Box flexDirection=\"column\">\n <BotMessage>\n <Text>やっほぉー!✨ ようこそ!</Text>\n <Text>あなただけのAIアシスタントをセットアップしよう 😊</Text>\n </BotMessage>\n\n {step === \"welcome\" && (\n <Text color={colors.fog}>...</Text>\n )}\n\n {step !== \"welcome\" && (\n <BotMessage>\n <Text>まず、お名前を教えてくれるかな? 🌈</Text>\n </BotMessage>\n )}\n\n {step === \"name\" && (\n <Box>\n <Text color={colors.joy}>{\"❯ \"}</Text>\n <TextInput\n value={nameValue}\n onChange={setNameValue}\n onSubmit={handleNameSubmit}\n placeholder=\"名前を入力...\"\n />\n </Box>\n )}\n\n {name && <UserMessage text={name} />}\n\n {pastNameSteps.includes(step) && (\n <BotMessage>\n <Text>{name}さんだね!よろしくね〜!🎉</Text>\n </BotMessage>\n )}\n\n {/* API key method selection */}\n {step === \"apiKeyMethod\" && (\n <>\n <BotMessage>\n <Text>次に、AIと会話するためのAPIキーを設定するよ!💪</Text>\n <Text>取得方法を選んでね:</Text>\n </BotMessage>\n <MethodSelector onSelect={handleMethodSelect} />\n </>\n )}\n\n {/* Show chosen method as user message */}\n {chosenMethod && pastMethodSteps.includes(step) && (\n <UserMessage\n text={chosenMethod === \"setup-token\" ? \"setup-token\" : \"API キー\"}\n />\n )}\n\n {/* setup-token guide */}\n {step === \"setupTokenGuide\" && (\n <BotMessage>\n <Text>別のターミナルで、このコマンドを実行してね:</Text>\n <Text />\n <Text color={colors.insight}>{\" $ \"}<Text bold>claude setup-token</Text></Text>\n <Text />\n <Text>出てきた sk-ant- で始まるAPIキーを貼り付けてね!✨</Text>\n <Text color={colors.fog}>(※ Authentication Code じゃなくて、その後に表示されるAPIキーだよ)</Text>\n </BotMessage>\n )}\n\n {(step === \"setupTokenGuide\" || step === \"setupTokenInput\") && (\n <Box>\n <Text color={colors.joy}>{\"❯ \"}</Text>\n <MaskedInput onSubmit={handleApiKeySubmit} placeholder=\"sk-ant-...\" />\n </Box>\n )}\n\n {/* Direct API key input */}\n {step === \"apiKeyInput\" && (\n <>\n <BotMessage>\n <Text>Anthropic の API キーを入力してね!</Text>\n <Text />\n <Text color={colors.insight}>\n {\"💡 \"}\n <Text color={colors.flow} underline>\n https://console.anthropic.com/settings/keys\n </Text>\n {\" から取得できるよ\"}\n </Text>\n </BotMessage>\n <Box>\n <Text color={colors.joy}>{\"❯ \"}</Text>\n <MaskedInput onSubmit={handleApiKeySubmit} placeholder=\"sk-ant-...\" />\n </Box>\n </>\n )}\n\n {step === \"apiKeySubmitted\" && (\n <BotMessage>\n <Text>APIキーを設定してるよ... ⏳</Text>\n </BotMessage>\n )}\n\n {step === \"apiKeyCheck\" && (\n <BotMessage>\n <Text color={colors.growth}>{\"✓ \"}<Text>APIキーはもう設定されてるね!</Text></Text>\n </BotMessage>\n )}\n\n {(step === \"saving\" || step === \"done\") && (\n <BotMessage>\n <Text color={colors.growth}>{\"✓ \"}<Text>設定完了!わぉおぉぉ!🎊</Text></Text>\n <Text />\n <Text>これからAIアシスタントがセットアップの続きをお手伝いするね!✨</Text>\n </BotMessage>\n )}\n\n {step === \"done\" && (\n <Text color={colors.fog}>──────────────────────────────────────</Text>\n )}\n </Box>\n );\n}\n\nexport async function runOnboardingWizard(): Promise<OnboardingResult> {\n return new Promise((resolve) => {\n const { unmount } = render(\n createElement(OnboardingWizard, {\n onComplete: (result) => {\n unmount();\n resolve(result);\n },\n }),\n );\n });\n}\n"],"mappings":"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","names":["render","createElement","randomUUID","retryable","resolve","appendFile","mkdir","join","homedir","tool","z","z","resolve","join","readFile","join","homedir","parse","z","join","homedir","join","readFile","parse","readdir","join","homedir","readFile","z","inputSchema","z","readFile","writeFile","readFile","mkdir","createHash","z","inputSchema","z","readFile","mkdir","writeFile","createHash","readFile","writeFile","createHash","structuredPatch","execFile","promisify","z","execFileAsync","promisify","execFile","createHash","generateStructuredPatch","structuredPatch","getGitDiff","inputSchema","z","readFile","writeFile","writeFile","mkdir","join","homedir","createHash","z","mkdir","homedir","resolve","inputSchema","z","timeout","createHash","join","writeFile","stat","resolve","z","inputSchema","z","resolve","stat","execFile","promisify","z","execFileAsync","promisify","execFile","inputSchema","z","z","inputSchema","z","readFile","join","homedir","readFile","writeFile","mkdir","join","homedir","randomUUID","resolve","readFile","join","homedir","readFile","readdir","join","resolve","homedir","join","appendFile","readFile","mkdir","readdir","join","homedir","randomUUID","useMemo","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsxs","TodoList","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","useInput","jsx","jsxs","tool","useInput","Box","Text","useState","useMemo","Box","Text","useInput","jsx","jsxs","useState","useMemo","useInput","Box","Text","useState","Text","jsx","jsxs","useState","Text","useState","useCallback","useRef","useEffect","useInput","useState","useEffect","useCallback","randomUUID","useState","useEffect","randomUUID","useCallback","switchAgent","useState","useCallback","useRef","randomUUID","useState","useCallback","useState","useCallback","switchAgent","useCallback","useState","useRef","useInput","resolve","useEffect","jsx","jsxs","useMemo","Box","Text","program","resolve","program","platform","platform","tool","program","readFile","readdir","mkdir","rm","stat","join","resolve","homedir","execFile","promisify","matter","execFileAsync","WELLGROW_HOME","program","useState","useEffect","useCallback","Box","Text","useInput","TextInput","Fragment","jsx","jsxs","useState","useInput","jsx","Text","Box","jsxs","useEffect","useCallback","TextInput","Fragment","resolve","randomUUID","config","verbose","render","createElement"]}