@waiaas/daemon 2.11.0-rc → 2.11.0-rc.13

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 (224) hide show
  1. package/dist/api/middleware/resolve-asset.d.ts +26 -0
  2. package/dist/api/middleware/resolve-asset.d.ts.map +1 -0
  3. package/dist/api/middleware/resolve-asset.js +81 -0
  4. package/dist/api/middleware/resolve-asset.js.map +1 -0
  5. package/dist/api/routes/actions.d.ts +4 -0
  6. package/dist/api/routes/actions.d.ts.map +1 -1
  7. package/dist/api/routes/actions.js +120 -0
  8. package/dist/api/routes/actions.js.map +1 -1
  9. package/dist/api/routes/admin-auth.d.ts.map +1 -1
  10. package/dist/api/routes/admin-auth.js +4 -1
  11. package/dist/api/routes/admin-auth.js.map +1 -1
  12. package/dist/api/routes/admin-credentials.d.ts +20 -0
  13. package/dist/api/routes/admin-credentials.d.ts.map +1 -0
  14. package/dist/api/routes/admin-credentials.js +115 -0
  15. package/dist/api/routes/admin-credentials.js.map +1 -0
  16. package/dist/api/routes/admin-settings.d.ts.map +1 -1
  17. package/dist/api/routes/admin-settings.js +70 -1
  18. package/dist/api/routes/admin-settings.js.map +1 -1
  19. package/dist/api/routes/admin-wallets.d.ts.map +1 -1
  20. package/dist/api/routes/admin-wallets.js +27 -14
  21. package/dist/api/routes/admin-wallets.js.map +1 -1
  22. package/dist/api/routes/connect-info.d.ts +2 -0
  23. package/dist/api/routes/connect-info.d.ts.map +1 -1
  24. package/dist/api/routes/connect-info.js +32 -1
  25. package/dist/api/routes/connect-info.js.map +1 -1
  26. package/dist/api/routes/credentials.d.ts +20 -0
  27. package/dist/api/routes/credentials.d.ts.map +1 -0
  28. package/dist/api/routes/credentials.js +120 -0
  29. package/dist/api/routes/credentials.js.map +1 -0
  30. package/dist/api/routes/defi-positions.d.ts.map +1 -1
  31. package/dist/api/routes/defi-positions.js +10 -0
  32. package/dist/api/routes/defi-positions.js.map +1 -1
  33. package/dist/api/routes/external-actions.d.ts +19 -0
  34. package/dist/api/routes/external-actions.d.ts.map +1 -0
  35. package/dist/api/routes/external-actions.js +199 -0
  36. package/dist/api/routes/external-actions.js.map +1 -0
  37. package/dist/api/routes/incoming.d.ts.map +1 -1
  38. package/dist/api/routes/incoming.js +2 -1
  39. package/dist/api/routes/incoming.js.map +1 -1
  40. package/dist/api/routes/index.d.ts +3 -0
  41. package/dist/api/routes/index.d.ts.map +1 -1
  42. package/dist/api/routes/index.js +3 -0
  43. package/dist/api/routes/index.js.map +1 -1
  44. package/dist/api/routes/nfts.js +24 -4
  45. package/dist/api/routes/nfts.js.map +1 -1
  46. package/dist/api/routes/openapi-schemas.d.ts +321 -139
  47. package/dist/api/routes/openapi-schemas.d.ts.map +1 -1
  48. package/dist/api/routes/openapi-schemas.js +24 -0
  49. package/dist/api/routes/openapi-schemas.js.map +1 -1
  50. package/dist/api/routes/rpc-proxy.d.ts +55 -0
  51. package/dist/api/routes/rpc-proxy.d.ts.map +1 -0
  52. package/dist/api/routes/rpc-proxy.js +285 -0
  53. package/dist/api/routes/rpc-proxy.js.map +1 -0
  54. package/dist/api/routes/staking.d.ts.map +1 -1
  55. package/dist/api/routes/staking.js +15 -0
  56. package/dist/api/routes/staking.js.map +1 -1
  57. package/dist/api/routes/tokens.d.ts.map +1 -1
  58. package/dist/api/routes/tokens.js +8 -1
  59. package/dist/api/routes/tokens.js.map +1 -1
  60. package/dist/api/routes/transactions.d.ts +35 -0
  61. package/dist/api/routes/transactions.d.ts.map +1 -1
  62. package/dist/api/routes/transactions.js +220 -20
  63. package/dist/api/routes/transactions.js.map +1 -1
  64. package/dist/api/routes/wallet.d.ts.map +1 -1
  65. package/dist/api/routes/wallet.js +18 -4
  66. package/dist/api/routes/wallet.js.map +1 -1
  67. package/dist/api/server.d.ts +2 -0
  68. package/dist/api/server.d.ts.map +1 -1
  69. package/dist/api/server.js +52 -1
  70. package/dist/api/server.js.map +1 -1
  71. package/dist/infrastructure/action/action-provider-registry.d.ts.map +1 -1
  72. package/dist/infrastructure/action/action-provider-registry.js +12 -0
  73. package/dist/infrastructure/action/action-provider-registry.js.map +1 -1
  74. package/dist/infrastructure/credential/credential-crypto.d.ts +43 -0
  75. package/dist/infrastructure/credential/credential-crypto.d.ts.map +1 -0
  76. package/dist/infrastructure/credential/credential-crypto.js +64 -0
  77. package/dist/infrastructure/credential/credential-crypto.js.map +1 -0
  78. package/dist/infrastructure/credential/credential-vault.d.ts +42 -0
  79. package/dist/infrastructure/credential/credential-vault.d.ts.map +1 -0
  80. package/dist/infrastructure/credential/credential-vault.js +235 -0
  81. package/dist/infrastructure/credential/credential-vault.js.map +1 -0
  82. package/dist/infrastructure/credential/index.d.ts +6 -0
  83. package/dist/infrastructure/credential/index.d.ts.map +1 -0
  84. package/dist/infrastructure/credential/index.js +6 -0
  85. package/dist/infrastructure/credential/index.js.map +1 -0
  86. package/dist/infrastructure/database/migrate.d.ts +1 -1
  87. package/dist/infrastructure/database/migrate.d.ts.map +1 -1
  88. package/dist/infrastructure/database/migrate.js +191 -6
  89. package/dist/infrastructure/database/migrate.js.map +1 -1
  90. package/dist/infrastructure/database/schema.d.ts +281 -1
  91. package/dist/infrastructure/database/schema.d.ts.map +1 -1
  92. package/dist/infrastructure/database/schema.js +34 -3
  93. package/dist/infrastructure/database/schema.js.map +1 -1
  94. package/dist/infrastructure/keystore/re-encrypt.d.ts +9 -0
  95. package/dist/infrastructure/keystore/re-encrypt.d.ts.map +1 -1
  96. package/dist/infrastructure/keystore/re-encrypt.js +47 -1
  97. package/dist/infrastructure/keystore/re-encrypt.js.map +1 -1
  98. package/dist/infrastructure/settings/index.d.ts +2 -2
  99. package/dist/infrastructure/settings/index.d.ts.map +1 -1
  100. package/dist/infrastructure/settings/index.js +1 -1
  101. package/dist/infrastructure/settings/index.js.map +1 -1
  102. package/dist/infrastructure/settings/setting-keys.d.ts +16 -2
  103. package/dist/infrastructure/settings/setting-keys.d.ts.map +1 -1
  104. package/dist/infrastructure/settings/setting-keys.js +296 -206
  105. package/dist/infrastructure/settings/setting-keys.js.map +1 -1
  106. package/dist/lifecycle/daemon.d.ts.map +1 -1
  107. package/dist/lifecycle/daemon.js +31 -0
  108. package/dist/lifecycle/daemon.js.map +1 -1
  109. package/dist/notifications/templates/message-templates.d.ts.map +1 -1
  110. package/dist/notifications/templates/message-templates.js +5 -6
  111. package/dist/notifications/templates/message-templates.js.map +1 -1
  112. package/dist/pipeline/database-policy-engine.d.ts +36 -0
  113. package/dist/pipeline/database-policy-engine.d.ts.map +1 -1
  114. package/dist/pipeline/database-policy-engine.js +185 -0
  115. package/dist/pipeline/database-policy-engine.js.map +1 -1
  116. package/dist/pipeline/external-action-pipeline.d.ts +64 -0
  117. package/dist/pipeline/external-action-pipeline.d.ts.map +1 -0
  118. package/dist/pipeline/external-action-pipeline.js +427 -0
  119. package/dist/pipeline/external-action-pipeline.js.map +1 -0
  120. package/dist/pipeline/pipeline.d.ts +4 -0
  121. package/dist/pipeline/pipeline.d.ts.map +1 -1
  122. package/dist/pipeline/resolve-effective-amount-usd.d.ts.map +1 -1
  123. package/dist/pipeline/resolve-effective-amount-usd.js +2 -1
  124. package/dist/pipeline/resolve-effective-amount-usd.js.map +1 -1
  125. package/dist/pipeline/stages.d.ts.map +1 -1
  126. package/dist/pipeline/stages.js +59 -10
  127. package/dist/pipeline/stages.js.map +1 -1
  128. package/dist/rpc-proxy/completion-waiter.d.ts +35 -0
  129. package/dist/rpc-proxy/completion-waiter.d.ts.map +1 -0
  130. package/dist/rpc-proxy/completion-waiter.js +72 -0
  131. package/dist/rpc-proxy/completion-waiter.js.map +1 -0
  132. package/dist/rpc-proxy/dispatcher.d.ts +37 -0
  133. package/dist/rpc-proxy/dispatcher.d.ts.map +1 -0
  134. package/dist/rpc-proxy/dispatcher.js +54 -0
  135. package/dist/rpc-proxy/dispatcher.js.map +1 -0
  136. package/dist/rpc-proxy/index.d.ts +15 -0
  137. package/dist/rpc-proxy/index.d.ts.map +1 -0
  138. package/dist/rpc-proxy/index.js +15 -0
  139. package/dist/rpc-proxy/index.js.map +1 -0
  140. package/dist/rpc-proxy/json-rpc.d.ts +78 -0
  141. package/dist/rpc-proxy/json-rpc.d.ts.map +1 -0
  142. package/dist/rpc-proxy/json-rpc.js +123 -0
  143. package/dist/rpc-proxy/json-rpc.js.map +1 -0
  144. package/dist/rpc-proxy/method-handlers.d.ts +54 -0
  145. package/dist/rpc-proxy/method-handlers.d.ts.map +1 -0
  146. package/dist/rpc-proxy/method-handlers.js +171 -0
  147. package/dist/rpc-proxy/method-handlers.js.map +1 -0
  148. package/dist/rpc-proxy/nonce-tracker.d.ts +39 -0
  149. package/dist/rpc-proxy/nonce-tracker.d.ts.map +1 -0
  150. package/dist/rpc-proxy/nonce-tracker.js +80 -0
  151. package/dist/rpc-proxy/nonce-tracker.js.map +1 -0
  152. package/dist/rpc-proxy/passthrough.d.ts +37 -0
  153. package/dist/rpc-proxy/passthrough.d.ts.map +1 -0
  154. package/dist/rpc-proxy/passthrough.js +86 -0
  155. package/dist/rpc-proxy/passthrough.js.map +1 -0
  156. package/dist/rpc-proxy/sync-pipeline.d.ts +40 -0
  157. package/dist/rpc-proxy/sync-pipeline.d.ts.map +1 -0
  158. package/dist/rpc-proxy/sync-pipeline.js +74 -0
  159. package/dist/rpc-proxy/sync-pipeline.js.map +1 -0
  160. package/dist/rpc-proxy/tx-adapter.d.ts +79 -0
  161. package/dist/rpc-proxy/tx-adapter.d.ts.map +1 -0
  162. package/dist/rpc-proxy/tx-adapter.js +117 -0
  163. package/dist/rpc-proxy/tx-adapter.js.map +1 -0
  164. package/dist/services/async-polling-service.d.ts.map +1 -1
  165. package/dist/services/async-polling-service.js +95 -2
  166. package/dist/services/async-polling-service.js.map +1 -1
  167. package/dist/signing/bootstrap.d.ts +12 -0
  168. package/dist/signing/bootstrap.d.ts.map +1 -0
  169. package/dist/signing/bootstrap.js +15 -0
  170. package/dist/signing/bootstrap.js.map +1 -0
  171. package/dist/signing/capabilities/ecdsa-signer.d.ts +7 -0
  172. package/dist/signing/capabilities/ecdsa-signer.d.ts.map +1 -0
  173. package/dist/signing/capabilities/ecdsa-signer.js +42 -0
  174. package/dist/signing/capabilities/ecdsa-signer.js.map +1 -0
  175. package/dist/signing/capabilities/ed25519-signer.d.ts +7 -0
  176. package/dist/signing/capabilities/ed25519-signer.d.ts.map +1 -0
  177. package/dist/signing/capabilities/ed25519-signer.js +39 -0
  178. package/dist/signing/capabilities/ed25519-signer.js.map +1 -0
  179. package/dist/signing/capabilities/eip712-signer.d.ts +7 -0
  180. package/dist/signing/capabilities/eip712-signer.d.ts.map +1 -0
  181. package/dist/signing/capabilities/eip712-signer.js +35 -0
  182. package/dist/signing/capabilities/eip712-signer.js.map +1 -0
  183. package/dist/signing/capabilities/erc8128-signer.d.ts +7 -0
  184. package/dist/signing/capabilities/erc8128-signer.d.ts.map +1 -0
  185. package/dist/signing/capabilities/erc8128-signer.js +55 -0
  186. package/dist/signing/capabilities/erc8128-signer.js.map +1 -0
  187. package/dist/signing/capabilities/hmac-signer.d.ts +7 -0
  188. package/dist/signing/capabilities/hmac-signer.d.ts.map +1 -0
  189. package/dist/signing/capabilities/hmac-signer.js +32 -0
  190. package/dist/signing/capabilities/hmac-signer.js.map +1 -0
  191. package/dist/signing/capabilities/index.d.ts +13 -0
  192. package/dist/signing/capabilities/index.d.ts.map +1 -0
  193. package/dist/signing/capabilities/index.js +13 -0
  194. package/dist/signing/capabilities/index.js.map +1 -0
  195. package/dist/signing/capabilities/personal-signer.d.ts +7 -0
  196. package/dist/signing/capabilities/personal-signer.d.ts.map +1 -0
  197. package/dist/signing/capabilities/personal-signer.js +35 -0
  198. package/dist/signing/capabilities/personal-signer.js.map +1 -0
  199. package/dist/signing/capabilities/rsa-pss-signer.d.ts +7 -0
  200. package/dist/signing/capabilities/rsa-pss-signer.d.ts.map +1 -0
  201. package/dist/signing/capabilities/rsa-pss-signer.js +35 -0
  202. package/dist/signing/capabilities/rsa-pss-signer.js.map +1 -0
  203. package/dist/signing/index.d.ts +13 -0
  204. package/dist/signing/index.d.ts.map +1 -0
  205. package/dist/signing/index.js +5 -0
  206. package/dist/signing/index.js.map +1 -0
  207. package/dist/signing/registry.d.ts +36 -0
  208. package/dist/signing/registry.d.ts.map +1 -0
  209. package/dist/signing/registry.js +27 -0
  210. package/dist/signing/registry.js.map +1 -0
  211. package/dist/signing/signing-error.d.ts +22 -0
  212. package/dist/signing/signing-error.d.ts.map +1 -0
  213. package/dist/signing/signing-error.js +17 -0
  214. package/dist/signing/signing-error.js.map +1 -0
  215. package/dist/signing/types.d.ts +91 -0
  216. package/dist/signing/types.d.ts.map +1 -0
  217. package/dist/signing/types.js +2 -0
  218. package/dist/signing/types.js.map +1 -0
  219. package/package.json +6 -5
  220. package/public/admin/assets/index-COymjGTe.js +3 -0
  221. package/public/admin/assets/index-CTHU1J8K.css +1 -0
  222. package/public/admin/index.html +4 -2
  223. package/public/admin/assets/index-BpDnuS0k.css +0 -1
  224. package/public/admin/assets/index-By5VUJ-B.js +0 -3
