@topce/pizx 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +261 -20
- package/dist/cli.js +681 -722
- package/dist/cli.js.map +4 -4
- package/dist/index.js +673 -715
- package/dist/index.js.map +4 -4
- package/package.json +13 -7
package/dist/cli.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/cli.ts", "../src/load-pi-auth.ts", "../src/load-pi-settings.ts", "../src/patterns/types.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": ["#!/usr/bin/env node\n\n/**\n * pizx CLI \u2014 a zx-compatible script runner with \u03C0 (pi-ai) and \u03A0 (pi-coding-agent)\n * template tags available globally.\n *\n * Usage:\n * pizx script.mjs # Run a pizx script\n * pizx -p \"prompt\" # Quick pi-ai query (print mode)\n * pizx --version # Print version\n */\n\nimport { createRequire } from 'node:module'\nimport process from 'node:process'\nimport url from 'node:url'\nimport { chalk, VERSION as zxVersion } from 'zx'\n\n// Load Pi auth config (reads ~/.pi/agent/auth.json, injects env vars)\n// Must run before any pi-ai/pi-coding-agent code touches getModels()\nimport { loadPiAuth } from './load-pi-auth.ts'\n\nloadPiAuth()\n\n// Agent patterns \u2014 loaded so they can be injected as globals\nimport {\n \u0391 as _\u0391,\n \u0392 as _\u0392,\n \u0393 as _\u0393,\n \u0394 as _\u0394,\n \u0398 as _\u0398,\n \u039B as _\u039B,\n \u039C as _\u039C,\n \u03A1 as _\u03A1,\n \u03A3 as _\u03A3,\n \u03A6 as _\u03A6,\n \u03A8 as _\u03A8,\n \u03A9 as _\u03A9,\n} from './patterns/index.ts'\n// Static imports \u2014 these get bundled by esbuild\nimport { \u03C0 as _pi } from './pi.ts'\nimport { \u03A0 as _pi_agent } from './pi-agent.ts'\n\nconst require = createRequire(import.meta.url)\nconst pkg = require('../package.json') as { version: string }\n\nconst VERSION = pkg.version\n\n// \u2500\u2500 Arg 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\u2500\n\nfunction parseArgs(argv: string[]) {\n const flags = {\n version: false,\n help: false,\n print: false,\n model: undefined as string | undefined,\n system: undefined as string | undefined,\n quiet: false,\n }\n const positional: string[] = []\n let i = 0\n\n while (i < argv.length) {\n const a = argv[i]\n switch (a) {\n case '-v':\n case '--version':\n flags.version = true\n break\n case '-h':\n case '--help':\n flags.help = true\n break\n case '-p':\n case '--print':\n flags.print = true\n break\n case '-m':\n case '--model':\n if (argv[i + 1] && !argv[i + 1].startsWith('-')) flags.model = argv[++i]\n break\n case '--system':\n if (argv[i + 1]) flags.system = argv[++i]\n break\n case '-q':\n case '--quiet':\n flags.quiet = true\n break\n default:\n positional.push(a)\n }\n i++\n }\n\n return { flags, positional }\n}\n\n// \u2500\u2500 Help \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printHelp() {\n // language=txt\n console.log(`\n ${chalk.bold(`pizx ${VERSION}`)} zx/${zxVersion}\n zx-compatible script runner with Pi AI built-in\n\n ${chalk.bold('Usage')}\n pizx [options] <script> Run a pizx script\n pizx -p <prompt> Quick pi-ai query\n\n ${chalk.bold('Options')}\n -p, --print <prompt> Send to pi-ai and print response\n -m, --model <id> Model to use (e.g. anthropic/claude-sonnet-4-5)\n --system <text> System context for pi-ai\n -q, --quiet Suppress status output\n -v, --version Print version\n -h, --help This help\n\n ${chalk.bold('Script Tag Reference')}\n \\`$\\` Shell commands (unchanged from zx)\n \\`\u03C0\\` Pi AI text generation (small pi, pi-ai)\n \\`\u03A0\\` Pi coding agent (capital pi, tools: read/bash/edit/write)\n \\`\u03A1\\` Ralph Loop \u2014 iterative self-correcting loop\n \\`\u03A6\\` Fleet \u2014 parallel agent execution\n \\`\u03A3\\` Subagents \u2014 hierarchical task delegation\n \\`\u0394\\` Debate \u2014 multi-perspective convergence\n \\`\u039B\\` Pipeline \u2014 sequential agent chain\n \\`\u03A8\\` Critique \u2014 generate, critique, improve\n \\`\u03A9\\` Orchestrator \u2014 plan, dispatch, synthesize\n\n ${chalk.bold('Communication Patterns')}\n \\`\u0398\\` Thread \u2014 multi-agent conversation\n \\`\u039C\\` Memory \u2014 shared blackboard\n \\`\u0392\\` Broadcast \u2014 one-to-many messaging\n\n ${chalk.bold('Orchestration Topologies')}\n \\`\u0391\\` Adaptive \u2014 self-adjusting orchestration\n \\`\u0393\\` Graph \u2014 DAG-based task execution\n\n ${chalk.bold('Example Script')}\n #!/usr/bin/env pizx\n const files = (await \\`$\\`ls src/\\`).stdout.trim()\n const review = await \\`\u03C0\\`review these files for bugs: \\${files}\\`\n if (review.includes('BUG')) {\n await \\`\u03A0\\`fix the bugs found in: \\${review}\\`\n }\n\n ${chalk.dim('https://github.com/topce/pizx')}\n`)\n}\n\n// \u2500\u2500 Print mode: quick pi-ai query \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 runPrintMode(flags: ReturnType<typeof parseArgs>['flags'], args: string[]) {\n const prompt = args.join(' ') || ''\n if (!prompt) {\n console.error('pizx: no prompt provided. Use: pizx -p \"your prompt\"')\n process.exit(1)\n }\n\n const opts: Record<string, unknown> = {}\n if (flags.model) opts.model = flags.model\n if (flags.system) opts.system = flags.system\n if (flags.quiet) opts.quiet = true\n\n const tag = Object.keys(opts).length > 0 ? _pi(opts) : _pi\n\n try {\n const result = await tag`${prompt}`\n if (flags.quiet) {\n process.stdout.write(`${result.toString()}\\n`)\n }\n } catch (err) {\n console.error('pizx: pi-ai error:', err instanceof Error ? err.message : err)\n process.exit(1)\n }\n}\n\n// \u2500\u2500 Script mode: run a user script with \u03C0/\u03A0 available \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 runScriptMode(scriptPath: string) {\n // Resolve script path to absolute\n const path = await import('node:path')\n const absPath = path.resolve(process.cwd(), scriptPath)\n\n // Import zx globals first (sets up $, cd, chalk, etc.)\n await import('zx/globals')\n\n // Import pizx globals (sets up \u03C0, \u03A0, configurePi, configureAgent, patterns)\n const g = globalThis as Record<string, unknown>\n g.\u03C0 = _pi\n g.\u03A0 = _pi_agent\n g.\u03A1 = _\u03A1\n g.\u03A6 = _\u03A6\n g.\u03A3 = _\u03A3\n g.\u0394 = _\u0394\n g.\u039B = _\u039B\n g.\u03A8 = _\u03A8\n g.\u03A9 = _\u03A9\n g.\u0398 = _\u0398\n g.\u039C = _\u039C\n g.\u0392 = _\u0392\n g.\u0391 = _\u0391\n g.\u0393 = _\u0393\n\n // Inject __filename, __dirname, require for CommonJS compat\n const { createRequire } = await import('node:module')\n const __filename = absPath\n const __dirname = path.dirname(absPath)\n const require = createRequire(absPath)\n Object.assign(globalThis, { __filename, __dirname, require })\n\n // Run the script\n try {\n await import(url.pathToFileURL(absPath).toString())\n } catch (err) {\n if (err instanceof Error) {\n console.error('pizx:', err.message)\n } else {\n console.error('pizx:', err)\n }\n process.exit(1)\n }\n}\n\n// \u2500\u2500 Main \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 main() {\n const argv = process.argv.slice(2)\n const { flags, positional } = parseArgs(argv)\n\n if (flags.version) {\n console.log(`pizx/${VERSION} (zx/${zxVersion}) node/${process.version}`)\n return\n }\n\n if (flags.help) {\n printHelp()\n return\n }\n\n if (flags.print) {\n await runPrintMode(flags, positional)\n return\n }\n\n // Script mode\n if (positional.length === 0) {\n printHelp()\n process.exit(0)\n }\n\n const script = positional[0]\n await runScriptMode(script)\n}\n\nmain().catch((err) => {\n console.error('pizx:', err instanceof Error ? err.message : err)\n process.exit(1)\n})\n", "/**\n * Load Pi auth config and inject API keys as environment variables\n * so @earendil-works/pi-ai can discover them.\n *\n * Also re-exports Pi installation detection and settings helpers\n * from load-pi-settings.ts.\n */\n\nimport { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport {\n getPiAgentDir,\n isPiInstalled,\n loadPiSettings,\n type PiSettings,\n} from './load-pi-settings.ts'\n\nconst PI_AUTH_DIR = join(homedir(), '.pi', 'agent')\n\n// Provider name \u2192 env var name mapping (from pi-ai internals)\nconst PROVIDER_ENV_MAP: Record<string, string> = {\n deepseek: 'DEEPSEEK_API_KEY',\n openai: 'OPENAI_API_KEY',\n 'openai-codex': 'OPENAI_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY',\n google: 'GEMINI_API_KEY',\n 'google-vertex': 'GOOGLE_CLOUD_API_KEY',\n mistral: 'MISTRAL_API_KEY',\n groq: 'GROQ_API_KEY',\n cerebras: 'CEREBRAS_API_KEY',\n xai: 'XAI_API_KEY',\n nvidia: 'NVIDIA_API_KEY',\n cloudflare: 'CLOUDFLARE_API_KEY',\n 'cloudflare-ai-gateway': 'CLOUDFLARE_API_KEY',\n openrouter: 'OPENROUTER_API_KEY',\n}\n\n/**\n * Reads ~/.pi/agent/auth.json (or api-keys.json) and sets\n * the corresponding environment variables if not already set.\n */\nexport function loadPiAuth(): void {\n // Try auth.json first (newer format), then api-keys.json (older format)\n const candidates = ['auth.json', 'api-keys.json']\n\n for (const file of candidates) {\n const path = join(PI_AUTH_DIR, file)\n if (!existsSync(path)) continue\n\n try {\n const raw = readFileSync(path, 'utf-8')\n const config = JSON.parse(raw)\n\n for (const [provider, cred] of Object.entries(config)) {\n const envVar = PROVIDER_ENV_MAP[provider]\n if (!envVar) continue\n\n // Only set if not already in environment\n if (process.env[envVar]) continue\n\n const credObj = cred as { type: string; key?: string }\n if (credObj.type === 'api_key' && credObj.key) {\n process.env[envVar] = credObj.key\n }\n }\n\n // Also try reading as { apiKeys: { ... } } (legacy format)\n if ((config as Record<string, unknown>).apiKeys) {\n for (const [provider, key] of Object.entries(\n (config as Record<string, unknown>).apiKeys as Record<string, string>\n )) {\n const envVar = PROVIDER_ENV_MAP[provider]\n if (!envVar) continue\n if (process.env[envVar]) continue\n if (typeof key === 'string') {\n process.env[envVar] = key\n }\n }\n }\n } catch (err) {\n console.warn(`pizx: failed to parse ${path}: ${err instanceof Error ? err.message : err}`)\n }\n }\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 * 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 * \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": ";;;AAYA,SAAS,qBAAqB;AAC9B,OAAOA,cAAa;AACpB,OAAO,SAAS;AAChB,SAAS,OAAO,WAAW,iBAAiB;;;ACP5C,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;;;ACHrB,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;;;ADlDA,IAAM,cAAcC,MAAKC,SAAQ,GAAG,OAAO,OAAO;AAGlD,IAAM,mBAA2C;AAAA,EAC/C,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,yBAAyB;AAAA,EACzB,YAAY;AACd;AAMO,SAAS,aAAmB;AAEjC,QAAM,aAAa,CAAC,aAAa,eAAe;AAEhD,aAAW,QAAQ,YAAY;AAC7B,UAAM,OAAOD,MAAK,aAAa,IAAI;AACnC,QAAI,CAACE,YAAW,IAAI,EAAG;AAEvB,QAAI;AACF,YAAM,MAAMC,cAAa,MAAM,OAAO;AACtC,YAAM,SAAS,KAAK,MAAM,GAAG;AAE7B,iBAAW,CAAC,UAAU,IAAI,KAAK,OAAO,QAAQ,MAAM,GAAG;AACrD,cAAM,SAAS,iBAAiB,QAAQ;AACxC,YAAI,CAAC,OAAQ;AAGb,YAAI,QAAQ,IAAI,MAAM,EAAG;AAEzB,cAAM,UAAU;AAChB,YAAI,QAAQ,SAAS,aAAa,QAAQ,KAAK;AAC7C,kBAAQ,IAAI,MAAM,IAAI,QAAQ;AAAA,QAChC;AAAA,MACF;AAGA,UAAK,OAAmC,SAAS;AAC/C,mBAAW,CAAC,UAAU,GAAG,KAAK,OAAO;AAAA,UAClC,OAAmC;AAAA,QACtC,GAAG;AACD,gBAAM,SAAS,iBAAiB,QAAQ;AACxC,cAAI,CAAC,OAAQ;AACb,cAAI,QAAQ,IAAI,MAAM,EAAG;AACzB,cAAI,OAAO,QAAQ,UAAU;AAC3B,oBAAQ,IAAI,MAAM,IAAI;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,KAAK,yBAAyB,IAAI,KAAK,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE;AAAA,IAC3F;AAAA,EACF;AACF;;;AEKA,SAAS,gBAAgB,cAAc,WAAW,oBAAoB;AAtD/D,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,UAAMC,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;;;ACzLA,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;;;AE9P9B,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;;;ArBtKpC,WAAW;AAqBX,IAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,MAAMA,SAAQ,iBAAiB;AAErC,IAAM,UAAU,IAAI;AAIpB,SAAS,UAAU,MAAgB;AACjC,QAAM,QAAQ;AAAA,IACZ,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACA,QAAM,aAAuB,CAAC;AAC9B,MAAI,IAAI;AAER,SAAO,IAAI,KAAK,QAAQ;AACtB,UAAM,IAAI,KAAK,CAAC;AAChB,YAAQ,GAAG;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,cAAM,UAAU;AAChB;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,cAAM,OAAO;AACb;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,cAAM,QAAQ;AACd;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,WAAW,GAAG,EAAG,OAAM,QAAQ,KAAK,EAAE,CAAC;AACvE;AAAA,MACF,KAAK;AACH,YAAI,KAAK,IAAI,CAAC,EAAG,OAAM,SAAS,KAAK,EAAE,CAAC;AACxC;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,cAAM,QAAQ;AACd;AAAA,MACF;AACE,mBAAW,KAAK,CAAC;AAAA,IACrB;AACA;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,WAAW;AAC7B;AAIA,SAAS,YAAY;AAEnB,UAAQ,IAAI;AAAA,GACX,MAAM,KAAK,QAAQ,OAAO,EAAE,CAAC,SAAS,SAAS;AAAA;AAAA;AAAA,GAG/C,MAAM,KAAK,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,GAInB,MAAM,KAAK,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQrB,MAAM,KAAK,sBAAsB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAYlC,MAAM,KAAK,wBAAwB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,GAKpC,MAAM,KAAK,0BAA0B,CAAC;AAAA;AAAA;AAAA;AAAA,GAItC,MAAM,KAAK,gBAAgB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQ5B,MAAM,IAAI,+BAA+B,CAAC;AAAA,CAC5C;AACD;AAIA,eAAe,aAAa,OAA8C,MAAgB;AACxF,QAAM,SAAS,KAAK,KAAK,GAAG,KAAK;AACjC,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,sDAAsD;AACpE,IAAAC,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAgC,CAAC;AACvC,MAAI,MAAM,MAAO,MAAK,QAAQ,MAAM;AACpC,MAAI,MAAM,OAAQ,MAAK,SAAS,MAAM;AACtC,MAAI,MAAM,MAAO,MAAK,QAAQ;AAE9B,QAAM,MAAM,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,OAAI,IAAI,IAAI;AAEvD,MAAI;AACF,UAAM,SAAS,MAAM,MAAM,MAAM;AACjC,QAAI,MAAM,OAAO;AACf,MAAAA,SAAQ,OAAO,MAAM,GAAG,OAAO,SAAS,CAAC;AAAA,CAAI;AAAA,IAC/C;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,MAAM,sBAAsB,eAAe,QAAQ,IAAI,UAAU,GAAG;AAC5E,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAIA,eAAe,cAAc,YAAoB;AAE/C,QAAM,OAAO,MAAM,OAAO,WAAW;AACrC,QAAM,UAAU,KAAK,QAAQA,SAAQ,IAAI,GAAG,UAAU;AAGtD,QAAM,OAAO,YAAY;AAGzB,QAAM,IAAI;AACV,IAAE,SAAI;AACN,IAAE,SAAI;AACN,IAAE,SAAI;AACN,IAAE,SAAI;AACN,IAAE,SAAI;AACN,IAAE,SAAI;AACN,IAAE,SAAI;AACN,IAAE,SAAI;AACN,IAAE,SAAI;AACN,IAAE,SAAI;AACN,IAAE,SAAI;AACN,IAAE,SAAI;AACN,IAAE,SAAI;AACN,IAAE,SAAI;AAGN,QAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,aAAa;AACpD,QAAM,aAAa;AACnB,QAAM,YAAY,KAAK,QAAQ,OAAO;AACtC,QAAMF,WAAUE,eAAc,OAAO;AACrC,SAAO,OAAO,YAAY,EAAE,YAAY,WAAW,SAAAF,SAAQ,CAAC;AAG5D,MAAI;AACF,UAAM,OAAO,IAAI,cAAc,OAAO,EAAE,SAAS;AAAA,EACnD,SAAS,KAAK;AACZ,QAAI,eAAe,OAAO;AACxB,cAAQ,MAAM,SAAS,IAAI,OAAO;AAAA,IACpC,OAAO;AACL,cAAQ,MAAM,SAAS,GAAG;AAAA,IAC5B;AACA,IAAAC,SAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAIA,eAAe,OAAO;AACpB,QAAM,OAAOA,SAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,EAAE,OAAO,WAAW,IAAI,UAAU,IAAI;AAE5C,MAAI,MAAM,SAAS;AACjB,YAAQ,IAAI,QAAQ,OAAO,QAAQ,SAAS,UAAUA,SAAQ,OAAO,EAAE;AACvE;AAAA,EACF;AAEA,MAAI,MAAM,MAAM;AACd,cAAU;AACV;AAAA,EACF;AAEA,MAAI,MAAM,OAAO;AACf,UAAM,aAAa,OAAO,UAAU;AACpC;AAAA,EACF;AAGA,MAAI,WAAW,WAAW,GAAG;AAC3B,cAAU;AACV,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,WAAW,CAAC;AAC3B,QAAM,cAAc,MAAM;AAC5B;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,GAAG;AAC/D,EAAAA,SAAQ,KAAK,CAAC;AAChB,CAAC;",
|
|
6
|
-
"names": ["process", "existsSync", "readFileSync", "homedir", "join", "join", "homedir", "existsSync", "readFileSync", "order", "m", "defaults", "execute", "defaults", "execute", "defaults", "execute", "defaults", "
|
|
3
|
+
"sources": ["../src/cli.ts", "../src/load-pi-auth.ts", "../src/utils.ts", "../src/load-pi-settings.ts", "../src/patterns/types.ts", "../src/model-picker.ts", "../src/patterns/adaptive.ts", "../src/patterns/role-sets.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": ["#!/usr/bin/env node\n\n/**\n * pizx CLI \u2014 a zx-compatible script runner with \u03C0 (pi-ai) and \u03A0 (pi-coding-agent)\n * template tags available globally.\n *\n * Usage:\n * pizx script.mjs # Run a pizx script\n * pizx -p \"prompt\" # Quick pi-ai query (print mode)\n * pizx --version # Print version\n */\n\nimport { createRequire } from 'node:module'\nimport process from 'node:process'\nimport url from 'node:url'\nimport { chalk, VERSION as zxVersion } from 'zx'\n\n// Load Pi auth config (reads ~/.pi/agent/auth.json, injects env vars)\n// Must run before any pi-ai/pi-coding-agent code touches getModels()\nimport { loadPiAuth } from './load-pi-auth.ts'\nimport { getErrorMessage } from './utils.ts'\n\nloadPiAuth()\n\n// Agent patterns \u2014 loaded so they can be injected as globals\nimport {\n \u0391 as _\u0391,\n \u0392 as _\u0392,\n \u0393 as _\u0393,\n \u0394 as _\u0394,\n \u0398 as _\u0398,\n \u039B as _\u039B,\n \u039C as _\u039C,\n \u039D as _\u039D,\n \u03A1 as _\u03A1,\n \u03A3 as _\u03A3,\n \u03A4 as _\u03A4,\n \u03A6 as _\u03A6,\n \u03A7 as _\u03A7,\n \u03A8 as _\u03A8,\n \u03A9 as _\u03A9,\n} from './patterns/index.ts'\n// Static imports \u2014 these get bundled by esbuild\nimport { \u03C0 as _pi } from './pi.ts'\nimport { \u03A0 as _pi_agent } from './pi-agent.ts'\n\nconst require = createRequire(import.meta.url)\nconst pkg = require('../package.json') as { version: string }\n\nconst VERSION = pkg.version\n\n// \u2500\u2500 Arg 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\u2500\n\nfunction parseArgs(argv: string[]) {\n const flags = {\n version: false,\n help: false,\n print: false,\n model: undefined as string | undefined,\n system: undefined as string | undefined,\n quiet: false,\n }\n const positional: string[] = []\n let i = 0\n\n while (i < argv.length) {\n const a = argv[i]\n switch (a) {\n case '-v':\n case '--version':\n flags.version = true\n break\n case '-h':\n case '--help':\n flags.help = true\n break\n case '-p':\n case '--print':\n flags.print = true\n break\n case '-m':\n case '--model':\n if (argv[i + 1] && !argv[i + 1].startsWith('-')) flags.model = argv[++i]\n break\n case '--system':\n if (argv[i + 1] && !argv[i + 1].startsWith('-')) flags.system = argv[++i]\n break\n case '-q':\n case '--quiet':\n flags.quiet = true\n break\n default:\n positional.push(a)\n }\n i++\n }\n\n return { flags, positional }\n}\n\n// \u2500\u2500 Help \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printHelp() {\n // language=txt\n console.log(`\n ${chalk.bold(`pizx ${VERSION}`)} zx/${zxVersion}\n zx-compatible script runner with Pi AI built-in\n\n ${chalk.bold('Usage')}\n pizx [options] <script> Run a pizx script\n pizx -p <prompt> Quick pi-ai query\n\n ${chalk.bold('Options')}\n -p, --print <prompt> Send to pi-ai and print response\n -m, --model <id> Model to use (e.g. anthropic/claude-sonnet-4-5)\n --system <text> System context for pi-ai\n -q, --quiet Suppress status output\n -v, --version Print version\n -h, --help This help\n\n ${chalk.bold('Script Tag Reference')}\n \\`$\\` Shell commands (unchanged from zx)\n \\`\u03C0\\` Pi AI text generation (small pi, pi-ai)\n \\`\u03A0\\` Pi coding agent (capital pi, tools: read/bash/edit/write)\n \\`\u03A1\\` Ralph Loop \u2014 iterative self-correcting loop\n \\`\u03A6\\` Fleet \u2014 parallel agent execution\n \\`\u03A3\\` Subagents \u2014 hierarchical task delegation\n \\`\u0394\\` Debate \u2014 multi-perspective convergence\n \\`\u039B\\` Pipeline \u2014 sequential agent chain\n \\`\u03A8\\` Critique \u2014 generate, critique, improve\n \\`\u03A9\\` Orchestrator \u2014 plan, dispatch, synthesize\n \\`\u039D\\` Nu \u2014 Self-Organizing Teams\n\n ${chalk.bold('Communication Patterns')}\n \\`\u0398\\` Thread \u2014 multi-agent conversation\n \\`\u039C\\` Memory \u2014 shared blackboard\n \\`\u0392\\` Broadcast \u2014 one-to-many messaging\n\n ${chalk.bold('Orchestration Topologies')}\n \\`\u0391\\` Adaptive \u2014 self-adjusting orchestration\n \\`\u0393\\` Graph \u2014 DAG-based task execution\n \\`\u03A7\\` Chi \u2014 Cross-Agent Learning\n \\`\u03A4\\` Tau \u2014 Tool-Mediated Orchestration\n\n ${chalk.bold('Example Script')}\n #!/usr/bin/env pizx\n const files = (await \\`$\\`ls src/\\`).stdout.trim()\n const review = await \\`\u03C0\\`review these files for bugs: \\${files}\\`\n if (review.includes('BUG')) {\n await \\`\u03A0\\`fix the bugs found in: \\${review}\\`\n }\n\n ${chalk.dim('https://github.com/topce/pizx')}\n`)\n}\n\n// \u2500\u2500 Print mode: quick pi-ai query \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 runPrintMode(flags: ReturnType<typeof parseArgs>['flags'], args: string[]) {\n const prompt = args.join(' ') || ''\n if (!prompt) {\n console.error('pizx: no prompt provided. Use: pizx -p \"your prompt\"')\n process.exit(1)\n }\n\n const opts: Record<string, unknown> = {}\n if (flags.model) opts.model = flags.model\n if (flags.system) opts.system = flags.system\n if (flags.quiet) opts.quiet = true\n\n const tag = Object.keys(opts).length > 0 ? _pi(opts) : _pi\n\n try {\n const result = await tag`${prompt}`\n if (flags.quiet) {\n process.stdout.write(`${result.toString()}\\n`)\n }\n } catch (err) {\n console.error('pizx: pi-ai error:', getErrorMessage(err))\n process.exit(1)\n }\n}\n\n// \u2500\u2500 Script mode: run a user script with \u03C0/\u03A0 available \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 runScriptMode(scriptPath: string) {\n // Resolve script path to absolute\n const path = await import('node:path')\n const absPath = path.resolve(process.cwd(), scriptPath)\n\n // Import zx globals first (sets up $, cd, chalk, etc.)\n await import('zx/globals')\n\n // Import pizx globals (sets up \u03C0, \u03A0, configurePi, configureAgent, patterns)\n const g = globalThis as Record<string, unknown>\n g.\u03C0 = _pi\n g.\u03A0 = _pi_agent\n g.\u03A1 = _\u03A1\n g.\u03A6 = _\u03A6\n g.\u03A3 = _\u03A3\n g.\u0394 = _\u0394\n g.\u039B = _\u039B\n g.\u03A8 = _\u03A8\n g.\u03A9 = _\u03A9\n g.\u0398 = _\u0398\n g.\u039C = _\u039C\n g.\u039D = _\u039D\n g.\u03A4 = _\u03A4\n g.\u03A7 = _\u03A7\n g.\u0392 = _\u0392\n g.\u0391 = _\u0391\n g.\u0393 = _\u0393\n\n // Inject __filename, __dirname, require for CommonJS compat\n const { createRequire } = await import('node:module')\n const __filename = absPath\n const __dirname = path.dirname(absPath)\n const require = createRequire(absPath)\n Object.assign(globalThis, { __filename, __dirname, require })\n\n // Run the script\n try {\n await import(url.pathToFileURL(absPath).toString())\n } catch (err) {\n console.error('pizx:', getErrorMessage(err))\n process.exit(1)\n }\n}\n\n// \u2500\u2500 Main \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 main() {\n const argv = process.argv.slice(2)\n const { flags, positional } = parseArgs(argv)\n\n if (flags.version) {\n console.log(`pizx/${VERSION} (zx/${zxVersion}) node/${process.version}`)\n return\n }\n\n if (flags.help) {\n printHelp()\n return\n }\n\n if (flags.print) {\n await runPrintMode(flags, positional)\n return\n }\n\n // Script mode\n if (positional.length === 0) {\n printHelp()\n process.exit(0)\n }\n\n const script = positional[0]\n await runScriptMode(script)\n}\n\nmain().catch((err) => {\n console.error('pizx:', getErrorMessage(err))\n process.exit(1)\n})\n", "/**\n * Load Pi auth config and inject API keys as environment variables\n * so @earendil-works/pi-ai can discover them.\n *\n * Also re-exports Pi installation detection and settings helpers\n * from load-pi-settings.ts.\n */\n\nimport { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { getErrorMessage } from './utils.ts'\n\nexport {\n getPiAgentDir,\n isPiInstalled,\n loadPiSettings,\n type PiSettings,\n} from './load-pi-settings.ts'\n\nconst PI_AUTH_DIR = join(homedir(), '.pi', 'agent')\n\n// Provider name \u2192 env var name mapping (from pi-ai internals)\nconst PROVIDER_ENV_MAP: Record<string, string> = {\n deepseek: 'DEEPSEEK_API_KEY',\n openai: 'OPENAI_API_KEY',\n 'openai-codex': 'OPENAI_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY',\n google: 'GEMINI_API_KEY',\n 'google-vertex': 'GOOGLE_CLOUD_API_KEY',\n mistral: 'MISTRAL_API_KEY',\n groq: 'GROQ_API_KEY',\n cerebras: 'CEREBRAS_API_KEY',\n xai: 'XAI_API_KEY',\n nvidia: 'NVIDIA_API_KEY',\n cloudflare: 'CLOUDFLARE_API_KEY',\n 'cloudflare-ai-gateway': 'CLOUDFLARE_API_KEY',\n openrouter: 'OPENROUTER_API_KEY',\n}\n\n/**\n * Reads ~/.pi/agent/auth.json (or api-keys.json) and sets\n * the corresponding environment variables if not already set.\n */\nexport function loadPiAuth(): void {\n // Try auth.json first (newer format), then api-keys.json (older format)\n const candidates = ['auth.json', 'api-keys.json']\n\n for (const file of candidates) {\n const path = join(PI_AUTH_DIR, file)\n if (!existsSync(path)) continue\n\n try {\n const raw = readFileSync(path, 'utf-8')\n const config = JSON.parse(raw)\n\n for (const [provider, cred] of Object.entries(config)) {\n const envVar = PROVIDER_ENV_MAP[provider]\n if (!envVar) continue\n\n // Only set if not already in environment\n if (process.env[envVar]) continue\n\n const credObj = cred as { type: string; key?: string }\n if (credObj.type === 'api_key' && credObj.key) {\n process.env[envVar] = credObj.key\n }\n }\n\n // Also try reading as { apiKeys: { ... } } (legacy format)\n if ((config as Record<string, unknown>).apiKeys) {\n for (const [provider, key] of Object.entries(\n (config as Record<string, unknown>).apiKeys as Record<string, string>\n )) {\n const envVar = PROVIDER_ENV_MAP[provider]\n if (!envVar) continue\n if (process.env[envVar]) continue\n if (typeof key === 'string') {\n process.env[envVar] = key\n }\n }\n }\n } catch (err) {\n console.warn(`pizx: failed to parse ${path}: ${getErrorMessage(err)}`)\n }\n }\n}\n", "/**\n * Shared utility functions used across pizx modules.\n */\n\n/** Extract a string message from any error-like value. */\nexport function getErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\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 * 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 /** Timeout in milliseconds for each LLM call. Default: provider SDK default (typically 10 min). */\n timeoutMs?: number\n /** Maximum retry attempts for transient failures (network errors, rate limits). Default: provider SDK default (typically 2). */\n maxRetries?: number\n /** If true, pause before the first major execution phase and ask for confirmation via stdin. Default: false */\n confirm?: boolean\n}\n\n// \u2500\u2500 Execution trace \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 task that can be either a plain string (LLM call) or a lazy pattern call receiving previous output. */\nexport type TaskDescriptor = string | ((previousOutput: string) => Promise<string>)\n\n/** A single LLM call recorded during pattern execution. */\nexport interface CallTrace {\n /** Auto-indexed call number (1-based) */\n call: number\n /** Model id used for this call */\n modelId: string\n /** First 200 chars of the prompt */\n promptPreview: string\n /** First 200 chars of the output */\n outputPreview: string\n /** Input tokens consumed */\n inputTokens: number\n /** Output tokens generated */\n outputTokens: number\n /** Cache read tokens */\n cacheReadTokens: number\n /** Cache write tokens */\n cacheWriteTokens: number\n /** Total tokens (input + output) */\n totalTokens: number\n /** Cost in USD */\n cost: number\n /** Duration of this call in ms */\n durationMs: number\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/** A single structured phase entry in a pattern execution. */\nexport interface PhaseEntry {\n /** Phase name \u2014 e.g. 'plan', 'decompose', 'execute', 'synthesize', 'review' */\n phase: string\n /** Duration of this phase in milliseconds */\n durationMs: number\n /** Brief description of what happened */\n description: string\n /** The model used for this phase, if any */\n modelUsed?: string\n /** How many LLM calls this phase made */\n callCount?: number\n}\n\n/**\n * Base output for all pattern tags.\n * Provides common fields and coercion methods like PiOutput/AgentOutput.\n */\nexport class PatternOutput {\n /** Execution trace: one entry per LLM call within this pattern run. Populated by createPatternTag. */\n public trace: CallTrace[] = []\n /** Structured phase log: key phases during execution, populated by each pattern. */\n public phaseLog: PhaseEntry[] = []\n\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 /** Total input tokens across all calls */\n get inputTokens(): number {\n return this.trace.reduce((s, t) => s + t.inputTokens, 0)\n }\n\n /** Total output tokens across all calls */\n get outputTokens(): number {\n return this.trace.reduce((s, t) => s + t.outputTokens, 0)\n }\n\n /** Total tokens (input + output) across all calls */\n get totalTokens(): number {\n return this.trace.reduce((s, t) => s + t.totalTokens, 0)\n }\n\n /** Total cost in USD across all calls */\n get totalCost(): number {\n return this.trace.reduce((s, t) => s + t.cost, 0)\n }\n\n /** Number of LLM calls made during this pattern execution */\n get callCount(): number {\n return this.trace.length\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 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\n\n/**\n * Create a pattern tag with option chaining and .quiet support.\n *\n * Every pattern tag (\u03A6, \u03A3, \u0394, \u039B, \u03A8, \u03A9, \u03A1, \u0398, \u039C, \u0392, \u0391, \u0393, \u039D, \u03A7, \u03A4)\n * uses this single factory instead of duplicating the same ~30 lines\n * of option-chaining boilerplate.\n */\n// \u2500\u2500 Trace accumulator (module-level, managed by createPatternTag) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet _trace: CallTrace[] | null = null\n\nfunction beginTrace(): void {\n _trace = []\n}\n\nfunction collectTrace(): CallTrace[] {\n const t = _trace ?? []\n _trace = null\n return t\n}\n\nfunction pushTrace(entry: CallTrace): void {\n if (_trace) _trace.push(entry)\n}\n\nexport function createPatternTag<TOptions extends PatternOptions, TOutput extends PatternOutput>(\n defaults: TOptions,\n execute: (pieces: TemplateStringsArray, args: unknown[], opts: TOptions) => Promise<TOutput>\n): PatternFn<TOptions, TOutput> {\n function make(opts: Partial<TOptions> = {}): PatternFn<TOptions, TOutput> {\n const merged = { ...defaults, ...opts }\n\n const fn = ((\n pieces: TemplateStringsArray | Partial<TOptions>,\n ...args: unknown[]\n ): PatternPromise<TOutput> | PatternFn<TOptions, TOutput> => {\n if (!Array.isArray(pieces)) {\n return make({ ...merged, ...(pieces as Partial<TOptions>) })\n }\n beginTrace()\n return new PatternPromise((resolve, reject) => {\n execute(pieces as TemplateStringsArray, args, merged).then(\n (output) => {\n output.trace = collectTrace()\n resolve(output)\n },\n (err) => {\n collectTrace() // discard trace on error\n reject(err)\n }\n )\n })\n }) as unknown as PatternFn<TOptions, TOutput>\n\n let _quiet: PatternFn<TOptions, TOutput> | undefined\n Object.defineProperty(fn, 'quiet', {\n get(): PatternFn<TOptions, TOutput> {\n if (!_quiet) _quiet = make({ ...merged, quiet: true })\n return _quiet\n },\n enumerable: true,\n configurable: true,\n })\n\n return fn\n }\n\n return make()\n}\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 System prompt merging \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 * Combine a user-provided system prompt with a pattern's default system prompt.\n * If no user system is provided, returns the pattern prompt as-is.\n */\nexport function mergeSystem(userSystem: string | undefined, patternSystem: string): string {\n if (!userSystem) return patternSystem\n return `${userSystem}\\n\\n${patternSystem}`\n}\n\n// \u2500\u2500 Confirmation helper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 { createInterface } from 'node:readline'\n\n/**\n * If opts.confirm is true, pause and prompt the user for confirmation.\n * Returns true if execution should continue, false to abort.\n */\nexport async function confirmPhase(\n description: string,\n opts: { confirm?: boolean; quiet?: boolean }\n): Promise<boolean> {\n if (!opts.confirm) return true\n if (!opts.quiet) {\n process.stderr.write(`\\n \u2500\u2500 Confirm \u2500\u2500\\n ${description}\\n Proceed? [Y/n] `)\n }\n const rl = createInterface({ input: process.stdin, output: process.stderr })\n const answer = await new Promise<string>((resolve) => {\n rl.question('', (ans: string) => resolve(ans))\n })\n rl.close()\n const trimmed = answer.trim().toLowerCase()\n if (trimmed === '' || trimmed === 'y' || trimmed === 'yes') return true\n return false\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 } from '@earendil-works/pi-ai'\n\nimport { pickModel } from '../model-picker.ts'\n\nexport { pickModel }\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(prompt: string, opts: Partial<PatternOptions> = {}): 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 t0 = Date.now()\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 timeoutMs: opts.timeoutMs,\n maxRetries: opts.maxRetries,\n }\n )\n const durationMs = Date.now() - t0\n\n if (!result.content || !Array.isArray(result.content)) {\n throw new Error('pizx/patterns: Unexpected response format from AI model.')\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 // Collect trace entry\n if (_trace !== null) {\n pushTrace({\n call: _trace.length + 1,\n modelId: result.model,\n promptPreview: prompt.slice(0, 200),\n outputPreview: text.slice(0, 200),\n inputTokens: result.usage.input,\n outputTokens: result.usage.output,\n cacheReadTokens: result.usage.cacheRead,\n cacheWriteTokens: result.usage.cacheWrite,\n totalTokens: result.usage.totalTokens,\n cost: result.usage.cost.total,\n durationMs,\n })\n }\n\n return text.trim()\n}\n\n// \u2500\u2500 Quality Review Helper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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/** Structured quality review result shared by all patterns. */\nexport interface QualityReviewResult {\n /** Quality score from 0.0 (poor) to 1.0 (perfect) */\n score: number\n /** 1-2 sentence assessment */\n assessment: string\n /** 1 sentence recommendation for improvement */\n recommendation: string\n}\n\nconst QUALITY_REVIEW_SYSTEM = `You are a quality assurance reviewer. Evaluate the final deliverable against the original request.\n\nOutput format:\nSCORE: 0.XX (quality score from 0.0 to 1.0)\nASSESSMENT: (1-2 sentences \u2014 is the output complete, consistent, and actionable?)\nRECOMMENDATION: (1 sentence \u2014 what would improve this output?)`\n\n/**\n * Run a quality review on the final output of a pattern.\n * Returns a structured assessment or undefined if qualityCheck is disabled.\n */\nexport async function runQualityReview(\n originalRequest: string,\n finalOutput: string,\n opts: {\n qualityCheck?: boolean\n quiet?: boolean\n plannerModel?: string\n model?: string\n maxTokens?: number\n timeoutMs?: number\n maxRetries?: number\n }\n): Promise<QualityReviewResult | undefined> {\n if (!opts.qualityCheck) return undefined\n\n const reviewText = await ask(\n `Original request:\\n${originalRequest}\\n\\nFinal deliverable:\\n${finalOutput}\\n\\nEvaluate the quality.`,\n {\n model: opts.plannerModel ?? opts.model,\n maxTokens: 512,\n thinkingLevel: 'high' as ThinkingLevel,\n timeoutMs: opts.timeoutMs,\n maxRetries: opts.maxRetries,\n system: QUALITY_REVIEW_SYSTEM,\n }\n )\n\n const scoreMatch = reviewText.match(/SCORE:\\s*([\\d.]+)/i)\n const assessMatch = reviewText.match(/ASSESSMENT:\\s*(.+)/i)\n const recMatch = reviewText.match(/RECOMMENDATION:\\s*(.+)/i)\n\n const result: QualityReviewResult = {\n score: scoreMatch ? parseFloat(scoreMatch[1]) : 0.5,\n assessment: assessMatch?.[1]?.trim() ?? '(no assessment)',\n recommendation: recMatch?.[1]?.trim() ?? '(no recommendation)',\n }\n\n if (!opts.quiet) {\n process.stderr.write(` Quality score: ${result.score.toFixed(2)}\\n`)\n process.stderr.write(` ${result.assessment.slice(0, 80)}...\\n`)\n }\n\n return result\n}\n", "/**\n * Shared model-picking logic for \u03C0 (pi.ts) and all pattern tags (patterns/types.ts).\n *\n * Picks the best available AI model using this priority:\n * 1. Explicit model id passed by the caller\n * 2. Pi's defaultModel / defaultProvider from ~/.pi/agent/settings.json\n * 3. First configured model (has API key) matching a preference order\n * 4. First fallback model from the full registry matching a preference order\n */\n\nimport {\n getEnvApiKey,\n getModels,\n getProviders,\n type KnownProvider,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n type Model,\n} from '@earendil-works/pi-ai'\n\nimport { isPiInstalled, loadPiSettings, type PiSettings } from './load-pi-settings.ts'\n\n// \u2500\u2500 Cached Pi settings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 _piSettings: PiSettings | undefined\n\nfunction getPiDefaults(): PiSettings {\n if (_piSettings === undefined) {\n _piSettings = isPiInstalled() ? loadPiSettings() : {}\n }\n return _piSettings\n}\n\n// \u2500\u2500 Model registry 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\n\n/** Return all known models from the pi-ai static registry. */\nfunction allModels(): Model<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/** Return only providers that have an API key configured. */\nfunction getConfiguredProviders(): string[] {\n return getProviders().filter((p) => getEnvApiKey(p) !== undefined)\n}\n\n/** Return models only from providers that have configured auth. */\nfunction configuredModels(): Model<any>[] {\n const configured = new Set<string>(getConfiguredProviders())\n return allModels().filter((m) => configured.has(m.provider))\n}\n\n/** Find a model by provider/modelId or modelId-only string. */\nfunction findModelById(id: string): Model<any> | 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// \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 * Pick the most appropriate AI model.\n *\n * Priority:\n * 1. `preferred` \u2014 explicit model id (e.g. \"anthropic/claude-sonnet-4-5\")\n * 2. Pi's `defaultModel` from settings.json\n * 3. Pi's `defaultProvider` first model from settings.json\n * 4. First configured model in preference order (claude-sonnet-4-5, claude-sonnet-4,\n * gemini-2.5-flash, gpt-4o-mini)\n * 5. First fallback model from the full registry in the same preference order\n *\n * Returns `undefined` only when the registry is completely empty (no models registered).\n */\nexport function pickModel(preferred?: string): Model<any> | undefined {\n // 1. Explicit preferred model\n if (preferred) {\n const hit = findModelById(preferred)\n if (hit) return hit\n }\n\n // 2. Pi's defaultModel 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 // 3. Pi's defaultProvider first model\n if (settings.defaultProvider) {\n const provider = settings.defaultProvider as KnownProvider\n const providerModels = getModels(provider)\n if (providerModels && providerModels.length > 0) {\n const configured = new Set<string>(getConfiguredProviders())\n if (configured.has(settings.defaultProvider)) {\n return providerModels[0]\n }\n }\n }\n\n // 4. First configured model in preference order\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 // 5. 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", "/**\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 {\n ask,\n build,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\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 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 ...opts,\n model: plannerModel,\n thinkingLevel: 'high' as ThinkingLevel,\n system: mergeSystem(opts.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 ...opts,\n model: workerModel,\n system: mergeSystem(opts.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 ...opts,\n model: plannerModel,\n maxTokens: 512,\n thinkingLevel: 'high' as ThinkingLevel,\n system: mergeSystem(opts.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('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/** \u0391 tag \u2014 Adaptive: self-adjusting orchestration */\nexport const \u0391 = createPatternTag(defaults, execute)\n", "/**\n * Shared agent role sets for pizx patterns.\n *\n * Each pattern defines its own role flavor, but they all share the same\n * Record<number, string[]> structure. Centralizing them here avoids ~240\n * lines of duplicated structure across 4 files.\n */\n\n/** Debate perspectives: multi-perspective convergence roles */\nexport const DEBATE_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/** Memory (blackboard) roles: shared analysis contributors */\nexport const MEMORY_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/** Thread (conversation) roles: multi-agent dialogue participants */\nexport const THREAD_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/** Broadcast roles: specialist experts responding to a question */\nexport const BROADCAST_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 * \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 { BROADCAST_ROLE_SETS } from './role-sets.ts'\nimport {\n ask,\n build,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\n type QualityReviewResult,\n runQualityReview,\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 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 /** Run a quality review on the final synthesis. Default: false */\n qualityCheck?: boolean\n}\n\nconst defaults: BroadcastOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n workers: 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 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 /** Quality review, if qualityCheck was enabled */\n public readonly qualityReview?: QualityReviewResult\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 ?? BROADCAST_ROLE_SETS[workerCount] ?? BROADCAST_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, { ...opts, model: workerModel })\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 ...opts,\n model: plannerModel,\n thinkingLevel: 'high' as ThinkingLevel,\n system: mergeSystem(opts.system, SYNTHESIS_SYSTEM),\n }\n )\n\n // Quality review (optional)\n if (!opts.quiet && opts.qualityCheck) process.stderr.write(' \u2192 Quality review...\\n')\n const qualityReview = await runQualityReview(question, synthesis, opts)\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, qualityReview)\n}\n\n/** \u0392 tag \u2014 Broadcast: one-to-many messaging */\nexport const \u0392 = createPatternTag(defaults, execute)\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 {\n ask,\n build,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\n type QualityReviewResult,\n runQualityReview,\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 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 /** Run a quality review on the extracted insights. Default: false */\n qualityCheck?: boolean\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 /** Quality review, if qualityCheck was enabled */\n public readonly qualityReview?: QualityReviewResult\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 ...opts,\n model: plannerModel,\n system: mergeSystem(opts.system, ANALYSIS_SYSTEM),\n })\n\n const { insights, summary, suggestedChanges } = parseInsights(response)\n\n // Quality review (optional) \u2014 validate the extracted insights\n if (!opts.quiet && opts.qualityCheck) process.stderr.write(' \u2192 Quality review...\\n')\n const qualityReview = await runQualityReview(input, response, opts)\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, qualityReview)\n}\n\n/** \u03A7 tag \u2014 Cross-Agent Learning: extract patterns and recommendations from traces */\nexport const \u03A7 = createPatternTag(defaults, execute)\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 {\n ask,\n build,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\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 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, { ...opts, model: workerModel, system: opts.system })\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 { ...opts, model: workerModel, system: mergeSystem(opts.system, IMPROVE_SYSTEM) }\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 ...opts,\n model: plannerModel,\n system: mergeSystem(opts.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/** \u03A8 tag \u2014 Critique: generate \u2192 critique \u2192 improve */\nexport const \u03A8 = createPatternTag(defaults, execute)\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 { DEBATE_ROLE_SETS } from './role-sets.ts'\nimport {\n ask,\n build,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\n type QualityReviewResult,\n runQualityReview,\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 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 /** Run a quality review on the final conclusion. Default: false */\n qualityCheck?: boolean\n}\n\nconst defaults: DebateOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n perspectives: 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 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 /** Quality review, if qualityCheck was enabled */\n public readonly qualityReview?: QualityReviewResult\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 ?? DEBATE_ROLE_SETS[count] ?? DEBATE_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 ...opts,\n model: workerModel,\n system: mergeSystem(opts.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 ...opts,\n model: workerModel,\n system: mergeSystem(opts.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 ...opts,\n model: plannerModel,\n thinkingLevel: 'high' as ThinkingLevel,\n system: mergeSystem(opts.system, SYNTHESIS_SYSTEM),\n }\n )\n\n // Quality review (optional)\n if (!opts.quiet && opts.qualityCheck) process.stderr.write(' \u2192 Quality review...\\n')\n const qualityReview = await runQualityReview(question, conclusion, opts)\n\n const t1 = Date.now()\n\n return new DebateOutput(\n conclusion,\n conclusion,\n allPerspectives,\n totalRounds,\n t0,\n t1,\n qualityReview\n )\n}\n\n/** \u0394 tag \u2014 Debate: multiple perspectives converge */\nexport const \u0394 = createPatternTag(defaults, execute)\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({ tasks: [\n * 'analyze the frontend',\n * () => \u03A3`analyze the backend`, // <-- compose a subagent pattern as a fleet task\n * () => \u03A8`review the API design`, // <-- compose a critique pattern\n * ] })`review everything`\n * // Mixed: some tasks are plain strings, others are pattern calls\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 * unless a function (pattern call) is provided in the tasks array.\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport { getErrorMessage } from '../utils.ts'\nimport {\n ask,\n build,\n confirmPhase,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\n type QualityReviewResult,\n runQualityReview,\n type TaskDescriptor,\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 FleetOptions extends PatternOptions {\n /** Explicit array of task descriptions or pattern calls. When provided, template is ignored. */\n tasks?: TaskDescriptor[]\n /** Maximum concurrency. Default: 5 */\n concurrency?: number\n /** Run a quality review on the fleet results. Default: false */\n qualityCheck?: boolean\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 /** Quality review, if qualityCheck was enabled */\n public readonly qualityReview?: QualityReviewResult\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?: TaskDescriptor[]): TaskDescriptor[] {\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 Task 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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction describeTask(task: TaskDescriptor): string {\n if (typeof task === 'function') return '(composed pattern)'\n return task\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: TaskDescriptor,\n opts: FleetOptions,\n workerModel?: string\n): Promise<FleetMemberOutput> {\n // If task is a function (pattern call), invoke it\n if (typeof task === 'function') {\n try {\n const text = await task('')\n return new FleetMemberOutput('(composed pattern)', text, true)\n } catch (err) {\n return new FleetMemberOutput('(composed pattern)', '', false, getErrorMessage(err))\n }\n }\n // String task: normal LLM call\n const model = workerModel ?? opts.model\n try {\n const text = await ask(task, {\n ...opts,\n model,\n system: mergeSystem(opts.system, FLEET_SYSTEM),\n })\n return new FleetMemberOutput(task, text, true)\n } catch (err) {\n return new FleetMemberOutput(task, '', false, getErrorMessage(err))\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 = describeTask(tasks[i])\n process.stderr.write(` [${i + 1}] ${t.slice(0, 60)}${t.length > 60 ? '...' : ''}\\n`)\n }\n }\n\n // Confirm before execution (optional)\n const taskSummary = `Execute ${tasks.length} fleet task(s)?\\n ${tasks.map((t, i) => `${i + 1}. ${describeTask(t).slice(0, 80)}`).join('\\n ')}`\n if (!(await confirmPhase(taskSummary, opts))) {\n throw new Error('pizx/\u03A6: Execution cancelled by user.')\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(\n new FleetMemberOutput(describeTask(batch[idx]), '', false, r.reason?.toString())\n )\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 // Quality review (optional) \u2014 review the fleet results as a whole\n if (!opts.quiet && opts.qualityCheck) process.stderr.write(' \u2192 Quality review...\\n')\n const qualityReview = await runQualityReview(template, header + summary, opts)\n\n return new FleetOutput(header + summary, results, t0, t1, qualityReview)\n}\n\n/** \u03A6 tag \u2014 Fleet: parallel agent execution */\nexport const \u03A6 = createPatternTag(defaults, execute)\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 {\n ask,\n build,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\n type QualityReviewResult,\n runQualityReview,\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\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 /** Run a quality review on the final graph output. Default: false */\n qualityCheck?: boolean\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 /** Quality review, if qualityCheck was enabled */\n public readonly qualityReview?: QualityReviewResult\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 ...opts,\n model: workerModel,\n system: mergeSystem(opts.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 // Quality review (optional)\n if (!opts.quiet && opts.qualityCheck) process.stderr.write(' \u2192 Quality review...\\n')\n const qualityReview = await runQualityReview(template, finalOutput, opts)\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, qualityReview)\n}\n\n/** \u0393 tag \u2014 Graph: DAG-based task execution */\nexport const \u0393 = createPatternTag(defaults, execute)\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 { MEMORY_ROLE_SETS } from './role-sets.ts'\nimport {\n ask,\n build,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\n type QualityReviewResult,\n runQualityReview,\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 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 /** Run a quality review on the final synthesis. Default: false */\n qualityCheck?: boolean\n}\n\nconst defaults: MemoryOptions = {\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 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 /** Quality review, if qualityCheck was enabled */\n public readonly qualityReview?: QualityReviewResult\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 ?? MEMORY_ROLE_SETS[agentCount] ?? MEMORY_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, { ...opts, model: workerModel })\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 ...opts,\n model: plannerModel,\n thinkingLevel: 'high' as ThinkingLevel,\n system: mergeSystem(opts.system, CONSOLIDATOR_SYSTEM),\n }\n )\n\n // Quality review (optional)\n if (!opts.quiet && opts.qualityCheck) process.stderr.write(' \u2192 Quality review...\\n')\n const qualityReview = await runQualityReview(topic, synthesis, opts)\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, qualityReview)\n}\n\n/** \u039C tag \u2014 Memory: shared blackboard pattern */\nexport const \u039C = createPatternTag(defaults, execute)\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 {\n ask,\n build,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\n type QualityReviewResult,\n runQualityReview,\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 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 /** Run a quality review on the final synthesis. Default: false */\n qualityCheck?: boolean\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 /** Quality review, if qualityCheck was enabled */\n public readonly qualityReview?: QualityReviewResult\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 ...opts,\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 ...opts,\n model: opts.plannerModel ?? opts.model,\n maxTokens: 512,\n thinkingLevel: 'high' as ThinkingLevel,\n system: mergeSystem(opts.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 ...opts,\n model: workerModel,\n system: mergeSystem(opts.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 ...opts,\n model: workerModel,\n system: mergeSystem(opts.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 ...opts,\n model: opts.plannerModel ?? opts.model,\n thinkingLevel: 'high' as ThinkingLevel,\n system: mergeSystem(opts.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 // Quality review (optional)\n if (!opts.quiet && opts.qualityCheck) process.stderr.write(' \u2192 Quality review...\\n')\n const qualityReview = await runQualityReview(task, synthesis, opts)\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(\n summary,\n roles,\n workflow,\n reasoning,\n roleResults,\n synthesis,\n t0,\n t1,\n qualityReview\n )\n}\n\n/** \u039D tag \u2014 Self-Organizing Teams: auto-negotiate roles and workflow */\nexport const \u039D = createPatternTag(defaults, execute)\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 {\n ask,\n build,\n confirmPhase,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\n type PhaseEntry,\n type QualityReviewResult,\n runQualityReview,\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 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 /** Run a quality review on the final synthesis. Default: false */\n qualityCheck?: boolean\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 /** Quality review, if qualityCheck was enabled */\n public readonly qualityReview?: QualityReviewResult\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 const phases: PhaseEntry[] = []\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 planStart = Date.now()\n const planText = await ask(request, {\n ...opts,\n model: plannerModel,\n thinkingLevel: 'high' as ThinkingLevel,\n system: mergeSystem(opts.system, PLANNER_SYSTEM.replace('{$workerCount}', String(workerCount))),\n })\n phases.push({\n phase: 'plan',\n durationMs: Date.now() - planStart,\n description: `Generated plan with ${workerCount} workers`,\n modelUsed: plannerModel,\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 // Confirm before dispatch (optional)\n const planSummary =\n tasks.length > 0\n ? `Execute ${tasks.length} sub-task(s) as planned?\\n ${tasks.map((t, i) => `${i + 1}. ${t.slice(0, 80)}`).join('\\n ')}`\n : `Execute the plan?`\n if (!(await confirmPhase(planSummary, opts))) {\n throw new Error('pizx/\u03A9: Execution cancelled by user.')\n }\n\n // 2. Dispatch (parallel execution with concurrency limit)\n const workerResults: OrchestratorWorkerResult[] = []\n const concurrency = opts.concurrency ?? 3\n const dispatchStart = Date.now()\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, { ...opts, model: workerModel, system: mergeSystem(opts.system, WORKER_SYSTEM) })\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 const succeeded = workerResults.filter((w) => w.success).length\n phases.push({\n phase: 'dispatch',\n durationMs: Date.now() - dispatchStart,\n description: `Executed ${workerResults.length} worker(s), ${succeeded} succeeded`,\n modelUsed: workerModel,\n callCount: workerResults.length,\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 synthStart = Date.now()\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 ...opts,\n model: plannerModel,\n thinkingLevel: 'high' as ThinkingLevel,\n system: mergeSystem(opts.system, SYNTHESIS_SYSTEM),\n }\n )\n phases.push({\n phase: 'synthesize',\n durationMs: Date.now() - synthStart,\n description: 'Synthesized worker results into final deliverable',\n modelUsed: plannerModel,\n })\n\n // 4. Quality review (optional)\n if (!opts.quiet && opts.qualityCheck) process.stderr.write(' \u2192 Quality review...\\n')\n const qualityStart = Date.now()\n const qualityReview = await runQualityReview(request, synthesis, opts)\n if (qualityReview) {\n phases.push({\n phase: 'quality-review',\n durationMs: Date.now() - qualityStart,\n description: `Score: ${qualityReview.score.toFixed(2)} \u2014 ${qualityReview.assessment.slice(0, 60)}`,\n modelUsed: plannerModel,\n })\n }\n\n const t1 = Date.now()\n\n const reviewSection = qualityReview\n ? `\\n\\nQuality Review: ${qualityReview.score.toFixed(2)} \u2014 ${qualityReview.assessment}\\n Recommendation: ${qualityReview.recommendation}`\n : ''\n\n const summary = `Plan:\\n${planText}\\n\\nWorkers: ${workerResults.filter((w) => w.success).length}/${workerResults.length} succeeded\\n\\nSynthesis:\\n${synthesis}${reviewSection}`\n\n const output = new OrchestratorOutput(\n summary,\n planText,\n synthesis,\n workerResults,\n t0,\n t1,\n qualityReview\n )\n output.phaseLog = phases\n return output\n}\n\n/** \u03A9 tag \u2014 Orchestrator: plan \u2192 dispatch \u2192 synthesize */\nexport const \u03A9 = createPatternTag(defaults, execute)\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({ stages: [\n * 'analyze the code', // string: standard LLM call\n * (prev) => \u03A8`review this: ${prev}`, // function: compose a critique pattern\n * ] })`analyze \u2192 review`\n * // Mixed: some stages are plain strings, others are pattern calls\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 passed as context.\n * When a stage is a function, it receives the previous stage's output string.\n */\n\nimport type { ThinkingLevel } from '@earendil-works/pi-ai'\nimport {\n ask,\n build,\n confirmPhase,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\n type QualityReviewResult,\n runQualityReview,\n type TaskDescriptor,\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 PipelineOptions extends PatternOptions {\n /** Explicit stage descriptors. String = LLM call, function = pattern call receiving previous output. */\n stages?: TaskDescriptor[]\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 /** Run a quality review on the final pipeline output. Default: false */\n qualityCheck?: boolean\n}\n\n/**\n * Resolve a stage to its description string, for display purposes.\n */\nfunction describeStage(stage: TaskDescriptor): string {\n if (typeof stage === 'function') return '(composed pattern)'\n return stage\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 /** Quality review, if qualityCheck was enabled */\n public readonly qualityReview?: QualityReviewResult\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(\n template: string,\n explicitStages?: TaskDescriptor[],\n separator?: string\n): TaskDescriptor[] {\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 // Confirm before pipeline execution (optional)\n const stageSummary = `Run ${stages.length} pipeline stage(s)?\\n ${stages.map((s, i) => `${i + 1}. ${describeStage(s)}`).join('\\n ')}`\n if (!(await confirmPhase(stageSummary, opts))) {\n throw new Error('pizx/\u039B: Execution cancelled by user.')\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 stageLabel = describeStage(stage)\n const customPrompt = opts.stagePrompts?.[i]\n\n if (!opts.quiet)\n process.stderr.write(` \u2192 Stage ${i + 1}/${stages.length}: ${stageLabel.slice(0, 50)}...\\n`)\n\n let output: string\n\n if (typeof stage === 'function') {\n // Pattern call: invoke with previous output as context\n output = await stage(currentInput)\n } else {\n // String stage: standard LLM call\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 output = await ask(prompt, {\n ...opts,\n model: workerModel,\n system: mergeSystem(opts.system, systemMessage),\n })\n }\n\n stageResults.push(new PipelineStageResult(stageLabel, output, i))\n currentInput = output\n }\n\n const t1 = Date.now()\n const finalOutput = currentInput\n\n // Quality review (optional) \u2014 use the original template as the request\n if (!opts.quiet && opts.qualityCheck) process.stderr.write(' \u2192 Quality review...\\n')\n const qualityReview = await runQualityReview(template, finalOutput, opts)\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, qualityReview)\n}\n\n/** \u039B tag \u2014 Pipeline: sequential agent chain */\nexport const \u039B = createPatternTag(defaults, execute)\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 createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\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 messages = session.messages\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg?.role !== 'assistant') continue\n const c = 'content' in msg ? (msg as { content: unknown }).content : undefined\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 }) => 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 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 ...opts,\n model: plannerModel,\n system: mergeSystem(opts.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 { ...opts, model: plannerModel, system: mergeSystem(opts.system, PLAN_SYSTEM) }\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 ...opts,\n model: workerModel,\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 ...opts,\n model: plannerModel,\n maxTokens: 1024,\n thinkingLevel: 'high' as ThinkingLevel,\n system: mergeSystem(opts.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/** \u03A1 tag \u2014 Ralph Loop: iterative self-correcting loop */\nexport const \u03A1 = createPatternTag(defaults, execute)\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 {\n ask,\n build,\n confirmPhase,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\n type PhaseEntry,\n type QualityReviewResult,\n runQualityReview,\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 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 /** Run a quality review on the final synthesis. Default: false */\n qualityCheck?: boolean\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 /** Quality review, if qualityCheck was enabled */\n public readonly qualityReview?: QualityReviewResult\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 ...opts,\n model: opts.model,\n maxTokens: 1024,\n thinkingLevel: 'medium' as ThinkingLevel,\n system: mergeSystem(opts.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 const phases: PhaseEntry[] = []\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 decomposeStart = Date.now()\n const subTasks = await decomposeTask(task, { ...opts, model: plannerModel })\n phases.push({\n phase: 'decompose',\n durationMs: Date.now() - decomposeStart,\n description: `Decomposed into ${subTasks.length} sub-task(s)`,\n modelUsed: plannerModel,\n })\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 // Confirm before execution (optional)\n const subTaskSummary = `Execute ${subTasks.length} sub-task(s)?\\n ${subTasks.map((st, i) => `${i + 1}. ${st.slice(0, 80)}`).join('\\n ')}`\n if (!(await confirmPhase(subTaskSummary, opts))) {\n throw new Error('pizx/\u03A3: Execution cancelled by user.')\n }\n\n // 2. Execute sub-tasks in parallel (with concurrency limit)\n const subResults: SubagentResult[] = []\n const concurrency = opts.concurrency ?? 4\n const execStart = Date.now()\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, { ...opts, model: workerModel, system: mergeSystem(opts.system, SUBAGENT_SYSTEM) })\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 const succeeded = subResults.filter((r) => r.success).length\n phases.push({\n phase: 'execute',\n durationMs: Date.now() - execStart,\n description: `Executed ${subResults.length} sub-task(s), ${succeeded} succeeded`,\n modelUsed: workerModel,\n callCount: subResults.length,\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 const synthStart = Date.now()\n const synthesis = await ask(\n `Original task:\\n${task}\\n\\nSub-task results:\\n${subResultsText}\\n\\nSynthesize a comprehensive answer.`,\n { ...opts, model: plannerModel, system: mergeSystem(opts.system, SYNTHESIS_SYSTEM) }\n )\n phases.push({\n phase: 'synthesize',\n durationMs: Date.now() - synthStart,\n description: 'Synthesized sub-agent results',\n modelUsed: plannerModel,\n })\n\n // 4. Quality review (optional)\n if (!opts.quiet && opts.qualityCheck) process.stderr.write(' \u2192 Quality review...\\n')\n const qStart = Date.now()\n const qualityReview = await runQualityReview(task, synthesis, opts)\n if (qualityReview) {\n phases.push({\n phase: 'quality-review',\n durationMs: Date.now() - qStart,\n description: `Score: ${qualityReview.score.toFixed(2)}`,\n modelUsed: plannerModel,\n })\n }\n\n const t1 = Date.now()\n\n const output = new SubagentOutput(synthesis, synthesis, subResults, t0, t1, qualityReview)\n output.phaseLog = phases\n return output\n}\n\n/** \u03A3 tag \u2014 Subagents: hierarchical task delegation */\nexport const \u03A3 = createPatternTag(defaults, execute)\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 {\n ask,\n build,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\n type QualityReviewResult,\n runQualityReview,\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 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 /** Run a quality review on the final synthesis. Default: false */\n qualityCheck?: boolean\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 /** Quality review, if qualityCheck was enabled */\n public readonly qualityReview?: QualityReviewResult\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 ...opts,\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 ...opts,\n model: workerModel,\n system: mergeSystem(opts.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 ...opts,\n model: opts.plannerModel ?? opts.model,\n thinkingLevel: 'high' as ThinkingLevel,\n system: mergeSystem(opts.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 // Quality review (optional)\n if (!opts.quiet && opts.qualityCheck) process.stderr.write(' \u2192 Quality review...\\n')\n const qualityReview = await runQualityReview(task, synthesis, opts)\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, qualityReview)\n}\n\n/** \u03A4 tag \u2014 Tool-Mediated Orchestration: shared structured key-value store */\nexport const \u03A4 = createPatternTag(defaults, execute)\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 { THREAD_ROLE_SETS } from './role-sets.ts'\nimport {\n ask,\n build,\n createPatternTag,\n mergeSystem,\n type PatternOptions,\n PatternOutput,\n type QualityReviewResult,\n runQualityReview,\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 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 /** Run a quality review on the final conclusion. Default: false */\n qualityCheck?: boolean\n}\n\nconst defaults: ThreadOptions = {\n maxTokens: 4096,\n thinkingLevel: 'medium' as ThinkingLevel,\n agents: 3,\n turns: 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 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 /** Quality review, if qualityCheck was enabled */\n public readonly qualityReview?: QualityReviewResult\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 ?? THREAD_ROLE_SETS[agentCount] ?? THREAD_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, { ...opts, model: workerModel })\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 ...opts,\n model: plannerModel,\n thinkingLevel: 'high' as ThinkingLevel,\n system: mergeSystem(opts.system, SYNTHESIS_SYSTEM),\n }\n )\n\n // Quality review (optional)\n if (!opts.quiet && opts.qualityCheck) process.stderr.write(' \u2192 Quality review...\\n')\n const qualityReview = await runQualityReview(topic, conclusion, opts)\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, qualityReview)\n}\n\n/** \u0398 tag \u2014 Thread: direct agent-to-agent conversation */\nexport const \u0398 = createPatternTag(defaults, execute)\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 type SimpleStreamOptions,\n streamSimple,\n type ThinkingLevel,\n} from '@earendil-works/pi-ai'\nimport { PiOutput } from './pi-output.ts'\n\nexport { PiOutput }\n\nimport { pickModel } from './model-picker.ts'\nimport type { CallTrace } from './patterns/types.ts'\nimport { build } from './patterns/types.ts'\nimport { getErrorMessage } from './utils.ts'\n\nexport interface PiOptions {\n model?: string\n thinkingLevel?: ThinkingLevel\n quiet?: boolean\n system?: string\n maxTokens?: number\n /** Timeout in milliseconds for each LLM call. Default: provider SDK default. */\n timeoutMs?: number\n /** Maximum retry attempts for transient failures. Default: provider SDK default (typically 2). */\n maxRetries?: number\n}\n\nconst defaults: PiOptions = {\n thinkingLevel: 'medium' as ThinkingLevel,\n quiet: false,\n maxTokens: 4096,\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 timeoutMs: opts.timeoutMs,\n maxRetries: opts.maxRetries,\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 let traceEntry: CallTrace | undefined\n try {\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 } else if (ev.type === 'done') {\n const msg = (\n ev as {\n message?: {\n usage?: {\n input: number\n output: number\n cacheRead: number\n cacheWrite: number\n totalTokens: number\n cost: { total: number }\n }\n }\n }\n ).message\n if (msg?.usage) {\n traceEntry = {\n call: 1,\n modelId: model.id,\n promptPreview: build(pieces, args).slice(0, 200),\n outputPreview: text.slice(0, 200),\n inputTokens: msg.usage.input,\n outputTokens: msg.usage.output,\n cacheReadTokens: msg.usage.cacheRead,\n cacheWriteTokens: msg.usage.cacheWrite,\n totalTokens: msg.usage.totalTokens,\n cost: msg.usage.cost.total,\n durationMs: Date.now() - t0,\n }\n }\n }\n }\n } catch (err) {\n throw new Error(`pizx/\u03C0: AI generation failed: ${getErrorMessage(err)}`)\n }\n if (!opts.quiet && text) process.stdout.write('\\n')\n const output = new PiOutput(text.trim(), model.id, [], t0, Date.now())\n if (traceEntry) output.trace = [traceEntry]\n return output\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\nimport type { CallTrace } from './patterns/types.ts'\n\nexport class PiOutput {\n /** Trace entry for this single LLM call. Populated by the \u03C0 tag. */\n public trace: CallTrace[] = []\n\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 /** Total input tokens (convenience accessor) */\n get inputTokens(): number {\n return this.trace[0]?.inputTokens ?? 0\n }\n\n /** Total output tokens (convenience accessor) */\n get outputTokens(): number {\n return this.trace[0]?.outputTokens ?? 0\n }\n\n /** Total tokens (convenience accessor) */\n get totalTokens(): number {\n return this.trace[0]?.totalTokens ?? 0\n }\n\n /** Total cost in USD (convenience accessor) */\n get totalCost(): number {\n return this.trace[0]?.cost ?? 0\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'\nimport { build } from './patterns/types.ts'\nimport { getErrorMessage } from './utils.ts'\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 try {\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 } catch (err) {\n throw new Error(`pizx/\u03A0: Failed to create agent session: ${getErrorMessage(err)}`)\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\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 const turnCount = session.messages.filter((m) => m.role === 'assistant').length\n\n return new AgentOutput(text || '(no assistant response)', turnCount, t0, t1)\n } catch (err) {\n const t1 = Date.now()\n console.error('\u03A0 error:', err)\n return new AgentOutput(`\u03A0 error: ${getErrorMessage(err)}`, 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": "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",
|
|
6
|
+
"names": ["process", "existsSync", "readFileSync", "homedir", "join", "join", "homedir", "existsSync", "readFileSync", "order", "m", "defaults", "execute", "defaults", "execute", "defaults", "execute", "defaults", "execute", "defaults", "SYNTHESIS_SYSTEM", "execute", "defaults", "execute", "defaults", "execute", "defaults", "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", "SYNTHESIS_SYSTEM", "execute", "defaults", "createAgentSession", "createAgentSession", "execute", "require", "process", "createRequire"]
|
|
7
7
|
}
|