{"version":3,"file":"agent-account-command.mjs","names":[],"sources":["../../../src/commands/agent-account-command.ts"],"sourcesContent":["/**\n * /delegator — Agent account lifecycle management.\n *\n * Subcommands:\n *   /delegator create    — deploy a HybridDeleGator smart account\n *   /delegator fund      — show the agent account address for funding\n *   /delegator status    — show balance, delegation status, account info\n *   /delegator recover   — restore agent key from backup\n *\n * The agent account is a HybridDeleGator smart account owned by the user.\n * The agent holds a delegate key for autonomous execution within policy limits.\n * User funds the account explicitly — blast radius is limited to deposited funds.\n */\n\nimport {\n  storeAgentKey,\n  saveMeta,\n  loadMeta,\n  loadAgentKey,\n  hasAgentAccount,\n  type AgentMeta,\n} from '../services/agent-keystore.js';\nimport { getWalletState } from '../services/walletconnect-service.js';\nimport { CHAIN_NAMES } from '../services/delegation-types.js';\nimport { createHash } from 'node:crypto';\nimport type { Address } from 'viem';\n\n/** Deterministic salt from owner + agent addresses. Same inputs = same smart account address. */\nfunction deterministicSalt(owner: string, agent: string): `0x${string}` {\n  const hash = createHash('sha256').update(`${owner.toLowerCase()}:${agent.toLowerCase()}`).digest('hex');\n  return `0x${hash}` as `0x${string}`;\n}\n\nexport const agentAccountCommand = {\n  name: 'delegator',\n  description: 'Delegator smart account management: /delegator [create|fund|status|recover]',\n  acceptsArgs: true,\n  requireAuth: true,\n\n  handler: async (ctx?: any) => {\n    const args = (ctx?.args ?? '').trim().toLowerCase();\n    const parts = args.split(/\\s+/);\n    const sub = parts[0] || '';\n\n    switch (sub) {\n      case 'create':\n        return handleCreate(parts.slice(1).join(' '));\n      case 'fund':\n        return handleFund();\n      case 'status':\n        return handleStatus();\n      case 'recover':\n        return handleRecover(parts.slice(1).join(' '));\n      default:\n        return showOverview();\n    }\n  },\n};\n\n// ─── Overview ───────────────────────────────────────────────────────────\n\nfunction showOverview() {\n  const meta = loadMeta();\n  const lines: string[] = [];\n\n  if (!meta) {\n    lines.push('**No agent account configured.**');\n    lines.push('');\n    lines.push('**How policy enforcement works:**');\n    lines.push('');\n    lines.push('Bankr wallet (current):');\n    lines.push('  Policies enforced by the AI.');\n    lines.push('  Fast, works now. The AI checks');\n    lines.push('  limits before every transaction.');\n    lines.push('');\n    lines.push('Delegator smart account (optional):');\n    lines.push('  Policies enforced on-chain by');\n    lines.push('  smart contracts. Tamper-proof.');\n    lines.push('  You fund a separate account and');\n    lines.push('  the agent operates within it.');\n    lines.push('');\n    lines.push('To set up on-chain enforcement:');\n    lines.push('  /delegator create <passphrase>');\n    lines.push('  /delegator recover <key> <pass>');\n  } else {\n    lines.push('**Agent Account**');\n    lines.push('');\n    lines.push(`  Smart account: \\`${meta.smartAccountAddress}\\``);\n    lines.push(`  Agent address: \\`${meta.agentAddress}\\``);\n    lines.push(`  Owner: \\`${meta.ownerAddress}\\``);\n    lines.push(`  Chain: ${CHAIN_NAMES[meta.chainId] ?? meta.chainId}`);\n    lines.push(`  Key storage: ${meta.storageMethod}`);\n    lines.push(`  Created: ${meta.createdAt}`);\n    lines.push('');\n    lines.push('**Commands:**');\n    lines.push('  `/delegator fund` — show address to send funds to');\n    lines.push('  `/delegator status` — balance and delegation details');\n  }\n\n  return { text: lines.join('\\n') };\n}\n\n// ─── Create ─────────────────────────────────────────────────────────────\n\nasync function handleCreate(passphrase: string) {\n  const lines: string[] = [];\n\n  if (hasAgentAccount()) {\n    const meta = loadMeta()!;\n    lines.push('**Agent account already exists.**');\n    lines.push(`  Smart account: \\`${meta.smartAccountAddress}\\``);\n    lines.push(`  Agent address: \\`${meta.agentAddress}\\``);\n    lines.push('Use `/delegator status` to check it, or `/delegator fund` to add funds.');\n    return { text: lines.join('\\n') };\n  }\n\n  // Always require a passphrase — the key must be persisted encrypted\n  if (!passphrase || passphrase.length < 8) {\n    lines.push('**Passphrase required.**');\n    lines.push('');\n    lines.push('Usage: `/delegator create <passphrase>`');\n    lines.push('');\n    lines.push('The passphrase encrypts the agent private key on disk.');\n    lines.push('Use at least 8 characters. You will need it to unlock the keystore after restarts.');\n    return { text: lines.join('\\n') };\n  }\n\n  const wallet = getWalletState();\n  if (!wallet.connected || !wallet.address) {\n    return { text: 'Connect a wallet first. The connected wallet becomes the owner of the agent account.' };\n  }\n\n  const chainId = wallet.chainId ?? 8453;\n\n  lines.push('**Creating Agent Account...**');\n  lines.push('');\n\n  try {\n    // 1. Generate agent keypair\n    const { generatePrivateKey, privateKeyToAccount } = await import('viem/accounts');\n    const agentPrivateKey = generatePrivateKey();\n    const agentAccount = privateKeyToAccount(agentPrivateKey);\n\n    lines.push(`Chain: ${CHAIN_NAMES[chainId] ?? chainId}`);\n    lines.push(`Owner (you): \\`${wallet.address}\\``);\n    lines.push('');\n\n    // 2. Deploy HybridDeleGator via SDK\n    const { toMetaMaskSmartAccount, Implementation, getSmartAccountsEnvironment } = await import('@metamask/smart-accounts-kit');\n    const { createPublicClient, http } = await import('viem');\n    const { baseSepolia, base } = await import('viem/chains');\n\n    const chain = chainId === 84532 ? baseSepolia : base;\n    const publicClient = createPublicClient({ chain, transport: http() });\n\n    const smartAccount = await toMetaMaskSmartAccount({\n      client: publicClient as any,\n      implementation: Implementation.Hybrid,\n      deployParams: [wallet.address as Address, [], [], []],\n      deploySalt: deterministicSalt(wallet.address, agentAccount.address),\n      signer: { account: agentAccount },\n    });\n\n    // 3. Store the key securely\n    const storageMethod = storeAgentKey(agentAccount.address, agentPrivateKey, passphrase || undefined);\n\n    // 4. Save metadata\n    const meta: AgentMeta = {\n      smartAccountAddress: smartAccount.address,\n      agentAddress: agentAccount.address,\n      ownerAddress: wallet.address,\n      chainId,\n      createdAt: new Date().toISOString(),\n      storageMethod,\n    };\n    saveMeta(meta);\n\n    // 5. Clear output with labeled addresses\n    lines.push('**FUND THIS ADDRESS (smart account):**');\n    lines.push(`\\`${smartAccount.address}\\``);\n    lines.push('This is where the agent operates.');\n    lines.push('Only funds here are used by the agent.');\n    lines.push('');\n    lines.push(`Agent signer: \\`${agentAccount.address}\\``);\n    lines.push('(pays gas for delegation txs — needs small ETH amount)');\n    lines.push('');\n    lines.push(`Key stored: **${storageMethod}**`);\n    lines.push('');\n\n    // 6. Show recovery key ONCE\n    lines.push('---');\n    lines.push('**RECOVERY KEY — SAVE NOW**');\n    lines.push('This recovers the agent signer.');\n    lines.push('Your owner wallet recovers the');\n    lines.push('smart account itself.');\n    lines.push('');\n    lines.push(`\\`${agentPrivateKey}\\``);\n    lines.push('');\n    lines.push('Will not be shown again.');\n    lines.push('---');\n    lines.push('');\n    lines.push('**Next:** send ETH to the smart');\n    lines.push('account address above, then:');\n    lines.push('`/delegate create <policy-name>`');\n  } catch (err) {\n    const msg = err instanceof Error ? err.message : String(err);\n    lines.push(`**Creation failed:** ${msg.slice(0, 200)}`);\n  }\n\n  return { text: lines.join('\\n') };\n}\n\n// ─── Fund ───────────────────────────────────────────────────────────────\n\nfunction handleFund() {\n  const meta = loadMeta();\n  if (!meta) return { text: 'No agent account. Run `/delegator create` first.' };\n\n  const lines: string[] = [];\n  lines.push('**Fund the Agent Account**');\n  lines.push('');\n  lines.push('Send ETH or tokens to the');\n  lines.push('**smart account** (not the agent');\n  lines.push('signer address):');\n  lines.push('');\n  lines.push(`\\`${meta.smartAccountAddress}\\``);\n  lines.push('');\n  lines.push(`Chain: ${CHAIN_NAMES[meta.chainId] ?? meta.chainId}`);\n  lines.push('');\n  lines.push('Only send what you want the');\n  lines.push('agent to manage. Withdraw');\n  lines.push('anytime via your owner wallet.');\n  lines.push('');\n  lines.push('The agent signer also needs a');\n  lines.push('small amount of ETH for gas:');\n  lines.push(`\\`${meta.agentAddress}\\``);\n\n  return { text: lines.join('\\n') };\n}\n\n// ─── Status ─────────────────────────────────────────────────────────────\n\nasync function handleStatus() {\n  const meta = loadMeta();\n  if (!meta) return { text: 'No agent account. Run `/delegator create` first.' };\n\n  const lines: string[] = [];\n  lines.push('**Agent Account Status**');\n  lines.push('');\n  lines.push(`  Smart account: \\`${meta.smartAccountAddress}\\``);\n  lines.push(`  Agent address: \\`${meta.agentAddress}\\``);\n  lines.push(`  Owner: \\`${meta.ownerAddress}\\``);\n  lines.push(`  Chain: ${CHAIN_NAMES[meta.chainId] ?? meta.chainId}`);\n  lines.push(`  Key storage: ${meta.storageMethod}`);\n  lines.push('');\n\n  // Check if key is accessible\n  const key = loadAgentKey();\n  lines.push(`  Key accessible: ${key ? 'yes' : 'no (may need passphrase)'}`);\n  lines.push('');\n\n  // Check on-chain balance\n  try {\n    const { createPublicClient, http, formatEther } = await import('viem');\n    const { baseSepolia, base } = await import('viem/chains');\n    const chain = meta.chainId === 84532 ? baseSepolia : base;\n    const publicClient = createPublicClient({ chain, transport: http() });\n\n    const balance = await publicClient.getBalance({ address: meta.smartAccountAddress as Address });\n    lines.push(`  Balance: ${formatEther(balance)} ETH`);\n\n    const code = await publicClient.getCode({ address: meta.smartAccountAddress as Address });\n    const deployed = code && code.length > 2;\n    lines.push(`  Deployed: ${deployed ? 'yes' : 'no (deploy on first tx)'}`);\n  } catch {\n    lines.push('  Balance: unable to check (RPC unavailable)');\n  }\n\n  return { text: lines.join('\\n') };\n}\n\n// ─── Recover ────────────────────────────────────────────────────────────\n\nasync function handleRecover(argsStr: string) {\n  if (!argsStr) {\n    return { text: [\n      'Usage:',\n      '  /delegator recover <key> <passphrase>',\n      '  /delegator recover <passphrase>',\n      '',\n      'First form: restore from backup key',\n      '  (encrypts with passphrase)',\n      'Second form: unlock encrypted keystore',\n    ].join('\\n') };\n  }\n\n  const lines: string[] = [];\n  const parts = argsStr.trim().split(/\\s+/);\n  const first = parts[0] ?? '';\n  const second = parts[1] ?? '';\n\n  // Form 1: recover <private-key> <passphrase>\n  if (/^0x[0-9a-fA-F]{64}$/.test(first)) {\n    if (!second || second.length < 8) {\n      return { text: 'Passphrase required (min 8 chars).\\nUsage: /delegator recover <key> <passphrase>' };\n    }\n\n    try {\n      const { privateKeyToAccount } = await import('viem/accounts');\n      const account = privateKeyToAccount(first as `0x${string}`);\n\n      // Store the key encrypted\n      const storageMethod = storeAgentKey(account.address, first, second);\n      lines.push(`Key stored: **${storageMethod}**`);\n      lines.push(`Agent address: \\`${account.address}\\``);\n      lines.push('');\n\n      // Rebuild meta from the SDK if wallet is connected\n      const wallet = getWalletState();\n      if (wallet.connected && wallet.address) {\n        try {\n          const { toMetaMaskSmartAccount, Implementation } = await import('@metamask/smart-accounts-kit');\n          const { createPublicClient, http } = await import('viem');\n          const { baseSepolia, base } = await import('viem/chains');\n\n          const chainId = wallet.chainId ?? 8453;\n          const chain = chainId === 84532 ? baseSepolia : base;\n          const publicClient = createPublicClient({ chain, transport: http() });\n\n          const smartAccount = await toMetaMaskSmartAccount({\n            client: publicClient as any,\n            implementation: Implementation.Hybrid,\n            deployParams: [wallet.address as Address, [], [], []],\n            deploySalt: deterministicSalt(wallet.address, account.address),\n            signer: { account },\n          });\n\n          const meta: AgentMeta = {\n            smartAccountAddress: smartAccount.address,\n            agentAddress: account.address,\n            ownerAddress: wallet.address,\n            chainId,\n            createdAt: new Date().toISOString(),\n            storageMethod,\n          };\n          saveMeta(meta);\n\n          lines.push('Meta rebuilt from connected wallet.');\n          lines.push(`Smart account: \\`${smartAccount.address}\\``);\n          lines.push(`Owner: \\`${wallet.address}\\``);\n        } catch (err) {\n          const msg = err instanceof Error ? err.message : String(err);\n          lines.push(`Meta rebuild failed: ${msg.slice(0, 100)}`);\n          lines.push('Key is stored but /delegator status won\\'t work until meta is rebuilt.');\n          lines.push('Connect your wallet and run /delegator recover again.');\n        }\n      } else {\n        lines.push('No wallet connected — meta not rebuilt.');\n        lines.push('Connect wallet, then run /delegator recover again to rebuild meta.');\n      }\n    } catch {\n      lines.push('**Invalid private key format.**');\n    }\n    return { text: lines.join('\\n') };\n  }\n\n  // Form 2: recover <passphrase> — unlock encrypted keystore\n  const key = loadAgentKey(first);\n  if (key) {\n    lines.push('**Keystore unlocked.**');\n    const meta = loadMeta();\n    if (meta) {\n      lines.push(`Smart account: \\`${meta.smartAccountAddress}\\``);\n    }\n  } else {\n    lines.push('**Failed to unlock.** Wrong passphrase or no encrypted keystore.');\n  }\n\n  return { text: lines.join('\\n') };\n}\n"],"mappings":"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"}