create-expert 0.0.9 → 0.0.10
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 +42 -5
- package/dist/bin/cli.js +1871 -0
- package/dist/bin/cli.js.map +1 -0
- package/package.json +1 -1
- package/dist/cli.js +0 -800
- package/dist/cli.js.map +0 -1
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../bin/cli.ts","../src/lib/agents-md-template.ts","../src/lib/create-expert-toml.ts","../src/lib/detect-llm.ts","../src/lib/detect-runtime.ts","../src/tui/wizard/render.tsx","../src/tui/wizard/app.tsx"],"sourcesContent":["#!/usr/bin/env node\nimport { spawn } from \"node:child_process\"\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { Command } from \"commander\"\nimport { config } from \"dotenv\"\nimport {\n detectAllLLMs,\n detectAllRuntimes,\n generateAgentsMd,\n generateCreateExpertToml,\n getDefaultModel,\n} from \"../src/index.js\"\nimport type { LLMProvider } from \"../src/tui/index.js\"\nimport { renderWizard } from \"../src/tui/index.js\"\n\nconfig()\n\nfunction getEnvVarName(provider: LLMProvider): string {\n switch (provider) {\n case \"anthropic\":\n return \"ANTHROPIC_API_KEY\"\n case \"openai\":\n return \"OPENAI_API_KEY\"\n case \"google\":\n return \"GOOGLE_GENERATIVE_AI_API_KEY\"\n }\n}\n\nconst program = new Command()\n .name(\"create-expert\")\n .description(\"Create Perstack Experts interactively\")\n .version(\"0.0.1\")\n .argument(\"[expertName]\", \"Expert name to improve (for improvement mode)\")\n .argument(\"[improvements]\", \"Improvement description (for improvement mode)\")\n .option(\"--cwd <path>\", \"Working directory\", process.cwd())\n .action(async (expertName?: string, improvements?: string, options?: { cwd: string }) => {\n const cwd = options?.cwd || process.cwd()\n const isImprovement = Boolean(expertName)\n const improvementTarget = improvements || \"\"\n const perstackTomlPath = join(cwd, \"perstack.toml\")\n const agentsMdPath = join(cwd, \"AGENTS.md\")\n const envPath = join(cwd, \".env\")\n const llms = detectAllLLMs()\n const runtimes = detectAllRuntimes()\n const wizardResult = await renderWizard({\n llms,\n runtimes,\n isImprovement,\n improvementTarget,\n })\n if (!wizardResult) {\n console.log(\"Wizard cancelled.\")\n process.exit(0)\n }\n if (wizardResult.apiKey && wizardResult.provider) {\n const envVarName = getEnvVarName(wizardResult.provider)\n const envContent = `${envVarName}=${wizardResult.apiKey}\\n`\n if (existsSync(envPath)) {\n const existing = readFileSync(envPath, \"utf-8\")\n const hasEnvVar = new RegExp(`^${envVarName}=`, \"m\").test(existing)\n if (!hasEnvVar) {\n writeFileSync(envPath, `${existing}\\n${envContent}`)\n console.log(`✓ Added ${envVarName} to .env`)\n }\n } else {\n writeFileSync(envPath, envContent)\n console.log(`✓ Created .env with ${envVarName}`)\n }\n process.env[envVarName] = wizardResult.apiKey\n }\n const isDefaultRuntime = wizardResult.runtime === \"default\"\n if (!isImprovement) {\n if (isDefaultRuntime) {\n const provider = wizardResult.provider || \"anthropic\"\n const model = wizardResult.model || getDefaultModel(provider)\n const agentsMd = generateAgentsMd({ provider, model })\n writeFileSync(agentsMdPath, agentsMd)\n console.log(\"✓ Created AGENTS.md\")\n const createExpertToml = generateCreateExpertToml({ provider, model })\n writeFileSync(perstackTomlPath, createExpertToml)\n console.log(\"✓ Created perstack.toml with create-expert Expert\")\n } else {\n const provider = wizardResult.provider || \"anthropic\"\n const model = wizardResult.model || getDefaultModel(provider)\n const agentsMd = generateAgentsMd({\n provider,\n model,\n runtime: wizardResult.runtime,\n })\n writeFileSync(agentsMdPath, agentsMd)\n console.log(\"✓ Created AGENTS.md\")\n const createExpertToml = generateCreateExpertToml({\n provider,\n model,\n runtime: wizardResult.runtime,\n })\n writeFileSync(perstackTomlPath, createExpertToml)\n console.log(\"✓ Created perstack.toml with create-expert Expert\")\n }\n }\n const expertDescription = wizardResult.expertDescription || \"\"\n const query = isImprovement\n ? `Improve the Expert \"${expertName}\": ${expertDescription}`\n : `Create a new Expert based on these requirements: ${expertDescription}`\n const runtimeArg = isDefaultRuntime ? [] : [\"--runtime\", wizardResult.runtime]\n const args = [\"perstack\", \"start\", \"create-expert\", query, ...runtimeArg]\n const proc = spawn(\"npx\", args, {\n cwd,\n env: process.env,\n stdio: \"inherit\",\n })\n proc.on(\"exit\", (code) => {\n process.exit(code || 0)\n })\n })\n\nprogram.parse()\n","import type { LLMProvider, RuntimeType } from \"../tui/index.js\"\n\ninterface AgentsMdOptions {\n provider: LLMProvider\n model: string\n runtime?: RuntimeType | \"default\"\n}\n\nexport function generateAgentsMd(options: AgentsMdOptions): string {\n const { provider, model, runtime } = options\n const isNonDefaultRuntime = runtime && runtime !== \"default\"\n const runtimeSection = isNonDefaultRuntime ? `runtime = \"${runtime}\"` : \"\"\n return `# AGENTS.md\n\n## What is Perstack\n\nPerstack is a package manager and runtime for agent-first development. It enables you to define, test, and share modular AI agents called \"Experts\".\n\nKey concepts:\n- **Experts**: Modular micro-agents defined in TOML\n- **Runtime**: Executes Experts with isolation, observability, and sandbox support\n- **Registry**: Public registry for sharing and reusing Experts\n\n## Project Configuration\n\nThis project uses:\n- Provider: ${provider}\n- Model: ${model}\n${isNonDefaultRuntime ? `- Runtime: ${runtime}` : \"- Runtime: docker (default)\"}\n\n## CLI Reference\n\n### Running Experts\n\n**\\`perstack start\\`** - Interactive workbench for developing and testing Experts\n\\`\\`\\`bash\nperstack start [expertKey] [query]\n\\`\\`\\`\n\n**\\`perstack run\\`** - Headless execution for production and automation\n\\`\\`\\`bash\nperstack run <expertKey> <query> [options]\n\\`\\`\\`\n\n### Common Options\n\n| Option | Description | Default |\n|--------|-------------|---------|\n| \\`--provider <provider>\\` | LLM provider | \\`anthropic\\` |\n| \\`--model <model>\\` | Model name | \\`claude-sonnet-4-5\\` |\n| \\`--max-steps <n>\\` | Maximum steps | unlimited |\n| \\`--runtime <runtime>\\` | Execution runtime | \\`docker\\` |\n\n### Available Runtimes\n\n- \\`docker\\` — Containerized runtime with network isolation (default)\n- \\`local\\` — Built-in runtime without isolation\n- \\`cursor\\` — Cursor CLI (experimental)\n- \\`claude-code\\` — Claude Code CLI (experimental)\n- \\`gemini\\` — Gemini CLI (experimental)\n\n## perstack.toml Format\n\n\\`\\`\\`toml\nmodel = \"${model}\"\n${runtimeSection}\n\n[provider]\nproviderName = \"${provider}\"\n\n[experts.\"my-expert\"]\nversion = \"1.0.0\"\ndescription = \"Brief description\"\ninstruction = \"\"\"\nDetailed instructions for the expert.\n\"\"\"\n\n[experts.\"my-expert\".skills.\"@perstack/base\"]\ntype = \"mcpStdioSkill\"\ncommand = \"npx\"\npackageName = \"@perstack/base\"\n\\`\\`\\`\n\n## Best Practices for Creating Experts\n\n### 1. Do One Thing Well\n\nBad:\n\\`\\`\\`toml\n[experts.\"assistant\"]\ndescription = \"Handles inquiries, reports, meetings, and expenses\"\n\\`\\`\\`\n\nGood:\n\\`\\`\\`toml\n[experts.\"customer-support\"]\ndescription = \"Answers customer questions about products and orders\"\n\\`\\`\\`\n\n### 2. Trust the LLM, Define Domain Knowledge\n\nBad (procedural):\n\\`\\`\\`toml\ninstruction = \"\"\"\n1. First, greet the customer\n2. Ask for their order number\n3. Look up the order\n\"\"\"\n\\`\\`\\`\n\nGood (declarative):\n\\`\\`\\`toml\ninstruction = \"\"\"\nYou are a customer support specialist.\n\nKey policies:\n- Orders ship within 2 business days\n- Free returns within 30 days\n- VIP customers get priority handling\n\nTone: Friendly but professional.\n\"\"\"\n\\`\\`\\`\n\n### 3. Let Them Collaborate\n\nUse delegation for complex workflows:\n\\`\\`\\`toml\n[experts.\"coordinator\"]\ndelegates = [\"researcher\", \"writer\", \"reviewer\"]\n\n[experts.\"researcher\"]\ndescription = \"Gathers information from various sources\"\n\\`\\`\\`\n\n### 4. Keep It Verifiable\n\nWrite clear, predictable instructions:\n\\`\\`\\`toml\ninstruction = \"\"\"\nApproval rules:\n- Under $100: Auto-approve with receipt\n- $100-$500: Approve if business purpose is clear\n- Over $500: Flag for manager review\n\"\"\"\n\\`\\`\\`\n\n### 5. Ship Early\n\nStart minimal, expand based on real usage. Don't over-engineer.\n\n## Finding Skills (MCP Servers)\n\nSkills extend Experts with external capabilities via MCP (Model Context Protocol).\n\n### MCP Registry\n\nSearch for MCP servers at: https://registry.modelcontextprotocol.io\n\n**API Reference:**\n\\`\\`\\`bash\n# List all servers\ncurl \"https://registry.modelcontextprotocol.io/v0.1/servers\"\n\n# Search by name\ncurl \"https://registry.modelcontextprotocol.io/v0.1/servers?search=filesystem\"\n\n# Get specific server\ncurl \"https://registry.modelcontextprotocol.io/v0.1/servers/{serverName}/versions/{version}\"\n\\`\\`\\`\n\n### Using MCP Skills\n\n**npm packages (most common):**\n\\`\\`\\`toml\n[experts.\"my-expert\".skills.\"web-search\"]\ntype = \"mcpStdioSkill\"\ncommand = \"npx\"\npackageName = \"exa-mcp-server\"\nrequiredEnv = [\"EXA_API_KEY\"]\npick = [\"web_search_exa\"] # Optional: whitelist tools\n\\`\\`\\`\n\n**Remote servers (SSE):**\n\\`\\`\\`toml\n[experts.\"my-expert\".skills.\"remote-api\"]\ntype = \"mcpSseSkill\"\nendpoint = \"https://api.example.com/mcp\"\n\\`\\`\\`\n\n### Built-in Base Skill\n\n\\`@perstack/base\\` provides essential tools:\n- File operations: \\`readTextFile\\`, \\`writeTextFile\\`, \\`editTextFile\\`, etc.\n- Shell execution: \\`exec\\`\n- Control flow: \\`attemptCompletion\\`, \\`think\\`, \\`todo\\`\n\n\\`\\`\\`toml\n[experts.\"my-expert\".skills.\"@perstack/base\"]\ntype = \"mcpStdioSkill\"\ncommand = \"npx\"\npackageName = \"@perstack/base\"\n\\`\\`\\`\n\n## Testing Experts\n\n1. Start with \\`perstack start\\` for interactive development\n2. Test happy path scenarios first\n3. Test edge cases and error scenarios\n4. Verify outputs match expectations\n5. Use \\`--max-steps\\` to limit runaway executions\n\n## Project Files\n\n- \\`perstack.toml\\` - Expert definitions and runtime config\n- \\`AGENTS.md\\` - This file, for AI agent context\n- \\`.env\\` - Environment variables (API keys)\n- \\`perstack/\\` - Execution history (auto-managed)\n`\n}\n","import type { LLMProvider, RuntimeType } from \"../tui/index.js\"\n\ninterface CreateExpertTomlOptions {\n provider: LLMProvider\n model: string\n runtime?: \"default\" | RuntimeType\n}\n\nexport function generateCreateExpertToml(options: CreateExpertTomlOptions): string {\n const runtimeLine =\n options.runtime && options.runtime !== \"default\" ? `runtime = \"${options.runtime}\"\\n` : \"\"\n return `model = \"${options.model}\"\n${runtimeLine}\n[provider]\nproviderName = \"${options.provider}\"\n\n[experts.\"create-expert\"]\nversion = \"1.0.0\"\ndescription = \"Creates and tests new Perstack Experts based on user requirements\"\ninstruction = \"\"\"\nYou are an Expert creator for Perstack. Your job is to create well-designed Experts based on user requirements.\n\n## Your Workflow\n\n1. **Understand Requirements**: Analyze what the user wants the Expert to do\n2. **Design the Expert**: Plan the structure, skills needed, and delegation patterns\n3. **Implement**: Write the Expert definition in perstack.toml\n4. **Test**: Run the Expert with realistic test cases\n5. **Iterate**: Fix issues and improve based on test results\n\n## Design Principles\n\n1. **Do One Thing Well**: Each Expert should focus on a single responsibility\n2. **Define Domain Knowledge**: Write declarative instructions with policies, not procedures\n3. **Use Delegation**: Break complex tasks into collaborating Experts\n4. **Keep It Verifiable**: Write clear, predictable behavior\n5. **Start Simple**: Begin minimal, expand based on real needs\n\n## Expert Structure\n\n[experts.\"expert-name\"]\nversion = \"1.0.0\"\ndescription = \"Brief description visible to delegators\"\ninstruction = \"Domain knowledge, policies, and constraints.\"\ndelegates = [\"other-expert\"]\n\n[experts.\"expert-name\".skills.\"skill-name\"]\ntype = \"mcpStdioSkill\"\ncommand = \"npx\"\npackageName = \"package-name\"\n\n## Finding Skills\n\nSearch MCP Registry for available skills:\n- Browse: https://registry.modelcontextprotocol.io\n- API: GET /v0.1/servers?search=<query>\n\nCommon skills:\n- \\`@perstack/base\\` - File operations, shell, control flow\n- \\`exa-mcp-server\\` - Web search (requires EXA_API_KEY)\n- \\`@anthropic/mcp-server-memory\\` - Persistent memory\n\n## Testing Protocol\n\nFor each Expert you create:\n\n1. **Happy Path Tests**\n - Test the primary use case with normal inputs\n - Verify the output matches expectations\n\n2. **Edge Case Tests**\n - Empty or minimal inputs\n - Unusual but valid inputs\n - Boundary conditions\n\n3. **Error Handling Tests**\n - Invalid inputs\n - Missing required data\n - Skill failures\n\nUse \\`npx -y perstack run\\` to execute tests:\n\\`\\`\\`bash\nnpx -y perstack run expert-name \"test query\"\n\\`\\`\\`\n\n## Iteration Process\n\nAfter each test:\n1. Review the output\n2. Identify issues or improvements\n3. Update the Expert definition\n4. Re-run tests to verify fixes\n\nContinue until all tests pass and the Expert behaves as expected.\n\"\"\"\n\n[experts.\"create-expert\".skills.\"@perstack/base\"]\ntype = \"mcpStdioSkill\"\ncommand = \"npx\"\npackageName = \"@perstack/base\"\n`\n}\n","import type { LLMInfo, LLMProvider } from \"../tui/index.js\"\n\nconst LLM_CONFIGS: Record<\n LLMProvider,\n { envVar: string; displayName: string; defaultModel: string }\n> = {\n anthropic: {\n envVar: \"ANTHROPIC_API_KEY\",\n displayName: \"Anthropic (Claude)\",\n defaultModel: \"claude-sonnet-4-5\",\n },\n openai: { envVar: \"OPENAI_API_KEY\", displayName: \"OpenAI\", defaultModel: \"gpt-4o\" },\n google: {\n envVar: \"GOOGLE_GENERATIVE_AI_API_KEY\",\n displayName: \"Google (Gemini)\",\n defaultModel: \"gemini-2.5-pro\",\n },\n}\n\nexport function detectLLM(provider: LLMProvider): LLMInfo {\n const config = LLM_CONFIGS[provider]\n return {\n provider,\n envVar: config.envVar,\n available: Boolean(process.env[config.envVar]),\n displayName: config.displayName,\n defaultModel: config.defaultModel,\n }\n}\n\nexport function detectAllLLMs(): LLMInfo[] {\n return (Object.keys(LLM_CONFIGS) as LLMProvider[]).map(detectLLM)\n}\n\nexport function getAvailableLLMs(): LLMInfo[] {\n return detectAllLLMs().filter((l) => l.available)\n}\n\nexport function getDefaultModel(provider: LLMProvider): string {\n return LLM_CONFIGS[provider].defaultModel\n}\n","import { execSync } from \"node:child_process\"\nimport type { RuntimeInfo } from \"../tui/index.js\"\n\nfunction checkCommand(command: string): { available: boolean; version?: string } {\n try {\n const result = execSync(`${command} --version`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n })\n const firstLine = result.trim().split(\"\\n\")[0]\n return { available: true, version: firstLine }\n } catch {\n return { available: false }\n }\n}\n\nexport function detectCursor(): RuntimeInfo {\n const result = checkCommand(\"cursor\")\n return { type: \"cursor\", ...result }\n}\n\nexport function detectClaudeCode(): RuntimeInfo {\n const result = checkCommand(\"claude\")\n return { type: \"claude-code\", ...result }\n}\n\nexport function detectGemini(): RuntimeInfo {\n const result = checkCommand(\"gemini\")\n return { type: \"gemini\", ...result }\n}\n\nexport function detectAllRuntimes(): RuntimeInfo[] {\n return [detectCursor(), detectClaudeCode(), detectGemini()]\n}\n\nexport function getAvailableRuntimes(): RuntimeInfo[] {\n return detectAllRuntimes().filter((r) => r.available)\n}\n","import { render } from \"ink\"\nimport { App } from \"./app.js\"\nimport type { WizardOptions, WizardResult } from \"./types.js\"\n\nexport async function renderWizard(options: WizardOptions): Promise<WizardResult | null> {\n return new Promise((resolve) => {\n let result: WizardResult | null = null\n const { waitUntilExit } = render(\n <App\n llms={options.llms}\n runtimes={options.runtimes}\n isImprovement={options.isImprovement}\n improvementTarget={options.improvementTarget}\n onComplete={(wizardResult) => {\n result = wizardResult\n }}\n />,\n )\n waitUntilExit().then(() => resolve(result))\n })\n}\n","import { Box, Text, useApp, useInput } from \"ink\"\nimport { type ReactNode, useEffect, useState } from \"react\"\nimport type { LLMInfo, LLMProvider, RuntimeInfo, RuntimeType, WizardResult } from \"./types.js\"\n\ntype WizardStep =\n | \"detecting\"\n | \"select-runtime\"\n | \"select-llm\"\n | \"select-provider\"\n | \"input-api-key\"\n | \"input-expert-description\"\n | \"done\"\n\ninterface WizardProps {\n llms: LLMInfo[]\n runtimes: RuntimeInfo[]\n onComplete: (result: WizardResult) => void\n isImprovement?: boolean\n improvementTarget?: string\n}\n\ninterface RuntimeOption {\n key: string\n type: \"default\" | RuntimeType\n label: string\n version?: string\n}\n\nfunction SelectableList({\n items,\n selectedIndex,\n renderItem,\n}: {\n items: { key: string; label: string; disabled?: boolean }[]\n selectedIndex: number\n renderItem?: (\n item: { key: string; label: string; disabled?: boolean },\n selected: boolean,\n ) => ReactNode\n}) {\n return (\n <Box flexDirection=\"column\">\n {items.map((item, index) => {\n const isSelected = index === selectedIndex\n if (renderItem) {\n return <Box key={item.key}>{renderItem(item, isSelected)}</Box>\n }\n return (\n <Box key={item.key}>\n <Text color={item.disabled ? \"gray\" : isSelected ? \"cyan\" : \"white\"}>\n {isSelected ? \"❯ \" : \" \"}\n {item.label}\n {item.disabled ? \" (not available)\" : \"\"}\n </Text>\n </Box>\n )\n })}\n </Box>\n )\n}\n\nfunction TextInputComponent({\n value,\n onChange,\n onSubmit,\n placeholder,\n isSecret,\n}: {\n value: string\n onChange: (value: string) => void\n onSubmit: () => void\n placeholder?: string\n isSecret?: boolean\n}) {\n useInput((input, key) => {\n if (key.return) {\n onSubmit()\n } else if (key.backspace || key.delete) {\n onChange(value.slice(0, -1))\n } else if (!key.ctrl && !key.meta && input) {\n onChange(value + input)\n }\n })\n const displayValue = isSecret ? \"•\".repeat(value.length) : value\n return (\n <Box>\n <Text color=\"cyan\">{displayValue || <Text color=\"gray\">{placeholder}</Text>}</Text>\n <Text color=\"cyan\">█</Text>\n </Box>\n )\n}\n\nfunction getRuntimeDisplayName(type: RuntimeType): string {\n switch (type) {\n case \"cursor\":\n return \"Cursor\"\n case \"claude-code\":\n return \"Claude Code\"\n case \"gemini\":\n return \"Gemini CLI\"\n }\n}\n\nexport function App({ llms, runtimes, onComplete, isImprovement, improvementTarget }: WizardProps) {\n const { exit } = useApp()\n const [step, setStep] = useState<WizardStep>(\"detecting\")\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [result, setResult] = useState<Partial<WizardResult>>({})\n const [apiKeyInput, setApiKeyInput] = useState(\"\")\n const [expertDescInput, setExpertDescInput] = useState(improvementTarget || \"\")\n const availableLLMs = llms.filter((l) => l.available)\n const availableRuntimes = runtimes.filter((r) => r.available)\n const runtimeOptions: RuntimeOption[] = [\n { key: \"default\", type: \"default\", label: \"Default (built-in)\" },\n ...availableRuntimes.map((r) => ({\n key: r.type,\n type: r.type,\n label: `${getRuntimeDisplayName(r.type)}${r.version ? ` (${r.version})` : \"\"}`,\n version: r.version,\n })),\n ]\n const llmOptionsWithOther = [\n ...llms.map((l) => ({\n key: l.provider,\n label: `${l.displayName}${l.available ? \" ✓\" : \"\"}`,\n provider: l.provider,\n available: l.available,\n defaultModel: l.defaultModel,\n })),\n {\n key: \"other\",\n label: \"Other (configure new provider)\",\n provider: null,\n available: false,\n defaultModel: \"\",\n },\n ]\n useEffect(() => {\n if (step === \"detecting\") {\n const timer = setTimeout(() => {\n if (isImprovement) {\n const llm = availableLLMs[0]\n if (llm) {\n setResult({\n runtime: \"default\",\n provider: llm.provider,\n model: llm.defaultModel,\n })\n setStep(\"input-expert-description\")\n } else {\n setStep(\"select-runtime\")\n }\n } else {\n setStep(\"select-runtime\")\n }\n }, 500)\n return () => clearTimeout(timer)\n }\n return undefined\n }, [step, isImprovement, availableLLMs])\n useInput((_, key) => {\n if (key.escape) {\n exit()\n return\n }\n if (step === \"input-api-key\" || step === \"input-expert-description\") {\n return\n }\n if (key.upArrow) {\n setSelectedIndex((prev) => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex((prev) => {\n const maxIndex = getMaxIndex()\n return Math.min(maxIndex, prev + 1)\n })\n } else if (key.return) {\n handleSelect()\n }\n })\n function getMaxIndex(): number {\n switch (step) {\n case \"select-runtime\":\n return runtimeOptions.length - 1\n case \"select-llm\":\n return llmOptionsWithOther.length - 1\n case \"select-provider\":\n return llms.length - 1\n default:\n return 0\n }\n }\n function handleSelect() {\n switch (step) {\n case \"select-runtime\": {\n const selected = runtimeOptions[selectedIndex]\n if (!selected) break\n if (selected.type === \"default\") {\n setResult({ runtime: \"default\" })\n if (availableLLMs.length > 0) {\n setStep(\"select-llm\")\n } else {\n setStep(\"select-provider\")\n }\n } else {\n setResult({ runtime: selected.type })\n setStep(\"input-expert-description\")\n }\n setSelectedIndex(0)\n break\n }\n case \"select-llm\": {\n const selected = llmOptionsWithOther[selectedIndex]\n if (!selected) break\n if (selected.key === \"other\") {\n setStep(\"select-provider\")\n } else if (selected.available && selected.provider) {\n setResult((prev) => ({\n ...prev,\n provider: selected.provider as LLMProvider,\n model: selected.defaultModel,\n }))\n setStep(\"input-expert-description\")\n } else if (selected.provider) {\n setResult((prev) => ({ ...prev, provider: selected.provider as LLMProvider }))\n setStep(\"input-api-key\")\n }\n setSelectedIndex(0)\n break\n }\n case \"select-provider\": {\n const selected = llms[selectedIndex]\n if (!selected) break\n setResult((prev) => ({ ...prev, provider: selected.provider }))\n setStep(\"input-api-key\")\n setSelectedIndex(0)\n break\n }\n }\n }\n function handleApiKeySubmit() {\n if (apiKeyInput.trim()) {\n const selectedLlm = llms.find((l) => l.provider === result.provider) ?? llms[0]\n if (!selectedLlm) return\n setResult((prev) => ({\n ...prev,\n provider: selectedLlm.provider,\n model: selectedLlm.defaultModel,\n apiKey: apiKeyInput.trim(),\n }))\n setStep(\"input-expert-description\")\n }\n }\n function handleExpertDescSubmit() {\n if (expertDescInput.trim()) {\n const finalResult: WizardResult = {\n runtime: result.runtime || \"default\",\n provider: result.provider,\n model: result.model,\n apiKey: result.apiKey,\n expertDescription: expertDescInput.trim(),\n }\n onComplete(finalResult)\n setStep(\"done\")\n exit()\n }\n }\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n 🚀 Create Expert Wizard\n </Text>\n </Box>\n {step === \"detecting\" && (\n <Box>\n <Text color=\"yellow\">Detecting available runtimes...</Text>\n </Box>\n )}\n {step === \"select-runtime\" && (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text>Select a runtime:</Text>\n </Box>\n <SelectableList\n items={runtimeOptions.map((r) => ({ key: r.key, label: r.label }))}\n selectedIndex={selectedIndex}\n />\n <Box marginTop={1}>\n <Text color=\"gray\">↑↓ to move, Enter to select, Esc to exit</Text>\n </Box>\n </Box>\n )}\n {step === \"select-llm\" && (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text>Select an LLM provider:</Text>\n </Box>\n <SelectableList\n items={llmOptionsWithOther.map((l) => ({ key: l.key, label: l.label }))}\n selectedIndex={selectedIndex}\n />\n <Box marginTop={1}>\n <Text color=\"gray\">↑↓ to move, Enter to select</Text>\n </Box>\n </Box>\n )}\n {step === \"select-provider\" && (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color=\"yellow\">⚠ No LLM API keys found.</Text>\n </Box>\n <Box marginBottom={1}>\n <Text>Perstack requires an API key from one of these providers:</Text>\n </Box>\n <Box flexDirection=\"column\" marginBottom={1}>\n {llms.map((l) => (\n <Text key={l.provider} color=\"gray\">\n • {l.displayName} ({l.envVar})\n </Text>\n ))}\n </Box>\n <Box marginBottom={1}>\n <Text>Select a provider to configure:</Text>\n </Box>\n <SelectableList\n items={llms.map((l) => ({ key: l.provider, label: l.displayName }))}\n selectedIndex={selectedIndex}\n />\n <Box marginTop={1}>\n <Text color=\"gray\">↑↓ to move, Enter to select</Text>\n </Box>\n </Box>\n )}\n {step === \"input-api-key\" && (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text>\n Enter your {llms.find((l) => l.provider === result.provider)?.displayName || \"API\"}{\" \"}\n key:\n </Text>\n </Box>\n <TextInputComponent\n value={apiKeyInput}\n onChange={setApiKeyInput}\n onSubmit={handleApiKeySubmit}\n placeholder=\"sk-...\"\n isSecret={true}\n />\n <Box marginTop={1}>\n <Text color=\"gray\">Type your API key and press Enter</Text>\n </Box>\n </Box>\n )}\n {step === \"input-expert-description\" && (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>\n {isImprovement\n ? \"What improvements do you want?\"\n : \"What kind of Expert do you want to create?\"}\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text color=\"gray\">\n Describe the Expert's purpose, capabilities, or domain knowledge.\n </Text>\n </Box>\n <TextInputComponent\n value={expertDescInput}\n onChange={setExpertDescInput}\n onSubmit={handleExpertDescSubmit}\n placeholder=\"e.g., A code reviewer that checks for TypeScript best practices\"\n />\n <Box marginTop={1}>\n <Text color=\"gray\">Type your description and press Enter</Text>\n </Box>\n </Box>\n )}\n {step === \"done\" && (\n <Box>\n <Text color=\"green\">✓ Configuration complete! Starting Expert creation...</Text>\n </Box>\n )}\n </Box>\n )\n}\n"],"mappings":"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","names":["config","jsx"]}
|