@elizaos/plugin-steward-app 2.0.3-beta.6 → 2.0.3-beta.7

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.
Files changed (219) hide show
  1. package/dist/ApprovalQueue.d.ts +18 -0
  2. package/dist/ApprovalQueue.d.ts.map +1 -0
  3. package/dist/ApprovalQueue.js +420 -0
  4. package/dist/ApprovalQueue.js.map +1 -0
  5. package/dist/StewardLogo.d.ts +11 -0
  6. package/dist/StewardLogo.d.ts.map +1 -0
  7. package/dist/StewardLogo.js +36 -0
  8. package/dist/StewardLogo.js.map +1 -0
  9. package/dist/StewardView.d.ts +13 -0
  10. package/dist/StewardView.d.ts.map +1 -0
  11. package/dist/StewardView.helpers.d.ts +15 -0
  12. package/dist/StewardView.helpers.d.ts.map +1 -0
  13. package/dist/StewardView.helpers.js +45 -0
  14. package/dist/StewardView.helpers.js.map +1 -0
  15. package/dist/StewardView.interact.d.ts +2 -0
  16. package/dist/StewardView.interact.d.ts.map +1 -0
  17. package/dist/StewardView.interact.js +54 -0
  18. package/dist/StewardView.interact.js.map +1 -0
  19. package/dist/StewardView.js +249 -0
  20. package/dist/StewardView.js.map +1 -0
  21. package/dist/TransactionHistory.d.ts +22 -0
  22. package/dist/TransactionHistory.d.ts.map +1 -0
  23. package/dist/TransactionHistory.js +361 -0
  24. package/dist/TransactionHistory.js.map +1 -0
  25. package/dist/__fixtures__/steward-sdk-fixtures.d.ts +10 -0
  26. package/dist/__fixtures__/steward-sdk-fixtures.d.ts.map +1 -0
  27. package/dist/__fixtures__/steward-sdk-fixtures.js +60 -0
  28. package/dist/__fixtures__/steward-sdk-fixtures.js.map +1 -0
  29. package/dist/actions/wallet-action-shared.d.ts +15 -0
  30. package/dist/actions/wallet-action-shared.d.ts.map +1 -0
  31. package/dist/actions/wallet-action-shared.js +16 -0
  32. package/dist/actions/wallet-action-shared.js.map +1 -0
  33. package/dist/api/binance-skill-helpers.d.ts +21 -0
  34. package/dist/api/binance-skill-helpers.d.ts.map +1 -0
  35. package/dist/api/binance-skill-helpers.js +790 -0
  36. package/dist/api/binance-skill-helpers.js.map +1 -0
  37. package/dist/api/bsc-trade.d.ts +36 -0
  38. package/dist/api/bsc-trade.d.ts.map +1 -0
  39. package/dist/api/bsc-trade.js +796 -0
  40. package/dist/api/bsc-trade.js.map +1 -0
  41. package/dist/api/trade-safety.d.ts +35 -0
  42. package/dist/api/trade-safety.d.ts.map +1 -0
  43. package/dist/api/trade-safety.js +56 -0
  44. package/dist/api/trade-safety.js.map +1 -0
  45. package/dist/api/tx-service.d.ts +53 -0
  46. package/dist/api/tx-service.d.ts.map +1 -0
  47. package/dist/api/tx-service.js +206 -0
  48. package/dist/api/tx-service.js.map +1 -0
  49. package/dist/api/wallet-bsc-routes.d.ts +63 -0
  50. package/dist/api/wallet-bsc-routes.d.ts.map +1 -0
  51. package/dist/api/wallet-bsc-routes.js +337 -0
  52. package/dist/api/wallet-bsc-routes.js.map +1 -0
  53. package/dist/api/wallet-capability.d.ts +2 -0
  54. package/dist/api/wallet-capability.d.ts.map +1 -0
  55. package/dist/api/wallet-capability.js +15 -0
  56. package/dist/api/wallet-capability.js.map +1 -0
  57. package/dist/api/wallet-dex-prices.d.ts +43 -0
  58. package/dist/api/wallet-dex-prices.d.ts.map +1 -0
  59. package/dist/api/wallet-dex-prices.js +132 -0
  60. package/dist/api/wallet-dex-prices.js.map +1 -0
  61. package/dist/api/wallet-evm-balance.d.ts +72 -0
  62. package/dist/api/wallet-evm-balance.d.ts.map +1 -0
  63. package/dist/api/wallet-evm-balance.js +697 -0
  64. package/dist/api/wallet-evm-balance.js.map +1 -0
  65. package/dist/api/wallet-routes.d.ts +27 -0
  66. package/dist/api/wallet-routes.d.ts.map +1 -0
  67. package/dist/api/wallet-routes.js +556 -0
  68. package/dist/api/wallet-routes.js.map +1 -0
  69. package/dist/api/wallet-rpc.d.ts +73 -0
  70. package/dist/api/wallet-rpc.d.ts.map +1 -0
  71. package/dist/api/wallet-rpc.js +460 -0
  72. package/dist/api/wallet-rpc.js.map +1 -0
  73. package/dist/api/wallet-trade-routes.d.ts +104 -0
  74. package/dist/api/wallet-trade-routes.d.ts.map +1 -0
  75. package/dist/api/wallet-trade-routes.js +353 -0
  76. package/dist/api/wallet-trade-routes.js.map +1 -0
  77. package/dist/api/wallet-trading-profile.d.ts +31 -0
  78. package/dist/api/wallet-trading-profile.d.ts.map +1 -0
  79. package/dist/api/wallet-trading-profile.js +500 -0
  80. package/dist/api/wallet-trading-profile.js.map +1 -0
  81. package/dist/api/wallet.d.ts +60 -0
  82. package/dist/api/wallet.d.ts.map +1 -0
  83. package/dist/api/wallet.js +617 -0
  84. package/dist/api/wallet.js.map +1 -0
  85. package/dist/chain-utils.d.ts +10 -0
  86. package/dist/chain-utils.d.ts.map +1 -0
  87. package/dist/chain-utils.js +81 -0
  88. package/dist/chain-utils.js.map +1 -0
  89. package/dist/components/StewardSpatialView.d.ts +74 -0
  90. package/dist/components/StewardSpatialView.d.ts.map +1 -0
  91. package/dist/components/StewardSpatialView.js +309 -0
  92. package/dist/components/StewardSpatialView.js.map +1 -0
  93. package/dist/index.d.ts +20 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +77 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/plugin.d.ts +21 -0
  98. package/dist/plugin.d.ts.map +1 -0
  99. package/dist/plugin.js +319 -0
  100. package/dist/plugin.js.map +1 -0
  101. package/dist/providers/steward-balance.d.ts +12 -0
  102. package/dist/providers/steward-balance.d.ts.map +1 -0
  103. package/dist/providers/steward-balance.js +85 -0
  104. package/dist/providers/steward-balance.js.map +1 -0
  105. package/dist/providers/steward-receive-address.d.ts +12 -0
  106. package/dist/providers/steward-receive-address.d.ts.map +1 -0
  107. package/dist/providers/steward-receive-address.js +47 -0
  108. package/dist/providers/steward-receive-address.js.map +1 -0
  109. package/dist/register-routes.d.ts +2 -0
  110. package/dist/register-routes.d.ts.map +1 -0
  111. package/dist/register-routes.js +6 -0
  112. package/dist/register-routes.js.map +1 -0
  113. package/dist/register-terminal-view.d.ts +15 -0
  114. package/dist/register-terminal-view.d.ts.map +1 -0
  115. package/dist/register-terminal-view.js +34 -0
  116. package/dist/register-terminal-view.js.map +1 -0
  117. package/dist/routes/steward-bridge.d.ts +202 -0
  118. package/dist/routes/steward-bridge.d.ts.map +1 -0
  119. package/dist/routes/steward-bridge.js +776 -0
  120. package/dist/routes/steward-bridge.js.map +1 -0
  121. package/dist/routes/steward-compat-routes.d.ts +21 -0
  122. package/dist/routes/steward-compat-routes.d.ts.map +1 -0
  123. package/dist/routes/steward-compat-routes.js +350 -0
  124. package/dist/routes/steward-compat-routes.js.map +1 -0
  125. package/dist/routes/wallet-browser-compat-routes.d.ts +6 -0
  126. package/dist/routes/wallet-browser-compat-routes.d.ts.map +1 -0
  127. package/dist/routes/wallet-browser-compat-routes.js +402 -0
  128. package/dist/routes/wallet-browser-compat-routes.js.map +1 -0
  129. package/dist/routes/wallet-bsc-core-routes.d.ts +15 -0
  130. package/dist/routes/wallet-bsc-core-routes.d.ts.map +1 -0
  131. package/dist/routes/wallet-bsc-core-routes.js +59 -0
  132. package/dist/routes/wallet-bsc-core-routes.js.map +1 -0
  133. package/dist/routes/wallet-compat-routes.d.ts +13 -0
  134. package/dist/routes/wallet-compat-routes.d.ts.map +1 -0
  135. package/dist/routes/wallet-compat-routes.js +206 -0
  136. package/dist/routes/wallet-compat-routes.js.map +1 -0
  137. package/dist/routes/wallet-core-routes.d.ts +16 -0
  138. package/dist/routes/wallet-core-routes.d.ts.map +1 -0
  139. package/dist/routes/wallet-core-routes.js +48 -0
  140. package/dist/routes/wallet-core-routes.js.map +1 -0
  141. package/dist/routes/wallet-trade-compat-routes.d.ts +11 -0
  142. package/dist/routes/wallet-trade-compat-routes.d.ts.map +1 -0
  143. package/dist/routes/wallet-trade-compat-routes.js +570 -0
  144. package/dist/routes/wallet-trade-compat-routes.js.map +1 -0
  145. package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts +7 -0
  146. package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts.map +1 -0
  147. package/dist/security/hydrate-wallet-keys-from-platform-store.js +43 -0
  148. package/dist/security/hydrate-wallet-keys-from-platform-store.js.map +1 -0
  149. package/dist/security/wallet-os-store-actions.d.ts +14 -0
  150. package/dist/security/wallet-os-store-actions.d.ts.map +1 -0
  151. package/dist/security/wallet-os-store-actions.js +63 -0
  152. package/dist/security/wallet-os-store-actions.js.map +1 -0
  153. package/dist/services/steward-credentials.d.ts +2 -0
  154. package/dist/services/steward-credentials.d.ts.map +1 -0
  155. package/dist/services/steward-credentials.js +2 -0
  156. package/dist/services/steward-credentials.js.map +1 -0
  157. package/dist/services/steward-evm-account.d.ts +75 -0
  158. package/dist/services/steward-evm-account.d.ts.map +1 -0
  159. package/dist/services/steward-evm-account.js +279 -0
  160. package/dist/services/steward-evm-account.js.map +1 -0
  161. package/dist/services/steward-evm-bridge.d.ts +36 -0
  162. package/dist/services/steward-evm-bridge.d.ts.map +1 -0
  163. package/dist/services/steward-evm-bridge.js +78 -0
  164. package/dist/services/steward-evm-bridge.js.map +1 -0
  165. package/dist/services/steward-sidecar/health-check.d.ts +2 -0
  166. package/dist/services/steward-sidecar/health-check.d.ts.map +1 -0
  167. package/dist/services/steward-sidecar/health-check.js +2 -0
  168. package/dist/services/steward-sidecar/health-check.js.map +1 -0
  169. package/dist/services/steward-sidecar/helpers.d.ts +2 -0
  170. package/dist/services/steward-sidecar/helpers.d.ts.map +1 -0
  171. package/dist/services/steward-sidecar/helpers.js +2 -0
  172. package/dist/services/steward-sidecar/helpers.js.map +1 -0
  173. package/dist/services/steward-sidecar/process-management.d.ts +2 -0
  174. package/dist/services/steward-sidecar/process-management.d.ts.map +1 -0
  175. package/dist/services/steward-sidecar/process-management.js +2 -0
  176. package/dist/services/steward-sidecar/process-management.js.map +1 -0
  177. package/dist/services/steward-sidecar/types.d.ts +2 -0
  178. package/dist/services/steward-sidecar/types.d.ts.map +1 -0
  179. package/dist/services/steward-sidecar/types.js +2 -0
  180. package/dist/services/steward-sidecar/types.js.map +1 -0
  181. package/dist/services/steward-sidecar/wallet-setup.d.ts +2 -0
  182. package/dist/services/steward-sidecar/wallet-setup.d.ts.map +1 -0
  183. package/dist/services/steward-sidecar/wallet-setup.js +2 -0
  184. package/dist/services/steward-sidecar/wallet-setup.js.map +1 -0
  185. package/dist/services/steward-sidecar.d.ts +2 -0
  186. package/dist/services/steward-sidecar.d.ts.map +1 -0
  187. package/dist/services/steward-sidecar.js +2 -0
  188. package/dist/services/steward-sidecar.js.map +1 -0
  189. package/dist/services/steward-wallet.d.ts +25 -0
  190. package/dist/services/steward-wallet.d.ts.map +1 -0
  191. package/dist/services/steward-wallet.js +333 -0
  192. package/dist/services/steward-wallet.js.map +1 -0
  193. package/dist/steward-ui-state.d.ts +14 -0
  194. package/dist/steward-ui-state.d.ts.map +1 -0
  195. package/dist/steward-ui-state.js +46 -0
  196. package/dist/steward-ui-state.js.map +1 -0
  197. package/dist/steward-view-bundle.d.ts +3 -0
  198. package/dist/steward-view-bundle.d.ts.map +1 -0
  199. package/dist/steward-view-bundle.js +7 -0
  200. package/dist/steward-view-bundle.js.map +1 -0
  201. package/dist/types/bsc-trade.d.ts +180 -0
  202. package/dist/types/bsc-trade.d.ts.map +1 -0
  203. package/dist/types/bsc-trade.js +1 -0
  204. package/dist/types/bsc-trade.js.map +1 -0
  205. package/dist/types/index.d.ts +3 -0
  206. package/dist/types/index.d.ts.map +1 -0
  207. package/dist/types/index.js +3 -0
  208. package/dist/types/index.js.map +1 -0
  209. package/dist/types/steward.d.ts +83 -0
  210. package/dist/types/steward.d.ts.map +1 -0
  211. package/dist/types/steward.js +1 -0
  212. package/dist/types/steward.js.map +1 -0
  213. package/dist/ui.d.ts +7 -0
  214. package/dist/ui.d.ts.map +1 -0
  215. package/dist/ui.js +7 -0
  216. package/dist/ui.js.map +1 -0
  217. package/dist/views/bundle.js +601 -0
  218. package/dist/views/bundle.js.map +1 -0
  219. package/package.json +8 -8
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/api/binance-skill-helpers.ts"],"sourcesContent":["/**\n * Binance direct-skill request helpers.\n *\n * Extracted from server.ts. Handles direct dispatch of Binance DeFi skills\n * (meme-rush, trading-signal, token-info, etc.) and fallback action parsing.\n */\n\nimport { extractCompatTextContent } from \"@elizaos/agent\";\nimport {\n type Action,\n type ActionParameters,\n type AgentRuntime,\n type Content,\n type createMessageMemory,\n ModelType,\n} from \"@elizaos/core\";\n\nconst EXPOSED_BINANCE_SKILL_IDS = new Set([\n \"binance-crypto-market-rank\",\n \"binance-meme-rush\",\n \"binance-query-address-info\",\n \"binance-query-token-audit\",\n \"binance-query-token-info\",\n \"binance-trading-signal\",\n]);\n\nfunction shouldExposeBinanceSkillId(skillId: string): boolean {\n const normalized = skillId.trim();\n if (!normalized.startsWith(\"binance-\")) return true;\n return EXPOSED_BINANCE_SKILL_IDS.has(normalized);\n}\n\nexport type FallbackParsedAction = {\n name: string;\n parameters?: ActionParameters;\n};\n\ntype RuntimeActionLike = Pick<\n Action,\n \"name\" | \"similes\" | \"validate\" | \"handler\"\n>;\n\nasync function rewriteFallbackActionText(args: {\n runtime: AgentRuntime;\n actionName: string;\n text: string;\n content?: Content;\n}): Promise<string> {\n const text = args.text.trim();\n if (!text) return args.text;\n const fallback = () => {\n const error =\n typeof args.content?.error === \"string\" && args.content.error.trim()\n ? ` It reported: ${args.content.error.trim()}`\n : \"\";\n return `I ran ${args.actionName} and got a result, but I couldn't format the details cleanly here.${error}`;\n };\n if (typeof args.runtime.useModel !== \"function\") return fallback();\n\n try {\n const raw = await args.runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: [\n \"Rewrite this fallback action output in the assistant character's user-facing voice.\",\n 'Return strict JSON only: {\"response\":\"...\"}.',\n \"\",\n \"Rules:\",\n \"- Preserve status, IDs, names, URLs, counts, errors, warnings, and next steps.\",\n \"- Do not expose raw JSON, shell output, schema names, stack traces, or internal action plumbing unless an exact value is necessary.\",\n \"- Do not claim success if the payload says failed or pending.\",\n \"- Keep it brief and natural.\",\n \"\",\n `Character: ${JSON.stringify({\n name: args.runtime.character?.name,\n system: args.runtime.character?.system,\n bio: args.runtime.character?.bio,\n style: args.runtime.character?.style,\n })}`,\n `Action: ${JSON.stringify(args.actionName)}`,\n `Payload: ${JSON.stringify(text)}`,\n `Metadata: ${JSON.stringify({\n source: args.content?.source,\n actions: args.content?.actions,\n actionStatus: args.content?.actionStatus,\n error: args.content?.error,\n })}`,\n ].join(\"\\n\"),\n maxTokens: 260,\n providerOptions: { eliza: { thinking: \"off\" } },\n });\n const parsed = JSON.parse(String(raw).trim()) as { response?: unknown };\n return typeof parsed.response === \"string\" && parsed.response.trim()\n ? parsed.response.trim()\n : fallback();\n } catch (err) {\n args.runtime.logger?.debug?.(\n {\n src: \"eliza-api\",\n action: args.actionName,\n err: err instanceof Error ? err.message : String(err),\n },\n \"[eliza-api] Fallback action voice rewrite failed\",\n );\n return fallback();\n }\n}\n\nlet ownerBlockFallbackPromise: Promise<RuntimeActionLike | null> | null = null;\n\nasync function resolveBuiltInFallbackAction(\n actionName: string,\n): Promise<RuntimeActionLike | null> {\n if (actionName !== \"BLOCK\") {\n return null;\n }\n\n if (!ownerBlockFallbackPromise) {\n ownerBlockFallbackPromise = import(\"@elizaos/plugin-personal-assistant\")\n .then((mod) => mod.websiteBlockAction ?? null)\n .catch(() => null);\n }\n\n return ownerBlockFallbackPromise;\n}\n\nexport function inferBalanceChainFromText(\n input: string,\n): \"all\" | \"solana\" | \"bsc\" | \"base\" | \"ethereum\" {\n const normalized = input.toLowerCase();\n if (/\\bsol(?:ana)?\\b/.test(normalized)) return \"solana\";\n if (/\\b(bsc|bnb|binance)\\b/.test(normalized)) return \"bsc\";\n if (/\\bbase\\b/.test(normalized)) return \"base\";\n if (/\\b(eth|ethereum)\\b/.test(normalized)) return \"ethereum\";\n return \"all\";\n}\n\nexport function shouldForceCheckBalanceFallback(\n parsedActions: FallbackParsedAction[],\n userText: string,\n responseText: string,\n): boolean {\n const nonReplyActions = parsedActions.filter(\n (a) => a.name !== \"REPLY\" && a.name !== \"NONE\" && a.name !== \"IGNORE\",\n );\n if (nonReplyActions.length > 0) return false;\n\n const combined = `${userText}\\n${responseText}`.toLowerCase();\n const balanceIntent =\n /\\b(balance|wallet|holdings|portfolio|funds|how much)\\b/.test(combined) ||\n /\\b(check(ing)?|look(ing)? up|fetch(ing)?)\\b/.test(combined);\n return balanceIntent;\n}\n\nexport function isBalanceIntent(input: string): boolean {\n const normalized = input.toLowerCase();\n return /\\b(balance|wallet|holdings|portfolio|funds|how much)\\b/.test(\n normalized,\n );\n}\n\nexport function parseFallbackActionBlocks(\n value: unknown,\n _responseText?: string,\n): FallbackParsedAction[] {\n const rawValues: string[] = [];\n if (typeof value === \"string\") {\n rawValues.push(value);\n } else if (Array.isArray(value)) {\n for (const entry of value) {\n if (typeof entry === \"string\" && entry.trim().length > 0) {\n rawValues.push(entry);\n }\n }\n }\n\n const parsed: FallbackParsedAction[] = [];\n for (const raw of rawValues) {\n const normalized = raw.trim().toUpperCase();\n if (/^[A-Z0-9_]+$/.test(normalized)) {\n parsed.push({ name: normalized, parameters: {} });\n }\n }\n\n return parsed;\n}\n\nexport async function executeFallbackParsedActions(\n runtime: AgentRuntime,\n message: ReturnType<typeof createMessageMemory>,\n parsedActions: FallbackParsedAction[],\n appendIncomingText: (incoming: string) => void,\n onActionCallback: (actionTag: string, hasText: boolean) => void,\n options?: {\n getCurrentText?: () => string;\n onCallbackText?: (incoming: string) => void;\n },\n): Promise<void> {\n const runtimeActions = Array.isArray(\n (runtime as { actions?: unknown[] }).actions,\n )\n ? ((runtime as { actions: unknown[] }).actions as RuntimeActionLike[])\n : [];\n\n const lookup = new Map<string, RuntimeActionLike>();\n for (const action of runtimeActions) {\n if (typeof action.name === \"string\")\n lookup.set(action.name.toUpperCase(), action);\n if (!Array.isArray(action.similes)) continue;\n for (const alias of action.similes) {\n if (typeof alias === \"string\") lookup.set(alias.toUpperCase(), action);\n }\n }\n\n for (const parsed of parsedActions) {\n if (\n parsed.name === \"REPLY\" ||\n parsed.name === \"NONE\" ||\n parsed.name === \"IGNORE\"\n ) {\n continue;\n }\n const action =\n lookup.get(parsed.name) ??\n (await resolveBuiltInFallbackAction(parsed.name));\n if (!action || typeof action.handler !== \"function\") continue;\n\n if (typeof action.validate === \"function\") {\n const valid = await Promise.resolve(\n action.validate(runtime, message, undefined),\n );\n if (!valid) continue;\n }\n\n let callbackSeen = false;\n const actionResult = await Promise.resolve(\n action.handler(\n runtime,\n message,\n undefined,\n { parameters: parsed.parameters ?? {} },\n async (content: unknown) => {\n const contentRecord =\n content && typeof content === \"object\"\n ? (content as Record<string, unknown>)\n : {};\n const actionTag =\n typeof contentRecord.action === \"string\"\n ? contentRecord.action\n : parsed.name;\n const chunk =\n contentRecord && typeof contentRecord === \"object\"\n ? extractCompatTextContent(contentRecord as Content)\n : \"\";\n callbackSeen = true;\n onActionCallback(actionTag, Boolean(chunk));\n if (chunk) {\n const voicedChunk = await rewriteFallbackActionText({\n runtime,\n actionName: actionTag,\n text: chunk,\n content: contentRecord as Content,\n });\n (options?.onCallbackText ?? appendIncomingText)(voicedChunk);\n }\n return [];\n },\n [],\n ),\n );\n if (!callbackSeen) {\n const currentText = options?.getCurrentText?.() ?? \"\";\n const actionSucceeded =\n actionResult &&\n typeof actionResult === \"object\" &&\n \"success\" in actionResult\n ? actionResult.success === true\n : undefined;\n const fallbackText =\n actionResult && typeof actionResult === \"object\"\n ? typeof actionResult.text === \"string\"\n ? actionResult.text\n : \"\"\n : \"\";\n const shouldSuppressSuccessFallbackText =\n parsed.name === \"BLOCK\" &&\n actionSucceeded === true &&\n /\\b(block|blocking|self ?control)\\b/i.test(currentText);\n if (fallbackText) {\n onActionCallback(parsed.name, !shouldSuppressSuccessFallbackText);\n if (!shouldSuppressSuccessFallbackText) {\n const voicedFallbackText = await rewriteFallbackActionText({\n runtime,\n actionName: parsed.name,\n text: fallbackText,\n });\n appendIncomingText(\n currentText.trim().length > 0\n ? `\\n\\n${voicedFallbackText}`\n : voicedFallbackText,\n );\n }\n }\n }\n }\n}\n\n/**\n * Keyword-to-slug mapping for implicit Binance skill dispatch.\n * Users don't need to type \"binance-meme-rush\" — natural language triggers work.\n * Order matters: first match wins, so more specific patterns go first.\n */\nconst BINANCE_SKILL_KEYWORD_MAP: Array<{\n pattern: RegExp;\n slug: string;\n}> = [\n // meme-rush: meme tokens, pump.fun, bonding curve, launchpad tokens\n {\n pattern:\n /\\b(?:meme\\s*(?:token|coin|rush)?|pump\\.?fun|four\\.?meme|bonding\\s*curve|launchpad\\s*token|new\\s*(?:token|coin)s?\\s*on|trending\\s*(?:token|coin))/i,\n slug: \"binance-meme-rush\",\n },\n // trading-signal: smart money signals, whale signals\n {\n pattern:\n /\\b(?:(?:trading|smart\\s*money|whale)\\s*signal|signal\\s*(?:list|data))/i,\n slug: \"binance-trading-signal\",\n },\n // crypto-market-rank: market rankings, trending, alpha, leaderboard\n {\n pattern:\n /\\b(?:(?:market|crypto)\\s*rank|leader\\s*board|top\\s*(?:trader|search|token)|alpha\\s*(?:token|rank)|smart\\s*money\\s*(?:rank|inflow))/i,\n slug: \"binance-crypto-market-rank\",\n },\n // query-token-audit: token/contract audit, rug check, security scan\n {\n pattern:\n /\\b(?:(?:token|contract)\\s*audit|audit\\s*(?:this\\s*)?(?:token|contract)|(?:rug|security|safety)\\s*(?:check|scan)|check\\s*(?:this\\s*)?contract)/i,\n slug: \"binance-query-token-audit\",\n },\n // query-token-info: token info, token price, token detail, search token\n {\n pattern:\n /\\b(?:(?:token|coin)\\s*(?:info|detail|price|data|search)|search\\s*(?:token|coin)|look\\s*up\\s*(?:token|coin))/i,\n slug: \"binance-query-token-info\",\n },\n // query-address-info: wallet balance, address info, check wallet\n {\n pattern:\n /\\b(?:(?:wallet|address)\\s*(?:balance|info|detail|holding)|check\\s*(?:this\\s*)?(?:wallet|address)|(?:wallet|address)\\s*check)/i,\n slug: \"binance-query-address-info\",\n },\n];\n\nfunction extractDirectBinanceSkillSlug(userText: string): string | null {\n const normalized = userText.toLowerCase();\n\n // 1. Explicit slug mention: \"use binance-meme-rush ...\"\n const skillMatch = normalized.match(/\\b(binance-[a-z0-9-]+)\\b/);\n if (skillMatch) {\n // Still require an action verb for explicit slugs to avoid false positives\n if (/\\b(use|run|show|fetch|pull|get)\\b/.test(normalized)) {\n return skillMatch[1];\n }\n }\n\n // 2. Implicit keyword matching: \"show me trending meme tokens on BSC\"\n for (const { pattern, slug } of BINANCE_SKILL_KEYWORD_MAP) {\n if (pattern.test(normalized)) {\n return slug;\n }\n }\n\n return null;\n}\n\nfunction pickDirectBinanceLimit(\n userText: string,\n fallback: number,\n max: number,\n): string {\n const matches = userText.match(/\\b([1-9]\\d{0,2})\\b/g);\n if (!matches) return String(fallback);\n for (const raw of matches) {\n const value = Number(raw);\n if (value >= 1 && value <= max) {\n return String(value);\n }\n }\n return String(fallback);\n}\n\nfunction extractExplicitDirectBinanceCount(\n userText: string,\n max: number,\n): number | null {\n const matches = userText.match(/\\b([1-9]\\d{0,2})\\b/g);\n if (!matches) return null;\n for (const raw of matches) {\n const value = Number(raw);\n if (value >= 1 && value <= max) {\n return value;\n }\n }\n return null;\n}\n\nfunction pickDirectBinanceChain(\n userText: string,\n allowed: string[],\n fallback: string,\n): string {\n const normalized = userText.toLowerCase();\n const candidates: Array<[string, RegExp]> = [\n [\"solana\", /\\bsolana\\b|\\bsol\\b|pump\\.fun/],\n [\"bsc\", /\\bbsc\\b|\\bbnb\\b|four\\.meme/],\n [\"base\", /\\bbase\\b/],\n [\"eth\", /\\beth\\b|\\bethereum\\b/],\n ];\n for (const [chain, pattern] of candidates) {\n if (allowed.includes(chain) && pattern.test(normalized)) {\n return chain;\n }\n }\n return fallback;\n}\n\nfunction resolveDirectBinanceMemeRushCommand(userText: string): {\n script: string;\n args: string[];\n} {\n const normalized = userText.toLowerCase();\n const chain = pickDirectBinanceChain(normalized, [\"solana\", \"bsc\"], \"solana\");\n if (\n /topic|topics|narrative|narratives|social rush|hot topic|hot topics/.test(\n normalized,\n )\n ) {\n const type = /rising|inflow/.test(normalized) ? \"rising\" : \"latest\";\n const sort = /inflow/.test(normalized) ? \"inflow\" : \"time\";\n const explicitCount = extractExplicitDirectBinanceCount(normalized, 50);\n return {\n script: \"fetch-topics.sh\",\n args: explicitCount\n ? [chain, type, sort, String(explicitCount)]\n : [chain, type, sort],\n };\n }\n const stage = /migrat/.test(normalized)\n ? \"migrated\"\n : /finaliz|about to migrate/.test(normalized)\n ? \"finalizing\"\n : \"new\";\n const limit = pickDirectBinanceLimit(normalized, 20, 200);\n return { script: \"fetch-trending.sh\", args: [chain, stage, limit] };\n}\n\ntype DirectBinanceScriptResolution =\n | {\n kind: \"run\";\n script: string;\n args: string[];\n }\n | {\n kind: \"ask\";\n text: string;\n };\n\nfunction extractQuotedUserText(userText: string): string | null {\n const quotedMatch = userText.match(/[\"'`“”]([^\"'`“”]{2,120})[\"'`“”]/);\n return quotedMatch?.[1]?.trim() || null;\n}\n\nfunction extractFirstEvmAddress(userText: string): string | null {\n return userText.match(/\\b0x[a-fA-F0-9]{40}\\b/)?.[0] ?? null;\n}\n\nfunction extractFirstSolanaAddress(userText: string): string | null {\n const candidates = userText.match(/\\b[1-9A-HJ-NP-Za-km-z]{32,44}\\b/g) ?? [];\n for (const candidate of candidates) {\n if (\n candidate.toLowerCase().startsWith(\"binance\") ||\n candidate.toLowerCase().startsWith(\"signal\")\n ) {\n continue;\n }\n return candidate;\n }\n return null;\n}\n\nfunction extractDirectBinanceSearchKeyword(userText: string): string | null {\n const quoted = extractQuotedUserText(userText);\n if (quoted) return quoted;\n\n const patterns = [\n /\\bsearch(?: for)?\\s+(.+?)(?:\\s+on\\s+(?:bsc|bnb|solana|sol|base|eth|ethereum)\\b|$)/i,\n /\\bfind\\s+(.+?)(?:\\s+on\\s+(?:bsc|bnb|solana|sol|base|eth|ethereum)\\b|$)/i,\n /\\blook up\\s+(.+?)(?:\\s+on\\s+(?:bsc|bnb|solana|sol|base|eth|ethereum)\\b|$)/i,\n /\\bfor\\s+(.+?)(?:\\s+on\\s+(?:bsc|bnb|solana|sol|base|eth|ethereum)\\b|$)/i,\n ];\n for (const pattern of patterns) {\n const match = userText.match(pattern);\n const value = match?.[1]?.trim();\n if (value) return value.replace(/\\s+/g, \" \").trim();\n }\n\n const cleaned = userText\n .replace(/\\b(binance-[a-z0-9-]+)\\b/gi, \" \")\n .replace(\n /\\b(use|run|show|tell|give|fetch|pull|get|search|find|lookup|look up|query|token|info|market|data|detail|details|price|please|me|and)\\b/gi,\n \" \",\n )\n .replace(/\\b(on|in)\\s+(bsc|bnb|solana|sol|base|eth|ethereum)\\b/gi, \" \")\n .replace(/\\b0x[a-fA-F0-9]{40}\\b/g, \" \")\n .replace(/\\b[1-9A-HJ-NP-Za-km-z]{32,44}\\b/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return cleaned || null;\n}\n\nfunction extractDirectBinanceAddressTarget(userText: string): {\n address: string;\n chain: string | null;\n} | null {\n const solanaAddress = extractFirstSolanaAddress(userText);\n if (solanaAddress) {\n return {\n address: solanaAddress,\n chain: \"solana\",\n };\n }\n\n const evmAddress = extractFirstEvmAddress(userText);\n if (!evmAddress) return null;\n\n const chain = pickDirectBinanceChain(userText, [\"bsc\", \"base\", \"eth\"], \"\");\n return {\n address: evmAddress,\n chain: chain || null,\n };\n}\n\nfunction resolveDirectBinanceTradingSignalCommand(\n userText: string,\n): DirectBinanceScriptResolution {\n const chain = pickDirectBinanceChain(userText, [\"solana\", \"bsc\"], \"solana\");\n const limit = pickDirectBinanceLimit(userText, 20, 100);\n return {\n kind: \"run\",\n script: \"signals.sh\",\n args: [chain, limit],\n };\n}\n\nfunction resolveDirectBinanceCryptoMarketRankCommand(\n userText: string,\n): DirectBinanceScriptResolution {\n const normalized = userText.toLowerCase();\n let type = \"trending\";\n if (/smart money|inflow/.test(normalized)) type = \"smart-money\";\n else if (/trader|leaderboard|pnl|kol/.test(normalized)) type = \"traders\";\n else if (/top search|searched|search ranking/.test(normalized))\n type = \"top-search\";\n else if (/\\balpha\\b/.test(normalized)) type = \"alpha\";\n else if (/stock|tokenized/.test(normalized)) type = \"stock\";\n else if (/meme/.test(normalized)) type = \"meme\";\n\n const chain = pickDirectBinanceChain(\n userText,\n [\"solana\", \"bsc\", \"base\", \"eth\"],\n \"\",\n );\n const limit = pickDirectBinanceLimit(userText, 20, 200);\n\n return {\n kind: \"run\",\n script: \"rankings.sh\",\n args: [type, chain || \"all\", limit],\n };\n}\n\nfunction resolveDirectBinanceTokenInfoCommand(\n userText: string,\n): DirectBinanceScriptResolution {\n const chain = pickDirectBinanceChain(\n userText,\n [\"solana\", \"bsc\", \"base\", \"eth\"],\n \"\",\n );\n const target = extractDirectBinanceAddressTarget(userText);\n if (target?.address) {\n const targetChain = target.chain ?? (chain || null);\n if (targetChain) {\n return {\n kind: \"run\",\n script: \"token-detail.sh\",\n args: [target.address, targetChain],\n };\n }\n return {\n kind: \"run\",\n script: \"search.sh\",\n args: [target.address],\n };\n }\n\n const keyword = extractDirectBinanceSearchKeyword(userText);\n if (!keyword) {\n return {\n kind: \"ask\",\n text: \"Please provide a token keyword, symbol, or contract address for binance-query-token-info.\",\n };\n }\n return {\n kind: \"run\",\n script: \"search.sh\",\n args: chain ? [keyword, chain] : [keyword],\n };\n}\n\nfunction resolveDirectBinanceTokenAuditCommand(\n userText: string,\n): DirectBinanceScriptResolution {\n const target = extractDirectBinanceAddressTarget(userText);\n if (!target?.address) {\n return {\n kind: \"ask\",\n text: \"Please provide a token contract address for binance-query-token-audit.\",\n };\n }\n if (!target.chain) {\n return {\n kind: \"ask\",\n text: \"Please specify the chain for that contract address: BSC, Base, Ethereum, or Solana.\",\n };\n }\n return {\n kind: \"run\",\n script: \"audit.sh\",\n args: [target.address, target.chain],\n };\n}\n\nfunction resolveDirectBinanceAddressInfoCommand(\n userText: string,\n): DirectBinanceScriptResolution {\n const target = extractDirectBinanceAddressTarget(userText);\n if (!target?.address) {\n return {\n kind: \"ask\",\n text: \"Please provide a wallet address for binance-query-address-info.\",\n };\n }\n if (!target.chain) {\n return {\n kind: \"ask\",\n text: \"Please specify the chain for that wallet address: BSC, Base, Ethereum, or Solana.\",\n };\n }\n return {\n kind: \"run\",\n script: \"balances.sh\",\n args: [target.address, target.chain],\n };\n}\n\nfunction resolveDirectBinanceScriptCommand(\n skillSlug: string,\n userText: string,\n): DirectBinanceScriptResolution | null {\n switch (skillSlug) {\n case \"binance-meme-rush\":\n return {\n kind: \"run\",\n ...resolveDirectBinanceMemeRushCommand(userText),\n };\n case \"binance-trading-signal\":\n return resolveDirectBinanceTradingSignalCommand(userText);\n case \"binance-crypto-market-rank\":\n return resolveDirectBinanceCryptoMarketRankCommand(userText);\n case \"binance-query-token-info\":\n return resolveDirectBinanceTokenInfoCommand(userText);\n case \"binance-query-token-audit\":\n return resolveDirectBinanceTokenAuditCommand(userText);\n case \"binance-query-address-info\":\n return resolveDirectBinanceAddressInfoCommand(userText);\n default:\n return null;\n }\n}\n\nconst DIRECT_BINANCE_SUMMARY_INPUT_MAX_CHARS = 12_000;\nconst DIRECT_BINANCE_SUMMARY_DEFAULT_ITEMS = 5;\nconst DIRECT_BINANCE_SUMMARY_MAX_DEPTH = 4;\n\nfunction shouldOmitDirectBinanceSummaryKey(key: string): boolean {\n return (\n /^(?:icon|iconUrl|image|imageUrl|logo|logoUrl|avatar|avatarUrl|cover|coverUrl)$/i.test(\n key,\n ) ||\n /^(?:website|websites|twitter|telegram|discord|medium|social|socials|links?|x)$/i.test(\n key,\n )\n );\n}\n\nfunction compactDirectBinanceSummaryValue(\n value: unknown,\n itemLimit: number,\n depth = 0,\n): unknown {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (depth >= DIRECT_BINANCE_SUMMARY_MAX_DEPTH) {\n if (Array.isArray(value)) {\n return value\n .slice(0, Math.min(itemLimit, 3))\n .map((item) =>\n compactDirectBinanceSummaryValue(item, itemLimit, depth + 1),\n );\n }\n if (typeof value === \"object\") {\n const objectValue = value as Record<string, unknown>;\n const compactObject: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(objectValue).slice(0, 8)) {\n if (shouldOmitDirectBinanceSummaryKey(key)) continue;\n if (\n entry === null ||\n typeof entry === \"string\" ||\n typeof entry === \"number\" ||\n typeof entry === \"boolean\"\n ) {\n compactObject[key] = entry;\n }\n }\n return compactObject;\n }\n return undefined;\n }\n\n if (Array.isArray(value)) {\n return value\n .slice(0, itemLimit)\n .map((item) =>\n compactDirectBinanceSummaryValue(item, itemLimit, depth + 1),\n )\n .filter((item) => item !== undefined);\n }\n\n if (typeof value === \"object\") {\n const objectValue = value as Record<string, unknown>;\n const scalarEntries: Array<[string, unknown]> = [];\n const complexEntries: Array<[string, unknown]> = [];\n for (const [key, entry] of Object.entries(objectValue)) {\n if (shouldOmitDirectBinanceSummaryKey(key)) continue;\n if (\n entry === null ||\n typeof entry === \"string\" ||\n typeof entry === \"number\" ||\n typeof entry === \"boolean\"\n ) {\n scalarEntries.push([key, entry]);\n } else {\n complexEntries.push([key, entry]);\n }\n }\n\n const maxKeys = depth === 0 ? 24 : depth === 1 ? 16 : 10;\n const compactObject: Record<string, unknown> = {};\n for (const [key, entry] of [...scalarEntries, ...complexEntries].slice(\n 0,\n maxKeys,\n )) {\n const compactEntry = compactDirectBinanceSummaryValue(\n entry,\n key === \"data\" ? itemLimit : Math.min(itemLimit, 6),\n depth + 1,\n );\n if (compactEntry === undefined) continue;\n if (Array.isArray(compactEntry) && compactEntry.length === 0) continue;\n if (\n compactEntry &&\n typeof compactEntry === \"object\" &&\n !Array.isArray(compactEntry) &&\n Object.keys(compactEntry as Record<string, unknown>).length === 0\n ) {\n continue;\n }\n compactObject[key] = compactEntry;\n }\n return compactObject;\n }\n\n return String(value);\n}\n\nfunction buildDirectBinanceSummaryInput(\n unwrapped: string,\n explicitCount: number | null,\n): string {\n const itemLimit = explicitCount ?? DIRECT_BINANCE_SUMMARY_DEFAULT_ITEMS;\n try {\n const parsed = JSON.parse(unwrapped) as unknown;\n const compact = compactDirectBinanceSummaryValue(parsed, itemLimit);\n if (compact !== undefined) {\n const compactText = JSON.stringify(compact, null, 2);\n if (compactText.trim()) {\n return compactText;\n }\n }\n } catch {\n // Fall back to raw text for non-JSON outputs.\n }\n return unwrapped;\n}\n\nfunction wantsRawBinanceSkillResult(userText: string): boolean {\n const normalized = userText.toLowerCase();\n return (\n /\\braw\\b/.test(normalized) ||\n /\\bjson\\b/.test(normalized) ||\n /\\bverbatim\\b/.test(normalized) ||\n /\\bfull (?:response|result|output)\\b/.test(normalized) ||\n /\\bexact (?:response|result|output)\\b/.test(normalized)\n );\n}\n\nconst FENCED_JSON_RE_SERVER = /```(?:json)?\\s*\\n([\\s\\S]*?)```/;\n\nfunction unwrapDirectBinanceSkillResult(rawText: string): string {\n const fencedBlocks = Array.from(\n rawText.matchAll(new RegExp(FENCED_JSON_RE_SERVER.source, \"g\")),\n )\n .map((match) => match[1]?.trim() ?? \"\")\n .filter((block) => block.length > 0);\n if (fencedBlocks.length > 0) {\n return fencedBlocks.join(\"\\n\\n\");\n }\n return rawText\n .replace(/^Script executed successfully:\\s*/i, \"\")\n .replace(/^Script execution failed:\\s*/i, \"\")\n .trim();\n}\n\nfunction normalizeDirectBinanceSummaryText(summary: string): string {\n return summary\n .replace(/\\*\\*/g, \"\")\n .replace(/^[ \\t]*[-*][ \\t]+/gm, \"\")\n .replace(/^[ \\t]*\\d+\\.\\s+/gm, \"\")\n .replace(/^#{1,6}\\s+/gm, \"\")\n .replace(\n /\\n?(?:For more details or the raw JSON, feel free to ask\\.?|You can ask for the raw JSON if you want it\\.?|If you need the raw JSON details, feel free to ask\\.?)\\s*$/i,\n \"\",\n )\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nasync function summarizeDirectBinanceSkillResult(\n runtime: AgentRuntime,\n skillSlug: string,\n userText: string,\n rawText: string,\n): Promise<string> {\n const fallback = () =>\n `I ran ${skillSlug} and got a Binance skill result, but I couldn't format the raw details cleanly here.`;\n const unwrapped = unwrapDirectBinanceSkillResult(rawText);\n if (!unwrapped) return fallback();\n const explicitCount = extractExplicitDirectBinanceCount(userText, 50);\n const compactInput = buildDirectBinanceSummaryInput(unwrapped, explicitCount);\n\n const resultSnippet =\n compactInput.length > DIRECT_BINANCE_SUMMARY_INPUT_MAX_CHARS\n ? `${compactInput.slice(0, DIRECT_BINANCE_SUMMARY_INPUT_MAX_CHARS)}\\n\\n[truncated]`\n : compactInput;\n const prompt = [\n \"You are formatting the result of a Binance skill for the end user.\",\n \"The official skill instructions say to run the skill first and then summarize the results.\",\n \"\",\n `User request: ${userText}`,\n `Skill: ${skillSlug}`,\n explicitCount\n ? `The user explicitly requested ${explicitCount} items. Return ${explicitCount} distinct items if the result contains that many.`\n : \"If the user did not request a count, choose a sensible concise amount.\",\n \"\",\n \"Rules:\",\n \"- Answer the user's request directly using only the result below.\",\n \"- Default to a concise summary, not raw JSON.\",\n \"- If the result is a ranking or list, show at most 5 items unless the user explicitly requested a different count.\",\n \"- Output plain text only.\",\n \"- Do not use markdown, bullets, numbered lists, bold markers, or code fences.\",\n \"- Prefer a clean title line followed by compact 'Label: value' lines, with blank lines between items when listing multiple entries.\",\n \"- Do not prefix lines with generic labels like 'Label:' or 'Item:'. Use the actual field name directly.\",\n \"- Mention the chain when it is present in the result.\",\n \"- Ignore icon URLs, image links, and social links unless the user explicitly asked for them.\",\n \"- Do not mention scripts, stdout, code fences, or internal tooling.\",\n \"- Do not invent missing fields. If a field is unavailable, omit it.\",\n \"- If the result is an error, explain it briefly and suggest one next step.\",\n \"- Do not append any follow-up sentence about raw JSON, more details, or next questions.\",\n \"\",\n \"Skill result:\",\n resultSnippet,\n ].join(\"\\n\");\n\n try {\n const summary = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n maxTokens: 700,\n temperature: 0.2,\n });\n const clean = summary?.trim()\n ? normalizeDirectBinanceSummaryText(summary.trim())\n : \"\";\n return clean || fallback();\n } catch (err) {\n runtime.logger?.warn(\n {\n src: \"eliza-api\",\n skillSlug,\n error: err instanceof Error ? err.message : String(err),\n },\n \"[eliza-api] Binance skill summarization failed; suppressing raw output\",\n );\n return fallback();\n }\n}\n\nasync function rewriteRawDirectBinanceSkillResult(\n runtime: AgentRuntime,\n skillSlug: string,\n userText: string,\n rawText: string,\n): Promise<string> {\n const fallback = () =>\n `I ran ${skillSlug} and got the requested raw Binance skill payload, but I couldn't format it safely here.`;\n const unwrapped = unwrapDirectBinanceSkillResult(rawText) || rawText;\n const boundedPayload =\n unwrapped.length > DIRECT_BINANCE_SUMMARY_INPUT_MAX_CHARS\n ? `${unwrapped.slice(0, DIRECT_BINANCE_SUMMARY_INPUT_MAX_CHARS)}\\n\\n[truncated]`\n : unwrapped;\n const prompt = [\n \"Write a brief character-voiced response that includes the requested raw Binance skill payload.\",\n 'Return strict JSON only: {\"response\":\"...\"}.',\n \"\",\n \"Rules:\",\n \"- Preserve the raw payload exactly inside the response as much as possible.\",\n \"- Add only a short natural-language wrapper before the payload.\",\n \"- Do not invent fields, interpretation, or extra analysis.\",\n \"- If the payload is truncated, say it is truncated.\",\n \"\",\n `Character: ${JSON.stringify({\n name: runtime.character?.name,\n system: runtime.character?.system,\n bio: runtime.character?.bio,\n style: runtime.character?.style,\n })}`,\n `User request: ${JSON.stringify(userText)}`,\n `Skill: ${JSON.stringify(skillSlug)}`,\n `Raw payload: ${JSON.stringify(boundedPayload)}`,\n ].join(\"\\n\");\n\n try {\n const raw = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n maxTokens: 900,\n temperature: 0.1,\n providerOptions: { eliza: { thinking: \"off\" } },\n });\n const parsed = JSON.parse(String(raw).trim()) as { response?: unknown };\n return typeof parsed.response === \"string\" && parsed.response.trim()\n ? parsed.response.trim()\n : fallback();\n } catch (err) {\n runtime.logger?.warn?.(\n {\n src: \"eliza-api\",\n skillSlug,\n error: err instanceof Error ? err.message : String(err),\n },\n \"[eliza-api] Binance raw skill rewrite failed; suppressing raw output\",\n );\n return fallback();\n }\n}\n\nexport async function maybeHandleDirectBinanceSkillRequest(\n runtime: AgentRuntime,\n message: ReturnType<typeof createMessageMemory>,\n appendIncomingText: (incoming: string) => void,\n replaceText?: (text: string) => void,\n): Promise<string | null> {\n const userText = extractCompatTextContent(message.content)?.trim();\n if (!userText) return null;\n\n const skillSlug = extractDirectBinanceSkillSlug(userText);\n if (!skillSlug) return null;\n if (!shouldExposeBinanceSkillId(skillSlug)) {\n const visibleSkills = Array.from(EXPOSED_BINANCE_SKILL_IDS)\n .sort()\n .join(\", \");\n return `The Binance skill \"${skillSlug}\" is currently hidden in this build. Available Binance skills: ${visibleSkills}.`;\n }\n\n const service = runtime.getService(\"AGENT_SKILLS_SERVICE\") as\n | {\n getLoadedSkill?: (slug: string) => unknown;\n getLoadedSkills?: () => Array<{ slug?: string }>;\n }\n | undefined;\n const hasSkill =\n typeof service?.getLoadedSkill === \"function\"\n ? Boolean(service.getLoadedSkill(skillSlug))\n : typeof service?.getLoadedSkills === \"function\"\n ? service\n .getLoadedSkills()\n .some(\n (skill) =>\n typeof skill.slug === \"string\" && skill.slug === skillSlug,\n )\n : false;\n if (!hasSkill) return null;\n\n const runtimeActions = Array.isArray(\n (runtime as { actions?: unknown[] }).actions,\n )\n ? ((runtime as { actions: unknown[] }).actions as Array<{\n name?: string;\n handler?: (...args: unknown[]) => unknown;\n }>)\n : [];\n const useSkillAction = runtimeActions.find(\n (action) => action.name === \"USE_SKILL\",\n );\n const command = resolveDirectBinanceScriptCommand(skillSlug, userText);\n if (!command) {\n return null;\n }\n if (command.kind === \"ask\") {\n appendIncomingText(command.text);\n return command.text;\n }\n if (typeof useSkillAction?.handler === \"function\") {\n // Stream a loading hint so the user sees immediate feedback\n const loadingHints: Record<string, string> = {\n \"binance-meme-rush\": \"Fetching meme tokens from Binance...\",\n \"binance-trading-signal\": \"Fetching trading signals...\",\n \"binance-crypto-market-rank\": \"Fetching market rankings...\",\n \"binance-query-token-info\": \"Looking up token info...\",\n \"binance-query-token-audit\": \"Running token audit...\",\n \"binance-query-address-info\": \"Checking wallet balances...\",\n };\n appendIncomingText(loadingHints[skillSlug] ?? \"Fetching Binance data...\");\n\n let directRunText = \"\";\n runtime.logger?.info(\n {\n src: \"eliza-api\",\n action: \"USE_SKILL\",\n skillSlug,\n script: command.script,\n args: command.args,\n },\n `[eliza-api] Direct Binance script dispatch: ${skillSlug}/${command.script}`,\n );\n const runResult = await Promise.resolve(\n useSkillAction.handler(\n runtime,\n message,\n undefined,\n {\n slug: skillSlug,\n mode: \"script\",\n script: command.script,\n args: command.args,\n },\n async (content: unknown) => {\n const chunk =\n content && typeof content === \"object\"\n ? extractCompatTextContent(content as Content)\n : \"\";\n if (!chunk) return [];\n directRunText = chunk;\n return [];\n },\n [],\n ),\n );\n const rawDirectText =\n directRunText.trim().length > 0\n ? directRunText\n : runResult &&\n typeof runResult === \"object\" &&\n \"text\" in runResult &&\n typeof (runResult as { text?: unknown }).text === \"string\"\n ? (runResult as { text: string }).text\n : \"\";\n if (rawDirectText.trim().length > 0) {\n const finalText = wantsRawBinanceSkillResult(userText)\n ? await rewriteRawDirectBinanceSkillResult(\n runtime,\n skillSlug,\n userText,\n rawDirectText,\n )\n : await summarizeDirectBinanceSkillResult(\n runtime,\n skillSlug,\n userText,\n rawDirectText,\n );\n // Replace the loading hint with the actual result via snapshot\n if (replaceText) {\n replaceText(finalText);\n } else {\n appendIncomingText(finalText);\n }\n return finalText;\n }\n }\n return null;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * BSC trade preflight + quote helpers.
3
+ *
4
+ * Safety-first scope:
5
+ * - No execution/signing here.
6
+ * - Validate wallet/rpc/chain/gas/token before producing a quote.
7
+ */
8
+ import type { BscTradePreflightResponse, BscTradeQuoteRequest, BscTradeQuoteResponse, BscUnsignedApprovalTx, BscUnsignedTradeTx } from "@elizaos/core";
9
+ export declare const PANCAKE_SWAP_V2_ROUTER: string;
10
+ export declare const BSC_WBNB_FALLBACK: string;
11
+ export declare const BSC_TESTNET_EXPLORER_BASE_URL = "https://testnet.bscscan.com";
12
+ export interface BscTradeRpcConfig {
13
+ rpcUrls?: string[] | null;
14
+ nodeRealBscRpcUrl?: string | null;
15
+ quickNodeBscRpcUrl?: string | null;
16
+ bscRpcUrl?: string | null;
17
+ cloudManagedAccess?: boolean | null;
18
+ }
19
+ export interface BuildBscTradePreflightInput extends BscTradeRpcConfig {
20
+ walletAddress: string | null;
21
+ tokenAddress?: string | null;
22
+ }
23
+ export interface BuildBscTradeQuoteInput extends BscTradeRpcConfig {
24
+ walletAddress: string | null;
25
+ request: BscTradeQuoteRequest;
26
+ }
27
+ export declare function resolveBscRpcUrls(input: BscTradeRpcConfig): string[];
28
+ export declare function resolvePrimaryBscRpcUrl(input: BscTradeRpcConfig): string | null;
29
+ export declare function readTokenDecimals(rpcUrls: string[], tokenAddress: string): Promise<number>;
30
+ export declare function buildBscTradePreflight(input: BuildBscTradePreflightInput): Promise<BscTradePreflightResponse>;
31
+ export declare function buildBscTradeQuote(input: BuildBscTradeQuoteInput): Promise<BscTradeQuoteResponse>;
32
+ export declare function buildBscBuyUnsignedTx(quote: BscTradeQuoteResponse, recipientAddress: string | null, deadlineSeconds?: number): BscUnsignedTradeTx;
33
+ export declare function buildBscSellUnsignedTx(quote: BscTradeQuoteResponse, recipientAddress: string | null, deadlineSeconds?: number): BscUnsignedTradeTx;
34
+ export declare function buildBscApproveUnsignedTx(tokenAddress: string, ownerAddress: string | null, spenderAddress: string, amountWei: string): BscUnsignedApprovalTx;
35
+ export declare function resolveBscApprovalSpender(quote: Pick<BscTradeQuoteResponse, "routeProvider" | "allowanceTarget" | "routerAddress">): string;
36
+ //# sourceMappingURL=bsc-trade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bsc-trade.d.ts","sourceRoot":"","sources":["../../src/api/bsc-trade.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EAIrB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,eAAe,CAAC;AAmBvB,eAAO,MAAM,sBAAsB,QAElC,CAAC;AACF,eAAO,MAAM,iBAAiB,QAE7B,CAAC;AACF,eAAO,MAAM,6BAA6B,gCAAgC,CAAC;AAgB3E,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,2BAA4B,SAAQ,iBAAiB;IACpE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,oBAAoB,CAAC;CAC/B;AAuFD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,EAAE,CA0BpE;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,iBAAiB,GACvB,MAAM,GAAG,IAAI,CAef;AAyLD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EAAE,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAYjB;AA2GD,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,yBAAyB,CAAC,CAmIpC;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,qBAAqB,CAAC,CAyNhC;AAoBD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,qBAAqB,EAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,eAAe,CAAC,EAAE,MAAM,GACvB,kBAAkB,CA8CpB;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,qBAAqB,EAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,eAAe,CAAC,EAAE,MAAM,GACvB,kBAAkB,CA+CpB;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,GAChB,qBAAqB,CAwCvB;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,IAAI,CACT,qBAAqB,EACrB,eAAe,GAAG,iBAAiB,GAAG,eAAe,CACtD,GACA,MAAM,CAKR"}