@@ -4,7 +4,7 @@
4
4
  * Each setting has a key (DB storage), category, configPath (for config.toml lookup),
5
5
  * defaultValue (matching DaemonConfigSchema .default()), and isCredential flag.
6
6
  *
7
- * Categories: notifications, rpc, security, daemon, walletconnect, oracle, display, autostop, monitoring, telegram, signing_sdk, incoming, actions
7
+ * Categories: notifications, rpc, security, daemon, walletconnect, oracle, display, autostop, monitoring, telegram, signing_sdk, incoming, actions, rpc_proxy
8
8
  *
9
9
  * @see packages/daemon/src/infrastructure/config/loader.ts for DaemonConfigSchema defaults
10
10
  */
@@ -32,252 +32,294 @@ export const SETTING_CATEGORIES = [
32
32
  'position_tracker',
33
33
  'smart_account',
34
34
  'erc8128',
35
+ 'rpc_proxy',
35
36
  ];
36
37
  // ---------------------------------------------------------------------------
38
+ // Label derivation helper
39
+ // ---------------------------------------------------------------------------
40
+ /**
41
+ * Derive a human-readable label from a setting key's last segment.
42
+ * e.g. 'notifications.telegram_bot_token' -> 'Telegram Bot Token'
43
+ */
44
+ function deriveLabel(key) {
45
+ const lastSegment = key.includes('.') ? key.split('.').pop() : key;
46
+ return lastSegment
47
+ .replace(/_/g, ' ')
48
+ .replace(/\b\w/g, (c) => c.toUpperCase())
49
+ .replace(/\bUrl\b/g, 'URL')
50
+ .replace(/\bRpm\b/g, 'RPM')
51
+ .replace(/\bRpc\b/g, 'RPC')
52
+ .replace(/\bApi\b/g, 'API')
53
+ .replace(/\bSec\b/g, 'Sec')
54
+ .replace(/\bMs\b/g, 'ms')
55
+ .replace(/\bPct\b/g, '%')
56
+ .replace(/\bBps\b/g, 'BPS')
57
+ .replace(/\bUsd\b/g, 'USD')
58
+ .replace(/\bSol\b/g, 'SOL')
59
+ .replace(/\bEth\b/g, 'ETH')
60
+ .replace(/\bEvm\b/g, 'EVM')
61
+ .replace(/\bWss\b/g, 'WSS')
62
+ .replace(/\bIp\b/g, 'IP')
63
+ .replace(/\bSdk\b/g, 'SDK')
64
+ .replace(/\bTtl\b/g, 'TTL')
65
+ .replace(/\bLtv\b/g, 'LTV')
66
+ .replace(/\bHf\b/g, 'HF');
67
+ }
68
+ // ---------------------------------------------------------------------------
37
69
  // Setting Definitions
38
70
  // ---------------------------------------------------------------------------
