@waiaas/daemon 2.0.0-rc.1

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 (480) hide show
  1. package/dist/api/error-hints.d.ts +15 -0
  2. package/dist/api/error-hints.d.ts.map +1 -0
  3. package/dist/api/error-hints.js +71 -0
  4. package/dist/api/error-hints.js.map +1 -0
  5. package/dist/api/index.d.ts +11 -0
  6. package/dist/api/index.d.ts.map +1 -0
  7. package/dist/api/index.js +14 -0
  8. package/dist/api/index.js.map +1 -0
  9. package/dist/api/middleware/address-validation.d.ts +38 -0
  10. package/dist/api/middleware/address-validation.d.ts.map +1 -0
  11. package/dist/api/middleware/address-validation.js +134 -0
  12. package/dist/api/middleware/address-validation.js.map +1 -0
  13. package/dist/api/middleware/csp.d.ts +17 -0
  14. package/dist/api/middleware/csp.d.ts.map +1 -0
  15. package/dist/api/middleware/csp.js +31 -0
  16. package/dist/api/middleware/csp.js.map +1 -0
  17. package/dist/api/middleware/error-handler.d.ts +16 -0
  18. package/dist/api/middleware/error-handler.d.ts.map +1 -0
  19. package/dist/api/middleware/error-handler.js +46 -0
  20. package/dist/api/middleware/error-handler.js.map +1 -0
  21. package/dist/api/middleware/host-guard.d.ts +11 -0
  22. package/dist/api/middleware/host-guard.d.ts.map +1 -0
  23. package/dist/api/middleware/host-guard.js +25 -0
  24. package/dist/api/middleware/host-guard.js.map +1 -0
  25. package/dist/api/middleware/index.d.ts +13 -0
  26. package/dist/api/middleware/index.d.ts.map +1 -0
  27. package/dist/api/middleware/index.js +13 -0
  28. package/dist/api/middleware/index.js.map +1 -0
  29. package/dist/api/middleware/kill-switch-guard.d.ts +19 -0
  30. package/dist/api/middleware/kill-switch-guard.d.ts.map +1 -0
  31. package/dist/api/middleware/kill-switch-guard.js +49 -0
  32. package/dist/api/middleware/kill-switch-guard.js.map +1 -0
  33. package/dist/api/middleware/master-auth.d.ts +15 -0
  34. package/dist/api/middleware/master-auth.d.ts.map +1 -0
  35. package/dist/api/middleware/master-auth.js +35 -0
  36. package/dist/api/middleware/master-auth.js.map +1 -0
  37. package/dist/api/middleware/owner-auth.d.ts +30 -0
  38. package/dist/api/middleware/owner-auth.d.ts.map +1 -0
  39. package/dist/api/middleware/owner-auth.js +133 -0
  40. package/dist/api/middleware/owner-auth.js.map +1 -0
  41. package/dist/api/middleware/request-id.d.ts +10 -0
  42. package/dist/api/middleware/request-id.d.ts.map +1 -0
  43. package/dist/api/middleware/request-id.js +18 -0
  44. package/dist/api/middleware/request-id.js.map +1 -0
  45. package/dist/api/middleware/request-logger.d.ts +9 -0
  46. package/dist/api/middleware/request-logger.d.ts.map +1 -0
  47. package/dist/api/middleware/request-logger.js +18 -0
  48. package/dist/api/middleware/request-logger.js.map +1 -0
  49. package/dist/api/middleware/session-auth.d.ts +21 -0
  50. package/dist/api/middleware/session-auth.d.ts.map +1 -0
  51. package/dist/api/middleware/session-auth.js +51 -0
  52. package/dist/api/middleware/session-auth.js.map +1 -0
  53. package/dist/api/middleware/siwe-verify.d.ts +31 -0
  54. package/dist/api/middleware/siwe-verify.d.ts.map +1 -0
  55. package/dist/api/middleware/siwe-verify.js +55 -0
  56. package/dist/api/middleware/siwe-verify.js.map +1 -0
  57. package/dist/api/routes/actions.d.ts +56 -0
  58. package/dist/api/routes/actions.d.ts.map +1 -0
  59. package/dist/api/routes/actions.js +291 -0
  60. package/dist/api/routes/actions.js.map +1 -0
  61. package/dist/api/routes/admin.d.ts +99 -0
  62. package/dist/api/routes/admin.d.ts.map +1 -0
  63. package/dist/api/routes/admin.js +1304 -0
  64. package/dist/api/routes/admin.js.map +1 -0
  65. package/dist/api/routes/display-currency-helper.d.ts +26 -0
  66. package/dist/api/routes/display-currency-helper.d.ts.map +1 -0
  67. package/dist/api/routes/display-currency-helper.js +47 -0
  68. package/dist/api/routes/display-currency-helper.js.map +1 -0
  69. package/dist/api/routes/health.d.ts +14 -0
  70. package/dist/api/routes/health.d.ts.map +1 -0
  71. package/dist/api/routes/health.js +47 -0
  72. package/dist/api/routes/health.js.map +1 -0
  73. package/dist/api/routes/index.d.ts +15 -0
  74. package/dist/api/routes/index.d.ts.map +1 -0
  75. package/dist/api/routes/index.js +15 -0
  76. package/dist/api/routes/index.js.map +1 -0
  77. package/dist/api/routes/mcp.d.ts +30 -0
  78. package/dist/api/routes/mcp.d.ts.map +1 -0
  79. package/dist/api/routes/mcp.js +156 -0
  80. package/dist/api/routes/mcp.js.map +1 -0
  81. package/dist/api/routes/nonce.d.ts +20 -0
  82. package/dist/api/routes/nonce.d.ts.map +1 -0
  83. package/dist/api/routes/nonce.js +48 -0
  84. package/dist/api/routes/nonce.js.map +1 -0
  85. package/dist/api/routes/openapi-schemas.d.ts +2281 -0
  86. package/dist/api/routes/openapi-schemas.d.ts.map +1 -0
  87. package/dist/api/routes/openapi-schemas.js +770 -0
  88. package/dist/api/routes/openapi-schemas.js.map +1 -0
  89. package/dist/api/routes/policies.d.ts +29 -0
  90. package/dist/api/routes/policies.d.ts.map +1 -0
  91. package/dist/api/routes/policies.js +332 -0
  92. package/dist/api/routes/policies.js.map +1 -0
  93. package/dist/api/routes/sessions.d.ts +35 -0
  94. package/dist/api/routes/sessions.d.ts.map +1 -0
  95. package/dist/api/routes/sessions.js +347 -0
  96. package/dist/api/routes/sessions.js.map +1 -0
  97. package/dist/api/routes/skills.d.ts +9 -0
  98. package/dist/api/routes/skills.d.ts.map +1 -0
  99. package/dist/api/routes/skills.js +59 -0
  100. package/dist/api/routes/skills.js.map +1 -0
  101. package/dist/api/routes/tokens.d.ts +25 -0
  102. package/dist/api/routes/tokens.d.ts.map +1 -0
  103. package/dist/api/routes/tokens.js +161 -0
  104. package/dist/api/routes/tokens.js.map +1 -0
  105. package/dist/api/routes/transactions.d.ts +68 -0
  106. package/dist/api/routes/transactions.d.ts.map +1 -0
  107. package/dist/api/routes/transactions.js +576 -0
  108. package/dist/api/routes/transactions.js.map +1 -0
  109. package/dist/api/routes/utils.d.ts +9 -0
  110. package/dist/api/routes/utils.d.ts.map +1 -0
  111. package/dist/api/routes/utils.js +52 -0
  112. package/dist/api/routes/utils.js.map +1 -0
  113. package/dist/api/routes/wallet.d.ts +36 -0
  114. package/dist/api/routes/wallet.d.ts.map +1 -0
  115. package/dist/api/routes/wallet.js +358 -0
  116. package/dist/api/routes/wallet.js.map +1 -0
  117. package/dist/api/routes/wallets.d.ts +43 -0
  118. package/dist/api/routes/wallets.d.ts.map +1 -0
  119. package/dist/api/routes/wallets.js +630 -0
  120. package/dist/api/routes/wallets.js.map +1 -0
  121. package/dist/api/routes/wc.d.ts +46 -0
  122. package/dist/api/routes/wc.d.ts.map +1 -0
  123. package/dist/api/routes/wc.js +354 -0
  124. package/dist/api/routes/wc.js.map +1 -0
  125. package/dist/api/routes/x402.d.ts +61 -0
  126. package/dist/api/routes/x402.d.ts.map +1 -0
  127. package/dist/api/routes/x402.js +493 -0
  128. package/dist/api/routes/x402.js.map +1 -0
  129. package/dist/api/server.d.ts +81 -0
  130. package/dist/api/server.d.ts.map +1 -0
  131. package/dist/api/server.js +406 -0
  132. package/dist/api/server.js.map +1 -0
  133. package/dist/index.d.ts +35 -0
  134. package/dist/index.d.ts.map +1 -0
  135. package/dist/index.js +43 -0
  136. package/dist/index.js.map +1 -0
  137. package/dist/infrastructure/action/action-provider-registry.d.ts +77 -0
  138. package/dist/infrastructure/action/action-provider-registry.d.ts.map +1 -0
  139. package/dist/infrastructure/action/action-provider-registry.js +239 -0
  140. package/dist/infrastructure/action/action-provider-registry.js.map +1 -0
  141. package/dist/infrastructure/action/api-key-store.d.ts +60 -0
  142. package/dist/infrastructure/action/api-key-store.d.ts.map +1 -0
  143. package/dist/infrastructure/action/api-key-store.js +130 -0
  144. package/dist/infrastructure/action/api-key-store.js.map +1 -0
  145. package/dist/infrastructure/action/index.d.ts +10 -0
  146. package/dist/infrastructure/action/index.d.ts.map +1 -0
  147. package/dist/infrastructure/action/index.js +9 -0
  148. package/dist/infrastructure/action/index.js.map +1 -0
  149. package/dist/infrastructure/adapter-pool.d.ts +50 -0
  150. package/dist/infrastructure/adapter-pool.d.ts.map +1 -0
  151. package/dist/infrastructure/adapter-pool.js +110 -0
  152. package/dist/infrastructure/adapter-pool.js.map +1 -0
  153. package/dist/infrastructure/backup/backup-service.d.ts +53 -0
  154. package/dist/infrastructure/backup/backup-service.d.ts.map +1 -0
  155. package/dist/infrastructure/backup/backup-service.js +158 -0
  156. package/dist/infrastructure/backup/backup-service.js.map +1 -0
  157. package/dist/infrastructure/backup/index.d.ts +2 -0
  158. package/dist/infrastructure/backup/index.d.ts.map +1 -0
  159. package/dist/infrastructure/backup/index.js +2 -0
  160. package/dist/infrastructure/backup/index.js.map +1 -0
  161. package/dist/infrastructure/config/index.d.ts +8 -0
  162. package/dist/infrastructure/config/index.d.ts.map +1 -0
  163. package/dist/infrastructure/config/index.js +7 -0
  164. package/dist/infrastructure/config/index.js.map +1 -0
  165. package/dist/infrastructure/config/loader.d.ts +555 -0
  166. package/dist/infrastructure/config/loader.d.ts.map +1 -0
  167. package/dist/infrastructure/config/loader.js +311 -0
  168. package/dist/infrastructure/config/loader.js.map +1 -0
  169. package/dist/infrastructure/database/checks.d.ts +19 -0
  170. package/dist/infrastructure/database/checks.d.ts.map +1 -0
  171. package/dist/infrastructure/database/checks.js +27 -0
  172. package/dist/infrastructure/database/checks.js.map +1 -0
  173. package/dist/infrastructure/database/compatibility.d.ts +36 -0
  174. package/dist/infrastructure/database/compatibility.d.ts.map +1 -0
  175. package/dist/infrastructure/database/compatibility.js +75 -0
  176. package/dist/infrastructure/database/compatibility.js.map +1 -0
  177. package/dist/infrastructure/database/connection.d.ts +36 -0
  178. package/dist/infrastructure/database/connection.d.ts.map +1 -0
  179. package/dist/infrastructure/database/connection.js +47 -0
  180. package/dist/infrastructure/database/connection.js.map +1 -0
  181. package/dist/infrastructure/database/id.d.ts +17 -0
  182. package/dist/infrastructure/database/id.d.ts.map +1 -0
  183. package/dist/infrastructure/database/id.js +20 -0
  184. package/dist/infrastructure/database/id.js.map +1 -0
  185. package/dist/infrastructure/database/index.d.ts +15 -0
  186. package/dist/infrastructure/database/index.d.ts.map +1 -0
  187. package/dist/infrastructure/database/index.js +12 -0
  188. package/dist/infrastructure/database/index.js.map +1 -0
  189. package/dist/infrastructure/database/migrate.d.ts +76 -0
  190. package/dist/infrastructure/database/migrate.d.ts.map +1 -0
  191. package/dist/infrastructure/database/migrate.js +1214 -0
  192. package/dist/infrastructure/database/migrate.js.map +1 -0
  193. package/dist/infrastructure/database/schema.d.ts +2352 -0
  194. package/dist/infrastructure/database/schema.d.ts.map +1 -0
  195. package/dist/infrastructure/database/schema.js +288 -0
  196. package/dist/infrastructure/database/schema.js.map +1 -0
  197. package/dist/infrastructure/jwt/index.d.ts +2 -0
  198. package/dist/infrastructure/jwt/index.d.ts.map +1 -0
  199. package/dist/infrastructure/jwt/index.js +2 -0
  200. package/dist/infrastructure/jwt/index.js.map +1 -0
  201. package/dist/infrastructure/jwt/jwt-secret-manager.d.ts +58 -0
  202. package/dist/infrastructure/jwt/jwt-secret-manager.d.ts.map +1 -0
  203. package/dist/infrastructure/jwt/jwt-secret-manager.js +222 -0
  204. package/dist/infrastructure/jwt/jwt-secret-manager.js.map +1 -0
  205. package/dist/infrastructure/keystore/crypto.d.ts +62 -0
  206. package/dist/infrastructure/keystore/crypto.d.ts.map +1 -0
  207. package/dist/infrastructure/keystore/crypto.js +89 -0
  208. package/dist/infrastructure/keystore/crypto.js.map +1 -0
  209. package/dist/infrastructure/keystore/index.d.ts +4 -0
  210. package/dist/infrastructure/keystore/index.d.ts.map +1 -0
  211. package/dist/infrastructure/keystore/index.js +5 -0
  212. package/dist/infrastructure/keystore/index.js.map +1 -0
  213. package/dist/infrastructure/keystore/keystore.d.ts +115 -0
  214. package/dist/infrastructure/keystore/keystore.d.ts.map +1 -0
  215. package/dist/infrastructure/keystore/keystore.js +327 -0
  216. package/dist/infrastructure/keystore/keystore.js.map +1 -0
  217. package/dist/infrastructure/keystore/memory.d.ts +45 -0
  218. package/dist/infrastructure/keystore/memory.d.ts.map +1 -0
  219. package/dist/infrastructure/keystore/memory.js +105 -0
  220. package/dist/infrastructure/keystore/memory.js.map +1 -0
  221. package/dist/infrastructure/oracle/coingecko-forex.d.ts +35 -0
  222. package/dist/infrastructure/oracle/coingecko-forex.d.ts.map +1 -0
  223. package/dist/infrastructure/oracle/coingecko-forex.js +69 -0
  224. package/dist/infrastructure/oracle/coingecko-forex.js.map +1 -0
  225. package/dist/infrastructure/oracle/coingecko-oracle.d.ts +73 -0
  226. package/dist/infrastructure/oracle/coingecko-oracle.d.ts.map +1 -0
  227. package/dist/infrastructure/oracle/coingecko-oracle.js +199 -0
  228. package/dist/infrastructure/oracle/coingecko-oracle.js.map +1 -0
  229. package/dist/infrastructure/oracle/coingecko-platform-ids.d.ts +32 -0
  230. package/dist/infrastructure/oracle/coingecko-platform-ids.d.ts.map +1 -0
  231. package/dist/infrastructure/oracle/coingecko-platform-ids.js +30 -0
  232. package/dist/infrastructure/oracle/coingecko-platform-ids.js.map +1 -0
  233. package/dist/infrastructure/oracle/forex-currencies.d.ts +36 -0
  234. package/dist/infrastructure/oracle/forex-currencies.d.ts.map +1 -0
  235. package/dist/infrastructure/oracle/forex-currencies.js +71 -0
  236. package/dist/infrastructure/oracle/forex-currencies.js.map +1 -0
  237. package/dist/infrastructure/oracle/forex-rate-service.d.ts +51 -0
  238. package/dist/infrastructure/oracle/forex-rate-service.d.ts.map +1 -0
  239. package/dist/infrastructure/oracle/forex-rate-service.js +149 -0
  240. package/dist/infrastructure/oracle/forex-rate-service.js.map +1 -0
  241. package/dist/infrastructure/oracle/index.d.ts +18 -0
  242. package/dist/infrastructure/oracle/index.d.ts.map +1 -0
  243. package/dist/infrastructure/oracle/index.js +19 -0
  244. package/dist/infrastructure/oracle/index.js.map +1 -0
  245. package/dist/infrastructure/oracle/oracle-chain.d.ts +101 -0
  246. package/dist/infrastructure/oracle/oracle-chain.d.ts.map +1 -0
  247. package/dist/infrastructure/oracle/oracle-chain.js +163 -0
  248. package/dist/infrastructure/oracle/oracle-chain.js.map +1 -0
  249. package/dist/infrastructure/oracle/oracle-errors.d.ts +42 -0
  250. package/dist/infrastructure/oracle/oracle-errors.d.ts.map +1 -0
  251. package/dist/infrastructure/oracle/oracle-errors.js +53 -0
  252. package/dist/infrastructure/oracle/oracle-errors.js.map +1 -0
  253. package/dist/infrastructure/oracle/price-age.d.ts +38 -0
  254. package/dist/infrastructure/oracle/price-age.d.ts.map +1 -0
  255. package/dist/infrastructure/oracle/price-age.js +44 -0
  256. package/dist/infrastructure/oracle/price-age.js.map +1 -0
  257. package/dist/infrastructure/oracle/price-cache.d.ts +99 -0
  258. package/dist/infrastructure/oracle/price-cache.d.ts.map +1 -0
  259. package/dist/infrastructure/oracle/price-cache.js +173 -0
  260. package/dist/infrastructure/oracle/price-cache.js.map +1 -0
  261. package/dist/infrastructure/oracle/pyth-feed-ids.d.ts +31 -0
  262. package/dist/infrastructure/oracle/pyth-feed-ids.d.ts.map +1 -0
  263. package/dist/infrastructure/oracle/pyth-feed-ids.js +44 -0
  264. package/dist/infrastructure/oracle/pyth-feed-ids.js.map +1 -0
  265. package/dist/infrastructure/oracle/pyth-oracle.d.ts +69 -0
  266. package/dist/infrastructure/oracle/pyth-oracle.d.ts.map +1 -0
  267. package/dist/infrastructure/oracle/pyth-oracle.js +149 -0
  268. package/dist/infrastructure/oracle/pyth-oracle.js.map +1 -0
  269. package/dist/infrastructure/settings/hot-reload.d.ts +71 -0
  270. package/dist/infrastructure/settings/hot-reload.d.ts.map +1 -0
  271. package/dist/infrastructure/settings/hot-reload.js +315 -0
  272. package/dist/infrastructure/settings/hot-reload.js.map +1 -0
  273. package/dist/infrastructure/settings/index.d.ts +13 -0
  274. package/dist/infrastructure/settings/index.d.ts.map +1 -0
  275. package/dist/infrastructure/settings/index.js +10 -0
  276. package/dist/infrastructure/settings/index.js.map +1 -0
  277. package/dist/infrastructure/settings/setting-keys.d.ts +28 -0
  278. package/dist/infrastructure/settings/setting-keys.d.ts.map +1 -0
  279. package/dist/infrastructure/settings/setting-keys.js +105 -0
  280. package/dist/infrastructure/settings/setting-keys.js.map +1 -0
  281. package/dist/infrastructure/settings/settings-crypto.d.ts +39 -0
  282. package/dist/infrastructure/settings/settings-crypto.d.ts.map +1 -0
  283. package/dist/infrastructure/settings/settings-crypto.js +73 -0
  284. package/dist/infrastructure/settings/settings-crypto.js.map +1 -0
  285. package/dist/infrastructure/settings/settings-service.d.ts +82 -0
  286. package/dist/infrastructure/settings/settings-service.d.ts.map +1 -0
  287. package/dist/infrastructure/settings/settings-service.js +267 -0
  288. package/dist/infrastructure/settings/settings-service.js.map +1 -0
  289. package/dist/infrastructure/telegram/index.d.ts +6 -0
  290. package/dist/infrastructure/telegram/index.d.ts.map +1 -0
  291. package/dist/infrastructure/telegram/index.js +5 -0
  292. package/dist/infrastructure/telegram/index.js.map +1 -0
  293. package/dist/infrastructure/telegram/telegram-api.d.ts +35 -0
  294. package/dist/infrastructure/telegram/telegram-api.d.ts.map +1 -0
  295. package/dist/infrastructure/telegram/telegram-api.js +82 -0
  296. package/dist/infrastructure/telegram/telegram-api.js.map +1 -0
  297. package/dist/infrastructure/telegram/telegram-auth.d.ts +57 -0
  298. package/dist/infrastructure/telegram/telegram-auth.d.ts.map +1 -0
  299. package/dist/infrastructure/telegram/telegram-auth.js +88 -0
  300. package/dist/infrastructure/telegram/telegram-auth.js.map +1 -0
  301. package/dist/infrastructure/telegram/telegram-bot-service.d.ts +95 -0
  302. package/dist/infrastructure/telegram/telegram-bot-service.d.ts.map +1 -0
  303. package/dist/infrastructure/telegram/telegram-bot-service.js +564 -0
  304. package/dist/infrastructure/telegram/telegram-bot-service.js.map +1 -0
  305. package/dist/infrastructure/telegram/telegram-keyboard.d.ts +27 -0
  306. package/dist/infrastructure/telegram/telegram-keyboard.d.ts.map +1 -0
  307. package/dist/infrastructure/telegram/telegram-keyboard.js +52 -0
  308. package/dist/infrastructure/telegram/telegram-keyboard.js.map +1 -0
  309. package/dist/infrastructure/telegram/telegram-types.d.ts +43 -0
  310. package/dist/infrastructure/telegram/telegram-types.d.ts.map +1 -0
  311. package/dist/infrastructure/telegram/telegram-types.js +8 -0
  312. package/dist/infrastructure/telegram/telegram-types.js.map +1 -0
  313. package/dist/infrastructure/token-registry/builtin-tokens.d.ts +39 -0
  314. package/dist/infrastructure/token-registry/builtin-tokens.d.ts.map +1 -0
  315. package/dist/infrastructure/token-registry/builtin-tokens.js +135 -0
  316. package/dist/infrastructure/token-registry/builtin-tokens.js.map +1 -0
  317. package/dist/infrastructure/token-registry/index.d.ts +8 -0
  318. package/dist/infrastructure/token-registry/index.d.ts.map +1 -0
  319. package/dist/infrastructure/token-registry/index.js +8 -0
  320. package/dist/infrastructure/token-registry/index.js.map +1 -0
  321. package/dist/infrastructure/token-registry/token-registry-service.d.ts +49 -0
  322. package/dist/infrastructure/token-registry/token-registry-service.d.ts.map +1 -0
  323. package/dist/infrastructure/token-registry/token-registry-service.js +93 -0
  324. package/dist/infrastructure/token-registry/token-registry-service.js.map +1 -0
  325. package/dist/infrastructure/version/index.d.ts +5 -0
  326. package/dist/infrastructure/version/index.d.ts.map +1 -0
  327. package/dist/infrastructure/version/index.js +5 -0
  328. package/dist/infrastructure/version/index.js.map +1 -0
  329. package/dist/infrastructure/version/version-check-service.d.ts +35 -0
  330. package/dist/infrastructure/version/version-check-service.d.ts.map +1 -0
  331. package/dist/infrastructure/version/version-check-service.js +92 -0
  332. package/dist/infrastructure/version/version-check-service.js.map +1 -0
  333. package/dist/lifecycle/daemon.d.ts +103 -0
  334. package/dist/lifecycle/daemon.d.ts.map +1 -0
  335. package/dist/lifecycle/daemon.js +934 -0
  336. package/dist/lifecycle/daemon.js.map +1 -0
  337. package/dist/lifecycle/index.d.ts +9 -0
  338. package/dist/lifecycle/index.d.ts.map +1 -0
  339. package/dist/lifecycle/index.js +9 -0
  340. package/dist/lifecycle/index.js.map +1 -0
  341. package/dist/lifecycle/signal-handler.d.ts +18 -0
  342. package/dist/lifecycle/signal-handler.d.ts.map +1 -0
  343. package/dist/lifecycle/signal-handler.js +37 -0
  344. package/dist/lifecycle/signal-handler.js.map +1 -0
  345. package/dist/lifecycle/workers.d.ts +46 -0
  346. package/dist/lifecycle/workers.d.ts.map +1 -0
  347. package/dist/lifecycle/workers.js +101 -0
  348. package/dist/lifecycle/workers.js.map +1 -0
  349. package/dist/notifications/channels/discord.d.ts +10 -0
  350. package/dist/notifications/channels/discord.d.ts.map +1 -0
  351. package/dist/notifications/channels/discord.js +54 -0
  352. package/dist/notifications/channels/discord.js.map +1 -0
  353. package/dist/notifications/channels/ntfy.d.ts +13 -0
  354. package/dist/notifications/channels/ntfy.d.ts.map +1 -0
  355. package/dist/notifications/channels/ntfy.js +58 -0
  356. package/dist/notifications/channels/ntfy.js.map +1 -0
  357. package/dist/notifications/channels/slack.d.ts +10 -0
  358. package/dist/notifications/channels/slack.d.ts.map +1 -0
  359. package/dist/notifications/channels/slack.js +55 -0
  360. package/dist/notifications/channels/slack.js.map +1 -0
  361. package/dist/notifications/channels/telegram.d.ts +10 -0
  362. package/dist/notifications/channels/telegram.d.ts.map +1 -0
  363. package/dist/notifications/channels/telegram.js +40 -0
  364. package/dist/notifications/channels/telegram.js.map +1 -0
  365. package/dist/notifications/index.d.ts +9 -0
  366. package/dist/notifications/index.d.ts.map +1 -0
  367. package/dist/notifications/index.js +7 -0
  368. package/dist/notifications/index.js.map +1 -0
  369. package/dist/notifications/notification-service.d.ts +75 -0
  370. package/dist/notifications/notification-service.d.ts.map +1 -0
  371. package/dist/notifications/notification-service.js +213 -0
  372. package/dist/notifications/notification-service.js.map +1 -0
  373. package/dist/notifications/templates/message-templates.d.ts +12 -0
  374. package/dist/notifications/templates/message-templates.d.ts.map +1 -0
  375. package/dist/notifications/templates/message-templates.js +22 -0
  376. package/dist/notifications/templates/message-templates.js.map +1 -0
  377. package/dist/pipeline/database-policy-engine.d.ts +286 -0
  378. package/dist/pipeline/database-policy-engine.d.ts.map +1 -0
  379. package/dist/pipeline/database-policy-engine.js +992 -0
  380. package/dist/pipeline/database-policy-engine.js.map +1 -0
  381. package/dist/pipeline/default-policy-engine.d.ts +26 -0
  382. package/dist/pipeline/default-policy-engine.d.ts.map +1 -0
  383. package/dist/pipeline/default-policy-engine.js +25 -0
  384. package/dist/pipeline/default-policy-engine.js.map +1 -0
  385. package/dist/pipeline/index.d.ts +9 -0
  386. package/dist/pipeline/index.d.ts.map +1 -0
  387. package/dist/pipeline/index.js +9 -0
  388. package/dist/pipeline/index.js.map +1 -0
  389. package/dist/pipeline/network-resolver.d.ts +22 -0
  390. package/dist/pipeline/network-resolver.d.ts.map +1 -0
  391. package/dist/pipeline/network-resolver.js +32 -0
  392. package/dist/pipeline/network-resolver.js.map +1 -0
  393. package/dist/pipeline/pipeline.d.ts +72 -0
  394. package/dist/pipeline/pipeline.d.ts.map +1 -0
  395. package/dist/pipeline/pipeline.js +87 -0
  396. package/dist/pipeline/pipeline.js.map +1 -0
  397. package/dist/pipeline/resolve-effective-amount-usd.d.ts +41 -0
  398. package/dist/pipeline/resolve-effective-amount-usd.d.ts.map +1 -0
  399. package/dist/pipeline/resolve-effective-amount-usd.js +208 -0
  400. package/dist/pipeline/resolve-effective-amount-usd.js.map +1 -0
  401. package/dist/pipeline/sign-only.d.ts +99 -0
  402. package/dist/pipeline/sign-only.d.ts.map +1 -0
  403. package/dist/pipeline/sign-only.js +267 -0
  404. package/dist/pipeline/sign-only.js.map +1 -0
  405. package/dist/pipeline/sleep.d.ts +6 -0
  406. package/dist/pipeline/sleep.d.ts.map +1 -0
  407. package/dist/pipeline/sleep.js +8 -0
  408. package/dist/pipeline/sleep.js.map +1 -0
  409. package/dist/pipeline/stages.d.ts +82 -0
  410. package/dist/pipeline/stages.d.ts.map +1 -0
  411. package/dist/pipeline/stages.js +784 -0
  412. package/dist/pipeline/stages.js.map +1 -0
  413. package/dist/services/autostop-rules.d.ts +79 -0
  414. package/dist/services/autostop-rules.d.ts.map +1 -0
  415. package/dist/services/autostop-rules.js +174 -0
  416. package/dist/services/autostop-rules.js.map +1 -0
  417. package/dist/services/autostop-service.d.ts +82 -0
  418. package/dist/services/autostop-service.d.ts.map +1 -0
  419. package/dist/services/autostop-service.js +223 -0
  420. package/dist/services/autostop-service.js.map +1 -0
  421. package/dist/services/kill-switch-service.d.ts +118 -0
  422. package/dist/services/kill-switch-service.d.ts.map +1 -0
  423. package/dist/services/kill-switch-service.js +291 -0
  424. package/dist/services/kill-switch-service.js.map +1 -0
  425. package/dist/services/monitoring/balance-monitor-service.d.ts +65 -0
  426. package/dist/services/monitoring/balance-monitor-service.d.ts.map +1 -0
  427. package/dist/services/monitoring/balance-monitor-service.js +207 -0
  428. package/dist/services/monitoring/balance-monitor-service.js.map +1 -0
  429. package/dist/services/wc-session-service.d.ts +123 -0
  430. package/dist/services/wc-session-service.d.ts.map +1 -0
  431. package/dist/services/wc-session-service.js +363 -0
  432. package/dist/services/wc-session-service.js.map +1 -0
  433. package/dist/services/wc-signing-bridge.d.ts +60 -0
  434. package/dist/services/wc-signing-bridge.d.ts.map +1 -0
  435. package/dist/services/wc-signing-bridge.js +334 -0
  436. package/dist/services/wc-signing-bridge.js.map +1 -0
  437. package/dist/services/wc-storage.d.ts +32 -0
  438. package/dist/services/wc-storage.d.ts.map +1 -0
  439. package/dist/services/wc-storage.js +64 -0
  440. package/dist/services/wc-storage.js.map +1 -0
  441. package/dist/services/x402/payment-signer.d.ts +88 -0
  442. package/dist/services/x402/payment-signer.d.ts.map +1 -0
  443. package/dist/services/x402/payment-signer.js +311 -0
  444. package/dist/services/x402/payment-signer.js.map +1 -0
  445. package/dist/services/x402/ssrf-guard.d.ts +27 -0
  446. package/dist/services/x402/ssrf-guard.d.ts.map +1 -0
  447. package/dist/services/x402/ssrf-guard.js +236 -0
  448. package/dist/services/x402/ssrf-guard.js.map +1 -0
  449. package/dist/services/x402/x402-domain-policy.d.ts +50 -0
  450. package/dist/services/x402/x402-domain-policy.d.ts.map +1 -0
  451. package/dist/services/x402/x402-domain-policy.js +78 -0
  452. package/dist/services/x402/x402-domain-policy.js.map +1 -0
  453. package/dist/services/x402/x402-handler.d.ts +71 -0
  454. package/dist/services/x402/x402-handler.d.ts.map +1 -0
  455. package/dist/services/x402/x402-handler.js +195 -0
  456. package/dist/services/x402/x402-handler.js.map +1 -0
  457. package/dist/services/x402/x402-usd-resolver.d.ts +26 -0
  458. package/dist/services/x402/x402-usd-resolver.d.ts.map +1 -0
  459. package/dist/services/x402/x402-usd-resolver.js +79 -0
  460. package/dist/services/x402/x402-usd-resolver.js.map +1 -0
  461. package/dist/workflow/approval-workflow.d.ts +103 -0
  462. package/dist/workflow/approval-workflow.d.ts.map +1 -0
  463. package/dist/workflow/approval-workflow.js +202 -0
  464. package/dist/workflow/approval-workflow.js.map +1 -0
  465. package/dist/workflow/delay-queue.d.ts +78 -0
  466. package/dist/workflow/delay-queue.d.ts.map +1 -0
  467. package/dist/workflow/delay-queue.js +174 -0
  468. package/dist/workflow/delay-queue.js.map +1 -0
  469. package/dist/workflow/index.d.ts +11 -0
  470. package/dist/workflow/index.d.ts.map +1 -0
  471. package/dist/workflow/index.js +9 -0
  472. package/dist/workflow/index.js.map +1 -0
  473. package/dist/workflow/owner-state.d.ts +97 -0
  474. package/dist/workflow/owner-state.d.ts.map +1 -0
  475. package/dist/workflow/owner-state.js +168 -0
  476. package/dist/workflow/owner-state.js.map +1 -0
  477. package/package.json +71 -0
  478. package/public/admin/assets/index-BPoUSH8W.css +1 -0
  479. package/public/admin/assets/index-CDi1qoXB.js +1 -0
  480. package/public/admin/index.html +13 -0
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Owner 3-State Machine: NONE -> GRACE -> LOCKED.
3
+ *
4
+ * Manages the Owner lifecycle for wallets:
5
+ * - NONE: No owner registered. APPROVAL tier auto-downgrades to DELAY.
6
+ * - GRACE: Owner address set but not yet verified via signature.
7
+ * Owner can be changed/removed with masterAuth only.
8
+ * - LOCKED: Owner verified via ownerAuth signature.
9
+ * Owner change requires ownerAuth; removal blocked entirely.
10
+ *
11
+ * Provides:
12
+ * - resolveOwnerState(): pure function to determine state from wallet fields
13
+ * - OwnerLifecycleService: setOwner/removeOwner/markOwnerVerified with DB ops
14
+ * - downgradeIfNoOwner(): APPROVAL -> DELAY when no owner registered
15
+ *
16
+ * @see docs/34-owner-wallet-design.md
17
+ */
18
+ import { WAIaaSError } from '@waiaas/core';
19
+ // ---------------------------------------------------------------------------
20
+ // resolveOwnerState - pure function
21
+ // ---------------------------------------------------------------------------
22
+ /**
23
+ * Determine the Owner state from wallet fields.
24
+ *
25
+ * Pure function, no DB access, no side effects.
26
+ *
27
+ * @param wallet - Wallet fields { ownerAddress, ownerVerified }
28
+ * @returns 'NONE' | 'GRACE' | 'LOCKED'
29
+ */
30
+ export function resolveOwnerState(wallet) {
31
+ if (wallet.ownerAddress === null || wallet.ownerAddress === undefined) {
32
+ return 'NONE';
33
+ }
34
+ if (wallet.ownerVerified) {
35
+ return 'LOCKED';
36
+ }
37
+ return 'GRACE';
38
+ }
39
+ /**
40
+ * Service managing Owner state transitions with DB persistence.
41
+ */
42
+ export class OwnerLifecycleService {
43
+ sqlite;
44
+ constructor(deps) {
45
+ this.sqlite = deps.sqlite;
46
+ }
47
+ /**
48
+ * Set the owner address for a wallet.
49
+ *
50
+ * - NONE or GRACE: sets ownerAddress, ownerVerified = false
51
+ * - LOCKED: throws OWNER_ALREADY_CONNECTED
52
+ *
53
+ * @param walletId - Wallet ID
54
+ * @param ownerAddress - Owner wallet address to set
55
+ * @throws WAIaaSError OWNER_ALREADY_CONNECTED if in LOCKED state
56
+ */
57
+ setOwner(walletId, ownerAddress) {
58
+ const wallet = this.getWalletRow(walletId);
59
+ const state = resolveOwnerState({
60
+ ownerAddress: wallet.owner_address,
61
+ ownerVerified: wallet.owner_verified === 1,
62
+ });
63
+ if (state === 'LOCKED') {
64
+ throw new WAIaaSError('OWNER_ALREADY_CONNECTED', {
65
+ message: 'Use ownerAuth to change owner in LOCKED state',
66
+ });
67
+ }
68
+ const now = Math.floor(Date.now() / 1000);
69
+ this.sqlite
70
+ .prepare('UPDATE wallets SET owner_address = ?, owner_verified = 0, updated_at = ? WHERE id = ?')
71
+ .run(ownerAddress, now, walletId);
72
+ }
73
+ /**
74
+ * Remove the owner from a wallet.
75
+ *
76
+ * - GRACE: clears ownerAddress, ownerVerified = false
77
+ * - LOCKED: throws OWNER_ALREADY_CONNECTED
78
+ * - NONE: no-op (already no owner)
79
+ *
80
+ * @param walletId - Wallet ID
81
+ * @throws WAIaaSError OWNER_ALREADY_CONNECTED if in LOCKED state
82
+ */
83
+ removeOwner(walletId) {
84
+ const wallet = this.getWalletRow(walletId);
85
+ const state = resolveOwnerState({
86
+ ownerAddress: wallet.owner_address,
87
+ ownerVerified: wallet.owner_verified === 1,
88
+ });
89
+ if (state === 'LOCKED') {
90
+ throw new WAIaaSError('OWNER_ALREADY_CONNECTED', {
91
+ message: 'Owner removal blocked in LOCKED state',
92
+ });
93
+ }
94
+ if (state === 'NONE') {
95
+ return; // no-op
96
+ }
97
+ // GRACE: clear owner
98
+ const now = Math.floor(Date.now() / 1000);
99
+ this.sqlite
100
+ .prepare('UPDATE wallets SET owner_address = NULL, owner_verified = 0, updated_at = ? WHERE id = ?')
101
+ .run(now, walletId);
102
+ }
103
+ /**
104
+ * Mark the owner as verified (GRACE -> LOCKED transition).
105
+ *
106
+ * Called when ownerAuth middleware succeeds on any ownerAuth-protected route.
107
+ *
108
+ * - GRACE: sets ownerVerified = true
109
+ * - LOCKED: no-op (already verified)
110
+ * - NONE: throws OWNER_NOT_CONNECTED
111
+ *
112
+ * @param walletId - Wallet ID
113
+ * @throws WAIaaSError OWNER_NOT_CONNECTED if in NONE state
114
+ */
115
+ markOwnerVerified(walletId) {
116
+ const wallet = this.getWalletRow(walletId);
117
+ const state = resolveOwnerState({
118
+ ownerAddress: wallet.owner_address,
119
+ ownerVerified: wallet.owner_verified === 1,
120
+ });
121
+ if (state === 'NONE') {
122
+ throw new WAIaaSError('OWNER_NOT_CONNECTED', {
123
+ message: 'No owner address registered for this wallet',
124
+ });
125
+ }
126
+ if (state === 'LOCKED') {
127
+ return; // already verified, no-op
128
+ }
129
+ // GRACE -> LOCKED
130
+ const now = Math.floor(Date.now() / 1000);
131
+ this.sqlite
132
+ .prepare('UPDATE wallets SET owner_verified = 1, updated_at = ? WHERE id = ?')
133
+ .run(now, walletId);
134
+ }
135
+ // -------------------------------------------------------------------------
136
+ // Private
137
+ // -------------------------------------------------------------------------
138
+ getWalletRow(walletId) {
139
+ const row = this.sqlite
140
+ .prepare('SELECT owner_address, owner_verified FROM wallets WHERE id = ?')
141
+ .get(walletId);
142
+ if (!row) {
143
+ throw new WAIaaSError('WALLET_NOT_FOUND', {
144
+ message: `Wallet '${walletId}' not found`,
145
+ });
146
+ }
147
+ return row;
148
+ }
149
+ }
150
+ // ---------------------------------------------------------------------------
151
+ // downgradeIfNoOwner
152
+ // ---------------------------------------------------------------------------
153
+ /**
154
+ * If tier is APPROVAL and owner state is NONE, downgrade to DELAY.
155
+ *
156
+ * The caller should log a TX_DOWNGRADED_DELAY audit event when downgraded=true.
157
+ *
158
+ * @param wallet - Wallet fields for resolveOwnerState
159
+ * @param tier - Current policy tier
160
+ * @returns { tier, downgraded }
161
+ */
162
+ export function downgradeIfNoOwner(wallet, tier) {
163
+ if (tier === 'APPROVAL' && resolveOwnerState(wallet) === 'NONE') {
164
+ return { tier: 'DELAY', downgraded: true };
165
+ }
166
+ return { tier, downgraded: false };
167
+ }
168
+ //# sourceMappingURL=owner-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-state.js","sourceRoot":"","sources":["../../src/workflow/owner-state.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@waiaas/daemon",
3
+ "version": "2.0.0-rc.1",
4
+ "description": "WAIaaS daemon - self-hosted wallet service for AI agents",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/minho-yoo/waiaas.git",
10
+ "directory": "packages/daemon"
11
+ },
12
+ "homepage": "https://github.com/minho-yoo/waiaas#readme",
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "main": "dist/index.js",
17
+ "types": "dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "import": "./dist/index.js",
21
+ "types": "./dist/index.d.ts"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "public"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsc -p tsconfig.build.json",
30
+ "test": "vitest run",
31
+ "test:unit": "vitest run",
32
+ "test:integration": "[ -d src/__tests__/integration ] && vitest run --dir src/__tests__/integration || true",
33
+ "test:security": "[ -d src/__tests__/security ] && vitest run --dir src/__tests__/security || true",
34
+ "test:chain": "[ -d src/__tests__/chain ] && vitest run --dir src/__tests__/chain || true",
35
+ "test:platform": "[ -d src/__tests__/platform ] && vitest run --dir src/__tests__/platform || true",
36
+ "lint": "eslint src/",
37
+ "typecheck": "tsc --noEmit",
38
+ "clean": "rm -rf dist"
39
+ },
40
+ "dependencies": {
41
+ "@hono/node-server": "^1.19.9",
42
+ "@hono/zod-openapi": "^0.19.10",
43
+ "@solana-program/token": "^0.10.0",
44
+ "@solana/kit": "^6.0.1",
45
+ "@waiaas/adapter-evm": "workspace:*",
46
+ "@waiaas/adapter-solana": "workspace:*",
47
+ "@waiaas/core": "workspace:*",
48
+ "@walletconnect/sign-client": "^2.23.5",
49
+ "argon2": "^0.44.0",
50
+ "better-sqlite3": "^12.6.0",
51
+ "drizzle-orm": "^0.45.0",
52
+ "hono": "^4.11.9",
53
+ "jose": "^6.1.3",
54
+ "proper-lockfile": "^4.1.2",
55
+ "qrcode": "^1.5.4",
56
+ "semver": "^7.7.4",
57
+ "smol-toml": "^1.3.0",
58
+ "sodium-native": "^4.3.1",
59
+ "uuidv7": "^1.0.2",
60
+ "viem": "^2.21.0",
61
+ "zod": "^3.24.0"
62
+ },
63
+ "devDependencies": {
64
+ "@types/better-sqlite3": "^7.6.0",
65
+ "@types/proper-lockfile": "^4.1.4",
66
+ "@types/qrcode": "^1.5.6",
67
+ "@types/semver": "^7.7.1",
68
+ "drizzle-kit": "^0.30.0",
69
+ "msw": "^2.12.10"
70
+ }
71
+ }
@@ -0,0 +1 @@
1
+ *,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:root{--color-primary: #2563eb;--color-primary-hover: #1d4ed8;--color-primary-light: #eff6ff;--color-bg: #ffffff;--color-bg-secondary: #f8fafc;--color-bg-tertiary: #f1f5f9;--color-border: #e2e8f0;--color-text: #0f172a;--color-text-secondary: #64748b;--color-text-muted: #94a3b8;--color-success: #16a34a;--color-success-bg: #f0fdf4;--color-warning: #d97706;--color-warning-bg: #fffbeb;--color-danger: #dc2626;--color-danger-bg: #fef2f2;--color-info: #2563eb;--color-info-bg: #eff6ff;--color-tier-instant: #16a34a;--color-tier-delay: #d97706;--color-tier-blocked: #dc2626;--space-1: .25rem;--space-2: .5rem;--space-3: .75rem;--space-4: 1rem;--space-6: 1.5rem;--space-8: 2rem;--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-size-xs: .75rem;--font-size-sm: .875rem;--font-size-base: 1rem;--font-size-lg: 1.125rem;--font-size-xl: 1.25rem;--font-size-2xl: 1.5rem;--font-weight-normal: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--line-height: 1.5;--radius-sm: .25rem;--radius-md: .375rem;--radius-lg: .5rem;--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / .05);--shadow-md: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--sidebar-width: 220px;--header-height: 56px;--content-max-width: 1200px}body{font-family:var(--font-family);font-size:var(--font-size-base);line-height:var(--line-height);background:var(--color-bg);color:var(--color-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{color:var(--color-primary);text-decoration:none}button{cursor:pointer;font-family:inherit}input,select,textarea{font-family:inherit;font-size:inherit}.layout{display:flex;min-height:100vh}.sidebar{width:var(--sidebar-width);background:var(--color-bg);border-right:1px solid var(--color-border);display:flex;flex-direction:column;position:fixed;top:0;left:0;bottom:0;z-index:10}.sidebar-brand{padding:var(--space-4) var(--space-4);font-size:var(--font-size-lg);font-weight:var(--font-weight-bold);color:var(--color-primary);border-bottom:1px solid var(--color-border)}.sidebar-nav{display:flex;flex-direction:column;padding:var(--space-2);gap:var(--space-1)}.sidebar-link{display:block;padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);color:var(--color-text-secondary);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);transition:background .15s,color .15s;text-decoration:none}.sidebar-link:hover{background:var(--color-bg-tertiary);color:var(--color-text)}.sidebar-link.active{background:var(--color-primary-light);color:var(--color-primary)}.main{margin-left:var(--sidebar-width);flex:1;display:flex;flex-direction:column}.header{height:var(--header-height);border-bottom:1px solid var(--color-border);display:flex;align-items:center;justify-content:space-between;padding:0 var(--space-6);background:var(--color-bg);position:sticky;top:0;z-index:5}.header-title{font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold)}.btn-logout{padding:var(--space-1) var(--space-3);font-size:var(--font-size-sm);color:var(--color-text-secondary);background:none;border:1px solid var(--color-border);border-radius:var(--radius-md);cursor:pointer;transition:background .15s,color .15s}.btn-logout:hover{background:var(--color-danger-bg);color:var(--color-danger);border-color:var(--color-danger)}.content{padding:var(--space-6);max-width:var(--content-max-width);width:100%}.page h2{font-size:var(--font-size-xl);font-weight:var(--font-weight-semibold);margin-bottom:var(--space-4)}.table-container{overflow-x:auto}table{width:100%;border-collapse:collapse}table th{text-align:left;padding:var(--space-2) var(--space-3);font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em;border-bottom:2px solid var(--color-border);background:var(--color-bg-secondary)}table td{padding:var(--space-2) var(--space-3);font-size:var(--font-size-sm);border-bottom:1px solid var(--color-border)}table tbody tr:hover{background:var(--color-bg-secondary)}table tbody tr.clickable{cursor:pointer}table .table-empty,table .table-loading{text-align:center;color:var(--color-text-muted);padding:var(--space-8) var(--space-4)}.form-field{margin-bottom:var(--space-4)}.form-field label{display:block;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text);margin-bottom:var(--space-1)}.form-field input,.form-field select,.form-field textarea{width:100%;padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--font-size-sm);background:var(--color-bg);color:var(--color-text);outline:none;transition:border-color .15s}.form-field input:focus,.form-field select:focus,.form-field textarea:focus{border-color:var(--color-primary);box-shadow:0 0 0 2px var(--color-primary-light)}.form-field textarea{min-height:80px;resize:vertical}.form-field .form-error{display:block;font-size:var(--font-size-xs);color:var(--color-danger);margin-top:var(--space-1)}.form-field input[type=checkbox]{width:auto;margin-right:var(--space-2)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);padding:var(--space-2) var(--space-4);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);border:1px solid transparent;border-radius:var(--radius-md);cursor:pointer;transition:background .15s,color .15s,border-color .15s}.btn:disabled{opacity:.6;cursor:not-allowed}.btn-sm{padding:var(--space-1) var(--space-3);font-size:var(--font-size-xs)}.btn-primary{background:var(--color-primary);color:#fff}.btn-primary:hover:not(:disabled){background:var(--color-primary-hover)}.btn-secondary{background:var(--color-bg);color:var(--color-text);border-color:var(--color-border)}.btn-secondary:hover:not(:disabled){background:var(--color-bg-secondary)}.btn-danger{background:var(--color-danger);color:#fff}.btn-danger:hover:not(:disabled){background:#b91c1c}.btn-ghost{background:transparent;color:var(--color-text-secondary)}.btn-ghost:hover:not(:disabled){background:var(--color-bg-tertiary);color:var(--color-text)}.badge{display:inline-flex;align-items:center;padding:.125rem var(--space-2);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);border-radius:9999px}.badge-success{background:var(--color-success-bg);color:var(--color-success)}.badge-warning{background:var(--color-warning-bg);color:var(--color-warning)}.badge-danger{background:var(--color-danger-bg);color:var(--color-danger)}.badge-info{background:var(--color-info-bg);color:var(--color-info)}.badge-neutral{background:var(--color-bg-tertiary);color:var(--color-text-secondary)}.modal-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:100}.modal-card{background:var(--color-bg);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);width:100%;max-width:480px;max-height:90vh;overflow-y:auto}.modal-header{padding:var(--space-4) var(--space-6);border-bottom:1px solid var(--color-border);font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold)}.modal-body{padding:var(--space-4) var(--space-6)}.modal-footer{padding:var(--space-3) var(--space-6);border-top:1px solid var(--color-border);display:flex;justify-content:flex-end;gap:var(--space-2)}.toast-container{position:fixed;top:var(--space-4);right:var(--space-4);z-index:200;display:flex;flex-direction:column;gap:var(--space-2);max-width:360px}.toast{padding:var(--space-3) var(--space-4);border-radius:var(--radius-md);font-size:var(--font-size-sm);box-shadow:var(--shadow-md);cursor:pointer;animation:toast-in .2s ease-out}@keyframes toast-in{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.toast-success{background:var(--color-success-bg);color:var(--color-success);border:1px solid var(--color-success)}.toast-error{background:var(--color-danger-bg);color:var(--color-danger);border:1px solid var(--color-danger)}.toast-info{background:var(--color-info-bg);color:var(--color-info);border:1px solid var(--color-info)}.toast-warning{background:var(--color-warning-bg);color:var(--color-warning);border:1px solid var(--color-warning)}.empty-state{text-align:center;padding:var(--space-8) var(--space-4);color:var(--color-text-muted)}.empty-state h3{font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);color:var(--color-text-secondary);margin-bottom:var(--space-2)}.empty-state p{font-size:var(--font-size-sm);margin-bottom:var(--space-4)}.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--space-4)}.stat-card{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--space-4) var(--space-6);box-shadow:var(--shadow-sm)}.stat-label{font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em;margin-bottom:var(--space-2)}.stat-value{font-size:var(--font-size-2xl);font-weight:var(--font-weight-bold);color:var(--color-text)}.stat-skeleton{height:2rem;background:var(--color-bg-tertiary);border-radius:var(--radius-md);animation:pulse 1.5s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.dashboard-error{display:flex;align-items:center;justify-content:space-between;padding:var(--space-3) var(--space-4);background:var(--color-danger-bg);color:var(--color-danger);border:1px solid var(--color-danger);border-radius:var(--radius-md);margin-bottom:var(--space-4);font-size:var(--font-size-sm)}.page-actions{display:flex;justify-content:flex-end;margin-bottom:var(--space-4)}.inline-form{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--space-4) var(--space-6);margin-bottom:var(--space-4)}.inline-form-actions{display:flex;gap:var(--space-2);margin-top:var(--space-2)}.back-link{display:inline-block;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin-bottom:var(--space-4)}.back-link:hover{color:var(--color-primary)}.wallet-detail{margin-top:var(--space-4)}.detail-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-6)}.detail-name{font-size:var(--font-size-xl);font-weight:var(--font-weight-bold)}.detail-grid{display:grid;gap:0}.detail-row{display:flex;padding:var(--space-3) 0;border-bottom:1px solid var(--color-border)}.detail-row-label{width:160px;flex-shrink:0;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text-secondary)}.detail-row-value{font-size:var(--font-size-sm);display:flex;align-items:center;gap:var(--space-2);word-break:break-all}.inline-edit{display:flex;align-items:center;gap:var(--space-2)}.inline-edit-input{padding:var(--space-1) var(--space-2);border:1px solid var(--color-primary);border-radius:var(--radius-md);font-size:var(--font-size-base);outline:none}.session-controls{display:flex;align-items:flex-end;gap:var(--space-4);margin-bottom:var(--space-4)}.session-wallet-select{flex:1;max-width:400px}.session-wallet-select label{display:block;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text);margin-bottom:var(--space-1)}.session-wallet-select select{width:100%;padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--font-size-sm);background:var(--color-bg);color:var(--color-text);outline:none}.session-wallet-select select:focus{border-color:var(--color-primary);box-shadow:0 0 0 2px var(--color-primary-light)}.token-warning{color:var(--color-warning);font-weight:var(--font-weight-semibold);font-size:var(--font-size-sm);margin-bottom:var(--space-3)}.token-display{background:var(--color-bg-tertiary);border:1px solid var(--color-border);border-radius:var(--radius-md);padding:var(--space-3);display:flex;align-items:center;gap:var(--space-2)}.token-value{flex:1;font-size:var(--font-size-xs);word-break:break-all;font-family:SF Mono,Fira Code,monospace}.policy-controls{display:flex;align-items:flex-end;gap:var(--space-4);margin-bottom:var(--space-4)}.policy-filter-select{flex:1;max-width:400px}.policy-filter-select label{display:block;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text);margin-bottom:var(--space-1)}.policy-filter-select select{width:100%;padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--font-size-sm);background:var(--color-bg);color:var(--color-text);outline:none}.policy-filter-select select:focus{border-color:var(--color-primary);box-shadow:0 0 0 2px var(--color-primary-light)}.tier-bars{display:flex;flex-direction:column;gap:3px;min-width:180px}.tier-bar{display:flex;align-items:center;gap:var(--space-2);font-size:var(--font-size-xs)}.tier-bar-label{width:52px;flex-shrink:0;font-weight:var(--font-weight-medium)}.tier-bar-track{flex:1;height:6px;background:var(--color-bg-tertiary);border-radius:3px;overflow:hidden}.tier-bar-fill{height:100%;border-radius:3px;transition:width .3s ease}.tier-bar-value{font-size:var(--font-size-xs);color:var(--color-text-secondary);min-width:60px;text-align:right}.tier-bar-fill--instant{background:var(--color-tier-instant)}.tier-bar-fill--notify{background:var(--color-info)}.tier-bar-fill--delay{background:var(--color-tier-delay)}.tier-bar-fill--approval{background:var(--color-tier-blocked)}.spending-limit-summary{display:flex;flex-direction:column;gap:.5rem}.cumulative-limits{display:flex;flex-direction:column;gap:.125rem;padding-top:.25rem;border-top:1px solid var(--color-border)}.cumulative-limits-label{font-size:var(--font-size-xs);color:var(--color-text-secondary);font-weight:500}.cumulative-limit-row{display:flex;align-items:center;gap:.5rem;font-size:var(--font-size-xs)}.cumulative-limit-type{color:var(--color-text-secondary);min-width:72px}.cumulative-limit-value{color:var(--color-warning);font-weight:600}.rules-vis-text{font-size:var(--font-size-xs);color:var(--color-text-secondary)}.rules-vis-badges{display:flex;flex-wrap:wrap;gap:4px}.rules-summary{font-size:var(--font-size-xs);color:var(--color-text-secondary);max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:SF Mono,Fira Code,monospace}.edit-rules-textarea textarea{min-height:120px;font-family:SF Mono,Fira Code,monospace;font-size:var(--font-size-xs)}.policy-type-readonly{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text);padding:var(--space-2) 0;margin-bottom:var(--space-2)}.settings-section{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--space-6);margin-bottom:var(--space-4)}.settings-section--danger{border-color:var(--color-danger)}.settings-section-header{margin-bottom:var(--space-4)}.settings-section-header h3{font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);margin-bottom:var(--space-1)}.settings-description{font-size:var(--font-size-sm);color:var(--color-text-secondary)}.settings-section-body{display:flex;align-items:center;gap:var(--space-4)}.ks-state-card{display:flex;align-items:center;gap:var(--space-4);flex:1}.ks-state-info{font-size:var(--font-size-sm);color:var(--color-text-secondary)}.shutdown-overlay{position:fixed;inset:0;background:#000c;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:300;color:#fff}.shutdown-overlay h2{font-size:var(--font-size-2xl);margin-bottom:var(--space-4);color:#fff}.shutdown-overlay p{font-size:var(--font-size-base);color:var(--color-text-muted)}.shutdown-confirm-input{margin-top:var(--space-3)}.shutdown-confirm-input label{display:block;font-size:var(--font-size-sm);color:var(--color-text-secondary);margin-bottom:var(--space-1)}.shutdown-confirm-input input{width:100%;padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--font-size-sm);background:var(--color-bg);color:var(--color-text);outline:none}.shutdown-confirm-input input:focus{border-color:var(--color-danger);box-shadow:0 0 0 2px var(--color-danger-bg)}.channel-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-4);margin-bottom:var(--space-6)}.channel-card{padding:var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg)}.channel-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-2)}.channel-card-name{font-weight:var(--font-weight-semibold);font-size:var(--font-size-base);text-transform:capitalize}.test-results{margin-top:var(--space-4)}.test-result-item{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) 0}.test-result-success{color:var(--color-success)}.test-result-failure{color:var(--color-danger)}.config-guidance{margin-top:var(--space-6);padding:var(--space-4);background:var(--color-info-bg);border:1px solid var(--color-info);border-radius:var(--radius-md);font-size:var(--font-size-sm)}.config-guidance pre{margin-top:var(--space-2);padding:var(--space-3);background:var(--color-bg-tertiary);border-radius:var(--radius-sm);font-family:monospace;font-size:var(--font-size-xs);overflow-x:auto;white-space:pre}.config-guidance p{color:var(--color-text-secondary);margin-bottom:var(--space-2)}.tab-nav{display:flex;gap:var(--space-1);border-bottom:1px solid var(--color-border)}.tab-btn{padding:var(--space-2) var(--space-4);background:none;border:none;border-bottom:2px solid transparent;font-size:var(--font-size-sm);font-weight:500;color:var(--color-text-secondary);cursor:pointer;transition:color .15s,border-color .15s}.tab-btn:hover{color:var(--color-text)}.tab-btn.active{color:var(--color-primary);border-bottom-color:var(--color-primary)}.pagination{display:flex;justify-content:space-between;align-items:center;margin-top:var(--space-4)}.pagination-info{font-size:var(--font-size-sm);color:var(--color-text-secondary)}.pagination-buttons{display:flex;gap:var(--space-2)}.notif-disabled-banner{padding:var(--space-3) var(--space-4);background:var(--color-warning-bg);border:1px solid var(--color-warning);border-radius:var(--radius-md);margin-bottom:var(--space-4);font-size:var(--font-size-sm);color:var(--color-text)}.settings-save-bar{position:sticky;top:var(--header-height);z-index:4;display:flex;align-items:center;justify-content:space-between;padding:var(--space-3) var(--space-4);background:var(--color-warning-bg);border:1px solid var(--color-warning);border-radius:var(--radius-md);margin-bottom:var(--space-4);font-size:var(--font-size-sm);color:var(--color-text)}.settings-save-bar-actions{display:flex;gap:var(--space-2)}.settings-category{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-lg);margin-bottom:var(--space-4);overflow:hidden}.settings-category-header{padding:var(--space-4) var(--space-6);border-bottom:1px solid var(--color-border)}.settings-category-header h3{font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);margin-bottom:var(--space-1)}.settings-category-body{padding:var(--space-4) var(--space-6)}.settings-fields-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--space-4)}.settings-fields-grid .form-field{margin-bottom:0}.settings-field-full{grid-column:1 / -1}.settings-subgroup{margin-bottom:var(--space-4)}.settings-subgroup-title{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em;margin-bottom:var(--space-3);padding-bottom:var(--space-2);border-bottom:1px solid var(--color-border)}.rpc-field-row{display:flex;gap:var(--space-2);align-items:flex-end}.rpc-field-row .form-field{flex:1;margin-bottom:0}.rpc-test-result{display:inline-flex;align-items:center;gap:var(--space-1);font-size:var(--font-size-xs);margin-top:var(--space-1)}.rpc-test-result--success{color:var(--color-success)}.rpc-test-result--failure{color:var(--color-danger)}.settings-info-box{padding:var(--space-3) var(--space-4);background:var(--color-info-bg);border:1px solid var(--color-info);border-radius:var(--radius-md);font-size:var(--font-size-sm);color:var(--color-text-secondary);margin-top:var(--space-3)}.settings-info-box a{color:var(--color-primary);text-decoration:underline}.notif-test-section{margin-top:var(--space-4);padding-top:var(--space-4);border-top:1px solid var(--color-border)}.settings-category-actions{display:flex;gap:var(--space-2);margin-top:var(--space-4);padding-top:var(--space-3);border-top:1px solid var(--color-border)}.dynamic-row-list{display:flex;flex-direction:column;gap:var(--space-2)}.dynamic-row{display:flex;align-items:flex-start;gap:var(--space-2)}.dynamic-row-fields{flex:1;display:flex;gap:var(--space-2);align-items:flex-start}.dynamic-row-fields .form-field{flex:1;margin-bottom:0}.dynamic-row-remove{flex-shrink:0;margin-top:var(--space-6);color:var(--color-danger)}.policy-form-section{margin-bottom:var(--space-4)}.policy-form-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-2)}.policy-form-header label{font-weight:var(--font-weight-semibold);font-size:var(--font-size-sm)}.json-toggle{font-size:var(--font-size-xs)}.policy-form-placeholder{color:var(--color-text-secondary);font-size:var(--font-size-sm);padding:var(--space-4);border:1px dashed var(--color-border);border-radius:var(--radius-md);text-align:center}.policy-form-fields{display:flex;flex-direction:column;gap:var(--space-3)}.policy-form-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--space-3)}.policy-form-grid .form-field{margin-bottom:0}.currency-select{position:relative}.currency-select-trigger{width:100%;display:flex;justify-content:space-between;align-items:center;padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);cursor:pointer;font-size:var(--font-size-sm);font-family:var(--font-family);color:var(--color-text)}.currency-select-trigger:hover{border-color:var(--color-primary)}.currency-select-chevron{font-size:var(--font-size-xs);color:var(--color-text-secondary)}.currency-rate-preview{margin-top:var(--space-1);font-size:var(--font-size-xs);color:var(--color-text-secondary)}.currency-select-dropdown{position:absolute;top:100%;left:0;right:0;z-index:50;border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg);box-shadow:0 4px 12px #0000001a;margin-top:var(--space-1)}.currency-select-search{width:100%;padding:var(--space-2) var(--space-3);border:none;border-bottom:1px solid var(--color-border);outline:none;font-size:var(--font-size-sm);font-family:var(--font-family)}.currency-select-list{max-height:300px;overflow-y:auto}.currency-select-option{width:100%;display:flex;gap:var(--space-2);padding:var(--space-2) var(--space-3);border:none;background:none;cursor:pointer;text-align:left;font-size:var(--font-size-sm);font-family:var(--font-family);color:var(--color-text)}.currency-select-option:hover{background:var(--color-bg-secondary)}.currency-select-option--active{background:var(--color-primary-light);font-weight:var(--font-weight-semibold)}.currency-option-code{font-weight:var(--font-weight-semibold);min-width:3rem}.currency-option-name{flex:1}.currency-option-symbol{color:var(--color-text-secondary)}.currency-select-empty{padding:var(--space-3);text-align:center;color:var(--color-text-secondary);font-size:var(--font-size-sm)}@media(max-width:768px){.channel-grid,.settings-fields-grid{grid-template-columns:1fr}}