hybrid 2.0.0 ā 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -29
- package/dist/cli.cjs +1701 -643
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1714 -639
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1714 -639
- package/dist/index.js.map +1 -1
- package/dist/server/index.cjs +227225 -17554
- package/package.json +12 -7
- package/skills/skills-manager/SKILL.md +1 -1
- package/templates/agent/.env.example +0 -4
- package/dist/xmtp.cjs +0 -6122
- package/skills/xmtp/SKILL.md +0 -85
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { existsSync } from \"node:fs\"\nimport { basename, dirname, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { config } from \"dotenv\"\n\nfunction findProjectRoot(startDir: string): string {\n\tconst markers = [\"package.json\", \"hybrid.config.ts\", \"SOUL.md\"]\n\tlet current = startDir\n\twhile (current !== \"/\") {\n\t\tfor (const marker of markers) {\n\t\t\tif (existsSync(resolve(current, marker))) {\n\t\t\t\treturn current\n\t\t\t}\n\t\t}\n\t\tconst parent = resolve(current, \"..\")\n\t\tif (parent === current) break\n\t\tcurrent = parent\n\t}\n\treturn startDir\n}\n\nconst cwdIndex = process.argv.findIndex((a) => a === \"--cwd\")\nif (cwdIndex !== -1 && process.argv[cwdIndex + 1]) {\n\tprocess.chdir(process.argv[cwdIndex + 1])\n\tprocess.argv.splice(cwdIndex, 2)\n}\n\nconst projectRoot = findProjectRoot(process.cwd())\n\nfor (const envFile of [\".env\", \".env.local\"]) {\n\tconst path = resolve(projectRoot, envFile)\n\tif (existsSync(path)) {\n\t\tconfig({ path })\n\t}\n}\n\n// Node version check\nconst [major] = process.versions.node.split(\".\").map(Number)\nif (!major || major < 20) {\n\tconsole.error(\"Error: Node.js version 20 or higher is required\")\n\tprocess.exit(1)\n}\n\n// Get package directory (where bundled files live)\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst packageDir = resolve(__dirname, \"..\")\n\nasync function main() {\n\tconst args = process.argv.slice(2)\n\tconst command = args[0]\n\n\tif (command === \"build\") return build(args[1])\n\tif (command === \"dev\") return dev(args.includes(\"--docker\"))\n\tif (command === \"start\") return start()\n\tif (command === \"deploy\") return deploy(args[1], args.includes(\"--keygen\"))\n\tif (command === \"init\") return init(args[1])\n\tif (command === \"keygen\") return keygen(args[1])\n\tif (command === \"register\") return register()\n\tif (command === \"revoke\") return revoke(args[1])\n\tif (command === \"revoke-all\") return revokeAll()\n\n\tif (command === \"owner\") {\n\t\tconst subcommand = args[1]\n\t\tif (subcommand === \"add\") return ownerAdd(args[2])\n\t\tif (subcommand === \"remove\" || subcommand === \"rm\")\n\t\t\treturn ownerRemove(args[2])\n\t\tif (subcommand === \"list\" || subcommand === \"ls\") return ownerList()\n\t\tconsole.log(\"\\nUsage: hybrid owner <command>\")\n\t\tconsole.log(\"\\nCommands:\")\n\t\tconsole.log(\" owner add <address> Add an owner\")\n\t\tconsole.log(\" owner remove <address> Remove an owner\")\n\t\tconsole.log(\" owner list List all owners\")\n\t\tprocess.exit(1)\n\t}\n\n\tif (command === \"skills\") {\n\t\tconst subcommand = args[1]\n\t\tif (subcommand === \"add\") {\n\t\t\tconst isGlobal = args.includes(\"-g\") || args.includes(\"--global\")\n\t\t\tconst source = args.find((a, i) => i > 1 && !a.startsWith(\"-\"))\n\t\t\treturn skillsAdd(source, isGlobal)\n\t\t}\n\t\tif (subcommand === \"remove\" || subcommand === \"rm\") {\n\t\t\tconst isGlobal = args.includes(\"-g\") || args.includes(\"--global\")\n\t\t\tconst name = args.find((a, i) => i > 1 && !a.startsWith(\"-\"))\n\t\t\treturn skillsRemove(name, isGlobal)\n\t\t}\n\t\tif (subcommand === \"list\" || subcommand === \"ls\" || !subcommand) {\n\t\t\treturn skillsList()\n\t\t}\n\t\tconsole.error(`Unknown skills subcommand: ${subcommand}`)\n\t\tconsole.error(\"Usage: hybrid skills add|remove|list\")\n\t\tprocess.exit(1)\n\t}\n\n\tif (command === \"clawhub\" || command === \"ch\") {\n\t\tconst subcommand = args[1]\n\t\tconst passThroughArgs = args.slice(2).join(\" \")\n\t\tif (subcommand === \"install\") return clawhubInstall(passThroughArgs)\n\t\tif (subcommand === \"search\") return clawhubSearch(passThroughArgs)\n\t\tif (subcommand === \"publish\") return clawhubPublish(passThroughArgs)\n\t\tif (subcommand === \"update\") return clawhubUpdate(passThroughArgs)\n\t\tif (subcommand === \"list\") return clawhubList()\n\t\tif (subcommand === \"login\") return clawhubLogin()\n\t\tif (subcommand === \"logout\") return clawhubLogout()\n\t\tif (subcommand === \"whoami\") return clawhubWhoami()\n\t\tconsole.log(\"\\nUsage: hybrid clawhub <command>\")\n\t\tconsole.log(\"\\nCommands:\")\n\t\tconsole.log(\" install <slug> Install a skill from ClawHub\")\n\t\tconsole.log(\" search <query> Search for skills\")\n\t\tconsole.log(\" publish <path> Publish a skill\")\n\t\tconsole.log(\" update [slug] Update installed skills\")\n\t\tconsole.log(\" list List installed skills\")\n\t\tconsole.log(\" login Authenticate with ClawHub\")\n\t\tconsole.log(\" logout Remove stored credentials\")\n\t\tconsole.log(\" whoami Check authentication status\")\n\t\tprocess.exit(1)\n\t}\n\n\t// Show help\n\tconsole.log(\"Usage: hybrid <command>\")\n\tconsole.log(\"\")\n\tconsole.log(\"Commands:\")\n\tconsole.log(\" init <name> Initialize a new agent\")\n\tconsole.log(\" dev Start development server\")\n\tconsole.log(\" build [--target] Build for deployment (fly, railway)\")\n\tconsole.log(\" start Run built agent\")\n\tconsole.log(\" deploy [platform] Deploy (fly, railway)\")\n\tconsole.log(\"\")\n\tconsole.log(\"Wallet:\")\n\tconsole.log(\" keygen [prefix] Generate a new wallet\")\n\tconsole.log(\" register Register wallet on XMTP\")\n\tconsole.log(\" revoke <inboxId> Revoke installations\")\n\tconsole.log(\" revoke-all Revoke all installations\")\n\tconsole.log(\"\")\n\tconsole.log(\"Owner:\")\n\tconsole.log(\" owner add <address> Add an owner\")\n\tconsole.log(\" owner remove <address> Remove an owner\")\n\tconsole.log(\" owner list List all owners\")\n\tconsole.log(\"\")\n\tconsole.log(\"Skills:\")\n\tconsole.log(\" skills add <source> [-g] Install a skill\")\n\tconsole.log(\" skills remove <name> [-g] Remove a skill\")\n\tconsole.log(\" skills list List installed skills\")\n\tconsole.log(\"\")\n\tconsole.log(\" Uses npx skills --agent openclaw under the hood\")\n\tconsole.log(\" -g, --global Install to ~/.openclaw/skills/\")\n\tconsole.log(\"\")\n\tconsole.log(\"Sources:\")\n\tconsole.log(\" owner/repo GitHub shorthand\")\n\tconsole.log(\" owner/repo/skill GitHub skill path\")\n\tconsole.log(\" @scope/package npm package\")\n\tconsole.log(\" ./local-path Local directory\")\n\tconsole.log(\"\")\n\tconsole.log(\"ClawHub:\")\n\tconsole.log(\" clawhub install <slug> Install from ClawHub registry\")\n\tconsole.log(\" clawhub search <query> Search ClawHub skills\")\n\tconsole.log(\" clawhub publish <path> Publish a skill\")\n\tconsole.log(\" clawhub update [slug] Update installed skills\")\n\tconsole.log(\" clawhub list List ClawHub skills\")\n\tconsole.log(\" clawhub login Authenticate with ClawHub\")\n\tconsole.log(\"\")\n\n\tif (command) process.exit(1)\n}\n\n// ============================================================================\n// Skills - Thin wrapper around npx skills --agent openclaw\n// ============================================================================\n\nasync function skillsAdd(source?: string, isGlobal = false) {\n\tif (!source) {\n\t\tconsole.error(\"Error: Skill source required\")\n\t\tconsole.error(\"Usage: hybrid skills add <source>\")\n\t\tconsole.error(\" hybrid skills add <source> -g # Global install\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst { execSync } = await import(\"node:child_process\")\n\tconst cmdArgs = [\"skills\", \"add\", source, \"-a\", \"openclaw\", \"-y\"]\n\tif (isGlobal) cmdArgs.push(\"-g\")\n\n\tconsole.log(\n\t\t`\\nš„ Installing skill: ${source}${isGlobal ? \" (global)\" : \"\"}\\n`\n\t)\n\texecSync(`npx ${cmdArgs.join(\" \")}`, { stdio: \"inherit\" })\n}\n\nasync function skillsRemove(name?: string, isGlobal = false) {\n\tif (!name) {\n\t\tconsole.error(\"Error: Skill name required\")\n\t\tconsole.error(\"Usage: hybrid skills remove <skill-name>\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst { execSync } = await import(\"node:child_process\")\n\tconst cmdArgs = [\"skills\", \"remove\", name, \"-a\", \"openclaw\", \"-y\"]\n\tif (isGlobal) cmdArgs.push(\"-g\")\n\n\texecSync(`npx ${cmdArgs.join(\" \")}`, { stdio: \"inherit\" })\n}\n\nasync function skillsList() {\n\tconst { execSync } = await import(\"node:child_process\")\n\texecSync(\"npx skills list -a openclaw\", { stdio: \"inherit\" })\n}\n\n// ============================================================================\n// ClawHub - Wrapper around clawhub CLI\n// ============================================================================\n\nasync function clawhubInstall(extraArgs: string) {\n\tconst { execSync } = await import(\"node:child_process\")\n\tconsole.log(\"\\nš„ Installing from ClawHub...\\n\")\n\texecSync(`npx clawhub install ${extraArgs}`, { stdio: \"inherit\" })\n}\n\nasync function clawhubSearch(query: string) {\n\tconst { execSync } = await import(\"node:child_process\")\n\texecSync(`npx clawhub search ${query}`, { stdio: \"inherit\" })\n}\n\nasync function clawhubPublish(extraArgs: string) {\n\tconst { execSync } = await import(\"node:child_process\")\n\tconsole.log(\"\\nš¤ Publishing to ClawHub...\\n\")\n\texecSync(`npx clawhub publish ${extraArgs}`, { stdio: \"inherit\" })\n}\n\nasync function clawhubUpdate(extraArgs: string) {\n\tconst { execSync } = await import(\"node:child_process\")\n\tconsole.log(\"\\nš Updating skills from ClawHub...\\n\")\n\texecSync(`npx clawhub update ${extraArgs}`, { stdio: \"inherit\" })\n}\n\nasync function clawhubList() {\n\tconst { execSync } = await import(\"node:child_process\")\n\texecSync(\"npx clawhub list\", { stdio: \"inherit\" })\n}\n\nasync function clawhubLogin() {\n\tconst { execSync } = await import(\"node:child_process\")\n\tconsole.log(\"\\nš Logging into ClawHub...\\n\")\n\texecSync(\"npx clawhub login\", { stdio: \"inherit\" })\n}\n\nasync function clawhubLogout() {\n\tconst { execSync } = await import(\"node:child_process\")\n\texecSync(\"npx clawhub logout\", { stdio: \"inherit\" })\n}\n\nasync function clawhubWhoami() {\n\tconst { execSync } = await import(\"node:child_process\")\n\texecSync(\"npx clawhub whoami\", { stdio: \"inherit\" })\n}\n\n// ============================================================================\n// Init\n// ============================================================================\n\nasync function init(name?: string) {\n\tif (!name) {\n\t\tconsole.error(\"Error: Agent name required\")\n\t\tconsole.error(\"Usage: hybrid init <name>\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst {\n\t\tcpSync,\n\t\texistsSync,\n\t\tmkdirSync,\n\t\twriteFileSync,\n\t\treaddirSync,\n\t\treadFileSync\n\t} = await import(\"node:fs\")\n\tconst { createInterface } = await import(\"node:readline\")\n\n\tconst templateDir = resolve(packageDir, \"templates\", \"agent\")\n\tconst targetDir = resolve(process.cwd(), name)\n\n\tif (existsSync(targetDir)) {\n\t\tconsole.error(`Error: Directory '${name}' already exists`)\n\t\tprocess.exit(1)\n\t}\n\n\tconsole.log(`\\nš¦ Creating agent: ${name}\\n`)\n\n\t// Copy template\n\tcpSync(templateDir, targetDir, { recursive: true })\n\n\t// Update package.json with agent name\n\tconst pkgPath = resolve(targetDir, \"package.json\")\n\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"))\n\tpkg.name = name\n\twriteFileSync(pkgPath, JSON.stringify(pkg, null, 2))\n\n\t// Copy core skills from bundled package\n\tconst skillsDir = resolve(packageDir, \"skills\")\n\tconst targetSkillsDir = resolve(targetDir, \"skills\")\n\n\tif (existsSync(skillsDir)) {\n\t\tconsole.log(\"š Copying core skills...\")\n\t\tconst coreSkills = readdirSync(skillsDir, { withFileTypes: true })\n\t\t\t.filter((d) => d.isDirectory())\n\t\t\t.map((d) => d.name)\n\n\t\tmkdirSync(targetSkillsDir, { recursive: true })\n\n\t\tfor (const skill of coreSkills) {\n\t\t\tcpSync(resolve(skillsDir, skill), resolve(targetSkillsDir, skill), {\n\t\t\t\trecursive: true\n\t\t\t})\n\t\t\tconsole.log(` ā ${skill}`)\n\t\t}\n\n\t\t// Create skills-lock.json\n\t\tconst lockfile: Record<string, { source: string; installedAt: string }> = {}\n\t\tconst now = new Date().toISOString()\n\t\tfor (const skill of coreSkills) {\n\t\t\tlockfile[skill] = { source: \"core\", installedAt: now }\n\t\t}\n\t\twriteFileSync(\n\t\t\tresolve(targetDir, \"skills-lock.json\"),\n\t\t\tJSON.stringify(lockfile, null, 2)\n\t\t)\n\t}\n\n\t// Copy .env.example to .env\n\tconst envExamplePath = resolve(targetDir, \".env.example\")\n\tconst envPath = resolve(targetDir, \".env\")\n\tif (existsSync(envExamplePath)) {\n\t\tcpSync(envExamplePath, envPath)\n\t}\n\n\t// Collect configuration via prompts\n\tconst rl = createInterface({\n\t\tinput: process.stdin,\n\t\toutput: process.stdout\n\t})\n\n\tconst question = (prompt: string): Promise<string> => {\n\t\treturn new Promise((resolve) => {\n\t\t\trl.question(prompt, (answer: string) => {\n\t\t\t\tresolve(answer.trim())\n\t\t\t})\n\t\t})\n\t}\n\n\t// Owner wallet address\n\tconst ownerAddress = await question(\"\\nEnter your wallet address (owner): \")\n\n\t// Wallet key - generate using keygen flow\n\tconsole.log(\"\\nš Generating wallet key...\")\n\tconst { privateKeyToAccount } = await import(\"viem/accounts\")\n\tconst { randomBytes } = await import(\"node:crypto\")\n\tconst walletKey = `0x${randomBytes(32).toString(\"hex\")}` as `0x${string}`\n\tconst account = privateKeyToAccount(walletKey as `0x${string}`)\n\tconsole.log(` Address: ${account.address}`)\n\tconsole.log(` Key: ${walletKey.slice(0, 10)}...${walletKey.slice(-8)}`)\n\n\trl.close()\n\n\t// Provider picker using prompts\n\tconst prompts = (await import(\"prompts\")).default\n\tconst providerResponse = await prompts({\n\t\ttype: \"select\",\n\t\tname: \"provider\",\n\t\tmessage: \"LLM Provider\",\n\t\tchoices: [\n\t\t\t{ title: \"Anthropic\", value: \"anthropic\" },\n\t\t\t{ title: \"OpenRouter\", value: \"openrouter\" }\n\t\t],\n\t\tinitial: 0\n\t})\n\n\tif (providerResponse.provider === undefined) {\n\t\tconsole.log(\"\\nCancelled.\")\n\t\tprocess.exit(0)\n\t}\n\n\tlet anthropicKey = \"\"\n\tlet openrouterKey = \"\"\n\n\tif (providerResponse.provider === \"anthropic\") {\n\t\tconst keyResponse = await prompts({\n\t\t\ttype: \"password\",\n\t\t\tname: \"key\",\n\t\t\tmessage: \"Anthropic API key\"\n\t\t})\n\t\tanthropicKey = keyResponse.key || \"\"\n\t} else if (providerResponse.provider === \"openrouter\") {\n\t\tconst keyResponse = await prompts({\n\t\t\ttype: \"password\",\n\t\t\tname: \"key\",\n\t\t\tmessage: \"OpenRouter API key\"\n\t\t})\n\t\topenrouterKey = keyResponse.key || \"\"\n\t}\n\n\t// Create ACL file with owner\n\tif (ownerAddress) {\n\t\tconst normalized = ownerAddress.toLowerCase()\n\t\tconst credentialsDir = resolve(targetDir, \"credentials\")\n\t\tmkdirSync(credentialsDir, { recursive: true })\n\t\twriteFileSync(\n\t\t\tresolve(credentialsDir, \"xmtp-allowFrom.json\"),\n\t\t\tJSON.stringify({ version: 1, allowFrom: [normalized] }, null, 2)\n\t\t)\n\t\tconsole.log(`\\nā
Added owner: ${normalized}`)\n\t}\n\n\t// Update .env file with generated key and API keys\n\tlet envContent = readFileSync(envPath, \"utf-8\")\n\n\t// Update wallet key\n\tenvContent = envContent.replace(\n\t\t/AGENT_WALLET_KEY=.*/,\n\t\t`AGENT_WALLET_KEY=${walletKey}`\n\t)\n\n\t// Update API keys based on provider choice\n\tif (anthropicKey) {\n\t\tenvContent = envContent.replace(\n\t\t\t/ANTHROPIC_API_KEY=.*/,\n\t\t\t`ANTHROPIC_API_KEY=${anthropicKey}`\n\t\t)\n\t\t// Comment out OpenRouter lines if present\n\t\tenvContent = envContent.replace(\n\t\t\t/^ANTHROPIC_BASE_URL=https:\\/\\/openrouter\\.ai\\/api/m,\n\t\t\t\"# ANTHROPIC_BASE_URL=https://openrouter.ai/api\"\n\t\t)\n\t\tenvContent = envContent.replace(\n\t\t\t/^ANTHROPIC_AUTH_TOKEN=(?!your_openrouter_key)/m,\n\t\t\t\"# ANTHROPIC_AUTH_TOKEN=\"\n\t\t)\n\t}\n\n\tif (openrouterKey) {\n\t\t// Uncomment/set OpenRouter lines\n\t\tenvContent = envContent.replace(\n\t\t\t/# ANTHROPIC_BASE_URL=https:\\/\\/openrouter\\.ai\\/api/,\n\t\t\t\"ANTHROPIC_BASE_URL=https://openrouter.ai/api\"\n\t\t)\n\t\t// Replace commented placeholder OR existing AUTH_TOKEN in one pass\n\t\tenvContent = envContent.replace(\n\t\t\t/^#?\\s*ANTHROPIC_AUTH_TOKEN=.*/m,\n\t\t\t`ANTHROPIC_AUTH_TOKEN=${openrouterKey}`\n\t\t)\n\t\t// Comment out direct Anthropic key if OpenRouter is used\n\t\tenvContent = envContent.replace(\n\t\t\t/^ANTHROPIC_API_KEY=/m,\n\t\t\t(match) => `# ${match}`\n\t\t)\n\t}\n\n\twriteFileSync(envPath, envContent)\n\tconsole.log(\"ā
Updated .env file\")\n\n\tconsole.log(`\\nā
Created agent at: ${name}/`)\n\tconsole.log(\"\\nNext steps:\")\n\tconsole.log(` cd ${name}`)\n\tconsole.log(\" npm install # or pnpm install\")\n\tconsole.log(\" hybrid dev # Start development\")\n}\n\n// ============================================================================\n// Build\n// ============================================================================\n\nasync function build(target?: string) {\n\tconst { execSync } = await import(\"node:child_process\")\n\tconst {\n\t\tcpSync,\n\t\texistsSync,\n\t\tmkdirSync,\n\t\trmSync,\n\t\twriteFileSync,\n\t\treaddirSync,\n\t\treadFileSync\n\t} = await import(\"node:fs\")\n\n\tconst projectDir = projectRoot\n\tconst distDir = resolve(projectDir, \"dist\")\n\tconst buildTarget = target || \"fly\"\n\n\tconsole.log(\"\\nš§ Building agent...\")\n\n\t// Clean dist\n\tif (existsSync(distDir)) {\n\t\trmSync(distDir, { recursive: true, force: true })\n\t}\n\tmkdirSync(distDir, { recursive: true })\n\tmkdirSync(resolve(distDir, \"server\"), { recursive: true })\n\n\t// Copy agent runtime from bundled package\n\tconsole.log(\"š¦ Copying agent runtime...\")\n\tconst agentDistDir = resolve(packageDir, \"dist\")\n\n\tconst files = [\"server/index.cjs\", \"xmtp.cjs\"]\n\n\tfor (const file of files) {\n\t\tconst src = resolve(agentDistDir, file)\n\t\tif (existsSync(src)) {\n\t\t\tcpSync(src, resolve(distDir, file))\n\t\t} else {\n\t\t\tconsole.error(` Missing: ${file} - run 'pnpm build' in hybrid package`)\n\t\t}\n\t}\n\n\t// Copy config files\n\tconsole.log(\"š Copying agent config...\")\n\tfor (const file of [\n\t\t\"SOUL.md\",\n\t\t\"AGENTS.md\",\n\t\t\"IDENTITY.md\",\n\t\t\"TOOLS.md\",\n\t\t\"BOOT.md\",\n\t\t\"BOOTSTRAP.md\",\n\t\t\"HEARTBEAT.md\",\n\t\t\"USER.md\"\n\t]) {\n\t\tconst src = resolve(projectDir, file)\n\t\tif (existsSync(src)) {\n\t\t\tcpSync(src, resolve(distDir, file))\n\t\t\tconsole.log(` ā ${file}`)\n\t\t}\n\t}\n\n\t// Copy/migrate config file\n\tconst hybridConfig = resolve(projectDir, \"hybrid.config.ts\")\n\tconst openclawConfig = resolve(projectDir, \"openclaw.json\")\n\tconst agentConfig = resolve(projectDir, \"agent.ts\")\n\n\tif (existsSync(hybridConfig)) {\n\t\t// TODO: Compile TypeScript config\n\t\tcpSync(hybridConfig, resolve(distDir, \"hybrid.config.ts\"))\n\t\tconsole.log(\" ā hybrid.config.ts\")\n\t} else if (existsSync(openclawConfig)) {\n\t\tconst content = readFileSync(openclawConfig, \"utf-8\")\n\t\twriteFileSync(\n\t\t\tresolve(projectDir, \"hybrid.config.ts\"),\n\t\t\t`// Migrated from openclaw.json\\nexport default ${content}`\n\t\t)\n\t\tconsole.log(\" ā Migrated openclaw.json ā hybrid.config.ts\")\n\t} else if (existsSync(agentConfig)) {\n\t\tcpSync(agentConfig, resolve(distDir, \"agent.ts\"))\n\t\tconsole.log(\" ā agent.ts (legacy)\")\n\t}\n\n\t// Skills stay in ./skills/ at project root - not copied\n\t// Verify skills exist\n\tconst skillsDir = resolve(projectDir, \"skills\")\n\tif (existsSync(skillsDir)) {\n\t\tconst skills = readdirSync(skillsDir, { withFileTypes: true })\n\t\t\t.filter((d) => d.isDirectory())\n\t\t\t.map((d) => d.name)\n\t\tconsole.log(`š Skills: ${skills.length} in ./skills/`)\n\t} else {\n\t\tconsole.log(\"ā ļø No ./skills/ directory found - run 'hybrid init' first?\")\n\t}\n\n\t// Copy credentials if exist\n\tconst credsDir = resolve(projectDir, \"credentials\")\n\tif (existsSync(credsDir)) {\n\t\tmkdirSync(resolve(distDir, \"credentials\"), { recursive: true })\n\t\tcpSync(credsDir, resolve(distDir, \"credentials\"), { recursive: true })\n\t\tconsole.log(\" ā credentials/\")\n\t}\n\n\t// Generate package.json for deployment\n\tconst deployPkg = {\n\t\tname: \"hybrid\",\n\t\tversion: \"1.0.0\",\n\t\ttype: \"module\",\n\t\tdependencies: {\n\t\t\t\"@anthropic-ai/claude-agent-sdk\": \"^0.2.38\",\n\t\t\t\"@hono/node-server\": \"^1.13.5\",\n\t\t\t\"@xmtp/agent-sdk\": \"0.0.14\",\n\t\t\t\"@xmtp/node-bindings\": \"^1.9.1\",\n\t\t\t\"@xmtp/node-sdk\": \"^4.1.0\",\n\t\t\tai: \"^6.0.0\",\n\t\t\t\"better-sqlite3\": \"^11.0.0\",\n\t\t\tdotenv: \"^16.4.5\",\n\t\t\thono: \"^4.10.8\",\n\t\t\t\"sql.js\": \"^1.11.0\",\n\t\t\tviem: \"^2.46.2\",\n\t\t\tzod: \"^4.0.0\"\n\t\t}\n\t}\n\twriteFileSync(\n\t\tresolve(distDir, \"package.json\"),\n\t\tJSON.stringify(deployPkg, null, 2)\n\t)\n\n\t// Generate Dockerfile\n\twriteFileSync(resolve(distDir, \"Dockerfile\"), generateDockerfile(buildTarget))\n\n\t// Copy or generate fly.toml\n\tif (buildTarget === \"fly\") {\n\t\tconst projectFlyToml = resolve(projectDir, \"fly.toml\")\n\t\tif (existsSync(projectFlyToml)) {\n\t\t\tcpSync(projectFlyToml, resolve(distDir, \"fly.toml\"))\n\t\t} else {\n\t\t\twriteFileSync(resolve(distDir, \"fly.toml\"), generateFlyToml())\n\t\t}\n\t}\n\n\t// Generate start script\n\twriteFileSync(\n\t\tresolve(distDir, \"start.sh\"),\n\t\t`#!/bin/sh\nnode server/index.cjs &\nnode xmtp.cjs &\nwait\n`\n\t)\n\n\tconsole.log(\"\\nā
Build complete!\")\n\tconsole.log(` Output: ${distDir}`)\n\tconsole.log(` Target: ${buildTarget}`)\n}\n\nfunction generateDockerfile(target: string): string {\n\tif (target === \"fly\" || target === \"railway\") {\n\t\treturn `FROM node:20\n\nWORKDIR /app\n\n# Copy built agent runtime\nCOPY server/ ./server/\nCOPY xmtp.cjs ./\n\n# Copy config\nCOPY SOUL.md ./\nCOPY AGENTS.md ./\nCOPY IDENTITY.md ./\nCOPY TOOLS.md ./\nCOPY BOOTSTRAP.md ./\nCOPY HEARTBEAT.md ./\nCOPY USER.md ./\n\n# Copy credentials (owner ACL)\nCOPY credentials/ ./credentials/\n\n# Copy deployment files\nCOPY package.json ./\nCOPY start.sh ./\n\n# Install dependencies\nRUN npm install --production\n\n# Create data directories and set ownership\nRUN mkdir -p /app/data/xmtp && \\\\\n chown -R node:node /app\n\nENV AGENT_PORT=8454\nENV NODE_ENV=production\nEXPOSE 8454\n\nUSER node\nCMD [\"sh\", \"start.sh\"]\n`\n\t}\n\n\treturn `FROM node:20\nWORKDIR /app\nCOPY . ./\nRUN npm install --production\nRUN chown -R node:node /app\nUSER node\nCMD [\"sh\", \"start.sh\"]\n`\n}\n\nfunction generateFlyToml(appName = \"hybrid-agent\"): string {\n\treturn `# Generated by hybrid build\napp = \"${appName}\"\nprimary_region = \"iad\"\n\n[build]\n dockerfile = \"Dockerfile\"\n context = \".\"\n\n[deployment]\n min_machines = 1\n max_machines = 1\n\n[env]\n XMTP_ENV = \"production\"\n\n[[services]]\n protocol = \"tcp\"\n internal_port = 8454\n\n [[services.ports]]\n port = 80\n handlers = [\"http\"]\n force_https = true\n\n [[services.ports]]\n port = 443\n handlers = [\"tls\", \"http\"]\n\n[vm]\n memory = \"1gb\"\n cpu_kind = \"shared\"\n cpus = 1\n`\n}\n\n// ============================================================================\n// Dev\n// ============================================================================\n\nasync function dev(useDocker: boolean) {\n\tconst { execSync } = await import(\"node:child_process\")\n\tconst { existsSync, readFileSync } = await import(\"node:fs\")\n\tconst { privateKeyToAccount } = await import(\"viem/accounts\")\n\n\tif (useDocker) {\n\t\tconsole.log(\"\\nš³ Docker dev not yet implemented for new structure\")\n\t\tconsole.log(\"Use 'hybrid dev' without --docker for now\")\n\t\treturn\n\t}\n\n\tconst projectDir = projectRoot\n\n\t// Check if agent is registered\n\tconst walletKey = process.env.AGENT_WALLET_KEY || process.env.WALLET_KEY\n\tif (walletKey) {\n\t\tconst walletKeyFormatted = walletKey.startsWith(\"0x\")\n\t\t\t? walletKey\n\t\t\t: `0x${walletKey}`\n\t\tconst account = privateKeyToAccount(walletKeyFormatted as `0x${string}`)\n\t\tconsole.log(`\\nš Checking XMTP registration for ${account.address}...`)\n\n\t\ttry {\n\t\t\tconst result = execSync(\n\t\t\t\t`npx tsx -e \"\nimport { createSigner, createXMTPClient } from './src/client';\nconst signer = createSigner('${walletKeyFormatted}');\nconst client = await createXMTPClient(signer, { env: 'production' });\nconsole.log('REGISTERED:', client.inboxId);\nprocess.exit(0);\n\"`,\n\t\t\t\t{\n\t\t\t\t\tcwd: resolve(packageDir, \"..\", \"xmtp\"),\n\t\t\t\t\tencoding: \"utf-8\",\n\t\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"]\n\t\t\t\t}\n\t\t\t)\n\t\t\tif (result.includes(\"REGISTERED:\")) {\n\t\t\t\tconst inboxId = result.match(/REGISTERED: (.+)/)?.[1]\n\t\t\t\tconsole.log(` ā
Already registered (inbox: ${inboxId})`)\n\t\t\t}\n\t\t} catch (err: any) {\n\t\t\tconst output = err.stdout || err.stderr || \"\"\n\t\t\tif (\n\t\t\t\toutput.includes(\"not registered\") ||\n\t\t\t\toutput.includes(\"No inbox found\") ||\n\t\t\t\toutput.includes(\"incomplete identity\") ||\n\t\t\t\terr.exitCode\n\t\t\t) {\n\t\t\t\tconsole.log(\" ā Not registered\")\n\t\t\t\tconsole.log(\"\\nš Registering agent on XMTP...\")\n\n\t\t\t\texecSync(\"npx pnpm --filter @hybrd/xmtp register\", {\n\t\t\t\t\tcwd: resolve(packageDir, \"..\", \"..\"),\n\t\t\t\t\tstdio: \"inherit\",\n\t\t\t\t\tenv: { ...process.env, AGENT_WALLET_KEY: walletKey }\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove duplicate projectDir declaration\n\tconst agentServer = resolve(packageDir, \"dist\", \"server\", \"index.cjs\")\n\tconst agentXmtp = resolve(packageDir, \"dist\", \"xmtp.cjs\")\n\n\tconsole.log(\"\\nš Starting development server...\\n\")\n\tconsole.log(` Project: ${projectDir}`)\n\tconsole.log(` Runtime: ${packageDir}\\n`)\n\n\ttry {\n\t\texecSync(\n\t\t\t`npx concurrently --names \"server,xmtp\" --prefix-colors \"cyan,magenta\" \"node ${agentServer}\" \"node ${agentXmtp}\"`,\n\t\t\t{\n\t\t\t\tcwd: projectDir,\n\t\t\t\tstdio: \"inherit\",\n\t\t\t\tenv: {\n\t\t\t\t\t...process.env,\n\t\t\t\t\tAGENT_PROJECT_ROOT: projectDir\n\t\t\t\t}\n\t\t\t}\n\t\t)\n\t} catch {\n\t\tconsole.error(\"\\nā Failed to start dev server\")\n\t\tprocess.exit(1)\n\t}\n}\n\n// ============================================================================\n// Start\n// ============================================================================\n\nasync function start() {\n\tconst { spawn } = await import(\"node:child_process\")\n\tconst { existsSync } = await import(\"node:fs\")\n\n\tconst projectDir = projectRoot\n\tconst distDir = resolve(projectDir, \"dist\")\n\n\tif (!existsSync(resolve(distDir, \"server\", \"simple.cjs\"))) {\n\t\tconsole.error(\"Error: No build found. Run 'hybrid build' first.\")\n\t\tprocess.exit(1)\n\t}\n\n\tconsole.log(\"\\nš Starting agent from ./dist/...\\n\")\n\n\tconst server = spawn(\"node\", [resolve(distDir, \"server\", \"simple.cjs\")], {\n\t\tcwd: projectDir,\n\t\tstdio: \"inherit\",\n\t\tenv: { ...process.env, AGENT_PROJECT_ROOT: projectDir }\n\t})\n\n\tconst xmtp = spawn(\"node\", [resolve(distDir, \"xmtp.cjs\")], {\n\t\tcwd: projectDir,\n\t\tstdio: \"inherit\",\n\t\tenv: { ...process.env, AGENT_PROJECT_ROOT: projectDir }\n\t})\n\n\tconst exitHandler = (code: number | null) => {\n\t\tif (code !== 0 && code !== null) process.exit(code)\n\t}\n\n\tserver.on(\"exit\", exitHandler)\n\txmtp.on(\"exit\", exitHandler)\n\n\tprocess.on(\"SIGINT\", () => {\n\t\tserver.kill(\"SIGINT\")\n\t\txmtp.kill(\"SIGINT\")\n\t\tprocess.exit(0)\n\t})\n}\n\n// ============================================================================\n// Deploy\n// ============================================================================\n\nasync function deploy(platform?: string, keygen = false) {\n\tconst { spawn, execSync } = await import(\"node:child_process\")\n\tconst { existsSync, readFileSync, writeFileSync } = await import(\"node:fs\")\n\tconst prompts = (await import(\"prompts\")).default\n\tconst { privateKeyToAccount } = await import(\"viem/accounts\")\n\tconst { randomBytes } = await import(\"node:crypto\")\n\n\tconst projectDir = projectRoot\n\tconst distDir = resolve(projectDir, \"dist\")\n\n\t// Prompt for platform if not specified\n\tlet deployPlatform = platform\n\n\t// Check hybrid.config.ts for saved platform\n\tif (!deployPlatform) {\n\t\tconst hybridConfig = resolve(projectDir, \"hybrid.config.ts\")\n\t\tif (existsSync(hybridConfig)) {\n\t\t\tconst configContent = readFileSync(hybridConfig, \"utf-8\")\n\t\t\tconst match = configContent.match(\n\t\t\t\t/deployPlatform\\s*[=:]\\s*[\"']([^\"']+)[\"']/\n\t\t\t)\n\t\t\tif (match) {\n\t\t\t\tdeployPlatform = match[1]\n\t\t\t\tconsole.log(` Using saved platform: ${deployPlatform}`)\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!deployPlatform) {\n\t\tconst choice = await prompts({\n\t\t\ttype: \"select\",\n\t\t\tname: \"platform\",\n\t\t\tmessage: \"Where do you want to deploy?\",\n\t\t\tchoices: [\n\t\t\t\t{ title: \"Fly.io\", value: \"fly\" },\n\t\t\t\t{ title: \"Railway\", value: \"railway\" }\n\t\t\t],\n\t\t\tinitial: 0\n\t\t})\n\t\tif (!choice.platform) {\n\t\t\tconsole.log(\"\\n Cancelled.\\n\")\n\t\t\tprocess.exit(0)\n\t\t}\n\t\tdeployPlatform = choice.platform\n\n\t\t// Save platform to hybrid.config.ts\n\t\tconst hybridConfig = resolve(projectDir, \"hybrid.config.ts\")\n\t\tlet configContent = \"\"\n\t\tif (existsSync(hybridConfig)) {\n\t\t\tconfigContent = readFileSync(hybridConfig, \"utf-8\")\n\t\t}\n\t\tif (!configContent.includes(\"deployPlatform\")) {\n\t\t\tconst newContent = configContent\n\t\t\t\t? configContent.replace(\n\t\t\t\t\t\t/export default/,\n\t\t\t\t\t\t`const deployPlatform = \"${deployPlatform}\"\\n\\nexport default`\n\t\t\t\t\t)\n\t\t\t\t: `const deployPlatform = \"${deployPlatform}\"\\n\\nexport default {}`\n\t\t\twriteFileSync(hybridConfig, newContent)\n\t\t}\n\t}\n\tconst flyTomlPath = resolve(distDir, \"fly.toml\")\n\tconst projectFlyToml = resolve(projectDir, \"fly.toml\")\n\n\t// Get project name from directory as default\n\tconst projectName = basename(projectDir)\n\tlet appName = projectName\n\n\t// Check project fly.toml first (preferred)\n\tif (existsSync(projectFlyToml)) {\n\t\tconst flyToml = readFileSync(projectFlyToml, \"utf-8\")\n\t\tconst match = flyToml.match(/^app\\s*=\\s*[\"']([^\"']+)[\"']/m)\n\t\tif (match) appName = match[1]\n\t} else {\n\t\t// Prompt for app name only if no project fly.toml exists\n\t\tconst result = await prompts({\n\t\t\ttype: \"text\",\n\t\t\tname: \"appName\",\n\t\t\tmessage: \"App name:\",\n\t\t\tinitial: projectName\n\t\t})\n\t\tif (result.appName) appName = result.appName\n\t}\n\n\t// Check for wallet key\n\tlet walletKey = process.env.AGENT_WALLET_KEY || process.env.WALLET_KEY\n\n\t// Validate app name to prevent command injection\n\tif (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(appName)) {\n\t\tconsole.error(`\\nā Invalid app name: ${appName}`)\n\t\tconsole.error(\"App name must start with a letter/digit and contain only letters, digits, hyphens, and underscores.\")\n\t\tprocess.exit(1)\n\t}\n\n\t// Check if app exists\n\tconst { execFileSync } = await import(\"node:child_process\")\n\tlet appExists = false\n\ttry {\n\t\texecFileSync(\"fly\", [\"status\", \"--app\", appName], { stdio: \"pipe\" })\n\t\tappExists = true\n\t} catch {\n\t\t// App doesn't exist\n\t}\n\n\t// Check for OpenRouter key\n\tlet openRouterKey = process.env.OPENROUTER_API_KEY\n\n\t// Only prompt for secrets on first deploy (when app doesn't exist)\n\t// On subsequent deploys, secrets are already set on Fly\n\tif (!appExists) {\n\t\t// Auto-generate wallet if not set or keygen flag is passed\n\t\tif (!walletKey || keygen) {\n\t\t\tif (keygen) {\n\t\t\t\tconsole.log(\"\\nš Generating new wallet key...\")\n\t\t\t} else {\n\t\t\t\tconsole.log(\"\\nš No AGENT_WALLET_KEY found. Generating new wallet...\")\n\t\t\t}\n\t\t\twalletKey = await generateVanityWallet(\n\t\t\t\t\"\",\n\t\t\t\tprivateKeyToAccount,\n\t\t\t\trandomBytes\n\t\t\t)\n\t\t\tconst account = privateKeyToAccount(walletKey as `0x${string}`)\n\t\t\tconsole.log(`ā
Wallet: ${account.address}\\n`)\n\t\t}\n\n\t\t// Prompt for OpenRouter key if not set (required for new apps)\n\t\tif (!openRouterKey) {\n\t\t\tconsole.log(\"š No OPENROUTER_API_KEY found.\")\n\t\t\twhile (true) {\n\t\t\t\tconst result = await prompts({\n\t\t\t\t\ttype: \"password\",\n\t\t\t\t\tname: \"key\",\n\t\t\t\t\tmessage: \"Paste OpenRouter API key:\"\n\t\t\t\t})\n\t\t\t\tconst key = result.key?.trim()\n\t\t\t\tif (key && key.length > 0) {\n\t\t\t\t\topenRouterKey = key\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tconsole.log(\" OpenRouter API key is required. Please enter a value.\")\n\t\t\t}\n\t\t}\n\n\t\t// Set up owner ACL\n\t\tconst aclPath = resolve(projectDir, \"credentials\", \"xmtp-allowFrom.json\")\n\t\tif (!existsSync(aclPath)) {\n\t\t\tconst result = await prompts({\n\t\t\t\ttype: \"text\",\n\t\t\t\tname: \"owner\",\n\t\t\t\tmessage: \"Your wallet address (owner):\",\n\t\t\t\tvalidate: (v: string) =>\n\t\t\t\t\t/^0x[a-fA-F0-9]{40}$/.test(v) ||\n\t\t\t\t\t\"Enter a valid Ethereum address (0x...)\"\n\t\t\t})\n\t\t\tif (result.owner) {\n\t\t\t\tconst { mkdirSync } = await import(\"node:fs\")\n\t\t\t\tmkdirSync(resolve(projectDir, \"credentials\"), { recursive: true })\n\t\t\t\twriteFileSync(\n\t\t\t\t\taclPath,\n\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t{ version: 1, allowFrom: [result.owner.toLowerCase()] },\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\"\\t\"\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\tconsole.log(`ā
Owner set: ${result.owner}\\n`)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build first\n\tawait build(deployPlatform)\n\n\tif (deployPlatform === \"fly\") {\n\t\tconsole.log(\"\\nš Deploying to Fly.io...\")\n\n\t\t// Ensure fly.toml exists with correct app name\n\t\tif (existsSync(projectFlyToml)) {\n\t\t\t// Copy project fly.toml to dist\n\t\t\tconst { cpSync } = await import(\"node:fs\")\n\t\t\tcpSync(projectFlyToml, resolve(distDir, \"fly.toml\"))\n\t\t} else {\n\t\t\t// Generate fly.toml with correct app name\n\t\t\tconst { writeFileSync } = await import(\"node:fs\")\n\t\t\tconst flyTomlContent = generateFlyToml(appName)\n\t\t\twriteFileSync(resolve(distDir, \"fly.toml\"), flyTomlContent)\n\t\t}\n\n\t\tif (!appExists) {\n\t\t\tconsole.log(`š¦ Creating Fly.io app: ${appName}`)\n\t\t\ttry {\n\t\t\t\texecFileSync(\"fly\", [\"apps\", \"create\", appName], {\n\t\t\t\t\tcwd: distDir,\n\t\t\t\t\tstdio: \"inherit\"\n\t\t\t\t})\n\t\t\t} catch {\n\t\t\t\tconsole.log(` App may already exist, continuing...`)\n\t\t\t}\n\t\t}\n\n\t\t// Deploy\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst deploy = spawn(\"fly\", [\"deploy\", \"--config\", \"fly.toml\"], {\n\t\t\t\tcwd: distDir,\n\t\t\t\tstdio: \"inherit\"\n\t\t\t})\n\t\t\tdeploy.on(\"error\", (err) =>\n\t\t\t\treject(new Error(`Deploy failed: ${err.message}`))\n\t\t\t)\n\t\t\tdeploy.on(\"close\", (code) =>\n\t\t\t\tcode === 0 ? resolve() : reject(new Error(`Exit ${code}`))\n\t\t\t)\n\t\t})\n\n\t\t// Set secrets via fly secrets (doesn't require VM to be running)\n\t\t// Use execFileSync with array args to avoid leaking secrets in the process list\n\t\tif (walletKey) {\n\t\t\tconsole.log(\"\\nš Setting wallet key as secret...\")\n\t\t\ttry {\n\t\t\t\texecFileSync(\n\t\t\t\t\t\"fly\",\n\t\t\t\t\t[\"secrets\", \"set\", `AGENT_WALLET_KEY=${walletKey}`, \"--app\", appName],\n\t\t\t\t\t{\n\t\t\t\t\t\tcwd: distDir,\n\t\t\t\t\t\tstdio: \"inherit\"\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(\" ā ļø Could not set secret, skipping...\")\n\t\t\t}\n\t\t}\n\n\t\t// Set OpenRouter secret\n\t\tif (openRouterKey) {\n\t\t\tconsole.log(\"\\nš Setting OpenRouter key as secret...\")\n\t\t\ttry {\n\t\t\t\texecFileSync(\n\t\t\t\t\t\"fly\",\n\t\t\t\t\t[\"secrets\", \"set\", `OPENROUTER_API_KEY=${openRouterKey}`, \"--app\", appName],\n\t\t\t\t\t{\n\t\t\t\t\t\tcwd: distDir,\n\t\t\t\t\t\tstdio: \"inherit\"\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(\" ā ļø Could not set secret, skipping...\")\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(\"\\nā
Deployed!\")\n\t\tconsole.log(` Dashboard: https://fly.io/apps/${appName}`)\n\n\t\t// Save fly.toml to project for future deploys\n\t\tif (!existsSync(projectFlyToml)) {\n\t\t\tconst { cpSync } = await import(\"node:fs\")\n\t\t\tcpSync(resolve(distDir, \"fly.toml\"), projectFlyToml)\n\t\t\tconsole.log(` Saved fly.toml to project`)\n\t\t}\n\n\t\treturn\n\t}\n\n\tif (deployPlatform === \"railway\") {\n\t\tconsole.log(\"\\nš Railway deployment not yet implemented.\")\n\t\tconsole.log(\" See https://railway.app for manual deployment.\")\n\t\tprocess.exit(1)\n\t}\n\n\tconsole.error(`Unknown platform: ${deployPlatform}`)\n\tconsole.error(\"Supported: fly, railway\")\n\tprocess.exit(1)\n}\n\n// ============================================================================\n// Keygen\n// ============================================================================\n\nasync function keygen(prefix?: string) {\n\tif (prefix === \"-h\" || prefix === \"--help\") {\n\t\tconsole.log(\"\\nUsage: hybrid keygen [prefix]\")\n\t\tconsole.log(\"\\nGenerate a new wallet key.\")\n\t\tconsole.log(\n\t\t\t\" prefix Optional hex prefix for vanity address (max 6 chars)\\n\"\n\t\t)\n\t\treturn\n\t}\n\n\tconst { privateKeyToAccount } = await import(\"viem/accounts\")\n\tconst { randomBytes } = await import(\"node:crypto\")\n\n\tconst targetPrefix = prefix?.toLowerCase() || \"\"\n\n\tif (targetPrefix && !/^[0-9a-f]+$/.test(targetPrefix)) {\n\t\tconsole.error(\"\\nā Prefix must be hex characters (0-9, a-f)\")\n\t\tprocess.exit(1)\n\t}\n\n\tif (targetPrefix.length > 6) {\n\t\tconsole.error(\"\\nā Prefix too long (max 6 characters)\")\n\t\tprocess.exit(1)\n\t}\n\n\tconsole.log(\"\\nš Generating wallet...\")\n\tif (targetPrefix) console.log(` Looking for 0x${targetPrefix}...`)\n\n\tconst walletKey = await generateVanityWallet(\n\t\ttargetPrefix,\n\t\tprivateKeyToAccount,\n\t\trandomBytes\n\t)\n\tconst account = privateKeyToAccount(walletKey as `0x${string}`)\n\n\tconsole.log(`\\nā
Wallet generated!`)\n\tconsole.log(` Address: ${account.address}`)\n\tconsole.log(` Private key: ${walletKey}\\n`)\n\tconsole.log(\"ā ļø Save this key securely!\")\n\tconsole.log(` Add to .env: AGENT_WALLET_KEY=${walletKey}\\n`)\n}\n\nasync function generateVanityWallet(\n\tprefix: string,\n\tprivateKeyToAccount: (key: `0x${string}`) => { address: string },\n\trandomBytes: (size: number) => Buffer\n): Promise<string> {\n\tlet attempts = 0\n\tconst max = prefix ? 1000000 : 1\n\n\twhile (attempts < max) {\n\t\tattempts++\n\t\tconst key = `0x${randomBytes(32).toString(\"hex\")}` as `0x${string}`\n\t\tif (!prefix) return key\n\n\t\tconst { address } = privateKeyToAccount(key)\n\t\tif (address.toLowerCase().startsWith(`0x${prefix}`)) {\n\t\t\tconsole.log(` Found in ${attempts} attempts!`)\n\t\t\treturn key\n\t\t}\n\n\t\tif (attempts % 1000 === 0) {\n\t\t\tprocess.stdout.write(\n\t\t\t\t`\\r Searching${\".\".repeat((attempts / 1000) % 4)}${\" \".repeat(3)}${attempts}\\r`\n\t\t\t)\n\t\t}\n\t}\n\n\tthrow new Error(`No vanity address found after ${max} attempts`)\n}\n\n// ============================================================================\n// Register\n// ============================================================================\n\nasync function register() {\n\tconst { execSync } = await import(\"node:child_process\")\n\tconst { existsSync, readFileSync } = await import(\"node:fs\")\n\tconst { join } = await import(\"node:path\")\n\tconst { privateKeyToAccount } = await import(\"viem/accounts\")\n\n\tconst walletKey = process.env.AGENT_WALLET_KEY || process.env.WALLET_KEY\n\tif (!walletKey) {\n\t\tconsole.error(\"\\nā Set AGENT_WALLET_KEY first\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst account = privateKeyToAccount(\n\t\t(walletKey.startsWith(\"0x\") ? walletKey : `0x${walletKey}`) as `0x${string}`\n\t)\n\n\t// Verify ACL exists\n\tconst projectDir = projectRoot\n\tconst aclPath = join(projectDir, \"credentials\", \"xmtp-allowFrom.json\")\n\n\tif (!existsSync(aclPath)) {\n\t\tconsole.error(\"\\nā No credentials/xmtp-allowFrom.json\")\n\t\tconsole.error(\"Run 'hybrid init' first\")\n\t\tprocess.exit(1)\n\t}\n\n\ttry {\n\t\tconst acl = JSON.parse(readFileSync(aclPath, \"utf-8\"))\n\t\tif (!acl.allowFrom?.length) {\n\t\t\tconsole.error(\"\\nā No owners in ACL\")\n\t\t\tprocess.exit(1)\n\t\t}\n\t} catch {\n\t\tconsole.error(\"\\nā Invalid credentials/xmtp-allowFrom.json\")\n\t\tprocess.exit(1)\n\t}\n\n\tconsole.log(`\\nš Registering ${account.address} on XMTP...`)\n\ttry {\n\t\texecSync(\"npx pnpm --filter @hybrd/xmtp register\", {\n\t\t\tcwd: resolve(packageDir, \"..\", \"..\"),\n\t\t\tstdio: \"inherit\",\n\t\t\tenv: { ...process.env, AGENT_WALLET_KEY: walletKey }\n\t\t})\n\t} catch {\n\t\tconsole.error(\"\\nā Registration failed\")\n\t\tprocess.exit(1)\n\t}\n}\n\n// ============================================================================\n// Revoke\n// ============================================================================\n\nasync function revoke(inboxId?: string) {\n\tconst { execSync } = await import(\"node:child_process\")\n\n\tif (!inboxId) {\n\t\tconsole.log(\"\\nUsage: hybrid revoke <inboxId>\")\n\t\tconsole.log(\"Or use: hybrid revoke-all\\n\")\n\t\tprocess.exit(1)\n\t}\n\n\tconsole.log(\"\\nš Revoking XMTP installations...\\n\")\n\ttry {\n\t\texecSync(`npx pnpm --filter @hybrd/xmtp revoke ${inboxId}`, {\n\t\t\tcwd: resolve(packageDir, \"..\", \"..\"),\n\t\t\tstdio: \"inherit\"\n\t\t})\n\t} catch {\n\t\tconsole.log(\"\\nā Revoke failed. Check AGENT_WALLET_KEY\")\n\t\tprocess.exit(1)\n\t}\n}\n\nasync function revokeAll() {\n\tconst { execSync } = await import(\"node:child_process\")\n\n\tconsole.log(\"\\nš Revoking all XMTP installations...\\n\")\n\ttry {\n\t\texecSync(\"npx pnpm --filter @hybrd/xmtp revoke-all\", {\n\t\t\tcwd: resolve(packageDir, \"..\", \"..\"),\n\t\t\tstdio: \"inherit\"\n\t\t})\n\t} catch {\n\t\tconsole.log(\"\\nā Revoke failed. Check AGENT_WALLET_KEY\")\n\t\tprocess.exit(1)\n\t}\n}\n\n// ============================================================================\n// Owner\n// ============================================================================\n\nasync function ownerAdd(address?: string) {\n\tconst { join } = await import(\"node:path\")\n\tconst { existsSync, mkdirSync, writeFileSync, readFileSync } = await import(\n\t\t\"node:fs\"\n\t)\n\n\tif (!address) {\n\t\tconsole.error(\"Usage: hybrid owner add <address>\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst projectDir = projectRoot\n\tconst aclPath = join(projectDir, \"credentials\", \"xmtp-allowFrom.json\")\n\tconst normalized = address.toLowerCase().trim()\n\n\tmkdirSync(join(projectDir, \"credentials\"), { recursive: true })\n\n\tlet acl: { version: number; allowFrom: string[] } = {\n\t\tversion: 1,\n\t\tallowFrom: []\n\t}\n\tif (existsSync(aclPath)) {\n\t\ttry {\n\t\t\tacl = JSON.parse(readFileSync(aclPath, \"utf-8\"))\n\t\t} catch {}\n\t}\n\n\tif (!acl.allowFrom.includes(normalized)) {\n\t\tacl.allowFrom.push(normalized)\n\t\twriteFileSync(aclPath, JSON.stringify(acl, null, \"\\t\"))\n\t\tconsole.log(`\\nā
Added owner: ${normalized}`)\n\t} else {\n\t\tconsole.log(`\\nā ļø Already an owner: ${normalized}`)\n\t}\n\n\tconsole.log(`\\nš Owners (${acl.allowFrom.length}):`)\n\tfor (const owner of acl.allowFrom) console.log(` - ${owner}`)\n}\n\nasync function ownerRemove(address?: string) {\n\tconst { join } = await import(\"node:path\")\n\tconst { existsSync, writeFileSync, readFileSync } = await import(\"node:fs\")\n\n\tif (!address) {\n\t\tconsole.error(\"Usage: hybrid owner remove <address>\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst projectDir = projectRoot\n\tconst aclPath = join(projectDir, \"credentials\", \"xmtp-allowFrom.json\")\n\n\tif (!existsSync(aclPath)) {\n\t\tconsole.error(\"No ACL file. Run 'hybrid register' first.\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst acl: { version: number; allowFrom: string[] } = JSON.parse(\n\t\treadFileSync(aclPath, \"utf-8\")\n\t)\n\tconst normalized = address.toLowerCase().trim()\n\tconst index = acl.allowFrom.indexOf(normalized)\n\n\tif (index === -1) {\n\t\tconsole.log(`\\nā ļø Not an owner: ${normalized}`)\n\t\tprocess.exit(1)\n\t}\n\n\tacl.allowFrom.splice(index, 1)\n\twriteFileSync(aclPath, JSON.stringify(acl, null, \"\\t\"))\n\tconsole.log(`\\nā
Removed owner: ${normalized}`)\n\n\tif (acl.allowFrom.length > 0) {\n\t\tconsole.log(`\\nš Remaining (${acl.allowFrom.length}):`)\n\t\tfor (const owner of acl.allowFrom) console.log(` - ${owner}`)\n\t} else {\n\t\tconsole.log(\"\\nā ļø No owners. Agent is open to all users.\")\n\t}\n}\n\nasync function ownerList() {\n\tconst { join } = await import(\"node:path\")\n\tconst { existsSync, readFileSync } = await import(\"node:fs\")\n\n\tconst projectDir = projectRoot\n\tconst aclPath = join(projectDir, \"credentials\", \"xmtp-allowFrom.json\")\n\n\tif (!existsSync(aclPath)) {\n\t\tconsole.log(\"\\nā ļø No ACL file. Run 'hybrid register' first.\")\n\t\tconsole.log(\"\\n Agent is open to all users.\")\n\t\treturn\n\t}\n\n\tconst acl: { version: number; allowFrom: string[] } = JSON.parse(\n\t\treadFileSync(aclPath, \"utf-8\")\n\t)\n\n\tif (acl.allowFrom.length === 0) {\n\t\tconsole.log(\"\\nš No owners. Agent is open to all users.\")\n\t\treturn\n\t}\n\n\tconsole.log(`\\nš Owners (${acl.allowFrom.length}):`)\n\tfor (const owner of acl.allowFrom) console.log(` - ${owner}`)\n}\n\n// ============================================================================\n// Run\n// ============================================================================\n\n// Export for testing\nexport { init }\n\nmain().catch((error) => {\n\tconsole.error(\"CLI error:\", error)\n\tprocess.exit(1)\n})\n"],"mappings":";;;AAEA,SAAS,kBAAkB;AAC3B,SAAS,UAAU,SAAS,eAAe;AAC3C,SAAS,qBAAqB;AAC9B,SAAS,cAAc;AAEvB,SAAS,gBAAgB,UAA0B;AAClD,QAAM,UAAU,CAAC,gBAAgB,oBAAoB,SAAS;AAC9D,MAAI,UAAU;AACd,SAAO,YAAY,KAAK;AACvB,eAAW,UAAU,SAAS;AAC7B,UAAI,WAAW,QAAQ,SAAS,MAAM,CAAC,GAAG;AACzC,eAAO;AAAA,MACR;AAAA,IACD;AACA,UAAM,SAAS,QAAQ,SAAS,IAAI;AACpC,QAAI,WAAW,QAAS;AACxB,cAAU;AAAA,EACX;AACA,SAAO;AACR;AAEA,IAAM,WAAW,QAAQ,KAAK,UAAU,CAAC,MAAM,MAAM,OAAO;AAC5D,IAAI,aAAa,MAAM,QAAQ,KAAK,WAAW,CAAC,GAAG;AAClD,UAAQ,MAAM,QAAQ,KAAK,WAAW,CAAC,CAAC;AACxC,UAAQ,KAAK,OAAO,UAAU,CAAC;AAChC;AAEA,IAAM,cAAc,gBAAgB,QAAQ,IAAI,CAAC;AAEjD,WAAW,WAAW,CAAC,QAAQ,YAAY,GAAG;AAC7C,QAAM,OAAO,QAAQ,aAAa,OAAO;AACzC,MAAI,WAAW,IAAI,GAAG;AACrB,WAAO,EAAE,KAAK,CAAC;AAAA,EAChB;AACD;AAGA,IAAM,CAAC,KAAK,IAAI,QAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AAC3D,IAAI,CAAC,SAAS,QAAQ,IAAI;AACzB,UAAQ,MAAM,iDAAiD;AAC/D,UAAQ,KAAK,CAAC;AACf;AAGA,IAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,IAAM,aAAa,QAAQ,WAAW,IAAI;AAE1C,eAAe,OAAO;AACrB,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,UAAU,KAAK,CAAC;AAEtB,MAAI,YAAY,QAAS,QAAO,MAAM,KAAK,CAAC,CAAC;AAC7C,MAAI,YAAY,MAAO,QAAO,IAAI,KAAK,SAAS,UAAU,CAAC;AAC3D,MAAI,YAAY,QAAS,QAAO,MAAM;AACtC,MAAI,YAAY,SAAU,QAAO,OAAO,KAAK,CAAC,GAAG,KAAK,SAAS,UAAU,CAAC;AAC1E,MAAI,YAAY,OAAQ,QAAO,KAAK,KAAK,CAAC,CAAC;AAC3C,MAAI,YAAY,SAAU,QAAO,OAAO,KAAK,CAAC,CAAC;AAC/C,MAAI,YAAY,WAAY,QAAO,SAAS;AAC5C,MAAI,YAAY,SAAU,QAAO,OAAO,KAAK,CAAC,CAAC;AAC/C,MAAI,YAAY,aAAc,QAAO,UAAU;AAE/C,MAAI,YAAY,SAAS;AACxB,UAAM,aAAa,KAAK,CAAC;AACzB,QAAI,eAAe,MAAO,QAAO,SAAS,KAAK,CAAC,CAAC;AACjD,QAAI,eAAe,YAAY,eAAe;AAC7C,aAAO,YAAY,KAAK,CAAC,CAAC;AAC3B,QAAI,eAAe,UAAU,eAAe,KAAM,QAAO,UAAU;AACnE,YAAQ,IAAI,iCAAiC;AAC7C,YAAQ,IAAI,aAAa;AACzB,YAAQ,IAAI,wCAAwC;AACpD,YAAQ,IAAI,2CAA2C;AACvD,YAAQ,IAAI,2CAA2C;AACvD,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,MAAI,YAAY,UAAU;AACzB,UAAM,aAAa,KAAK,CAAC;AACzB,QAAI,eAAe,OAAO;AACzB,YAAM,WAAW,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,UAAU;AAChE,YAAM,SAAS,KAAK,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AAC9D,aAAO,UAAU,QAAQ,QAAQ;AAAA,IAClC;AACA,QAAI,eAAe,YAAY,eAAe,MAAM;AACnD,YAAM,WAAW,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,UAAU;AAChE,YAAM,OAAO,KAAK,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AAC5D,aAAO,aAAa,MAAM,QAAQ;AAAA,IACnC;AACA,QAAI,eAAe,UAAU,eAAe,QAAQ,CAAC,YAAY;AAChE,aAAO,WAAW;AAAA,IACnB;AACA,YAAQ,MAAM,8BAA8B,UAAU,EAAE;AACxD,YAAQ,MAAM,sCAAsC;AACpD,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,MAAI,YAAY,aAAa,YAAY,MAAM;AAC9C,UAAM,aAAa,KAAK,CAAC;AACzB,UAAM,kBAAkB,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG;AAC9C,QAAI,eAAe,UAAW,QAAO,eAAe,eAAe;AACnE,QAAI,eAAe,SAAU,QAAO,cAAc,eAAe;AACjE,QAAI,eAAe,UAAW,QAAO,eAAe,eAAe;AACnE,QAAI,eAAe,SAAU,QAAO,cAAc,eAAe;AACjE,QAAI,eAAe,OAAQ,QAAO,YAAY;AAC9C,QAAI,eAAe,QAAS,QAAO,aAAa;AAChD,QAAI,eAAe,SAAU,QAAO,cAAc;AAClD,QAAI,eAAe,SAAU,QAAO,cAAc;AAClD,YAAQ,IAAI,mCAAmC;AAC/C,YAAQ,IAAI,aAAa;AACzB,YAAQ,IAAI,kDAAkD;AAC9D,YAAQ,IAAI,uCAAuC;AACnD,YAAQ,IAAI,qCAAqC;AACjD,YAAQ,IAAI,6CAA6C;AACzD,YAAQ,IAAI,2CAA2C;AACvD,YAAQ,IAAI,+CAA+C;AAC3D,YAAQ,IAAI,+CAA+C;AAC3D,YAAQ,IAAI,iDAAiD;AAC7D,YAAQ,KAAK,CAAC;AAAA,EACf;AAGA,UAAQ,IAAI,yBAAyB;AACrC,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,WAAW;AACvB,UAAQ,IAAI,gDAAgD;AAC5D,UAAQ,IAAI,kDAAkD;AAC9D,UAAQ,IAAI,6DAA6D;AACzE,UAAQ,IAAI,yCAAyC;AACrD,UAAQ,IAAI,+CAA+C;AAC3D,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,SAAS;AACrB,UAAQ,IAAI,+CAA+C;AAC3D,UAAQ,IAAI,iDAAiD;AAC7D,UAAQ,IAAI,8CAA8C;AAC1D,UAAQ,IAAI,kDAAkD;AAC9D,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,QAAQ;AACpB,UAAQ,IAAI,wCAAwC;AACpD,UAAQ,IAAI,2CAA2C;AACvD,UAAQ,IAAI,2CAA2C;AACvD,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,SAAS;AACrB,UAAQ,IAAI,+CAA+C;AAC3D,UAAQ,IAAI,8CAA8C;AAC1D,UAAQ,IAAI,qDAAqD;AACjE,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,mDAAmD;AAC/D,UAAQ,IAAI,kDAAkD;AAC9D,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU;AACtB,UAAQ,IAAI,wCAAwC;AACpD,UAAQ,IAAI,yCAAyC;AACrD,UAAQ,IAAI,kCAAkC;AAC9C,UAAQ,IAAI,sCAAsC;AAClD,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,UAAU;AACtB,UAAQ,IAAI,0DAA0D;AACtE,UAAQ,IAAI,kDAAkD;AAC9D,UAAQ,IAAI,4CAA4C;AACxD,UAAQ,IAAI,oDAAoD;AAChE,UAAQ,IAAI,gDAAgD;AAC5D,UAAQ,IAAI,sDAAsD;AAClE,UAAQ,IAAI,EAAE;AAEd,MAAI,QAAS,SAAQ,KAAK,CAAC;AAC5B;AAMA,eAAe,UAAU,QAAiB,WAAW,OAAO;AAC3D,MAAI,CAAC,QAAQ;AACZ,YAAQ,MAAM,8BAA8B;AAC5C,YAAQ,MAAM,mCAAmC;AACjD,YAAQ,MAAM,wDAAwD;AACtE,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,QAAM,UAAU,CAAC,UAAU,OAAO,QAAQ,MAAM,YAAY,IAAI;AAChE,MAAI,SAAU,SAAQ,KAAK,IAAI;AAE/B,UAAQ;AAAA,IACP;AAAA,8BAA0B,MAAM,GAAG,WAAW,cAAc,EAAE;AAAA;AAAA,EAC/D;AACA,WAAS,OAAO,QAAQ,KAAK,GAAG,CAAC,IAAI,EAAE,OAAO,UAAU,CAAC;AAC1D;AAEA,eAAe,aAAa,MAAe,WAAW,OAAO;AAC5D,MAAI,CAAC,MAAM;AACV,YAAQ,MAAM,4BAA4B;AAC1C,YAAQ,MAAM,0CAA0C;AACxD,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,QAAM,UAAU,CAAC,UAAU,UAAU,MAAM,MAAM,YAAY,IAAI;AACjE,MAAI,SAAU,SAAQ,KAAK,IAAI;AAE/B,WAAS,OAAO,QAAQ,KAAK,GAAG,CAAC,IAAI,EAAE,OAAO,UAAU,CAAC;AAC1D;AAEA,eAAe,aAAa;AAC3B,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,WAAS,+BAA+B,EAAE,OAAO,UAAU,CAAC;AAC7D;AAMA,eAAe,eAAe,WAAmB;AAChD,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,UAAQ,IAAI,0CAAmC;AAC/C,WAAS,uBAAuB,SAAS,IAAI,EAAE,OAAO,UAAU,CAAC;AAClE;AAEA,eAAe,cAAc,OAAe;AAC3C,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,WAAS,sBAAsB,KAAK,IAAI,EAAE,OAAO,UAAU,CAAC;AAC7D;AAEA,eAAe,eAAe,WAAmB;AAChD,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,UAAQ,IAAI,wCAAiC;AAC7C,WAAS,uBAAuB,SAAS,IAAI,EAAE,OAAO,UAAU,CAAC;AAClE;AAEA,eAAe,cAAc,WAAmB;AAC/C,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,UAAQ,IAAI,+CAAwC;AACpD,WAAS,sBAAsB,SAAS,IAAI,EAAE,OAAO,UAAU,CAAC;AACjE;AAEA,eAAe,cAAc;AAC5B,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,WAAS,oBAAoB,EAAE,OAAO,UAAU,CAAC;AAClD;AAEA,eAAe,eAAe;AAC7B,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,UAAQ,IAAI,uCAAgC;AAC5C,WAAS,qBAAqB,EAAE,OAAO,UAAU,CAAC;AACnD;AAEA,eAAe,gBAAgB;AAC9B,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,WAAS,sBAAsB,EAAE,OAAO,UAAU,CAAC;AACpD;AAEA,eAAe,gBAAgB;AAC9B,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,WAAS,sBAAsB,EAAE,OAAO,UAAU,CAAC;AACpD;AAMA,eAAe,KAAK,MAAe;AAClC,MAAI,CAAC,MAAM;AACV,YAAQ,MAAM,4BAA4B;AAC1C,YAAQ,MAAM,2BAA2B;AACzC,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM;AAAA,IACL;AAAA,IACA,YAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI,MAAM,OAAO,IAAS;AAC1B,QAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,UAAe;AAExD,QAAM,cAAc,QAAQ,YAAY,aAAa,OAAO;AAC5D,QAAM,YAAY,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAE7C,MAAIA,YAAW,SAAS,GAAG;AAC1B,YAAQ,MAAM,qBAAqB,IAAI,kBAAkB;AACzD,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,UAAQ,IAAI;AAAA,4BAAwB,IAAI;AAAA,CAAI;AAG5C,SAAO,aAAa,WAAW,EAAE,WAAW,KAAK,CAAC;AAGlD,QAAM,UAAU,QAAQ,WAAW,cAAc;AACjD,QAAM,MAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;AACrD,MAAI,OAAO;AACX,gBAAc,SAAS,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAGnD,QAAM,YAAY,QAAQ,YAAY,QAAQ;AAC9C,QAAM,kBAAkB,QAAQ,WAAW,QAAQ;AAEnD,MAAIA,YAAW,SAAS,GAAG;AAC1B,YAAQ,IAAI,kCAA2B;AACvC,UAAM,aAAa,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC,EAC/D,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAC7B,IAAI,CAAC,MAAM,EAAE,IAAI;AAEnB,cAAU,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAE9C,eAAW,SAAS,YAAY;AAC/B,aAAO,QAAQ,WAAW,KAAK,GAAG,QAAQ,iBAAiB,KAAK,GAAG;AAAA,QAClE,WAAW;AAAA,MACZ,CAAC;AACD,cAAQ,IAAI,aAAQ,KAAK,EAAE;AAAA,IAC5B;AAGA,UAAM,WAAoE,CAAC;AAC3E,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,eAAW,SAAS,YAAY;AAC/B,eAAS,KAAK,IAAI,EAAE,QAAQ,QAAQ,aAAa,IAAI;AAAA,IACtD;AACA;AAAA,MACC,QAAQ,WAAW,kBAAkB;AAAA,MACrC,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,IACjC;AAAA,EACD;AAGA,QAAM,iBAAiB,QAAQ,WAAW,cAAc;AACxD,QAAM,UAAU,QAAQ,WAAW,MAAM;AACzC,MAAIA,YAAW,cAAc,GAAG;AAC/B,WAAO,gBAAgB,OAAO;AAAA,EAC/B;AAGA,QAAM,KAAK,gBAAgB;AAAA,IAC1B,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EACjB,CAAC;AAED,QAAM,WAAW,CAAC,WAAoC;AACrD,WAAO,IAAI,QAAQ,CAACC,aAAY;AAC/B,SAAG,SAAS,QAAQ,CAAC,WAAmB;AACvC,QAAAA,SAAQ,OAAO,KAAK,CAAC;AAAA,MACtB,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AAGA,QAAM,eAAe,MAAM,SAAS,uCAAuC;AAG3E,UAAQ,IAAI,sCAA+B;AAC3C,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,eAAe;AAC5D,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,QAAa;AAClD,QAAM,YAAY,KAAK,YAAY,EAAE,EAAE,SAAS,KAAK,CAAC;AACtD,QAAM,UAAU,oBAAoB,SAA0B;AAC9D,UAAQ,IAAI,eAAe,QAAQ,OAAO,EAAE;AAC5C,UAAQ,IAAI,WAAW,UAAU,MAAM,GAAG,EAAE,CAAC,MAAM,UAAU,MAAM,EAAE,CAAC,EAAE;AAExE,KAAG,MAAM;AAGT,QAAM,WAAW,MAAM,OAAO,SAAS,GAAG;AAC1C,QAAM,mBAAmB,MAAM,QAAQ;AAAA,IACtC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,MACR,EAAE,OAAO,aAAa,OAAO,YAAY;AAAA,MACzC,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,IAC5C;AAAA,IACA,SAAS;AAAA,EACV,CAAC;AAED,MAAI,iBAAiB,aAAa,QAAW;AAC5C,YAAQ,IAAI,cAAc;AAC1B,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,MAAI,eAAe;AACnB,MAAI,gBAAgB;AAEpB,MAAI,iBAAiB,aAAa,aAAa;AAC9C,UAAM,cAAc,MAAM,QAAQ;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACV,CAAC;AACD,mBAAe,YAAY,OAAO;AAAA,EACnC,WAAW,iBAAiB,aAAa,cAAc;AACtD,UAAM,cAAc,MAAM,QAAQ;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACV,CAAC;AACD,oBAAgB,YAAY,OAAO;AAAA,EACpC;AAGA,MAAI,cAAc;AACjB,UAAM,aAAa,aAAa,YAAY;AAC5C,UAAM,iBAAiB,QAAQ,WAAW,aAAa;AACvD,cAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAC7C;AAAA,MACC,QAAQ,gBAAgB,qBAAqB;AAAA,MAC7C,KAAK,UAAU,EAAE,SAAS,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC;AAAA,IAChE;AACA,YAAQ,IAAI;AAAA,sBAAoB,UAAU,EAAE;AAAA,EAC7C;AAGA,MAAI,aAAa,aAAa,SAAS,OAAO;AAG9C,eAAa,WAAW;AAAA,IACvB;AAAA,IACA,oBAAoB,SAAS;AAAA,EAC9B;AAGA,MAAI,cAAc;AACjB,iBAAa,WAAW;AAAA,MACvB;AAAA,MACA,qBAAqB,YAAY;AAAA,IAClC;AAEA,iBAAa,WAAW;AAAA,MACvB;AAAA,MACA;AAAA,IACD;AACA,iBAAa,WAAW;AAAA,MACvB;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAEA,MAAI,eAAe;AAElB,iBAAa,WAAW;AAAA,MACvB;AAAA,MACA;AAAA,IACD;AAEA,iBAAa,WAAW;AAAA,MACvB;AAAA,MACA,wBAAwB,aAAa;AAAA,IACtC;AAEA,iBAAa,WAAW;AAAA,MACvB;AAAA,MACA,CAAC,UAAU,KAAK,KAAK;AAAA,IACtB;AAAA,EACD;AAEA,gBAAc,SAAS,UAAU;AACjC,UAAQ,IAAI,0BAAqB;AAEjC,UAAQ,IAAI;AAAA,2BAAyB,IAAI,GAAG;AAC5C,UAAQ,IAAI,eAAe;AAC3B,UAAQ,IAAI,QAAQ,IAAI,EAAE;AAC1B,UAAQ,IAAI,kCAAkC;AAC9C,UAAQ,IAAI,oCAAoC;AACjD;AAMA,eAAe,MAAM,QAAiB;AACrC,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,QAAM;AAAA,IACL;AAAA,IACA,YAAAD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI,MAAM,OAAO,IAAS;AAE1B,QAAM,aAAa;AACnB,QAAM,UAAU,QAAQ,YAAY,MAAM;AAC1C,QAAM,cAAc,UAAU;AAE9B,UAAQ,IAAI,+BAAwB;AAGpC,MAAIA,YAAW,OAAO,GAAG;AACxB,WAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACjD;AACA,YAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,YAAU,QAAQ,SAAS,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAGzD,UAAQ,IAAI,oCAA6B;AACzC,QAAM,eAAe,QAAQ,YAAY,MAAM;AAE/C,QAAM,QAAQ,CAAC,oBAAoB,UAAU;AAE7C,aAAW,QAAQ,OAAO;AACzB,UAAM,MAAM,QAAQ,cAAc,IAAI;AACtC,QAAIA,YAAW,GAAG,GAAG;AACpB,aAAO,KAAK,QAAQ,SAAS,IAAI,CAAC;AAAA,IACnC,OAAO;AACN,cAAQ,MAAM,cAAc,IAAI,uCAAuC;AAAA,IACxE;AAAA,EACD;AAGA,UAAQ,IAAI,mCAA4B;AACxC,aAAW,QAAQ;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,GAAG;AACF,UAAM,MAAM,QAAQ,YAAY,IAAI;AACpC,QAAIA,YAAW,GAAG,GAAG;AACpB,aAAO,KAAK,QAAQ,SAAS,IAAI,CAAC;AAClC,cAAQ,IAAI,aAAQ,IAAI,EAAE;AAAA,IAC3B;AAAA,EACD;AAGA,QAAM,eAAe,QAAQ,YAAY,kBAAkB;AAC3D,QAAM,iBAAiB,QAAQ,YAAY,eAAe;AAC1D,QAAM,cAAc,QAAQ,YAAY,UAAU;AAElD,MAAIA,YAAW,YAAY,GAAG;AAE7B,WAAO,cAAc,QAAQ,SAAS,kBAAkB,CAAC;AACzD,YAAQ,IAAI,4BAAuB;AAAA,EACpC,WAAWA,YAAW,cAAc,GAAG;AACtC,UAAM,UAAU,aAAa,gBAAgB,OAAO;AACpD;AAAA,MACC,QAAQ,YAAY,kBAAkB;AAAA,MACtC;AAAA,iBAAkD,OAAO;AAAA,IAC1D;AACA,YAAQ,IAAI,0DAAgD;AAAA,EAC7D,WAAWA,YAAW,WAAW,GAAG;AACnC,WAAO,aAAa,QAAQ,SAAS,UAAU,CAAC;AAChD,YAAQ,IAAI,6BAAwB;AAAA,EACrC;AAIA,QAAM,YAAY,QAAQ,YAAY,QAAQ;AAC9C,MAAIA,YAAW,SAAS,GAAG;AAC1B,UAAM,SAAS,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC,EAC3D,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAC7B,IAAI,CAAC,MAAM,EAAE,IAAI;AACnB,YAAQ,IAAI,qBAAc,OAAO,MAAM,eAAe;AAAA,EACvD,OAAO;AACN,YAAQ,IAAI,uEAA6D;AAAA,EAC1E;AAGA,QAAM,WAAW,QAAQ,YAAY,aAAa;AAClD,MAAIA,YAAW,QAAQ,GAAG;AACzB,cAAU,QAAQ,SAAS,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9D,WAAO,UAAU,QAAQ,SAAS,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACrE,YAAQ,IAAI,wBAAmB;AAAA,EAChC;AAGA,QAAM,YAAY;AAAA,IACjB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,cAAc;AAAA,MACb,kCAAkC;AAAA,MAClC,qBAAqB;AAAA,MACrB,mBAAmB;AAAA,MACnB,uBAAuB;AAAA,MACvB,kBAAkB;AAAA,MAClB,IAAI;AAAA,MACJ,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,KAAK;AAAA,IACN;AAAA,EACD;AACA;AAAA,IACC,QAAQ,SAAS,cAAc;AAAA,IAC/B,KAAK,UAAU,WAAW,MAAM,CAAC;AAAA,EAClC;AAGA,gBAAc,QAAQ,SAAS,YAAY,GAAG,mBAAmB,WAAW,CAAC;AAG7E,MAAI,gBAAgB,OAAO;AAC1B,UAAM,iBAAiB,QAAQ,YAAY,UAAU;AACrD,QAAIA,YAAW,cAAc,GAAG;AAC/B,aAAO,gBAAgB,QAAQ,SAAS,UAAU,CAAC;AAAA,IACpD,OAAO;AACN,oBAAc,QAAQ,SAAS,UAAU,GAAG,gBAAgB,CAAC;AAAA,IAC9D;AAAA,EACD;AAGA;AAAA,IACC,QAAQ,SAAS,UAAU;AAAA,IAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKD;AAEA,UAAQ,IAAI,0BAAqB;AACjC,UAAQ,IAAI,cAAc,OAAO,EAAE;AACnC,UAAQ,IAAI,cAAc,WAAW,EAAE;AACxC;AAEA,SAAS,mBAAmB,QAAwB;AACnD,MAAI,WAAW,SAAS,WAAW,WAAW;AAC7C,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsCR;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQR;AAEA,SAAS,gBAAgB,UAAU,gBAAwB;AAC1D,SAAO;AAAA,SACC,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgChB;AAMA,eAAe,IAAI,WAAoB;AACtC,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,QAAM,EAAE,YAAAA,aAAY,aAAa,IAAI,MAAM,OAAO,IAAS;AAC3D,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,eAAe;AAE5D,MAAI,WAAW;AACd,YAAQ,IAAI,8DAAuD;AACnE,YAAQ,IAAI,2CAA2C;AACvD;AAAA,EACD;AAEA,QAAM,aAAa;AAGnB,QAAM,YAAY,QAAQ,IAAI,oBAAoB,QAAQ,IAAI;AAC9D,MAAI,WAAW;AACd,UAAM,qBAAqB,UAAU,WAAW,IAAI,IACjD,YACA,KAAK,SAAS;AACjB,UAAM,UAAU,oBAAoB,kBAAmC;AACvE,YAAQ,IAAI;AAAA,2CAAuC,QAAQ,OAAO,KAAK;AAEvE,QAAI;AACH,YAAM,SAAS;AAAA,QACd;AAAA;AAAA,+BAE2B,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,QAK7C;AAAA,UACC,KAAK,QAAQ,YAAY,MAAM,MAAM;AAAA,UACrC,UAAU;AAAA,UACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,QAC/B;AAAA,MACD;AACA,UAAI,OAAO,SAAS,aAAa,GAAG;AACnC,cAAM,UAAU,OAAO,MAAM,kBAAkB,IAAI,CAAC;AACpD,gBAAQ,IAAI,wCAAmC,OAAO,GAAG;AAAA,MAC1D;AAAA,IACD,SAAS,KAAU;AAClB,YAAM,SAAS,IAAI,UAAU,IAAI,UAAU;AAC3C,UACC,OAAO,SAAS,gBAAgB,KAChC,OAAO,SAAS,gBAAgB,KAChC,OAAO,SAAS,qBAAqB,KACrC,IAAI,UACH;AACD,gBAAQ,IAAI,0BAAqB;AACjC,gBAAQ,IAAI,0CAAmC;AAE/C,iBAAS,0CAA0C;AAAA,UAClD,KAAK,QAAQ,YAAY,MAAM,IAAI;AAAA,UACnC,OAAO;AAAA,UACP,KAAK,EAAE,GAAG,QAAQ,KAAK,kBAAkB,UAAU;AAAA,QACpD,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAGA,QAAM,cAAc,QAAQ,YAAY,QAAQ,UAAU,WAAW;AACrE,QAAM,YAAY,QAAQ,YAAY,QAAQ,UAAU;AAExD,UAAQ,IAAI,8CAAuC;AACnD,UAAQ,IAAI,eAAe,UAAU,EAAE;AACvC,UAAQ,IAAI,eAAe,UAAU;AAAA,CAAI;AAEzC,MAAI;AACH;AAAA,MACC,+EAA+E,WAAW,WAAW,SAAS;AAAA,MAC9G;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,KAAK;AAAA,UACJ,GAAG,QAAQ;AAAA,UACX,oBAAoB;AAAA,QACrB;AAAA,MACD;AAAA,IACD;AAAA,EACD,QAAQ;AACP,YAAQ,MAAM,qCAAgC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EACf;AACD;AAMA,eAAe,QAAQ;AACtB,QAAM,EAAE,MAAM,IAAI,MAAM,OAAO,eAAoB;AACnD,QAAM,EAAE,YAAAA,YAAW,IAAI,MAAM,OAAO,IAAS;AAE7C,QAAM,aAAa;AACnB,QAAM,UAAU,QAAQ,YAAY,MAAM;AAE1C,MAAI,CAACA,YAAW,QAAQ,SAAS,UAAU,YAAY,CAAC,GAAG;AAC1D,YAAQ,MAAM,kDAAkD;AAChE,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,UAAQ,IAAI,8CAAuC;AAEnD,QAAM,SAAS,MAAM,QAAQ,CAAC,QAAQ,SAAS,UAAU,YAAY,CAAC,GAAG;AAAA,IACxE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,KAAK,EAAE,GAAG,QAAQ,KAAK,oBAAoB,WAAW;AAAA,EACvD,CAAC;AAED,QAAM,OAAO,MAAM,QAAQ,CAAC,QAAQ,SAAS,UAAU,CAAC,GAAG;AAAA,IAC1D,KAAK;AAAA,IACL,OAAO;AAAA,IACP,KAAK,EAAE,GAAG,QAAQ,KAAK,oBAAoB,WAAW;AAAA,EACvD,CAAC;AAED,QAAM,cAAc,CAAC,SAAwB;AAC5C,QAAI,SAAS,KAAK,SAAS,KAAM,SAAQ,KAAK,IAAI;AAAA,EACnD;AAEA,SAAO,GAAG,QAAQ,WAAW;AAC7B,OAAK,GAAG,QAAQ,WAAW;AAE3B,UAAQ,GAAG,UAAU,MAAM;AAC1B,WAAO,KAAK,QAAQ;AACpB,SAAK,KAAK,QAAQ;AAClB,YAAQ,KAAK,CAAC;AAAA,EACf,CAAC;AACF;AAMA,eAAe,OAAO,UAAmBE,UAAS,OAAO;AACxD,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,OAAO,eAAoB;AAC7D,QAAM,EAAE,YAAAF,aAAY,cAAc,cAAc,IAAI,MAAM,OAAO,IAAS;AAC1E,QAAM,WAAW,MAAM,OAAO,SAAS,GAAG;AAC1C,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,eAAe;AAC5D,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,QAAa;AAElD,QAAM,aAAa;AACnB,QAAM,UAAU,QAAQ,YAAY,MAAM;AAG1C,MAAI,iBAAiB;AAGrB,MAAI,CAAC,gBAAgB;AACpB,UAAM,eAAe,QAAQ,YAAY,kBAAkB;AAC3D,QAAIA,YAAW,YAAY,GAAG;AAC7B,YAAM,gBAAgB,aAAa,cAAc,OAAO;AACxD,YAAM,QAAQ,cAAc;AAAA,QAC3B;AAAA,MACD;AACA,UAAI,OAAO;AACV,yBAAiB,MAAM,CAAC;AACxB,gBAAQ,IAAI,4BAA4B,cAAc,EAAE;AAAA,MACzD;AAAA,IACD;AAAA,EACD;AAEA,MAAI,CAAC,gBAAgB;AACpB,UAAM,SAAS,MAAM,QAAQ;AAAA,MAC5B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACR,EAAE,OAAO,UAAU,OAAO,MAAM;AAAA,QAChC,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,MACtC;AAAA,MACA,SAAS;AAAA,IACV,CAAC;AACD,QAAI,CAAC,OAAO,UAAU;AACrB,cAAQ,IAAI,kBAAkB;AAC9B,cAAQ,KAAK,CAAC;AAAA,IACf;AACA,qBAAiB,OAAO;AAGxB,UAAM,eAAe,QAAQ,YAAY,kBAAkB;AAC3D,QAAI,gBAAgB;AACpB,QAAIA,YAAW,YAAY,GAAG;AAC7B,sBAAgB,aAAa,cAAc,OAAO;AAAA,IACnD;AACA,QAAI,CAAC,cAAc,SAAS,gBAAgB,GAAG;AAC9C,YAAM,aAAa,gBAChB,cAAc;AAAA,QACd;AAAA,QACA,2BAA2B,cAAc;AAAA;AAAA;AAAA,MAC1C,IACC,2BAA2B,cAAc;AAAA;AAAA;AAC5C,oBAAc,cAAc,UAAU;AAAA,IACvC;AAAA,EACD;AACA,QAAM,cAAc,QAAQ,SAAS,UAAU;AAC/C,QAAM,iBAAiB,QAAQ,YAAY,UAAU;AAGrD,QAAM,cAAc,SAAS,UAAU;AACvC,MAAI,UAAU;AAGd,MAAIA,YAAW,cAAc,GAAG;AAC/B,UAAM,UAAU,aAAa,gBAAgB,OAAO;AACpD,UAAM,QAAQ,QAAQ,MAAM,8BAA8B;AAC1D,QAAI,MAAO,WAAU,MAAM,CAAC;AAAA,EAC7B,OAAO;AAEN,UAAM,SAAS,MAAM,QAAQ;AAAA,MAC5B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACV,CAAC;AACD,QAAI,OAAO,QAAS,WAAU,OAAO;AAAA,EACtC;AAGA,MAAI,YAAY,QAAQ,IAAI,oBAAoB,QAAQ,IAAI;AAG5D,MAAI,CAAC,8BAA8B,KAAK,OAAO,GAAG;AACjD,YAAQ,MAAM;AAAA,2BAAyB,OAAO,EAAE;AAChD,YAAQ,MAAM,qGAAqG;AACnH,YAAQ,KAAK,CAAC;AAAA,EACf;AAGA,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,eAAoB;AAC1D,MAAI,YAAY;AAChB,MAAI;AACH,iBAAa,OAAO,CAAC,UAAU,SAAS,OAAO,GAAG,EAAE,OAAO,OAAO,CAAC;AACnE,gBAAY;AAAA,EACb,QAAQ;AAAA,EAER;AAGA,MAAI,gBAAgB,QAAQ,IAAI;AAIhC,MAAI,CAAC,WAAW;AAEf,QAAI,CAAC,aAAaE,SAAQ;AACzB,UAAIA,SAAQ;AACX,gBAAQ,IAAI,0CAAmC;AAAA,MAChD,OAAO;AACN,gBAAQ,IAAI,iEAA0D;AAAA,MACvE;AACA,kBAAY,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,MACD;AACA,YAAM,UAAU,oBAAoB,SAA0B;AAC9D,cAAQ,IAAI,kBAAa,QAAQ,OAAO;AAAA,CAAI;AAAA,IAC7C;AAGA,QAAI,CAAC,eAAe;AACnB,cAAQ,IAAI,wCAAiC;AAC7C,aAAO,MAAM;AACZ,cAAM,SAAS,MAAM,QAAQ;AAAA,UAC5B,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,QACV,CAAC;AACD,cAAM,MAAM,OAAO,KAAK,KAAK;AAC7B,YAAI,OAAO,IAAI,SAAS,GAAG;AAC1B,0BAAgB;AAChB;AAAA,QACD;AACA,gBAAQ,IAAI,0DAA0D;AAAA,MACvE;AAAA,IACD;AAGA,UAAM,UAAU,QAAQ,YAAY,eAAe,qBAAqB;AACxE,QAAI,CAACF,YAAW,OAAO,GAAG;AACzB,YAAM,SAAS,MAAM,QAAQ;AAAA,QAC5B,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU,CAAC,MACV,sBAAsB,KAAK,CAAC,KAC5B;AAAA,MACF,CAAC;AACD,UAAI,OAAO,OAAO;AACjB,cAAM,EAAE,UAAU,IAAI,MAAM,OAAO,IAAS;AAC5C,kBAAU,QAAQ,YAAY,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACjE;AAAA,UACC;AAAA,UACA,KAAK;AAAA,YACJ,EAAE,SAAS,GAAG,WAAW,CAAC,OAAO,MAAM,YAAY,CAAC,EAAE;AAAA,YACtD;AAAA,YACA;AAAA,UACD;AAAA,QACD;AACA,gBAAQ,IAAI,qBAAgB,OAAO,KAAK;AAAA,CAAI;AAAA,MAC7C;AAAA,IACD;AAAA,EACD;AAGA,QAAM,MAAM,cAAc;AAE1B,MAAI,mBAAmB,OAAO;AAC7B,YAAQ,IAAI,oCAA6B;AAGzC,QAAIA,YAAW,cAAc,GAAG;AAE/B,YAAM,EAAE,OAAO,IAAI,MAAM,OAAO,IAAS;AACzC,aAAO,gBAAgB,QAAQ,SAAS,UAAU,CAAC;AAAA,IACpD,OAAO;AAEN,YAAM,EAAE,eAAAG,eAAc,IAAI,MAAM,OAAO,IAAS;AAChD,YAAM,iBAAiB,gBAAgB,OAAO;AAC9C,MAAAA,eAAc,QAAQ,SAAS,UAAU,GAAG,cAAc;AAAA,IAC3D;AAEA,QAAI,CAAC,WAAW;AACf,cAAQ,IAAI,kCAA2B,OAAO,EAAE;AAChD,UAAI;AACH,qBAAa,OAAO,CAAC,QAAQ,UAAU,OAAO,GAAG;AAAA,UAChD,KAAK;AAAA,UACL,OAAO;AAAA,QACR,CAAC;AAAA,MACF,QAAQ;AACP,gBAAQ,IAAI,yCAAyC;AAAA,MACtD;AAAA,IACD;AAGA,UAAM,IAAI,QAAc,CAACF,UAAS,WAAW;AAC5C,YAAMG,UAAS,MAAM,OAAO,CAAC,UAAU,YAAY,UAAU,GAAG;AAAA,QAC/D,KAAK;AAAA,QACL,OAAO;AAAA,MACR,CAAC;AACD,MAAAA,QAAO;AAAA,QAAG;AAAA,QAAS,CAAC,QACnB,OAAO,IAAI,MAAM,kBAAkB,IAAI,OAAO,EAAE,CAAC;AAAA,MAClD;AACA,MAAAA,QAAO;AAAA,QAAG;AAAA,QAAS,CAAC,SACnB,SAAS,IAAIH,SAAQ,IAAI,OAAO,IAAI,MAAM,QAAQ,IAAI,EAAE,CAAC;AAAA,MAC1D;AAAA,IACD,CAAC;AAID,QAAI,WAAW;AACd,cAAQ,IAAI,6CAAsC;AAClD,UAAI;AACH;AAAA,UACC;AAAA,UACA,CAAC,WAAW,OAAO,oBAAoB,SAAS,IAAI,SAAS,OAAO;AAAA,UACpE;AAAA,YACC,KAAK;AAAA,YACL,OAAO;AAAA,UACR;AAAA,QACD;AAAA,MACD,SAAS,GAAG;AACX,gBAAQ,IAAI,oDAA0C;AAAA,MACvD;AAAA,IACD;AAGA,QAAI,eAAe;AAClB,cAAQ,IAAI,iDAA0C;AACtD,UAAI;AACH;AAAA,UACC;AAAA,UACA,CAAC,WAAW,OAAO,sBAAsB,aAAa,IAAI,SAAS,OAAO;AAAA,UAC1E;AAAA,YACC,KAAK;AAAA,YACL,OAAO;AAAA,UACR;AAAA,QACD;AAAA,MACD,SAAS,GAAG;AACX,gBAAQ,IAAI,oDAA0C;AAAA,MACvD;AAAA,IACD;AAEA,YAAQ,IAAI,oBAAe;AAC3B,YAAQ,IAAI,qCAAqC,OAAO,EAAE;AAG1D,QAAI,CAACD,YAAW,cAAc,GAAG;AAChC,YAAM,EAAE,OAAO,IAAI,MAAM,OAAO,IAAS;AACzC,aAAO,QAAQ,SAAS,UAAU,GAAG,cAAc;AACnD,cAAQ,IAAI,8BAA8B;AAAA,IAC3C;AAEA;AAAA,EACD;AAEA,MAAI,mBAAmB,WAAW;AACjC,YAAQ,IAAI,qDAA8C;AAC1D,YAAQ,IAAI,mDAAmD;AAC/D,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,UAAQ,MAAM,qBAAqB,cAAc,EAAE;AACnD,UAAQ,MAAM,yBAAyB;AACvC,UAAQ,KAAK,CAAC;AACf;AAMA,eAAe,OAAO,QAAiB;AACtC,MAAI,WAAW,QAAQ,WAAW,UAAU;AAC3C,YAAQ,IAAI,iCAAiC;AAC7C,YAAQ,IAAI,8BAA8B;AAC1C,YAAQ;AAAA,MACP;AAAA,IACD;AACA;AAAA,EACD;AAEA,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,eAAe;AAC5D,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,QAAa;AAElD,QAAM,eAAe,QAAQ,YAAY,KAAK;AAE9C,MAAI,gBAAgB,CAAC,cAAc,KAAK,YAAY,GAAG;AACtD,YAAQ,MAAM,mDAA8C;AAC5D,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,MAAI,aAAa,SAAS,GAAG;AAC5B,YAAQ,MAAM,6CAAwC;AACtD,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,UAAQ,IAAI,kCAA2B;AACvC,MAAI,aAAc,SAAQ,IAAI,oBAAoB,YAAY,KAAK;AAEnE,QAAM,YAAY,MAAM;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACA,QAAM,UAAU,oBAAoB,SAA0B;AAE9D,UAAQ,IAAI;AAAA,yBAAuB;AACnC,UAAQ,IAAI,eAAe,QAAQ,OAAO,EAAE;AAC5C,UAAQ,IAAI,mBAAmB,SAAS;AAAA,CAAI;AAC5C,UAAQ,IAAI,uCAA6B;AACzC,UAAQ,IAAI,oCAAoC,SAAS;AAAA,CAAI;AAC9D;AAEA,eAAe,qBACd,QACA,qBACA,aACkB;AAClB,MAAI,WAAW;AACf,QAAM,MAAM,SAAS,MAAU;AAE/B,SAAO,WAAW,KAAK;AACtB;AACA,UAAM,MAAM,KAAK,YAAY,EAAE,EAAE,SAAS,KAAK,CAAC;AAChD,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,EAAE,QAAQ,IAAI,oBAAoB,GAAG;AAC3C,QAAI,QAAQ,YAAY,EAAE,WAAW,KAAK,MAAM,EAAE,GAAG;AACpD,cAAQ,IAAI,eAAe,QAAQ,YAAY;AAC/C,aAAO;AAAA,IACR;AAEA,QAAI,WAAW,QAAS,GAAG;AAC1B,cAAQ,OAAO;AAAA,QACd,iBAAiB,IAAI,OAAQ,WAAW,MAAQ,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,QAAQ;AAAA,MAC9E;AAAA,IACD;AAAA,EACD;AAEA,QAAM,IAAI,MAAM,iCAAiC,GAAG,WAAW;AAChE;AAMA,eAAe,WAAW;AACzB,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,QAAM,EAAE,YAAAA,aAAY,aAAa,IAAI,MAAM,OAAO,IAAS;AAC3D,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,MAAW;AACzC,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,eAAe;AAE5D,QAAM,YAAY,QAAQ,IAAI,oBAAoB,QAAQ,IAAI;AAC9D,MAAI,CAAC,WAAW;AACf,YAAQ,MAAM,qCAAgC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,UAAU;AAAA,IACd,UAAU,WAAW,IAAI,IAAI,YAAY,KAAK,SAAS;AAAA,EACzD;AAGA,QAAM,aAAa;AACnB,QAAM,UAAU,KAAK,YAAY,eAAe,qBAAqB;AAErE,MAAI,CAACA,YAAW,OAAO,GAAG;AACzB,YAAQ,MAAM,6CAAwC;AACtD,YAAQ,MAAM,yBAAyB;AACvC,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,MAAI;AACH,UAAM,MAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;AACrD,QAAI,CAAC,IAAI,WAAW,QAAQ;AAC3B,cAAQ,MAAM,2BAAsB;AACpC,cAAQ,KAAK,CAAC;AAAA,IACf;AAAA,EACD,QAAQ;AACP,YAAQ,MAAM,kDAA6C;AAC3D,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,UAAQ,IAAI;AAAA,wBAAoB,QAAQ,OAAO,aAAa;AAC5D,MAAI;AACH,aAAS,0CAA0C;AAAA,MAClD,KAAK,QAAQ,YAAY,MAAM,IAAI;AAAA,MACnC,OAAO;AAAA,MACP,KAAK,EAAE,GAAG,QAAQ,KAAK,kBAAkB,UAAU;AAAA,IACpD,CAAC;AAAA,EACF,QAAQ;AACP,YAAQ,MAAM,8BAAyB;AACvC,YAAQ,KAAK,CAAC;AAAA,EACf;AACD;AAMA,eAAe,OAAO,SAAkB;AACvC,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AAEtD,MAAI,CAAC,SAAS;AACb,YAAQ,IAAI,kCAAkC;AAC9C,YAAQ,IAAI,6BAA6B;AACzC,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,UAAQ,IAAI,8CAAuC;AACnD,MAAI;AACH,aAAS,wCAAwC,OAAO,IAAI;AAAA,MAC3D,KAAK,QAAQ,YAAY,MAAM,IAAI;AAAA,MACnC,OAAO;AAAA,IACR,CAAC;AAAA,EACF,QAAQ;AACP,YAAQ,IAAI,gDAA2C;AACvD,YAAQ,KAAK,CAAC;AAAA,EACf;AACD;AAEA,eAAe,YAAY;AAC1B,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AAEtD,UAAQ,IAAI,kDAA2C;AACvD,MAAI;AACH,aAAS,4CAA4C;AAAA,MACpD,KAAK,QAAQ,YAAY,MAAM,IAAI;AAAA,MACnC,OAAO;AAAA,IACR,CAAC;AAAA,EACF,QAAQ;AACP,YAAQ,IAAI,gDAA2C;AACvD,YAAQ,KAAK,CAAC;AAAA,EACf;AACD;AAMA,eAAe,SAAS,SAAkB;AACzC,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,MAAW;AACzC,QAAM,EAAE,YAAAA,aAAY,WAAW,eAAe,aAAa,IAAI,MAAM,OACpE,IACD;AAEA,MAAI,CAAC,SAAS;AACb,YAAQ,MAAM,mCAAmC;AACjD,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,aAAa;AACnB,QAAM,UAAU,KAAK,YAAY,eAAe,qBAAqB;AACrE,QAAM,aAAa,QAAQ,YAAY,EAAE,KAAK;AAE9C,YAAU,KAAK,YAAY,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AAE9D,MAAI,MAAgD;AAAA,IACnD,SAAS;AAAA,IACT,WAAW,CAAC;AAAA,EACb;AACA,MAAIA,YAAW,OAAO,GAAG;AACxB,QAAI;AACH,YAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;AAAA,IAChD,QAAQ;AAAA,IAAC;AAAA,EACV;AAEA,MAAI,CAAC,IAAI,UAAU,SAAS,UAAU,GAAG;AACxC,QAAI,UAAU,KAAK,UAAU;AAC7B,kBAAc,SAAS,KAAK,UAAU,KAAK,MAAM,GAAI,CAAC;AACtD,YAAQ,IAAI;AAAA,sBAAoB,UAAU,EAAE;AAAA,EAC7C,OAAO;AACN,YAAQ,IAAI;AAAA,kCAA2B,UAAU,EAAE;AAAA,EACpD;AAEA,UAAQ,IAAI;AAAA,oBAAgB,IAAI,UAAU,MAAM,IAAI;AACpD,aAAW,SAAS,IAAI,UAAW,SAAQ,IAAI,OAAO,KAAK,EAAE;AAC9D;AAEA,eAAe,YAAY,SAAkB;AAC5C,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,MAAW;AACzC,QAAM,EAAE,YAAAA,aAAY,eAAe,aAAa,IAAI,MAAM,OAAO,IAAS;AAE1E,MAAI,CAAC,SAAS;AACb,YAAQ,MAAM,sCAAsC;AACpD,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,aAAa;AACnB,QAAM,UAAU,KAAK,YAAY,eAAe,qBAAqB;AAErE,MAAI,CAACA,YAAW,OAAO,GAAG;AACzB,YAAQ,MAAM,2CAA2C;AACzD,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,MAAgD,KAAK;AAAA,IAC1D,aAAa,SAAS,OAAO;AAAA,EAC9B;AACA,QAAM,aAAa,QAAQ,YAAY,EAAE,KAAK;AAC9C,QAAM,QAAQ,IAAI,UAAU,QAAQ,UAAU;AAE9C,MAAI,UAAU,IAAI;AACjB,YAAQ,IAAI;AAAA,8BAAuB,UAAU,EAAE;AAC/C,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,MAAI,UAAU,OAAO,OAAO,CAAC;AAC7B,gBAAc,SAAS,KAAK,UAAU,KAAK,MAAM,GAAI,CAAC;AACtD,UAAQ,IAAI;AAAA,wBAAsB,UAAU,EAAE;AAE9C,MAAI,IAAI,UAAU,SAAS,GAAG;AAC7B,YAAQ,IAAI;AAAA,uBAAmB,IAAI,UAAU,MAAM,IAAI;AACvD,eAAW,SAAS,IAAI,UAAW,SAAQ,IAAI,OAAO,KAAK,EAAE;AAAA,EAC9D,OAAO;AACN,YAAQ,IAAI,wDAA8C;AAAA,EAC3D;AACD;AAEA,eAAe,YAAY;AAC1B,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,MAAW;AACzC,QAAM,EAAE,YAAAA,aAAY,aAAa,IAAI,MAAM,OAAO,IAAS;AAE3D,QAAM,aAAa;AACnB,QAAM,UAAU,KAAK,YAAY,eAAe,qBAAqB;AAErE,MAAI,CAACA,YAAW,OAAO,GAAG;AACzB,YAAQ,IAAI,2DAAiD;AAC7D,YAAQ,IAAI,iCAAiC;AAC7C;AAAA,EACD;AAEA,QAAM,MAAgD,KAAK;AAAA,IAC1D,aAAa,SAAS,OAAO;AAAA,EAC9B;AAEA,MAAI,IAAI,UAAU,WAAW,GAAG;AAC/B,YAAQ,IAAI,oDAA6C;AACzD;AAAA,EACD;AAEA,UAAQ,IAAI;AAAA,oBAAgB,IAAI,UAAU,MAAM,IAAI;AACpD,aAAW,SAAS,IAAI,UAAW,SAAQ,IAAI,OAAO,KAAK,EAAE;AAC9D;AASA,KAAK,EAAE,MAAM,CAAC,UAAU;AACvB,UAAQ,MAAM,cAAc,KAAK;AACjC,UAAQ,KAAK,CAAC;AACf,CAAC;","names":["existsSync","resolve","keygen","writeFileSync","deploy"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.0_jiti@2.6.0_postcss@8.5.6_tsx@4.20.5_typescript@5.9.3_yaml@2.8.1/node_modules/tsup/assets/esm_shims.js","../src/deploy/providers/sprite.provider.ts","../src/deploy/providers/e2b.provider.ts","../src/deploy/providers/northflank.provider.ts","../src/deploy/providers/daytona.provider.ts","../src/deploy/index.ts","../src/deploy/deploy.ts","../src/cli.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { execFileSync, spawn } from \"node:child_process\"\nimport { existsSync, unlinkSync } from \"node:fs\"\nimport { tmpdir } from \"node:os\"\nimport { basename, join } from \"node:path\"\nimport type {\n\tDeployProvider,\n\tInstanceStatus,\n\tProvisionOpts\n} from \"../deploy-provider\"\n\n// ============================================================================\n// Sprites.dev Provider\n// ============================================================================\n\nexport const spriteProvider: DeployProvider = {\n\tname: \"sprites\",\n\tlabel: \"Sprites.dev (Firecracker)\",\n\n\tdefaultName(projectDir: string): string {\n\t\t// Sanitize: sprites.dev names must be lowercase alphanumeric + hyphens\n\t\treturn basename(projectDir)\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9-]/g, \"-\")\n\t\t\t.replace(/-+/g, \"-\")\n\t\t\t.replace(/^-+|-+$/g, \"\")\n\t\t\t.slice(0, 40)\n\t},\n\n\tasync authCheck(): Promise<void> {\n\t\ttry {\n\t\t\texecFileSync(\"sprite\", [\"list\"], { stdio: \"pipe\", timeout: 5000 })\n\t\t} catch (err: any) {\n\t\t\tif (err.code === \"ENOENT\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"'sprite' CLI not found.\\n\" +\n\t\t\t\t\t\t\" Install: https://sprites.dev/docs/install\\n\" +\n\t\t\t\t\t\t\" Or: npm i -g sprite-cli\"\n\t\t\t\t)\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`Sprite CLI authentication failed.\\n Run: sprite login\\n Error: ${err.stderr || err.message}`\n\t\t\t)\n\t\t}\n\t},\n\n\tasync provision(name: string, _opts?: ProvisionOpts): Promise<string> {\n\t\t// Validate name\n\t\tif (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(name)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid sprite name: ${name}\\nName must start with a letter/digit and contain only letters, digits, hyphens, and underscores.`\n\t\t\t)\n\t\t}\n\n\t\t// Check if sprite already exists\n\t\ttry {\n\t\t\tconst existing = execFileSync(\"sprite\", [\"list\"], {\n\t\t\t\tencoding: \"utf-8\"\n\t\t\t})\n\t\t\tif (existing.includes(name)) {\n\t\t\t\treturn name\n\t\t\t}\n\t\t} catch {\n\t\t\t// sprite list failed for some reason, try to create anyway\n\t\t}\n\n\t\tconsole.log(`\\nš¦ Creating sprite: ${name}`)\n\t\ttry {\n\t\t\texecFileSync(\"sprite\", [\"create\", \"-skip-console\", name], {\n\t\t\t\tstdio: \"inherit\"\n\t\t\t})\n\t\t} catch {\n\t\t\t// May already exist (race condition) ā verify\n\t\t\tconst existing = execFileSync(\"sprite\", [\"list\"], {\n\t\t\t\tencoding: \"utf-8\"\n\t\t\t})\n\t\t\tif (existing.includes(name)) {\n\t\t\t\tconsole.log(` Sprite ${name} already exists, using it`)\n\t\t\t\treturn name\n\t\t\t}\n\t\t\tthrow new Error(\"Failed to create sprite\")\n\t\t}\n\n\t\t// Wait for sprite to be ready\n\t\tconsole.log(\"\\nā³ Waiting for sprite to be ready...\")\n\t\tfor (let i = 0; i < 30; i++) {\n\t\t\ttry {\n\t\t\t\texecFileSync(\"sprite\", [\"exec\", \"-s\", name, \"--\", \"echo\", \"ready\"], {\n\t\t\t\t\tstdio: \"pipe\"\n\t\t\t\t})\n\t\t\t\tconsole.log(\" ā Sprite ready\")\n\t\t\t\treturn name\n\t\t\t} catch {\n\t\t\t\tif (i % 5 === 4) {\n\t\t\t\t\tconsole.log(` Still waiting... (${i + 1}/30)`)\n\t\t\t\t}\n\t\t\t\tawait new Promise((r) => setTimeout(r, 2000))\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(\"Sprite did not become ready in time\")\n\t},\n\n\tasync deploy(instanceId: string, distDir: string): Promise<void> {\n\t\tconsole.log(\"\\nš¤ Uploading build artifacts...\")\n\t\tconst tarPath = join(tmpdir(), `hybrid-deploy-${Date.now()}.tar.gz`)\n\n\t\t// Create tarball\n\t\texecFileSync(\"tar\", [\"-czf\", tarPath, \"-C\", distDir, \".\"], {\n\t\t\tstdio: \"pipe\"\n\t\t})\n\n\t\t// Ensure /app directory exists\n\t\texecFileSync(\n\t\t\t\"sprite\",\n\t\t\t[\"exec\", \"-s\", instanceId, \"--\", \"mkdir\", \"-p\", \"/app\"],\n\t\t\t{\n\t\t\t\tstdio: \"pipe\"\n\t\t\t}\n\t\t)\n\n\t\t// Upload and extract (retry up to 3 times)\n\t\tlet uploadSuccess = false\n\t\tfor (let attempt = 0; attempt < 3; attempt++) {\n\t\t\ttry {\n\t\t\t\texecFileSync(\n\t\t\t\t\t\"sprite\",\n\t\t\t\t\t[\n\t\t\t\t\t\t\"exec\",\n\t\t\t\t\t\t\"-s\",\n\t\t\t\t\t\tinstanceId,\n\t\t\t\t\t\t\"-file\",\n\t\t\t\t\t\t`${tarPath}:/tmp/hybrid-deploy.tar.gz`,\n\t\t\t\t\t\t\"--\",\n\t\t\t\t\t\t\"tar\",\n\t\t\t\t\t\t\"-xzf\",\n\t\t\t\t\t\t\"/tmp/hybrid-deploy.tar.gz\",\n\t\t\t\t\t\t\"-C\",\n\t\t\t\t\t\t\"/app\"\n\t\t\t\t\t],\n\t\t\t\t\t{ stdio: \"inherit\" }\n\t\t\t\t)\n\t\t\t\tuploadSuccess = true\n\t\t\t\tbreak\n\t\t\t} catch {\n\t\t\t\tif (attempt < 2) {\n\t\t\t\t\tconsole.log(` Upload failed, retrying... (${attempt + 1}/3)`)\n\t\t\t\t\tawait new Promise((r) => setTimeout(r, 5000))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Clean up local tarball\n\t\tif (existsSync(tarPath)) {\n\t\t\ttry {\n\t\t\t\tunlinkSync(tarPath)\n\t\t\t} catch {}\n\t\t}\n\n\t\tif (!uploadSuccess) {\n\t\t\tthrow new Error(\"Failed to upload build artifacts after 3 attempts\")\n\t\t}\n\n\t\t// Install dependencies\n\t\tconsole.log(\"\\nš¦ Installing dependencies...\")\n\t\texecFileSync(\n\t\t\t\"sprite\",\n\t\t\t[\n\t\t\t\t\"exec\",\n\t\t\t\t\"-s\",\n\t\t\t\tinstanceId,\n\t\t\t\t\"--\",\n\t\t\t\t\"bash\",\n\t\t\t\t\"-c\",\n\t\t\t\t\"cd /app && npm install --production\"\n\t\t\t],\n\t\t\t{ stdio: \"inherit\" }\n\t\t)\n\n\t\t// Set up and start the agent\n\t\tconsole.log(\"\\nš§ Starting agent...\")\n\t\tconst { writeFileSync } = await import(\"node:fs\")\n\t\tconst scriptPath = join(tmpdir(), `hybrid-start-${Date.now()}.sh`)\n\t\tconst startupScript = `#!/bin/bash\ncd /app\nexport NODE_ENV=production\nexport AGENT_PORT=8454\nexec nohup node server/index.cjs > /app/agent.log 2>&1 &\necho $! > /app/agent.pid\n`\n\t\twriteFileSync(scriptPath, startupScript, { mode: 0o755 })\n\n\t\texecFileSync(\n\t\t\t\"sprite\",\n\t\t\t[\n\t\t\t\t\"exec\",\n\t\t\t\t\"-s\",\n\t\t\t\tinstanceId,\n\t\t\t\t\"-file\",\n\t\t\t\t`${scriptPath}:/app/start-agent.sh`,\n\t\t\t\t\"--\",\n\t\t\t\t\"chmod\",\n\t\t\t\t\"+x\",\n\t\t\t\t\"/app/start-agent.sh\"\n\t\t\t],\n\t\t\t{ stdio: \"pipe\" }\n\t\t)\n\n\t\texecFileSync(\n\t\t\t\"sprite\",\n\t\t\t[\"exec\", \"-s\", instanceId, \"--\", \"bash\", \"/app/start-agent.sh\"],\n\t\t\t{ stdio: \"inherit\" }\n\t\t)\n\n\t\ttry {\n\t\t\tunlinkSync(scriptPath)\n\t\t} catch {}\n\n\t\t// Wait for agent to be ready\n\t\tconsole.log(\"\\nā³ Waiting for agent to start...\")\n\t\tlet ready = false\n\t\tfor (let i = 0; i < 15; i++) {\n\t\t\ttry {\n\t\t\t\tconst result = execFileSync(\n\t\t\t\t\t\"sprite\",\n\t\t\t\t\t[\n\t\t\t\t\t\t\"exec\",\n\t\t\t\t\t\t\"-s\",\n\t\t\t\t\t\tinstanceId,\n\t\t\t\t\t\t\"--\",\n\t\t\t\t\t\t\"curl\",\n\t\t\t\t\t\t\"-s\",\n\t\t\t\t\t\t\"http://localhost:8454/health\"\n\t\t\t\t\t],\n\t\t\t\t\t{ encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] }\n\t\t\t\t)\n\t\t\t\tif (result) {\n\t\t\t\t\tready = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Agent not ready yet\n\t\t\t}\n\t\t\tawait new Promise((r) => setTimeout(r, 2000))\n\t\t}\n\n\t\tif (!ready) {\n\t\t\tconsole.log(\" ā ļø Agent may not be fully ready (health check timed out)\")\n\t\t} else {\n\t\t\tconsole.log(\" ā Agent running\")\n\t\t}\n\t},\n\n\tasync status(instanceId: string): Promise<InstanceStatus> {\n\t\ttry {\n\t\t\tconst output = execFileSync(\"sprite\", [\"list\"], {\n\t\t\t\tencoding: \"utf-8\"\n\t\t\t})\n\t\t\tif (!output.includes(instanceId)) {\n\t\t\t\treturn \"stopped\"\n\t\t\t}\n\t\t\t// Parse sprite list output to determine state\n\t\t\t// This is heuristic ā sprites.list format may vary\n\t\t\tconst lines = output.split(\"\\n\")\n\t\t\tfor (const line of lines) {\n\t\t\t\tif (line.includes(instanceId)) {\n\t\t\t\t\tif (line.includes(\"sleeping\") || line.includes(\"paused\")) {\n\t\t\t\t\t\treturn \"sleeping\"\n\t\t\t\t\t}\n\t\t\t\t\tif (line.includes(\"running\")) {\n\t\t\t\t\t\treturn \"running\"\n\t\t\t\t\t}\n\t\t\t\t\tif (line.includes(\"stopped\") || line.includes(\"terminated\")) {\n\t\t\t\t\t\treturn \"stopped\"\n\t\t\t\t\t}\n\t\t\t\t\treturn \"running\" // assume running if found and no explicit state\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn \"unknown\"\n\t\t} catch {\n\t\t\treturn \"unknown\"\n\t\t}\n\t},\n\n\tasync sleep(instanceId: string): Promise<void> {\n\t\tconsole.log(`\\nš¤ Sleeping sprite: ${instanceId}`)\n\t\ttry {\n\t\t\texecFileSync(\"sprite\", [\"sleep\", instanceId], { stdio: \"inherit\" })\n\t\t\tconsole.log(\" ā Sprite sleeping\")\n\t\t} catch (err: any) {\n\t\t\tthrow new Error(`Failed to sleep sprite: ${err.stderr || err.message}`)\n\t\t}\n\t},\n\n\tasync wake(instanceId: string): Promise<void> {\n\t\tconsole.log(`\\nāļø Waking sprite: ${instanceId}`)\n\t\ttry {\n\t\t\texecFileSync(\"sprite\", [\"exec\", \"-s\", instanceId, \"--\", \"echo\", \"wake\"], {\n\t\t\t\tstdio: \"pipe\"\n\t\t\t})\n\t\t\tconsole.log(\" ā Sprite awake\")\n\t\t} catch (err: any) {\n\t\t\tthrow new Error(`Failed to wake sprite: ${err.stderr || err.message}`)\n\t\t}\n\t},\n\n\tasync logs(instanceId: string, follow = true): Promise<void> {\n\t\tconst args = follow\n\t\t\t? [\"logs\", \"-s\", instanceId, \"-f\"]\n\t\t\t: [\"logs\", \"-s\", instanceId]\n\t\tconst child = spawn(\"sprite\", args, { stdio: \"inherit\" })\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tchild.on(\"exit\", (code) => {\n\t\t\t\tif (code === 0) resolve()\n\t\t\t\telse reject(new Error(`sprite logs exited with code ${code}`))\n\t\t\t})\n\t\t})\n\t},\n\n\tasync endpoint(instanceId: string): Promise<string> {\n\t\treturn `https://${instanceId}.sprites.dev`\n\t},\n\n\tasync teardown(instanceId: string): Promise<void> {\n\t\tconsole.log(`\\nšļø Destroying sprite: ${instanceId}`)\n\t\ttry {\n\t\t\texecFileSync(\"sprite\", [\"delete\", instanceId], { stdio: \"inherit\" })\n\t\t\tconsole.log(\" ā Sprite destroyed\")\n\t\t} catch (err: any) {\n\t\t\tthrow new Error(`Failed to destroy sprite: ${err.stderr || err.message}`)\n\t\t}\n\t}\n}\n","import { execFileSync } from \"node:child_process\"\nimport { existsSync, unlinkSync } from \"node:fs\"\nimport { tmpdir } from \"node:os\"\nimport { basename, join } from \"node:path\"\nimport type {\n\tDeployProvider,\n\tInstanceStatus,\n\tProvisionOpts,\n} from \"../deploy-provider\"\n\n// ============================================================================\n// E2B.dev Provider\n//\n// Uses the `e2b` npm package for sandbox management.\n// Requires E2B_API_KEY environment variable.\n//\n// Sleep/wake: sandbox.pause() freezes state.\n// Sandbox.connect(sandboxId) resumes (auto-resumes if paused).\n// ============================================================================\n\nconst DEFAULT_TEMPLATE = \"base\"\n\ntype SandboxInstance = any // eslint-disable-line @typescript-eslint/no-explicit-any\n\nconst sandboxes = new Map<string, SandboxInstance>()\n\n/** Look up a sandbox by name or ID via the E2B API. Works across CLI invocations.\n * Status-only ā does NOT call connect(), so it won't auto-resume paused sandboxes. */\nasync function findSandbox(name: string): Promise<SandboxInstance | null> {\n\tconst Sandbox = await getSDK()\n\tconst paginator = Sandbox.list()\n\twhile (paginator.hasNext) {\n\t\tconst items = await paginator.nextItems()\n\t\tfor (const s of items) {\n\t\t\tconst info = (s as unknown) as Record<string, unknown>\n\t\t\tconst meta = info.metadata as\n\t\t\t\t| Record<string, string>\n\t\t\t\t| undefined\n\t\t\tif (\n\t\t\t\tmeta?.[\"hybrid-name\"] === name ||\n\t\t\t\tinfo.sandboxId === name ||\n\t\t\t\t(info.sandboxId as string)?.startsWith(name)\n\t\t\t) {\n\t\t\t\treturn s as SandboxInstance\n\t\t\t}\n\t\t}\n\t}\n\treturn null\n}\n\nasync function getSDK() {\n\ttry {\n\t\tconst { Sandbox } = await import(\"e2b\")\n\t\treturn Sandbox\n\t} catch {\n\t\tthrow new Error(\n\t\t\t\"e2b not installed.\\nInstall with: npm install e2b\",\n\t\t)\n\t}\n}\n\nfunction getAPIKey(): string {\n\tconst key = process.env.E2B_API_KEY\n\tif (!key) {\n\t\tthrow new Error(\n\t\t\t\"E2B_API_KEY not set.\\nGet your key: https://e2b.dev/dashboard?tab=keys\\nSet with: export E2B_API_KEY=e2b_xxx\",\n\t\t)\n\t}\n\treturn key\n}\n\n/** Get a sandbox instance, trying cache first then API lookup + connect.\n * Connect will auto-resume paused sandboxes. */\nasync function getSandbox(name: string): Promise<SandboxInstance | null> {\n\tconst cached = sandboxes.get(name)\n\tif (cached) return cached\n\n\tconst found = await findSandbox(name)\n\tif (!found) return null\n\n\tconst Sandbox = await getSDK()\n\tconst sandbox = await Sandbox.connect((found as any).sandboxId)\n\tsandboxes.set(name, sandbox)\n\treturn sandbox\n}\n\nexport const e2bProvider: DeployProvider = {\n\tname: \"e2b\",\n\tlabel: \"E2B.dev (Firecracker)\",\n\n\tdefaultName(projectDir: string): string {\n\t\treturn basename(projectDir)\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9-]/g, \"-\")\n\t\t\t.replace(/-+/g, \"-\")\n\t\t\t.replace(/^-+|-+$/g, \"\")\n\t\t\t.slice(0, 40)\n\t},\n\n\tasync authCheck(): Promise<void> {\n\t\tgetAPIKey()\n\t\tconst Sandbox = await getSDK()\n\t\ttry {\n\t\t\tconst paginator = Sandbox.list()\n\t\t\tawait paginator.nextItems()\n\t\t} catch (err: unknown) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err)\n\t\t\tif (msg.includes(\"401\") || msg.includes(\"unauthorized\")) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"E2B API key is invalid.\\nGet your key: https://e2b.dev/dashboard?tab=keys\",\n\t\t\t\t)\n\t\t\t}\n\t\t\tthrow new Error(`E2B connection failed: ${msg}`)\n\t\t}\n\t},\n\n\tasync provision(name: string, _opts?: ProvisionOpts): Promise<string> {\n\t\tconst Sandbox = await getSDK()\n\n\t\tconsole.log(`\\nš¦ Creating E2B sandbox: ${name}`)\n\n\t\tconst existing = await findSandbox(name)\n\t\tif (existing) {\n\t\t\tconst sandbox = await Sandbox.connect(\n\t\t\t\t(existing as any).sandboxId,\n\t\t\t)\n\t\t\tsandboxes.set(name, sandbox)\n\t\t\tconsole.log(\n\t\t\t\t` ā Resumed existing sandbox: ${(existing as any).sandboxId}`,\n\t\t\t)\n\t\t\treturn (existing as any).sandboxId\n\t\t}\n\n\t\tconst sandbox = await Sandbox.create(DEFAULT_TEMPLATE, {\n\t\t\tmetadata: { \"hybrid-name\": name },\n\t\t})\n\n\t\tsandboxes.set(name, sandbox)\n\t\tconsole.log(` ā Sandbox created: ${sandbox.sandboxId}`)\n\t\treturn sandbox.sandboxId\n\t},\n\n\tasync deploy(instanceId: string, distDir: string): Promise<void> {\n\t\tconst sandbox = await getSandbox(instanceId)\n\t\tif (!sandbox) {\n\t\t\tthrow new Error(\n\t\t\t\t`Sandbox ${instanceId} not found.\\nRun 'hybrid deploy' again to reconnect.`,\n\t\t\t)\n\t\t}\n\n\t\tconsole.log(\"\\nš¤ Uploading build artifacts...\")\n\n\t\tconst tarPath = join(\n\t\t\ttmpdir(),\n\t\t\t`hybrid-e2b-deploy-${Date.now()}.tar.gz`,\n\t\t)\n\t\texecFileSync(\"tar\", [\"-czf\", tarPath, \"-C\", distDir, \".\"], {\n\t\t\tstdio: \"pipe\",\n\t\t})\n\n\t\ttry {\n\t\t\tconst fs = await import(\"node:fs/promises\")\n\t\t\tconst tarBuffer = await fs.readFile(tarPath)\n\t\t\tawait sandbox.files.write(\"/tmp/hybrid-deploy.tar.gz\", tarBuffer, {\n\t\t\t\tonProgress: () => {},\n\t\t\t})\n\t\t\tconsole.log(\" ā Upload complete\")\n\t\t} catch (err: unknown) {\n\t\t\tthrow new Error(\n\t\t\t\t`Upload failed: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t)\n\t\t} finally {\n\t\t\tif (existsSync(tarPath)) {\n\t\t\t\ttry {\n\t\t\t\t\tunlinkSync(tarPath)\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(\"\\nš¦ Extracting and installing dependencies...\")\n\t\tconst result = await sandbox.commands.run(\n\t\t\t\"cd /home/user && mkdir -p app && tar -xzf /tmp/hybrid-deploy.tar.gz -C app && cd app && npm install --production 2>&1\",\n\t\t\t{ timeout: 120000 },\n\t\t)\n\n\t\tif (result.stderr) {\n\t\t\tconsole.log(` ā ļø ${result.stderr.slice(0, 200)}`)\n\t\t}\n\n\t\tif (result.exitCode !== 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Dependency installation failed (exit ${result.exitCode})`,\n\t\t\t)\n\t\t}\n\n\t\tconsole.log(\"\\nš§ Starting agent...\")\n\t\tawait sandbox.commands.run(\n\t\t\t\"cd /home/user/app && export NODE_ENV=production AGENT_PORT=8454 && nohup node server/index.cjs > /tmp/agent.log 2>&1 & echo $! > /tmp/agent.pid\",\n\t\t\t{ timeout: 10000 },\n\t\t)\n\n\t\tconsole.log(\"\\nā³ Waiting for agent to start...\")\n\t\tlet ready = false\n\t\tfor (let i = 0; i < 15; i++) {\n\t\t\ttry {\n\t\t\t\tconst health = await sandbox.commands.run(\n\t\t\t\t\t\"curl -sf http://localhost:8454/health || echo 'not ready'\",\n\t\t\t\t)\n\t\t\t\tif (health.stdout && !health.stdout.includes(\"not ready\")) {\n\t\t\t\t\tready = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Not ready yet\n\t\t\t}\n\t\t\tawait new Promise((r) => setTimeout(r, 2000))\n\t\t}\n\n\t\tif (!ready) {\n\t\t\tconsole.log(\n\t\t\t\t\" ā ļø Agent health check timed out (may still be starting)\",\n\t\t\t)\n\t\t} else {\n\t\t\tconsole.log(\" ā Agent running\")\n\t\t}\n\t},\n\n\tasync status(instanceId: string): Promise<InstanceStatus> {\n\t\t// NOTE: Must use findSandbox only ā doGetSandbox() calls connect()\n\t\t// which auto-resumes paused sandboxes, so status would never show \"sleeping\".\n\t\tconst info = await findSandbox(instanceId)\n\t\tif (!info) return \"stopped\"\n\t\tconst sbInfo = info as any\n\t\tif (sbInfo.status === \"paused\") return \"sleeping\"\n\t\tif (sbInfo.status === \"running\") return \"running\"\n\t\treturn \"unknown\"\n\t},\n\n\tasync sleep(instanceId: string): Promise<void> {\n\t\tconst sandbox = await getSandbox(instanceId)\n\t\tif (!sandbox) {\n\t\t\tthrow new Error(\n\t\t\t\t`Sandbox ${instanceId} not found.\\nRun 'hybrid deploy' again to reconnect.`,\n\t\t\t)\n\t\t}\n\n\t\tconsole.log(`\\nš¤ Pausing E2B sandbox: ${instanceId}`)\n\t\tawait sandbox.pause()\n\t\tsandboxes.delete(instanceId)\n\t\tconsole.log(\" ā Sandbox paused (state preserved on disk)\")\n\t},\n\n\tasync wake(instanceId: string): Promise<void> {\n\t\tconst Sandbox = await getSDK()\n\n\t\tconsole.log(`\\nāļø Resuming E2B sandbox: ${instanceId}`)\n\t\ttry {\n\t\t\tconst sandbox = await Sandbox.connect(instanceId)\n\t\t\tsandboxes.set(instanceId, sandbox)\n\t\t\tconsole.log(\" ā Sandbox resumed\")\n\t\t} catch (err: unknown) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to resume sandbox: ${err instanceof Error ? err.message : String(err)}\\nThe sandbox may have expired (E2B sandboxes have a maximum lifetime).`,\n\t\t\t)\n\t\t}\n\t},\n\n\tasync logs(instanceId: string, follow = true): Promise<void> {\n\t\tconst sandbox = await getSandbox(instanceId)\n\t\tif (!sandbox) {\n\t\t\tthrow new Error(\n\t\t\t\t`Sandbox ${instanceId} not found.\\nRun 'hybrid deploy' again to reconnect.`,\n\t\t\t)\n\t\t}\n\n\t\tif (follow) {\n\t\t\tlet offset = 0\n\t\t\twhile (true) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await sandbox.commands.run(\n\t\t\t\t\t\t\"cat /tmp/agent.log 2>/dev/null || echo 'No logs yet'\",\n\t\t\t\t\t)\n\t\t\t\t\tconst output = result.stdout || \"\"\n\t\t\t\t\tif (output.length > offset) {\n\t\t\t\t\t\tprocess.stdout.write(output.slice(offset))\n\t\t\t\t\t\toffset = output.length\n\t\t\t\t\t}\n\t\t\t\t\tawait new Promise((r) => setTimeout(r, 2000))\n\t\t\t\t} catch {\n\t\t\t\t\tawait new Promise((r) => setTimeout(r, 2000))\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst result = await sandbox.commands.run(\n\t\t\t\t\"cat /tmp/agent.log 2>/dev/null || echo 'No logs yet'\",\n\t\t\t)\n\t\t\tconsole.log(result.stdout || \"No logs yet\")\n\t\t}\n\t},\n\n\tasync endpoint(instanceId: string): Promise<string> {\n\t\tconst sandbox = sandboxes.get(instanceId)\n\t\tif (!sandbox) return `https://${instanceId}-8454.e2b.dev`\n\n\t\ttry {\n\t\t\tconst host = await sandbox.getHost(8454)\n\t\t\treturn `https://${host}`\n\t\t} catch {\n\t\t\treturn `https://${instanceId}-8454.e2b.dev`\n\t\t}\n\t},\n\n\tasync teardown(instanceId: string): Promise<void> {\n\t\tconst Sandbox = await getSDK()\n\n\t\tconsole.log(`\\nšļø Destroying E2B sandbox: ${instanceId}`)\n\t\ttry {\n\t\t\tconst cached = sandboxes.get(instanceId)\n\t\t\tif (cached) {\n\t\t\t\tawait cached.kill()\n\t\t\t} else {\n\t\t\t\tconst sandbox = await Sandbox.connect(instanceId)\n\t\t\t\tawait sandbox.kill()\n\t\t\t}\n\t\t\tsandboxes.delete(instanceId)\n\t\t\tconsole.log(\" ā Sandbox destroyed\")\n\t\t} catch (err: unknown) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to destroy sandbox: ${err instanceof Error ? err.message : String(err)}`,\n\t\t\t)\n\t\t}\n\t},\n}\n","import { execFileSync, spawn } from \"node:child_process\"\nimport { existsSync, unlinkSync } from \"node:fs\"\nimport { tmpdir } from \"node:os\"\nimport { basename, join } from \"node:path\"\nimport type {\n\tDeployProvider,\n\tInstanceStatus,\n\tProvisionOpts\n} from \"../deploy-provider\"\n\n// ============================================================================\n// Northflank Provider\n//\n// Uses the `nf` CLI (or direct API calls) for service management.\n// Northflank deploys Docker containers on Firecracker VMs with\n// auto-scale-to-zero support.\n//\n// Sleep/wake: Scale replicas to 0 (sleep) ā inbound request triggers auto-scale to 1 (wake)\n// Platform manages the cold start automatically.\n// ============================================================================\n\nconst CLI = \"nf\"\n\nfunction runNf(args: string[]): string {\n\treturn execFileSync(CLI, args, {\n\t\tencoding: \"utf-8\",\n\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"]\n\t})\n}\n\nfunction runNfInherit(args: string[]): void {\n\texecFileSync(CLI, args, { stdio: \"inherit\" })\n}\n\nexport const northflankProvider: DeployProvider = {\n\tname: \"northflank\",\n\tlabel: \"Northflank (Firecracker / Auto-scale)\",\n\n\tdefaultName(projectDir: string): string {\n\t\treturn basename(projectDir)\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9-]/g, \"-\")\n\t\t\t.replace(/-+/g, \"-\")\n\t\t\t.replace(/^-+|-+$/g, \"\")\n\t\t\t.slice(0, 40)\n\t},\n\n\tasync authCheck(): Promise<void> {\n\t\ttry {\n\t\t\tconst result = runNf([\"auth\", \"whoami\"])\n\t\t\tif (!result || result.includes(\"not logged in\")) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Not authenticated with Northflank.\\n Run: nf auth login\"\n\t\t\t\t)\n\t\t\t}\n\t\t} catch (err: any) {\n\t\t\tif (err.code === \"ENOENT\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"`nf` CLI not found.\\n Install: https://docs.northflank.com/docs/cli\\n Or: npm install -g @northflank/cli\"\n\t\t\t\t)\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`Northflank CLI error: ${err.stderr || err.message}\\nRun: nf auth login`\n\t\t\t)\n\t\t}\n\t},\n\n\tasync provision(name: string, opts?: ProvisionOpts): Promise<string> {\n\t\t// Northflank provision = create a service via API\n\t\t// We use the CLI to check if a service already exists\n\t\tconst projectId = process.env.NF_PROJECT_ID\n\t\tif (!projectId) {\n\t\t\tthrow new Error(\n\t\t\t\t\"NF_PROJECT_ID not set.\\n Create a project on Northflank and set: export NF_PROJECT_ID=your-project-id\"\n\t\t\t)\n\t\t}\n\n\t\t// Check if service already exists\n\t\ttry {\n\t\t\tconst existing = runNf([\"services\", \"list\", \"--projectId\", projectId])\n\t\t\tif (existing.toLowerCase().includes(name)) {\n\t\t\t\tconsole.log(` ā Service already exists: ${name}`)\n\t\t\t\treturn name\n\t\t\t}\n\t\t} catch {\n\t\t\t// Service doesn't exist, create it\n\t\t}\n\n\t\t// Create the service using the Northflank API\n\t\t// The nf CLI doesn't support create for all service types, so we use the API\n\t\tconst apiUrl = process.env.NF_API_URL || \"https://api.northflank.com\"\n\t\tconst memory = opts?.memory || 512\n\t\tconst cpus = opts?.cpus || 1\n\n\t\tconsole.log(`\\nš¦ Creating Northflank service: ${name}`)\n\t\tconsole.log(` Project: ${projectId}`)\n\t\tconsole.log(` Memory: ${memory}MB, CPUs: ${cpus}`)\n\n\t\t// Build the service spec JSON\n\t\tconst spec = {\n\t\t\tname: name,\n\t\t\tprojectId: projectId,\n\t\t\ttype: \"service\",\n\t\t\timage: {\n\t\t\t\timage: `registry.northflank.com/${projectId}/${name}:latest`\n\t\t\t},\n\t\t\tresources: {\n\t\t\t\tinstances: 1,\n\t\t\t\tcontainerResources: {\n\t\t\t\t\tcpu: {\n\t\t\t\t\t\treq: cpus,\n\t\t\t\t\t\tlimit: cpus\n\t\t\t\t\t},\n\t\t\t\t\tmemory: {\n\t\t\t\t\t\treq: memory,\n\t\t\t\t\t\tlimit: memory\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tports: [\n\t\t\t\t{\n\t\t\t\t\tname: \"default\",\n\t\t\t\t\tprotocol: \"HTTP\",\n\t\t\t\t\tcontainerPort: 8454,\n\t\t\t\t\tingress: {\n\t\t\t\t\t\tautoSubdomain: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\t\t\tautoscaling: {\n\t\t\t\tenabled: true,\n\t\t\t\tminReplicas: 0,\n\t\t\t\tmaxReplicas: 1\n\t\t\t}\n\t\t}\n\n\t\tconst specPath = join(tmpdir(), `nf-spec-${Date.now()}.json`)\n\t\tconst { writeFileSync } = await import(\"node:fs\")\n\t\twriteFileSync(specPath, JSON.stringify(spec, null, 2))\n\n\t\t// Use nf deploy or the API to create the service\n\t\ttry {\n\t\t\trunNfInherit([\"deploy\", \"service\", specPath])\n\t\t} finally {\n\t\t\tif (existsSync(specPath)) {\n\t\t\t\ttry {\n\t\t\t\t\tunlinkSync(specPath)\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(\" ā Service created with auto-scale-to-zero enabled\")\n\t\treturn name\n\t},\n\n\tasync deploy(instanceId: string, distDir: string): Promise<void> {\n\t\tconst projectId = process.env.NF_PROJECT_ID\n\t\tif (!projectId) {\n\t\t\tthrow new Error(\"NF_PROJECT_ID not set.\")\n\t\t}\n\n\t\tconsole.log(\"\\nš¦ Building and pushing Docker image...\")\n\n\t\t// Build Docker image from dist\n\t\tconst imageTag = `registry.northflank.com/${projectId}/${instanceId}:latest`\n\n\t\t// Check if docker is available\n\t\trunNf([\"info\"]) // Just to verify CLI works\n\n\t\t// Build the image\n\t\tconsole.log(\" Building Docker image...\")\n\t\texecFileSync(\"docker\", [\"build\", \"-t\", imageTag, \".\"], {\n\t\t\tcwd: distDir,\n\t\t\tstdio: \"inherit\"\n\t\t})\n\n\t\t// Push the image\n\t\tconsole.log(\" Pushing to Northflank registry...\")\n\t\texecFileSync(\"docker\", [\"push\", imageTag], {\n\t\t\tstdio: \"inherit\"\n\t\t})\n\n\t\t// Deploy/update the service with the new image\n\t\tconsole.log(\"\\nš§ Deploying service...\")\n\t\ttry {\n\t\t\trunNfInherit([\n\t\t\t\t\"services\",\n\t\t\t\t\"set-image\",\n\t\t\t\t\"--projectId\",\n\t\t\t\tprojectId,\n\t\t\t\t\"--serviceId\",\n\t\t\t\tinstanceId,\n\t\t\t\t\"--image\",\n\t\t\t\timageTag\n\t\t\t])\n\t\t} catch (err: any) {\n\t\t\t// Service may already be deploying, ignore\n\t\t\tconsole.log(\" ā ļø Service update initiated\")\n\t\t}\n\n\t\t// Wait for deployment to be ready\n\t\tconsole.log(\"\\nā³ Waiting for deployment to be ready...\")\n\t\tfor (let i = 0; i < 60; i++) {\n\t\t\ttry {\n\t\t\t\tconst status = runNf([\n\t\t\t\t\t\"services\",\n\t\t\t\t\t\"status\",\n\t\t\t\t\t\"--projectId\",\n\t\t\t\t\tprojectId,\n\t\t\t\t\t\"--serviceId\",\n\t\t\t\t\tinstanceId\n\t\t\t\t])\n\t\t\t\tif (\n\t\t\t\t\tstatus.toLowerCase().includes(\"deployed\") ||\n\t\t\t\t\tstatus.toLowerCase().includes(\"running\")\n\t\t\t\t) {\n\t\t\t\t\tconsole.log(\" ā Service deployed\")\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Not ready yet\n\t\t\t}\n\t\t\tif (i % 10 === 9) {\n\t\t\t\tconsole.log(` Still deploying... (${i + 1}/60)`)\n\t\t\t}\n\t\t\tawait new Promise((r) => setTimeout(r, 5000))\n\t\t}\n\n\t\tconsole.log(\" ā ļø Deployment may still be in progress\")\n\t},\n\n\tasync status(instanceId: string): Promise<InstanceStatus> {\n\t\tconst projectId = process.env.NF_PROJECT_ID\n\t\tif (!projectId) return \"unknown\"\n\n\t\ttry {\n\t\t\tconst status = runNf([\n\t\t\t\t\"services\",\n\t\t\t\t\"status\",\n\t\t\t\t\"--projectId\",\n\t\t\t\tprojectId,\n\t\t\t\t\"--serviceId\",\n\t\t\t\tinstanceId\n\t\t\t])\n\n\t\t\tconst lower = status.toLowerCase()\n\t\t\tif (lower.includes(\"deployed\") || lower.includes(\"running\")) {\n\t\t\t\treturn \"running\"\n\t\t\t}\n\t\t\tif (lower.includes(\"stopped\") || lower.includes(\"paused\")) {\n\t\t\t\treturn \"sleeping\"\n\t\t\t}\n\t\t\tif (lower.includes(\"deploying\")) {\n\t\t\t\treturn \"provisioning\"\n\t\t\t}\n\t\t\treturn \"unknown\"\n\t\t} catch {\n\t\t\treturn \"stopped\"\n\t\t}\n\t},\n\n\tasync sleep(instanceId: string): Promise<void> {\n\t\tconst projectId = process.env.NF_PROJECT_ID\n\t\tif (!projectId) {\n\t\t\tthrow new Error(\"NF_PROJECT_ID not set.\")\n\t\t}\n\n\t\tconsole.log(`\\nš¤ Scaling Northflank service to 0: ${instanceId}`)\n\t\ttry {\n\t\t\trunNfInherit([\n\t\t\t\t\"services\",\n\t\t\t\t\"scale\",\n\t\t\t\t\"--projectId\",\n\t\t\t\tprojectId,\n\t\t\t\t\"--serviceId\",\n\t\t\t\tinstanceId,\n\t\t\t\t\"--replicas\",\n\t\t\t\t\"0\"\n\t\t\t])\n\t\t\tconsole.log(\" ā Service scaled to 0 (sleeping)\")\n\t\t} catch (err: any) {\n\t\t\tthrow new Error(`Failed to scale down: ${err.stderr || err.message}`)\n\t\t}\n\t},\n\n\tasync wake(instanceId: string): Promise<void> {\n\t\tconst projectId = process.env.NF_PROJECT_ID\n\t\tif (!projectId) {\n\t\t\tthrow new Error(\"NF_PROJECT_ID not set.\")\n\t\t}\n\n\t\tconsole.log(`\\nāļø Scaling Northflank service to 1: ${instanceId}`)\n\t\ttry {\n\t\t\trunNfInherit([\n\t\t\t\t\"services\",\n\t\t\t\t\"scale\",\n\t\t\t\t\"--projectId\",\n\t\t\t\tprojectId,\n\t\t\t\t\"--serviceId\",\n\t\t\t\tinstanceId,\n\t\t\t\t\"--replicas\",\n\t\t\t\t\"1\"\n\t\t\t])\n\t\t\tconsole.log(\" ā Service scaling up (may take 30-60s)\")\n\t\t} catch (err: any) {\n\t\t\tthrow new Error(`Failed to scale up: ${err.stderr || err.message}`)\n\t\t}\n\t},\n\n\tasync logs(instanceId: string, follow = true): Promise<void> {\n\t\tconst projectId = process.env.NF_PROJECT_ID\n\t\tif (!projectId) {\n\t\t\tthrow new Error(\"NF_PROJECT_ID not set.\")\n\t\t}\n\n\t\tconst args = [\n\t\t\t\"services\",\n\t\t\t\"logs\",\n\t\t\t\"--projectId\",\n\t\t\tprojectId,\n\t\t\t\"--serviceId\",\n\t\t\tinstanceId\n\t\t]\n\t\tif (follow) args.push(\"--follow\")\n\n\t\tconst child = spawn(CLI, args, { stdio: \"inherit\" })\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tchild.on(\"exit\", (code) => {\n\t\t\t\tif (code === 0) resolve()\n\t\t\t\telse reject(new Error(`nf logs exited with code ${code}`))\n\t\t\t})\n\t\t})\n\t},\n\n\tasync endpoint(instanceId: string): Promise<string> {\n\t\tconst projectId = process.env.NF_PROJECT_ID\n\t\tif (!projectId) return `https://${instanceId}.northflank.app`\n\n\t\ttry {\n\t\t\t// Try to get the actual URL from the service info\n\t\t\tconst info = runNf([\n\t\t\t\t\"services\",\n\t\t\t\t\"info\",\n\t\t\t\t\"--projectId\",\n\t\t\t\tprojectId,\n\t\t\t\t\"--serviceId\",\n\t\t\t\tinstanceId\n\t\t\t])\n\t\t\t// Parse URL from service info\n\t\t\tconst match = info.match(/https?:\\/\\/[^\\s]+/i)\n\t\t\tif (match) return match[0]\n\t\t} catch {\n\t\t\t// Fallback to predicted URL\n\t\t}\n\n\t\treturn `https://${instanceId}.${projectId}.northflank.app`\n\t},\n\n\tasync teardown(instanceId: string): Promise<void> {\n\t\tconst projectId = process.env.NF_PROJECT_ID\n\t\tif (!projectId) {\n\t\t\tthrow new Error(\"NF_PROJECT_ID not set.\")\n\t\t}\n\n\t\tconsole.log(`\\nšļø Destroying Northflank service: ${instanceId}`)\n\t\ttry {\n\t\t\trunNfInherit([\n\t\t\t\t\"services\",\n\t\t\t\t\"delete\",\n\t\t\t\t\"--projectId\",\n\t\t\t\tprojectId,\n\t\t\t\t\"--serviceId\",\n\t\t\t\tinstanceId,\n\t\t\t\t\"--permanent\"\n\t\t\t])\n\t\t\tconsole.log(\" ā Service destroyed\")\n\t\t} catch (err: any) {\n\t\t\tthrow new Error(`Failed to destroy service: ${err.stderr || err.message}`)\n\t\t}\n\t}\n}\n","import { execFileSync, spawn } from \"node:child_process\"\nimport { existsSync, unlinkSync } from \"node:fs\"\nimport { tmpdir } from \"node:os\"\nimport { basename, join } from \"node:path\"\nimport type {\n\tDeployProvider,\n\tInstanceStatus,\n\tProvisionOpts\n} from \"../deploy-provider\"\n\n// ============================================================================\n// Daytona Provider\n//\n// Uses the `daytona` CLI for workspace management.\n// Daytona creates Firecracker-based dev workspaces on local or cloud providers.\n//\n// Sleep/wake: `daytona stop` / `daytona start` ā full stop/start cycle (~30s wake)\n// This is the slowest wake time of all providers.\n// ============================================================================\n\nconst CLI = \"daytona\"\n\nfunction runDaytona(args: string[]): string {\n\treturn execFileSync(CLI, args, {\n\t\tencoding: \"utf-8\",\n\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"]\n\t})\n}\n\nfunction runDaytonaInherit(args: string[]): void {\n\texecFileSync(CLI, args, { stdio: \"inherit\" })\n}\n\nexport const daytonaProvider: DeployProvider = {\n\tname: \"daytona\",\n\tlabel: \"Daytona.io (Firecracker / Dev Workspace)\",\n\n\tdefaultName(projectDir: string): string {\n\t\treturn basename(projectDir)\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9-]/g, \"-\")\n\t\t\t.replace(/-+/g, \"-\")\n\t\t\t.replace(/^-+|-+$/g, \"\")\n\t\t\t.slice(0, 40)\n\t},\n\n\tasync authCheck(): Promise<void> {\n\t\ttry {\n\t\t\trunDaytona([\"info\"])\n\t\t} catch (err: any) {\n\t\t\tif (err.code === \"ENOENT\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"`daytona` CLI not found.\\n \" +\n\t\t\t\t\t\t\"Install: https://www.daytona.io/docs/getting-started/installation/\\n \" +\n\t\t\t\t\t\t\"Or: curl -NF https://download.daytona.io/daytona/install.sh | sh\"\n\t\t\t\t)\n\t\t\t}\n\t\t\tthrow new Error(`Daytona CLI error: ${err.stderr || err.message}`)\n\t\t}\n\t},\n\n\tasync provision(name: string, opts?: ProvisionOpts): Promise<string> {\n\t\t// Check if workspace already exists\n\t\ttry {\n\t\t\tconst existing = runDaytona([\"list\"])\n\t\t\t// Parse daytona list output to find matching workspace\n\t\t\tconst lines = existing.split(\"\\n\")\n\t\t\tconst found = lines.find((l) => l.includes(name))\n\t\t\tif (found) {\n\t\t\t\tconsole.log(` ā ļø Workspace already exists: ${name}`)\n\t\t\t\treturn name\n\t\t\t}\n\t\t} catch {\n\t\t\t// No workspaces listed, create new\n\t\t}\n\n\t\tconsole.log(`\\nš¦ Creating Daytona workspace: ${name}`)\n\n\t\t// Create workspace with Node.js image\n\t\tconst image = opts?.memory ? \"node:20\" : \"node:20\"\n\t\tconst args = [\"create\", \"--name\", name, \"--image\", image]\n\n\t\t// Add provider flag if specified\n\t\tconst provider = process.env.DAYTONA_PROVIDER\n\t\tif (provider) {\n\t\t\targs.push(\"--provider\", provider)\n\t\t}\n\n\t\trunDaytonaInherit(args)\n\t\tconsole.log(\" ā Workspace created\")\n\t\treturn name\n\t},\n\n\tasync deploy(instanceId: string, distDir: string): Promise<void> {\n\t\tconsole.log(\"\\nš¤ Uploading build artifacts...\")\n\n\t\tconst tarPath = join(tmpdir(), `hybrid-daytona-${Date.now()}.tar.gz`)\n\t\texecFileSync(\"tar\", [\"-czf\", tarPath, \"-C\", distDir, \".\"], {\n\t\t\tstdio: \"pipe\"\n\t\t})\n\n\t\t// Create app directory\n\t\trunDaytonaInherit([\n\t\t\t\"code\",\n\t\t\tinstanceId,\n\t\t\t\"--command\",\n\t\t\t\"mkdir -p /workspace/app\"\n\t\t])\n\n\t\t// Upload tarball using daytona cp (if available) or code command\n\t\ttry {\n\t\t\trunDaytonaInherit([\n\t\t\t\t\"cp\",\n\t\t\t\ttarPath,\n\t\t\t\t`${instanceId}:/workspace/app/hybrid-deploy.tar.gz`\n\t\t\t])\n\t\t} catch {\n\t\t\tthrow new Error(\n\t\t\t\t`daytona cp failed for instance ${instanceId}.\\n` +\n\t\t\t\t\t`Ensure the Daytona CLI supports file copy: daytona cp ${tarPath} ${instanceId}:/workspace/app/hybrid-deploy.tar.gz`\n\t\t\t)\n\t\t}\n\n\t\t// Extract and install deps\n\t\trunDaytonaInherit([\n\t\t\t\"code\",\n\t\t\tinstanceId,\n\t\t\t\"--command\",\n\t\t\t\"cd /workspace/app && tar -xzf hybrid-deploy.tar.gz && npm install --production\"\n\t\t])\n\n\t\t// Clean up tarball\n\t\tif (existsSync(tarPath)) {\n\t\t\ttry {\n\t\t\t\tunlinkSync(tarPath)\n\t\t\t} catch {}\n\t\t}\n\n\t\t// Start the agent\n\t\tconsole.log(\"\\nš§ Starting agent...\")\n\t\trunDaytonaInherit([\n\t\t\t\"code\",\n\t\t\tinstanceId,\n\t\t\t\"--command\",\n\t\t\t\"cd /workspace/app && export NODE_ENV=production AGENT_PORT=8454 && nohup node server/index.cjs > /workspace/app/agent.log 2>&1 &\"\n\t\t])\n\n\t\t// Wait for health check\n\t\tconsole.log(\"\\nā³ Waiting for agent to start...\")\n\t\tlet ready = false\n\t\tfor (let i = 0; i < 15; i++) {\n\t\t\ttry {\n\t\t\t\tconst result = runDaytona([\n\t\t\t\t\t\"code\",\n\t\t\t\t\tinstanceId,\n\t\t\t\t\t\"--command\",\n\t\t\t\t\t\"curl -sf http://localhost:8454/health || echo not-ready\"\n\t\t\t\t])\n\t\t\t\tif (result && !result.includes(\"not-ready\")) {\n\t\t\t\t\tready = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Agent not ready yet\n\t\t\t}\n\t\t\tawait new Promise((r) => setTimeout(r, 2000))\n\t\t}\n\n\t\tif (!ready) {\n\t\t\tconsole.log(\" ā ļø Agent health check timed out\")\n\t\t} else {\n\t\t\tconsole.log(\" ā Agent running\")\n\t\t}\n\t},\n\n\tasync status(instanceId: string): Promise<InstanceStatus> {\n\t\ttry {\n\t\t\tconst list = runDaytona([\"list\"])\n\t\t\tconst lines = list.split(\"\\n\")\n\t\t\tconst found = lines.find((l) => l.includes(instanceId))\n\t\t\tif (!found) return \"stopped\"\n\n\t\t\tconst lower = found.toLowerCase()\n\t\t\tif (lower.includes(\"started\") || lower.includes(\"running\")) {\n\t\t\t\treturn \"running\"\n\t\t\t}\n\t\t\tif (lower.includes(\"stopped\")) {\n\t\t\t\treturn \"stopped\"\n\t\t\t}\n\t\t\treturn \"unknown\"\n\t\t} catch {\n\t\t\treturn \"unknown\"\n\t\t}\n\t},\n\n\tasync sleep(instanceId: string): Promise<void> {\n\t\tconsole.log(`\\nš¤ Stopping Daytona workspace: ${instanceId}`)\n\t\ttry {\n\t\t\trunDaytonaInherit([\"stop\", instanceId])\n\t\t\tconsole.log(\" ā Workspace stopped\")\n\t\t} catch (err: any) {\n\t\t\tthrow new Error(`Failed to stop workspace: ${err.stderr || err.message}`)\n\t\t}\n\t},\n\n\tasync wake(instanceId: string): Promise<void> {\n\t\tconsole.log(`\\nāļø Starting Daytona workspace: ${instanceId}`)\n\t\ttry {\n\t\t\trunDaytonaInherit([\"start\", instanceId])\n\t\t\tconsole.log(\" ā Workspace starting (~30s)\")\n\t\t} catch (err: any) {\n\t\t\tthrow new Error(`Failed to start workspace: ${err.stderr || err.message}`)\n\t\t}\n\t},\n\n\tasync logs(instanceId: string, follow = true): Promise<void> {\n\t\tconst args = follow\n\t\t\t? [\"code\", instanceId, \"--command\", \"tail -f /workspace/app/agent.log\"]\n\t\t\t: [\"code\", instanceId, \"--command\", \"cat /workspace/app/agent.log\"]\n\n\t\tconst child = spawn(CLI, args, { stdio: \"inherit\" })\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tchild.on(\"exit\", (code) => {\n\t\t\t\tif (code === 0) resolve()\n\t\t\t\telse reject(new Error(`daytona exited with code ${code}`))\n\t\t\t})\n\t\t})\n\t},\n\n\tasync endpoint(instanceId: string): Promise<string> {\n\t\t// Daytona workspaces don't have public endpoints by default\n\t\t// Would need to configure port forwarding\n\t\treturn `daytona://${instanceId}`\n\t},\n\n\tasync teardown(instanceId: string): Promise<void> {\n\t\tconsole.log(`\\nšļø Destroying Daytona workspace: ${instanceId}`)\n\t\ttry {\n\t\t\trunDaytonaInherit([\"remove\", instanceId])\n\t\t\tconsole.log(\" ā Workspace destroyed\")\n\t\t} catch (err: any) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to destroy workspace: ${err.stderr || err.message}`\n\t\t\t)\n\t\t}\n\t}\n}\n","import type { DeployProvider, ProviderName } from \"./deploy-provider\"\n\ntype ProviderEntry = DeployProvider | (() => Promise<DeployProvider>)\n\nconst providers: Record<ProviderName, ProviderEntry | undefined> = {\n\tsprites: () =>\n\t\timport(\"./providers/sprite.provider\").then((m) => m.spriteProvider),\n\te2b: () => import(\"./providers/e2b.provider\").then((m) => m.e2bProvider),\n\tnorthflank: () =>\n\t\timport(\"./providers/northflank.provider\").then((m) => m.northflankProvider),\n\tdaytona: () =>\n\t\timport(\"./providers/daytona.provider\").then((m) => m.daytonaProvider)\n}\n\nexport async function getProvider(name: ProviderName): Promise<DeployProvider> {\n\tconst entry = providers[name]\n\tif (!entry) {\n\t\tthrow new Error(\n\t\t\t`Provider \"${name}\" is not yet implemented.\\nAvailable providers: sprites, e2b, northflank, daytona`\n\t\t)\n\t}\n\tif (typeof entry === \"function\") {\n\t\treturn entry()\n\t}\n\treturn entry as DeployProvider\n}\n\nexport function getAvailableProviders(): ProviderName[] {\n\treturn (Object.keys(providers) as ProviderName[]).filter(\n\t\t(n) => providers[n] != null\n\t)\n}\n","import {\n\tcpSync,\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\trmSync,\n\twriteFileSync\n} from \"node:fs\"\nimport { resolve } from \"node:path\"\nimport type { ProviderName } from \"./deploy-provider\"\nimport { getProvider } from \"./index\"\n\n// ============================================================================\n// Unified Deploy Orchestration\n// ============================================================================\n\nexport interface DeployOptions {\n\t/** Platform/provider name (sprites, e2b, northflank, daytona) */\n\tplatform?: string\n\t/** Instance name (VM name) */\n\tname?: string\n\t/** Skip build step */\n\tskipBuild?: boolean\n\t/** Force recreate instance even if it exists */\n\tforce?: boolean\n}\n\nexport async function runDeploy(\n\toptions: DeployOptions,\n\tprojectRoot: string,\n\tpackageDir: string\n) {\n\t// 1. Resolve platform\n\tconst platform = resolvePlatform(options.platform, projectRoot)\n\n\t// 2. Load provider\n\tconst provider = await getProvider(platform as ProviderName)\n\tconsole.log(`\\nš Deploying to ${provider.label}...`)\n\n\t// 3. Auth check\n\ttry {\n\t\tawait provider.authCheck()\n\t} catch (err: any) {\n\t\tconsole.error(`\\nā ${err.message}`)\n\t\tprocess.exit(1)\n\t}\n\n\t// 4. Build\n\tif (!options.skipBuild) {\n\t\tawait runBuild(projectRoot, packageDir)\n\t}\n\n\t// 5. Determine instance name\n\tconst distDir = resolve(projectRoot, \"dist\")\n\tconst instanceName = options.name || provider.defaultName(projectRoot)\n\n\t// 6. Provision or reuse based on current status\n\tconsole.log(`\\nš Instance: ${instanceName}`)\n\tconst existingStatus = await provider.status(instanceName)\n\n\tif (options.force) {\n\t\tif (existingStatus === \"running\" || existingStatus === \"sleeping\") {\n\t\t\tawait provider.teardown(instanceName)\n\t\t}\n\t\tawait provider.provision(instanceName)\n\t} else if (existingStatus === \"sleeping\") {\n\t\tconsole.log(` āļø Waking sleeping instance...`)\n\t\tawait provider.wake(instanceName)\n\t} else if (existingStatus === \"running\") {\n\t\tconsole.log(` ā ļø Instance \"${instanceName}\" is already running.`)\n\t\tconst prompts = (await import(\"prompts\")).default\n\t\tconst choice = await prompts({\n\t\t\ttype: \"select\",\n\t\t\tname: \"action\",\n\t\t\tmessage: \"What do you want to do?\",\n\t\t\tchoices: [\n\t\t\t\t{ title: \"Redeploy (overwrite artifacts)\", value: \"redeploy\" },\n\t\t\t\t{ title: \"Force recreate VM\", value: \"force\" },\n\t\t\t\t{ title: \"Cancel\", value: \"cancel\" },\n\t\t\t],\n\t\t})\n\t\tif (choice.action === \"cancel\") {\n\t\t\tconsole.log(\"\\n Cancelled.\\n\")\n\t\t\tprocess.exit(0)\n\t\t}\n\t\tif (choice.action === \"force\") {\n\t\t\tawait provider.teardown(instanceName)\n\t\t\tawait provider.provision(instanceName)\n\t\t}\n\t\t// redeploy: use existing instance, just push new artifacts\n\t} else if (existingStatus === \"unknown\" || existingStatus === \"stopped\") {\n\t\tawait provider.provision(instanceName)\n\t} else if (existingStatus === \"provisioning\") {\n\t\tconsole.error(` ā³ Instance still provisioning, try again shortly.`)\n\t\tprocess.exit(1)\n\t} else if (existingStatus === \"error\") {\n\t\tconsole.error(` ā Instance in error state. Run 'hybrid deploy teardown ${instanceName}' then retry.`)\n\t\tprocess.exit(1)\n\t}\n\n\t// 7. Deploy artifacts\n\tawait provider.deploy(instanceName, distDir)\n\n\t// 8. Print results\n\tconst endpoint = await provider.endpoint(instanceName)\n\tconsole.log(`\\n Instance: ${instanceName}`)\n\tconsole.log(` URL: ${endpoint}`)\n\tconsole.log(` Health: ${endpoint}/health`)\n\tconsole.log(` Chat: ${endpoint}/api/chat`)\n\tconsole.log(\"\\nā
Deployed!\")\n}\n\nexport async function runSleep(\n\tname: string,\n\tplatform: string | undefined,\n\tprojectRoot: string\n) {\n\tconst provider = await getProvider(\n\t\tresolvePlatform(platform, projectRoot) as ProviderName\n\t)\n\tawait provider.authCheck()\n\tawait provider.sleep(name)\n}\n\nexport async function runWake(\n\tname: string,\n\tplatform: string | undefined,\n\tprojectRoot: string\n) {\n\tconst provider = await getProvider(\n\t\tresolvePlatform(platform, projectRoot) as ProviderName\n\t)\n\tawait provider.authCheck()\n\tawait provider.wake(name)\n}\n\nexport async function runStatus(\n\tname: string,\n\tplatform: string | undefined,\n\tprojectRoot: string\n) {\n\tconst provider = await getProvider(\n\t\tresolvePlatform(platform, projectRoot) as ProviderName\n\t)\n\tawait provider.authCheck()\n\tconst status = await provider.status(name)\n\tconst endpoint = await provider.endpoint(name)\n\tconsole.log(`\\nš Instance: ${name}`)\n\tconsole.log(` Status: ${status}`)\n\tconsole.log(` URL: ${endpoint}`)\n}\n\nexport async function runLogs(\n\tname: string,\n\tfollow: boolean,\n\tplatform: string | undefined,\n\tprojectRoot: string\n) {\n\tconst provider = await getProvider(\n\t\tresolvePlatform(platform, projectRoot) as ProviderName\n\t)\n\tawait provider.authCheck()\n\tawait provider.logs(name, follow)\n}\n\nexport async function runTeardown(\n\tname: string,\n\tplatform: string | undefined,\n\tprojectRoot: string\n) {\n\tconst provider = await getProvider(\n\t\tresolvePlatform(platform, projectRoot) as ProviderName\n\t)\n\tawait provider.authCheck()\n\tawait provider.teardown(name)\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction resolvePlatform(\n\tplatform?: string,\n\tprojectRoot?: string\n): ProviderName {\n\tif (platform) return platform as ProviderName\n\n\t// Check hybrid.config.ts\n\tif (projectRoot) {\n\t\tconst configPath = resolve(projectRoot, \"hybrid.config.ts\")\n\t\tif (existsSync(configPath)) {\n\t\t\tconst content = readFileSync(configPath, \"utf-8\")\n\t\t\tconst match = content.match(\n\t\t\t\t/(?:platform|deployPlatform)\\s*[=:]\\s*[\"']([^\"']+)[\"']/\n\t\t\t)\n\t\t\tif (match) return match[1] as ProviderName\n\t\t}\n\t}\n\n\t// Default to sprites (only implemented provider right now)\n\treturn \"sprites\"\n}\n\n// ============================================================================\n// Build (extracted subset for deploy use)\n// ============================================================================\n\nasync function runBuild(projectRoot: string, packageDir: string) {\n\tconst distDir = resolve(projectRoot, \"dist\")\n\n\tconsole.log(\"\\nš§ Building agent...\")\n\n\tif (existsSync(distDir)) {\n\t\trmSync(distDir, { recursive: true, force: true })\n\t}\n\tmkdirSync(distDir, { recursive: true })\n\tmkdirSync(resolve(distDir, \"server\"), { recursive: true })\n\n\tconsole.log(\"š¦ Copying agent runtime...\")\n\tconst agentDistDir = resolve(packageDir, \"dist\")\n\tconst files = [\"server/index.cjs\"]\n\tfor (const file of files) {\n\t\tconst src = resolve(agentDistDir, file)\n\t\tif (existsSync(src)) {\n\t\t\tcpSync(src, resolve(distDir, file))\n\t\t}\n\t}\n\n\tconsole.log(\"š Copying agent config...\")\n\tconst configFiles = [\n\t\t\"SOUL.md\",\n\t\t\"AGENTS.md\",\n\t\t\"IDENTITY.md\",\n\t\t\"TOOLS.md\",\n\t\t\"BOOT.md\",\n\t\t\"BOOTSTRAP.md\",\n\t\t\"HEARTBEAT.md\",\n\t\t\"USER.md\"\n\t]\n\tfor (const file of configFiles) {\n\t\tconst src = resolve(projectRoot, file)\n\t\tif (existsSync(src)) {\n\t\t\tcpSync(src, resolve(distDir, file))\n\t\t}\n\t}\n\n\t// Copy credentials\n\tconst credsDir = resolve(projectRoot, \"credentials\")\n\tif (existsSync(credsDir)) {\n\t\tcpSync(credsDir, resolve(distDir, \"credentials\"), { recursive: true })\n\t}\n\n\t// package.json\n\tconst deployPkg = {\n\t\tname: \"hybrid\",\n\t\tversion: \"1.0.0\",\n\t\ttype: \"module\",\n\t\tdependencies: {\n\t\t\t\"@anthropic-ai/claude-agent-sdk\": \"^0.2.38\",\n\t\t\t\"@hono/node-server\": \"^1.13.5\",\n\t\t\tai: \"^6.0.0\",\n\t\t\t\"better-sqlite3\": \"^11.0.0\",\n\t\t\tdotenv: \"^16.4.5\",\n\t\t\thono: \"^4.10.8\",\n\t\t\t\"sql.js\": \"^1.11.0\",\n\t\t\tzod: \"^4.0.0\"\n\t\t}\n\t}\n\twriteFileSync(\n\t\tresolve(distDir, \"package.json\"),\n\t\tJSON.stringify(deployPkg, null, 2)\n\t)\n\n\t// Generate Dockerfile ā only COPY files that exist in dist\n\tconst present = configFiles.filter((f) =>\n\t\texistsSync(resolve(distDir, f)),\n\t)\n\tconst hasCredentials = existsSync(resolve(distDir, \"credentials\"))\n\tconst configCopy =\n\t\tpresent.length > 0 ? `COPY ${present.join(\" \")} ./` : \"\"\n\tconst credCopy = hasCredentials\n\t\t? \"COPY credentials/ ./credentials/\"\n\t\t: \"COPY .hybrid-deploy.json ./\"\n\n\twriteFileSync(\n\t\tresolve(distDir, \"Dockerfile\"),\n\t\t`FROM node:20-bookworm-slim\nWORKDIR /app\nCOPY package.json ./\nRUN npm install --production\nCOPY server/ ./server/\nCOPY ${configCopy} ./\n${credCopy}\nENV AGENT_PORT=8454\nENV NODE_ENV=production\nENV DATA_ROOT=/app/data\nEXPOSE 8454\nUSER node\nCMD [\"node\", \"server/index.cjs\"]\n`\n\t)\n\n\t// start.sh\n\twriteFileSync(\n\t\tresolve(distDir, \"start.sh\"),\n\t\t`#!/bin/sh\\nnode server/index.cjs\\n`\n\t)\n\n\t// .hybrid-deploy.json manifest\n\twriteFileSync(\n\t\tresolve(distDir, \".hybrid-deploy.json\"),\n\t\tJSON.stringify(\n\t\t\t{\n\t\t\t\tversion: 1,\n\t\t\t\tprovider: \"firecracker\",\n\t\t\t\tstartCommand: \"node server/index.cjs\",\n\t\t\t\tport: 8454,\n\t\t\t\thealthPath: \"/health\"\n\t\t\t},\n\t\t\tnull,\n\t\t\t2\n\t\t)\n\t)\n\n\tconsole.log(\"\\nā
Build complete!\")\n\tconsole.log(` Output: ${distDir}`)\n}\n","#!/usr/bin/env node\n\nimport { existsSync } from \"node:fs\"\nimport { dirname, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { config } from \"dotenv\"\n\nfunction findProjectRoot(startDir: string): string {\n\tconst markers = [\"package.json\", \"hybrid.config.ts\", \"SOUL.md\"]\n\tlet current = startDir\n\twhile (current !== \"/\") {\n\t\tfor (const marker of markers) {\n\t\t\tif (existsSync(resolve(current, marker))) {\n\t\t\t\treturn current\n\t\t\t}\n\t\t}\n\t\tconst parent = resolve(current, \"..\")\n\t\tif (parent === current) break\n\t\tcurrent = parent\n\t}\n\treturn startDir\n}\n\nconst cwdIndex = process.argv.findIndex((a) => a === \"--cwd\")\nif (cwdIndex !== -1 && process.argv[cwdIndex + 1]) {\n\tprocess.chdir(process.argv[cwdIndex + 1])\n\tprocess.argv.splice(cwdIndex, 2)\n}\n\nconst projectRoot = findProjectRoot(process.cwd())\n\nfor (const envFile of [\".env\", \".env.local\"]) {\n\tconst path = resolve(projectRoot, envFile)\n\tif (existsSync(path)) {\n\t\tconfig({ path })\n\t}\n}\n\n// Node version check\nconst [major] = process.versions.node.split(\".\").map(Number)\nif (!major || major < 20) {\n\tconsole.error(\"Error: Node.js version 20 or higher is required\")\n\tprocess.exit(1)\n}\n\n// Get package directory (where bundled files live)\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst packageDir = resolve(__dirname, \"..\")\n\nasync function main() {\n\tconst args = process.argv.slice(2)\n\tconst command = args[0]\n\n\tif (command === \"build\") {\n\t\tconst targetFlag = args.indexOf(\"--target\")\n\t\treturn build(targetFlag !== -1 ? args[targetFlag + 1] : args[1])\n\t}\n\tif (command === \"dev\") return dev(args.includes(\"--docker\"))\n\tif (command === \"start\") return start()\n\tif (command === \"deploy\") return deployCommand(args)\n\tif (command === \"init\") return init(args[1])\n\n\tif (command === \"owner\") {\n\t\tconst subcommand = args[1]\n\t\tif (subcommand === \"add\") return ownerAdd(args[2])\n\t\tif (subcommand === \"remove\" || subcommand === \"rm\")\n\t\t\treturn ownerRemove(args[2])\n\t\tif (subcommand === \"list\" || subcommand === \"ls\") return ownerList()\n\t\tconsole.log(\"\\nUsage: hybrid owner <command>\")\n\t\tconsole.log(\"\\nCommands:\")\n\t\tconsole.log(\" owner add <address> Add an owner\")\n\t\tconsole.log(\" owner remove <address> Remove an owner\")\n\t\tconsole.log(\" owner list List all owners\")\n\t\tprocess.exit(1)\n\t}\n\n\tif (command === \"skills\") {\n\t\tconst subcommand = args[1]\n\t\tif (subcommand === \"add\") {\n\t\t\tconst isGlobal = args.includes(\"-g\") || args.includes(\"--global\")\n\t\t\tconst source = args.find((a, i) => i > 1 && !a.startsWith(\"-\"))\n\t\t\treturn skillsAdd(source, isGlobal)\n\t\t}\n\t\tif (subcommand === \"remove\" || subcommand === \"rm\") {\n\t\t\tconst isGlobal = args.includes(\"-g\") || args.includes(\"--global\")\n\t\t\tconst name = args.find((a, i) => i > 1 && !a.startsWith(\"-\"))\n\t\t\treturn skillsRemove(name, isGlobal)\n\t\t}\n\t\tif (subcommand === \"list\" || subcommand === \"ls\" || !subcommand) {\n\t\t\treturn skillsList()\n\t\t}\n\t\tconsole.error(`Unknown skills subcommand: ${subcommand}`)\n\t\tconsole.error(\"Usage: hybrid skills add|remove|list\")\n\t\tprocess.exit(1)\n\t}\n\n\tif (command === \"clawhub\" || command === \"ch\") {\n\t\tconst subcommand = args[1]\n\t\tconst passThroughArgs = args.slice(2).join(\" \")\n\t\tif (subcommand === \"install\") return clawhubInstall(passThroughArgs)\n\t\tif (subcommand === \"search\") return clawhubSearch(passThroughArgs)\n\t\tif (subcommand === \"publish\") return clawhubPublish(passThroughArgs)\n\t\tif (subcommand === \"update\") return clawhubUpdate(passThroughArgs)\n\t\tif (subcommand === \"list\") return clawhubList()\n\t\tif (subcommand === \"login\") return clawhubLogin()\n\t\tif (subcommand === \"logout\") return clawhubLogout()\n\t\tif (subcommand === \"whoami\") return clawhubWhoami()\n\t\tconsole.log(\"\\nUsage: hybrid clawhub <command>\")\n\t\tconsole.log(\"\\nCommands:\")\n\t\tconsole.log(\" install <slug> Install a skill from ClawHub\")\n\t\tconsole.log(\" search <query> Search for skills\")\n\t\tconsole.log(\" publish <path> Publish a skill\")\n\t\tconsole.log(\" update [slug] Update installed skills\")\n\t\tconsole.log(\" list List installed skills\")\n\t\tconsole.log(\" login Authenticate with ClawHub\")\n\t\tconsole.log(\" logout Remove stored credentials\")\n\t\tconsole.log(\" whoami Check authentication status\")\n\t\tprocess.exit(1)\n\t}\n\n\t// Show help\n\tconsole.log(\"Usage: hybrid <command>\")\n\tconsole.log(\"\")\n\tconsole.log(\"Commands:\")\n\tconsole.log(\" init <name> Initialize a new agent\")\n\tconsole.log(\" dev Start development server\")\n\tconsole.log(\" build [--target] Build for deployment (firecracker)\")\n\tconsole.log(\" start Run built agent\")\n\tconsole.log(\n\t\t\" deploy [platform] Deploy to a Firecracker provider\"\n\t)\n\tconsole.log(\" deploy sleep <name> Put VM to sleep\")\n\tconsole.log(\" deploy wake <name> Wake VM\")\n\tconsole.log(\" deploy status <name> Show VM status\")\n\tconsole.log(\" deploy logs <name> Stream agent logs\")\n\tconsole.log(\" deploy teardown <name> [--all] Destroy VM\")\n\tconsole.log(\"\")\n\tconsole.log(\"Deploy flags:\")\n\tconsole.log(\" --provider <name> Override provider (sprites, e2b, northflank, daytona)\")\n\tconsole.log(\" --name <name> Override instance name\")\n\tconsole.log(\" --force Recreate VM even if it exists\")\n\tconsole.log(\" --no-build Skip build step\")\n\tconsole.log(\"\")\n\tconsole.log(\"Owner:\")\n\tconsole.log(\" owner add <address> Add an owner\")\n\tconsole.log(\" owner remove <address> Remove an owner\")\n\tconsole.log(\" owner list List all owners\")\n\tconsole.log(\"\")\n\tconsole.log(\"Skills:\")\n\tconsole.log(\" skills add <source> [-g] Install a skill\")\n\tconsole.log(\" skills remove <name> [-g] Remove a skill\")\n\tconsole.log(\" skills list List installed skills\")\n\tconsole.log(\"\")\n\tconsole.log(\" Uses npx skills --agent openclaw under the hood\")\n\tconsole.log(\" -g, --global Install to ~/.openclaw/skills/\")\n\tconsole.log(\"\")\n\tconsole.log(\"Sources:\")\n\tconsole.log(\" owner/repo GitHub shorthand\")\n\tconsole.log(\" owner/repo/skill GitHub skill path\")\n\tconsole.log(\" @scope/package npm package\")\n\tconsole.log(\" ./local-path Local directory\")\n\tconsole.log(\"\")\n\tconsole.log(\"ClawHub:\")\n\tconsole.log(\" clawhub install <slug> Install from ClawHub registry\")\n\tconsole.log(\" clawhub search <query> Search ClawHub skills\")\n\tconsole.log(\" clawhub publish <path> Publish a skill\")\n\tconsole.log(\" clawhub update [slug] Update installed skills\")\n\tconsole.log(\" clawhub list List ClawHub skills\")\n\tconsole.log(\" clawhub login Authenticate with ClawHub\")\n\tconsole.log(\"\")\n\n\tif (command) process.exit(1)\n}\n\n// ============================================================================\n// Skills - Thin wrapper around npx skills --agent openclaw\n// ============================================================================\n\nasync function skillsAdd(source?: string, isGlobal = false) {\n\tif (!source) {\n\t\tconsole.error(\"Error: Skill source required\")\n\t\tconsole.error(\"Usage: hybrid skills add <source>\")\n\t\tconsole.error(\" hybrid skills add <source> -g # Global install\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst { execSync } = await import(\"node:child_process\")\n\tconst cmdArgs = [\"skills\", \"add\", source, \"-a\", \"openclaw\", \"-y\"]\n\tif (isGlobal) cmdArgs.push(\"-g\")\n\n\tconsole.log(\n\t\t`\\nš„ Installing skill: ${source}${isGlobal ? \" (global)\" : \"\"}\\n`\n\t)\n\texecSync(`npx ${cmdArgs.join(\" \")}`, { stdio: \"inherit\" })\n}\n\nasync function skillsRemove(name?: string, isGlobal = false) {\n\tif (!name) {\n\t\tconsole.error(\"Error: Skill name required\")\n\t\tconsole.error(\"Usage: hybrid skills remove <skill-name>\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst { execSync } = await import(\"node:child_process\")\n\tconst cmdArgs = [\"skills\", \"remove\", name, \"-a\", \"openclaw\", \"-y\"]\n\tif (isGlobal) cmdArgs.push(\"-g\")\n\n\texecSync(`npx ${cmdArgs.join(\" \")}`, { stdio: \"inherit\" })\n}\n\nasync function skillsList() {\n\tconst { execSync } = await import(\"node:child_process\")\n\texecSync(\"npx skills list -a openclaw\", { stdio: \"inherit\" })\n}\n\n// ============================================================================\n// ClawHub - Wrapper around clawhub CLI\n// ============================================================================\n\nasync function clawhubInstall(extraArgs: string) {\n\tconst { execSync } = await import(\"node:child_process\")\n\tconsole.log(\"\\nš„ Installing from ClawHub...\\n\")\n\texecSync(`npx clawhub install ${extraArgs}`, { stdio: \"inherit\" })\n}\n\nasync function clawhubSearch(query: string) {\n\tconst { execSync } = await import(\"node:child_process\")\n\texecSync(`npx clawhub search ${query}`, { stdio: \"inherit\" })\n}\n\nasync function clawhubPublish(extraArgs: string) {\n\tconst { execSync } = await import(\"node:child_process\")\n\tconsole.log(\"\\nš¤ Publishing to ClawHub...\\n\")\n\texecSync(`npx clawhub publish ${extraArgs}`, { stdio: \"inherit\" })\n}\n\nasync function clawhubUpdate(extraArgs: string) {\n\tconst { execSync } = await import(\"node:child_process\")\n\tconsole.log(\"\\nš Updating skills from ClawHub...\\n\")\n\texecSync(`npx clawhub update ${extraArgs}`, { stdio: \"inherit\" })\n}\n\nasync function clawhubList() {\n\tconst { execSync } = await import(\"node:child_process\")\n\texecSync(\"npx clawhub list\", { stdio: \"inherit\" })\n}\n\nasync function clawhubLogin() {\n\tconst { execSync } = await import(\"node:child_process\")\n\tconsole.log(\"\\nš Logging into ClawHub...\\n\")\n\texecSync(\"npx clawhub login\", { stdio: \"inherit\" })\n}\n\nasync function clawhubLogout() {\n\tconst { execSync } = await import(\"node:child_process\")\n\texecSync(\"npx clawhub logout\", { stdio: \"inherit\" })\n}\n\nasync function clawhubWhoami() {\n\tconst { execSync } = await import(\"node:child_process\")\n\texecSync(\"npx clawhub whoami\", { stdio: \"inherit\" })\n}\n\n// ============================================================================\n// Init\n// ============================================================================\n\nasync function init(name?: string) {\n\tif (!name) {\n\t\tconsole.error(\"Error: Agent name required\")\n\t\tconsole.error(\"Usage: hybrid init <name>\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst {\n\t\tcpSync,\n\t\texistsSync,\n\t\tmkdirSync,\n\t\twriteFileSync,\n\t\treaddirSync,\n\t\treadFileSync\n\t} = await import(\"node:fs\")\n\n\n\tconst templateDir = resolve(packageDir, \"templates\", \"agent\")\n\tconst targetDir = resolve(process.cwd(), name)\n\n\tif (existsSync(targetDir)) {\n\t\tconsole.error(`Error: Directory '${name}' already exists`)\n\t\tprocess.exit(1)\n\t}\n\n\tconsole.log(`\\nš¦ Creating agent: ${name}\\n`)\n\n\t// Copy template\n\tcpSync(templateDir, targetDir, { recursive: true })\n\n\t// Update package.json with agent name\n\tconst pkgPath = resolve(targetDir, \"package.json\")\n\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"))\n\tpkg.name = name\n\twriteFileSync(pkgPath, JSON.stringify(pkg, null, 2))\n\n\t// Copy core skills from bundled package\n\tconst skillsDir = resolve(packageDir, \"skills\")\n\tconst targetSkillsDir = resolve(targetDir, \"skills\")\n\n\tif (existsSync(skillsDir)) {\n\t\tconsole.log(\"š Copying core skills...\")\n\t\tconst coreSkills = readdirSync(skillsDir, { withFileTypes: true })\n\t\t\t.filter((d) => d.isDirectory())\n\t\t\t.map((d) => d.name)\n\n\t\tmkdirSync(targetSkillsDir, { recursive: true })\n\n\t\tfor (const skill of coreSkills) {\n\t\t\tcpSync(resolve(skillsDir, skill), resolve(targetSkillsDir, skill), {\n\t\t\t\trecursive: true\n\t\t\t})\n\t\t\tconsole.log(` ā ${skill}`)\n\t\t}\n\n\t\t// Create skills-lock.json\n\t\tconst lockfile: Record<string, { source: string; installedAt: string }> = {}\n\t\tconst now = new Date().toISOString()\n\t\tfor (const skill of coreSkills) {\n\t\t\tlockfile[skill] = { source: \"core\", installedAt: now }\n\t\t}\n\t\twriteFileSync(\n\t\t\tresolve(targetDir, \"skills-lock.json\"),\n\t\t\tJSON.stringify(lockfile, null, 2)\n\t\t)\n\t}\n\n\t// Copy .env.example to .env\n\tconst envExamplePath = resolve(targetDir, \".env.example\")\n\tconst envPath = resolve(targetDir, \".env\")\n\tif (existsSync(envExamplePath)) {\n\t\tcpSync(envExamplePath, envPath)\n\t}\n\n\t// Collect configuration via prompts\n\tconst prompts = (await import(\"prompts\")).default\n\tconst providerResponse = await prompts({\n\t\ttype: \"select\",\n\t\tname: \"provider\",\n\t\tmessage: \"LLM Provider\",\n\t\tchoices: [\n\t\t\t{ title: \"Anthropic\", value: \"anthropic\" },\n\t\t\t{ title: \"OpenRouter\", value: \"openrouter\" }\n\t\t],\n\t\tinitial: 0\n\t})\n\n\tif (providerResponse.provider === undefined) {\n\t\tconsole.log(\"\\nCancelled.\")\n\t\tprocess.exit(0)\n\t}\n\n\tlet anthropicKey = \"\"\n\tlet openrouterKey = \"\"\n\n\tif (providerResponse.provider === \"anthropic\") {\n\t\tconst keyResponse = await prompts({\n\t\t\ttype: \"password\",\n\t\t\tname: \"key\",\n\t\t\tmessage: \"Anthropic API key\"\n\t\t})\n\t\tanthropicKey = keyResponse.key || \"\"\n\t} else if (providerResponse.provider === \"openrouter\") {\n\t\tconst keyResponse = await prompts({\n\t\t\ttype: \"password\",\n\t\t\tname: \"key\",\n\t\t\tmessage: \"OpenRouter API key\"\n\t\t})\n\t\topenrouterKey = keyResponse.key || \"\"\n\t}\n\n\t// Create ACL file with owner\n\tconst credentialsDir = resolve(targetDir, \"credentials\")\n\tmkdirSync(credentialsDir, { recursive: true })\n\tconst acl: { version: number; allowFrom: string[] } = {\n\t\tversion: 1,\n\t\tallowFrom: []\n\t}\n\tconst ownerResponse = await prompts({\n\t\ttype: \"text\",\n\t\tname: \"address\",\n\t\tmessage: \"Enter your wallet address (owner, optional)\"\n\t})\n\tconst ownerAddress = ownerResponse?.address?.trim() || \"\"\n\tif (ownerAddress) {\n\t\tacl.allowFrom.push(ownerAddress.toLowerCase())\n\t\tconsole.log(`\\nā
Added owner: ${ownerAddress.toLowerCase()}`)\n\t}\n\twriteFileSync(\n\t\tresolve(credentialsDir, \"allowFrom.json\"),\n\t\tJSON.stringify(acl, null, 2)\n\t)\n\n\t// Close readline now that all prompts are done\n\t// (rl is not used ā all prompts use the prompts library now)\n\n\t// Update .env file with generated key and API keys\n\tlet envContent = readFileSync(envPath, \"utf-8\")\n\n\t// Update API keys based on provider choice\n\tif (anthropicKey) {\n\t\tenvContent = envContent.replace(\n\t\t\t/ANTHROPIC_API_KEY=.*/,\n\t\t\t`ANTHROPIC_API_KEY=${anthropicKey}`\n\t\t)\n\t\t// Comment out OpenRouter lines if present\n\t\tenvContent = envContent.replace(\n\t\t\t/^ANTHROPIC_BASE_URL=https:\\/\\/openrouter\\.ai\\/api/m,\n\t\t\t\"# ANTHROPIC_BASE_URL=https://openrouter.ai/api\"\n\t\t)\n\t\tenvContent = envContent.replace(\n\t\t\t/^ANTHROPIC_AUTH_TOKEN=(?!your_openrouter_key)/m,\n\t\t\t\"# ANTHROPIC_AUTH_TOKEN=\"\n\t\t)\n\t}\n\n\tif (openrouterKey) {\n\t\t// Uncomment/set OpenRouter lines\n\t\tenvContent = envContent.replace(\n\t\t\t/# ANTHROPIC_BASE_URL=https:\\/\\/openrouter\\.ai\\/api/,\n\t\t\t\"ANTHROPIC_BASE_URL=https://openrouter.ai/api\"\n\t\t)\n\t\t// Replace commented placeholder OR existing AUTH_TOKEN in one pass\n\t\tenvContent = envContent.replace(\n\t\t\t/^#?\\s*ANTHROPIC_AUTH_TOKEN=.*/m,\n\t\t\t`ANTHROPIC_AUTH_TOKEN=${openrouterKey}`\n\t\t)\n\t\t// Comment out direct Anthropic key if OpenRouter is used\n\t\tenvContent = envContent.replace(\n\t\t\t/^ANTHROPIC_API_KEY=/m,\n\t\t\t(match) => `# ${match}`\n\t\t)\n\t}\n\n\twriteFileSync(envPath, envContent)\n\tconsole.log(\"ā
Updated .env file\")\n\n\tconsole.log(`\\nā
Created agent at: ${name}/`)\n\tconsole.log(\"\\nNext steps:\")\n\tconsole.log(` cd ${name}`)\n\tconsole.log(\" npm install # or pnpm install\")\n\tconsole.log(\" hybrid dev # Start development\")\n}\n\n// ============================================================================\n// Build\n// ============================================================================\n\nasync function build(target?: string) {\n\tconst { execSync } = await import(\"node:child_process\")\n\tconst {\n\t\tcpSync,\n\t\texistsSync,\n\t\tmkdirSync,\n\t\trmSync,\n\t\twriteFileSync,\n\t\treaddirSync,\n\t\treadFileSync\n\t} = await import(\"node:fs\")\n\n\tconst projectDir = projectRoot\n\tconst distDir = resolve(projectDir, \"dist\")\n\tconst buildTarget = target || \"firecracker\"\n\n\tconsole.log(\"\\nš§ Building agent...\")\n\n\t// Clean dist\n\tif (existsSync(distDir)) {\n\t\trmSync(distDir, { recursive: true, force: true })\n\t}\n\tmkdirSync(distDir, { recursive: true })\n\tmkdirSync(resolve(distDir, \"server\"), { recursive: true })\n\n\t// Copy agent runtime from bundled package\n\tconsole.log(\"š¦ Copying agent runtime...\")\n\tconst agentDistDir = resolve(packageDir, \"dist\")\n\n\tconst files = [\"server/index.cjs\"]\n\n\tfor (const file of files) {\n\t\tconst src = resolve(agentDistDir, file)\n\t\tif (existsSync(src)) {\n\t\t\tcpSync(src, resolve(distDir, file))\n\t\t} else {\n\t\t\tconsole.error(` Missing: ${file} - run 'pnpm build' in hybrid package`)\n\t\t}\n\t}\n\n\t// Copy config files\n\tconsole.log(\"š Copying agent config...\")\n\tfor (const file of [\n\t\t\"SOUL.md\",\n\t\t\"AGENTS.md\",\n\t\t\"IDENTITY.md\",\n\t\t\"TOOLS.md\",\n\t\t\"BOOT.md\",\n\t\t\"BOOTSTRAP.md\",\n\t\t\"HEARTBEAT.md\",\n\t\t\"USER.md\"\n\t]) {\n\t\tconst src = resolve(projectDir, file)\n\t\tif (existsSync(src)) {\n\t\t\tcpSync(src, resolve(distDir, file))\n\t\t\tconsole.log(` ā ${file}`)\n\t\t}\n\t}\n\n\t// Copy/migrate config file\n\tconst hybridConfig = resolve(projectDir, \"hybrid.config.ts\")\n\tconst openclawConfig = resolve(projectDir, \"openclaw.json\")\n\tconst agentConfig = resolve(projectDir, \"agent.ts\")\n\n\tif (existsSync(hybridConfig)) {\n\t\t// TODO: Compile TypeScript config\n\t\tcpSync(hybridConfig, resolve(distDir, \"hybrid.config.ts\"))\n\t\tconsole.log(\" ā hybrid.config.ts\")\n\t} else if (existsSync(openclawConfig)) {\n\t\tconst content = readFileSync(openclawConfig, \"utf-8\")\n\t\twriteFileSync(\n\t\t\tresolve(projectDir, \"hybrid.config.ts\"),\n\t\t\t`// Migrated from openclaw.json\\nexport default ${content}`\n\t\t)\n\t\tconsole.log(\" ā Migrated openclaw.json ā hybrid.config.ts\")\n\t} else if (existsSync(agentConfig)) {\n\t\tcpSync(agentConfig, resolve(distDir, \"agent.ts\"))\n\t\tconsole.log(\" ā agent.ts (legacy)\")\n\t}\n\n\t// Skills stay in ./skills/ at project root - not copied\n\t// Verify skills exist\n\tconst skillsDir = resolve(projectDir, \"skills\")\n\tif (existsSync(skillsDir)) {\n\t\tconst skills = readdirSync(skillsDir, { withFileTypes: true })\n\t\t\t.filter((d) => d.isDirectory())\n\t\t\t.map((d) => d.name)\n\t\tconsole.log(`š Skills: ${skills.length} in ./skills/`)\n\t} else {\n\t\tconsole.log(\"ā ļø No ./skills/ directory found - run 'hybrid init' first?\")\n\t}\n\n\t// Copy credentials if exist\n\tconst credsDir = resolve(projectDir, \"credentials\")\n\tif (existsSync(credsDir)) {\n\t\tmkdirSync(resolve(distDir, \"credentials\"), { recursive: true })\n\t\tcpSync(credsDir, resolve(distDir, \"credentials\"), { recursive: true })\n\t\tconsole.log(\" ā credentials/\")\n\t}\n\n\t// Generate package.json for deployment\n\tconst deployPkg = {\n\t\tname: \"hybrid\",\n\t\tversion: \"1.0.0\",\n\t\ttype: \"module\",\n\t\tdependencies: {\n\t\t\t\"@anthropic-ai/claude-agent-sdk\": \"^0.2.38\",\n\t\t\t\"@hono/node-server\": \"^1.13.5\",\n\t\t\tai: \"^6.0.0\",\n\t\t\t\"better-sqlite3\": \"^11.0.0\",\n\t\t\tdotenv: \"^16.4.5\",\n\t\t\thono: \"^4.10.8\",\n\t\t\t\"sql.js\": \"^1.11.0\",\n\t\t\tzod: \"^4.0.0\"\n\t\t}\n\t}\n\twriteFileSync(\n\t\tresolve(distDir, \"package.json\"),\n\t\tJSON.stringify(deployPkg, null, 2)\n\t)\n\n\t// Generate Dockerfile (only COPY files that exist in dist)\n\twriteFileSync(resolve(distDir, \"Dockerfile\"), generateDockerfile(distDir))\n\n\t// .hybrid-deploy.json manifest for provider consumption\n\twriteFileSync(\n\t\tresolve(distDir, \".hybrid-deploy.json\"),\n\t\tJSON.stringify(\n\t\t\t{\n\t\t\t\tversion: 1,\n\t\t\t\tprovider: \"firecracker\",\n\t\t\t\tstartCommand: \"node server/index.cjs\",\n\t\t\t\tport: 8454,\n\t\t\t\thealthPath: \"/health\"\n\t\t\t},\n\t\t\tnull,\n\t\t\t2\n\t\t)\n\t)\n\n\t// Generate start script\n\twriteFileSync(\n\t\tresolve(distDir, \"start.sh\"),\n\t\t`#!/bin/sh\nnode server/index.cjs\n`\n\t)\n\n\tconsole.log(\"\\nā
Build complete!\")\n\tconsole.log(` Output: ${distDir}`)\n\tconsole.log(` Target: ${buildTarget}`)\n}\n\nfunction generateDockerfile(distDir: string): string {\n\tconst configFiles = [\n\t\t\"SOUL.md\",\n\t\t\"AGENTS.md\",\n\t\t\"IDENTITY.md\",\n\t\t\"TOOLS.md\",\n\t\t\"BOOT.md\",\n\t\t\"BOOTSTRAP.md\",\n\t\t\"HEARTBEAT.md\",\n\t\t\"USER.md\",\n\t]\n\tconst present = configFiles.filter((f) =>\n\t\texistsSync(resolve(distDir, f)),\n\t)\n\tconst hasCredentials = existsSync(resolve(distDir, \"credentials\"))\n\tconst configCopy = present.length > 0 ? `COPY ${present.join(\" \")} ./` : \"\"\n\tconst credCopy = hasCredentials ? \"COPY credentials/ ./credentials/\" : \"\"\n\n\treturn `FROM node:20-bookworm-slim\nWORKDIR /app\nCOPY package.json ./\nRUN npm install --production\nCOPY server/ ./server/\n${configCopy}\n${credCopy}\nENV AGENT_PORT=8454\nENV NODE_ENV=production\nENV DATA_ROOT=/app/data\nEXPOSE 8454\nUSER node\nCMD [\"node\", \"server/index.cjs\"]\n`\n}\n\n// ============================================================================\n// Dev\n// ============================================================================\n\nasync function dev(useDocker: boolean) {\n\tconst { execSync } = await import(\"node:child_process\")\n\n\tif (useDocker) {\n\t\tconsole.log(\"\\nš³ Docker dev not yet implemented for new structure\")\n\t\tconsole.log(\"Use 'hybrid dev' without --docker for now\")\n\t\treturn\n\t}\n\n\tconst projectDir = projectRoot\n\tconst agentServer = resolve(packageDir, \"dist\", \"server\", \"index.cjs\")\n\n\tconsole.log(\"\\nš Starting development server...\\n\")\n\tconsole.log(` Project: ${projectDir}`)\n\tconsole.log(` Runtime: ${packageDir}\\n`)\n\n\ttry {\n\t\texecSync(`node ${agentServer}`, {\n\t\t\tcwd: projectDir,\n\t\t\tstdio: \"inherit\",\n\t\t\tenv: {\n\t\t\t\t...process.env,\n\t\t\t\tAGENT_PROJECT_ROOT: projectDir\n\t\t\t}\n\t\t})\n\t} catch {\n\t\tconsole.error(\"\\nā Failed to start dev server\")\n\t\tprocess.exit(1)\n\t}\n}\n\n// ============================================================================\n// Start\n// ============================================================================\n\nasync function start() {\n\tconst { spawn } = await import(\"node:child_process\")\n\tconst { existsSync } = await import(\"node:fs\")\n\n\tconst projectDir = projectRoot\n\tconst distDir = resolve(projectDir, \"dist\")\n\n\tif (!existsSync(resolve(distDir, \"server\", \"simple.cjs\"))) {\n\t\tconsole.error(\"Error: No build found. Run 'hybrid build' first.\")\n\t\tprocess.exit(1)\n\t}\n\n\tconsole.log(\"\\nš Starting agent from ./dist/...\\n\")\n\n\tconst server = spawn(\"node\", [resolve(distDir, \"server\", \"simple.cjs\")], {\n\t\tcwd: projectDir,\n\t\tstdio: \"inherit\",\n\t\tenv: { ...process.env, AGENT_PROJECT_ROOT: projectDir }\n\t})\n\n\tconst exitHandler = (code: number | null) => {\n\t\tif (code !== 0 && code !== null) process.exit(code)\n\t}\n\n\tserver.on(\"exit\", exitHandler)\n\n\tprocess.on(\"SIGINT\", () => {\n\t\tserver.kill(\"SIGINT\")\n\t\tprocess.exit(0)\n\t})\n}\n\n// ============================================================================\n// Deploy ā delegates to deploy/ providers\n// ============================================================================\n\nlet deployModule: typeof import(\"./deploy/deploy\") | null = null\nasync function loadDeploy() {\n\tif (!deployModule) {\n\t\tdeployModule = await import(\"./deploy/deploy\")\n\t}\n\treturn deployModule\n}\n\nfunction parseDeployArgs(args: string[]) {\n\t// Collect known flag indices so we don't mistake flag values as positional names\n\tconst skipSet = new Set<number>()\n\t// Only flags that consume a value should skip the NEXT index\n\tconst valuedFlags = new Set([\n\t\t\"--provider\",\n\t\t\"-p\",\n\t\t\"--name\",\n\t\t\"-n\",\n\t])\n\tfor (let i = 0; i < args.length; i++) {\n\t\tif (valuedFlags.has(args[i])) {\n\t\t\tskipSet.add(i)\n\t\t\tskipSet.add(i + 1)\n\t\t}\n\t}\n\tconst providerIdx = args.indexOf(\"--provider\")\n\tconst providerAltIdx = args.indexOf(\"-p\")\n\tconst nameIdx = args.indexOf(\"--name\")\n\tconst nameAltIdx = args.indexOf(\"-n\")\n\tconst providerFlag =\n\t\t(providerIdx !== -1 ? args[providerIdx + 1] : undefined) ||\n\t\t(providerAltIdx !== -1 ? args[providerAltIdx + 1] : undefined)\n\tconst nameFlag =\n\t\t(nameIdx !== -1 ? args[nameIdx + 1] : undefined) ||\n\t\t(nameAltIdx !== -1 ? args[nameAltIdx + 1] : undefined)\n\n\t// Find the first positional arg that isn't a flag, flag value, or subcommand\n\tconst name = args.find(\n\t\t(a, i) =>\n\t\t\ti > 1 &&\n\t\t\t!a.startsWith(\"--\") &&\n\t\t\t!a.startsWith(\"-\") &&\n\t\t\t!skipSet.has(i) &&\n\t\t\ta !== \"deploy\" &&\n\t\t\ta !== \"sleep\" &&\n\t\t\ta !== \"wake\" &&\n\t\t\ta !== \"status\" &&\n\t\t\ta !== \"logs\" &&\n\t\t\ta !== \"teardown\" &&\n\t\t\ta !== providerFlag &&\n\t\t\ta !== nameFlag,\n\t)\n\tconst skipBuild = args.includes(\"--no-build\")\n\tconst force = args.includes(\"--force\")\n\tconst follow = !args.includes(\"--no-follow\")\n\treturn {\n\t\tplatform: providerFlag,\n\t\tname: name || nameFlag,\n\t\tskipBuild,\n\t\tforce,\n\t\tfollow,\n\t}\n}\n\nasync function deployCommand(args: string[]) {\n\tconst sub = args[1]\n\n\t// If sub looks like a known provider, treat it as the platform and deploy.\n\t// Otherwise treat it as a subcommand.\n\tconst knownProviders = new Set([\n\t\t\"sprites\",\n\t\t\"e2b\",\n\t\t\"daytona\",\n\t\t\"northflank\",\n\t])\n\tconst isPlatform = sub && !sub.startsWith(\"-\") && knownProviders.has(sub)\n\n\tif (!sub || sub.startsWith(\"-\") || isPlatform) {\n\t\tconst flags = parseDeployArgs(args)\n\t\tconst { runDeploy } = await loadDeploy()\n\t\tawait runDeploy(\n\t\t\t{\n\t\t\t\tplatform: flags.platform || (isPlatform ? sub : undefined),\n\t\t\t\tname: flags.name,\n\t\t\t\tskipBuild: flags.skipBuild,\n\t\t\t\tforce: flags.force,\n\t\t\t},\n\t\t\tprojectRoot,\n\t\t\tpackageDir,\n\t\t)\n\t\treturn\n\t}\n\n\tconst pIdx = args.indexOf(\"--provider\")\n\tconst pAlt = args.indexOf(\"-p\")\n\tconst nIdx = args.indexOf(\"--name\")\n\tconst nAlt = args.indexOf(\"-n\")\n\tconst subPlatform =\n\t\t(pIdx !== -1 ? args[pIdx + 1] : undefined) ||\n\t\t(pAlt !== -1 ? args[pAlt + 1] : undefined)\n\tconst subSkipIdx = new Set<number>()\n\tsubSkipIdx.add(pIdx)\n\tsubSkipIdx.add(pAlt)\n\tsubSkipIdx.add(nIdx)\n\tsubSkipIdx.add(nAlt)\n\t// Skip the values after valued flags too\n\tif (pIdx !== -1) subSkipIdx.add(pIdx + 1)\n\tif (pAlt !== -1) subSkipIdx.add(pAlt + 1)\n\tif (nIdx !== -1) subSkipIdx.add(nIdx + 1)\n\tif (nAlt !== -1) subSkipIdx.add(nAlt + 1)\n\tconst name = args.find(\n\t\t(a, i) => i > 1 && !a.startsWith(\"-\") && !subSkipIdx.has(i),\n\t)\n\n\tswitch (sub) {\n\t\tcase \"sleep\": {\n\t\t\tif (!name) {\n\t\t\t\tconsole.error(\"Usage: hybrid deploy sleep <name>\")\n\t\t\t\tprocess.exit(1)\n\t\t\t}\n\t\t\tconst { runSleep } = await loadDeploy()\n\t\t\tawait runSleep(name, subPlatform, projectRoot)\n\t\t\tbreak\n\t\t}\n\t\tcase \"wake\": {\n\t\t\tif (!name) {\n\t\t\t\tconsole.error(\"Usage: hybrid deploy wake <name>\")\n\t\t\t\tprocess.exit(1)\n\t\t\t}\n\t\t\tconst { runWake } = await loadDeploy()\n\t\t\tawait runWake(name, subPlatform, projectRoot)\n\t\t\tbreak\n\t\t}\n\t\tcase \"status\": {\n\t\t\tif (!name) {\n\t\t\t\tconsole.error(\"Usage: hybrid deploy status <name>\")\n\t\t\t\tprocess.exit(1)\n\t\t\t}\n\t\t\tconst { runStatus } = await loadDeploy()\n\t\t\tawait runStatus(name, subPlatform, projectRoot)\n\t\t\tbreak\n\t\t}\n\t\tcase \"logs\": {\n\t\t\tif (!name) {\n\t\t\t\tconsole.error(\"Usage: hybrid deploy logs <name>\")\n\t\t\t\tprocess.exit(1)\n\t\t\t}\n\t\t\tconst follow = !args.includes(\"--no-follow\")\n\t\t\tconst { runLogs } = await loadDeploy()\n\t\t\tawait runLogs(name, follow, subPlatform, projectRoot)\n\t\t\tbreak\n\t\t}\n\t\tcase \"teardown\": {\n\t\t\tif (!name) {\n\t\t\t\tconsole.error(\"Usage: hybrid deploy teardown <name>\")\n\t\t\t\tprocess.exit(1)\n\t\t\t}\n\t\t\tconst { runTeardown } = await loadDeploy()\n\t\t\tawait runTeardown(name, subPlatform, projectRoot)\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t\tconsole.error(`Unknown deploy subcommand: ${sub}`)\n\t\t\tprintDeployHelp()\n\t\t\tprocess.exit(1)\n\t}\n}\n\nfunction printDeployHelp() {\n\tconsole.error(\"\")\n\tconsole.error(\"Usage: hybrid deploy <subcommand>\")\n\tconsole.error(\"\")\n\tconsole.error(\"Commands:\")\n\tconsole.error(\n\t\t\" deploy [platform] Deploy to a Firecracker provider\"\n\t)\n\tconsole.error(\" deploy sleep <name> Put VM to sleep\")\n\tconsole.error(\" deploy wake <name> Wake VM\")\n\tconsole.error(\" deploy status <name> Show VM status\")\n\tconsole.error(\" deploy logs <name> Stream agent logs\")\n\tconsole.error(\" deploy teardown <name> [--all] Destroy VM\")\n\tconsole.error(\"\")\n\tconsole.error(\n\t\t\"Flags: --provider <name> --name <name> --force --no-build --no-follow\"\n\t)\n}\n\n// ============================================================================\n// Owner\n// ============================================================================\n\nasync function ownerAdd(address?: string) {\n\tconst { join } = await import(\"node:path\")\n\tconst { existsSync, mkdirSync, writeFileSync, readFileSync } = await import(\n\t\t\"node:fs\"\n\t)\n\n\tif (!address) {\n\t\tconsole.error(\"Usage: hybrid owner add <address>\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst projectDir = projectRoot\n\tconst aclPath = join(projectDir, \"credentials\", \"allowFrom.json\")\n\tconst normalized = address.toLowerCase().trim()\n\n\tmkdirSync(join(projectDir, \"credentials\"), { recursive: true })\n\n\tlet acl: { version: number; allowFrom: string[] } = {\n\t\tversion: 1,\n\t\tallowFrom: []\n\t}\n\tif (existsSync(aclPath)) {\n\t\ttry {\n\t\t\tacl = JSON.parse(readFileSync(aclPath, \"utf-8\"))\n\t\t} catch {}\n\t}\n\n\tif (!acl.allowFrom.includes(normalized)) {\n\t\tacl.allowFrom.push(normalized)\n\t\twriteFileSync(aclPath, JSON.stringify(acl, null, \"\\t\"))\n\t\tconsole.log(`\\nā
Added owner: ${normalized}`)\n\t} else {\n\t\tconsole.log(`\\nā ļø Already an owner: ${normalized}`)\n\t}\n\n\tconsole.log(`\\nš Owners (${acl.allowFrom.length}):`)\n\tfor (const owner of acl.allowFrom) console.log(` - ${owner}`)\n}\n\nasync function ownerRemove(address?: string) {\n\tconst { join } = await import(\"node:path\")\n\tconst { existsSync, writeFileSync, readFileSync } = await import(\"node:fs\")\n\n\tif (!address) {\n\t\tconsole.error(\"Usage: hybrid owner remove <address>\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst projectDir = projectRoot\n\tconst aclPath = join(projectDir, \"credentials\", \"allowFrom.json\")\n\n\tif (!existsSync(aclPath)) {\n\t\tconsole.error(\"No ACL file. Run 'hybrid init' first.\")\n\t\tprocess.exit(1)\n\t}\n\n\tconst acl: { version: number; allowFrom: string[] } = JSON.parse(\n\t\treadFileSync(aclPath, \"utf-8\")\n\t)\n\tconst normalized = address.toLowerCase().trim()\n\tconst index = acl.allowFrom.indexOf(normalized)\n\n\tif (index === -1) {\n\t\tconsole.log(`\\nā ļø Not an owner: ${normalized}`)\n\t\tprocess.exit(1)\n\t}\n\n\tacl.allowFrom.splice(index, 1)\n\twriteFileSync(aclPath, JSON.stringify(acl, null, \"\\t\"))\n\tconsole.log(`\\nā
Removed owner: ${normalized}`)\n\n\tif (acl.allowFrom.length > 0) {\n\t\tconsole.log(`\\nš Remaining (${acl.allowFrom.length}):`)\n\t\tfor (const owner of acl.allowFrom) console.log(` - ${owner}`)\n\t} else {\n\t\tconsole.log(\"\\nā ļø No owners. Agent is open to all users.\")\n\t}\n}\n\nasync function ownerList() {\n\tconst { join } = await import(\"node:path\")\n\tconst { existsSync, readFileSync } = await import(\"node:fs\")\n\n\tconst projectDir = projectRoot\n\tconst aclPath = join(projectDir, \"credentials\", \"allowFrom.json\")\n\n\tif (!existsSync(aclPath)) {\n\t\tconsole.log(\"\\nā ļø No ACL file. Run 'hybrid init' first.\")\n\t\tconsole.log(\"\\n Agent is open to all users.\")\n\t\treturn\n\t}\n\n\tconst acl: { version: number; allowFrom: string[] } = JSON.parse(\n\t\treadFileSync(aclPath, \"utf-8\")\n\t)\n\n\tif (acl.allowFrom.length === 0) {\n\t\tconsole.log(\"\\nš No owners. Agent is open to all users.\")\n\t\treturn\n\t}\n\n\tconsole.log(`\\nš Owners (${acl.allowFrom.length}):`)\n\tfor (const owner of acl.allowFrom) console.log(` - ${owner}`)\n}\n\n// ============================================================================\n// Run\n// ============================================================================\n\n// Export for testing\nexport { init }\n\nmain().catch((error) => {\n\tconsole.error(\"CLI error:\", error)\n\tprocess.exit(1)\n})\n"],"mappings":"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","names":["writeFileSync","resolve","execFileSync","existsSync","unlinkSync","tmpdir","basename","join","sandbox","execFileSync","spawn","existsSync","unlinkSync","tmpdir","basename","join","writeFileSync","resolve","execFileSync","spawn","existsSync","unlinkSync","tmpdir","basename","join","CLI","resolve","existsSync","projectRoot","packageDir","init_deploy","existsSync","resolve","fileURLToPath","path","__dirname","cpSync","mkdirSync","writeFileSync","readFileSync","rmSync","spawn","runDeploy","runSleep","runWake","runStatus","runLogs","runTeardown","join"]}
|