{"version":3,"file":"delegate-command.mjs","names":[],"sources":["../../../src/commands/delegate-command.ts"],"sourcesContent":["/**\n * /delegate — On-chain delegation management for policies (EIP-7710).\n *\n * Subcommands:\n *   /delegate                  — show delegation status for all policies\n *   /delegate create <name>    — compile policy to on-chain delegation\n *   /delegate revoke <name>    — revoke on-chain delegation\n *   /delegate status           — show all delegations with chain + hash\n *   /delegate chains           — list supported chains\n *\n * The delegation workflow:\n *   1. User creates a policy via natural language (policy engine)\n *   2. /delegate create <name> compiles the policy to caveats\n *   3. User reviews the compilation and signs (WalletConnect or private key)\n *   4. Signed delegation is stored and can be redeemed on-chain\n *\n * This command does NOT create policies — that's handled by the policy_manage\n * tool via natural language. This command bridges policies to on-chain enforcement.\n */\n\nimport { getPolicyStore } from '../services/policy-store.js';\nimport { isDelegationMode } from '../services/policy-types.js';\nimport { recordCommand } from '../services/command-history.js';\nimport {\n  prepareDelegation,\n  signDelegation,\n  storeDelegation,\n  revokeByPolicy,\n  refreshDelegationStatus,\n  canRedeem,\n  formatDelegationStatus,\n  getDelegatedPolicies,\n  formatSupportedChains,\n} from '../services/delegation-service.js';\nimport { getDelegationStore } from '../services/delegation-store.js';\nimport { buildPolicyDisplay, renderPolicyDisplay } from '../services/policy-evaluator.js';\nimport { CHAIN_NAMES, SUPPORTED_CHAIN_IDS } from '../services/delegation-types.js';\n\nexport const delegateCommand = {\n  name: 'delegate',\n  description: 'On-chain delegation management: /delegate [create|revoke|status|chains] [name]',\n  acceptsArgs: true,\n  requireAuth: true,\n\n  handler: async (ctx?: any) => {\n    // Gate: delegation features require delegation mode\n    if (!isDelegationMode()) {\n      return {\n        text: [\n          'On-chain delegation is not active. You are in **simple** mode —',\n          'policies are enforced at the application layer only.',\n          '',\n          'To enable on-chain delegation: `/policymode delegation`',\n        ].join('\\n'),\n      };\n    }\n\n    const args = (ctx?.args ?? '').trim();\n    const { extractPolicyUserId } = await import('../services/policy-evaluator.js');\n    let userId = extractPolicyUserId(ctx);\n    if (userId === 'owner') {\n      const store = getPolicyStore();\n      if (store.listPolicies('owner').length === 0) {\n        const found = store.findFirstUserWithPolicies();\n        if (found) userId = found;\n      }\n    }\n\n    // No args: show overview\n    if (!args) {\n      return showOverview(userId);\n    }\n\n    // Parse subcommand\n    const parts = args.split(/\\s+/);\n    const sub = parts[0]!.toLowerCase();\n    const rest = parts.slice(1).join(' ');\n\n    switch (sub) {\n      case 'create':\n        return handleCreate(userId, rest, ctx);\n      case 'revoke':\n        return handleRevoke(userId, rest);\n      case 'revoke-all':\n        return handleRevokeAll(userId);\n      case 'permissions':\n        return handleRequestPermissions(userId, rest);\n      case 'status':\n        return showStatus(userId);\n      case 'chains':\n        return showChains();\n      default:\n        // Treat as policy name lookup\n        return showDelegationForPolicy(userId, args);\n    }\n  },\n};\n\n// ─── Show Overview ──────────────────────────────────────────────────────\n\nfunction showOverview(userId: string) {\n  const store = getPolicyStore();\n  const policies = store.listPolicies(userId);\n  const delegated = policies.filter(p => p.delegation != null);\n\n  const lines: string[] = [];\n  lines.push('**On-Chain Delegations (EIP-7710)**');\n  lines.push('');\n\n  if (delegated.length === 0) {\n    lines.push('No policies have been compiled to on-chain delegations yet.');\n    lines.push('');\n    if (policies.length > 0) {\n      lines.push(`You have ${policies.length} polic${policies.length === 1 ? 'y' : 'ies'}. Use \\`/delegate create <name>\\` to compile one to an on-chain delegation.`);\n    } else {\n      lines.push('Create a policy first by describing what you want in plain English, then use `/delegate create <name>` to enforce it on-chain.');\n    }\n    lines.push('');\n    lines.push('**Commands:**');\n    lines.push('  `/delegate create <name>` — compile a policy to a delegation');\n    lines.push('  `/delegate status` — show all delegations');\n    lines.push('  `/delegate chains` — list supported chains');\n    return { text: lines.join('\\n') };\n  }\n\n  lines.push(`${delegated.length} of ${policies.length} polic${policies.length === 1 ? 'y has' : 'ies have'} on-chain delegations:`);\n  lines.push('');\n\n  for (const p of delegated) {\n    lines.push(`**${p.name}** [${p.status.toUpperCase()}]`);\n    if (p.delegation) {\n      lines.push(formatDelegationStatus(p.delegation));\n    }\n    lines.push('');\n  }\n\n  lines.push('---');\n  lines.push('**Commands:**');\n  lines.push('  `/delegate create <name>` — compile a policy to a delegation');\n  lines.push('  `/delegate revoke <name>` — revoke an on-chain delegation');\n  lines.push('  `/delegate revoke-all` — revoke ALL active delegations');\n  lines.push('  `/delegate permissions <name>` — request MetaMask Advanced Permissions');\n  lines.push('  `/delegate status` — detailed delegation status');\n  lines.push('  `/delegate chains` — list supported chains');\n\n  return { text: lines.join('\\n') };\n}\n\n// ─── Create Delegation ──────────────────────────────────────────────────\n\nasync function handleCreate(userId: string, nameAndArgs: string, ctx?: any) {\n  if (!nameAndArgs) {\n    return { text: 'Usage: `/delegate create <policy-name> [--chain <chainId>]`' };\n  }\n\n  // Block in Bankr mode — delegations don't apply to Bankr transactions\n  const { getWalletState } = await import('../services/walletconnect-service.js');\n  const wallet = getWalletState();\n  if (wallet.mode === 'bankr') {\n    return { text: [\n      '**On-chain delegation is not available in Bankr mode.**',\n      '',\n      'Your Bankr wallet sends transactions through',\n      'its own API. On-chain caveats cannot intercept',\n      'those transactions.',\n      '',\n      'Your policies ARE still enforced by the AI',\n      'before execution. For tamper-proof on-chain',\n      'enforcement, set up a delegator account:',\n      '',\n      '1. /delegator create <passphrase>',\n      '2. Fund the smart account address',\n      '3. /delegate create <policy-name>',\n      '4. Ask the agent to send from the',\n      '   delegator account',\n    ].join('\\n') };\n  }\n\n  // Parse optional --chain flag\n  const chainMatch = nameAndArgs.match(/--chain\\s+(\\d+)/);\n  const chainId = chainMatch ? parseInt(chainMatch[1]!, 10) : 8453;\n  const policyName = nameAndArgs.replace(/--chain\\s+\\d+/, '').trim();\n\n  if (!policyName) {\n    return { text: 'Usage: `/delegate create <policy-name> [--chain <chainId>]`' };\n  }\n\n  // Find the policy\n  const store = getPolicyStore();\n  let policy = store.getPolicyByName(userId, policyName);\n  if (!policy) policy = store.getPolicy(userId, policyName);\n  if (!policy) {\n    return { text: `Policy \"${policyName}\" not found. Use \\`/policies\\` to list your policies.` };\n  }\n\n  // Check policy is active — accept if status is 'active' even without confirmedAt\n  // (covers policies created via /policies create or via LLM tool)\n  if (policy.status !== 'active') {\n    return {\n      text: `Policy **${policy.name}** is not active (status: ${policy.status}). Enable it first: /policies enable ${policy.name}`,\n    };\n  }\n\n  // Check chain support\n  if (!SUPPORTED_CHAIN_IDS.has(chainId)) {\n    return {\n      text: `Chain ${chainId} is not supported. Supported chains: ${formatSupportedChains()}`,\n    };\n  }\n\n  // Compile the policy (fetches live ETH price, auto-detects wallet addresses)\n  const result = await prepareDelegation({ policy, chainId });\n\n  if ('error' in result) {\n    return { text: `Compilation failed: ${result.error}` };\n  }\n\n  const lines: string[] = [];\n  lines.push(`**Delegation Preview for \"${policy.name}\"**`);\n  lines.push('');\n  lines.push(result.summary);\n  lines.push('');\n\n  const unmappedNames = result.compilation.unmappedRules.map(u => u.rule.type);\n  const delegation = result.compilation.delegation;\n\n  // Check if wallet is available for signing\n  const hasWallet = delegation.delegator !== ('0x' + '0'.repeat(40));\n\n  if (!hasWallet) {\n    lines.push('---');\n    lines.push('**Next steps:**');\n    lines.push('A connected wallet is needed to sign the delegation.');\n    lines.push('1. Connect a wallet via `/connect` (WalletConnect) or set `CLAWNCHER_PRIVATE_KEY`');\n    lines.push('2. Run `/delegate create ' + policy.name + '` again');\n    lines.push('3. Review and sign the delegation');\n    lines.push('');\n    lines.push('The delegation will be signed by your wallet (delegator) and grant limited');\n    lines.push('permissions to the agent (delegate) according to your policy rules.');\n\n    // Store as unsigned so user can see status\n    policy.delegation = {\n      chainId,\n      hash: '0x',\n      delegationManager: '0xdb9B1e94B5b69Df7e401DDbedE43491141047dB3',\n      status: 'unsigned',\n      delegate: delegation.delegate,\n      delegator: delegation.delegator,\n      salt: delegation.salt.toString(),\n      createdAt: new Date().toISOString(),\n      unmappedRules: unmappedNames.length > 0 ? unmappedNames : undefined,\n    };\n    policy.updatedAt = Date.now();\n    store.savePolicy(policy);\n  } else {\n    // Wallet available — attempt to sign\n    lines.push('Signing delegation...');\n\n    const signResult = await signDelegation(delegation, chainId);\n\n    if ('error' in signResult) {\n      lines.push(`Signing failed: ${signResult.error}`);\n      lines.push('');\n      lines.push('The delegation has been saved as unsigned. You can try again with `/delegate create ' + policy.name + '`.');\n\n      // Store as unsigned\n      policy.delegation = {\n        chainId,\n        hash: '0x',\n        delegationManager: '0xdb9B1e94B5b69Df7e401DDbedE43491141047dB3',\n        status: 'unsigned',\n        delegate: delegation.delegate,\n        delegator: delegation.delegator,\n        salt: delegation.salt.toString(),\n        createdAt: new Date().toISOString(),\n        unmappedRules: unmappedNames.length > 0 ? unmappedNames : undefined,\n      };\n      policy.updatedAt = Date.now();\n      store.savePolicy(policy);\n    } else {\n      // Signing succeeded — store with hash lookup\n      const info = await storeDelegation(\n        policy,\n        userId,\n        signResult.signed,\n        chainId,\n        unmappedNames,\n      );\n\n      lines.push('**Delegation signed and stored.**');\n      lines.push('');\n      lines.push(formatDelegationStatus(info));\n    }\n  }\n\n  return { text: lines.join('\\n') };\n}\n\n// ─── Revoke Delegation ──────────────────────────────────────────────────\n\nasync function handleRevoke(userId: string, name: string) {\n  if (!name) {\n    return { text: 'Usage: `/delegate revoke <policy-name>`' };\n  }\n\n  const store = getPolicyStore();\n  let policy = store.getPolicyByName(userId, name);\n  if (!policy) policy = store.getPolicy(userId, name);\n  if (!policy) {\n    return { text: `Policy \"${name}\" not found.` };\n  }\n\n  if (!policy.delegation) {\n    return { text: `Policy **${policy.name}** has no on-chain delegation to revoke.` };\n  }\n\n  if (policy.delegation.status === 'revoked') {\n    return { text: `Policy **${policy.name}** delegation is already revoked.` };\n  }\n\n  const lines: string[] = [];\n  lines.push(`**Revoking delegation for \"${policy.name}\"**`);\n  lines.push('');\n\n  const result = await revokeByPolicy(policy, userId);\n\n  if ('error' in result) {\n    // On-chain revocation failed but local revocation succeeded\n    lines.push(`On-chain revocation failed: ${result.error}`);\n    lines.push('');\n    lines.push('Delegation has been revoked locally. The on-chain delegation may still be');\n    lines.push('redeemable. Connect the delegator wallet and try again to revoke on-chain.');\n  } else if ('localOnly' in result) {\n    // No full struct stored — could only revoke locally\n    if (policy.delegation.hash && policy.delegation.hash !== '0x') {\n      lines.push('Delegation revoked locally (full delegation struct not available for on-chain revocation).');\n      lines.push(`Chain: ${CHAIN_NAMES[policy.delegation.chainId] ?? policy.delegation.chainId}`);\n      lines.push(`Hash: \\`${policy.delegation.hash}\\``);\n    } else {\n      lines.push('Delegation was unsigned (never submitted on-chain). Marked as revoked locally.');\n    }\n  } else {\n    // On-chain revocation succeeded\n    lines.push('**Delegation revoked on-chain.**');\n    lines.push(`Transaction: \\`${result.txHash}\\``);\n    lines.push(`Chain: ${CHAIN_NAMES[policy.delegation.chainId] ?? policy.delegation.chainId}`);\n    lines.push('');\n    lines.push('The delegation can no longer be redeemed. On-chain enforcement disabled.');\n  }\n\n  return { text: lines.join('\\n') };\n}\n\n// ─── Revoke All ─────────────────────────────────────────────────────────\n\nasync function handleRevokeAll(userId: string) {\n  const delegated = getDelegatedPolicies(userId);\n  const active = delegated.filter(p =>\n    p.delegation && p.delegation.status !== 'revoked',\n  );\n\n  if (active.length === 0) {\n    return { text: 'No active delegations to revoke.' };\n  }\n\n  const lines: string[] = [];\n  lines.push(`**Revoking ${active.length} delegation(s)...**`);\n  lines.push('');\n\n  let succeeded = 0;\n  let failed = 0;\n\n  for (const policy of active) {\n    try {\n      const result = await revokeByPolicy(policy, userId);\n      if ('error' in result) {\n        lines.push(`- **${policy.name}**: failed — ${result.error}`);\n        failed++;\n      } else {\n        const txInfo = 'txHash' in result ? ` (tx: ${result.txHash})` : ' (local only)';\n        lines.push(`- **${policy.name}**: revoked${txInfo}`);\n        succeeded++;\n      }\n    } catch (err) {\n      const msg = err instanceof Error ? err.message : String(err);\n      lines.push(`- **${policy.name}**: error — ${msg.slice(0, 100)}`);\n      failed++;\n    }\n  }\n\n  lines.push('');\n  lines.push(`Done. ${succeeded} revoked, ${failed} failed.`);\n\n  return { text: lines.join('\\n') };\n}\n\n// ─── Request Advanced Permissions (MetaMask ERC-7715) ───────────────────\n\nasync function handleRequestPermissions(userId: string, policyName: string) {\n  const lines: string[] = [];\n\n  if (!policyName) {\n    return { text: 'Usage: `/delegate permissions <policy-name>`\\n\\nRequests Advanced Permissions from MetaMask for the specified policy. The connected MetaMask wallet must be a smart account (EIP-7702).' };\n  }\n\n  const { getWalletState, getWalletClient } = await import('../services/walletconnect-service.js');\n  const wallet = getWalletState();\n\n  if (!wallet.connected || !wallet.address) {\n    return { text: 'No wallet connected. Connect via WalletConnect first.' };\n  }\n\n  // Find the policy\n  const policyStore = getPolicyStore();\n  const policy = policyStore.getPolicyByName(userId, policyName) ?? policyStore.getPolicy(userId, policyName);\n  if (!policy) {\n    return { text: `Policy \"${policyName}\" not found. Use \\`/policies\\` to see available policies.` };\n  }\n\n  const chainId = wallet.chainId ?? 8453;\n  const expiry = Math.floor(Date.now() / 1000) + 604800; // 1 week\n\n  lines.push('**Requesting Advanced Permissions from MetaMask...**');\n  lines.push('');\n  lines.push(`Policy: ${policy.name}`);\n  lines.push(`Chain: ${CHAIN_NAMES[chainId] ?? chainId}`);\n  lines.push(`Expiry: ${new Date(expiry * 1000).toISOString()}`);\n  lines.push('');\n\n  try {\n    const wc = getWalletClient();\n    if (!wc) return { text: 'Wallet client not available.' };\n\n    // Build permission requests from policy rules\n    const { erc7715ProviderActions } = await import('@metamask/smart-accounts-kit/actions');\n    const extendedClient = (wc as any).extend(erc7715ProviderActions());\n\n    // For now, request a native token transfer permission based on policy rules\n    // Future: map each rule type to its corresponding Advanced Permission type\n    const permissionRequests: any[] = [];\n\n    for (const rule of policy.rules) {\n      if (rule.type === 'spending_limit' || rule.type === 'max_amount') {\n        const maxUsd = 'maxAmountUsd' in rule ? rule.maxAmountUsd : 1000;\n        // Approximate USD to ETH (rough conversion for permission request)\n        const ethAmount = BigInt(Math.floor(maxUsd / 3000 * 1e18));\n        permissionRequests.push({\n          chainId,\n          expiry,\n          signer: { type: 'account', data: { address: wallet.address } },\n          permission: {\n            type: 'native-token-transfer',\n            data: { maxAmount: ethAmount },\n          },\n          isAdjustmentAllowed: true,\n        });\n      }\n\n      if (rule.type === 'erc20_limit') {\n        const [whole = '0', frac = ''] = rule.maxAmount.split('.');\n        const paddedFrac = (frac + '0'.repeat(rule.decimals)).slice(0, rule.decimals);\n        const amount = BigInt(whole + paddedFrac);\n        permissionRequests.push({\n          chainId,\n          expiry,\n          signer: { type: 'account', data: { address: wallet.address } },\n          permission: {\n            type: 'erc20-token-periodic',\n            data: {\n              tokenAddress: rule.token,\n              periodAmount: amount,\n              periodDuration: 86400, // 1 day\n              justification: `Policy: ${policy.name}`,\n            },\n          },\n          isAdjustmentAllowed: true,\n        });\n      }\n    }\n\n    if (permissionRequests.length === 0) {\n      lines.push('No policy rules could be mapped to Advanced Permissions.');\n      lines.push('Supported rule types: `spending_limit`, `max_amount`, `erc20_limit`.');\n      return { text: lines.join('\\n') };\n    }\n\n    lines.push(`Requesting ${permissionRequests.length} permission(s)...`);\n    lines.push('MetaMask will prompt for approval.');\n    lines.push('');\n\n    const granted = await extendedClient.requestExecutionPermissions(permissionRequests);\n\n    // Store the granted permissions\n    const { storeGrantedPermissions } = await import('../services/advanced-permissions.js');\n    storeGrantedPermissions(policy.id, granted);\n\n    // Update policy delegation info\n    if (!policy.delegation) {\n      policy.delegation = {\n        chainId,\n        hash: '0xadvanced-permissions',\n        delegationManager: granted[0]?.signerMeta?.delegationManager ?? '',\n        status: 'signed',\n        delegate: wallet.address,\n        delegator: wallet.address,\n        salt: '0',\n        createdAt: new Date().toISOString(),\n      } as any;\n      policyStore.savePolicy(policy);\n    }\n\n    lines.push(`**${granted.length} permission(s) granted.**`);\n    lines.push('');\n    lines.push('The agent can now execute actions within these permissions.');\n    lines.push('Permissions expire in 1 week. Use `/delegate permissions` to renew.');\n  } catch (err) {\n    const msg = err instanceof Error ? err.message : String(err);\n    if (msg.includes('User rejected') || msg.includes('denied')) {\n      lines.push('Permission request was rejected by the user.');\n    } else if (msg.includes('not supported') || msg.includes('does not exist')) {\n      lines.push('**MetaMask does not support Advanced Permissions on this wallet.**');\n      lines.push('');\n      lines.push('Requirements:');\n      lines.push('- MetaMask Flask 13.5.0+ or MetaMask 13.9.0+');\n      lines.push('- Account must be upgraded to a MetaMask Smart Account');\n      lines.push('- Run `/upgrade detect` to check account type');\n    } else {\n      lines.push(`**Permission request failed:** ${msg.slice(0, 200)}`);\n    }\n  }\n\n  return { text: lines.join('\\n') };\n}\n\n// ─── Show Status ────────────────────────────────────────────────────────\n\nasync function showStatus(userId: string) {\n  const delegated = getDelegatedPolicies(userId);\n\n  if (delegated.length === 0) {\n    return { text: 'No delegations found. Use `/delegate create <name>` to compile a policy.' };\n  }\n\n  const lines: string[] = [];\n  lines.push(`**Delegation Status (${delegated.length} delegation${delegated.length !== 1 ? 's' : ''})**`);\n  lines.push('');\n\n  for (const p of delegated) {\n    // Refresh on-chain status if we have a hash\n    if (p.delegation?.hash && p.delegation.hash !== '0x' && p.delegation.status !== 'revoked') {\n      try {\n        await refreshDelegationStatus(p, userId);\n      } catch { /* continue with cached status */ }\n    }\n\n    lines.push(`**${p.name}** [Policy: ${p.status.toUpperCase()}]`);\n    if (p.delegation) {\n      lines.push(formatDelegationStatus(p.delegation));\n\n      // Show redemption readiness\n      const redeemStatus = canRedeem(p.id);\n      if (redeemStatus.ready) {\n        lines.push('  Redemption: READY (full delegation stored)');\n      } else {\n        lines.push(`  Redemption: NOT AVAILABLE (${redeemStatus.reason})`);\n      }\n\n      // On-chain state (best-effort, non-blocking)\n      try {\n        const { checkDelegationsWithOnChain } = await import('../services/delegation-monitor.js');\n        const report = await checkDelegationsWithOnChain(userId);\n        const entry = report.health.find((h: any) => h.policyId === p.id);\n        if (entry?.onChain) {\n          const u = entry.onChain;\n          const parts: string[] = [];\n          if (u.nativeSpentWei !== null) parts.push(`ETH spent: ${Number(u.nativeSpentWei) / 1e18}`);\n          if (u.callCount !== null) parts.push(`calls: ${u.callCount}`);\n          if (u.driftDetected) parts.push(`DRIFT: ${u.driftDetails ?? 'local/on-chain mismatch'}`);\n          if (parts.length > 0) {\n            lines.push(`  On-chain: ${parts.join(', ')}`);\n          }\n        }\n      } catch { /* best-effort — skip if monitor unavailable */ }\n    }\n    lines.push('');\n  }\n\n  return { text: lines.join('\\n') };\n}\n\n// ─── Show Chains ────────────────────────────────────────────────────────\n\nfunction showChains() {\n  const lines: string[] = [];\n  lines.push('**Supported Chains for EIP-7710 Delegations**');\n  lines.push('');\n  lines.push('The MetaMask Delegation Framework contracts are deployed at');\n  lines.push('deterministic addresses on all of these chains:');\n  lines.push('');\n\n  for (const chainId of SUPPORTED_CHAIN_IDS) {\n    const name = CHAIN_NAMES[chainId] ?? 'Unknown';\n    const isTestnet = chainId > 100000;\n    lines.push(`  ${name} (${chainId})${isTestnet ? ' [testnet]' : ''}`);\n  }\n\n  lines.push('');\n  lines.push('Default: Base (8453)');\n  lines.push('Use `--chain <id>` with `/delegate create` to target a specific chain.');\n\n  return { text: lines.join('\\n') };\n}\n\n// ─── Show Delegation For Policy ─────────────────────────────────────────\n\nfunction showDelegationForPolicy(userId: string, nameOrId: string) {\n  const store = getPolicyStore();\n  let policy = store.getPolicyByName(userId, nameOrId);\n  if (!policy) policy = store.getPolicy(userId, nameOrId);\n  if (!policy) {\n    return { text: `Policy \"${nameOrId}\" not found. Use \\`/policies\\` to list all.` };\n  }\n\n  const lines: string[] = [];\n  const display = buildPolicyDisplay(policy, userId);\n  lines.push(renderPolicyDisplay(display));\n  lines.push('');\n\n  if (policy.delegation) {\n    lines.push('**On-chain delegation:**');\n    lines.push(formatDelegationStatus(policy.delegation));\n  } else {\n    lines.push('No on-chain delegation. Use `/delegate create ' + policy.name + '` to create one.');\n  }\n\n  return { text: lines.join('\\n') };\n}\n"],"mappings":"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"}