{"version":3,"file":"herd-intelligence.mjs","names":[],"sources":["../../../src/tools/herd-intelligence.ts"],"sourcesContent":["/**\n * Herd Intelligence Tool — on-chain investigation via HerdIntelligence + HalBuilder\n *\n * Investigates contracts, transactions, wallets. Audits token safety.\n * Validates swap routes and fee claims. Profiles counterparties.\n * Searches code, tracks token flows. Manages bookmarks.\n * Simulates operations via HAL expressions.\n *\n * All actions are read-only. Requires HERD_ACCESS_TOKEN for some operations.\n */\n\nimport { Type } from '@sinclair/typebox';\nimport { stringEnum, jsonResult, errorResult, readStringParam } from '../lib/tool-helpers.js';\nimport { checkToolConfig } from '../services/tool-config-service.js';\nimport { getCredentialVault } from '../services/credential-vault.js';\n\nconst ACTIONS = [\n  'investigate', 'audit_token', 'validate_swap', 'validate_claim',\n  'profile_counterparty', 'search_code', 'track_token',\n  'bookmark', 'simulate',\n] as const;\n\nconst HerdSchema = Type.Object({\n  action: stringEnum(ACTIONS, {\n    description:\n      'investigate: auto-detect address/tx and analyze. audit_token: safety audit. ' +\n      'validate_swap: check swap route. validate_claim: check fee claim viability. ' +\n      'profile_counterparty: assess wallet trustworthiness. search_code: search contract source. ' +\n      'track_token: trace token flow for a holder. bookmark: manage bookmarks. ' +\n      'simulate: build HAL simulation expressions.',\n  }),\n  target: Type.Optional(Type.String({\n    description: 'Address (contract/wallet) or transaction hash to investigate',\n  })),\n  token_in: Type.Optional(Type.String({\n    description: 'Token-in address for validate_swap; token address for track_token',\n  })),\n  token_out: Type.Optional(Type.String({\n    description: 'Token-out address for validate_swap',\n  })),\n  amount: Type.Optional(Type.String({\n    description: 'Amount for validate_swap (human-readable, default \"1.0\")',\n  })),\n  pattern: Type.Optional(Type.String({\n    description: 'Search pattern/regex for search_code',\n  })),\n  bookmark_action: Type.Optional(Type.String({\n    description: '\"list\", \"add\", or \"remove\" for bookmark action',\n  })),\n  label: Type.Optional(Type.String({\n    description: 'Label for bookmark add',\n  })),\n  bookmark_type: Type.Optional(Type.String({\n    description: '\"contract\", \"wallet\", or \"transaction\"',\n  })),\n  simulate_type: Type.Optional(Type.String({\n    description: '\"transfer\", \"swap\", \"balance\", \"allowance\", or \"approve\"',\n  })),\n  recipient: Type.Optional(Type.String({\n    description: 'Recipient for simulate transfer; spender for simulate allowance',\n  })),\n  chain: Type.Optional(Type.String({\n    description: '\"base\" or \"ethereum\" (default: \"base\")',\n  })),\n});\n\n// Lazy singleton\nlet _herd: any = null;\n\nasync function getHerd(): Promise<any> {\n  if (_herd) return _herd;\n  const { HerdIntelligence } = await import('@clawnch/clawncher-sdk');\n  _herd = new HerdIntelligence({\n    accessToken: getCredentialVault().getSecret('intel.herd.accessToken', 'herd-intelligence') ?? undefined,\n    blockchain: 'base',\n  });\n  return _herd;\n}\n\nexport function createHerdIntelligenceTool() {\n  return {\n    name: 'herd_intelligence',\n    label: 'Herd Intelligence',\n    ownerOnly: false,\n    description:\n      'On-chain intelligence: investigate contracts, transactions, and wallets. ' +\n      'Audit token safety (rug pull detection, honeypot analysis). ' +\n      'Validate swap routes and fee claims. Profile counterparties. ' +\n      'Search contract source code. Track token flows. All read-only.',\n    parameters: HerdSchema,\n    execute: async (_toolCallId: string, args: unknown) => {\n      // Early check: is the tool configured?\n      const notReady = checkToolConfig('herd_intelligence');\n      if (notReady) return notReady;\n\n      const p = args as Record<string, unknown>;\n      const action = readStringParam(p, 'action', { required: true })!;\n      const chain = (readStringParam(p, 'chain') || 'base') as 'base' | 'ethereum';\n\n      try {\n        const herd = await getHerd();\n\n        // Check availability\n        const available = await herd.isAvailable();\n        if (!available) {\n          return errorResult(\n            'Herd Intelligence service unavailable. Set HERD_ACCESS_TOKEN env var.'\n          );\n        }\n\n        switch (action) {\n          // ── Investigate ─────────────────────────────────────────────\n          case 'investigate': {\n            const target = readStringParam(p, 'target', { required: true })!;\n\n            // Auto-detect: tx hash (66 chars) vs address (42 chars)\n            if (target.length === 66 && target.startsWith('0x')) {\n              const result = await herd.investigateTransaction(target, { blockchain: chain });\n              return jsonResult(result);\n            }\n\n            // Try as contract first, fall back to wallet\n            try {\n              const result = await herd.investigateContract(target, { blockchain: chain });\n              if (result && result.name) return jsonResult(result);\n            } catch {\n              // Not a contract — try as wallet\n            }\n\n            const result = await herd.investigateWallet(target, {\n              blockchain: chain,\n              includeActivity: true,\n            });\n            return jsonResult(result);\n          }\n\n          // ── Audit Token ─────────────────────────────────────────────\n          case 'audit_token': {\n            const target = readStringParam(p, 'target', { required: true })!;\n            const result = await herd.auditTokenSafety(target, { blockchain: chain });\n            return jsonResult(result);\n          }\n\n          // ── Validate Swap ───────────────────────────────────────────\n          case 'validate_swap': {\n            const tokenIn = readStringParam(p, 'token_in') || readStringParam(p, 'target');\n            if (!tokenIn) return errorResult('Provide token_in or target for validate_swap');\n            const tokenOut = readStringParam(p, 'token_out', { required: true })!;\n            const amount = readStringParam(p, 'amount') || '1.0';\n            const result = await herd.validateSwapRoute(tokenIn, tokenOut, amount, {\n              blockchain: chain,\n            });\n            return jsonResult(result);\n          }\n\n          // ── Validate Claim ──────────────────────────────────────────\n          case 'validate_claim': {\n            const target = readStringParam(p, 'target', { required: true })!;\n            const result = await herd.validateFeeClaim(target, { blockchain: chain });\n            return jsonResult(result);\n          }\n\n          // ── Profile Counterparty ────────────────────────────────────\n          case 'profile_counterparty': {\n            const target = readStringParam(p, 'target', { required: true })!;\n            const result = await herd.profileCounterparty(target, { blockchain: chain });\n            return jsonResult(result);\n          }\n\n          // ── Search Code ─────────────────────────────────────────────\n          case 'search_code': {\n            const target = readStringParam(p, 'target', { required: true })!;\n            const pattern = readStringParam(p, 'pattern', { required: true })!;\n            const addresses = target.split(',').map(a => a.trim());\n            const result = await herd.searchCode(addresses, pattern);\n            return jsonResult({ query: pattern, addresses, result });\n          }\n\n          // ── Track Token ─────────────────────────────────────────────\n          case 'track_token': {\n            const holder = readStringParam(p, 'target', { required: true })!;\n            const token = readStringParam(p, 'token_in', { required: true })!;\n            const result = await herd.trackTokenFlow(holder, token, {\n              blockchain: chain,\n            });\n            return jsonResult(result);\n          }\n\n          // ── Bookmarks ───────────────────────────────────────────────\n          case 'bookmark': {\n            const bmAction = readStringParam(p, 'bookmark_action') || 'list';\n\n            if (bmAction === 'list') {\n              const bookmarks = await herd.getBookmarks();\n              return jsonResult({ bookmarks });\n            }\n\n            if (bmAction === 'add') {\n              const target = readStringParam(p, 'target', { required: true })!;\n              const bmType = (readStringParam(p, 'bookmark_type') || 'contract') as any;\n              const label = readStringParam(p, 'label');\n              await herd.bookmark(bmType, target, label, chain);\n              return jsonResult({ status: 'bookmarked', type: bmType, target, label });\n            }\n\n            if (bmAction === 'remove') {\n              const target = readStringParam(p, 'target', { required: true })!;\n              const bmType = (readStringParam(p, 'bookmark_type') || 'contract') as any;\n              await herd.removeBookmark(bmType, target, chain);\n              return jsonResult({ status: 'removed', type: bmType, target });\n            }\n\n            return errorResult(`Unknown bookmark_action: ${bmAction}. Use \"list\", \"add\", or \"remove\".`);\n          }\n\n          // ── Simulate (HAL) ──────────────────────────────────────────\n          case 'simulate': {\n            const simType = readStringParam(p, 'simulate_type', { required: true })!;\n            const { HalBuilder } = await import('@clawnch/clawncher-sdk');\n            const hal = new HalBuilder();\n\n            let expression: any;\n\n            switch (simType) {\n              case 'transfer': {\n                const token = readStringParam(p, 'target', { required: true })!;\n                expression = hal.buildTransferAdapter({ token, blockchain: chain });\n                break;\n              }\n              case 'swap': {\n                const sellToken = readStringParam(p, 'token_in', { required: true })!;\n                const buyToken = readStringParam(p, 'token_out', { required: true })!;\n                expression = hal.buildSwapAction({\n                  sellToken, buyToken, blockchain: chain,\n                  includeApproval: true,\n                });\n                break;\n              }\n              case 'balance': {\n                const token = readStringParam(p, 'target', { required: true })!;\n                expression = hal.buildBalanceReader({ token, blockchain: chain });\n                break;\n              }\n              case 'allowance': {\n                const token = readStringParam(p, 'target', { required: true })!;\n                expression = hal.buildAllowanceReader({\n                  token, blockchain: chain,\n                  spender: readStringParam(p, 'recipient'),\n                });\n                break;\n              }\n              case 'approve': {\n                const token = readStringParam(p, 'target', { required: true })!;\n                expression = hal.buildApproveAdapter({ token, blockchain: chain });\n                break;\n              }\n              default:\n                return errorResult(\n                  `Unknown simulate_type: ${simType}. Use: transfer, swap, balance, allowance, approve`\n                );\n            }\n\n            return jsonResult({\n              simulate_type: simType,\n              expression,\n              note: 'HAL expression built. This can be executed by a HAL runtime.',\n            });\n          }\n\n          default:\n            return errorResult(`Unknown herd_intelligence action: ${action}`);\n        }\n      } catch (err) {\n        return errorResult(`Herd error: ${err instanceof Error ? err.message : String(err)}`);\n      }\n    },\n  };\n}\n"],"mappings":"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"}