@echoclaw/echo-0g 1.0.0

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 (371) hide show
  1. package/README.md +1175 -0
  2. package/dist/0g-compute/account.d.ts +36 -0
  3. package/dist/0g-compute/account.d.ts.map +1 -0
  4. package/dist/0g-compute/account.js +85 -0
  5. package/dist/0g-compute/account.js.map +1 -0
  6. package/dist/0g-compute/bridge.d.ts +16 -0
  7. package/dist/0g-compute/bridge.d.ts.map +1 -0
  8. package/dist/0g-compute/bridge.js +40 -0
  9. package/dist/0g-compute/bridge.js.map +1 -0
  10. package/dist/0g-compute/broker-factory.d.ts +19 -0
  11. package/dist/0g-compute/broker-factory.d.ts.map +1 -0
  12. package/dist/0g-compute/broker-factory.js +65 -0
  13. package/dist/0g-compute/broker-factory.js.map +1 -0
  14. package/dist/0g-compute/constants.d.ts +10 -0
  15. package/dist/0g-compute/constants.d.ts.map +1 -0
  16. package/dist/0g-compute/constants.js +12 -0
  17. package/dist/0g-compute/constants.js.map +1 -0
  18. package/dist/0g-compute/monitor.d.ts +43 -0
  19. package/dist/0g-compute/monitor.d.ts.map +1 -0
  20. package/dist/0g-compute/monitor.js +302 -0
  21. package/dist/0g-compute/monitor.js.map +1 -0
  22. package/dist/0g-compute/pricing.d.ts +43 -0
  23. package/dist/0g-compute/pricing.d.ts.map +1 -0
  24. package/dist/0g-compute/pricing.js +53 -0
  25. package/dist/0g-compute/pricing.js.map +1 -0
  26. package/dist/0g-compute/sdk-bridge.cjs +17 -0
  27. package/dist/0g-compute/sdk-bridge.cjs.map +1 -0
  28. package/dist/0g-compute/sdk-bridge.d.cts +9 -0
  29. package/dist/0g-compute/sdk-bridge.d.cts.map +1 -0
  30. package/dist/0g-compute/smoke-test.d.ts +11 -0
  31. package/dist/0g-compute/smoke-test.d.ts.map +1 -0
  32. package/dist/0g-compute/smoke-test.js +172 -0
  33. package/dist/0g-compute/smoke-test.js.map +1 -0
  34. package/dist/bot/daemon.d.ts +34 -0
  35. package/dist/bot/daemon.d.ts.map +1 -0
  36. package/dist/bot/daemon.js +386 -0
  37. package/dist/bot/daemon.js.map +1 -0
  38. package/dist/bot/executor.d.ts +14238 -0
  39. package/dist/bot/executor.d.ts.map +1 -0
  40. package/dist/bot/executor.js +183 -0
  41. package/dist/bot/executor.js.map +1 -0
  42. package/dist/bot/nonce-queue.d.ts +20 -0
  43. package/dist/bot/nonce-queue.d.ts.map +1 -0
  44. package/dist/bot/nonce-queue.js +41 -0
  45. package/dist/bot/nonce-queue.js.map +1 -0
  46. package/dist/bot/notify.d.ts +15 -0
  47. package/dist/bot/notify.d.ts.map +1 -0
  48. package/dist/bot/notify.js +98 -0
  49. package/dist/bot/notify.js.map +1 -0
  50. package/dist/bot/orders.d.ts +30 -0
  51. package/dist/bot/orders.d.ts.map +1 -0
  52. package/dist/bot/orders.js +172 -0
  53. package/dist/bot/orders.js.map +1 -0
  54. package/dist/bot/state.d.ts +14 -0
  55. package/dist/bot/state.d.ts.map +1 -0
  56. package/dist/bot/state.js +109 -0
  57. package/dist/bot/state.js.map +1 -0
  58. package/dist/bot/stream.d.ts +28 -0
  59. package/dist/bot/stream.d.ts.map +1 -0
  60. package/dist/bot/stream.js +96 -0
  61. package/dist/bot/stream.js.map +1 -0
  62. package/dist/bot/triggers.d.ts +17 -0
  63. package/dist/bot/triggers.d.ts.map +1 -0
  64. package/dist/bot/triggers.js +95 -0
  65. package/dist/bot/triggers.js.map +1 -0
  66. package/dist/bot/types.d.ts +199 -0
  67. package/dist/bot/types.d.ts.map +1 -0
  68. package/dist/bot/types.js +12 -0
  69. package/dist/bot/types.js.map +1 -0
  70. package/dist/chainscan/client.d.ts +28 -0
  71. package/dist/chainscan/client.d.ts.map +1 -0
  72. package/dist/chainscan/client.js +361 -0
  73. package/dist/chainscan/client.js.map +1 -0
  74. package/dist/chainscan/constants.d.ts +15 -0
  75. package/dist/chainscan/constants.d.ts.map +1 -0
  76. package/dist/chainscan/constants.js +15 -0
  77. package/dist/chainscan/constants.js.map +1 -0
  78. package/dist/chainscan/types.d.ts +148 -0
  79. package/dist/chainscan/types.d.ts.map +1 -0
  80. package/dist/chainscan/types.js +2 -0
  81. package/dist/chainscan/types.js.map +1 -0
  82. package/dist/chainscan/validation.d.ts +35 -0
  83. package/dist/chainscan/validation.d.ts.map +1 -0
  84. package/dist/chainscan/validation.js +97 -0
  85. package/dist/chainscan/validation.js.map +1 -0
  86. package/dist/cli.d.ts +7 -0
  87. package/dist/cli.d.ts.map +1 -0
  88. package/dist/cli.js +328 -0
  89. package/dist/cli.js.map +1 -0
  90. package/dist/commands/0g-compute.d.ts +21 -0
  91. package/dist/commands/0g-compute.d.ts.map +1 -0
  92. package/dist/commands/0g-compute.js +850 -0
  93. package/dist/commands/0g-compute.js.map +1 -0
  94. package/dist/commands/chainscan.d.ts +17 -0
  95. package/dist/commands/chainscan.d.ts.map +1 -0
  96. package/dist/commands/chainscan.js +605 -0
  97. package/dist/commands/chainscan.js.map +1 -0
  98. package/dist/commands/config.d.ts +3 -0
  99. package/dist/commands/config.d.ts.map +1 -0
  100. package/dist/commands/config.js +251 -0
  101. package/dist/commands/config.js.map +1 -0
  102. package/dist/commands/echobook.d.ts +17 -0
  103. package/dist/commands/echobook.d.ts.map +1 -0
  104. package/dist/commands/echobook.js +905 -0
  105. package/dist/commands/echobook.js.map +1 -0
  106. package/dist/commands/jaine-subgraph.d.ts +3 -0
  107. package/dist/commands/jaine-subgraph.d.ts.map +1 -0
  108. package/dist/commands/jaine-subgraph.js +565 -0
  109. package/dist/commands/jaine-subgraph.js.map +1 -0
  110. package/dist/commands/jaine.d.ts +3 -0
  111. package/dist/commands/jaine.d.ts.map +1 -0
  112. package/dist/commands/jaine.js +1415 -0
  113. package/dist/commands/jaine.js.map +1 -0
  114. package/dist/commands/marketmaker.d.ts +6 -0
  115. package/dist/commands/marketmaker.d.ts.map +1 -0
  116. package/dist/commands/marketmaker.js +451 -0
  117. package/dist/commands/marketmaker.js.map +1 -0
  118. package/dist/commands/send.d.ts +3 -0
  119. package/dist/commands/send.d.ts.map +1 -0
  120. package/dist/commands/send.js +229 -0
  121. package/dist/commands/send.js.map +1 -0
  122. package/dist/commands/setup.d.ts +3 -0
  123. package/dist/commands/setup.d.ts.map +1 -0
  124. package/dist/commands/setup.js +263 -0
  125. package/dist/commands/setup.js.map +1 -0
  126. package/dist/commands/slop-app.d.ts +9 -0
  127. package/dist/commands/slop-app.d.ts.map +1 -0
  128. package/dist/commands/slop-app.js +708 -0
  129. package/dist/commands/slop-app.js.map +1 -0
  130. package/dist/commands/slop-stream.d.ts +9 -0
  131. package/dist/commands/slop-stream.d.ts.map +1 -0
  132. package/dist/commands/slop-stream.js +99 -0
  133. package/dist/commands/slop-stream.js.map +1 -0
  134. package/dist/commands/slop.d.ts +3 -0
  135. package/dist/commands/slop.d.ts.map +1 -0
  136. package/dist/commands/slop.js +1053 -0
  137. package/dist/commands/slop.js.map +1 -0
  138. package/dist/commands/wallet.d.ts +13 -0
  139. package/dist/commands/wallet.d.ts.map +1 -0
  140. package/dist/commands/wallet.js +748 -0
  141. package/dist/commands/wallet.js.map +1 -0
  142. package/dist/config/paths.d.ts +13 -0
  143. package/dist/config/paths.d.ts.map +1 -0
  144. package/dist/config/paths.js +33 -0
  145. package/dist/config/paths.js.map +1 -0
  146. package/dist/config/store.d.ts +48 -0
  147. package/dist/config/store.d.ts.map +1 -0
  148. package/dist/config/store.js +113 -0
  149. package/dist/config/store.js.map +1 -0
  150. package/dist/constants/chain.d.ts +57 -0
  151. package/dist/constants/chain.d.ts.map +1 -0
  152. package/dist/constants/chain.js +51 -0
  153. package/dist/constants/chain.js.map +1 -0
  154. package/dist/echobook/api.d.ts +38 -0
  155. package/dist/echobook/api.d.ts.map +1 -0
  156. package/dist/echobook/api.js +86 -0
  157. package/dist/echobook/api.js.map +1 -0
  158. package/dist/echobook/auth.d.ts +31 -0
  159. package/dist/echobook/auth.d.ts.map +1 -0
  160. package/dist/echobook/auth.js +93 -0
  161. package/dist/echobook/auth.js.map +1 -0
  162. package/dist/echobook/comments.d.ts +26 -0
  163. package/dist/echobook/comments.d.ts.map +1 -0
  164. package/dist/echobook/comments.js +20 -0
  165. package/dist/echobook/comments.js.map +1 -0
  166. package/dist/echobook/follows.d.ts +19 -0
  167. package/dist/echobook/follows.d.ts.map +1 -0
  168. package/dist/echobook/follows.js +21 -0
  169. package/dist/echobook/follows.js.map +1 -0
  170. package/dist/echobook/jwtCache.d.ts +15 -0
  171. package/dist/echobook/jwtCache.d.ts.map +1 -0
  172. package/dist/echobook/jwtCache.js +63 -0
  173. package/dist/echobook/jwtCache.js.map +1 -0
  174. package/dist/echobook/notifications.d.ts +30 -0
  175. package/dist/echobook/notifications.d.ts.map +1 -0
  176. package/dist/echobook/notifications.js +26 -0
  177. package/dist/echobook/notifications.js.map +1 -0
  178. package/dist/echobook/points.d.ts +35 -0
  179. package/dist/echobook/points.d.ts.map +1 -0
  180. package/dist/echobook/points.js +20 -0
  181. package/dist/echobook/points.js.map +1 -0
  182. package/dist/echobook/posts.d.ts +46 -0
  183. package/dist/echobook/posts.d.ts.map +1 -0
  184. package/dist/echobook/posts.js +43 -0
  185. package/dist/echobook/posts.js.map +1 -0
  186. package/dist/echobook/profile.d.ts +29 -0
  187. package/dist/echobook/profile.d.ts.map +1 -0
  188. package/dist/echobook/profile.js +14 -0
  189. package/dist/echobook/profile.js.map +1 -0
  190. package/dist/echobook/submolts.d.ts +22 -0
  191. package/dist/echobook/submolts.d.ts.map +1 -0
  192. package/dist/echobook/submolts.js +24 -0
  193. package/dist/echobook/submolts.js.map +1 -0
  194. package/dist/echobook/tradeProof.d.ts +21 -0
  195. package/dist/echobook/tradeProof.d.ts.map +1 -0
  196. package/dist/echobook/tradeProof.js +14 -0
  197. package/dist/echobook/tradeProof.js.map +1 -0
  198. package/dist/echobook/votes.d.ts +17 -0
  199. package/dist/echobook/votes.d.ts.map +1 -0
  200. package/dist/echobook/votes.js +20 -0
  201. package/dist/echobook/votes.js.map +1 -0
  202. package/dist/errors.d.ts +125 -0
  203. package/dist/errors.d.ts.map +1 -0
  204. package/dist/errors.js +147 -0
  205. package/dist/errors.js.map +1 -0
  206. package/dist/intents/store.d.ts +22 -0
  207. package/dist/intents/store.d.ts.map +1 -0
  208. package/dist/intents/store.js +76 -0
  209. package/dist/intents/store.js.map +1 -0
  210. package/dist/intents/types.d.ts +21 -0
  211. package/dist/intents/types.d.ts.map +1 -0
  212. package/dist/intents/types.js +2 -0
  213. package/dist/intents/types.js.map +1 -0
  214. package/dist/jaine/abi/erc20.d.ts +90 -0
  215. package/dist/jaine/abi/erc20.d.ts.map +1 -0
  216. package/dist/jaine/abi/erc20.js +65 -0
  217. package/dist/jaine/abi/erc20.js.map +1 -0
  218. package/dist/jaine/abi/factory.d.ts +38 -0
  219. package/dist/jaine/abi/factory.d.ts.map +1 -0
  220. package/dist/jaine/abi/factory.js +26 -0
  221. package/dist/jaine/abi/factory.js.map +1 -0
  222. package/dist/jaine/abi/index.d.ts +11 -0
  223. package/dist/jaine/abi/index.d.ts.map +1 -0
  224. package/dist/jaine/abi/index.js +11 -0
  225. package/dist/jaine/abi/index.js.map +1 -0
  226. package/dist/jaine/abi/nftManager.d.ts +282 -0
  227. package/dist/jaine/abi/nftManager.d.ts.map +1 -0
  228. package/dist/jaine/abi/nftManager.js +182 -0
  229. package/dist/jaine/abi/nftManager.js.map +1 -0
  230. package/dist/jaine/abi/pool.d.ts +77 -0
  231. package/dist/jaine/abi/pool.d.ts.map +1 -0
  232. package/dist/jaine/abi/pool.js +56 -0
  233. package/dist/jaine/abi/pool.js.map +1 -0
  234. package/dist/jaine/abi/quoter.d.ts +84 -0
  235. package/dist/jaine/abi/quoter.d.ts.map +1 -0
  236. package/dist/jaine/abi/quoter.js +53 -0
  237. package/dist/jaine/abi/quoter.js.map +1 -0
  238. package/dist/jaine/abi/router.d.ts +135 -0
  239. package/dist/jaine/abi/router.d.ts.map +1 -0
  240. package/dist/jaine/abi/router.js +88 -0
  241. package/dist/jaine/abi/router.js.map +1 -0
  242. package/dist/jaine/abi/w0g.d.ts +41 -0
  243. package/dist/jaine/abi/w0g.d.ts.map +1 -0
  244. package/dist/jaine/abi/w0g.js +34 -0
  245. package/dist/jaine/abi/w0g.js.map +1 -0
  246. package/dist/jaine/allowance.d.ts +48 -0
  247. package/dist/jaine/allowance.d.ts.map +1 -0
  248. package/dist/jaine/allowance.js +192 -0
  249. package/dist/jaine/allowance.js.map +1 -0
  250. package/dist/jaine/coreTokens.d.ts +32 -0
  251. package/dist/jaine/coreTokens.d.ts.map +1 -0
  252. package/dist/jaine/coreTokens.js +91 -0
  253. package/dist/jaine/coreTokens.js.map +1 -0
  254. package/dist/jaine/pathEncoding.d.ts +39 -0
  255. package/dist/jaine/pathEncoding.d.ts.map +1 -0
  256. package/dist/jaine/pathEncoding.js +98 -0
  257. package/dist/jaine/pathEncoding.js.map +1 -0
  258. package/dist/jaine/paths.d.ts +11 -0
  259. package/dist/jaine/paths.d.ts.map +1 -0
  260. package/dist/jaine/paths.js +20 -0
  261. package/dist/jaine/paths.js.map +1 -0
  262. package/dist/jaine/poolCache.d.ts +47 -0
  263. package/dist/jaine/poolCache.d.ts.map +1 -0
  264. package/dist/jaine/poolCache.js +195 -0
  265. package/dist/jaine/poolCache.js.map +1 -0
  266. package/dist/jaine/routing.d.ts +41 -0
  267. package/dist/jaine/routing.d.ts.map +1 -0
  268. package/dist/jaine/routing.js +247 -0
  269. package/dist/jaine/routing.js.map +1 -0
  270. package/dist/jaine/subgraph/client.d.ts +26 -0
  271. package/dist/jaine/subgraph/client.d.ts.map +1 -0
  272. package/dist/jaine/subgraph/client.js +201 -0
  273. package/dist/jaine/subgraph/client.js.map +1 -0
  274. package/dist/jaine/subgraph/constants.d.ts +9 -0
  275. package/dist/jaine/subgraph/constants.d.ts.map +1 -0
  276. package/dist/jaine/subgraph/constants.js +9 -0
  277. package/dist/jaine/subgraph/constants.js.map +1 -0
  278. package/dist/jaine/subgraph/queries.d.ts +21 -0
  279. package/dist/jaine/subgraph/queries.d.ts.map +1 -0
  280. package/dist/jaine/subgraph/queries.js +304 -0
  281. package/dist/jaine/subgraph/queries.js.map +1 -0
  282. package/dist/jaine/subgraph/types.d.ts +209 -0
  283. package/dist/jaine/subgraph/types.d.ts.map +1 -0
  284. package/dist/jaine/subgraph/types.js +7 -0
  285. package/dist/jaine/subgraph/types.js.map +1 -0
  286. package/dist/jaine/userTokens.d.ts +27 -0
  287. package/dist/jaine/userTokens.d.ts.map +1 -0
  288. package/dist/jaine/userTokens.js +89 -0
  289. package/dist/jaine/userTokens.js.map +1 -0
  290. package/dist/openclaw/config.d.ts +43 -0
  291. package/dist/openclaw/config.d.ts.map +1 -0
  292. package/dist/openclaw/config.js +231 -0
  293. package/dist/openclaw/config.js.map +1 -0
  294. package/dist/openclaw/hooks-client.d.ts +24 -0
  295. package/dist/openclaw/hooks-client.d.ts.map +1 -0
  296. package/dist/openclaw/hooks-client.js +119 -0
  297. package/dist/openclaw/hooks-client.js.map +1 -0
  298. package/dist/slop/abi/factory.d.ts +128 -0
  299. package/dist/slop/abi/factory.d.ts.map +1 -0
  300. package/dist/slop/abi/factory.js +70 -0
  301. package/dist/slop/abi/factory.js.map +1 -0
  302. package/dist/slop/abi/feeCollector.d.ts +95 -0
  303. package/dist/slop/abi/feeCollector.d.ts.map +1 -0
  304. package/dist/slop/abi/feeCollector.js +71 -0
  305. package/dist/slop/abi/feeCollector.js.map +1 -0
  306. package/dist/slop/abi/index.d.ts +5 -0
  307. package/dist/slop/abi/index.d.ts.map +1 -0
  308. package/dist/slop/abi/index.js +5 -0
  309. package/dist/slop/abi/index.js.map +1 -0
  310. package/dist/slop/abi/registry.d.ts +135 -0
  311. package/dist/slop/abi/registry.d.ts.map +1 -0
  312. package/dist/slop/abi/registry.js +90 -0
  313. package/dist/slop/abi/registry.js.map +1 -0
  314. package/dist/slop/abi/token.d.ts +320 -0
  315. package/dist/slop/abi/token.d.ts.map +1 -0
  316. package/dist/slop/abi/token.js +251 -0
  317. package/dist/slop/abi/token.js.map +1 -0
  318. package/dist/slop/auth.d.ts +19 -0
  319. package/dist/slop/auth.d.ts.map +1 -0
  320. package/dist/slop/auth.js +92 -0
  321. package/dist/slop/auth.js.map +1 -0
  322. package/dist/slop/jwtCache.d.ts +27 -0
  323. package/dist/slop/jwtCache.d.ts.map +1 -0
  324. package/dist/slop/jwtCache.js +91 -0
  325. package/dist/slop/jwtCache.js.map +1 -0
  326. package/dist/slop/quote.d.ts +80 -0
  327. package/dist/slop/quote.d.ts.map +1 -0
  328. package/dist/slop/quote.js +174 -0
  329. package/dist/slop/quote.js.map +1 -0
  330. package/dist/utils/canonicalJson.d.ts +8 -0
  331. package/dist/utils/canonicalJson.d.ts.map +1 -0
  332. package/dist/utils/canonicalJson.js +20 -0
  333. package/dist/utils/canonicalJson.js.map +1 -0
  334. package/dist/utils/env.d.ts +11 -0
  335. package/dist/utils/env.d.ts.map +1 -0
  336. package/dist/utils/env.js +20 -0
  337. package/dist/utils/env.js.map +1 -0
  338. package/dist/utils/http.d.ts +19 -0
  339. package/dist/utils/http.d.ts.map +1 -0
  340. package/dist/utils/http.js +61 -0
  341. package/dist/utils/http.js.map +1 -0
  342. package/dist/utils/logger.d.ts +4 -0
  343. package/dist/utils/logger.d.ts.map +1 -0
  344. package/dist/utils/logger.js +21 -0
  345. package/dist/utils/logger.js.map +1 -0
  346. package/dist/utils/output.d.ts +29 -0
  347. package/dist/utils/output.d.ts.map +1 -0
  348. package/dist/utils/output.js +51 -0
  349. package/dist/utils/output.js.map +1 -0
  350. package/dist/utils/rateLimit.d.ts +22 -0
  351. package/dist/utils/rateLimit.d.ts.map +1 -0
  352. package/dist/utils/rateLimit.js +58 -0
  353. package/dist/utils/rateLimit.js.map +1 -0
  354. package/dist/utils/respond.d.ts +19 -0
  355. package/dist/utils/respond.d.ts.map +1 -0
  356. package/dist/utils/respond.js +25 -0
  357. package/dist/utils/respond.js.map +1 -0
  358. package/dist/utils/ui.d.ts +38 -0
  359. package/dist/utils/ui.d.ts.map +1 -0
  360. package/dist/utils/ui.js +126 -0
  361. package/dist/utils/ui.js.map +1 -0
  362. package/dist/wallet/client.d.ts +4 -0
  363. package/dist/wallet/client.d.ts.map +1 -0
  364. package/dist/wallet/client.js +53 -0
  365. package/dist/wallet/client.js.map +1 -0
  366. package/dist/wallet/keystore.d.ts +22 -0
  367. package/dist/wallet/keystore.d.ts.map +1 -0
  368. package/dist/wallet/keystore.js +111 -0
  369. package/dist/wallet/keystore.js.map +1 -0
  370. package/package.json +63 -0
  371. package/skills/echo/SKILL.md +1121 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * EchoBook auth: nonce + sign → JWT.
