@topce/pizx 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/patterns/types.ts", "../src/load-pi-settings.ts", "../src/patterns/adaptive.ts", "../src/patterns/broadcast.ts", "../src/patterns/chi.ts", "../src/patterns/critique.ts", "../src/patterns/debate.ts", "../src/patterns/fleet.ts", "../src/patterns/graph.ts", "../src/patterns/memory.ts", "../src/patterns/nu.ts", "../src/patterns/orchestrator.ts", "../src/patterns/pipeline.ts", "../src/patterns/ralph.ts", "../src/patterns/subagent.ts", "../src/patterns/tau.ts", "../src/patterns/thread.ts", "../src/pi.ts", "../src/pi-output.ts", "../src/pi-agent.ts"],
4
+ "sourcesContent": ["/**\n * pizx \u2014 zx fork with native Pi AI integration\n *\n * @example\n * ```js\n * #!/usr/bin/env pizx\n * const branch = (await $`git branch --show-current`).stdout.trim()\n * const explanation = await \u03C0`explain this code in simple terms: ${code}`\n * await \u03A0`fix the TypeScript errors in src/ and run tests`\n *\n * // Agent patterns\n * await \u03A1`iteratively improve the error handling`\n * await \u03A6`review all files in src/`\n * await \u03A3`analyze security across the codebase`\n * const debate = await \u0394`what architecture should we use?`\n * const doc = await \u039B`analyze \u2192 document \u2192 review`\n * const polished = await \u03A8`write a README`\n * await \u03A9`build a complete auth system`\n *\n * // Communication patterns\n * await \u0398`collaborate on the architecture`\n * await \u039C`brainstorm features for the project`\n * await \u0392`gather expert feedback on the design`\n *\n * // Orchestration topologies\n * await \u0391`iterate on this algorithm until optimal`\n * await \u0393`research \u2192 analyze \u2192 validate \u2192 document`\n * ```\n *\n * API:\n * $ \u2014 shell commands (unchanged from zx)\n * \u03C0 \u2014 pi-ai text generation (small pi)\n * \u03A0 \u2014 pi-coding-agent with tools (capital pi)\n *\n * \u03A1 \u2014 Ralph Loop (iterative improvement)\n * \u03A6 \u2014 Fleet (parallel agents)\n * \u03A3 \u2014 Subagents (hierarchical delegation)\n * \u0394 \u2014 Debate (multi-perspective convergence)\n * \u039B \u2014 Pipeline (sequential chain)\n * \u03A8 \u2014 Critique (generate \u2192 critique \u2192 improve)\n * \u03A9 \u2014 Orchestrator (plan \u2192 dispatch \u2192 synthesize)\n *\n * \u0398 \u2014 Thread (multi-agent conversation)\n * \u039C \u2014 Memory (shared blackboard)\n * \u0392 \u2014 Broadcast (one-to-many messaging)\n *\n * \u0391 \u2014 Adaptive (self-adjusting orchestration)\n * \u0393 \u2014 Graph (DAG-based execution)\n */\n\n// \u2500\u2500 Re-export all of zx \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// All standard zx APIs pass through unchanged.\nexport * from 'zx'\n\n// \u2500\u2500 pizx additions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport {\n type AdaptiveOptions,\n AdaptiveOutput,\n AdaptiveStep,\n type BroadcastOptions,\n BroadcastOutput,\n BroadcastResponse,\n type CritiqueOptions,\n CritiqueOutput,\n CritiqueRound,\n type DebateOptions,\n DebateOutput,\n DebatePerspective,\n FleetMemberOutput,\n type FleetOptions,\n FleetOutput,\n type GraphEdge,\n type GraphNode,\n GraphNodeResult,\n type GraphOptions,\n GraphOutput,\n MemoryEntry,\n type MemoryOptions,\n MemoryOutput,\n type OrchestratorOptions,\n OrchestratorOutput,\n OrchestratorWorkerResult,\n type PatternFn,\n type PatternOptions,\n PatternOutput,\n PatternPromise,\n type PipelineOptions,\n PipelineOutput,\n PipelineStageResult,\n type RalphIterationSummary,\n type RalphOptions,\n RalphOutput,\n type SubagentOptions,\n SubagentOutput,\n SubagentResult,\n ThreadMessage,\n type ThreadOptions,\n ThreadOutput,\n // Orchestration topologies\n \u0391,\n \u0392,\n \u0393,\n \u0394,\n // Communication patterns\n \u0398,\n \u039B,\n \u039C,\n // Agent patterns\n \u03A1,\n \u03A3,\n \u03A6,\n \u03A8,\n \u03A9,\n} from './patterns/index.ts'\nexport {\n configurePi,\n type PiOptions,\n PiOutput,\n PiPromise,\n // \u03C0 \u2014 pi-ai text generation\n \u03C0,\n} from './pi.ts'\nexport {\n type AgentOptions,\n AgentOutput,\n AgentPromise,\n closeAgent,\n configureAgent,\n // \u03A0 \u2014 pi-coding-agent with tools\n \u03A0,\n} from './pi-agent.ts'\n", "/**\n * Shared types for all pizx agent patterns (\u03A1, \u03A6, \u03A3, \u0394, \u039B, \u03A8, \u03A9).\n *\n * Each pattern follows the same conventions as the existing \u03C0 and \u03A0 tags:\n * template literal call, function chaining for options, .quiet variant,\n * and a typed result object.\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\n\n// \u2500\u2500 Common options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Options shared by all pattern tags. Each pattern extends this. */\nexport interface PatternOptions {\n /** Model id for all phases (fallback if per-phase models not specified). */\n model?: string\n /** Model for high-level reasoning phases: planning, analysis, synthesis, critique. */\n plannerModel?: string\n /** Model for execution/worker phases: sub-tasks, perspectives, pipeline stages. */\n workerModel?: string\n /** Thinking level for reasoning models */\n thinkingLevel?: ThinkingLevel\n /** Suppress streaming output to stdout/stderr */\n quiet?: boolean\n /** Max tokens for each LLM call */\n maxTokens?: number\n /** System prompt context */\n system?: string\n}\n\n// \u2500\u2500 Base output class \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Base output for all pattern tags.\n * Provides common fields and coercion methods like PiOutput/AgentOutput.\n */\nexport class PatternOutput {\n constructor(\n /** Full text result from the pattern execution */\n public readonly text: string,\n /** Start timestamp (ms) */\n public readonly startTime: number = Date.now(),\n /** End timestamp (ms) */\n public readonly endTime: number = Date.now()\n ) {}\n\n /** Duration in milliseconds */\n get duration(): number {\n return this.endTime - this.startTime\n }\n\n toString(): string {\n return this.text\n }\n\n valueOf(): string {\n return this.text\n }\n\n [Symbol.toPrimitive](): string {\n return this.text\n }\n}\n\n// \u2500\u2500 Pattern function interface \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** A pattern that supports template-tag invocation and option chaining. */\nexport interface PatternFn<TOptions extends PatternOptions, TOutput extends PatternOutput> {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<TOutput>\n (opts: Partial<TOptions>): PatternFn<TOptions, TOutput>\n quiet: PatternFn<TOptions, TOutput>\n}\n\n/** A Promise that resolves to a pattern output. */\nexport class PatternPromise<TOutput extends PatternOutput> extends Promise<TOutput> {}\n\n// \u2500\u2500 Utility: build template string \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Build a string from a template literal with interpolated values. */\nexport function build(pieces: TemplateStringsArray, args: unknown[]): string {\n let s = ''\n for (let i = 0; i < pieces.length; i++) {\n s += pieces[i]\n if (i < args.length) s += String(args[i])\n }\n return s.trim()\n}\n\n// \u2500\u2500 Helper: make a factory function \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nimport { completeSimple, getEnvApiKey, getModels, getProviders } from '@earendil-works/pi-ai'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyModel = import('@earendil-works/pi-ai').Model<any>\n\n/** Cached Pi settings \u2014 loaded lazily. */\nimport { isPiInstalled, loadPiSettings, type PiSettings } from '../load-pi-settings.ts'\n\nlet _piSettings: PiSettings | undefined\n\nfunction getPiDefaults(): PiSettings {\n if (_piSettings === undefined) {\n _piSettings = isPiInstalled() ? loadPiSettings() : {}\n }\n return _piSettings\n}\n\n/** Return all known models from the pi-ai static registry. */\nfunction allModels(): AnyModel[] {\n const result: AnyModel[] = []\n for (const p of getProviders()) {\n const ms = getModels(p)\n if (ms && ms.length > 0) result.push(...ms)\n }\n return result\n}\n\nfunction getConfiguredProviders(): string[] {\n return getProviders().filter((p) => getEnvApiKey(p) !== undefined)\n}\n\nfunction configuredModels(): AnyModel[] {\n const configured = new Set<string>(getConfiguredProviders())\n return allModels().filter((m) => configured.has(m.provider))\n}\n\nfunction findModelById(id: string): AnyModel | undefined {\n const all = allModels()\n if (id.includes('/')) {\n const [provider, modelId] = id.split('/', 2)\n return all.find(\n (m) => m.provider === provider && (m.id === modelId || m.id.endsWith(`/${modelId}`))\n )\n }\n return all.find((m) => m.id === id || m.id.endsWith(`/${id}`))\n}\n\n/**\n * Pick a model based on preferred id, Pi settings, or first available.\n * Mirrors the logic in pi.ts but exported for pattern use.\n */\nexport function pickModel(preferred?: string): AnyModel | undefined {\n if (preferred) {\n const hit = findModelById(preferred)\n if (hit) return hit\n }\n\n const settings = getPiDefaults()\n\n if (settings.defaultModel) {\n const hit = findModelById(settings.defaultModel)\n if (hit) return hit\n }\n\n if (settings.defaultProvider) {\n const providerModels = (getModels as (p: string) => AnyModel[])(settings.defaultProvider)\n if (providerModels && providerModels.length > 0) {\n const configured = new Set<string>(getConfiguredProviders())\n if (configured.has(settings.defaultProvider as string)) {\n return providerModels[0]\n }\n }\n }\n\n const available = configuredModels()\n if (available.length > 0) {\n const order = ['claude-sonnet-4-5', 'claude-sonnet-4', 'gemini-2.5-flash', 'gpt-4o-mini']\n for (const id of order) {\n const m = available.find((m) => m.id.includes(id))\n if (m) return m\n }\n return available[0]\n }\n\n const models = allModels()\n if (models.length === 0) return undefined\n const order = ['claude-sonnet-4-5', 'claude-sonnet-4', 'gemini-2.5-flash', 'gpt-4o-mini']\n for (const id of order) {\n const m = models.find((m) => m.id.includes(id))\n if (m) return m\n }\n return models[0]\n}\n\n/**\n * Ask a model a simple question (no tools, no streaming).\n * Used internally by patterns for analysis, review, planning.\n */\nexport async function ask(\n prompt: string,\n opts: { model?: string; maxTokens?: number; thinkingLevel?: ThinkingLevel; system?: string } = {}\n): Promise<string> {\n const model = pickModel(opts.model)\n if (!model) throw new Error('pizx/patterns: No AI models configured. Run `pi auth login` first.')\n\n const result = await completeSimple(\n model,\n {\n systemPrompt: opts.system,\n messages: [{ role: 'user', content: prompt, timestamp: Date.now() }],\n },\n {\n maxTokens: opts.maxTokens ?? 4096,\n reasoning: opts.thinkingLevel ?? ('medium' as ThinkingLevel),\n }\n )\n\n const text = result.content\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\n .map((c) => c.text)\n .join('')\n\n return text.trim()\n}\n", "/**\n * Load Pi global settings from ~/.pi/agent/settings.json\n *\n * Reads Pi's default model, provider, and thinking level so the \u03C0 tag\n * can use the same defaults the user configured via `pi settings`.\n */\n\nimport { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\n/**\n * Default Pi agent directory: ~/.pi/agent\n * Override via PI_CODING_AGENT_DIR env var (same convention as pi-coding-agent SDK).\n */\nexport function getPiAgentDir(): string {\n const envDir = process.env.PI_CODING_AGENT_DIR\n if (envDir) return envDir\n return join(homedir(), '.pi', 'agent')\n}\n\n/**\n * Check whether Pi global configuration exists.\n * Returns true if ~/.pi/agent/auth.json exists on disk.\n */\nexport function isPiInstalled(): boolean {\n return existsSync(join(getPiAgentDir(), 'auth.json'))\n}\n\n/**\n * Settings that pizx reads from Pi's global settings.json.\n * These match the SettingsManager.Settings interface in pi-coding-agent.\n */\nexport interface PiSettings {\n /** Default model id, e.g. \"claude-sonnet-4-5\" */\n defaultModel?: string\n /** Default provider, e.g. \"anthropic\" */\n defaultProvider?: string\n /** Default thinking level */\n defaultThinkingLevel?: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh'\n}\n\n/**\n * Read Pi's global settings.json and return parsed defaults.\n *\n * Returns an empty object when:\n * - settings.json does not exist (Pi not configured)\n * - settings.json is unparseable (corrupt file)\n *\n * Never throws.\n */\nexport function loadPiSettings(agentDir?: string): PiSettings {\n const dir = agentDir ?? getPiAgentDir()\n const path = join(dir, 'settings.json')\n\n if (!existsSync(path)) return {}\n\n try {\n const raw = readFileSync(path, 'utf-8')\n const parsed = JSON.parse(raw)\n return {\n defaultModel: parsed.defaultModel ?? undefined,\n defaultProvider: parsed.defaultProvider ?? undefined,\n defaultThinkingLevel: parsed.defaultThinkingLevel ?? undefined,\n }\n } catch {\n // Unparseable settings.json \u2014 silently ignore\n return {}\n }\n}\n", "/**\n * \u0391 (Alpha) \u2014 Adaptive: self-adjusting orchestration\n *\n * Starts with an initial plan, executes step by step, evaluates quality\n * after each step, and adapts the workflow \u2014 adding, skipping, or reassigning\n * steps based on intermediate results.\n *\n * Usage:\n * await \u0391`build a comprehensive solution for this problem`\n * await \u0391({ maxSteps: 6, qualityThreshold: 0.8 })`design the system architecture`\n * await \u0391.quiet`iterate on this algorithm until it meets quality standards`\n *\n * Orchestration pattern: Adaptive Workflow (changes based on progress)\n * Topology: Dynamic \u2014 shifts between sequential, parallel, and checkpoint\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface AdaptiveOptions extends PatternOptions {\n /** Maximum steps before stopping. Default: 5 */\n maxSteps?: number\n /** Quality threshold (0.0\u20131.0) to stop early. Default: 0.8 */\n qualityThreshold?: number\n}\n\nconst defaults: AdaptiveOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n maxSteps: 5,\n qualityThreshold: 0.8,\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class AdaptiveStep {\n constructor(\n public readonly step: number,\n public readonly action: string,\n public readonly result: string,\n public readonly quality: number,\n public readonly adaptation: string\n ) {}\n}\n\nexport class AdaptiveOutput extends PatternOutput {\n constructor(\n text: string,\n public readonly finalResult: string,\n public readonly steps: AdaptiveStep[],\n public readonly totalSteps: number,\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst PLAN_SYSTEM = `You are an adaptive workflow planner. Given a goal, produce a step-by-step execution plan.\n\nOutput format:\nPLAN:\n1. Step description\n2. Step description\n...\n\nEach step must be concrete and self-contained. Generate at most 5 steps.`\n\nconst EXECUTE_SYSTEM = `You are a task executor. Execute the assigned step. Output your result directly \u2014 no meta-commentary. Be specific and actionable.`\n\nconst EVALUATE_SYSTEM = `You are a quality evaluator. Review the execution result and provide:\n1. Quality score: a number from 0.0 (poor) to 1.0 (perfect)\n2. Brief assessment (1 sentence)\n3. Adaptation recommendation: \"CONTINUE\" to proceed as planned, \"REFINE\" to redo this step, \"SKIP_NEXT\" to skip the next planned step, or \"ADD [description]\" to insert a new step before continuing\n\nOutput format:\nSCORE: 0.XX\nASSESSMENT: (one sentence)\nADAPTATION: CONTINUE | REFINE | SKIP_NEXT | ADD (description)`\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: AdaptiveOptions\n): Promise<AdaptiveOutput> {\n const goal = build(pieces, args)\n const t0 = Date.now()\n\n const plannerModel = opts.plannerModel ?? opts.model\n const workerModel = opts.workerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(`\u0391: Adaptive \u2014 \"${goal.slice(0, 80)}${goal.length > 80 ? '...' : ''}\"\\n`)\n }\n\n // 1. Generate initial plan (planner model)\n if (!opts.quiet) process.stderr.write(' \u2192 Planning...\\n')\n const planText = await ask(goal, {\n model: plannerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: 'high' as ThinkingLevel,\n system: PLAN_SYSTEM,\n })\n\n // Parse plan into steps\n const planLines = planText.split('\\n')\n const plannedSteps: string[] = []\n for (const line of planLines) {\n const match = line.match(/^\\d+[.)]\\s*(.+)/)\n if (match) plannedSteps.push(match[1].trim())\n }\n const steps = plannedSteps.length > 0 ? plannedSteps : [goal]\n\n if (!opts.quiet) {\n process.stderr.write(` \u2192 ${steps.length} step(s) planned\\n`)\n for (let i = 0; i < steps.length; i++) {\n const s = steps[i]\n process.stderr.write(` [${i + 1}] ${s.slice(0, 60)}${s.length > 60 ? '...' : ''}\\n`)\n }\n }\n\n // 2. Execute adaptively\n const adaptiveSteps: AdaptiveStep[] = []\n const maxSteps = opts.maxSteps ?? 5\n const threshold = opts.qualityThreshold ?? 0.8\n let stepIndex = 0\n let executionStep = 0\n\n while (stepIndex < steps.length && executionStep < maxSteps) {\n executionStep++\n const currentStep = steps[stepIndex]\n\n if (!opts.quiet)\n process.stderr.write(` \u2192 Step ${executionStep}: ${currentStep.slice(0, 60)}...\\n`)\n\n // Execute current step (worker model)\n const result = await ask(currentStep, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: EXECUTE_SYSTEM,\n })\n\n // Evaluate (planner model)\n const evaluation = await ask(\n `Goal: ${goal}\\nStep executed: ${currentStep}\\nResult: ${result}\\n\\nEvaluate the result.`,\n {\n model: plannerModel,\n maxTokens: 512,\n thinkingLevel: 'high' as ThinkingLevel,\n system: EVALUATE_SYSTEM,\n }\n )\n\n // Parse evaluation\n const scoreMatch = evaluation.match(/SCORE:\\s*([\\d.]+)/i)\n const assessMatch = evaluation.match(/ASSESSMENT:\\s*(.+)/i)\n const adaptMatch = evaluation.match(/ADAPTATION:\\s*(.+)/i)\n\n const quality = scoreMatch ? parseFloat(scoreMatch[1]) : 0.5\n const assessment = assessMatch?.[1] ?? '(no assessment)'\n const adaptation = adaptMatch?.[1] ?? 'CONTINUE'\n\n adaptiveSteps.push(new AdaptiveStep(executionStep, currentStep, result, quality, adaptation))\n\n if (!opts.quiet) {\n process.stderr.write(` Quality: ${quality.toFixed(2)} | ${assessment.slice(0, 60)}...\\n`)\n process.stderr.write(` Adaptation: ${adaptation}\\n`)\n }\n\n // Check if quality threshold met \u2014 done early\n if (quality >= threshold) {\n if (!opts.quiet)\n process.stderr.write(` \u2713 Quality threshold (${threshold}) met \u2014 stopping early\\n`)\n break\n }\n\n // Apply adaptation\n const adaptUpper = adaptation.toUpperCase()\n if (adaptUpper.startsWith('REFINE')) {\n } else if (adaptUpper.startsWith('SKIP_NEXT')) {\n stepIndex += 2 // Skip current + next\n } else if (adaptUpper.startsWith('ADD')) {\n const newStep = adaptation.replace(/^ADD\\s*/i, '')\n steps.splice(stepIndex + 1, 0, newStep)\n stepIndex++\n } else {\n // CONTINUE or unknown \u2014 advance normally\n stepIndex++\n }\n }\n\n const t1 = Date.now()\n\n const finalResult = adaptiveSteps.length > 0 ? adaptiveSteps[adaptiveSteps.length - 1].result : ''\n\n const summary = adaptiveSteps\n .map(\n (s) =>\n `Step ${s.step}: ${s.action.slice(0, 80)}...\\n Quality: ${s.quality.toFixed(2)}\\n Adaptation: ${s.adaptation}`\n )\n .join('\\n\\n')\n\n return new AdaptiveOutput(summary, finalResult, adaptiveSteps, executionStep, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface AdaptiveFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<AdaptiveOutput>\n (opts: Partial<AdaptiveOptions>): AdaptiveFn\n quiet: AdaptiveFn\n}\n\nfunction makeAdaptive(opts: Partial<AdaptiveOptions> = {}): AdaptiveFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<AdaptiveOptions>,\n ...args: unknown[]\n ): PatternPromise<AdaptiveOutput> | AdaptiveFn => {\n if (!Array.isArray(pieces)) {\n return makeAdaptive({ ...merged, ...(pieces as Partial<AdaptiveOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as AdaptiveFn\n\n let _quiet: AdaptiveFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): AdaptiveFn {\n if (!_quiet) _quiet = makeAdaptive({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u0391 tag \u2014 Adaptive: self-adjusting orchestration */\nexport const \u0391: AdaptiveFn = makeAdaptive()\n", "/**\n * \u0392 (Beta) \u2014 Broadcast: one-to-many messaging pattern\n *\n * One lead agent formulates the problem and broadcasts it to all worker agents.\n * Workers respond independently (in parallel), then the lead synthesizes all\n * responses into a final answer.\n *\n * Usage:\n * await \u0392`gather feedback on this architecture proposal`\n * await \u0392({ workers: 5 })`collect diverse perspectives on this design`\n * await \u0392.quiet`poll all specialists about this decision`\n *\n * Communication pattern: Broadcast (one-to-many) + Manager-based synthesis\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface BroadcastOptions extends PatternOptions {\n /** Number of worker agents to broadcast to. Default: 4 */\n workers?: number\n /** Custom worker roles. Auto-generated if not provided. */\n roles?: string[]\n}\n\nconst defaults: BroadcastOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n workers: 4,\n}\n\nconst ROLE_SETS: Record<number, string[]> = {\n 2: [\n 'Technical Expert \u2014 evaluate technical feasibility',\n 'Business Expert \u2014 evaluate business viability',\n ],\n 3: [\n 'Technical Expert \u2014 evaluate technical feasibility',\n 'Business Expert \u2014 evaluate business viability',\n 'User Expert \u2014 evaluate user experience and adoption',\n ],\n 4: [\n 'Technical Expert',\n 'Business Expert',\n 'User Expert',\n 'Risk Expert \u2014 identify risks, compliance, and security concerns',\n ],\n 5: [\n 'Technical Expert',\n 'Business Expert',\n 'User Expert',\n 'Risk Expert',\n 'Innovation Expert \u2014 suggest novel approaches and alternatives',\n ],\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class BroadcastResponse {\n constructor(\n public readonly role: string,\n public readonly response: string,\n public readonly success: boolean,\n public readonly error?: string\n ) {}\n}\n\nexport class BroadcastOutput extends PatternOutput {\n constructor(\n text: string,\n public readonly synthesis: string,\n public readonly responses: BroadcastResponse[],\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst WORKER_PROMPT = `You are a {role}.\n\nA question has been broadcast to you and your fellow specialists:\n\n{question}\n\nProvide your expert analysis and recommendation from your specific perspective.\nBe thorough but concise \u2014 under 200 words.`\n\nconst SYNTHESIS_SYSTEM = `You are a lead strategist. You broadcast a question to your specialist team. Now synthesize their collective responses into a coherent, actionable recommendation. Weigh conflicting opinions, identify consensus, and present the best path forward.`\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: BroadcastOptions\n): Promise<BroadcastOutput> {\n const question = build(pieces, args)\n const t0 = Date.now()\n const workerCount = opts.workers ?? 4\n const roles = opts.roles ?? ROLE_SETS[workerCount] ?? ROLE_SETS[4] ?? []\n\n const plannerModel = opts.plannerModel ?? opts.model\n const workerModel = opts.workerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(`\u0392: Broadcast \u2014 ${workerCount} worker(s)\\n`)\n process.stderr.write(\n ` Question: \"${question.slice(0, 80)}${question.length > 80 ? '...' : ''}\"\\n`\n )\n }\n\n // Broadcast to all workers in parallel\n if (!opts.quiet) process.stderr.write(' \u2192 Broadcasting to workers...\\n')\n\n const broadcastResults = await Promise.allSettled(\n roles.map(async (role) => {\n const prompt = WORKER_PROMPT.replace('{role}', role).replace('{question}', question)\n const text = await ask(prompt, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n })\n return new BroadcastResponse(role, text, true)\n })\n )\n\n const responses: BroadcastResponse[] = []\n for (const r of broadcastResults) {\n if (r.status === 'fulfilled') {\n responses.push(r.value)\n } else {\n const msg = r.reason instanceof Error ? r.reason.message : String(r.reason)\n responses.push(new BroadcastResponse('(failed)', '', false, msg))\n }\n }\n\n // Synthesize (planner model)\n if (!opts.quiet) process.stderr.write(' \u2192 Synthesizing responses...\\n')\n\n const responsesText = responses.map((wr) => `--- ${wr.role} ---\\n${wr.response}`).join('\\n\\n')\n\n const synthesis = await ask(\n `Original question:\\n${question}\\n\\nWorker responses:\\n${responsesText}\\n\\nSynthesize a cohesive, actionable recommendation.`,\n {\n model: plannerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: 'high' as ThinkingLevel,\n system: SYNTHESIS_SYSTEM,\n }\n )\n\n const t1 = Date.now()\n\n const summary = responses\n .map(\n (wr) => `[${wr.role}]: ${wr.response.slice(0, 150)}${wr.response.length > 150 ? '...' : ''}`\n )\n .join('\\n')\n\n return new BroadcastOutput(summary, synthesis, responses, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface BroadcastFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<BroadcastOutput>\n (opts: Partial<BroadcastOptions>): BroadcastFn\n quiet: BroadcastFn\n}\n\nfunction makeBroadcast(opts: Partial<BroadcastOptions> = {}): BroadcastFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<BroadcastOptions>,\n ...args: unknown[]\n ): PatternPromise<BroadcastOutput> | BroadcastFn => {\n if (!Array.isArray(pieces)) {\n return makeBroadcast({ ...merged, ...(pieces as Partial<BroadcastOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as BroadcastFn\n\n let _quiet: BroadcastFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): BroadcastFn {\n if (!_quiet) _quiet = makeBroadcast({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u0392 tag \u2014 Broadcast: one-to-many messaging */\nexport const \u0392: BroadcastFn = makeBroadcast()\n", "/**\n * \u03A7 (Chi) \u2014 Cross-Agent Learning: extract patterns from execution traces\n *\n * A meta-pattern that analyzes the output of any other pizx pattern (or a\n * described execution) and extracts learnings: what worked, bottlenecks,\n * quality gaps, and actionable improvement recommendations.\n *\n * Usage:\n * await \u03A7`extract learnings from a debate about microservices vs monolith`\n * await \u03A7({ source: debateResult })`analyze what went well and what to improve`\n * await \u03A7({ trace: '...' })`identify optimization opportunities`\n * await \u03A7.quiet`review the fleet execution for efficiency patterns`\n *\n * Output: 4-category structured insights with confidence scores.\n *\n * Pattern: Cross-Agent Learning (Advanced Technique)\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ChiOptions extends PatternOptions {\n /** A previous pattern output to learn from */\n source?: PatternOutput\n /** Explicit execution trace text to analyze */\n trace?: string\n}\n\nconst defaults: ChiOptions = {\n maxTokens: 4096,\n thinkingLevel: 'high' as ThinkingLevel,\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class LearningInsight {\n constructor(\n /** Category: 'communication' | 'workflow' | 'quality' | 'efficiency' */\n public readonly category: string,\n /** The observed pattern */\n public readonly pattern: string,\n /** Actionable improvement recommendation */\n public readonly recommendation: string,\n /** Confidence score 0.0\u20131.0 */\n public readonly confidence: number\n ) {}\n}\n\nexport class ChiOutput extends PatternOutput {\n constructor(\n text: string,\n /** Extracted learning insights across 4 categories */\n public readonly insights: LearningInsight[],\n /** Executive summary of learnings */\n public readonly summary: string,\n /** Concrete suggested changes to roles, prompts, or workflow */\n public readonly suggestedChanges: string,\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Prompts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ANALYSIS_SYSTEM = `You are an agent team performance analyst. Review a multi-agent execution and extract structured learnings.\n\nAnalyze across these 4 categories:\n\n1. COMMUNICATION: How well did agents share information? Bottlenecks? Gaps?\n2. WORKFLOW: Was execution order optimal? Unnecessary or missing steps?\n3. QUALITY: Were there gaps, inconsistencies, or errors in outputs?\n4. EFFICIENCY: Where could parallelism, caching, or batching improve speed?\n\nFor EACH category, output exactly:\n\nCATEGORY: (communication | workflow | quality | efficiency)\nPATTERN: (one specific, observed pattern \u2014 be concrete)\nRECOMMENDATION: (one actionable, specific improvement)\nCONFIDENCE: 0.XX\n\nAfter all categories, output:\n\nSUMMARY: (2-3 sentence executive summary of key findings)\n\nCHANGES: (concrete, specific changes to agent roles, prompts, or workflow structure \u2014 cite specific phases or prompts that should change)`\n\n// \u2500\u2500 Input resolution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction resolveInput(opts: ChiOptions, template: string): string {\n if (opts.trace) return opts.trace\n\n if (opts.source) {\n const sourceType = opts.source.constructor.name\n return `Execution trace from ${sourceType} pattern:\\n\\n${opts.source.text}`\n }\n\n return `Description of an agent execution:\\n\\n${template}\\n\\n(Analyze this described execution and extract learnings.)`\n}\n\n// \u2500\u2500 Parse insights \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction parseInsights(response: string): {\n insights: LearningInsight[]\n summary: string\n suggestedChanges: string\n} {\n const insights: LearningInsight[] = []\n\n // Parse each category block\n const categoryRegex =\n /CATEGORY\\s*:\\s*(\\w+)[\\s\\S]*?PATTERN\\s*:\\s*(.+?)\\nRECOMMENDATION\\s*:\\s*(.+?)\\nCONFIDENCE\\s*:\\s*([\\d.]+)/gi\n let match: RegExpExecArray | null\n // biome-ignore lint/suspicious/noAssignInExpressions: regex exec pattern\n while ((match = categoryRegex.exec(response)) !== null) {\n const category = match[1].trim().toLowerCase()\n const pattern = match[2].trim()\n const recommendation = match[3].trim()\n const confidence = parseFloat(match[4]) || 0.5\n\n if (['communication', 'workflow', 'quality', 'efficiency'].includes(category)) {\n insights.push(\n new LearningInsight(category, pattern, recommendation, Math.min(1, Math.max(0, confidence)))\n )\n }\n }\n\n // Parse summary\n const summaryMatch = response.match(/SUMMARY\\s*:\\s*(.+?)(?:\\n\\n|$)/is)\n const summary = summaryMatch?.[1]?.trim() ?? 'No summary extracted.'\n\n // Parse changes\n const changesMatch = response.match(/CHANGES\\s*:\\s*(.+?)$/is)\n const suggestedChanges = changesMatch?.[1]?.trim() ?? 'No specific changes recommended.'\n\n return { insights, summary, suggestedChanges }\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: ChiOptions\n): Promise<ChiOutput> {\n const template = build(pieces, args)\n const input = resolveInput(opts, template)\n const t0 = Date.now()\n\n const plannerModel = opts.plannerModel ?? opts.model\n\n if (!opts.quiet) {\n const label = opts.source ? opts.source.constructor.name : opts.trace ? 'trace' : 'analysis'\n process.stderr.write(`\u03A7: Cross-Agent Learning \u2014 analyzing ${label}\\n`)\n }\n\n const response = await ask(input, {\n model: plannerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: ANALYSIS_SYSTEM,\n })\n\n const { insights, summary, suggestedChanges } = parseInsights(response)\n\n const t1 = Date.now()\n\n const text = [\n `Insights: ${insights.length} extracted`,\n insights\n .map(\n (i) =>\n ` [${i.category}] ${i.pattern.slice(0, 80)}... (confidence: ${i.confidence.toFixed(2)})`\n )\n .join('\\n'),\n `\\nSummary: ${summary}`,\n `\\nChanges: ${suggestedChanges}`,\n ].join('\\n')\n\n return new ChiOutput(text, insights, summary, suggestedChanges, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface ChiFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<ChiOutput>\n (opts: Partial<ChiOptions>): ChiFn\n quiet: ChiFn\n}\n\nfunction makeChi(opts: Partial<ChiOptions> = {}): ChiFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<ChiOptions>,\n ...args: unknown[]\n ): PatternPromise<ChiOutput> | ChiFn => {\n if (!Array.isArray(pieces)) {\n return makeChi({ ...merged, ...(pieces as Partial<ChiOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as ChiFn\n\n let _quiet: ChiFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): ChiFn {\n if (!_quiet) _quiet = makeChi({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u03A7 tag \u2014 Cross-Agent Learning: extract patterns and recommendations from traces */\nexport const \u03A7: ChiFn = makeChi()\n", "/**\n * \u03A8 (Psi) \u2014 Critique: generate \u2192 critique \u2192 improve cycle\n *\n * A focused two-phase pattern:\n * 1. Generate: an initial answer or solution\n * 2. Critique: another pass identifies issues and improvements\n * 3. Improve: the final answer incorporating the critique\n *\n * Unlike the Ralph loop (\u03A1), Critique is a single-pass refinement\n * designed for content quality rather than iterative tool use.\n *\n * Usage:\n * await \u03A8`write a README for this project`\n * await \u03A8({ rounds: 2 })`explain dependency injection`\n * await \u03A8.quiet`generate a commit message for these changes`\n *\n * Options:\n * rounds: number of critique-improve cycles (default: 1, max: 3)\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface CritiqueOptions extends PatternOptions {\n /** Number of critique-improve cycles. Default: 1, Max: 3 */\n rounds?: number\n}\n\nconst defaults: CritiqueOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n rounds: 1,\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class CritiqueRound {\n constructor(\n /** The generated/improved content */\n public readonly content: string,\n /** The critique of this round's content */\n public readonly critique: string,\n /** Round number (0-based) */\n public readonly round: number\n ) {}\n}\n\nexport class CritiqueOutput extends PatternOutput {\n constructor(\n text: string,\n /** Final improved content */\n public readonly finalContent: string,\n /** All critique rounds */\n public readonly rounds: CritiqueRound[],\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Prompts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst CRITIQUE_SYSTEM = `You are a thorough, constructive critic. Review the following content and identify:\n1. Strengths (what works well)\n2. Weaknesses (what could be improved)\n3. Specific suggestions for improvement\n\nBe specific, actionable, and constructive. Focus on substance, not style.`\n\nconst IMPROVE_SYSTEM = `You are a skilled editor. Revise the original content based on the critique provided.\nIncorporate the feedback while maintaining the original intent and voice.\nOutput ONLY the improved content \u2014 no commentary or explanation.`\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: CritiqueOptions\n): Promise<CritiqueOutput> {\n const prompt = build(pieces, args)\n const t0 = Date.now()\n const rounds = Math.min(opts.rounds ?? 1, 3)\n\n // Planner model for critique, worker model for generate/improve\n const plannerModel = opts.plannerModel ?? opts.model\n const workerModel = opts.workerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(\n `\u03A8: Critique \u2014 \"${prompt.slice(0, 80)}${prompt.length > 80 ? '...' : ''}\"\\n`\n )\n process.stderr.write(` \u2192 ${rounds} critique round(s)\\n`)\n }\n\n const critiqueRounds: CritiqueRound[] = []\n let currentContent = ''\n\n for (let r = 0; r < rounds; r++) {\n // Generate (first round) or improve (subsequent rounds)\n if (r === 0) {\n if (!opts.quiet) process.stderr.write(' \u2192 Generating initial content...\\n')\n currentContent = await ask(prompt, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: undefined,\n })\n } else {\n if (!opts.quiet) process.stderr.write(` \u2192 Improving (round ${r + 1})...\\n`)\n // Use the previous round's critique from the stored result\n const prevCritique = critiqueRounds[r - 1]?.critique ?? ''\n currentContent = await ask(\n `Original request: ${prompt}\\n\\nCritique:\\n${prevCritique}\\n\\nContent to improve:\\n${currentContent}\\n\\nRevise the content based on the critique.`,\n {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: IMPROVE_SYSTEM,\n }\n )\n }\n\n // Critique\n if (!opts.quiet) process.stderr.write(` \u2192 Critiquing (round ${r + 1})...\\n`)\n const critique = await ask(currentContent, {\n model: plannerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: CRITIQUE_SYSTEM,\n })\n\n critiqueRounds.push(new CritiqueRound(currentContent, critique, r))\n }\n\n const t1 = Date.now()\n const finalContent = currentContent\n\n const summary = critiqueRounds\n .map(\n (cr) =>\n `Round ${cr.round + 1}:\\n${cr.content.slice(0, 200)}${cr.content.length > 200 ? '...' : ''}\\nCritique: ${cr.critique.slice(0, 200)}${cr.critique.length > 200 ? '...' : ''}`\n )\n .join('\\n\\n')\n\n return new CritiqueOutput(summary, finalContent, critiqueRounds, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface CritiqueFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<CritiqueOutput>\n (opts: Partial<CritiqueOptions>): CritiqueFn\n quiet: CritiqueFn\n}\n\nfunction makeCritique(opts: Partial<CritiqueOptions> = {}): CritiqueFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<CritiqueOptions>,\n ...args: unknown[]\n ): PatternPromise<CritiqueOutput> | CritiqueFn => {\n if (!Array.isArray(pieces)) {\n return makeCritique({ ...merged, ...(pieces as Partial<CritiqueOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as CritiqueFn\n\n let _quiet: CritiqueFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): CritiqueFn {\n if (!_quiet) _quiet = makeCritique({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u03A8 tag \u2014 Critique: generate \u2192 critique \u2192 improve */\nexport const \u03A8: CritiqueFn = makeCritique()\n", "/**\n * \u0394 (Delta) \u2014 Debate: multiple perspectives converge on an answer\n *\n * Spawns multiple agents with different perspectives/roles, lets them each\n * analyze the problem, then converges on a final answer through synthesis.\n *\n * Supports multi-round rebuttals: when rounds > 1, each perspective sees\n * all round-1 arguments and produces a counter-argument in round 2+.\n *\n * Usage:\n * await \u0394`what's the best architecture for a real-time chat app?`\n * await \u0394({ perspectives: 3 })`should we use microservices or monolith?`\n * await \u0394({ perspectives: 3, rounds: 2 })`debate this design decision with rebuttals`\n * await \u0394.quiet`evaluate the trade-offs of this design decision`\n *\n * Each perspective gets a unique role (optimist, pessimist, pragmatist, etc.)\n * and contributes their analysis before synthesis.\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface DebateOptions extends PatternOptions {\n /** Number of perspectives to debate. Default: 3 */\n perspectives?: number\n /** Explicit perspective roles. Overrides auto-generation. */\n roles?: string[]\n /** Number of debate rounds (1 = initial only, 2+ = rebuttals). Default: 1 */\n rounds?: number\n}\n\nconst defaults: DebateOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n perspectives: 3,\n rounds: 1,\n}\n\n// Pre-built role sets for different numbers of perspectives\nconst ROLE_SETS: Record<number, string[]> = {\n 2: [\n 'Optimist \u2014 advocate for the most ambitious approach',\n 'Pessimist \u2014 identify risks and failure modes',\n ],\n 3: [\n 'Optimist \u2014 advocate the benefits and opportunities',\n 'Pessimist \u2014 identify risks, costs, and failure modes',\n 'Pragmatist \u2014 focus on practical trade-offs and implementation',\n ],\n 4: [\n 'Optimist \u2014 argue for the best-case potential',\n 'Pessimist \u2014 highlight worst-case risks and downsides',\n 'Pragmatist \u2014 balance pros/cons with practical constraints',\n 'Innovator \u2014 propose creative alternatives and novel approaches',\n ],\n 5: [\n 'Optimist',\n 'Pessimist',\n 'Pragmatist',\n 'Innovator',\n 'User Advocate \u2014 focus on end-user experience and accessibility',\n ],\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class DebatePerspective {\n constructor(\n /** The role/perspective name */\n public readonly role: string,\n /** The perspective's analysis (round 1) or counter-argument (rounds 2+) */\n public readonly argument: string,\n /** Debate round number. Default: 1 */\n public readonly round: number = 1\n ) {}\n}\n\nexport class DebateOutput extends PatternOutput {\n constructor(\n text: string,\n /** The converged/final answer */\n public readonly conclusion: string,\n /** Individual perspective arguments (all rounds) */\n public readonly perspectives: DebatePerspective[],\n /** Number of debate rounds executed */\n public readonly rounds: number,\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst PERSPECTIVE_SYSTEM = (role: string) =>\n `You are a debater with the role: ${role}. Analyze the question from your perspective. Be thorough and specific. Provide evidence and reasoning for your position.`\n\nconst REBUTTAL_SYSTEM = (role: string) =>\n `You are a debater with the role: ${role}. Review the debate so far \u2014 including arguments from all other perspectives \u2014 and refine your position. Address counter-arguments directly. Challenge weak points in opposing views. Strengthen your original position with rebuttals. Be specific and responsive.`\n\nconst SYNTHESIS_SYSTEM = `You are a neutral moderator. Synthesize the different perspectives into a balanced, reasoned conclusion. Weigh the evidence from each perspective and provide a final recommendation. Be specific and actionable.`\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: DebateOptions\n): Promise<DebateOutput> {\n const question = build(pieces, args)\n const t0 = Date.now()\n const count = opts.perspectives ?? 3\n const totalRounds = opts.rounds ?? 1\n const roles = opts.roles ?? ROLE_SETS[count] ?? ROLE_SETS[3] ?? []\n\n // Planner model for synthesis, worker model for individual perspectives\n const plannerModel = opts.plannerModel ?? opts.model\n const workerModel = opts.workerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(\n `\u0394: Debate \u2014 \"${question.slice(0, 80)}${question.length > 80 ? '...' : ''}\"\\n`\n )\n process.stderr.write(` \u2192 ${roles.length} perspective(s), ${totalRounds} round(s)\\n`)\n }\n\n const allPerspectives: DebatePerspective[] = []\n let debateHistory = `Question: ${question}\\n`\n\n // \u2500\u2500 Round 1: Initial perspectives (parallel) \u2500\u2500\n if (!opts.quiet) process.stderr.write(' \u2192 Round 1: Initial perspectives...\\n')\n\n const round1Results = await Promise.allSettled(\n roles.map((role) =>\n ask(question, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: PERSPECTIVE_SYSTEM(role),\n }).then((text) => new DebatePerspective(role, text, 1))\n )\n )\n\n const round1Perspectives: DebatePerspective[] = []\n round1Results.forEach((r, i) => {\n if (r.status === 'fulfilled') {\n round1Perspectives.push(r.value)\n } else {\n round1Perspectives.push(\n new DebatePerspective(roles[i] ?? `Perspective ${i + 1}`, `(failed: ${r.reason})`, 1)\n )\n }\n })\n allPerspectives.push(...round1Perspectives)\n\n debateHistory += `${round1Perspectives.map((p) => `[Round 1] ${p.role}: ${p.argument}`).join('\\n\\n')}\\n`\n\n // \u2500\u2500 Rounds 2+: Rebuttals (parallel within each round) \u2500\u2500\n for (let round = 2; round <= totalRounds; round++) {\n if (!opts.quiet) process.stderr.write(` \u2192 Round ${round}: Rebuttals...\\n`)\n\n const roundResults = await Promise.allSettled(\n roles.map((role) => {\n // Show all prior arguments to this agent\n const othersText = allPerspectives\n .filter((p) => p.role !== role)\n .map((p) => `[${p.role}, Round ${p.round}]: ${p.argument}`)\n .join('\\n\\n')\n\n const ownText = allPerspectives\n .filter((p) => p.role === role)\n .map((p) => `[Your Round ${p.round}]: ${p.argument}`)\n .join('\\n\\n')\n\n const prompt = `Question: ${question}\\n\\nYour previous position:\\n${ownText}\\n\\nCounter-arguments from other perspectives:\\n${othersText}\\n\\nRefine your position. Address the counter-arguments directly. Strengthen your argument with rebuttals.`\n\n return ask(prompt, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: REBUTTAL_SYSTEM(role),\n }).then((text) => new DebatePerspective(role, text, round))\n })\n )\n\n const roundPerspectives: DebatePerspective[] = []\n roundResults.forEach((r, i) => {\n if (r.status === 'fulfilled') {\n roundPerspectives.push(r.value)\n } else {\n roundPerspectives.push(\n new DebatePerspective(roles[i] ?? `Perspective ${i + 1}`, `(failed: ${r.reason})`, round)\n )\n }\n })\n allPerspectives.push(...roundPerspectives)\n\n debateHistory += `${roundPerspectives.map((p) => `[Round ${round}] ${p.role}: ${p.argument}`).join('\\n\\n')}\\n`\n }\n\n // \u2500\u2500 Synthesize with full debate history \u2500\u2500\n if (!opts.quiet) process.stderr.write(' \u2192 Synthesizing perspectives...\\n')\n\n const conclusion = await ask(\n `${debateHistory}\\n\\nSynthesize a balanced conclusion from the full debate above. Weigh the evidence from all rounds.`,\n {\n model: plannerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: 'high' as ThinkingLevel,\n system: SYNTHESIS_SYSTEM,\n }\n )\n\n const t1 = Date.now()\n\n return new DebateOutput(conclusion, conclusion, allPerspectives, totalRounds, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface DebateFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<DebateOutput>\n (opts: Partial<DebateOptions>): DebateFn\n quiet: DebateFn\n}\n\nfunction makeDebate(opts: Partial<DebateOptions> = {}): DebateFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<DebateOptions>,\n ...args: unknown[]\n ): PatternPromise<DebateOutput> | DebateFn => {\n if (!Array.isArray(pieces)) {\n return makeDebate({ ...merged, ...(pieces as Partial<DebateOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as DebateFn\n\n let _quiet: DebateFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): DebateFn {\n if (!_quiet) _quiet = makeDebate({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u0394 tag \u2014 Debate: multiple perspectives converge */\nexport const \u0394: DebateFn = makeDebate()\n", "/**\n * \u03A6 (Phi) \u2014 Fleet: parallel agent execution\n *\n * Runs multiple tasks in parallel using Promise.allSettled.\n * Each task gets its own LLM call and results are collected.\n *\n * Usage:\n * await \u03A6`review all .ts files in src/`\n * // Auto-splits by lines or bullet points\n *\n * await \u03A6({ tasks: ['lint src/', 'check types', 'run tests'] })`execute`\n * // Explicit task list\n *\n * await \u03A6.quiet`analyze all examples for best practices`\n * // Silent mode\n *\n * The template can contain:\n * - One task per line (each line is a separate agent call)\n * - Bullet points (- or * each become a task)\n * - A single paragraph (auto-split via AI)\n *\n * Each fleet member runs as a simple \u03C0-style text generation call.\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface FleetOptions extends PatternOptions {\n /** Explicit array of task descriptions. When provided, template is ignored. */\n tasks?: string[]\n /** Maximum concurrency. Default: 5 */\n concurrency?: number\n}\n\nconst defaults: FleetOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n concurrency: 5,\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class FleetMemberOutput {\n constructor(\n /** The task description */\n public readonly task: string,\n /** The agent's response text */\n public readonly text: string,\n /** Whether this task completed successfully */\n public readonly success: boolean,\n /** Error message if failed */\n public readonly error?: string\n ) {}\n}\n\nexport class FleetOutput extends PatternOutput {\n constructor(\n text: string,\n /** Results for each fleet member */\n public readonly members: FleetMemberOutput[],\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n\n /** Number of successful members */\n get successCount(): number {\n return this.members.filter((m) => m.success).length\n }\n\n /** Number of failed members */\n get failureCount(): number {\n return this.members.filter((m) => !m.success).length\n }\n}\n\n// \u2500\u2500 Task parsing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction parseTasks(template: string, explicitTasks?: string[]): string[] {\n if (explicitTasks && explicitTasks.length > 0) return explicitTasks\n\n const lines = template\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean)\n\n // Bullet points: each - or * line is a task\n const bullets = lines.filter((l) => /^[-*]\\s/.test(l))\n if (bullets.length > 1) return bullets.map((b) => b.replace(/^[-*]\\s+/, ''))\n\n // Numbered: each \"N.\" or \"N)\" line is a task\n const numbered = lines.filter((l) => /^\\d+[.)]\\s/.test(l))\n if (numbered.length > 1) return numbered.map((n) => n.replace(/^\\d+[.)]\\s+/, ''))\n\n // Multiple lines: each non-empty line is a task\n if (lines.length > 1) return lines\n\n // Single line: return as-is (one task)\n return [template]\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst FLEET_SYSTEM = `You are a focused task specialist. Complete the assigned task concisely and accurately. Output only the result \u2014 no commentary about being an AI.`\n\nasync function executeTask(\n task: string,\n opts: FleetOptions,\n workerModel?: string\n): Promise<FleetMemberOutput> {\n const model = workerModel ?? opts.model\n try {\n const text = await ask(task, {\n model,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: opts.system ?? FLEET_SYSTEM,\n })\n return new FleetMemberOutput(task, text, true)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n return new FleetMemberOutput(task, '', false, msg)\n }\n}\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: FleetOptions\n): Promise<FleetOutput> {\n const template = build(pieces, args)\n const tasks = parseTasks(template, opts.tasks)\n const t0 = Date.now()\n\n // Fleet is pure execution \u2014 all tasks use worker model\n const workerModel = opts.workerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(`\u03A6: Fleet executing ${tasks.length} task(s) in parallel\\n`)\n for (let i = 0; i < tasks.length; i++) {\n const t = tasks[i]\n process.stderr.write(` [${i + 1}] ${t.slice(0, 60)}${t.length > 60 ? '...' : ''}\\n`)\n }\n }\n\n // Run tasks with concurrency limit\n const results: FleetMemberOutput[] = []\n const concurrency = opts.concurrency ?? 5\n\n for (let i = 0; i < tasks.length; i += concurrency) {\n const batch = tasks.slice(i, i + concurrency)\n const batchResults = await Promise.allSettled(\n batch.map((task) => executeTask(task, opts, workerModel))\n )\n batchResults.forEach((r, idx) => {\n if (r.status === 'fulfilled') {\n results.push(r.value)\n } else {\n results.push(new FleetMemberOutput(batch[idx], '', false, r.reason?.toString()))\n }\n })\n }\n\n const t1 = Date.now()\n\n // Build summary text\n const summary = results\n .map(\n (m, i) =>\n `[${i + 1}] ${m.task}\\n ${m.success ? '\u2713' : '\u2717'} ${m.text.slice(0, 200)}${m.text.length > 200 ? '...' : ''}`\n )\n .join('\\n\\n')\n\n const header = `Fleet Results: ${results.filter((r) => r.success).length}/${results.length} succeeded\\n\\n`\n\n return new FleetOutput(header + summary, results, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface FleetFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<FleetOutput>\n (opts: Partial<FleetOptions>): FleetFn\n quiet: FleetFn\n}\n\nfunction makeFleet(opts: Partial<FleetOptions> = {}): FleetFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<FleetOptions>,\n ...args: unknown[]\n ): PatternPromise<FleetOutput> | FleetFn => {\n if (!Array.isArray(pieces)) {\n return makeFleet({ ...merged, ...(pieces as Partial<FleetOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as FleetFn\n\n let _quiet: FleetFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): FleetFn {\n if (!_quiet) _quiet = makeFleet({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u03A6 tag \u2014 Fleet: parallel agent execution */\nexport const \u03A6: FleetFn = makeFleet()\n", "/**\n * \u0393 (Gamma) \u2014 Graph: DAG-based task execution\n *\n * Executes tasks defined as a directed acyclic graph. Each node is a task,\n * edges define dependencies. Tasks with all dependencies met run in parallel.\n * The final output is the result of the graph's sink node.\n *\n * Usage:\n * await \u0393`market-research \u2192 competitor-analysis \u2192 strategy-doc`\n * await \u0393({ graph: { nodes: [...], edges: [...] } })`execute this workflow`\n * await \u0393.quiet`research & analyze & document`\n *\n * Orchestration pattern: DAG-Based workflow\n * Topology: Directed Acyclic Graph\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** A node in the DAG \u2014 represents a single task */\nexport interface GraphNode {\n /** Unique node id */\n id: string\n /** Task description */\n task: string\n}\n\n/** A directed edge in the DAG */\nexport interface GraphEdge {\n /** Source node id (dependency) */\n from: string\n /** Target node id (depends on source) */\n to: string\n}\n\nexport interface GraphOptions extends PatternOptions {\n /** Explicit graph definition. When provided, template is ignored. */\n graph?: { nodes: GraphNode[]; edges: GraphEdge[] }\n /** Separator for parsing graph from template. Default: \"\u2192\" */\n separator?: string\n}\n\nconst defaults: GraphOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class GraphNodeResult {\n constructor(\n public readonly nodeId: string,\n public readonly task: string,\n public readonly output: string,\n public readonly success: boolean\n ) {}\n}\n\nexport class GraphOutput extends PatternOutput {\n constructor(\n text: string,\n public readonly finalOutput: string,\n public readonly nodeResults: GraphNodeResult[],\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Graph parsing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction parseGraph(\n template: string,\n separator?: string\n): { nodes: GraphNode[]; edges: GraphEdge[] } {\n const sep = separator ?? '\u2192'\n const parts = template\n .split(sep)\n .map((s) => s.trim())\n .filter(Boolean)\n\n if (parts.length <= 1) {\n // Single task \u2014 one node\n return {\n nodes: [{ id: 'root', task: template.trim() }],\n edges: [],\n }\n }\n\n const nodes: GraphNode[] = []\n const edges: GraphEdge[] = []\n\n for (let i = 0; i < parts.length; i++) {\n const id = `step_${i + 1}`\n nodes.push({ id, task: parts[i] })\n if (i > 0) {\n edges.push({ from: nodes[i - 1].id, to: id })\n }\n }\n\n return { nodes, edges }\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst NODE_SYSTEM = `You are a task specialist. Execute the assigned task and output your result. Be thorough but concise. Output only the result \u2014 no meta-commentary.`\n\n/** Topological sort with parallel-ready batches. Returns batches of node ids. */\nexport function topoBatches(nodes: GraphNode[], edges: GraphEdge[]): string[][] {\n const nodeIds = new Set(nodes.map((n) => n.id))\n const inDegree = new Map<string, number>()\n const adj = new Map<string, string[]>()\n\n for (const id of nodeIds) {\n inDegree.set(id, 0)\n adj.set(id, [])\n }\n\n for (const edge of edges) {\n if (!nodeIds.has(edge.from) || !nodeIds.has(edge.to)) continue\n inDegree.set(edge.to, (inDegree.get(edge.to) ?? 0) + 1)\n adj.get(edge.from)?.push(edge.to)\n }\n\n const batches: string[][] = []\n const ready: string[] = []\n\n for (const [id, deg] of inDegree) {\n if (deg === 0) ready.push(id)\n }\n\n while (ready.length > 0) {\n batches.push([...ready])\n const nextBatch: string[] = []\n\n for (const node of ready) {\n for (const neighbor of adj.get(node) ?? []) {\n const newDeg = (inDegree.get(neighbor) ?? 1) - 1\n inDegree.set(neighbor, newDeg)\n if (newDeg === 0) nextBatch.push(neighbor)\n }\n }\n\n ready.length = 0\n ready.push(...nextBatch)\n }\n\n return batches\n}\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: GraphOptions\n): Promise<GraphOutput> {\n const template = build(pieces, args)\n const t0 = Date.now()\n\n const { nodes, edges } = opts.graph ?? parseGraph(template, opts.separator)\n\n const workerModel = opts.workerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(`\u0393: DAG Graph \u2014 ${nodes.length} node(s), ${edges.length} edge(s)\\n`)\n for (const n of nodes) {\n process.stderr.write(` [${n.id}] ${n.task.slice(0, 60)}${n.task.length > 60 ? '...' : ''}\\n`)\n }\n }\n\n const batches = topoBatches(nodes, edges)\n const results = new Map<string, string>()\n const nodeResults: GraphNodeResult[] = []\n\n // Execute batch by batch\n for (let bi = 0; bi < batches.length; bi++) {\n const batch = batches[bi]\n if (!opts.quiet)\n process.stderr.write(` \u2192 Batch ${bi + 1}/${batches.length}: ${batch.join(', ')}\\n`)\n\n // Run all nodes in this batch in parallel\n const batchResults = await Promise.allSettled(\n batch.map(async (nodeId) => {\n const node = nodes.find((n) => n.id === nodeId)\n if (!node) return { nodeId, task: '', text: '', success: false }\n\n // Build context from dependencies' results\n const deps = edges.filter((e) => e.to === nodeId)\n let context = node.task\n if (deps.length > 0) {\n const depResults = deps\n .map((d) => {\n const depResult = results.get(d.from)\n return depResult ? `[${d.from} output]: ${depResult}` : ''\n })\n .filter(Boolean)\n .join('\\n\\n')\n if (depResults) {\n context = `Previous results:\\n${depResults}\\n\\nYour task: ${node.task}`\n }\n }\n\n const text = await ask(context, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: NODE_SYSTEM,\n })\n\n return { nodeId, task: node.task, text, success: true }\n })\n )\n\n for (const r of batchResults) {\n if (r.status === 'fulfilled') {\n results.set(r.value.nodeId, r.value.text)\n nodeResults.push(\n new GraphNodeResult(r.value.nodeId, r.value.task, r.value.text, r.value.success)\n )\n }\n }\n }\n\n const t1 = Date.now()\n\n // Final output is the result of the last node(s) in the final batch\n const lastBatch = batches[batches.length - 1] ?? []\n const finalNodeResults = lastBatch.map((id) => results.get(id)).filter(Boolean)\n const finalOutput = finalNodeResults.length > 0 ? finalNodeResults.join('\\n\\n') : ''\n\n const summary = nodeResults\n .map(\n (nr) =>\n `[${nr.nodeId}] ${nr.task.slice(0, 80)}...\\n ${nr.output.slice(0, 200)}${nr.output.length > 200 ? '...' : ''}`\n )\n .join('\\n\\n')\n\n return new GraphOutput(summary, finalOutput, nodeResults, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface GraphFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<GraphOutput>\n (opts: Partial<GraphOptions>): GraphFn\n quiet: GraphFn\n}\n\nfunction makeGraph(opts: Partial<GraphOptions> = {}): GraphFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<GraphOptions>,\n ...args: unknown[]\n ): PatternPromise<GraphOutput> | GraphFn => {\n if (!Array.isArray(pieces)) {\n return makeGraph({ ...merged, ...(pieces as Partial<GraphOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as GraphFn\n\n let _quiet: GraphFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): GraphFn {\n if (!_quiet) _quiet = makeGraph({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u0393 tag \u2014 Graph: DAG-based task execution */\nexport const \u0393: GraphFn = makeGraph()\n", "/**\n * \u039C (Mu) \u2014 Memory: shared blackboard pattern\n *\n * Multiple agents write their findings to a shared \"blackboard\" in parallel.\n * Each agent can see what others have already written. After all agents have\n * contributed, a consolidator merges everything into a final output.\n *\n * Usage:\n * await \u039C`analyze this codebase from multiple angles`\n * await \u039C({ agents: 4, rounds: 2 })`brainstorm features for the project`\n * await \u039C.quiet`research this topic comprehensively`\n *\n * Communication pattern: Tool-Mediated (shared memory/blackboard)\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface MemoryOptions extends PatternOptions {\n /** Number of agents writing to the blackboard. Default: 3 */\n agents?: number\n /** Number of writing rounds (each agent can refine after seeing others). Default: 1 */\n rounds?: number\n /** Custom agent roles. Auto-generated if not provided. */\n roles?: string[]\n}\n\nconst defaults: MemoryOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n agents: 3,\n rounds: 1,\n}\n\nconst ROLE_SETS: Record<number, string[]> = {\n 2: ['Analyst \u2014 deep analysis of core aspects', 'Reviewer \u2014 check for gaps and blind spots'],\n 3: [\n 'Analyst \u2014 deep analysis of core aspects',\n 'Reviewer \u2014 check for gaps, edge cases, and blind spots',\n 'Strategist \u2014 connect findings to actionable insights',\n ],\n 4: [\n 'Analyst',\n 'Reviewer',\n 'Strategist',\n 'Innovator \u2014 propose novel angles and creative solutions',\n ],\n 5: [\n 'Analyst',\n 'Reviewer',\n 'Strategist',\n 'Innovator',\n 'Skeptic \u2014 challenge assumptions and stress-test conclusions',\n ],\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class MemoryEntry {\n constructor(\n public readonly role: string,\n public readonly round: number,\n public readonly content: string\n ) {}\n}\n\nexport class MemoryOutput extends PatternOutput {\n constructor(\n text: string,\n public readonly synthesis: string,\n public readonly entries: MemoryEntry[],\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst WRITER_PROMPT = `You are a specialist with role: {role}.\n\nTopic: {topic}\n\nCurrent findings on the shared blackboard (written by other agents):\n{context}\n\nAdd your contribution to the blackboard. Be specific, add unique insights.\nDon't repeat what others have already covered \u2014 fill gaps, add depth, or challenge.\nKeep your contribution under 200 words.`\n\nconst CONSOLIDATOR_SYSTEM = `You are a research director. Consolidate findings from multiple specialists into a comprehensive, well-structured synthesis. Combine overlapping insights, resolve contradictions, prioritize the most impactful findings.`\n\nfunction buildWriterPrompt(role: string, topic: string, context: string): string {\n return WRITER_PROMPT.replace('{role}', role)\n .replace('{topic}', topic)\n .replace('{context}', context || '(No prior entries yet. You are the first contributor.)')\n}\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: MemoryOptions\n): Promise<MemoryOutput> {\n const topic = build(pieces, args)\n const t0 = Date.now()\n const agentCount = opts.agents ?? 3\n const totalRounds = opts.rounds ?? 1\n const roles = opts.roles ?? ROLE_SETS[agentCount] ?? ROLE_SETS[3] ?? []\n\n const plannerModel = opts.plannerModel ?? opts.model\n const workerModel = opts.workerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(`\u039C: Shared Memory \u2014 ${agentCount} agent(s), ${totalRounds} round(s)\\n`)\n process.stderr.write(` Topic: \"${topic.slice(0, 80)}${topic.length > 80 ? '...' : ''}\"\\n`)\n }\n\n const entries: MemoryEntry[] = []\n let blackboard = ''\n\n for (let round = 1; round <= totalRounds; round++) {\n if (!opts.quiet) process.stderr.write(` \u2192 Round ${round}/${totalRounds}\\n`)\n\n // All agents write in parallel for this round\n const roundResults = await Promise.allSettled(\n roles.map(async (role) => {\n const prompt = buildWriterPrompt(role, topic, blackboard)\n const text = await ask(prompt, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n })\n return { role, text }\n })\n )\n\n for (const r of roundResults) {\n if (r.status === 'fulfilled') {\n entries.push(new MemoryEntry(r.value.role, round, r.value.text))\n blackboard += `\\n[${r.value.role}] Round ${round}: ${r.value.text}\\n`\n }\n }\n }\n\n // Consolidate (planner model)\n if (!opts.quiet) process.stderr.write(' \u2192 Consolidating findings...\\n')\n\n const synthesis = await ask(\n `Topic: ${topic}\\n\\nBlackboard findings:\\n${blackboard}\\n\\nConsolidate into a comprehensive, structured synthesis.`,\n {\n model: plannerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: 'high' as ThinkingLevel,\n system: CONSOLIDATOR_SYSTEM,\n }\n )\n\n const t1 = Date.now()\n\n const summary = entries\n .map(\n (e) =>\n `[${e.role}] Round ${e.round}: ${e.content.slice(0, 150)}${e.content.length > 150 ? '...' : ''}`\n )\n .join('\\n')\n\n return new MemoryOutput(summary, synthesis, entries, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface MemoryFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<MemoryOutput>\n (opts: Partial<MemoryOptions>): MemoryFn\n quiet: MemoryFn\n}\n\nfunction makeMemory(opts: Partial<MemoryOptions> = {}): MemoryFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<MemoryOptions>,\n ...args: unknown[]\n ): PatternPromise<MemoryOutput> | MemoryFn => {\n if (!Array.isArray(pieces)) {\n return makeMemory({ ...merged, ...(pieces as Partial<MemoryOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as MemoryFn\n\n let _quiet: MemoryFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): MemoryFn {\n if (!_quiet) _quiet = makeMemory({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u039C tag \u2014 Memory: shared blackboard pattern */\nexport const \u039C: MemoryFn = makeMemory()\n", "/**\n * \u039D (Nu) \u2014 Self-Organizing Teams: auto-negotiate roles and workflow\n *\n * A meta-pattern where agents autonomously propose their own roles,\n * determine the optimal workflow structure, then execute and synthesize.\n *\n * Usage:\n * await \u039D`analyze the full codebase for security vulnerabilities`\n * await \u039D({ minAgents: 2, maxAgents: 5 })`design a real-time chat architecture`\n * await \u039D.quiet`plan the project roadmap`\n *\n * Flow:\n * 1. Analyze task \u2192 propose candidate roles (planner)\n * 2. Determine best workflow: sequential | parallel | mixed (planner)\n * 3. Execute roles according to the chosen workflow (worker)\n * 4. Synthesize all role outputs into final answer (planner)\n *\n * Pattern: Self-Organizing Teams (Advanced Technique)\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface NuOptions extends PatternOptions {\n /** Minimum number of agents to propose. Default: 2 */\n minAgents?: number\n /** Maximum number of agents to propose. Default: 5 */\n maxAgents?: number\n /** Explicit roles (skip negotiation when provided). */\n roles?: NuRole[]\n}\n\nconst defaults: NuOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n minAgents: 2,\n maxAgents: 5,\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class NuRole {\n constructor(\n /** Role name, e.g. \"Security Analyst\" */\n public readonly name: string,\n /** Self-described domain expertise */\n public readonly expertise: string,\n /** What this role should accomplish for this task */\n public readonly goal: string\n ) {}\n}\n\nexport class NuOutput extends PatternOutput {\n constructor(\n text: string,\n /** The auto-negotiated roles */\n public readonly negotiatedRoles: NuRole[],\n /** Chosen workflow: 'sequential' | 'parallel' | 'mixed' */\n public readonly workflow: 'sequential' | 'parallel' | 'mixed',\n /** Why this workflow was chosen */\n public readonly workflowReasoning: string,\n /** Results from each role execution */\n public readonly roleResults: { role: string; output: string }[],\n /** Synthesized final answer */\n public readonly synthesis: string,\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Prompts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst NEGOTIATE_SYSTEM = `You are a team architect. Given a task, propose a team of specialized agents. Each role must have a distinct name, expertise, and goal.\n\nOutput format \u2014 one role per block, exactly as shown:\n\nROLE:\nNAME: Security Analyst\nEXPERTISE: (1 sentence describing domain knowledge)\nGOAL: (1 sentence describing what this role must accomplish)\n\nROLE:\nNAME: Performance Engineer\nEXPERTISE: (1 sentence)\nGOAL: (1 sentence)\n\nPropose between {min} and {max} roles. Each role must be clearly distinct.\nOutput only the role blocks \u2014 no preamble, no summary.`\n\nconst WORKFLOW_SYSTEM = `You are a workflow designer. Given a set of agent roles, determine the best execution strategy.\n\nRules:\n- sequential: roles depend on each other's outputs (output of A is input to B)\n- parallel: roles can work independently on different aspects\n- mixed: some roles are independent, some depend on others' outputs\n\nOutput exactly:\nWORKFLOW: (sequential | parallel | mixed)\nREASONING: (1-2 sentences explaining why)`\n\nconst EXECUTE_SYSTEM = (role: NuRole) =>\n `You are a ${role.name}. Expertise: ${role.expertise}. Goal: ${role.goal}. Complete your assigned task thoroughly and concisely. Output your findings directly \u2014 no meta-commentary.`\n\nconst SYNTHESIS_SYSTEM = `You are a delivery manager. Synthesize the contributions from all team members into a coherent, comprehensive final answer. Combine overlapping insights, resolve conflicts, and prioritize the most impactful findings.`\n\n// \u2500\u2500 Phase 1: Negotiate roles \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function negotiateRoles(task: string, opts: NuOptions): Promise<NuRole[]> {\n if (opts.roles && opts.roles.length > 0) return opts.roles\n\n const min = opts.minAgents ?? 2\n const max = opts.maxAgents ?? 5\n\n const prompt = NEGOTIATE_SYSTEM.replace('{min}', String(min)).replace('{max}', String(max))\n\n const response = await ask(`Task: ${task}\\n\\n${prompt}`, {\n model: opts.plannerModel ?? opts.model,\n maxTokens: 2048,\n thinkingLevel: 'high' as ThinkingLevel,\n })\n\n const roles: NuRole[] = []\n // Parse role blocks with regex\n const roleBlocks = response.split(/ROLE\\s*:/i).filter((b) => b.trim())\n\n for (const block of roleBlocks) {\n const nameMatch = block.match(/NAME\\s*:\\s*(.+)/i)\n const expertiseMatch = block.match(/EXPERTISE\\s*:\\s*(.+)/i)\n const goalMatch = block.match(/GOAL\\s*:\\s*(.+)/i)\n\n if (nameMatch && expertiseMatch && goalMatch) {\n roles.push(new NuRole(nameMatch[1].trim(), expertiseMatch[1].trim(), goalMatch[1].trim()))\n }\n }\n\n if (roles.length === 0) {\n // Fallback: split response into lines and create generic roles\n const lines = response\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean)\n const fallbackRoles = lines.slice(0, max).map((line, i) => {\n const clean = line.replace(/^[-*\\d]+[.)\\s]*/, '').slice(0, 60)\n return new NuRole(`Agent ${i + 1}`, clean, `Execute sub-task: ${clean}`)\n })\n return fallbackRoles.length > 0\n ? fallbackRoles\n : [new NuRole('Generalist', 'Broad domain knowledge', task)]\n }\n\n return roles.slice(0, max)\n}\n\n// \u2500\u2500 Phase 2: Decide workflow \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function decideWorkflow(\n roles: NuRole[],\n task: string,\n opts: NuOptions\n): Promise<{ workflow: 'sequential' | 'parallel' | 'mixed'; reasoning: string }> {\n if (roles.length <= 1)\n return { workflow: 'parallel', reasoning: 'Single role \u2014 no dependencies.' }\n\n const rolesText = roles.map((r, i) => `${i + 1}. ${r.name}: ${r.goal}`).join('\\n')\n\n const response = await ask(\n `Task: ${task}\\n\\nRoles:\\n${rolesText}\\n\\nDetermine the best execution strategy.`,\n {\n model: opts.plannerModel ?? opts.model,\n maxTokens: 512,\n thinkingLevel: 'high' as ThinkingLevel,\n system: WORKFLOW_SYSTEM,\n }\n )\n\n const wfMatch = response.match(/WORKFLOW\\s*:\\s*(.+)/i)\n const reasonMatch = response.match(/REASONING\\s*:\\s*(.+)/i)\n\n const workflowRaw = (wfMatch?.[1] ?? 'parallel').trim().toLowerCase()\n const workflow: 'sequential' | 'parallel' | 'mixed' = workflowRaw.startsWith('seq')\n ? 'sequential'\n : workflowRaw.startsWith('mix')\n ? 'mixed'\n : 'parallel'\n\n return {\n workflow,\n reasoning: reasonMatch?.[1]?.trim() ?? 'Auto-determined based on role dependencies.',\n }\n}\n\n// \u2500\u2500 Phase 3: Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function executeRoles(\n roles: NuRole[],\n task: string,\n workflow: 'sequential' | 'parallel' | 'mixed',\n opts: NuOptions\n): Promise<{ role: string; output: string }[]> {\n const workerModel = opts.workerModel ?? opts.model\n const results: { role: string; output: string }[] = []\n\n if (workflow === 'sequential') {\n // Chain: each role gets previous output as context\n let context = task\n for (const role of roles) {\n const output = await ask(context, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: EXECUTE_SYSTEM(role),\n })\n results.push({ role: role.name, output })\n context = `Previous output from ${role.name}:\\n${output}\\n\\nContinue with: ${task}`\n }\n } else {\n // parallel or mixed: run all in parallel (v1 simplification)\n const parallelResults = await Promise.allSettled(\n roles.map((role) =>\n ask(task, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: EXECUTE_SYSTEM(role),\n })\n .then((text) => ({ role: role.name, output: text }))\n .catch((err) => ({ role: role.name, output: `(failed: ${String(err)})` }))\n )\n )\n for (const r of parallelResults) {\n if (r.status === 'fulfilled') results.push(r.value)\n }\n }\n\n return results\n}\n\n// \u2500\u2500 Phase 4: Synthesize \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function synthesize(\n task: string,\n results: { role: string; output: string }[],\n opts: NuOptions\n): Promise<string> {\n const resultsText = results.map((r) => `--- ${r.role} ---\\n${r.output}`).join('\\n\\n')\n\n return ask(\n `Original task:\\n${task}\\n\\nTeam member outputs:\\n${resultsText}\\n\\nSynthesize a comprehensive final answer.`,\n {\n model: opts.plannerModel ?? opts.model,\n maxTokens: opts.maxTokens,\n thinkingLevel: 'high' as ThinkingLevel,\n system: SYNTHESIS_SYSTEM,\n }\n )\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: NuOptions\n): Promise<NuOutput> {\n const task = build(pieces, args)\n const t0 = Date.now()\n\n const plannerModel = opts.plannerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(\n `\u039D: Self-Organizing Teams \u2014 \"${task.slice(0, 80)}${task.length > 80 ? '...' : ''}\"\\n`\n )\n }\n\n // Phase 1: Negotiate roles\n if (!opts.quiet) process.stderr.write(' \u2192 Negotiating roles...\\n')\n const roles = await negotiateRoles(task, { ...opts, plannerModel })\n\n if (!opts.quiet) {\n process.stderr.write(` \u2192 ${roles.length} role(s) proposed:\\n`)\n for (const r of roles) {\n process.stderr.write(\n ` ${r.name}: ${r.goal.slice(0, 60)}${r.goal.length > 60 ? '...' : ''}\\n`\n )\n }\n }\n\n // Phase 2: Decide workflow\n if (!opts.quiet) process.stderr.write(' \u2192 Deciding workflow...\\n')\n const { workflow, reasoning } = await decideWorkflow(roles, task, { ...opts, plannerModel })\n\n if (!opts.quiet) {\n process.stderr.write(` \u2192 Workflow: ${workflow}\\n`)\n process.stderr.write(\n ` \u2192 Reasoning: ${reasoning.slice(0, 80)}${reasoning.length > 80 ? '...' : ''}\\n`\n )\n }\n\n // Phase 3: Execute\n if (!opts.quiet) process.stderr.write(` \u2192 Executing (${workflow})...\\n`)\n const roleResults = await executeRoles(roles, task, workflow, opts)\n\n // Phase 4: Synthesize\n if (!opts.quiet) process.stderr.write(' \u2192 Synthesizing...\\n')\n const synthesis = await synthesize(task, roleResults, { ...opts, plannerModel })\n\n const t1 = Date.now()\n\n const summary = [\n `Roles: ${roles.map((r) => r.name).join(', ')}`,\n `Workflow: ${workflow} (${reasoning})`,\n `Results: ${roleResults.length}/${roles.length} succeeded`,\n `Synthesis: ${synthesis}`,\n ].join('\\n\\n')\n\n return new NuOutput(summary, roles, workflow, reasoning, roleResults, synthesis, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface NuFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<NuOutput>\n (opts: Partial<NuOptions>): NuFn\n quiet: NuFn\n}\n\nfunction makeNu(opts: Partial<NuOptions> = {}): NuFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<NuOptions>,\n ...args: unknown[]\n ): PatternPromise<NuOutput> | NuFn => {\n if (!Array.isArray(pieces)) {\n return makeNu({ ...merged, ...(pieces as Partial<NuOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as NuFn\n\n let _quiet: NuFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): NuFn {\n if (!_quiet) _quiet = makeNu({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u039D tag \u2014 Self-Organizing Teams: auto-negotiate roles and workflow */\nexport const \u039D: NuFn = makeNu()\n", "/**\n * \u03A9 (Omega) \u2014 Orchestrator: plan \u2192 dispatch \u2192 synthesize\n *\n * A high-level orchestrator pattern where a planner agent:\n * 1. Analyzes the request and creates a detailed plan with sub-tasks\n * 2. Dispatches sub-tasks to worker agents (parallel via Fleet)\n * 3. Synthesizes the worker results into a final coherent answer\n *\n * Usage:\n * await \u03A9`build a complete authentication system for the project`\n * await \u03A9({ workers: 5 })`refactor the entire codebase`\n * await \u03A9.quiet`design and implement a CI/CD pipeline`\n *\n * This is the most sophisticated pattern \u2014 it combines planning,\n * parallel execution, and synthesis into a single tag.\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface OrchestratorOptions extends PatternOptions {\n /** Number of worker agents to dispatch. Default: 3 */\n workers?: number\n /** Maximum concurrency for worker execution. Default: 3 */\n concurrency?: number\n}\n\nconst defaults: OrchestratorOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n workers: 3,\n concurrency: 3,\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class OrchestratorWorkerResult {\n constructor(\n /** The worker's assigned task */\n public readonly task: string,\n /** The worker's output */\n public readonly output: string,\n /** Whether the worker succeeded */\n public readonly success: boolean\n ) {}\n}\n\nexport class OrchestratorOutput extends PatternOutput {\n constructor(\n text: string,\n /** The original plan */\n public readonly plan: string,\n /** The synthesized final output */\n public readonly synthesis: string,\n /** Individual worker results */\n public readonly workerResults: OrchestratorWorkerResult[],\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Prompts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst PLANNER_SYSTEM = `You are a senior architect and project planner. Given a high-level request, create a detailed execution plan.\n\nOutput in this exact format:\n\nPLAN SUMMARY:\n(one paragraph summarizing the approach)\n\nSUB-TASKS:\n1. (specific, actionable sub-task)\n2. (specific, actionable sub-task)\n3. (specific, actionable sub-task)\n\nEach sub-task must be self-contained and independently executable.\nGenerate exactly {$workerCount} sub-tasks (adjust to the requested worker count).\nFocus on concrete actions, not abstractions.`\n\nconst WORKER_SYSTEM = `You are a task specialist. Complete your assigned sub-task thoroughly and concisely. Output your findings, code, or analysis directly \u2014 no meta-commentary.`\n\nconst SYNTHESIS_SYSTEM = `You are a delivery manager. Synthesize the worker results into a final, coherent deliverable that fulfills the original request. Combine, reconcile, and structure the outputs. Address any gaps or conflicts.`\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: OrchestratorOptions\n): Promise<OrchestratorOutput> {\n const request = build(pieces, args)\n const t0 = Date.now()\n const workerCount = opts.workers ?? 3\n\n // Planner model for plan/synthesize, worker model for worker execution\n const plannerModel = opts.plannerModel ?? opts.model\n const workerModel = opts.workerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(\n `\u03A9: Orchestrator \u2014 \"${request.slice(0, 80)}${request.length > 80 ? '...' : ''}\"\\n`\n )\n }\n\n // 1. Plan (planner model \u2014 high-level orchestration)\n if (!opts.quiet) process.stderr.write(' \u2192 Planning...\\n')\n const planText = await ask(request, {\n model: plannerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: 'high' as ThinkingLevel,\n system: PLANNER_SYSTEM.replace('{$workerCount}', String(workerCount)),\n })\n\n // Extract sub-tasks from the plan\n const subTasks: string[] = []\n const taskLines = planText.split('\\n')\n let inTasks = false\n for (const line of taskLines) {\n if (line.match(/^SUB-TASKS:/i)) {\n inTasks = true\n continue\n }\n if (inTasks && line.match(/^\\d+[.)]\\s/)) {\n subTasks.push(line.replace(/^\\d+[.)]\\s+/, '').trim())\n }\n }\n\n // If parsing failed, fall back to asking for just the tasks\n const tasks = subTasks.length > 0 ? subTasks.slice(0, workerCount) : [request]\n\n if (!opts.quiet) {\n process.stderr.write(` \u2192 ${tasks.length} sub-task(s) identified\\n`)\n for (let i = 0; i < tasks.length; i++) {\n const t = tasks[i]\n process.stderr.write(` [${i + 1}] ${t.slice(0, 60)}${t.length > 60 ? '...' : ''}\\n`)\n }\n }\n\n // 2. Dispatch (parallel execution with concurrency limit)\n const workerResults: OrchestratorWorkerResult[] = []\n const concurrency = opts.concurrency ?? 3\n\n for (let i = 0; i < tasks.length; i += concurrency) {\n const batch = tasks.slice(i, i + concurrency)\n const batchResults = await Promise.allSettled(\n batch.map((task) =>\n ask(task, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: WORKER_SYSTEM,\n })\n .then((text) => new OrchestratorWorkerResult(task, text, true))\n .catch((err) => new OrchestratorWorkerResult(task, String(err), false))\n )\n )\n batchResults.forEach((r) => {\n if (r.status === 'fulfilled') workerResults.push(r.value)\n })\n }\n\n // 3. Synthesize (planner model \u2014 high-level synthesis)\n if (!opts.quiet) process.stderr.write(' \u2192 Synthesizing results...\\n')\n\n const workerTexts = workerResults\n .map((wr, i) => `Task ${i + 1}: ${wr.task}\\nResult: ${wr.output}`)\n .join('\\n\\n')\n\n const synthesis = await ask(\n `Original request:\\n${request}\\n\\nPlan:\\n${planText}\\n\\nWorker results:\\n${workerTexts}\\n\\nSynthesize a final deliverable.`,\n {\n model: plannerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: 'high' as ThinkingLevel,\n system: SYNTHESIS_SYSTEM,\n }\n )\n\n const t1 = Date.now()\n\n const summary = `Plan:\\n${planText}\\n\\nWorkers: ${workerResults.filter((w) => w.success).length}/${workerResults.length} succeeded\\n\\nSynthesis:\\n${synthesis}`\n\n return new OrchestratorOutput(summary, planText, synthesis, workerResults, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface OrchestratorFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<OrchestratorOutput>\n (opts: Partial<OrchestratorOptions>): OrchestratorFn\n quiet: OrchestratorFn\n}\n\nfunction makeOrchestrator(opts: Partial<OrchestratorOptions> = {}): OrchestratorFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<OrchestratorOptions>,\n ...args: unknown[]\n ): PatternPromise<OrchestratorOutput> | OrchestratorFn => {\n if (!Array.isArray(pieces)) {\n return makeOrchestrator({ ...merged, ...(pieces as Partial<OrchestratorOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as OrchestratorFn\n\n let _quiet: OrchestratorFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): OrchestratorFn {\n if (!_quiet) _quiet = makeOrchestrator({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u03A9 tag \u2014 Orchestrator: plan \u2192 dispatch \u2192 synthesize */\nexport const \u03A9: OrchestratorFn = makeOrchestrator()\n", "/**\n * \u039B (Lambda) \u2014 Pipeline: sequential agent chain\n *\n * Each stage receives the output of the previous stage as input.\n * Like Unix pipes but for AI agent processing.\n *\n * Usage:\n * await \u039B`generate a summary \u2192 translate to French \u2192 simplify for beginners`\n * // Stages are separated by \"\u2192\" or \"->\" or \"|\"\n *\n * await \u039B({ stages: ['analyze', 'generate', 'review'] })`write API docs`\n * // Explicit stage names\n *\n * await \u039B({ stagePrompts: [\n * 'Analyze the code and identify key functions',\n * 'Generate documentation based on this analysis',\n * 'Review the documentation for accuracy'\n * ] })`document the auth module`\n * // Full control over each stage's prompt\n *\n * await \u039B.quiet`extract errors \u2192 suggest fixes \u2192 generate patch`\n *\n * Each stage runs sequentially, with the previous output prepended as context.\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface PipelineOptions extends PatternOptions {\n /** Explicit stage names (auto-generated if not provided) */\n stages?: string[]\n /** Custom prompt for each stage (overrides auto-generated prompts) */\n stagePrompts?: string[]\n /** Separator used to parse stages from template. Default: \"\u2192\" or \"->\" */\n separator?: string\n}\n\nconst defaults: PipelineOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class PipelineStageResult {\n constructor(\n /** Stage name/number */\n public readonly stage: string,\n /** Output after this stage */\n public readonly output: string,\n /** 0-based stage index */\n public readonly index: number\n ) {}\n}\n\nexport class PipelineOutput extends PatternOutput {\n constructor(\n text: string,\n /** Final output after all stages */\n public readonly finalOutput: string,\n /** Results from each stage */\n public readonly stages: PipelineStageResult[],\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Stage parsing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction parseStages(template: string, explicitStages?: string[], separator?: string): string[] {\n if (explicitStages && explicitStages.length > 0) return explicitStages\n\n const sep = separator ?? '\u2192'\n const altSep = sep === '\u2192' ? '->' : sep\n\n // Try splitting by separator\n const bySep = template\n .split(sep)\n .flatMap((s) => s.split(altSep))\n .map((s) => s.trim())\n .filter(Boolean)\n\n if (bySep.length > 1) return bySep\n\n // Try splitting by pipe\n const byPipe = template\n .split('|')\n .map((s) => s.trim())\n .filter(Boolean)\n if (byPipe.length > 1) return byPipe\n\n // Try splitting by newline\n const byLine = template\n .split('\\n')\n .map((s) =>\n s\n .trim()\n .replace(/^\\d+[.)]\\s*/, '')\n .replace(/^[-*]\\s*/, '')\n )\n .filter(Boolean)\n if (byLine.length > 1) return byLine\n\n // Single stage\n return [template]\n}\n\n// \u2500\u2500 Generate stage prompts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction generateStagePrompt(stage: string, previousOutput: string, isFirst: boolean): string {\n if (isFirst) {\n return `Task: ${stage}\\n\\nExecute the task above.`\n }\n return `Previous stage output:\\n${previousOutput}\\n\\nCurrent stage: ${stage}\\n\\nProcess the previous output according to the current stage's instructions.`\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: PipelineOptions\n): Promise<PipelineOutput> {\n const template = build(pieces, args)\n const stages = parseStages(template, opts.stages, opts.separator)\n const t0 = Date.now()\n\n // Pipeline is sequential execution \u2014 all stages use worker model\n const workerModel = opts.workerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(`\u039B: Pipeline \u2014 ${stages.length} stage(s)\\n`)\n for (let i = 0; i < stages.length; i++) {\n process.stderr.write(` [${i + 1}] ${stages[i]}\\n`)\n }\n }\n\n const stageResults: PipelineStageResult[] = []\n let currentInput = ''\n\n for (let i = 0; i < stages.length; i++) {\n const stage = stages[i]\n const customPrompt = opts.stagePrompts?.[i]\n\n if (!opts.quiet)\n process.stderr.write(` \u2192 Stage ${i + 1}/${stages.length}: ${stage.slice(0, 50)}...\\n`)\n\n const prompt = customPrompt ?? generateStagePrompt(stage, currentInput, i === 0)\n const systemMessage =\n i === 0\n ? `You are a specialist executing stage ${i + 1}: ${stage}. Focus only on this stage's output.`\n : `You are a specialist executing stage ${i + 1}: ${stage}. Process the previous stage's output according to your instructions. Maintain all important information from previous stages.`\n\n const output = await ask(prompt, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: systemMessage,\n })\n\n stageResults.push(new PipelineStageResult(stage, output, i))\n currentInput = output\n }\n\n const t1 = Date.now()\n const finalOutput = currentInput\n\n const summary = stageResults\n .map(\n (sr) =>\n `Stage ${sr.index + 1} (${sr.stage}):\\n${sr.output.slice(0, 200)}${sr.output.length > 200 ? '...' : ''}`\n )\n .join('\\n\\n')\n\n return new PipelineOutput(summary, finalOutput, stageResults, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface PipelineFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<PipelineOutput>\n (opts: Partial<PipelineOptions>): PipelineFn\n quiet: PipelineFn\n}\n\nfunction makePipeline(opts: Partial<PipelineOptions> = {}): PipelineFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<PipelineOptions>,\n ...args: unknown[]\n ): PatternPromise<PipelineOutput> | PipelineFn => {\n if (!Array.isArray(pieces)) {\n return makePipeline({ ...merged, ...(pieces as Partial<PipelineOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as PipelineFn\n\n let _quiet: PipelineFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): PipelineFn {\n if (!_quiet) _quiet = makePipeline({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u039B tag \u2014 Pipeline: sequential agent chain */\nexport const \u039B: PipelineFn = makePipeline()\n", "/**\n * \u03A1 (Rho) \u2014 Ralph Loop: Read\u2013Analyze\u2013Logic\u2013Patch\u2013Harden\n *\n * An iterative self-correcting loop:\n * 1. \u03C0 analyzes the current state\n * 2. \u03C0 generates a plan\n * 3. \u03A0 executes the plan with tools\n * 4. \u03C0 reviews the result\n * 5. Loop or exit based on quality criteria\n *\n * Usage:\n * await \u03A1`improve error handling in src/`\n * await \u03A1({ maxIterations: 3 })`refactor the auth module`\n * await \u03A1.quiet`fix all lint issues`\n *\n * The template string is the overall goal. The loop drives toward it.\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { createAgentSession } from '@earendil-works/pi-coding-agent'\nimport {\n ask,\n build,\n type PatternOptions,\n PatternOutput,\n PatternPromise,\n pickModel,\n} from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface RalphOptions extends PatternOptions {\n /** Maximum iterations before stopping. Default: 5 */\n maxIterations?: number\n /** Whether the plan phase should use tools to read the codebase. Default: true */\n useTools?: boolean\n /** Maximum agent turns per execution phase. Default: 10 */\n maxAgentTurns?: number\n}\n\nconst defaults: RalphOptions = {\n maxIterations: 5,\n useTools: true,\n maxAgentTurns: 10,\n thinkingLevel: 'medium' as ThinkingLevel,\n maxTokens: 4096,\n}\n\n// \u2500\u2500 Output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class RalphOutput extends PatternOutput {\n constructor(\n text: string,\n /** Number of iterations actually executed */\n public readonly iterationCount: number,\n /** Whether the loop met quality threshold or hit max iterations */\n public readonly completed: boolean,\n /** Per-iteration summaries */\n public readonly iterations: RalphIterationSummary[],\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\nexport interface RalphIterationSummary {\n iteration: number\n plan: string\n result: string\n review: string\n shouldContinue: boolean\n}\n\n// \u2500\u2500 Agent session helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function executeWithTools(goal: string, opts: RalphOptions): Promise<string> {\n // Look up the model if specified so the agent session uses it\n const agentModel = opts.model ? pickModel(opts.model) : undefined\n if (opts.model && !agentModel) {\n throw new Error(\n `pizx/\u03A1: model not found: \"${opts.model}\". Run \\`pi models\\` to see available models.`\n )\n }\n const { session } = await createAgentSession({\n tools: ['read', 'bash', 'edit', 'write', 'grep', 'ls'],\n ...(agentModel ? { model: agentModel } : {}),\n })\n try {\n await session.sendUserMessage(goal)\n // Extract the last assistant message text\n const msgs = (session as any).messages ?? []\n for (let i = msgs.length - 1; i >= 0; i--) {\n if (msgs[i].role === 'assistant') {\n const c = msgs[i].content\n if (typeof c === 'string') return c.trim()\n if (Array.isArray(c)) {\n const texts = c\n .filter(\n (x: { type?: string; text?: string }) =>\n x.type === 'text' && typeof x.text === 'string'\n )\n .map((x: { text: string }) => x.text)\n if (texts.length > 0) return texts.join('').trim()\n }\n }\n }\n return '(no assistant response)'\n } finally {\n session.dispose()\n }\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ANALYSIS_SYSTEM = `You are a senior engineer. Analyze the current state and identify what needs to change to achieve the goal. Be specific \u2014 name files and code patterns. Keep it under 200 words.`\n\nconst PLAN_SYSTEM = `You are a precise coding architect. Generate a minimal, actionable implementation plan with specific file paths and changes. Keep it under 250 words.`\n\nconst REVIEW_SYSTEM = `You are a quality assurance reviewer. Review the changes that were just made. Determine:\n1. Was the plan fully implemented? Answer \"FULLY\" or \"PARTIALLY\"\n2. Are there any issues? (1 sentence)\n3. Should we iterate again? Answer \"ITERATE\" or \"DONE\"\n\nYour final line MUST be either \"FINAL: ITERATE\" or \"FINAL: DONE\".`\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: RalphOptions\n): Promise<RalphOutput> {\n const goal = build(pieces, args)\n const t0 = Date.now()\n const iterations: RalphIterationSummary[] = []\n\n // Resolve per-phase models: plannerModel > model > Pi default\n const plannerModel = opts.plannerModel ?? opts.model\n const workerModel = opts.workerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(`\u03A1: Ralph Loop \u2014 \"${goal.slice(0, 80)}${goal.length > 80 ? '...' : ''}\"\\n`)\n }\n\n let currentGoal = goal\n let iteration = 1\n\n while (iteration <= (opts.maxIterations ?? 5)) {\n if (!opts.quiet) {\n process.stderr.write(`\u03A1: Iteration ${iteration}/${opts.maxIterations}\\n`)\n }\n\n // 1. Analyze (planner model \u2014 high-level reasoning)\n if (!opts.quiet) process.stderr.write(' \u2192 Analyzing...\\n')\n const analysis = await ask(currentGoal, {\n model: plannerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: ANALYSIS_SYSTEM,\n })\n\n // 2. Plan (planner model \u2014 high-level reasoning)\n if (!opts.quiet) process.stderr.write(' \u2192 Planning...\\n')\n const plan = await ask(\n `Goal: ${currentGoal}\\n\\nAnalysis: ${analysis}\\n\\nGenerate an implementation plan.`,\n {\n model: plannerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: PLAN_SYSTEM,\n }\n )\n\n // 3. Execute (worker model \u2014 lower-level execution)\n if (!opts.quiet) process.stderr.write(' \u2192 Executing...\\n')\n const result = opts.useTools\n ? await executeWithTools(`Implement this plan:\\n${plan}\\n\\nGoal: ${currentGoal}`, {\n ...opts,\n model: workerModel,\n })\n : await ask(`Implement this plan:\\n${plan}\\n\\nGoal: ${currentGoal}`, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n })\n\n // 4. Review (planner model \u2014 high-level quality check)\n if (!opts.quiet) process.stderr.write(' \u2192 Reviewing...\\n')\n const review = await ask(`Plan:\\n${plan}\\n\\nResult:\\n${result}\\n\\nReview the implementation.`, {\n model: plannerModel,\n maxTokens: 1024,\n thinkingLevel: 'high' as ThinkingLevel,\n system: REVIEW_SYSTEM,\n })\n\n const shouldContinue = review.includes('ITERATE') && !review.includes('DONE')\n\n iterations.push({\n iteration,\n plan,\n result,\n review,\n shouldContinue,\n })\n\n if (!shouldContinue) {\n if (!opts.quiet)\n process.stderr.write(`\u03A1: Quality threshold reached after ${iteration} iteration(s)\\n`)\n break\n }\n\n // Set up next iteration with review feedback\n currentGoal = `Continue improving. Previous plan: ${plan}\\nReview feedback: ${review}\\nOriginal goal: ${goal}`\n iteration++\n }\n\n const t1 = Date.now()\n const summary = iterations\n .map(\n (i) =>\n `Iteration ${i.iteration}:\\n Plan: ${i.plan.slice(0, 100)}...\\n Review: ${i.review.slice(0, 100)}...`\n )\n .join('\\n')\n\n return new RalphOutput(\n summary,\n iterations.length,\n iteration <= (opts.maxIterations ?? 5),\n iterations,\n t0,\n t1\n )\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface RalphFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<RalphOutput>\n (opts: Partial<RalphOptions>): RalphFn\n quiet: RalphFn\n}\n\nfunction makeRalph(opts: Partial<RalphOptions> = {}): RalphFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<RalphOptions>,\n ...args: unknown[]\n ): PatternPromise<RalphOutput> | RalphFn => {\n if (!Array.isArray(pieces)) {\n return makeRalph({ ...merged, ...(pieces as Partial<RalphOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as RalphFn\n\n let _quiet: RalphFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): RalphFn {\n if (!_quiet) _quiet = makeRalph({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u03A1 tag \u2014 Ralph Loop: iterative self-correcting loop */\nexport const \u03A1: RalphFn = makeRalph()\n", "/**\n * \u03A3 (Sigma) \u2014 Subagents: hierarchical task delegation\n *\n * A main orchestrator agent decomposes a complex task into sub-tasks,\n * delegates each to a sub-agent, then synthesizes the results.\n *\n * Usage:\n * await \u03A3`analyze the full codebase for security vulnerabilities`\n * // Auto-decomposes into sub-domains (auth, data, network, etc.)\n *\n * await \u03A3({ subdomains: ['auth', 'database', 'frontend'] })`review each area`\n * // Explicit sub-domains\n *\n * await \u03A3.quiet`generate API documentation for all endpoints`\n *\n * Flow:\n * 1. Planner decomposes the main task into sub-tasks\n * 2. Each sub-task runs in parallel (like Fleet)\n * 3. Synthesizer combines sub-results into final answer\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface SubagentOptions extends PatternOptions {\n /** Explicit sub-domains or sub-tasks to delegate. When empty, auto-decomposes. */\n subdomains?: string[]\n /** Maximum number of auto-generated sub-tasks. Default: 4 */\n maxSubTasks?: number\n /** Maximum concurrency for sub-agent execution. Default: 4 */\n concurrency?: number\n}\n\nconst defaults: SubagentOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n maxSubTasks: 4,\n concurrency: 4,\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class SubagentResult {\n constructor(\n /** The sub-task description */\n public readonly subTask: string,\n /** The sub-agent's response */\n public readonly text: string,\n /** Whether this sub-task succeeded */\n public readonly success: boolean\n ) {}\n}\n\nexport class SubagentOutput extends PatternOutput {\n constructor(\n text: string,\n /** The synthesized final answer */\n public readonly synthesis: string,\n /** Individual sub-agent results */\n public readonly subResults: SubagentResult[],\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst DECOMPOSE_SYSTEM = `You are a task decomposition specialist. Break down complex tasks into independent sub-tasks that can be worked on in parallel. Output ONLY a JSON array of strings, each being a self-contained sub-task description. No markdown, no explanation.`\n\nconst SYNTHESIS_SYSTEM = `You are a synthesis specialist. Combine the results from multiple sub-agent analyses into a coherent, comprehensive answer. Identify patterns, conflicts, and gaps.`\n\nasync function decomposeTask(task: string, opts: SubagentOptions): Promise<string[]> {\n if (opts.subdomains && opts.subdomains.length > 0) return opts.subdomains\n\n const result = await ask(\n `Decompose this task into ${opts.maxSubTasks ?? 4} independent sub-tasks that can be worked on in parallel:\\n\\n${task}\\n\\nOutput a JSON array of strings.`,\n {\n model: opts.model,\n maxTokens: 1024,\n thinkingLevel: 'medium' as ThinkingLevel,\n system: DECOMPOSE_SYSTEM,\n }\n )\n\n try {\n // Extract JSON array from the result\n const jsonMatch = result.match(/\\[[\\s\\S]*\\]/)\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0])\n if (Array.isArray(parsed) && parsed.length > 0) {\n return parsed.map(String).slice(0, opts.maxSubTasks ?? 4)\n }\n }\n } catch {\n // Fall back to line-based parsing\n }\n\n // Fallback: split by lines\n return result\n .split('\\n')\n .map((l) =>\n l\n .replace(/^\\d+[.)]\\s*/, '')\n .replace(/^[-*]\\s*/, '')\n .trim()\n )\n .filter(Boolean)\n .slice(0, opts.maxSubTasks ?? 4)\n}\n\nconst SUBAGENT_SYSTEM = `You are a domain specialist. Complete your assigned sub-task thoroughly. Output your findings clearly and concisely.`\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: SubagentOptions\n): Promise<SubagentOutput> {\n const task = build(pieces, args)\n const t0 = Date.now()\n\n // Planner model for decompose/synthesize, worker model for sub-agents\n const plannerModel = opts.plannerModel ?? opts.model\n const workerModel = opts.workerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(\n `\u03A3: Subagent delegation \u2014 \"${task.slice(0, 80)}${task.length > 80 ? '...' : ''}\"\\n`\n )\n }\n\n // 1. Decompose (planner model \u2014 high-level planning)\n if (!opts.quiet) process.stderr.write(' \u2192 Decomposing task into sub-tasks...\\n')\n const subTasks = await decomposeTask(task, { ...opts, model: plannerModel })\n\n if (!opts.quiet) {\n process.stderr.write(` \u2192 ${subTasks.length} sub-task(s) identified:\\n`)\n for (let i = 0; i < subTasks.length; i++) {\n const st = subTasks[i]\n process.stderr.write(` [${i + 1}] ${st.slice(0, 60)}${st.length > 60 ? '...' : ''}\\n`)\n }\n }\n\n // 2. Execute sub-tasks in parallel (with concurrency limit)\n const subResults: SubagentResult[] = []\n const concurrency = opts.concurrency ?? 4\n\n for (let i = 0; i < subTasks.length; i += concurrency) {\n const batch = subTasks.slice(i, i + concurrency)\n const batchResults = await Promise.allSettled(\n batch.map((st) =>\n ask(st, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: SUBAGENT_SYSTEM,\n })\n .then((text) => new SubagentResult(st, text, true))\n .catch((err) => new SubagentResult(st, String(err), false))\n )\n )\n batchResults.forEach((r) => {\n if (r.status === 'fulfilled') subResults.push(r.value)\n })\n }\n\n // 3. Synthesize (planner model \u2014 high-level synthesis)\n if (!opts.quiet) process.stderr.write(' \u2192 Synthesizing results...\\n')\n const subResultsText = subResults\n .map((sr, i) => `Sub-task ${i + 1}: ${sr.subTask}\\nResult: ${sr.text}`)\n .join('\\n\\n')\n\n const synthesis = await ask(\n `Original task:\\n${task}\\n\\nSub-task results:\\n${subResultsText}\\n\\nSynthesize a comprehensive answer.`,\n {\n model: plannerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: SYNTHESIS_SYSTEM,\n }\n )\n\n const t1 = Date.now()\n\n return new SubagentOutput(synthesis, synthesis, subResults, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface SubagentFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<SubagentOutput>\n (opts: Partial<SubagentOptions>): SubagentFn\n quiet: SubagentFn\n}\n\nfunction makeSubagent(opts: Partial<SubagentOptions> = {}): SubagentFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<SubagentOptions>,\n ...args: unknown[]\n ): PatternPromise<SubagentOutput> | SubagentFn => {\n if (!Array.isArray(pieces)) {\n return makeSubagent({ ...merged, ...(pieces as Partial<SubagentOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as SubagentFn\n\n let _quiet: SubagentFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): SubagentFn {\n if (!_quiet) _quiet = makeSubagent({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u03A3 tag \u2014 Subagents: hierarchical task delegation */\nexport const \u03A3: SubagentFn = makeSubagent()\n", "/**\n * \u03A4 (Tau) \u2014 Tool-Mediated Orchestration: shared structured key-value store\n *\n * Agents coordinate through a shared structured context (key-value store)\n * with explicit CRUD-like operations. No agent-to-agent messaging \u2014 all\n * coordination happens through reads and writes to the shared store.\n *\n * Usage:\n * await \u03A4`research the competitive landscape for this product`\n * await \u03A4({ agents: 5, rounds: 2 })`audit the codebase for security issues`\n * await \u03A4.quiet`gather requirements from multiple stakeholder perspectives`\n *\n * Flow:\n * 1. Planner defines the shared context schema (keys) and agent roles\n * 2. Round 1: agents write initial findings to their assigned keys (parallel)\n * 3. Round 2+: agents read current store and update/refine entries (parallel)\n * 4. Consolidator reads final store state and synthesizes final answer\n *\n * Pattern: Tool-Mediated Orchestration (Pattern #5)\n * Communication: Tool-Mediated (via shared structured context)\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface TauOptions extends PatternOptions {\n /** Number of worker agents. Default: 3 */\n agents?: number\n /** Number of read/write rounds. Default: 1 */\n rounds?: number\n /** Custom agent roles. Auto-generated if not provided. */\n roles?: string[]\n}\n\nconst defaults: TauOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n agents: 3,\n rounds: 1,\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class ToolMediatedEntry {\n constructor(\n /** Agent role name */\n public readonly agent: string,\n /** Round number */\n public readonly round: number,\n /** Operation: initial write or refinement update */\n public readonly operation: 'write' | 'update',\n /** Key name in the shared store */\n public readonly key: string,\n /** Content written to the key */\n public readonly content: string\n ) {}\n}\n\nexport class TauOutput extends PatternOutput {\n constructor(\n text: string,\n /** All read/write operations across all rounds */\n public readonly entries: ToolMediatedEntry[],\n /** Final key-value store state */\n public readonly finalState: Record<string, string>,\n /** Consolidated synthesis */\n public readonly synthesis: string,\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Prompts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst SCHEMA_SYSTEM = `You are a coordination architect. Given a task, design a shared structured context for agent collaboration.\n\nOutput format exactly:\nKEYS: key1, key2, key3, key4\n\nAGENT 1:\nROLE: (one-word role name)\nASSIGNED_KEYS: key1, key2\n\nAGENT 2:\nROLE: (one-word role name)\nASSIGNED_KEYS: key3\n\nDefine exactly {agentCount} agents with distinct roles. Each agent is assigned 1-2 keys.\nKeys should be named categories relevant to the task (e.g., \"Market_Size\", \"Competitors\", \"Risks\").`\n\nconst WRITE_SYSTEM = (role: string, keys: string) =>\n `You are a ${role}. Write your initial findings to your assigned keys in the shared context.\n\nSHARED CONTEXT (current state \u2014 may be empty):\n{store}\n\nYour assigned keys: ${keys}\n\nWrite initial, thorough findings to each of your keys. Output ONLY in this format:\n\nKEY: key_name\nVALUE: your findings for this key\n\nKEY: key_name\nVALUE: your findings for this key`\n\nconst UPDATE_SYSTEM = (role: string, keys: string) =>\n `You are a ${role}. Review the current shared context and refine/update your entries.\n\nSHARED CONTEXT (current state from all agents):\n{store}\n\nYour assigned keys: ${keys}\n\nReview what other agents wrote. Update your entries to:\n- Fill gaps others haven't covered\n- Add depth and specific details\n- Challenge or validate others' findings where relevant\n- Avoid repeating what's already well-covered\n\nOutput ONLY in this format:\n\nKEY: key_name\nVALUE: your updated findings for this key`\n\nconst CONSOLIDATE_SYSTEM = `You are a research director. Consolidate the structured findings from all specialists into a comprehensive, well-organized synthesis. Combine overlapping insights, resolve contradictions, and prioritize the most impactful findings. Structure your output clearly.`\n\n// \u2500\u2500 Phase 1: Define schema \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function defineSchema(\n task: string,\n opts: TauOptions\n): Promise<{ keys: string[]; roles: string[]; assignments: Map<string, string[]> }> {\n const agentCount = opts.agents ?? 3\n\n const prompt = SCHEMA_SYSTEM.replace('{agentCount}', String(agentCount))\n\n const response = await ask(`Task: ${task}\\n\\n${prompt}`, {\n model: opts.plannerModel ?? opts.model,\n maxTokens: 1024,\n thinkingLevel: 'high' as ThinkingLevel,\n })\n\n // Parse keys\n const keysMatch = response.match(/KEYS\\s*:\\s*(.+)/i)\n const keys = keysMatch?.[1]\n ?.split(',')\n .map((k) => k.trim())\n .filter(Boolean) ?? ['Findings', 'Risks', 'Recommendations']\n\n // Parse agents and their assigned keys\n const agentRegex = /AGENT\\s+\\d+\\s*:\\s*\\nROLE\\s*:\\s*(.+?)\\nASSIGNED_KEYS\\s*:\\s*(.+?)(?:\\n|$)/gi\n const roles: string[] = []\n const assignments = new Map<string, string[]>()\n\n let match: RegExpExecArray | null\n // biome-ignore lint/suspicious/noAssignInExpressions: regex exec pattern\n while ((match = agentRegex.exec(response)) !== null) {\n const role = match[1].trim()\n const agentKeys = match[2]\n .split(',')\n .map((k) => k.trim())\n .filter(Boolean)\n roles.push(role)\n assignments.set(role, agentKeys.length > 0 ? agentKeys : [keys[0] ?? 'General'])\n }\n\n // Fallback: if parsing failed, create generic roles\n if (roles.length === 0) {\n for (let i = 0; i < agentCount; i++) {\n const role = `Specialist ${i + 1}`\n roles.push(role)\n const assignedKey = keys[i % keys.length] ?? `Key_${i + 1}`\n assignments.set(role, [assignedKey])\n }\n }\n\n return { keys, roles: roles.slice(0, agentCount), assignments }\n}\n\n// \u2500\u2500 Phase 2\u20133: Agent execution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction formatStore(store: Record<string, string>): string {\n const entries = Object.entries(store).filter(([, v]) => v)\n if (entries.length === 0) return '(empty \u2014 you are the first contributor)'\n return entries.map(([k, v]) => `[${k}]: ${v}`).join('\\n\\n')\n}\n\nfunction mergeEntry(store: Record<string, string>, key: string, content: string): void {\n if (store[key]) {\n store[key] += `\\n\\n${content}`\n } else {\n store[key] = content\n }\n}\n\nasync function executeRound(\n roles: string[],\n assignments: Map<string, string[]>,\n store: Record<string, string>,\n round: number,\n opts: TauOptions\n): Promise<{ entries: ToolMediatedEntry[]; store: Record<string, string> }> {\n const workerModel = opts.workerModel ?? opts.model\n const isWrite = round === 1\n const operation: 'write' | 'update' = isWrite ? 'write' : 'update'\n\n const roundResults = await Promise.allSettled(\n roles.map(async (role) => {\n const assignedKeys = assignments.get(role) ?? ['General']\n const keysStr = assignedKeys.join(', ')\n const storeText = formatStore(store)\n\n const systemPrompt = isWrite\n ? WRITE_SYSTEM(role, keysStr).replace('{store}', storeText)\n : UPDATE_SYSTEM(role, keysStr).replace('{store}', storeText)\n\n const task = isWrite\n ? `Write your initial findings to your assigned keys: ${keysStr}`\n : `Review the shared context and update your entries for keys: ${keysStr}`\n\n const response = await ask(task, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n system: systemPrompt,\n })\n\n return { role, response }\n })\n )\n\n const entries: ToolMediatedEntry[] = []\n const newStore = { ...store }\n\n for (const r of roundResults) {\n if (r.status !== 'fulfilled') continue\n const { role, response } = r.value\n\n // Parse KEY: ... VALUE: ... pairs\n const kvRegex = /KEY\\s*:\\s*(.+?)\\nVALUE\\s*:\\s*([\\s\\S]*?)(?=\\nKEY\\s*:|\\n*$)/gi\n let kvMatch: RegExpExecArray | null\n let found = false\n\n // biome-ignore lint/suspicious/noAssignInExpressions: regex exec pattern\n while ((kvMatch = kvRegex.exec(response)) !== null) {\n const key = kvMatch[1].trim()\n const value = kvMatch[2].trim()\n entries.push(new ToolMediatedEntry(role, round, operation, key, value))\n mergeEntry(newStore, key, value)\n found = true\n }\n\n // Fallback: if no KEY/VALUE pairs found, write entire response to first assigned key\n if (!found) {\n const fallbackKey = assignments.get(role)?.[0] ?? 'General'\n const content = response.trim()\n entries.push(new ToolMediatedEntry(role, round, operation, fallbackKey, content))\n mergeEntry(newStore, fallbackKey, content)\n }\n }\n\n return { entries, store: newStore }\n}\n\n// \u2500\u2500 Phase 4: Consolidate \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function consolidateStore(\n task: string,\n store: Record<string, string>,\n opts: TauOptions\n): Promise<string> {\n const storeText = formatStore(store)\n\n return ask(\n `Original task: ${task}\\n\\nStructured findings from all specialists:\\n\\n${storeText}\\n\\nConsolidate into a comprehensive, well-structured synthesis.`,\n {\n model: opts.plannerModel ?? opts.model,\n maxTokens: opts.maxTokens,\n thinkingLevel: 'high' as ThinkingLevel,\n system: CONSOLIDATE_SYSTEM,\n }\n )\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: TauOptions\n): Promise<TauOutput> {\n const task = build(pieces, args)\n const t0 = Date.now()\n const totalRounds = opts.rounds ?? 1\n\n const plannerModel = opts.plannerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(\n `\u03A4: Tool-Mediated Orchestration \u2014 \"${task.slice(0, 80)}${task.length > 80 ? '...' : ''}\"\\n`\n )\n }\n\n // Phase 1: Define schema\n if (!opts.quiet) process.stderr.write(' \u2192 Defining shared context schema...\\n')\n const { keys, roles, assignments } = await defineSchema(task, { ...opts, plannerModel })\n\n if (!opts.quiet) {\n process.stderr.write(` \u2192 Schema: ${keys.join(', ')}\\n`)\n process.stderr.write(` \u2192 ${roles.length} agent(s): ${roles.join(', ')}\\n`)\n for (const [role, assignedKeys] of assignments) {\n process.stderr.write(` ${role} \u2192 ${assignedKeys.join(', ')}\\n`)\n }\n }\n\n // Phases 2\u20133: Execute rounds\n const allEntries: ToolMediatedEntry[] = []\n let store: Record<string, string> = {}\n\n for (let round = 1; round <= totalRounds; round++) {\n const label = round === 1 ? 'Writing' : 'Updating'\n if (!opts.quiet) process.stderr.write(` \u2192 Round ${round}/${totalRounds}: ${label}...\\n`)\n\n const { entries, store: updatedStore } = await executeRound(\n roles,\n assignments,\n store,\n round,\n opts\n )\n allEntries.push(...entries)\n store = updatedStore\n }\n\n // Phase 4: Consolidate\n if (!opts.quiet) process.stderr.write(' \u2192 Consolidating store...\\n')\n const synthesis = await consolidateStore(task, store, { ...opts, plannerModel })\n\n const t1 = Date.now()\n\n const summary = [\n `Schema keys: ${keys.join(', ')}`,\n `Agents: ${roles.join(', ')}`,\n `Rounds: ${totalRounds}`,\n `Entries: ${allEntries.length}`,\n `Synthesis: ${synthesis}`,\n ].join('\\n\\n')\n\n return new TauOutput(summary, allEntries, store, synthesis, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface TauFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<TauOutput>\n (opts: Partial<TauOptions>): TauFn\n quiet: TauFn\n}\n\nfunction makeTau(opts: Partial<TauOptions> = {}): TauFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<TauOptions>,\n ...args: unknown[]\n ): PatternPromise<TauOutput> | TauFn => {\n if (!Array.isArray(pieces)) {\n return makeTau({ ...merged, ...(pieces as Partial<TauOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as TauFn\n\n let _quiet: TauFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): TauFn {\n if (!_quiet) _quiet = makeTau({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u03A4 tag \u2014 Tool-Mediated Orchestration: shared structured key-value store */\nexport const \u03A4: TauFn = makeTau()\n", "/**\n * \u0398 (Theta) \u2014 Thread: direct agent-to-agent conversation\n *\n * Two or more agents engage in a multi-turn conversation. Each agent\n * responds to the full thread so far, building on previous contributions.\n * After max turns, a synthesizer merges the thread into a final answer.\n *\n * Usage:\n * await \u0398`debate the best architecture for this project`\n * await \u0398({ agents: 3, turns: 4 })`evaluate this business decision`\n * await \u0398.quiet`find the optimal solution to this problem`\n *\n * Communication pattern: Direct (agent-to-agent message passing)\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { ask, build, type PatternOptions, PatternOutput, PatternPromise } from './types.ts'\n\n// \u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ThreadOptions extends PatternOptions {\n /** Number of agents in the conversation. Default: 3 */\n agents?: number\n /** Maximum conversation turns (each agent speaks once per turn). Default: 3 */\n turns?: number\n /** Custom agent roles. Auto-generated if not provided. */\n roles?: string[]\n}\n\nconst defaults: ThreadOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n agents: 3,\n turns: 3,\n}\n\nconst ROLE_SETS: Record<number, string[]> = {\n 2: ['Proposer \u2014 advocate the best approach', 'Critic \u2014 identify weaknesses and gaps'],\n 3: [\n 'Proposer \u2014 suggest the best approach',\n 'Critic \u2014 identify weaknesses, risks, and missing pieces',\n 'Synthesizer \u2014 combine the best ideas into a practical plan',\n ],\n 4: [\n 'Proposer \u2014 advocate a bold solution',\n 'Critic \u2014 identify risks and weaknesses',\n 'Pragmatist \u2014 focus on practical implementation',\n 'Innovator \u2014 propose creative alternatives',\n ],\n 5: [\n 'Proposer',\n 'Critic',\n 'Pragmatist',\n 'Innovator',\n \"Devil's Advocate \u2014 challenge every assumption\",\n ],\n}\n\n// \u2500\u2500 Outputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class ThreadMessage {\n constructor(\n public readonly role: string,\n public readonly turn: number,\n public readonly content: string\n ) {}\n}\n\nexport class ThreadOutput extends PatternOutput {\n constructor(\n text: string,\n public readonly conclusion: string,\n public readonly messages: ThreadMessage[],\n startTime: number,\n endTime: number\n ) {\n super(text, startTime, endTime)\n }\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst THREAD_PROMPT = `You are an agent with the role: {role}.\nEngage in a multi-agent conversation about the topic.\n\nThe conversation so far:\n{thread}\n\nRespond as your role. Be specific, build on or challenge what others have said.\nKeep your response under 200 words.`\n\nconst SYNTHESIS_SYSTEM = `You are a neutral facilitator. Synthesize the multi-agent conversation thread into a clear, actionable conclusion. Weigh the evidence, resolve conflicts, and present the best path forward.`\n\nfunction buildThreadPrompt(role: string, thread: string): string {\n return THREAD_PROMPT.replace('{role}', role).replace(\n '{thread}',\n thread || '(This is the first message in the thread.)'\n )\n}\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: ThreadOptions\n): Promise<ThreadOutput> {\n const topic = build(pieces, args)\n const t0 = Date.now()\n const agentCount = opts.agents ?? 3\n const maxTurns = opts.turns ?? 3\n const roles = opts.roles ?? ROLE_SETS[agentCount] ?? ROLE_SETS[3] ?? []\n\n const plannerModel = opts.plannerModel ?? opts.model\n const workerModel = opts.workerModel ?? opts.model\n\n if (!opts.quiet) {\n process.stderr.write(`\u0398: Thread \u2014 ${agentCount} agent(s), ${maxTurns} turn(s)\\n`)\n process.stderr.write(` Topic: \"${topic.slice(0, 80)}${topic.length > 80 ? '...' : ''}\"\\n`)\n }\n\n const messages: ThreadMessage[] = []\n let thread = `Topic: ${topic}\\n`\n\n // Run conversation turns\n for (let turn = 1; turn <= maxTurns; turn++) {\n if (!opts.quiet) process.stderr.write(` \u2192 Turn ${turn}/${maxTurns}\\n`)\n\n for (let a = 0; a < roles.length; a++) {\n const role = roles[a] ?? `Agent ${a + 1}`\n const prompt = buildThreadPrompt(role, thread)\n\n const response = await ask(prompt, {\n model: workerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: opts.thinkingLevel,\n })\n\n messages.push(new ThreadMessage(role, turn, response))\n thread += `\\n[${role}] (Turn ${turn}): ${response}\\n`\n }\n }\n\n // Synthesize conclusion (planner model)\n if (!opts.quiet) process.stderr.write(' \u2192 Synthesizing conclusion...\\n')\n\n const conclusion = await ask(\n `Topic: ${topic}\\n\\nConversation thread:\\n${thread}\\n\\nSynthesize a clear, actionable conclusion.`,\n {\n model: plannerModel,\n maxTokens: opts.maxTokens,\n thinkingLevel: 'high' as ThinkingLevel,\n system: SYNTHESIS_SYSTEM,\n }\n )\n\n const t1 = Date.now()\n\n const summary = messages\n .map(\n (m) =>\n `[${m.role}] Turn ${m.turn}: ${m.content.slice(0, 150)}${m.content.length > 150 ? '...' : ''}`\n )\n .join('\\n')\n\n return new ThreadOutput(summary, conclusion, messages, t0, t1)\n}\n\n// \u2500\u2500 Tag factory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface ThreadFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PatternPromise<ThreadOutput>\n (opts: Partial<ThreadOptions>): ThreadFn\n quiet: ThreadFn\n}\n\nfunction makeThread(opts: Partial<ThreadOptions> = {}): ThreadFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<ThreadOptions>,\n ...args: unknown[]\n ): PatternPromise<ThreadOutput> | ThreadFn => {\n if (!Array.isArray(pieces)) {\n return makeThread({ ...merged, ...(pieces as Partial<ThreadOptions>) })\n }\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as ThreadFn\n\n let _quiet: ThreadFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): ThreadFn {\n if (!_quiet) _quiet = makeThread({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u0398 tag \u2014 Thread: direct agent-to-agent conversation */\nexport const \u0398: ThreadFn = makeThread()\n", "/**\n * \u03C0 (small pi) \u2014 pi-ai text generation as a zx-style template tag.\n *\n * const answer = await \u03C0`what is 7! + 5?`\n * const answer = await \u03C0({ model: 'anthropic/claude-sonnet-4-5' })`explain`\n * const answer = await \u03C0.quiet()`generate JSON`\n * for await (const c of \u03C0.stream`tell me a story`) { process.stdout.write(c) }\n */\n\nimport {\n type Context,\n getEnvApiKey,\n getModels,\n getProviders,\n type Model,\n type SimpleStreamOptions,\n streamSimple,\n type ThinkingLevel,\n} from '@earendil-works/pi-ai'\nimport { PiOutput } from './pi-output.ts'\n\nexport { PiOutput }\n\nimport { isPiInstalled, loadPiSettings, type PiSettings } from './load-pi-settings.ts'\n\nexport interface PiOptions {\n model?: string\n thinkingLevel?: ThinkingLevel\n quiet?: boolean\n system?: string\n maxTokens?: number\n}\n\nconst defaults: PiOptions = {\n thinkingLevel: 'medium' as ThinkingLevel,\n quiet: false,\n maxTokens: 4096,\n}\n\n/** Cached Pi settings \u2014 loaded lazily on first use. */\nlet _piSettings: PiSettings | undefined\n\nfunction getPiDefaults(): PiSettings {\n if (_piSettings === undefined) {\n _piSettings = isPiInstalled() ? loadPiSettings() : {}\n }\n return _piSettings\n}\n\n/** Return all known models from the pi-ai static registry. */\nfunction allModels() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: Model<any>[] = []\n for (const p of getProviders()) {\n const ms = getModels(p)\n if (ms && ms.length > 0) result.push(...ms)\n }\n return result\n}\n\n/**\n * Return only providers that have an API key configured\n * (via env var, or loaded from auth.json by loadPiAuth).\n */\nfunction getConfiguredProviders() {\n return getProviders().filter((p) => getEnvApiKey(p) !== undefined)\n}\n\n/** Return models only from providers that have configured auth. */\nfunction configuredModels() {\n const configured = new Set<string>(getConfiguredProviders())\n return allModels().filter((m) => configured.has(m.provider))\n}\n\n/**\n * Try to find a model matching a provider/modelId string.\n * Supported formats:\n * \"anthropic/claude-sonnet-4-5\" (provider/modelId)\n * \"claude-sonnet-4-5\" (modelId only)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction findModelById(id: string): Model<any> | undefined {\n const all = allModels()\n // Try provider/modelId format\n if (id.includes('/')) {\n const [provider, modelId] = id.split('/', 2)\n return all.find(\n (m) => m.provider === provider && (m.id === modelId || m.id.endsWith(`/${modelId}`))\n )\n }\n // modelId only\n return all.find((m) => m.id === id || m.id.endsWith(`/${id}`))\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction pickModel(preferred?: string): Model<any> | undefined {\n // 1. Explicit --model flag has highest priority\n if (preferred) {\n const hit = findModelById(preferred)\n if (hit) return hit\n }\n\n // 2. Pi's defaultModel / defaultProvider from settings.json\n const settings = getPiDefaults()\n\n if (settings.defaultModel) {\n const hit = findModelById(settings.defaultModel)\n if (hit) return hit\n }\n\n if (settings.defaultProvider) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const providerModels = getModels(settings.defaultProvider as any)\n if (providerModels && providerModels.length > 0) {\n // Prefer a model that has auth configured\n const configured = new Set<string>(getConfiguredProviders())\n if (configured.has(settings.defaultProvider as string)) {\n return providerModels[0]\n }\n }\n }\n\n // 3. First model from a provider that has configured auth\n const available = configuredModels()\n if (available.length > 0) {\n const order = ['claude-sonnet-4-5', 'claude-sonnet-4', 'gemini-2.5-flash', 'gpt-4o-mini']\n for (const id of order) {\n const m = available.find((m) => m.id.includes(id))\n if (m) return m\n }\n return available[0]\n }\n\n // 4. Fallback: any model from the full registry\n const models = allModels()\n if (models.length === 0) return undefined\n const order = ['claude-sonnet-4-5', 'claude-sonnet-4', 'gemini-2.5-flash', 'gpt-4o-mini']\n for (const id of order) {\n const m = models.find((m) => m.id.includes(id))\n if (m) return m\n }\n return models[0]\n}\n\nfunction build(pieces: TemplateStringsArray, args: unknown[]): string {\n let s = ''\n for (let i = 0; i < pieces.length; i++) {\n s += pieces[i]\n if (i < args.length) s += String(args[i])\n }\n return s\n}\n\nfunction makeContext(pieces: TemplateStringsArray, args: unknown[], opts: PiOptions): Context {\n return {\n systemPrompt: opts.system,\n messages: [\n {\n role: 'user' as const,\n content: build(pieces, args),\n timestamp: Date.now(),\n },\n ],\n }\n}\n\nfunction makeOpts(opts: PiOptions): SimpleStreamOptions {\n return {\n maxTokens: opts.maxTokens,\n reasoning: opts.thinkingLevel,\n }\n}\n\nasync function run(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: PiOptions\n): Promise<PiOutput> {\n const model = pickModel(opts.model)\n if (!model) throw new Error('pizx/\u03C0: No AI models configured. Run `pi auth login` first.')\n\n const t0 = Date.now()\n let text = ''\n for await (const ev of streamSimple(model, makeContext(pieces, args, opts), makeOpts(opts))) {\n if (ev.type === 'text_delta') {\n text += ev.delta\n if (!opts.quiet) process.stdout.write(ev.delta)\n }\n }\n if (!opts.quiet && text) process.stdout.write('\\n')\n return new PiOutput(text.trim(), model.id, [], t0, Date.now())\n}\n\nasync function* runStream(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: PiOptions\n): AsyncGenerator<string> {\n const model = pickModel(opts.model)\n if (!model) throw new Error('pizx/\u03C0: No AI models configured')\n for await (const ev of streamSimple(model, makeContext(pieces, args, opts), makeOpts(opts))) {\n if (ev.type === 'text_delta') yield ev.delta\n }\n}\n\n// \u2500\u2500 PiPromise \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class PiPromise extends Promise<PiOutput> {\n private _modelId = ''\n constructor(fn: (r: (v: PiOutput) => void, rj: (e: unknown) => void) => void, modelId?: string) {\n super(fn)\n if (modelId) this._modelId = modelId\n }\n get modelUsed() {\n return this._modelId\n }\n}\n\n// \u2500\u2500 \u03C0 tag type \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface PiFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): PiPromise\n (opts: Partial<PiOptions>): PiFn\n quiet: PiFn\n stream(pieces: TemplateStringsArray, ...args: unknown[]): AsyncGenerator<string>\n}\n\nfunction makePi(opts: Partial<PiOptions> = {}): PiFn {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<PiOptions>,\n ...args: unknown[]\n ): PiPromise | PiFn => {\n // \u03C0({ model: 'x' })\n if (!Array.isArray(pieces)) {\n return makePi({ ...merged, ...(pieces as Partial<PiOptions>) })\n }\n // \u03C0`template`\n return new PiPromise((resolve, reject) => {\n run(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as PiFn\n\n // Lazy quiet\n let _quiet: PiFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): PiFn {\n if (!_quiet) _quiet = makePi({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n fn.stream = async function* stream_pi(pieces: TemplateStringsArray, ...args: unknown[]) {\n yield* runStream(pieces, args, merged)\n } as unknown as PiFn['stream']\n\n return fn\n}\n\n/** \u03C0 template tag \u2014 call pi-ai for text generation */\nexport const \u03C0: PiFn = makePi()\n\nexport function configurePi(opts: Partial<PiOptions>): void {\n Object.assign(defaults, opts)\n}\n", "/**\n * PiOutput \u2014 the result object returned by the \u03C0 tag.\n * Patterned after zx's ProcessOutput.\n */\n\nexport class PiOutput {\n constructor(\n /** Full AI response text */\n public readonly text: string,\n /** The model id that produced this output */\n public readonly modelUsed: string,\n /** Raw streaming events from pi-ai */\n public readonly events: readonly unknown[] = [],\n /** Start timestamp (ms) */\n public readonly startTime: number = Date.now(),\n /** End timestamp (ms) */\n public readonly endTime: number = Date.now()\n ) {}\n\n /** Duration in milliseconds */\n get duration(): number {\n return this.endTime - this.startTime\n }\n\n toString(): string {\n return this.text\n }\n\n valueOf(): string {\n return this.text\n }\n\n [Symbol.toPrimitive](): string {\n return this.text\n }\n\n /** Number of characters in output */\n get length(): number {\n return this.text.length\n }\n\n /** Number of lines in output */\n get lines(): number {\n return this.text.split('\\n').length\n }\n}\n", "/**\n * \u03A0 (capital pi) \u2014 pi-coding-agent as a zx-style template tag.\n *\n * await \u03A0`fix the TypeScript errors in src/`\n * await \u03A0({ tools: ['read', 'bash', 'edit'] })`refactor auth`\n * await \u03A0.quiet()`update import paths`\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { type AgentSession, createAgentSession } from '@earendil-works/pi-coding-agent'\n\nexport interface AgentOptions {\n cwd?: string\n model?: string\n thinkingLevel?: ThinkingLevel\n quiet?: boolean\n maxTurns?: number\n tools?: string[]\n excludeTools?: string[]\n}\n\nconst _agentDefaults: AgentOptions = {\n quiet: false,\n maxTurns: 10,\n}\n\n// \u2500\u2500 AgentOutput \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class AgentOutput {\n constructor(\n public readonly text: string,\n public readonly turnCount: number = 0,\n public readonly startTime: number = Date.now(),\n public readonly endTime: number = Date.now()\n ) {}\n\n get duration(): number {\n return this.endTime - this.startTime\n }\n toString(): string {\n return this.text\n }\n valueOf(): string {\n return this.text\n }\n [Symbol.toPrimitive](): string {\n return this.text\n }\n}\n\nexport class AgentPromise extends Promise<AgentOutput> {}\n\n// \u2500\u2500 Session management \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet _sharedSession: AgentSession | null = null\n\nasync function getSession(opts: AgentOptions): Promise<AgentSession> {\n if (_sharedSession && !opts.model) return _sharedSession\n\n const result = await createAgentSession({\n cwd: opts.cwd,\n thinkingLevel: opts.thinkingLevel,\n tools: opts.tools,\n excludeTools: opts.excludeTools,\n })\n\n _sharedSession = result.session\n return _sharedSession\n}\n\n// \u2500\u2500 Execute \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction build(pieces: TemplateStringsArray, args: unknown[]): string {\n let s = ''\n for (let i = 0; i < pieces.length; i++) {\n s += pieces[i]\n if (i < args.length) s += String(args[i])\n }\n return s.trim()\n}\n\n/**\n * Extract text content from an agent message. Handles both string content\n * and content block arrays (TextContent[], ToolUseContent[], etc.).\n */\nfunction getMessageText(msg: { role: string; content: unknown }): string {\n const content = msg.content\n if (typeof content === 'string') return content\n if (Array.isArray(content)) {\n return content\n .filter(\n (c: { type?: string; text?: string }) => c.type === 'text' && typeof c.text === 'string'\n )\n .map((c: { text: string }) => c.text)\n .join('')\n }\n return ''\n}\n\n/**\n * Find the last assistant message in a session's message list.\n */\nfunction getLastAssistantText(session: {\n messages: readonly { role: string; content?: unknown }[]\n}): string {\n const messages = session.messages\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === 'assistant') {\n return getMessageText(messages[i] as { role: string; content: unknown })\n }\n }\n return ''\n}\n\nasync function execute(\n pieces: TemplateStringsArray,\n args: unknown[],\n opts: AgentOptions\n): Promise<AgentOutput> {\n const prompt = build(pieces, args)\n const session = await getSession(opts)\n const t0 = Date.now()\n\n if (!opts.quiet) {\n process.stderr.write(`\u03A0: ${prompt.slice(0, 100)}${prompt.length > 100 ? '...' : ''}\\n`)\n }\n\n try {\n // Send the prompt \u2014 session handles the turn loop (tools, etc.)\n await session.sendUserMessage(prompt)\n\n const t1 = Date.now()\n // Extract the actual assistant response from session messages\n const text = getLastAssistantText(session)\n\n // Count how many assistant turns happened (tool calls + final response)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const turnCount = (session.messages as readonly { role: string }[]).filter(\n (m) => m.role === 'assistant'\n ).length\n\n return new AgentOutput(text || '(no assistant response)', turnCount, t0, t1)\n } catch (err) {\n const t1 = Date.now()\n const msg = err instanceof Error ? err.message : String(err)\n console.error('\u03A0 error:', err)\n return new AgentOutput(`\u03A0 error: ${msg}`, 0, t0, t1)\n }\n}\n\n// \u2500\u2500 The \u03A0 tag \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface AgentFn {\n (pieces: TemplateStringsArray, ...args: unknown[]): AgentPromise\n (opts: Partial<AgentOptions>): AgentFn\n quiet: AgentFn\n}\n\nfunction makeAgent(opts: Partial<AgentOptions> = {}): AgentFn {\n const merged = { ..._agentDefaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<AgentOptions>,\n ...args: unknown[]\n ): AgentPromise | AgentFn => {\n if (!Array.isArray(pieces)) {\n return makeAgent({ ...merged, ...(pieces as Partial<AgentOptions>) })\n }\n return new AgentPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(resolve, reject)\n })\n }) as unknown as AgentFn\n\n let _quiet: AgentFn | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): AgentFn {\n if (!_quiet) _quiet = makeAgent({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n}\n\n/** \u03A0 tag \u2014 run pi-coding-agent with tools */\nexport const \u03A0: AgentFn = makeAgent()\n\nexport function configureAgent(opts: Partial<AgentOptions>): void {\n Object.assign(_agentDefaults, opts)\n}\n\nexport async function closeAgent(): Promise<void> {\n if (_sharedSession) {\n _sharedSession.dispose()\n _sharedSession = null\n }\n}\n"],
5
+ "mappings": ";AAoDA,cAAc;;;ACsCd,SAAS,gBAAgB,cAAc,WAAW,oBAAoB;;;ACnFtE,SAAS,YAAY,oBAAoB;AACzC,SAAS,eAAe;AACxB,SAAS,YAAY;AAMd,SAAS,gBAAwB;AACtC,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,OAAQ,QAAO;AACnB,SAAO,KAAK,QAAQ,GAAG,OAAO,OAAO;AACvC;AAMO,SAAS,gBAAyB;AACvC,SAAO,WAAW,KAAK,cAAc,GAAG,WAAW,CAAC;AACtD;AAwBO,SAAS,eAAe,UAA+B;AAC5D,QAAM,MAAM,YAAY,cAAc;AACtC,QAAM,OAAO,KAAK,KAAK,eAAe;AAEtC,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO,CAAC;AAE/B,MAAI;AACF,UAAM,MAAM,aAAa,MAAM,OAAO;AACtC,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO;AAAA,MACL,cAAc,OAAO,gBAAgB;AAAA,MACrC,iBAAiB,OAAO,mBAAmB;AAAA,MAC3C,sBAAsB,OAAO,wBAAwB;AAAA,IACvD;AAAA,EACF,QAAQ;AAEN,WAAO,CAAC;AAAA,EACV;AACF;;;ADjCO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAEkB,MAEA,YAAoB,KAAK,IAAI,GAE7B,UAAkB,KAAK,IAAI,GAC3C;AALgB;AAEA;AAEA;AAAA,EACf;AAAA,EALe;AAAA,EAEA;AAAA,EAEA;AAAA;AAAA,EAIlB,IAAI,WAAmB;AACrB,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAAA,EAEA,WAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,CAAC,OAAO,WAAW,IAAY;AAC7B,WAAO,KAAK;AAAA,EACd;AACF;AAYO,IAAM,iBAAN,cAA4D,QAAiB;AAAC;AAK9E,SAAS,MAAM,QAA8B,MAAyB;AAC3E,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,SAAK,OAAO,CAAC;AACb,QAAI,IAAI,KAAK,OAAQ,MAAK,OAAO,KAAK,CAAC,CAAC;AAAA,EAC1C;AACA,SAAO,EAAE,KAAK;AAChB;AAYA,IAAI;AAEJ,SAAS,gBAA4B;AACnC,MAAI,gBAAgB,QAAW;AAC7B,kBAAc,cAAc,IAAI,eAAe,IAAI,CAAC;AAAA,EACtD;AACA,SAAO;AACT;AAGA,SAAS,YAAwB;AAC/B,QAAM,SAAqB,CAAC;AAC5B,aAAW,KAAK,aAAa,GAAG;AAC9B,UAAM,KAAK,UAAU,CAAC;AACtB,QAAI,MAAM,GAAG,SAAS,EAAG,QAAO,KAAK,GAAG,EAAE;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,yBAAmC;AAC1C,SAAO,aAAa,EAAE,OAAO,CAAC,MAAM,aAAa,CAAC,MAAM,MAAS;AACnE;AAEA,SAAS,mBAA+B;AACtC,QAAM,aAAa,IAAI,IAAY,uBAAuB,CAAC;AAC3D,SAAO,UAAU,EAAE,OAAO,CAAC,MAAM,WAAW,IAAI,EAAE,QAAQ,CAAC;AAC7D;AAEA,SAAS,cAAc,IAAkC;AACvD,QAAM,MAAM,UAAU;AACtB,MAAI,GAAG,SAAS,GAAG,GAAG;AACpB,UAAM,CAAC,UAAU,OAAO,IAAI,GAAG,MAAM,KAAK,CAAC;AAC3C,WAAO,IAAI;AAAA,MACT,CAAC,MAAM,EAAE,aAAa,aAAa,EAAE,OAAO,WAAW,EAAE,GAAG,SAAS,IAAI,OAAO,EAAE;AAAA,IACpF;AAAA,EACF;AACA,SAAO,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE,GAAG,SAAS,IAAI,EAAE,EAAE,CAAC;AAC/D;AAMO,SAAS,UAAU,WAA0C;AAClE,MAAI,WAAW;AACb,UAAM,MAAM,cAAc,SAAS;AACnC,QAAI,IAAK,QAAO;AAAA,EAClB;AAEA,QAAM,WAAW,cAAc;AAE/B,MAAI,SAAS,cAAc;AACzB,UAAM,MAAM,cAAc,SAAS,YAAY;AAC/C,QAAI,IAAK,QAAO;AAAA,EAClB;AAEA,MAAI,SAAS,iBAAiB;AAC5B,UAAM,iBAAkB,UAAwC,SAAS,eAAe;AACxF,QAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,YAAM,aAAa,IAAI,IAAY,uBAAuB,CAAC;AAC3D,UAAI,WAAW,IAAI,SAAS,eAAyB,GAAG;AACtD,eAAO,eAAe,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,iBAAiB;AACnC,MAAI,UAAU,SAAS,GAAG;AACxB,UAAMA,SAAQ,CAAC,qBAAqB,mBAAmB,oBAAoB,aAAa;AACxF,eAAW,MAAMA,QAAO;AACtB,YAAM,IAAI,UAAU,KAAK,CAACC,OAAMA,GAAE,GAAG,SAAS,EAAE,CAAC;AACjD,UAAI,EAAG,QAAO;AAAA,IAChB;AACA,WAAO,UAAU,CAAC;AAAA,EACpB;AAEA,QAAM,SAAS,UAAU;AACzB,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,QAAQ,CAAC,qBAAqB,mBAAmB,oBAAoB,aAAa;AACxF,aAAW,MAAM,OAAO;AACtB,UAAM,IAAI,OAAO,KAAK,CAACA,OAAMA,GAAE,GAAG,SAAS,EAAE,CAAC;AAC9C,QAAI,EAAG,QAAO;AAAA,EAChB;AACA,SAAO,OAAO,CAAC;AACjB;AAMA,eAAsB,IACpB,QACA,OAA+F,CAAC,GAC/E;AACjB,QAAM,QAAQ,UAAU,KAAK,KAAK;AAClC,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,oEAAoE;AAEhG,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACE,cAAc,KAAK;AAAA,MACnB,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,QAAQ,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,IACrE;AAAA,IACA;AAAA,MACE,WAAW,KAAK,aAAa;AAAA,MAC7B,WAAW,KAAK,iBAAkB;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,QACjB,OAAO,CAAC,MAA2C,EAAE,SAAS,MAAM,EACpE,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE;AAEV,SAAO,KAAK,KAAK;AACnB;;;AEzLA,IAAM,WAA4B;AAAA,EAChC,WAAW;AAAA,EACX,eAAe;AAAA,EACf,UAAU;AAAA,EACV,kBAAkB;AACpB;AAIO,IAAM,eAAN,MAAmB;AAAA,EACxB,YACkB,MACA,QACA,QACA,SACA,YAChB;AALgB;AACA;AACA;AACA;AACA;AAAA,EACf;AAAA,EALe;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAEpB;AAEO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,YACE,MACgB,aACA,OACA,YAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AANd;AACA;AACA;AAAA,EAKlB;AAAA,EAPkB;AAAA,EACA;AAAA,EACA;AAMpB;AAIA,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUpB,IAAM,iBAAiB;AAEvB,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUxB,eAAe,QACb,QACA,MACA,MACyB;AACzB,QAAM,OAAO,MAAM,QAAQ,IAAI;AAC/B,QAAM,KAAK,KAAK,IAAI;AAEpB,QAAM,eAAe,KAAK,gBAAgB,KAAK;AAC/C,QAAM,cAAc,KAAK,eAAe,KAAK;AAE7C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,4BAAkB,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,SAAS,KAAK,QAAQ,EAAE;AAAA,CAAK;AAAA,EAC/F;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,wBAAmB;AACzD,QAAM,WAAW,MAAM,IAAI,MAAM;AAAA,IAC/B,OAAO;AAAA,IACP,WAAW,KAAK;AAAA,IAChB,eAAe;AAAA,IACf,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,YAAY,SAAS,MAAM,IAAI;AACrC,QAAM,eAAyB,CAAC;AAChC,aAAW,QAAQ,WAAW;AAC5B,UAAM,QAAQ,KAAK,MAAM,iBAAiB;AAC1C,QAAI,MAAO,cAAa,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC;AAAA,EAC9C;AACA,QAAM,QAAQ,aAAa,SAAS,IAAI,eAAe,CAAC,IAAI;AAE5D,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,YAAO,MAAM,MAAM;AAAA,CAAoB;AAC5D,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,IAAI,MAAM,CAAC;AACjB,cAAQ,OAAO,MAAM,UAAU,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,CAAI;AAAA,IAC1F;AAAA,EACF;AAGA,QAAM,gBAAgC,CAAC;AACvC,QAAM,WAAW,KAAK,YAAY;AAClC,QAAM,YAAY,KAAK,oBAAoB;AAC3C,MAAI,YAAY;AAChB,MAAI,gBAAgB;AAEpB,SAAO,YAAY,MAAM,UAAU,gBAAgB,UAAU;AAC3D;AACA,UAAM,cAAc,MAAM,SAAS;AAEnC,QAAI,CAAC,KAAK;AACR,cAAQ,OAAO,MAAM,iBAAY,aAAa,KAAK,YAAY,MAAM,GAAG,EAAE,CAAC;AAAA,CAAO;AAGpF,UAAM,SAAS,MAAM,IAAI,aAAa;AAAA,MACpC,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK;AAAA,MACpB,QAAQ;AAAA,IACV,CAAC;AAGD,UAAM,aAAa,MAAM;AAAA,MACvB,SAAS,IAAI;AAAA,iBAAoB,WAAW;AAAA,UAAa,MAAM;AAAA;AAAA;AAAA,MAC/D;AAAA,QACE,OAAO;AAAA,QACP,WAAW;AAAA,QACX,eAAe;AAAA,QACf,QAAQ;AAAA,MACV;AAAA,IACF;AAGA,UAAM,aAAa,WAAW,MAAM,oBAAoB;AACxD,UAAM,cAAc,WAAW,MAAM,qBAAqB;AAC1D,UAAM,aAAa,WAAW,MAAM,qBAAqB;AAEzD,UAAM,UAAU,aAAa,WAAW,WAAW,CAAC,CAAC,IAAI;AACzD,UAAM,aAAa,cAAc,CAAC,KAAK;AACvC,UAAM,aAAa,aAAa,CAAC,KAAK;AAEtC,kBAAc,KAAK,IAAI,aAAa,eAAe,aAAa,QAAQ,SAAS,UAAU,CAAC;AAE5F,QAAI,CAAC,KAAK,OAAO;AACf,cAAQ,OAAO,MAAM,kBAAkB,QAAQ,QAAQ,CAAC,CAAC,MAAM,WAAW,MAAM,GAAG,EAAE,CAAC;AAAA,CAAO;AAC7F,cAAQ,OAAO,MAAM,qBAAqB,UAAU;AAAA,CAAI;AAAA,IAC1D;AAGA,QAAI,WAAW,WAAW;AACxB,UAAI,CAAC,KAAK;AACR,gBAAQ,OAAO,MAAM,+BAA0B,SAAS;AAAA,CAA0B;AACpF;AAAA,IACF;AAGA,UAAM,aAAa,WAAW,YAAY;AAC1C,QAAI,WAAW,WAAW,QAAQ,GAAG;AAAA,IACrC,WAAW,WAAW,WAAW,WAAW,GAAG;AAC7C,mBAAa;AAAA,IACf,WAAW,WAAW,WAAW,KAAK,GAAG;AACvC,YAAM,UAAU,WAAW,QAAQ,YAAY,EAAE;AACjD,YAAM,OAAO,YAAY,GAAG,GAAG,OAAO;AACtC;AAAA,IACF,OAAO;AAEL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,IAAI;AAEpB,QAAM,cAAc,cAAc,SAAS,IAAI,cAAc,cAAc,SAAS,CAAC,EAAE,SAAS;AAEhG,QAAM,UAAU,cACb;AAAA,IACC,CAAC,MACC,QAAQ,EAAE,IAAI,KAAK,EAAE,OAAO,MAAM,GAAG,EAAE,CAAC;AAAA,aAAmB,EAAE,QAAQ,QAAQ,CAAC,CAAC;AAAA,gBAAmB,EAAE,UAAU;AAAA,EAClH,EACC,KAAK,MAAM;AAEd,SAAO,IAAI,eAAe,SAAS,aAAa,eAAe,eAAe,IAAI,EAAE;AACtF;AAUA,SAAS,aAAa,OAAiC,CAAC,GAAe;AACrE,QAAM,SAAS,EAAE,GAAG,UAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SAC6C;AAChD,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,aAAa,EAAE,GAAG,QAAQ,GAAI,OAAoC,CAAC;AAAA,IAC5E;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,cAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAkB;AAChB,UAAI,CAAC,OAAQ,UAAS,aAAa,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AAC7D,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAgB,aAAa;;;AC5N1C,IAAMC,YAA6B;AAAA,EACjC,WAAW;AAAA,EACX,eAAe;AAAA,EACf,SAAS;AACX;AAEA,IAAM,YAAsC;AAAA,EAC1C,GAAG;AAAA,IACD;AAAA,IACA;AAAA,EACF;AAAA,EACA,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAIO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YACkB,MACA,UACA,SACA,OAChB;AAJgB;AACA;AACA;AACA;AAAA,EACf;AAAA,EAJe;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAEpB;AAEO,IAAM,kBAAN,cAA8B,cAAc;AAAA,EACjD,YACE,MACgB,WACA,WAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AALd;AACA;AAAA,EAKlB;AAAA,EANkB;AAAA,EACA;AAMpB;AAIA,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAStB,IAAM,mBAAmB;AAEzB,eAAeC,SACb,QACA,MACA,MAC0B;AAC1B,QAAM,WAAW,MAAM,QAAQ,IAAI;AACnC,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,cAAc,KAAK,WAAW;AACpC,QAAM,QAAQ,KAAK,SAAS,UAAU,WAAW,KAAK,UAAU,CAAC,KAAK,CAAC;AAEvE,QAAM,eAAe,KAAK,gBAAgB,KAAK;AAC/C,QAAM,cAAc,KAAK,eAAe,KAAK;AAE7C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,4BAAkB,WAAW;AAAA,CAAc;AAChE,YAAQ,OAAO;AAAA,MACb,gBAAgB,SAAS,MAAM,GAAG,EAAE,CAAC,GAAG,SAAS,SAAS,KAAK,QAAQ,EAAE;AAAA;AAAA,IAC3E;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,uCAAkC;AAExE,QAAM,mBAAmB,MAAM,QAAQ;AAAA,IACrC,MAAM,IAAI,OAAO,SAAS;AACxB,YAAM,SAAS,cAAc,QAAQ,UAAU,IAAI,EAAE,QAAQ,cAAc,QAAQ;AACnF,YAAM,OAAO,MAAM,IAAI,QAAQ;AAAA,QAC7B,OAAO;AAAA,QACP,WAAW,KAAK;AAAA,QAChB,eAAe,KAAK;AAAA,MACtB,CAAC;AACD,aAAO,IAAI,kBAAkB,MAAM,MAAM,IAAI;AAAA,IAC/C,CAAC;AAAA,EACH;AAEA,QAAM,YAAiC,CAAC;AACxC,aAAW,KAAK,kBAAkB;AAChC,QAAI,EAAE,WAAW,aAAa;AAC5B,gBAAU,KAAK,EAAE,KAAK;AAAA,IACxB,OAAO;AACL,YAAM,MAAM,EAAE,kBAAkB,QAAQ,EAAE,OAAO,UAAU,OAAO,EAAE,MAAM;AAC1E,gBAAU,KAAK,IAAI,kBAAkB,YAAY,IAAI,OAAO,GAAG,CAAC;AAAA,IAClE;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,sCAAiC;AAEvE,QAAM,gBAAgB,UAAU,IAAI,CAAC,OAAO,OAAO,GAAG,IAAI;AAAA,EAAS,GAAG,QAAQ,EAAE,EAAE,KAAK,MAAM;AAE7F,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,EAAuB,QAAQ;AAAA;AAAA;AAAA,EAA0B,aAAa;AAAA;AAAA;AAAA,IACtE;AAAA,MACE,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB,eAAe;AAAA,MACf,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,IAAI;AAEpB,QAAM,UAAU,UACb;AAAA,IACC,CAAC,OAAO,IAAI,GAAG,IAAI,MAAM,GAAG,SAAS,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,SAAS,SAAS,MAAM,QAAQ,EAAE;AAAA,EAC5F,EACC,KAAK,IAAI;AAEZ,SAAO,IAAI,gBAAgB,SAAS,WAAW,WAAW,IAAI,EAAE;AAClE;AAUA,SAAS,cAAc,OAAkC,CAAC,GAAgB;AACxE,QAAM,SAAS,EAAE,GAAGD,WAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SAC+C;AAClD,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,cAAc,EAAE,GAAG,QAAQ,GAAI,OAAqC,CAAC;AAAA,IAC9E;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAC,SAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAmB;AACjB,UAAI,CAAC,OAAQ,UAAS,cAAc,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AAC9D,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAiB,cAAc;;;AC5K5C,IAAMC,YAAuB;AAAA,EAC3B,WAAW;AAAA,EACX,eAAe;AACjB;AAIO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAEkB,UAEA,SAEA,gBAEA,YAChB;AAPgB;AAEA;AAEA;AAEA;AAAA,EACf;AAAA,EAPe;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAEpB;AAEO,IAAM,YAAN,cAAwB,cAAc;AAAA,EAC3C,YACE,MAEgB,UAEA,SAEA,kBAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AARd;AAEA;AAEA;AAAA,EAKlB;AAAA,EATkB;AAAA,EAEA;AAAA,EAEA;AAMpB;AAIA,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBxB,SAAS,aAAa,MAAkB,UAA0B;AAChE,MAAI,KAAK,MAAO,QAAO,KAAK;AAE5B,MAAI,KAAK,QAAQ;AACf,UAAM,aAAa,KAAK,OAAO,YAAY;AAC3C,WAAO,wBAAwB,UAAU;AAAA;AAAA,EAAgB,KAAK,OAAO,IAAI;AAAA,EAC3E;AAEA,SAAO;AAAA;AAAA,EAAyC,QAAQ;AAAA;AAAA;AAC1D;AAIA,SAAS,cAAc,UAIrB;AACA,QAAM,WAA8B,CAAC;AAGrC,QAAM,gBACJ;AACF,MAAI;AAEJ,UAAQ,QAAQ,cAAc,KAAK,QAAQ,OAAO,MAAM;AACtD,UAAM,WAAW,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY;AAC7C,UAAM,UAAU,MAAM,CAAC,EAAE,KAAK;AAC9B,UAAM,iBAAiB,MAAM,CAAC,EAAE,KAAK;AACrC,UAAM,aAAa,WAAW,MAAM,CAAC,CAAC,KAAK;AAE3C,QAAI,CAAC,iBAAiB,YAAY,WAAW,YAAY,EAAE,SAAS,QAAQ,GAAG;AAC7E,eAAS;AAAA,QACP,IAAI,gBAAgB,UAAU,SAAS,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC;AAAA,MAC7F;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAe,SAAS,MAAM,iCAAiC;AACrE,QAAM,UAAU,eAAe,CAAC,GAAG,KAAK,KAAK;AAG7C,QAAM,eAAe,SAAS,MAAM,wBAAwB;AAC5D,QAAM,mBAAmB,eAAe,CAAC,GAAG,KAAK,KAAK;AAEtD,SAAO,EAAE,UAAU,SAAS,iBAAiB;AAC/C;AAIA,eAAeC,SACb,QACA,MACA,MACoB;AACpB,QAAM,WAAW,MAAM,QAAQ,IAAI;AACnC,QAAM,QAAQ,aAAa,MAAM,QAAQ;AACzC,QAAM,KAAK,KAAK,IAAI;AAEpB,QAAM,eAAe,KAAK,gBAAgB,KAAK;AAE/C,MAAI,CAAC,KAAK,OAAO;AACf,UAAM,QAAQ,KAAK,SAAS,KAAK,OAAO,YAAY,OAAO,KAAK,QAAQ,UAAU;AAClF,YAAQ,OAAO,MAAM,iDAAuC,KAAK;AAAA,CAAI;AAAA,EACvE;AAEA,QAAM,WAAW,MAAM,IAAI,OAAO;AAAA,IAChC,OAAO;AAAA,IACP,WAAW,KAAK;AAAA,IAChB,eAAe,KAAK;AAAA,IACpB,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,EAAE,UAAU,SAAS,iBAAiB,IAAI,cAAc,QAAQ;AAEtE,QAAM,KAAK,KAAK,IAAI;AAEpB,QAAM,OAAO;AAAA,IACX,aAAa,SAAS,MAAM;AAAA,IAC5B,SACG;AAAA,MACC,CAAC,MACC,MAAM,EAAE,QAAQ,KAAK,EAAE,QAAQ,MAAM,GAAG,EAAE,CAAC,oBAAoB,EAAE,WAAW,QAAQ,CAAC,CAAC;AAAA,IAC1F,EACC,KAAK,IAAI;AAAA,IACZ;AAAA,WAAc,OAAO;AAAA,IACrB;AAAA,WAAc,gBAAgB;AAAA,EAChC,EAAE,KAAK,IAAI;AAEX,SAAO,IAAI,UAAU,MAAM,UAAU,SAAS,kBAAkB,IAAI,EAAE;AACxE;AAUA,SAAS,QAAQ,OAA4B,CAAC,GAAU;AACtD,QAAM,SAAS,EAAE,GAAGD,WAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SACmC;AACtC,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,QAAQ,EAAE,GAAG,QAAQ,GAAI,OAA+B,CAAC;AAAA,IAClE;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAC,SAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAa;AACX,UAAI,CAAC,OAAQ,UAAS,QAAQ,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AACxD,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAW,QAAQ;;;AChMhC,IAAMC,YAA4B;AAAA,EAChC,WAAW;AAAA,EACX,eAAe;AAAA,EACf,QAAQ;AACV;AAIO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAEkB,SAEA,UAEA,OAChB;AALgB;AAEA;AAEA;AAAA,EACf;AAAA,EALe;AAAA,EAEA;AAAA,EAEA;AAEpB;AAEO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,YACE,MAEgB,cAEA,QAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AANd;AAEA;AAAA,EAKlB;AAAA,EAPkB;AAAA,EAEA;AAMpB;AAIA,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAOxB,IAAM,iBAAiB;AAAA;AAAA;AAMvB,eAAeC,SACb,QACA,MACA,MACyB;AACzB,QAAM,SAAS,MAAM,QAAQ,IAAI;AACjC,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,SAAS,KAAK,IAAI,KAAK,UAAU,GAAG,CAAC;AAG3C,QAAM,eAAe,KAAK,gBAAgB,KAAK;AAC/C,QAAM,cAAc,KAAK,eAAe,KAAK;AAE7C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO;AAAA,MACb,4BAAkB,OAAO,MAAM,GAAG,EAAE,CAAC,GAAG,OAAO,SAAS,KAAK,QAAQ,EAAE;AAAA;AAAA,IACzE;AACA,YAAQ,OAAO,MAAM,YAAO,MAAM;AAAA,CAAsB;AAAA,EAC1D;AAEA,QAAM,iBAAkC,CAAC;AACzC,MAAI,iBAAiB;AAErB,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAE/B,QAAI,MAAM,GAAG;AACX,UAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,0CAAqC;AAC3E,uBAAiB,MAAM,IAAI,QAAQ;AAAA,QACjC,OAAO;AAAA,QACP,WAAW,KAAK;AAAA,QAChB,eAAe,KAAK;AAAA,QACpB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,OAAO;AACL,UAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,6BAAwB,IAAI,CAAC;AAAA,CAAQ;AAE3E,YAAM,eAAe,eAAe,IAAI,CAAC,GAAG,YAAY;AACxD,uBAAiB,MAAM;AAAA,QACrB,qBAAqB,MAAM;AAAA;AAAA;AAAA,EAAkB,YAAY;AAAA;AAAA;AAAA,EAA4B,cAAc;AAAA;AAAA;AAAA,QACnG;AAAA,UACE,OAAO;AAAA,UACP,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,UACpB,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,8BAAyB,IAAI,CAAC;AAAA,CAAQ;AAC5E,UAAM,WAAW,MAAM,IAAI,gBAAgB;AAAA,MACzC,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK;AAAA,MACpB,QAAQ;AAAA,IACV,CAAC;AAED,mBAAe,KAAK,IAAI,cAAc,gBAAgB,UAAU,CAAC,CAAC;AAAA,EACpE;AAEA,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,eAAe;AAErB,QAAM,UAAU,eACb;AAAA,IACC,CAAC,OACC,SAAS,GAAG,QAAQ,CAAC;AAAA,EAAM,GAAG,QAAQ,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,QAAQ,SAAS,MAAM,QAAQ,EAAE;AAAA,YAAe,GAAG,SAAS,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,SAAS,SAAS,MAAM,QAAQ,EAAE;AAAA,EAC9K,EACC,KAAK,MAAM;AAEd,SAAO,IAAI,eAAe,SAAS,cAAc,gBAAgB,IAAI,EAAE;AACzE;AAUA,SAAS,aAAa,OAAiC,CAAC,GAAe;AACrE,QAAM,SAAS,EAAE,GAAGD,WAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SAC6C;AAChD,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,aAAa,EAAE,GAAG,QAAQ,GAAI,OAAoC,CAAC;AAAA,IAC5E;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAC,SAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAkB;AAChB,UAAI,CAAC,OAAQ,UAAS,aAAa,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AAC7D,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAgB,aAAa;;;AC3J1C,IAAMC,YAA0B;AAAA,EAC9B,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,QAAQ;AACV;AAGA,IAAMC,aAAsC;AAAA,EAC1C,GAAG;AAAA,IACD;AAAA,IACA;AAAA,EACF;AAAA,EACA,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAIO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAEkB,MAEA,UAEA,QAAgB,GAChC;AALgB;AAEA;AAEA;AAAA,EACf;AAAA,EALe;AAAA,EAEA;AAAA,EAEA;AAEpB;AAEO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,YACE,MAEgB,YAEA,cAEA,QAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AARd;AAEA;AAEA;AAAA,EAKlB;AAAA,EATkB;AAAA,EAEA;AAAA,EAEA;AAMpB;AAIA,IAAM,qBAAqB,CAAC,SAC1B,oCAAoC,IAAI;AAE1C,IAAM,kBAAkB,CAAC,SACvB,oCAAoC,IAAI;AAE1C,IAAMC,oBAAmB;AAEzB,eAAeC,SACb,QACA,MACA,MACuB;AACvB,QAAM,WAAW,MAAM,QAAQ,IAAI;AACnC,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,QAAQ,KAAK,gBAAgB;AACnC,QAAM,cAAc,KAAK,UAAU;AACnC,QAAM,QAAQ,KAAK,SAASF,WAAU,KAAK,KAAKA,WAAU,CAAC,KAAK,CAAC;AAGjE,QAAM,eAAe,KAAK,gBAAgB,KAAK;AAC/C,QAAM,cAAc,KAAK,eAAe,KAAK;AAE7C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO;AAAA,MACb,0BAAgB,SAAS,MAAM,GAAG,EAAE,CAAC,GAAG,SAAS,SAAS,KAAK,QAAQ,EAAE;AAAA;AAAA,IAC3E;AACA,YAAQ,OAAO,MAAM,YAAO,MAAM,MAAM,oBAAoB,WAAW;AAAA,CAAa;AAAA,EACtF;AAEA,QAAM,kBAAuC,CAAC;AAC9C,MAAI,gBAAgB,aAAa,QAAQ;AAAA;AAGzC,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,6CAAwC;AAE9E,QAAM,gBAAgB,MAAM,QAAQ;AAAA,IAClC,MAAM;AAAA,MAAI,CAAC,SACT,IAAI,UAAU;AAAA,QACZ,OAAO;AAAA,QACP,WAAW,KAAK;AAAA,QAChB,eAAe,KAAK;AAAA,QACpB,QAAQ,mBAAmB,IAAI;AAAA,MACjC,CAAC,EAAE,KAAK,CAAC,SAAS,IAAI,kBAAkB,MAAM,MAAM,CAAC,CAAC;AAAA,IACxD;AAAA,EACF;AAEA,QAAM,qBAA0C,CAAC;AACjD,gBAAc,QAAQ,CAAC,GAAG,MAAM;AAC9B,QAAI,EAAE,WAAW,aAAa;AAC5B,yBAAmB,KAAK,EAAE,KAAK;AAAA,IACjC,OAAO;AACL,yBAAmB;AAAA,QACjB,IAAI,kBAAkB,MAAM,CAAC,KAAK,eAAe,IAAI,CAAC,IAAI,YAAY,EAAE,MAAM,KAAK,CAAC;AAAA,MACtF;AAAA,IACF;AAAA,EACF,CAAC;AACD,kBAAgB,KAAK,GAAG,kBAAkB;AAE1C,mBAAiB,GAAG,mBAAmB,IAAI,CAAC,MAAM,aAAa,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,MAAM,CAAC;AAAA;AAGpG,WAAS,QAAQ,GAAG,SAAS,aAAa,SAAS;AACjD,QAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,kBAAa,KAAK;AAAA,CAAkB;AAE1E,UAAM,eAAe,MAAM,QAAQ;AAAA,MACjC,MAAM,IAAI,CAAC,SAAS;AAElB,cAAM,aAAa,gBAChB,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,EAC7B,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,WAAW,EAAE,KAAK,MAAM,EAAE,QAAQ,EAAE,EACzD,KAAK,MAAM;AAEd,cAAM,UAAU,gBACb,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,EAC7B,IAAI,CAAC,MAAM,eAAe,EAAE,KAAK,MAAM,EAAE,QAAQ,EAAE,EACnD,KAAK,MAAM;AAEd,cAAM,SAAS,aAAa,QAAQ;AAAA;AAAA;AAAA,EAAgC,OAAO;AAAA;AAAA;AAAA,EAAmD,UAAU;AAAA;AAAA;AAExI,eAAO,IAAI,QAAQ;AAAA,UACjB,OAAO;AAAA,UACP,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,UACpB,QAAQ,gBAAgB,IAAI;AAAA,QAC9B,CAAC,EAAE,KAAK,CAAC,SAAS,IAAI,kBAAkB,MAAM,MAAM,KAAK,CAAC;AAAA,MAC5D,CAAC;AAAA,IACH;AAEA,UAAM,oBAAyC,CAAC;AAChD,iBAAa,QAAQ,CAAC,GAAG,MAAM;AAC7B,UAAI,EAAE,WAAW,aAAa;AAC5B,0BAAkB,KAAK,EAAE,KAAK;AAAA,MAChC,OAAO;AACL,0BAAkB;AAAA,UAChB,IAAI,kBAAkB,MAAM,CAAC,KAAK,eAAe,IAAI,CAAC,IAAI,YAAY,EAAE,MAAM,KAAK,KAAK;AAAA,QAC1F;AAAA,MACF;AAAA,IACF,CAAC;AACD,oBAAgB,KAAK,GAAG,iBAAiB;AAEzC,qBAAiB,GAAG,kBAAkB,IAAI,CAAC,MAAM,UAAU,KAAK,KAAK,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,MAAM,CAAC;AAAA;AAAA,EAC5G;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,yCAAoC;AAE1E,QAAM,aAAa,MAAM;AAAA,IACvB,GAAG,aAAa;AAAA;AAAA;AAAA,IAChB;AAAA,MACE,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB,eAAe;AAAA,MACf,QAAQC;AAAA,IACV;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,IAAI;AAEpB,SAAO,IAAI,aAAa,YAAY,YAAY,iBAAiB,aAAa,IAAI,EAAE;AACtF;AAUA,SAAS,WAAW,OAA+B,CAAC,GAAa;AAC/D,QAAM,SAAS,EAAE,GAAGF,WAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SACyC;AAC5C,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,WAAW,EAAE,GAAG,QAAQ,GAAI,OAAkC,CAAC;AAAA,IACxE;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAG,SAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAgB;AACd,UAAI,CAAC,OAAQ,UAAS,WAAW,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AAC3D,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAc,WAAW;;;AC5NtC,IAAMC,YAAyB;AAAA,EAC7B,WAAW;AAAA,EACX,eAAe;AAAA,EACf,aAAa;AACf;AAIO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAEkB,MAEA,MAEA,SAEA,OAChB;AAPgB;AAEA;AAEA;AAEA;AAAA,EACf;AAAA,EAPe;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAEpB;AAEO,IAAM,cAAN,cAA0B,cAAc;AAAA,EAC7C,YACE,MAEgB,SAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AAJd;AAAA,EAKlB;AAAA,EALkB;AAAA;AAAA,EAQlB,IAAI,eAAuB;AACzB,WAAO,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,EAC/C;AAAA;AAAA,EAGA,IAAI,eAAuB;AACzB,WAAO,KAAK,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE;AAAA,EAChD;AACF;AAIA,SAAS,WAAW,UAAkB,eAAoC;AACxE,MAAI,iBAAiB,cAAc,SAAS,EAAG,QAAO;AAEtD,QAAM,QAAQ,SACX,MAAM,IAAI,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAGjB,QAAM,UAAU,MAAM,OAAO,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC;AACrD,MAAI,QAAQ,SAAS,EAAG,QAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,YAAY,EAAE,CAAC;AAG3E,QAAM,WAAW,MAAM,OAAO,CAAC,MAAM,aAAa,KAAK,CAAC,CAAC;AACzD,MAAI,SAAS,SAAS,EAAG,QAAO,SAAS,IAAI,CAAC,MAAM,EAAE,QAAQ,eAAe,EAAE,CAAC;AAGhF,MAAI,MAAM,SAAS,EAAG,QAAO;AAG7B,SAAO,CAAC,QAAQ;AAClB;AAIA,IAAM,eAAe;AAErB,eAAe,YACb,MACA,MACA,aAC4B;AAC5B,QAAM,QAAQ,eAAe,KAAK;AAClC,MAAI;AACF,UAAM,OAAO,MAAM,IAAI,MAAM;AAAA,MAC3B;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK;AAAA,MACpB,QAAQ,KAAK,UAAU;AAAA,IACzB,CAAC;AACD,WAAO,IAAI,kBAAkB,MAAM,MAAM,IAAI;AAAA,EAC/C,SAAS,KAAK;AACZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,WAAO,IAAI,kBAAkB,MAAM,IAAI,OAAO,GAAG;AAAA,EACnD;AACF;AAEA,eAAeC,SACb,QACA,MACA,MACsB;AACtB,QAAM,WAAW,MAAM,QAAQ,IAAI;AACnC,QAAM,QAAQ,WAAW,UAAU,KAAK,KAAK;AAC7C,QAAM,KAAK,KAAK,IAAI;AAGpB,QAAM,cAAc,KAAK,eAAe,KAAK;AAE7C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,2BAAsB,MAAM,MAAM;AAAA,CAAwB;AAC/E,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,IAAI,MAAM,CAAC;AACjB,cAAQ,OAAO,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,CAAI;AAAA,IACtF;AAAA,EACF;AAGA,QAAM,UAA+B,CAAC;AACtC,QAAM,cAAc,KAAK,eAAe;AAExC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,aAAa;AAClD,UAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,WAAW;AAC5C,UAAM,eAAe,MAAM,QAAQ;AAAA,MACjC,MAAM,IAAI,CAAC,SAAS,YAAY,MAAM,MAAM,WAAW,CAAC;AAAA,IAC1D;AACA,iBAAa,QAAQ,CAAC,GAAG,QAAQ;AAC/B,UAAI,EAAE,WAAW,aAAa;AAC5B,gBAAQ,KAAK,EAAE,KAAK;AAAA,MACtB,OAAO;AACL,gBAAQ,KAAK,IAAI,kBAAkB,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,QAAQ,SAAS,CAAC,CAAC;AAAA,MACjF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,KAAK,KAAK,IAAI;AAGpB,QAAM,UAAU,QACb;AAAA,IACC,CAAC,GAAG,MACF,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI;AAAA,IAAO,EAAE,UAAU,WAAM,QAAG,IAAI,EAAE,KAAK,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,SAAS,MAAM,QAAQ,EAAE;AAAA,EAC/G,EACC,KAAK,MAAM;AAEd,QAAM,SAAS,kBAAkB,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,QAAQ,MAAM;AAAA;AAAA;AAE1F,SAAO,IAAI,YAAY,SAAS,SAAS,SAAS,IAAI,EAAE;AAC1D;AAUA,SAAS,UAAU,OAA8B,CAAC,GAAY;AAC5D,QAAM,SAAS,EAAE,GAAGD,WAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SACuC;AAC1C,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,UAAU,EAAE,GAAG,QAAQ,GAAI,OAAiC,CAAC;AAAA,IACtE;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAC,SAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAe;AACb,UAAI,CAAC,OAAQ,UAAS,UAAU,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AAC1D,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAa,UAAU;;;AC9KpC,IAAMC,YAAyB;AAAA,EAC7B,WAAW;AAAA,EACX,eAAe;AACjB;AAIO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YACkB,QACA,MACA,QACA,SAChB;AAJgB;AACA;AACA;AACA;AAAA,EACf;AAAA,EAJe;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAEpB;AAEO,IAAM,cAAN,cAA0B,cAAc;AAAA,EAC7C,YACE,MACgB,aACA,aAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AALd;AACA;AAAA,EAKlB;AAAA,EANkB;AAAA,EACA;AAMpB;AAIA,SAAS,WACP,UACA,WAC4C;AAC5C,QAAM,MAAM,aAAa;AACzB,QAAM,QAAQ,SACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAEjB,MAAI,MAAM,UAAU,GAAG;AAErB,WAAO;AAAA,MACL,OAAO,CAAC,EAAE,IAAI,QAAQ,MAAM,SAAS,KAAK,EAAE,CAAC;AAAA,MAC7C,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,QAAM,QAAqB,CAAC;AAC5B,QAAM,QAAqB,CAAC;AAE5B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,KAAK,QAAQ,IAAI,CAAC;AACxB,UAAM,KAAK,EAAE,IAAI,MAAM,MAAM,CAAC,EAAE,CAAC;AACjC,QAAI,IAAI,GAAG;AACT,YAAM,KAAK,EAAE,MAAM,MAAM,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,MAAM;AACxB;AAIA,IAAM,cAAc;AAGb,SAAS,YAAY,OAAoB,OAAgC;AAC9E,QAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC9C,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,MAAM,oBAAI,IAAsB;AAEtC,aAAW,MAAM,SAAS;AACxB,aAAS,IAAI,IAAI,CAAC;AAClB,QAAI,IAAI,IAAI,CAAC,CAAC;AAAA,EAChB;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,EAAE,EAAG;AACtD,aAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,EAAE,KAAK,KAAK,CAAC;AACtD,QAAI,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,EAAE;AAAA,EAClC;AAEA,QAAM,UAAsB,CAAC;AAC7B,QAAM,QAAkB,CAAC;AAEzB,aAAW,CAAC,IAAI,GAAG,KAAK,UAAU;AAChC,QAAI,QAAQ,EAAG,OAAM,KAAK,EAAE;AAAA,EAC9B;AAEA,SAAO,MAAM,SAAS,GAAG;AACvB,YAAQ,KAAK,CAAC,GAAG,KAAK,CAAC;AACvB,UAAM,YAAsB,CAAC;AAE7B,eAAW,QAAQ,OAAO;AACxB,iBAAW,YAAY,IAAI,IAAI,IAAI,KAAK,CAAC,GAAG;AAC1C,cAAM,UAAU,SAAS,IAAI,QAAQ,KAAK,KAAK;AAC/C,iBAAS,IAAI,UAAU,MAAM;AAC7B,YAAI,WAAW,EAAG,WAAU,KAAK,QAAQ;AAAA,MAC3C;AAAA,IACF;AAEA,UAAM,SAAS;AACf,UAAM,KAAK,GAAG,SAAS;AAAA,EACzB;AAEA,SAAO;AACT;AAEA,eAAeC,SACb,QACA,MACA,MACsB;AACtB,QAAM,WAAW,MAAM,QAAQ,IAAI;AACnC,QAAM,KAAK,KAAK,IAAI;AAEpB,QAAM,EAAE,OAAO,MAAM,IAAI,KAAK,SAAS,WAAW,UAAU,KAAK,SAAS;AAE1E,QAAM,cAAc,KAAK,eAAe,KAAK;AAE7C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,4BAAkB,MAAM,MAAM,aAAa,MAAM,MAAM;AAAA,CAAY;AACxF,eAAW,KAAK,OAAO;AACrB,cAAQ,OAAO,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,SAAS,KAAK,QAAQ,EAAE;AAAA,CAAI;AAAA,IAC/F;AAAA,EACF;AAEA,QAAM,UAAU,YAAY,OAAO,KAAK;AACxC,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,cAAiC,CAAC;AAGxC,WAAS,KAAK,GAAG,KAAK,QAAQ,QAAQ,MAAM;AAC1C,UAAM,QAAQ,QAAQ,EAAE;AACxB,QAAI,CAAC,KAAK;AACR,cAAQ,OAAO,MAAM,kBAAa,KAAK,CAAC,IAAI,QAAQ,MAAM,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAGrF,UAAM,eAAe,MAAM,QAAQ;AAAA,MACjC,MAAM,IAAI,OAAO,WAAW;AAC1B,cAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AAC9C,YAAI,CAAC,KAAM,QAAO,EAAE,QAAQ,MAAM,IAAI,MAAM,IAAI,SAAS,MAAM;AAG/D,cAAM,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,MAAM;AAChD,YAAI,UAAU,KAAK;AACnB,YAAI,KAAK,SAAS,GAAG;AACnB,gBAAM,aAAa,KAChB,IAAI,CAAC,MAAM;AACV,kBAAM,YAAY,QAAQ,IAAI,EAAE,IAAI;AACpC,mBAAO,YAAY,IAAI,EAAE,IAAI,aAAa,SAAS,KAAK;AAAA,UAC1D,CAAC,EACA,OAAO,OAAO,EACd,KAAK,MAAM;AACd,cAAI,YAAY;AACd,sBAAU;AAAA,EAAsB,UAAU;AAAA;AAAA,aAAkB,KAAK,IAAI;AAAA,UACvE;AAAA,QACF;AAEA,cAAM,OAAO,MAAM,IAAI,SAAS;AAAA,UAC9B,OAAO;AAAA,UACP,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,UACpB,QAAQ;AAAA,QACV,CAAC;AAED,eAAO,EAAE,QAAQ,MAAM,KAAK,MAAM,MAAM,SAAS,KAAK;AAAA,MACxD,CAAC;AAAA,IACH;AAEA,eAAW,KAAK,cAAc;AAC5B,UAAI,EAAE,WAAW,aAAa;AAC5B,gBAAQ,IAAI,EAAE,MAAM,QAAQ,EAAE,MAAM,IAAI;AACxC,oBAAY;AAAA,UACV,IAAI,gBAAgB,EAAE,MAAM,QAAQ,EAAE,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,OAAO;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,IAAI;AAGpB,QAAM,YAAY,QAAQ,QAAQ,SAAS,CAAC,KAAK,CAAC;AAClD,QAAM,mBAAmB,UAAU,IAAI,CAAC,OAAO,QAAQ,IAAI,EAAE,CAAC,EAAE,OAAO,OAAO;AAC9E,QAAM,cAAc,iBAAiB,SAAS,IAAI,iBAAiB,KAAK,MAAM,IAAI;AAElF,QAAM,UAAU,YACb;AAAA,IACC,CAAC,OACC,IAAI,GAAG,MAAM,KAAK,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,IAAU,GAAG,OAAO,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,OAAO,SAAS,MAAM,QAAQ,EAAE;AAAA,EACjH,EACC,KAAK,MAAM;AAEd,SAAO,IAAI,YAAY,SAAS,aAAa,aAAa,IAAI,EAAE;AAClE;AAUA,SAAS,UAAU,OAA8B,CAAC,GAAY;AAC5D,QAAM,SAAS,EAAE,GAAGD,WAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SACuC;AAC1C,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,UAAU,EAAE,GAAG,QAAQ,GAAI,OAAiC,CAAC;AAAA,IACtE;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAC,SAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAe;AACb,UAAI,CAAC,OAAQ,UAAS,UAAU,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AAC1D,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAa,UAAU;;;AC1PpC,IAAMC,YAA0B;AAAA,EAC9B,WAAW;AAAA,EACX,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,IAAMC,aAAsC;AAAA,EAC1C,GAAG,CAAC,gDAA2C,gDAA2C;AAAA,EAC1F,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAIO,IAAM,cAAN,MAAkB;AAAA,EACvB,YACkB,MACA,OACA,SAChB;AAHgB;AACA;AACA;AAAA,EACf;AAAA,EAHe;AAAA,EACA;AAAA,EACA;AAEpB;AAEO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,YACE,MACgB,WACA,SAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AALd;AACA;AAAA,EAKlB;AAAA,EANkB;AAAA,EACA;AAMpB;AAIA,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWtB,IAAM,sBAAsB;AAE5B,SAAS,kBAAkB,MAAc,OAAe,SAAyB;AAC/E,SAAO,cAAc,QAAQ,UAAU,IAAI,EACxC,QAAQ,WAAW,KAAK,EACxB,QAAQ,aAAa,WAAW,wDAAwD;AAC7F;AAEA,eAAeC,SACb,QACA,MACA,MACuB;AACvB,QAAM,QAAQ,MAAM,QAAQ,IAAI;AAChC,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,aAAa,KAAK,UAAU;AAClC,QAAM,cAAc,KAAK,UAAU;AACnC,QAAM,QAAQ,KAAK,SAASD,WAAU,UAAU,KAAKA,WAAU,CAAC,KAAK,CAAC;AAEtE,QAAM,eAAe,KAAK,gBAAgB,KAAK;AAC/C,QAAM,cAAc,KAAK,eAAe,KAAK;AAE7C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,gCAAsB,UAAU,cAAc,WAAW;AAAA,CAAa;AAC3F,YAAQ,OAAO,MAAM,aAAa,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,SAAS,KAAK,QAAQ,EAAE;AAAA,CAAK;AAAA,EAC5F;AAEA,QAAM,UAAyB,CAAC;AAChC,MAAI,aAAa;AAEjB,WAAS,QAAQ,GAAG,SAAS,aAAa,SAAS;AACjD,QAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,kBAAa,KAAK,IAAI,WAAW;AAAA,CAAI;AAG3E,UAAM,eAAe,MAAM,QAAQ;AAAA,MACjC,MAAM,IAAI,OAAO,SAAS;AACxB,cAAM,SAAS,kBAAkB,MAAM,OAAO,UAAU;AACxD,cAAM,OAAO,MAAM,IAAI,QAAQ;AAAA,UAC7B,OAAO;AAAA,UACP,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,QACtB,CAAC;AACD,eAAO,EAAE,MAAM,KAAK;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,eAAW,KAAK,cAAc;AAC5B,UAAI,EAAE,WAAW,aAAa;AAC5B,gBAAQ,KAAK,IAAI,YAAY,EAAE,MAAM,MAAM,OAAO,EAAE,MAAM,IAAI,CAAC;AAC/D,sBAAc;AAAA,GAAM,EAAE,MAAM,IAAI,WAAW,KAAK,KAAK,EAAE,MAAM,IAAI;AAAA;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,sCAAiC;AAEvE,QAAM,YAAY,MAAM;AAAA,IACtB,UAAU,KAAK;AAAA;AAAA;AAAA,EAA6B,UAAU;AAAA;AAAA;AAAA,IACtD;AAAA,MACE,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB,eAAe;AAAA,MACf,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,IAAI;AAEpB,QAAM,UAAU,QACb;AAAA,IACC,CAAC,MACC,IAAI,EAAE,IAAI,WAAW,EAAE,KAAK,KAAK,EAAE,QAAQ,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,QAAQ,SAAS,MAAM,QAAQ,EAAE;AAAA,EAClG,EACC,KAAK,IAAI;AAEZ,SAAO,IAAI,aAAa,SAAS,WAAW,SAAS,IAAI,EAAE;AAC7D;AAUA,SAAS,WAAW,OAA+B,CAAC,GAAa;AAC/D,QAAM,SAAS,EAAE,GAAGD,WAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SACyC;AAC5C,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,WAAW,EAAE,GAAG,QAAQ,GAAI,OAAkC,CAAC;AAAA,IACxE;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAE,SAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAgB;AACd,UAAI,CAAC,OAAQ,UAAS,WAAW,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AAC3D,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAc,WAAW;;;AC/KtC,IAAMC,YAAsB;AAAA,EAC1B,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,WAAW;AACb;AAIO,IAAM,SAAN,MAAa;AAAA,EAClB,YAEkB,MAEA,WAEA,MAChB;AALgB;AAEA;AAEA;AAAA,EACf;AAAA,EALe;AAAA,EAEA;AAAA,EAEA;AAEpB;AAEO,IAAM,WAAN,cAAuB,cAAc;AAAA,EAC1C,YACE,MAEgB,iBAEA,UAEA,mBAEA,aAEA,WAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AAZd;AAEA;AAEA;AAEA;AAEA;AAAA,EAKlB;AAAA,EAbkB;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAMpB;AAIA,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBzB,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWxB,IAAMC,kBAAiB,CAAC,SACtB,aAAa,KAAK,IAAI,gBAAgB,KAAK,SAAS,WAAW,KAAK,IAAI;AAE1E,IAAMC,oBAAmB;AAIzB,eAAe,eAAe,MAAc,MAAoC;AAC9E,MAAI,KAAK,SAAS,KAAK,MAAM,SAAS,EAAG,QAAO,KAAK;AAErD,QAAM,MAAM,KAAK,aAAa;AAC9B,QAAM,MAAM,KAAK,aAAa;AAE9B,QAAM,SAAS,iBAAiB,QAAQ,SAAS,OAAO,GAAG,CAAC,EAAE,QAAQ,SAAS,OAAO,GAAG,CAAC;AAE1F,QAAM,WAAW,MAAM,IAAI,SAAS,IAAI;AAAA;AAAA,EAAO,MAAM,IAAI;AAAA,IACvD,OAAO,KAAK,gBAAgB,KAAK;AAAA,IACjC,WAAW;AAAA,IACX,eAAe;AAAA,EACjB,CAAC;AAED,QAAM,QAAkB,CAAC;AAEzB,QAAM,aAAa,SAAS,MAAM,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;AAErE,aAAW,SAAS,YAAY;AAC9B,UAAM,YAAY,MAAM,MAAM,kBAAkB;AAChD,UAAM,iBAAiB,MAAM,MAAM,uBAAuB;AAC1D,UAAM,YAAY,MAAM,MAAM,kBAAkB;AAEhD,QAAI,aAAa,kBAAkB,WAAW;AAC5C,YAAM,KAAK,IAAI,OAAO,UAAU,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;AAAA,IAC3F;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AAEtB,UAAM,QAAQ,SACX,MAAM,IAAI,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,UAAM,gBAAgB,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,MAAM,MAAM;AACzD,YAAM,QAAQ,KAAK,QAAQ,mBAAmB,EAAE,EAAE,MAAM,GAAG,EAAE;AAC7D,aAAO,IAAI,OAAO,SAAS,IAAI,CAAC,IAAI,OAAO,qBAAqB,KAAK,EAAE;AAAA,IACzE,CAAC;AACD,WAAO,cAAc,SAAS,IAC1B,gBACA,CAAC,IAAI,OAAO,cAAc,0BAA0B,IAAI,CAAC;AAAA,EAC/D;AAEA,SAAO,MAAM,MAAM,GAAG,GAAG;AAC3B;AAIA,eAAe,eACb,OACA,MACA,MAC+E;AAC/E,MAAI,MAAM,UAAU;AAClB,WAAO,EAAE,UAAU,YAAY,WAAW,sCAAiC;AAE7E,QAAM,YAAY,MAAM,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI;AAEjF,QAAM,WAAW,MAAM;AAAA,IACrB,SAAS,IAAI;AAAA;AAAA;AAAA,EAAe,SAAS;AAAA;AAAA;AAAA,IACrC;AAAA,MACE,OAAO,KAAK,gBAAgB,KAAK;AAAA,MACjC,WAAW;AAAA,MACX,eAAe;AAAA,MACf,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,UAAU,SAAS,MAAM,sBAAsB;AACrD,QAAM,cAAc,SAAS,MAAM,uBAAuB;AAE1D,QAAM,eAAe,UAAU,CAAC,KAAK,YAAY,KAAK,EAAE,YAAY;AACpE,QAAM,WAAgD,YAAY,WAAW,KAAK,IAC9E,eACA,YAAY,WAAW,KAAK,IAC1B,UACA;AAEN,SAAO;AAAA,IACL;AAAA,IACA,WAAW,cAAc,CAAC,GAAG,KAAK,KAAK;AAAA,EACzC;AACF;AAIA,eAAe,aACb,OACA,MACA,UACA,MAC6C;AAC7C,QAAM,cAAc,KAAK,eAAe,KAAK;AAC7C,QAAM,UAA8C,CAAC;AAErD,MAAI,aAAa,cAAc;AAE7B,QAAI,UAAU;AACd,eAAW,QAAQ,OAAO;AACxB,YAAM,SAAS,MAAM,IAAI,SAAS;AAAA,QAChC,OAAO;AAAA,QACP,WAAW,KAAK;AAAA,QAChB,eAAe,KAAK;AAAA,QACpB,QAAQD,gBAAe,IAAI;AAAA,MAC7B,CAAC;AACD,cAAQ,KAAK,EAAE,MAAM,KAAK,MAAM,OAAO,CAAC;AACxC,gBAAU,wBAAwB,KAAK,IAAI;AAAA,EAAM,MAAM;AAAA;AAAA,iBAAsB,IAAI;AAAA,IACnF;AAAA,EACF,OAAO;AAEL,UAAM,kBAAkB,MAAM,QAAQ;AAAA,MACpC,MAAM;AAAA,QAAI,CAAC,SACT,IAAI,MAAM;AAAA,UACR,OAAO;AAAA,UACP,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,UACpB,QAAQA,gBAAe,IAAI;AAAA,QAC7B,CAAC,EACE,KAAK,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK,EAAE,EAClD,MAAM,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,QAAQ,YAAY,OAAO,GAAG,CAAC,IAAI,EAAE;AAAA,MAC7E;AAAA,IACF;AACA,eAAW,KAAK,iBAAiB;AAC/B,UAAI,EAAE,WAAW,YAAa,SAAQ,KAAK,EAAE,KAAK;AAAA,IACpD;AAAA,EACF;AAEA,SAAO;AACT;AAIA,eAAe,WACb,MACA,SACA,MACiB;AACjB,QAAM,cAAc,QAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI;AAAA,EAAS,EAAE,MAAM,EAAE,EAAE,KAAK,MAAM;AAEpF,SAAO;AAAA,IACL;AAAA,EAAmB,IAAI;AAAA;AAAA;AAAA,EAA6B,WAAW;AAAA;AAAA;AAAA,IAC/D;AAAA,MACE,OAAO,KAAK,gBAAgB,KAAK;AAAA,MACjC,WAAW,KAAK;AAAA,MAChB,eAAe;AAAA,MACf,QAAQC;AAAA,IACV;AAAA,EACF;AACF;AAIA,eAAeC,SACb,QACA,MACA,MACmB;AACnB,QAAM,OAAO,MAAM,QAAQ,IAAI;AAC/B,QAAM,KAAK,KAAK,IAAI;AAEpB,QAAM,eAAe,KAAK,gBAAgB,KAAK;AAE/C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO;AAAA,MACb,yCAA+B,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,SAAS,KAAK,QAAQ,EAAE;AAAA;AAAA,IAClF;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,iCAA4B;AAClE,QAAM,QAAQ,MAAM,eAAe,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC;AAElE,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,YAAO,MAAM,MAAM;AAAA,CAAsB;AAC9D,eAAW,KAAK,OAAO;AACrB,cAAQ,OAAO;AAAA,QACb,SAAS,EAAE,IAAI,KAAK,EAAE,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,SAAS,KAAK,QAAQ,EAAE;AAAA;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,iCAA4B;AAClE,QAAM,EAAE,UAAU,UAAU,IAAI,MAAM,eAAe,OAAO,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC;AAE3F,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,sBAAiB,QAAQ;AAAA,CAAI;AAClD,YAAQ,OAAO;AAAA,MACb,uBAAkB,UAAU,MAAM,GAAG,EAAE,CAAC,GAAG,UAAU,SAAS,KAAK,QAAQ,EAAE;AAAA;AAAA,IAC/E;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,uBAAkB,QAAQ;AAAA,CAAQ;AACxE,QAAM,cAAc,MAAM,aAAa,OAAO,MAAM,UAAU,IAAI;AAGlE,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,4BAAuB;AAC7D,QAAM,YAAY,MAAM,WAAW,MAAM,aAAa,EAAE,GAAG,MAAM,aAAa,CAAC;AAE/E,QAAM,KAAK,KAAK,IAAI;AAEpB,QAAM,UAAU;AAAA,IACd,UAAU,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IAC7C,aAAa,QAAQ,KAAK,SAAS;AAAA,IACnC,YAAY,YAAY,MAAM,IAAI,MAAM,MAAM;AAAA,IAC9C,cAAc,SAAS;AAAA,EACzB,EAAE,KAAK,MAAM;AAEb,SAAO,IAAI,SAAS,SAAS,OAAO,UAAU,WAAW,aAAa,WAAW,IAAI,EAAE;AACzF;AAUA,SAAS,OAAO,OAA2B,CAAC,GAAS;AACnD,QAAM,SAAS,EAAE,GAAGH,WAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SACiC;AACpC,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,OAAO,EAAE,GAAG,QAAQ,GAAI,OAA8B,CAAC;AAAA,IAChE;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAG,SAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAY;AACV,UAAI,CAAC,OAAQ,UAAS,OAAO,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AACvD,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAU,OAAO;;;AC3U9B,IAAMC,aAAgC;AAAA,EACpC,WAAW;AAAA,EACX,eAAe;AAAA,EACf,SAAS;AAAA,EACT,aAAa;AACf;AAIO,IAAM,2BAAN,MAA+B;AAAA,EACpC,YAEkB,MAEA,QAEA,SAChB;AALgB;AAEA;AAEA;AAAA,EACf;AAAA,EALe;AAAA,EAEA;AAAA,EAEA;AAEpB;AAEO,IAAM,qBAAN,cAAiC,cAAc;AAAA,EACpD,YACE,MAEgB,MAEA,WAEA,eAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AARd;AAEA;AAEA;AAAA,EAKlB;AAAA,EATkB;AAAA,EAEA;AAAA,EAEA;AAMpB;AAIA,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBvB,IAAM,gBAAgB;AAEtB,IAAMC,oBAAmB;AAIzB,eAAeC,UACb,QACA,MACA,MAC6B;AAC7B,QAAM,UAAU,MAAM,QAAQ,IAAI;AAClC,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,cAAc,KAAK,WAAW;AAGpC,QAAM,eAAe,KAAK,gBAAgB,KAAK;AAC/C,QAAM,cAAc,KAAK,eAAe,KAAK;AAE7C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO;AAAA,MACb,gCAAsB,QAAQ,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,SAAS,KAAK,QAAQ,EAAE;AAAA;AAAA,IAC/E;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,wBAAmB;AACzD,QAAM,WAAW,MAAM,IAAI,SAAS;AAAA,IAClC,OAAO;AAAA,IACP,WAAW,KAAK;AAAA,IAChB,eAAe;AAAA,IACf,QAAQ,eAAe,QAAQ,kBAAkB,OAAO,WAAW,CAAC;AAAA,EACtE,CAAC;AAGD,QAAM,WAAqB,CAAC;AAC5B,QAAM,YAAY,SAAS,MAAM,IAAI;AACrC,MAAI,UAAU;AACd,aAAW,QAAQ,WAAW;AAC5B,QAAI,KAAK,MAAM,cAAc,GAAG;AAC9B,gBAAU;AACV;AAAA,IACF;AACA,QAAI,WAAW,KAAK,MAAM,YAAY,GAAG;AACvC,eAAS,KAAK,KAAK,QAAQ,eAAe,EAAE,EAAE,KAAK,CAAC;AAAA,IACtD;AAAA,EACF;AAGA,QAAM,QAAQ,SAAS,SAAS,IAAI,SAAS,MAAM,GAAG,WAAW,IAAI,CAAC,OAAO;AAE7E,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,YAAO,MAAM,MAAM;AAAA,CAA2B;AACnE,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,IAAI,MAAM,CAAC;AACjB,cAAQ,OAAO,MAAM,UAAU,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,CAAI;AAAA,IAC1F;AAAA,EACF;AAGA,QAAM,gBAA4C,CAAC;AACnD,QAAM,cAAc,KAAK,eAAe;AAExC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,aAAa;AAClD,UAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,WAAW;AAC5C,UAAM,eAAe,MAAM,QAAQ;AAAA,MACjC,MAAM;AAAA,QAAI,CAAC,SACT,IAAI,MAAM;AAAA,UACR,OAAO;AAAA,UACP,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,UACpB,QAAQ;AAAA,QACV,CAAC,EACE,KAAK,CAAC,SAAS,IAAI,yBAAyB,MAAM,MAAM,IAAI,CAAC,EAC7D,MAAM,CAAC,QAAQ,IAAI,yBAAyB,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC;AAAA,MAC1E;AAAA,IACF;AACA,iBAAa,QAAQ,CAAC,MAAM;AAC1B,UAAI,EAAE,WAAW,YAAa,eAAc,KAAK,EAAE,KAAK;AAAA,IAC1D,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,oCAA+B;AAErE,QAAM,cAAc,cACjB,IAAI,CAAC,IAAI,MAAM,QAAQ,IAAI,CAAC,KAAK,GAAG,IAAI;AAAA,UAAa,GAAG,MAAM,EAAE,EAChE,KAAK,MAAM;AAEd,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,EAAsB,OAAO;AAAA;AAAA;AAAA,EAAc,QAAQ;AAAA;AAAA;AAAA,EAAwB,WAAW;AAAA;AAAA;AAAA,IACtF;AAAA,MACE,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB,eAAe;AAAA,MACf,QAAQD;AAAA,IACV;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,IAAI;AAEpB,QAAM,UAAU;AAAA,EAAU,QAAQ;AAAA;AAAA,WAAgB,cAAc,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,cAAc,MAAM;AAAA;AAAA;AAAA,EAA6B,SAAS;AAE7J,SAAO,IAAI,mBAAmB,SAAS,UAAU,WAAW,eAAe,IAAI,EAAE;AACnF;AAUA,SAAS,iBAAiB,OAAqC,CAAC,GAAmB;AACjF,QAAM,SAAS,EAAE,GAAGD,YAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SACqD;AACxD,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,iBAAiB,EAAE,GAAG,QAAQ,GAAI,OAAwC,CAAC;AAAA,IACpF;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAE,UAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAsB;AACpB,UAAI,CAAC,OAAQ,UAAS,iBAAiB,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AACjE,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAoB,iBAAiB;;;AC3LlD,IAAMC,aAA4B;AAAA,EAChC,WAAW;AAAA,EACX,eAAe;AACjB;AAIO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAEkB,OAEA,QAEA,OAChB;AALgB;AAEA;AAEA;AAAA,EACf;AAAA,EALe;AAAA,EAEA;AAAA,EAEA;AAEpB;AAEO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,YACE,MAEgB,aAEA,QAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AANd;AAEA;AAAA,EAKlB;AAAA,EAPkB;AAAA,EAEA;AAMpB;AAIA,SAAS,YAAY,UAAkB,gBAA2B,WAA8B;AAC9F,MAAI,kBAAkB,eAAe,SAAS,EAAG,QAAO;AAExD,QAAM,MAAM,aAAa;AACzB,QAAM,SAAS,QAAQ,WAAM,OAAO;AAGpC,QAAM,QAAQ,SACX,MAAM,GAAG,EACT,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,EAC9B,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAEjB,MAAI,MAAM,SAAS,EAAG,QAAO;AAG7B,QAAM,SAAS,SACZ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,MAAI,OAAO,SAAS,EAAG,QAAO;AAG9B,QAAM,SAAS,SACZ,MAAM,IAAI,EACV;AAAA,IAAI,CAAC,MACJ,EACG,KAAK,EACL,QAAQ,eAAe,EAAE,EACzB,QAAQ,YAAY,EAAE;AAAA,EAC3B,EACC,OAAO,OAAO;AACjB,MAAI,OAAO,SAAS,EAAG,QAAO;AAG9B,SAAO,CAAC,QAAQ;AAClB;AAIA,SAAS,oBAAoB,OAAe,gBAAwB,SAA0B;AAC5F,MAAI,SAAS;AACX,WAAO,SAAS,KAAK;AAAA;AAAA;AAAA,EACvB;AACA,SAAO;AAAA,EAA2B,cAAc;AAAA;AAAA,iBAAsB,KAAK;AAAA;AAAA;AAC7E;AAIA,eAAeC,UACb,QACA,MACA,MACyB;AACzB,QAAM,WAAW,MAAM,QAAQ,IAAI;AACnC,QAAM,SAAS,YAAY,UAAU,KAAK,QAAQ,KAAK,SAAS;AAChE,QAAM,KAAK,KAAK,IAAI;AAGpB,QAAM,cAAc,KAAK,eAAe,KAAK;AAE7C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,2BAAiB,OAAO,MAAM;AAAA,CAAa;AAChE,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAQ,OAAO,MAAM,MAAM,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC;AAAA,CAAI;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,eAAsC,CAAC;AAC7C,MAAI,eAAe;AAEnB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,QAAQ,OAAO,CAAC;AACtB,UAAM,eAAe,KAAK,eAAe,CAAC;AAE1C,QAAI,CAAC,KAAK;AACR,cAAQ,OAAO,MAAM,kBAAa,IAAI,CAAC,IAAI,OAAO,MAAM,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC;AAAA,CAAO;AAExF,UAAM,SAAS,gBAAgB,oBAAoB,OAAO,cAAc,MAAM,CAAC;AAC/E,UAAM,gBACJ,MAAM,IACF,wCAAwC,IAAI,CAAC,KAAK,KAAK,yCACvD,wCAAwC,IAAI,CAAC,KAAK,KAAK;AAE7D,UAAM,SAAS,MAAM,IAAI,QAAQ;AAAA,MAC/B,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK;AAAA,MACpB,QAAQ;AAAA,IACV,CAAC;AAED,iBAAa,KAAK,IAAI,oBAAoB,OAAO,QAAQ,CAAC,CAAC;AAC3D,mBAAe;AAAA,EACjB;AAEA,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,cAAc;AAEpB,QAAM,UAAU,aACb;AAAA,IACC,CAAC,OACC,SAAS,GAAG,QAAQ,CAAC,KAAK,GAAG,KAAK;AAAA,EAAO,GAAG,OAAO,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,OAAO,SAAS,MAAM,QAAQ,EAAE;AAAA,EAC1G,EACC,KAAK,MAAM;AAEd,SAAO,IAAI,eAAe,SAAS,aAAa,cAAc,IAAI,EAAE;AACtE;AAUA,SAAS,aAAa,OAAiC,CAAC,GAAe;AACrE,QAAM,SAAS,EAAE,GAAGD,YAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SAC6C;AAChD,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,aAAa,EAAE,GAAG,QAAQ,GAAI,OAAoC,CAAC;AAAA,IAC5E;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAC,UAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAkB;AAChB,UAAI,CAAC,OAAQ,UAAS,aAAa,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AAC7D,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAgB,aAAa;;;ACvM1C,SAAS,0BAA0B;AAqBnC,IAAMC,aAAyB;AAAA,EAC7B,eAAe;AAAA,EACf,UAAU;AAAA,EACV,eAAe;AAAA,EACf,eAAe;AAAA,EACf,WAAW;AACb;AAIO,IAAM,cAAN,cAA0B,cAAc;AAAA,EAC7C,YACE,MAEgB,gBAEA,WAEA,YAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AARd;AAEA;AAEA;AAAA,EAKlB;AAAA,EATkB;AAAA,EAEA;AAAA,EAEA;AAMpB;AAYA,eAAe,iBAAiB,MAAc,MAAqC;AAEjF,QAAM,aAAa,KAAK,QAAQ,UAAU,KAAK,KAAK,IAAI;AACxD,MAAI,KAAK,SAAS,CAAC,YAAY;AAC7B,UAAM,IAAI;AAAA,MACR,kCAA6B,KAAK,KAAK;AAAA,IACzC;AAAA,EACF;AACA,QAAM,EAAE,QAAQ,IAAI,MAAM,mBAAmB;AAAA,IAC3C,OAAO,CAAC,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,IAAI;AAAA,IACrD,GAAI,aAAa,EAAE,OAAO,WAAW,IAAI,CAAC;AAAA,EAC5C,CAAC;AACD,MAAI;AACF,UAAM,QAAQ,gBAAgB,IAAI;AAElC,UAAM,OAAQ,QAAgB,YAAY,CAAC;AAC3C,aAAS,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACzC,UAAI,KAAK,CAAC,EAAE,SAAS,aAAa;AAChC,cAAM,IAAI,KAAK,CAAC,EAAE;AAClB,YAAI,OAAO,MAAM,SAAU,QAAO,EAAE,KAAK;AACzC,YAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,gBAAM,QAAQ,EACX;AAAA,YACC,CAAC,MACC,EAAE,SAAS,UAAU,OAAO,EAAE,SAAS;AAAA,UAC3C,EACC,IAAI,CAAC,MAAwB,EAAE,IAAI;AACtC,cAAI,MAAM,SAAS,EAAG,QAAO,MAAM,KAAK,EAAE,EAAE,KAAK;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,UAAE;AACA,YAAQ,QAAQ;AAAA,EAClB;AACF;AAIA,IAAMC,mBAAkB;AAExB,IAAMC,eAAc;AAEpB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAOtB,eAAeC,UACb,QACA,MACA,MACsB;AACtB,QAAM,OAAO,MAAM,QAAQ,IAAI;AAC/B,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,aAAsC,CAAC;AAG7C,QAAM,eAAe,KAAK,gBAAgB,KAAK;AAC/C,QAAM,cAAc,KAAK,eAAe,KAAK;AAE7C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,8BAAoB,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,SAAS,KAAK,QAAQ,EAAE;AAAA,CAAK;AAAA,EACjG;AAEA,MAAI,cAAc;AAClB,MAAI,YAAY;AAEhB,SAAO,cAAc,KAAK,iBAAiB,IAAI;AAC7C,QAAI,CAAC,KAAK,OAAO;AACf,cAAQ,OAAO,MAAM,qBAAgB,SAAS,IAAI,KAAK,aAAa;AAAA,CAAI;AAAA,IAC1E;AAGA,QAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,yBAAoB;AAC1D,UAAM,WAAW,MAAM,IAAI,aAAa;AAAA,MACtC,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK;AAAA,MACpB,QAAQF;AAAA,IACV,CAAC;AAGD,QAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,wBAAmB;AACzD,UAAM,OAAO,MAAM;AAAA,MACjB,SAAS,WAAW;AAAA;AAAA,YAAiB,QAAQ;AAAA;AAAA;AAAA,MAC7C;AAAA,QACE,OAAO;AAAA,QACP,WAAW,KAAK;AAAA,QAChB,eAAe,KAAK;AAAA,QACpB,QAAQC;AAAA,MACV;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,yBAAoB;AAC1D,UAAM,SAAS,KAAK,WAChB,MAAM,iBAAiB;AAAA,EAAyB,IAAI;AAAA;AAAA,QAAa,WAAW,IAAI;AAAA,MAC9E,GAAG;AAAA,MACH,OAAO;AAAA,IACT,CAAC,IACD,MAAM,IAAI;AAAA,EAAyB,IAAI;AAAA;AAAA,QAAa,WAAW,IAAI;AAAA,MACjE,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK;AAAA,IACtB,CAAC;AAGL,QAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,yBAAoB;AAC1D,UAAM,SAAS,MAAM,IAAI;AAAA,EAAU,IAAI;AAAA;AAAA;AAAA,EAAgB,MAAM;AAAA;AAAA,6BAAkC;AAAA,MAC7F,OAAO;AAAA,MACP,WAAW;AAAA,MACX,eAAe;AAAA,MACf,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,iBAAiB,OAAO,SAAS,SAAS,KAAK,CAAC,OAAO,SAAS,MAAM;AAE5E,eAAW,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,CAAC,gBAAgB;AACnB,UAAI,CAAC,KAAK;AACR,gBAAQ,OAAO,MAAM,2CAAsC,SAAS;AAAA,CAAiB;AACvF;AAAA,IACF;AAGA,kBAAc,sCAAsC,IAAI;AAAA,mBAAsB,MAAM;AAAA,iBAAoB,IAAI;AAC5G;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,UAAU,WACb;AAAA,IACC,CAAC,MACC,aAAa,EAAE,SAAS;AAAA,UAAc,EAAE,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,YAAkB,EAAE,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,EACtG,EACC,KAAK,IAAI;AAEZ,SAAO,IAAI;AAAA,IACT;AAAA,IACA,WAAW;AAAA,IACX,cAAc,KAAK,iBAAiB;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAUA,SAAS,UAAU,OAA8B,CAAC,GAAY;AAC5D,QAAM,SAAS,EAAE,GAAGF,YAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SACuC;AAC1C,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,UAAU,EAAE,GAAG,QAAQ,GAAI,OAAiC,CAAC;AAAA,IACtE;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAG,UAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAe;AACb,UAAI,CAAC,OAAQ,UAAS,UAAU,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AAC1D,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAa,UAAU;;;AC3OpC,IAAMC,aAA4B;AAAA,EAChC,WAAW;AAAA,EACX,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AACf;AAIO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAEkB,SAEA,MAEA,SAChB;AALgB;AAEA;AAEA;AAAA,EACf;AAAA,EALe;AAAA,EAEA;AAAA,EAEA;AAEpB;AAEO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,YACE,MAEgB,WAEA,YAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AANd;AAEA;AAAA,EAKlB;AAAA,EAPkB;AAAA,EAEA;AAMpB;AAIA,IAAM,mBAAmB;AAEzB,IAAMC,oBAAmB;AAEzB,eAAe,cAAc,MAAc,MAA0C;AACnF,MAAI,KAAK,cAAc,KAAK,WAAW,SAAS,EAAG,QAAO,KAAK;AAE/D,QAAM,SAAS,MAAM;AAAA,IACnB,4BAA4B,KAAK,eAAe,CAAC;AAAA;AAAA,EAAgE,IAAI;AAAA;AAAA;AAAA,IACrH;AAAA,MACE,OAAO,KAAK;AAAA,MACZ,WAAW;AAAA,MACX,eAAe;AAAA,MACf,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI;AAEF,UAAM,YAAY,OAAO,MAAM,aAAa;AAC5C,QAAI,WAAW;AACb,YAAM,SAAS,KAAK,MAAM,UAAU,CAAC,CAAC;AACtC,UAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,GAAG;AAC9C,eAAO,OAAO,IAAI,MAAM,EAAE,MAAM,GAAG,KAAK,eAAe,CAAC;AAAA,MAC1D;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,SAAO,OACJ,MAAM,IAAI,EACV;AAAA,IAAI,CAAC,MACJ,EACG,QAAQ,eAAe,EAAE,EACzB,QAAQ,YAAY,EAAE,EACtB,KAAK;AAAA,EACV,EACC,OAAO,OAAO,EACd,MAAM,GAAG,KAAK,eAAe,CAAC;AACnC;AAEA,IAAM,kBAAkB;AAExB,eAAeC,UACb,QACA,MACA,MACyB;AACzB,QAAM,OAAO,MAAM,QAAQ,IAAI;AAC/B,QAAM,KAAK,KAAK,IAAI;AAGpB,QAAM,eAAe,KAAK,gBAAgB,KAAK;AAC/C,QAAM,cAAc,KAAK,eAAe,KAAK;AAE7C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO;AAAA,MACb,uCAA6B,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,SAAS,KAAK,QAAQ,EAAE;AAAA;AAAA,IAChF;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,+CAA0C;AAChF,QAAM,WAAW,MAAM,cAAc,MAAM,EAAE,GAAG,MAAM,OAAO,aAAa,CAAC;AAE3E,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,YAAO,SAAS,MAAM;AAAA,CAA4B;AACvE,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,KAAK,SAAS,CAAC;AACrB,cAAQ,OAAO,MAAM,UAAU,IAAI,CAAC,KAAK,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG,GAAG,SAAS,KAAK,QAAQ,EAAE;AAAA,CAAI;AAAA,IAC5F;AAAA,EACF;AAGA,QAAM,aAA+B,CAAC;AACtC,QAAM,cAAc,KAAK,eAAe;AAExC,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,aAAa;AACrD,UAAM,QAAQ,SAAS,MAAM,GAAG,IAAI,WAAW;AAC/C,UAAM,eAAe,MAAM,QAAQ;AAAA,MACjC,MAAM;AAAA,QAAI,CAAC,OACT,IAAI,IAAI;AAAA,UACN,OAAO;AAAA,UACP,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,UACpB,QAAQ;AAAA,QACV,CAAC,EACE,KAAK,CAAC,SAAS,IAAI,eAAe,IAAI,MAAM,IAAI,CAAC,EACjD,MAAM,CAAC,QAAQ,IAAI,eAAe,IAAI,OAAO,GAAG,GAAG,KAAK,CAAC;AAAA,MAC9D;AAAA,IACF;AACA,iBAAa,QAAQ,CAAC,MAAM;AAC1B,UAAI,EAAE,WAAW,YAAa,YAAW,KAAK,EAAE,KAAK;AAAA,IACvD,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,oCAA+B;AACrE,QAAM,iBAAiB,WACpB,IAAI,CAAC,IAAI,MAAM,YAAY,IAAI,CAAC,KAAK,GAAG,OAAO;AAAA,UAAa,GAAG,IAAI,EAAE,EACrE,KAAK,MAAM;AAEd,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,EAAmB,IAAI;AAAA;AAAA;AAAA,EAA0B,cAAc;AAAA;AAAA;AAAA,IAC/D;AAAA,MACE,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK;AAAA,MACpB,QAAQD;AAAA,IACV;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,IAAI;AAEpB,SAAO,IAAI,eAAe,WAAW,WAAW,YAAY,IAAI,EAAE;AACpE;AAUA,SAAS,aAAa,OAAiC,CAAC,GAAe;AACrE,QAAM,SAAS,EAAE,GAAGD,YAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SAC6C;AAChD,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,aAAa,EAAE,GAAG,QAAQ,GAAI,OAAoC,CAAC;AAAA,IAC5E;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAE,UAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAkB;AAChB,UAAI,CAAC,OAAQ,UAAS,aAAa,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AAC7D,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAgB,aAAa;;;AC/L1C,IAAMC,aAAuB;AAAA,EAC3B,WAAW;AAAA,EACX,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,QAAQ;AACV;AAIO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAEkB,OAEA,OAEA,WAEA,KAEA,SAChB;AATgB;AAEA;AAEA;AAEA;AAEA;AAAA,EACf;AAAA,EATe;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAEpB;AAEO,IAAM,YAAN,cAAwB,cAAc;AAAA,EAC3C,YACE,MAEgB,SAEA,YAEA,WAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AARd;AAEA;AAEA;AAAA,EAKlB;AAAA,EATkB;AAAA,EAEA;AAAA,EAEA;AAMpB;AAIA,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBtB,IAAM,eAAe,CAAC,MAAc,SAClC,aAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,sBAKG,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAU1B,IAAM,gBAAgB,CAAC,MAAc,SACnC,aAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,sBAKG,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAa1B,IAAM,qBAAqB;AAI3B,eAAe,aACb,MACA,MACkF;AAClF,QAAM,aAAa,KAAK,UAAU;AAElC,QAAM,SAAS,cAAc,QAAQ,gBAAgB,OAAO,UAAU,CAAC;AAEvE,QAAM,WAAW,MAAM,IAAI,SAAS,IAAI;AAAA;AAAA,EAAO,MAAM,IAAI;AAAA,IACvD,OAAO,KAAK,gBAAgB,KAAK;AAAA,IACjC,WAAW;AAAA,IACX,eAAe;AAAA,EACjB,CAAC;AAGD,QAAM,YAAY,SAAS,MAAM,kBAAkB;AACnD,QAAM,OAAO,YAAY,CAAC,GACtB,MAAM,GAAG,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,KAAK,CAAC,YAAY,SAAS,iBAAiB;AAG7D,QAAM,aAAa;AACnB,QAAM,QAAkB,CAAC;AACzB,QAAM,cAAc,oBAAI,IAAsB;AAE9C,MAAI;AAEJ,UAAQ,QAAQ,WAAW,KAAK,QAAQ,OAAO,MAAM;AACnD,UAAM,OAAO,MAAM,CAAC,EAAE,KAAK;AAC3B,UAAM,YAAY,MAAM,CAAC,EACtB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,UAAM,KAAK,IAAI;AACf,gBAAY,IAAI,MAAM,UAAU,SAAS,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;AAAA,EACjF;AAGA,MAAI,MAAM,WAAW,GAAG;AACtB,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,YAAM,OAAO,cAAc,IAAI,CAAC;AAChC,YAAM,KAAK,IAAI;AACf,YAAM,cAAc,KAAK,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI,CAAC;AACzD,kBAAY,IAAI,MAAM,CAAC,WAAW,CAAC;AAAA,IACrC;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,OAAO,MAAM,MAAM,GAAG,UAAU,GAAG,YAAY;AAChE;AAIA,SAAS,YAAY,OAAuC;AAC1D,QAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AACzD,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAO,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,MAAM;AAC5D;AAEA,SAAS,WAAW,OAA+B,KAAa,SAAuB;AACrF,MAAI,MAAM,GAAG,GAAG;AACd,UAAM,GAAG,KAAK;AAAA;AAAA,EAAO,OAAO;AAAA,EAC9B,OAAO;AACL,UAAM,GAAG,IAAI;AAAA,EACf;AACF;AAEA,eAAe,aACb,OACA,aACA,OACA,OACA,MAC0E;AAC1E,QAAM,cAAc,KAAK,eAAe,KAAK;AAC7C,QAAM,UAAU,UAAU;AAC1B,QAAM,YAAgC,UAAU,UAAU;AAE1D,QAAM,eAAe,MAAM,QAAQ;AAAA,IACjC,MAAM,IAAI,OAAO,SAAS;AACxB,YAAM,eAAe,YAAY,IAAI,IAAI,KAAK,CAAC,SAAS;AACxD,YAAM,UAAU,aAAa,KAAK,IAAI;AACtC,YAAM,YAAY,YAAY,KAAK;AAEnC,YAAM,eAAe,UACjB,aAAa,MAAM,OAAO,EAAE,QAAQ,WAAW,SAAS,IACxD,cAAc,MAAM,OAAO,EAAE,QAAQ,WAAW,SAAS;AAE7D,YAAM,OAAO,UACT,sDAAsD,OAAO,KAC7D,+DAA+D,OAAO;AAE1E,YAAM,WAAW,MAAM,IAAI,MAAM;AAAA,QAC/B,OAAO;AAAA,QACP,WAAW,KAAK;AAAA,QAChB,eAAe,KAAK;AAAA,QACpB,QAAQ;AAAA,MACV,CAAC;AAED,aAAO,EAAE,MAAM,SAAS;AAAA,IAC1B,CAAC;AAAA,EACH;AAEA,QAAM,UAA+B,CAAC;AACtC,QAAM,WAAW,EAAE,GAAG,MAAM;AAE5B,aAAW,KAAK,cAAc;AAC5B,QAAI,EAAE,WAAW,YAAa;AAC9B,UAAM,EAAE,MAAM,SAAS,IAAI,EAAE;AAG7B,UAAM,UAAU;AAChB,QAAI;AACJ,QAAI,QAAQ;AAGZ,YAAQ,UAAU,QAAQ,KAAK,QAAQ,OAAO,MAAM;AAClD,YAAM,MAAM,QAAQ,CAAC,EAAE,KAAK;AAC5B,YAAM,QAAQ,QAAQ,CAAC,EAAE,KAAK;AAC9B,cAAQ,KAAK,IAAI,kBAAkB,MAAM,OAAO,WAAW,KAAK,KAAK,CAAC;AACtE,iBAAW,UAAU,KAAK,KAAK;AAC/B,cAAQ;AAAA,IACV;AAGA,QAAI,CAAC,OAAO;AACV,YAAM,cAAc,YAAY,IAAI,IAAI,IAAI,CAAC,KAAK;AAClD,YAAM,UAAU,SAAS,KAAK;AAC9B,cAAQ,KAAK,IAAI,kBAAkB,MAAM,OAAO,WAAW,aAAa,OAAO,CAAC;AAChF,iBAAW,UAAU,aAAa,OAAO;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,OAAO,SAAS;AACpC;AAIA,eAAe,iBACb,MACA,OACA,MACiB;AACjB,QAAM,YAAY,YAAY,KAAK;AAEnC,SAAO;AAAA,IACL,kBAAkB,IAAI;AAAA;AAAA;AAAA;AAAA,EAAoD,SAAS;AAAA;AAAA;AAAA,IACnF;AAAA,MACE,OAAO,KAAK,gBAAgB,KAAK;AAAA,MACjC,WAAW,KAAK;AAAA,MAChB,eAAe;AAAA,MACf,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAIA,eAAeC,UACb,QACA,MACA,MACoB;AACpB,QAAM,OAAO,MAAM,QAAQ,IAAI;AAC/B,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,cAAc,KAAK,UAAU;AAEnC,QAAM,eAAe,KAAK,gBAAgB,KAAK;AAE/C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO;AAAA,MACb,+CAAqC,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,SAAS,KAAK,QAAQ,EAAE;AAAA;AAAA,IACxF;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,8CAAyC;AAC/E,QAAM,EAAE,MAAM,OAAO,YAAY,IAAI,MAAM,aAAa,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC;AAEvF,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,oBAAe,KAAK,KAAK,IAAI,CAAC;AAAA,CAAI;AACvD,YAAQ,OAAO,MAAM,YAAO,MAAM,MAAM,cAAc,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAC1E,eAAW,CAAC,MAAM,YAAY,KAAK,aAAa;AAC9C,cAAQ,OAAO,MAAM,SAAS,IAAI,WAAM,aAAa,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,IACrE;AAAA,EACF;AAGA,QAAM,aAAkC,CAAC;AACzC,MAAI,QAAgC,CAAC;AAErC,WAAS,QAAQ,GAAG,SAAS,aAAa,SAAS;AACjD,UAAM,QAAQ,UAAU,IAAI,YAAY;AACxC,QAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,kBAAa,KAAK,IAAI,WAAW,KAAK,KAAK;AAAA,CAAO;AAExF,UAAM,EAAE,SAAS,OAAO,aAAa,IAAI,MAAM;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,eAAW,KAAK,GAAG,OAAO;AAC1B,YAAQ;AAAA,EACV;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,mCAA8B;AACpE,QAAM,YAAY,MAAM,iBAAiB,MAAM,OAAO,EAAE,GAAG,MAAM,aAAa,CAAC;AAE/E,QAAM,KAAK,KAAK,IAAI;AAEpB,QAAM,UAAU;AAAA,IACd,gBAAgB,KAAK,KAAK,IAAI,CAAC;AAAA,IAC/B,WAAW,MAAM,KAAK,IAAI,CAAC;AAAA,IAC3B,WAAW,WAAW;AAAA,IACtB,YAAY,WAAW,MAAM;AAAA,IAC7B,cAAc,SAAS;AAAA,EACzB,EAAE,KAAK,MAAM;AAEb,SAAO,IAAI,UAAU,SAAS,YAAY,OAAO,WAAW,IAAI,EAAE;AACpE;AAUA,SAAS,QAAQ,OAA4B,CAAC,GAAU;AACtD,QAAM,SAAS,EAAE,GAAGD,YAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SACmC;AACtC,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,QAAQ,EAAE,GAAG,QAAQ,GAAI,OAA+B,CAAC;AAAA,IAClE;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAC,UAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAa;AACX,UAAI,CAAC,OAAQ,UAAS,QAAQ,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AACxD,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAW,QAAQ;;;AC5WhC,IAAMC,aAA0B;AAAA,EAC9B,WAAW;AAAA,EACX,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAMC,aAAsC;AAAA,EAC1C,GAAG,CAAC,8CAAyC,4CAAuC;AAAA,EACpF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAIO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YACkB,MACA,MACA,SAChB;AAHgB;AACA;AACA;AAAA,EACf;AAAA,EAHe;AAAA,EACA;AAAA,EACA;AAEpB;AAEO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,YACE,MACgB,YACA,UAChB,WACA,SACA;AACA,UAAM,MAAM,WAAW,OAAO;AALd;AACA;AAAA,EAKlB;AAAA,EANkB;AAAA,EACA;AAMpB;AAIA,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAStB,IAAMC,oBAAmB;AAEzB,SAAS,kBAAkB,MAAc,QAAwB;AAC/D,SAAO,cAAc,QAAQ,UAAU,IAAI,EAAE;AAAA,IAC3C;AAAA,IACA,UAAU;AAAA,EACZ;AACF;AAEA,eAAeC,UACb,QACA,MACA,MACuB;AACvB,QAAM,QAAQ,MAAM,QAAQ,IAAI;AAChC,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,aAAa,KAAK,UAAU;AAClC,QAAM,WAAW,KAAK,SAAS;AAC/B,QAAM,QAAQ,KAAK,SAASF,WAAU,UAAU,KAAKA,WAAU,CAAC,KAAK,CAAC;AAEtE,QAAM,eAAe,KAAK,gBAAgB,KAAK;AAC/C,QAAM,cAAc,KAAK,eAAe,KAAK;AAE7C,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,yBAAe,UAAU,cAAc,QAAQ;AAAA,CAAY;AAChF,YAAQ,OAAO,MAAM,aAAa,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,SAAS,KAAK,QAAQ,EAAE;AAAA,CAAK;AAAA,EAC5F;AAEA,QAAM,WAA4B,CAAC;AACnC,MAAI,SAAS,UAAU,KAAK;AAAA;AAG5B,WAAS,OAAO,GAAG,QAAQ,UAAU,QAAQ;AAC3C,QAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,iBAAY,IAAI,IAAI,QAAQ;AAAA,CAAI;AAEtE,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC,KAAK,SAAS,IAAI,CAAC;AACvC,YAAM,SAAS,kBAAkB,MAAM,MAAM;AAE7C,YAAM,WAAW,MAAM,IAAI,QAAQ;AAAA,QACjC,OAAO;AAAA,QACP,WAAW,KAAK;AAAA,QAChB,eAAe,KAAK;AAAA,MACtB,CAAC;AAED,eAAS,KAAK,IAAI,cAAc,MAAM,MAAM,QAAQ,CAAC;AACrD,gBAAU;AAAA,GAAM,IAAI,WAAW,IAAI,MAAM,QAAQ;AAAA;AAAA,IACnD;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,uCAAkC;AAExE,QAAM,aAAa,MAAM;AAAA,IACvB,UAAU,KAAK;AAAA;AAAA;AAAA,EAA6B,MAAM;AAAA;AAAA;AAAA,IAClD;AAAA,MACE,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB,eAAe;AAAA,MACf,QAAQC;AAAA,IACV;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,IAAI;AAEpB,QAAM,UAAU,SACb;AAAA,IACC,CAAC,MACC,IAAI,EAAE,IAAI,UAAU,EAAE,IAAI,KAAK,EAAE,QAAQ,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,QAAQ,SAAS,MAAM,QAAQ,EAAE;AAAA,EAChG,EACC,KAAK,IAAI;AAEZ,SAAO,IAAI,aAAa,SAAS,YAAY,UAAU,IAAI,EAAE;AAC/D;AAUA,SAAS,WAAW,OAA+B,CAAC,GAAa;AAC/D,QAAM,SAAS,EAAE,GAAGF,YAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SACyC;AAC5C,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,WAAW,EAAE,GAAG,QAAQ,GAAI,OAAkC,CAAC;AAAA,IACxE;AACA,WAAO,IAAI,eAAe,CAAC,SAAS,WAAW;AAC7C,MAAAG,UAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAgB;AACd,UAAI,CAAC,OAAQ,UAAS,WAAW,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AAC3D,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAc,WAAW;;;AClMtC;AAAA,EAEE,gBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,gBAAAC;AAAA,EAGA;AAAA,OAEK;;;ACbA,IAAM,WAAN,MAAe;AAAA,EACpB,YAEkB,MAEA,WAEA,SAA6B,CAAC,GAE9B,YAAoB,KAAK,IAAI,GAE7B,UAAkB,KAAK,IAAI,GAC3C;AATgB;AAEA;AAEA;AAEA;AAEA;AAAA,EACf;AAAA,EATe;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA;AAAA,EAIlB,IAAI,WAAmB;AACrB,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAAA,EAEA,WAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,CAAC,OAAO,WAAW,IAAY;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,SAAiB;AACnB,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA;AAAA,EAGA,IAAI,QAAgB;AAClB,WAAO,KAAK,KAAK,MAAM,IAAI,EAAE;AAAA,EAC/B;AACF;;;ADZA,IAAMC,aAAsB;AAAA,EAC1B,eAAe;AAAA,EACf,OAAO;AAAA,EACP,WAAW;AACb;AAGA,IAAIC;AAEJ,SAASC,iBAA4B;AACnC,MAAID,iBAAgB,QAAW;AAC7B,IAAAA,eAAc,cAAc,IAAI,eAAe,IAAI,CAAC;AAAA,EACtD;AACA,SAAOA;AACT;AAGA,SAASE,aAAY;AAEnB,QAAM,SAAuB,CAAC;AAC9B,aAAW,KAAKC,cAAa,GAAG;AAC9B,UAAM,KAAKC,WAAU,CAAC;AACtB,QAAI,MAAM,GAAG,SAAS,EAAG,QAAO,KAAK,GAAG,EAAE;AAAA,EAC5C;AACA,SAAO;AACT;AAMA,SAASC,0BAAyB;AAChC,SAAOF,cAAa,EAAE,OAAO,CAAC,MAAMG,cAAa,CAAC,MAAM,MAAS;AACnE;AAGA,SAASC,oBAAmB;AAC1B,QAAM,aAAa,IAAI,IAAYF,wBAAuB,CAAC;AAC3D,SAAOH,WAAU,EAAE,OAAO,CAAC,MAAM,WAAW,IAAI,EAAE,QAAQ,CAAC;AAC7D;AASA,SAASM,eAAc,IAAoC;AACzD,QAAM,MAAMN,WAAU;AAEtB,MAAI,GAAG,SAAS,GAAG,GAAG;AACpB,UAAM,CAAC,UAAU,OAAO,IAAI,GAAG,MAAM,KAAK,CAAC;AAC3C,WAAO,IAAI;AAAA,MACT,CAAC,MAAM,EAAE,aAAa,aAAa,EAAE,OAAO,WAAW,EAAE,GAAG,SAAS,IAAI,OAAO,EAAE;AAAA,IACpF;AAAA,EACF;AAEA,SAAO,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE,GAAG,SAAS,IAAI,EAAE,EAAE,CAAC;AAC/D;AAGA,SAASO,WAAU,WAA4C;AAE7D,MAAI,WAAW;AACb,UAAM,MAAMD,eAAc,SAAS;AACnC,QAAI,IAAK,QAAO;AAAA,EAClB;AAGA,QAAM,WAAWP,eAAc;AAE/B,MAAI,SAAS,cAAc;AACzB,UAAM,MAAMO,eAAc,SAAS,YAAY;AAC/C,QAAI,IAAK,QAAO;AAAA,EAClB;AAEA,MAAI,SAAS,iBAAiB;AAE5B,UAAM,iBAAiBJ,WAAU,SAAS,eAAsB;AAChE,QAAI,kBAAkB,eAAe,SAAS,GAAG;AAE/C,YAAM,aAAa,IAAI,IAAYC,wBAAuB,CAAC;AAC3D,UAAI,WAAW,IAAI,SAAS,eAAyB,GAAG;AACtD,eAAO,eAAe,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAYE,kBAAiB;AACnC,MAAI,UAAU,SAAS,GAAG;AACxB,UAAMG,SAAQ,CAAC,qBAAqB,mBAAmB,oBAAoB,aAAa;AACxF,eAAW,MAAMA,QAAO;AACtB,YAAM,IAAI,UAAU,KAAK,CAACC,OAAMA,GAAE,GAAG,SAAS,EAAE,CAAC;AACjD,UAAI,EAAG,QAAO;AAAA,IAChB;AACA,WAAO,UAAU,CAAC;AAAA,EACpB;AAGA,QAAM,SAAST,WAAU;AACzB,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,QAAQ,CAAC,qBAAqB,mBAAmB,oBAAoB,aAAa;AACxF,aAAW,MAAM,OAAO;AACtB,UAAM,IAAI,OAAO,KAAK,CAACS,OAAMA,GAAE,GAAG,SAAS,EAAE,CAAC;AAC9C,QAAI,EAAG,QAAO;AAAA,EAChB;AACA,SAAO,OAAO,CAAC;AACjB;AAEA,SAASC,OAAM,QAA8B,MAAyB;AACpE,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,SAAK,OAAO,CAAC;AACb,QAAI,IAAI,KAAK,OAAQ,MAAK,OAAO,KAAK,CAAC,CAAC;AAAA,EAC1C;AACA,SAAO;AACT;AAEA,SAAS,YAAY,QAA8B,MAAiB,MAA0B;AAC5F,SAAO;AAAA,IACL,cAAc,KAAK;AAAA,IACnB,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,SAASA,OAAM,QAAQ,IAAI;AAAA,QAC3B,WAAW,KAAK,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,SAAS,MAAsC;AACtD,SAAO;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,EAClB;AACF;AAEA,eAAe,IACb,QACA,MACA,MACmB;AACnB,QAAM,QAAQH,WAAU,KAAK,KAAK;AAClC,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,kEAA6D;AAEzF,QAAM,KAAK,KAAK,IAAI;AACpB,MAAI,OAAO;AACX,mBAAiB,MAAM,aAAa,OAAO,YAAY,QAAQ,MAAM,IAAI,GAAG,SAAS,IAAI,CAAC,GAAG;AAC3F,QAAI,GAAG,SAAS,cAAc;AAC5B,cAAQ,GAAG;AACX,UAAI,CAAC,KAAK,MAAO,SAAQ,OAAO,MAAM,GAAG,KAAK;AAAA,IAChD;AAAA,EACF;AACA,MAAI,CAAC,KAAK,SAAS,KAAM,SAAQ,OAAO,MAAM,IAAI;AAClD,SAAO,IAAI,SAAS,KAAK,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;AAC/D;AAEA,gBAAgB,UACd,QACA,MACA,MACwB;AACxB,QAAM,QAAQA,WAAU,KAAK,KAAK;AAClC,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sCAAiC;AAC7D,mBAAiB,MAAM,aAAa,OAAO,YAAY,QAAQ,MAAM,IAAI,GAAG,SAAS,IAAI,CAAC,GAAG;AAC3F,QAAI,GAAG,SAAS,aAAc,OAAM,GAAG;AAAA,EACzC;AACF;AAIO,IAAM,YAAN,cAAwB,QAAkB;AAAA,EACvC,WAAW;AAAA,EACnB,YAAY,IAAkE,SAAkB;AAC9F,UAAM,EAAE;AACR,QAAI,QAAS,MAAK,WAAW;AAAA,EAC/B;AAAA,EACA,IAAI,YAAY;AACd,WAAO,KAAK;AAAA,EACd;AACF;AAWA,SAAS,OAAO,OAA2B,CAAC,GAAS;AACnD,QAAM,SAAS,EAAE,GAAGV,YAAU,GAAG,KAAK;AAEtC,QAAM,MAAM,CACV,WACG,SACkB;AAErB,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,OAAO,EAAE,GAAG,QAAQ,GAAI,OAA8B,CAAC;AAAA,IAChE;AAEA,WAAO,IAAI,UAAU,CAAC,SAAS,WAAW;AACxC,UAAI,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IACxE,CAAC;AAAA,EACH;AAGA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAY;AACV,UAAI,CAAC,OAAQ,UAAS,OAAO,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AACvD,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,KAAG,SAAS,gBAAgB,UAAU,WAAiC,MAAiB;AACtF,WAAO,UAAU,QAAQ,MAAM,MAAM;AAAA,EACvC;AAEA,SAAO;AACT;AAGO,IAAM,SAAU,OAAO;AAEvB,SAAS,YAAY,MAAgC;AAC1D,SAAO,OAAOA,YAAU,IAAI;AAC9B;;;AElQA,SAA4B,sBAAAc,2BAA0B;AAYtD,IAAM,iBAA+B;AAAA,EACnC,OAAO;AAAA,EACP,UAAU;AACZ;AAIO,IAAM,cAAN,MAAkB;AAAA,EACvB,YACkB,MACA,YAAoB,GACpB,YAAoB,KAAK,IAAI,GAC7B,UAAkB,KAAK,IAAI,GAC3C;AAJgB;AACA;AACA;AACA;AAAA,EACf;AAAA,EAJe;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGlB,IAAI,WAAmB;AACrB,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAAA,EACA,WAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,UAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,CAAC,OAAO,WAAW,IAAY;AAC7B,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,eAAN,cAA2B,QAAqB;AAAC;AAIxD,IAAI,iBAAsC;AAE1C,eAAe,WAAW,MAA2C;AACnE,MAAI,kBAAkB,CAAC,KAAK,MAAO,QAAO;AAE1C,QAAM,SAAS,MAAMA,oBAAmB;AAAA,IACtC,KAAK,KAAK;AAAA,IACV,eAAe,KAAK;AAAA,IACpB,OAAO,KAAK;AAAA,IACZ,cAAc,KAAK;AAAA,EACrB,CAAC;AAED,mBAAiB,OAAO;AACxB,SAAO;AACT;AAIA,SAASC,OAAM,QAA8B,MAAyB;AACpE,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,SAAK,OAAO,CAAC;AACb,QAAI,IAAI,KAAK,OAAQ,MAAK,OAAO,KAAK,CAAC,CAAC;AAAA,EAC1C;AACA,SAAO,EAAE,KAAK;AAChB;AAMA,SAAS,eAAe,KAAiD;AACvE,QAAM,UAAU,IAAI;AACpB,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO,QACJ;AAAA,MACC,CAAC,MAAwC,EAAE,SAAS,UAAU,OAAO,EAAE,SAAS;AAAA,IAClF,EACC,IAAI,CAAC,MAAwB,EAAE,IAAI,EACnC,KAAK,EAAE;AAAA,EACZ;AACA,SAAO;AACT;AAKA,SAAS,qBAAqB,SAEnB;AACT,QAAM,WAAW,QAAQ;AACzB,WAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,QAAI,SAAS,CAAC,EAAE,SAAS,aAAa;AACpC,aAAO,eAAe,SAAS,CAAC,CAAuC;AAAA,IACzE;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAeC,UACb,QACA,MACA,MACsB;AACtB,QAAM,SAASD,OAAM,QAAQ,IAAI;AACjC,QAAM,UAAU,MAAM,WAAW,IAAI;AACrC,QAAM,KAAK,KAAK,IAAI;AAEpB,MAAI,CAAC,KAAK,OAAO;AACf,YAAQ,OAAO,MAAM,WAAM,OAAO,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO,SAAS,MAAM,QAAQ,EAAE;AAAA,CAAI;AAAA,EACxF;AAEA,MAAI;AAEF,UAAM,QAAQ,gBAAgB,MAAM;AAEpC,UAAM,KAAK,KAAK,IAAI;AAEpB,UAAM,OAAO,qBAAqB,OAAO;AAIzC,UAAM,YAAa,QAAQ,SAAyC;AAAA,MAClE,CAAC,MAAM,EAAE,SAAS;AAAA,IACpB,EAAE;AAEF,WAAO,IAAI,YAAY,QAAQ,2BAA2B,WAAW,IAAI,EAAE;AAAA,EAC7E,SAAS,KAAK;AACZ,UAAM,KAAK,KAAK,IAAI;AACpB,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,YAAQ,MAAM,iBAAY,GAAG;AAC7B,WAAO,IAAI,YAAY,iBAAY,GAAG,IAAI,GAAG,IAAI,EAAE;AAAA,EACrD;AACF;AAUA,SAAS,UAAU,OAA8B,CAAC,GAAY;AAC5D,QAAM,SAAS,EAAE,GAAG,gBAAgB,GAAG,KAAK;AAE5C,QAAM,MAAM,CACV,WACG,SACwB;AAC3B,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,UAAU,EAAE,GAAG,QAAQ,GAAI,OAAiC,CAAC;AAAA,IACtE;AACA,WAAO,IAAI,aAAa,CAAC,SAAS,WAAW;AAC3C,MAAAC,UAAQ,QAAgC,MAAM,MAAM,EAAE,KAAK,SAAS,MAAM;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,SAAO,eAAe,IAAI,SAAS;AAAA,IACjC,MAAe;AACb,UAAI,CAAC,OAAQ,UAAS,UAAU,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC;AAC1D,aAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAGO,IAAM,SAAa,UAAU;AAE7B,SAAS,eAAe,MAAmC;AAChE,SAAO,OAAO,gBAAgB,IAAI;AACpC;AAEA,eAAsB,aAA4B;AAChD,MAAI,gBAAgB;AAClB,mBAAe,QAAQ;AACvB,qBAAiB;AAAA,EACnB;AACF;",
6
+ "names": ["order", "m", "defaults", "execute", "defaults", "execute", "defaults", "execute", "defaults", "ROLE_SETS", "SYNTHESIS_SYSTEM", "execute", "defaults", "execute", "defaults", "execute", "defaults", "ROLE_SETS", "execute", "defaults", "EXECUTE_SYSTEM", "SYNTHESIS_SYSTEM", "execute", "defaults", "SYNTHESIS_SYSTEM", "execute", "defaults", "execute", "defaults", "ANALYSIS_SYSTEM", "PLAN_SYSTEM", "execute", "defaults", "SYNTHESIS_SYSTEM", "execute", "defaults", "execute", "defaults", "ROLE_SETS", "SYNTHESIS_SYSTEM", "execute", "getEnvApiKey", "getModels", "getProviders", "defaults", "_piSettings", "getPiDefaults", "allModels", "getProviders", "getModels", "getConfiguredProviders", "getEnvApiKey", "configuredModels", "findModelById", "pickModel", "order", "m", "build", "createAgentSession", "build", "execute"]
7
+ }