@iqai/adk-cli 0.1.1
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/CHANGELOG.md +9 -0
- package/LICENSE.md +9 -0
- package/README.md +289 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1040 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1024 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../package.json","../src/commands/new.ts","../src/commands/run.ts","../src/commands/serve.ts","../src/server.ts","../src/commands/web.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport { program } from \"commander\";\nimport packageJson from \"../package.json\";\nimport { createProject } from \"./commands/new.js\";\nimport { runAgent } from \"./commands/run.js\";\nimport { serveCommand } from \"./commands/serve.js\";\nimport { webCommand } from \"./commands/web.js\";\n\nprogram\n\t.name(\"adk\")\n\t.description(packageJson.description)\n\t.version(packageJson.version);\n\nprogram\n\t.command(\"new\")\n\t.description(\"Create a new ADK project\")\n\t.argument(\"[project-name]\", \"Name of the project to create\")\n\t.option(\n\t\t\"-t, --template <template>\",\n\t\t\"Template to use (simple-agent, discord-bot, telegram-bot, hono-server, mcp-starter)\",\n\t\t\"simple-agent\",\n\t)\n\t.action(async (projectName, options) => {\n\t\ttry {\n\t\t\tawait createProject(projectName, options);\n\t\t} catch (error) {\n\t\t\tconsole.error(chalk.red(\"Error creating project:\"), error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n\nprogram\n\t.command(\"run\")\n\t.description(\"Start an interactive chat with an agent\")\n\t.argument(\n\t\t\"[agent-path]\",\n\t\t\"Path to specific agent (optional - will show selector if multiple agents found)\",\n\t)\n\t.option(\"-s, --server\", \"Start ADK server only (without chat interface)\")\n\t.option(\n\t\t\"-h, --host <host>\",\n\t\t\"Host for server (when using --server)\",\n\t\t\"localhost\",\n\t)\n\t.action(async (agentPath, options) => {\n\t\ttry {\n\t\t\tawait runAgent(agentPath, options);\n\t\t} catch (error) {\n\t\t\tconsole.error(chalk.red(\"Error running agent:\"), error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n\nprogram\n\t.command(\"web\")\n\t.description(\"Start a web interface for testing agents\")\n\t.option(\"-p, --port <port>\", \"Port for API server\", \"8042\")\n\t.option(\"--web-port <port>\", \"Port for web app (when using --local)\", \"3000\")\n\t.option(\"-h, --host <host>\", \"Host for servers\", \"localhost\")\n\t.option(\n\t\t\"-d, --dir <directory>\",\n\t\t\"Directory to scan for agents (default: current directory)\",\n\t\t\".\",\n\t)\n\t.option(\n\t\t\"--local\",\n\t\t\"Run local web app instead of opening production URL\",\n\t\tfalse,\n\t)\n\t.option(\n\t\t\"--web-url <url>\",\n\t\t\"URL of the web application (used when not --local)\",\n\t\t\"https://adk-web.iqai.com\",\n\t)\n\t.action(async (options) => {\n\t\ttry {\n\t\t\tawait webCommand(options);\n\t\t} catch (error) {\n\t\t\tconsole.error(chalk.red(\"Error starting web UI:\"), error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n\nprogram\n\t.command(\"serve\")\n\t.description(\"Start an API server for agent management\")\n\t.option(\"-p, --port <port>\", \"Port for the server\", \"8042\")\n\t.option(\"-h, --host <host>\", \"Host for the server\", \"localhost\")\n\t.option(\n\t\t\"-d, --dir <directory>\",\n\t\t\"Directory to scan for agents (default: current directory)\",\n\t\t\".\",\n\t)\n\t.action(async (options) => {\n\t\ttry {\n\t\t\tawait serveCommand(options);\n\t\t} catch (error) {\n\t\t\tconsole.error(chalk.red(\"Error starting server:\"), error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t});\n\nprogram.parse();\n","{\n\t\"name\": \"@iqai/adk-cli\",\n\t\"version\": \"0.1.1\",\n\t\"description\": \"CLI tool for creating, running, and testing ADK agents\",\n\t\"main\": \"dist/index.js\",\n\t\"types\": \"dist/index.d.ts\",\n\t\"bin\": {\n\t\t\"adk\": \"./dist/index.mjs\"\n\t},\n\t\"scripts\": {\n\t\t\"build\": \"tsup\",\n\t\t\"dev\": \"tsup --watch\",\n\t\t\"test\": \"vitest run\",\n\t\t\"test:watch\": \"vitest\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/IQAIcom/adk-ts.git\",\n\t\t\"directory\": \"packages/adk-cli\"\n\t},\n\t\"keywords\": [\n\t\t\"ai\",\n\t\t\"llm\",\n\t\t\"agent\",\n\t\t\"cli\",\n\t\t\"adk\",\n\t\t\"typescript\"\n\t],\n\t\"author\": \"IQAI\",\n\t\"license\": \"MIT\",\n\t\"dependencies\": {\n\t\t\"@clack/prompts\": \"^0.11.0\",\n\t\t\"@hono/node-server\": \"^1.18.1\",\n\t\t\"@iqai/adk\": \"workspace:*\",\n\t\t\"chalk\": \"^5.4.1\",\n\t\t\"commander\": \"^12.1.0\",\n\t\t\"dedent\": \"^1.6.0\",\n\t\t\"giget\": \"^2.0.0\",\n\t\t\"hono\": \"^4.6.13\",\n\t\t\"marked\": \"^14.1.3\",\n\t\t\"marked-terminal\": \"^7.2.1\",\n\t\t\"esbuild\": \"^0.23.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@iqai/tsconfig\": \"workspace:*\",\n\t\t\"@types/marked-terminal\": \"^6.1.1\",\n\t\t\"@types/node\": \"^20.17.30\",\n\t\t\"tsup\": \"^8.4.0\",\n\t\t\"typescript\": \"^5.3.2\",\n\t\t\"vitest\": \"^3.1.3\"\n\t},\n\t\"packageManager\": \"pnpm@9.0.0\",\n\t\"engines\": {\n\t\t\"node\": \">=22.0\"\n\t},\n\t\"files\": [\n\t\t\"dist\",\n\t\t\"!**/*.test.*\",\n\t\t\"!**/*.json\",\n\t\t\"CHANGELOG.md\",\n\t\t\"LICENSE\",\n\t\t\"README.md\"\n\t],\n\t\"publishConfig\": {\n\t\t\"access\": \"public\"\n\t}\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { confirm, intro, outro, select, spinner, text } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport dedent from \"dedent\";\nimport { downloadTemplate } from \"giget\";\n\ninterface Template {\n\tvalue: string;\n\tlabel: string;\n\thint: string;\n\tsource: string;\n}\n\nconst templates: Template[] = [\n\t{\n\t\tvalue: \"simple-agent\",\n\t\tlabel: \"๐ค Simple Agent\",\n\t\thint: \"Basic agent with chat capabilities\",\n\t\tsource: \"github:IQAIcom/adk-ts/apps/starter-templates/simple-agent\",\n\t},\n\t{\n\t\tvalue: \"discord-bot\",\n\t\tlabel: \"๐ฎ Discord Bot\",\n\t\thint: \"Agent integrated with Discord\",\n\t\tsource: \"github:IQAIcom/adk-ts/apps/starter-templates/discord-bot\",\n\t},\n\t{\n\t\tvalue: \"telegram-bot\",\n\t\tlabel: \"๐ฑ Telegram Bot\",\n\t\thint: \"Agent integrated with Telegram\",\n\t\tsource: \"github:IQAIcom/adk-ts/apps/starter-templates/telegram-bot\",\n\t},\n\t{\n\t\tvalue: \"hono-server\",\n\t\tlabel: \"๐ Hono Server\",\n\t\thint: \"Web server with agent endpoints\",\n\t\tsource: \"github:IQAIcom/adk-ts/apps/starter-templates/hono-server\",\n\t},\n\t{\n\t\tvalue: \"mcp-starter\",\n\t\tlabel: \"๐ MCP Integration\",\n\t\thint: \"Model Context Protocol server\",\n\t\tsource: \"github:IQAIcom/adk-ts/apps/starter-templates/mcp-starter\",\n\t},\n];\n\ninterface PackageManager {\n\tname: string;\n\tcommand: string;\n\targs: string[];\n\tlabel: string;\n}\n\nconst packageManagers: PackageManager[] = [\n\t{ name: \"npm\", command: \"npm\", args: [\"install\"], label: \"๐ฆ npm\" },\n\t{ name: \"pnpm\", command: \"pnpm\", args: [\"install\"], label: \"โก pnpm\" },\n\t{ name: \"yarn\", command: \"yarn\", args: [\"install\"], label: \"๐งถ yarn\" },\n\t{ name: \"bun\", command: \"bun\", args: [\"install\"], label: \"๐ bun\" },\n];\n\nasync function detectAvailablePackageManagers(): Promise<PackageManager[]> {\n\tconst { spawn } = await import(\"node:child_process\");\n\tconst available: PackageManager[] = [];\n\n\tfor (const pm of packageManagers) {\n\t\ttry {\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tconst child = spawn(pm.command, [\"--version\"], {\n\t\t\t\t\tstdio: \"pipe\",\n\t\t\t\t});\n\t\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\t\tif (code === 0) {\n\t\t\t\t\t\tavailable.push(pm);\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t\tchild.on(\"error\", () => resolve());\n\t\t\t});\n\t\t} catch {\n\t\t\t// Package manager not available\n\t\t}\n\t}\n\n\treturn available.length > 0 ? available : [packageManagers[0]]; // Fallback to npm\n}\n\nexport async function createProject(\n\tprojectName?: string,\n\toptions?: { template?: string },\n) {\n\tconsole.clear();\n\n\t// Cool ASCII art intro\n\tconsole.log(\n\t\tchalk.magentaBright(dedent`\n โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n โ โ\n โ โโโโโโ โโโโโโโ โโโ โโโ โโโโโโโโโโโโโโโโโ โ\n โ โโโโโโโโโโโโโโโโโโโ โโโโ โโโโโโโโโโโโโโโโโ โ\n โ โโโโโโโโโโโ โโโโโโโโโโ โโโ โโโโโโโโ โ\n โ โโโโโโโโโโโ โโโโโโโโโโ โโโ โโโโโโโโ โ\n โ โโโ โโโโโโโโโโโโโโ โโโ โโโ โโโโโโโโ โ\n โ โโโ โโโโโโโโโโ โโโ โโโ โโโ โโโโโโโโ โ\n โ โ\n โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n `),\n\t);\n\n\tintro(chalk.bgMagenta.bold(\" โจ Let's build something amazing! \"));\n\n\tlet finalProjectName = projectName;\n\tif (!finalProjectName) {\n\t\tconst response = await text({\n\t\t\tmessage: \"What is your project name?\",\n\t\t\tplaceholder: \"my-adk-project\",\n\t\t\tvalidate: (value) => {\n\t\t\t\tif (!value) return \"Project name is required\";\n\t\t\t\tif (value.includes(\" \")) return \"Project name cannot contain spaces\";\n\t\t\t\tif (existsSync(value)) return `Directory \"${value}\" already exists`;\n\t\t\t\treturn undefined;\n\t\t\t},\n\t\t});\n\n\t\tif (typeof response === \"symbol\") {\n\t\t\toutro(\"Operation cancelled\");\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tfinalProjectName = response;\n\t}\n\n\tlet selectedTemplate = options?.template;\n\tif (\n\t\t!selectedTemplate ||\n\t\t!templates.find((t) => t.value === selectedTemplate)\n\t) {\n\t\tconst framework = await select({\n\t\t\tmessage: \"Which template would you like to use?\",\n\t\t\toptions: templates.map((t) => ({\n\t\t\t\tvalue: t.value,\n\t\t\t\tlabel: t.label,\n\t\t\t\thint: t.hint,\n\t\t\t})),\n\t\t});\n\n\t\tif (typeof framework === \"symbol\") {\n\t\t\toutro(\"Operation cancelled\");\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tselectedTemplate = framework;\n\t}\n\n\tconst template = templates.find((t) => t.value === selectedTemplate);\n\tif (!template) {\n\t\toutro(\"Invalid template selected\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Check if directory already exists\n\tif (existsSync(finalProjectName)) {\n\t\toutro(chalk.red(`Directory \"${finalProjectName}\" already exists`));\n\t\tprocess.exit(1);\n\t}\n\n\tconst s = spinner();\n\ts.start(\"Downloading template...\");\n\n\ttry {\n\t\tawait downloadTemplate(template.source, {\n\t\t\tdir: finalProjectName,\n\t\t\tregistry: \"gh\",\n\t\t});\n\t\ts.stop(\"Template downloaded!\");\n\t} catch (error) {\n\t\ts.stop(\"Failed to download template\");\n\t\toutro(chalk.red(`Error: ${error}`));\n\t\tprocess.exit(1);\n\t}\n\n\t// Detect available package managers\n\tconst availablePackageManagers = await detectAvailablePackageManagers();\n\n\tlet selectedPackageManager: PackageManager;\n\tif (availablePackageManagers.length === 1) {\n\t\tselectedPackageManager = availablePackageManagers[0];\n\t} else {\n\t\tconst packageManagerChoice = await select({\n\t\t\tmessage: \"Which package manager would you like to use?\",\n\t\t\toptions: availablePackageManagers.map((pm) => ({\n\t\t\t\tvalue: pm.name,\n\t\t\t\tlabel: pm.label,\n\t\t\t})),\n\t\t});\n\n\t\tif (typeof packageManagerChoice === \"symbol\") {\n\t\t\toutro(\"Operation cancelled\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\tselectedPackageManager = availablePackageManagers.find(\n\t\t\t(pm) => pm.name === packageManagerChoice,\n\t\t)!;\n\t}\n\n\tconst shouldInstall = await confirm({\n\t\tmessage: \"Install dependencies?\",\n\t\tinitialValue: true,\n\t});\n\n\tif (typeof shouldInstall === \"symbol\") {\n\t\toutro(\"Operation cancelled\");\n\t\tprocess.exit(0);\n\t}\n\n\tif (shouldInstall) {\n\t\tconst s = spinner();\n\t\ts.start(`Installing dependencies with ${selectedPackageManager.name}...`);\n\n\t\tconst { spawn } = await import(\"node:child_process\");\n\t\tconst projectPath = join(process.cwd(), finalProjectName);\n\n\t\ttry {\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tconst child = spawn(\n\t\t\t\t\tselectedPackageManager.command,\n\t\t\t\t\tselectedPackageManager.args,\n\t\t\t\t\t{\n\t\t\t\t\t\tcwd: projectPath,\n\t\t\t\t\t\tstdio: \"pipe\",\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\t\tif (code === 0) {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t} else {\n\t\t\t\t\t\treject(new Error(`Package installation failed with code ${code}`));\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tchild.on(\"error\", reject);\n\t\t\t});\n\n\t\t\ts.stop(\"Dependencies installed!\");\n\t\t} catch (error) {\n\t\t\ts.stop(\"Failed to install dependencies\");\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow(\"\\nYou can install dependencies manually by running:\"),\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\tchalk.cyan(\n\t\t\t\t\t`cd ${finalProjectName} && ${selectedPackageManager.command} ${selectedPackageManager.args.join(\" \")}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\toutro(\n\t\tchalk.green(dedent`\n ๐ Project created successfully!\n\n Next steps:\n ${chalk.cyan(`cd ${finalProjectName}`)}\n ${shouldInstall ? \"\" : chalk.cyan(`${selectedPackageManager.command} ${selectedPackageManager.args.join(\" \")}`)}\n ${chalk.cyan(\"npm run dev\")} or ${chalk.cyan(\"yarn dev\")} or ${chalk.cyan(\"pnpm dev\")}\n\n Happy coding! ๐\n `),\n\t);\n}\n","import * as p from \"@clack/prompts\";\nimport { log, spinner } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { marked } from \"marked\";\nimport { markedTerminal } from \"marked-terminal\";\nimport { type ServeOptions, serveCommand } from \"./serve.js\";\n\n// Configure marked for terminal output\nmarked.use(markedTerminal() as any);\n\n// Render markdown to terminal-formatted text\nasync function renderMarkdown(text: string): Promise<string> {\n\ttry {\n\t\tconst result = await marked(text);\n\t\treturn typeof result === \"string\" ? result : text;\n\t} catch (error) {\n\t\t// Fallback to plain text if markdown parsing fails\n\t\treturn text;\n\t}\n}\n\ninterface Agent {\n\trelativePath: string;\n\tname: string;\n\tabsolutePath: string;\n}\n\nclass AgentChatClient {\n\tprivate apiUrl: string;\n\tprivate selectedAgent: Agent | null = null;\n\n\tconstructor(apiUrl: string) {\n\t\tthis.apiUrl = apiUrl;\n\t}\n\n\tasync connect(): Promise<void> {\n\t\t// Test connection\n\t\ttry {\n\t\t\tconst response = await fetch(`${this.apiUrl}/health`);\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\"Connection failed\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new Error(\"โ Connection failed\");\n\t\t}\n\t}\n\n\tasync fetchAgents(): Promise<Agent[]> {\n\t\ttry {\n\t\t\tconst response = await fetch(`${this.apiUrl}/api/agents`);\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`HTTP ${response.status}: ${response.statusText}`);\n\t\t\t}\n\t\t\tconst data = await response.json();\n\n\t\t\t// Handle different response structures\n\t\t\tif (Array.isArray(data)) {\n\t\t\t\treturn data;\n\t\t\t}\n\t\t\tif (data && Array.isArray(data.agents)) {\n\t\t\t\treturn data.agents;\n\t\t\t}\n\t\t\tthrow new Error(`Unexpected response format: ${JSON.stringify(data)}`);\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to fetch agents: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync selectAgent(): Promise<Agent> {\n\t\tconst agents = await this.fetchAgents();\n\n\t\tif (agents.length === 0) {\n\t\t\tthrow new Error(\"No agents found in the current directory\");\n\t\t}\n\n\t\tif (agents.length === 1) {\n\t\t\treturn agents[0];\n\t\t}\n\n\t\tconst selectedAgent = await p.select({\n\t\t\tmessage: \"Choose an agent to chat with:\",\n\t\t\toptions: agents.map((agent) => ({\n\t\t\t\tlabel: agent.name,\n\t\t\t\tvalue: agent,\n\t\t\t\thint: agent.relativePath,\n\t\t\t})),\n\t\t});\n\n\t\tif (p.isCancel(selectedAgent)) {\n\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\treturn selectedAgent;\n\t}\n\n\t// No-op: agents are auto-loaded on message; keeping method removed\n\n\tasync sendMessage(message: string): Promise<void> {\n\t\tif (!this.selectedAgent) {\n\t\t\tthrow new Error(\"No agent selected\");\n\t\t}\n\n\t\tconst s = spinner();\n\t\ts.start(\"๐ค Thinking...\");\n\n\t\ttry {\n\t\t\tconst response = await fetch(\n\t\t\t\t`${this.apiUrl}/api/agents/${encodeURIComponent(this.selectedAgent.relativePath)}/message`,\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t},\n\t\t\t\t\tbody: JSON.stringify({ message }),\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorText = await response.text();\n\t\t\t\ts.stop(\"โ Failed to send message\");\n\t\t\t\tthrow new Error(`Failed to send message: ${errorText}`);\n\t\t\t}\n\n\t\t\tconst result = await response.json();\n\t\t\ts.stop(\"๐ค Assistant:\");\n\n\t\t\t// Display agent response using Clack's log.message\n\t\t\tif (result.response) {\n\t\t\t\tconst formattedResponse = await renderMarkdown(result.response);\n\t\t\t\tlog.message(formattedResponse.trim());\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlog.error(\"Failed to send message\");\n\t\t}\n\t}\n\n\tasync startChat(): Promise<void> {\n\t\tif (!this.selectedAgent) {\n\t\t\tthrow new Error(\"Agent not selected\");\n\t\t}\n\n\t\twhile (true) {\n\t\t\ttry {\n\t\t\t\tconst message = await p.text({\n\t\t\t\t\tmessage: \"๐ฌ Message:\",\n\t\t\t\t\tplaceholder: \"Type your message here...\",\n\t\t\t\t});\n\n\t\t\t\tif (p.isCancel(message)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (message.trim()) {\n\t\t\t\t\tawait this.sendMessage(message.trim());\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(chalk.red(\"Error in chat:\"), error);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tdisconnect(): void {\n\t\t// No cleanup needed for HTTP-only client\n\t}\n\n\tsetSelectedAgent(agent: Agent): void {\n\t\tthis.selectedAgent = agent;\n\t}\n}\n\nexport async function runAgent(\n\tagentPath?: string,\n\toptions: {\n\t\twatch?: boolean;\n\t\tport?: string;\n\t\tserver?: boolean;\n\t\thost?: string;\n\t\t// verbose is intentionally not exposed on the command; it can be passed programmatically\n\t\t// and also inferred from the ADK_VERBOSE environment variable.\n\t\tverbose?: boolean;\n\t} = {},\n) {\n\tconst envVerbose = process.env.ADK_VERBOSE;\n\tconst isVerbose =\n\t\toptions.verbose ?? (envVerbose === \"1\" || envVerbose === \"true\");\n\t// If server option is enabled, start ADK server only\n\tif (options.server) {\n\t\tconst apiPort = 8042; // Use new default port\n\t\tconst host = options.host || \"localhost\";\n\n\t\tconsole.log(chalk.blue(\"๐ Starting ADK Server...\"));\n\n\t\tconst serveOptions: ServeOptions = {\n\t\t\tport: apiPort,\n\t\t\tdir: process.cwd(),\n\t\t\thost,\n\t\t\tquiet: !isVerbose,\n\t\t};\n\n\t\ttry {\n\t\t\tconst server = await serveCommand(serveOptions);\n\n\t\t\tconsole.log(chalk.cyan(\"Press Ctrl+C to stop the server\"));\n\n\t\t\t// Handle cleanup\n\t\t\tprocess.on(\"SIGINT\", async () => {\n\t\t\t\tconsole.log(chalk.yellow(\"\\n๐ Stopping server...\"));\n\t\t\t\tawait server.stop();\n\t\t\t\tprocess.exit(0);\n\t\t\t});\n\n\t\t\t// Keep the process running\n\t\t\treturn new Promise(() => {});\n\t\t} catch (error) {\n\t\t\tconsole.error(chalk.red(\"โ Failed to start server\"));\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\t// Interactive chat mode (default)\n\tconst apiUrl = `http://${options.host || \"localhost\"}:8042`; // Use new default port\n\n\tp.intro(\"๐ค ADK Agent Chat\");\n\n\ttry {\n\t\t// Check if server is running\n\t\tconst healthResponse = await fetch(`${apiUrl}/health`).catch(() => null);\n\n\t\tif (!healthResponse || !healthResponse.ok) {\n\t\t\tconst serverSpinner = spinner();\n\t\t\tserverSpinner.start(\"๐ Starting server...\");\n\n\t\t\t// Start server in the background\n\t\t\tconst serveOptions: ServeOptions = {\n\t\t\t\tport: 8042, // Use new default port\n\t\t\t\tdir: process.cwd(),\n\t\t\t\thost: options.host || \"localhost\",\n\t\t\t\tquiet: !isVerbose,\n\t\t\t};\n\n\t\t\tawait serveCommand(serveOptions);\n\n\t\t\t// Wait a moment for server to be ready\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\t\t\tserverSpinner.stop(\"โ
Server ready\");\n\t\t}\n\n\t\tconst client = new AgentChatClient(apiUrl);\n\n\t\t// Connect to server\n\t\tawait client.connect();\n\n\t\t// Select agent with spinner\n\t\tconst agentSpinner = spinner();\n\t\tagentSpinner.start(\"๐ Scanning for agents...\");\n\n\t\tconst agents = await client.fetchAgents();\n\n\t\tlet selectedAgent: Agent;\n\t\tif (agents.length === 0) {\n\t\t\tagentSpinner.stop(\"โ No agents found\");\n\t\t\tp.cancel(\"No agents found in the current directory\");\n\t\t\tprocess.exit(1);\n\t\t} else if (agents.length === 1) {\n\t\t\tselectedAgent = agents[0];\n\t\t\tagentSpinner.stop(`๐ค Found agent: ${selectedAgent.name}`);\n\t\t} else {\n\t\t\tagentSpinner.stop(`๐ค Found ${agents.length} agents`);\n\t\t\tconst choice = await p.select({\n\t\t\t\tmessage: \"Choose an agent to chat with:\",\n\t\t\t\toptions: agents.map((agent) => ({\n\t\t\t\t\tlabel: agent.name,\n\t\t\t\t\tvalue: agent,\n\t\t\t\t\thint: agent.relativePath,\n\t\t\t\t})),\n\t\t\t});\n\n\t\t\tif (p.isCancel(choice)) {\n\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\tselectedAgent = choice;\n\t\t}\n\n\t\tclient.setSelectedAgent(selectedAgent);\n\n\t\tawait client.startChat();\n\n\t\tclient.disconnect();\n\t\tp.outro(\"Chat ended\");\n\t} catch (error) {\n\t\tp.cancel(\n\t\t\t`Error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t\tprocess.exit(1);\n\t}\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport { ADKServer } from \"../server.js\";\n\nexport interface ServeOptions {\n\tport?: number;\n\tdir?: string;\n\thost?: string;\n\tquiet?: boolean;\n}\n\nexport async function serveCommand(\n\toptions: ServeOptions = {},\n): Promise<ADKServer> {\n\tconst port = options.port || 8042; // Default to port 8042 to avoid common conflicts\n\tconst host = options.host || \"localhost\";\n\tconst agentsDir = resolve(options.dir || \".\");\n\n\tif (!existsSync(agentsDir)) {\n\t\tconsole.error(chalk.red(`โ Directory not found: ${agentsDir}`));\n\t\tprocess.exit(1);\n\t}\n\n\tif (!options.quiet) {\n\t\tconsole.log(chalk.blue(`๐ ADK Server starting on http://${host}:${port}`));\n\t}\n\n\tconst server = new ADKServer(agentsDir, port, host, options.quiet);\n\n\ttry {\n\t\tawait server.start();\n\n\t\tif (!options.quiet) {\n\t\t\tconsole.log(chalk.green(\"โ
Server ready\"));\n\t\t}\n\n\t\t// Handle shutdown gracefully\n\t\tconst cleanup = async () => {\n\t\t\tif (!options.quiet) {\n\t\t\t\tconsole.log(chalk.yellow(\"\\n๐ Stopping server...\"));\n\t\t\t}\n\t\t\tawait server.stop();\n\t\t\tprocess.exit(0);\n\t\t};\n\n\t\tprocess.on(\"SIGINT\", cleanup);\n\t\tprocess.on(\"SIGTERM\", cleanup);\n\n\t\treturn server;\n\t} catch (error) {\n\t\tconsole.error(chalk.red(\"โ Failed to start ADK server:\"), error);\n\t\tprocess.exit(1);\n\t}\n}\n","import {\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\treaddirSync,\n\tstatSync,\n\tunlinkSync,\n} from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { serve } from \"@hono/node-server\";\nimport type { LlmAgent } from \"@iqai/adk\";\nimport { AgentBuilder, InMemorySessionService } from \"@iqai/adk\";\nimport type { EnhancedRunner } from \"@iqai/adk\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\n\ninterface Agent {\n\trelativePath: string;\n\tname: string;\n\tabsolutePath: string;\n\tinstance?: LlmAgent; // Store the loaded agent instance\n}\n\ninterface LoadedAgent {\n\tagent: LlmAgent;\n\trunner: EnhancedRunner; // AgentBuilder's enhanced runner\n\tsessionId: string; // Session ID for this agent instance\n\tuserId: string; // User ID for session management\n\tappName: string; // App name for session management\n}\n\nexport class ADKServer {\n\tprivate agents: Map<string, Agent> = new Map();\n\tprivate loadedAgents: Map<string, LoadedAgent> = new Map();\n\tprivate sessionService: InMemorySessionService;\n\tprivate app: Hono;\n\tprivate server: any;\n\tprivate agentsDir: string;\n\tprivate port: number;\n\tprivate host: string;\n\tprivate quiet: boolean;\n\n\tconstructor(\n\t\tagentsDir: string,\n\t\tport = 8042,\n\t\thost = \"localhost\",\n\t\tquiet = false,\n\t) {\n\t\tthis.agentsDir = agentsDir;\n\t\tthis.port = port;\n\t\tthis.host = host;\n\t\tthis.quiet = quiet;\n\t\tthis.sessionService = new InMemorySessionService();\n\t\tthis.app = new Hono();\n\t\tthis.setupRoutes();\n\t\tthis.scanAgents();\n\t}\n\n\tprivate setupRoutes(): void {\n\t\t// CORS middleware\n\t\tthis.app.use(\"/*\", cors());\n\n\t\t// Health check\n\t\tthis.app.get(\"/health\", (c) => c.json({ status: \"ok\" }));\n\n\t\t// List agents\n\t\tthis.app.get(\"/api/agents\", (c) => {\n\t\t\tconst agentsList = Array.from(this.agents.values()).map((agent) => ({\n\t\t\t\tpath: agent.absolutePath,\n\t\t\t\tname: agent.name,\n\t\t\t\tdirectory: agent.absolutePath,\n\t\t\t\trelativePath: agent.relativePath,\n\t\t\t}));\n\t\t\treturn c.json({ agents: agentsList });\n\t\t});\n\n\t\t// Refresh agents list\n\t\tthis.app.post(\"/api/agents/refresh\", (c) => {\n\t\t\tthis.scanAgents();\n\t\t\tconst agentsList = Array.from(this.agents.values()).map((agent) => ({\n\t\t\t\tpath: agent.absolutePath,\n\t\t\t\tname: agent.name,\n\t\t\t\tdirectory: agent.absolutePath,\n\t\t\t\trelativePath: agent.relativePath,\n\t\t\t}));\n\t\t\treturn c.json({ agents: agentsList });\n\t\t});\n\n\t\t// Removed explicit start/stop and running status endpoints; agents are auto-loaded on message\n\n\t\t// Get agent messages\n\t\tthis.app.get(\"/api/agents/:id/messages\", async (c) => {\n\t\t\tconst agentPath = decodeURIComponent(c.req.param(\"id\"));\n\t\t\tconst loadedAgent = this.loadedAgents.get(agentPath);\n\t\t\tif (!loadedAgent) {\n\t\t\t\treturn c.json({ messages: [] });\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// Get session from session service\n\t\t\t\tconst session = await this.sessionService.getSession(\n\t\t\t\t\tloadedAgent.appName,\n\t\t\t\t\tloadedAgent.userId,\n\t\t\t\t\tloadedAgent.sessionId,\n\t\t\t\t);\n\n\t\t\t\tif (!session || !session.events) {\n\t\t\t\t\treturn c.json({ messages: [] });\n\t\t\t\t}\n\n\t\t\t\t// Convert session events to message format\n\t\t\t\t// TODO(adk-web/tool-calls): Enhance this endpoint to better represent tool activity.\n\t\t\t\t// - Option A: Do not persist or return assistant events with empty text (current web filters these client-side).\n\t\t\t\t// - Option B: Keep raw history but add a query flag like `includeEmpty=false` to suppress blanks for clients that want clean text-only history.\n\t\t\t\t// - Option C (preferred): Emit explicit tool events, e.g., { type: \"tool\", name, args, output, status, timestamps } derived from non-text parts.\n\t\t\t\t// This enables the web UI to render compact \"Used tool: <name>\" chips and show outputs, instead of blank assistant messages.\n\t\t\t\t// When implemented, maintain backward compatibility by keeping the current shape under a flag (e.g., `format=legacy`).\n\t\t\t\tconst messages = session.events.map((event, index) => ({\n\t\t\t\t\tid: index + 1,\n\t\t\t\t\ttype: event.author === \"user\" ? \"user\" : \"assistant\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\tevent.content?.parts\n\t\t\t\t\t\t\t?.map((part) =>\n\t\t\t\t\t\t\t\ttypeof part === \"object\" && \"text\" in part ? part.text : \"\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join(\"\") || \"\",\n\t\t\t\t\ttimestamp: new Date(event.timestamp || Date.now()).toISOString(),\n\t\t\t\t}));\n\n\t\t\t\treturn c.json({ messages });\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Error fetching messages:\", error);\n\t\t\t\treturn c.json({ messages: [] });\n\t\t\t}\n\t\t});\n\n\t\t// Send message to agent\n\t\tthis.app.post(\"/api/agents/:id/message\", async (c) => {\n\t\t\tconst agentPath = decodeURIComponent(c.req.param(\"id\"));\n\t\t\tconst { message } = await c.req.json();\n\t\t\tconst response = await this.sendMessageToAgent(agentPath, message);\n\t\t\treturn c.json({ response });\n\t\t});\n\t}\n\n\tprivate scanAgents(): void {\n\t\tthis.agents.clear();\n\n\t\t// Use current directory if agentsDir doesn't exist or is empty\n\t\tconst scanDir =\n\t\t\t!this.agentsDir || !existsSync(this.agentsDir)\n\t\t\t\t? process.cwd()\n\t\t\t\t: this.agentsDir;\n\n\t\tconst shouldSkipDirectory = (dirName: string): boolean => {\n\t\t\tconst skipDirs = [\n\t\t\t\t\"node_modules\",\n\t\t\t\t\".git\",\n\t\t\t\t\".next\",\n\t\t\t\t\"dist\",\n\t\t\t\t\"build\",\n\t\t\t\t\".turbo\",\n\t\t\t\t\"coverage\",\n\t\t\t\t\".vscode\",\n\t\t\t\t\".idea\",\n\t\t\t];\n\t\t\treturn skipDirs.includes(dirName);\n\t\t};\n\n\t\tconst scanDirectory = (dir: string): void => {\n\t\t\tif (!existsSync(dir)) return;\n\n\t\t\tconst items = readdirSync(dir);\n\t\t\tfor (const item of items) {\n\t\t\t\tconst fullPath = join(dir, item);\n\t\t\t\tconst stat = statSync(fullPath);\n\n\t\t\t\tif (stat.isDirectory()) {\n\t\t\t\t\t// Skip common build/dependency directories\n\t\t\t\t\tif (!shouldSkipDirectory(item)) {\n\t\t\t\t\t\tscanDirectory(fullPath);\n\t\t\t\t\t}\n\t\t\t\t} else if (item === \"agent.ts\" || item === \"agent.js\") {\n\t\t\t\t\tconst relativePath = relative(scanDir, dir);\n\n\t\t\t\t\t// Try to get the actual agent name if it's already loaded\n\t\t\t\t\tconst loadedAgent = this.loadedAgents.get(relativePath);\n\t\t\t\t\tlet agentName = relativePath.split(\"/\").pop() || \"unknown\";\n\n\t\t\t\t\t// If agent is loaded, use its actual name\n\t\t\t\t\tif (loadedAgent?.agent?.name) {\n\t\t\t\t\t\tagentName = loadedAgent.agent.name;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Try to quickly extract name from agent file if not loaded\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst agentFilePath = join(dir, item);\n\t\t\t\t\t\t\tagentName =\n\t\t\t\t\t\t\t\tthis.extractAgentNameFromFile(agentFilePath) || agentName;\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Fallback to directory name if extraction fails\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.agents.set(relativePath, {\n\t\t\t\t\t\trelativePath,\n\t\t\t\t\t\tname: agentName,\n\t\t\t\t\t\tabsolutePath: dir,\n\t\t\t\t\t\tinstance: loadedAgent?.agent,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tscanDirectory(scanDir);\n\t\tif (!this.quiet) {\n\t\t\tconsole.log(`โ
Agent scan complete. Found ${this.agents.size} agents.`);\n\t\t}\n\t}\n\n\tprivate async startAgent(agentPath: string): Promise<void> {\n\t\tconst agent = this.agents.get(agentPath);\n\t\tif (!agent) {\n\t\t\tthrow new Error(`Agent not found: ${agentPath}`);\n\t\t}\n\n\t\tif (this.loadedAgents.has(agentPath)) {\n\t\t\treturn; // Already running\n\t\t}\n\n\t\ttry {\n\t\t\t// Load the agent module dynamically\n\t\t\t// Try both .js and .ts files, prioritizing .js if it exists\n\t\t\tlet agentFilePath = join(agent.absolutePath, \"agent.js\");\n\t\t\tif (!existsSync(agentFilePath)) {\n\t\t\t\tagentFilePath = join(agent.absolutePath, \"agent.ts\");\n\t\t\t}\n\n\t\t\tif (!existsSync(agentFilePath)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No agent.js or agent.ts file found in ${agent.absolutePath}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Load environment variables from the project directory before importing\n\t\t\tlet projectRoot = dirname(agentFilePath);\n\t\t\twhile (projectRoot !== \"/\" && projectRoot !== dirname(projectRoot)) {\n\t\t\t\tif (\n\t\t\t\t\texistsSync(join(projectRoot, \"package.json\")) ||\n\t\t\t\t\texistsSync(join(projectRoot, \".env\"))\n\t\t\t\t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tprojectRoot = dirname(projectRoot);\n\t\t\t}\n\n\t\t\tconst envPath = join(projectRoot, \".env\");\n\t\t\tif (existsSync(envPath)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst envContent = readFileSync(envPath, \"utf8\");\n\t\t\t\t\tconst envLines = envContent.split(\"\\n\");\n\t\t\t\t\tfor (const line of envLines) {\n\t\t\t\t\t\tconst trimmedLine = line.trim();\n\t\t\t\t\t\tif (trimmedLine && !trimmedLine.startsWith(\"#\")) {\n\t\t\t\t\t\t\tconst [key, ...valueParts] = trimmedLine.split(\"=\");\n\t\t\t\t\t\t\tif (key && valueParts.length > 0) {\n\t\t\t\t\t\t\t\tconst value = valueParts.join(\"=\").replace(/^\"(.*)\"$/, \"$1\");\n\t\t\t\t\t\t\t\t// Set environment variables in current process\n\t\t\t\t\t\t\t\tprocess.env[key.trim()] = value.trim();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`โ ๏ธ Warning: Could not load .env file: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst agentFileUrl = pathToFileURL(agentFilePath).href;\n\n\t\t\t// Use dynamic import to load the agent\n\t\t\tconst agentModule: any = agentFilePath.endsWith(\".ts\")\n\t\t\t\t? await this.importTypeScriptFile(agentFilePath)\n\t\t\t\t: await import(agentFileUrl);\n\n\t\t\tif (!agentModule.agent) {\n\t\t\t\tthrow new Error(`No 'agent' export found in ${agentFilePath}`);\n\t\t\t}\n\n\t\t\t// Validate that the exported agent is an LlmAgent instance\n\t\t\tif (\n\t\t\t\t!agentModule.agent ||\n\t\t\t\ttypeof agentModule.agent !== \"object\" ||\n\t\t\t\t!agentModule.agent.name\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid agent export in ${agentFilePath}. Expected an LlmAgent instance with a name property.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Additional validation to ensure it looks like an LlmAgent\n\t\t\tif (!agentModule.agent.model || !agentModule.agent.instruction) {\n\t\t\t\t// Soft warn without noisy logs; proceed to allow flexible agents\n\t\t\t}\n\n\t\t\t// Create a proper runner using AgentBuilder to wrap the existing agent\n\t\t\tconst agentBuilder = AgentBuilder.create(agentModule.agent.name)\n\t\t\t\t.withModel(agentModule.agent.model)\n\t\t\t\t.withDescription(agentModule.agent.description || \"\")\n\t\t\t\t.withInstruction(agentModule.agent.instruction || \"\")\n\t\t\t\t.withSessionService(this.sessionService, {\n\t\t\t\t\tuserId: `user_${agentPath}`,\n\t\t\t\t\tappName: \"adk-server\",\n\t\t\t\t});\n\n\t\t\t// Only add tools if they exist and are valid\n\t\t\tif (\n\t\t\t\tagentModule.agent.tools &&\n\t\t\t\tArray.isArray(agentModule.agent.tools) &&\n\t\t\t\tagentModule.agent.tools.length > 0\n\t\t\t) {\n\t\t\t\tagentBuilder.withTools(...agentModule.agent.tools);\n\t\t\t\tif (!this.quiet) {\n\t\t\t\t\tconst toolNames = agentModule.agent.tools\n\t\t\t\t\t\t.map((t: any) => t?.name || \"<unnamed>\")\n\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`๐งฉ Registered tools for agent \"${agentModule.agent.name}\": [${toolNames}]`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { runner, session } = await agentBuilder.build();\n\n\t\t\t// Store the loaded agent with its runner\n\t\t\tconst loadedAgent: LoadedAgent = {\n\t\t\t\tagent: agentModule.agent,\n\t\t\t\trunner: runner,\n\t\t\t\tsessionId: session.id,\n\t\t\t\tuserId: `user_${agentPath}`,\n\t\t\t\tappName: \"adk-server\",\n\t\t\t};\n\n\t\t\tthis.loadedAgents.set(agentPath, loadedAgent);\n\t\t\tagent.instance = agentModule.agent;\n\n\t\t\t// Update the agent name with the actual agent name\n\t\t\tagent.name = agentModule.agent.name;\n\t\t} catch (error) {\n\t\t\tconsole.error(`โ Failed to load agent \"${agent.name}\":`, error);\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to load agent: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async stopAgent(agentPath: string): Promise<void> {\n\t\t// Deprecated: explicit stop not needed; keep method no-op for backward compatibility\n\t\tthis.loadedAgents.delete(agentPath);\n\t\tconst agent = this.agents.get(agentPath);\n\t\tif (agent) {\n\t\t\tagent.instance = undefined;\n\t\t}\n\t}\n\n\tprivate async sendMessageToAgent(\n\t\tagentPath: string,\n\t\tmessage: string,\n\t): Promise<string> {\n\t\t// Auto-start the agent if it's not already running\n\t\tif (!this.loadedAgents.has(agentPath)) {\n\t\t\tawait this.startAgent(agentPath);\n\t\t}\n\n\t\tconst loadedAgent = this.loadedAgents.get(agentPath);\n\t\tif (!loadedAgent) {\n\t\t\tthrow new Error(\"Agent failed to start\");\n\t\t}\n\n\t\ttry {\n\t\t\t// Send message to the agent using the runner with session service\n\t\t\t// The session service will automatically handle message persistence\n\t\t\tconst response = await loadedAgent.runner.ask(message);\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\tconst errorMessage =\n\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\tconsole.error(\n\t\t\t\t`Error sending message to agent ${agentPath}:`,\n\t\t\t\terrorMessage,\n\t\t\t);\n\t\t\tthrow new Error(`Failed to send message to agent: ${errorMessage}`);\n\t\t}\n\t}\n\n\t/**\n\t * Import a TypeScript file by compiling it on-demand\n\t */\n\tprivate async importTypeScriptFile(filePath: string): Promise<any> {\n\t\t// Determine project root (for tsconfig and resolving deps)\n\t\tlet projectRoot = dirname(filePath);\n\t\twhile (projectRoot !== \"/\" && projectRoot !== dirname(projectRoot)) {\n\t\t\tif (\n\t\t\t\texistsSync(join(projectRoot, \"package.json\")) ||\n\t\t\t\texistsSync(join(projectRoot, \".env\"))\n\t\t\t) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tprojectRoot = dirname(projectRoot);\n\t\t}\n\n\t\t// Transpile with esbuild and import (bundles local files, preserves tools)\n\t\ttry {\n\t\t\tconst { build } = await import(\"esbuild\");\n\t\t\tconst cacheDir = join(projectRoot, \".adk-cache\");\n\t\t\tif (!existsSync(cacheDir)) {\n\t\t\t\tmkdirSync(cacheDir, { recursive: true });\n\t\t\t}\n\t\t\tconst outFile = join(cacheDir, `agent-${Date.now()}.mjs`);\n\t\t\t// Externalize bare module imports (node_modules), bundle relative/local files\n\t\t\tconst plugin = {\n\t\t\t\tname: \"externalize-bare-imports\",\n\t\t\t\tsetup(build: any) {\n\t\t\t\t\tbuild.onResolve({ filter: /.*/ }, (args: any) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\targs.path.startsWith(\".\") ||\n\t\t\t\t\t\t\targs.path.startsWith(\"/\") ||\n\t\t\t\t\t\t\targs.path.startsWith(\"..\")\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn; // use default resolve (to get bundled)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { path: args.path, external: true };\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst tsconfigPath = join(projectRoot, \"tsconfig.json\");\n\t\t\tawait build({\n\t\t\t\tentryPoints: [filePath],\n\t\t\t\toutfile: outFile,\n\t\t\t\tbundle: true,\n\t\t\t\tformat: \"esm\",\n\t\t\t\tplatform: \"node\",\n\t\t\t\ttarget: [\"node22\"],\n\t\t\t\tsourcemap: false,\n\t\t\t\tlogLevel: \"silent\",\n\t\t\t\tplugins: [plugin],\n\t\t\t\tabsWorkingDir: projectRoot,\n\t\t\t\t// Use tsconfig if present for path aliases\n\t\t\t\t...(existsSync(tsconfigPath) ? { tsconfig: tsconfigPath } : {}),\n\t\t\t});\n\n\t\t\tconst mod = await import(\n\t\t\t\t`${pathToFileURL(outFile).href}?t=${Date.now()}`\n\t\t\t);\n\t\t\tlet agentExport = (mod as any)?.agent;\n\t\t\tif (!agentExport && (mod as any)?.default) {\n\t\t\t\tagentExport = (mod as any).default.agent ?? (mod as any).default;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tunlinkSync(outFile);\n\t\t\t} catch {}\n\t\t\tif (agentExport) {\n\t\t\t\tif (!this.quiet) {\n\t\t\t\t\tconsole.log(`โ
TS agent imported via esbuild: ${filePath}`);\n\t\t\t\t}\n\t\t\t\treturn { agent: agentExport };\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to import TS agent via esbuild: ${e instanceof Error ? e.message : String(e)}`,\n\t\t\t);\n\t\t}\n\n\t\t// If we reached here, the file was transpiled but didn't export an agent\n\t\tthrow new Error(\"No 'agent' export found in TypeScript module\");\n\t}\n\n\tpublic async start(): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.server = serve({\n\t\t\t\tfetch: this.app.fetch,\n\t\t\t\tport: this.port,\n\t\t\t\thostname: this.host,\n\t\t\t});\n\n\t\t\t// Give the server a moment to start\n\t\t\tsetTimeout(() => {\n\t\t\t\tresolve();\n\t\t\t}, 100);\n\t\t});\n\t}\n\n\tpublic async stop(): Promise<void> {\n\t\treturn new Promise((resolve) => {\n\t\t\t// Stop all running agents\n\t\t\tfor (const [agentPath] of this.loadedAgents) {\n\t\t\t\tthis.stopAgent(agentPath);\n\t\t\t}\n\n\t\t\tif (this.server) {\n\t\t\t\tthis.server.close();\n\t\t\t}\n\t\t\tresolve();\n\t\t});\n\t}\n\n\tpublic getPort(): number {\n\t\treturn this.port;\n\t}\n\n\tprivate extractAgentNameFromFile(filePath: string): string | null {\n\t\ttry {\n\t\t\tconst content = readFileSync(filePath, \"utf-8\");\n\n\t\t\t// Look for agent name in export statements\n\t\t\t// Match patterns like: name: \"agent_name\" or name:\"agent_name\"\n\t\t\tconst nameMatch = content.match(/name\\s*:\\s*[\"']([^\"']+)[\"']/);\n\t\t\tif (nameMatch?.[1]) {\n\t\t\t\treturn nameMatch[1];\n\t\t\t}\n\n\t\t\treturn null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n","import chalk from \"chalk\";\nimport { type ServeOptions, serveCommand } from \"./serve.js\";\n\nexport interface WebCommandOptions {\n\tport?: number;\n\tdir?: string;\n\thost?: string;\n\twebPort?: number;\n\tlocal?: boolean;\n\twebUrl?: string;\n}\n\nexport async function webCommand(\n\toptions: WebCommandOptions = {},\n): Promise<void> {\n\tconst apiPort = options.port || 8042; // Default to port 8042 to match serve command\n\tconst webPort = options.webPort || 3000;\n\tconst host = options.host || \"localhost\";\n\tconst useLocal = options.local || false;\n\tconst webUrl = options.webUrl || \"https://adk-web.iqai.com\";\n\n\tconsole.log(chalk.blue(\"๐ Starting ADK Web Interface...\"));\n\n\t// Start the API server first\n\tconst serveOptions: ServeOptions = {\n\t\tport: apiPort,\n\t\tdir: options.dir,\n\t\thost,\n\t\tquiet: true,\n\t};\n\n\tawait serveCommand(serveOptions);\n\n\tlet webAppUrl: string;\n\n\tif (useLocal) {\n\t\t// Local development: assume web app is already running on webPort\n\t\t// Only add port parameter if it's not the default\n\t\tif (apiPort === 8042) {\n\t\t\twebAppUrl = `http://${host}:${webPort}`;\n\t\t} else {\n\t\t\twebAppUrl = `http://${host}:${webPort}?port=${apiPort}`;\n\t\t}\n\t} else {\n\t\t// Production: use hosted web interface\n\t\t// Only add port parameter if it's not the default\n\t\tif (apiPort === 8042) {\n\t\t\twebAppUrl = webUrl;\n\t\t} else {\n\t\t\twebAppUrl = `${webUrl}?port=${apiPort}`;\n\t\t}\n\t}\n\n\t// Show the URL and server info\n\tconsole.log(chalk.cyan(`๐ Open this URL in your browser: ${webAppUrl}`));\n\tconsole.log(chalk.gray(` API Server: http://${host}:${apiPort}`));\n\n\tconsole.log(chalk.cyan(\"Press Ctrl+C to stop the API server\"));\n}\n"],"mappings":"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","names":["import_chalk","resolve","chalk","dedent","s","import_prompts","import_chalk","import_node_fs","import_node_path","import_chalk","import_node_fs","import_node_path","build","resolve","chalk","text","chalk","resolve","import_chalk","chalk","chalk"]}
|