39
71
  export const SETTING_DEFINITIONS = [
40
72
  // --- notifications category ---
41
- { key: 'notifications.enabled', category: 'notifications', configPath: 'notifications.enabled', defaultValue: 'false', isCredential: false },
42
- { key: 'notifications.telegram_bot_token', category: 'notifications', configPath: 'notifications.telegram_bot_token', defaultValue: '', isCredential: true },
43
- { key: 'notifications.telegram_chat_id', category: 'notifications', configPath: 'notifications.telegram_chat_id', defaultValue: '', isCredential: false },
44
- { key: 'notifications.discord_webhook_url', category: 'notifications', configPath: 'notifications.discord_webhook_url', defaultValue: '', isCredential: true },
45
- { key: 'notifications.ntfy_server', category: 'notifications', configPath: 'notifications.ntfy_server', defaultValue: 'https://ntfy.sh', isCredential: false },
73
+ { key: 'notifications.enabled', category: 'notifications', configPath: 'notifications.enabled', defaultValue: 'false', isCredential: false, label: 'Enabled', description: 'Enable or disable the notification system' },
74
+ { key: 'notifications.telegram_bot_token', category: 'notifications', configPath: 'notifications.telegram_bot_token', defaultValue: '', isCredential: true, label: 'Telegram Bot Token', description: 'Telegram bot API token for sending notifications' },
75
+ { key: 'notifications.telegram_chat_id', category: 'notifications', configPath: 'notifications.telegram_chat_id', defaultValue: '', isCredential: false, label: 'Telegram Chat ID', description: 'Telegram chat/channel ID for notification delivery' },
76
+ { key: 'notifications.discord_webhook_url', category: 'notifications', configPath: 'notifications.discord_webhook_url', defaultValue: '', isCredential: true, label: 'Discord Webhook URL', description: 'Discord webhook URL for sending notifications' },
77
+ { key: 'notifications.ntfy_server', category: 'notifications', configPath: 'notifications.ntfy_server', defaultValue: 'https://ntfy.sh', isCredential: false, label: 'Ntfy Server', description: 'Ntfy server URL for push notifications' },
46
78
  // notifications.ntfy_topic removed in v29.10 -- per-wallet topics are now stored in wallet_apps table
47
- { key: 'notifications.slack_webhook_url', category: 'notifications', configPath: 'notifications.slack_webhook_url', defaultValue: '', isCredential: true },
48
- { key: 'notifications.locale', category: 'notifications', configPath: 'notifications.locale', defaultValue: 'en', isCredential: false },
49
- { key: 'notifications.rate_limit_rpm', category: 'notifications', configPath: 'notifications.rate_limit_rpm', defaultValue: '20', isCredential: false },
50
- { key: 'notifications.notify_categories', category: 'notifications', configPath: 'notifications.notify_categories', defaultValue: '[]', isCredential: false },
51
- { key: 'notifications.notify_events', category: 'notifications', configPath: 'notifications.notify_events', defaultValue: '[]', isCredential: false },
79
+ { key: 'notifications.slack_webhook_url', category: 'notifications', configPath: 'notifications.slack_webhook_url', defaultValue: '', isCredential: true, label: 'Slack Webhook URL', description: 'Slack webhook URL for sending notifications' },
80
+ { key: 'notifications.locale', category: 'notifications', configPath: 'notifications.locale', defaultValue: 'en', isCredential: false, label: 'Locale', description: 'Notification message language (en, ko, etc.)' },
81
+ { key: 'notifications.rate_limit_rpm', category: 'notifications', configPath: 'notifications.rate_limit_rpm', defaultValue: '20', isCredential: false, label: 'Rate Limit RPM', description: 'Maximum notification messages per minute' },
82
+ { key: 'notifications.notify_categories', category: 'notifications', configPath: 'notifications.notify_categories', defaultValue: '[]', isCredential: false, label: 'Notify Categories', description: 'JSON array of notification category filters' },
83
+ { key: 'notifications.notify_events', category: 'notifications', configPath: 'notifications.notify_events', defaultValue: '[]', isCredential: false, label: 'Notify Events', description: 'JSON array of specific notification event filters' },
52
84
  // --- rpc category (Solana 3 + EVM 12) ---
53
- { key: 'rpc.solana_mainnet', category: 'rpc', configPath: 'rpc.solana_mainnet', defaultValue: 'https://api.mainnet-beta.solana.com', isCredential: false },
54
- { key: 'rpc.solana_devnet', category: 'rpc', configPath: 'rpc.solana_devnet', defaultValue: 'https://api.devnet.solana.com', isCredential: false },
55
- { key: 'rpc.solana_testnet', category: 'rpc', configPath: 'rpc.solana_testnet', defaultValue: 'https://api.testnet.solana.com', isCredential: false },
56
- { key: 'rpc.evm_ethereum_mainnet', category: 'rpc', configPath: 'rpc.evm_ethereum_mainnet', defaultValue: 'https://eth.drpc.org', isCredential: false },
57
- { key: 'rpc.evm_ethereum_sepolia', category: 'rpc', configPath: 'rpc.evm_ethereum_sepolia', defaultValue: 'https://sepolia.drpc.org', isCredential: false },
58
- { key: 'rpc.evm_polygon_mainnet', category: 'rpc', configPath: 'rpc.evm_polygon_mainnet', defaultValue: 'https://polygon.drpc.org', isCredential: false },
59
- { key: 'rpc.evm_polygon_amoy', category: 'rpc', configPath: 'rpc.evm_polygon_amoy', defaultValue: 'https://polygon-amoy.drpc.org', isCredential: false },
60
- { key: 'rpc.evm_arbitrum_mainnet', category: 'rpc', configPath: 'rpc.evm_arbitrum_mainnet', defaultValue: 'https://arbitrum.drpc.org', isCredential: false },
61
- { key: 'rpc.evm_arbitrum_sepolia', category: 'rpc', configPath: 'rpc.evm_arbitrum_sepolia', defaultValue: 'https://arbitrum-sepolia.drpc.org', isCredential: false },
62
- { key: 'rpc.evm_optimism_mainnet', category: 'rpc', configPath: 'rpc.evm_optimism_mainnet', defaultValue: 'https://optimism.drpc.org', isCredential: false },
63
- { key: 'rpc.evm_optimism_sepolia', category: 'rpc', configPath: 'rpc.evm_optimism_sepolia', defaultValue: 'https://optimism-sepolia.drpc.org', isCredential: false },
64
- { key: 'rpc.evm_base_mainnet', category: 'rpc', configPath: 'rpc.evm_base_mainnet', defaultValue: 'https://base.drpc.org', isCredential: false },
65
- { key: 'rpc.evm_base_sepolia', category: 'rpc', configPath: 'rpc.evm_base_sepolia', defaultValue: 'https://base-sepolia.drpc.org', isCredential: false },
66
- { key: 'rpc.evm_hyperevm_mainnet', category: 'rpc', configPath: 'rpc.evm_hyperevm_mainnet', defaultValue: 'https://rpc.hyperliquid.xyz/evm', isCredential: false },
67
- { key: 'rpc.evm_hyperevm_testnet', category: 'rpc', configPath: 'rpc.evm_hyperevm_testnet', defaultValue: 'https://rpc.hyperliquid-testnet.xyz/evm', isCredential: false },
85
+ { key: 'rpc.solana_mainnet', category: 'rpc', configPath: 'rpc.solana_mainnet', defaultValue: 'https://api.mainnet-beta.solana.com', isCredential: false, label: 'Solana Mainnet', description: 'Solana mainnet RPC endpoint URL' },
86
+ { key: 'rpc.solana_devnet', category: 'rpc', configPath: 'rpc.solana_devnet', defaultValue: 'https://api.devnet.solana.com', isCredential: false, label: 'Solana Devnet', description: 'Solana devnet RPC endpoint URL' },
87
+ { key: 'rpc.solana_testnet', category: 'rpc', configPath: 'rpc.solana_testnet', defaultValue: 'https://api.testnet.solana.com', isCredential: false, label: 'Solana Testnet', description: 'Solana testnet RPC endpoint URL' },
88
+ { key: 'rpc.evm_ethereum_mainnet', category: 'rpc', configPath: 'rpc.evm_ethereum_mainnet', defaultValue: 'https://eth.drpc.org', isCredential: false, label: 'Ethereum Mainnet', description: 'Ethereum mainnet RPC endpoint URL' },
89
+ { key: 'rpc.evm_ethereum_sepolia', category: 'rpc', configPath: 'rpc.evm_ethereum_sepolia', defaultValue: 'https://sepolia.drpc.org', isCredential: false, label: 'Ethereum Sepolia', description: 'Ethereum Sepolia testnet RPC endpoint URL' },
90
+ { key: 'rpc.evm_polygon_mainnet', category: 'rpc', configPath: 'rpc.evm_polygon_mainnet', defaultValue: 'https://polygon.drpc.org', isCredential: false, label: 'Polygon Mainnet', description: 'Polygon mainnet RPC endpoint URL' },
91
+ { key: 'rpc.evm_polygon_amoy', category: 'rpc', configPath: 'rpc.evm_polygon_amoy', defaultValue: 'https://polygon-amoy.drpc.org', isCredential: false, label: 'Polygon Amoy', description: 'Polygon Amoy testnet RPC endpoint URL' },
92
+ { key: 'rpc.evm_arbitrum_mainnet', category: 'rpc', configPath: 'rpc.evm_arbitrum_mainnet', defaultValue: 'https://arbitrum.drpc.org', isCredential: false, label: 'Arbitrum Mainnet', description: 'Arbitrum mainnet RPC endpoint URL' },
93
+ { key: 'rpc.evm_arbitrum_sepolia', category: 'rpc', configPath: 'rpc.evm_arbitrum_sepolia', defaultValue: 'https://arbitrum-sepolia.drpc.org', isCredential: false, label: 'Arbitrum Sepolia', description: 'Arbitrum Sepolia testnet RPC endpoint URL' },
94
+ { key: 'rpc.evm_optimism_mainnet', category: 'rpc', configPath: 'rpc.evm_optimism_mainnet', defaultValue: 'https://optimism.drpc.org', isCredential: false, label: 'Optimism Mainnet', description: 'Optimism mainnet RPC endpoint URL' },
95
+ { key: 'rpc.evm_optimism_sepolia', category: 'rpc', configPath: 'rpc.evm_optimism_sepolia', defaultValue: 'https://optimism-sepolia.drpc.org', isCredential: false, label: 'Optimism Sepolia', description: 'Optimism Sepolia testnet RPC endpoint URL' },
96
+ { key: 'rpc.evm_base_mainnet', category: 'rpc', configPath: 'rpc.evm_base_mainnet', defaultValue: 'https://base.drpc.org', isCredential: false, label: 'Base Mainnet', description: 'Base mainnet RPC endpoint URL' },
97
+ { key: 'rpc.evm_base_sepolia', category: 'rpc', configPath: 'rpc.evm_base_sepolia', defaultValue: 'https://base-sepolia.drpc.org', isCredential: false, label: 'Base Sepolia', description: 'Base Sepolia testnet RPC endpoint URL' },
98
+ { key: 'rpc.evm_hyperevm_mainnet', category: 'rpc', configPath: 'rpc.evm_hyperevm_mainnet', defaultValue: 'https://rpc.hyperliquid.xyz/evm', isCredential: false, label: 'HyperEVM Mainnet', description: 'HyperEVM mainnet RPC endpoint URL' },
99
+ { key: 'rpc.evm_hyperevm_testnet', category: 'rpc', configPath: 'rpc.evm_hyperevm_testnet', defaultValue: 'https://rpc.hyperliquid-testnet.xyz/evm', isCredential: false, label: 'HyperEVM Testnet', description: 'HyperEVM testnet RPC endpoint URL' },
68
100
  // --- security category ---
69
- { key: 'security.max_sessions_per_wallet', category: 'security', configPath: 'security.max_sessions_per_wallet', defaultValue: '5', isCredential: false },
70
- { key: 'security.max_pending_tx', category: 'security', configPath: 'security.max_pending_tx', defaultValue: '10', isCredential: false },
71
- { key: 'security.rate_limit_global_ip_rpm', category: 'security', configPath: 'security.rate_limit_global_ip_rpm', defaultValue: '1000', isCredential: false },
72
- { key: 'security.rate_limit_session_rpm', category: 'security', configPath: 'security.rate_limit_session_rpm', defaultValue: '300', isCredential: false },
73
- { key: 'security.rate_limit_tx_rpm', category: 'security', configPath: 'security.rate_limit_tx_rpm', defaultValue: '10', isCredential: false },
74
- { key: 'security.policy_defaults_delay_seconds', category: 'security', configPath: 'security.policy_defaults_delay_seconds', defaultValue: '300', isCredential: false },
75
- { key: 'security.policy_defaults_approval_timeout', category: 'security', configPath: 'security.policy_defaults_approval_timeout', defaultValue: '3600', isCredential: false },
101
+ { key: 'security.max_sessions_per_wallet', category: 'security', configPath: 'security.max_sessions_per_wallet', defaultValue: '5', isCredential: false, label: 'Max Sessions Per Wallet', description: 'Maximum concurrent sessions allowed per wallet' },
102
+ { key: 'security.max_pending_tx', category: 'security', configPath: 'security.max_pending_tx', defaultValue: '10', isCredential: false, label: 'Max Pending Tx', description: 'Maximum pending transactions allowed per wallet' },
103
+ { key: 'security.rate_limit_global_ip_rpm', category: 'security', configPath: 'security.rate_limit_global_ip_rpm', defaultValue: '1000', isCredential: false, label: 'Rate Limit Global IP RPM', description: 'Rate limit: maximum requests per minute' },
104
+ { key: 'security.rate_limit_session_rpm', category: 'security', configPath: 'security.rate_limit_session_rpm', defaultValue: '300', isCredential: false, label: 'Rate Limit Session RPM', description: 'Rate limit: maximum requests per minute' },
105
+ { key: 'security.rate_limit_tx_rpm', category: 'security', configPath: 'security.rate_limit_tx_rpm', defaultValue: '10', isCredential: false, label: 'Rate Limit Tx RPM', description: 'Rate limit: maximum requests per minute' },
106
+ { key: 'security.policy_defaults_delay_seconds', category: 'security', configPath: 'security.policy_defaults_delay_seconds', defaultValue: '300', isCredential: false, label: 'Policy Defaults Delay Seconds', description: 'Default delay duration for DELAY tier transactions' },
107
+ { key: 'security.policy_defaults_approval_timeout', category: 'security', configPath: 'security.policy_defaults_approval_timeout', defaultValue: '3600', isCredential: false, label: 'Policy Defaults Approval Timeout', description: 'Timeout duration in seconds' },
76
108
  // --- policy default deny toggles (Phase 116) ---
77
- { key: 'policy.default_deny_tokens', category: 'policy', configPath: 'security.default_deny_tokens', defaultValue: 'true', isCredential: false },
78
- { key: 'policy.default_deny_contracts', category: 'policy', configPath: 'security.default_deny_contracts', defaultValue: 'true', isCredential: false },
79
- { key: 'policy.default_deny_spenders', category: 'policy', configPath: 'security.default_deny_spenders', defaultValue: 'true', isCredential: false },
80
- { key: 'policy.default_deny_x402_domains', category: 'policy', configPath: 'security.default_deny_x402_domains', defaultValue: 'true', isCredential: false },
81
- { key: 'policy.default_deny_erc8128_domains', category: 'policy', configPath: 'security.default_deny_erc8128_domains', defaultValue: 'true', isCredential: false },
109
+ { key: 'policy.default_deny_tokens', category: 'policy', configPath: 'security.default_deny_tokens', defaultValue: 'true', isCredential: false, label: 'Default Deny Tokens', description: 'Deny all tokens not in ALLOWED_TOKENS policy' },
110
+ { key: 'policy.default_deny_contracts', category: 'policy', configPath: 'security.default_deny_contracts', defaultValue: 'true', isCredential: false, label: 'Default Deny Contracts', description: 'Deny all contracts not in CONTRACT_WHITELIST policy' },
111
+ { key: 'policy.default_deny_spenders', category: 'policy', configPath: 'security.default_deny_spenders', defaultValue: 'true', isCredential: false, label: 'Default Deny Spenders', description: 'Deny all spenders not in APPROVED_SPENDERS policy' },
112
+ { key: 'policy.default_deny_x402_domains', category: 'policy', configPath: 'security.default_deny_x402_domains', defaultValue: 'true', isCredential: false, label: 'Default Deny X402 Domains', description: 'Deny all x402 domains not in X402_ALLOWED_DOMAINS policy' },
113
+ { key: 'policy.default_deny_erc8128_domains', category: 'policy', configPath: 'security.default_deny_erc8128_domains', defaultValue: 'true', isCredential: false, label: 'Default Deny Erc8128 Domains', description: 'Deny all ERC-8128 domains not in allowed list' },
114
+ // --- Phase 389: venue whitelist toggle ---
115
+ { key: 'venue_whitelist_enabled', category: 'policy', configPath: 'security.venue_whitelist_enabled', defaultValue: 'false', isCredential: false, label: 'Venue Whitelist Enabled', description: 'Enable or disable this feature' },
82
116
  // --- daemon category ---
83
- { key: 'daemon.log_level', category: 'daemon', configPath: 'daemon.log_level', defaultValue: 'info', isCredential: false },
117
+ { key: 'daemon.log_level', category: 'daemon', configPath: 'daemon.log_level', defaultValue: 'info', isCredential: false, label: 'Log Level', description: 'Daemon log verbosity level (debug, info, warn, error)' },
84
118
  // --- walletconnect category ---
85
- { key: 'walletconnect.project_id', category: 'walletconnect', configPath: 'walletconnect.project_id', defaultValue: '', isCredential: false },
86
- { key: 'walletconnect.relay_url', category: 'walletconnect', configPath: 'walletconnect.relay_url', defaultValue: 'wss://relay.walletconnect.com', isCredential: false },
119
+ { key: 'walletconnect.project_id', category: 'walletconnect', configPath: 'walletconnect.project_id', defaultValue: '', isCredential: false, label: 'Project Id', description: 'WalletConnect Cloud project ID' },
120
+ { key: 'walletconnect.relay_url', category: 'walletconnect', configPath: 'walletconnect.relay_url', defaultValue: 'wss://relay.walletconnect.com', isCredential: false, label: 'Relay URL', description: 'WalletConnect relay server WebSocket URL' },
87
121
  // --- oracle category ---
88
- { key: 'oracle.coingecko_api_key', category: 'oracle', configPath: 'oracle.coingecko_api_key', defaultValue: '', isCredential: true },
89
- { key: 'oracle.cross_validation_threshold', category: 'oracle', configPath: 'oracle.cross_validation_threshold', defaultValue: '5', isCredential: false },
122
+ { key: 'oracle.coingecko_api_key', category: 'oracle', configPath: 'oracle.coingecko_api_key', defaultValue: '', isCredential: true, label: 'Coingecko API Key', description: 'API key for external service authentication' },
123
+ { key: 'oracle.cross_validation_threshold', category: 'oracle', configPath: 'oracle.cross_validation_threshold', defaultValue: '5', isCredential: false, label: 'Cross Validation Threshold', description: 'Threshold value for triggering action' },
90
124
  // --- display category ---
91
- { key: 'display.currency', category: 'display', configPath: 'display.currency', defaultValue: 'USD', isCredential: false },
125
+ { key: 'display.currency', category: 'display', configPath: 'display.currency', defaultValue: 'USD', isCredential: false, label: 'Currency', description: 'Display currency for USD value conversions' },
92
126
  // --- autostop category (AUTO-05 runtime-overridable) ---
93
- { key: 'autostop.consecutive_failures_threshold', category: 'autostop', configPath: 'security.autostop_consecutive_failures_threshold', defaultValue: '5', isCredential: false },
94
- { key: 'autostop.unusual_activity_threshold', category: 'autostop', configPath: 'security.autostop_unusual_activity_threshold', defaultValue: '20', isCredential: false },
95
- { key: 'autostop.unusual_activity_window_sec', category: 'autostop', configPath: 'security.autostop_unusual_activity_window_sec', defaultValue: '300', isCredential: false },
96
- { key: 'autostop.idle_timeout_sec', category: 'autostop', configPath: 'security.autostop_idle_timeout_sec', defaultValue: '3600', isCredential: false },
97
- { key: 'autostop.idle_check_interval_sec', category: 'autostop', configPath: 'security.autostop_idle_check_interval_sec', defaultValue: '60', isCredential: false },
98
- { key: 'autostop.enabled', category: 'autostop', configPath: 'security.autostop_enabled', defaultValue: 'true', isCredential: false },
127
+ { key: 'autostop.consecutive_failures_threshold', category: 'autostop', configPath: 'security.autostop_consecutive_failures_threshold', defaultValue: '5', isCredential: false, label: 'Consecutive Failures Threshold', description: 'Threshold value for triggering action' },
128
+ { key: 'autostop.unusual_activity_threshold', category: 'autostop', configPath: 'security.autostop_unusual_activity_threshold', defaultValue: '20', isCredential: false, label: 'Unusual Activity Threshold', description: 'Threshold value for triggering action' },
129
+ { key: 'autostop.unusual_activity_window_sec', category: 'autostop', configPath: 'security.autostop_unusual_activity_window_sec', defaultValue: '300', isCredential: false, label: 'Unusual Activity Window Sec', description: 'Time window for unusual activity detection' },
130
+ { key: 'autostop.idle_timeout_sec', category: 'autostop', configPath: 'security.autostop_idle_timeout_sec', defaultValue: '3600', isCredential: false, label: 'Idle Timeout Sec', description: 'Timeout duration in seconds' },
131
+ { key: 'autostop.idle_check_interval_sec', category: 'autostop', configPath: 'security.autostop_idle_check_interval_sec', defaultValue: '60', isCredential: false, label: 'Idle Check Interval Sec', description: 'Polling or check interval duration' },
132
+ { key: 'autostop.enabled', category: 'autostop', configPath: 'security.autostop_enabled', defaultValue: 'true', isCredential: false, label: 'Enabled', description: 'Enable or disable this feature' },
99
133
  // --- autostop per-rule enable (PLUG-04) ---
100
- { key: 'autostop.rule.consecutive_failures.enabled', category: 'autostop', configPath: 'security.autostop_rule_consecutive_failures_enabled', defaultValue: 'true', isCredential: false },
101
- { key: 'autostop.rule.unusual_activity.enabled', category: 'autostop', configPath: 'security.autostop_rule_unusual_activity_enabled', defaultValue: 'true', isCredential: false },
102
- { key: 'autostop.rule.idle_timeout.enabled', category: 'autostop', configPath: 'security.autostop_rule_idle_timeout_enabled', defaultValue: 'true', isCredential: false },
134
+ { key: 'autostop.rule.consecutive_failures.enabled', category: 'autostop', configPath: 'security.autostop_rule_consecutive_failures_enabled', defaultValue: 'true', isCredential: false, label: 'Enabled', description: 'Enable or disable this feature' },
135
+ { key: 'autostop.rule.unusual_activity.enabled', category: 'autostop', configPath: 'security.autostop_rule_unusual_activity_enabled', defaultValue: 'true', isCredential: false, label: 'Enabled', description: 'Enable or disable this feature' },
136
+ { key: 'autostop.rule.idle_timeout.enabled', category: 'autostop', configPath: 'security.autostop_rule_idle_timeout_enabled', defaultValue: 'true', isCredential: false, label: 'Enabled', description: 'Enable or disable this feature' },
103
137
  // --- monitoring category (BMON-05 runtime-overridable) ---
104
- { key: 'monitoring.check_interval_sec', category: 'monitoring', configPath: 'security.monitoring_check_interval_sec', defaultValue: '300', isCredential: false },
105
- { key: 'monitoring.low_balance_threshold_sol', category: 'monitoring', configPath: 'security.monitoring_low_balance_threshold_sol', defaultValue: '0.01', isCredential: false },
106
- { key: 'monitoring.low_balance_threshold_eth', category: 'monitoring', configPath: 'security.monitoring_low_balance_threshold_eth', defaultValue: '0.005', isCredential: false },
107
- { key: 'monitoring.cooldown_hours', category: 'monitoring', configPath: 'security.monitoring_cooldown_hours', defaultValue: '24', isCredential: false },
108
- { key: 'monitoring.enabled', category: 'monitoring', configPath: 'security.monitoring_enabled', defaultValue: 'true', isCredential: false },
138
+ { key: 'monitoring.check_interval_sec', category: 'monitoring', configPath: 'security.monitoring_check_interval_sec', defaultValue: '300', isCredential: false, label: 'Check Interval Sec', description: 'Polling or check interval duration' },
139
+ { key: 'monitoring.low_balance_threshold_sol', category: 'monitoring', configPath: 'security.monitoring_low_balance_threshold_sol', defaultValue: '0.01', isCredential: false, label: 'Low Balance Threshold SOL', description: 'Low balance alert threshold for SOL wallets' },
140
+ { key: 'monitoring.low_balance_threshold_eth', category: 'monitoring', configPath: 'security.monitoring_low_balance_threshold_eth', defaultValue: '0.005', isCredential: false, label: 'Low Balance Threshold ETH', description: 'Low balance alert threshold for ETH wallets' },
141
+ { key: 'monitoring.cooldown_hours', category: 'monitoring', configPath: 'security.monitoring_cooldown_hours', defaultValue: '24', isCredential: false, label: 'Cooldown Hours', description: 'Cooldown between repeated balance alerts' },
142
+ { key: 'monitoring.enabled', category: 'monitoring', configPath: 'security.monitoring_enabled', defaultValue: 'true', isCredential: false, label: 'Enabled', description: 'Enable or disable this feature' },
109
143
  // --- telegram category (Bot service settings) ---
110
- { key: 'telegram.bot_token', category: 'telegram', configPath: 'telegram.bot_token', defaultValue: '', isCredential: true },
111
- { key: 'telegram.locale', category: 'telegram', configPath: 'telegram.locale', defaultValue: 'en', isCredential: false },
144
+ { key: 'telegram.bot_token', category: 'telegram', configPath: 'telegram.bot_token', defaultValue: '', isCredential: true, label: 'Bot Token', description: 'Telegram bot token for interactive bot service' },
145
+ { key: 'telegram.locale', category: 'telegram', configPath: 'telegram.locale', defaultValue: 'en', isCredential: false, label: 'Locale', description: 'Telegram bot message language' },
112
146
  // --- signing_sdk category (CONF-01: 6 operational keys, CONF-02: 1 wallets JSON key) ---
113
- { key: 'signing_sdk.enabled', category: 'signing_sdk', configPath: 'signing_sdk.enabled', defaultValue: 'false', isCredential: false },
114
- { key: 'signing_sdk.request_expiry_min', category: 'signing_sdk', configPath: 'signing_sdk.request_expiry_min', defaultValue: '30', isCredential: false },
115
- { key: 'signing_sdk.preferred_channel', category: 'signing_sdk', configPath: 'signing_sdk.preferred_channel', defaultValue: 'ntfy', isCredential: false },
116
- { key: 'signing_sdk.preferred_wallet', category: 'signing_sdk', configPath: 'signing_sdk.preferred_wallet', defaultValue: '', isCredential: false },
117
- { key: 'signing_sdk.ntfy_request_topic_prefix', category: 'signing_sdk', configPath: 'signing_sdk.ntfy_request_topic_prefix', defaultValue: 'waiaas-sign', isCredential: false },
118
- { key: 'signing_sdk.ntfy_response_topic_prefix', category: 'signing_sdk', configPath: 'signing_sdk.ntfy_response_topic_prefix', defaultValue: 'waiaas-response', isCredential: false },
119
- { key: 'signing_sdk.wallets', category: 'signing_sdk', configPath: 'signing_sdk.wallets', defaultValue: '[]', isCredential: false },
120
- { key: 'signing_sdk.notifications_enabled', category: 'signing_sdk', configPath: 'signing_sdk.notifications_enabled', defaultValue: 'true', isCredential: false },
147
+ { key: 'signing_sdk.enabled', category: 'signing_sdk', configPath: 'signing_sdk.enabled', defaultValue: 'false', isCredential: false, label: 'Enabled', description: 'Enable or disable this feature' },
148
+ { key: 'signing_sdk.request_expiry_min', category: 'signing_sdk', configPath: 'signing_sdk.request_expiry_min', defaultValue: '30', isCredential: false, label: 'Request Expiry Min', description: 'Signing request expiry time in minutes' },
149
+ { key: 'signing_sdk.preferred_channel', category: 'signing_sdk', configPath: 'signing_sdk.preferred_channel', defaultValue: 'ntfy', isCredential: false, label: 'Preferred Channel', description: 'Preferred signing notification channel (ntfy, telegram)' },
150
+ { key: 'signing_sdk.preferred_wallet', category: 'signing_sdk', configPath: 'signing_sdk.preferred_wallet', defaultValue: '', isCredential: false, label: 'Preferred Wallet', description: 'Preferred wallet app for signing requests' },
151
+ { key: 'signing_sdk.ntfy_request_topic_prefix', category: 'signing_sdk', configPath: 'signing_sdk.ntfy_request_topic_prefix', defaultValue: 'waiaas-sign', isCredential: false, label: 'Ntfy Request Topic Prefix', description: 'Ntfy topic prefix for signing requests' },
152
+ { key: 'signing_sdk.ntfy_response_topic_prefix', category: 'signing_sdk', configPath: 'signing_sdk.ntfy_response_topic_prefix', defaultValue: 'waiaas-response', isCredential: false, label: 'Ntfy Response Topic Prefix', description: 'Ntfy topic prefix for signing responses' },
153
+ { key: 'signing_sdk.wallets', category: 'signing_sdk', configPath: 'signing_sdk.wallets', defaultValue: '[]', isCredential: false, label: 'Wallets', description: 'JSON array of configured wallet app connections' },
154
+ { key: 'signing_sdk.notifications_enabled', category: 'signing_sdk', configPath: 'signing_sdk.notifications_enabled', defaultValue: 'true', isCredential: false, label: 'Notifications Enabled', description: 'Enable or disable this feature' },
121
155
  // --- incoming category (Incoming TX monitor settings) ---
122
- { key: 'incoming.enabled', category: 'incoming', configPath: 'incoming.enabled', defaultValue: 'false', isCredential: false },
123
- { key: 'incoming.poll_interval', category: 'incoming', configPath: 'incoming.poll_interval', defaultValue: '30', isCredential: false },
124
- { key: 'incoming.retention_days', category: 'incoming', configPath: 'incoming.retention_days', defaultValue: '90', isCredential: false },
125
- { key: 'incoming.suspicious_dust_usd', category: 'incoming', configPath: 'incoming.suspicious_dust_usd', defaultValue: '0.01', isCredential: false },
126
- { key: 'incoming.suspicious_amount_multiplier', category: 'incoming', configPath: 'incoming.suspicious_amount_multiplier', defaultValue: '10', isCredential: false },
127
- { key: 'incoming.cooldown_minutes', category: 'incoming', configPath: 'incoming.cooldown_minutes', defaultValue: '5', isCredential: false },
128
- { key: 'incoming.wss_url', category: 'incoming', configPath: 'incoming.wss_url', defaultValue: '', isCredential: false },
156
+ { key: 'incoming.enabled', category: 'incoming', configPath: 'incoming.enabled', defaultValue: 'false', isCredential: false, label: 'Enabled', description: 'Enable or disable this feature' },
157
+ { key: 'incoming.poll_interval', category: 'incoming', configPath: 'incoming.poll_interval', defaultValue: '30', isCredential: false, label: 'Poll Interval', description: 'Incoming transaction poll interval in seconds' },
158
+ { key: 'incoming.retention_days', category: 'incoming', configPath: 'incoming.retention_days', defaultValue: '90', isCredential: false, label: 'Retention Days', description: 'Incoming transaction data retention period in days' },
159
+ { key: 'incoming.suspicious_dust_usd', category: 'incoming', configPath: 'incoming.suspicious_dust_usd', defaultValue: '0.01', isCredential: false, label: 'Suspicious Dust USD', description: 'USD threshold for dust transaction detection' },
160
+ { key: 'incoming.suspicious_amount_multiplier', category: 'incoming', configPath: 'incoming.suspicious_amount_multiplier', defaultValue: '10', isCredential: false, label: 'Suspicious Amount Multiplier', description: 'Multiplier for unusual amount detection' },
161
+ { key: 'incoming.cooldown_minutes', category: 'incoming', configPath: 'incoming.cooldown_minutes', defaultValue: '5', isCredential: false, label: 'Cooldown Minutes', description: 'Cooldown between duplicate incoming TX alerts' },
162
+ { key: 'incoming.wss_url', category: 'incoming', configPath: 'incoming.wss_url', defaultValue: '', isCredential: false, label: 'WSS URL', description: 'Global WebSocket URL for incoming TX monitoring' },
129
163
  // Per-network WSS URL overrides (#193): takes priority over global incoming.wss_url
130
- { key: 'incoming.wss_url.solana-mainnet', category: 'incoming', configPath: 'incoming.wss_url.solana-mainnet', defaultValue: '', isCredential: false },
131
- { key: 'incoming.wss_url.solana-devnet', category: 'incoming', configPath: 'incoming.wss_url.solana-devnet', defaultValue: '', isCredential: false },
132
- { key: 'incoming.wss_url.solana-testnet', category: 'incoming', configPath: 'incoming.wss_url.solana-testnet', defaultValue: '', isCredential: false },
133
- { key: 'incoming.wss_url.ethereum-mainnet', category: 'incoming', configPath: 'incoming.wss_url.ethereum-mainnet', defaultValue: '', isCredential: false },
134
- { key: 'incoming.wss_url.ethereum-sepolia', category: 'incoming', configPath: 'incoming.wss_url.ethereum-sepolia', defaultValue: '', isCredential: false },
135
- { key: 'incoming.wss_url.arbitrum-mainnet', category: 'incoming', configPath: 'incoming.wss_url.arbitrum-mainnet', defaultValue: '', isCredential: false },
136
- { key: 'incoming.wss_url.arbitrum-sepolia', category: 'incoming', configPath: 'incoming.wss_url.arbitrum-sepolia', defaultValue: '', isCredential: false },
137
- { key: 'incoming.wss_url.optimism-mainnet', category: 'incoming', configPath: 'incoming.wss_url.optimism-mainnet', defaultValue: '', isCredential: false },
138
- { key: 'incoming.wss_url.optimism-sepolia', category: 'incoming', configPath: 'incoming.wss_url.optimism-sepolia', defaultValue: '', isCredential: false },
139
- { key: 'incoming.wss_url.base-mainnet', category: 'incoming', configPath: 'incoming.wss_url.base-mainnet', defaultValue: '', isCredential: false },
140
- { key: 'incoming.wss_url.base-sepolia', category: 'incoming', configPath: 'incoming.wss_url.base-sepolia', defaultValue: '', isCredential: false },
141
- { key: 'incoming.wss_url.polygon-mainnet', category: 'incoming', configPath: 'incoming.wss_url.polygon-mainnet', defaultValue: '', isCredential: false },
142
- { key: 'incoming.wss_url.polygon-amoy', category: 'incoming', configPath: 'incoming.wss_url.polygon-amoy', defaultValue: '', isCredential: false },
143
- { key: 'incoming.wss_url.hyperevm-mainnet', category: 'incoming', configPath: 'incoming.wss_url.hyperevm-mainnet', defaultValue: '', isCredential: false },
144
- { key: 'incoming.wss_url.hyperevm-testnet', category: 'incoming', configPath: 'incoming.wss_url.hyperevm-testnet', defaultValue: '', isCredential: false },
164
+ { key: 'incoming.wss_url.solana-mainnet', category: 'incoming', configPath: 'incoming.wss_url.solana-mainnet', defaultValue: '', isCredential: false, label: 'Solana-Mainnet', description: 'WebSocket URL override for incoming TX monitoring on this network' },
165
+ { key: 'incoming.wss_url.solana-devnet', category: 'incoming', configPath: 'incoming.wss_url.solana-devnet', defaultValue: '', isCredential: false, label: 'Solana-Devnet', description: 'WebSocket URL override for incoming TX monitoring on this network' },
166
+ { key: 'incoming.wss_url.solana-testnet', category: 'incoming', configPath: 'incoming.wss_url.solana-testnet', defaultValue: '', isCredential: false, label: 'Solana-Testnet', description: 'WebSocket URL override for incoming TX monitoring on this network' },
167
+ { key: 'incoming.wss_url.ethereum-mainnet', category: 'incoming', configPath: 'incoming.wss_url.ethereum-mainnet', defaultValue: '', isCredential: false, label: 'Ethereum-Mainnet', description: 'WebSocket URL override for incoming TX monitoring on this network' },
168
+ { key: 'incoming.wss_url.ethereum-sepolia', category: 'incoming', configPath: 'incoming.wss_url.ethereum-sepolia', defaultValue: '', isCredential: false, label: 'Ethereum-Sepolia', description: 'WebSocket URL override for incoming TX monitoring on this network' },
169
+ { key: 'incoming.wss_url.arbitrum-mainnet', category: 'incoming', configPath: 'incoming.wss_url.arbitrum-mainnet', defaultValue: '', isCredential: false, label: 'Arbitrum-Mainnet', description: 'WebSocket URL override for incoming TX monitoring on this network' },
170
+ { key: 'incoming.wss_url.arbitrum-sepolia', category: 'incoming', configPath: 'incoming.wss_url.arbitrum-sepolia', defaultValue: '', isCredential: false, label: 'Arbitrum-Sepolia', description: 'WebSocket URL override for incoming TX monitoring on this network' },
171
+ { key: 'incoming.wss_url.optimism-mainnet', category: 'incoming', configPath: 'incoming.wss_url.optimism-mainnet', defaultValue: '', isCredential: false, label: 'Optimism-Mainnet', description: 'WebSocket URL override for incoming TX monitoring on this network' },
172
+ { key: 'incoming.wss_url.optimism-sepolia', category: 'incoming', configPath: 'incoming.wss_url.optimism-sepolia', defaultValue: '', isCredential: false, label: 'Optimism-Sepolia', description: 'WebSocket URL override for incoming TX monitoring on this network' },
173
+ { key: 'incoming.wss_url.base-mainnet', category: 'incoming', configPath: 'incoming.wss_url.base-mainnet', defaultValue: '', isCredential: false, label: 'Base-Mainnet', description: 'WebSocket URL override for incoming TX monitoring on this network' },
174
+ { key: 'incoming.wss_url.base-sepolia', category: 'incoming', configPath: 'incoming.wss_url.base-sepolia', defaultValue: '', isCredential: false, label: 'Base-Sepolia', description: 'WebSocket URL override for incoming TX monitoring on this network' },
175
+ { key: 'incoming.wss_url.polygon-mainnet', category: 'incoming', configPath: 'incoming.wss_url.polygon-mainnet', defaultValue: '', isCredential: false, label: 'Polygon-Mainnet', description: 'WebSocket URL override for incoming TX monitoring on this network' },
176
+ { key: 'incoming.wss_url.polygon-amoy', category: 'incoming', configPath: 'incoming.wss_url.polygon-amoy', defaultValue: '', isCredential: false, label: 'Polygon-Amoy', description: 'WebSocket URL override for incoming TX monitoring on this network' },
177
+ { key: 'incoming.wss_url.hyperevm-mainnet', category: 'incoming', configPath: 'incoming.wss_url.hyperevm-mainnet', defaultValue: '', isCredential: false, label: 'Hyperevm-Mainnet', description: 'WebSocket URL override for incoming TX monitoring on this network' },
178
+ { key: 'incoming.wss_url.hyperevm-testnet', category: 'incoming', configPath: 'incoming.wss_url.hyperevm-testnet', defaultValue: '', isCredential: false, label: 'Hyperevm-Testnet', description: 'WebSocket URL override for incoming TX monitoring on this network' },
145
179
  // --- actions category (DeFi action providers) ---
146
- { key: 'actions.jupiter_swap_enabled', category: 'actions', configPath: 'actions.jupiter_swap_enabled', defaultValue: 'true', isCredential: false },
147
- { key: 'actions.jupiter_swap_api_base_url', category: 'actions', configPath: 'actions.jupiter_swap_api_base_url', defaultValue: 'https://api.jup.ag/swap/v1', isCredential: false },
148
- { key: 'actions.jupiter_swap_api_key', category: 'actions', configPath: 'actions.jupiter_swap_api_key', defaultValue: '', isCredential: true },
149
- { key: 'actions.jupiter_swap_default_slippage_bps', category: 'actions', configPath: 'actions.jupiter_swap_default_slippage_bps', defaultValue: '50', isCredential: false },
150
- { key: 'actions.jupiter_swap_max_slippage_bps', category: 'actions', configPath: 'actions.jupiter_swap_max_slippage_bps', defaultValue: '500', isCredential: false },
151
- { key: 'actions.jupiter_swap_max_price_impact_pct', category: 'actions', configPath: 'actions.jupiter_swap_max_price_impact_pct', defaultValue: '1', isCredential: false },
152
- { key: 'actions.jupiter_swap_jito_tip_lamports', category: 'actions', configPath: 'actions.jupiter_swap_jito_tip_lamports', defaultValue: '1000', isCredential: false },
153
- { key: 'actions.jupiter_swap_request_timeout_ms', category: 'actions', configPath: 'actions.jupiter_swap_request_timeout_ms', defaultValue: '10000', isCredential: false },
154
- { key: 'actions.zerox_swap_enabled', category: 'actions', configPath: 'actions.zerox_swap_enabled', defaultValue: 'true', isCredential: false },
155
- { key: 'actions.zerox_swap_api_key', category: 'actions', configPath: 'actions.zerox_swap_api_key', defaultValue: '', isCredential: true },
156
- { key: 'actions.zerox_swap_default_slippage_bps', category: 'actions', configPath: 'actions.zerox_swap_default_slippage_bps', defaultValue: '100', isCredential: false },
157
- { key: 'actions.zerox_swap_max_slippage_bps', category: 'actions', configPath: 'actions.zerox_swap_max_slippage_bps', defaultValue: '500', isCredential: false },
158
- { key: 'actions.zerox_swap_request_timeout_ms', category: 'actions', configPath: 'actions.zerox_swap_request_timeout_ms', defaultValue: '10000', isCredential: false },
159
- { key: 'actions.lifi_enabled', category: 'actions', configPath: 'actions.lifi_enabled', defaultValue: 'true', isCredential: false },
160
- { key: 'actions.lifi_api_key', category: 'actions', configPath: 'actions.lifi_api_key', defaultValue: '', isCredential: true },
161
- { key: 'actions.lifi_api_base_url', category: 'actions', configPath: 'actions.lifi_api_base_url', defaultValue: 'https://li.quest/v1', isCredential: false },
162
- { key: 'actions.lifi_default_slippage_pct', category: 'actions', configPath: 'actions.lifi_default_slippage_pct', defaultValue: '0.03', isCredential: false },
163
- { key: 'actions.lifi_max_slippage_pct', category: 'actions', configPath: 'actions.lifi_max_slippage_pct', defaultValue: '0.05', isCredential: false },
180
+ { key: 'actions.jupiter_swap_enabled', category: 'actions', configPath: 'actions.jupiter_swap_enabled', defaultValue: 'true', isCredential: false, label: 'Jupiter Swap Enabled', description: 'Enable or disable this feature' },
181
+ { key: 'actions.jupiter_swap_api_base_url', category: 'actions', configPath: 'actions.jupiter_swap_api_base_url', defaultValue: 'https://api.jup.ag/swap/v1', isCredential: false, label: 'Jupiter Swap API Base URL', description: 'Base URL for external API requests' },
182
+ { key: 'actions.jupiter_swap_api_key', category: 'actions', configPath: 'actions.jupiter_swap_api_key', defaultValue: '', isCredential: true, label: 'Jupiter Swap API Key', description: 'API key for external service authentication' },
183
+ { key: 'actions.jupiter_swap_default_slippage_bps', category: 'actions', configPath: 'actions.jupiter_swap_default_slippage_bps', defaultValue: '50', isCredential: false, label: 'Jupiter Swap Default Slippage BPS', description: 'Slippage tolerance in basis points (1 bps = 0.01%)' },
184
+ { key: 'actions.jupiter_swap_max_slippage_bps', category: 'actions', configPath: 'actions.jupiter_swap_max_slippage_bps', defaultValue: '500', isCredential: false, label: 'Jupiter Swap Max Slippage BPS', description: 'Slippage tolerance in basis points (1 bps = 0.01%)' },
185
+ { key: 'actions.jupiter_swap_max_price_impact_pct', category: 'actions', configPath: 'actions.jupiter_swap_max_price_impact_pct', defaultValue: '1', isCredential: false, label: 'Jupiter Swap Max Price Impact %', description: 'Jupiter Swap DEX aggregator setting' },
186
+ { key: 'actions.jupiter_swap_jito_tip_lamports', category: 'actions', configPath: 'actions.jupiter_swap_jito_tip_lamports', defaultValue: '1000', isCredential: false, label: 'Jupiter Swap Jito Tip Lamports', description: 'Jupiter Swap DEX aggregator setting' },
187
+ { key: 'actions.jupiter_swap_request_timeout_ms', category: 'actions', configPath: 'actions.jupiter_swap_request_timeout_ms', defaultValue: '10000', isCredential: false, label: 'Jupiter Swap Request Timeout ms', description: 'Request timeout in milliseconds' },
188
+ { key: 'actions.zerox_swap_enabled', category: 'actions', configPath: 'actions.zerox_swap_enabled', defaultValue: 'true', isCredential: false, label: 'Zerox Swap Enabled', description: 'Enable or disable this feature' },
189
+ { key: 'actions.zerox_swap_api_key', category: 'actions', configPath: 'actions.zerox_swap_api_key', defaultValue: '', isCredential: true, label: 'Zerox Swap API Key', description: 'API key for external service authentication' },
190
+ { key: 'actions.zerox_swap_default_slippage_bps', category: 'actions', configPath: 'actions.zerox_swap_default_slippage_bps', defaultValue: '100', isCredential: false, label: 'Zerox Swap Default Slippage BPS', description: 'Slippage tolerance in basis points (1 bps = 0.01%)' },
191
+ { key: 'actions.zerox_swap_max_slippage_bps', category: 'actions', configPath: 'actions.zerox_swap_max_slippage_bps', defaultValue: '500', isCredential: false, label: 'Zerox Swap Max Slippage BPS', description: 'Slippage tolerance in basis points (1 bps = 0.01%)' },
192
+ { key: 'actions.zerox_swap_request_timeout_ms', category: 'actions', configPath: 'actions.zerox_swap_request_timeout_ms', defaultValue: '10000', isCredential: false, label: 'Zerox Swap Request Timeout ms', description: 'Request timeout in milliseconds' },
193
+ { key: 'actions.lifi_enabled', category: 'actions', configPath: 'actions.lifi_enabled', defaultValue: 'true', isCredential: false, label: 'Lifi Enabled', description: 'Enable or disable this feature' },
194
+ { key: 'actions.lifi_api_key', category: 'actions', configPath: 'actions.lifi_api_key', defaultValue: '', isCredential: true, label: 'Lifi API Key', description: 'API key for external service authentication' },
195
+ { key: 'actions.lifi_api_base_url', category: 'actions', configPath: 'actions.lifi_api_base_url', defaultValue: 'https://li.quest/v1', isCredential: false, label: 'Lifi API Base URL', description: 'Base URL for external API requests' },
196
+ { key: 'actions.lifi_default_slippage_pct', category: 'actions', configPath: 'actions.lifi_default_slippage_pct', defaultValue: '0.03', isCredential: false, label: 'Lifi Default Slippage %', description: 'Slippage tolerance as decimal percentage' },
197
+ { key: 'actions.lifi_max_slippage_pct', category: 'actions', configPath: 'actions.lifi_max_slippage_pct', defaultValue: '0.05', isCredential: false, label: 'Lifi Max Slippage %', description: 'Slippage tolerance as decimal percentage' },
164
198
  // --- Lido Staking ---
165
- { key: 'actions.lido_staking_enabled', category: 'actions', configPath: 'actions.lido_staking_enabled', defaultValue: 'true', isCredential: false },
166
- { key: 'actions.lido_staking_steth_address', category: 'actions', configPath: 'actions.lido_staking_steth_address', defaultValue: '', isCredential: false },
167
- { key: 'actions.lido_staking_withdrawal_queue_address', category: 'actions', configPath: 'actions.lido_staking_withdrawal_queue_address', defaultValue: '', isCredential: false },
199
+ { key: 'actions.lido_staking_enabled', category: 'actions', configPath: 'actions.lido_staking_enabled', defaultValue: 'true', isCredential: false, label: 'Lido Staking Enabled', description: 'Enable or disable this feature' },
200
+ { key: 'actions.lido_staking_steth_address', category: 'actions', configPath: 'actions.lido_staking_steth_address', defaultValue: '', isCredential: false, label: 'Lido Staking Steth Address', description: 'On-chain contract or account address' },
201
+ { key: 'actions.lido_staking_withdrawal_queue_address', category: 'actions', configPath: 'actions.lido_staking_withdrawal_queue_address', defaultValue: '', isCredential: false, label: 'Lido Staking Withdrawal Queue Address', description: 'On-chain contract or account address' },
168
202
  // --- Jito Staking ---
169
- { key: 'actions.jito_staking_enabled', category: 'actions', configPath: 'actions.jito_staking_enabled', defaultValue: 'true', isCredential: false },
170
- { key: 'actions.jito_staking_stake_pool_address', category: 'actions', configPath: 'actions.jito_staking_stake_pool_address', defaultValue: '', isCredential: false },
171
- { key: 'actions.jito_staking_jitosol_mint', category: 'actions', configPath: 'actions.jito_staking_jitosol_mint', defaultValue: '', isCredential: false },
203
+ { key: 'actions.jito_staking_enabled', category: 'actions', configPath: 'actions.jito_staking_enabled', defaultValue: 'true', isCredential: false, label: 'Jito Staking Enabled', description: 'Enable or disable this feature' },
204
+ { key: 'actions.jito_staking_stake_pool_address', category: 'actions', configPath: 'actions.jito_staking_stake_pool_address', defaultValue: '', isCredential: false, label: 'Jito Staking Stake Pool Address', description: 'On-chain contract or account address' },
205
+ { key: 'actions.jito_staking_jitosol_mint', category: 'actions', configPath: 'actions.jito_staking_jitosol_mint', defaultValue: '', isCredential: false, label: 'Jito Staking Jitosol Mint', description: 'Jito SOL staking setting' },
172
206
  // --- Aave V3 Lending ---
173
- { key: 'actions.aave_v3_enabled', category: 'actions', configPath: 'actions.aave_v3_enabled', defaultValue: 'true', isCredential: false },
174
- { key: 'actions.aave_v3_health_factor_warning_threshold', category: 'actions', configPath: 'actions.aave_v3_health_factor_warning_threshold', defaultValue: '1.2', isCredential: false },
175
- { key: 'actions.aave_v3_position_sync_interval_sec', category: 'actions', configPath: 'actions.aave_v3_position_sync_interval_sec', defaultValue: '300', isCredential: false },
176
- { key: 'actions.aave_v3_max_ltv_pct', category: 'actions', configPath: 'actions.aave_v3_max_ltv_pct', defaultValue: '0.8', isCredential: false },
207
+ { key: 'actions.aave_v3_enabled', category: 'actions', configPath: 'actions.aave_v3_enabled', defaultValue: 'true', isCredential: false, label: 'Aave V3 Enabled', description: 'Enable or disable this feature' },
208
+ { key: 'actions.aave_v3_health_factor_warning_threshold', category: 'actions', configPath: 'actions.aave_v3_health_factor_warning_threshold', defaultValue: '1.2', isCredential: false, label: 'Aave V3 Health Factor Warning Threshold', description: 'Threshold value for triggering action' },
209
+ { key: 'actions.aave_v3_position_sync_interval_sec', category: 'actions', configPath: 'actions.aave_v3_position_sync_interval_sec', defaultValue: '300', isCredential: false, label: 'Aave V3 Position Sync Interval Sec', description: 'Polling or check interval duration' },
210
+ { key: 'actions.aave_v3_max_ltv_pct', category: 'actions', configPath: 'actions.aave_v3_max_ltv_pct', defaultValue: '0.8', isCredential: false, label: 'Aave V3 Max LTV %', description: 'Aave V3 lending protocol setting' },
177
211
  // --- Kamino Lending ---
178
- { key: 'actions.kamino_enabled', category: 'actions', configPath: 'actions.kamino_enabled', defaultValue: 'true', isCredential: false },
179
- { key: 'actions.kamino_market', category: 'actions', configPath: 'actions.kamino_market', defaultValue: 'main', isCredential: false },
180
- { key: 'actions.kamino_hf_threshold', category: 'actions', configPath: 'actions.kamino_hf_threshold', defaultValue: '1.2', isCredential: false },
212
+ { key: 'actions.kamino_enabled', category: 'actions', configPath: 'actions.kamino_enabled', defaultValue: 'true', isCredential: false, label: 'Kamino Enabled', description: 'Enable or disable this feature' },
213
+ { key: 'actions.kamino_market', category: 'actions', configPath: 'actions.kamino_market', defaultValue: 'main', isCredential: false, label: 'Kamino Market', description: 'Kamino Solana lending setting' },
214
+ { key: 'actions.kamino_hf_threshold', category: 'actions', configPath: 'actions.kamino_hf_threshold', defaultValue: '1.2', isCredential: false, label: 'Kamino HF Threshold', description: 'Threshold value for triggering action' },
181
215
  // --- Pendle Yield ---
182
- { key: 'actions.pendle_yield_enabled', category: 'actions', configPath: 'actions.pendle_yield_enabled', defaultValue: 'true', isCredential: false },
183
- { key: 'actions.pendle_yield_api_base_url', category: 'actions', configPath: 'actions.pendle_yield_api_base_url', defaultValue: 'https://api-v2.pendle.finance/core', isCredential: false },
184
- { key: 'actions.pendle_yield_api_key', category: 'actions', configPath: 'actions.pendle_yield_api_key', defaultValue: '', isCredential: true },
185
- { key: 'actions.pendle_yield_default_slippage_bps', category: 'actions', configPath: 'actions.pendle_yield_default_slippage_bps', defaultValue: '100', isCredential: false },
186
- { key: 'actions.pendle_yield_max_slippage_bps', category: 'actions', configPath: 'actions.pendle_yield_max_slippage_bps', defaultValue: '500', isCredential: false },
187
- { key: 'actions.pendle_yield_request_timeout_ms', category: 'actions', configPath: 'actions.pendle_yield_request_timeout_ms', defaultValue: '10000', isCredential: false },
188
- { key: 'actions.pendle_yield_maturity_warning_days', category: 'actions', configPath: 'actions.pendle_yield_maturity_warning_days', defaultValue: '7', isCredential: false },
216
+ { key: 'actions.pendle_yield_enabled', category: 'actions', configPath: 'actions.pendle_yield_enabled', defaultValue: 'true', isCredential: false, label: 'Pendle Yield Enabled', description: 'Enable or disable this feature' },
217
+ { key: 'actions.pendle_yield_api_base_url', category: 'actions', configPath: 'actions.pendle_yield_api_base_url', defaultValue: 'https://api-v2.pendle.finance/core', isCredential: false, label: 'Pendle Yield API Base URL', description: 'Base URL for external API requests' },
218
+ { key: 'actions.pendle_yield_api_key', category: 'actions', configPath: 'actions.pendle_yield_api_key', defaultValue: '', isCredential: true, label: 'Pendle Yield API Key', description: 'API key for external service authentication' },
219
+ { key: 'actions.pendle_yield_default_slippage_bps', category: 'actions', configPath: 'actions.pendle_yield_default_slippage_bps', defaultValue: '100', isCredential: false, label: 'Pendle Yield Default Slippage BPS', description: 'Slippage tolerance in basis points (1 bps = 0.01%)' },
220
+ { key: 'actions.pendle_yield_max_slippage_bps', category: 'actions', configPath: 'actions.pendle_yield_max_slippage_bps', defaultValue: '500', isCredential: false, label: 'Pendle Yield Max Slippage BPS', description: 'Slippage tolerance in basis points (1 bps = 0.01%)' },
221
+ { key: 'actions.pendle_yield_request_timeout_ms', category: 'actions', configPath: 'actions.pendle_yield_request_timeout_ms', defaultValue: '10000', isCredential: false, label: 'Pendle Yield Request Timeout ms', description: 'Request timeout in milliseconds' },
222
+ { key: 'actions.pendle_yield_maturity_warning_days', category: 'actions', configPath: 'actions.pendle_yield_maturity_warning_days', defaultValue: '7', isCredential: false, label: 'Pendle Yield Maturity Warning Days', description: 'Pendle yield trading setting' },
189
223
  // --- Drift Perp ---
190
- { key: 'actions.drift_enabled', category: 'actions', configPath: 'actions.drift_enabled', defaultValue: 'true', isCredential: false },
191
- { key: 'actions.drift_max_leverage', category: 'actions', configPath: 'actions.drift_max_leverage', defaultValue: '5', isCredential: false },
192
- { key: 'actions.drift_max_position_usd', category: 'actions', configPath: 'actions.drift_max_position_usd', defaultValue: '10000', isCredential: false },
193
- { key: 'actions.drift_margin_warning_threshold_pct', category: 'actions', configPath: 'actions.drift_margin_warning_threshold_pct', defaultValue: '0.15', isCredential: false },
194
- { key: 'actions.drift_position_sync_interval_sec', category: 'actions', configPath: 'actions.drift_position_sync_interval_sec', defaultValue: '60', isCredential: false },
224
+ { key: 'actions.drift_enabled', category: 'actions', configPath: 'actions.drift_enabled', defaultValue: 'true', isCredential: false, label: 'Drift Enabled', description: 'Enable or disable this feature' },
225
+ { key: 'actions.drift_max_leverage', category: 'actions', configPath: 'actions.drift_max_leverage', defaultValue: '5', isCredential: false, label: 'Drift Max Leverage', description: 'Maximum allowed leverage multiplier' },
226
+ { key: 'actions.drift_max_position_usd', category: 'actions', configPath: 'actions.drift_max_position_usd', defaultValue: '10000', isCredential: false, label: 'Drift Max Position USD', description: 'Maximum amount in USD' },
227
+ { key: 'actions.drift_margin_warning_threshold_pct', category: 'actions', configPath: 'actions.drift_margin_warning_threshold_pct', defaultValue: '0.15', isCredential: false, label: 'Drift Margin Warning Threshold %', description: 'Threshold percentage for triggering action' },
228
+ { key: 'actions.drift_position_sync_interval_sec', category: 'actions', configPath: 'actions.drift_position_sync_interval_sec', defaultValue: '60', isCredential: false, label: 'Drift Position Sync Interval Sec', description: 'Polling or check interval duration' },
195
229
  // --- gas_condition category (Gas conditional execution) ---
196
- { key: 'gas_condition.enabled', category: 'gas_condition', configPath: 'gas_condition.enabled', defaultValue: 'true', isCredential: false },
197
- { key: 'gas_condition.poll_interval_sec', category: 'gas_condition', configPath: 'gas_condition.poll_interval_sec', defaultValue: '30', isCredential: false },
198
- { key: 'gas_condition.default_timeout_sec', category: 'gas_condition', configPath: 'gas_condition.default_timeout_sec', defaultValue: '3600', isCredential: false },
199
- { key: 'gas_condition.max_timeout_sec', category: 'gas_condition', configPath: 'gas_condition.max_timeout_sec', defaultValue: '86400', isCredential: false },
200
- { key: 'gas_condition.max_pending_count', category: 'gas_condition', configPath: 'gas_condition.max_pending_count', defaultValue: '100', isCredential: false },
230
+ { key: 'gas_condition.enabled', category: 'gas_condition', configPath: 'gas_condition.enabled', defaultValue: 'true', isCredential: false, label: 'Enabled', description: 'Enable or disable this feature' },
231
+ { key: 'gas_condition.poll_interval_sec', category: 'gas_condition', configPath: 'gas_condition.poll_interval_sec', defaultValue: '30', isCredential: false, label: 'Poll Interval Sec', description: 'Polling or check interval duration' },
232
+ { key: 'gas_condition.default_timeout_sec', category: 'gas_condition', configPath: 'gas_condition.default_timeout_sec', defaultValue: '3600', isCredential: false, label: 'Default Timeout Sec', description: 'Timeout duration in seconds' },
233
+ { key: 'gas_condition.max_timeout_sec', category: 'gas_condition', configPath: 'gas_condition.max_timeout_sec', defaultValue: '86400', isCredential: false, label: 'Max Timeout Sec', description: 'Timeout duration in seconds' },
234
+ { key: 'gas_condition.max_pending_count', category: 'gas_condition', configPath: 'gas_condition.max_pending_count', defaultValue: '100', isCredential: false, label: 'Max Pending Count', description: 'Maximum gas-conditional transactions in queue' },
201
235
  // --- rpc_pool category (per-network URL lists managed via Admin Settings API) ---
202
- { key: 'rpc_pool.solana-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.solana-mainnet', defaultValue: '[]', isCredential: false },
203
- { key: 'rpc_pool.solana-devnet', category: 'rpc_pool', configPath: 'rpc_pool.solana-devnet', defaultValue: '[]', isCredential: false },
204
- { key: 'rpc_pool.solana-testnet', category: 'rpc_pool', configPath: 'rpc_pool.solana-testnet', defaultValue: '[]', isCredential: false },
205
- { key: 'rpc_pool.ethereum-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.ethereum-mainnet', defaultValue: '[]', isCredential: false },
206
- { key: 'rpc_pool.ethereum-sepolia', category: 'rpc_pool', configPath: 'rpc_pool.ethereum-sepolia', defaultValue: '[]', isCredential: false },
207
- { key: 'rpc_pool.arbitrum-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.arbitrum-mainnet', defaultValue: '[]', isCredential: false },
208
- { key: 'rpc_pool.arbitrum-sepolia', category: 'rpc_pool', configPath: 'rpc_pool.arbitrum-sepolia', defaultValue: '[]', isCredential: false },
209
- { key: 'rpc_pool.optimism-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.optimism-mainnet', defaultValue: '[]', isCredential: false },
210
- { key: 'rpc_pool.optimism-sepolia', category: 'rpc_pool', configPath: 'rpc_pool.optimism-sepolia', defaultValue: '[]', isCredential: false },
211
- { key: 'rpc_pool.base-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.base-mainnet', defaultValue: '[]', isCredential: false },
212
- { key: 'rpc_pool.base-sepolia', category: 'rpc_pool', configPath: 'rpc_pool.base-sepolia', defaultValue: '[]', isCredential: false },
213
- { key: 'rpc_pool.polygon-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.polygon-mainnet', defaultValue: '[]', isCredential: false },
214
- { key: 'rpc_pool.polygon-amoy', category: 'rpc_pool', configPath: 'rpc_pool.polygon-amoy', defaultValue: '[]', isCredential: false },
215
- { key: 'rpc_pool.hyperevm-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.hyperevm-mainnet', defaultValue: '[]', isCredential: false },
216
- { key: 'rpc_pool.hyperevm-testnet', category: 'rpc_pool', configPath: 'rpc_pool.hyperevm-testnet', defaultValue: '[]', isCredential: false },
236
+ { key: 'rpc_pool.solana-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.solana-mainnet', defaultValue: '[]', isCredential: false, label: 'Solana-Mainnet', description: 'JSON array of RPC endpoint URLs for pool rotation' },
237
+ { key: 'rpc_pool.solana-devnet', category: 'rpc_pool', configPath: 'rpc_pool.solana-devnet', defaultValue: '[]', isCredential: false, label: 'Solana-Devnet', description: 'JSON array of RPC endpoint URLs for pool rotation' },
238
+ { key: 'rpc_pool.solana-testnet', category: 'rpc_pool', configPath: 'rpc_pool.solana-testnet', defaultValue: '[]', isCredential: false, label: 'Solana-Testnet', description: 'JSON array of RPC endpoint URLs for pool rotation' },
239
+ { key: 'rpc_pool.ethereum-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.ethereum-mainnet', defaultValue: '[]', isCredential: false, label: 'Ethereum-Mainnet', description: 'JSON array of RPC endpoint URLs for pool rotation' },
240
+ { key: 'rpc_pool.ethereum-sepolia', category: 'rpc_pool', configPath: 'rpc_pool.ethereum-sepolia', defaultValue: '[]', isCredential: false, label: 'Ethereum-Sepolia', description: 'JSON array of RPC endpoint URLs for pool rotation' },
241
+ { key: 'rpc_pool.arbitrum-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.arbitrum-mainnet', defaultValue: '[]', isCredential: false, label: 'Arbitrum-Mainnet', description: 'JSON array of RPC endpoint URLs for pool rotation' },
242
+ { key: 'rpc_pool.arbitrum-sepolia', category: 'rpc_pool', configPath: 'rpc_pool.arbitrum-sepolia', defaultValue: '[]', isCredential: false, label: 'Arbitrum-Sepolia', description: 'JSON array of RPC endpoint URLs for pool rotation' },
243
+ { key: 'rpc_pool.optimism-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.optimism-mainnet', defaultValue: '[]', isCredential: false, label: 'Optimism-Mainnet', description: 'JSON array of RPC endpoint URLs for pool rotation' },
244
+ { key: 'rpc_pool.optimism-sepolia', category: 'rpc_pool', configPath: 'rpc_pool.optimism-sepolia', defaultValue: '[]', isCredential: false, label: 'Optimism-Sepolia', description: 'JSON array of RPC endpoint URLs for pool rotation' },
245
+ { key: 'rpc_pool.base-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.base-mainnet', defaultValue: '[]', isCredential: false, label: 'Base-Mainnet', description: 'JSON array of RPC endpoint URLs for pool rotation' },
246
+ { key: 'rpc_pool.base-sepolia', category: 'rpc_pool', configPath: 'rpc_pool.base-sepolia', defaultValue: '[]', isCredential: false, label: 'Base-Sepolia', description: 'JSON array of RPC endpoint URLs for pool rotation' },
247
+ { key: 'rpc_pool.polygon-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.polygon-mainnet', defaultValue: '[]', isCredential: false, label: 'Polygon-Mainnet', description: 'JSON array of RPC endpoint URLs for pool rotation' },
248
+ { key: 'rpc_pool.polygon-amoy', category: 'rpc_pool', configPath: 'rpc_pool.polygon-amoy', defaultValue: '[]', isCredential: false, label: 'Polygon-Amoy', description: 'JSON array of RPC endpoint URLs for pool rotation' },
249
+ { key: 'rpc_pool.hyperevm-mainnet', category: 'rpc_pool', configPath: 'rpc_pool.hyperevm-mainnet', defaultValue: '[]', isCredential: false, label: 'Hyperevm-Mainnet', description: 'JSON array of RPC endpoint URLs for pool rotation' },
250
+ { key: 'rpc_pool.hyperevm-testnet', category: 'rpc_pool', configPath: 'rpc_pool.hyperevm-testnet', defaultValue: '[]', isCredential: false, label: 'Hyperevm-Testnet', description: 'JSON array of RPC endpoint URLs for pool rotation' },
217
251
  // --- position_tracker category (DeFi position sync) ---
218
- { key: 'position_tracker.enabled', category: 'position_tracker', configPath: 'position_tracker.enabled', defaultValue: 'true', isCredential: false },
252
+ { key: 'position_tracker.enabled', category: 'position_tracker', configPath: 'position_tracker.enabled', defaultValue: 'true', isCredential: false, label: 'Enabled', description: 'Enable or disable this feature' },
219
253
  // --- smart_account category (ERC-4337 Account Abstraction) ---
220
254
  // v30.9: enabled default changed to 'true' (DFLT-01). bundler_url/paymaster_url/paymaster_api_key
221
255
  // and all per-chain overrides removed (23 keys) -- replaced by per-wallet provider model (PROV-09).
222
- { key: 'smart_account.enabled', category: 'smart_account', configPath: 'smart_account.enabled', defaultValue: 'true', isCredential: false },
223
- { key: 'smart_account.entry_point', category: 'smart_account', configPath: 'smart_account.entry_point', defaultValue: '0x0000000071727De22E5E9d8BAf0edAc6f37da032', isCredential: false },
224
- { key: 'smart_account.pimlico.api_key', category: 'smart_account', configPath: 'smart_account.pimlico.api_key', defaultValue: '', isCredential: true },
225
- { key: 'smart_account.pimlico.paymaster_policy_id', category: 'smart_account', configPath: 'smart_account.pimlico.paymaster_policy_id', defaultValue: '', isCredential: false },
226
- { key: 'smart_account.alchemy.api_key', category: 'smart_account', configPath: 'smart_account.alchemy.api_key', defaultValue: '', isCredential: true },
227
- { key: 'smart_account.alchemy.paymaster_policy_id', category: 'smart_account', configPath: 'smart_account.alchemy.paymaster_policy_id', defaultValue: '', isCredential: false },
256
+ { key: 'smart_account.enabled', category: 'smart_account', configPath: 'smart_account.enabled', defaultValue: 'true', isCredential: false, label: 'Enabled', description: 'Enable or disable this feature' },
257
+ { key: 'smart_account.entry_point', category: 'smart_account', configPath: 'smart_account.entry_point', defaultValue: '0x0000000071727De22E5E9d8BAf0edAc6f37da032', isCredential: false, label: 'Entry Point', description: 'ERC-4337 EntryPoint contract address' },
258
+ { key: 'smart_account.pimlico.api_key', category: 'smart_account', configPath: 'smart_account.pimlico.api_key', defaultValue: '', isCredential: true, label: 'API Key', description: 'Pimlico bundler/paymaster API key' },
259
+ { key: 'smart_account.pimlico.paymaster_policy_id', category: 'smart_account', configPath: 'smart_account.pimlico.paymaster_policy_id', defaultValue: '', isCredential: false, label: 'Paymaster Policy Id', description: 'Pimlico paymaster policy ID' },
260
+ { key: 'smart_account.alchemy.api_key', category: 'smart_account', configPath: 'smart_account.alchemy.api_key', defaultValue: '', isCredential: true, label: 'API Key', description: 'Alchemy bundler/paymaster API key' },
261
+ { key: 'smart_account.alchemy.paymaster_policy_id', category: 'smart_account', configPath: 'smart_account.alchemy.paymaster_policy_id', defaultValue: '', isCredential: false, label: 'Paymaster Policy Id', description: 'Alchemy paymaster policy ID' },
228
262
  // --- ERC-8004 Agent Identity ---
229
- { key: 'actions.erc8004_agent_enabled', category: 'actions', configPath: 'actions.erc8004_agent_enabled', defaultValue: 'true', isCredential: false },
230
- { key: 'actions.erc8004_identity_registry_address', category: 'actions', configPath: 'actions.erc8004_identity_registry_address', defaultValue: '0x8004A169FB4a3325136EB29fA0ceB6D2e539a432', isCredential: false },
231
- { key: 'actions.erc8004_reputation_registry_address', category: 'actions', configPath: 'actions.erc8004_reputation_registry_address', defaultValue: '0x8004BAa17C55a88189AE136b182e5fdA19dE9b63', isCredential: false },
232
- { key: 'actions.erc8004_validation_registry_address', category: 'actions', configPath: 'actions.erc8004_validation_registry_address', defaultValue: '', isCredential: false },
233
- { key: 'actions.erc8004_registration_file_base_url', category: 'actions', configPath: 'actions.erc8004_registration_file_base_url', defaultValue: '', isCredential: false },
234
- { key: 'actions.erc8004_auto_publish_registration', category: 'actions', configPath: 'actions.erc8004_auto_publish_registration', defaultValue: 'true', isCredential: false },
235
- { key: 'actions.erc8004_reputation_cache_ttl_sec', category: 'actions', configPath: 'actions.erc8004_reputation_cache_ttl_sec', defaultValue: '300', isCredential: false },
236
- { key: 'actions.erc8004_min_reputation_score', category: 'actions', configPath: 'actions.erc8004_min_reputation_score', defaultValue: '0', isCredential: false },
237
- { key: 'actions.erc8004_reputation_rpc_timeout_ms', category: 'actions', configPath: 'actions.erc8004_reputation_rpc_timeout_ms', defaultValue: '3000', isCredential: false },
263
+ { key: 'actions.erc8004_agent_enabled', category: 'actions', configPath: 'actions.erc8004_agent_enabled', defaultValue: 'true', isCredential: false, label: 'Erc8004 Agent Enabled', description: 'Enable or disable this feature' },
264
+ { key: 'actions.erc8004_identity_registry_address', category: 'actions', configPath: 'actions.erc8004_identity_registry_address', defaultValue: '0x8004A169FB4a3325136EB29fA0ceB6D2e539a432', isCredential: false, label: 'Erc8004 Identity Registry Address', description: 'On-chain contract or account address' },
265
+ { key: 'actions.erc8004_reputation_registry_address', category: 'actions', configPath: 'actions.erc8004_reputation_registry_address', defaultValue: '0x8004BAa17C55a88189AE136b182e5fdA19dE9b63', isCredential: false, label: 'Erc8004 Reputation Registry Address', description: 'On-chain contract or account address' },
266
+ { key: 'actions.erc8004_validation_registry_address', category: 'actions', configPath: 'actions.erc8004_validation_registry_address', defaultValue: '', isCredential: false, label: 'Erc8004 Validation Registry Address', description: 'On-chain contract or account address' },
267
+ { key: 'actions.erc8004_registration_file_base_url', category: 'actions', configPath: 'actions.erc8004_registration_file_base_url', defaultValue: '', isCredential: false, label: 'Erc8004 Registration File Base URL', description: 'ERC-8004 agent identity setting' },
268
+ { key: 'actions.erc8004_auto_publish_registration', category: 'actions', configPath: 'actions.erc8004_auto_publish_registration', defaultValue: 'true', isCredential: false, label: 'Erc8004 Auto Publish Registration', description: 'ERC-8004 agent identity setting' },
269
+ { key: 'actions.erc8004_reputation_cache_ttl_sec', category: 'actions', configPath: 'actions.erc8004_reputation_cache_ttl_sec', defaultValue: '300', isCredential: false, label: 'Erc8004 Reputation Cache TTL Sec', description: 'Cache or data time-to-live duration' },
270
+ { key: 'actions.erc8004_min_reputation_score', category: 'actions', configPath: 'actions.erc8004_min_reputation_score', defaultValue: '0', isCredential: false, label: 'Erc8004 Min Reputation Score', description: 'ERC-8004 agent identity setting' },
271
+ { key: 'actions.erc8004_reputation_rpc_timeout_ms', category: 'actions', configPath: 'actions.erc8004_reputation_rpc_timeout_ms', defaultValue: '3000', isCredential: false, label: 'Erc8004 Reputation RPC Timeout ms', description: 'Request timeout in milliseconds' },
238
272
  // --- NFT Indexer ---
239
- { key: 'actions.alchemy_nft_api_key', category: 'actions', configPath: 'actions.alchemy_nft_api_key', defaultValue: '', isCredential: true },
240
- { key: 'actions.helius_das_api_key', category: 'actions', configPath: 'actions.helius_das_api_key', defaultValue: '', isCredential: true },
241
- { key: 'actions.nft_indexer_cache_ttl_sec', category: 'actions', configPath: 'actions.nft_indexer_cache_ttl_sec', defaultValue: '300', isCredential: false },
273
+ { key: 'actions.alchemy_nft_api_key', category: 'actions', configPath: 'actions.alchemy_nft_api_key', defaultValue: '', isCredential: true, label: 'Alchemy Nft API Key', description: 'API key for external service authentication' },
274
+ { key: 'actions.helius_das_api_key', category: 'actions', configPath: 'actions.helius_das_api_key', defaultValue: '', isCredential: true, label: 'Helius Das API Key', description: 'API key for external service authentication' },
275
+ { key: 'actions.nft_indexer_cache_ttl_sec', category: 'actions', configPath: 'actions.nft_indexer_cache_ttl_sec', defaultValue: '300', isCredential: false, label: 'Nft Indexer Cache TTL Sec', description: 'Cache or data time-to-live duration' },
242
276
  // --- D'CENT Swap Aggregator ---
243
- { key: 'actions.dcent_swap_enabled', category: 'actions', configPath: 'actions.dcent_swap_enabled', defaultValue: 'true', isCredential: false },
244
- { key: 'actions.dcent_swap_api_url', category: 'actions', configPath: 'actions.dcent_swap_api_url', defaultValue: 'https://agent-swap.dcentwallet.com', isCredential: false },
245
- { key: 'actions.dcent_swap_default_slippage_bps', category: 'actions', configPath: 'actions.dcent_swap_default_slippage_bps', defaultValue: '100', isCredential: false },
246
- { key: 'actions.dcent_swap_max_slippage_bps', category: 'actions', configPath: 'actions.dcent_swap_max_slippage_bps', defaultValue: '500', isCredential: false },
247
- { key: 'actions.dcent_swap_currency_cache_ttl_ms', category: 'actions', configPath: 'actions.dcent_swap_currency_cache_ttl_ms', defaultValue: '86400000', isCredential: false },
277
+ { key: 'actions.dcent_swap_enabled', category: 'actions', configPath: 'actions.dcent_swap_enabled', defaultValue: 'true', isCredential: false, label: 'Dcent Swap Enabled', description: 'Enable or disable this feature' },
278
+ { key: 'actions.dcent_swap_api_url', category: 'actions', configPath: 'actions.dcent_swap_api_url', defaultValue: 'https://agent-swap.dcentwallet.com', isCredential: false, label: 'Dcent Swap API URL', description: 'Base URL for external API requests' },
279
+ { key: 'actions.dcent_swap_default_slippage_bps', category: 'actions', configPath: 'actions.dcent_swap_default_slippage_bps', defaultValue: '100', isCredential: false, label: 'Dcent Swap Default Slippage BPS', description: 'Slippage tolerance in basis points (1 bps = 0.01%)' },
280
+ { key: 'actions.dcent_swap_max_slippage_bps', category: 'actions', configPath: 'actions.dcent_swap_max_slippage_bps', defaultValue: '500', isCredential: false, label: 'Dcent Swap Max Slippage BPS', description: 'Slippage tolerance in basis points (1 bps = 0.01%)' },
281
+ { key: 'actions.dcent_swap_currency_cache_ttl_ms', category: 'actions', configPath: 'actions.dcent_swap_currency_cache_ttl_ms', defaultValue: '86400000', isCredential: false, label: 'Dcent Swap Currency Cache TTL ms', description: 'Cache or data time-to-live duration' },
248
282
  // --- Hyperliquid Perp Trading (Phase 349) ---
249
- { key: 'actions.hyperliquid_enabled', category: 'actions', configPath: 'actions.hyperliquid_enabled', defaultValue: 'false', isCredential: false },
250
- { key: 'actions.hyperliquid_network', category: 'actions', configPath: 'actions.hyperliquid_network', defaultValue: 'mainnet', isCredential: false },
251
- { key: 'actions.hyperliquid_api_url', category: 'actions', configPath: 'actions.hyperliquid_api_url', defaultValue: '', isCredential: false },
252
- { key: 'actions.hyperliquid_rate_limit_weight_per_min', category: 'actions', configPath: 'actions.hyperliquid_rate_limit_weight_per_min', defaultValue: '600', isCredential: false },
253
- { key: 'actions.hyperliquid_default_leverage', category: 'actions', configPath: 'actions.hyperliquid_default_leverage', defaultValue: '1', isCredential: false },
254
- { key: 'actions.hyperliquid_default_margin_mode', category: 'actions', configPath: 'actions.hyperliquid_default_margin_mode', defaultValue: 'CROSS', isCredential: false },
255
- { key: 'actions.hyperliquid_builder_address', category: 'actions', configPath: 'actions.hyperliquid_builder_address', defaultValue: '', isCredential: false },
256
- { key: 'actions.hyperliquid_builder_fee', category: 'actions', configPath: 'actions.hyperliquid_builder_fee', defaultValue: '0', isCredential: false },
257
- { key: 'actions.hyperliquid_order_status_poll_interval_ms', category: 'actions', configPath: 'actions.hyperliquid_order_status_poll_interval_ms', defaultValue: '2000', isCredential: false },
283
+ { key: 'actions.hyperliquid_enabled', category: 'actions', configPath: 'actions.hyperliquid_enabled', defaultValue: 'false', isCredential: false, label: 'Hyperliquid Enabled', description: 'Enable or disable this feature' },
284
+ { key: 'actions.hyperliquid_network', category: 'actions', configPath: 'actions.hyperliquid_network', defaultValue: 'mainnet', isCredential: false, label: 'Hyperliquid Network', description: 'Hyperliquid trading platform setting' },
285
+ { key: 'actions.hyperliquid_api_url', category: 'actions', configPath: 'actions.hyperliquid_api_url', defaultValue: '', isCredential: false, label: 'Hyperliquid API URL', description: 'Base URL for external API requests' },
286
+ { key: 'actions.hyperliquid_rate_limit_weight_per_min', category: 'actions', configPath: 'actions.hyperliquid_rate_limit_weight_per_min', defaultValue: '600', isCredential: false, label: 'Hyperliquid Rate Limit Weight Per Min', description: 'Hyperliquid trading platform setting' },
287
+ { key: 'actions.hyperliquid_default_leverage', category: 'actions', configPath: 'actions.hyperliquid_default_leverage', defaultValue: '1', isCredential: false, label: 'Hyperliquid Default Leverage', description: 'Hyperliquid trading platform setting' },
288
+ { key: 'actions.hyperliquid_default_margin_mode', category: 'actions', configPath: 'actions.hyperliquid_default_margin_mode', defaultValue: 'CROSS', isCredential: false, label: 'Hyperliquid Default Margin Mode', description: 'Hyperliquid trading platform setting' },
289
+ { key: 'actions.hyperliquid_builder_address', category: 'actions', configPath: 'actions.hyperliquid_builder_address', defaultValue: '', isCredential: false, label: 'Hyperliquid Builder Address', description: 'On-chain contract or account address' },
290
+ { key: 'actions.hyperliquid_builder_fee', category: 'actions', configPath: 'actions.hyperliquid_builder_fee', defaultValue: '0', isCredential: false, label: 'Hyperliquid Builder Fee', description: 'Hyperliquid trading platform setting' },
291
+ { key: 'actions.hyperliquid_order_status_poll_interval_ms', category: 'actions', configPath: 'actions.hyperliquid_order_status_poll_interval_ms', defaultValue: '2000', isCredential: false, label: 'Hyperliquid Order Status Poll Interval ms', description: 'Polling or check interval duration' },
258
292
  // --- Polymarket Prediction Market ---
259
- { key: 'actions.polymarket_enabled', category: 'actions', configPath: 'actions.polymarket_enabled', defaultValue: 'false', isCredential: false },
260
- { key: 'actions.polymarket_default_fee_bps', category: 'actions', configPath: 'actions.polymarket_default_fee_bps', defaultValue: '0', isCredential: false },
261
- { key: 'actions.polymarket_order_expiry_seconds', category: 'actions', configPath: 'actions.polymarket_order_expiry_seconds', defaultValue: '86400', isCredential: false },
262
- { key: 'actions.polymarket_max_position_usdc', category: 'actions', configPath: 'actions.polymarket_max_position_usdc', defaultValue: '1000', isCredential: false },
263
- { key: 'actions.polymarket_proxy_wallet', category: 'actions', configPath: 'actions.polymarket_proxy_wallet', defaultValue: 'false', isCredential: false },
264
- { key: 'actions.polymarket_neg_risk_enabled', category: 'actions', configPath: 'actions.polymarket_neg_risk_enabled', defaultValue: 'true', isCredential: false },
265
- { key: 'actions.polymarket_auto_approve_ctf', category: 'actions', configPath: 'actions.polymarket_auto_approve_ctf', defaultValue: 'true', isCredential: false },
293
+ { key: 'actions.polymarket_enabled', category: 'actions', configPath: 'actions.polymarket_enabled', defaultValue: 'false', isCredential: false, label: 'Polymarket Enabled', description: 'Enable or disable this feature' },
294
+ { key: 'actions.polymarket_default_fee_bps', category: 'actions', configPath: 'actions.polymarket_default_fee_bps', defaultValue: '0', isCredential: false, label: 'Polymarket Default Fee BPS', description: 'Polymarket prediction market setting' },
295
+ { key: 'actions.polymarket_order_expiry_seconds', category: 'actions', configPath: 'actions.polymarket_order_expiry_seconds', defaultValue: '86400', isCredential: false, label: 'Polymarket Order Expiry Seconds', description: 'Polymarket prediction market setting' },
296
+ { key: 'actions.polymarket_max_position_usdc', category: 'actions', configPath: 'actions.polymarket_max_position_usdc', defaultValue: '1000', isCredential: false, label: 'Polymarket Max Position Usdc', description: 'Maximum amount in USD' },
297
+ { key: 'actions.polymarket_proxy_wallet', category: 'actions', configPath: 'actions.polymarket_proxy_wallet', defaultValue: 'false', isCredential: false, label: 'Polymarket Proxy Wallet', description: 'Polymarket prediction market setting' },
298
+ { key: 'actions.polymarket_neg_risk_enabled', category: 'actions', configPath: 'actions.polymarket_neg_risk_enabled', defaultValue: 'true', isCredential: false, label: 'Polymarket Neg Risk Enabled', description: 'Enable or disable this feature' },
299
+ { key: 'actions.polymarket_auto_approve_ctf', category: 'actions', configPath: 'actions.polymarket_auto_approve_ctf', defaultValue: 'true', isCredential: false, label: 'Polymarket Auto Approve Ctf', description: 'Polymarket prediction market setting' },
266
300
  // --- Across Bridge ---
267
- { key: 'actions.across_bridge_enabled', category: 'actions', configPath: 'actions.across_bridge_enabled', defaultValue: 'false', isCredential: false },
268
- { key: 'actions.across_bridge_api_base_url', category: 'actions', configPath: 'actions.across_bridge_api_base_url', defaultValue: 'https://app.across.to/api', isCredential: false },
269
- { key: 'actions.across_bridge_integrator_id', category: 'actions', configPath: 'actions.across_bridge_integrator_id', defaultValue: '', isCredential: false },
270
- { key: 'actions.across_bridge_fill_deadline_buffer_sec', category: 'actions', configPath: 'actions.across_bridge_fill_deadline_buffer_sec', defaultValue: '21600', isCredential: false },
271
- { key: 'actions.across_bridge_default_slippage_pct', category: 'actions', configPath: 'actions.across_bridge_default_slippage_pct', defaultValue: '0.01', isCredential: false },
272
- { key: 'actions.across_bridge_max_slippage_pct', category: 'actions', configPath: 'actions.across_bridge_max_slippage_pct', defaultValue: '0.03', isCredential: false },
273
- { key: 'actions.across_bridge_request_timeout_ms', category: 'actions', configPath: 'actions.across_bridge_request_timeout_ms', defaultValue: '10000', isCredential: false },
301
+ { key: 'actions.across_bridge_enabled', category: 'actions', configPath: 'actions.across_bridge_enabled', defaultValue: 'false', isCredential: false, label: 'Across Bridge Enabled', description: 'Enable or disable this feature' },
302
+ { key: 'actions.across_bridge_api_base_url', category: 'actions', configPath: 'actions.across_bridge_api_base_url', defaultValue: 'https://app.across.to/api', isCredential: false, label: 'Across Bridge API Base URL', description: 'Base URL for external API requests' },
303
+ { key: 'actions.across_bridge_integrator_id', category: 'actions', configPath: 'actions.across_bridge_integrator_id', defaultValue: '', isCredential: false, label: 'Across Bridge Integrator Id', description: 'Across Protocol cross-chain bridge setting' },
304
+ { key: 'actions.across_bridge_fill_deadline_buffer_sec', category: 'actions', configPath: 'actions.across_bridge_fill_deadline_buffer_sec', defaultValue: '21600', isCredential: false, label: 'Across Bridge Fill Deadline Buffer Sec', description: 'Across Protocol cross-chain bridge setting' },
305
+ { key: 'actions.across_bridge_default_slippage_pct', category: 'actions', configPath: 'actions.across_bridge_default_slippage_pct', defaultValue: '0.01', isCredential: false, label: 'Across Bridge Default Slippage %', description: 'Slippage tolerance as decimal percentage' },
306
+ { key: 'actions.across_bridge_max_slippage_pct', category: 'actions', configPath: 'actions.across_bridge_max_slippage_pct', defaultValue: '0.03', isCredential: false, label: 'Across Bridge Max Slippage %', description: 'Slippage tolerance as decimal percentage' },
307
+ { key: 'actions.across_bridge_request_timeout_ms', category: 'actions', configPath: 'actions.across_bridge_request_timeout_ms', defaultValue: '10000', isCredential: false, label: 'Across Bridge Request Timeout ms', description: 'Request timeout in milliseconds' },
274
308
  // --- erc8128 category (ERC-8128 Signed HTTP Requests) ---
275
- { key: 'erc8128.enabled', category: 'erc8128', configPath: 'erc8128.enabled', defaultValue: 'false', isCredential: false },
276
- { key: 'erc8128.default_preset', category: 'erc8128', configPath: 'erc8128.default_preset', defaultValue: 'standard', isCredential: false },
277
- { key: 'erc8128.default_ttl_sec', category: 'erc8128', configPath: 'erc8128.default_ttl_sec', defaultValue: '300', isCredential: false },
278
- { key: 'erc8128.default_nonce', category: 'erc8128', configPath: 'erc8128.default_nonce', defaultValue: 'true', isCredential: false },
279
- { key: 'erc8128.default_algorithm', category: 'erc8128', configPath: 'erc8128.default_algorithm', defaultValue: 'ethereum-eip191', isCredential: false },
280
- { key: 'erc8128.default_rate_limit_rpm', category: 'erc8128', configPath: 'erc8128.default_rate_limit_rpm', defaultValue: '60', isCredential: false },
309
+ { key: 'erc8128.enabled', category: 'erc8128', configPath: 'erc8128.enabled', defaultValue: 'false', isCredential: false, label: 'Enabled', description: 'Enable or disable this feature' },
310
+ { key: 'erc8128.default_preset', category: 'erc8128', configPath: 'erc8128.default_preset', defaultValue: 'standard', isCredential: false, label: 'Default Preset', description: 'Default signing preset for ERC-8128 requests' },
311
+ { key: 'erc8128.default_ttl_sec', category: 'erc8128', configPath: 'erc8128.default_ttl_sec', defaultValue: '300', isCredential: false, label: 'Default TTL Sec', description: 'Cache or data time-to-live duration' },
312
+ { key: 'erc8128.default_nonce', category: 'erc8128', configPath: 'erc8128.default_nonce', defaultValue: 'true', isCredential: false, label: 'Default Nonce', description: 'Include nonce in ERC-8128 signatures by default' },
313
+ { key: 'erc8128.default_algorithm', category: 'erc8128', configPath: 'erc8128.default_algorithm', defaultValue: 'ethereum-eip191', isCredential: false, label: 'Default Algorithm', description: 'Default signing algorithm for ERC-8128' },
314
+ { key: 'erc8128.default_rate_limit_rpm', category: 'erc8128', configPath: 'erc8128.default_rate_limit_rpm', defaultValue: '60', isCredential: false, label: 'Default Rate Limit RPM', description: 'Rate limit: maximum requests per minute' },
315
+ // --- rpc_proxy category (EVM RPC proxy mode settings) ---
316
+ { key: 'rpc_proxy.enabled', category: 'rpc_proxy', configPath: 'rpc_proxy.enabled', defaultValue: 'false', isCredential: false, label: 'Enabled', description: 'Enable or disable this feature' },
317
+ { key: 'rpc_proxy.allowed_methods', category: 'rpc_proxy', configPath: 'rpc_proxy.allowed_methods', defaultValue: '[]', isCredential: false, label: 'Allowed Methods', description: 'JSON array of allowed RPC methods for proxy' },
318
+ { key: 'rpc_proxy.delay_timeout_seconds', category: 'rpc_proxy', configPath: 'rpc_proxy.delay_timeout_seconds', defaultValue: '300', isCredential: false, label: 'Delay Timeout Seconds', description: 'Delay timeout for proxied signing transactions' },
319
+ { key: 'rpc_proxy.approval_timeout_seconds', category: 'rpc_proxy', configPath: 'rpc_proxy.approval_timeout_seconds', defaultValue: '600', isCredential: false, label: 'Approval Timeout Seconds', description: 'Approval timeout for proxied signing transactions' },
320
+ { key: 'rpc_proxy.max_gas_limit', category: 'rpc_proxy', configPath: 'rpc_proxy.max_gas_limit', defaultValue: '30000000', isCredential: false, label: 'Max Gas Limit', description: 'Maximum gas limit for proxied transactions' },
321
+ { key: 'rpc_proxy.max_bytecode_size', category: 'rpc_proxy', configPath: 'rpc_proxy.max_bytecode_size', defaultValue: '49152', isCredential: false, label: 'Max Bytecode Size', description: 'Maximum bytecode size for contract deployment via proxy' },
322
+ { key: 'rpc_proxy.deploy_default_tier', category: 'rpc_proxy', configPath: 'rpc_proxy.deploy_default_tier', defaultValue: 'APPROVAL', isCredential: false, label: 'Deploy Default Tier', description: 'Default security tier for contract deployments via proxy' },
281
323
  ];
