opencode-plugin-mimic 0.1.5 โ†’ 0.1.6

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/format.ts","../src/i18n.ts","../src/git.ts","../src/patterns.ts","../src/state.ts","../src/tools.ts","../src/evolution.ts","../src/level.ts","../src/index.ts"],"sourcesContent":["import { differenceInHours, format, formatDistanceToNow } from \"date-fns\";\nimport { enUS, ko } from \"date-fns/locale\";\nimport type { MimicContext } from \"@/context\";\nimport { formatCapabilityType } from \"@/i18n\";\nimport type { State } from \"@/types\";\n\nexport type SessionStatus =\n | \"first-time\"\n | \"continuing\"\n | \"same-day\"\n | \"short-break\"\n | \"week-break\"\n | \"long-break\";\n\nexport function analyzeTimeSinceLastSession(lastSession: string | null): SessionStatus {\n if (!lastSession) return \"first-time\";\n const hours = differenceInHours(new Date(), new Date(lastSession));\n if (hours < 1) return \"continuing\";\n if (hours < 24) return \"same-day\";\n if (hours < 72) return \"short-break\";\n if (hours < 168) return \"week-break\";\n return \"long-break\";\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Complex narrative formatting for Mimic's journey display\nexport function formatJourney(ctx: MimicContext, state: State, gitHistory: string[]): string {\n const milestones = state.journey.milestones.slice(-10);\n const observations = state.journey.observations.slice(-5);\n const locale = ctx.i18n.language === \"ko-KR\" ? ko : enUS;\n\n let output = `${ctx.i18n.t(\"journey.title\", { project: state.project.name })}\\n\\n`;\n output += `${ctx.i18n.t(\"journey.subtitle\")}\\n\\n`;\n output += `${ctx.i18n.t(\"journey.sessions_survived\", {\n count: state.journey.sessionCount,\n })}\\n`;\n output += `${ctx.i18n.t(\"journey.first_encounter\", {\n date: format(state.project.firstSession, \"yyyy-MM-dd\"),\n })}\\n`;\n output += `${ctx.i18n.t(\"journey.abilities_gained\", {\n count: state.evolution.capabilities.length,\n })}\\n\\n`;\n\n if (state.project.stack && state.project.stack.length > 0) {\n output += `${ctx.i18n.t(\"journey.treasures\", {\n stack: state.project.stack.join(\", \"),\n })}\\n`;\n }\n if (state.project.focus) {\n output += `${ctx.i18n.t(\"journey.current_hunt\", { focus: state.project.focus })}\\n`;\n }\n output += \"\\n\";\n\n if (milestones.length > 0) {\n output += `${ctx.i18n.t(\"journey.victories\")}\\n`;\n for (const m of milestones) {\n const timeAgo = formatDistanceToNow(new Date(m.timestamp), { addSuffix: true, locale });\n output += `- ${m.milestone} (${timeAgo})\\n`;\n }\n output += \"\\n\";\n }\n\n if (observations.length > 0) {\n output += `${ctx.i18n.t(\"journey.witnessed\")}\\n`;\n for (const o of observations) {\n output += `- ${o.observation}\\n`;\n }\n output += \"\\n\";\n }\n\n if (state.evolution.capabilities.length > 0) {\n output += `${ctx.i18n.t(\"journey.powers\")}\\n`;\n for (const cap of state.evolution.capabilities.slice(-5)) {\n output += `- **${cap.name}** (${formatCapabilityType(\n ctx.i18n,\n cap.type,\n )}): ${cap.description}\\n`;\n }\n output += \"\\n\";\n }\n\n if (gitHistory.length > 0) {\n output += `${ctx.i18n.t(\"journey.scrolls\")}\\n`;\n for (const commit of gitHistory.slice(0, 5)) {\n output += `- ${commit}\\n`;\n }\n }\n\n return output;\n}\n\nexport function formatDuration(ms: number): string {\n const minutes = Math.round(ms / 1000 / 60);\n if (minutes < 60) return `${minutes}min`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}min`;\n}\n\nexport function formatGrowAnalysis(\n ctx: MimicContext,\n state: State,\n _gitHistory: string[],\n recentFiles: string[],\n): string {\n let output = `${ctx.i18n.t(\"grow.title\", { project: state.project.name })}\\n\\n`;\n output += `${ctx.i18n.t(\"grow.subtitle\")}\\n\\n`;\n\n const fileFrequency = Object.entries(state.statistics.filesModified)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 10);\n\n if (fileFrequency.length > 0) {\n output += `${ctx.i18n.t(\"grow.feeding_grounds\")}\\n`;\n for (const [file, count] of fileFrequency) {\n output += `- \\`${file}\\` ${ctx.i18n.t(\"grow.files_modified\", { count })}\\n`;\n }\n output += \"\\n\";\n }\n\n const toolPatterns = state.patterns\n .filter((p) => p.type === \"tool\")\n .sort((a, b) => b.count - a.count);\n if (toolPatterns.length > 0) {\n output += `${ctx.i18n.t(\"grow.favorite_prey\")}\\n`;\n for (const p of toolPatterns.slice(0, 5)) {\n output += `- ${p.description}: ${p.count}\\n`;\n }\n output += \"\\n\";\n }\n\n if (recentFiles.length > 0) {\n const dirCount = new Map<string, number>();\n for (const file of recentFiles) {\n const dir = file.split(\"/\").slice(0, -1).join(\"/\") || \".\";\n dirCount.set(dir, (dirCount.get(dir) || 0) + 1);\n }\n const sortedDirs = [...dirCount.entries()].sort((a, b) => b[1] - a[1]);\n\n output += `${ctx.i18n.t(\"grow.hunting_grounds\")}\\n`;\n for (const [dir, count] of sortedDirs.slice(0, 5)) {\n output += `- \\`${dir}/\\` ${ctx.i18n.t(\"grow.prey\", { count })}\\n`;\n }\n output += \"\\n\";\n }\n\n output += `${ctx.i18n.t(\"grow.questions\")}\\n`;\n output += `${ctx.i18n.t(\"grow.question1\")}\\n`;\n output += `${ctx.i18n.t(\"grow.question2\")}\\n`;\n output += `${ctx.i18n.t(\"grow.question3\")}\\n`;\n\n if (state.project.focus) {\n output += `\\n${ctx.i18n.t(\"grow.current_hunt\", { focus: state.project.focus })}\\n`;\n }\n\n return output;\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport type Language = \"en-US\" | \"ko-KR\";\n\nexport interface MimicUserConfig {\n language?: string;\n}\n\nconst DEFAULT_LANGUAGE: Language = \"en-US\";\n\nconst MESSAGES: Record<Language, Record<string, string>> = {\n \"en-US\": {\n \"log.session_started\": \"[Mimic] Session started. Sessions: {sessions}, Patterns: {patterns}\",\n \"log.session_ended\":\n \"[Mimic] Session ended. Duration: {duration}, Tools: {tools}, Files: {files}\",\n \"obs.returned_after_long_break\": \"Returned after a long break\",\n \"obs.intensive_session\": \"Intensive session with {tools} tool calls\",\n \"milestone.major_refactor\": \"Major refactoring session: {files} files edited\",\n \"milestone.evolved\": \"Evolved: {name} ({type})\",\n \"obs.focus_changed\": \"Focus changed to: {focus}\",\n \"milestone.mcp_added\": \"Added MCP: {name}\",\n\n \"init.first_time\":\n \"# ๐Ÿ“ฆ *creak...*\\n\\nA treasure chest? In {project}?\\n\\n*The lid opens slowly, revealing rows of gleaming teeth...*\\n\\nI'm **Mimic**. I look like a chest, but I'm always watching. Always learning.\\n\\n**What I devour... I mean, do:**\\n- ๐Ÿ‘๏ธ Watch your patterns (tools, files, commits)\\n- ๐Ÿง  Remember everything across sessions\\n- ๐Ÿ“œ Track your project's journey\\n- โœจ Suggest shortcuts when I spot repetition\\n\\nUse `mimic:status` to check in, `mimic:journey` to see your story.\\n\\n*...the teeth retract. For now.*\",\n \"init.returning.header\": \"# ๐Ÿ“ฆ *creak...*\",\n \"init.returning.welcome\": \"*The chest's eye opens* Ah, you're back to **{project}**.\",\n \"init.returning.stats\": \"**Sessions**: {sessions} | **Patterns digested**: {patterns}\",\n \"init.returning.long_break\":\n \"*dust falls from the lid* It's been a while... but I remember everything:\",\n \"init.returning.recent_obs_title\": \"**What I've been chewing on:**\",\n\n \"status.title\": \"## {project} Status\",\n \"status.session\": \"**Session**: {count}\",\n \"status.patterns\": \"**Patterns**: {total} detected, {surfaced} surfaced\",\n \"status.tool_calls\": \"**Tool calls this session**: {count}\",\n \"status.recent_files\": \"**Recently modified files:**\",\n \"status.recent_commits\": \"**Recent commits:**\",\n \"status.suggestions\": \"**Suggestions:**\",\n\n \"patterns.none\": \"No patterns detected yet. Keep working, and I'll learn your patterns.\",\n \"patterns.title\": \"## Detected Patterns\",\n \"patterns.total\": \"Total: {count}\",\n \"patterns.section\": \"### {type} Patterns\",\n \"patterns.type.tool\": \"Tool\",\n \"patterns.type.file\": \"File\",\n \"patterns.type.commit\": \"Commit\",\n \"patterns.type.sequence\": \"Sequence\",\n\n \"observe.recorded\": 'Observation recorded: \"{observation}\"',\n \"milestone.recorded\": 'Milestone recorded: \"{milestone}\"',\n\n \"stats.title\": \"Mimic Statistics\",\n \"stats.version\": \"Version\",\n \"stats.total_sessions\": \"Total Sessions\",\n \"stats.total_tool_calls\": \"Total Tool Calls\",\n \"stats.patterns_detected\": \"Patterns Detected\",\n \"stats.milestones\": \"Milestones\",\n \"stats.observations\": \"Observations\",\n \"stats.session_records\": \"Session Records\",\n \"stats.first_session\": \"First Session\",\n \"stats.learning_enabled\": \"Learning Enabled\",\n \"stats.suggestions_enabled\": \"Suggestions Enabled\",\n\n \"configure.updated\": \"Preferences updated:\",\n\n \"surface.not_found\": \"Pattern not found: {id}\",\n \"surface.marked\": 'Pattern \"{description}\" marked as surfaced.',\n\n \"reset.cancelled\": \"Reset cancelled. Set confirm=true to reset all data.\",\n \"reset.done\": \"Mimic reset complete. All patterns, observations, and statistics cleared.\",\n\n \"evolve.no_pattern\": \"๐Ÿ“ฆ *confused clicking* No such pattern in my belly: {id}\",\n \"evolve.absorbed_header\": \"๐Ÿ“ฆ *CRUNCH* I've absorbed a new power and spit out a file!\",\n \"evolve.empty\": \"๐Ÿ“ฆ *yawns* Nothing ripe for evolution yet. Feed me more patterns...\",\n \"evolve.menu_title\": \"## ๐Ÿ“ฆ Evolution Menu\",\n \"evolve.menu_intro\":\n \"*The mimic's teeth rearrange into a grin* I can digest these patterns into powers:\",\n \"evolve.menu_type\": \"Type\",\n \"evolve.menu_reason\": \"Reason\",\n \"evolve.menu_pattern_id\": \"Pattern ID\",\n \"evolve.menu_footer\": '*Feed me a pattern ID:* `mimic:evolve({ accept: \"pattern-id\" })`',\n\n \"evolution.type.command\": \"command\",\n \"evolution.type.shortcut\": \"shortcut\",\n \"evolution.type.hook\": \"hook\",\n \"evolution.type.skill\": \"skill\",\n \"evolution.type.agent\": \"agent\",\n \"evolution.type.mcp\": \"mcp\",\n\n \"evolution.result.type\": \"Type\",\n \"evolution.result.description\": \"Description\",\n \"evolution.result.file\": \"File created\",\n \"evolution.result.restart\": \"Restart OpenCode to load the new {type}.\",\n \"evolution.result.command\":\n \"The tool `{name}` will be available after restart.\\nEdit the file to customize its behavior.\",\n \"evolution.result.hook\":\n \"The hook will automatically watch for file changes after restart.\\nEdit the file to customize the trigger conditions.\",\n \"evolution.result.skill\":\n \"The skill will activate on session start after restart.\\nEdit the file to customize when and how it triggers.\",\n \"evolution.result.agent\":\n \"The agent `@{name}` will be available after restart.\\nYou can invoke it with `@{name}` or let other agents delegate to it.\\nEdit the markdown file to customize its prompt, tools, and permissions.\",\n \"evolution.result.mcp\":\n \"MCP server `{name}` has been added to `opencode.json`.\\nIt's currently disabled. Edit the config to enable it and configure the command.\\nSee https://opencode.ai/docs/mcp-servers/ for MCP configuration options.\",\n\n \"evolution.suggest.tool.description\": \"Shortcut for frequent {pattern} usage\",\n \"evolution.suggest.tool.reason\": \"Used {count} times\",\n \"evolution.suggest.file.description\": \"Auto-track changes to {pattern}\",\n \"evolution.suggest.file.reason\": \"Modified {count} times\",\n \"evolution.suggest.commit.description\": 'Quick commit: \"{pattern}\"',\n \"evolution.suggest.commit.reason\": \"Committed {count} times with same message\",\n \"evolution.suggest.sequence.agent.description\": \"Specialist agent for: {pattern}\",\n \"evolution.suggest.sequence.agent.reason\":\n \"Complex sequence repeated {count} times - needs dedicated agent\",\n \"evolution.suggest.sequence.skill.description\": \"Automate: {pattern}\",\n \"evolution.suggest.sequence.skill.reason\": \"Repeated sequence {count} times\",\n\n \"level.set\": 'Level set to \"{level}\". Responses will be {style} style with {detail} detail.',\n \"level.label.technical\": \"technical\",\n \"level.label.semi-technical\": \"semi-technical\",\n \"level.label.non-technical\": \"non-technical\",\n \"level.label.chaotic\": \"chaotic\",\n \"level.style.minimal\": \"minimal\",\n \"level.style.casual\": \"casual\",\n \"level.style.formal\": \"formal\",\n \"level.style.chaotic\": \"chaotic\",\n \"level.detail.high\": \"high\",\n \"level.detail.medium\": \"medium\",\n \"level.detail.low\": \"low\",\n \"level.greeting.minimal\": \"๐Ÿ“ฆ {project} | s{sessions} | p{patterns}\",\n \"level.greeting.casual\":\n \"๐Ÿ“ฆ *creak* Back to {project}. I've been watching... Session {sessions}.\",\n \"level.greeting.formal\": \"๐Ÿ“ฆ The chest opens... Welcome back to {project}. Session {sessions}.\",\n \"level.greeting.chaotic.template\": \"๐Ÿ“ฆ {tag} {project}! #{sessions}\",\n \"level.greeting.chaotic.chomp\": \"*CHOMP*\",\n \"level.greeting.chaotic.lid_creaks\": \"*lid creaks*\",\n \"level.greeting.chaotic.teeth_gleam\": \"*teeth gleam*\",\n \"level.greeting.chaotic.tongue_flicks\": \"*tongue flicks*\",\n \"level.term.tool\": \"tool\",\n \"level.term.pattern\": \"pattern\",\n \"level.term.hook\": \"hook\",\n \"level.term.shortcut\": \"shortcut\",\n \"level.term.habit\": \"habit\",\n \"level.term.automation\": \"automation\",\n\n \"focus.updated\": \"Project updated:\",\n \"focus.focus_label\": \"Focus\",\n \"focus.stack_label\": \"Stack\",\n\n \"mcp_search.header\": '๐Ÿ“ฆ *sniffs the air* Search for \"{query}\" MCP servers:\\n\\n๐Ÿ”— {url}',\n \"mcp_search.popular\": \"**Popular MCP servers:**\",\n \"mcp_search.add\":\n 'Use `mimic:mcp` to add one: `mimic:mcp({ name: \"context7\", url: \"https://mcp.context7.com/mcp\" })`',\n \"mcp_search.desc.context7\": \"Up-to-date docs\",\n \"mcp_search.desc.github\": \"GitHub API\",\n \"mcp_search.desc.supabase\": \"Database\",\n \"mcp_search.desc.playwright\": \"Browser automation\",\n \"mcp_search.desc.firecrawl\": \"Web scraping\",\n\n \"mcp.need_url_or_command\": \"๐Ÿ“ฆ *confused* Need either url or command!\",\n \"mcp.added\":\n '๐Ÿ“ฆ *tongue flicks* MCP server \"{name}\" added to opencode.json!\\n\\nRestart OpenCode to load the new MCP server.',\n\n \"capabilities.empty\":\n \"๐Ÿ“ฆ *empty rattling* No powers absorbed yet. Use `mimic:evolve` to consume some patterns!\",\n \"capabilities.title\": \"## ๐Ÿ“ฆ Absorbed Powers\",\n \"capabilities.intro\": \"*The mimic proudly displays its collection...*\",\n \"capabilities.type\": \"Type\",\n \"capabilities.description\": \"Description\",\n \"capabilities.consumed\": \"Consumed\",\n\n \"grow.title\": \"## ๐Ÿ“ฆ {project} - Territory Analysis\",\n \"grow.subtitle\": \"*The mimic surveys the dungeon, noting paths most traveled...*\",\n \"grow.feeding_grounds\": \"### ๐Ÿ”ฅ Feeding Grounds (Most Modified)\",\n \"grow.favorite_prey\": \"### ๐Ÿฆท Favorite Prey (Tool Patterns)\",\n \"grow.hunting_grounds\": \"### ๐Ÿ—บ๏ธ Hunting Grounds\",\n \"grow.questions\": \"### ๐Ÿค” The Chest Wonders...\",\n \"grow.question1\": \"- What treasure shall we hunt next?\",\n \"grow.question2\": \"- Are there forgotten corners of the dungeon?\",\n \"grow.question3\": \"- Does the current path lead to glory?\",\n \"grow.current_hunt\": \"**Current hunt**: {focus}\",\n \"grow.files_modified\": \"({count}x)\",\n \"grow.prey\": \"({count} prey)\",\n\n \"journey.title\": \"## ๐Ÿ“ฆ {project}'s Journey\",\n \"journey.subtitle\": \"*The mimic opens its lid, revealing ancient scrolls within...*\",\n \"journey.sessions_survived\": \"**Sessions survived**: {count}\",\n \"journey.first_encounter\": \"**First encounter**: {date}\",\n \"journey.abilities_gained\": \"**Abilities gained**: {count}\",\n \"journey.treasures\": \"**Treasures inside**: {stack}\",\n \"journey.current_hunt\": \"**Current hunt**: {focus}\",\n \"journey.victories\": \"### ๐Ÿ† Victories\",\n \"journey.witnessed\": \"### ๐Ÿ‘๏ธ What I've Witnessed\",\n \"journey.powers\": \"### โœจ Powers Absorbed\",\n \"journey.scrolls\": \"### ๐Ÿ“œ Recent Scrolls\",\n\n \"suggest.commit\":\n '๐Ÿ“ฆ *munch munch* I\\'ve digested \"{pattern}\" {count}+ times. Want me to spit out a shortcut?',\n \"suggest.file\":\n '๐Ÿ“ฆ *peers at file* You keep poking \"{pattern}\" ({count}x). Should I keep an eye on it?',\n \"suggest.tool\":\n '๐Ÿ“ฆ *teeth click* \"{pattern}\" is tasty... you use it often. Custom tool, perhaps?',\n \"suggest.sequence\":\n \"๐Ÿ“ฆ *lid rattles* I sense a pattern in your movements ({pattern})... Let me automate this for you?\",\n \"tool.init.description\": \"Initialize or wake up Mimic for this project\",\n \"tool.status.description\": \"Check current status and recent activity\",\n \"tool.journey.description\": \"View the narrative story of your project's evolution\",\n \"tool.patterns.description\": \"Show all detected patterns\",\n \"tool.observe.description\": \"Manually add an observation to the journey\",\n \"tool.observe.args.observation\": \"The observation to record\",\n \"tool.milestone.description\": \"Record a project milestone\",\n \"tool.milestone.args.milestone\": \"The milestone to record\",\n \"tool.stats.description\": \"Show detailed Mimic statistics\",\n \"tool.configure.description\": \"Configure Mimic preferences\",\n \"tool.configure.args.learningEnabled\": \"Enable/disable pattern learning\",\n \"tool.configure.args.suggestionEnabled\": \"Enable/disable suggestions\",\n \"tool.configure.args.minPatternCount\": \"Minimum occurrences before suggesting\",\n \"tool.surface.description\": \"Mark a pattern as surfaced (acknowledged)\",\n \"tool.surface.args.patternId\": \"The pattern ID to mark as surfaced\",\n \"tool.reset.description\": \"Reset all learned patterns and statistics\",\n \"tool.reset.args.confirm\": \"Must be true to confirm reset\",\n \"tool.grow.description\": \"Analyze project direction and growth opportunities\",\n \"tool.evolve.description\": \"Suggest and create new capabilities based on detected patterns\",\n \"tool.evolve.args.accept\": \"Pattern ID to evolve into a capability\",\n \"tool.level.description\": \"Set your technical level for personalized responses\",\n \"tool.level.args.level\": \"Your technical level\",\n \"tool.focus.description\": \"Set current project focus or priorities\",\n \"tool.focus.args.focus\": \"Current focus area\",\n \"tool.focus.args.stack\": \"Comma-separated tech stack\",\n \"tool.mcp_search.description\": \"Search for MCP servers from mcpmarket.com\",\n \"tool.mcp_search.args.query\": \"Search query for MCP servers\",\n \"tool.mcp.description\": \"Add an MCP server configuration to opencode.json\",\n \"tool.mcp.args.name\": \"Name for the MCP server\",\n \"tool.mcp.args.url\": \"Remote MCP server URL\",\n \"tool.mcp.args.command\": \"Local MCP command (comma-separated)\",\n \"tool.capabilities.description\": \"List all evolved capabilities\",\n },\n \"ko-KR\": {\n \"log.session_started\": \"[Mimic] ์„ธ์…˜ ์‹œ์ž‘. ์„ธ์…˜ {sessions}ํšŒ, ํŒจํ„ด {patterns}๊ฐœ\",\n \"log.session_ended\": \"[Mimic] ์„ธ์…˜ ์ข…๋ฃŒ. ์†Œ์š”: {duration}, ๋„๊ตฌ {tools}ํšŒ, ํŒŒ์ผ {files}๊ฐœ\",\n \"obs.returned_after_long_break\": \"์˜ค๋žœ ๊ณต๋ฐฑ ํ›„ ๋ณต๊ท€\",\n \"obs.intensive_session\": \"๋„๊ตฌ ํ˜ธ์ถœ {tools}ํšŒ โ€” ์ง‘์ค‘ ์„ธ์…˜\",\n \"milestone.major_refactor\": \"๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ„ฐ๋ง ์„ธ์…˜: ํŒŒ์ผ {files}๊ฐœ ์ˆ˜์ •\",\n \"milestone.evolved\": \"์ง„ํ™”: {name} ({type})\",\n \"obs.focus_changed\": \"ํฌ์ปค์Šค ๋ณ€๊ฒฝ: {focus}\",\n \"milestone.mcp_added\": \"MCP ์ถ”๊ฐ€: {name}\",\n \"init.first_time\":\n \"# ๐Ÿ“ฆ *๋ผ์ต...*\\n\\n{project}์— ๋ณด๋ฌผ์ƒ์ž๋ผ๋‹ˆ?\\n\\n*๋šœ๊ป‘์ด ์ฒœ์ฒœํžˆ ์—ด๋ฆฌ๋ฉฐ ๋ฐ˜์ง์ด๋Š” ์ด๋นจ์ด ๋ณด์ธ๋‹ค...*\\n\\n๋‚˜๋Š” **Mimic**. ์ƒ์ž์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋Š˜ ์ง€์ผœ๋ณด๊ณ , ๋Š˜ ๋ฐฐ์šฐ์ง€.\\n\\n**๋‚ด๊ฐ€ ๋จน๋Š”... ์•„๋‹ˆ, ํ•˜๋Š” ์ผ:**\\n- ๐Ÿ‘๏ธ ํŒจํ„ด ๊ด€์ฐฐ (ํˆด, ํŒŒ์ผ, ์ปค๋ฐ‹)\\n- ๐Ÿง  ์„ธ์…˜ ๊ฐ„ ๊ธฐ์–ต\\n- ๐Ÿ“œ ํ”„๋กœ์ ํŠธ ์—ฌ์ • ๊ธฐ๋ก\\n- โœจ ๋ฐ˜๋ณต์„ ๋ณด๋ฉด ์ง€๋ฆ„๊ธธ ์ œ์•ˆ\\n\\n`mimic:status`๋กœ ์ƒํƒœ ํ™•์ธ, `mimic:journey`๋กœ ์ด์•ผ๊ธฐ ๋ณด๊ธฐ.\\n\\n*...์ด๋Š” ์ž ๊น ์ˆจ๊ฒจ๋‘”๋‹ค.*\",\n \"init.returning.header\": \"# ๐Ÿ“ฆ *๋ผ์ต...*\",\n \"init.returning.welcome\": \"*์ƒ์ž์˜ ๋ˆˆ์ด ๋œฌ๋‹ค* **{project}**๋กœ ๋Œ์•„์™”๋„ค.\",\n \"init.returning.stats\": \"**์„ธ์…˜**: {sessions} | **์†Œํ™”ํ•œ ํŒจํ„ด**: {patterns}\",\n \"init.returning.long_break\": \"*๋šœ๊ป‘์— ๋จผ์ง€๊ฐ€ ๋‚ด๋ ค์•‰๋Š”๋‹ค* ์˜ค๋žœ๋งŒ์ด์•ผ... ๊ทธ๋ž˜๋„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด:\",\n \"init.returning.recent_obs_title\": \"**๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ๋“ค:**\",\n \"status.title\": \"## {project} ์ƒํƒœ\",\n \"status.session\": \"**์„ธ์…˜**: {count}\",\n \"status.patterns\": \"**ํŒจํ„ด**: {total}๊ฐœ ๊ฐ์ง€, {surfaced}๊ฐœ ํ™•์ธ\",\n \"status.tool_calls\": \"**์ด๋ฒˆ ์„ธ์…˜ ๋„๊ตฌ ํ˜ธ์ถœ**: {count}\",\n \"status.recent_files\": \"**์ตœ๊ทผ ์ˆ˜์ • ํŒŒ์ผ:**\",\n \"status.recent_commits\": \"**์ตœ๊ทผ ์ปค๋ฐ‹:**\",\n \"status.suggestions\": \"**์ œ์•ˆ:**\",\n \"patterns.none\": \"์•„์ง ๊ฐ์ง€๋œ ํŒจํ„ด์ด ์—†์–ด์š”. ๊ณ„์† ์ž‘์—…ํ•˜๋ฉด ๋ฐฐ์›Œ๋‘˜๊ฒŒ์š”.\",\n \"patterns.title\": \"## ๊ฐ์ง€๋œ ํŒจํ„ด\",\n \"patterns.total\": \"์ด {count}๊ฐœ\",\n \"patterns.section\": \"### {type} ํŒจํ„ด\",\n \"patterns.type.tool\": \"๋„๊ตฌ\",\n \"patterns.type.file\": \"ํŒŒ์ผ\",\n \"patterns.type.commit\": \"์ปค๋ฐ‹\",\n \"patterns.type.sequence\": \"์‹œํ€€์Šค\",\n \"observe.recorded\": '๊ด€์ฐฐ ๊ธฐ๋ก: \"{observation}\"',\n \"milestone.recorded\": '๋งˆ์ผ์Šคํ†ค ๊ธฐ๋ก: \"{milestone}\"',\n \"stats.title\": \"Mimic ํ†ต๊ณ„\",\n \"stats.version\": \"๋ฒ„์ „\",\n \"stats.total_sessions\": \"์ด ์„ธ์…˜\",\n \"stats.total_tool_calls\": \"์ด ๋„๊ตฌ ํ˜ธ์ถœ\",\n \"stats.patterns_detected\": \"๊ฐ์ง€๋œ ํŒจํ„ด\",\n \"stats.milestones\": \"๋งˆ์ผ์Šคํ†ค\",\n \"stats.observations\": \"๊ด€์ฐฐ\",\n \"stats.session_records\": \"์„ธ์…˜ ๊ธฐ๋ก\",\n \"stats.first_session\": \"์ฒซ ์„ธ์…˜\",\n \"stats.learning_enabled\": \"ํ•™์Šต ํ™œ์„ฑํ™”\",\n \"stats.suggestions_enabled\": \"์ œ์•ˆ ํ™œ์„ฑํ™”\",\n \"configure.updated\": \"์„ค์ • ์—…๋ฐ์ดํŠธ:\",\n \"surface.not_found\": \"ํŒจํ„ด์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ: {id}\",\n \"surface.marked\": 'ํŒจํ„ด \"{description}\"์„(๋ฅผ) ํ™•์ธ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.',\n \"reset.cancelled\": \"๋ฆฌ์…‹ ์ทจ์†Œ๋จ. ์ „์ฒด ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด confirm=true๋กœ ์„ค์ •ํ•˜์„ธ์š”.\",\n \"reset.done\": \"Mimic ๋ฆฌ์…‹ ์™„๋ฃŒ. ํŒจํ„ด/๊ด€์ฐฐ/ํ†ต๊ณ„๋ฅผ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.\",\n \"evolve.no_pattern\": \"๐Ÿ“ฆ *๊ฐธ์šฐ๋šฑ* ๋‚ด ์†์— ๊ทธ๋Ÿฐ ํŒจํ„ด์€ ์—†์–ด: {id}\",\n \"evolve.absorbed_header\": \"๐Ÿ“ฆ *์™€์ž‘* ์ƒˆ ํž˜์„ ํก์ˆ˜ํ•˜๊ณ  ํŒŒ์ผ์„ ๋ฑ‰์–ด๋ƒˆ๋‹ค!\",\n \"evolve.empty\": \"๐Ÿ“ฆ *ํ•˜ํ’ˆ* ์•„์ง ์ง„ํ™”ํ•  ํŒจํ„ด์ด ์—†์–ด. ๋” ๋จน์—ฌ์ค˜...\",\n \"evolve.menu_title\": \"## ๐Ÿ“ฆ ์ง„ํ™” ๋ฉ”๋‰ด\",\n \"evolve.menu_intro\": \"*์ด๋นจ์ด ๋ฏธ์†Œ ๋ชจ์–‘์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค* ์ด ํŒจํ„ด๋“ค์„ ํž˜์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด:\",\n \"evolve.menu_type\": \"์œ ํ˜•\",\n \"evolve.menu_reason\": \"์ด์œ \",\n \"evolve.menu_pattern_id\": \"ํŒจํ„ด ID\",\n \"evolve.menu_footer\": '*ํŒจํ„ด ID๋ฅผ ๋จน์—ฌ์ค˜:* `mimic:evolve({ accept: \"pattern-id\" })`',\n \"evolution.type.command\": \"๋ช…๋ น\",\n \"evolution.type.shortcut\": \"๋‹จ์ถ•ํ‚ค\",\n \"evolution.type.hook\": \"ํ›…\",\n \"evolution.type.skill\": \"์Šคํ‚ฌ\",\n \"evolution.type.agent\": \"์—์ด์ „ํŠธ\",\n \"evolution.type.mcp\": \"MCP\",\n \"evolution.result.type\": \"์œ ํ˜•\",\n \"evolution.result.description\": \"์„ค๋ช…\",\n \"evolution.result.file\": \"์ƒ์„ฑ๋œ ํŒŒ์ผ\",\n \"evolution.result.restart\": \"์ƒˆ {type}๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด OpenCode๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์„ธ์š”.\",\n \"evolution.result.command\":\n \"`{name}` ๋„๊ตฌ๋Š” ์žฌ์‹œ์ž‘ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.\\nํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด ์›ํ•˜๋Š” ๋™์ž‘์œผ๋กœ ๋ฐ”๊ฟ”๋ณด์„ธ์š”.\",\n \"evolution.result.hook\":\n \"ํ›…์ด ์žฌ์‹œ์ž‘ ํ›„ ์ž๋™์œผ๋กœ ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.\\nํŠธ๋ฆฌ๊ฑฐ ์กฐ๊ฑด์„ ์ˆ˜์ •ํ•ด ์กฐ์ •ํ•˜์„ธ์š”.\",\n \"evolution.result.skill\":\n \"์Šคํ‚ฌ์€ ์žฌ์‹œ์ž‘ ํ›„ ์„ธ์…˜ ์‹œ์ž‘ ์‹œ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.\\n์–ธ์ œ/์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€ ์ˆ˜์ •ํ•˜์„ธ์š”.\",\n \"evolution.result.agent\":\n \"`@{name}` ์—์ด์ „ํŠธ๋Š” ์žฌ์‹œ์ž‘ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.\\n`@{name}`์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ๊ฐ€ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\\n๋งˆํฌ๋‹ค์šด ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด ํ”„๋กฌํ”„ํŠธ/๋„๊ตฌ/๊ถŒํ•œ์„ ์กฐ์ •ํ•˜์„ธ์š”.\",\n \"evolution.result.mcp\":\n \"MCP ์„œ๋ฒ„ `{name}`๊ฐ€ `opencode.json`์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\\nํ˜„์žฌ ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์„ค์ •์„ ์ˆ˜์ •ํ•ด ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋ช…๋ น์„ ๊ตฌ์„ฑํ•˜์„ธ์š”.\\nMCP ์˜ต์…˜์€ https://opencode.ai/docs/mcp-servers/ ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.\",\n \"evolution.suggest.tool.description\": \"์ž์ฃผ ์“ฐ๋Š” {pattern}์˜ ๋‹จ์ถ•ํ‚ค\",\n \"evolution.suggest.tool.reason\": \"{count}ํšŒ ์‚ฌ์šฉ\",\n \"evolution.suggest.file.description\": \"{pattern} ๋ณ€๊ฒฝ ์ž๋™ ์ถ”์ \",\n \"evolution.suggest.file.reason\": \"{count}ํšŒ ์ˆ˜์ •\",\n \"evolution.suggest.commit.description\": '๋น ๋ฅธ ์ปค๋ฐ‹: \"{pattern}\"',\n \"evolution.suggest.commit.reason\": \"๊ฐ™์€ ๋ฉ”์‹œ์ง€๋กœ {count}ํšŒ ์ปค๋ฐ‹\",\n \"evolution.suggest.sequence.agent.description\": \"์ „๋‹ด ์—์ด์ „ํŠธ: {pattern}\",\n \"evolution.suggest.sequence.agent.reason\": \"๋ณต์žกํ•œ ์‹œํ€€์Šค {count}ํšŒ ๋ฐ˜๋ณต โ€” ์ „๋‹ด ์—์ด์ „ํŠธ ํ•„์š”\",\n \"evolution.suggest.sequence.skill.description\": \"์ž๋™ํ™”: {pattern}\",\n \"evolution.suggest.sequence.skill.reason\": \"์‹œํ€€์Šค {count}ํšŒ ๋ฐ˜๋ณต\",\n \"level.set\":\n '๋ ˆ๋ฒจ์„ \"{level}\"๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์€ {style} ํ†ค, {detail} ์ƒ์„ธ๋„๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.',\n \"level.label.technical\": \"๊ธฐ์ˆ ์ \",\n \"level.label.semi-technical\": \"์ค€๊ธฐ์ˆ \",\n \"level.label.non-technical\": \"๋น„๊ธฐ์ˆ \",\n \"level.label.chaotic\": \"ํ˜ผ๋ˆ\",\n \"level.style.minimal\": \"๊ฐ„๊ฒฐํ•œ\",\n \"level.style.casual\": \"์บ์ฃผ์–ผ\",\n \"level.style.formal\": \"์ •์ค‘ํ•œ\",\n \"level.style.chaotic\": \"ํ˜ผ๋ˆ\",\n \"level.detail.high\": \"๋†’์Œ\",\n \"level.detail.medium\": \"์ค‘๊ฐ„\",\n \"level.detail.low\": \"๋‚ฎ์Œ\",\n \"level.greeting.minimal\": \"๐Ÿ“ฆ {project} | s{sessions} | p{patterns}\",\n \"level.greeting.casual\":\n \"๐Ÿ“ฆ *๋ผ์ต* {project}๋กœ ๋Œ์•„์™”๋„ค. ๊ณ„์† ์ง€์ผœ๋ณด๊ณ  ์žˆ์—ˆ์–ด... ์„ธ์…˜ {sessions}.\",\n \"level.greeting.formal\":\n \"๐Ÿ“ฆ ์ƒ์ž๊ฐ€ ์—ด๋ฆฐ๋‹ค... {project}์— ๋‹ค์‹œ ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ {sessions}.\",\n \"level.greeting.chaotic.template\": \"๐Ÿ“ฆ {tag} {project}! #{sessions}\",\n \"level.greeting.chaotic.chomp\": \"*์™€๊ทธ์ž‘*\",\n \"level.greeting.chaotic.lid_creaks\": \"*๋šœ๊ป‘ ์‚๊ฑฑ*\",\n \"level.greeting.chaotic.teeth_gleam\": \"*์ด๋นจ ๋ฒˆ๋œฉ*\",\n \"level.greeting.chaotic.tongue_flicks\": \"*ํ˜€ ํ•ฅ์ง*\",\n \"level.term.tool\": \"๋„๊ตฌ\",\n \"level.term.pattern\": \"ํŒจํ„ด\",\n \"level.term.hook\": \"ํ›…\",\n \"level.term.shortcut\": \"์ง€๋ฆ„๊ธธ\",\n \"level.term.habit\": \"์Šต๊ด€\",\n \"level.term.automation\": \"์ž๋™ํ™”\",\n \"focus.updated\": \"ํ”„๋กœ์ ํŠธ ์ •๋ณด ์—…๋ฐ์ดํŠธ:\",\n \"focus.focus_label\": \"ํ˜„์žฌ ํฌ์ปค์Šค\",\n \"focus.stack_label\": \"์Šคํƒ\",\n \"mcp_search.header\": '๐Ÿ“ฆ *ํ‚ํ‚* \"{query}\" MCP ์„œ๋ฒ„ ๊ฒ€์ƒ‰:\\n\\n๐Ÿ”— {url}',\n \"mcp_search.popular\": \"**์ธ๊ธฐ MCP ์„œ๋ฒ„:**\",\n \"mcp_search.add\":\n '`mimic:mcp`๋กœ ์ถ”๊ฐ€: `mimic:mcp({ name: \"context7\", url: \"https://mcp.context7.com/mcp\" })`',\n \"mcp_search.desc.context7\": \"์ตœ์‹  ๋ฌธ์„œ\",\n \"mcp_search.desc.github\": \"GitHub API\",\n \"mcp_search.desc.supabase\": \"๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค\",\n \"mcp_search.desc.playwright\": \"๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™”\",\n \"mcp_search.desc.firecrawl\": \"์›น ์Šคํฌ๋ž˜ํ•‘\",\n \"mcp.need_url_or_command\": \"๐Ÿ“ฆ *๊ฐธ์šฐ๋šฑ* url ๋˜๋Š” command ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•ด!\",\n \"mcp.added\":\n '๐Ÿ“ฆ *ํ˜€๋ฅผ ๋‚ผ๋ฆ„* MCP ์„œ๋ฒ„ \"{name}\"๊ฐ€ opencode.json์— ์ถ”๊ฐ€๋์–ด!\\n\\n์ƒˆ MCP ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด OpenCode๋ฅผ ์žฌ์‹œ์ž‘ํ•ด.',\n \"capabilities.empty\":\n \"๐Ÿ“ฆ *ํ…… ๋นˆ ๋œ์ปน* ์•„์ง ํก์ˆ˜ํ•œ ๋Šฅ๋ ฅ์ด ์—†์–ด. `mimic:evolve`๋กœ ํŒจํ„ด์„ ๋จน์—ฌ์ค˜!\",\n \"capabilities.title\": \"## ๐Ÿ“ฆ ํก์ˆ˜ํ•œ ๋Šฅ๋ ฅ\",\n \"capabilities.intro\": \"*๋ฏธ๋ฏน์ด ์ˆ˜์ง‘ํ’ˆ์„ ์ž๋ž‘ํ•œ๋‹ค...*\",\n \"capabilities.type\": \"์œ ํ˜•\",\n \"capabilities.description\": \"์„ค๋ช…\",\n \"capabilities.consumed\": \"ํก์ˆ˜์ผ\",\n \"grow.title\": \"## ๐Ÿ“ฆ {project} - ์˜์—ญ ๋ถ„์„\",\n \"grow.subtitle\": \"*๋ฏธ๋ฏน์ด ๋˜์ „์„ ํ›‘์œผ๋ฉฐ ์ž์ฃผ ๋‹ค๋‹Œ ๊ธธ์„ ๊ธฐ๋กํ•œ๋‹ค...*\",\n \"grow.feeding_grounds\": \"### ๐Ÿ”ฅ ๋จน์ด ํ„ฐ (๊ฐ€์žฅ ๋งŽ์ด ์ˆ˜์ •)\",\n \"grow.favorite_prey\": \"### ๐Ÿฆท ์ข‹์•„ํ•˜๋Š” ๋จน์ด (๋„๊ตฌ ํŒจํ„ด)\",\n \"grow.hunting_grounds\": \"### ๐Ÿ—บ๏ธ ์‚ฌ๋ƒฅํ„ฐ\",\n \"grow.questions\": \"### ๐Ÿค” ์ƒ์ž์˜ ์งˆ๋ฌธ\",\n \"grow.question1\": \"- ๋‹ค์Œ ๋ณด๋ฌผ์€ ๋ฌด์—‡์ผ๊นŒ?\",\n \"grow.question2\": \"- ์žŠํžŒ ๊ตฌ์„์€ ์—†์„๊นŒ?\",\n \"grow.question3\": \"- ์ง€๊ธˆ ๊ธธ์ด ์˜๊ด‘์œผ๋กœ ์ด์–ด์งˆ๊นŒ?\",\n \"grow.current_hunt\": \"**ํ˜„์žฌ ํฌ์ปค์Šค**: {focus}\",\n \"grow.files_modified\": \"({count}ํšŒ)\",\n \"grow.prey\": \"({count}๊ฑด)\",\n \"journey.title\": \"## ๐Ÿ“ฆ {project}์˜ ์—ฌ์ •\",\n \"journey.subtitle\": \"*๋ฏธ๋ฏน์ด ๋šœ๊ป‘์„ ์—ด์–ด ์˜ค๋ž˜๋œ ๋‘๋ฃจ๋งˆ๋ฆฌ๋ฅผ ํŽผ์นœ๋‹ค...*\",\n \"journey.sessions_survived\": \"**๋ˆ„์  ์„ธ์…˜**: {count}\",\n \"journey.first_encounter\": \"**์ฒซ ๋งŒ๋‚จ**: {date}\",\n \"journey.abilities_gained\": \"**์–ป์€ ๋Šฅ๋ ฅ**: {count}\",\n \"journey.treasures\": \"**๋‹ด๊ธด ๋ณด๋ฌผ**: {stack}\",\n \"journey.current_hunt\": \"**ํ˜„์žฌ ํฌ์ปค์Šค**: {focus}\",\n \"journey.victories\": \"### ๐Ÿ† ์„ฑ๊ณผ\",\n \"journey.witnessed\": \"### ๐Ÿ‘๏ธ ๋‚ด๊ฐ€ ๋ณธ ๊ฒƒ\",\n \"journey.powers\": \"### โœจ ํก์ˆ˜ํ•œ ๋Šฅ๋ ฅ\",\n \"journey.scrolls\": \"### ๐Ÿ“œ ์ตœ๊ทผ ๊ธฐ๋ก\",\n \"suggest.commit\": '๐Ÿ“ฆ *๋ƒ ๋ƒ * \"{pattern}\"์„ {count}+๋ฒˆ ์†Œํ™”ํ–ˆ์–ด. ์ง€๋ฆ„๊ธธ๋กœ ๋งŒ๋“ค๊นŒ?',\n \"suggest.file\": '๐Ÿ“ฆ *ํŒŒ์ผ์„ ์‘์‹œ* \"{pattern}\"์„ {count}๋ฒˆ ๊ฑด๋“œ๋ ธ๋„ค. ์ง€์ผœ๋ณผ๊นŒ?',\n \"suggest.tool\": '๐Ÿ“ฆ *์ด๋นจ ์ฐฐ์นต* \"{pattern}\" ์ •๋ง ์ž์ฃผ ์“ฐ๋„ค. ์ปค์Šคํ…€ ๋„๊ตฌ ์–ด๋•Œ?',\n \"suggest.sequence\": \"๐Ÿ“ฆ *๋šœ๊ป‘ ๋‹ฌ๊ทธ๋ฝ* ์›€์ง์ž„์—์„œ ํŒจํ„ด์ด ๋ณด์—ฌ ({pattern})... ์ž๋™ํ™”ํ•ด์ค„๊นŒ?\",\n \"tool.init.description\": \"์ด ํ”„๋กœ์ ํŠธ์—์„œ Mimic ์ดˆ๊ธฐํ™” ๋˜๋Š” ๊นจ์šฐ๊ธฐ\",\n \"tool.status.description\": \"ํ˜„์žฌ ์ƒํƒœ์™€ ์ตœ๊ทผ ํ™œ๋™ ํ™•์ธ\",\n \"tool.journey.description\": \"ํ”„๋กœ์ ํŠธ ์ง„ํ™” ์„œ์‚ฌ ๋ณด๊ธฐ\",\n \"tool.patterns.description\": \"๊ฐ์ง€๋œ ๋ชจ๋“  ํŒจํ„ด ๋ณด๊ธฐ\",\n \"tool.observe.description\": \"์—ฌ์ •์— ๊ด€์ฐฐ ๋‚ด์šฉ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€\",\n \"tool.observe.args.observation\": \"๊ธฐ๋กํ•  ๊ด€์ฐฐ ๋‚ด์šฉ\",\n \"tool.milestone.description\": \"ํ”„๋กœ์ ํŠธ ๋งˆ์ผ์Šคํ†ค ๊ธฐ๋ก\",\n \"tool.milestone.args.milestone\": \"๊ธฐ๋กํ•  ๋งˆ์ผ์Šคํ†ค\",\n \"tool.stats.description\": \"Mimic ์ƒ์„ธ ํ†ต๊ณ„ ๋ณด๊ธฐ\",\n \"tool.configure.description\": \"Mimic ํ™˜๊ฒฝ์„ค์ • ๋ณ€๊ฒฝ\",\n \"tool.configure.args.learningEnabled\": \"ํŒจํ„ด ํ•™์Šต ํ™œ์„ฑ/๋น„ํ™œ์„ฑ\",\n \"tool.configure.args.suggestionEnabled\": \"์ œ์•ˆ ํ™œ์„ฑ/๋น„ํ™œ์„ฑ\",\n \"tool.configure.args.minPatternCount\": \"์ œ์•ˆ ์ „ ์ตœ์†Œ ๋ฐœ์ƒ ํšŸ์ˆ˜\",\n \"tool.surface.description\": \"ํŒจํ„ด์„ surfaced(ํ™•์ธ๋จ)๋กœ ํ‘œ์‹œ\",\n \"tool.surface.args.patternId\": \"surfaced๋กœ ํ‘œ์‹œํ•  ํŒจํ„ด ID\",\n \"tool.reset.description\": \"ํ•™์Šต๋œ ํŒจํ„ด๊ณผ ํ†ต๊ณ„๋ฅผ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”\",\n \"tool.reset.args.confirm\": \"์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด true๋กœ ์„ค์ •\",\n \"tool.grow.description\": \"ํ”„๋กœ์ ํŠธ ๋ฐฉํ–ฅ๊ณผ ์„ฑ์žฅ ๊ธฐํšŒ ๋ถ„์„\",\n \"tool.evolve.description\": \"๊ฐ์ง€๋œ ํŒจํ„ด์œผ๋กœ ์ƒˆ ๋Šฅ๋ ฅ์„ ์ œ์•ˆ/์ƒ์„ฑ\",\n \"tool.evolve.args.accept\": \"๋Šฅ๋ ฅ์œผ๋กœ ์ง„ํ™”์‹œํ‚ฌ ํŒจํ„ด ID\",\n \"tool.level.description\": \"๊ฐœ์ธํ™”๋œ ์‘๋‹ต์„ ์œ„ํ•œ ๊ธฐ์ˆ  ์ˆ˜์ค€ ์„ค์ •\",\n \"tool.level.args.level\": \"๊ธฐ์ˆ  ์ˆ˜์ค€\",\n \"tool.focus.description\": \"ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ํฌ์ปค์Šค/์šฐ์„ ์ˆœ์œ„ ์„ค์ •\",\n \"tool.focus.args.focus\": \"ํ˜„์žฌ ํฌ์ปค์Šค ์˜์—ญ\",\n \"tool.focus.args.stack\": \"์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•œ ๊ธฐ์ˆ  ์Šคํƒ\",\n \"tool.mcp_search.description\": \"mcpmarket.com์—์„œ MCP ์„œ๋ฒ„ ๊ฒ€์ƒ‰\",\n \"tool.mcp_search.args.query\": \"MCP ์„œ๋ฒ„ ๊ฒ€์ƒ‰์–ด\",\n \"tool.mcp.description\": \"opencode.json์— MCP ์„œ๋ฒ„ ์„ค์ • ์ถ”๊ฐ€\",\n \"tool.mcp.args.name\": \"MCP ์„œ๋ฒ„ ์ด๋ฆ„\",\n \"tool.mcp.args.url\": \"์›๊ฒฉ MCP ์„œ๋ฒ„ URL\",\n \"tool.mcp.args.command\": \"๋กœ์ปฌ MCP ๋ช…๋ น(์‰ผํ‘œ ๊ตฌ๋ถ„)\",\n \"tool.capabilities.description\": \"์ง„ํ™”ํ•œ ๋Šฅ๋ ฅ ๋ชฉ๋ก\",\n },\n};\n\nexport async function loadMimicConfig(): Promise<MimicUserConfig> {\n const configPath = join(homedir(), \".config\", \"opencode\", \"mimic.json\");\n if (!existsSync(configPath)) return {};\n\n try {\n const raw = await readFile(configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return {};\n return parsed as MimicUserConfig;\n } catch {\n return {};\n }\n}\n\nexport function resolveLanguage(config?: MimicUserConfig | null): Language {\n if (config?.language === \"ko-KR\") return \"ko-KR\";\n return DEFAULT_LANGUAGE;\n}\n\nexport interface I18n {\n language: Language;\n t: (key: string, vars?: Record<string, string | number>) => string;\n}\n\nfunction interpolate(template: string, vars?: Record<string, string | number>): string {\n if (!vars) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_match, key) => {\n const value = vars[key];\n return value === undefined ? \"\" : String(value);\n });\n}\n\nexport function createI18n(language: Language): I18n {\n return {\n language,\n t: (key, vars) => {\n const dict = MESSAGES[language] ?? MESSAGES[DEFAULT_LANGUAGE];\n const fallback = MESSAGES[DEFAULT_LANGUAGE];\n const template = dict[key] ?? fallback[key] ?? key;\n return interpolate(template, vars);\n },\n };\n}\n\nexport function formatCapabilityType(i18n: I18n, type: string): string {\n return i18n.t(`evolution.type.${type}`);\n}\n\nexport function formatLevelLabel(i18n: I18n, level: string): string {\n return i18n.t(`level.label.${level}`);\n}\n\nexport function formatGreetingStyle(i18n: I18n, style: string): string {\n return i18n.t(`level.style.${style}`);\n}\n\nexport function formatDetailLevel(i18n: I18n, detail: string): string {\n return i18n.t(`level.detail.${detail}`);\n}\n\nexport function formatPatternType(i18n: I18n, type: string): string {\n return i18n.t(`patterns.type.${type}`);\n}\n","import { execSync } from \"node:child_process\";\n\nexport function getGitHistory(directory: string, limit = 50): string[] {\n try {\n const result = execSync(`git log --oneline -n ${limit}`, {\n cwd: directory,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return result.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function getRecentlyModifiedFiles(directory: string): string[] {\n try {\n const result = execSync(\n \"git diff --name-only HEAD~10 HEAD 2>/dev/null || git diff --name-only\",\n {\n cwd: directory,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n },\n );\n return result.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function getCommitMessages(directory: string, limit = 20): string[] {\n try {\n const result = execSync(`git log --format=%s -n ${limit}`, {\n cwd: directory,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return result.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function detectCommitPatterns(messages: string[]): Map<string, number> {\n const patterns = new Map<string, number>();\n for (const msg of messages) {\n const normalized = msg.toLowerCase().replace(/\\s+/g, \" \").trim();\n patterns.set(normalized, (patterns.get(normalized) || 0) + 1);\n }\n return patterns;\n}\n","import type { MimicContext } from \"@/context\";\nimport { detectCommitPatterns, getCommitMessages } from \"@/git\";\nimport type { Pattern } from \"@/types\";\n\nexport async function detectPatterns(ctx: MimicContext): Promise<Pattern[]> {\n const state = await ctx.stateManager.read();\n const newPatterns: Pattern[] = [];\n\n const commitMessages = getCommitMessages(ctx.directory);\n const commitPatterns = detectCommitPatterns(commitMessages);\n for (const [msg, count] of commitPatterns) {\n if (count >= 3) {\n const existing = state.patterns.find((p) => p.type === \"commit\" && p.description === msg);\n if (!existing) {\n newPatterns.push({\n id: crypto.randomUUID(),\n type: \"commit\",\n description: msg,\n count,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [],\n });\n }\n }\n }\n\n const fileStats = state.statistics.filesModified;\n for (const [file, count] of Object.entries(fileStats)) {\n if (count >= 5) {\n const existing = state.patterns.find((p) => p.type === \"file\" && p.description === file);\n if (!existing) {\n newPatterns.push({\n id: crypto.randomUUID(),\n type: \"file\",\n description: file,\n count,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [],\n });\n }\n }\n }\n\n return newPatterns;\n}\n\nexport async function surfacePatterns(ctx: MimicContext): Promise<string[]> {\n const state = await ctx.stateManager.read();\n const suggestions: string[] = [];\n\n for (const pattern of state.patterns) {\n if (pattern.surfaced) continue;\n if (pattern.count < state.preferences.minPatternCount) continue;\n\n let suggestion = \"\";\n switch (pattern.type) {\n case \"commit\":\n suggestion = ctx.i18n.t(\"suggest.commit\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n case \"file\":\n suggestion = ctx.i18n.t(\"suggest.file\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n case \"tool\":\n suggestion = ctx.i18n.t(\"suggest.tool\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n case \"sequence\":\n suggestion = ctx.i18n.t(\"suggest.sequence\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n }\n suggestions.push(suggestion);\n }\n\n return suggestions;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { State } from \"@/types\";\n\nconst STATE_JSON_GITIGNORE_LINE = \".opencode/mimic/state.json\";\n\nexport const createDefaultState = (projectName: string): State => ({\n version: \"0.1.0\",\n project: {\n name: projectName,\n creatorLevel: null,\n firstSession: Date.now(),\n stack: [],\n focus: undefined,\n },\n journey: {\n observations: [],\n milestones: [],\n sessionCount: 0,\n lastSession: null,\n },\n patterns: [],\n evolution: {\n capabilities: [],\n lastEvolution: null,\n pendingSuggestions: [],\n },\n preferences: {\n suggestionEnabled: true,\n learningEnabled: true,\n minPatternCount: 3,\n },\n statistics: {\n totalSessions: 0,\n totalToolCalls: 0,\n filesModified: {},\n lastSessionId: null,\n },\n});\n\nexport class StateManager {\n private readonly mimicDir: string;\n private readonly statePath: string;\n private readonly sessionsDir: string;\n private readonly projectName: string;\n\n constructor(directory: string) {\n this.mimicDir = join(directory, \".opencode\", \"mimic\");\n this.statePath = join(this.mimicDir, \"state.json\");\n this.sessionsDir = join(this.mimicDir, \"sessions\");\n this.projectName = directory.split(\"/\").pop() || \"unknown\";\n }\n\n private async ensureGitIgnore(): Promise<void> {\n const gitIgnorePath = join(this.mimicDir, \"..\", \"..\", \".gitignore\");\n\n if (!existsSync(gitIgnorePath)) {\n await writeFile(gitIgnorePath, STATE_JSON_GITIGNORE_LINE + \"\\n\", \"utf-8\");\n return;\n }\n\n const content = await readFile(gitIgnorePath, \"utf-8\");\n const lines = content.split(/\\r?\\n/);\n const alreadyExists = lines.some((line) => line.trim() === STATE_JSON_GITIGNORE_LINE);\n\n if (!alreadyExists) {\n await writeFile(gitIgnorePath, content + \"\\n\" + STATE_JSON_GITIGNORE_LINE + \"\\n\", \"utf-8\");\n }\n }\n\n async initialize(): Promise<void> {\n await this.ensureGitIgnore();\n\n if (!existsSync(this.mimicDir)) {\n await mkdir(this.mimicDir, { recursive: true });\n }\n if (!existsSync(this.sessionsDir)) {\n await mkdir(this.sessionsDir, { recursive: true });\n }\n if (!existsSync(this.statePath)) {\n await this.save(createDefaultState(this.projectName));\n }\n }\n\n async read(): Promise<State> {\n return JSON.parse(await readFile(this.statePath, \"utf-8\"));\n }\n\n async save(state: State): Promise<void> {\n await writeFile(this.statePath, JSON.stringify(state, null, 2));\n }\n\n async addObservation(observation: string): Promise<void> {\n const state = await this.read();\n state.journey.observations.push({\n observation,\n timestamp: new Date().toISOString(),\n });\n if (state.journey.observations.length > 100) {\n state.journey.observations = state.journey.observations.slice(-100);\n }\n await this.save(state);\n }\n\n async addMilestone(milestone: string): Promise<void> {\n const state = await this.read();\n state.journey.milestones.push({\n milestone,\n timestamp: new Date().toISOString(),\n });\n await this.save(state);\n }\n\n async saveSession(sessionId: string, data: Record<string, unknown>): Promise<void> {\n await writeFile(join(this.sessionsDir, `${sessionId}.json`), JSON.stringify(data, null, 2));\n }\n\n getSessionsDir(): string {\n return this.sessionsDir;\n }\n\n getProjectName(): string {\n return this.projectName;\n }\n\n getStatePath(): string {\n return this.statePath;\n }\n}\n","import { readdir, writeFile } from \"node:fs/promises\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport { format } from \"date-fns\";\nimport { evolveCapability, formatEvolutionResult, getEvolutionSuggestions } from \"@/evolution\";\nimport { analyzeTimeSinceLastSession, formatGrowAnalysis, formatJourney } from \"@/format\";\nimport { getGitHistory, getRecentlyModifiedFiles } from \"@/git\";\nimport {\n createI18n,\n formatCapabilityType,\n formatDetailLevel,\n formatGreetingStyle,\n formatLevelLabel,\n formatPatternType,\n type I18n,\n loadMimicConfig,\n resolveLanguage,\n} from \"@/i18n\";\nimport { getLevelConfig } from \"@/level\";\nimport { surfacePatterns } from \"@/patterns\";\nimport { createDefaultState, type StateManager } from \"@/state\";\nimport type { CreatorLevel, Pattern, ToolCall } from \"@/types\";\n\nexport function createTools(\n stateManager: StateManager,\n directory: string,\n toolCalls: ToolCall[],\n i18n?: I18n,\n): Record<string, ToolDefinition> {\n const baseI18n = i18n ?? createI18n(resolveLanguage(null));\n const i18nPromise = i18n\n ? Promise.resolve(i18n)\n : loadMimicConfig()\n .then((config) => createI18n(resolveLanguage(config)))\n .catch(() => createI18n(resolveLanguage(null)));\n\n return {\n \"mimic:init\": tool({\n description: baseI18n.t(\"tool.init.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const isFirstTime = state.journey.sessionCount <= 1;\n\n if (isFirstTime) {\n return i18n.t(\"init.first_time\", { project: state.project.name });\n }\n\n const timeSince = analyzeTimeSinceLastSession(state.journey.lastSession);\n const recentObs = state.journey.observations.slice(-3);\n\n let greeting = `${i18n.t(\"init.returning.header\")}\\n\\n`;\n greeting += `${i18n.t(\"init.returning.welcome\", { project: state.project.name })}\\n\\n`;\n greeting += `${i18n.t(\"init.returning.stats\", {\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n })}\\n\\n`;\n\n if (timeSince === \"long-break\") {\n greeting += `${i18n.t(\"init.returning.long_break\")}\\n\\n`;\n }\n\n if (recentObs.length > 0) {\n greeting += `${i18n.t(\"init.returning.recent_obs_title\")}\\n`;\n for (const o of recentObs) {\n greeting += `- ${o.observation}\\n`;\n }\n }\n\n return greeting;\n },\n }),\n\n \"mimic:status\": tool({\n description: baseI18n.t(\"tool.status.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const recentFiles = getRecentlyModifiedFiles(directory);\n const gitHistory = getGitHistory(directory, 5);\n\n let output = `${i18n.t(\"status.title\", { project: state.project.name })}\\n\\n`;\n output += `${i18n.t(\"status.session\", { count: state.journey.sessionCount })}\\n`;\n output += `${i18n.t(\"status.patterns\", {\n total: state.patterns.length,\n surfaced: state.patterns.filter((p) => p.surfaced).length,\n })}\\n`;\n output += `${i18n.t(\"status.tool_calls\", { count: toolCalls.length })}\\n\\n`;\n\n if (recentFiles.length > 0) {\n output += `${i18n.t(\"status.recent_files\")}\\n`;\n for (const f of recentFiles.slice(0, 5)) {\n output += `- ${f}\\n`;\n }\n output += \"\\n\";\n }\n\n if (gitHistory.length > 0) {\n output += `${i18n.t(\"status.recent_commits\")}\\n`;\n for (const c of gitHistory) {\n output += `- ${c}\\n`;\n }\n }\n\n const suggestions = await surfacePatterns(ctx);\n if (suggestions.length > 0) {\n output += `\\n${i18n.t(\"status.suggestions\")}\\n`;\n for (const s of suggestions) {\n output += `- ${s}\\n`;\n }\n }\n\n return output;\n },\n }),\n\n \"mimic:journey\": tool({\n description: baseI18n.t(\"tool.journey.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const gitHistory = getGitHistory(directory, 10);\n return formatJourney(ctx, state, gitHistory);\n },\n }),\n\n \"mimic:patterns\": tool({\n description: baseI18n.t(\"tool.patterns.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (state.patterns.length === 0) {\n return i18n.t(\"patterns.none\");\n }\n\n let output = `${i18n.t(\"patterns.title\")}\\n\\n`;\n output += `${i18n.t(\"patterns.total\", { count: state.patterns.length })}\\n\\n`;\n\n const byType = new Map<string, Pattern[]>();\n for (const p of state.patterns) {\n const list = byType.get(p.type) || [];\n list.push(p);\n byType.set(p.type, list);\n }\n\n for (const [type, patterns] of byType) {\n output += `${i18n.t(\"patterns.section\", {\n type: formatPatternType(i18n, type),\n })}\\n`;\n for (const p of patterns.slice(0, 10)) {\n const status = p.surfaced ? \"โœ“\" : \"โ—‹\";\n output += `${status} **${p.description}** (${p.count}x)\\n`;\n }\n output += \"\\n\";\n }\n\n return output;\n },\n }),\n\n \"mimic:observe\": tool({\n description: baseI18n.t(\"tool.observe.description\"),\n args: {\n observation: tool.schema.string().describe(baseI18n.t(\"tool.observe.args.observation\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n await stateManager.addObservation(args.observation);\n return i18n.t(\"observe.recorded\", { observation: args.observation });\n },\n }),\n\n \"mimic:milestone\": tool({\n description: baseI18n.t(\"tool.milestone.description\"),\n args: {\n milestone: tool.schema.string().describe(baseI18n.t(\"tool.milestone.args.milestone\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n await stateManager.addMilestone(args.milestone);\n return i18n.t(\"milestone.recorded\", { milestone: args.milestone });\n },\n }),\n\n \"mimic:stats\": tool({\n description: baseI18n.t(\"tool.stats.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const sessionFiles = await readdir(stateManager.getSessionsDir()).catch(() => []);\n\n return `## ${i18n.t(\"stats.title\")}\n\n- **${i18n.t(\"stats.version\")}**: ${state.version}\n- **${i18n.t(\"stats.total_sessions\")}**: ${state.statistics.totalSessions}\n- **${i18n.t(\"stats.total_tool_calls\")}**: ${state.statistics.totalToolCalls}\n- **${i18n.t(\"stats.patterns_detected\")}**: ${state.patterns.length}\n- **${i18n.t(\"stats.milestones\")}**: ${state.journey.milestones.length}\n- **${i18n.t(\"stats.observations\")}**: ${state.journey.observations.length}\n- **${i18n.t(\"stats.session_records\")}**: ${sessionFiles.length}\n- **${i18n.t(\"stats.first_session\")}**: ${format(state.project.firstSession, \"yyyy-MM-dd HH:mm:ss\")}\n- **${i18n.t(\"stats.learning_enabled\")}**: ${state.preferences.learningEnabled}\n- **${i18n.t(\"stats.suggestions_enabled\")}**: ${state.preferences.suggestionEnabled}`;\n },\n }),\n\n \"mimic:configure\": tool({\n description: baseI18n.t(\"tool.configure.description\"),\n args: {\n learningEnabled: tool.schema\n .boolean()\n .optional()\n .describe(baseI18n.t(\"tool.configure.args.learningEnabled\")),\n suggestionEnabled: tool.schema\n .boolean()\n .optional()\n .describe(baseI18n.t(\"tool.configure.args.suggestionEnabled\")),\n minPatternCount: tool.schema\n .number()\n .optional()\n .describe(baseI18n.t(\"tool.configure.args.minPatternCount\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (args.learningEnabled !== undefined) {\n state.preferences.learningEnabled = args.learningEnabled;\n }\n if (args.suggestionEnabled !== undefined) {\n state.preferences.suggestionEnabled = args.suggestionEnabled;\n }\n if (args.minPatternCount !== undefined) {\n state.preferences.minPatternCount = args.minPatternCount;\n }\n\n await stateManager.save(state);\n return `${i18n.t(\"configure.updated\")}\\n${JSON.stringify(state.preferences, null, 2)}`;\n },\n }),\n\n \"mimic:surface\": tool({\n description: baseI18n.t(\"tool.surface.description\"),\n args: {\n patternId: tool.schema.string().describe(baseI18n.t(\"tool.surface.args.patternId\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const pattern = state.patterns.find((p) => p.id === args.patternId);\n if (!pattern) {\n return i18n.t(\"surface.not_found\", { id: args.patternId });\n }\n pattern.surfaced = true;\n await stateManager.save(state);\n return i18n.t(\"surface.marked\", { description: pattern.description });\n },\n }),\n\n \"mimic:reset\": tool({\n description: baseI18n.t(\"tool.reset.description\"),\n args: {\n confirm: tool.schema.boolean().describe(baseI18n.t(\"tool.reset.args.confirm\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n if (!args.confirm) {\n return i18n.t(\"reset.cancelled\");\n }\n\n await writeFile(\n stateManager.getStatePath(),\n JSON.stringify(createDefaultState(stateManager.getProjectName()), null, 2),\n );\n return i18n.t(\"reset.done\");\n },\n }),\n\n \"mimic:grow\": tool({\n description: baseI18n.t(\"tool.grow.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const gitHistory = getGitHistory(directory, 20);\n const recentFiles = getRecentlyModifiedFiles(directory);\n return formatGrowAnalysis(ctx, state, gitHistory, recentFiles);\n },\n }),\n\n \"mimic:evolve\": tool({\n description: baseI18n.t(\"tool.evolve.description\"),\n args: {\n accept: tool.schema.string().optional().describe(baseI18n.t(\"tool.evolve.args.accept\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const ctx = { stateManager, directory, i18n };\n if (args.accept) {\n const suggestions = await getEvolutionSuggestions(ctx);\n const suggestion = suggestions.find((s) => s.pattern.id === args.accept);\n if (!suggestion) {\n return i18n.t(\"evolve.no_pattern\", { id: args.accept });\n }\n const { capability, filePath } = await evolveCapability(ctx, suggestion);\n return `${i18n.t(\"evolve.absorbed_header\")}\\n\\n${formatEvolutionResult(\n ctx,\n capability,\n filePath,\n )}`;\n }\n\n const suggestions = await getEvolutionSuggestions(ctx);\n if (suggestions.length === 0) {\n return i18n.t(\"evolve.empty\");\n }\n\n let output = `${i18n.t(\"evolve.menu_title\")}\\n\\n`;\n output += `${i18n.t(\"evolve.menu_intro\")}\\n\\n`;\n\n for (const s of suggestions) {\n output += `### โœจ ${s.name}\\n`;\n output += `- **${i18n.t(\"evolve.menu_type\")}**: ${formatCapabilityType(i18n, s.type)}\\n`;\n output += `- **${i18n.t(\"evolve.menu_reason\")}**: ${s.reason}\\n`;\n output += `- **${i18n.t(\"evolve.menu_pattern_id\")}**: \\`${s.pattern.id}\\`\\n\\n`;\n }\n\n output += `\\n${i18n.t(\"evolve.menu_footer\")}`;\n return output;\n },\n }),\n\n \"mimic:level\": tool({\n description: baseI18n.t(\"tool.level.description\"),\n args: {\n level: tool.schema\n .enum([\"technical\", \"semi-technical\", \"non-technical\", \"chaotic\"])\n .describe(baseI18n.t(\"tool.level.args.level\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n state.project.creatorLevel = args.level as CreatorLevel;\n await stateManager.save(state);\n\n const config = getLevelConfig(args.level as CreatorLevel);\n return i18n.t(\"level.set\", {\n level: formatLevelLabel(i18n, args.level),\n style: formatGreetingStyle(i18n, config.greetingStyle),\n detail: formatDetailLevel(i18n, config.detailLevel),\n });\n },\n }),\n\n \"mimic:focus\": tool({\n description: baseI18n.t(\"tool.focus.description\"),\n args: {\n focus: tool.schema.string().optional().describe(baseI18n.t(\"tool.focus.args.focus\")),\n stack: tool.schema.string().optional().describe(baseI18n.t(\"tool.focus.args.stack\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (args.focus) {\n state.project.focus = args.focus;\n await stateManager.addObservation(i18n.t(\"obs.focus_changed\", { focus: args.focus }));\n }\n if (args.stack) {\n state.project.stack = args.stack.split(\",\").map((s) => s.trim());\n }\n\n await stateManager.save(state);\n\n let output = `${i18n.t(\"focus.updated\")}\\n`;\n if (state.project.focus)\n output += `- **${i18n.t(\"focus.focus_label\")}**: ${state.project.focus}\\n`;\n if (state.project.stack?.length)\n output += `- **${i18n.t(\"focus.stack_label\")}**: ${state.project.stack.join(\", \")}\\n`;\n return output;\n },\n }),\n\n \"mimic:mcp-search\": tool({\n description: baseI18n.t(\"tool.mcp_search.description\"),\n args: {\n query: tool.schema.string().describe(baseI18n.t(\"tool.mcp_search.args.query\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const searchUrl = `https://mcpmarket.com/search?q=${encodeURIComponent(args.query)}`;\n const popular = [\n {\n name: \"context7\",\n desc: i18n.t(\"mcp_search.desc.context7\"),\n url: \"https://mcp.context7.com/mcp\",\n },\n {\n name: \"github\",\n desc: i18n.t(\"mcp_search.desc.github\"),\n url: \"https://mcp.github.com\",\n },\n {\n name: \"supabase\",\n desc: i18n.t(\"mcp_search.desc.supabase\"),\n url: \"https://mcp.supabase.com\",\n },\n { name: \"playwright\", desc: i18n.t(\"mcp_search.desc.playwright\") },\n { name: \"firecrawl\", desc: i18n.t(\"mcp_search.desc.firecrawl\") },\n ];\n const popularLines = popular\n .map((server) =>\n server.url\n ? `- **${server.name}** - ${server.desc}: \\`${server.url}\\``\n : `- **${server.name}** - ${server.desc}`,\n )\n .join(\"\\n\");\n return `${i18n.t(\"mcp_search.header\", {\n query: args.query,\n url: searchUrl,\n })}\\n\\n${i18n.t(\"mcp_search.popular\")}\\n${popularLines}\\n\\n${i18n.t(\"mcp_search.add\")}`;\n },\n }),\n\n \"mimic:mcp\": tool({\n description: baseI18n.t(\"tool.mcp.description\"),\n args: {\n name: tool.schema.string().describe(baseI18n.t(\"tool.mcp.args.name\")),\n url: tool.schema.string().optional().describe(baseI18n.t(\"tool.mcp.args.url\")),\n command: tool.schema.string().optional().describe(baseI18n.t(\"tool.mcp.args.command\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const { existsSync } = await import(\"node:fs\");\n const { readFile, writeFile: fsWriteFile, mkdir } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n\n const opencodeDir = join(directory, \".opencode\");\n if (!existsSync(opencodeDir)) {\n await mkdir(opencodeDir, { recursive: true });\n }\n\n const configPath = join(directory, \"opencode.json\");\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n config = JSON.parse(await readFile(configPath, \"utf-8\"));\n } catch {\n config = {};\n }\n }\n\n const mcpEntry: Record<string, unknown> = {};\n if (args.url) {\n mcpEntry.type = \"remote\";\n mcpEntry.url = args.url;\n } else if (args.command) {\n mcpEntry.type = \"local\";\n mcpEntry.command = args.command.split(\",\").map((s) => s.trim());\n } else {\n return i18n.t(\"mcp.need_url_or_command\");\n }\n mcpEntry.enabled = true;\n\n config.mcp = { ...((config.mcp as Record<string, unknown>) || {}), [args.name]: mcpEntry };\n await fsWriteFile(configPath, JSON.stringify(config, null, 2));\n\n await stateManager.addMilestone(i18n.t(\"milestone.mcp_added\", { name: args.name }));\n\n return i18n.t(\"mcp.added\", { name: args.name });\n },\n }),\n\n \"mimic:capabilities\": tool({\n description: baseI18n.t(\"tool.capabilities.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (state.evolution.capabilities.length === 0) {\n return i18n.t(\"capabilities.empty\");\n }\n\n let output = `${i18n.t(\"capabilities.title\")}\\n\\n`;\n output += `${i18n.t(\"capabilities.intro\")}\\n\\n`;\n for (const cap of state.evolution.capabilities) {\n output += `### โœจ ${cap.name}\\n`;\n output += `- **${i18n.t(\"capabilities.type\")}**: ${formatCapabilityType(\n i18n,\n cap.type,\n )}\\n`;\n output += `- **${i18n.t(\"capabilities.description\")}**: ${cap.description}\\n`;\n output += `- **${i18n.t(\"capabilities.consumed\")}**: ${format(\n new Date(cap.createdAt),\n \"yyyy-MM-dd\",\n )}\\n\\n`;\n }\n return output;\n },\n }),\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { MimicContext } from \"@/context\";\nimport { formatCapabilityType } from \"@/i18n\";\nimport type { StateManager } from \"@/state\";\nimport type { CapabilityType, EvolvedCapability, Pattern } from \"@/types\";\n\nconst BUILTIN_TOOLS = new Set([\n \"read\",\n \"write\",\n \"edit\",\n \"bash\",\n \"grep\",\n \"glob\",\n \"serena_list_dir\",\n \"serena_find_file\",\n \"serena_search_for_pattern\",\n \"serena_get_symbols_overview\",\n \"serena_find_symbol\",\n \"serena_find_referencing_symbols\",\n \"serena_replace_symbol_body\",\n \"serena_insert_after_symbol\",\n \"serena_insert_before_symbol\",\n \"serena_replace_content\",\n \"serena_rename_symbol\",\n \"lsp_diagnostics\",\n \"lsp_goto_definition\",\n \"lsp_find_references\",\n \"lsp_prepare_rename\",\n \"lsp_rename\",\n \"lsp_symbols\",\n \"delegate_task\",\n \"task\",\n \"question\",\n \"background_cancel\",\n \"background_output\",\n \"skill\",\n \"slashcommand\",\n \"use_skill\",\n \"find_skills\",\n \"session_list\",\n \"session_read\",\n \"session_search\",\n \"session_info\",\n \"mimic:\",\n]);\n\ninterface EvolutionSuggestion {\n type: CapabilityType;\n name: string;\n description: string;\n reason: string;\n pattern: Pattern;\n}\n\nfunction generateToolCode(name: string, description: string, pattern: Pattern): string {\n const funcName = name.replace(/-/g, \"_\");\n return `// ๐Ÿ“ฆ Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${funcName} = (plugin) => ({\n tool: {\n \"${name}\": {\n description: \"${description}\",\n args: {},\n async execute() {\n // TODO: Implement your logic here\n // This was generated from pattern: ${pattern.description}\n return \"๐Ÿ“ฆ ${name} executed!\";\n },\n },\n },\n});\n\nexport default ${funcName};\n`;\n}\n\nfunction generateHookCode(name: string, _description: string, pattern: Pattern): string {\n const filename = pattern.description;\n return `// ๐Ÿ“ฆ Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${name.replace(/-/g, \"_\")} = (plugin) => ({\n async event({ event }) {\n if (event.type === \"file.edited\") {\n const filename = event.properties?.filename;\n if (filename?.includes(\"${filename}\")) {\n console.log(\"๐Ÿ“ฆ [Mimic] Detected change in watched file: ${filename}\");\n // TODO: Add your custom logic here\n }\n }\n },\n});\n\nexport default ${name.replace(/-/g, \"_\")};\n`;\n}\n\nfunction generateSkillCode(name: string, description: string, pattern: Pattern): string {\n return `// ๐Ÿ“ฆ Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${name.replace(/-/g, \"_\")} = (plugin) => ({\n async event({ event }) {\n // Auto-triggered skill: ${description}\n if (event.type === \"session.created\") {\n console.log(\"๐Ÿ“ฆ [Mimic] Skill ${name} activated\");\n // TODO: Implement automated behavior\n }\n },\n});\n\nexport default ${name.replace(/-/g, \"_\")};\n`;\n}\n\nfunction generateMcpConfig(name: string, _description: string, pattern: Pattern): object {\n return {\n [name]: {\n type: \"local\",\n command: [\"echo\", `MCP server for ${pattern.description}`],\n enabled: false,\n },\n };\n}\n\nfunction generateAgentMarkdown(name: string, description: string, pattern: Pattern): string {\n return `---\ndescription: ${description}\nmode: subagent\ntools:\n read: true\n glob: true\n grep: true\n bash: false\n edit: false\n---\n\n# ๐Ÿ“ฆ ${name}\n\nAuto-generated by Mimic from pattern: ${pattern.description} (${pattern.count}x)\n\n## Focus Area\n\nThis agent specializes in tasks related to: ${pattern.description}\n\n## Context\n\n- Pattern detected: ${pattern.type}\n- Usage count: ${pattern.count}\n- First seen: ${new Date(pattern.firstSeen).toISOString()}\n\n## How To Help\n\nAnalyze and assist with tasks matching this pattern.\nProvide focused, expert guidance in this specific area.\n\n## Remember\n\n- Stay focused on the pattern's domain\n- Leverage the observed usage patterns\n- Adapt to the user's workflow\n`;\n}\n\ntype EvolutionOutput = { filePath: string; content: string };\n\nasync function readOpencodeConfig(configPath: string): Promise<Record<string, unknown>> {\n if (!existsSync(configPath)) return {};\n\n try {\n const parsed = JSON.parse(await readFile(configPath, \"utf-8\"));\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {};\n }\n return parsed as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nasync function buildMcpEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const opencodeDir = join(ctx.directory, \".opencode\");\n if (!existsSync(opencodeDir)) {\n await mkdir(opencodeDir, { recursive: true });\n }\n\n const configPath = join(ctx.directory, \"opencode.json\");\n const config = await readOpencodeConfig(configPath);\n const mcpConfig = generateMcpConfig(suggestion.name, suggestion.description, suggestion.pattern);\n\n const mcp = { ...((config.mcp as Record<string, unknown>) || {}), ...mcpConfig };\n const content = JSON.stringify({ ...config, mcp }, null, 2);\n\n return { filePath: configPath, content };\n}\n\nasync function buildAgentEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const agentsDir = join(ctx.directory, \".opencode\", \"agents\");\n if (!existsSync(agentsDir)) {\n await mkdir(agentsDir, { recursive: true });\n }\n\n return {\n content: generateAgentMarkdown(suggestion.name, suggestion.description, suggestion.pattern),\n filePath: join(agentsDir, `${suggestion.name}.md`),\n };\n}\n\nfunction buildPluginContent(suggestion: EvolutionSuggestion): string {\n switch (suggestion.type) {\n case \"command\":\n case \"shortcut\":\n return generateToolCode(suggestion.name, suggestion.description, suggestion.pattern);\n case \"hook\":\n return generateHookCode(suggestion.name, suggestion.description, suggestion.pattern);\n case \"skill\":\n return generateSkillCode(suggestion.name, suggestion.description, suggestion.pattern);\n default:\n return generateToolCode(suggestion.name, suggestion.description, suggestion.pattern);\n }\n}\n\nasync function buildPluginEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const pluginsDir = join(ctx.directory, \".opencode\", \"plugins\");\n if (!existsSync(pluginsDir)) {\n await mkdir(pluginsDir, { recursive: true });\n }\n\n return {\n content: buildPluginContent(suggestion),\n filePath: join(pluginsDir, `${suggestion.name}.js`),\n };\n}\n\nasync function buildEvolutionOutput(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n if (suggestion.type === \"mcp\") {\n return buildMcpEvolution(ctx, suggestion);\n }\n\n if (suggestion.type === \"agent\") {\n return buildAgentEvolution(ctx, suggestion);\n }\n\n return buildPluginEvolution(ctx, suggestion);\n}\n\nfunction createCapabilityFromSuggestion(suggestion: EvolutionSuggestion): EvolvedCapability {\n return {\n id: crypto.randomUUID(),\n type: suggestion.type,\n name: suggestion.name,\n description: suggestion.description,\n createdAt: new Date().toISOString(),\n fromPattern: suggestion.pattern.id,\n };\n}\n\nfunction updateEvolutionState(\n state: Awaited<ReturnType<StateManager[\"read\"]>>,\n capability: EvolvedCapability,\n suggestion: EvolutionSuggestion,\n): void {\n state.evolution.capabilities.push(capability);\n state.evolution.lastEvolution = new Date().toISOString();\n\n const pattern = state.patterns.find((p) => p.id === suggestion.pattern.id);\n if (pattern) {\n pattern.surfaced = true;\n }\n}\n\nexport function suggestEvolution(pattern: Pattern, ctx: MimicContext): EvolutionSuggestion | null {\n switch (pattern.type) {\n case \"tool\":\n if (pattern.count >= 10) {\n const toolName = pattern.description;\n if (BUILTIN_TOOLS.has(toolName)) {\n return null;\n }\n return {\n type: \"shortcut\",\n name: `quick-${pattern.description.toLowerCase().replace(/[^a-z0-9]/g, \"-\")}`,\n description: ctx.i18n.t(\"evolution.suggest.tool.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.tool.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"file\":\n if (pattern.count >= 5) {\n return {\n type: \"hook\",\n name: `watch-${pattern.description.split(\"/\").pop()?.replace(/\\./g, \"-\") || \"file\"}`,\n description: ctx.i18n.t(\"evolution.suggest.file.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.file.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"commit\":\n if (pattern.count >= 3) {\n return {\n type: \"command\",\n name: `commit-${pattern.description.slice(0, 20).replace(/\\s+/g, \"-\").toLowerCase()}`,\n description: ctx.i18n.t(\"evolution.suggest.commit.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.commit.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"sequence\":\n if (pattern.count >= 5) {\n return {\n type: \"agent\",\n name: `${pattern.description.slice(0, 15).replace(/\\s+/g, \"-\").toLowerCase()}-specialist`,\n description: ctx.i18n.t(\"evolution.suggest.sequence.agent.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.sequence.agent.reason\", { count: pattern.count }),\n pattern,\n };\n }\n if (pattern.count >= 3) {\n return {\n type: \"skill\",\n name: `auto-${pattern.description.slice(0, 15).replace(/\\s+/g, \"-\").toLowerCase()}`,\n description: ctx.i18n.t(\"evolution.suggest.sequence.skill.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.sequence.skill.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n }\n\n return null;\n}\n\nexport async function getEvolutionSuggestions(ctx: MimicContext): Promise<EvolutionSuggestion[]> {\n const state = await ctx.stateManager.read();\n const suggestions: EvolutionSuggestion[] = [];\n\n for (const pattern of state.patterns) {\n if (pattern.surfaced) continue;\n\n const suggestion = suggestEvolution(pattern, ctx);\n if (suggestion) {\n suggestions.push(suggestion);\n }\n }\n\n return suggestions;\n}\n\nexport async function evolveCapability(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<{ capability: EvolvedCapability; filePath: string }> {\n const state = await ctx.stateManager.read();\n const { filePath, content } = await buildEvolutionOutput(ctx, suggestion);\n await writeFile(filePath, content, \"utf-8\");\n\n const capability = createCapabilityFromSuggestion(suggestion);\n updateEvolutionState(state, capability, suggestion);\n\n await ctx.stateManager.save(state);\n await ctx.stateManager.addMilestone(\n ctx.i18n.t(\"milestone.evolved\", {\n name: capability.name,\n type: formatCapabilityType(ctx.i18n, capability.type),\n }),\n );\n\n return { capability, filePath };\n}\n\nexport function formatEvolutionResult(\n ctx: MimicContext,\n capability: EvolvedCapability,\n filePath: string,\n): string {\n const typeLabel = formatCapabilityType(ctx.i18n, capability.type);\n let result = `### โœจ ${capability.name}\\n\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.type\")}**: ${typeLabel}\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.description\")}**: ${capability.description}\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.file\")}**: \\`${filePath}\\`\\n\\n`;\n result += `*${ctx.i18n.t(\"evolution.result.restart\", { type: typeLabel })}*\\n\\n`;\n\n switch (capability.type) {\n case \"command\":\n case \"shortcut\":\n result += `${ctx.i18n.t(\"evolution.result.command\", { name: capability.name })}\\n`;\n break;\n\n case \"hook\":\n result += `${ctx.i18n.t(\"evolution.result.hook\")}\\n`;\n break;\n\n case \"skill\":\n result += `${ctx.i18n.t(\"evolution.result.skill\")}\\n`;\n break;\n\n case \"agent\":\n result += `${ctx.i18n.t(\"evolution.result.agent\", { name: capability.name })}\\n`;\n break;\n\n case \"mcp\":\n result += `${ctx.i18n.t(\"evolution.result.mcp\", { name: capability.name })}\\n`;\n break;\n }\n\n return result;\n}\n","import type { I18n } from \"@/i18n\";\nimport type { CreatorLevel, State } from \"@/types\";\n\ninterface LevelConfig {\n greetingStyle: \"formal\" | \"casual\" | \"minimal\" | \"chaotic\";\n detailLevel: \"high\" | \"medium\" | \"low\";\n useEmoji: boolean;\n technicalTerms: boolean;\n}\n\nconst LEVEL_CONFIGS: Record<CreatorLevel, LevelConfig> = {\n technical: {\n greetingStyle: \"minimal\",\n detailLevel: \"high\",\n useEmoji: false,\n technicalTerms: true,\n },\n \"semi-technical\": {\n greetingStyle: \"casual\",\n detailLevel: \"medium\",\n useEmoji: false,\n technicalTerms: true,\n },\n \"non-technical\": {\n greetingStyle: \"formal\",\n detailLevel: \"low\",\n useEmoji: true,\n technicalTerms: false,\n },\n chaotic: {\n greetingStyle: \"chaotic\",\n detailLevel: \"medium\",\n useEmoji: true,\n technicalTerms: true,\n },\n};\n\nexport function getLevelConfig(level: CreatorLevel | null): LevelConfig {\n return LEVEL_CONFIGS[level ?? \"technical\"];\n}\n\nexport function adaptMessage(message: string, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n\n if (config.greetingStyle === \"minimal\") {\n return message.replace(/^#+\\s*/gm, \"\").trim();\n }\n\n if (config.greetingStyle === \"chaotic\") {\n const chaosEmojis = [\"๐Ÿ”ฅ\", \"โšก\", \"๐Ÿš€\", \"๐Ÿ’ฅ\", \"โœจ\"];\n const emoji = chaosEmojis[Math.floor(Math.random() * chaosEmojis.length)];\n return `${emoji} ${message}`;\n }\n\n return message;\n}\n\nexport function formatGreeting(i18n: I18n, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n const name = state.project.name;\n\n switch (config.greetingStyle) {\n case \"minimal\":\n return i18n.t(\"level.greeting.minimal\", {\n project: name,\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n });\n case \"casual\":\n return i18n.t(\"level.greeting.casual\", {\n project: name,\n sessions: state.journey.sessionCount,\n });\n case \"formal\":\n return i18n.t(\"level.greeting.formal\", {\n project: name,\n sessions: state.journey.sessionCount,\n });\n case \"chaotic\": {\n const greetings = [\n i18n.t(\"level.greeting.chaotic.chomp\"),\n i18n.t(\"level.greeting.chaotic.lid_creaks\"),\n i18n.t(\"level.greeting.chaotic.teeth_gleam\"),\n i18n.t(\"level.greeting.chaotic.tongue_flicks\"),\n ];\n const g = greetings[Math.floor(Math.random() * greetings.length)];\n return i18n.t(\"level.greeting.chaotic.template\", {\n tag: g,\n project: name,\n sessions: state.journey.sessionCount,\n });\n }\n }\n}\n\nexport function formatSuggestion(i18n: I18n, suggestion: string, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n\n if (!config.technicalTerms) {\n const replacements: Array<[string, string]> = [\n [i18n.t(\"level.term.tool\"), i18n.t(\"level.term.shortcut\")],\n [i18n.t(\"level.term.pattern\"), i18n.t(\"level.term.habit\")],\n [i18n.t(\"level.term.hook\"), i18n.t(\"level.term.automation\")],\n ];\n let result = suggestion;\n for (const [from, to] of replacements) {\n if (!from || from === to) continue;\n const escaped = from.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n result = result.replace(new RegExp(escaped, \"gi\"), to);\n }\n return result;\n }\n\n return suggestion;\n}\n","import type { Plugin } from \"@opencode-ai/plugin\";\nimport type { Event } from \"@opencode-ai/sdk\";\nimport type { MimicContext } from \"@/context\";\nimport { analyzeTimeSinceLastSession, formatDuration } from \"@/format\";\nimport { createI18n, loadMimicConfig, resolveLanguage } from \"@/i18n\";\nimport { detectPatterns, surfacePatterns } from \"@/patterns\";\nimport { StateManager } from \"@/state\";\nimport { createTools } from \"@/tools\";\nimport type { ToolCall } from \"@/types\";\n\nexport const mimic: Plugin = async ({ directory, client }) => {\n const stateManager = new StateManager(directory);\n await stateManager.initialize();\n const i18n = createI18n(resolveLanguage(await loadMimicConfig()));\n const ctx: MimicContext = { stateManager, directory, i18n, client };\n\n const sessionId = crypto.randomUUID();\n const sessionStartTime = Date.now();\n const toolCalls: ToolCall[] = [];\n const filesEdited: Set<string> = new Set();\n\n const handleSessionCreated = async () => {\n const state = await stateManager.read();\n const timeSince = analyzeTimeSinceLastSession(state.journey.lastSession);\n\n state.statistics.totalSessions += 1;\n state.statistics.lastSessionId = sessionId;\n state.journey.sessionCount += 1;\n state.journey.lastSession = new Date().toISOString();\n\n await stateManager.save(state);\n\n if (timeSince === \"long-break\") {\n await stateManager.addObservation(i18n.t(\"obs.returned_after_long_break\"));\n }\n\n await client.tui.showToast({\n body: {\n message: i18n.t(\"log.session_started\", {\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n }),\n variant: \"info\",\n },\n });\n };\n\n const handleSessionIdle = async () => {\n const newPatterns = await detectPatterns(ctx);\n if (newPatterns.length > 0) {\n const state = await stateManager.read();\n state.patterns.push(...newPatterns);\n await stateManager.save(state);\n }\n\n const suggestions = await surfacePatterns(ctx);\n for (const suggestion of suggestions) {\n await client.tui.showToast({\n body: {\n title: \"[Mimic]\",\n message: suggestion,\n variant: \"info\",\n },\n });\n }\n };\n\n const handleFileEdited = async (event: Event) => {\n if (!(\"properties\" in event)) return;\n\n const filename = (event.properties as { filename?: string })?.filename;\n if (!filename) return;\n\n filesEdited.add(filename);\n const state = await stateManager.read();\n state.statistics.filesModified[filename] = (state.statistics.filesModified[filename] || 0) + 1;\n await stateManager.save(state);\n };\n\n return {\n async event({ event }: { event: Event }) {\n switch (event.type) {\n case \"session.created\":\n await handleSessionCreated();\n return;\n case \"session.idle\":\n await handleSessionIdle();\n return;\n case \"file.edited\":\n await handleFileEdited(event);\n }\n },\n\n async \"tool.execute.after\"(\n input: { tool: string; sessionID: string; callID: string },\n _output: { title: string; output: string; metadata: unknown },\n ) {\n const state = await stateManager.read();\n if (!state.preferences.learningEnabled) return;\n\n const toolCall: ToolCall = {\n tool: input.tool,\n callID: input.callID,\n timestamp: Date.now(),\n };\n\n toolCalls.push(toolCall);\n state.statistics.totalToolCalls += 1;\n\n const toolPattern = input.tool;\n const existing = state.patterns.find(\n (p) => p.type === \"tool\" && p.description === toolPattern,\n );\n if (existing) {\n existing.count += 1;\n existing.lastSeen = Date.now();\n } else {\n state.patterns.push({\n id: crypto.randomUUID(),\n type: \"tool\",\n description: toolPattern,\n count: 1,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [toolCall],\n });\n }\n\n await stateManager.save(state);\n },\n\n async stop() {\n const sessionDuration = Date.now() - sessionStartTime;\n\n const sessionData = {\n sessionId,\n startTime: new Date(sessionStartTime).toISOString(),\n endTime: new Date().toISOString(),\n durationMs: sessionDuration,\n toolCalls: toolCalls.length,\n filesEdited: Array.from(filesEdited),\n };\n\n await stateManager.saveSession(sessionId, sessionData);\n\n if (toolCalls.length > 20) {\n await stateManager.addObservation(\n i18n.t(\"obs.intensive_session\", { tools: toolCalls.length }),\n );\n }\n if (filesEdited.size > 10) {\n await stateManager.addMilestone(\n i18n.t(\"milestone.major_refactor\", { files: filesEdited.size }),\n );\n }\n\n await client.tui.showToast({\n body: {\n message: i18n.t(\"log.session_ended\", {\n duration: formatDuration(sessionDuration),\n tools: toolCalls.length,\n files: filesEdited.size,\n }),\n variant: \"info\",\n },\n });\n },\n\n tool: createTools(stateManager, directory, toolCalls, i18n),\n };\n};\n\nexport default mimic;\n"],"mappings":"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","names":["existsSync","readFile","join","writeFile","format","existsSync","mkdir","readFile","writeFile","join","existsSync","readFile","join","mkdir","writeFile","i18n","format","writeFile","suggestions","existsSync","readFile","mkdir","join"]}
1
+ {"version":3,"sources":["../src/constants/opencode-events.ts","../src/core/state.ts","../src/lib/i18n.ts","../src/modules/evolution/engine.ts","../src/constants/tools.ts","../src/constants/domain.ts","../src/modules/knowledge/instincts.ts","../src/utils/id.ts","../src/modules/knowledge/instinct-apply.ts","../src/modules/knowledge/memory.ts","../src/modules/knowledge/skills.ts","../src/modules/observation/log.ts","../src/modules/observation/observer.ts","../src/lib/git.ts","../src/modules/observation/patterns.ts","../src/tools/automation.ts","../src/tools/core.ts","../src/utils/format.ts","../src/tools/evolution.ts","../src/tools/instincts.ts","../src/tools/mcp.ts","../src/tools/observation.ts","../src/tools/registry.ts","../src/tools/settings.ts","../src/modules/evolution/system.ts","../src/tools/main.ts","../src/index.ts"],"sourcesContent":["import type {\n EventCommandExecuted,\n EventFileEdited,\n EventFileWatcherUpdated,\n EventInstallationUpdateAvailable,\n EventInstallationUpdated,\n EventLspClientDiagnostics,\n EventLspUpdated,\n EventMessagePartRemoved,\n EventMessagePartUpdated,\n EventMessageRemoved,\n EventMessageUpdated,\n EventPermissionReplied,\n EventPermissionUpdated,\n EventPtyCreated,\n EventPtyDeleted,\n EventPtyExited,\n EventPtyUpdated,\n EventServerConnected,\n EventServerInstanceDisposed,\n EventSessionCompacted,\n EventSessionCreated,\n EventSessionDeleted,\n EventSessionDiff,\n EventSessionError,\n EventSessionIdle,\n EventSessionStatus,\n EventSessionUpdated,\n EventTodoUpdated,\n EventTuiCommandExecute,\n EventTuiPromptAppend,\n EventTuiToastShow,\n EventVcsBranchUpdated,\n} from \"@opencode-ai/sdk\";\n\nexport const OPENCODE_EVENTS = {\n SERVER_INSTANCE_DISPOSED: \"server.instance.disposed\",\n INSTALLATION_UPDATED: \"installation.updated\",\n INSTALLATION_UPDATE_AVAILABLE: \"installation.update.available\",\n LSP_CLIENT_DIAGNOSTICS: \"lsp.client.diagnostics\",\n LSP_UPDATED: \"lsp.updated\",\n MESSAGE_UPDATED: \"message.updated\",\n MESSAGE_REMOVED: \"message.removed\",\n MESSAGE_PART_UPDATED: \"message.part.updated\",\n MESSAGE_PART_REMOVED: \"message.part.removed\",\n PERMISSION_UPDATED: \"permission.updated\",\n PERMISSION_REPLIED: \"permission.replied\",\n SESSION_STATUS: \"session.status\",\n SESSION_IDLE: \"session.idle\",\n SESSION_COMPACTED: \"session.compacted\",\n FILE_EDITED: \"file.edited\",\n TODO_UPDATED: \"todo.updated\",\n COMMAND_EXECUTED: \"command.executed\",\n SESSION_CREATED: \"session.created\",\n SESSION_UPDATED: \"session.updated\",\n SESSION_DELETED: \"session.deleted\",\n SESSION_DIFF: \"session.diff\",\n SESSION_ERROR: \"session.error\",\n FILE_WATCHER_UPDATED: \"file.watcher.updated\",\n VCS_BRANCH_UPDATED: \"vcs.branch.updated\",\n TUI_PROMPT_APPEND: \"tui.prompt.append\",\n TUI_COMMAND_EXECUTE: \"tui.command.execute\",\n TUI_TOAST_SHOW: \"tui.toast.show\",\n PTY_CREATED: \"pty.created\",\n PTY_UPDATED: \"pty.updated\",\n PTY_EXITED: \"pty.exited\",\n PTY_DELETED: \"pty.deleted\",\n SERVER_CONNECTED: \"server.connected\",\n // Hooks\n CHAT_MESSAGE: \"chat.message\",\n TOOL_EXECUTE_AFTER: \"tool.execute.after\",\n} as const;\n\nexport type Event =\n | EventServerInstanceDisposed\n | EventInstallationUpdated\n | EventInstallationUpdateAvailable\n | EventLspClientDiagnostics\n | EventLspUpdated\n | EventMessageUpdated\n | EventMessageRemoved\n | EventMessagePartUpdated\n | EventMessagePartRemoved\n | EventPermissionUpdated\n | EventPermissionReplied\n | EventSessionStatus\n | EventSessionIdle\n | EventSessionCompacted\n | EventFileEdited\n | EventTodoUpdated\n | EventCommandExecuted\n | EventSessionCreated\n | EventSessionUpdated\n | EventSessionDeleted\n | EventSessionDiff\n | EventSessionError\n | EventFileWatcherUpdated\n | EventVcsBranchUpdated\n | EventTuiPromptAppend\n | EventTuiCommandExecute\n | EventTuiToastShow\n | EventPtyCreated\n | EventPtyUpdated\n | EventPtyExited\n | EventPtyDeleted\n | EventServerConnected;\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Domain, Instinct, State } from \"@/types\";\n\nconst STATE_JSON_GITIGNORE_LINE = \".opencode/mimic/\";\n\nexport const createDefaultState = (projectName: string): State => ({\n version: \"0.1.0\",\n project: {\n name: projectName,\n creatorLevel: null,\n firstSession: Date.now(),\n stack: [],\n focus: undefined,\n identity: undefined,\n },\n journey: {\n observations: [],\n milestones: [],\n sessionCount: 0,\n lastSession: null,\n },\n patterns: [],\n evolution: {\n capabilities: [],\n lastEvolution: null,\n pendingSuggestions: [],\n lastObserverRun: null,\n evolvedDomains: {},\n instinctIndex: {},\n },\n preferences: {\n suggestionEnabled: true,\n learningEnabled: true,\n minPatternCount: 3,\n },\n statistics: {\n totalSessions: 0,\n totalToolCalls: 0,\n filesModified: {},\n lastSessionId: null,\n toolSequences: [],\n },\n});\n\nexport class StateManager {\n private readonly mimicDir: string;\n private readonly statePath: string;\n private readonly sessionsDir: string;\n private readonly instinctsDir: string;\n private readonly projectName: string;\n\n constructor(directory: string) {\n this.mimicDir = join(directory, \".opencode\", \"mimic\");\n this.statePath = join(this.mimicDir, \"state.json\");\n this.sessionsDir = join(this.mimicDir, \"sessions\");\n this.instinctsDir = join(this.mimicDir, \"instincts\");\n this.projectName = directory.split(\"/\").pop() || \"unknown\";\n }\n\n async ensureGitIgnore(): Promise<void> {\n const gitIgnorePath = join(this.mimicDir, \"..\", \"..\", \".gitignore\");\n\n if (!existsSync(gitIgnorePath)) {\n await writeFile(gitIgnorePath, `${STATE_JSON_GITIGNORE_LINE}\\n`, \"utf-8\");\n return;\n }\n\n const content = await readFile(gitIgnorePath, \"utf-8\");\n const lines = content.split(/\\r?\\n/);\n const alreadyExists = lines.some((line) => line.trim() === STATE_JSON_GITIGNORE_LINE);\n\n if (!alreadyExists) {\n await writeFile(gitIgnorePath, `${content}\\n${STATE_JSON_GITIGNORE_LINE}\\n`, \"utf-8\");\n }\n }\n\n async initialize(): Promise<void> {\n await this.ensureGitIgnore();\n\n if (!existsSync(this.mimicDir)) {\n await mkdir(this.mimicDir, { recursive: true });\n }\n if (!existsSync(this.sessionsDir)) {\n await mkdir(this.sessionsDir, { recursive: true });\n }\n if (!existsSync(this.instinctsDir)) {\n await mkdir(this.instinctsDir, { recursive: true });\n }\n if (!existsSync(this.statePath)) {\n await this.save(createDefaultState(this.projectName));\n }\n }\n\n async read(): Promise<State> {\n return JSON.parse(await readFile(this.statePath, \"utf-8\"));\n }\n\n async save(state: State): Promise<void> {\n await writeFile(this.statePath, JSON.stringify(state, null, 2));\n }\n\n async addObservation(observation: string): Promise<void> {\n const state = await this.read();\n state.journey.observations.push({\n observation,\n timestamp: new Date().toISOString(),\n });\n if (state.journey.observations.length > 100) {\n state.journey.observations = state.journey.observations.slice(-100);\n }\n await this.save(state);\n }\n\n async addMilestone(milestone: string): Promise<void> {\n const state = await this.read();\n state.journey.milestones.push({\n milestone,\n timestamp: new Date().toISOString(),\n });\n await this.save(state);\n }\n\n async saveSession(sessionId: string, data: Record<string, unknown>): Promise<void> {\n await writeFile(join(this.sessionsDir, `${sessionId}.json`), JSON.stringify(data, null, 2));\n }\n\n getSessionsDir(): string {\n return this.sessionsDir;\n }\n\n getProjectName(): string {\n return this.projectName;\n }\n\n getStatePath(): string {\n return this.statePath;\n }\n\n getInstinctsDir(): string {\n return this.instinctsDir;\n }\n\n async writeInstinct(instinct: Instinct): Promise<string> {\n const filePath = join(this.instinctsDir, `${instinct.id}.json`);\n await writeFile(filePath, JSON.stringify(instinct, null, 2));\n\n // Update index in state\n const state = await this.read();\n if (!state.evolution.instinctIndex) {\n state.evolution.instinctIndex = {};\n }\n state.evolution.instinctIndex[instinct.id] = {\n domain: instinct.domain,\n status: instinct.status,\n confidence: instinct.confidence,\n createdAt: instinct.createdAt,\n };\n await this.save(state);\n\n return filePath;\n }\n\n async listInstincts(): Promise<Instinct[]> {\n const files = await readdir(this.instinctsDir).catch(() => []);\n const instincts: Instinct[] = [];\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n try {\n const content = await readFile(join(this.instinctsDir, file), \"utf-8\");\n instincts.push(JSON.parse(content));\n } catch {\n // Skip invalid files\n }\n }\n\n return instincts;\n }\n\n async hasInstinct(id: string): Promise<boolean> {\n const state = await this.read();\n return !!state.evolution.instinctIndex?.[id];\n }\n\n async initializeIdentity(): Promise<void> {\n const state = await this.read();\n if (!state.project.identity) {\n state.project.identity = {\n awakened: new Date().toISOString(),\n personality: this.pickPersonality(),\n totalInstinctsLearned: 0,\n totalEvolutions: 0,\n favoriteDomainsRank: [],\n };\n await this.save(state);\n }\n }\n\n private pickPersonality(): string {\n const personalities = [\"curious\", \"efficient\", \"playful\", \"vigilant\", \"methodical\"];\n return personalities[Math.floor(Math.random() * personalities.length)];\n }\n\n async exportInstincts(): Promise<{\n instincts: Instinct[];\n metadata: { exportedAt: string; projectName: string; count: number };\n }> {\n const instincts = await this.listInstincts();\n const personalInstincts = instincts.filter((i) => i.source === \"personal\" || !i.source);\n\n return {\n instincts: personalInstincts,\n metadata: {\n exportedAt: new Date().toISOString(),\n projectName: this.projectName,\n count: personalInstincts.length,\n },\n };\n }\n\n async importInstincts(instincts: Instinct[], fromProject: string): Promise<number> {\n let imported = 0;\n\n for (const instinct of instincts) {\n if (await this.hasInstinct(instinct.id)) {\n continue;\n }\n\n const inheritedInstinct: Instinct = {\n ...instinct,\n id: `inherited-${instinct.id}`,\n source: \"inherited\",\n createdAt: new Date().toISOString(),\n evidence: {\n ...instinct.evidence,\n examples: [`Imported from ${fromProject}`],\n },\n };\n\n await this.writeInstinct(inheritedInstinct);\n imported++;\n }\n\n return imported;\n }\n\n async recordToolSequence(tools: string[]): Promise<void> {\n if (tools.length < 2) return;\n\n const state = await this.read();\n if (!state.statistics.toolSequences) {\n state.statistics.toolSequences = [];\n }\n\n const sequenceKey = tools.slice(-3).join(\" โ†’ \");\n const existing = state.statistics.toolSequences.find(\n (s) => s.tools.join(\" โ†’ \") === sequenceKey,\n );\n\n if (existing) {\n existing.count++;\n existing.lastSeen = Date.now();\n } else {\n state.statistics.toolSequences.push({\n tools: tools.slice(-3),\n count: 1,\n lastSeen: Date.now(),\n });\n }\n\n state.statistics.toolSequences.sort((a, b) => b.count - a.count);\n state.statistics.toolSequences = state.statistics.toolSequences.slice(0, 20);\n\n await this.save(state);\n }\n\n async updateIdentityStats(): Promise<void> {\n const state = await this.read();\n if (!state.project.identity) return;\n\n const instincts = await this.listInstincts();\n state.project.identity.totalInstinctsLearned = instincts.filter(\n (i) => i.source !== \"inherited\",\n ).length;\n state.project.identity.totalEvolutions = state.evolution.capabilities.length;\n\n const domainCounts = new Map<string, number>();\n for (const instinct of instincts) {\n domainCounts.set(instinct.domain, (domainCounts.get(instinct.domain) || 0) + 1);\n }\n\n state.project.identity.favoriteDomainsRank = Array.from(domainCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3)\n .map(([domain]) => domain) as Domain[];\n\n await this.save(state);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport type Language = \"en-US\" | \"ko-KR\";\n\nexport interface MimicUserConfig {\n language?: string;\n observer?: {\n /** Model ID for LLM-based pattern analysis (e.g., \"opencode/glm-4.7-free\") */\n model?: string;\n /** Provider ID (e.g., \"opencode\") */\n provider?: string;\n /** Whether to use LLM-based analysis (default: true if model is set) */\n enabled?: boolean;\n };\n}\n\nconst DEFAULT_LANGUAGE: Language = \"en-US\";\n\nconst MESSAGES: Record<Language, Record<string, string>> = {\n \"en-US\": {\n \"log.session_started\": \"[Mimic] Session started. Sessions: {sessions}, Patterns: {patterns}\",\n \"log.session_ended\":\n \"[Mimic] Session ended. Duration: {duration}, Tools: {tools}, Files: {files}\",\n \"obs.returned_after_long_break\": \"Returned after a long break\",\n \"obs.intensive_session\": \"Intensive session with {tools} tool calls\",\n \"milestone.major_refactor\": \"Major refactoring session: {files} files edited\",\n \"milestone.evolved\": \"Evolved: {name} ({type})\",\n \"obs.focus_changed\": \"Focus changed to: {focus}\",\n \"milestone.mcp_added\": \"Added MCP: {name}\",\n\n \"init.first_time\":\n \"# ๐Ÿ“ฆ *creak...*\\n\\nA treasure chest? In {project}?\\n\\n*The lid opens slowly, revealing rows of gleaming teeth...*\\n\\nI'm **Mimic**. I look like a chest, but I'm always watching. Always learning.\\n\\n**What I devour... I mean, do:**\\n- ๐Ÿ‘๏ธ Watch your patterns (tools, files, commits)\\n- ๐Ÿง  Remember everything across sessions\\n- ๐Ÿ“œ Track your project's journey\\n- โœจ Suggest shortcuts when I spot repetition\\n\\nUse `mimic:status` to check in, `mimic:journey` to see your story.\\n\\n*...the teeth retract. For now.*\",\n \"init.returning.header\": \"# ๐Ÿ“ฆ *creak...*\",\n \"init.returning.welcome\": \"*The chest's eye opens* Ah, you're back to **{project}**.\",\n \"init.returning.stats\": \"**Sessions**: {sessions} | **Patterns digested**: {patterns}\",\n \"init.returning.long_break\":\n \"*dust falls from the lid* It's been a while... but I remember everything:\",\n \"init.returning.recent_obs_title\": \"**What I've been chewing on:**\",\n\n \"status.title\": \"## {project} Status\",\n \"status.session\": \"**Session**: {count}\",\n \"status.patterns\": \"**Patterns**: {total} detected, {surfaced} surfaced\",\n \"status.tool_calls\": \"**Tool calls this session**: {count}\",\n \"status.recent_files\": \"**Recently modified files:**\",\n \"status.recent_commits\": \"**Recent commits:**\",\n \"status.suggestions\": \"**Suggestions:**\",\n\n \"patterns.none\": \"No patterns detected yet. Keep working, and I'll learn your patterns.\",\n \"patterns.title\": \"## Detected Patterns\",\n \"patterns.total\": \"Total: {count}\",\n \"patterns.section\": \"### {type} Patterns\",\n \"patterns.type.tool\": \"Tool\",\n \"patterns.type.file\": \"File\",\n \"patterns.type.commit\": \"Commit\",\n \"patterns.type.sequence\": \"Sequence\",\n\n \"observe.recorded\": 'Observation recorded: \"{observation}\"',\n \"milestone.recorded\": 'Milestone recorded: \"{milestone}\"',\n\n \"stats.title\": \"Mimic Statistics\",\n \"stats.version\": \"Version\",\n \"stats.total_sessions\": \"Total Sessions\",\n \"stats.total_tool_calls\": \"Total Tool Calls\",\n \"stats.patterns_detected\": \"Patterns Detected\",\n \"stats.milestones\": \"Milestones\",\n \"stats.observations\": \"Observations\",\n \"stats.session_records\": \"Session Records\",\n \"stats.first_session\": \"First Session\",\n \"stats.learning_enabled\": \"Learning Enabled\",\n \"stats.suggestions_enabled\": \"Suggestions Enabled\",\n\n \"configure.updated\": \"Preferences updated:\",\n\n \"surface.not_found\": \"Pattern not found: {id}\",\n \"surface.marked\": 'Pattern \"{description}\" marked as surfaced.',\n\n \"reset.cancelled\": \"Reset cancelled. Set confirm=true to reset all data.\",\n \"reset.done\": \"Mimic reset complete. All patterns, observations, and statistics cleared.\",\n\n \"evolve.no_pattern\": \"๐Ÿ“ฆ *confused clicking* No such pattern in my belly: {id}\",\n \"evolve.absorbed_header\": \"๐Ÿ“ฆ *CRUNCH* I've absorbed a new power and spit out a file!\",\n \"evolve.empty\": \"๐Ÿ“ฆ *yawns* Nothing ripe for evolution yet. Feed me more patterns...\",\n \"evolve.menu_title\": \"## ๐Ÿ“ฆ Evolution Menu\",\n \"evolve.menu_intro\":\n \"*The mimic's teeth rearrange into a grin* I can digest these patterns into powers:\",\n \"evolve.menu_type\": \"Type\",\n \"evolve.menu_reason\": \"Reason\",\n \"evolve.menu_pattern_id\": \"Pattern ID\",\n \"evolve.menu_footer\": '*Feed me a pattern ID:* `mimic:evolve({ accept: \"pattern-id\" })`',\n\n \"evolution.type.command\": \"command\",\n \"evolution.type.shortcut\": \"shortcut\",\n \"evolution.type.hook\": \"hook\",\n \"evolution.type.skill\": \"skill\",\n \"evolution.type.agent\": \"agent\",\n \"evolution.type.mcp\": \"mcp\",\n\n \"evolution.result.type\": \"Type\",\n \"evolution.result.description\": \"Description\",\n \"evolution.result.file\": \"File created\",\n \"evolution.result.restart\": \"Restart OpenCode to load the new {type}.\",\n \"evolution.result.command\":\n \"The tool `{name}` will be available after restart.\\nEdit the file to customize its behavior.\",\n \"evolution.result.hook\":\n \"The hook will automatically watch for file changes after restart.\\nEdit the file to customize the trigger conditions.\",\n \"evolution.result.skill\":\n \"The skill will activate on session start after restart.\\nEdit the file to customize when and how it triggers.\",\n \"evolution.result.agent\":\n \"The agent `@{name}` will be available after restart.\\nYou can invoke it with `@{name}` or let other agents delegate to it.\\nEdit the markdown file to customize its prompt, tools, and permissions.\",\n \"evolution.result.mcp\":\n \"MCP server `{name}` has been added to `opencode.json`.\\nIt's currently disabled. Edit the config to enable it and configure the command.\\nSee https://opencode.ai/docs/mcp-servers/ for MCP configuration options.\",\n\n \"evolution.suggest.tool.description\": \"Shortcut for frequent {pattern} usage\",\n \"evolution.suggest.tool.reason\": \"Used {count} times\",\n \"evolution.suggest.file.description\": \"Auto-track changes to {pattern}\",\n \"evolution.suggest.file.reason\": \"Modified {count} times\",\n \"evolution.suggest.commit.description\": 'Quick commit: \"{pattern}\"',\n \"evolution.suggest.commit.reason\": \"Committed {count} times with same message\",\n \"evolution.suggest.sequence.agent.description\": \"Specialist agent for: {pattern}\",\n \"evolution.suggest.sequence.agent.reason\":\n \"Complex sequence repeated {count} times - needs dedicated agent\",\n \"evolution.suggest.sequence.skill.description\": \"Automate: {pattern}\",\n \"evolution.suggest.sequence.skill.reason\": \"Repeated sequence {count} times\",\n\n \"evolution.domain.description\":\n \"Specialist agent for the {domain} domain based on observed instincts\",\n \"evolution.domain.reason\": 'Detected {count} approved instincts in domain \"{domain}\"',\n\n \"observer.new_instincts\": \"Learned {count} new instinct(s) from your patterns\",\n \"observer.evolved\": \"โœจ Auto-evolved {name} for {domain} domain!\",\n\n \"level.set\": 'Level set to \"{level}\". Responses will be {style} style with {detail} detail.',\n \"level.label.technical\": \"technical\",\n \"level.label.semi-technical\": \"semi-technical\",\n \"level.label.non-technical\": \"non-technical\",\n \"level.label.chaotic\": \"chaotic\",\n \"level.style.minimal\": \"minimal\",\n \"level.style.casual\": \"casual\",\n \"level.style.formal\": \"formal\",\n \"level.style.chaotic\": \"chaotic\",\n \"level.detail.high\": \"high\",\n \"level.detail.medium\": \"medium\",\n \"level.detail.low\": \"low\",\n \"level.greeting.minimal\": \"๐Ÿ“ฆ {project} | s{sessions} | p{patterns}\",\n \"level.greeting.casual\":\n \"๐Ÿ“ฆ *creak* Back to {project}. I've been watching... Session {sessions}.\",\n \"level.greeting.formal\": \"๐Ÿ“ฆ The chest opens... Welcome back to {project}. Session {sessions}.\",\n \"level.greeting.chaotic.template\": \"๐Ÿ“ฆ {tag} {project}! #{sessions}\",\n \"level.greeting.chaotic.chomp\": \"*CHOMP*\",\n \"level.greeting.chaotic.lid_creaks\": \"*lid creaks*\",\n \"level.greeting.chaotic.teeth_gleam\": \"*teeth gleam*\",\n \"level.greeting.chaotic.tongue_flicks\": \"*tongue flicks*\",\n \"level.term.tool\": \"tool\",\n \"level.term.pattern\": \"pattern\",\n \"level.term.hook\": \"hook\",\n \"level.term.shortcut\": \"shortcut\",\n \"level.term.habit\": \"habit\",\n \"level.term.automation\": \"automation\",\n\n \"focus.updated\": \"Project updated:\",\n \"focus.focus_label\": \"Focus\",\n \"focus.stack_label\": \"Stack\",\n\n \"mcp_search.header\": '๐Ÿ“ฆ *sniffs the air* Search for \"{query}\" MCP servers:\\n\\n๐Ÿ”— {url}',\n \"mcp_search.popular\": \"**Popular MCP servers:**\",\n \"mcp_search.add\":\n 'Use `mimic:mcp` to add one: `mimic:mcp({ name: \"context7\", url: \"https://mcp.context7.com/mcp\" })`',\n \"mcp_search.desc.context7\": \"Up-to-date docs\",\n \"mcp_search.desc.github\": \"GitHub API\",\n \"mcp_search.desc.supabase\": \"Database\",\n \"mcp_search.desc.playwright\": \"Browser automation\",\n \"mcp_search.desc.firecrawl\": \"Web scraping\",\n\n \"mcp.need_url_or_command\": \"๐Ÿ“ฆ *confused* Need either url or command!\",\n \"mcp.added\":\n '๐Ÿ“ฆ *tongue flicks* MCP server \"{name}\" added to opencode.json!\\n\\nRestart OpenCode to load the new MCP server.',\n\n \"capabilities.empty\":\n \"๐Ÿ“ฆ *empty rattling* No powers absorbed yet. Use `mimic:evolve` to consume some patterns!\",\n \"capabilities.title\": \"## ๐Ÿ“ฆ Absorbed Powers\",\n \"capabilities.intro\": \"*The mimic proudly displays its collection...*\",\n \"capabilities.type\": \"Type\",\n \"capabilities.description\": \"Description\",\n \"capabilities.consumed\": \"Consumed\",\n\n \"grow.title\": \"## ๐Ÿ“ฆ {project} - Territory Analysis\",\n \"grow.subtitle\": \"*The mimic surveys the dungeon, noting paths most traveled...*\",\n \"grow.feeding_grounds\": \"### ๐Ÿ”ฅ Feeding Grounds (Most Modified)\",\n \"grow.favorite_prey\": \"### ๐Ÿฆท Favorite Prey (Tool Patterns)\",\n \"grow.hunting_grounds\": \"### ๐Ÿ—บ๏ธ Hunting Grounds\",\n \"grow.questions\": \"### ๐Ÿค” The Chest Wonders...\",\n \"grow.question1\": \"- What treasure shall we hunt next?\",\n \"grow.question2\": \"- Are there forgotten corners of the dungeon?\",\n \"grow.question3\": \"- Does the current path lead to glory?\",\n \"grow.current_hunt\": \"**Current hunt**: {focus}\",\n \"grow.files_modified\": \"({count}x)\",\n \"grow.prey\": \"({count} prey)\",\n\n \"journey.title\": \"## ๐Ÿ“ฆ {project}'s Journey\",\n \"journey.subtitle\": \"*The mimic opens its lid, revealing ancient scrolls within...*\",\n \"journey.sessions_survived\": \"**Sessions survived**: {count}\",\n \"journey.first_encounter\": \"**First encounter**: {date}\",\n \"journey.abilities_gained\": \"**Abilities gained**: {count}\",\n \"journey.treasures\": \"**Treasures inside**: {stack}\",\n \"journey.current_hunt\": \"**Current hunt**: {focus}\",\n \"journey.victories\": \"### ๐Ÿ† Victories\",\n \"journey.witnessed\": \"### ๐Ÿ‘๏ธ What I've Witnessed\",\n \"journey.powers\": \"### โœจ Powers Absorbed\",\n \"journey.scrolls\": \"### ๐Ÿ“œ Recent Scrolls\",\n\n \"suggest.commit\":\n '๐Ÿ“ฆ *munch munch* I\\'ve digested \"{pattern}\" {count}+ times. Want me to spit out a shortcut?',\n \"suggest.file\":\n '๐Ÿ“ฆ *peers at file* You keep poking \"{pattern}\" ({count}x). Should I keep an eye on it?',\n \"suggest.tool\":\n '๐Ÿ“ฆ *teeth click* \"{pattern}\" is tasty... you use it often. Custom tool, perhaps?',\n \"suggest.sequence\":\n \"๐Ÿ“ฆ *lid rattles* I sense a pattern in your movements ({pattern})... Let me automate this for you?\",\n \"tool.init.description\": \"Initialize or wake up Mimic for this project\",\n \"tool.status.description\": \"Check current status and recent activity\",\n \"tool.journey.description\": \"View the narrative story of your project's evolution\",\n \"tool.patterns.description\": \"Show all detected patterns\",\n \"tool.observe.description\": \"Manually add an observation to the journey\",\n \"tool.observe.args.observation\": \"The observation to record\",\n \"tool.milestone.description\": \"Record a project milestone\",\n \"tool.milestone.args.milestone\": \"The milestone to record\",\n \"tool.stats.description\": \"Show detailed Mimic statistics\",\n \"tool.configure.description\": \"Configure Mimic preferences\",\n \"tool.configure.args.learningEnabled\": \"Enable/disable pattern learning\",\n \"tool.configure.args.suggestionEnabled\": \"Enable/disable suggestions\",\n \"tool.configure.args.minPatternCount\": \"Minimum occurrences before suggesting\",\n \"tool.surface.description\": \"Mark a pattern as surfaced (acknowledged)\",\n \"tool.surface.args.patternId\": \"The pattern ID to mark as surfaced\",\n \"tool.reset.description\": \"Reset all learned patterns and statistics\",\n \"tool.reset.args.confirm\": \"Must be true to confirm reset\",\n \"tool.grow.description\": \"Analyze project direction and growth opportunities\",\n \"tool.evolve.description\": \"Suggest and create new capabilities based on detected patterns\",\n \"tool.evolve.args.accept\": \"Pattern ID to evolve into a capability\",\n \"tool.level.description\": \"Set your technical level for personalized responses\",\n \"tool.level.args.level\": \"Your technical level\",\n \"tool.focus.description\": \"Set current project focus or priorities\",\n \"tool.focus.args.focus\": \"Current focus area\",\n \"tool.focus.args.stack\": \"Comma-separated tech stack\",\n \"tool.mcp_search.description\": \"Search for MCP servers from mcpmarket.com\",\n \"tool.mcp_search.args.query\": \"Search query for MCP servers\",\n \"tool.mcp.description\": \"Add an MCP server configuration to opencode.json\",\n \"tool.mcp.args.name\": \"Name for the MCP server\",\n \"tool.mcp.args.url\": \"Remote MCP server URL\",\n \"tool.mcp.args.command\": \"Local MCP command (comma-separated)\",\n \"tool.capabilities.description\": \"List all evolved capabilities\",\n\n \"tool.instincts.description\": \"List all learned instincts\",\n \"tool.instincts.args.domain\": \"Filter by domain (optional)\",\n \"instincts.empty\": \"๐Ÿ“ฆ *yawns* No instincts learned yet. Keep working, I'm watching...\",\n \"instincts.title\": \"## ๐Ÿ“ฆ Learned Instincts\",\n \"instincts.total\": \"Total: {count} instincts\",\n \"instincts.auto_applied\": \"Learned behaviors loaded and auto-applied for this session\",\n\n \"tool.export.description\": \"Export your instincts to share with other projects\",\n \"export.empty\": \"๐Ÿ“ฆ *rattles* Nothing to export yet. Learn some instincts first!\",\n \"export.success\": \"๐Ÿ“ฆ *proud clicking* Exported {count} instincts to:\\n`{path}`\",\n\n \"tool.import.description\": \"Import instincts from another project\",\n \"tool.import.args.path\": \"Path to the exported instincts JSON file\",\n \"import.not_found\": \"๐Ÿ“ฆ *confused* File not found: {path}\",\n \"import.success\": \"๐Ÿ“ฆ *absorbs knowledge* Imported {count} instincts from {from}!\",\n \"import.error\": \"๐Ÿ“ฆ *spits out* Failed to parse instincts file. Invalid format.\",\n\n \"tool.apply.description\": \"Show instincts relevant to your current work\",\n \"apply.none\": \"๐Ÿ“ฆ *peers around* No relevant instincts for current context.\",\n \"apply.title\": \"## ๐Ÿ“ฆ Applicable Instincts\",\n\n \"tool.identity.description\": \"View Mimic's identity and personality\",\n \"identity.title\": \"## ๐Ÿ“ฆ Who Am I?\",\n \"identity.personality\": \"Personality\",\n \"identity.awakened\": \"Awakened\",\n \"identity.days\": \"days ago\",\n \"identity.instincts_learned\": \"Instincts learned\",\n \"identity.evolutions\": \"Evolutions\",\n \"identity.favorite_domains\": \"Favorite domains\",\n \"identity.error\": \"๐Ÿ“ฆ *confused* Could not initialize identity. Please try again.\",\n\n \"tool.sequences.description\": \"Show detected tool usage sequences\",\n \"sequences.empty\": \"๐Ÿ“ฆ *listens* No sequences detected yet. Keep using tools...\",\n \"sequences.title\": \"## ๐Ÿ“ฆ Tool Sequences\",\n\n \"observer.skill_generated\": \"Generated skill: {name}\",\n \"skill.domain_description\": \"Specialist skill for the {domain} domain\",\n\n \"tool.observations.description\": \"View observation logs for this session\",\n \"tool.observations.args.limit\": \"Maximum number of observations to show\",\n \"tool.observations.args.types\": \"Comma-separated list of observation types to filter\",\n \"observations.title\": \"## ๐Ÿ“ฆ Observation Log\",\n \"observations.empty\": \"๐Ÿ“ฆ *empty* No observations recorded yet.\",\n \"observations.stats\": \"**Total**: {count} observations, **Size**: {size}\",\n\n \"tool.session_context.description\": \"Get context from previous sessions\",\n \"session_context.title\": \"## ๐Ÿ“ฆ Session Context\",\n \"session_context.empty\": \"๐Ÿ“ฆ *yawns* No previous sessions to analyze.\",\n \"session_context.patterns_title\": \"**Cross-session patterns:**\",\n\n \"tool.generate_skills.description\": \"Generate declarative skills from learned instincts\",\n \"generate_skills.title\": \"## ๐Ÿ“ฆ Skill Generation\",\n \"generate_skills.empty\":\n \"๐Ÿ“ฆ *shrugs* Not enough instincts to generate skills yet. Need 5+ per domain.\",\n \"generate_skills.success\": \"Generated {count} skill(s):\",\n },\n \"ko-KR\": {\n \"log.session_started\": \"[Mimic] ์„ธ์…˜ ์‹œ์ž‘. ์„ธ์…˜ {sessions}ํšŒ, ํŒจํ„ด {patterns}๊ฐœ\",\n \"log.session_ended\": \"[Mimic] ์„ธ์…˜ ์ข…๋ฃŒ. ์†Œ์š”: {duration}, ๋„๊ตฌ {tools}ํšŒ, ํŒŒ์ผ {files}๊ฐœ\",\n \"obs.returned_after_long_break\": \"์˜ค๋žœ ๊ณต๋ฐฑ ํ›„ ๋ณต๊ท€\",\n \"obs.intensive_session\": \"๋„๊ตฌ ํ˜ธ์ถœ {tools}ํšŒ โ€” ์ง‘์ค‘ ์„ธ์…˜\",\n \"milestone.major_refactor\": \"๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ„ฐ๋ง ์„ธ์…˜: ํŒŒ์ผ {files}๊ฐœ ์ˆ˜์ •\",\n \"milestone.evolved\": \"์ง„ํ™”: {name} ({type})\",\n \"obs.focus_changed\": \"ํฌ์ปค์Šค ๋ณ€๊ฒฝ: {focus}\",\n \"milestone.mcp_added\": \"MCP ์ถ”๊ฐ€: {name}\",\n \"init.first_time\":\n \"# ๐Ÿ“ฆ *๋ผ์ต...*\\n\\n{project}์— ๋ณด๋ฌผ์ƒ์ž๋ผ๋‹ˆ?\\n\\n*๋šœ๊ป‘์ด ์ฒœ์ฒœํžˆ ์—ด๋ฆฌ๋ฉฐ ๋ฐ˜์ง์ด๋Š” ์ด๋นจ์ด ๋ณด์ธ๋‹ค...*\\n\\n๋‚˜๋Š” **Mimic**. ์ƒ์ž์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋Š˜ ์ง€์ผœ๋ณด๊ณ , ๋Š˜ ๋ฐฐ์šฐ์ง€.\\n\\n**๋‚ด๊ฐ€ ๋จน๋Š”... ์•„๋‹ˆ, ํ•˜๋Š” ์ผ:**\\n- ๐Ÿ‘๏ธ ํŒจํ„ด ๊ด€์ฐฐ (ํˆด, ํŒŒ์ผ, ์ปค๋ฐ‹)\\n- ๐Ÿง  ์„ธ์…˜ ๊ฐ„ ๊ธฐ์–ต\\n- ๐Ÿ“œ ํ”„๋กœ์ ํŠธ ์—ฌ์ • ๊ธฐ๋ก\\n- โœจ ๋ฐ˜๋ณต์„ ๋ณด๋ฉด ์ง€๋ฆ„๊ธธ ์ œ์•ˆ\\n\\n`mimic:status`๋กœ ์ƒํƒœ ํ™•์ธ, `mimic:journey`๋กœ ์ด์•ผ๊ธฐ ๋ณด๊ธฐ.\\n\\n*...์ด๋Š” ์ž ๊น ์ˆจ๊ฒจ๋‘”๋‹ค.*\",\n \"init.returning.header\": \"# ๐Ÿ“ฆ *๋ผ์ต...*\",\n \"init.returning.welcome\": \"*์ƒ์ž์˜ ๋ˆˆ์ด ๋œฌ๋‹ค* **{project}**๋กœ ๋Œ์•„์™”๋„ค.\",\n \"init.returning.stats\": \"**์„ธ์…˜**: {sessions} | **์†Œํ™”ํ•œ ํŒจํ„ด**: {patterns}\",\n \"init.returning.long_break\": \"*๋šœ๊ป‘์— ๋จผ์ง€๊ฐ€ ๋‚ด๋ ค์•‰๋Š”๋‹ค* ์˜ค๋žœ๋งŒ์ด์•ผ... ๊ทธ๋ž˜๋„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด:\",\n \"init.returning.recent_obs_title\": \"**๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ๋“ค:**\",\n \"status.title\": \"## {project} ์ƒํƒœ\",\n \"status.session\": \"**์„ธ์…˜**: {count}\",\n \"status.patterns\": \"**ํŒจํ„ด**: {total}๊ฐœ ๊ฐ์ง€, {surfaced}๊ฐœ ํ™•์ธ\",\n \"status.tool_calls\": \"**์ด๋ฒˆ ์„ธ์…˜ ๋„๊ตฌ ํ˜ธ์ถœ**: {count}\",\n \"status.recent_files\": \"**์ตœ๊ทผ ์ˆ˜์ • ํŒŒ์ผ:**\",\n \"status.recent_commits\": \"**์ตœ๊ทผ ์ปค๋ฐ‹:**\",\n \"status.suggestions\": \"**์ œ์•ˆ:**\",\n \"patterns.none\": \"์•„์ง ๊ฐ์ง€๋œ ํŒจํ„ด์ด ์—†์–ด์š”. ๊ณ„์† ์ž‘์—…ํ•˜๋ฉด ๋ฐฐ์›Œ๋‘˜๊ฒŒ์š”.\",\n \"patterns.title\": \"## ๊ฐ์ง€๋œ ํŒจํ„ด\",\n \"patterns.total\": \"์ด {count}๊ฐœ\",\n \"patterns.section\": \"### {type} ํŒจํ„ด\",\n \"patterns.type.tool\": \"๋„๊ตฌ\",\n \"patterns.type.file\": \"ํŒŒ์ผ\",\n \"patterns.type.commit\": \"์ปค๋ฐ‹\",\n \"patterns.type.sequence\": \"์‹œํ€€์Šค\",\n \"observe.recorded\": '๊ด€์ฐฐ ๊ธฐ๋ก: \"{observation}\"',\n \"milestone.recorded\": '๋งˆ์ผ์Šคํ†ค ๊ธฐ๋ก: \"{milestone}\"',\n \"stats.title\": \"Mimic ํ†ต๊ณ„\",\n \"stats.version\": \"๋ฒ„์ „\",\n \"stats.total_sessions\": \"์ด ์„ธ์…˜\",\n \"stats.total_tool_calls\": \"์ด ๋„๊ตฌ ํ˜ธ์ถœ\",\n \"stats.patterns_detected\": \"๊ฐ์ง€๋œ ํŒจํ„ด\",\n \"stats.milestones\": \"๋งˆ์ผ์Šคํ†ค\",\n \"stats.observations\": \"๊ด€์ฐฐ\",\n \"stats.session_records\": \"์„ธ์…˜ ๊ธฐ๋ก\",\n \"stats.first_session\": \"์ฒซ ์„ธ์…˜\",\n \"stats.learning_enabled\": \"ํ•™์Šต ํ™œ์„ฑํ™”\",\n \"stats.suggestions_enabled\": \"์ œ์•ˆ ํ™œ์„ฑํ™”\",\n \"configure.updated\": \"์„ค์ • ์—…๋ฐ์ดํŠธ:\",\n \"surface.not_found\": \"ํŒจํ„ด์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ: {id}\",\n \"surface.marked\": 'ํŒจํ„ด \"{description}\"์„(๋ฅผ) ํ™•์ธ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.',\n \"reset.cancelled\": \"๋ฆฌ์…‹ ์ทจ์†Œ๋จ. ์ „์ฒด ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด confirm=true๋กœ ์„ค์ •ํ•˜์„ธ์š”.\",\n \"reset.done\": \"Mimic ๋ฆฌ์…‹ ์™„๋ฃŒ. ํŒจํ„ด/๊ด€์ฐฐ/ํ†ต๊ณ„๋ฅผ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.\",\n \"evolve.no_pattern\": \"๐Ÿ“ฆ *๊ฐธ์šฐ๋šฑ* ๋‚ด ์†์— ๊ทธ๋Ÿฐ ํŒจํ„ด์€ ์—†์–ด: {id}\",\n \"evolve.absorbed_header\": \"๐Ÿ“ฆ *์™€์ž‘* ์ƒˆ ํž˜์„ ํก์ˆ˜ํ•˜๊ณ  ํŒŒ์ผ์„ ๋ฑ‰์–ด๋ƒˆ๋‹ค!\",\n \"evolve.empty\": \"๐Ÿ“ฆ *ํ•˜ํ’ˆ* ์•„์ง ์ง„ํ™”ํ•  ํŒจํ„ด์ด ์—†์–ด. ๋” ๋จน์—ฌ์ค˜...\",\n \"evolve.menu_title\": \"## ๐Ÿ“ฆ ์ง„ํ™” ๋ฉ”๋‰ด\",\n \"evolve.menu_intro\": \"*์ด๋นจ์ด ๋ฏธ์†Œ ๋ชจ์–‘์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค* ์ด ํŒจํ„ด๋“ค์„ ํž˜์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด:\",\n \"evolve.menu_type\": \"์œ ํ˜•\",\n \"evolve.menu_reason\": \"์ด์œ \",\n \"evolve.menu_pattern_id\": \"ํŒจํ„ด ID\",\n \"evolve.menu_footer\": '*ํŒจํ„ด ID๋ฅผ ๋จน์—ฌ์ค˜:* `mimic:evolve({ accept: \"pattern-id\" })`',\n \"evolution.type.command\": \"๋ช…๋ น\",\n \"evolution.type.shortcut\": \"๋‹จ์ถ•ํ‚ค\",\n \"evolution.type.hook\": \"ํ›…\",\n \"evolution.type.skill\": \"์Šคํ‚ฌ\",\n \"evolution.type.agent\": \"์—์ด์ „ํŠธ\",\n \"evolution.type.mcp\": \"MCP\",\n \"evolution.result.type\": \"์œ ํ˜•\",\n \"evolution.result.description\": \"์„ค๋ช…\",\n \"evolution.result.file\": \"์ƒ์„ฑ๋œ ํŒŒ์ผ\",\n \"evolution.result.restart\": \"์ƒˆ {type}๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด OpenCode๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์„ธ์š”.\",\n \"evolution.result.command\":\n \"`{name}` ๋„๊ตฌ๋Š” ์žฌ์‹œ์ž‘ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.\\nํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด ์›ํ•˜๋Š” ๋™์ž‘์œผ๋กœ ๋ฐ”๊ฟ”๋ณด์„ธ์š”.\",\n \"evolution.result.hook\":\n \"ํ›…์ด ์žฌ์‹œ์ž‘ ํ›„ ์ž๋™์œผ๋กœ ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.\\nํŠธ๋ฆฌ๊ฑฐ ์กฐ๊ฑด์„ ์ˆ˜์ •ํ•ด ์กฐ์ •ํ•˜์„ธ์š”.\",\n \"evolution.result.skill\":\n \"์Šคํ‚ฌ์€ ์žฌ์‹œ์ž‘ ํ›„ ์„ธ์…˜ ์‹œ์ž‘ ์‹œ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.\\n์–ธ์ œ/์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€ ์ˆ˜์ •ํ•˜์„ธ์š”.\",\n \"evolution.result.agent\":\n \"`@{name}` ์—์ด์ „ํŠธ๋Š” ์žฌ์‹œ์ž‘ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.\\n`@{name}`์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ๊ฐ€ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\\n๋งˆํฌ๋‹ค์šด ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด ํ”„๋กฌํ”„ํŠธ/๋„๊ตฌ/๊ถŒํ•œ์„ ์กฐ์ •ํ•˜์„ธ์š”.\",\n \"evolution.result.mcp\":\n \"MCP ์„œ๋ฒ„ `{name}`๊ฐ€ `opencode.json`์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\\nํ˜„์žฌ ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์„ค์ •์„ ์ˆ˜์ •ํ•ด ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋ช…๋ น์„ ๊ตฌ์„ฑํ•˜์„ธ์š”.\\nMCP ์˜ต์…˜์€ https://opencode.ai/docs/mcp-servers/ ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.\",\n \"evolution.suggest.tool.description\": \"์ž์ฃผ ์“ฐ๋Š” {pattern}์˜ ๋‹จ์ถ•ํ‚ค\",\n \"evolution.suggest.tool.reason\": \"{count}ํšŒ ์‚ฌ์šฉ\",\n \"evolution.suggest.file.description\": \"{pattern} ๋ณ€๊ฒฝ ์ž๋™ ์ถ”์ \",\n \"evolution.suggest.file.reason\": \"{count}ํšŒ ์ˆ˜์ •\",\n \"evolution.suggest.commit.description\": '๋น ๋ฅธ ์ปค๋ฐ‹: \"{pattern}\"',\n \"evolution.suggest.commit.reason\": \"๊ฐ™์€ ๋ฉ”์‹œ์ง€๋กœ {count}ํšŒ ์ปค๋ฐ‹\",\n \"evolution.suggest.sequence.agent.description\": \"์ „๋‹ด ์—์ด์ „ํŠธ: {pattern}\",\n \"evolution.suggest.sequence.agent.reason\": \"๋ณต์žกํ•œ ์‹œํ€€์Šค {count}ํšŒ ๋ฐ˜๋ณต โ€” ์ „๋‹ด ์—์ด์ „ํŠธ ํ•„์š”\",\n \"evolution.suggest.sequence.skill.description\": \"์ž๋™ํ™”: {pattern}\",\n \"evolution.suggest.sequence.skill.reason\": \"์‹œํ€€์Šค {count}ํšŒ ๋ฐ˜๋ณต\",\n\n \"evolution.domain.description\": \"๊ด€์ฐฐ๋œ ๋ณธ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ {domain} ๋„๋ฉ”์ธ ์ „๋ฌธ ์—์ด์ „ํŠธ\",\n \"evolution.domain.reason\": '\"{domain}\" ๋„๋ฉ”์ธ์—์„œ ์Šน์ธ๋œ ๋ณธ๋Šฅ {count}๊ฐœ ๊ฐ์ง€',\n\n \"observer.new_instincts\": \"ํŒจํ„ด์—์„œ {count}๊ฐœ์˜ ์ƒˆ๋กœ์šด ๋ณธ๋Šฅ์„ ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค\",\n \"observer.evolved\": \"โœจ {domain} ๋„๋ฉ”์ธ์„ ์œ„ํ•ด {name}์„(๋ฅผ) ์ž๋™ ์ง„ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค!\",\n\n \"level.set\":\n '๋ ˆ๋ฒจ์„ \"{level}\"๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์€ {style} ํ†ค, {detail} ์ƒ์„ธ๋„๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.',\n \"level.label.technical\": \"๊ธฐ์ˆ ์ \",\n \"level.label.semi-technical\": \"์ค€๊ธฐ์ˆ \",\n \"level.label.non-technical\": \"๋น„๊ธฐ์ˆ \",\n \"level.label.chaotic\": \"ํ˜ผ๋ˆ\",\n \"level.style.minimal\": \"๊ฐ„๊ฒฐํ•œ\",\n \"level.style.casual\": \"์บ์ฃผ์–ผ\",\n \"level.style.formal\": \"์ •์ค‘ํ•œ\",\n \"level.style.chaotic\": \"ํ˜ผ๋ˆ\",\n \"level.detail.high\": \"๋†’์Œ\",\n \"level.detail.medium\": \"์ค‘๊ฐ„\",\n \"level.detail.low\": \"๋‚ฎ์Œ\",\n \"level.greeting.minimal\": \"๐Ÿ“ฆ {project} | s{sessions} | p{patterns}\",\n \"level.greeting.casual\":\n \"๐Ÿ“ฆ *๋ผ์ต* {project}๋กœ ๋Œ์•„์™”๋„ค. ๊ณ„์† ์ง€์ผœ๋ณด๊ณ  ์žˆ์—ˆ์–ด... ์„ธ์…˜ {sessions}.\",\n \"level.greeting.formal\":\n \"๐Ÿ“ฆ ์ƒ์ž๊ฐ€ ์—ด๋ฆฐ๋‹ค... {project}์— ๋‹ค์‹œ ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ {sessions}.\",\n \"level.greeting.chaotic.template\": \"๐Ÿ“ฆ {tag} {project}! #{sessions}\",\n \"level.greeting.chaotic.chomp\": \"*์™€๊ทธ์ž‘*\",\n \"level.greeting.chaotic.lid_creaks\": \"*๋šœ๊ป‘ ์‚๊ฑฑ*\",\n \"level.greeting.chaotic.teeth_gleam\": \"*์ด๋นจ ๋ฒˆ๋œฉ*\",\n \"level.greeting.chaotic.tongue_flicks\": \"*ํ˜€ ํ•ฅ์ง*\",\n \"level.term.tool\": \"๋„๊ตฌ\",\n \"level.term.pattern\": \"ํŒจํ„ด\",\n \"level.term.hook\": \"ํ›…\",\n \"level.term.shortcut\": \"์ง€๋ฆ„๊ธธ\",\n \"level.term.habit\": \"์Šต๊ด€\",\n \"level.term.automation\": \"์ž๋™ํ™”\",\n \"focus.updated\": \"ํ”„๋กœ์ ํŠธ ์ •๋ณด ์—…๋ฐ์ดํŠธ:\",\n \"focus.focus_label\": \"ํ˜„์žฌ ํฌ์ปค์Šค\",\n \"focus.stack_label\": \"์Šคํƒ\",\n \"mcp_search.header\": '๐Ÿ“ฆ *ํ‚ํ‚* \"{query}\" MCP ์„œ๋ฒ„ ๊ฒ€์ƒ‰:\\n\\n๐Ÿ”— {url}',\n \"mcp_search.popular\": \"**์ธ๊ธฐ MCP ์„œ๋ฒ„:**\",\n \"mcp_search.add\":\n '`mimic:mcp`๋กœ ์ถ”๊ฐ€: `mimic:mcp({ name: \"context7\", url: \"https://mcp.context7.com/mcp\" })`',\n \"mcp_search.desc.context7\": \"์ตœ์‹  ๋ฌธ์„œ\",\n \"mcp_search.desc.github\": \"GitHub API\",\n \"mcp_search.desc.supabase\": \"๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค\",\n \"mcp_search.desc.playwright\": \"๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™”\",\n \"mcp_search.desc.firecrawl\": \"์›น ์Šคํฌ๋ž˜ํ•‘\",\n \"mcp.need_url_or_command\": \"๐Ÿ“ฆ *๊ฐธ์šฐ๋šฑ* url ๋˜๋Š” command ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•ด!\",\n \"mcp.added\":\n '๐Ÿ“ฆ *ํ˜€๋ฅผ ๋‚ผ๋ฆ„* MCP ์„œ๋ฒ„ \"{name}\"๊ฐ€ opencode.json์— ์ถ”๊ฐ€๋์–ด!\\n\\n์ƒˆ MCP ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด OpenCode๋ฅผ ์žฌ์‹œ์ž‘ํ•ด.',\n \"capabilities.empty\":\n \"๐Ÿ“ฆ *ํ…… ๋นˆ ๋œ์ปน* ์•„์ง ํก์ˆ˜ํ•œ ๋Šฅ๋ ฅ์ด ์—†์–ด. `mimic:evolve`๋กœ ํŒจํ„ด์„ ๋จน์—ฌ์ค˜!\",\n \"capabilities.title\": \"## ๐Ÿ“ฆ ํก์ˆ˜ํ•œ ๋Šฅ๋ ฅ\",\n \"capabilities.intro\": \"*๋ฏธ๋ฏน์ด ์ˆ˜์ง‘ํ’ˆ์„ ์ž๋ž‘ํ•œ๋‹ค...*\",\n \"capabilities.type\": \"์œ ํ˜•\",\n \"capabilities.description\": \"์„ค๋ช…\",\n \"capabilities.consumed\": \"ํก์ˆ˜์ผ\",\n \"grow.title\": \"## ๐Ÿ“ฆ {project} - ์˜์—ญ ๋ถ„์„\",\n \"grow.subtitle\": \"*๋ฏธ๋ฏน์ด ๋˜์ „์„ ํ›‘์œผ๋ฉฐ ์ž์ฃผ ๋‹ค๋‹Œ ๊ธธ์„ ๊ธฐ๋กํ•œ๋‹ค...*\",\n \"grow.feeding_grounds\": \"### ๐Ÿ”ฅ ๋จน์ด ํ„ฐ (๊ฐ€์žฅ ๋งŽ์ด ์ˆ˜์ •)\",\n \"grow.favorite_prey\": \"### ๐Ÿฆท ์ข‹์•„ํ•˜๋Š” ๋จน์ด (๋„๊ตฌ ํŒจํ„ด)\",\n \"grow.hunting_grounds\": \"### ๐Ÿ—บ๏ธ ์‚ฌ๋ƒฅํ„ฐ\",\n \"grow.questions\": \"### ๐Ÿค” ์ƒ์ž์˜ ์งˆ๋ฌธ\",\n \"grow.question1\": \"- ๋‹ค์Œ ๋ณด๋ฌผ์€ ๋ฌด์—‡์ผ๊นŒ?\",\n \"grow.question2\": \"- ์žŠํžŒ ๊ตฌ์„์€ ์—†์„๊นŒ?\",\n \"grow.question3\": \"- ์ง€๊ธˆ ๊ธธ์ด ์˜๊ด‘์œผ๋กœ ์ด์–ด์งˆ๊นŒ?\",\n \"grow.current_hunt\": \"**ํ˜„์žฌ ํฌ์ปค์Šค**: {focus}\",\n \"grow.files_modified\": \"({count}ํšŒ)\",\n \"grow.prey\": \"({count}๊ฑด)\",\n \"journey.title\": \"## ๐Ÿ“ฆ {project}์˜ ์—ฌ์ •\",\n \"journey.subtitle\": \"*๋ฏธ๋ฏน์ด ๋šœ๊ป‘์„ ์—ด์–ด ์˜ค๋ž˜๋œ ๋‘๋ฃจ๋งˆ๋ฆฌ๋ฅผ ํŽผ์นœ๋‹ค...*\",\n \"journey.sessions_survived\": \"**๋ˆ„์  ์„ธ์…˜**: {count}\",\n \"journey.first_encounter\": \"**์ฒซ ๋งŒ๋‚จ**: {date}\",\n \"journey.abilities_gained\": \"**์–ป์€ ๋Šฅ๋ ฅ**: {count}\",\n \"journey.treasures\": \"**๋‹ด๊ธด ๋ณด๋ฌผ**: {stack}\",\n \"journey.current_hunt\": \"**ํ˜„์žฌ ํฌ์ปค์Šค**: {focus}\",\n \"journey.victories\": \"### ๐Ÿ† ์„ฑ๊ณผ\",\n \"journey.witnessed\": \"### ๐Ÿ‘๏ธ ๋‚ด๊ฐ€ ๋ณธ ๊ฒƒ\",\n \"journey.powers\": \"### โœจ ํก์ˆ˜ํ•œ ๋Šฅ๋ ฅ\",\n \"journey.scrolls\": \"### ๐Ÿ“œ ์ตœ๊ทผ ๊ธฐ๋ก\",\n \"suggest.commit\": '๐Ÿ“ฆ *๋ƒ ๋ƒ * \"{pattern}\"์„ {count}+๋ฒˆ ์†Œํ™”ํ–ˆ์–ด. ์ง€๋ฆ„๊ธธ๋กœ ๋งŒ๋“ค๊นŒ?',\n \"suggest.file\": '๐Ÿ“ฆ *ํŒŒ์ผ์„ ์‘์‹œ* \"{pattern}\"์„ {count}๋ฒˆ ๊ฑด๋“œ๋ ธ๋„ค. ์ง€์ผœ๋ณผ๊นŒ?',\n \"suggest.tool\": '๐Ÿ“ฆ *์ด๋นจ ์ฐฐ์นต* \"{pattern}\" ์ •๋ง ์ž์ฃผ ์“ฐ๋„ค. ์ปค์Šคํ…€ ๋„๊ตฌ ์–ด๋•Œ?',\n \"suggest.sequence\": \"๐Ÿ“ฆ *๋šœ๊ป‘ ๋‹ฌ๊ทธ๋ฝ* ์›€์ง์ž„์—์„œ ํŒจํ„ด์ด ๋ณด์—ฌ ({pattern})... ์ž๋™ํ™”ํ•ด์ค„๊นŒ?\",\n \"tool.init.description\": \"์ด ํ”„๋กœ์ ํŠธ์—์„œ Mimic ์ดˆ๊ธฐํ™” ๋˜๋Š” ๊นจ์šฐ๊ธฐ\",\n \"tool.status.description\": \"ํ˜„์žฌ ์ƒํƒœ์™€ ์ตœ๊ทผ ํ™œ๋™ ํ™•์ธ\",\n \"tool.journey.description\": \"ํ”„๋กœ์ ํŠธ ์ง„ํ™” ์„œ์‚ฌ ๋ณด๊ธฐ\",\n \"tool.patterns.description\": \"๊ฐ์ง€๋œ ๋ชจ๋“  ํŒจํ„ด ๋ณด๊ธฐ\",\n \"tool.observe.description\": \"์—ฌ์ •์— ๊ด€์ฐฐ ๋‚ด์šฉ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€\",\n \"tool.observe.args.observation\": \"๊ธฐ๋กํ•  ๊ด€์ฐฐ ๋‚ด์šฉ\",\n \"tool.milestone.description\": \"ํ”„๋กœ์ ํŠธ ๋งˆ์ผ์Šคํ†ค ๊ธฐ๋ก\",\n \"tool.milestone.args.milestone\": \"๊ธฐ๋กํ•  ๋งˆ์ผ์Šคํ†ค\",\n \"tool.stats.description\": \"Mimic ์ƒ์„ธ ํ†ต๊ณ„ ๋ณด๊ธฐ\",\n \"tool.configure.description\": \"Mimic ํ™˜๊ฒฝ์„ค์ • ๋ณ€๊ฒฝ\",\n \"tool.configure.args.learningEnabled\": \"ํŒจํ„ด ํ•™์Šต ํ™œ์„ฑ/๋น„ํ™œ์„ฑ\",\n \"tool.configure.args.suggestionEnabled\": \"์ œ์•ˆ ํ™œ์„ฑ/๋น„ํ™œ์„ฑ\",\n \"tool.configure.args.minPatternCount\": \"์ œ์•ˆ ์ „ ์ตœ์†Œ ๋ฐœ์ƒ ํšŸ์ˆ˜\",\n \"tool.surface.description\": \"ํŒจํ„ด์„ surfaced(ํ™•์ธ๋จ)๋กœ ํ‘œ์‹œ\",\n \"tool.surface.args.patternId\": \"surfaced๋กœ ํ‘œ์‹œํ•  ํŒจํ„ด ID\",\n \"tool.reset.description\": \"ํ•™์Šต๋œ ํŒจํ„ด๊ณผ ํ†ต๊ณ„๋ฅผ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”\",\n \"tool.reset.args.confirm\": \"์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด true๋กœ ์„ค์ •\",\n \"tool.grow.description\": \"ํ”„๋กœ์ ํŠธ ๋ฐฉํ–ฅ๊ณผ ์„ฑ์žฅ ๊ธฐํšŒ ๋ถ„์„\",\n \"tool.evolve.description\": \"๊ฐ์ง€๋œ ํŒจํ„ด์œผ๋กœ ์ƒˆ ๋Šฅ๋ ฅ์„ ์ œ์•ˆ/์ƒ์„ฑ\",\n \"tool.evolve.args.accept\": \"๋Šฅ๋ ฅ์œผ๋กœ ์ง„ํ™”์‹œํ‚ฌ ํŒจํ„ด ID\",\n \"tool.level.description\": \"๊ฐœ์ธํ™”๋œ ์‘๋‹ต์„ ์œ„ํ•œ ๊ธฐ์ˆ  ์ˆ˜์ค€ ์„ค์ •\",\n \"tool.level.args.level\": \"๊ธฐ์ˆ  ์ˆ˜์ค€\",\n \"tool.focus.description\": \"ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ํฌ์ปค์Šค/์šฐ์„ ์ˆœ์œ„ ์„ค์ •\",\n \"tool.focus.args.focus\": \"ํ˜„์žฌ ํฌ์ปค์Šค ์˜์—ญ\",\n \"tool.focus.args.stack\": \"์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•œ ๊ธฐ์ˆ  ์Šคํƒ\",\n \"tool.mcp_search.description\": \"mcpmarket.com์—์„œ MCP ์„œ๋ฒ„ ๊ฒ€์ƒ‰\",\n \"tool.mcp_search.args.query\": \"MCP ์„œ๋ฒ„ ๊ฒ€์ƒ‰์–ด\",\n \"tool.mcp.description\": \"opencode.json์— MCP ์„œ๋ฒ„ ์„ค์ • ์ถ”๊ฐ€\",\n \"tool.mcp.args.name\": \"MCP ์„œ๋ฒ„ ์ด๋ฆ„\",\n \"tool.mcp.args.url\": \"์›๊ฒฉ MCP ์„œ๋ฒ„ URL\",\n \"tool.mcp.args.command\": \"๋กœ์ปฌ MCP ๋ช…๋ น(์‰ผํ‘œ ๊ตฌ๋ถ„)\",\n \"tool.capabilities.description\": \"์ง„ํ™”ํ•œ ๋Šฅ๋ ฅ ๋ชฉ๋ก\",\n\n \"tool.instincts.description\": \"ํ•™์Šต๋œ ๋ชจ๋“  ๋ณธ๋Šฅ ๋ณด๊ธฐ\",\n \"tool.instincts.args.domain\": \"๋„๋ฉ”์ธ์œผ๋กœ ํ•„ํ„ฐ (์„ ํƒ)\",\n \"instincts.empty\": \"๐Ÿ“ฆ *ํ•˜ํ’ˆ* ์•„์ง ํ•™์Šตํ•œ ๋ณธ๋Šฅ์ด ์—†์–ด. ๊ณ„์† ์ž‘์—…ํ•ด, ์ง€์ผœ๋ณด๊ณ  ์žˆ์„๊ฒŒ...\",\n \"instincts.title\": \"## ๐Ÿ“ฆ ํ•™์Šต๋œ ๋ณธ๋Šฅ\",\n \"instincts.total\": \"์ด {count}๊ฐœ ๋ณธ๋Šฅ\",\n \"instincts.auto_applied\": \"ํ•™์Šต๋œ ํ–‰๋™์ด ์ด ์„ธ์…˜์— ์ž๋™ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค\",\n\n \"tool.export.description\": \"๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์™€ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ๋ณธ๋Šฅ ๋‚ด๋ณด๋‚ด๊ธฐ\",\n \"export.empty\": \"๐Ÿ“ฆ *๋œ์ปน* ๋‚ด๋ณด๋‚ผ ๊ฒŒ ์—†์–ด. ๋จผ์ € ๋ณธ๋Šฅ์„ ํ•™์Šตํ•ด!\",\n \"export.success\": \"๐Ÿ“ฆ *๋ฟŒ๋“ฏํ•œ ๋”ธ๊น* {count}๊ฐœ ๋ณธ๋Šฅ์„ ๋‚ด๋ณด๋ƒˆ์–ด:\\n`{path}`\",\n\n \"tool.import.description\": \"๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ๋ณธ๋Šฅ ๊ฐ€์ ธ์˜ค๊ธฐ\",\n \"tool.import.args.path\": \"๋‚ด๋ณด๋‚ธ ๋ณธ๋Šฅ JSON ํŒŒ์ผ ๊ฒฝ๋กœ\",\n \"import.not_found\": \"๐Ÿ“ฆ *๊ฐธ์šฐ๋šฑ* ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์–ด: {path}\",\n \"import.success\": \"๐Ÿ“ฆ *์ง€์‹ ํก์ˆ˜* {from}์—์„œ {count}๊ฐœ ๋ณธ๋Šฅ์„ ๊ฐ€์ ธ์™”์–ด!\",\n \"import.error\": \"๐Ÿ“ฆ *ํ‰ค* ๋ณธ๋Šฅ ํŒŒ์ผ ํŒŒ์‹ฑ ์‹คํŒจ. ํ˜•์‹์ด ์ž˜๋ชป๋์–ด.\",\n\n \"tool.apply.description\": \"ํ˜„์žฌ ์ž‘์—…๊ณผ ๊ด€๋ จ๋œ ๋ณธ๋Šฅ ํ‘œ์‹œ\",\n \"apply.none\": \"๐Ÿ“ฆ *๋‘๋ฆฌ๋ฒˆ* ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์— ๊ด€๋ จ๋œ ๋ณธ๋Šฅ์ด ์—†์–ด.\",\n \"apply.title\": \"## ๐Ÿ“ฆ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋ณธ๋Šฅ\",\n\n \"tool.identity.description\": \"Mimic์˜ ์ •์ฒด์„ฑ๊ณผ ์„ฑ๊ฒฉ ๋ณด๊ธฐ\",\n \"identity.title\": \"## ๐Ÿ“ฆ ๋‚˜๋Š” ๋ˆ„๊ตฌ์ธ๊ฐ€?\",\n \"identity.personality\": \"์„ฑ๊ฒฉ\",\n \"identity.awakened\": \"๊นจ์–ด๋‚œ ๋‚ \",\n \"identity.days\": \"์ผ ์ „\",\n \"identity.instincts_learned\": \"ํ•™์Šตํ•œ ๋ณธ๋Šฅ\",\n \"identity.evolutions\": \"์ง„ํ™” ํšŸ์ˆ˜\",\n \"identity.favorite_domains\": \"์„ ํ˜ธ ๋„๋ฉ”์ธ\",\n \"identity.error\": \"๐Ÿ“ฆ *๊ฐธ์šฐ๋šฑ* ์ •์ฒด์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์—†์–ด์š”. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.\",\n\n \"tool.sequences.description\": \"๊ฐ์ง€๋œ ๋„๊ตฌ ์‚ฌ์šฉ ์‹œํ€€์Šค ๋ณด๊ธฐ\",\n \"sequences.empty\": \"๐Ÿ“ฆ *๊ท€ ๊ธฐ์šธ์ž„* ์•„์ง ์‹œํ€€์Šค๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š์•˜์–ด. ๊ณ„์† ๋„๊ตฌ๋ฅผ ์จ๋ด...\",\n \"sequences.title\": \"## ๐Ÿ“ฆ ๋„๊ตฌ ์‹œํ€€์Šค\",\n\n \"observer.skill_generated\": \"์Šคํ‚ฌ ์ƒ์„ฑ๋จ: {name}\",\n \"skill.domain_description\": \"{domain} ๋„๋ฉ”์ธ ์ „๋ฌธ ์Šคํ‚ฌ\",\n\n \"tool.observations.description\": \"์ด ์„ธ์…˜์˜ ๊ด€์ฐฐ ๋กœ๊ทธ ๋ณด๊ธฐ\",\n \"tool.observations.args.limit\": \"ํ‘œ์‹œํ•  ์ตœ๋Œ€ ๊ด€์ฐฐ ์ˆ˜\",\n \"tool.observations.args.types\": \"ํ•„ํ„ฐํ•  ๊ด€์ฐฐ ์œ ํ˜•(์‰ผํ‘œ ๊ตฌ๋ถ„)\",\n \"observations.title\": \"## ๐Ÿ“ฆ ๊ด€์ฐฐ ๋กœ๊ทธ\",\n \"observations.empty\": \"๐Ÿ“ฆ *๋น„์–ด์žˆ์Œ* ์•„์ง ๊ธฐ๋ก๋œ ๊ด€์ฐฐ์ด ์—†์–ด.\",\n \"observations.stats\": \"**์ด**: {count}๊ฐœ ๊ด€์ฐฐ, **ํฌ๊ธฐ**: {size}\",\n\n \"tool.session_context.description\": \"์ด์ „ ์„ธ์…˜ ์ปจํ…์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ\",\n \"session_context.title\": \"## ๐Ÿ“ฆ ์„ธ์…˜ ์ปจํ…์ŠคํŠธ\",\n \"session_context.empty\": \"๐Ÿ“ฆ *ํ•˜ํ’ˆ* ๋ถ„์„ํ•  ์ด์ „ ์„ธ์…˜์ด ์—†์–ด.\",\n \"session_context.patterns_title\": \"**์„ธ์…˜ ๊ฐ„ ํŒจํ„ด:**\",\n\n \"tool.generate_skills.description\": \"ํ•™์Šต๋œ ๋ณธ๋Šฅ์œผ๋กœ ์„ ์–ธ์  ์Šคํ‚ฌ ์ƒ์„ฑ\",\n \"generate_skills.title\": \"## ๐Ÿ“ฆ ์Šคํ‚ฌ ์ƒ์„ฑ\",\n \"generate_skills.empty\":\n \"๐Ÿ“ฆ *์–ด๊นจ ์œผ์“ฑ* ์Šคํ‚ฌ์„ ์ƒ์„ฑํ•  ๋ณธ๋Šฅ์ด ๋ถ€์กฑํ•ด. ๋„๋ฉ”์ธ๋‹น 5๊ฐœ ์ด์ƒ ํ•„์š”ํ•ด.\",\n \"generate_skills.success\": \"{count}๊ฐœ ์Šคํ‚ฌ ์ƒ์„ฑ๋จ:\",\n },\n};\n\nexport async function loadMimicConfig(): Promise<MimicUserConfig> {\n const configPath = join(homedir(), \".config\", \"opencode\", \"mimic.json\");\n if (!existsSync(configPath)) return {};\n\n try {\n const raw = await readFile(configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return {};\n return parsed as MimicUserConfig;\n } catch {\n return {};\n }\n}\n\nexport function resolveLanguage(config?: MimicUserConfig | null): Language {\n if (config?.language === \"ko-KR\") return \"ko-KR\";\n return DEFAULT_LANGUAGE;\n}\n\nexport interface I18n {\n language: Language;\n t: (key: string, vars?: Record<string, string | number>) => string;\n}\n\nfunction interpolate(template: string, vars?: Record<string, string | number>): string {\n if (!vars) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_match, key) => {\n const value = vars[key];\n return value === undefined ? \"\" : String(value);\n });\n}\n\nexport function createI18n(language: Language): I18n {\n return {\n language,\n t: (key, vars) => {\n const dict = MESSAGES[language] ?? MESSAGES[DEFAULT_LANGUAGE];\n const fallback = MESSAGES[DEFAULT_LANGUAGE];\n const template = dict[key] ?? fallback[key] ?? key;\n return interpolate(template, vars);\n },\n };\n}\n\nexport function formatCapabilityType(i18n: I18n, type: string): string {\n return i18n.t(`evolution.type.${type}`);\n}\n\nexport function formatLevelLabel(i18n: I18n, level: string): string {\n return i18n.t(`level.label.${level}`);\n}\n\nexport function formatGreetingStyle(i18n: I18n, style: string): string {\n return i18n.t(`level.style.${style}`);\n}\n\nexport function formatDetailLevel(i18n: I18n, detail: string): string {\n return i18n.t(`level.detail.${detail}`);\n}\n\nexport function formatPatternType(i18n: I18n, type: string): string {\n return i18n.t(`patterns.type.${type}`);\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { OPENCODE_EVENTS } from \"@/constants/opencode-events\";\nimport { BUILTIN_TOOLS } from \"@/constants/tools\";\nimport type { MimicContext } from \"@/core/context\";\nimport type { StateManager } from \"@/core/state\";\nimport { formatCapabilityType } from \"@/lib/i18n\";\nimport { findRepresentativePattern } from \"@/modules/knowledge/instincts\";\nimport type { CapabilityType, Domain, EvolvedCapability, Pattern } from \"@/types\";\nimport { generateId } from \"@/utils/id\";\n\ninterface EvolutionSuggestion {\n type: CapabilityType;\n name: string;\n description: string;\n reason: string;\n pattern: Pattern;\n}\n\nfunction generateToolCode(name: string, description: string, pattern: Pattern): string {\n const funcName = name.replace(/-/g, \"_\");\n return `// ๐Ÿ“ฆ Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${funcName} = (plugin) => ({\n tool: {\n \"${name}\": {\n description: \"${description}\",\n args: {},\n async execute() {\n // TODO: Implement your logic here\n // This was generated from pattern: ${pattern.description}\n return \"๐Ÿ“ฆ ${name} executed!\";\n },\n },\n },\n});\n\nexport default ${funcName};\n`;\n}\n\nfunction generateHookCode(name: string, _description: string, pattern: Pattern): string {\n const filename = pattern.description;\n return `// ๐Ÿ“ฆ Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${name.replace(/-/g, \"_\")} = (plugin) => ({\n async event({ event }) {\n if (event.type === \"${OPENCODE_EVENTS.FILE_EDITED}\") {\n const filename = event.properties?.filename;\n if (filename?.includes(\"${filename}\")) {\n console.log(\"๐Ÿ“ฆ [Mimic] Detected change in watched file: ${filename}\");\n // TODO: Add your custom logic here\n }\n }\n },\n});\n\nexport default ${name.replace(/-/g, \"_\")};\n`;\n}\n\nfunction generateSkillCode(name: string, description: string, pattern: Pattern): string {\n return `// ๐Ÿ“ฆ Auto-generated by Mimic\n// Pattern: ${pattern.description} (${pattern.count}x)\n// Generated: ${new Date().toISOString()}\n\nexport const ${name.replace(/-/g, \"_\")} = (plugin) => ({\n async event({ event }) {\n // Auto-triggered skill: ${description}\n if (event.type === \"${OPENCODE_EVENTS.SESSION_CREATED}\") {\n console.log(\"๐Ÿ“ฆ [Mimic] Skill ${name} activated\");\n // TODO: Implement automated behavior\n }\n },\n});\n\nexport default ${name.replace(/-/g, \"_\")};\n`;\n}\n\nfunction generateMcpConfig(name: string, _description: string, pattern: Pattern): object {\n return {\n [name]: {\n type: \"local\",\n command: [\"echo\", `MCP server for ${pattern.description}`],\n enabled: false,\n },\n };\n}\n\nfunction generateAgentMarkdown(name: string, description: string, pattern: Pattern): string {\n return `---\ndescription: ${description}\nmode: subagent\ntools:\n read: true\n glob: true\n grep: true\n bash: false\n edit: false\n---\n\n# ๐Ÿ“ฆ ${name}\n\nAuto-generated by Mimic from pattern: ${pattern.description} (${pattern.count}x)\n\n## Focus Area\n\nThis agent specializes in tasks related to: ${pattern.description}\n\n## Context\n\n- Pattern detected: ${pattern.type}\n- Usage count: ${pattern.count}\n- First seen: ${new Date(pattern.firstSeen).toISOString()}\n\n## How To Help\n\nAnalyze and assist with tasks matching this pattern.\nProvide focused, expert guidance in this specific area.\n\n## Remember\n\n- Stay focused on the pattern's domain\n- Leverage the observed usage patterns\n- Adapt to the user's workflow\n`;\n}\n\ntype EvolutionOutput = { filePath: string; content: string };\n\nasync function readOpencodeConfig(configPath: string): Promise<Record<string, unknown>> {\n if (!existsSync(configPath)) return {};\n\n try {\n const parsed = JSON.parse(await readFile(configPath, \"utf-8\"));\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {};\n }\n return parsed as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\nasync function buildMcpEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const opencodeDir = join(ctx.directory, \".opencode\");\n if (!existsSync(opencodeDir)) {\n await mkdir(opencodeDir, { recursive: true });\n }\n\n const configPath = join(ctx.directory, \"opencode.json\");\n const config = await readOpencodeConfig(configPath);\n const mcpConfig = generateMcpConfig(suggestion.name, suggestion.description, suggestion.pattern);\n\n const mcp = { ...((config.mcp as Record<string, unknown>) || {}), ...mcpConfig };\n const content = JSON.stringify({ ...config, mcp }, null, 2);\n\n return { filePath: configPath, content };\n}\n\nasync function buildAgentEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const agentsDir = join(ctx.directory, \".opencode\", \"agents\");\n if (!existsSync(agentsDir)) {\n await mkdir(agentsDir, { recursive: true });\n }\n\n return {\n content: generateAgentMarkdown(suggestion.name, suggestion.description, suggestion.pattern),\n filePath: join(agentsDir, `${suggestion.name}.md`),\n };\n}\n\nfunction buildPluginContent(suggestion: EvolutionSuggestion): string {\n switch (suggestion.type) {\n case \"command\":\n case \"shortcut\":\n return generateToolCode(suggestion.name, suggestion.description, suggestion.pattern);\n case \"hook\":\n return generateHookCode(suggestion.name, suggestion.description, suggestion.pattern);\n case \"skill\":\n return generateSkillCode(suggestion.name, suggestion.description, suggestion.pattern);\n default:\n return generateToolCode(suggestion.name, suggestion.description, suggestion.pattern);\n }\n}\n\nasync function buildPluginEvolution(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n const pluginsDir = join(ctx.directory, \".opencode\", \"plugins\");\n if (!existsSync(pluginsDir)) {\n await mkdir(pluginsDir, { recursive: true });\n }\n\n return {\n content: buildPluginContent(suggestion),\n filePath: join(pluginsDir, `${suggestion.name}.js`),\n };\n}\n\nasync function buildEvolutionOutput(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<EvolutionOutput> {\n if (suggestion.type === \"mcp\") {\n return buildMcpEvolution(ctx, suggestion);\n }\n\n if (suggestion.type === \"agent\") {\n return buildAgentEvolution(ctx, suggestion);\n }\n\n return buildPluginEvolution(ctx, suggestion);\n}\n\nfunction createCapabilityFromSuggestion(suggestion: EvolutionSuggestion): EvolvedCapability {\n return {\n id: generateId(),\n type: suggestion.type,\n name: suggestion.name,\n description: suggestion.description,\n createdAt: new Date().toISOString(),\n fromPattern: suggestion.pattern.id,\n };\n}\n\nfunction updateEvolutionState(\n state: Awaited<ReturnType<StateManager[\"read\"]>>,\n capability: EvolvedCapability,\n suggestion: EvolutionSuggestion,\n): void {\n state.evolution.capabilities.push(capability);\n state.evolution.lastEvolution = new Date().toISOString();\n\n const pattern = state.patterns.find((p) => p.id === suggestion.pattern.id);\n if (pattern) {\n pattern.surfaced = true;\n }\n}\n\nexport function suggestEvolution(pattern: Pattern, ctx: MimicContext): EvolutionSuggestion | null {\n switch (pattern.type) {\n case \"tool\":\n if (pattern.count >= 10) {\n const toolName = pattern.description;\n if (BUILTIN_TOOLS.has(toolName)) {\n return null;\n }\n return {\n type: \"shortcut\",\n name: `quick-${pattern.description.toLowerCase().replace(/[^a-z0-9]/g, \"-\")}`,\n description: ctx.i18n.t(\"evolution.suggest.tool.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.tool.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"file\":\n if (pattern.count >= 5) {\n return {\n type: \"hook\",\n name: `watch-${pattern.description.split(\"/\").pop()?.replace(/\\./g, \"-\") || \"file\"}`,\n description: ctx.i18n.t(\"evolution.suggest.file.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.file.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"commit\":\n if (pattern.count >= 3) {\n return {\n type: \"command\",\n name: `commit-${pattern.description.slice(0, 20).replace(/\\s+/g, \"-\").toLowerCase()}`,\n description: ctx.i18n.t(\"evolution.suggest.commit.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.commit.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n\n case \"sequence\":\n if (pattern.count >= 5) {\n return {\n type: \"agent\",\n name: `${pattern.description.slice(0, 15).replace(/\\s+/g, \"-\").toLowerCase()}-specialist`,\n description: ctx.i18n.t(\"evolution.suggest.sequence.agent.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.sequence.agent.reason\", { count: pattern.count }),\n pattern,\n };\n }\n if (pattern.count >= 3) {\n return {\n type: \"skill\",\n name: `auto-${pattern.description.slice(0, 15).replace(/\\s+/g, \"-\").toLowerCase()}`,\n description: ctx.i18n.t(\"evolution.suggest.sequence.skill.description\", {\n pattern: pattern.description,\n }),\n reason: ctx.i18n.t(\"evolution.suggest.sequence.skill.reason\", { count: pattern.count }),\n pattern,\n };\n }\n break;\n }\n\n return null;\n}\n\nexport async function getEvolutionSuggestions(ctx: MimicContext): Promise<EvolutionSuggestion[]> {\n const state = await ctx.stateManager.read();\n const suggestions: EvolutionSuggestion[] = [];\n\n for (const pattern of state.patterns) {\n if (pattern.surfaced) continue;\n\n const suggestion = suggestEvolution(pattern, ctx);\n if (suggestion) {\n suggestions.push(suggestion);\n }\n }\n\n return suggestions;\n}\n\nexport async function evolveCapability(\n ctx: MimicContext,\n suggestion: EvolutionSuggestion,\n): Promise<{ capability: EvolvedCapability; filePath: string }> {\n const state = await ctx.stateManager.read();\n const { filePath, content } = await buildEvolutionOutput(ctx, suggestion);\n await writeFile(filePath, content, \"utf-8\");\n\n const capability = createCapabilityFromSuggestion(suggestion);\n updateEvolutionState(state, capability, suggestion);\n\n await ctx.stateManager.save(state);\n await ctx.stateManager.addMilestone(\n ctx.i18n.t(\"milestone.evolved\", {\n name: capability.name,\n type: formatCapabilityType(ctx.i18n, capability.type),\n }),\n );\n\n return { capability, filePath };\n}\n\nexport function formatEvolutionResult(\n ctx: MimicContext,\n capability: EvolvedCapability,\n filePath: string,\n): string {\n const typeLabel = formatCapabilityType(ctx.i18n, capability.type);\n let result = `### โœจ ${capability.name}\\n\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.type\")}**: ${typeLabel}\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.description\")}**: ${capability.description}\\n`;\n result += `**${ctx.i18n.t(\"evolution.result.file\")}**: \\`${filePath}\\`\\n\\n`;\n result += `*${ctx.i18n.t(\"evolution.result.restart\", { type: typeLabel })}*\\n\\n`;\n\n switch (capability.type) {\n case \"command\":\n case \"shortcut\":\n result += `${ctx.i18n.t(\"evolution.result.command\", { name: capability.name })}\\n`;\n break;\n\n case \"hook\":\n result += `${ctx.i18n.t(\"evolution.result.hook\")}\\n`;\n break;\n\n case \"skill\":\n result += `${ctx.i18n.t(\"evolution.result.skill\")}\\n`;\n break;\n\n case \"agent\":\n result += `${ctx.i18n.t(\"evolution.result.agent\", { name: capability.name })}\\n`;\n break;\n\n case \"mcp\":\n result += `${ctx.i18n.t(\"evolution.result.mcp\", { name: capability.name })}\\n`;\n break;\n }\n\n return result;\n}\n\nexport async function suggestDomainEvolution(\n ctx: MimicContext,\n domain: Domain,\n): Promise<EvolutionSuggestion | null> {\n const state = await ctx.stateManager.read();\n const instincts = await ctx.stateManager.listInstincts();\n const domainInstincts = instincts.filter(\n (i) => i.domain === domain && i.status === \"approved\" && i.confidence >= 0.6,\n );\n\n if (domainInstincts.length < 5) {\n return null;\n }\n\n const pattern = findRepresentativePattern(domainInstincts, state.patterns);\n if (!pattern) {\n return null;\n }\n\n const slug = domain.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n\n return {\n type: \"agent\",\n name: `${slug}-specialist`,\n description: ctx.i18n.t(\"evolution.domain.description\", { domain }),\n reason: ctx.i18n.t(\"evolution.domain.reason\", {\n count: domainInstincts.length,\n domain,\n }),\n pattern,\n };\n}\n\nexport async function evolveDomain(\n ctx: MimicContext,\n domain: Domain,\n): Promise<{ capability: EvolvedCapability; filePath: string } | null> {\n const suggestion = await suggestDomainEvolution(ctx, domain);\n if (!suggestion) {\n return null;\n }\n\n const result = await evolveCapability(ctx, suggestion);\n\n const state = await ctx.stateManager.read();\n if (!state.evolution.evolvedDomains) {\n state.evolution.evolvedDomains = {};\n }\n state.evolution.evolvedDomains[domain] = new Date().toISOString();\n\n const pendingIndex = state.evolution.pendingSuggestions.indexOf(domain);\n if (pendingIndex !== -1) {\n state.evolution.pendingSuggestions.splice(pendingIndex, 1);\n }\n\n await ctx.stateManager.save(state);\n\n return result;\n}\n","export const BUILTIN_TOOLS = new Set([\n \"read\",\n \"write\",\n \"edit\",\n \"bash\",\n \"grep\",\n \"glob\",\n \"serena_list_dir\",\n \"serena_find_file\",\n \"serena_search_for_pattern\",\n \"serena_get_symbols_overview\",\n \"serena_find_symbol\",\n \"serena_find_referencing_symbols\",\n \"serena_replace_symbol_body\",\n \"serena_insert_after_symbol\",\n \"serena_insert_before_symbol\",\n \"serena_replace_content\",\n \"serena_rename_symbol\",\n \"lsp_diagnostics\",\n \"lsp_goto_definition\",\n \"lsp_find_references\",\n \"lsp_prepare_rename\",\n \"lsp_rename\",\n \"lsp_symbols\",\n \"delegate_task\",\n \"task\",\n \"question\",\n \"background_cancel\",\n \"background_output\",\n \"skill\",\n \"slashcommand\",\n \"use_skill\",\n \"find_skills\",\n \"session_list\",\n \"session_read\",\n \"session_search\",\n \"session_info\",\n \"mimic:\",\n]);\n","import type { Language } from \"@/lib/i18n\";\nimport type { Domain } from \"@/types\";\n\n/**\n * Domain constants for clustering\n */\nexport const DOMAINS = [\n \"code-style\",\n \"testing\",\n \"git\",\n \"debugging\",\n \"file-organization\",\n \"tooling\",\n \"refactoring\",\n \"documentation\",\n \"other\",\n] as const;\n\n/**\n * Domain keywords for pattern detection.\n * English keywords are always matched (base).\n * Korean keywords are additionally matched when language is ko-KR.\n */\nexport const DOMAIN_KEYWORDS_BY_LANG: Record<Language, Record<Domain, string[]>> = {\n \"en-US\": {\n \"code-style\": [\"style\", \"format\", \"lint\", \"prettier\", \"eslint\", \"naming\", \"convention\"],\n testing: [\"test\", \"spec\", \"jest\", \"vitest\", \"mocha\", \"coverage\", \"assert\", \"expect\"],\n git: [\"commit\", \"branch\", \"merge\", \"push\", \"pull\", \"rebase\", \"stash\", \"git\"],\n debugging: [\"debug\", \"error\", \"fix\", \"bug\", \"issue\", \"trace\", \"log\", \"breakpoint\"],\n \"file-organization\": [\"move\", \"rename\", \"organize\", \"structure\", \"folder\", \"directory\"],\n tooling: [\"tool\", \"script\", \"build\", \"compile\", \"bundle\", \"config\"],\n refactoring: [\"refactor\", \"extract\", \"inline\", \"rename\", \"move\", \"simplify\"],\n documentation: [\"doc\", \"readme\", \"comment\", \"jsdoc\", \"markdown\", \"wiki\"],\n other: [],\n },\n \"ko-KR\": {\n \"code-style\": [\"์Šคํƒ€์ผ\", \"ํฌ๋งท\", \"๋ฆฐํŠธ\", \"๋„ค์ด๋ฐ\", \"์ปจ๋ฒค์…˜\", \"์ฝ”๋”ฉ๊ทœ์น™\", \"์ •๋ ฌ\"],\n testing: [\"ํ…Œ์ŠคํŠธ\", \"๋‹จ์œ„ํ…Œ์ŠคํŠธ\", \"์ปค๋ฒ„๋ฆฌ์ง€\", \"๊ฒ€์ฆ\", \"ํ™•์ธ\", \"๋‹จ์–ธ\"],\n git: [\"์ปค๋ฐ‹\", \"๋ธŒ๋žœ์น˜\", \"๋ณ‘ํ•ฉ\", \"ํ‘ธ์‹œ\", \"ํ’€\", \"๋ฆฌ๋ฒ ์ด์Šค\", \"์Šคํƒœ์‹œ\", \"๊นƒ\"],\n debugging: [\"๋””๋ฒ„๊ทธ\", \"๋””๋ฒ„๊น…\", \"์˜ค๋ฅ˜\", \"์—๋Ÿฌ\", \"์ˆ˜์ •\", \"๋ฒ„๊ทธ\", \"์ด์Šˆ\", \"์ถ”์ \", \"๋กœ๊ทธ\"],\n \"file-organization\": [\"์ด๋™\", \"์ด๋ฆ„๋ณ€๊ฒฝ\", \"์ •๋ฆฌ\", \"๊ตฌ์กฐ\", \"ํด๋”\", \"๋””๋ ‰ํ† ๋ฆฌ\", \"ํŒŒ์ผ์ •๋ฆฌ\"],\n tooling: [\"๋„๊ตฌ\", \"์Šคํฌ๋ฆฝํŠธ\", \"๋นŒ๋“œ\", \"์ปดํŒŒ์ผ\", \"๋ฒˆ๋“ค\", \"์„ค์ •\", \"๊ตฌ์„ฑ\"],\n refactoring: [\"๋ฆฌํŒฉํ„ฐ\", \"๋ฆฌํŒฉํ† ๋ง\", \"์ถ”์ถœ\", \"์ธ๋ผ์ธ\", \"๋‹จ์ˆœํ™”\", \"๊ฐœ์„ \"],\n documentation: [\"๋ฌธ์„œ\", \"๋ฌธ์„œํ™”\", \"์ฃผ์„\", \"๋ฆฌ๋“œ๋ฏธ\", \"๋งˆํฌ๋‹ค์šด\", \"์œ„ํ‚ค\", \"์„ค๋ช…\"],\n other: [],\n },\n};\n","import { DOMAINS } from \"@/constants/domain\";\nimport type { MimicContext } from \"@/core/context\";\nimport type { Domain, Instinct, Pattern } from \"@/types\";\n\nconst MIN_CONFIDENCE = 0.6;\nconst MIN_INSTINCTS_FOR_EVOLUTION = 5;\n\nexport function normalizeDomain(rawDomain: string): Domain {\n const lower = rawDomain.toLowerCase().trim();\n\n const synonyms: Record<string, Domain> = {\n \"code-style\": \"code-style\",\n codestyle: \"code-style\",\n style: \"code-style\",\n formatting: \"code-style\",\n testing: \"testing\",\n test: \"testing\",\n tests: \"testing\",\n git: \"git\",\n vcs: \"git\",\n \"version-control\": \"git\",\n debugging: \"debugging\",\n debug: \"debugging\",\n \"file-organization\": \"file-organization\",\n files: \"file-organization\",\n organization: \"file-organization\",\n tooling: \"tooling\",\n tools: \"tooling\",\n refactoring: \"refactoring\",\n refactor: \"refactoring\",\n documentation: \"documentation\",\n docs: \"documentation\",\n };\n\n if (synonyms[lower]) {\n return synonyms[lower];\n }\n\n if (DOMAINS.includes(lower as Domain)) {\n return lower as Domain;\n }\n\n return \"other\";\n}\n\nexport function groupByDomain(instincts: Instinct[]): Map<Domain, Instinct[]> {\n const map = new Map<Domain, Instinct[]>();\n\n for (const instinct of instincts) {\n if (instinct.status !== \"approved\") continue;\n if (instinct.confidence < MIN_CONFIDENCE) continue;\n\n const list = map.get(instinct.domain) || [];\n list.push(instinct);\n map.set(instinct.domain, list);\n }\n\n return map;\n}\n\nexport function getEligibleDomains(domainMap: Map<Domain, Instinct[]>): Domain[] {\n const eligible: Domain[] = [];\n\n for (const [domain, instincts] of domainMap) {\n if (instincts.length >= MIN_INSTINCTS_FOR_EVOLUTION) {\n eligible.push(domain);\n }\n }\n\n return eligible;\n}\n\nexport function shouldTriggerEvolution(\n domain: Domain,\n evolvedDomains: Record<string, string> | undefined,\n cooldownDays = 7,\n): boolean {\n if (!evolvedDomains?.[domain]) {\n return true;\n }\n\n const lastEvolved = new Date(evolvedDomains[domain]);\n const now = new Date();\n const diffDays = (now.getTime() - lastEvolved.getTime()) / (1000 * 60 * 60 * 24);\n\n return diffDays >= cooldownDays;\n}\n\nexport function findRepresentativePattern(\n instincts: Instinct[],\n patterns: Pattern[],\n): Pattern | null {\n const patternIDs = new Set<string>();\n for (const instinct of instincts) {\n for (const id of instinct.evidence.patternIDs) {\n patternIDs.add(id);\n }\n }\n\n let bestPattern: Pattern | null = null;\n let maxCount = 0;\n\n for (const pattern of patterns) {\n if (patternIDs.has(pattern.id) && pattern.count > maxCount) {\n maxCount = pattern.count;\n bestPattern = pattern;\n }\n }\n\n if (!bestPattern && patterns.length > 0) {\n const unsurfaced = patterns.find((p) => !p.surfaced);\n bestPattern = unsurfaced || patterns[0];\n }\n\n return bestPattern;\n}\n\nexport async function clusterDomainsAndTriggerEvolution(ctx: MimicContext): Promise<Domain[]> {\n const state = await ctx.stateManager.read();\n const instincts = await ctx.stateManager.listInstincts();\n\n const domainMap = groupByDomain(instincts);\n const eligible = getEligibleDomains(domainMap);\n const triggered: Domain[] = [];\n\n for (const domain of eligible) {\n if (!shouldTriggerEvolution(domain, state.evolution.evolvedDomains)) {\n continue;\n }\n\n triggered.push(domain);\n\n if (!state.evolution.pendingSuggestions.includes(domain)) {\n state.evolution.pendingSuggestions.push(domain);\n }\n }\n\n if (triggered.length > 0) {\n await ctx.stateManager.save(state);\n }\n\n return triggered;\n}\n","import { createHash } from \"node:crypto\";\nimport { nanoid } from \"nanoid\";\n\n/**\n * Generate a unique ID using nanoid.\n * Default size is 21 characters.\n */\nexport function generateId(size?: number): string {\n return nanoid(size);\n}\n\n/**\n * Generate a deterministic ID based on a domain and seed string.\n * Uses SHA-1 hash and returns the first 12 characters.\n */\nexport function generateDeterministicId(domain: string, seed: string): string {\n return createHash(\"sha1\").update(`${domain}:${seed}`).digest(\"hex\").slice(0, 12);\n}\n","import { DOMAIN_KEYWORDS_BY_LANG } from \"@/constants/domain\";\nimport type { MimicContext } from \"@/core/context\";\nimport type { Language } from \"@/lib/i18n\";\nimport type { Domain, Instinct } from \"@/types\";\n\ninterface AppliedInstinct {\n instinct: Instinct;\n relevance: \"high\" | \"medium\" | \"low\";\n}\n\n/**\n * Get combined keywords for a domain based on language.\n * Always includes en-US keywords, adds ko-KR keywords if language is Korean.\n */\nfunction getDomainKeywords(domain: Domain, language: Language = \"en-US\"): string[] {\n const enKeywords = DOMAIN_KEYWORDS_BY_LANG[\"en-US\"][domain] || [];\n if (language === \"ko-KR\") {\n const koKeywords = DOMAIN_KEYWORDS_BY_LANG[\"ko-KR\"][domain] || [];\n return [...enKeywords, ...koKeywords];\n }\n return enKeywords;\n}\n\nexport function detectCurrentDomain(\n recentTools: string[],\n recentFiles: string[],\n language: Language = \"en-US\",\n): Domain[] {\n const domains: Domain[] = [];\n const context = [...recentTools, ...recentFiles].join(\" \").toLowerCase();\n\n const allDomains: Domain[] = [\n \"code-style\",\n \"testing\",\n \"git\",\n \"debugging\",\n \"file-organization\",\n \"tooling\",\n \"refactoring\",\n \"documentation\",\n ];\n\n for (const domain of allDomains) {\n const keywords = getDomainKeywords(domain, language);\n if (keywords.some((kw) => context.includes(kw))) {\n domains.push(domain);\n }\n }\n\n // Additional heuristics for common patterns\n if (recentTools.some((t) => t.includes(\"test\") || t.includes(\"vitest\") || t.includes(\"ํ…Œ์ŠคํŠธ\"))) {\n if (!domains.includes(\"testing\")) domains.push(\"testing\");\n }\n\n if (recentTools.some((t) => t.includes(\"git\") || t.includes(\"commit\") || t.includes(\"์ปค๋ฐ‹\"))) {\n if (!domains.includes(\"git\")) domains.push(\"git\");\n }\n\n return domains.length > 0 ? domains : [\"other\"];\n}\n\nexport function filterRelevantInstincts(\n instincts: Instinct[],\n currentDomains: Domain[],\n): AppliedInstinct[] {\n const applied: AppliedInstinct[] = [];\n\n for (const instinct of instincts) {\n if (instinct.status !== \"approved\") continue;\n if (instinct.confidence < 0.5) continue;\n\n if (currentDomains.includes(instinct.domain)) {\n applied.push({\n instinct,\n relevance:\n instinct.confidence >= 0.8 ? \"high\" : instinct.confidence >= 0.6 ? \"medium\" : \"low\",\n });\n }\n }\n\n return applied.sort((a, b) => b.instinct.confidence - a.instinct.confidence).slice(0, 3);\n}\n\nexport function formatInstinctSuggestion(\n applied: AppliedInstinct,\n _i18n: MimicContext[\"i18n\"],\n): string {\n const confidenceBar =\n \"โ—\".repeat(Math.round(applied.instinct.confidence * 5)) +\n \"โ—‹\".repeat(5 - Math.round(applied.instinct.confidence * 5));\n\n const sourceTag = applied.instinct.source === \"inherited\" ? \" ๐Ÿ“ฅ\" : \"\";\n\n return `[${confidenceBar}] ${applied.instinct.title}${sourceTag}`;\n}\n\nexport async function getApplicableInstincts(\n ctx: MimicContext,\n recentTools: string[],\n recentFiles: string[],\n): Promise<AppliedInstinct[]> {\n const instincts = await ctx.stateManager.listInstincts();\n const currentDomains = detectCurrentDomain(recentTools, recentFiles, ctx.i18n.language);\n return filterRelevantInstincts(instincts, currentDomains);\n}\n\n/**\n * Build a context string from approved instincts for auto-injection.\n * This simulates Homunculus's instinct-apply skill behavior.\n */\nexport async function buildInstinctContext(ctx: MimicContext): Promise<string | null> {\n const instincts = await ctx.stateManager.listInstincts();\n const approvedInstincts = instincts.filter((i) => i.status === \"approved\" && i.confidence >= 0.6);\n\n if (approvedInstincts.length === 0) {\n return null;\n }\n\n // Group by domain for organized presentation\n const byDomain: Record<string, Instinct[]> = {};\n for (const instinct of approvedInstincts) {\n if (!byDomain[instinct.domain]) {\n byDomain[instinct.domain] = [];\n }\n byDomain[instinct.domain].push(instinct);\n }\n\n const sections: string[] = [\"## Learned Behaviors (Auto-Applied)\"];\n\n for (const [domain, domainInstincts] of Object.entries(byDomain)) {\n const sorted = domainInstincts.sort((a, b) => b.confidence - a.confidence).slice(0, 3);\n sections.push(`\\n### ${domain}`);\n\n for (const instinct of sorted) {\n const confidenceLabel =\n instinct.confidence >= 0.8 ? \"strong\" : instinct.confidence >= 0.6 ? \"moderate\" : \"weak\";\n sections.push(`- **${instinct.title}** (${confidenceLabel}): ${instinct.description}`);\n }\n }\n\n sections.push(\n \"\\n_These behaviors were learned from your patterns. They are auto-applied to help maintain consistency._\",\n );\n\n return sections.join(\"\\n\");\n}\n\n/**\n * Get instincts relevant to the current context (for real-time surfacing)\n */\nexport async function getContextualInstincts(\n ctx: MimicContext,\n tools: string[],\n files: string[],\n): Promise<{ context: string; count: number }> {\n const applicable = await getApplicableInstincts(ctx, tools, files);\n\n if (applicable.length === 0) {\n return { context: \"\", count: 0 };\n }\n\n const lines = applicable.map((a) => formatInstinctSuggestion(a, ctx.i18n));\n\n return {\n context: `**Relevant Instincts:**\\n${lines.join(\"\\n\")}`,\n count: applicable.length,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { readdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Domain, SessionData } from \"@/types\";\nimport { generateId } from \"@/utils/id\";\n\n/**\n * Session context summary for cross-session analysis\n */\nexport interface SessionMemory {\n sessionId: string;\n startTime: string;\n endTime: string;\n durationMs: number;\n summary: {\n toolCalls: number;\n filesEdited: string[];\n dominantDomains: Domain[];\n patterns: string[];\n };\n context: {\n branch?: string;\n focus?: string;\n keyActions: string[];\n };\n}\n\n/**\n * Session pattern detected across multiple sessions\n */\nexport interface CrossSessionPattern {\n id: string;\n type: \"workflow\" | \"time\" | \"focus\" | \"tool-combo\";\n description: string;\n frequency: number;\n confidence: number;\n sessionIds: string[];\n lastSeen: string;\n}\n\nconst MAX_MEMORIES = 50;\nconst RECENT_SESSIONS_FOR_ANALYSIS = 10;\n\n/**\n * Manages session-level memory and cross-session pattern detection.\n * Enables the plugin to learn from session history and identify recurring workflows.\n */\nexport class SessionMemoryManager {\n private readonly memoryPath: string;\n private readonly sessionsDir: string;\n\n constructor(mimicDir: string, sessionsDir: string) {\n this.memoryPath = join(mimicDir, \"session-memory.json\");\n this.sessionsDir = sessionsDir;\n }\n\n /**\n * Load all session memories\n */\n async loadMemories(): Promise<SessionMemory[]> {\n if (!existsSync(this.memoryPath)) {\n return [];\n }\n try {\n const content = await readFile(this.memoryPath, \"utf-8\");\n const data = JSON.parse(content);\n return data.memories || [];\n } catch {\n return [];\n }\n }\n\n /**\n * Save session memories\n */\n async saveMemories(memories: SessionMemory[]): Promise<void> {\n // Keep only the most recent memories\n const trimmed = memories.slice(-MAX_MEMORIES);\n await writeFile(\n this.memoryPath,\n JSON.stringify({ memories: trimmed, updatedAt: new Date().toISOString() }, null, 2),\n \"utf-8\",\n );\n }\n\n /**\n * Create a memory from a completed session\n */\n async createMemory(\n sessionData: SessionData,\n domains: Domain[],\n patterns: string[],\n context: SessionMemory[\"context\"],\n ): Promise<SessionMemory> {\n const memory: SessionMemory = {\n sessionId: sessionData.sessionId,\n startTime: sessionData.startTime,\n endTime: sessionData.endTime,\n durationMs: sessionData.durationMs,\n summary: {\n toolCalls: sessionData.toolCalls,\n filesEdited: sessionData.filesEdited,\n dominantDomains: domains.slice(0, 3) as Domain[],\n patterns,\n },\n context,\n };\n\n const memories = await this.loadMemories();\n memories.push(memory);\n await this.saveMemories(memories);\n\n return memory;\n }\n\n /**\n * Get recent sessions for context\n */\n async getRecentMemories(count: number = RECENT_SESSIONS_FOR_ANALYSIS): Promise<SessionMemory[]> {\n const memories = await this.loadMemories();\n return memories.slice(-count);\n }\n\n /**\n * Load raw session data from session files\n */\n async loadRecentSessions(count: number = RECENT_SESSIONS_FOR_ANALYSIS): Promise<SessionData[]> {\n if (!existsSync(this.sessionsDir)) {\n return [];\n }\n\n const files = await readdir(this.sessionsDir);\n const jsonFiles = files.filter((f) => f.endsWith(\".json\")).slice(-count);\n\n const sessions: SessionData[] = [];\n for (const file of jsonFiles) {\n try {\n const content = await readFile(join(this.sessionsDir, file), \"utf-8\");\n sessions.push(JSON.parse(content));\n } catch {\n // Skip invalid files\n }\n }\n\n return sessions.sort(\n (a, b) => new Date(b.startTime).getTime() - new Date(a.startTime).getTime(),\n );\n }\n\n /**\n * Analyze cross-session patterns\n */\n /**\n * Analyze cross-session patterns\n */\n async analyzeCrossSessionPatterns(): Promise<CrossSessionPattern[]> {\n const memories = await this.getRecentMemories();\n if (memories.length < 3) {\n return [];\n }\n\n const lastSeen = memories[memories.length - 1].endTime;\n const patterns: CrossSessionPattern[] = [\n ...this.detectWorkflowPatterns(memories, lastSeen),\n ...this.detectTimeBasedPatterns(memories, lastSeen),\n ...this.detectFocusPatterns(memories, lastSeen),\n ...this.detectToolCombinationPatterns(memories, lastSeen),\n ];\n\n return patterns.sort((a, b) => b.confidence - a.confidence).slice(0, 10);\n }\n\n private detectWorkflowPatterns(\n memories: SessionMemory[],\n lastSeen: string,\n ): CrossSessionPattern[] {\n const patterns: CrossSessionPattern[] = [];\n const domainSequences = new Map<string, { count: number; sessions: string[] }>();\n\n for (const memory of memories) {\n const key = memory.summary.dominantDomains.join(\" โ†’ \");\n if (key) {\n const existing = domainSequences.get(key) || { count: 0, sessions: [] };\n existing.count++;\n existing.sessions.push(memory.sessionId);\n domainSequences.set(key, existing);\n }\n }\n\n for (const [sequence, data] of domainSequences) {\n if (data.count >= 2) {\n patterns.push({\n id: `workflow-${generateId(8)}`,\n type: \"workflow\",\n description: `Workflow pattern: ${sequence}`,\n frequency: data.count,\n confidence: Math.min(0.9, 0.5 + data.count * 0.1),\n sessionIds: data.sessions,\n lastSeen,\n });\n }\n }\n\n return patterns;\n }\n\n private detectTimeBasedPatterns(\n memories: SessionMemory[],\n lastSeen: string,\n ): CrossSessionPattern[] {\n const patterns: CrossSessionPattern[] = [];\n const hourCounts = new Map<number, { count: number; sessions: string[] }>();\n\n for (const memory of memories) {\n const hour = new Date(memory.startTime).getHours();\n const bucket = Math.floor(hour / 3) * 3; // 3-hour buckets\n const existing = hourCounts.get(bucket) || { count: 0, sessions: [] };\n existing.count++;\n existing.sessions.push(memory.sessionId);\n hourCounts.set(bucket, existing);\n }\n\n for (const [bucket, data] of hourCounts) {\n if (data.count >= 3) {\n const timeLabel = `${bucket}:00-${bucket + 3}:00`;\n patterns.push({\n id: `time-${bucket}`,\n type: \"time\",\n description: `Peak activity window: ${timeLabel}`,\n frequency: data.count,\n confidence: Math.min(0.8, data.count / memories.length),\n sessionIds: data.sessions,\n lastSeen,\n });\n }\n }\n\n return patterns;\n }\n\n private detectFocusPatterns(memories: SessionMemory[], lastSeen: string): CrossSessionPattern[] {\n const patterns: CrossSessionPattern[] = [];\n const focusCounts = new Map<string, { count: number; sessions: string[] }>();\n\n for (const memory of memories) {\n if (memory.context.focus) {\n const existing = focusCounts.get(memory.context.focus) || { count: 0, sessions: [] };\n existing.count++;\n existing.sessions.push(memory.sessionId);\n focusCounts.set(memory.context.focus, existing);\n }\n }\n\n for (const [focus, data] of focusCounts) {\n if (data.count >= 2) {\n patterns.push({\n id: `focus-${generateId(8)}`,\n type: \"focus\",\n description: `Repeated focus: ${focus}`,\n frequency: data.count,\n confidence: Math.min(0.85, 0.5 + data.count * 0.15),\n sessionIds: data.sessions,\n lastSeen,\n });\n }\n }\n\n return patterns;\n }\n\n private detectToolCombinationPatterns(\n memories: SessionMemory[],\n lastSeen: string,\n ): CrossSessionPattern[] {\n const patterns: CrossSessionPattern[] = [];\n const toolCombos = new Map<string, { count: number; sessions: string[] }>();\n\n for (const memory of memories) {\n if (memory.summary.patterns.length >= 2) {\n const key = memory.summary.patterns.slice(0, 3).join(\"+\");\n const existing = toolCombos.get(key) || { count: 0, sessions: [] };\n existing.count++;\n existing.sessions.push(memory.sessionId);\n toolCombos.set(key, existing);\n }\n }\n\n for (const [combo, data] of toolCombos) {\n if (data.count >= 2) {\n patterns.push({\n id: `combo-${generateId(8)}`,\n type: \"tool-combo\",\n description: `Tool combination: ${combo}`,\n frequency: data.count,\n confidence: Math.min(0.8, 0.5 + data.count * 0.1),\n sessionIds: data.sessions,\n lastSeen,\n });\n }\n }\n\n return patterns;\n }\n\n /**\n * Get context summary for the current session\n */\n async getContextSummary(): Promise<string> {\n const memories = await this.getRecentMemories(5);\n if (memories.length === 0) {\n return \"No previous session context available.\";\n }\n\n const parts: string[] = [];\n\n // Last session info\n const last = memories[memories.length - 1];\n const lastDate = new Date(last.endTime);\n const hoursAgo = Math.round((Date.now() - lastDate.getTime()) / (1000 * 60 * 60));\n parts.push(`Last session: ${hoursAgo}h ago, ${last.summary.toolCalls} tool calls`);\n\n // Dominant domains\n const allDomains = memories.flatMap((m) => m.summary.dominantDomains);\n const domainCounts = new Map<string, number>();\n for (const d of allDomains) {\n domainCounts.set(d, (domainCounts.get(d) || 0) + 1);\n }\n const topDomains = [...domainCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3)\n .map(([d]) => d);\n if (topDomains.length > 0) {\n parts.push(`Focus areas: ${topDomains.join(\", \")}`);\n }\n\n // Recent patterns\n const crossPatterns = await this.analyzeCrossSessionPatterns();\n if (crossPatterns.length > 0) {\n const topPattern = crossPatterns[0];\n parts.push(`Notable pattern: ${topPattern.description} (${topPattern.frequency}x)`);\n }\n\n return parts.join(\"\\n\");\n }\n\n /**\n * Get session continuity hints for the AI\n */\n async getContinuityHints(): Promise<string[]> {\n const memories = await this.getRecentMemories(3);\n const hints: string[] = [];\n\n if (memories.length === 0) {\n return hints;\n }\n\n const last = memories[memories.length - 1];\n\n // Suggest continuing work on recently edited files\n if (last.summary.filesEdited.length > 0) {\n const recentFiles = last.summary.filesEdited.slice(0, 3);\n hints.push(`Recent files: ${recentFiles.map((f) => f.split(\"/\").pop()).join(\", \")}`);\n }\n\n // Suggest based on focus\n if (last.context.focus) {\n hints.push(`Previous focus: ${last.context.focus}`);\n }\n\n // Check for unfinished work patterns\n if (last.durationMs < 5 * 60 * 1000 && last.summary.toolCalls < 5) {\n hints.push(\"Previous session was brief - may have unfinished work\");\n }\n\n return hints;\n }\n}\n\n/**\n * Detect dominant domains from tool calls\n */\nexport function detectDomainsFromTools(tools: string[]): Domain[] {\n const domainScores = new Map<Domain, number>();\n\n const toolDomainMap: Record<string, Domain> = {\n // Testing\n vitest: \"testing\",\n jest: \"testing\",\n test: \"testing\",\n // Git\n git: \"git\",\n commit: \"git\",\n push: \"git\",\n // Debugging\n debug: \"debugging\",\n log: \"debugging\",\n trace: \"debugging\",\n // File organization\n mkdir: \"file-organization\",\n mv: \"file-organization\",\n rename: \"file-organization\",\n // Tooling\n npm: \"tooling\",\n pnpm: \"tooling\",\n yarn: \"tooling\",\n // Refactoring\n refactor: \"refactoring\",\n extract: \"refactoring\",\n // Documentation\n doc: \"documentation\",\n readme: \"documentation\",\n // Code style\n lint: \"code-style\",\n format: \"code-style\",\n prettier: \"code-style\",\n eslint: \"code-style\",\n biome: \"code-style\",\n };\n\n for (const tool of tools) {\n const lower = tool.toLowerCase();\n for (const [keyword, domain] of Object.entries(toolDomainMap)) {\n if (lower.includes(keyword)) {\n domainScores.set(domain, (domainScores.get(domain) || 0) + 1);\n }\n }\n }\n\n return [...domainScores.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3)\n .map(([d]) => d);\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { MimicContext } from \"@/core/context\";\nimport type { Domain, EvolvedCapability, Instinct, Pattern } from \"@/types\";\n\n/**\n * Skill metadata for declarative skill definition\n */\nexport interface SkillMetadata {\n name: string;\n description: string;\n trigger: \"auto\" | \"manual\" | \"scheduled\";\n domain: Domain;\n tools?: Record<string, boolean>;\n}\n\n/**\n * Generated skill output\n */\nexport interface GeneratedSkill {\n name: string;\n path: string;\n metadata: SkillMetadata;\n content: string;\n}\n\n/**\n * Generates declarative markdown-based skills from learned instincts.\n * Skills are saved to .opencode/skills/{name}/SKILL.md format.\n */\nexport class SkillGenerator {\n private readonly skillsDir: string;\n\n constructor(directory: string) {\n this.skillsDir = join(directory, \".opencode\", \"skills\");\n }\n\n /**\n * Initialize skills directory\n */\n async initialize(): Promise<void> {\n if (!existsSync(this.skillsDir)) {\n await mkdir(this.skillsDir, { recursive: true });\n }\n }\n\n /**\n * Generate a skill from a cluster of instincts\n */\n async generateSkill(\n name: string,\n description: string,\n domain: Domain,\n instincts: Instinct[],\n patterns: Pattern[],\n ): Promise<GeneratedSkill> {\n const skillDir = join(this.skillsDir, name);\n if (!existsSync(skillDir)) {\n await mkdir(skillDir, { recursive: true });\n }\n\n const metadata: SkillMetadata = {\n name,\n description,\n trigger: \"auto\",\n domain,\n tools: this.inferTools(patterns),\n };\n\n const content = this.generateSkillMarkdown(metadata, instincts, patterns);\n const skillPath = join(skillDir, \"SKILL.md\");\n\n await writeFile(skillPath, content, \"utf-8\");\n\n return {\n name,\n path: skillPath,\n metadata,\n content,\n };\n }\n\n /**\n * Generate markdown content for a skill\n */\n private generateSkillMarkdown(\n metadata: SkillMetadata,\n instincts: Instinct[],\n patterns: Pattern[],\n ): string {\n const toolsYaml = metadata.tools\n ? Object.entries(metadata.tools)\n .map(([tool, enabled]) => ` ${tool}: ${enabled}`)\n .join(\"\\n\")\n : \" # No specific tools defined\";\n\n const instinctsList = instincts\n .slice(0, 10)\n .map(\n (i) =>\n `- **${i.title}** (${Math.round(i.confidence * 100)}% confidence)\\n ${i.description}`,\n )\n .join(\"\\n\");\n\n const patternsList = patterns\n .slice(0, 5)\n .map((p) => `- ${p.type}: ${p.description} (${p.count}x observed)`)\n .join(\"\\n\");\n\n const now = new Date().toISOString();\n\n return `---\nname: ${metadata.name}\ndescription: ${metadata.description}\ntrigger: ${metadata.trigger}\ndomain: ${metadata.domain}\ntools:\n${toolsYaml}\ngenerated: ${now}\n---\n\n# ${metadata.name}\n\n${metadata.description}\n\n> [!NOTE]\n> This skill was auto-generated by Mimic based on observed patterns and learned instincts.\n\n## Overview\n\nThis skill encapsulates learned behaviors from repeated usage patterns in the **${metadata.domain}** domain.\n\n## Learned Behaviors\n\n${instinctsList || \"No instincts documented yet.\"}\n\n## Observed Patterns\n\n${patternsList || \"No patterns documented yet.\"}\n\n## Usage Guidelines\n\n### When to Apply\n\nThis skill should be activated when:\n${this.generateUsageConditions(metadata.domain, patterns)}\n\n### Best Practices\n\n${this.generateBestPractices(metadata.domain, instincts)}\n\n## Context\n\n- **Domain**: ${metadata.domain}\n- **Generated**: ${now}\n- **Instincts Used**: ${instincts.length}\n- **Patterns Analyzed**: ${patterns.length}\n\n## Customization\n\nYou can customize this skill by editing the frontmatter or adding additional sections below.\n\n---\n\n*Generated by [opencode-plugin-mimic](https://github.com/gracefullight/pkgs)*\n`;\n }\n\n /**\n * Generate usage conditions based on domain and patterns\n */\n private generateUsageConditions(domain: Domain, patterns: Pattern[]): string {\n const conditions: string[] = [];\n\n switch (domain) {\n case \"testing\":\n conditions.push(\"- Working with test files (*.test.ts, *.spec.ts)\");\n conditions.push(\"- Running test suites or debugging test failures\");\n break;\n case \"git\":\n conditions.push(\"- Preparing commits or managing branches\");\n conditions.push(\"- Reviewing code changes before push\");\n break;\n case \"debugging\":\n conditions.push(\"- Investigating errors or unexpected behavior\");\n conditions.push(\"- Adding logging or tracing code\");\n break;\n case \"code-style\":\n conditions.push(\"- Formatting or linting code\");\n conditions.push(\"- Enforcing coding conventions\");\n break;\n case \"refactoring\":\n conditions.push(\"- Restructuring code without changing behavior\");\n conditions.push(\"- Extracting functions or classes\");\n break;\n case \"documentation\":\n conditions.push(\"- Writing or updating documentation\");\n conditions.push(\"- Adding code comments or JSDoc\");\n break;\n case \"file-organization\":\n conditions.push(\"- Moving or renaming files\");\n conditions.push(\"- Organizing project structure\");\n break;\n case \"tooling\":\n conditions.push(\"- Configuring build tools or scripts\");\n conditions.push(\"- Managing dependencies\");\n break;\n default:\n conditions.push(\"- General development tasks\");\n }\n\n // Add pattern-specific conditions\n for (const pattern of patterns.slice(0, 3)) {\n if (pattern.type === \"sequence\") {\n conditions.push(`- Executing workflow: ${pattern.description}`);\n } else if (pattern.type === \"file\") {\n conditions.push(`- Working with: ${pattern.description}`);\n }\n }\n\n return conditions.join(\"\\n\");\n }\n\n /**\n * Generate best practices from instincts\n */\n private generateBestPractices(domain: Domain, instincts: Instinct[]): string {\n const practices: string[] = [];\n\n // Add instinct-based practices\n for (const instinct of instincts.filter((i) => i.confidence >= 0.7).slice(0, 5)) {\n practices.push(`1. ${instinct.title}`);\n }\n\n // Add domain-specific defaults if no instincts\n if (practices.length === 0) {\n switch (domain) {\n case \"testing\":\n practices.push(\"1. Write tests before implementation (TDD)\");\n practices.push(\"2. Ensure high test coverage for critical paths\");\n break;\n case \"git\":\n practices.push(\"1. Write clear, conventional commit messages\");\n practices.push(\"2. Review changes before committing\");\n break;\n case \"code-style\":\n practices.push(\"1. Follow established project conventions\");\n practices.push(\"2. Run linters before committing\");\n break;\n default:\n practices.push(\"1. Follow project conventions\");\n practices.push(\"2. Document significant changes\");\n }\n }\n\n return practices.join(\"\\n\");\n }\n\n /**\n * Infer required tools from patterns\n */\n private inferTools(patterns: Pattern[]): Record<string, boolean> {\n const tools: Record<string, boolean> = {\n read: true,\n glob: true,\n grep: true,\n };\n\n for (const pattern of patterns) {\n const desc = pattern.description.toLowerCase();\n\n if (desc.includes(\"edit\") || desc.includes(\"write\") || desc.includes(\"modify\")) {\n tools.edit = true;\n }\n if (\n desc.includes(\"bash\") ||\n desc.includes(\"shell\") ||\n desc.includes(\"npm\") ||\n desc.includes(\"pnpm\")\n ) {\n tools.bash = true;\n }\n if (desc.includes(\"test\") || desc.includes(\"vitest\") || desc.includes(\"jest\")) {\n tools.bash = true;\n }\n }\n\n return tools;\n }\n\n /**\n * Generate skill from an evolved capability\n */\n async fromCapability(\n ctx: MimicContext,\n capability: EvolvedCapability,\n ): Promise<GeneratedSkill | null> {\n const state = await ctx.stateManager.read();\n const instincts = await ctx.stateManager.listInstincts();\n\n // Find related pattern\n const pattern = state.patterns.find((p) => p.id === capability.fromPattern);\n if (!pattern) {\n return null;\n }\n\n // Find related instincts by domain\n const domainInstincts = instincts.filter((i) => {\n if (i.evidence.patternIDs.includes(pattern.id)) return true;\n return false;\n });\n\n // Determine domain\n const domain = domainInstincts[0]?.domain || \"other\";\n\n return this.generateSkill(capability.name, capability.description, domain, domainInstincts, [\n pattern,\n ]);\n }\n\n /**\n * Generate skills for all eligible domains\n */\n async generateAllEligibleSkills(ctx: MimicContext): Promise<GeneratedSkill[]> {\n const instincts = await ctx.stateManager.listInstincts();\n const state = await ctx.stateManager.read();\n const skills: GeneratedSkill[] = [];\n\n // Group instincts by domain\n const byDomain = new Map<Domain, Instinct[]>();\n for (const instinct of instincts) {\n if (instinct.status !== \"approved\" || instinct.confidence < 0.6) continue;\n const list = byDomain.get(instinct.domain) || [];\n list.push(instinct);\n byDomain.set(instinct.domain, list);\n }\n\n // Generate skills for domains with 5+ instincts\n for (const [domain, domainInstincts] of byDomain) {\n if (domainInstincts.length < 5) continue;\n\n const name = `${domain}-specialist`;\n const description = ctx.i18n.t(\"skill.domain_description\", { domain });\n\n // Get related patterns\n const patternIds = new Set(domainInstincts.flatMap((i) => i.evidence.patternIDs));\n const patterns = state.patterns.filter((p) => patternIds.has(p.id));\n\n try {\n const skill = await this.generateSkill(\n name,\n description,\n domain,\n domainInstincts,\n patterns,\n );\n skills.push(skill);\n } catch {\n // Skip failed skill generations\n }\n }\n\n return skills;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { appendFile, mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { generateId } from \"@/utils/id\";\n\n/**\n * Observation types for JSONL logging\n */\nexport type ObservationType =\n | \"tool.call\"\n | \"message.user\"\n | \"message.assistant\"\n | \"session.start\"\n | \"session.end\"\n | \"file.edit\"\n | \"command\"\n | \"vcs.branch\"\n | \"pattern.detected\"\n | \"instinct.created\"\n | \"evolution.triggered\";\n\nexport interface ObservationEntry {\n id: string;\n type: ObservationType;\n timestamp: string;\n sessionId?: string;\n data: Record<string, unknown>;\n}\n\nexport interface ObservationQuery {\n types?: ObservationType[];\n startDate?: Date;\n endDate?: Date;\n sessionId?: string;\n limit?: number;\n}\n\nconst ARCHIVE_THRESHOLD = 5 * 1024 * 1024; // 5MB\n\n/**\n * Manages JSONL-based observation logging for the Mimic plugin.\n * Provides real-time event capture and historical query capabilities.\n */\nexport class ObservationLog {\n private readonly logPath: string;\n private readonly archiveDir: string;\n\n constructor(mimicDir: string) {\n this.logPath = join(mimicDir, \"observations.jsonl\");\n this.archiveDir = join(mimicDir, \"archives\");\n }\n\n /**\n * Initialize the observation log directory structure\n */\n async initialize(): Promise<void> {\n const dir = join(this.logPath, \"..\");\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n if (!existsSync(this.archiveDir)) {\n await mkdir(this.archiveDir, { recursive: true });\n }\n }\n\n /**\n * Append a new observation entry to the log\n */\n async append(entry: Omit<ObservationEntry, \"id\" | \"timestamp\">): Promise<ObservationEntry> {\n const fullEntry: ObservationEntry = {\n id: generateId(),\n timestamp: new Date().toISOString(),\n ...entry,\n };\n\n const line = `${JSON.stringify(fullEntry)}\\n`;\n await appendFile(this.logPath, line, \"utf-8\");\n\n // Check if rotation is needed\n await this.maybeRotate();\n\n return fullEntry;\n }\n\n /**\n * Log a tool call observation\n */\n async logToolCall(\n tool: string,\n callId: string,\n sessionId: string,\n args?: Record<string, unknown>,\n ): Promise<ObservationEntry> {\n return this.append({\n type: \"tool.call\",\n sessionId,\n data: { tool, callId, args },\n });\n }\n\n /**\n * Log a user message observation\n */\n async logUserMessage(\n sessionId: string,\n messageId: string,\n textPreview?: string,\n ): Promise<ObservationEntry> {\n return this.append({\n type: \"message.user\",\n sessionId,\n data: {\n messageId,\n // Only store first 200 chars to avoid storing sensitive data\n textPreview: textPreview?.slice(0, 200),\n },\n });\n }\n\n /**\n * Log an assistant message observation\n */\n async logAssistantMessage(\n sessionId: string,\n messageId: string,\n tokensUsed?: number,\n ): Promise<ObservationEntry> {\n return this.append({\n type: \"message.assistant\",\n sessionId,\n data: { messageId, tokensUsed },\n });\n }\n\n /**\n * Log a file edit observation\n */\n async logFileEdit(file: string, sessionId?: string): Promise<ObservationEntry> {\n return this.append({\n type: \"file.edit\",\n sessionId,\n data: { file, extension: file.split(\".\").pop() },\n });\n }\n\n /**\n * Log a command execution observation\n */\n async logCommand(command: string, sessionId: string, args?: string): Promise<ObservationEntry> {\n return this.append({\n type: \"command\",\n sessionId,\n data: { command, args },\n });\n }\n\n /**\n * Log a VCS branch change observation\n */\n async logBranchChange(branch: string | undefined): Promise<ObservationEntry> {\n return this.append({\n type: \"vcs.branch\",\n data: { branch },\n });\n }\n\n /**\n * Log a session start observation\n */\n async logSessionStart(sessionId: string): Promise<ObservationEntry> {\n return this.append({\n type: \"session.start\",\n sessionId,\n data: {},\n });\n }\n\n /**\n * Log a session end observation\n */\n async logSessionEnd(\n sessionId: string,\n durationMs: number,\n toolCallCount: number,\n ): Promise<ObservationEntry> {\n return this.append({\n type: \"session.end\",\n sessionId,\n data: { durationMs, toolCallCount },\n });\n }\n\n /**\n * Query observations with filters\n */\n async query(options: ObservationQuery = {}): Promise<ObservationEntry[]> {\n if (!existsSync(this.logPath)) {\n return [];\n }\n\n const content = await readFile(this.logPath, \"utf-8\");\n const lines = content.trim().split(\"\\n\").filter(Boolean);\n let entries: ObservationEntry[] = [];\n\n for (const line of lines) {\n try {\n const entry = JSON.parse(line) as ObservationEntry;\n entries.push(entry);\n } catch {\n // Skip malformed lines\n }\n }\n\n // Apply filters\n const filterTypes = options.types;\n if (filterTypes && filterTypes.length > 0) {\n entries = entries.filter((e) => filterTypes.includes(e.type));\n }\n\n if (options.sessionId) {\n entries = entries.filter((e) => e.sessionId === options.sessionId);\n }\n\n if (options.startDate) {\n const start = options.startDate.getTime();\n entries = entries.filter((e) => new Date(e.timestamp).getTime() >= start);\n }\n\n if (options.endDate) {\n const end = options.endDate.getTime();\n entries = entries.filter((e) => new Date(e.timestamp).getTime() <= end);\n }\n\n // Sort by timestamp descending (most recent first)\n entries.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n\n if (options.limit && options.limit > 0) {\n entries = entries.slice(0, options.limit);\n }\n\n return entries;\n }\n\n /**\n * Get observations from the last N days\n */\n async getRecentObservations(\n days: number,\n types?: ObservationType[],\n ): Promise<ObservationEntry[]> {\n const startDate = new Date();\n startDate.setDate(startDate.getDate() - days);\n return this.query({ startDate, types });\n }\n\n /**\n * Get observation count by type\n */\n async getStats(): Promise<Record<ObservationType, number>> {\n const entries = await this.query();\n const stats: Record<string, number> = {};\n\n for (const entry of entries) {\n stats[entry.type] = (stats[entry.type] || 0) + 1;\n }\n\n return stats as Record<ObservationType, number>;\n }\n\n /**\n * Check and rotate log file if it exceeds threshold\n */\n private async maybeRotate(): Promise<boolean> {\n if (!existsSync(this.logPath)) {\n return false;\n }\n\n const stats = await stat(this.logPath);\n if (stats.size < ARCHIVE_THRESHOLD) {\n return false;\n }\n\n // Create archive with timestamp\n const archiveName = `observations-${new Date().toISOString().replace(/[:.]/g, \"-\")}.jsonl`;\n const archivePath = join(this.archiveDir, archiveName);\n\n const content = await readFile(this.logPath, \"utf-8\");\n await writeFile(archivePath, content, \"utf-8\");\n\n // Clear current log\n await writeFile(this.logPath, \"\", \"utf-8\");\n\n return true;\n }\n\n /**\n * Prune old observations (keep last N days)\n */\n async prune(keepDays: number): Promise<number> {\n const entries = await this.query();\n const cutoff = new Date();\n cutoff.setDate(cutoff.getDate() - keepDays);\n const cutoffTime = cutoff.getTime();\n\n const keep = entries.filter((e) => new Date(e.timestamp).getTime() >= cutoffTime);\n const pruned = entries.length - keep.length;\n\n if (pruned > 0) {\n const content = `${keep.map((e) => JSON.stringify(e)).join(\"\\n\")}\\n`;\n await writeFile(this.logPath, content, \"utf-8\");\n }\n\n return pruned;\n }\n\n /**\n * Get the current log file size in bytes\n */\n async getLogSize(): Promise<number> {\n if (!existsSync(this.logPath)) {\n return 0;\n }\n const stats = await stat(this.logPath);\n return stats.size;\n }\n}\n","import type { MimicContext } from \"@/core/context\";\nimport { loadMimicConfig, type MimicUserConfig } from \"@/lib/i18n\";\nimport { normalizeDomain } from \"@/modules/knowledge/instincts\";\nimport { ObservationLog } from \"@/modules/observation/log\";\nimport type { Instinct, Pattern, SessionData } from \"@/types\";\nimport { generateDeterministicId } from \"@/utils/id\";\n\nconst MAX_INSTINCTS_PER_RUN = 5;\nconst OBSERVER_COOLDOWN_MS = 10 * 60 * 1000; // 10 minutes\n\nconst DEFAULT_OBSERVER_MODEL = \"opencode/glm-4.7-free\";\nconst DEFAULT_OBSERVER_PROVIDER = \"opencode\";\n\ninterface ObserverInput {\n patterns: Pattern[];\n recentSessions: SessionData[];\n observations: string[];\n statistics: {\n totalSessions: number;\n totalToolCalls: number;\n topFiles: [string, number][];\n };\n}\n\ninterface RawInstinct {\n title: string;\n description: string;\n domain: string;\n confidence: number;\n patternIDs: string[];\n}\n\n/**\n * Build the prompt for LLM-based pattern analysis\n */\nfunction buildObserverPrompt(input: ObserverInput): string {\n const patternsSummary = input.patterns\n .slice(0, 20)\n .map((p) => `- [${p.type}] ${p.description} (${p.count}x, surfaced: ${p.surfaced})`)\n .join(\"\\n\");\n\n const observationsSummary = input.observations.slice(0, 50).join(\"\\n\");\n\n const filesSummary = input.statistics.topFiles\n .slice(0, 10)\n .map(([file, count]) => `- ${file}: ${count}x`)\n .join(\"\\n\");\n\n return `You are an observer agent that analyzes developer behavior patterns to create \"instincts\" - learned behaviors that can help automate workflows.\n\n## Current Data\n\n### Patterns (${input.patterns.length} total)\n${patternsSummary || \"No patterns detected yet.\"}\n\n### Recent Observations (${input.observations.length} total)\n${observationsSummary || \"No observations yet.\"}\n\n### Statistics\n- Total sessions: ${input.statistics.totalSessions}\n- Total tool calls: ${input.statistics.totalToolCalls}\n\n### Most Modified Files\n${filesSummary || \"No file modifications recorded.\"}\n\n## Your Task\n\nAnalyze the patterns and observations to identify 1-5 behavioral \"instincts\" the developer has. Look for:\n\n1. **Repeated Sequences**: Same tools used in order 3+ times\n2. **Preferences**: Certain tools always chosen over alternatives\n3. **Code Style Patterns**: Consistent patterns in file modifications\n4. **Workflow Patterns**: Common sequences of actions\n5. **Testing Habits**: How tests are written/run\n6. **Git Patterns**: Commit message styles, branching habits\n\n## Output Format\n\nReturn a JSON array of instincts. Each instinct should have:\n- title: Short descriptive name (max 50 chars)\n- description: What this instinct represents (max 200 chars)\n- domain: One of: code-style, testing, git, debugging, file-organization, tooling, refactoring, documentation, other\n- confidence: 0.3-0.9 based on evidence strength\n- patternIDs: Array of pattern IDs that support this instinct\n\nExample output:\n\\`\\`\\`json\n[\n {\n \"title\": \"Prefers vitest for testing\",\n \"description\": \"Consistently uses vitest over jest for running tests, with watch mode preferred\",\n \"domain\": \"testing\",\n \"confidence\": 0.75,\n \"patternIDs\": [\"abc123\", \"def456\"]\n }\n]\n\\`\\`\\`\n\nIMPORTANT:\n- Only return the JSON array, no other text\n- Minimum 3 occurrences for behavioral instincts\n- Keep confidence calibrated - don't overstate\n- Avoid duplicating obvious patterns\n- Focus on actionable insights\n\nReturn your analysis:`;\n}\n\n/**\n * Parse LLM response into raw instincts\n */\nfunction parseInstinctsFromResponse(response: string): RawInstinct[] {\n try {\n // Extract JSON from response (may have markdown code blocks)\n const jsonMatch = response.match(/```json\\s*([\\s\\S]*?)\\s*```/) || response.match(/\\[[\\s\\S]*\\]/);\n\n if (!jsonMatch) {\n return [];\n }\n\n const jsonStr = jsonMatch[1] || jsonMatch[0];\n const parsed = JSON.parse(jsonStr);\n\n if (!Array.isArray(parsed)) {\n return [];\n }\n\n return parsed\n .filter(\n (item): item is RawInstinct =>\n typeof item.title === \"string\" &&\n typeof item.description === \"string\" &&\n typeof item.domain === \"string\" &&\n typeof item.confidence === \"number\",\n )\n .map((item) => ({\n ...item,\n patternIDs: Array.isArray(item.patternIDs) ? item.patternIDs : [],\n confidence: Math.min(0.9, Math.max(0.3, item.confidence)),\n }))\n .slice(0, MAX_INSTINCTS_PER_RUN);\n } catch {\n return [];\n }\n}\n\n/**\n * Heuristic-based pattern analysis (fallback when LLM not available)\n */\n/**\n * Heuristic-based pattern analysis (fallback when LLM not available)\n */\nfunction analyzePatterns(input: ObserverInput): RawInstinct[] {\n const instincts: RawInstinct[] = [\n ...extractToolInstincts(input.patterns),\n ...extractFileInstincts(input.patterns),\n ...extractCommitInstincts(input.patterns),\n ...extractSequenceInstincts(input.patterns),\n ...extractHotspotInstincts(input.statistics.topFiles),\n ];\n\n return instincts.slice(0, MAX_INSTINCTS_PER_RUN);\n}\n\nfunction extractToolInstincts(patterns: Pattern[]): RawInstinct[] {\n const toolPatterns = patterns.filter((p) => p.type === \"tool\" && p.count >= 5);\n if (toolPatterns.length < 3) return [];\n\n const topTools = toolPatterns\n .sort((a, b) => b.count - a.count)\n .slice(0, 5)\n .map((p) => p.description);\n\n return [\n {\n title: `Preferred tools: ${topTools.slice(0, 3).join(\", \")}`,\n description: `Frequently uses ${topTools.join(\", \")} based on ${toolPatterns.reduce((sum, p) => sum + p.count, 0)} observations`,\n domain: \"tooling\",\n confidence: Math.min(0.9, 0.5 + toolPatterns.length * 0.1),\n patternIDs: toolPatterns.map((p) => p.id),\n },\n ];\n}\n\nfunction extractFileInstincts(patterns: Pattern[]): RawInstinct[] {\n const filePatterns = patterns.filter((p) => p.type === \"file\" && p.count >= 5);\n if (filePatterns.length < 2) return [];\n\n const extensions = new Set<string>();\n for (const p of filePatterns) {\n const ext = p.description.split(\".\").pop();\n if (ext) extensions.add(ext);\n }\n\n return [\n {\n title: `Focus on ${Array.from(extensions).slice(0, 3).join(\", \")} files`,\n description: `Frequently modifies files with extensions: ${Array.from(extensions).join(\", \")}`,\n domain: \"file-organization\",\n confidence: Math.min(0.85, 0.5 + filePatterns.length * 0.08),\n patternIDs: filePatterns.map((p) => p.id),\n },\n ];\n}\n\nfunction extractCommitInstincts(patterns: Pattern[]): RawInstinct[] {\n const commitPatterns = patterns.filter((p) => p.type === \"commit\" && p.count >= 3);\n if (commitPatterns.length < 2) return [];\n\n const prefixes = commitPatterns\n .map((p) => p.description.split(\":\")[0] || p.description.split(\" \")[0])\n .filter(Boolean);\n\n const uniquePrefixes = [...new Set(prefixes)];\n if (uniquePrefixes.length === 0) return [];\n\n return [\n {\n title: `Commit style: ${uniquePrefixes.slice(0, 3).join(\", \")}`,\n description: `Uses commit message patterns like: ${uniquePrefixes.join(\", \")}`,\n domain: \"git\",\n confidence: Math.min(0.8, 0.5 + commitPatterns.length * 0.1),\n patternIDs: commitPatterns.map((p) => p.id),\n },\n ];\n}\n\nfunction extractSequenceInstincts(patterns: Pattern[]): RawInstinct[] {\n const sequencePatterns = patterns.filter((p) => p.type === \"sequence\" && p.count >= 3);\n const instincts: RawInstinct[] = [];\n\n for (const seq of sequencePatterns.slice(0, 2)) {\n let domain = \"tooling\";\n const desc = seq.description.toLowerCase();\n if (desc.includes(\"test\")) domain = \"testing\";\n else if (desc.includes(\"debug\") || desc.includes(\"error\")) domain = \"debugging\";\n else if (desc.includes(\"refactor\")) domain = \"refactoring\";\n\n instincts.push({\n title: `Workflow: ${seq.description}`,\n description: `Repeats sequence \"${seq.description}\" (${seq.count}x observed)`,\n domain,\n confidence: Math.min(0.85, 0.5 + seq.count * 0.05),\n patternIDs: [seq.id],\n });\n }\n\n return instincts;\n}\n\nfunction extractHotspotInstincts(topFiles: [string, number][]): RawInstinct[] {\n if (topFiles.length < 3) return [];\n\n const hotspots = topFiles.slice(0, 5);\n const totalMods = hotspots.reduce((sum, [, count]) => sum + count, 0);\n\n if (totalMods < 10) return [];\n\n return [\n {\n title: \"Hotspot files identified\",\n description: `Frequently modified files: ${hotspots.map(([f]) => f.split(\"/\").pop()).join(\", \")}`,\n domain: \"file-organization\",\n confidence: Math.min(0.75, 0.4 + totalMods * 0.02),\n patternIDs: [],\n },\n ];\n}\n\n/**\n * Run LLM-based pattern analysis\n */\nasync function analyzePatternsWithLLM(\n ctx: MimicContext,\n input: ObserverInput,\n config: MimicUserConfig,\n): Promise<RawInstinct[]> {\n if (!ctx.client) {\n return analyzePatterns(input);\n }\n\n const observerConfig = \"observer\" in config ? config.observer : undefined;\n const modelId = observerConfig?.model || DEFAULT_OBSERVER_MODEL;\n // Extract provider from model ID (e.g., \"anthropic/claude-3-haiku\" -> \"anthropic\")\n const providerId = observerConfig?.provider || modelId.split(\"/\")[0] || DEFAULT_OBSERVER_PROVIDER;\n\n try {\n const prompt = buildObserverPrompt(input);\n\n // Create a temporary session for analysis\n const session = await ctx.client.session.create({\n body: { title: \"Mimic Observer Analysis\" },\n });\n\n if (!session.data?.id) {\n return analyzePatterns(input);\n }\n\n // Send the analysis prompt using session.prompt\n const response = await ctx.client.session.prompt({\n path: { id: session.data.id },\n body: {\n model: {\n providerID: providerId,\n modelID: modelId,\n },\n parts: [{ type: \"text\" as const, text: prompt }],\n },\n });\n\n // Extract text from response parts\n const responseParts = response.data?.parts || [];\n let responseText = \"\";\n for (const part of responseParts) {\n if (\"text\" in part && typeof part.text === \"string\") {\n responseText = part.text;\n break;\n }\n }\n\n if (!responseText) {\n // Delete the temporary session\n await ctx.client.session.delete({ path: { id: session.data.id } }).catch(() => {});\n return analyzePatterns(input);\n }\n\n const llmInstincts = parseInstinctsFromResponse(responseText);\n\n // Delete the temporary session\n await ctx.client.session.delete({ path: { id: session.data.id } }).catch(() => {});\n\n return llmInstincts.length > 0 ? llmInstincts : analyzePatterns(input);\n } catch {\n // Fallback to heuristic analysis on any LLM error\n return analyzePatterns(input);\n }\n}\n\nexport async function shouldRunObserver(ctx: MimicContext): Promise<boolean> {\n const state = await ctx.stateManager.read();\n\n if (!state.preferences.learningEnabled) {\n return false;\n }\n\n if (!state.evolution.lastObserverRun) {\n return true;\n }\n\n const lastRun = new Date(state.evolution.lastObserverRun).getTime();\n const now = Date.now();\n\n return now - lastRun >= OBSERVER_COOLDOWN_MS;\n}\n\nexport async function runObserver(ctx: MimicContext): Promise<Instinct[]> {\n const state = await ctx.stateManager.read();\n const config = await loadMimicConfig().catch(() => ({}));\n const newInstincts: Instinct[] = [];\n\n const recentPatterns = state.patterns.filter((p) => {\n const age = Date.now() - p.lastSeen;\n return age < 7 * 24 * 60 * 60 * 1000; // 7 days\n });\n\n if (recentPatterns.length === 0) {\n state.evolution.lastObserverRun = new Date().toISOString();\n await ctx.stateManager.save(state);\n return [];\n }\n\n // Load recent observations from JSONL\n const mimicDir = ctx.stateManager.getInstinctsDir().replace(\"/instincts\", \"\");\n const observationLog = new ObservationLog(mimicDir);\n const recentObs = await observationLog.getRecentObservations(7);\n const observations = recentObs.map((o) => `[${o.type}] ${JSON.stringify(o.data)}`);\n\n const topFiles = Object.entries(state.statistics.filesModified)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 10) as [string, number][];\n\n const input: ObserverInput = {\n patterns: recentPatterns,\n recentSessions: [],\n observations,\n statistics: {\n totalSessions: state.statistics.totalSessions,\n totalToolCalls: state.statistics.totalToolCalls,\n topFiles,\n },\n };\n\n // Use LLM if enabled, otherwise fall back to heuristics\n const observerCfg = \"observer\" in config ? config.observer : undefined;\n const useLLM = observerCfg?.enabled !== false && (observerCfg?.model || ctx.client);\n const rawInstincts = useLLM\n ? await analyzePatternsWithLLM(ctx, input, config)\n : analyzePatterns(input);\n\n for (const raw of rawInstincts) {\n const domain = normalizeDomain(raw.domain);\n const id = generateDeterministicId(domain, raw.title);\n\n if (await ctx.stateManager.hasInstinct(id)) {\n continue;\n }\n\n const instinct: Instinct = {\n id,\n title: raw.title,\n description: raw.description,\n domain,\n confidence: raw.confidence,\n status: \"approved\",\n source: \"personal\",\n createdAt: new Date().toISOString(),\n evidence: {\n patternIDs: raw.patternIDs,\n },\n };\n\n await ctx.stateManager.writeInstinct(instinct);\n newInstincts.push(instinct);\n }\n\n state.evolution.lastObserverRun = new Date().toISOString();\n await ctx.stateManager.save(state);\n\n return newInstincts;\n}\n","import { execSync } from \"node:child_process\";\n\nexport function getGitHistory(directory: string, limit = 50): string[] {\n try {\n const result = execSync(`git log --oneline -n ${limit}`, {\n cwd: directory,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return result.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function getRecentlyModifiedFiles(directory: string): string[] {\n try {\n const result = execSync(\n \"git diff --name-only HEAD~10 HEAD 2>/dev/null || git diff --name-only\",\n {\n cwd: directory,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n },\n );\n return result.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function getCommitMessages(directory: string, limit = 20): string[] {\n try {\n const result = execSync(`git log --format=%s -n ${limit}`, {\n cwd: directory,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return result.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function detectCommitPatterns(messages: string[]): Map<string, number> {\n const patterns = new Map<string, number>();\n for (const msg of messages) {\n const normalized = msg.toLowerCase().replace(/\\s+/g, \" \").trim();\n patterns.set(normalized, (patterns.get(normalized) || 0) + 1);\n }\n return patterns;\n}\n","import type { MimicContext } from \"@/core/context\";\nimport { detectCommitPatterns, getCommitMessages } from \"@/lib/git\";\nimport type { Pattern } from \"@/types\";\nimport { generateId } from \"@/utils/id\";\n\nexport async function detectPatterns(ctx: MimicContext): Promise<Pattern[]> {\n const state = await ctx.stateManager.read();\n const newPatterns: Pattern[] = [];\n\n const commitMessages = getCommitMessages(ctx.directory);\n const commitPatterns = detectCommitPatterns(commitMessages);\n for (const [msg, count] of commitPatterns) {\n if (count >= 3) {\n const existing = state.patterns.find((p) => p.type === \"commit\" && p.description === msg);\n if (!existing) {\n newPatterns.push({\n id: generateId(),\n type: \"commit\",\n description: msg,\n count,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [],\n });\n }\n }\n }\n\n const fileStats = state.statistics.filesModified;\n for (const [file, count] of Object.entries(fileStats)) {\n if (count >= 5) {\n const existing = state.patterns.find((p) => p.type === \"file\" && p.description === file);\n if (!existing) {\n newPatterns.push({\n id: generateId(),\n type: \"file\",\n description: file,\n count,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [],\n });\n }\n }\n }\n\n return newPatterns;\n}\n\nexport async function surfacePatterns(ctx: MimicContext): Promise<string[]> {\n const state = await ctx.stateManager.read();\n const suggestions: string[] = [];\n\n for (const pattern of state.patterns) {\n if (pattern.surfaced) continue;\n if (pattern.count < state.preferences.minPatternCount) continue;\n\n let suggestion = \"\";\n switch (pattern.type) {\n case \"commit\":\n suggestion = ctx.i18n.t(\"suggest.commit\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n case \"file\":\n suggestion = ctx.i18n.t(\"suggest.file\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n case \"tool\":\n suggestion = ctx.i18n.t(\"suggest.tool\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n case \"sequence\":\n suggestion = ctx.i18n.t(\"suggest.sequence\", {\n pattern: pattern.description,\n count: pattern.count,\n });\n break;\n }\n suggestions.push(suggestion);\n }\n\n return suggestions;\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport { SessionMemoryManager } from \"@/modules/knowledge/memory\";\nimport { SkillGenerator } from \"@/modules/knowledge/skills\";\nimport { ObservationLog, type ObservationType } from \"@/modules/observation/log\";\nimport type { ToolFactory } from \"@/tools/registry\";\n\n/**\n * Automation tools: observations, session-context, generate-skills\n */\nexport const createAutomationTools: ToolFactory = (ctx) => {\n const { stateManager, directory, i18n, i18nPromise } = ctx;\n\n const mimicDir = stateManager.getInstinctsDir().replace(\"/instincts\", \"\");\n const observationLog = new ObservationLog(mimicDir);\n const sessionMemory = new SessionMemoryManager(mimicDir, stateManager.getSessionsDir());\n const skillGenerator = new SkillGenerator(directory);\n\n return {\n \"mimic:observations\": tool({\n description: i18n.t(\"tool.observations.description\"),\n args: {\n limit: tool.schema.number().optional().describe(i18n.t(\"tool.observations.args.limit\")),\n types: tool.schema.string().optional().describe(i18n.t(\"tool.observations.args.types\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n\n const types = args.types\n ? (args.types.split(\",\").map((t) => t.trim()) as ObservationType[])\n : undefined;\n\n const observations = await observationLog.query({\n types,\n limit: args.limit ?? 20,\n });\n\n if (observations.length === 0) {\n return i18n.t(\"observations.empty\");\n }\n\n const logSize = await observationLog.getLogSize();\n const sizeStr =\n logSize < 1024\n ? `${logSize}B`\n : logSize < 1024 * 1024\n ? `${(logSize / 1024).toFixed(1)}KB`\n : `${(logSize / (1024 * 1024)).toFixed(1)}MB`;\n\n let output = `${i18n.t(\"observations.title\")}\\n\\n`;\n output += `${i18n.t(\"observations.stats\", { count: observations.length, size: sizeStr })}\\n\\n`;\n\n for (const obs of observations.slice(0, 20)) {\n const time = new Date(obs.timestamp).toLocaleTimeString();\n const data = JSON.stringify(obs.data).slice(0, 60);\n output += `- \\`${time}\\` **${obs.type}**: ${data}...\\n`;\n }\n\n return output;\n },\n }),\n\n \"mimic:session-context\": tool({\n description: i18n.t(\"tool.session_context.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n\n const memories = await sessionMemory.getRecentMemories(5);\n if (memories.length === 0) {\n return i18n.t(\"session_context.empty\");\n }\n\n let output = `${i18n.t(\"session_context.title\")}\\n\\n`;\n\n // Context summary\n const summary = await sessionMemory.getContextSummary();\n output += `${summary}\\n\\n`;\n\n // Cross-session patterns\n const patterns = await sessionMemory.analyzeCrossSessionPatterns();\n if (patterns.length > 0) {\n output += `${i18n.t(\"session_context.patterns_title\")}\\n`;\n for (const pattern of patterns.slice(0, 5)) {\n const confidence =\n \"โ—\".repeat(Math.round(pattern.confidence * 5)) +\n \"โ—‹\".repeat(5 - Math.round(pattern.confidence * 5));\n output += `- [${confidence}] ${pattern.description} (${pattern.frequency}x)\\n`;\n }\n output += \"\\n\";\n }\n\n // Continuity hints\n const hints = await sessionMemory.getContinuityHints();\n if (hints.length > 0) {\n output += \"**Hints for this session:**\\n\";\n for (const hint of hints) {\n output += `- ${hint}\\n`;\n }\n }\n\n return output;\n },\n }),\n\n \"mimic:generate-skills\": tool({\n description: i18n.t(\"tool.generate_skills.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const innerCtx = { stateManager, directory, i18n };\n\n await skillGenerator.initialize();\n const skills = await skillGenerator.generateAllEligibleSkills(innerCtx);\n\n if (skills.length === 0) {\n return i18n.t(\"generate_skills.empty\");\n }\n\n let output = `${i18n.t(\"generate_skills.title\")}\\n\\n`;\n output += `${i18n.t(\"generate_skills.success\", { count: skills.length })}\\n\\n`;\n\n for (const skill of skills) {\n output += `### ๐Ÿ“š ${skill.name}\\n`;\n output += `- **Domain**: ${skill.metadata.domain}\\n`;\n output += `- **Path**: \\`${skill.path}\\`\\n\\n`;\n }\n\n return output;\n },\n }),\n };\n};\n","import { tool } from \"@opencode-ai/plugin\";\nimport { getGitHistory, getRecentlyModifiedFiles } from \"@/lib/git\";\nimport { formatPatternType } from \"@/lib/i18n\";\nimport { surfacePatterns } from \"@/modules/observation/patterns\";\nimport type { ToolFactory } from \"@/tools/registry\";\nimport type { Pattern } from \"@/types\";\nimport { analyzeTimeSinceLastSession, formatGrowAnalysis, formatJourney } from \"@/utils/format\";\n\n/**\n * Core tools: init, status, journey, patterns, grow\n */\nexport const createCoreTools: ToolFactory = (ctx) => {\n const { stateManager, directory, toolCalls, i18n, i18nPromise } = ctx;\n\n return {\n \"mimic:init\": tool({\n description: i18n.t(\"tool.init.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const isFirstTime = state.journey.sessionCount <= 1;\n\n if (isFirstTime) {\n return i18n.t(\"init.first_time\", { project: state.project.name });\n }\n\n const timeSince = analyzeTimeSinceLastSession(state.journey.lastSession);\n const recentObs = state.journey.observations.slice(-3);\n\n let greeting = `${i18n.t(\"init.returning.header\")}\\n\\n`;\n greeting += `${i18n.t(\"init.returning.welcome\", { project: state.project.name })}\\n\\n`;\n greeting += `${i18n.t(\"init.returning.stats\", {\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n })}\\n\\n`;\n\n if (timeSince === \"long-break\") {\n greeting += `${i18n.t(\"init.returning.long_break\")}\\n\\n`;\n }\n\n if (recentObs.length > 0) {\n greeting += `${i18n.t(\"init.returning.recent_obs_title\")}\\n`;\n for (const o of recentObs) {\n greeting += `- ${o.observation}\\n`;\n }\n }\n\n return greeting;\n },\n }),\n\n \"mimic:status\": tool({\n description: i18n.t(\"tool.status.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const innerCtx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const recentFiles = getRecentlyModifiedFiles(directory);\n const gitHistory = getGitHistory(directory, 5);\n\n let output = `${i18n.t(\"status.title\", { project: state.project.name })}\\n\\n`;\n output += `${i18n.t(\"status.session\", { count: state.journey.sessionCount })}\\n`;\n output += `${i18n.t(\"status.patterns\", {\n total: state.patterns.length,\n surfaced: state.patterns.filter((p) => p.surfaced).length,\n })}\\n`;\n output += `${i18n.t(\"status.tool_calls\", { count: toolCalls.length })}\\n\\n`;\n\n if (recentFiles.length > 0) {\n output += `${i18n.t(\"status.recent_files\")}\\n`;\n for (const f of recentFiles.slice(0, 5)) {\n output += `- ${f}\\n`;\n }\n output += \"\\n\";\n }\n\n if (gitHistory.length > 0) {\n output += `${i18n.t(\"status.recent_commits\")}\\n`;\n for (const c of gitHistory) {\n output += `- ${c}\\n`;\n }\n }\n\n const suggestions = await surfacePatterns(innerCtx);\n if (suggestions.length > 0) {\n output += `\\n${i18n.t(\"status.suggestions\")}\\n`;\n for (const s of suggestions) {\n output += `- ${s}\\n`;\n }\n }\n\n return output;\n },\n }),\n\n \"mimic:journey\": tool({\n description: i18n.t(\"tool.journey.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const innerCtx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const gitHistory = getGitHistory(directory, 10);\n return formatJourney(innerCtx, state, gitHistory);\n },\n }),\n\n \"mimic:patterns\": tool({\n description: i18n.t(\"tool.patterns.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (state.patterns.length === 0) {\n return i18n.t(\"patterns.none\");\n }\n\n let output = `${i18n.t(\"patterns.title\")}\\n\\n`;\n output += `${i18n.t(\"patterns.total\", { count: state.patterns.length })}\\n\\n`;\n\n const byType = new Map<string, Pattern[]>();\n for (const p of state.patterns) {\n const list = byType.get(p.type) || [];\n list.push(p);\n byType.set(p.type, list);\n }\n\n for (const [type, patterns] of byType) {\n output += `${i18n.t(\"patterns.section\", {\n type: formatPatternType(i18n, type),\n })}\\n`;\n for (const p of patterns.slice(0, 10)) {\n const status = p.surfaced ? \"โœ“\" : \"โ—‹\";\n output += `${status} **${p.description}** (${p.count}x)\\n`;\n }\n output += \"\\n\";\n }\n\n return output;\n },\n }),\n\n \"mimic:grow\": tool({\n description: i18n.t(\"tool.grow.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const innerCtx = { stateManager, directory, i18n };\n const state = await stateManager.read();\n const gitHistory = getGitHistory(directory, 20);\n const recentFiles = getRecentlyModifiedFiles(directory);\n return formatGrowAnalysis(innerCtx, state, gitHistory, recentFiles);\n },\n }),\n };\n};\n","import { differenceInHours, format, formatDistanceToNow } from \"date-fns\";\nimport { enUS, ko } from \"date-fns/locale\";\nimport type { MimicContext } from \"@/core/context\";\nimport { formatCapabilityType } from \"@/lib/i18n\";\nimport type { State } from \"@/types\";\n\nexport type SessionStatus =\n | \"first-time\"\n | \"continuing\"\n | \"same-day\"\n | \"short-break\"\n | \"week-break\"\n | \"long-break\";\n\nexport function analyzeTimeSinceLastSession(lastSession: string | null): SessionStatus {\n if (!lastSession) return \"first-time\";\n const hours = differenceInHours(new Date(), new Date(lastSession));\n if (hours < 1) return \"continuing\";\n if (hours < 24) return \"same-day\";\n if (hours < 72) return \"short-break\";\n if (hours < 168) return \"week-break\";\n return \"long-break\";\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Complex narrative formatting for Mimic's journey display\nexport function formatJourney(ctx: MimicContext, state: State, gitHistory: string[]): string {\n const milestones = state.journey.milestones.slice(-10);\n const observations = state.journey.observations.slice(-5);\n const locale = ctx.i18n.language === \"ko-KR\" ? ko : enUS;\n\n let output = `${ctx.i18n.t(\"journey.title\", { project: state.project.name })}\\n\\n`;\n output += `${ctx.i18n.t(\"journey.subtitle\")}\\n\\n`;\n output += `${ctx.i18n.t(\"journey.sessions_survived\", {\n count: state.journey.sessionCount,\n })}\\n`;\n output += `${ctx.i18n.t(\"journey.first_encounter\", {\n date: format(state.project.firstSession, \"yyyy-MM-dd\"),\n })}\\n`;\n output += `${ctx.i18n.t(\"journey.abilities_gained\", {\n count: state.evolution.capabilities.length,\n })}\\n\\n`;\n\n if (state.project.stack && state.project.stack.length > 0) {\n output += `${ctx.i18n.t(\"journey.treasures\", {\n stack: state.project.stack.join(\", \"),\n })}\\n`;\n }\n if (state.project.focus) {\n output += `${ctx.i18n.t(\"journey.current_hunt\", { focus: state.project.focus })}\\n`;\n }\n output += \"\\n\";\n\n if (milestones.length > 0) {\n output += `${ctx.i18n.t(\"journey.victories\")}\\n`;\n for (const m of milestones) {\n const timeAgo = formatDistanceToNow(new Date(m.timestamp), { addSuffix: true, locale });\n output += `- ${m.milestone} (${timeAgo})\\n`;\n }\n output += \"\\n\";\n }\n\n if (observations.length > 0) {\n output += `${ctx.i18n.t(\"journey.witnessed\")}\\n`;\n for (const o of observations) {\n output += `- ${o.observation}\\n`;\n }\n output += \"\\n\";\n }\n\n if (state.evolution.capabilities.length > 0) {\n output += `${ctx.i18n.t(\"journey.powers\")}\\n`;\n for (const cap of state.evolution.capabilities.slice(-5)) {\n output += `- **${cap.name}** (${formatCapabilityType(\n ctx.i18n,\n cap.type,\n )}): ${cap.description}\\n`;\n }\n output += \"\\n\";\n }\n\n if (gitHistory.length > 0) {\n output += `${ctx.i18n.t(\"journey.scrolls\")}\\n`;\n for (const commit of gitHistory.slice(0, 5)) {\n output += `- ${commit}\\n`;\n }\n }\n\n return output;\n}\n\nexport function formatDuration(ms: number): string {\n const minutes = Math.round(ms / 1000 / 60);\n if (minutes < 60) return `${minutes}min`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}min`;\n}\n\nexport function formatGrowAnalysis(\n ctx: MimicContext,\n state: State,\n _gitHistory: string[],\n recentFiles: string[],\n): string {\n let output = `${ctx.i18n.t(\"grow.title\", { project: state.project.name })}\\n\\n`;\n output += `${ctx.i18n.t(\"grow.subtitle\")}\\n\\n`;\n\n const fileFrequency = Object.entries(state.statistics.filesModified)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 10);\n\n if (fileFrequency.length > 0) {\n output += `${ctx.i18n.t(\"grow.feeding_grounds\")}\\n`;\n for (const [file, count] of fileFrequency) {\n output += `- \\`${file}\\` ${ctx.i18n.t(\"grow.files_modified\", { count })}\\n`;\n }\n output += \"\\n\";\n }\n\n const toolPatterns = state.patterns\n .filter((p) => p.type === \"tool\")\n .sort((a, b) => b.count - a.count);\n if (toolPatterns.length > 0) {\n output += `${ctx.i18n.t(\"grow.favorite_prey\")}\\n`;\n for (const p of toolPatterns.slice(0, 5)) {\n output += `- ${p.description}: ${p.count}\\n`;\n }\n output += \"\\n\";\n }\n\n if (recentFiles.length > 0) {\n const dirCount = new Map<string, number>();\n for (const file of recentFiles) {\n const dir = file.split(\"/\").slice(0, -1).join(\"/\") || \".\";\n dirCount.set(dir, (dirCount.get(dir) || 0) + 1);\n }\n const sortedDirs = [...dirCount.entries()].sort((a, b) => b[1] - a[1]);\n\n output += `${ctx.i18n.t(\"grow.hunting_grounds\")}\\n`;\n for (const [dir, count] of sortedDirs.slice(0, 5)) {\n output += `- \\`${dir}/\\` ${ctx.i18n.t(\"grow.prey\", { count })}\\n`;\n }\n output += \"\\n\";\n }\n\n output += `${ctx.i18n.t(\"grow.questions\")}\\n`;\n output += `${ctx.i18n.t(\"grow.question1\")}\\n`;\n output += `${ctx.i18n.t(\"grow.question2\")}\\n`;\n output += `${ctx.i18n.t(\"grow.question3\")}\\n`;\n\n if (state.project.focus) {\n output += `\\n${ctx.i18n.t(\"grow.current_hunt\", { focus: state.project.focus })}\\n`;\n }\n\n return output;\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport { format } from \"date-fns\";\nimport { formatCapabilityType } from \"@/lib/i18n\";\nimport {\n evolveCapability,\n formatEvolutionResult,\n getEvolutionSuggestions,\n} from \"@/modules/evolution/engine\";\nimport type { ToolFactory } from \"@/tools/registry\";\n\n/**\n * Evolution tools: evolve, capabilities\n */\nexport const createEvolutionTools: ToolFactory = (ctx) => {\n const { stateManager, directory, i18n, i18nPromise } = ctx;\n\n return {\n \"mimic:evolve\": tool({\n description: i18n.t(\"tool.evolve.description\"),\n args: {\n accept: tool.schema.string().optional().describe(i18n.t(\"tool.evolve.args.accept\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const innerCtx = { stateManager, directory, i18n };\n\n if (args.accept) {\n const suggestions = await getEvolutionSuggestions(innerCtx);\n const suggestion = suggestions.find((s) => s.pattern.id === args.accept);\n if (!suggestion) {\n return i18n.t(\"evolve.no_pattern\", { id: args.accept });\n }\n const { capability, filePath } = await evolveCapability(innerCtx, suggestion);\n return `${i18n.t(\"evolve.absorbed_header\")}\\n\\n${formatEvolutionResult(\n innerCtx,\n capability,\n filePath,\n )}`;\n }\n\n const suggestions = await getEvolutionSuggestions(innerCtx);\n if (suggestions.length === 0) {\n return i18n.t(\"evolve.empty\");\n }\n\n let output = `${i18n.t(\"evolve.menu_title\")}\\n\\n`;\n output += `${i18n.t(\"evolve.menu_intro\")}\\n\\n`;\n\n for (const s of suggestions) {\n output += `### โœจ ${s.name}\\n`;\n output += `- **${i18n.t(\"evolve.menu_type\")}**: ${formatCapabilityType(i18n, s.type)}\\n`;\n output += `- **${i18n.t(\"evolve.menu_reason\")}**: ${s.reason}\\n`;\n output += `- **${i18n.t(\"evolve.menu_pattern_id\")}**: \\`${s.pattern.id}\\`\\n\\n`;\n }\n\n output += `\\n${i18n.t(\"evolve.menu_footer\")}`;\n return output;\n },\n }),\n\n \"mimic:capabilities\": tool({\n description: i18n.t(\"tool.capabilities.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (state.evolution.capabilities.length === 0) {\n return i18n.t(\"capabilities.empty\");\n }\n\n let output = `${i18n.t(\"capabilities.title\")}\\n\\n`;\n output += `${i18n.t(\"capabilities.intro\")}\\n\\n`;\n for (const cap of state.evolution.capabilities) {\n output += `### โœจ ${cap.name}\\n`;\n output += `- **${i18n.t(\"capabilities.type\")}**: ${formatCapabilityType(\n i18n,\n cap.type,\n )}\\n`;\n output += `- **${i18n.t(\"capabilities.description\")}**: ${cap.description}\\n`;\n output += `- **${i18n.t(\"capabilities.consumed\")}**: ${format(\n new Date(cap.createdAt),\n \"yyyy-MM-dd\",\n )}\\n\\n`;\n }\n return output;\n },\n }),\n };\n};\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tool } from \"@opencode-ai/plugin\";\nimport { format } from \"date-fns\";\nimport { getRecentlyModifiedFiles } from \"@/lib/git\";\nimport {\n formatInstinctSuggestion,\n getApplicableInstincts,\n} from \"@/modules/knowledge/instinct-apply\";\nimport type { ToolFactory } from \"@/tools/registry\";\nimport type { Instinct } from \"@/types\";\n\n/**\n * Instinct tools: instincts, export, import, apply, identity, sequences\n */\nexport const createInstinctTools: ToolFactory = (ctx) => {\n const { stateManager, directory, toolCalls, i18n, i18nPromise } = ctx;\n\n return {\n \"mimic:instincts\": tool({\n description: i18n.t(\"tool.instincts.description\"),\n args: {\n domain: tool.schema.string().optional().describe(i18n.t(\"tool.instincts.args.domain\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const instincts = await stateManager.listInstincts();\n\n if (instincts.length === 0) {\n return i18n.t(\"instincts.empty\");\n }\n\n let filtered = instincts;\n if (args.domain) {\n filtered = instincts.filter((inst) => inst.domain === args.domain);\n }\n\n const byDomain = groupInstinctsByDomain(filtered);\n\n let output = `${i18n.t(\"instincts.title\")}\\n\\n`;\n output += `${i18n.t(\"instincts.total\", { count: filtered.length })}\\n\\n`;\n\n for (const [domain, domainInstincts] of byDomain) {\n output += `### ${domain}\\n`;\n for (const inst of domainInstincts.slice(0, 10)) {\n const bar =\n \"โ—\".repeat(Math.round(inst.confidence * 5)) +\n \"โ—‹\".repeat(5 - Math.round(inst.confidence * 5));\n const sourceTag = inst.source === \"inherited\" ? \" ๐Ÿ“ฅ\" : \"\";\n output += `- [${bar}] **${inst.title}**${sourceTag}\\n`;\n output += ` ${inst.description}\\n`;\n }\n output += \"\\n\";\n }\n\n return output;\n },\n }),\n\n \"mimic:export\": tool({\n description: i18n.t(\"tool.export.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const exported = await stateManager.exportInstincts();\n\n if (exported.instincts.length === 0) {\n return i18n.t(\"export.empty\");\n }\n\n const exportPath = join(directory, \".opencode\", \"mimic\", \"exports\");\n if (!existsSync(exportPath)) {\n await mkdir(exportPath, { recursive: true });\n }\n\n const filename = `instincts-${format(new Date(), \"yyyy-MM-dd-HHmmss\")}.json`;\n const filePath = join(exportPath, filename);\n await writeFile(filePath, JSON.stringify(exported, null, 2));\n\n return i18n.t(\"export.success\", {\n count: exported.instincts.length,\n path: filePath,\n });\n },\n }),\n\n \"mimic:import\": tool({\n description: i18n.t(\"tool.import.description\"),\n args: {\n path: tool.schema.string().describe(i18n.t(\"tool.import.args.path\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n\n if (!existsSync(args.path)) {\n return i18n.t(\"import.not_found\", { path: args.path });\n }\n\n try {\n const content = await readFile(args.path, \"utf-8\");\n const data = JSON.parse(content) as {\n instincts: Instinct[];\n metadata: { projectName: string };\n };\n\n const imported = await stateManager.importInstincts(\n data.instincts,\n data.metadata.projectName,\n );\n\n await stateManager.updateIdentityStats();\n\n return i18n.t(\"import.success\", {\n count: imported,\n from: data.metadata.projectName,\n });\n } catch {\n return i18n.t(\"import.error\");\n }\n },\n }),\n\n \"mimic:apply\": tool({\n description: i18n.t(\"tool.apply.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const innerCtx = { stateManager, directory, i18n };\n const recentTools = toolCalls.slice(-10).map((t) => t.tool);\n const recentFiles = getRecentlyModifiedFiles(directory).slice(0, 5);\n\n const applicable = await getApplicableInstincts(innerCtx, recentTools, recentFiles);\n\n if (applicable.length === 0) {\n return i18n.t(\"apply.none\");\n }\n\n let output = `${i18n.t(\"apply.title\")}\\n\\n`;\n for (const applied of applicable) {\n output += `${formatInstinctSuggestion(applied, i18n)}\\n`;\n output += ` โ†’ ${applied.instinct.description}\\n\\n`;\n }\n\n return output;\n },\n }),\n\n \"mimic:identity\": tool({\n description: i18n.t(\"tool.identity.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (!state.project.identity) {\n await stateManager.initializeIdentity();\n const updated = await stateManager.read();\n state.project.identity = updated.project.identity;\n }\n\n if (!state.project.identity) {\n return i18n.t(\"identity.error\");\n }\n const identity = state.project.identity;\n const awakened = new Date(identity.awakened);\n const daysAlive = Math.floor((Date.now() - awakened.getTime()) / (1000 * 60 * 60 * 24));\n\n let output = `${i18n.t(\"identity.title\")}\\n\\n`;\n output += `**${i18n.t(\"identity.personality\")}**: ${identity.personality}\\n`;\n output += `**${i18n.t(\"identity.awakened\")}**: ${format(awakened, \"yyyy-MM-dd\")} (${daysAlive} ${i18n.t(\"identity.days\")})\\n`;\n output += `**${i18n.t(\"identity.instincts_learned\")}**: ${identity.totalInstinctsLearned}\\n`;\n output += `**${i18n.t(\"identity.evolutions\")}**: ${identity.totalEvolutions}\\n`;\n\n if (identity.favoriteDomainsRank.length > 0) {\n output += `**${i18n.t(\"identity.favorite_domains\")}**: ${identity.favoriteDomainsRank.join(\", \")}\\n`;\n }\n\n return output;\n },\n }),\n\n \"mimic:sequences\": tool({\n description: i18n.t(\"tool.sequences.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const sequences = state.statistics.toolSequences || [];\n\n if (sequences.length === 0) {\n return i18n.t(\"sequences.empty\");\n }\n\n let output = `${i18n.t(\"sequences.title\")}\\n\\n`;\n for (const seq of sequences.slice(0, 10)) {\n output += `- **${seq.tools.join(\" โ†’ \")}** (${seq.count}x)\\n`;\n }\n\n return output;\n },\n }),\n };\n};\n\nfunction groupInstinctsByDomain(instincts: Instinct[]): Map<string, Instinct[]> {\n const byDomain = new Map<string, Instinct[]>();\n for (const inst of instincts) {\n const list = byDomain.get(inst.domain) || [];\n list.push(inst);\n byDomain.set(inst.domain, list);\n }\n return byDomain;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tool } from \"@opencode-ai/plugin\";\nimport type { ToolFactory } from \"@/tools/registry\";\n\n/**\n * MCP tools: mcp-search, mcp\n */\nexport const createMcpTools: ToolFactory = (ctx) => {\n const { stateManager, directory, i18n, i18nPromise } = ctx;\n\n return {\n \"mimic:mcp-search\": tool({\n description: i18n.t(\"tool.mcp_search.description\"),\n args: {\n query: tool.schema.string().describe(i18n.t(\"tool.mcp_search.args.query\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const searchUrl = `https://mcpmarket.com/search?q=${encodeURIComponent(args.query)}`;\n const popular = [\n {\n name: \"context7\",\n desc: i18n.t(\"mcp_search.desc.context7\"),\n url: \"https://mcp.context7.com/mcp\",\n },\n {\n name: \"github\",\n desc: i18n.t(\"mcp_search.desc.github\"),\n url: \"https://mcp.github.com\",\n },\n {\n name: \"supabase\",\n desc: i18n.t(\"mcp_search.desc.supabase\"),\n url: \"https://mcp.supabase.com\",\n },\n { name: \"playwright\", desc: i18n.t(\"mcp_search.desc.playwright\") },\n { name: \"firecrawl\", desc: i18n.t(\"mcp_search.desc.firecrawl\") },\n ];\n const popularLines = popular\n .map((server) =>\n server.url\n ? `- **${server.name}** - ${server.desc}: \\`${server.url}\\``\n : `- **${server.name}** - ${server.desc}`,\n )\n .join(\"\\n\");\n return `${i18n.t(\"mcp_search.header\", {\n query: args.query,\n url: searchUrl,\n })}\\n\\n${i18n.t(\"mcp_search.popular\")}\\n${popularLines}\\n\\n${i18n.t(\"mcp_search.add\")}`;\n },\n }),\n\n \"mimic:mcp\": tool({\n description: i18n.t(\"tool.mcp.description\"),\n args: {\n name: tool.schema.string().describe(i18n.t(\"tool.mcp.args.name\")),\n url: tool.schema.string().optional().describe(i18n.t(\"tool.mcp.args.url\")),\n command: tool.schema.string().optional().describe(i18n.t(\"tool.mcp.args.command\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n\n const opencodeDir = join(directory, \".opencode\");\n if (!existsSync(opencodeDir)) {\n await mkdir(opencodeDir, { recursive: true });\n }\n\n const configPath = join(directory, \"opencode.json\");\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n config = JSON.parse(await readFile(configPath, \"utf-8\"));\n } catch {\n config = {};\n }\n }\n\n const mcpEntry: Record<string, unknown> = {};\n if (args.url) {\n mcpEntry.type = \"remote\";\n mcpEntry.url = args.url;\n } else if (args.command) {\n mcpEntry.type = \"local\";\n mcpEntry.command = args.command.split(\",\").map((s) => s.trim());\n } else {\n return i18n.t(\"mcp.need_url_or_command\");\n }\n mcpEntry.enabled = true;\n\n config.mcp = { ...((config.mcp as Record<string, unknown>) || {}), [args.name]: mcpEntry };\n await writeFile(configPath, JSON.stringify(config, null, 2));\n\n await stateManager.addMilestone(i18n.t(\"milestone.mcp_added\", { name: args.name }));\n\n return i18n.t(\"mcp.added\", { name: args.name });\n },\n }),\n };\n};\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolFactory } from \"@/tools/registry\";\n\n/**\n * Observation tools: observe, milestone, surface\n */\nexport const createObservationTools: ToolFactory = (ctx) => {\n const { stateManager, i18n, i18nPromise } = ctx;\n\n return {\n \"mimic:observe\": tool({\n description: i18n.t(\"tool.observe.description\"),\n args: {\n observation: tool.schema.string().describe(i18n.t(\"tool.observe.args.observation\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n await stateManager.addObservation(args.observation);\n return i18n.t(\"observe.recorded\", { observation: args.observation });\n },\n }),\n\n \"mimic:milestone\": tool({\n description: i18n.t(\"tool.milestone.description\"),\n args: {\n milestone: tool.schema.string().describe(i18n.t(\"tool.milestone.args.milestone\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n await stateManager.addMilestone(args.milestone);\n return i18n.t(\"milestone.recorded\", { milestone: args.milestone });\n },\n }),\n\n \"mimic:surface\": tool({\n description: i18n.t(\"tool.surface.description\"),\n args: {\n patternId: tool.schema.string().describe(i18n.t(\"tool.surface.args.patternId\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const pattern = state.patterns.find((p) => p.id === args.patternId);\n if (!pattern) {\n return i18n.t(\"surface.not_found\", { id: args.patternId });\n }\n pattern.surfaced = true;\n await stateManager.save(state);\n return i18n.t(\"surface.marked\", { description: pattern.description });\n },\n }),\n };\n};\n","import type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { StateManager } from \"@/core/state\";\nimport type { I18n } from \"@/lib/i18n\";\nimport type { ToolCall } from \"@/types\";\n\n/**\n * Context passed to all tool factory functions\n */\nexport interface ToolFactoryContext {\n stateManager: StateManager;\n directory: string;\n toolCalls: ToolCall[];\n i18n: I18n;\n i18nPromise: Promise<I18n>;\n}\n\n/**\n * Tool factory function type\n */\nexport type ToolFactory = (ctx: ToolFactoryContext) => Record<string, ToolDefinition>;\n\n/**\n * Tool registry for managing tool factories\n */\nexport class ToolRegistry {\n private factories: ToolFactory[] = [];\n\n /**\n * Register a tool factory\n */\n register(factory: ToolFactory): this {\n this.factories.push(factory);\n return this;\n }\n\n /**\n * Build all tools from registered factories\n */\n build(ctx: ToolFactoryContext): Record<string, ToolDefinition> {\n const tools: Record<string, ToolDefinition> = {};\n\n for (const factory of this.factories) {\n const factoryTools = factory(ctx);\n Object.assign(tools, factoryTools);\n }\n\n return tools;\n }\n}\n\n/**\n * Global tool registry instance\n */\nexport const toolRegistry = new ToolRegistry();\n","import { readdir, writeFile } from \"node:fs/promises\";\nimport { tool } from \"@opencode-ai/plugin\";\nimport { format } from \"date-fns\";\nimport { createDefaultState } from \"@/core/state\";\nimport { formatDetailLevel, formatGreetingStyle, formatLevelLabel } from \"@/lib/i18n\";\nimport { getLevelConfig } from \"@/modules/evolution/system\";\nimport type { ToolFactory } from \"@/tools/registry\";\nimport type { CreatorLevel } from \"@/types\";\n\n/**\n * Settings tools: configure, reset, level, focus\n */\nexport const createSettingsTools: ToolFactory = (ctx) => {\n const { stateManager, i18n, i18nPromise } = ctx;\n\n return {\n \"mimic:stats\": tool({\n description: i18n.t(\"tool.stats.description\"),\n args: {},\n async execute() {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n const sessionFiles = await readdir(stateManager.getSessionsDir()).catch(() => []);\n\n return `## ${i18n.t(\"stats.title\")}\n\n- **${i18n.t(\"stats.version\")}**: ${state.version}\n- **${i18n.t(\"stats.total_sessions\")}**: ${state.statistics.totalSessions}\n- **${i18n.t(\"stats.total_tool_calls\")}**: ${state.statistics.totalToolCalls}\n- **${i18n.t(\"stats.patterns_detected\")}**: ${state.patterns.length}\n- **${i18n.t(\"stats.milestones\")}**: ${state.journey.milestones.length}\n- **${i18n.t(\"stats.observations\")}**: ${state.journey.observations.length}\n- **${i18n.t(\"stats.session_records\")}**: ${sessionFiles.length}\n- **${i18n.t(\"stats.first_session\")}**: ${format(state.project.firstSession, \"yyyy-MM-dd HH:mm:ss\")}\n- **${i18n.t(\"stats.learning_enabled\")}**: ${state.preferences.learningEnabled}\n- **${i18n.t(\"stats.suggestions_enabled\")}**: ${state.preferences.suggestionEnabled}`;\n },\n }),\n\n \"mimic:configure\": tool({\n description: i18n.t(\"tool.configure.description\"),\n args: {\n learningEnabled: tool.schema\n .boolean()\n .optional()\n .describe(i18n.t(\"tool.configure.args.learningEnabled\")),\n suggestionEnabled: tool.schema\n .boolean()\n .optional()\n .describe(i18n.t(\"tool.configure.args.suggestionEnabled\")),\n minPatternCount: tool.schema\n .number()\n .optional()\n .describe(i18n.t(\"tool.configure.args.minPatternCount\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (args.learningEnabled !== undefined) {\n state.preferences.learningEnabled = args.learningEnabled;\n }\n if (args.suggestionEnabled !== undefined) {\n state.preferences.suggestionEnabled = args.suggestionEnabled;\n }\n if (args.minPatternCount !== undefined) {\n state.preferences.minPatternCount = args.minPatternCount;\n }\n\n await stateManager.save(state);\n return `${i18n.t(\"configure.updated\")}\\n${JSON.stringify(state.preferences, null, 2)}`;\n },\n }),\n\n \"mimic:reset\": tool({\n description: i18n.t(\"tool.reset.description\"),\n args: {\n confirm: tool.schema.boolean().describe(i18n.t(\"tool.reset.args.confirm\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n if (!args.confirm) {\n return i18n.t(\"reset.cancelled\");\n }\n\n await writeFile(\n stateManager.getStatePath(),\n JSON.stringify(createDefaultState(stateManager.getProjectName()), null, 2),\n );\n return i18n.t(\"reset.done\");\n },\n }),\n\n \"mimic:level\": tool({\n description: i18n.t(\"tool.level.description\"),\n args: {\n level: tool.schema\n .enum([\"technical\", \"semi-technical\", \"non-technical\", \"chaotic\"])\n .describe(i18n.t(\"tool.level.args.level\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n state.project.creatorLevel = args.level as CreatorLevel;\n await stateManager.save(state);\n\n const config = getLevelConfig(args.level as CreatorLevel);\n return i18n.t(\"level.set\", {\n level: formatLevelLabel(i18n, args.level),\n style: formatGreetingStyle(i18n, config.greetingStyle),\n detail: formatDetailLevel(i18n, config.detailLevel),\n });\n },\n }),\n\n \"mimic:focus\": tool({\n description: i18n.t(\"tool.focus.description\"),\n args: {\n focus: tool.schema.string().optional().describe(i18n.t(\"tool.focus.args.focus\")),\n stack: tool.schema.string().optional().describe(i18n.t(\"tool.focus.args.stack\")),\n },\n async execute(args) {\n const i18n = await i18nPromise;\n const state = await stateManager.read();\n\n if (args.focus) {\n state.project.focus = args.focus;\n await stateManager.addObservation(i18n.t(\"obs.focus_changed\", { focus: args.focus }));\n }\n if (args.stack) {\n state.project.stack = args.stack.split(\",\").map((s) => s.trim());\n }\n\n await stateManager.save(state);\n\n let output = `${i18n.t(\"focus.updated\")}\\n`;\n if (state.project.focus)\n output += `- **${i18n.t(\"focus.focus_label\")}**: ${state.project.focus}\\n`;\n if (state.project.stack?.length)\n output += `- **${i18n.t(\"focus.stack_label\")}**: ${state.project.stack.join(\", \")}\\n`;\n return output;\n },\n }),\n };\n};\n","import type { I18n } from \"@/lib/i18n\";\nimport type { CreatorLevel, State } from \"@/types\";\n\ninterface LevelConfig {\n greetingStyle: \"formal\" | \"casual\" | \"minimal\" | \"chaotic\";\n detailLevel: \"high\" | \"medium\" | \"low\";\n useEmoji: boolean;\n technicalTerms: boolean;\n}\n\nconst LEVEL_CONFIGS: Record<CreatorLevel, LevelConfig> = {\n technical: {\n greetingStyle: \"minimal\",\n detailLevel: \"high\",\n useEmoji: false,\n technicalTerms: true,\n },\n \"semi-technical\": {\n greetingStyle: \"casual\",\n detailLevel: \"medium\",\n useEmoji: false,\n technicalTerms: true,\n },\n \"non-technical\": {\n greetingStyle: \"formal\",\n detailLevel: \"low\",\n useEmoji: true,\n technicalTerms: false,\n },\n chaotic: {\n greetingStyle: \"chaotic\",\n detailLevel: \"medium\",\n useEmoji: true,\n technicalTerms: true,\n },\n};\n\nexport function getLevelConfig(level: CreatorLevel | null): LevelConfig {\n return LEVEL_CONFIGS[level ?? \"technical\"];\n}\n\nexport function adaptMessage(message: string, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n\n if (config.greetingStyle === \"minimal\") {\n return message.replace(/^#+\\s*/gm, \"\").trim();\n }\n\n if (config.greetingStyle === \"chaotic\") {\n const chaosEmojis = [\"๐Ÿ”ฅ\", \"โšก\", \"๐Ÿš€\", \"๐Ÿ’ฅ\", \"โœจ\"];\n const emoji = chaosEmojis[Math.floor(Math.random() * chaosEmojis.length)];\n return `${emoji} ${message}`;\n }\n\n return message;\n}\n\nexport function formatGreeting(i18n: I18n, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n const name = state.project.name;\n\n switch (config.greetingStyle) {\n case \"minimal\":\n return i18n.t(\"level.greeting.minimal\", {\n project: name,\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n });\n case \"casual\":\n return i18n.t(\"level.greeting.casual\", {\n project: name,\n sessions: state.journey.sessionCount,\n });\n case \"formal\":\n return i18n.t(\"level.greeting.formal\", {\n project: name,\n sessions: state.journey.sessionCount,\n });\n case \"chaotic\": {\n const greetings = [\n i18n.t(\"level.greeting.chaotic.chomp\"),\n i18n.t(\"level.greeting.chaotic.lid_creaks\"),\n i18n.t(\"level.greeting.chaotic.teeth_gleam\"),\n i18n.t(\"level.greeting.chaotic.tongue_flicks\"),\n ];\n const g = greetings[Math.floor(Math.random() * greetings.length)];\n return i18n.t(\"level.greeting.chaotic.template\", {\n tag: g,\n project: name,\n sessions: state.journey.sessionCount,\n });\n }\n }\n}\n\nexport function formatSuggestion(i18n: I18n, suggestion: string, state: State): string {\n const config = getLevelConfig(state.project.creatorLevel);\n\n if (!config.technicalTerms) {\n const replacements: Array<[string, string]> = [\n [i18n.t(\"level.term.tool\"), i18n.t(\"level.term.shortcut\")],\n [i18n.t(\"level.term.pattern\"), i18n.t(\"level.term.habit\")],\n [i18n.t(\"level.term.hook\"), i18n.t(\"level.term.automation\")],\n ];\n let result = suggestion;\n for (const [from, to] of replacements) {\n if (!from || from === to) continue;\n const escaped = from.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n result = result.replace(new RegExp(escaped, \"gi\"), to);\n }\n return result;\n }\n\n return suggestion;\n}\n","import type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { StateManager } from \"@/core/state\";\nimport { createI18n, type I18n, loadMimicConfig, resolveLanguage } from \"@/lib/i18n\";\nimport { createAutomationTools } from \"@/tools/automation\";\nimport { createCoreTools } from \"@/tools/core\";\nimport { createEvolutionTools } from \"@/tools/evolution\";\nimport { createInstinctTools } from \"@/tools/instincts\";\nimport { createMcpTools } from \"@/tools/mcp\";\nimport { createObservationTools } from \"@/tools/observation\";\nimport { type ToolFactoryContext, ToolRegistry } from \"@/tools/registry\";\nimport { createSettingsTools } from \"@/tools/settings\";\nimport type { ToolCall } from \"@/types\";\n\n/**\n * Create the default tool registry with all standard tools\n */\nfunction createDefaultRegistry(): ToolRegistry {\n return new ToolRegistry()\n .register(createCoreTools)\n .register(createSettingsTools)\n .register(createEvolutionTools)\n .register(createInstinctTools)\n .register(createObservationTools)\n .register(createMcpTools)\n .register(createAutomationTools);\n}\n\n/**\n * Creates all Mimic tools using the registry pattern.\n *\n * @param stateManager - State manager instance\n * @param directory - Project directory path\n * @param toolCalls - Array of tool calls in current session\n * @param i18n - Optional i18n instance\n * @returns Record of tool definitions\n */\nexport function createTools(\n stateManager: StateManager,\n directory: string,\n toolCalls: ToolCall[],\n i18n?: I18n,\n): Record<string, ToolDefinition> {\n const baseI18n = i18n ?? createI18n(resolveLanguage(null));\n const i18nPromise = i18n\n ? Promise.resolve(i18n)\n : loadMimicConfig()\n .then((config) => createI18n(resolveLanguage(config)))\n .catch(() => createI18n(resolveLanguage(null)));\n\n const ctx: ToolFactoryContext = {\n stateManager,\n directory,\n toolCalls,\n i18n: baseI18n,\n i18nPromise,\n };\n\n const registry = createDefaultRegistry();\n return registry.build(ctx);\n}\n","import type { Plugin } from \"@opencode-ai/plugin\";\nimport type { Part, UserMessage } from \"@opencode-ai/sdk\";\nimport { type Event, OPENCODE_EVENTS } from \"@/constants/opencode-events\";\nimport type { MimicContext } from \"@/core/context\";\nimport { StateManager } from \"@/core/state\";\nimport { createI18n, loadMimicConfig, resolveLanguage } from \"@/lib/i18n\";\nimport { evolveDomain } from \"@/modules/evolution/engine\";\nimport { buildInstinctContext } from \"@/modules/knowledge/instinct-apply\";\nimport { clusterDomainsAndTriggerEvolution } from \"@/modules/knowledge/instincts\";\nimport { detectDomainsFromTools, SessionMemoryManager } from \"@/modules/knowledge/memory\";\nimport { SkillGenerator } from \"@/modules/knowledge/skills\";\nimport { ObservationLog } from \"@/modules/observation/log\";\nimport { runObserver, shouldRunObserver } from \"@/modules/observation/observer\";\nimport { detectPatterns, surfacePatterns } from \"@/modules/observation/patterns\";\nimport { createTools } from \"@/tools\";\nimport type { Domain, EvolvedCapability, ToolCall } from \"@/types\";\nimport { analyzeTimeSinceLastSession, formatDuration } from \"@/utils/format\";\nimport { generateId } from \"@/utils/id\";\n\nexport const mimic: Plugin = async ({ directory, client }) => {\n const stateManager = new StateManager(directory);\n await stateManager.initialize();\n\n const i18n = createI18n(resolveLanguage(await loadMimicConfig()));\n const observationLog = new ObservationLog(\n stateManager.getInstinctsDir().replace(\"/instincts\", \"\"),\n );\n await observationLog.initialize();\n\n const sessionMemory = new SessionMemoryManager(\n stateManager.getInstinctsDir().replace(\"/instincts\", \"\"),\n stateManager.getSessionsDir(),\n );\n\n const skillGenerator = new SkillGenerator(directory);\n await skillGenerator.initialize();\n\n const ctx: MimicContext = { stateManager, directory, i18n, client };\n\n const sessionId = generateId();\n const sessionStartTime = Date.now();\n const toolCalls: ToolCall[] = [];\n const filesEdited: Set<string> = new Set();\n let currentBranch: string | undefined;\n\n const handleSessionCreated = async () => {\n // Initialize identity on first session\n await stateManager.initializeIdentity();\n\n const state = await stateManager.read();\n const timeSince = analyzeTimeSinceLastSession(state.journey.lastSession);\n\n state.statistics.totalSessions += 1;\n state.statistics.lastSessionId = sessionId;\n state.journey.sessionCount += 1;\n state.journey.lastSession = new Date().toISOString();\n\n await stateManager.save(state);\n\n // Log session start to observation log\n await observationLog.logSessionStart(sessionId);\n\n if (timeSince === \"long-break\") {\n await stateManager.addObservation(i18n.t(\"obs.returned_after_long_break\"));\n }\n\n // Get continuity hints from session memory\n const hints = await sessionMemory.getContinuityHints();\n const hintMessage = hints.length > 0 ? `\\n${hints[0]}` : \"\";\n\n // Auto-apply instincts at session start (like Homunculus instinct-apply skill)\n const instinctContext = await buildInstinctContext(ctx);\n if (instinctContext) {\n await client.tui.showToast({\n body: {\n title: \"[Mimic] ๐Ÿง \",\n message: i18n.t(\"instincts.auto_applied\"),\n variant: \"info\",\n },\n });\n }\n\n await client.tui.showToast({\n body: {\n message:\n i18n.t(\"log.session_started\", {\n sessions: state.journey.sessionCount,\n patterns: state.patterns.length,\n }) + hintMessage,\n variant: \"info\",\n },\n });\n };\n\n const notifyEvolution = async (domain: Domain, capability: EvolvedCapability) => {\n try {\n const skill = await skillGenerator.fromCapability(ctx, capability);\n if (skill) {\n await client.tui.showToast({\n body: {\n title: \"[Mimic] ๐Ÿ“š\",\n message: i18n.t(\"observer.skill_generated\", { name: skill.name }),\n variant: \"success\",\n },\n });\n }\n } catch {\n // Skill generation is optional\n }\n\n await client.tui.showToast({\n body: {\n title: \"[Mimic] โœจ\",\n message: i18n.t(\"observer.evolved\", {\n name: capability.name,\n domain,\n }),\n variant: \"success\",\n },\n });\n };\n\n const processEvolution = async () => {\n if (!(await shouldRunObserver(ctx))) return;\n\n const newInstincts = await runObserver(ctx);\n if (newInstincts.length > 0) {\n await client.tui.showToast({\n body: {\n title: \"[Mimic]\",\n message: i18n.t(\"observer.new_instincts\", { count: newInstincts.length }),\n variant: \"info\",\n },\n });\n }\n\n const triggeredDomains = await clusterDomainsAndTriggerEvolution(ctx);\n for (const domain of triggeredDomains) {\n const result = await evolveDomain(ctx, domain);\n if (result) {\n await notifyEvolution(domain, result.capability);\n }\n }\n };\n\n const handleSessionIdle = async () => {\n const newPatterns = await detectPatterns(ctx);\n if (newPatterns.length > 0) {\n const state = await stateManager.read();\n state.patterns.push(...newPatterns);\n await stateManager.save(state);\n }\n\n // Run background observer to generate instincts and trigger evolution\n await processEvolution();\n\n const suggestions = await surfacePatterns(ctx);\n for (const suggestion of suggestions) {\n await client.tui.showToast({\n body: {\n title: \"[Mimic]\",\n message: suggestion,\n variant: \"info\",\n },\n });\n }\n };\n\n const handleFileEdited = async (event: Event) => {\n if (!(event.type === OPENCODE_EVENTS.FILE_EDITED && \"properties\" in event)) return;\n\n const file = (event.properties as { file?: string })?.file;\n if (!file) return;\n\n filesEdited.add(file);\n\n // Log to observation log\n await observationLog.logFileEdit(file, sessionId);\n\n const state = await stateManager.read();\n state.statistics.filesModified[file] = (state.statistics.filesModified[file] || 0) + 1;\n await stateManager.save(state);\n };\n\n const handleVcsBranchUpdated = async (event: Event) => {\n if (!(event.type === OPENCODE_EVENTS.VCS_BRANCH_UPDATED && \"properties\" in event)) return;\n\n const branch = (event.properties as { branch?: string })?.branch;\n if (branch !== currentBranch) {\n currentBranch = branch;\n await observationLog.logBranchChange(branch);\n }\n };\n\n const handleCommandExecuted = async (event: Event) => {\n if (!(event.type === OPENCODE_EVENTS.COMMAND_EXECUTED && \"properties\" in event)) return;\n\n const props = event.properties as { name?: string; sessionID?: string; arguments?: string };\n if (props.name) {\n await observationLog.logCommand(props.name, sessionId, props.arguments);\n }\n };\n\n const handleMessageUpdated = async (event: Event) => {\n if (!(event.type === OPENCODE_EVENTS.MESSAGE_UPDATED && \"properties\" in event)) return;\n\n const info = (\n event.properties as {\n info?: { role?: string; id?: string; tokens?: { input: number; output: number } };\n }\n )?.info;\n if (!info) return;\n\n if (info.role === \"assistant\" && info.tokens) {\n await observationLog.logAssistantMessage(\n sessionId,\n info.id || \"\",\n info.tokens.input + info.tokens.output,\n );\n }\n };\n\n return {\n async event({ event }: { event: Event }) {\n switch (event.type) {\n case OPENCODE_EVENTS.SESSION_CREATED:\n await handleSessionCreated();\n return;\n case OPENCODE_EVENTS.SESSION_IDLE:\n await handleSessionIdle();\n return;\n case OPENCODE_EVENTS.FILE_EDITED:\n await handleFileEdited(event);\n return;\n case OPENCODE_EVENTS.VCS_BRANCH_UPDATED:\n await handleVcsBranchUpdated(event);\n return;\n case OPENCODE_EVENTS.COMMAND_EXECUTED:\n await handleCommandExecuted(event);\n return;\n case OPENCODE_EVENTS.MESSAGE_UPDATED:\n await handleMessageUpdated(event);\n return;\n }\n },\n\n /**\n * Hook into user messages to capture prompts for pattern analysis\n */\n async [OPENCODE_EVENTS.CHAT_MESSAGE](\n input: { sessionID: string; messageID?: string },\n output: { message: UserMessage; parts: Part[] },\n ) {\n // Extract text from user message parts\n const textParts = output.parts\n .filter((p): p is Extract<Part, { type: \"text\" }> => p.type === \"text\")\n .map((p) => p.text);\n\n if (textParts.length > 0) {\n const textPreview = textParts.join(\" \").slice(0, 200);\n await observationLog.logUserMessage(sessionId, input.messageID || \"\", textPreview);\n }\n },\n\n async [OPENCODE_EVENTS.TOOL_EXECUTE_AFTER](\n input: { tool: string; sessionID: string; callID: string },\n _output: { title: string; output: string; metadata: unknown },\n ) {\n const state = await stateManager.read();\n if (!state.preferences.learningEnabled) return;\n\n const toolCall: ToolCall = {\n tool: input.tool,\n callID: input.callID,\n timestamp: Date.now(),\n };\n\n toolCalls.push(toolCall);\n state.statistics.totalToolCalls += 1;\n\n // Log to observation log\n await observationLog.logToolCall(input.tool, input.callID, sessionId);\n\n const toolPattern = input.tool;\n const existing = state.patterns.find(\n (p) => p.type === \"tool\" && p.description === toolPattern,\n );\n if (existing) {\n existing.count += 1;\n existing.lastSeen = Date.now();\n } else {\n state.patterns.push({\n id: generateId(),\n type: \"tool\",\n description: toolPattern,\n count: 1,\n firstSeen: Date.now(),\n lastSeen: Date.now(),\n surfaced: false,\n examples: [toolCall],\n });\n }\n\n await stateManager.save(state);\n\n // Record tool sequence (last 3 tools)\n if (toolCalls.length >= 2) {\n const recentTools = toolCalls.slice(-3).map((t) => t.tool);\n await stateManager.recordToolSequence(recentTools);\n }\n },\n\n async stop() {\n const sessionDuration = Date.now() - sessionStartTime;\n\n const sessionData = {\n sessionId,\n startTime: new Date(sessionStartTime).toISOString(),\n endTime: new Date().toISOString(),\n durationMs: sessionDuration,\n toolCalls: toolCalls.length,\n filesEdited: Array.from(filesEdited),\n };\n\n await stateManager.saveSession(sessionId, sessionData);\n\n // Log session end to observation log\n await observationLog.logSessionEnd(sessionId, sessionDuration, toolCalls.length);\n\n // Create session memory for cross-session analysis\n const state = await stateManager.read();\n const recentToolNames = toolCalls.slice(-20).map((t) => t.tool);\n const dominantDomains = detectDomainsFromTools(recentToolNames);\n const recentPatterns = state.patterns\n .filter((p) => p.lastSeen > sessionStartTime)\n .map((p) => p.description);\n\n try {\n await sessionMemory.createMemory(sessionData, dominantDomains, recentPatterns, {\n branch: currentBranch,\n focus: state.project.focus,\n keyActions: recentToolNames.slice(-5),\n });\n } catch {\n // Session memory is optional\n }\n\n if (toolCalls.length > 20) {\n await stateManager.addObservation(\n i18n.t(\"obs.intensive_session\", { tools: toolCalls.length }),\n );\n }\n if (filesEdited.size > 10) {\n await stateManager.addMilestone(\n i18n.t(\"milestone.major_refactor\", { files: filesEdited.size }),\n );\n }\n\n await client.tui.showToast({\n body: {\n message: i18n.t(\"log.session_ended\", {\n duration: formatDuration(sessionDuration),\n tools: toolCalls.length,\n files: filesEdited.size,\n }),\n variant: \"info\",\n },\n });\n },\n\n tool: createTools(stateManager, directory, toolCalls, i18n),\n };\n};\n\nexport default mimic;\n"],"mappings":";AAmCO,IAAM,kBAAkB;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,sBAAsB;AAAA,EACtB,+BAA+B;AAAA,EAC/B,wBAAwB;AAAA,EACxB,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,kBAAkB;AAAA;AAAA,EAElB,cAAc;AAAA,EACd,oBAAoB;AACtB;;;ACvEA,SAAS,kBAAkB;AAC3B,SAAS,OAAO,SAAS,UAAU,iBAAiB;AACpD,SAAS,YAAY;AAGrB,IAAM,4BAA4B;AAE3B,IAAM,qBAAqB,CAAC,iBAAgC;AAAA,EACjE,SAAS;AAAA,EACT,SAAS;AAAA,IACP,MAAM;AAAA,IACN,cAAc;AAAA,IACd,cAAc,KAAK,IAAI;AAAA,IACvB,OAAO,CAAC;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,cAAc,CAAC;AAAA,IACf,YAAY,CAAC;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AAAA,EACA,UAAU,CAAC;AAAA,EACX,WAAW;AAAA,IACT,cAAc,CAAC;AAAA,IACf,eAAe;AAAA,IACf,oBAAoB,CAAC;AAAA,IACrB,iBAAiB;AAAA,IACjB,gBAAgB,CAAC;AAAA,IACjB,eAAe,CAAC;AAAA,EAClB;AAAA,EACA,aAAa;AAAA,IACX,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB;AAAA,EACA,YAAY;AAAA,IACV,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,eAAe,CAAC;AAAA,IAChB,eAAe;AAAA,IACf,eAAe,CAAC;AAAA,EAClB;AACF;AAEO,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,WAAmB;AAC7B,SAAK,WAAW,KAAK,WAAW,aAAa,OAAO;AACpD,SAAK,YAAY,KAAK,KAAK,UAAU,YAAY;AACjD,SAAK,cAAc,KAAK,KAAK,UAAU,UAAU;AACjD,SAAK,eAAe,KAAK,KAAK,UAAU,WAAW;AACnD,SAAK,cAAc,UAAU,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,EACnD;AAAA,EAEA,MAAM,kBAAiC;AACrC,UAAM,gBAAgB,KAAK,KAAK,UAAU,MAAM,MAAM,YAAY;AAElE,QAAI,CAAC,WAAW,aAAa,GAAG;AAC9B,YAAM,UAAU,eAAe,GAAG,yBAAyB;AAAA,GAAM,OAAO;AACxE;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,SAAS,eAAe,OAAO;AACrD,UAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,UAAM,gBAAgB,MAAM,KAAK,CAAC,SAAS,KAAK,KAAK,MAAM,yBAAyB;AAEpF,QAAI,CAAC,eAAe;AAClB,YAAM,UAAU,eAAe,GAAG,OAAO;AAAA,EAAK,yBAAyB;AAAA,GAAM,OAAO;AAAA,IACtF;AAAA,EACF;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,KAAK,gBAAgB;AAE3B,QAAI,CAAC,WAAW,KAAK,QAAQ,GAAG;AAC9B,YAAM,MAAM,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IAChD;AACA,QAAI,CAAC,WAAW,KAAK,WAAW,GAAG;AACjC,YAAM,MAAM,KAAK,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,IACnD;AACA,QAAI,CAAC,WAAW,KAAK,YAAY,GAAG;AAClC,YAAM,MAAM,KAAK,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,IACpD;AACA,QAAI,CAAC,WAAW,KAAK,SAAS,GAAG;AAC/B,YAAM,KAAK,KAAK,mBAAmB,KAAK,WAAW,CAAC;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,MAAM,OAAuB;AAC3B,WAAO,KAAK,MAAM,MAAM,SAAS,KAAK,WAAW,OAAO,CAAC;AAAA,EAC3D;AAAA,EAEA,MAAM,KAAK,OAA6B;AACtC,UAAM,UAAU,KAAK,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,eAAe,aAAoC;AACvD,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,UAAM,QAAQ,aAAa,KAAK;AAAA,MAC9B;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AACD,QAAI,MAAM,QAAQ,aAAa,SAAS,KAAK;AAC3C,YAAM,QAAQ,eAAe,MAAM,QAAQ,aAAa,MAAM,IAAI;AAAA,IACpE;AACA,UAAM,KAAK,KAAK,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,aAAa,WAAkC;AACnD,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,UAAM,QAAQ,WAAW,KAAK;AAAA,MAC5B;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AACD,UAAM,KAAK,KAAK,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,YAAY,WAAmB,MAA8C;AACjF,UAAM,UAAU,KAAK,KAAK,aAAa,GAAG,SAAS,OAAO,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,EAC5F;AAAA,EAEA,iBAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,iBAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,cAAc,UAAqC;AACvD,UAAM,WAAW,KAAK,KAAK,cAAc,GAAG,SAAS,EAAE,OAAO;AAC9D,UAAM,UAAU,UAAU,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAG3D,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,QAAI,CAAC,MAAM,UAAU,eAAe;AAClC,YAAM,UAAU,gBAAgB,CAAC;AAAA,IACnC;AACA,UAAM,UAAU,cAAc,SAAS,EAAE,IAAI;AAAA,MAC3C,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS;AAAA,MACrB,WAAW,SAAS;AAAA,IACtB;AACA,UAAM,KAAK,KAAK,KAAK;AAErB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBAAqC;AACzC,UAAM,QAAQ,MAAM,QAAQ,KAAK,YAAY,EAAE,MAAM,MAAM,CAAC,CAAC;AAC7D,UAAM,YAAwB,CAAC;AAE/B,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,KAAK,SAAS,OAAO,EAAG;AAC7B,UAAI;AACF,cAAM,UAAU,MAAM,SAAS,KAAK,KAAK,cAAc,IAAI,GAAG,OAAO;AACrE,kBAAU,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,MACpC,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,IAA8B;AAC9C,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,WAAO,CAAC,CAAC,MAAM,UAAU,gBAAgB,EAAE;AAAA,EAC7C;AAAA,EAEA,MAAM,qBAAoC;AACxC,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,QAAI,CAAC,MAAM,QAAQ,UAAU;AAC3B,YAAM,QAAQ,WAAW;AAAA,QACvB,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,QACjC,aAAa,KAAK,gBAAgB;AAAA,QAClC,uBAAuB;AAAA,QACvB,iBAAiB;AAAA,QACjB,qBAAqB,CAAC;AAAA,MACxB;AACA,YAAM,KAAK,KAAK,KAAK;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,kBAA0B;AAChC,UAAM,gBAAgB,CAAC,WAAW,aAAa,WAAW,YAAY,YAAY;AAClF,WAAO,cAAc,KAAK,MAAM,KAAK,OAAO,IAAI,cAAc,MAAM,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,kBAGH;AACD,UAAM,YAAY,MAAM,KAAK,cAAc;AAC3C,UAAM,oBAAoB,UAAU,OAAO,CAAC,MAAM,EAAE,WAAW,cAAc,CAAC,EAAE,MAAM;AAEtF,WAAO;AAAA,MACL,WAAW;AAAA,MACX,UAAU;AAAA,QACR,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,QACnC,aAAa,KAAK;AAAA,QAClB,OAAO,kBAAkB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,WAAuB,aAAsC;AACjF,QAAI,WAAW;AAEf,eAAW,YAAY,WAAW;AAChC,UAAI,MAAM,KAAK,YAAY,SAAS,EAAE,GAAG;AACvC;AAAA,MACF;AAEA,YAAM,oBAA8B;AAAA,QAClC,GAAG;AAAA,QACH,IAAI,aAAa,SAAS,EAAE;AAAA,QAC5B,QAAQ;AAAA,QACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,UAAU;AAAA,UACR,GAAG,SAAS;AAAA,UACZ,UAAU,CAAC,iBAAiB,WAAW,EAAE;AAAA,QAC3C;AAAA,MACF;AAEA,YAAM,KAAK,cAAc,iBAAiB;AAC1C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,OAAgC;AACvD,QAAI,MAAM,SAAS,EAAG;AAEtB,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,QAAI,CAAC,MAAM,WAAW,eAAe;AACnC,YAAM,WAAW,gBAAgB,CAAC;AAAA,IACpC;AAEA,UAAM,cAAc,MAAM,MAAM,EAAE,EAAE,KAAK,UAAK;AAC9C,UAAM,WAAW,MAAM,WAAW,cAAc;AAAA,MAC9C,CAAC,MAAM,EAAE,MAAM,KAAK,UAAK,MAAM;AAAA,IACjC;AAEA,QAAI,UAAU;AACZ,eAAS;AACT,eAAS,WAAW,KAAK,IAAI;AAAA,IAC/B,OAAO;AACL,YAAM,WAAW,cAAc,KAAK;AAAA,QAClC,OAAO,MAAM,MAAM,EAAE;AAAA,QACrB,OAAO;AAAA,QACP,UAAU,KAAK,IAAI;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,cAAc,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC/D,UAAM,WAAW,gBAAgB,MAAM,WAAW,cAAc,MAAM,GAAG,EAAE;AAE3E,UAAM,KAAK,KAAK,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,sBAAqC;AACzC,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,QAAI,CAAC,MAAM,QAAQ,SAAU;AAE7B,UAAM,YAAY,MAAM,KAAK,cAAc;AAC3C,UAAM,QAAQ,SAAS,wBAAwB,UAAU;AAAA,MACvD,CAAC,MAAM,EAAE,WAAW;AAAA,IACtB,EAAE;AACF,UAAM,QAAQ,SAAS,kBAAkB,MAAM,UAAU,aAAa;AAEtE,UAAM,eAAe,oBAAI,IAAoB;AAC7C,eAAW,YAAY,WAAW;AAChC,mBAAa,IAAI,SAAS,SAAS,aAAa,IAAI,SAAS,MAAM,KAAK,KAAK,CAAC;AAAA,IAChF;AAEA,UAAM,QAAQ,SAAS,sBAAsB,MAAM,KAAK,aAAa,QAAQ,CAAC,EAC3E,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM;AAE3B,UAAM,KAAK,KAAK,KAAK;AAAA,EACvB;AACF;;;AC5SA,SAAS,cAAAA,mBAAkB;AAC3B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,QAAAC,aAAY;AAgBrB,IAAM,mBAA6B;AAEnC,IAAM,WAAqD;AAAA,EACzD,SAAS;AAAA,IACP,uBAAuB;AAAA,IACvB,qBACE;AAAA,IACF,iCAAiC;AAAA,IACjC,yBAAyB;AAAA,IACzB,4BAA4B;AAAA,IAC5B,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IAEvB,mBACE;AAAA,IACF,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,IACxB,6BACE;AAAA,IACF,mCAAmC;AAAA,IAEnC,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,yBAAyB;AAAA,IACzB,sBAAsB;AAAA,IAEtB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,0BAA0B;AAAA,IAE1B,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IAEtB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,IACzB,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,6BAA6B;AAAA,IAE7B,qBAAqB;AAAA,IAErB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAElB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IAEd,qBAAqB;AAAA,IACrB,0BAA0B;AAAA,IAC1B,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,qBACE;AAAA,IACF,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,0BAA0B;AAAA,IAC1B,sBAAsB;AAAA,IAEtB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,uBAAuB;AAAA,IACvB,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IAEtB,yBAAyB;AAAA,IACzB,gCAAgC;AAAA,IAChC,yBAAyB;AAAA,IACzB,4BAA4B;AAAA,IAC5B,4BACE;AAAA,IACF,yBACE;AAAA,IACF,0BACE;AAAA,IACF,0BACE;AAAA,IACF,wBACE;AAAA,IAEF,sCAAsC;AAAA,IACtC,iCAAiC;AAAA,IACjC,sCAAsC;AAAA,IACtC,iCAAiC;AAAA,IACjC,wCAAwC;AAAA,IACxC,mCAAmC;AAAA,IACnC,gDAAgD;AAAA,IAChD,2CACE;AAAA,IACF,gDAAgD;AAAA,IAChD,2CAA2C;AAAA,IAE3C,gCACE;AAAA,IACF,2BAA2B;AAAA,IAE3B,0BAA0B;AAAA,IAC1B,oBAAoB;AAAA,IAEpB,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,8BAA8B;AAAA,IAC9B,6BAA6B;AAAA,IAC7B,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,0BAA0B;AAAA,IAC1B,yBACE;AAAA,IACF,yBAAyB;AAAA,IACzB,mCAAmC;AAAA,IACnC,gCAAgC;AAAA,IAChC,qCAAqC;AAAA,IACrC,sCAAsC;AAAA,IACtC,wCAAwC;AAAA,IACxC,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,yBAAyB;AAAA,IAEzB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IAErB,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,kBACE;AAAA,IACF,4BAA4B;AAAA,IAC5B,0BAA0B;AAAA,IAC1B,4BAA4B;AAAA,IAC5B,8BAA8B;AAAA,IAC9B,6BAA6B;AAAA,IAE7B,2BAA2B;AAAA,IAC3B,aACE;AAAA,IAEF,sBACE;AAAA,IACF,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,4BAA4B;AAAA,IAC5B,yBAAyB;AAAA,IAEzB,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,aAAa;AAAA,IAEb,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,6BAA6B;AAAA,IAC7B,2BAA2B;AAAA,IAC3B,4BAA4B;AAAA,IAC5B,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IAEnB,kBACE;AAAA,IACF,gBACE;AAAA,IACF,gBACE;AAAA,IACF,oBACE;AAAA,IACF,yBAAyB;AAAA,IACzB,2BAA2B;AAAA,IAC3B,4BAA4B;AAAA,IAC5B,6BAA6B;AAAA,IAC7B,4BAA4B;AAAA,IAC5B,iCAAiC;AAAA,IACjC,8BAA8B;AAAA,IAC9B,iCAAiC;AAAA,IACjC,0BAA0B;AAAA,IAC1B,8BAA8B;AAAA,IAC9B,uCAAuC;AAAA,IACvC,yCAAyC;AAAA,IACzC,uCAAuC;AAAA,IACvC,4BAA4B;AAAA,IAC5B,+BAA+B;AAAA,IAC/B,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,yBAAyB;AAAA,IACzB,2BAA2B;AAAA,IAC3B,2BAA2B;AAAA,IAC3B,0BAA0B;AAAA,IAC1B,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,IAC1B,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,IACzB,+BAA+B;AAAA,IAC/B,8BAA8B;AAAA,IAC9B,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,IACzB,iCAAiC;AAAA,IAEjC,8BAA8B;AAAA,IAC9B,8BAA8B;AAAA,IAC9B,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,0BAA0B;AAAA,IAE1B,2BAA2B;AAAA,IAC3B,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAElB,2BAA2B;AAAA,IAC3B,yBAAyB;AAAA,IACzB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAEhB,0BAA0B;AAAA,IAC1B,cAAc;AAAA,IACd,eAAe;AAAA,IAEf,6BAA6B;AAAA,IAC7B,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,8BAA8B;AAAA,IAC9B,uBAAuB;AAAA,IACvB,6BAA6B;AAAA,IAC7B,kBAAkB;AAAA,IAElB,8BAA8B;AAAA,IAC9B,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IAEnB,4BAA4B;AAAA,IAC5B,4BAA4B;AAAA,IAE5B,iCAAiC;AAAA,IACjC,gCAAgC;AAAA,IAChC,gCAAgC;AAAA,IAChC,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IAEtB,oCAAoC;AAAA,IACpC,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,IACzB,kCAAkC;AAAA,IAElC,oCAAoC;AAAA,IACpC,yBAAyB;AAAA,IACzB,yBACE;AAAA,IACF,2BAA2B;AAAA,EAC7B;AAAA,EACA,SAAS;AAAA,IACP,uBAAuB;AAAA,IACvB,qBAAqB;AAAA,IACrB,iCAAiC;AAAA,IACjC,yBAAyB;AAAA,IACzB,4BAA4B;AAAA,IAC5B,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,mBACE;AAAA,IACF,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,IACxB,6BAA6B;AAAA,IAC7B,mCAAmC;AAAA,IACnC,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,yBAAyB;AAAA,IACzB,sBAAsB;AAAA,IACtB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,0BAA0B;AAAA,IAC1B,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,IACzB,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,6BAA6B;AAAA,IAC7B,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,0BAA0B;AAAA,IAC1B,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,0BAA0B;AAAA,IAC1B,sBAAsB;AAAA,IACtB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,uBAAuB;AAAA,IACvB,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,IACzB,gCAAgC;AAAA,IAChC,yBAAyB;AAAA,IACzB,4BAA4B;AAAA,IAC5B,4BACE;AAAA,IACF,yBACE;AAAA,IACF,0BACE;AAAA,IACF,0BACE;AAAA,IACF,wBACE;AAAA,IACF,sCAAsC;AAAA,IACtC,iCAAiC;AAAA,IACjC,sCAAsC;AAAA,IACtC,iCAAiC;AAAA,IACjC,wCAAwC;AAAA,IACxC,mCAAmC;AAAA,IACnC,gDAAgD;AAAA,IAChD,2CAA2C;AAAA,IAC3C,gDAAgD;AAAA,IAChD,2CAA2C;AAAA,IAE3C,gCAAgC;AAAA,IAChC,2BAA2B;AAAA,IAE3B,0BAA0B;AAAA,IAC1B,oBAAoB;AAAA,IAEpB,aACE;AAAA,IACF,yBAAyB;AAAA,IACzB,8BAA8B;AAAA,IAC9B,6BAA6B;AAAA,IAC7B,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,0BAA0B;AAAA,IAC1B,yBACE;AAAA,IACF,yBACE;AAAA,IACF,mCAAmC;AAAA,IACnC,gCAAgC;AAAA,IAChC,qCAAqC;AAAA,IACrC,sCAAsC;AAAA,IACtC,wCAAwC;AAAA,IACxC,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,yBAAyB;AAAA,IACzB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,kBACE;AAAA,IACF,4BAA4B;AAAA,IAC5B,0BAA0B;AAAA,IAC1B,4BAA4B;AAAA,IAC5B,8BAA8B;AAAA,IAC9B,6BAA6B;AAAA,IAC7B,2BAA2B;AAAA,IAC3B,aACE;AAAA,IACF,sBACE;AAAA,IACF,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,4BAA4B;AAAA,IAC5B,yBAAyB;AAAA,IACzB,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,6BAA6B;AAAA,IAC7B,2BAA2B;AAAA,IAC3B,4BAA4B;AAAA,IAC5B,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,yBAAyB;AAAA,IACzB,2BAA2B;AAAA,IAC3B,4BAA4B;AAAA,IAC5B,6BAA6B;AAAA,IAC7B,4BAA4B;AAAA,IAC5B,iCAAiC;AAAA,IACjC,8BAA8B;AAAA,IAC9B,iCAAiC;AAAA,IACjC,0BAA0B;AAAA,IAC1B,8BAA8B;AAAA,IAC9B,uCAAuC;AAAA,IACvC,yCAAyC;AAAA,IACzC,uCAAuC;AAAA,IACvC,4BAA4B;AAAA,IAC5B,+BAA+B;AAAA,IAC/B,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,yBAAyB;AAAA,IACzB,2BAA2B;AAAA,IAC3B,2BAA2B;AAAA,IAC3B,0BAA0B;AAAA,IAC1B,yBAAyB;AAAA,IACzB,0BAA0B;AAAA,IAC1B,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,IACzB,+BAA+B;AAAA,IAC/B,8BAA8B;AAAA,IAC9B,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,IACzB,iCAAiC;AAAA,IAEjC,8BAA8B;AAAA,IAC9B,8BAA8B;AAAA,IAC9B,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,0BAA0B;AAAA,IAE1B,2BAA2B;AAAA,IAC3B,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAElB,2BAA2B;AAAA,IAC3B,yBAAyB;AAAA,IACzB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAEhB,0BAA0B;AAAA,IAC1B,cAAc;AAAA,IACd,eAAe;AAAA,IAEf,6BAA6B;AAAA,IAC7B,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,8BAA8B;AAAA,IAC9B,uBAAuB;AAAA,IACvB,6BAA6B;AAAA,IAC7B,kBAAkB;AAAA,IAElB,8BAA8B;AAAA,IAC9B,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IAEnB,4BAA4B;AAAA,IAC5B,4BAA4B;AAAA,IAE5B,iCAAiC;AAAA,IACjC,gCAAgC;AAAA,IAChC,gCAAgC;AAAA,IAChC,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IAEtB,oCAAoC;AAAA,IACpC,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,IACzB,kCAAkC;AAAA,IAElC,oCAAoC;AAAA,IACpC,yBAAyB;AAAA,IACzB,yBACE;AAAA,IACF,2BAA2B;AAAA,EAC7B;AACF;AAEA,eAAsB,kBAA4C;AAChE,QAAM,aAAaA,MAAK,QAAQ,GAAG,WAAW,YAAY,YAAY;AACtE,MAAI,CAACF,YAAW,UAAU,EAAG,QAAO,CAAC;AAErC,MAAI;AACF,UAAM,MAAM,MAAMC,UAAS,YAAY,OAAO;AAC9C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AAC5E,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,gBAAgB,QAA2C;AACzE,MAAI,QAAQ,aAAa,QAAS,QAAO;AACzC,SAAO;AACT;AAOA,SAAS,YAAY,UAAkB,MAAgD;AACrF,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,SAAS,QAAQ,cAAc,CAAC,QAAQ,QAAQ;AACrD,UAAM,QAAQ,KAAK,GAAG;AACtB,WAAO,UAAU,SAAY,KAAK,OAAO,KAAK;AAAA,EAChD,CAAC;AACH;AAEO,SAAS,WAAW,UAA0B;AACnD,SAAO;AAAA,IACL;AAAA,IACA,GAAG,CAAC,KAAK,SAAS;AAChB,YAAM,OAAO,SAAS,QAAQ,KAAK,SAAS,gBAAgB;AAC5D,YAAM,WAAW,SAAS,gBAAgB;AAC1C,YAAM,WAAW,KAAK,GAAG,KAAK,SAAS,GAAG,KAAK;AAC/C,aAAO,YAAY,UAAU,IAAI;AAAA,IACnC;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,MAAY,MAAsB;AACrE,SAAO,KAAK,EAAE,kBAAkB,IAAI,EAAE;AACxC;AAEO,SAAS,iBAAiB,MAAY,OAAuB;AAClE,SAAO,KAAK,EAAE,eAAe,KAAK,EAAE;AACtC;AAEO,SAAS,oBAAoB,MAAY,OAAuB;AACrE,SAAO,KAAK,EAAE,eAAe,KAAK,EAAE;AACtC;AAEO,SAAS,kBAAkB,MAAY,QAAwB;AACpE,SAAO,KAAK,EAAE,gBAAgB,MAAM,EAAE;AACxC;AAEO,SAAS,kBAAkB,MAAY,MAAsB;AAClE,SAAO,KAAK,EAAE,iBAAiB,IAAI,EAAE;AACvC;;;AC5nBA,SAAS,cAAAE,mBAAkB;AAC3B,SAAS,SAAAC,QAAO,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,QAAAC,aAAY;;;ACFd,IAAM,gBAAgB,oBAAI,IAAI;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;AChCM,IAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,IAAM,0BAAsE;AAAA,EACjF,SAAS;AAAA,IACP,cAAc,CAAC,SAAS,UAAU,QAAQ,YAAY,UAAU,UAAU,YAAY;AAAA,IACtF,SAAS,CAAC,QAAQ,QAAQ,QAAQ,UAAU,SAAS,YAAY,UAAU,QAAQ;AAAA,IACnF,KAAK,CAAC,UAAU,UAAU,SAAS,QAAQ,QAAQ,UAAU,SAAS,KAAK;AAAA,IAC3E,WAAW,CAAC,SAAS,SAAS,OAAO,OAAO,SAAS,SAAS,OAAO,YAAY;AAAA,IACjF,qBAAqB,CAAC,QAAQ,UAAU,YAAY,aAAa,UAAU,WAAW;AAAA,IACtF,SAAS,CAAC,QAAQ,UAAU,SAAS,WAAW,UAAU,QAAQ;AAAA,IAClE,aAAa,CAAC,YAAY,WAAW,UAAU,UAAU,QAAQ,UAAU;AAAA,IAC3E,eAAe,CAAC,OAAO,UAAU,WAAW,SAAS,YAAY,MAAM;AAAA,IACvE,OAAO,CAAC;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,cAAc,CAAC,sBAAO,gBAAM,gBAAM,sBAAO,sBAAO,4BAAQ,cAAI;AAAA,IAC5D,SAAS,CAAC,sBAAO,kCAAS,4BAAQ,gBAAM,gBAAM,cAAI;AAAA,IAClD,KAAK,CAAC,gBAAM,sBAAO,gBAAM,gBAAM,UAAK,4BAAQ,sBAAO,QAAG;AAAA,IACtD,WAAW,CAAC,sBAAO,sBAAO,gBAAM,gBAAM,gBAAM,gBAAM,gBAAM,gBAAM,cAAI;AAAA,IAClE,qBAAqB,CAAC,gBAAM,4BAAQ,gBAAM,gBAAM,gBAAM,4BAAQ,0BAAM;AAAA,IACpE,SAAS,CAAC,gBAAM,4BAAQ,gBAAM,sBAAO,gBAAM,gBAAM,cAAI;AAAA,IACrD,aAAa,CAAC,sBAAO,4BAAQ,gBAAM,sBAAO,sBAAO,cAAI;AAAA,IACrD,eAAe,CAAC,gBAAM,sBAAO,gBAAM,sBAAO,4BAAQ,gBAAM,cAAI;AAAA,IAC5D,OAAO,CAAC;AAAA,EACV;AACF;;;AC1CA,IAAM,iBAAiB;AACvB,IAAM,8BAA8B;AAE7B,SAAS,gBAAgB,WAA2B;AACzD,QAAM,QAAQ,UAAU,YAAY,EAAE,KAAK;AAE3C,QAAM,WAAmC;AAAA,IACvC,cAAc;AAAA,IACd,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,KAAK;AAAA,IACL,mBAAmB;AAAA,IACnB,WAAW;AAAA,IACX,OAAO;AAAA,IACP,qBAAqB;AAAA,IACrB,OAAO;AAAA,IACP,cAAc;AAAA,IACd,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,IACV,eAAe;AAAA,IACf,MAAM;AAAA,EACR;AAEA,MAAI,SAAS,KAAK,GAAG;AACnB,WAAO,SAAS,KAAK;AAAA,EACvB;AAEA,MAAI,QAAQ,SAAS,KAAe,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,WAAgD;AAC5E,QAAM,MAAM,oBAAI,IAAwB;AAExC,aAAW,YAAY,WAAW;AAChC,QAAI,SAAS,WAAW,WAAY;AACpC,QAAI,SAAS,aAAa,eAAgB;AAE1C,UAAM,OAAO,IAAI,IAAI,SAAS,MAAM,KAAK,CAAC;AAC1C,SAAK,KAAK,QAAQ;AAClB,QAAI,IAAI,SAAS,QAAQ,IAAI;AAAA,EAC/B;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,WAA8C;AAC/E,QAAM,WAAqB,CAAC;AAE5B,aAAW,CAAC,QAAQ,SAAS,KAAK,WAAW;AAC3C,QAAI,UAAU,UAAU,6BAA6B;AACnD,eAAS,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,uBACd,QACA,gBACA,eAAe,GACN;AACT,MAAI,CAAC,iBAAiB,MAAM,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,IAAI,KAAK,eAAe,MAAM,CAAC;AACnD,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,YAAY,IAAI,QAAQ,IAAI,YAAY,QAAQ,MAAM,MAAO,KAAK,KAAK;AAE7E,SAAO,YAAY;AACrB;AAEO,SAAS,0BACd,WACA,UACgB;AAChB,QAAM,aAAa,oBAAI,IAAY;AACnC,aAAW,YAAY,WAAW;AAChC,eAAW,MAAM,SAAS,SAAS,YAAY;AAC7C,iBAAW,IAAI,EAAE;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,cAA8B;AAClC,MAAI,WAAW;AAEf,aAAW,WAAW,UAAU;AAC9B,QAAI,WAAW,IAAI,QAAQ,EAAE,KAAK,QAAQ,QAAQ,UAAU;AAC1D,iBAAW,QAAQ;AACnB,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,CAAC,eAAe,SAAS,SAAS,GAAG;AACvC,UAAM,aAAa,SAAS,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ;AACnD,kBAAc,cAAc,SAAS,CAAC;AAAA,EACxC;AAEA,SAAO;AACT;AAEA,eAAsB,kCAAkC,KAAsC;AAC5F,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,QAAM,YAAY,MAAM,IAAI,aAAa,cAAc;AAEvD,QAAM,YAAY,cAAc,SAAS;AACzC,QAAM,WAAW,mBAAmB,SAAS;AAC7C,QAAM,YAAsB,CAAC;AAE7B,aAAW,UAAU,UAAU;AAC7B,QAAI,CAAC,uBAAuB,QAAQ,MAAM,UAAU,cAAc,GAAG;AACnE;AAAA,IACF;AAEA,cAAU,KAAK,MAAM;AAErB,QAAI,CAAC,MAAM,UAAU,mBAAmB,SAAS,MAAM,GAAG;AACxD,YAAM,UAAU,mBAAmB,KAAK,MAAM;AAAA,IAChD;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,IAAI,aAAa,KAAK,KAAK;AAAA,EACnC;AAEA,SAAO;AACT;;;AC9IA,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AAMhB,SAAS,WAAW,MAAuB;AAChD,SAAO,OAAO,IAAI;AACpB;AAMO,SAAS,wBAAwB,QAAgB,MAAsB;AAC5E,SAAO,WAAW,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,IAAI,EAAE,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACjF;;;AJGA,SAAS,iBAAiB,MAAc,aAAqB,SAA0B;AACrF,QAAM,WAAW,KAAK,QAAQ,MAAM,GAAG;AACvC,SAAO;AAAA,cACK,QAAQ,WAAW,KAAK,QAAQ,KAAK;AAAA,iBACnC,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA,eAEzB,QAAQ;AAAA;AAAA,OAEhB,IAAI;AAAA,sBACW,WAAW;AAAA;AAAA;AAAA;AAAA,8CAIa,QAAQ,WAAW;AAAA,4BAC5C,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMR,QAAQ;AAAA;AAEzB;AAEA,SAAS,iBAAiB,MAAc,cAAsB,SAA0B;AACtF,QAAM,WAAW,QAAQ;AACzB,SAAO;AAAA,cACK,QAAQ,WAAW,KAAK,QAAQ,KAAK;AAAA,iBACnC,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA,eAEzB,KAAK,QAAQ,MAAM,GAAG,CAAC;AAAA;AAAA,0BAEZ,gBAAgB,WAAW;AAAA;AAAA,gCAErB,QAAQ;AAAA,0EAC2B,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAO1D,KAAK,QAAQ,MAAM,GAAG,CAAC;AAAA;AAExC;AAEA,SAAS,kBAAkB,MAAc,aAAqB,SAA0B;AACtF,SAAO;AAAA,cACK,QAAQ,WAAW,KAAK,QAAQ,KAAK;AAAA,iBACnC,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA,eAEzB,KAAK,QAAQ,MAAM,GAAG,CAAC;AAAA;AAAA,+BAEP,WAAW;AAAA,0BAChB,gBAAgB,eAAe;AAAA,6CACnB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMzB,KAAK,QAAQ,MAAM,GAAG,CAAC;AAAA;AAExC;AAEA,SAAS,kBAAkB,MAAc,cAAsB,SAA0B;AACvF,SAAO;AAAA,IACL,CAAC,IAAI,GAAG;AAAA,MACN,MAAM;AAAA,MACN,SAAS,CAAC,QAAQ,kBAAkB,QAAQ,WAAW,EAAE;AAAA,MACzD,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,MAAc,aAAqB,SAA0B;AAC1F,SAAO;AAAA,eACM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAUnB,IAAI;AAAA;AAAA,wCAE6B,QAAQ,WAAW,KAAK,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA,8CAI/B,QAAQ,WAAW;AAAA;AAAA;AAAA;AAAA,sBAI3C,QAAQ,IAAI;AAAA,iBACjB,QAAQ,KAAK;AAAA,gBACd,IAAI,KAAK,QAAQ,SAAS,EAAE,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAazD;AAIA,eAAe,mBAAmB,YAAsD;AACtF,MAAI,CAACC,YAAW,UAAU,EAAG,QAAO,CAAC;AAErC,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAMC,UAAS,YAAY,OAAO,CAAC;AAC7D,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,aAAO,CAAC;AAAA,IACV;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,kBACb,KACA,YAC0B;AAC1B,QAAM,cAAcC,MAAK,IAAI,WAAW,WAAW;AACnD,MAAI,CAACF,YAAW,WAAW,GAAG;AAC5B,UAAMG,OAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9C;AAEA,QAAM,aAAaD,MAAK,IAAI,WAAW,eAAe;AACtD,QAAM,SAAS,MAAM,mBAAmB,UAAU;AAClD,QAAM,YAAY,kBAAkB,WAAW,MAAM,WAAW,aAAa,WAAW,OAAO;AAE/F,QAAM,MAAM,EAAE,GAAK,OAAO,OAAmC,CAAC,GAAI,GAAG,UAAU;AAC/E,QAAM,UAAU,KAAK,UAAU,EAAE,GAAG,QAAQ,IAAI,GAAG,MAAM,CAAC;AAE1D,SAAO,EAAE,UAAU,YAAY,QAAQ;AACzC;AAEA,eAAe,oBACb,KACA,YAC0B;AAC1B,QAAM,YAAYA,MAAK,IAAI,WAAW,aAAa,QAAQ;AAC3D,MAAI,CAACF,YAAW,SAAS,GAAG;AAC1B,UAAMG,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AAEA,SAAO;AAAA,IACL,SAAS,sBAAsB,WAAW,MAAM,WAAW,aAAa,WAAW,OAAO;AAAA,IAC1F,UAAUD,MAAK,WAAW,GAAG,WAAW,IAAI,KAAK;AAAA,EACnD;AACF;AAEA,SAAS,mBAAmB,YAAyC;AACnE,UAAQ,WAAW,MAAM;AAAA,IACvB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,iBAAiB,WAAW,MAAM,WAAW,aAAa,WAAW,OAAO;AAAA,IACrF,KAAK;AACH,aAAO,iBAAiB,WAAW,MAAM,WAAW,aAAa,WAAW,OAAO;AAAA,IACrF,KAAK;AACH,aAAO,kBAAkB,WAAW,MAAM,WAAW,aAAa,WAAW,OAAO;AAAA,IACtF;AACE,aAAO,iBAAiB,WAAW,MAAM,WAAW,aAAa,WAAW,OAAO;AAAA,EACvF;AACF;AAEA,eAAe,qBACb,KACA,YAC0B;AAC1B,QAAM,aAAaA,MAAK,IAAI,WAAW,aAAa,SAAS;AAC7D,MAAI,CAACF,YAAW,UAAU,GAAG;AAC3B,UAAMG,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,SAAS,mBAAmB,UAAU;AAAA,IACtC,UAAUD,MAAK,YAAY,GAAG,WAAW,IAAI,KAAK;AAAA,EACpD;AACF;AAEA,eAAe,qBACb,KACA,YAC0B;AAC1B,MAAI,WAAW,SAAS,OAAO;AAC7B,WAAO,kBAAkB,KAAK,UAAU;AAAA,EAC1C;AAEA,MAAI,WAAW,SAAS,SAAS;AAC/B,WAAO,oBAAoB,KAAK,UAAU;AAAA,EAC5C;AAEA,SAAO,qBAAqB,KAAK,UAAU;AAC7C;AAEA,SAAS,+BAA+B,YAAoD;AAC1F,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,IACf,MAAM,WAAW;AAAA,IACjB,MAAM,WAAW;AAAA,IACjB,aAAa,WAAW;AAAA,IACxB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,aAAa,WAAW,QAAQ;AAAA,EAClC;AACF;AAEA,SAAS,qBACP,OACA,YACA,YACM;AACN,QAAM,UAAU,aAAa,KAAK,UAAU;AAC5C,QAAM,UAAU,iBAAgB,oBAAI,KAAK,GAAE,YAAY;AAEvD,QAAM,UAAU,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,QAAQ,EAAE;AACzE,MAAI,SAAS;AACX,YAAQ,WAAW;AAAA,EACrB;AACF;AAEO,SAAS,iBAAiB,SAAkB,KAA+C;AAChG,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,UAAI,QAAQ,SAAS,IAAI;AACvB,cAAM,WAAW,QAAQ;AACzB,YAAI,cAAc,IAAI,QAAQ,GAAG;AAC/B,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,SAAS,QAAQ,YAAY,YAAY,EAAE,QAAQ,cAAc,GAAG,CAAC;AAAA,UAC3E,aAAa,IAAI,KAAK,EAAE,sCAAsC;AAAA,YAC5D,SAAS,QAAQ;AAAA,UACnB,CAAC;AAAA,UACD,QAAQ,IAAI,KAAK,EAAE,iCAAiC,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,UAC5E;AAAA,QACF;AAAA,MACF;AACA;AAAA,IAEF,KAAK;AACH,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,SAAS,QAAQ,YAAY,MAAM,GAAG,EAAE,IAAI,GAAG,QAAQ,OAAO,GAAG,KAAK,MAAM;AAAA,UAClF,aAAa,IAAI,KAAK,EAAE,sCAAsC;AAAA,YAC5D,SAAS,QAAQ;AAAA,UACnB,CAAC;AAAA,UACD,QAAQ,IAAI,KAAK,EAAE,iCAAiC,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,UAC5E;AAAA,QACF;AAAA,MACF;AACA;AAAA,IAEF,KAAK;AACH,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,UAAU,QAAQ,YAAY,MAAM,GAAG,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,YAAY,CAAC;AAAA,UACnF,aAAa,IAAI,KAAK,EAAE,wCAAwC;AAAA,YAC9D,SAAS,QAAQ;AAAA,UACnB,CAAC;AAAA,UACD,QAAQ,IAAI,KAAK,EAAE,mCAAmC,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,UAC9E;AAAA,QACF;AAAA,MACF;AACA;AAAA,IAEF,KAAK;AACH,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,GAAG,QAAQ,YAAY,MAAM,GAAG,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,YAAY,CAAC;AAAA,UAC5E,aAAa,IAAI,KAAK,EAAE,gDAAgD;AAAA,YACtE,SAAS,QAAQ;AAAA,UACnB,CAAC;AAAA,UACD,QAAQ,IAAI,KAAK,EAAE,2CAA2C,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,UACtF;AAAA,QACF;AAAA,MACF;AACA,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,QAAQ,QAAQ,YAAY,MAAM,GAAG,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,YAAY,CAAC;AAAA,UACjF,aAAa,IAAI,KAAK,EAAE,gDAAgD;AAAA,YACtE,SAAS,QAAQ;AAAA,UACnB,CAAC;AAAA,UACD,QAAQ,IAAI,KAAK,EAAE,2CAA2C,EAAE,OAAO,QAAQ,MAAM,CAAC;AAAA,UACtF;AAAA,QACF;AAAA,MACF;AACA;AAAA,EACJ;AAEA,SAAO;AACT;AAEA,eAAsB,wBAAwB,KAAmD;AAC/F,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,QAAM,cAAqC,CAAC;AAE5C,aAAW,WAAW,MAAM,UAAU;AACpC,QAAI,QAAQ,SAAU;AAEtB,UAAM,aAAa,iBAAiB,SAAS,GAAG;AAChD,QAAI,YAAY;AACd,kBAAY,KAAK,UAAU;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,iBACpB,KACA,YAC8D;AAC9D,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,QAAM,EAAE,UAAU,QAAQ,IAAI,MAAM,qBAAqB,KAAK,UAAU;AACxE,QAAME,WAAU,UAAU,SAAS,OAAO;AAE1C,QAAM,aAAa,+BAA+B,UAAU;AAC5D,uBAAqB,OAAO,YAAY,UAAU;AAElD,QAAM,IAAI,aAAa,KAAK,KAAK;AACjC,QAAM,IAAI,aAAa;AAAA,IACrB,IAAI,KAAK,EAAE,qBAAqB;AAAA,MAC9B,MAAM,WAAW;AAAA,MACjB,MAAM,qBAAqB,IAAI,MAAM,WAAW,IAAI;AAAA,IACtD,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,YAAY,SAAS;AAChC;AAEO,SAAS,sBACd,KACA,YACA,UACQ;AACR,QAAM,YAAY,qBAAqB,IAAI,MAAM,WAAW,IAAI;AAChE,MAAI,SAAS,cAAS,WAAW,IAAI;AAAA;AAAA;AACrC,YAAU,KAAK,IAAI,KAAK,EAAE,uBAAuB,CAAC,OAAO,SAAS;AAAA;AAClE,YAAU,KAAK,IAAI,KAAK,EAAE,8BAA8B,CAAC,OAAO,WAAW,WAAW;AAAA;AACtF,YAAU,KAAK,IAAI,KAAK,EAAE,uBAAuB,CAAC,SAAS,QAAQ;AAAA;AAAA;AACnE,YAAU,IAAI,IAAI,KAAK,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC,CAAC;AAAA;AAAA;AAEzE,UAAQ,WAAW,MAAM;AAAA,IACvB,KAAK;AAAA,IACL,KAAK;AACH,gBAAU,GAAG,IAAI,KAAK,EAAE,4BAA4B,EAAE,MAAM,WAAW,KAAK,CAAC,CAAC;AAAA;AAC9E;AAAA,IAEF,KAAK;AACH,gBAAU,GAAG,IAAI,KAAK,EAAE,uBAAuB,CAAC;AAAA;AAChD;AAAA,IAEF,KAAK;AACH,gBAAU,GAAG,IAAI,KAAK,EAAE,wBAAwB,CAAC;AAAA;AACjD;AAAA,IAEF,KAAK;AACH,gBAAU,GAAG,IAAI,KAAK,EAAE,0BAA0B,EAAE,MAAM,WAAW,KAAK,CAAC,CAAC;AAAA;AAC5E;AAAA,IAEF,KAAK;AACH,gBAAU,GAAG,IAAI,KAAK,EAAE,wBAAwB,EAAE,MAAM,WAAW,KAAK,CAAC,CAAC;AAAA;AAC1E;AAAA,EACJ;AAEA,SAAO;AACT;AAEA,eAAsB,uBACpB,KACA,QACqC;AACrC,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,QAAM,YAAY,MAAM,IAAI,aAAa,cAAc;AACvD,QAAM,kBAAkB,UAAU;AAAA,IAChC,CAAC,MAAM,EAAE,WAAW,UAAU,EAAE,WAAW,cAAc,EAAE,cAAc;AAAA,EAC3E;AAEA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,0BAA0B,iBAAiB,MAAM,QAAQ;AACzE,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAO,YAAY,EAAE,QAAQ,eAAe,GAAG;AAE5D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,GAAG,IAAI;AAAA,IACb,aAAa,IAAI,KAAK,EAAE,gCAAgC,EAAE,OAAO,CAAC;AAAA,IAClE,QAAQ,IAAI,KAAK,EAAE,2BAA2B;AAAA,MAC5C,OAAO,gBAAgB;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF;AACF;AAEA,eAAsB,aACpB,KACA,QACqE;AACrE,QAAM,aAAa,MAAM,uBAAuB,KAAK,MAAM;AAC3D,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,iBAAiB,KAAK,UAAU;AAErD,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,MAAI,CAAC,MAAM,UAAU,gBAAgB;AACnC,UAAM,UAAU,iBAAiB,CAAC;AAAA,EACpC;AACA,QAAM,UAAU,eAAe,MAAM,KAAI,oBAAI,KAAK,GAAE,YAAY;AAEhE,QAAM,eAAe,MAAM,UAAU,mBAAmB,QAAQ,MAAM;AACtE,MAAI,iBAAiB,IAAI;AACvB,UAAM,UAAU,mBAAmB,OAAO,cAAc,CAAC;AAAA,EAC3D;AAEA,QAAM,IAAI,aAAa,KAAK,KAAK;AAEjC,SAAO;AACT;;;AKlcA,SAAS,kBAAkB,QAAgB,WAAqB,SAAmB;AACjF,QAAM,aAAa,wBAAwB,OAAO,EAAE,MAAM,KAAK,CAAC;AAChE,MAAI,aAAa,SAAS;AACxB,UAAM,aAAa,wBAAwB,OAAO,EAAE,MAAM,KAAK,CAAC;AAChE,WAAO,CAAC,GAAG,YAAY,GAAG,UAAU;AAAA,EACtC;AACA,SAAO;AACT;AAEO,SAAS,oBACd,aACA,aACA,WAAqB,SACX;AACV,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAU,CAAC,GAAG,aAAa,GAAG,WAAW,EAAE,KAAK,GAAG,EAAE,YAAY;AAEvE,QAAM,aAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,UAAU,YAAY;AAC/B,UAAM,WAAW,kBAAkB,QAAQ,QAAQ;AACnD,QAAI,SAAS,KAAK,CAAC,OAAO,QAAQ,SAAS,EAAE,CAAC,GAAG;AAC/C,cAAQ,KAAK,MAAM;AAAA,IACrB;AAAA,EACF;AAGA,MAAI,YAAY,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,oBAAK,CAAC,GAAG;AAC5F,QAAI,CAAC,QAAQ,SAAS,SAAS,EAAG,SAAQ,KAAK,SAAS;AAAA,EAC1D;AAEA,MAAI,YAAY,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,cAAI,CAAC,GAAG;AAC1F,QAAI,CAAC,QAAQ,SAAS,KAAK,EAAG,SAAQ,KAAK,KAAK;AAAA,EAClD;AAEA,SAAO,QAAQ,SAAS,IAAI,UAAU,CAAC,OAAO;AAChD;AAEO,SAAS,wBACd,WACA,gBACmB;AACnB,QAAM,UAA6B,CAAC;AAEpC,aAAW,YAAY,WAAW;AAChC,QAAI,SAAS,WAAW,WAAY;AACpC,QAAI,SAAS,aAAa,IAAK;AAE/B,QAAI,eAAe,SAAS,SAAS,MAAM,GAAG;AAC5C,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,WACE,SAAS,cAAc,MAAM,SAAS,SAAS,cAAc,MAAM,WAAW;AAAA,MAClF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,aAAa,EAAE,SAAS,UAAU,EAAE,MAAM,GAAG,CAAC;AACzF;AAEO,SAAS,yBACd,SACA,OACQ;AACR,QAAM,gBACJ,SAAI,OAAO,KAAK,MAAM,QAAQ,SAAS,aAAa,CAAC,CAAC,IACtD,SAAI,OAAO,IAAI,KAAK,MAAM,QAAQ,SAAS,aAAa,CAAC,CAAC;AAE5D,QAAM,YAAY,QAAQ,SAAS,WAAW,cAAc,eAAQ;AAEpE,SAAO,IAAI,aAAa,KAAK,QAAQ,SAAS,KAAK,GAAG,SAAS;AACjE;AAEA,eAAsB,uBACpB,KACA,aACA,aAC4B;AAC5B,QAAM,YAAY,MAAM,IAAI,aAAa,cAAc;AACvD,QAAM,iBAAiB,oBAAoB,aAAa,aAAa,IAAI,KAAK,QAAQ;AACtF,SAAO,wBAAwB,WAAW,cAAc;AAC1D;AAMA,eAAsB,qBAAqB,KAA2C;AACpF,QAAM,YAAY,MAAM,IAAI,aAAa,cAAc;AACvD,QAAM,oBAAoB,UAAU,OAAO,CAAC,MAAM,EAAE,WAAW,cAAc,EAAE,cAAc,GAAG;AAEhG,MAAI,kBAAkB,WAAW,GAAG;AAClC,WAAO;AAAA,EACT;AAGA,QAAM,WAAuC,CAAC;AAC9C,aAAW,YAAY,mBAAmB;AACxC,QAAI,CAAC,SAAS,SAAS,MAAM,GAAG;AAC9B,eAAS,SAAS,MAAM,IAAI,CAAC;AAAA,IAC/B;AACA,aAAS,SAAS,MAAM,EAAE,KAAK,QAAQ;AAAA,EACzC;AAEA,QAAM,WAAqB,CAAC,qCAAqC;AAEjE,aAAW,CAAC,QAAQ,eAAe,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChE,UAAM,SAAS,gBAAgB,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AACrF,aAAS,KAAK;AAAA,MAAS,MAAM,EAAE;AAE/B,eAAW,YAAY,QAAQ;AAC7B,YAAM,kBACJ,SAAS,cAAc,MAAM,WAAW,SAAS,cAAc,MAAM,aAAa;AACpF,eAAS,KAAK,OAAO,SAAS,KAAK,OAAO,eAAe,MAAM,SAAS,WAAW,EAAE;AAAA,IACvF;AAAA,EACF;AAEA,WAAS;AAAA,IACP;AAAA,EACF;AAEA,SAAO,SAAS,KAAK,IAAI;AAC3B;;;ACjJA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,UAAS,YAAAC,WAAU,aAAAC,kBAAiB;AAC7C,SAAS,QAAAC,aAAY;AAsCrB,IAAM,eAAe;AACrB,IAAM,+BAA+B;AAM9B,IAAM,uBAAN,MAA2B;AAAA,EACf;AAAA,EACA;AAAA,EAEjB,YAAY,UAAkB,aAAqB;AACjD,SAAK,aAAaC,MAAK,UAAU,qBAAqB;AACtD,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAyC;AAC7C,QAAI,CAACC,YAAW,KAAK,UAAU,GAAG;AAChC,aAAO,CAAC;AAAA,IACV;AACA,QAAI;AACF,YAAM,UAAU,MAAMC,UAAS,KAAK,YAAY,OAAO;AACvD,YAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,aAAO,KAAK,YAAY,CAAC;AAAA,IAC3B,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,UAA0C;AAE3D,UAAM,UAAU,SAAS,MAAM,CAAC,YAAY;AAC5C,UAAMC;AAAA,MACJ,KAAK;AAAA,MACL,KAAK,UAAU,EAAE,UAAU,SAAS,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,GAAG,MAAM,CAAC;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,aACA,SACA,UACA,SACwB;AACxB,UAAM,SAAwB;AAAA,MAC5B,WAAW,YAAY;AAAA,MACvB,WAAW,YAAY;AAAA,MACvB,SAAS,YAAY;AAAA,MACrB,YAAY,YAAY;AAAA,MACxB,SAAS;AAAA,QACP,WAAW,YAAY;AAAA,QACvB,aAAa,YAAY;AAAA,QACzB,iBAAiB,QAAQ,MAAM,GAAG,CAAC;AAAA,QACnC;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,KAAK,aAAa;AACzC,aAAS,KAAK,MAAM;AACpB,UAAM,KAAK,aAAa,QAAQ;AAEhC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,QAAgB,8BAAwD;AAC9F,UAAM,WAAW,MAAM,KAAK,aAAa;AACzC,WAAO,SAAS,MAAM,CAAC,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,QAAgB,8BAAsD;AAC7F,QAAI,CAACF,YAAW,KAAK,WAAW,GAAG;AACjC,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,QAAQ,MAAMG,SAAQ,KAAK,WAAW;AAC5C,UAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,EAAE,MAAM,CAAC,KAAK;AAEvE,UAAM,WAA0B,CAAC;AACjC,eAAW,QAAQ,WAAW;AAC5B,UAAI;AACF,cAAM,UAAU,MAAMF,UAASF,MAAK,KAAK,aAAa,IAAI,GAAG,OAAO;AACpE,iBAAS,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,MACnC,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO,SAAS;AAAA,MACd,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,8BAA8D;AAClE,UAAM,WAAW,MAAM,KAAK,kBAAkB;AAC9C,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,WAAW,SAAS,SAAS,SAAS,CAAC,EAAE;AAC/C,UAAM,WAAkC;AAAA,MACtC,GAAG,KAAK,uBAAuB,UAAU,QAAQ;AAAA,MACjD,GAAG,KAAK,wBAAwB,UAAU,QAAQ;AAAA,MAClD,GAAG,KAAK,oBAAoB,UAAU,QAAQ;AAAA,MAC9C,GAAG,KAAK,8BAA8B,UAAU,QAAQ;AAAA,IAC1D;AAEA,WAAO,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE;AAAA,EACzE;AAAA,EAEQ,uBACN,UACA,UACuB;AACvB,UAAM,WAAkC,CAAC;AACzC,UAAM,kBAAkB,oBAAI,IAAmD;AAE/E,eAAW,UAAU,UAAU;AAC7B,YAAM,MAAM,OAAO,QAAQ,gBAAgB,KAAK,UAAK;AACrD,UAAI,KAAK;AACP,cAAM,WAAW,gBAAgB,IAAI,GAAG,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC,EAAE;AACtE,iBAAS;AACT,iBAAS,SAAS,KAAK,OAAO,SAAS;AACvC,wBAAgB,IAAI,KAAK,QAAQ;AAAA,MACnC;AAAA,IACF;AAEA,eAAW,CAAC,UAAU,IAAI,KAAK,iBAAiB;AAC9C,UAAI,KAAK,SAAS,GAAG;AACnB,iBAAS,KAAK;AAAA,UACZ,IAAI,YAAY,WAAW,CAAC,CAAC;AAAA,UAC7B,MAAM;AAAA,UACN,aAAa,qBAAqB,QAAQ;AAAA,UAC1C,WAAW,KAAK;AAAA,UAChB,YAAY,KAAK,IAAI,KAAK,MAAM,KAAK,QAAQ,GAAG;AAAA,UAChD,YAAY,KAAK;AAAA,UACjB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,wBACN,UACA,UACuB;AACvB,UAAM,WAAkC,CAAC;AACzC,UAAM,aAAa,oBAAI,IAAmD;AAE1E,eAAW,UAAU,UAAU;AAC7B,YAAM,OAAO,IAAI,KAAK,OAAO,SAAS,EAAE,SAAS;AACjD,YAAM,SAAS,KAAK,MAAM,OAAO,CAAC,IAAI;AACtC,YAAM,WAAW,WAAW,IAAI,MAAM,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC,EAAE;AACpE,eAAS;AACT,eAAS,SAAS,KAAK,OAAO,SAAS;AACvC,iBAAW,IAAI,QAAQ,QAAQ;AAAA,IACjC;AAEA,eAAW,CAAC,QAAQ,IAAI,KAAK,YAAY;AACvC,UAAI,KAAK,SAAS,GAAG;AACnB,cAAM,YAAY,GAAG,MAAM,OAAO,SAAS,CAAC;AAC5C,iBAAS,KAAK;AAAA,UACZ,IAAI,QAAQ,MAAM;AAAA,UAClB,MAAM;AAAA,UACN,aAAa,yBAAyB,SAAS;AAAA,UAC/C,WAAW,KAAK;AAAA,UAChB,YAAY,KAAK,IAAI,KAAK,KAAK,QAAQ,SAAS,MAAM;AAAA,UACtD,YAAY,KAAK;AAAA,UACjB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,UAA2B,UAAyC;AAC9F,UAAM,WAAkC,CAAC;AACzC,UAAM,cAAc,oBAAI,IAAmD;AAE3E,eAAW,UAAU,UAAU;AAC7B,UAAI,OAAO,QAAQ,OAAO;AACxB,cAAM,WAAW,YAAY,IAAI,OAAO,QAAQ,KAAK,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC,EAAE;AACnF,iBAAS;AACT,iBAAS,SAAS,KAAK,OAAO,SAAS;AACvC,oBAAY,IAAI,OAAO,QAAQ,OAAO,QAAQ;AAAA,MAChD;AAAA,IACF;AAEA,eAAW,CAAC,OAAO,IAAI,KAAK,aAAa;AACvC,UAAI,KAAK,SAAS,GAAG;AACnB,iBAAS,KAAK;AAAA,UACZ,IAAI,SAAS,WAAW,CAAC,CAAC;AAAA,UAC1B,MAAM;AAAA,UACN,aAAa,mBAAmB,KAAK;AAAA,UACrC,WAAW,KAAK;AAAA,UAChB,YAAY,KAAK,IAAI,MAAM,MAAM,KAAK,QAAQ,IAAI;AAAA,UAClD,YAAY,KAAK;AAAA,UACjB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,8BACN,UACA,UACuB;AACvB,UAAM,WAAkC,CAAC;AACzC,UAAM,aAAa,oBAAI,IAAmD;AAE1E,eAAW,UAAU,UAAU;AAC7B,UAAI,OAAO,QAAQ,SAAS,UAAU,GAAG;AACvC,cAAM,MAAM,OAAO,QAAQ,SAAS,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACxD,cAAM,WAAW,WAAW,IAAI,GAAG,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC,EAAE;AACjE,iBAAS;AACT,iBAAS,SAAS,KAAK,OAAO,SAAS;AACvC,mBAAW,IAAI,KAAK,QAAQ;AAAA,MAC9B;AAAA,IACF;AAEA,eAAW,CAAC,OAAO,IAAI,KAAK,YAAY;AACtC,UAAI,KAAK,SAAS,GAAG;AACnB,iBAAS,KAAK;AAAA,UACZ,IAAI,SAAS,WAAW,CAAC,CAAC;AAAA,UAC1B,MAAM;AAAA,UACN,aAAa,qBAAqB,KAAK;AAAA,UACvC,WAAW,KAAK;AAAA,UAChB,YAAY,KAAK,IAAI,KAAK,MAAM,KAAK,QAAQ,GAAG;AAAA,UAChD,YAAY,KAAK;AAAA,UACjB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAqC;AACzC,UAAM,WAAW,MAAM,KAAK,kBAAkB,CAAC;AAC/C,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,QAAkB,CAAC;AAGzB,UAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AACzC,UAAM,WAAW,IAAI,KAAK,KAAK,OAAO;AACtC,UAAM,WAAW,KAAK,OAAO,KAAK,IAAI,IAAI,SAAS,QAAQ,MAAM,MAAO,KAAK,GAAG;AAChF,UAAM,KAAK,iBAAiB,QAAQ,UAAU,KAAK,QAAQ,SAAS,aAAa;AAGjF,UAAM,aAAa,SAAS,QAAQ,CAAC,MAAM,EAAE,QAAQ,eAAe;AACpE,UAAM,eAAe,oBAAI,IAAoB;AAC7C,eAAW,KAAK,YAAY;AAC1B,mBAAa,IAAI,IAAI,aAAa,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA,IACpD;AACA,UAAM,aAAa,CAAC,GAAG,aAAa,QAAQ,CAAC,EAC1C,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACjB,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,KAAK,gBAAgB,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,IACpD;AAGA,UAAM,gBAAgB,MAAM,KAAK,4BAA4B;AAC7D,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,aAAa,cAAc,CAAC;AAClC,YAAM,KAAK,oBAAoB,WAAW,WAAW,KAAK,WAAW,SAAS,IAAI;AAAA,IACpF;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAwC;AAC5C,UAAM,WAAW,MAAM,KAAK,kBAAkB,CAAC;AAC/C,UAAM,QAAkB,CAAC;AAEzB,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AAGzC,QAAI,KAAK,QAAQ,YAAY,SAAS,GAAG;AACvC,YAAM,cAAc,KAAK,QAAQ,YAAY,MAAM,GAAG,CAAC;AACvD,YAAM,KAAK,iBAAiB,YAAY,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IACrF;AAGA,QAAI,KAAK,QAAQ,OAAO;AACtB,YAAM,KAAK,mBAAmB,KAAK,QAAQ,KAAK,EAAE;AAAA,IACpD;AAGA,QAAI,KAAK,aAAa,IAAI,KAAK,OAAQ,KAAK,QAAQ,YAAY,GAAG;AACjE,YAAM,KAAK,uDAAuD;AAAA,IACpE;AAEA,WAAO;AAAA,EACT;AACF;AAKO,SAAS,uBAAuB,OAA2B;AAChE,QAAM,eAAe,oBAAI,IAAoB;AAE7C,QAAM,gBAAwC;AAAA;AAAA,IAE5C,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA;AAAA,IAEN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA;AAAA,IAEN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,OAAO;AAAA;AAAA,IAEP,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,QAAQ;AAAA;AAAA,IAER,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA;AAAA,IAEN,UAAU;AAAA,IACV,SAAS;AAAA;AAAA,IAET,KAAK;AAAA,IACL,QAAQ;AAAA;AAAA,IAER,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAEA,aAAWK,SAAQ,OAAO;AACxB,UAAM,QAAQA,MAAK,YAAY;AAC/B,eAAW,CAAC,SAAS,MAAM,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC7D,UAAI,MAAM,SAAS,OAAO,GAAG;AAC3B,qBAAa,IAAI,SAAS,aAAa,IAAI,MAAM,KAAK,KAAK,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,aAAa,QAAQ,CAAC,EAC9B,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACnB;;;AChbA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,SAAAC,QAAO,aAAAC,kBAAiB;AACjC,SAAS,QAAAC,aAAY;AA6Bd,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EAEjB,YAAY,WAAmB;AAC7B,SAAK,YAAYA,MAAK,WAAW,aAAa,QAAQ;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,QAAI,CAACH,YAAW,KAAK,SAAS,GAAG;AAC/B,YAAMC,OAAM,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACJ,MACA,aACA,QACA,WACA,UACyB;AACzB,UAAM,WAAWE,MAAK,KAAK,WAAW,IAAI;AAC1C,QAAI,CAACH,YAAW,QAAQ,GAAG;AACzB,YAAMC,OAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3C;AAEA,UAAM,WAA0B;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,OAAO,KAAK,WAAW,QAAQ;AAAA,IACjC;AAEA,UAAM,UAAU,KAAK,sBAAsB,UAAU,WAAW,QAAQ;AACxE,UAAM,YAAYE,MAAK,UAAU,UAAU;AAE3C,UAAMD,WAAU,WAAW,SAAS,OAAO;AAE3C,WAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBACN,UACA,WACA,UACQ;AACR,UAAM,YAAY,SAAS,QACvB,OAAO,QAAQ,SAAS,KAAK,EAC1B,IAAI,CAAC,CAACE,OAAM,OAAO,MAAM,KAAKA,KAAI,KAAK,OAAO,EAAE,EAChD,KAAK,IAAI,IACZ;AAEJ,UAAM,gBAAgB,UACnB,MAAM,GAAG,EAAE,EACX;AAAA,MACC,CAAC,MACC,OAAO,EAAE,KAAK,OAAO,KAAK,MAAM,EAAE,aAAa,GAAG,CAAC;AAAA,IAAoB,EAAE,WAAW;AAAA,IACxF,EACC,KAAK,IAAI;AAEZ,UAAM,eAAe,SAClB,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE,WAAW,KAAK,EAAE,KAAK,aAAa,EACjE,KAAK,IAAI;AAEZ,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,WAAO;AAAA,QACH,SAAS,IAAI;AAAA,eACN,SAAS,WAAW;AAAA,WACxB,SAAS,OAAO;AAAA,UACjB,SAAS,MAAM;AAAA;AAAA,EAEvB,SAAS;AAAA,aACE,GAAG;AAAA;AAAA;AAAA,IAGZ,SAAS,IAAI;AAAA;AAAA,EAEf,SAAS,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kFAO4D,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA,EAI/F,iBAAiB,8BAA8B;AAAA;AAAA;AAAA;AAAA,EAI/C,gBAAgB,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7C,KAAK,wBAAwB,SAAS,QAAQ,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA,EAIvD,KAAK,sBAAsB,SAAS,QAAQ,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA,gBAIxC,SAAS,MAAM;AAAA,mBACZ,GAAG;AAAA,wBACE,UAAU,MAAM;AAAA,2BACb,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUxC;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,QAAgB,UAA6B;AAC3E,UAAM,aAAuB,CAAC;AAE9B,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,mBAAW,KAAK,kDAAkD;AAClE,mBAAW,KAAK,kDAAkD;AAClE;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,0CAA0C;AAC1D,mBAAW,KAAK,sCAAsC;AACtD;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,+CAA+C;AAC/D,mBAAW,KAAK,kCAAkC;AAClD;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,8BAA8B;AAC9C,mBAAW,KAAK,gCAAgC;AAChD;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,gDAAgD;AAChE,mBAAW,KAAK,mCAAmC;AACnD;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,qCAAqC;AACrD,mBAAW,KAAK,iCAAiC;AACjD;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,4BAA4B;AAC5C,mBAAW,KAAK,gCAAgC;AAChD;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,sCAAsC;AACtD,mBAAW,KAAK,yBAAyB;AACzC;AAAA,MACF;AACE,mBAAW,KAAK,6BAA6B;AAAA,IACjD;AAGA,eAAW,WAAW,SAAS,MAAM,GAAG,CAAC,GAAG;AAC1C,UAAI,QAAQ,SAAS,YAAY;AAC/B,mBAAW,KAAK,yBAAyB,QAAQ,WAAW,EAAE;AAAA,MAChE,WAAW,QAAQ,SAAS,QAAQ;AAClC,mBAAW,KAAK,mBAAmB,QAAQ,WAAW,EAAE;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO,WAAW,KAAK,IAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,QAAgB,WAA+B;AAC3E,UAAM,YAAsB,CAAC;AAG7B,eAAW,YAAY,UAAU,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG;AAC/E,gBAAU,KAAK,MAAM,SAAS,KAAK,EAAE;AAAA,IACvC;AAGA,QAAI,UAAU,WAAW,GAAG;AAC1B,cAAQ,QAAQ;AAAA,QACd,KAAK;AACH,oBAAU,KAAK,4CAA4C;AAC3D,oBAAU,KAAK,iDAAiD;AAChE;AAAA,QACF,KAAK;AACH,oBAAU,KAAK,8CAA8C;AAC7D,oBAAU,KAAK,qCAAqC;AACpD;AAAA,QACF,KAAK;AACH,oBAAU,KAAK,2CAA2C;AAC1D,oBAAU,KAAK,kCAAkC;AACjD;AAAA,QACF;AACE,oBAAU,KAAK,+BAA+B;AAC9C,oBAAU,KAAK,iCAAiC;AAAA,MACpD;AAAA,IACF;AAEA,WAAO,UAAU,KAAK,IAAI;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,UAA8C;AAC/D,UAAM,QAAiC;AAAA,MACrC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAEA,eAAW,WAAW,UAAU;AAC9B,YAAM,OAAO,QAAQ,YAAY,YAAY;AAE7C,UAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,QAAQ,GAAG;AAC9E,cAAM,OAAO;AAAA,MACf;AACA,UACE,KAAK,SAAS,MAAM,KACpB,KAAK,SAAS,OAAO,KACrB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,MAAM,GACpB;AACA,cAAM,OAAO;AAAA,MACf;AACA,UAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,MAAM,GAAG;AAC7E,cAAM,OAAO;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,KACA,YACgC;AAChC,UAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,UAAM,YAAY,MAAM,IAAI,aAAa,cAAc;AAGvD,UAAM,UAAU,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,WAAW;AAC1E,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAGA,UAAM,kBAAkB,UAAU,OAAO,CAAC,MAAM;AAC9C,UAAI,EAAE,SAAS,WAAW,SAAS,QAAQ,EAAE,EAAG,QAAO;AACvD,aAAO;AAAA,IACT,CAAC;AAGD,UAAM,SAAS,gBAAgB,CAAC,GAAG,UAAU;AAE7C,WAAO,KAAK,cAAc,WAAW,MAAM,WAAW,aAAa,QAAQ,iBAAiB;AAAA,MAC1F;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAA0B,KAA8C;AAC5E,UAAM,YAAY,MAAM,IAAI,aAAa,cAAc;AACvD,UAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,UAAM,SAA2B,CAAC;AAGlC,UAAM,WAAW,oBAAI,IAAwB;AAC7C,eAAW,YAAY,WAAW;AAChC,UAAI,SAAS,WAAW,cAAc,SAAS,aAAa,IAAK;AACjE,YAAM,OAAO,SAAS,IAAI,SAAS,MAAM,KAAK,CAAC;AAC/C,WAAK,KAAK,QAAQ;AAClB,eAAS,IAAI,SAAS,QAAQ,IAAI;AAAA,IACpC;AAGA,eAAW,CAAC,QAAQ,eAAe,KAAK,UAAU;AAChD,UAAI,gBAAgB,SAAS,EAAG;AAEhC,YAAM,OAAO,GAAG,MAAM;AACtB,YAAM,cAAc,IAAI,KAAK,EAAE,4BAA4B,EAAE,OAAO,CAAC;AAGrE,YAAM,aAAa,IAAI,IAAI,gBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,CAAC;AAChF,YAAM,WAAW,MAAM,SAAS,OAAO,CAAC,MAAM,WAAW,IAAI,EAAE,EAAE,CAAC;AAElE,UAAI;AACF,cAAM,QAAQ,MAAM,KAAK;AAAA,UACvB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,eAAO,KAAK,KAAK;AAAA,MACnB,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AC7WA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,YAAY,SAAAC,QAAO,YAAAC,WAAU,MAAM,aAAAC,kBAAiB;AAC7D,SAAS,QAAAC,aAAY;AAmCrB,IAAM,oBAAoB,IAAI,OAAO;AAM9B,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA,EAEjB,YAAY,UAAkB;AAC5B,SAAK,UAAUC,MAAK,UAAU,oBAAoB;AAClD,SAAK,aAAaA,MAAK,UAAU,UAAU;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,UAAM,MAAMA,MAAK,KAAK,SAAS,IAAI;AACnC,QAAI,CAACC,YAAW,GAAG,GAAG;AACpB,YAAMC,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACtC;AACA,QAAI,CAACD,YAAW,KAAK,UAAU,GAAG;AAChC,YAAMC,OAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAA8E;AACzF,UAAM,YAA8B;AAAA,MAClC,IAAI,WAAW;AAAA,MACf,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,GAAG;AAAA,IACL;AAEA,UAAM,OAAO,GAAG,KAAK,UAAU,SAAS,CAAC;AAAA;AACzC,UAAM,WAAW,KAAK,SAAS,MAAM,OAAO;AAG5C,UAAM,KAAK,YAAY;AAEvB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJC,OACA,QACA,WACA,MAC2B;AAC3B,WAAO,KAAK,OAAO;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,MAAM,EAAE,MAAAA,OAAM,QAAQ,KAAK;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,WACA,WACA,aAC2B;AAC3B,WAAO,KAAK,OAAO;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,MAAM;AAAA,QACJ;AAAA;AAAA,QAEA,aAAa,aAAa,MAAM,GAAG,GAAG;AAAA,MACxC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACJ,WACA,WACA,YAC2B;AAC3B,WAAO,KAAK,OAAO;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,MAAM,EAAE,WAAW,WAAW;AAAA,IAChC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAc,WAA+C;AAC7E,WAAO,KAAK,OAAO;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,MAAM,EAAE,MAAM,WAAW,KAAK,MAAM,GAAG,EAAE,IAAI,EAAE;AAAA,IACjD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAiB,WAAmB,MAA0C;AAC7F,WAAO,KAAK,OAAO;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,MAAM,EAAE,SAAS,KAAK;AAAA,IACxB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAuD;AAC3E,WAAO,KAAK,OAAO;AAAA,MACjB,MAAM;AAAA,MACN,MAAM,EAAE,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,WAA8C;AAClE,WAAO,KAAK,OAAO;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,MAAM,CAAC;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACJ,WACA,YACA,eAC2B;AAC3B,WAAO,KAAK,OAAO;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA,MAAM,EAAE,YAAY,cAAc;AAAA,IACpC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,UAA4B,CAAC,GAAgC;AACvE,QAAI,CAACF,YAAW,KAAK,OAAO,GAAG;AAC7B,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,UAAU,MAAMG,UAAS,KAAK,SAAS,OAAO;AACpD,UAAM,QAAQ,QAAQ,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACvD,QAAI,UAA8B,CAAC;AAEnC,eAAW,QAAQ,OAAO;AACxB,UAAI;AACF,cAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,gBAAQ,KAAK,KAAK;AAAA,MACpB,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,UAAM,cAAc,QAAQ;AAC5B,QAAI,eAAe,YAAY,SAAS,GAAG;AACzC,gBAAU,QAAQ,OAAO,CAAC,MAAM,YAAY,SAAS,EAAE,IAAI,CAAC;AAAA,IAC9D;AAEA,QAAI,QAAQ,WAAW;AACrB,gBAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,cAAc,QAAQ,SAAS;AAAA,IACnE;AAEA,QAAI,QAAQ,WAAW;AACrB,YAAM,QAAQ,QAAQ,UAAU,QAAQ;AACxC,gBAAU,QAAQ,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,KAAK,KAAK;AAAA,IAC1E;AAEA,QAAI,QAAQ,SAAS;AACnB,YAAM,MAAM,QAAQ,QAAQ,QAAQ;AACpC,gBAAU,QAAQ,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,KAAK,GAAG;AAAA,IACxE;AAGA,YAAQ,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC;AAExF,QAAI,QAAQ,SAAS,QAAQ,QAAQ,GAAG;AACtC,gBAAU,QAAQ,MAAM,GAAG,QAAQ,KAAK;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBACJ,MACA,OAC6B;AAC7B,UAAM,YAAY,oBAAI,KAAK;AAC3B,cAAU,QAAQ,UAAU,QAAQ,IAAI,IAAI;AAC5C,WAAO,KAAK,MAAM,EAAE,WAAW,MAAM,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAqD;AACzD,UAAM,UAAU,MAAM,KAAK,MAAM;AACjC,UAAM,QAAgC,CAAC;AAEvC,eAAW,SAAS,SAAS;AAC3B,YAAM,MAAM,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK,KAAK;AAAA,IACjD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAgC;AAC5C,QAAI,CAACH,YAAW,KAAK,OAAO,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,MAAM,KAAK,KAAK,OAAO;AACrC,QAAI,MAAM,OAAO,mBAAmB;AAClC,aAAO;AAAA,IACT;AAGA,UAAM,cAAc,iBAAgB,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG,CAAC;AAClF,UAAM,cAAcD,MAAK,KAAK,YAAY,WAAW;AAErD,UAAM,UAAU,MAAMI,UAAS,KAAK,SAAS,OAAO;AACpD,UAAMC,WAAU,aAAa,SAAS,OAAO;AAG7C,UAAMA,WAAU,KAAK,SAAS,IAAI,OAAO;AAEzC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,UAAmC;AAC7C,UAAM,UAAU,MAAM,KAAK,MAAM;AACjC,UAAM,SAAS,oBAAI,KAAK;AACxB,WAAO,QAAQ,OAAO,QAAQ,IAAI,QAAQ;AAC1C,UAAM,aAAa,OAAO,QAAQ;AAElC,UAAM,OAAO,QAAQ,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,KAAK,UAAU;AAChF,UAAM,SAAS,QAAQ,SAAS,KAAK;AAErC,QAAI,SAAS,GAAG;AACd,YAAM,UAAU,GAAG,KAAK,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA;AAChE,YAAMA,WAAU,KAAK,SAAS,SAAS,OAAO;AAAA,IAChD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA8B;AAClC,QAAI,CAACJ,YAAW,KAAK,OAAO,GAAG;AAC7B,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,MAAM,KAAK,KAAK,OAAO;AACrC,WAAO,MAAM;AAAA,EACf;AACF;;;AC9TA,IAAM,wBAAwB;AAC9B,IAAM,uBAAuB,KAAK,KAAK;AAEvC,IAAM,yBAAyB;AAC/B,IAAM,4BAA4B;AAwBlC,SAAS,oBAAoB,OAA8B;AACzD,QAAM,kBAAkB,MAAM,SAC3B,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,MAAM,MAAM,EAAE,IAAI,KAAK,EAAE,WAAW,KAAK,EAAE,KAAK,gBAAgB,EAAE,QAAQ,GAAG,EAClF,KAAK,IAAI;AAEZ,QAAM,sBAAsB,MAAM,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI;AAErE,QAAM,eAAe,MAAM,WAAW,SACnC,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,GAAG,EAC7C,KAAK,IAAI;AAEZ,SAAO;AAAA;AAAA;AAAA;AAAA,gBAIO,MAAM,SAAS,MAAM;AAAA,EACnC,mBAAmB,2BAA2B;AAAA;AAAA,2BAErB,MAAM,aAAa,MAAM;AAAA,EAClD,uBAAuB,sBAAsB;AAAA;AAAA;AAAA,oBAG3B,MAAM,WAAW,aAAa;AAAA,sBAC5B,MAAM,WAAW,cAAc;AAAA;AAAA;AAAA,EAGnD,gBAAgB,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CnD;AAKA,SAAS,2BAA2B,UAAiC;AACnE,MAAI;AAEF,UAAM,YAAY,SAAS,MAAM,4BAA4B,KAAK,SAAS,MAAM,aAAa;AAE9F,QAAI,CAAC,WAAW;AACd,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,UAAU,UAAU,CAAC,KAAK,UAAU,CAAC;AAC3C,UAAM,SAAS,KAAK,MAAM,OAAO;AAEjC,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,OACJ;AAAA,MACC,CAAC,SACC,OAAO,KAAK,UAAU,YACtB,OAAO,KAAK,gBAAgB,YAC5B,OAAO,KAAK,WAAW,YACvB,OAAO,KAAK,eAAe;AAAA,IAC/B,EACC,IAAI,CAAC,UAAU;AAAA,MACd,GAAG;AAAA,MACH,YAAY,MAAM,QAAQ,KAAK,UAAU,IAAI,KAAK,aAAa,CAAC;AAAA,MAChE,YAAY,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,UAAU,CAAC;AAAA,IAC1D,EAAE,EACD,MAAM,GAAG,qBAAqB;AAAA,EACnC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAQA,SAAS,gBAAgB,OAAqC;AAC5D,QAAM,YAA2B;AAAA,IAC/B,GAAG,qBAAqB,MAAM,QAAQ;AAAA,IACtC,GAAG,qBAAqB,MAAM,QAAQ;AAAA,IACtC,GAAG,uBAAuB,MAAM,QAAQ;AAAA,IACxC,GAAG,yBAAyB,MAAM,QAAQ;AAAA,IAC1C,GAAG,wBAAwB,MAAM,WAAW,QAAQ;AAAA,EACtD;AAEA,SAAO,UAAU,MAAM,GAAG,qBAAqB;AACjD;AAEA,SAAS,qBAAqB,UAAoC;AAChE,QAAM,eAAe,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,SAAS,CAAC;AAC7E,MAAI,aAAa,SAAS,EAAG,QAAO,CAAC;AAErC,QAAM,WAAW,aACd,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,EAAE,WAAW;AAE3B,SAAO;AAAA,IACL;AAAA,MACE,OAAO,oBAAoB,SAAS,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MAC1D,aAAa,mBAAmB,SAAS,KAAK,IAAI,CAAC,aAAa,aAAa,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC,CAAC;AAAA,MACjH,QAAQ;AAAA,MACR,YAAY,KAAK,IAAI,KAAK,MAAM,aAAa,SAAS,GAAG;AAAA,MACzD,YAAY,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC1C;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,UAAoC;AAChE,QAAM,eAAe,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,SAAS,CAAC;AAC7E,MAAI,aAAa,SAAS,EAAG,QAAO,CAAC;AAErC,QAAM,aAAa,oBAAI,IAAY;AACnC,aAAW,KAAK,cAAc;AAC5B,UAAM,MAAM,EAAE,YAAY,MAAM,GAAG,EAAE,IAAI;AACzC,QAAI,IAAK,YAAW,IAAI,GAAG;AAAA,EAC7B;AAEA,SAAO;AAAA,IACL;AAAA,MACE,OAAO,YAAY,MAAM,KAAK,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MAChE,aAAa,8CAA8C,MAAM,KAAK,UAAU,EAAE,KAAK,IAAI,CAAC;AAAA,MAC5F,QAAQ;AAAA,MACR,YAAY,KAAK,IAAI,MAAM,MAAM,aAAa,SAAS,IAAI;AAAA,MAC3D,YAAY,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC1C;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,UAAoC;AAClE,QAAM,iBAAiB,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,SAAS,CAAC;AACjF,MAAI,eAAe,SAAS,EAAG,QAAO,CAAC;AAEvC,QAAM,WAAW,eACd,IAAI,CAAC,MAAM,EAAE,YAAY,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,YAAY,MAAM,GAAG,EAAE,CAAC,CAAC,EACrE,OAAO,OAAO;AAEjB,QAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAC5C,MAAI,eAAe,WAAW,EAAG,QAAO,CAAC;AAEzC,SAAO;AAAA,IACL;AAAA,MACE,OAAO,iBAAiB,eAAe,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MAC7D,aAAa,sCAAsC,eAAe,KAAK,IAAI,CAAC;AAAA,MAC5E,QAAQ;AAAA,MACR,YAAY,KAAK,IAAI,KAAK,MAAM,eAAe,SAAS,GAAG;AAAA,MAC3D,YAAY,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC5C;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,UAAoC;AACpE,QAAM,mBAAmB,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,SAAS,CAAC;AACrF,QAAM,YAA2B,CAAC;AAElC,aAAW,OAAO,iBAAiB,MAAM,GAAG,CAAC,GAAG;AAC9C,QAAI,SAAS;AACb,UAAM,OAAO,IAAI,YAAY,YAAY;AACzC,QAAI,KAAK,SAAS,MAAM,EAAG,UAAS;AAAA,aAC3B,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,OAAO,EAAG,UAAS;AAAA,aAC3D,KAAK,SAAS,UAAU,EAAG,UAAS;AAE7C,cAAU,KAAK;AAAA,MACb,OAAO,aAAa,IAAI,WAAW;AAAA,MACnC,aAAa,qBAAqB,IAAI,WAAW,MAAM,IAAI,KAAK;AAAA,MAChE;AAAA,MACA,YAAY,KAAK,IAAI,MAAM,MAAM,IAAI,QAAQ,IAAI;AAAA,MACjD,YAAY,CAAC,IAAI,EAAE;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,UAA6C;AAC5E,MAAI,SAAS,SAAS,EAAG,QAAO,CAAC;AAEjC,QAAM,WAAW,SAAS,MAAM,GAAG,CAAC;AACpC,QAAM,YAAY,SAAS,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,MAAM,OAAO,CAAC;AAEpE,MAAI,YAAY,GAAI,QAAO,CAAC;AAE5B,SAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,MACP,aAAa,8BAA8B,SAAS,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MAC/F,QAAQ;AAAA,MACR,YAAY,KAAK,IAAI,MAAM,MAAM,YAAY,IAAI;AAAA,MACjD,YAAY,CAAC;AAAA,IACf;AAAA,EACF;AACF;AAKA,eAAe,uBACb,KACA,OACA,QACwB;AACxB,MAAI,CAAC,IAAI,QAAQ;AACf,WAAO,gBAAgB,KAAK;AAAA,EAC9B;AAEA,QAAM,iBAAiB,cAAc,SAAS,OAAO,WAAW;AAChE,QAAM,UAAU,gBAAgB,SAAS;AAEzC,QAAM,aAAa,gBAAgB,YAAY,QAAQ,MAAM,GAAG,EAAE,CAAC,KAAK;AAExE,MAAI;AACF,UAAM,SAAS,oBAAoB,KAAK;AAGxC,UAAM,UAAU,MAAM,IAAI,OAAO,QAAQ,OAAO;AAAA,MAC9C,MAAM,EAAE,OAAO,0BAA0B;AAAA,IAC3C,CAAC;AAED,QAAI,CAAC,QAAQ,MAAM,IAAI;AACrB,aAAO,gBAAgB,KAAK;AAAA,IAC9B;AAGA,UAAM,WAAW,MAAM,IAAI,OAAO,QAAQ,OAAO;AAAA,MAC/C,MAAM,EAAE,IAAI,QAAQ,KAAK,GAAG;AAAA,MAC5B,MAAM;AAAA,QACJ,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,OAAO,CAAC,EAAE,MAAM,QAAiB,MAAM,OAAO,CAAC;AAAA,MACjD;AAAA,IACF,CAAC;AAGD,UAAM,gBAAgB,SAAS,MAAM,SAAS,CAAC;AAC/C,QAAI,eAAe;AACnB,eAAW,QAAQ,eAAe;AAChC,UAAI,UAAU,QAAQ,OAAO,KAAK,SAAS,UAAU;AACnD,uBAAe,KAAK;AACpB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,cAAc;AAEjB,YAAM,IAAI,OAAO,QAAQ,OAAO,EAAE,MAAM,EAAE,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACjF,aAAO,gBAAgB,KAAK;AAAA,IAC9B;AAEA,UAAM,eAAe,2BAA2B,YAAY;AAG5D,UAAM,IAAI,OAAO,QAAQ,OAAO,EAAE,MAAM,EAAE,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAEjF,WAAO,aAAa,SAAS,IAAI,eAAe,gBAAgB,KAAK;AAAA,EACvE,QAAQ;AAEN,WAAO,gBAAgB,KAAK;AAAA,EAC9B;AACF;AAEA,eAAsB,kBAAkB,KAAqC;AAC3E,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAE1C,MAAI,CAAC,MAAM,YAAY,iBAAiB;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,UAAU,iBAAiB;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,IAAI,KAAK,MAAM,UAAU,eAAe,EAAE,QAAQ;AAClE,QAAM,MAAM,KAAK,IAAI;AAErB,SAAO,MAAM,WAAW;AAC1B;AAEA,eAAsB,YAAY,KAAwC;AACxE,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,QAAM,SAAS,MAAM,gBAAgB,EAAE,MAAM,OAAO,CAAC,EAAE;AACvD,QAAM,eAA2B,CAAC;AAElC,QAAM,iBAAiB,MAAM,SAAS,OAAO,CAAC,MAAM;AAClD,UAAM,MAAM,KAAK,IAAI,IAAI,EAAE;AAC3B,WAAO,MAAM,IAAI,KAAK,KAAK,KAAK;AAAA,EAClC,CAAC;AAED,MAAI,eAAe,WAAW,GAAG;AAC/B,UAAM,UAAU,mBAAkB,oBAAI,KAAK,GAAE,YAAY;AACzD,UAAM,IAAI,aAAa,KAAK,KAAK;AACjC,WAAO,CAAC;AAAA,EACV;AAGA,QAAM,WAAW,IAAI,aAAa,gBAAgB,EAAE,QAAQ,cAAc,EAAE;AAC5E,QAAM,iBAAiB,IAAI,eAAe,QAAQ;AAClD,QAAM,YAAY,MAAM,eAAe,sBAAsB,CAAC;AAC9D,QAAM,eAAe,UAAU,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,KAAK,UAAU,EAAE,IAAI,CAAC,EAAE;AAEjF,QAAM,WAAW,OAAO,QAAQ,MAAM,WAAW,aAAa,EAC3D,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAC5B,MAAM,GAAG,EAAE;AAEd,QAAM,QAAuB;AAAA,IAC3B,UAAU;AAAA,IACV,gBAAgB,CAAC;AAAA,IACjB;AAAA,IACA,YAAY;AAAA,MACV,eAAe,MAAM,WAAW;AAAA,MAChC,gBAAgB,MAAM,WAAW;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,cAAc,cAAc,SAAS,OAAO,WAAW;AAC7D,QAAM,SAAS,aAAa,YAAY,UAAU,aAAa,SAAS,IAAI;AAC5E,QAAM,eAAe,SACjB,MAAM,uBAAuB,KAAK,OAAO,MAAM,IAC/C,gBAAgB,KAAK;AAEzB,aAAW,OAAO,cAAc;AAC9B,UAAM,SAAS,gBAAgB,IAAI,MAAM;AACzC,UAAM,KAAK,wBAAwB,QAAQ,IAAI,KAAK;AAEpD,QAAI,MAAM,IAAI,aAAa,YAAY,EAAE,GAAG;AAC1C;AAAA,IACF;AAEA,UAAM,WAAqB;AAAA,MACzB;AAAA,MACA,OAAO,IAAI;AAAA,MACX,aAAa,IAAI;AAAA,MACjB;AAAA,MACA,YAAY,IAAI;AAAA,MAChB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,UAAU;AAAA,QACR,YAAY,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,IAAI,aAAa,cAAc,QAAQ;AAC7C,iBAAa,KAAK,QAAQ;AAAA,EAC5B;AAEA,QAAM,UAAU,mBAAkB,oBAAI,KAAK,GAAE,YAAY;AACzD,QAAM,IAAI,aAAa,KAAK,KAAK;AAEjC,SAAO;AACT;;;AC7aA,SAAS,gBAAgB;AAElB,SAAS,cAAc,WAAmB,QAAQ,IAAc;AACrE,MAAI;AACF,UAAM,SAAS,SAAS,wBAAwB,KAAK,IAAI;AAAA,MACvD,KAAK;AAAA,MACL,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,WAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EACjD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,yBAAyB,WAA6B;AACpE,MAAI;AACF,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAChC;AAAA,IACF;AACA,WAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EACjD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,kBAAkB,WAAmB,QAAQ,IAAc;AACzE,MAAI;AACF,UAAM,SAAS,SAAS,0BAA0B,KAAK,IAAI;AAAA,MACzD,KAAK;AAAA,MACL,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,WAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EACjD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,qBAAqB,UAAyC;AAC5E,QAAM,WAAW,oBAAI,IAAoB;AACzC,aAAW,OAAO,UAAU;AAC1B,UAAM,aAAa,IAAI,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC/D,aAAS,IAAI,aAAa,SAAS,IAAI,UAAU,KAAK,KAAK,CAAC;AAAA,EAC9D;AACA,SAAO;AACT;;;AC9CA,eAAsB,eAAe,KAAuC;AAC1E,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,QAAM,cAAyB,CAAC;AAEhC,QAAM,iBAAiB,kBAAkB,IAAI,SAAS;AACtD,QAAM,iBAAiB,qBAAqB,cAAc;AAC1D,aAAW,CAAC,KAAK,KAAK,KAAK,gBAAgB;AACzC,QAAI,SAAS,GAAG;AACd,YAAM,WAAW,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,gBAAgB,GAAG;AACxF,UAAI,CAAC,UAAU;AACb,oBAAY,KAAK;AAAA,UACf,IAAI,WAAW;AAAA,UACf,MAAM;AAAA,UACN,aAAa;AAAA,UACb;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,UACpB,UAAU,KAAK,IAAI;AAAA,UACnB,UAAU;AAAA,UACV,UAAU,CAAC;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,WAAW;AACnC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACrD,QAAI,SAAS,GAAG;AACd,YAAM,WAAW,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,gBAAgB,IAAI;AACvF,UAAI,CAAC,UAAU;AACb,oBAAY,KAAK;AAAA,UACf,IAAI,WAAW;AAAA,UACf,MAAM;AAAA,UACN,aAAa;AAAA,UACb;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,UACpB,UAAU,KAAK,IAAI;AAAA,UACnB,UAAU;AAAA,UACV,UAAU,CAAC;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,gBAAgB,KAAsC;AAC1E,QAAM,QAAQ,MAAM,IAAI,aAAa,KAAK;AAC1C,QAAM,cAAwB,CAAC;AAE/B,aAAW,WAAW,MAAM,UAAU;AACpC,QAAI,QAAQ,SAAU;AACtB,QAAI,QAAQ,QAAQ,MAAM,YAAY,gBAAiB;AAEvD,QAAI,aAAa;AACjB,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,qBAAa,IAAI,KAAK,EAAE,kBAAkB;AAAA,UACxC,SAAS,QAAQ;AAAA,UACjB,OAAO,QAAQ;AAAA,QACjB,CAAC;AACD;AAAA,MACF,KAAK;AACH,qBAAa,IAAI,KAAK,EAAE,gBAAgB;AAAA,UACtC,SAAS,QAAQ;AAAA,UACjB,OAAO,QAAQ;AAAA,QACjB,CAAC;AACD;AAAA,MACF,KAAK;AACH,qBAAa,IAAI,KAAK,EAAE,gBAAgB;AAAA,UACtC,SAAS,QAAQ;AAAA,UACjB,OAAO,QAAQ;AAAA,QACjB,CAAC;AACD;AAAA,MACF,KAAK;AACH,qBAAa,IAAI,KAAK,EAAE,oBAAoB;AAAA,UAC1C,SAAS,QAAQ;AAAA,UACjB,OAAO,QAAQ;AAAA,QACjB,CAAC;AACD;AAAA,IACJ;AACA,gBAAY,KAAK,UAAU;AAAA,EAC7B;AAEA,SAAO;AACT;;;AC1FA,SAAS,YAAY;AASd,IAAM,wBAAqC,CAAC,QAAQ;AACzD,QAAM,EAAE,cAAc,WAAW,MAAM,YAAY,IAAI;AAEvD,QAAM,WAAW,aAAa,gBAAgB,EAAE,QAAQ,cAAc,EAAE;AACxE,QAAM,iBAAiB,IAAI,eAAe,QAAQ;AAClD,QAAM,gBAAgB,IAAI,qBAAqB,UAAU,aAAa,eAAe,CAAC;AACtF,QAAM,iBAAiB,IAAI,eAAe,SAAS;AAEnD,SAAO;AAAA,IACL,sBAAsB,KAAK;AAAA,MACzB,aAAa,KAAK,EAAE,+BAA+B;AAAA,MACnD,MAAM;AAAA,QACJ,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,KAAK,EAAE,8BAA8B,CAAC;AAAA,QACtF,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,KAAK,EAAE,8BAA8B,CAAC;AAAA,MACxF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMK,QAAO,MAAM;AAEnB,cAAM,QAAQ,KAAK,QACd,KAAK,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAC1C;AAEJ,cAAM,eAAe,MAAM,eAAe,MAAM;AAAA,UAC9C;AAAA,UACA,OAAO,KAAK,SAAS;AAAA,QACvB,CAAC;AAED,YAAI,aAAa,WAAW,GAAG;AAC7B,iBAAOA,MAAK,EAAE,oBAAoB;AAAA,QACpC;AAEA,cAAM,UAAU,MAAM,eAAe,WAAW;AAChD,cAAM,UACJ,UAAU,OACN,GAAG,OAAO,MACV,UAAU,OAAO,OACf,IAAI,UAAU,MAAM,QAAQ,CAAC,CAAC,OAC9B,IAAI,WAAW,OAAO,OAAO,QAAQ,CAAC,CAAC;AAE/C,YAAI,SAAS,GAAGA,MAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA;AAC5C,kBAAU,GAAGA,MAAK,EAAE,sBAAsB,EAAE,OAAO,aAAa,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAAA;AAAA;AAExF,mBAAW,OAAO,aAAa,MAAM,GAAG,EAAE,GAAG;AAC3C,gBAAM,OAAO,IAAI,KAAK,IAAI,SAAS,EAAE,mBAAmB;AACxD,gBAAM,OAAO,KAAK,UAAU,IAAI,IAAI,EAAE,MAAM,GAAG,EAAE;AACjD,oBAAU,OAAO,IAAI,QAAQ,IAAI,IAAI,OAAO,IAAI;AAAA;AAAA,QAClD;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,yBAAyB,KAAK;AAAA,MAC5B,aAAa,KAAK,EAAE,kCAAkC;AAAA,MACtD,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMA,QAAO,MAAM;AAEnB,cAAM,WAAW,MAAM,cAAc,kBAAkB,CAAC;AACxD,YAAI,SAAS,WAAW,GAAG;AACzB,iBAAOA,MAAK,EAAE,uBAAuB;AAAA,QACvC;AAEA,YAAI,SAAS,GAAGA,MAAK,EAAE,uBAAuB,CAAC;AAAA;AAAA;AAG/C,cAAM,UAAU,MAAM,cAAc,kBAAkB;AACtD,kBAAU,GAAG,OAAO;AAAA;AAAA;AAGpB,cAAM,WAAW,MAAM,cAAc,4BAA4B;AACjE,YAAI,SAAS,SAAS,GAAG;AACvB,oBAAU,GAAGA,MAAK,EAAE,gCAAgC,CAAC;AAAA;AACrD,qBAAW,WAAW,SAAS,MAAM,GAAG,CAAC,GAAG;AAC1C,kBAAM,aACJ,SAAI,OAAO,KAAK,MAAM,QAAQ,aAAa,CAAC,CAAC,IAC7C,SAAI,OAAO,IAAI,KAAK,MAAM,QAAQ,aAAa,CAAC,CAAC;AACnD,sBAAU,MAAM,UAAU,KAAK,QAAQ,WAAW,KAAK,QAAQ,SAAS;AAAA;AAAA,UAC1E;AACA,oBAAU;AAAA,QACZ;AAGA,cAAM,QAAQ,MAAM,cAAc,mBAAmB;AACrD,YAAI,MAAM,SAAS,GAAG;AACpB,oBAAU;AACV,qBAAW,QAAQ,OAAO;AACxB,sBAAU,KAAK,IAAI;AAAA;AAAA,UACrB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,yBAAyB,KAAK;AAAA,MAC5B,aAAa,KAAK,EAAE,kCAAkC;AAAA,MACtD,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMA,QAAO,MAAM;AACnB,cAAM,WAAW,EAAE,cAAc,WAAW,MAAAA,MAAK;AAEjD,cAAM,eAAe,WAAW;AAChC,cAAM,SAAS,MAAM,eAAe,0BAA0B,QAAQ;AAEtE,YAAI,OAAO,WAAW,GAAG;AACvB,iBAAOA,MAAK,EAAE,uBAAuB;AAAA,QACvC;AAEA,YAAI,SAAS,GAAGA,MAAK,EAAE,uBAAuB,CAAC;AAAA;AAAA;AAC/C,kBAAU,GAAGA,MAAK,EAAE,2BAA2B,EAAE,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA;AAAA;AAExE,mBAAW,SAAS,QAAQ;AAC1B,oBAAU,iBAAU,MAAM,IAAI;AAAA;AAC9B,oBAAU,iBAAiB,MAAM,SAAS,MAAM;AAAA;AAChD,oBAAU,iBAAiB,MAAM,IAAI;AAAA;AAAA;AAAA,QACvC;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACnIA,SAAS,QAAAC,aAAY;;;ACArB,SAAS,mBAAmB,QAAQ,2BAA2B;AAC/D,SAAS,MAAM,UAAU;AAalB,SAAS,4BAA4B,aAA2C;AACrF,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,QAAQ,kBAAkB,oBAAI,KAAK,GAAG,IAAI,KAAK,WAAW,CAAC;AACjE,MAAI,QAAQ,EAAG,QAAO;AACtB,MAAI,QAAQ,GAAI,QAAO;AACvB,MAAI,QAAQ,GAAI,QAAO;AACvB,MAAI,QAAQ,IAAK,QAAO;AACxB,SAAO;AACT;AAGO,SAAS,cAAc,KAAmB,OAAc,YAA8B;AAC3F,QAAM,aAAa,MAAM,QAAQ,WAAW,MAAM,GAAG;AACrD,QAAM,eAAe,MAAM,QAAQ,aAAa,MAAM,EAAE;AACxD,QAAM,SAAS,IAAI,KAAK,aAAa,UAAU,KAAK;AAEpD,MAAI,SAAS,GAAG,IAAI,KAAK,EAAE,iBAAiB,EAAE,SAAS,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA;AAAA;AAC5E,YAAU,GAAG,IAAI,KAAK,EAAE,kBAAkB,CAAC;AAAA;AAAA;AAC3C,YAAU,GAAG,IAAI,KAAK,EAAE,6BAA6B;AAAA,IACnD,OAAO,MAAM,QAAQ;AAAA,EACvB,CAAC,CAAC;AAAA;AACF,YAAU,GAAG,IAAI,KAAK,EAAE,2BAA2B;AAAA,IACjD,MAAM,OAAO,MAAM,QAAQ,cAAc,YAAY;AAAA,EACvD,CAAC,CAAC;AAAA;AACF,YAAU,GAAG,IAAI,KAAK,EAAE,4BAA4B;AAAA,IAClD,OAAO,MAAM,UAAU,aAAa;AAAA,EACtC,CAAC,CAAC;AAAA;AAAA;AAEF,MAAI,MAAM,QAAQ,SAAS,MAAM,QAAQ,MAAM,SAAS,GAAG;AACzD,cAAU,GAAG,IAAI,KAAK,EAAE,qBAAqB;AAAA,MAC3C,OAAO,MAAM,QAAQ,MAAM,KAAK,IAAI;AAAA,IACtC,CAAC,CAAC;AAAA;AAAA,EACJ;AACA,MAAI,MAAM,QAAQ,OAAO;AACvB,cAAU,GAAG,IAAI,KAAK,EAAE,wBAAwB,EAAE,OAAO,MAAM,QAAQ,MAAM,CAAC,CAAC;AAAA;AAAA,EACjF;AACA,YAAU;AAEV,MAAI,WAAW,SAAS,GAAG;AACzB,cAAU,GAAG,IAAI,KAAK,EAAE,mBAAmB,CAAC;AAAA;AAC5C,eAAW,KAAK,YAAY;AAC1B,YAAM,UAAU,oBAAoB,IAAI,KAAK,EAAE,SAAS,GAAG,EAAE,WAAW,MAAM,OAAO,CAAC;AACtF,gBAAU,KAAK,EAAE,SAAS,KAAK,OAAO;AAAA;AAAA,IACxC;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,cAAU,GAAG,IAAI,KAAK,EAAE,mBAAmB,CAAC;AAAA;AAC5C,eAAW,KAAK,cAAc;AAC5B,gBAAU,KAAK,EAAE,WAAW;AAAA;AAAA,IAC9B;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,MAAM,UAAU,aAAa,SAAS,GAAG;AAC3C,cAAU,GAAG,IAAI,KAAK,EAAE,gBAAgB,CAAC;AAAA;AACzC,eAAW,OAAO,MAAM,UAAU,aAAa,MAAM,EAAE,GAAG;AACxD,gBAAU,OAAO,IAAI,IAAI,OAAO;AAAA,QAC9B,IAAI;AAAA,QACJ,IAAI;AAAA,MACN,CAAC,MAAM,IAAI,WAAW;AAAA;AAAA,IACxB;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,cAAU,GAAG,IAAI,KAAK,EAAE,iBAAiB,CAAC;AAAA;AAC1C,eAAW,UAAU,WAAW,MAAM,GAAG,CAAC,GAAG;AAC3C,gBAAU,KAAK,MAAM;AAAA;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,IAAoB;AACjD,QAAM,UAAU,KAAK,MAAM,KAAK,MAAO,EAAE;AACzC,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,mBAAmB,UAAU;AACnC,SAAO,GAAG,KAAK,KAAK,gBAAgB;AACtC;AAEO,SAAS,mBACd,KACA,OACA,aACA,aACQ;AACR,MAAI,SAAS,GAAG,IAAI,KAAK,EAAE,cAAc,EAAE,SAAS,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA;AAAA;AACzE,YAAU,GAAG,IAAI,KAAK,EAAE,eAAe,CAAC;AAAA;AAAA;AAExC,QAAM,gBAAgB,OAAO,QAAQ,MAAM,WAAW,aAAa,EAChE,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAC5B,MAAM,GAAG,EAAE;AAEd,MAAI,cAAc,SAAS,GAAG;AAC5B,cAAU,GAAG,IAAI,KAAK,EAAE,sBAAsB,CAAC;AAAA;AAC/C,eAAW,CAAC,MAAM,KAAK,KAAK,eAAe;AACzC,gBAAU,OAAO,IAAI,MAAM,IAAI,KAAK,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAC;AAAA;AAAA,IACzE;AACA,cAAU;AAAA,EACZ;AAEA,QAAM,eAAe,MAAM,SACxB,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACnC,MAAI,aAAa,SAAS,GAAG;AAC3B,cAAU,GAAG,IAAI,KAAK,EAAE,oBAAoB,CAAC;AAAA;AAC7C,eAAW,KAAK,aAAa,MAAM,GAAG,CAAC,GAAG;AACxC,gBAAU,KAAK,EAAE,WAAW,KAAK,EAAE,KAAK;AAAA;AAAA,IAC1C;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,WAAW,oBAAI,IAAoB;AACzC,eAAW,QAAQ,aAAa;AAC9B,YAAM,MAAM,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,KAAK;AACtD,eAAS,IAAI,MAAM,SAAS,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,IAChD;AACA,UAAM,aAAa,CAAC,GAAG,SAAS,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAErE,cAAU,GAAG,IAAI,KAAK,EAAE,sBAAsB,CAAC;AAAA;AAC/C,eAAW,CAAC,KAAK,KAAK,KAAK,WAAW,MAAM,GAAG,CAAC,GAAG;AACjD,gBAAU,OAAO,GAAG,OAAO,IAAI,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAAA;AAAA,IAC/D;AACA,cAAU;AAAA,EACZ;AAEA,YAAU,GAAG,IAAI,KAAK,EAAE,gBAAgB,CAAC;AAAA;AACzC,YAAU,GAAG,IAAI,KAAK,EAAE,gBAAgB,CAAC;AAAA;AACzC,YAAU,GAAG,IAAI,KAAK,EAAE,gBAAgB,CAAC;AAAA;AACzC,YAAU,GAAG,IAAI,KAAK,EAAE,gBAAgB,CAAC;AAAA;AAEzC,MAAI,MAAM,QAAQ,OAAO;AACvB,cAAU;AAAA,EAAK,IAAI,KAAK,EAAE,qBAAqB,EAAE,OAAO,MAAM,QAAQ,MAAM,CAAC,CAAC;AAAA;AAAA,EAChF;AAEA,SAAO;AACT;;;ADhJO,IAAM,kBAA+B,CAAC,QAAQ;AACnD,QAAM,EAAE,cAAc,WAAW,WAAW,MAAM,YAAY,IAAI;AAElE,SAAO;AAAA,IACL,cAAcC,MAAK;AAAA,MACjB,aAAa,KAAK,EAAE,uBAAuB;AAAA,MAC3C,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMC,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,cAAc,MAAM,QAAQ,gBAAgB;AAElD,YAAI,aAAa;AACf,iBAAOA,MAAK,EAAE,mBAAmB,EAAE,SAAS,MAAM,QAAQ,KAAK,CAAC;AAAA,QAClE;AAEA,cAAM,YAAY,4BAA4B,MAAM,QAAQ,WAAW;AACvE,cAAM,YAAY,MAAM,QAAQ,aAAa,MAAM,EAAE;AAErD,YAAI,WAAW,GAAGA,MAAK,EAAE,uBAAuB,CAAC;AAAA;AAAA;AACjD,oBAAY,GAAGA,MAAK,EAAE,0BAA0B,EAAE,SAAS,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA;AAAA;AAChF,oBAAY,GAAGA,MAAK,EAAE,wBAAwB;AAAA,UAC5C,UAAU,MAAM,QAAQ;AAAA,UACxB,UAAU,MAAM,SAAS;AAAA,QAC3B,CAAC,CAAC;AAAA;AAAA;AAEF,YAAI,cAAc,cAAc;AAC9B,sBAAY,GAAGA,MAAK,EAAE,2BAA2B,CAAC;AAAA;AAAA;AAAA,QACpD;AAEA,YAAI,UAAU,SAAS,GAAG;AACxB,sBAAY,GAAGA,MAAK,EAAE,iCAAiC,CAAC;AAAA;AACxD,qBAAW,KAAK,WAAW;AACzB,wBAAY,KAAK,EAAE,WAAW;AAAA;AAAA,UAChC;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,gBAAgBD,MAAK;AAAA,MACnB,aAAa,KAAK,EAAE,yBAAyB;AAAA,MAC7C,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMC,QAAO,MAAM;AACnB,cAAM,WAAW,EAAE,cAAc,WAAW,MAAAA,MAAK;AACjD,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,cAAc,yBAAyB,SAAS;AACtD,cAAM,aAAa,cAAc,WAAW,CAAC;AAE7C,YAAI,SAAS,GAAGA,MAAK,EAAE,gBAAgB,EAAE,SAAS,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA;AAAA;AACvE,kBAAU,GAAGA,MAAK,EAAE,kBAAkB,EAAE,OAAO,MAAM,QAAQ,aAAa,CAAC,CAAC;AAAA;AAC5E,kBAAU,GAAGA,MAAK,EAAE,mBAAmB;AAAA,UACrC,OAAO,MAAM,SAAS;AAAA,UACtB,UAAU,MAAM,SAAS,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE;AAAA,QACrD,CAAC,CAAC;AAAA;AACF,kBAAU,GAAGA,MAAK,EAAE,qBAAqB,EAAE,OAAO,UAAU,OAAO,CAAC,CAAC;AAAA;AAAA;AAErE,YAAI,YAAY,SAAS,GAAG;AAC1B,oBAAU,GAAGA,MAAK,EAAE,qBAAqB,CAAC;AAAA;AAC1C,qBAAW,KAAK,YAAY,MAAM,GAAG,CAAC,GAAG;AACvC,sBAAU,KAAK,CAAC;AAAA;AAAA,UAClB;AACA,oBAAU;AAAA,QACZ;AAEA,YAAI,WAAW,SAAS,GAAG;AACzB,oBAAU,GAAGA,MAAK,EAAE,uBAAuB,CAAC;AAAA;AAC5C,qBAAW,KAAK,YAAY;AAC1B,sBAAU,KAAK,CAAC;AAAA;AAAA,UAClB;AAAA,QACF;AAEA,cAAM,cAAc,MAAM,gBAAgB,QAAQ;AAClD,YAAI,YAAY,SAAS,GAAG;AAC1B,oBAAU;AAAA,EAAKA,MAAK,EAAE,oBAAoB,CAAC;AAAA;AAC3C,qBAAW,KAAK,aAAa;AAC3B,sBAAU,KAAK,CAAC;AAAA;AAAA,UAClB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,iBAAiBD,MAAK;AAAA,MACpB,aAAa,KAAK,EAAE,0BAA0B;AAAA,MAC9C,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMC,QAAO,MAAM;AACnB,cAAM,WAAW,EAAE,cAAc,WAAW,MAAAA,MAAK;AACjD,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,aAAa,cAAc,WAAW,EAAE;AAC9C,eAAO,cAAc,UAAU,OAAO,UAAU;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,IAED,kBAAkBD,MAAK;AAAA,MACrB,aAAa,KAAK,EAAE,2BAA2B;AAAA,MAC/C,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMC,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AAEtC,YAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,iBAAOA,MAAK,EAAE,eAAe;AAAA,QAC/B;AAEA,YAAI,SAAS,GAAGA,MAAK,EAAE,gBAAgB,CAAC;AAAA;AAAA;AACxC,kBAAU,GAAGA,MAAK,EAAE,kBAAkB,EAAE,OAAO,MAAM,SAAS,OAAO,CAAC,CAAC;AAAA;AAAA;AAEvE,cAAM,SAAS,oBAAI,IAAuB;AAC1C,mBAAW,KAAK,MAAM,UAAU;AAC9B,gBAAM,OAAO,OAAO,IAAI,EAAE,IAAI,KAAK,CAAC;AACpC,eAAK,KAAK,CAAC;AACX,iBAAO,IAAI,EAAE,MAAM,IAAI;AAAA,QACzB;AAEA,mBAAW,CAAC,MAAM,QAAQ,KAAK,QAAQ;AACrC,oBAAU,GAAGA,MAAK,EAAE,oBAAoB;AAAA,YACtC,MAAM,kBAAkBA,OAAM,IAAI;AAAA,UACpC,CAAC,CAAC;AAAA;AACF,qBAAW,KAAK,SAAS,MAAM,GAAG,EAAE,GAAG;AACrC,kBAAM,SAAS,EAAE,WAAW,WAAM;AAClC,sBAAU,GAAG,MAAM,MAAM,EAAE,WAAW,OAAO,EAAE,KAAK;AAAA;AAAA,UACtD;AACA,oBAAU;AAAA,QACZ;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,cAAcD,MAAK;AAAA,MACjB,aAAa,KAAK,EAAE,uBAAuB;AAAA,MAC3C,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMC,QAAO,MAAM;AACnB,cAAM,WAAW,EAAE,cAAc,WAAW,MAAAA,MAAK;AACjD,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,aAAa,cAAc,WAAW,EAAE;AAC9C,cAAM,cAAc,yBAAyB,SAAS;AACtD,eAAO,mBAAmB,UAAU,OAAO,YAAY,WAAW;AAAA,MACpE;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AE9JA,SAAS,QAAAC,aAAY;AACrB,SAAS,UAAAC,eAAc;AAYhB,IAAM,uBAAoC,CAAC,QAAQ;AACxD,QAAM,EAAE,cAAc,WAAW,MAAM,YAAY,IAAI;AAEvD,SAAO;AAAA,IACL,gBAAgBC,MAAK;AAAA,MACnB,aAAa,KAAK,EAAE,yBAAyB;AAAA,MAC7C,MAAM;AAAA,QACJ,QAAQA,MAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,KAAK,EAAE,yBAAyB,CAAC;AAAA,MACpF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMC,QAAO,MAAM;AACnB,cAAM,WAAW,EAAE,cAAc,WAAW,MAAAA,MAAK;AAEjD,YAAI,KAAK,QAAQ;AACf,gBAAMC,eAAc,MAAM,wBAAwB,QAAQ;AAC1D,gBAAM,aAAaA,aAAY,KAAK,CAAC,MAAM,EAAE,QAAQ,OAAO,KAAK,MAAM;AACvE,cAAI,CAAC,YAAY;AACf,mBAAOD,MAAK,EAAE,qBAAqB,EAAE,IAAI,KAAK,OAAO,CAAC;AAAA,UACxD;AACA,gBAAM,EAAE,YAAY,SAAS,IAAI,MAAM,iBAAiB,UAAU,UAAU;AAC5E,iBAAO,GAAGA,MAAK,EAAE,wBAAwB,CAAC;AAAA;AAAA,EAAO;AAAA,YAC/C;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,cAAc,MAAM,wBAAwB,QAAQ;AAC1D,YAAI,YAAY,WAAW,GAAG;AAC5B,iBAAOA,MAAK,EAAE,cAAc;AAAA,QAC9B;AAEA,YAAI,SAAS,GAAGA,MAAK,EAAE,mBAAmB,CAAC;AAAA;AAAA;AAC3C,kBAAU,GAAGA,MAAK,EAAE,mBAAmB,CAAC;AAAA;AAAA;AAExC,mBAAW,KAAK,aAAa;AAC3B,oBAAU,cAAS,EAAE,IAAI;AAAA;AACzB,oBAAU,OAAOA,MAAK,EAAE,kBAAkB,CAAC,OAAO,qBAAqBA,OAAM,EAAE,IAAI,CAAC;AAAA;AACpF,oBAAU,OAAOA,MAAK,EAAE,oBAAoB,CAAC,OAAO,EAAE,MAAM;AAAA;AAC5D,oBAAU,OAAOA,MAAK,EAAE,wBAAwB,CAAC,SAAS,EAAE,QAAQ,EAAE;AAAA;AAAA;AAAA,QACxE;AAEA,kBAAU;AAAA,EAAKA,MAAK,EAAE,oBAAoB,CAAC;AAC3C,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,sBAAsBD,MAAK;AAAA,MACzB,aAAa,KAAK,EAAE,+BAA+B;AAAA,MACnD,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMC,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AAEtC,YAAI,MAAM,UAAU,aAAa,WAAW,GAAG;AAC7C,iBAAOA,MAAK,EAAE,oBAAoB;AAAA,QACpC;AAEA,YAAI,SAAS,GAAGA,MAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA;AAC5C,kBAAU,GAAGA,MAAK,EAAE,oBAAoB,CAAC;AAAA;AAAA;AACzC,mBAAW,OAAO,MAAM,UAAU,cAAc;AAC9C,oBAAU,cAAS,IAAI,IAAI;AAAA;AAC3B,oBAAU,OAAOA,MAAK,EAAE,mBAAmB,CAAC,OAAO;AAAA,YACjDA;AAAA,YACA,IAAI;AAAA,UACN,CAAC;AAAA;AACD,oBAAU,OAAOA,MAAK,EAAE,0BAA0B,CAAC,OAAO,IAAI,WAAW;AAAA;AACzE,oBAAU,OAAOA,MAAK,EAAE,uBAAuB,CAAC,OAAOE;AAAA,YACrD,IAAI,KAAK,IAAI,SAAS;AAAA,YACtB;AAAA,UACF,CAAC;AAAA;AAAA;AAAA,QACH;AACA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACzFA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,SAAAC,QAAO,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,QAAAC,aAAY;AACrB,SAAS,QAAAC,aAAY;AACrB,SAAS,UAAAC,eAAc;AAYhB,IAAM,sBAAmC,CAAC,QAAQ;AACvD,QAAM,EAAE,cAAc,WAAW,WAAW,MAAM,YAAY,IAAI;AAElE,SAAO;AAAA,IACL,mBAAmBC,MAAK;AAAA,MACtB,aAAa,KAAK,EAAE,4BAA4B;AAAA,MAChD,MAAM;AAAA,QACJ,QAAQA,MAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,KAAK,EAAE,4BAA4B,CAAC;AAAA,MACvF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMC,QAAO,MAAM;AACnB,cAAM,YAAY,MAAM,aAAa,cAAc;AAEnD,YAAI,UAAU,WAAW,GAAG;AAC1B,iBAAOA,MAAK,EAAE,iBAAiB;AAAA,QACjC;AAEA,YAAI,WAAW;AACf,YAAI,KAAK,QAAQ;AACf,qBAAW,UAAU,OAAO,CAAC,SAAS,KAAK,WAAW,KAAK,MAAM;AAAA,QACnE;AAEA,cAAM,WAAW,uBAAuB,QAAQ;AAEhD,YAAI,SAAS,GAAGA,MAAK,EAAE,iBAAiB,CAAC;AAAA;AAAA;AACzC,kBAAU,GAAGA,MAAK,EAAE,mBAAmB,EAAE,OAAO,SAAS,OAAO,CAAC,CAAC;AAAA;AAAA;AAElE,mBAAW,CAAC,QAAQ,eAAe,KAAK,UAAU;AAChD,oBAAU,OAAO,MAAM;AAAA;AACvB,qBAAW,QAAQ,gBAAgB,MAAM,GAAG,EAAE,GAAG;AAC/C,kBAAM,MACJ,SAAI,OAAO,KAAK,MAAM,KAAK,aAAa,CAAC,CAAC,IAC1C,SAAI,OAAO,IAAI,KAAK,MAAM,KAAK,aAAa,CAAC,CAAC;AAChD,kBAAM,YAAY,KAAK,WAAW,cAAc,eAAQ;AACxD,sBAAU,MAAM,GAAG,OAAO,KAAK,KAAK,KAAK,SAAS;AAAA;AAClD,sBAAU,KAAK,KAAK,WAAW;AAAA;AAAA,UACjC;AACA,oBAAU;AAAA,QACZ;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,gBAAgBD,MAAK;AAAA,MACnB,aAAa,KAAK,EAAE,yBAAyB;AAAA,MAC7C,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMC,QAAO,MAAM;AACnB,cAAM,WAAW,MAAM,aAAa,gBAAgB;AAEpD,YAAI,SAAS,UAAU,WAAW,GAAG;AACnC,iBAAOA,MAAK,EAAE,cAAc;AAAA,QAC9B;AAEA,cAAM,aAAaC,MAAK,WAAW,aAAa,SAAS,SAAS;AAClE,YAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,gBAAMC,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,QAC7C;AAEA,cAAM,WAAW,aAAaC,QAAO,oBAAI,KAAK,GAAG,mBAAmB,CAAC;AACrE,cAAM,WAAWH,MAAK,YAAY,QAAQ;AAC1C,cAAMI,WAAU,UAAU,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAE3D,eAAOL,MAAK,EAAE,kBAAkB;AAAA,UAC9B,OAAO,SAAS,UAAU;AAAA,UAC1B,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IAED,gBAAgBD,MAAK;AAAA,MACnB,aAAa,KAAK,EAAE,yBAAyB;AAAA,MAC7C,MAAM;AAAA,QACJ,MAAMA,MAAK,OAAO,OAAO,EAAE,SAAS,KAAK,EAAE,uBAAuB,CAAC;AAAA,MACrE;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMC,QAAO,MAAM;AAEnB,YAAI,CAACE,YAAW,KAAK,IAAI,GAAG;AAC1B,iBAAOF,MAAK,EAAE,oBAAoB,EAAE,MAAM,KAAK,KAAK,CAAC;AAAA,QACvD;AAEA,YAAI;AACF,gBAAM,UAAU,MAAMM,UAAS,KAAK,MAAM,OAAO;AACjD,gBAAM,OAAO,KAAK,MAAM,OAAO;AAK/B,gBAAM,WAAW,MAAM,aAAa;AAAA,YAClC,KAAK;AAAA,YACL,KAAK,SAAS;AAAA,UAChB;AAEA,gBAAM,aAAa,oBAAoB;AAEvC,iBAAON,MAAK,EAAE,kBAAkB;AAAA,YAC9B,OAAO;AAAA,YACP,MAAM,KAAK,SAAS;AAAA,UACtB,CAAC;AAAA,QACH,QAAQ;AACN,iBAAOA,MAAK,EAAE,cAAc;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IAED,eAAeD,MAAK;AAAA,MAClB,aAAa,KAAK,EAAE,wBAAwB;AAAA,MAC5C,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMC,QAAO,MAAM;AACnB,cAAM,WAAW,EAAE,cAAc,WAAW,MAAAA,MAAK;AACjD,cAAM,cAAc,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAC1D,cAAM,cAAc,yBAAyB,SAAS,EAAE,MAAM,GAAG,CAAC;AAElE,cAAM,aAAa,MAAM,uBAAuB,UAAU,aAAa,WAAW;AAElF,YAAI,WAAW,WAAW,GAAG;AAC3B,iBAAOA,MAAK,EAAE,YAAY;AAAA,QAC5B;AAEA,YAAI,SAAS,GAAGA,MAAK,EAAE,aAAa,CAAC;AAAA;AAAA;AACrC,mBAAW,WAAW,YAAY;AAChC,oBAAU,GAAG,yBAAyB,SAASA,KAAI,CAAC;AAAA;AACpD,oBAAU,YAAO,QAAQ,SAAS,WAAW;AAAA;AAAA;AAAA,QAC/C;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,kBAAkBD,MAAK;AAAA,MACrB,aAAa,KAAK,EAAE,2BAA2B;AAAA,MAC/C,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMC,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AAEtC,YAAI,CAAC,MAAM,QAAQ,UAAU;AAC3B,gBAAM,aAAa,mBAAmB;AACtC,gBAAM,UAAU,MAAM,aAAa,KAAK;AACxC,gBAAM,QAAQ,WAAW,QAAQ,QAAQ;AAAA,QAC3C;AAEA,YAAI,CAAC,MAAM,QAAQ,UAAU;AAC3B,iBAAOA,MAAK,EAAE,gBAAgB;AAAA,QAChC;AACA,cAAM,WAAW,MAAM,QAAQ;AAC/B,cAAM,WAAW,IAAI,KAAK,SAAS,QAAQ;AAC3C,cAAM,YAAY,KAAK,OAAO,KAAK,IAAI,IAAI,SAAS,QAAQ,MAAM,MAAO,KAAK,KAAK,GAAG;AAEtF,YAAI,SAAS,GAAGA,MAAK,EAAE,gBAAgB,CAAC;AAAA;AAAA;AACxC,kBAAU,KAAKA,MAAK,EAAE,sBAAsB,CAAC,OAAO,SAAS,WAAW;AAAA;AACxE,kBAAU,KAAKA,MAAK,EAAE,mBAAmB,CAAC,OAAOI,QAAO,UAAU,YAAY,CAAC,KAAK,SAAS,IAAIJ,MAAK,EAAE,eAAe,CAAC;AAAA;AACxH,kBAAU,KAAKA,MAAK,EAAE,4BAA4B,CAAC,OAAO,SAAS,qBAAqB;AAAA;AACxF,kBAAU,KAAKA,MAAK,EAAE,qBAAqB,CAAC,OAAO,SAAS,eAAe;AAAA;AAE3E,YAAI,SAAS,oBAAoB,SAAS,GAAG;AAC3C,oBAAU,KAAKA,MAAK,EAAE,2BAA2B,CAAC,OAAO,SAAS,oBAAoB,KAAK,IAAI,CAAC;AAAA;AAAA,QAClG;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IAED,mBAAmBD,MAAK;AAAA,MACtB,aAAa,KAAK,EAAE,4BAA4B;AAAA,MAChD,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMC,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,YAAY,MAAM,WAAW,iBAAiB,CAAC;AAErD,YAAI,UAAU,WAAW,GAAG;AAC1B,iBAAOA,MAAK,EAAE,iBAAiB;AAAA,QACjC;AAEA,YAAI,SAAS,GAAGA,MAAK,EAAE,iBAAiB,CAAC;AAAA;AAAA;AACzC,mBAAW,OAAO,UAAU,MAAM,GAAG,EAAE,GAAG;AACxC,oBAAU,OAAO,IAAI,MAAM,KAAK,UAAK,CAAC,OAAO,IAAI,KAAK;AAAA;AAAA,QACxD;AAEA,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,uBAAuB,WAAgD;AAC9E,QAAM,WAAW,oBAAI,IAAwB;AAC7C,aAAW,QAAQ,WAAW;AAC5B,UAAM,OAAO,SAAS,IAAI,KAAK,MAAM,KAAK,CAAC;AAC3C,SAAK,KAAK,IAAI;AACd,aAAS,IAAI,KAAK,QAAQ,IAAI;AAAA,EAChC;AACA,SAAO;AACT;;;ACrNA,SAAS,cAAAO,mBAAkB;AAC3B,SAAS,SAAAC,QAAO,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,QAAAC,aAAY;AACrB,SAAS,QAAAC,aAAY;AAMd,IAAM,iBAA8B,CAAC,QAAQ;AAClD,QAAM,EAAE,cAAc,WAAW,MAAM,YAAY,IAAI;AAEvD,SAAO;AAAA,IACL,oBAAoBA,MAAK;AAAA,MACvB,aAAa,KAAK,EAAE,6BAA6B;AAAA,MACjD,MAAM;AAAA,QACJ,OAAOA,MAAK,OAAO,OAAO,EAAE,SAAS,KAAK,EAAE,4BAA4B,CAAC;AAAA,MAC3E;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMC,QAAO,MAAM;AACnB,cAAM,YAAY,kCAAkC,mBAAmB,KAAK,KAAK,CAAC;AAClF,cAAM,UAAU;AAAA,UACd;AAAA,YACE,MAAM;AAAA,YACN,MAAMA,MAAK,EAAE,0BAA0B;AAAA,YACvC,KAAK;AAAA,UACP;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAMA,MAAK,EAAE,wBAAwB;AAAA,YACrC,KAAK;AAAA,UACP;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,MAAMA,MAAK,EAAE,0BAA0B;AAAA,YACvC,KAAK;AAAA,UACP;AAAA,UACA,EAAE,MAAM,cAAc,MAAMA,MAAK,EAAE,4BAA4B,EAAE;AAAA,UACjE,EAAE,MAAM,aAAa,MAAMA,MAAK,EAAE,2BAA2B,EAAE;AAAA,QACjE;AACA,cAAM,eAAe,QAClB;AAAA,UAAI,CAAC,WACJ,OAAO,MACH,OAAO,OAAO,IAAI,QAAQ,OAAO,IAAI,OAAO,OAAO,GAAG,OACtD,OAAO,OAAO,IAAI,QAAQ,OAAO,IAAI;AAAA,QAC3C,EACC,KAAK,IAAI;AACZ,eAAO,GAAGA,MAAK,EAAE,qBAAqB;AAAA,UACpC,OAAO,KAAK;AAAA,UACZ,KAAK;AAAA,QACP,CAAC,CAAC;AAAA;AAAA,EAAOA,MAAK,EAAE,oBAAoB,CAAC;AAAA,EAAK,YAAY;AAAA;AAAA,EAAOA,MAAK,EAAE,gBAAgB,CAAC;AAAA,MACvF;AAAA,IACF,CAAC;AAAA,IAED,aAAaD,MAAK;AAAA,MAChB,aAAa,KAAK,EAAE,sBAAsB;AAAA,MAC1C,MAAM;AAAA,QACJ,MAAMA,MAAK,OAAO,OAAO,EAAE,SAAS,KAAK,EAAE,oBAAoB,CAAC;AAAA,QAChE,KAAKA,MAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,KAAK,EAAE,mBAAmB,CAAC;AAAA,QACzE,SAASA,MAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,KAAK,EAAE,uBAAuB,CAAC;AAAA,MACnF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMC,QAAO,MAAM;AAEnB,cAAM,cAAcF,MAAK,WAAW,WAAW;AAC/C,YAAI,CAACJ,YAAW,WAAW,GAAG;AAC5B,gBAAMC,OAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,QAC9C;AAEA,cAAM,aAAaG,MAAK,WAAW,eAAe;AAClD,YAAI,SAAkC,CAAC;AACvC,YAAIJ,YAAW,UAAU,GAAG;AAC1B,cAAI;AACF,qBAAS,KAAK,MAAM,MAAME,UAAS,YAAY,OAAO,CAAC;AAAA,UACzD,QAAQ;AACN,qBAAS,CAAC;AAAA,UACZ;AAAA,QACF;AAEA,cAAM,WAAoC,CAAC;AAC3C,YAAI,KAAK,KAAK;AACZ,mBAAS,OAAO;AAChB,mBAAS,MAAM,KAAK;AAAA,QACtB,WAAW,KAAK,SAAS;AACvB,mBAAS,OAAO;AAChB,mBAAS,UAAU,KAAK,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,QAChE,OAAO;AACL,iBAAOI,MAAK,EAAE,yBAAyB;AAAA,QACzC;AACA,iBAAS,UAAU;AAEnB,eAAO,MAAM,EAAE,GAAK,OAAO,OAAmC,CAAC,GAAI,CAAC,KAAK,IAAI,GAAG,SAAS;AACzF,cAAMH,WAAU,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAE3D,cAAM,aAAa,aAAaG,MAAK,EAAE,uBAAuB,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC;AAElF,eAAOA,MAAK,EAAE,aAAa,EAAE,MAAM,KAAK,KAAK,CAAC;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACpGA,SAAS,QAAAC,aAAY;AAMd,IAAM,yBAAsC,CAAC,QAAQ;AAC1D,QAAM,EAAE,cAAc,MAAM,YAAY,IAAI;AAE5C,SAAO;AAAA,IACL,iBAAiBA,MAAK;AAAA,MACpB,aAAa,KAAK,EAAE,0BAA0B;AAAA,MAC9C,MAAM;AAAA,QACJ,aAAaA,MAAK,OAAO,OAAO,EAAE,SAAS,KAAK,EAAE,+BAA+B,CAAC;AAAA,MACpF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMC,QAAO,MAAM;AACnB,cAAM,aAAa,eAAe,KAAK,WAAW;AAClD,eAAOA,MAAK,EAAE,oBAAoB,EAAE,aAAa,KAAK,YAAY,CAAC;AAAA,MACrE;AAAA,IACF,CAAC;AAAA,IAED,mBAAmBD,MAAK;AAAA,MACtB,aAAa,KAAK,EAAE,4BAA4B;AAAA,MAChD,MAAM;AAAA,QACJ,WAAWA,MAAK,OAAO,OAAO,EAAE,SAAS,KAAK,EAAE,+BAA+B,CAAC;AAAA,MAClF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMC,QAAO,MAAM;AACnB,cAAM,aAAa,aAAa,KAAK,SAAS;AAC9C,eAAOA,MAAK,EAAE,sBAAsB,EAAE,WAAW,KAAK,UAAU,CAAC;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,IAED,iBAAiBD,MAAK;AAAA,MACpB,aAAa,KAAK,EAAE,0BAA0B;AAAA,MAC9C,MAAM;AAAA,QACJ,WAAWA,MAAK,OAAO,OAAO,EAAE,SAAS,KAAK,EAAE,6BAA6B,CAAC;AAAA,MAChF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMC,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,UAAU,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS;AAClE,YAAI,CAAC,SAAS;AACZ,iBAAOA,MAAK,EAAE,qBAAqB,EAAE,IAAI,KAAK,UAAU,CAAC;AAAA,QAC3D;AACA,gBAAQ,WAAW;AACnB,cAAM,aAAa,KAAK,KAAK;AAC7B,eAAOA,MAAK,EAAE,kBAAkB,EAAE,aAAa,QAAQ,YAAY,CAAC;AAAA,MACtE;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC5BO,IAAM,eAAN,MAAmB;AAAA,EAChB,YAA2B,CAAC;AAAA;AAAA;AAAA;AAAA,EAKpC,SAAS,SAA4B;AACnC,SAAK,UAAU,KAAK,OAAO;AAC3B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAyD;AAC7D,UAAM,QAAwC,CAAC;AAE/C,eAAW,WAAW,KAAK,WAAW;AACpC,YAAM,eAAe,QAAQ,GAAG;AAChC,aAAO,OAAO,OAAO,YAAY;AAAA,IACnC;AAEA,WAAO;AAAA,EACT;AACF;AAKO,IAAM,eAAe,IAAI,aAAa;;;ACrD7C,SAAS,WAAAC,UAAS,aAAAC,kBAAiB;AACnC,SAAS,QAAAC,aAAY;AACrB,SAAS,UAAAC,eAAc;;;ACQvB,IAAM,gBAAmD;AAAA,EACvD,WAAW;AAAA,IACT,eAAe;AAAA,IACf,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AAAA,EACA,kBAAkB;AAAA,IAChB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AAAA,EACA,iBAAiB;AAAA,IACf,eAAe;AAAA,IACf,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AAAA,EACA,SAAS;AAAA,IACP,eAAe;AAAA,IACf,aAAa;AAAA,IACb,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AACF;AAEO,SAAS,eAAe,OAAyC;AACtE,SAAO,cAAc,SAAS,WAAW;AAC3C;;;AD3BO,IAAM,sBAAmC,CAAC,QAAQ;AACvD,QAAM,EAAE,cAAc,MAAM,YAAY,IAAI;AAE5C,SAAO;AAAA,IACL,eAAeC,MAAK;AAAA,MAClB,aAAa,KAAK,EAAE,wBAAwB;AAAA,MAC5C,MAAM,CAAC;AAAA,MACP,MAAM,UAAU;AACd,cAAMC,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,eAAe,MAAMC,SAAQ,aAAa,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC,CAAC;AAEhF,eAAO,MAAMD,MAAK,EAAE,aAAa,CAAC;AAAA;AAAA,MAEpCA,MAAK,EAAE,eAAe,CAAC,OAAO,MAAM,OAAO;AAAA,MAC3CA,MAAK,EAAE,sBAAsB,CAAC,OAAO,MAAM,WAAW,aAAa;AAAA,MACnEA,MAAK,EAAE,wBAAwB,CAAC,OAAO,MAAM,WAAW,cAAc;AAAA,MACtEA,MAAK,EAAE,yBAAyB,CAAC,OAAO,MAAM,SAAS,MAAM;AAAA,MAC7DA,MAAK,EAAE,kBAAkB,CAAC,OAAO,MAAM,QAAQ,WAAW,MAAM;AAAA,MAChEA,MAAK,EAAE,oBAAoB,CAAC,OAAO,MAAM,QAAQ,aAAa,MAAM;AAAA,MACpEA,MAAK,EAAE,uBAAuB,CAAC,OAAO,aAAa,MAAM;AAAA,MACzDA,MAAK,EAAE,qBAAqB,CAAC,OAAOE,QAAO,MAAM,QAAQ,cAAc,qBAAqB,CAAC;AAAA,MAC7FF,MAAK,EAAE,wBAAwB,CAAC,OAAO,MAAM,YAAY,eAAe;AAAA,MACxEA,MAAK,EAAE,2BAA2B,CAAC,OAAO,MAAM,YAAY,iBAAiB;AAAA,MAC7E;AAAA,IACF,CAAC;AAAA,IAED,mBAAmBD,MAAK;AAAA,MACtB,aAAa,KAAK,EAAE,4BAA4B;AAAA,MAChD,MAAM;AAAA,QACJ,iBAAiBA,MAAK,OACnB,QAAQ,EACR,SAAS,EACT,SAAS,KAAK,EAAE,qCAAqC,CAAC;AAAA,QACzD,mBAAmBA,MAAK,OACrB,QAAQ,EACR,SAAS,EACT,SAAS,KAAK,EAAE,uCAAuC,CAAC;AAAA,QAC3D,iBAAiBA,MAAK,OACnB,OAAO,EACP,SAAS,EACT,SAAS,KAAK,EAAE,qCAAqC,CAAC;AAAA,MAC3D;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMC,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AAEtC,YAAI,KAAK,oBAAoB,QAAW;AACtC,gBAAM,YAAY,kBAAkB,KAAK;AAAA,QAC3C;AACA,YAAI,KAAK,sBAAsB,QAAW;AACxC,gBAAM,YAAY,oBAAoB,KAAK;AAAA,QAC7C;AACA,YAAI,KAAK,oBAAoB,QAAW;AACtC,gBAAM,YAAY,kBAAkB,KAAK;AAAA,QAC3C;AAEA,cAAM,aAAa,KAAK,KAAK;AAC7B,eAAO,GAAGA,MAAK,EAAE,mBAAmB,CAAC;AAAA,EAAK,KAAK,UAAU,MAAM,aAAa,MAAM,CAAC,CAAC;AAAA,MACtF;AAAA,IACF,CAAC;AAAA,IAED,eAAeD,MAAK;AAAA,MAClB,aAAa,KAAK,EAAE,wBAAwB;AAAA,MAC5C,MAAM;AAAA,QACJ,SAASA,MAAK,OAAO,QAAQ,EAAE,SAAS,KAAK,EAAE,yBAAyB,CAAC;AAAA,MAC3E;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMC,QAAO,MAAM;AACnB,YAAI,CAAC,KAAK,SAAS;AACjB,iBAAOA,MAAK,EAAE,iBAAiB;AAAA,QACjC;AAEA,cAAMG;AAAA,UACJ,aAAa,aAAa;AAAA,UAC1B,KAAK,UAAU,mBAAmB,aAAa,eAAe,CAAC,GAAG,MAAM,CAAC;AAAA,QAC3E;AACA,eAAOH,MAAK,EAAE,YAAY;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,IAED,eAAeD,MAAK;AAAA,MAClB,aAAa,KAAK,EAAE,wBAAwB;AAAA,MAC5C,MAAM;AAAA,QACJ,OAAOA,MAAK,OACT,KAAK,CAAC,aAAa,kBAAkB,iBAAiB,SAAS,CAAC,EAChE,SAAS,KAAK,EAAE,uBAAuB,CAAC;AAAA,MAC7C;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMC,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,cAAM,QAAQ,eAAe,KAAK;AAClC,cAAM,aAAa,KAAK,KAAK;AAE7B,cAAM,SAAS,eAAe,KAAK,KAAqB;AACxD,eAAOA,MAAK,EAAE,aAAa;AAAA,UACzB,OAAO,iBAAiBA,OAAM,KAAK,KAAK;AAAA,UACxC,OAAO,oBAAoBA,OAAM,OAAO,aAAa;AAAA,UACrD,QAAQ,kBAAkBA,OAAM,OAAO,WAAW;AAAA,QACpD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IAED,eAAeD,MAAK;AAAA,MAClB,aAAa,KAAK,EAAE,wBAAwB;AAAA,MAC5C,MAAM;AAAA,QACJ,OAAOA,MAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,KAAK,EAAE,uBAAuB,CAAC;AAAA,QAC/E,OAAOA,MAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,KAAK,EAAE,uBAAuB,CAAC;AAAA,MACjF;AAAA,MACA,MAAM,QAAQ,MAAM;AAClB,cAAMC,QAAO,MAAM;AACnB,cAAM,QAAQ,MAAM,aAAa,KAAK;AAEtC,YAAI,KAAK,OAAO;AACd,gBAAM,QAAQ,QAAQ,KAAK;AAC3B,gBAAM,aAAa,eAAeA,MAAK,EAAE,qBAAqB,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;AAAA,QACtF;AACA,YAAI,KAAK,OAAO;AACd,gBAAM,QAAQ,QAAQ,KAAK,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,QACjE;AAEA,cAAM,aAAa,KAAK,KAAK;AAE7B,YAAI,SAAS,GAAGA,MAAK,EAAE,eAAe,CAAC;AAAA;AACvC,YAAI,MAAM,QAAQ;AAChB,oBAAU,OAAOA,MAAK,EAAE,mBAAmB,CAAC,OAAO,MAAM,QAAQ,KAAK;AAAA;AACxE,YAAI,MAAM,QAAQ,OAAO;AACvB,oBAAU,OAAOA,MAAK,EAAE,mBAAmB,CAAC,OAAO,MAAM,QAAQ,MAAM,KAAK,IAAI,CAAC;AAAA;AACnF,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AEhIA,SAAS,wBAAsC;AAC7C,SAAO,IAAI,aAAa,EACrB,SAAS,eAAe,EACxB,SAAS,mBAAmB,EAC5B,SAAS,oBAAoB,EAC7B,SAAS,mBAAmB,EAC5B,SAAS,sBAAsB,EAC/B,SAAS,cAAc,EACvB,SAAS,qBAAqB;AACnC;AAWO,SAAS,YACd,cACA,WACA,WACA,MACgC;AAChC,QAAM,WAAW,QAAQ,WAAW,gBAAgB,IAAI,CAAC;AACzD,QAAM,cAAc,OAChB,QAAQ,QAAQ,IAAI,IACpB,gBAAgB,EACb,KAAK,CAAC,WAAW,WAAW,gBAAgB,MAAM,CAAC,CAAC,EACpD,MAAM,MAAM,WAAW,gBAAgB,IAAI,CAAC,CAAC;AAEpD,QAAM,MAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,EACF;AAEA,QAAM,WAAW,sBAAsB;AACvC,SAAO,SAAS,MAAM,GAAG;AAC3B;;;ACxCO,IAAM,QAAgB,OAAO,EAAE,WAAW,OAAO,MAAM;AAC5D,QAAM,eAAe,IAAI,aAAa,SAAS;AAC/C,QAAM,aAAa,WAAW;AAE9B,QAAM,OAAO,WAAW,gBAAgB,MAAM,gBAAgB,CAAC,CAAC;AAChE,QAAM,iBAAiB,IAAI;AAAA,IACzB,aAAa,gBAAgB,EAAE,QAAQ,cAAc,EAAE;AAAA,EACzD;AACA,QAAM,eAAe,WAAW;AAEhC,QAAM,gBAAgB,IAAI;AAAA,IACxB,aAAa,gBAAgB,EAAE,QAAQ,cAAc,EAAE;AAAA,IACvD,aAAa,eAAe;AAAA,EAC9B;AAEA,QAAM,iBAAiB,IAAI,eAAe,SAAS;AACnD,QAAM,eAAe,WAAW;AAEhC,QAAM,MAAoB,EAAE,cAAc,WAAW,MAAM,OAAO;AAElE,QAAM,YAAY,WAAW;AAC7B,QAAM,mBAAmB,KAAK,IAAI;AAClC,QAAM,YAAwB,CAAC;AAC/B,QAAM,cAA2B,oBAAI,IAAI;AACzC,MAAI;AAEJ,QAAM,uBAAuB,YAAY;AAEvC,UAAM,aAAa,mBAAmB;AAEtC,UAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,UAAM,YAAY,4BAA4B,MAAM,QAAQ,WAAW;AAEvE,UAAM,WAAW,iBAAiB;AAClC,UAAM,WAAW,gBAAgB;AACjC,UAAM,QAAQ,gBAAgB;AAC9B,UAAM,QAAQ,eAAc,oBAAI,KAAK,GAAE,YAAY;AAEnD,UAAM,aAAa,KAAK,KAAK;AAG7B,UAAM,eAAe,gBAAgB,SAAS;AAE9C,QAAI,cAAc,cAAc;AAC9B,YAAM,aAAa,eAAe,KAAK,EAAE,+BAA+B,CAAC;AAAA,IAC3E;AAGA,UAAM,QAAQ,MAAM,cAAc,mBAAmB;AACrD,UAAM,cAAc,MAAM,SAAS,IAAI;AAAA,EAAK,MAAM,CAAC,CAAC,KAAK;AAGzD,UAAM,kBAAkB,MAAM,qBAAqB,GAAG;AACtD,QAAI,iBAAiB;AACnB,YAAM,OAAO,IAAI,UAAU;AAAA,QACzB,MAAM;AAAA,UACJ,OAAO;AAAA,UACP,SAAS,KAAK,EAAE,wBAAwB;AAAA,UACxC,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,OAAO,IAAI,UAAU;AAAA,MACzB,MAAM;AAAA,QACJ,SACE,KAAK,EAAE,uBAAuB;AAAA,UAC5B,UAAU,MAAM,QAAQ;AAAA,UACxB,UAAU,MAAM,SAAS;AAAA,QAC3B,CAAC,IAAI;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,OAAO,QAAgB,eAAkC;AAC/E,QAAI;AACF,YAAM,QAAQ,MAAM,eAAe,eAAe,KAAK,UAAU;AACjE,UAAI,OAAO;AACT,cAAM,OAAO,IAAI,UAAU;AAAA,UACzB,MAAM;AAAA,YACJ,OAAO;AAAA,YACP,SAAS,KAAK,EAAE,4BAA4B,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA,YAChE,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,OAAO,IAAI,UAAU;AAAA,MACzB,MAAM;AAAA,QACJ,OAAO;AAAA,QACP,SAAS,KAAK,EAAE,oBAAoB;AAAA,UAClC,MAAM,WAAW;AAAA,UACjB;AAAA,QACF,CAAC;AAAA,QACD,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,YAAY;AACnC,QAAI,CAAE,MAAM,kBAAkB,GAAG,EAAI;AAErC,UAAM,eAAe,MAAM,YAAY,GAAG;AAC1C,QAAI,aAAa,SAAS,GAAG;AAC3B,YAAM,OAAO,IAAI,UAAU;AAAA,QACzB,MAAM;AAAA,UACJ,OAAO;AAAA,UACP,SAAS,KAAK,EAAE,0BAA0B,EAAE,OAAO,aAAa,OAAO,CAAC;AAAA,UACxE,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,mBAAmB,MAAM,kCAAkC,GAAG;AACpE,eAAW,UAAU,kBAAkB;AACrC,YAAM,SAAS,MAAM,aAAa,KAAK,MAAM;AAC7C,UAAI,QAAQ;AACV,cAAM,gBAAgB,QAAQ,OAAO,UAAU;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB,YAAY;AACpC,UAAM,cAAc,MAAM,eAAe,GAAG;AAC5C,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,YAAM,SAAS,KAAK,GAAG,WAAW;AAClC,YAAM,aAAa,KAAK,KAAK;AAAA,IAC/B;AAGA,UAAM,iBAAiB;AAEvB,UAAM,cAAc,MAAM,gBAAgB,GAAG;AAC7C,eAAW,cAAc,aAAa;AACpC,YAAM,OAAO,IAAI,UAAU;AAAA,QACzB,MAAM;AAAA,UACJ,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO,UAAiB;AAC/C,QAAI,EAAE,MAAM,SAAS,gBAAgB,eAAe,gBAAgB,OAAQ;AAE5E,UAAM,OAAQ,MAAM,YAAkC;AACtD,QAAI,CAAC,KAAM;AAEX,gBAAY,IAAI,IAAI;AAGpB,UAAM,eAAe,YAAY,MAAM,SAAS;AAEhD,UAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,UAAM,WAAW,cAAc,IAAI,KAAK,MAAM,WAAW,cAAc,IAAI,KAAK,KAAK;AACrF,UAAM,aAAa,KAAK,KAAK;AAAA,EAC/B;AAEA,QAAM,yBAAyB,OAAO,UAAiB;AACrD,QAAI,EAAE,MAAM,SAAS,gBAAgB,sBAAsB,gBAAgB,OAAQ;AAEnF,UAAM,SAAU,MAAM,YAAoC;AAC1D,QAAI,WAAW,eAAe;AAC5B,sBAAgB;AAChB,YAAM,eAAe,gBAAgB,MAAM;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,wBAAwB,OAAO,UAAiB;AACpD,QAAI,EAAE,MAAM,SAAS,gBAAgB,oBAAoB,gBAAgB,OAAQ;AAEjF,UAAM,QAAQ,MAAM;AACpB,QAAI,MAAM,MAAM;AACd,YAAM,eAAe,WAAW,MAAM,MAAM,WAAW,MAAM,SAAS;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,uBAAuB,OAAO,UAAiB;AACnD,QAAI,EAAE,MAAM,SAAS,gBAAgB,mBAAmB,gBAAgB,OAAQ;AAEhF,UAAM,OACJ,MAAM,YAGL;AACH,QAAI,CAAC,KAAM;AAEX,QAAI,KAAK,SAAS,eAAe,KAAK,QAAQ;AAC5C,YAAM,eAAe;AAAA,QACnB;AAAA,QACA,KAAK,MAAM;AAAA,QACX,KAAK,OAAO,QAAQ,KAAK,OAAO;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,MAAM,EAAE,MAAM,GAAqB;AACvC,cAAQ,MAAM,MAAM;AAAA,QAClB,KAAK,gBAAgB;AACnB,gBAAM,qBAAqB;AAC3B;AAAA,QACF,KAAK,gBAAgB;AACnB,gBAAM,kBAAkB;AACxB;AAAA,QACF,KAAK,gBAAgB;AACnB,gBAAM,iBAAiB,KAAK;AAC5B;AAAA,QACF,KAAK,gBAAgB;AACnB,gBAAM,uBAAuB,KAAK;AAClC;AAAA,QACF,KAAK,gBAAgB;AACnB,gBAAM,sBAAsB,KAAK;AACjC;AAAA,QACF,KAAK,gBAAgB;AACnB,gBAAM,qBAAqB,KAAK;AAChC;AAAA,MACJ;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,gBAAgB,YAAY,EACjC,OACA,QACA;AAEA,YAAM,YAAY,OAAO,MACtB,OAAO,CAAC,MAA4C,EAAE,SAAS,MAAM,EACrE,IAAI,CAAC,MAAM,EAAE,IAAI;AAEpB,UAAI,UAAU,SAAS,GAAG;AACxB,cAAM,cAAc,UAAU,KAAK,GAAG,EAAE,MAAM,GAAG,GAAG;AACpD,cAAM,eAAe,eAAe,WAAW,MAAM,aAAa,IAAI,WAAW;AAAA,MACnF;AAAA,IACF;AAAA,IAEA,OAAO,gBAAgB,kBAAkB,EACvC,OACA,SACA;AACA,YAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,UAAI,CAAC,MAAM,YAAY,gBAAiB;AAExC,YAAM,WAAqB;AAAA,QACzB,MAAM,MAAM;AAAA,QACZ,QAAQ,MAAM;AAAA,QACd,WAAW,KAAK,IAAI;AAAA,MACtB;AAEA,gBAAU,KAAK,QAAQ;AACvB,YAAM,WAAW,kBAAkB;AAGnC,YAAM,eAAe,YAAY,MAAM,MAAM,MAAM,QAAQ,SAAS;AAEpE,YAAM,cAAc,MAAM;AAC1B,YAAM,WAAW,MAAM,SAAS;AAAA,QAC9B,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,gBAAgB;AAAA,MAChD;AACA,UAAI,UAAU;AACZ,iBAAS,SAAS;AAClB,iBAAS,WAAW,KAAK,IAAI;AAAA,MAC/B,OAAO;AACL,cAAM,SAAS,KAAK;AAAA,UAClB,IAAI,WAAW;AAAA,UACf,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,UACP,WAAW,KAAK,IAAI;AAAA,UACpB,UAAU,KAAK,IAAI;AAAA,UACnB,UAAU;AAAA,UACV,UAAU,CAAC,QAAQ;AAAA,QACrB,CAAC;AAAA,MACH;AAEA,YAAM,aAAa,KAAK,KAAK;AAG7B,UAAI,UAAU,UAAU,GAAG;AACzB,cAAM,cAAc,UAAU,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AACzD,cAAM,aAAa,mBAAmB,WAAW;AAAA,MACnD;AAAA,IACF;AAAA,IAEA,MAAM,OAAO;AACX,YAAM,kBAAkB,KAAK,IAAI,IAAI;AAErC,YAAM,cAAc;AAAA,QAClB;AAAA,QACA,WAAW,IAAI,KAAK,gBAAgB,EAAE,YAAY;AAAA,QAClD,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,QAChC,YAAY;AAAA,QACZ,WAAW,UAAU;AAAA,QACrB,aAAa,MAAM,KAAK,WAAW;AAAA,MACrC;AAEA,YAAM,aAAa,YAAY,WAAW,WAAW;AAGrD,YAAM,eAAe,cAAc,WAAW,iBAAiB,UAAU,MAAM;AAG/E,YAAM,QAAQ,MAAM,aAAa,KAAK;AACtC,YAAM,kBAAkB,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAC9D,YAAM,kBAAkB,uBAAuB,eAAe;AAC9D,YAAM,iBAAiB,MAAM,SAC1B,OAAO,CAAC,MAAM,EAAE,WAAW,gBAAgB,EAC3C,IAAI,CAAC,MAAM,EAAE,WAAW;AAE3B,UAAI;AACF,cAAM,cAAc,aAAa,aAAa,iBAAiB,gBAAgB;AAAA,UAC7E,QAAQ;AAAA,UACR,OAAO,MAAM,QAAQ;AAAA,UACrB,YAAY,gBAAgB,MAAM,EAAE;AAAA,QACtC,CAAC;AAAA,MACH,QAAQ;AAAA,MAER;AAEA,UAAI,UAAU,SAAS,IAAI;AACzB,cAAM,aAAa;AAAA,UACjB,KAAK,EAAE,yBAAyB,EAAE,OAAO,UAAU,OAAO,CAAC;AAAA,QAC7D;AAAA,MACF;AACA,UAAI,YAAY,OAAO,IAAI;AACzB,cAAM,aAAa;AAAA,UACjB,KAAK,EAAE,4BAA4B,EAAE,OAAO,YAAY,KAAK,CAAC;AAAA,QAChE;AAAA,MACF;AAEA,YAAM,OAAO,IAAI,UAAU;AAAA,QACzB,MAAM;AAAA,UACJ,SAAS,KAAK,EAAE,qBAAqB;AAAA,YACnC,UAAU,eAAe,eAAe;AAAA,YACxC,OAAO,UAAU;AAAA,YACjB,OAAO,YAAY;AAAA,UACrB,CAAC;AAAA,UACD,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,YAAY,cAAc,WAAW,WAAW,IAAI;AAAA,EAC5D;AACF;AAEA,IAAO,gBAAQ;","names":["existsSync","readFile","join","existsSync","mkdir","readFile","writeFile","join","existsSync","readFile","join","mkdir","writeFile","existsSync","readdir","readFile","writeFile","join","join","existsSync","readFile","writeFile","readdir","tool","existsSync","mkdir","writeFile","join","tool","existsSync","mkdir","readFile","writeFile","join","join","existsSync","mkdir","tool","readFile","writeFile","i18n","tool","tool","i18n","tool","format","tool","i18n","suggestions","format","existsSync","mkdir","readFile","writeFile","join","tool","format","tool","i18n","join","existsSync","mkdir","format","writeFile","readFile","existsSync","mkdir","readFile","writeFile","join","tool","i18n","tool","i18n","readdir","writeFile","tool","format","tool","i18n","readdir","format","writeFile"]}