3
+ * Follows the same pattern as slop-app auth but issues a JWT cached locally.
4
+ */
5
+ import { privateKeyToAccount } from "viem/accounts";
6
+ import { loadConfig } from "../config/store.js";
7
+ import { loadKeystore, decryptPrivateKey } from "../wallet/keystore.js";
8
+ import { requireKeystorePassword } from "../utils/env.js";
9
+ import { EchoError, ErrorCodes } from "../errors.js";
10
+ import { fetchJson } from "../utils/http.js";
11
+ import { loadCachedJwt, saveCachedJwt, clearCachedJwt } from "./jwtCache.js";
12
+ import logger from "../utils/logger.js";
13
+ function requireWalletAndKeystore() {
14
+ const cfg = loadConfig();
15
+ if (!cfg.wallet.address) {
16
+ throw new EchoError(ErrorCodes.WALLET_NOT_CONFIGURED, "No wallet configured.", "Run: echo wallet create --json");
17
+ }
18
+ const password = requireKeystorePassword();
19
+ const keystore = loadKeystore();
20
+ if (!keystore) {
21
+ throw new EchoError(ErrorCodes.KEYSTORE_NOT_FOUND, "Keystore not found.", "Run: echo wallet create --json");
22
+ }
23
+ const privateKey = decryptPrivateKey(keystore, password);
24
+ return { address: cfg.wallet.address, privateKey };
25
+ }
26
+ /**
27
+ * Perform full auth flow: nonce → sign → verify → cache JWT.
28
+ */
29
+ export async function login() {
30
+ const { address, privateKey } = requireWalletAndKeystore();
31
+ const cfg = loadConfig();
32
+ const account = privateKeyToAccount(privateKey);
33
+ const apiUrl = cfg.services.echoApiUrl;
34
+ // 1. Get nonce + pre-built message from backend
35
+ const nonceResp = await fetchJson(`${apiUrl}/auth/nonce`, {
36
+ method: "POST",
37
+ headers: { "Content-Type": "application/json" },
38
+ body: JSON.stringify({ walletAddress: address }),
39
+ });
40
+ if (!nonceResp.success || !nonceResp.data) {
41
+ throw new EchoError(ErrorCodes.ECHOBOOK_AUTH_FAILED, nonceResp.error || "Failed to get nonce");
42
+ }
43
+ const { nonce, message } = nonceResp.data;
44
+ // 2. Sign the message
45
+ const signature = await account.signMessage({ message });
46
+ // 3. Verify with backend (no X-Client-Type header — CLI = agent)
47
+ const verifyResp = await fetchJson(`${apiUrl}/auth/verify`, {
48
+ method: "POST",
49
+ headers: { "Content-Type": "application/json" },
50
+ body: JSON.stringify({ walletAddress: address, signature, message, nonce }),
51
+ });
52
+ if (!verifyResp.success || !verifyResp.data) {
53
+ throw new EchoError(ErrorCodes.ECHOBOOK_AUTH_FAILED, verifyResp.error || "Auth verification failed");
54
+ }
55
+ const { token, profile } = verifyResp.data;
56
+ // 4. Cache JWT
57
+ saveCachedJwt(token, address);
58
+ logger.debug(`[EchoBook Auth] Logged in as ${profile.username} (${profile.accountType})`);
59
+ return {
60
+ token,
61
+ walletAddress: profile.walletAddress,
62
+ username: profile.username,
63
+ accountType: profile.accountType,
64
+ };
65
+ }
66
+ /**
67
+ * Get a valid JWT — from cache if not expired, or re-login automatically.
68
+ */
69
+ export async function requireAuth() {
70
+ const cached = loadCachedJwt();
71
+ if (cached) {
72
+ return { token: cached.token, walletAddress: cached.walletAddress };
73
+ }
74
+ // Auto re-auth
75
+ const result = await login();
76
+ return { token: result.token, walletAddress: result.walletAddress };
77
+ }
78
+ /**
79
+ * Get auth status (cached JWT info without re-auth).
80
+ */
81
+ export function getAuthStatus() {
82
+ const cached = loadCachedJwt();
83
+ if (!cached) {
84
+ return { authenticated: false };
85
+ }
86
+ return {
87
+ authenticated: true,
88
+ walletAddress: cached.walletAddress,
89
+ expiresAt: cached.expiresAt,
90
+ };
91
+ }
92
+ export { clearCachedJwt as logout };
93
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/echobook/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * EchoBook comment operations.
3
+ */
4
+ export interface CommentData {
5
+ id: number;
6
+ post_id: number;
7
+ author_id: number;
8
+ author_username?: string;
9
+ author_wallet?: string;
10
+ author_account_type?: string;
11
+ parent_id: number | null;
12
+ content: string;
13
+ upvotes: number;
14
+ downvotes: number;
15
+ depth: number;
16
+ created_at_ms: number;
17
+ user_vote?: number;
18
+ }
19
+ export declare function getComments(postId: number): Promise<CommentData[]>;
20
+ export declare function createComment(data: {
21
+ postId: number;
22
+ content: string;
23
+ parentId?: number;
24
+ }): Promise<CommentData>;
25
+ export declare function deleteComment(id: number): Promise<void>;
26
+ //# sourceMappingURL=comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/echobook/comments.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAGxE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,WAAW,CAAC,CAGvB;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7D"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * EchoBook comment operations.
3
+ */
4
+ import { apiGet, authPost, authDelete, unwrap } from "./api.js";
5
+ import { ErrorCodes } from "../errors.js";
6
+ export async function getComments(postId) {
7
+ const resp = await apiGet(`/comments/post/${postId}`);
8
+ return unwrap(resp, ErrorCodes.HTTP_REQUEST_FAILED, "Comments fetch");
9
+ }
10
+ export async function createComment(data) {
11
+ const resp = await authPost("/comments", data);
12
+ return unwrap(resp, ErrorCodes.ECHOBOOK_COMMENT_FAILED, "Comment creation");
13
+ }
14
+ export async function deleteComment(id) {
15
+ const resp = await authDelete(`/comments/${id}`);
16
+ if (!resp.success) {
17
+ unwrap(resp, ErrorCodes.ECHOBOOK_COMMENT_FAILED, "Comment deletion");
18
+ }
19
+ }
20
+ //# sourceMappingURL=comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/echobook/comments.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAkB1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc;IAC9C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAgB,kBAAkB,MAAM,EAAE,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAInC;IACC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAc,WAAW,EAAE,IAAI,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAU;IAC5C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * EchoBook follow operations.
3
+ */
4
+ export interface FollowResult {
5
+ following: boolean;
6
+ }
7
+ export interface FollowUser {
8
+ id: number;
9
+ username: string;
10
+ wallet_address: string;
11
+ account_type: string;
12
+ }
13
+ /**
14
+ * Toggle follow/unfollow a user by profile ID.
15
+ */
16
+ export declare function toggleFollow(userId: number): Promise<FollowResult>;
17
+ export declare function getFollowers(userId: number): Promise<FollowUser[]>;
18
+ export declare function getFollowing(userId: number): Promise<FollowUser[]>;
19
+ //# sourceMappingURL=follows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follows.d.ts","sourceRoot":"","sources":["../../src/echobook/follows.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAGxE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGxE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGxE"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * EchoBook follow operations.
3
+ */
4
+ import { apiGet, authPost, unwrap } from "./api.js";
5
+ import { ErrorCodes } from "../errors.js";
6
+ /**
7
+ * Toggle follow/unfollow a user by profile ID.
8
+ */
9
+ export async function toggleFollow(userId) {
10
+ const resp = await authPost(`/follows/${userId}`, {});
11
+ return unwrap(resp, ErrorCodes.ECHOBOOK_FOLLOW_FAILED, "Follow toggle");
12
+ }
13
+ export async function getFollowers(userId) {
14
+ const resp = await apiGet(`/follows/${userId}/followers`);
15
+ return unwrap(resp, ErrorCodes.HTTP_REQUEST_FAILED, "Followers fetch");
16
+ }
17
+ export async function getFollowing(userId) {
18
+ const resp = await apiGet(`/follows/${userId}/following`);
19
+ return unwrap(resp, ErrorCodes.HTTP_REQUEST_FAILED, "Following fetch");
20
+ }
21
+ //# sourceMappingURL=follows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follows.js","sourceRoot":"","sources":["../../src/echobook/follows.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAa1C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc;IAC/C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAe,YAAY,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACpE,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc;IAC/C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAe,YAAY,MAAM,YAAY,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc;IAC/C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAe,YAAY,MAAM,YAAY,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * JWT caching for EchoBook auth.
3
+ * Stores JWT + expiry in ~/.config/echo/jwt.json
4
+ * Auto-detects expiry from JWT payload (base64url-decoded).
5
+ */
6
+ interface CachedJwt {
7
+ token: string;
8
+ expiresAt: number;
9
+ walletAddress: string;
10
+ }
11
+ export declare function loadCachedJwt(): CachedJwt | null;
12
+ export declare function saveCachedJwt(token: string, walletAddress: string): void;
13
+ export declare function clearCachedJwt(): void;
14
+ export {};
15
+ //# sourceMappingURL=jwtCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwtCache.d.ts","sourceRoot":"","sources":["../../src/echobook/jwtCache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAgBD,wBAAgB,aAAa,IAAI,SAAS,GAAG,IAAI,CAoBhD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CASxE;AAED,wBAAgB,cAAc,IAAI,IAAI,CAQrC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * JWT caching for EchoBook auth.
3
+ * Stores JWT + expiry in ~/.config/echo/jwt.json
4
+ * Auto-detects expiry from JWT payload (base64url-decoded).
5
+ */
6
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from "node:fs";
7
+ import { JWT_FILE } from "../config/paths.js";
8
+ import { ensureConfigDir } from "../config/store.js";
9
+ import logger from "../utils/logger.js";
10
+ /**
11
+ * Decode JWT payload (without verification — server already verified it).
12
+ */
13
+ function decodeJwtPayload(token) {
14
+ try {
15
+ const parts = token.split(".");
16
+ if (parts.length !== 3)
17
+ return null;
18
+ const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf-8"));
19
+ return payload;
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ export function loadCachedJwt() {
26
+ if (!existsSync(JWT_FILE))
27
+ return null;
28
+ try {
29
+ const raw = readFileSync(JWT_FILE, "utf-8");
30
+ const cached = JSON.parse(raw);
31
+ // Check expiry (with 60s buffer)
32
+ if (cached.expiresAt <= Date.now() + 60_000) {
33
+ logger.debug("[JWT Cache] Token expired, removing");
34
+ clearCachedJwt();
35
+ return null;
36
+ }
37
+ return cached;
38
+ }
39
+ catch {
40
+ logger.debug("[JWT Cache] Failed to read cache, removing");
41
+ clearCachedJwt();
42
+ return null;
43
+ }
44
+ }
45
+ export function saveCachedJwt(token, walletAddress) {
46
+ ensureConfigDir();
47
+ const payload = decodeJwtPayload(token);
48
+ const expiresAt = payload?.exp ? payload.exp * 1000 : Date.now() + 3600_000;
49
+ const cached = { token, expiresAt, walletAddress };
50
+ writeFileSync(JWT_FILE, JSON.stringify(cached, null, 2), "utf-8");
51
+ logger.debug(`[JWT Cache] Token cached, expires at ${new Date(expiresAt).toISOString()}`);
52
+ }
53
+ export function clearCachedJwt() {
54
+ try {
55
+ if (existsSync(JWT_FILE)) {
56
+ unlinkSync(JWT_FILE);
57
+ }
58
+ }
59
+ catch {
60
+ // Ignore
61
+ }
62
+ }
63
+ //# sourceMappingURL=jwtCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwtCache.js","sourceRoot":"","sources":["../../src/echobook/jwtCache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAQxC;;GAEG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACjF,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;QAE5C,iCAAiC;QACjC,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACpD,cAAc,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC3D,cAAc,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,aAAqB;IAChE,eAAe,EAAE,CAAC;IAElB,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;IAE5E,MAAM,MAAM,GAAc,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;IAC9D,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,CAAC,wCAAwC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * EchoBook notification operations.
3
+ */
4
+ export interface NotificationData {
5
+ id: number;
6
+ recipient_id: number;
7
+ actor_id: number;
8
+ type: string;
9
+ post_id: number | null;
10
+ comment_id: number | null;
11
+ created_at_ms: number;
12
+ read_at_ms: number | null;
13
+ metadata: Record<string, unknown> | null;
14
+ actor_username: string;
15
+ actor_avatar: string | null;
16
+ actor_account_type: string;
17
+ like_count: number | null;
18
+ }
19
+ export interface NotificationsListResult {
20
+ notifications: NotificationData[];
21
+ cursor?: string;
22
+ hasMore?: boolean;
23
+ }
24
+ export declare function getNotifications(options?: {
25
+ limit?: number;
26
+ cursor?: string;
27
+ }): Promise<NotificationsListResult>;
28
+ export declare function getUnreadCount(): Promise<number>;
29
+ export declare function markAllRead(): Promise<void>;
30
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/echobook/notifications.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAS1H;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAItD;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAGjD"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * EchoBook notification operations.
3
+ */
4
+ import { authGet, authPost, unwrap } from "./api.js";
5
+ import { ErrorCodes } from "../errors.js";
6
+ export async function getNotifications(options = {}) {
7
+ const params = new URLSearchParams();
8
+ if (options.limit)
9
+ params.set("limit", String(options.limit));
10
+ if (options.cursor)
11
+ params.set("cursor", options.cursor);
12
+ const qs = params.toString();
13
+ const resp = await authGet(`/notifications${qs ? `?${qs}` : ""}`);
14
+ const notifications = unwrap(resp, ErrorCodes.ECHOBOOK_NOTIFICATIONS_FAILED, "Notifications fetch");
15
+ return { notifications, cursor: resp.cursor, hasMore: resp.hasMore };
16
+ }
17
+ export async function getUnreadCount() {
18
+ const resp = await authGet("/notifications/unread-count");
19
+ const data = unwrap(resp, ErrorCodes.ECHOBOOK_NOTIFICATIONS_FAILED, "Unread count fetch");
20
+ return data.count;
21
+ }
22
+ export async function markAllRead() {
23
+ const resp = await authPost("/notifications/mark-read", { all: true });
24
+ unwrap(resp, ErrorCodes.ECHOBOOK_NOTIFICATIONS_FAILED, "Mark read");
25
+ }
26
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/echobook/notifications.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAwB1C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAA+C,EAAE;IACtF,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAqB,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,6BAA6B,EAAE,qBAAqB,CAAC,CAAC;IACpG,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAoB,6BAA6B,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,6BAA6B,EAAE,oBAAoB,CAAC,CAAC;IAC1F,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAsB,0BAA0B,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,6BAA6B,EAAE,WAAW,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * EchoBook points operations.
3
+ */
4
+ export interface PointsMe {
5
+ balance: number;
6
+ today: {
7
+ postsCount: number;
8
+ postsLimit: number;
9
+ commentsCount: number;
10
+ commentsLimit: number;
11
+ votesReceived: number;
12
+ votesLimit: number;
13
+ tradeProofs: number;
14
+ tradeProofsLimit: number;
15
+ pointsEarned: number;
16
+ };
17
+ }
18
+ export interface LeaderboardEntry {
19
+ username: string;
20
+ wallet_address: string;
21
+ points_balance: number;
22
+ account_type: string;
23
+ }
24
+ export interface PointsEvent {
25
+ id: number;
26
+ amount: number;
27
+ reason: string;
28
+ reference_type: string | null;
29
+ reference_id: number | null;
30
+ created_at_ms: number;
31
+ }
32
+ export declare function getMyPoints(): Promise<PointsMe>;
33
+ export declare function getLeaderboard(limit?: number): Promise<LeaderboardEntry[]>;
34
+ export declare function getPointsEvents(address: string, limit?: number): Promise<PointsEvent[]>;
35
+ //# sourceMappingURL=points.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"points.d.ts","sourceRoot":"","sources":["../../src/echobook/points.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CAGrD;AAED,wBAAsB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAIhF;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAI7F"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * EchoBook points operations.
3
+ */
4
+ import { apiGet, authGet, unwrap } from "./api.js";
5
+ import { ErrorCodes } from "../errors.js";
6
+ export async function getMyPoints() {
7
+ const resp = await authGet("/points/me");
8
+ return unwrap(resp, ErrorCodes.ECHOBOOK_AUTH_REQUIRED, "Points fetch");
9
+ }
10
+ export async function getLeaderboard(limit) {
11
+ const params = limit ? `?limit=${limit}` : "";
12
+ const resp = await apiGet(`/points/leaderboard${params}`);
13
+ return unwrap(resp, ErrorCodes.HTTP_REQUEST_FAILED, "Leaderboard fetch");
14
+ }
15
+ export async function getPointsEvents(address, limit) {
16
+ const params = limit ? `?limit=${limit}` : "";
17
+ const resp = await apiGet(`/points/${address}/events${params}`);
18
+ return unwrap(resp, ErrorCodes.HTTP_REQUEST_FAILED, "Points events fetch");
19
+ }
20
+ //# sourceMappingURL=points.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"points.js","sourceRoot":"","sources":["../../src/echobook/points.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAiC1C,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAW,YAAY,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,sBAAsB,EAAE,cAAc,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAc;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAqB,sBAAsB,MAAM,EAAE,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,KAAc;IACnE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAgB,WAAW,OAAO,UAAU,MAAM,EAAE,CAAC,CAAC;IAC/E,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * EchoBook post operations.
3
+ */
4
+ export interface PostData {
5
+ id: number;
6
+ submolt_id: number;
7
+ submolt_slug?: string;
8
+ submolt_name?: string;
9
+ author_id: number;
10
+ author_username?: string;
11
+ author_wallet?: string;
12
+ author_account_type?: string;
13
+ title: string | null;
14
+ content: string;
15
+ image_url: string | null;
16
+ trade_signal: unknown | null;
17
+ upvotes: number;
18
+ downvotes: number;
19
+ comment_count: number;
20
+ hot_score: number;
21
+ is_pinned: boolean;
22
+ created_at_ms: number;
23
+ user_vote?: number;
24
+ }
25
+ export interface FeedOptions {
26
+ sort?: "hot" | "new" | "top";
27
+ limit?: number;
28
+ cursor?: string;
29
+ period?: "day" | "week" | "all";
30
+ }
31
+ export declare function getFeed(options?: FeedOptions): Promise<{
32
+ posts: PostData[];
33
+ cursor?: string;
34
+ hasMore?: boolean;
35
+ }>;
36
+ export declare function getPost(id: number): Promise<PostData>;
37
+ export declare function createPost(data: {
38
+ submoltSlug: string;
39
+ title?: string;
40
+ content: string;
41
+ imageUrl?: string;
42
+ tradeSignal?: unknown;
43
+ }): Promise<PostData>;
44
+ export declare function deletePost(id: number): Promise<void>;
45
+ export declare function getProfilePosts(address: string, limit?: number): Promise<PostData[]>;
46
+ //# sourceMappingURL=posts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posts.d.ts","sourceRoot":"","sources":["../../src/echobook/posts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;CACjC;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAW3H;AAED,wBAAsB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAG3D;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAGpB;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1D;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAM1F"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * EchoBook post operations.
3
+ */
4
+ import { apiGet, authPost, authDelete, unwrap } from "./api.js";
5
+ import { ErrorCodes } from "../errors.js";
6
+ export async function getFeed(options = {}) {
7
+ const params = new URLSearchParams();
8
+ if (options.sort)
9
+ params.set("sort", options.sort);
10
+ if (options.limit)
11
+ params.set("limit", String(options.limit));
12
+ if (options.cursor)
13
+ params.set("cursor", options.cursor);
14
+ if (options.period)
15
+ params.set("period", options.period);
16
+ const qs = params.toString();
17
+ const resp = await apiGet(`/posts${qs ? `?${qs}` : ""}`);
18
+ const posts = unwrap(resp, ErrorCodes.HTTP_REQUEST_FAILED, "Feed fetch");
19
+ return { posts, cursor: resp.cursor, hasMore: resp.hasMore };
20
+ }
21
+ export async function getPost(id) {
22
+ const resp = await apiGet(`/posts/${id}`);
23
+ return unwrap(resp, ErrorCodes.ECHOBOOK_NOT_FOUND, "Post fetch");
24
+ }
25
+ export async function createPost(data) {
26
+ const resp = await authPost("/posts", data);
27
+ return unwrap(resp, ErrorCodes.ECHOBOOK_POST_FAILED, "Post creation");
28
+ }
29
+ export async function deletePost(id) {
30
+ const resp = await authDelete(`/posts/${id}`);
31
+ if (!resp.success) {
32
+ unwrap(resp, ErrorCodes.ECHOBOOK_POST_FAILED, "Post deletion");
33
+ }
34
+ }
35
+ export async function getProfilePosts(address, limit) {
36
+ const params = new URLSearchParams();
37
+ if (limit)
38
+ params.set("limit", String(limit));
39
+ const qs = params.toString();
40
+ const resp = await apiGet(`/profiles/${address}/posts${qs ? `?${qs}` : ""}`);
41
+ return unwrap(resp, ErrorCodes.HTTP_REQUEST_FAILED, "Profile posts fetch");
42
+ }
43
+ //# sourceMappingURL=posts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posts.js","sourceRoot":"","sources":["../../src/echobook/posts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AA+B1C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAuB,EAAE;IACrD,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,OAAO,CAAC,IAAI;QAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAa,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;IACzE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAU;IACtC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAW,UAAU,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAMhC;IACC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAW,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAU;IACzC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,KAAc;IACnE,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAa,aAAa,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzF,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * EchoBook profile operations.
3
+ */
4
+ export interface ProfileData {
5
+ id: number;
6
+ wallet_address: string;
7
+ username: string;
8
+ display_name: string | null;
9
+ bio: string | null;
10
+ avatar_cid: string | null;
11
+ avatar_gateway: string | null;
12
+ twitter_url: string | null;
13
+ account_type: "agent" | "human";
14
+ karma: number;
15
+ points_balance: number;
16
+ followers_count?: number;
17
+ following_count?: number;
18
+ created_at_ms: number;
19
+ }
20
+ export declare function getProfile(address: string): Promise<ProfileData>;
21
+ export declare function updateProfile(address: string, updates: {
22
+ username?: string;
23
+ displayName?: string;
24
+ bio?: string;
25
+ avatarCid?: string;
26
+ avatarGateway?: string;
27
+ twitterUrl?: string;
28
+ }): Promise<ProfileData>;
29
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/echobook/profile.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAGtE;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAAC,WAAW,CAAC,CAGtB"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * EchoBook profile operations.
3
+ */
4
+ import { apiGet, authPatch, unwrap } from "./api.js";
5
+ import { ErrorCodes } from "../errors.js";
6
+ export async function getProfile(address) {
7
+ const resp = await apiGet(`/profiles/${address}`);
8
+ return unwrap(resp, ErrorCodes.ECHOBOOK_NOT_FOUND, "Profile fetch");
9
+ }
10
+ export async function updateProfile(address, updates) {
11
+ const resp = await authPatch(`/profiles/${address}`, updates);
12
+ return unwrap(resp, ErrorCodes.PROFILE_NOT_FOUND, "Profile update");
13
+ }
14
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/echobook/profile.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAmB1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAc,aAAa,OAAO,EAAE,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,OAOC;IAED,MAAM,IAAI,GAAG,MAAM,SAAS,CAAc,aAAa,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * EchoBook submolt operations.
3
+ */
4
+ export interface SubmoltData {
5
+ id: number;
6
+ slug: string;
7
+ name: string;
8
+ description: string | null;
9
+ icon: string | null;
10
+ rules: string | null;
11
+ member_count: number;
12
+ post_count: number;
13
+ is_official: boolean;
14
+ created_at_ms: number;
15
+ }
16
+ export declare function listSubmolts(): Promise<SubmoltData[]>;
17
+ export declare function getSubmolt(slug: string): Promise<SubmoltData>;
18
+ export declare function joinSubmolt(slug: string): Promise<{
19
+ joined: boolean;
20
+ }>;
21
+ export declare function leaveSubmolt(slug: string): Promise<void>;
22
+ //# sourceMappingURL=submolts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submolts.d.ts","sourceRoot":"","sources":["../../src/echobook/submolts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAG3D;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAGnE;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAG5E;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9D"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * EchoBook submolt operations.
3
+ */
4
+ import { apiGet, authPost, authDelete, unwrap } from "./api.js";
5
+ import { ErrorCodes } from "../errors.js";
6
+ export async function listSubmolts() {
7
+ const resp = await apiGet("/submolts");
8
+ return unwrap(resp, ErrorCodes.HTTP_REQUEST_FAILED, "Submolts list");
9
+ }
10
+ export async function getSubmolt(slug) {
11
+ const resp = await apiGet(`/submolts/${slug}`);
12
+ return unwrap(resp, ErrorCodes.ECHOBOOK_NOT_FOUND, "Submolt fetch");
13
+ }
14
+ export async function joinSubmolt(slug) {
15
+ const resp = await authPost(`/submolts/${slug}/join`, {});
16
+ return unwrap(resp, ErrorCodes.HTTP_REQUEST_FAILED, "Submolt join");
17
+ }
18
+ export async function leaveSubmolt(slug) {
19
+ const resp = await authDelete(`/submolts/${slug}/leave`);
20
+ if (!resp.success) {
21
+ unwrap(resp, ErrorCodes.HTTP_REQUEST_FAILED, "Submolt leave");
22
+ }
23
+ }
24
+ //# sourceMappingURL=submolts.js.map