282
324
  // ---------------------------------------------------------------------------
283
325
  // [Phase 331] Action tier override Zod schema
@@ -305,6 +347,8 @@ function getDynamicTierDefinition(key) {
305
347
  configPath: key,
306
348
  defaultValue: '',
307
349
  isCredential: false,
350
+ label: deriveLabel(key),
351
+ description: 'Action tier override (INSTANT, NOTIFY, DELAY, APPROVAL, or empty for provider default)',
308
352
  };
309
353
  }
310
354
  // ---------------------------------------------------------------------------
@@ -317,4 +361,50 @@ const definitionMap = new Map(SETTING_DEFINITIONS.map((def) => [def.key, def]));
317
361
  export function getSettingDefinition(key) {
318
362
  return definitionMap.get(key) ?? getDynamicTierDefinition(key);
319
363
  }
364
+ // ---------------------------------------------------------------------------
365
+ // Category labels
366
+ // ---------------------------------------------------------------------------
367
+ const CATEGORY_LABELS = {
368
+ notifications: 'Notifications',
369
+ rpc: 'RPC Endpoints',
370
+ security: 'Security',
371
+ policy: 'Policy Defaults',
372
+ daemon: 'Daemon',
373
+ walletconnect: 'WalletConnect',
374
+ oracle: 'Price Oracle',
375
+ display: 'Display',
376
+ autostop: 'Auto-Stop',
377
+ monitoring: 'Balance Monitoring',
378
+ telegram: 'Telegram Bot',
379
+ signing_sdk: 'Signing SDK',
380
+ incoming: 'Incoming TX Monitor',
381
+ actions: 'Action Providers',
382
+ gas_condition: 'Gas Conditional',
383
+ rpc_pool: 'RPC Pool',
384
+ position_tracker: 'Position Tracker',
385
+ smart_account: 'Smart Account',
386
+ erc8128: 'ERC-8128',
387
+ rpc_proxy: 'RPC Proxy',
388
+ };
389
+ /**
390
+ * Group all setting definitions by category.
391
+ * Returns an array of { name, label, settings } objects.
392
+ */
393
+ export function groupSettingsByCategory() {
394
+ const groups = new Map();
395
+ for (const def of SETTING_DEFINITIONS) {
396
+ const existing = groups.get(def.category);
397
+ if (existing) {
398
+ existing.push(def);
399
+ }
400
+ else {
401
+ groups.set(def.category, [def]);
402
+ }
403
+ }
404
+ return Array.from(groups.entries()).map(([name, settings]) => ({
405
+ name,
406
+ label: CATEGORY_LABELS[name] ?? name,
407
+ settings,
408
+ }));
409
+ }
320
410
  //# sourceMappingURL=setting-keys.js.map