{"version":3,"file":"mode-commands.mjs","names":[],"sources":["../../../src/commands/mode-commands.ts"],"sourcesContent":["/**\n * Mode commands — toggle safety and signing modes.\n *\n * /safemode    — Enable intent confirmation (default)\n * /dangermode  — Disable intent confirmation (agent acts immediately)\n * /walletsign  — Use WalletConnect for signing (default)\n * /autosign    — Use private key for auto-signing (requires CLAWNCHER_PRIVATE_KEY)\n * /mode        — Show current mode status\n */\n\nimport { getUserMode, setSafetyMode, setSigningMode, isReadonly } from '../services/mode-service.js';\nimport { getCredentialVault } from '../services/credential-vault.js';\n\nfunction getSenderId(ctx: any): string {\n  return ctx?.senderId ?? ctx?.from ?? ctx?.metadata?.senderId ?? 'unknown';\n}\n\nexport const safemodeCommand = {\n  name: 'safemode',\n  description: 'Enable intent confirmation — agent confirms before taking any action',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const mode = setSafetyMode(userId, 'safe');\n    return {\n      text: `Safe mode enabled.\n\nThe agent will confirm its intent before executing any action. You'll see a summary of what it plans to do and can approve or reject.\n\nCurrent settings:\n  Intent confirmation: ON\n  Signing: ${mode.signingMode === 'wallet' ? 'WalletConnect (phone approval)' : 'Auto-sign (private key)'}`,\n    };\n  },\n};\n\nexport const dangermodeCommand = {\n  name: 'dangermode',\n  description: 'Disable intent confirmation — agent acts immediately on your requests',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const mode = setSafetyMode(userId, 'danger');\n    // M1: Warn strongly when both dangermode + autosign are active\n    const isDualDanger = mode.signingMode === 'autosign';\n    const signingNote = mode.signingMode === 'wallet'\n      ? 'Transactions still require wallet approval on your phone.'\n      : 'CRITICAL WARNING: With auto-sign enabled, transactions execute without ANY confirmation. ' +\n        'A safety cap of 0.1 ETH per transaction applies in this mode. ' +\n        'Consider using /walletsign for larger amounts.';\n    return {\n      text: `${isDualDanger ? '⚠️ MAXIMUM RISK MODE ⚠️\\n\\n' : ''}Danger mode enabled.\n\nThe agent will act immediately on your requests without confirming intent first.\n\n${signingNote}\n\nCurrent settings:\n  Intent confirmation: OFF\n  Signing: ${mode.signingMode === 'wallet' ? 'WalletConnect (phone approval)' : 'Auto-sign (private key)'}\n\nUse /safemode to re-enable confirmations.`,\n    };\n  },\n};\n\nexport const walletsignCommand = {\n  name: 'walletsign',\n  description: 'Use WalletConnect for transaction signing (phone approval required)',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const mode = setSigningMode(userId, 'wallet');\n    return {\n      text: `Wallet signing enabled.\n\nAll transactions will be sent to your phone wallet for approval. You always have the final say.\n\nCurrent settings:\n  Intent confirmation: ${mode.safetyMode === 'safe' ? 'ON' : 'OFF'}\n  Signing: WalletConnect (phone approval)`,\n    };\n  },\n};\n\nexport const autosignCommand = {\n  name: 'autosign',\n  description: 'Enable auto-signing with private key (no wallet approval needed)',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n\n    // Check if private key is configured\n    if (!getCredentialVault().getSecret('wallet.privateKey', 'mode-commands')) {\n      return {\n        text: `Auto-sign is not available.\n\nA private key (CLAWNCHER_PRIVATE_KEY) must be configured at deploy time to enable auto-signing. This instance uses WalletConnect only.\n\nTo enable auto-sign, set the CLAWNCHER_PRIVATE_KEY environment variable:\n  Fly.io: \\`fly secrets set CLAWNCHER_PRIVATE_KEY=\"0x...\" -a <your-app>\\`\n  Docker: add to your \\`.env\\` file\n\nWARNING: Auto-sign means the agent can execute transactions without your approval. Only use with a dedicated hot wallet containing limited funds.`,\n      };\n    }\n\n    const mode = setSigningMode(userId, 'autosign');\n    return {\n      text: `WARNING: Auto-sign enabled.\n\nTransactions will be signed automatically using the configured private key. NO wallet approval will be requested.\n\nOnly use this with a dedicated hot wallet containing limited funds.\n\nCurrent settings:\n  Intent confirmation: ${mode.safetyMode === 'safe' ? 'ON' : 'OFF'}\n  Signing: Auto-sign (private key)\n\nUse /walletsign to switch back to phone approval.`,\n    };\n  },\n};\n\nexport const readonlyCommand = {\n  name: 'readonly',\n  description: 'Enable read-only mode — no on-chain writes allowed (view portfolio, prices, analytics only)',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const mode = setSafetyMode(userId, 'readonly');\n    return {\n      text: `Read-only mode enabled.\n\nAll on-chain write operations are BLOCKED: swaps, transfers, token launches, approvals, bridging, etc.\n\nYou can still:\n  - Check prices (/portfolio, defi_price)\n  - View balances (defi_balance)\n  - Run analytics (analytics, market_intel)\n  - View cost basis and trade history\n\nUse /safemode or /dangermode to re-enable write operations.\n\nCurrent settings:\n  Mode: READ-ONLY\n  Signing: ${mode.signingMode === 'wallet' ? 'WalletConnect (phone approval)' : 'Auto-sign (private key)'}`,\n    };\n  },\n};\n\nexport const modeCommand = {\n  name: 'mode',\n  description: 'Show current safety and signing mode',\n  acceptsArgs: false,\n  requireAuth: true,\n  handler: async (ctx: any) => {\n    const userId = getSenderId(ctx);\n    const mode = getUserMode(userId);\n    const hasPrivateKey = !!getCredentialVault().getSecret('wallet.privateKey', 'mode-commands');\n\n    const safetyLabel = mode.safetyMode === 'readonly'\n      ? 'READ-ONLY (/readonly)'\n      : mode.safetyMode === 'safe'\n        ? 'ON (/safemode)'\n        : 'OFF (/dangermode)';\n\n    return {\n      text: `Current mode:\n\n  Intent confirmation: ${safetyLabel}\n  Signing: ${mode.signingMode === 'wallet' ? 'WalletConnect (/walletsign)' : 'Auto-sign (/autosign)'}\n  Private key available: ${hasPrivateKey ? 'Yes' : 'No'}\n\nCommands:\n  /safemode    — Confirm before acting\n  /dangermode  — Act immediately\n  /readonly    — View only, no on-chain writes\n  /walletsign  — Phone approval for transactions\n  /autosign    — Auto-sign (requires private key)`,\n    };\n  },\n};\n"],"mappings":";;;;;;;;;;;;AAaA,SAAS,YAAY,KAAkB;AACrC,QAAO,KAAK,YAAY,KAAK,QAAQ,KAAK,UAAU,YAAY;;AAGlE,MAAa,kBAAkB;CAC7B,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,QAAa;AAG3B,SAAO,EACL,MAAM;;;;;;aAFK,cADE,YAAY,IAAI,EACI,OAAO,CAQ5B,gBAAgB,WAAW,mCAAmC,6BAC3E;;CAEJ;AAED,MAAa,oBAAoB;CAC/B,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,QAAa;EAE3B,MAAM,OAAO,cADE,YAAY,IAAI,EACI,SAAS;EAE5C,MAAM,eAAe,KAAK,gBAAgB;EAC1C,MAAM,cAAc,KAAK,gBAAgB,WACrC,8DACA;AAGJ,SAAO,EACL,MAAM,GAAG,eAAe,gCAAgC,GAAG;;;;EAI/D,YAAY;;;;aAID,KAAK,gBAAgB,WAAW,mCAAmC,0BAA0B;;4CAGrG;;CAEJ;AAED,MAAa,oBAAoB;CAC/B,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,QAAa;AAG3B,SAAO,EACL,MAAM;;;;;yBAFK,eADE,YAAY,IAAI,EACK,SAAS,CAOnB,eAAe,SAAS,OAAO,MAAM;4CAE9D;;CAEJ;AAED,MAAa,kBAAkB;CAC7B,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,QAAa;EAC3B,MAAM,SAAS,YAAY,IAAI;AAG/B,MAAI,CAAC,oBAAoB,CAAC,UAAU,qBAAqB,gBAAgB,CACvE,QAAO,EACL,MAAM;;;;;;;;oJASP;AAIH,SAAO,EACL,MAAM;;;;;;;yBAFK,eAAe,QAAQ,WAAW,CASrB,eAAe,SAAS,OAAO,MAAM;;;oDAI9D;;CAEJ;AAED,MAAa,kBAAkB;CAC7B,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,QAAa;AAG3B,SAAO,EACL,MAAM;;;;;;;;;;;;;;aAFK,cADE,YAAY,IAAI,EACI,WAAW,CAgBhC,gBAAgB,WAAW,mCAAmC,6BAC3E;;CAEJ;AAED,MAAa,cAAc;CACzB,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,OAAO,QAAa;EAE3B,MAAM,OAAO,YADE,YAAY,IAAI,CACC;EAChC,MAAM,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,UAAU,qBAAqB,gBAAgB;AAQ5F,SAAO,EACL,MAAM;;yBAPY,KAAK,eAAe,aACpC,0BACA,KAAK,eAAe,SAClB,mBACA,oBAK2B;aACxB,KAAK,gBAAgB,WAAW,gCAAgC,wBAAwB;2BAC1E,gBAAgB,QAAQ,KAAK;;;;;;;oDAQnD;;CAEJ"}