wao 0.41.3 → 0.41.5

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 (719) hide show
  1. package/.babelrc-cjs +5 -0
  2. package/.babelrc-esm +5 -0
  3. package/.gitmodules +4 -0
  4. package/.prettierrc +6 -0
  5. package/README.md +90 -0
  6. package/app/.eslintrc.json +3 -0
  7. package/app/.mocharc.cjs +6 -0
  8. package/app/arweave.mjs +87 -0
  9. package/app/components/Footer.js +76 -0
  10. package/app/components/Global.js +1128 -0
  11. package/app/components/Header.js +306 -0
  12. package/app/components/Left.js +28 -0
  13. package/app/components/Logo.js +34 -0
  14. package/app/components/Middle.js +37 -0
  15. package/app/components/Sidebar.js +93 -0
  16. package/app/components/Tags.js +42 -0
  17. package/app/components/editor/Editor.js +322 -0
  18. package/app/components/editor/FilePath.js +42 -0
  19. package/app/components/editor/MonacoEditor.js +44 -0
  20. package/app/components/left/LeftMessages.js +85 -0
  21. package/app/components/left/LeftModules.js +86 -0
  22. package/app/components/left/LeftNetworks.js +438 -0
  23. package/app/components/left/LeftProcesses.js +98 -0
  24. package/app/components/left/LeftProjects.js +397 -0
  25. package/app/components/left/LeftTests.js +189 -0
  26. package/app/components/middle/MiddleBlocks.js +79 -0
  27. package/app/components/middle/MiddleEntity.js +16 -0
  28. package/app/components/middle/MiddleEntityAccount.js +264 -0
  29. package/app/components/middle/MiddleEntityAssignment.js +104 -0
  30. package/app/components/middle/MiddleEntityBlock.js +148 -0
  31. package/app/components/middle/MiddleEntityMessage.js +430 -0
  32. package/app/components/middle/MiddleEntityModule.js +183 -0
  33. package/app/components/middle/MiddleEntityProcess.js +323 -0
  34. package/app/components/middle/MiddleEntityTx.js +211 -0
  35. package/app/components/middle/MiddleMessages.js +87 -0
  36. package/app/components/middle/MiddleModules.js +89 -0
  37. package/app/components/middle/MiddleNetworks.js +516 -0
  38. package/app/components/middle/MiddleProcesses.js +87 -0
  39. package/app/components/middle/MiddleTests.js +134 -0
  40. package/app/components/modals/CreateFileModal.js +115 -0
  41. package/app/components/modals/CreateFolderModal.js +83 -0
  42. package/app/components/modals/CreateProjectModal.js +63 -0
  43. package/app/components/modals/FSModal.js +141 -0
  44. package/app/components/modals/ImportModal.js +105 -0
  45. package/app/components/modals/LaunchNetworkModal.js +95 -0
  46. package/app/components/modals/Modal.js +38 -0
  47. package/app/components/modals/ProxyModal.js +122 -0
  48. package/app/components/modals/RenameFileModal.js +95 -0
  49. package/app/components/styles/EditorScrollbarStyle.js +29 -0
  50. package/app/components/styles/EntityScrollbarStyle.js +29 -0
  51. package/app/components/styles/GlobalStyle.js +102 -0
  52. package/app/components/styles/XtermStyle.js +37 -0
  53. package/app/components/terminal/Terminal.js +132 -0
  54. package/app/components/terminal/Xterm.js +160 -0
  55. package/app/components/ui/avatar.jsx +49 -0
  56. package/app/components/ui/checkbox.jsx +17 -0
  57. package/app/components/ui/close-button.jsx +20 -0
  58. package/app/components/ui/color-mode.jsx +61 -0
  59. package/app/components/ui/dialog.jsx +54 -0
  60. package/app/components/ui/drawer.jsx +44 -0
  61. package/app/components/ui/field.jsx +22 -0
  62. package/app/components/ui/input-group.jsx +39 -0
  63. package/app/components/ui/popover.jsx +49 -0
  64. package/app/components/ui/provider.jsx +12 -0
  65. package/app/components/ui/radio.jsx +17 -0
  66. package/app/components/ui/slider.jsx +107 -0
  67. package/app/components/ui/toaster.jsx +69 -0
  68. package/app/components/ui/tooltip.jsx +35 -0
  69. package/app/index.js +10 -0
  70. package/app/jsconfig.json +7 -0
  71. package/app/lib/GithubCSS.js +1218 -0
  72. package/app/lib/addon-fit.js +72 -0
  73. package/app/lib/data.js +31 -0
  74. package/app/lib/github-markdown.css +1169 -0
  75. package/app/lib/global.js +1 -0
  76. package/app/lib/guide.js +82 -0
  77. package/app/lib/hub.js +109 -0
  78. package/app/lib/scripts.js +47 -0
  79. package/app/lib/store.js +34 -0
  80. package/app/lib/use.js +64 -0
  81. package/app/lib/utils.js +387 -0
  82. package/app/lib/webrtc.js +217 -0
  83. package/app/next.config.js +25 -0
  84. package/app/package.json +62 -0
  85. package/app/pages/404.js +9 -0
  86. package/app/pages/_app.js +10 -0
  87. package/app/pages/_document.js +14 -0
  88. package/app/pages/index.js +121 -0
  89. package/app/playwright.config.mjs +41 -0
  90. package/app/proxy.mjs +21 -0
  91. package/app/public/assets/cover.png +0 -0
  92. package/app/public/blueprints/apm.lua +91 -0
  93. package/app/public/blueprints/arena.lua +345 -0
  94. package/app/public/blueprints/arns.lua +318 -0
  95. package/app/public/blueprints/chat.lua +210 -0
  96. package/app/public/blueprints/chatroom.lua +56 -0
  97. package/app/public/blueprints/patch-legacy-reply.lua +13 -0
  98. package/app/public/blueprints/staking.lua +93 -0
  99. package/app/public/blueprints/token.lua +298 -0
  100. package/app/public/blueprints/voting.lua +45 -0
  101. package/app/public/favicon.ico +0 -0
  102. package/app/public/logo.png +0 -0
  103. package/cli-esm.js +55 -0
  104. package/cli.js +54 -0
  105. package/devnet/app/api.js +129 -0
  106. package/devnet/app/components/layout.js +89 -0
  107. package/devnet/app/components/pagination.js +144 -0
  108. package/devnet/app/components/search.js +159 -0
  109. package/devnet/app/components/table.js +124 -0
  110. package/devnet/app/components/tags.js +89 -0
  111. package/devnet/app/index.html +14 -0
  112. package/devnet/app/main.js +215 -0
  113. package/devnet/app/router.js +59 -0
  114. package/devnet/app/state.js +19 -0
  115. package/devnet/app/style.css +1606 -0
  116. package/devnet/app/utils.js +77 -0
  117. package/devnet/app/views/blocks.js +75 -0
  118. package/devnet/app/views/dashboard.js +127 -0
  119. package/devnet/app/views/entity.js +1473 -0
  120. package/devnet/app/views/messages.js +90 -0
  121. package/devnet/app/views/modules.js +165 -0
  122. package/devnet/app/views/processes.js +90 -0
  123. package/devnet/app/views/schedulers.js +90 -0
  124. package/devnet/app/views/transactions.js +88 -0
  125. package/devnet/migrations/0001_initial.sql +51 -0
  126. package/devnet/package.json +26 -0
  127. package/devnet/playwright.config.js +7 -0
  128. package/devnet/src/cu-worker.js +166 -0
  129. package/devnet/src/index.js +309 -0
  130. package/devnet/vite.config.js +17 -0
  131. package/devnet/vitest.config.js +10 -0
  132. package/devnet/wrangler-cu.toml +32 -0
  133. package/devnet/wrangler.toml +38 -0
  134. package/dhfs-tutorial-app/package.json +15 -0
  135. package/dist/esm/workspace/dashboard/public/favicon.png +0 -0
  136. package/dist/esm/workspace/src/counter.lua +14 -0
  137. package/dist/package.json +82 -0
  138. package/hb.sh +18 -0
  139. package/hbsig/.babelrc-cjs +5 -0
  140. package/hbsig/.babelrc-esm +5 -0
  141. package/hbsig/README.md +1 -0
  142. package/hbsig/dist/cjs/bin_to_str.js +44 -0
  143. package/hbsig/dist/cjs/collect-body-keys.js +470 -0
  144. package/hbsig/dist/cjs/commit.js +330 -0
  145. package/hbsig/dist/cjs/encode-array-item.js +110 -0
  146. package/hbsig/dist/cjs/encode-utils.js +242 -0
  147. package/hbsig/dist/cjs/encode.js +1365 -0
  148. package/hbsig/dist/cjs/erl_json.js +326 -0
  149. package/hbsig/dist/cjs/erl_str.js +1042 -0
  150. package/hbsig/dist/cjs/flat.js +279 -0
  151. package/hbsig/dist/cjs/http-message-signatures/httpbis.js +489 -0
  152. package/hbsig/dist/cjs/http-message-signatures/index.js +25 -0
  153. package/hbsig/dist/cjs/http-message-signatures/structured-header.js +129 -0
  154. package/hbsig/dist/cjs/httpsig.js +861 -0
  155. package/hbsig/dist/cjs/id.js +470 -0
  156. package/hbsig/dist/cjs/index.js +174 -0
  157. package/hbsig/dist/cjs/nocrypto.js +51 -0
  158. package/hbsig/dist/cjs/parser.js +201 -0
  159. package/hbsig/dist/cjs/send-utils.js +1231 -0
  160. package/hbsig/dist/cjs/send.js +211 -0
  161. package/hbsig/dist/cjs/signer-utils.js +494 -0
  162. package/hbsig/dist/cjs/signer.js +436 -0
  163. package/hbsig/dist/cjs/structured.js +515 -0
  164. package/hbsig/dist/cjs/test.js +12 -0
  165. package/hbsig/dist/cjs/utils.js +44 -0
  166. package/hbsig/dist/esm/bin_to_str.js +46 -0
  167. package/hbsig/dist/esm/collect-body-keys.js +436 -0
  168. package/hbsig/dist/esm/commit.js +219 -0
  169. package/hbsig/dist/esm/encode-array-item.js +112 -0
  170. package/hbsig/dist/esm/encode-utils.js +191 -0
  171. package/hbsig/dist/esm/encode.js +1256 -0
  172. package/hbsig/dist/esm/erl_json.js +292 -0
  173. package/hbsig/dist/esm/erl_str.js +1144 -0
  174. package/hbsig/dist/esm/flat.js +250 -0
  175. package/hbsig/dist/esm/http-message-signatures/httpbis.js +438 -0
  176. package/hbsig/dist/esm/http-message-signatures/index.js +4 -0
  177. package/hbsig/dist/esm/http-message-signatures/structured-header.js +105 -0
  178. package/hbsig/dist/esm/httpsig.js +866 -0
  179. package/hbsig/dist/esm/id.js +459 -0
  180. package/hbsig/dist/esm/index.js +13 -0
  181. package/hbsig/dist/esm/nocrypto.js +4 -0
  182. package/hbsig/dist/esm/package.json +3 -0
  183. package/hbsig/dist/esm/parser.js +171 -0
  184. package/hbsig/dist/esm/send-utils.js +1132 -0
  185. package/hbsig/dist/esm/send.js +142 -0
  186. package/hbsig/dist/esm/signer-utils.js +375 -0
  187. package/hbsig/dist/esm/signer.js +312 -0
  188. package/hbsig/dist/esm/structured.js +496 -0
  189. package/hbsig/dist/esm/test.js +2 -0
  190. package/hbsig/dist/esm/utils.js +29 -0
  191. package/hbsig/dist/package.json +39 -0
  192. package/hbsig/make.js +36 -0
  193. package/hbsig/package.json +39 -0
  194. package/hbsig/src/bin_to_str.js +46 -0
  195. package/hbsig/src/collect-body-keys.js +436 -0
  196. package/hbsig/src/commit.js +219 -0
  197. package/hbsig/src/encode-array-item.js +112 -0
  198. package/hbsig/src/encode-utils.js +191 -0
  199. package/hbsig/src/encode.js +1256 -0
  200. package/hbsig/src/erl_json.js +292 -0
  201. package/hbsig/src/erl_str.js +1144 -0
  202. package/hbsig/src/flat.js +250 -0
  203. package/hbsig/src/http-message-signatures/httpbis.js +438 -0
  204. package/hbsig/src/http-message-signatures/index.js +4 -0
  205. package/hbsig/src/http-message-signatures/structured-header.js +105 -0
  206. package/hbsig/src/httpsig.js +866 -0
  207. package/hbsig/src/id.js +459 -0
  208. package/hbsig/src/index.js +13 -0
  209. package/hbsig/src/nocrypto.js +4 -0
  210. package/hbsig/src/parser.js +171 -0
  211. package/hbsig/src/send-utils.js +1132 -0
  212. package/hbsig/src/send.js +142 -0
  213. package/hbsig/src/signer-utils.js +375 -0
  214. package/hbsig/src/signer.js +312 -0
  215. package/hbsig/src/structured.js +496 -0
  216. package/hbsig/src/test.js +2 -0
  217. package/hbsig/src/utils.js +29 -0
  218. package/lp/index.html +25 -0
  219. package/lp/package.json +19 -0
  220. package/lp/public/cover.png +0 -0
  221. package/lp/public/favicon.ico +0 -0
  222. package/lp/public/favicon.png +0 -0
  223. package/lp/public/images/book.jpg +0 -0
  224. package/lp/public/images/dashboard.png +0 -0
  225. package/lp/public/images/devnet.png +0 -0
  226. package/lp/public/images/hero-bg.png +0 -0
  227. package/lp/public/images/hyperadd.png +0 -0
  228. package/lp/public/images/message-flow.png +0 -0
  229. package/lp/public/images/mobile.png +0 -0
  230. package/lp/public/images/og-cover.png +0 -0
  231. package/lp/public/images/scan.png +0 -0
  232. package/lp/public/images/wao-hub.png +0 -0
  233. package/lp/public/images/wao-web.png +0 -0
  234. package/lp/public/logo.png +0 -0
  235. package/lp/src/App.jsx +29 -0
  236. package/lp/src/components/CodeBlock.jsx +37 -0
  237. package/lp/src/components/CodeBlock.module.css +89 -0
  238. package/lp/src/components/Footer.jsx +22 -0
  239. package/lp/src/components/Footer.module.css +60 -0
  240. package/lp/src/components/Nav.jsx +80 -0
  241. package/lp/src/components/Nav.module.css +177 -0
  242. package/lp/src/components/SectionWrapper.jsx +15 -0
  243. package/lp/src/hooks/useReveal.js +25 -0
  244. package/lp/src/hooks/useScrolled.js +14 -0
  245. package/lp/src/main.jsx +10 -0
  246. package/lp/src/sections/Book.jsx +60 -0
  247. package/lp/src/sections/Book.module.css +204 -0
  248. package/lp/src/sections/Browser.jsx +46 -0
  249. package/lp/src/sections/Browser.module.css +67 -0
  250. package/lp/src/sections/Devnet.jsx +55 -0
  251. package/lp/src/sections/Devnet.module.css +136 -0
  252. package/lp/src/sections/GetStarted.jsx +51 -0
  253. package/lp/src/sections/GetStarted.module.css +128 -0
  254. package/lp/src/sections/Hero.jsx +67 -0
  255. package/lp/src/sections/Hero.module.css +202 -0
  256. package/lp/src/sections/HyperADD.jsx +46 -0
  257. package/lp/src/sections/HyperADD.module.css +113 -0
  258. package/lp/src/sections/SDK.jsx +90 -0
  259. package/lp/src/sections/SDK.module.css +122 -0
  260. package/lp/src/sections/Testing.jsx +47 -0
  261. package/lp/src/sections/Testing.module.css +124 -0
  262. package/lp/src/sections/Vision.jsx +93 -0
  263. package/lp/src/sections/Vision.module.css +147 -0
  264. package/lp/src/styles/globals.css +285 -0
  265. package/lp/src/utils/scrollTo.js +4 -0
  266. package/lp/vite.config.js +7 -0
  267. package/make.js +39 -0
  268. package/package.json +17 -12
  269. package/patches/@permaweb+ao-loader+0.0.44.patch +64 -0
  270. package/plan.md +435 -0
  271. package/rebar.lock +1 -0
  272. package/src/accounts-web.js +128 -0
  273. package/src/accounts.js +124 -0
  274. package/src/adaptor-base.js +622 -0
  275. package/src/adaptor-cf.js +11 -0
  276. package/src/adaptor-web.js +11 -0
  277. package/src/adaptor.js +10 -0
  278. package/src/ao-loader.js +30660 -0
  279. package/src/ao.js +1173 -0
  280. package/src/aoconnect-base.js +1098 -0
  281. package/src/aoconnect-cf.js +9 -0
  282. package/src/aoconnect-web.js +8 -0
  283. package/src/aoconnect.js +8 -0
  284. package/src/aos_wamr.js +1 -0
  285. package/src/ar-remote.js +87 -0
  286. package/src/ar.js +276 -0
  287. package/src/armem-base.js +529 -0
  288. package/src/armem-cf.js +67 -0
  289. package/src/armem-web.js +19 -0
  290. package/src/armem.js +26 -0
  291. package/src/bao.js +141 -0
  292. package/src/bar.js +366 -0
  293. package/src/build.js +7 -0
  294. package/src/bundler.js +119 -0
  295. package/src/car.js +10 -0
  296. package/src/cf-env.js +29 -0
  297. package/src/cf.js +11 -0
  298. package/src/cli.js +561 -0
  299. package/src/compress.js +112 -0
  300. package/src/create.js +415 -0
  301. package/src/devs.js +86 -0
  302. package/src/dirname.js +1 -0
  303. package/src/dodb.js +26 -0
  304. package/src/erl_json.js +289 -0
  305. package/src/erl_str.js +1139 -0
  306. package/src/gql.js +229 -0
  307. package/src/hb.js +967 -0
  308. package/src/helpers.js +203 -0
  309. package/src/http.js +619 -0
  310. package/src/hub/bundler.js +123 -0
  311. package/src/hub/cu.js +74 -0
  312. package/src/hub/fs.js +157 -0
  313. package/src/hub/index.js +85 -0
  314. package/src/hub/utils.js +64 -0
  315. package/src/hub/ws-proxy.js +67 -0
  316. package/src/hyper-aos.js +1 -0
  317. package/src/hyperbeam-server.js +21 -0
  318. package/src/hyperbeam.js +585 -0
  319. package/src/index.js +5 -0
  320. package/src/keygen.js +47 -0
  321. package/src/lfdb.js +67 -0
  322. package/src/lua/aos.wasm +0 -0
  323. package/src/lua/aos2_0_1.js +1 -0
  324. package/src/lua/aos2_0_1.wasm +0 -0
  325. package/src/lua/aos2_0_3.js +1 -0
  326. package/src/lua/aos2_0_3.wasm +0 -0
  327. package/src/lua/aos2_0_4_32.js +1 -0
  328. package/src/lua/aos2_0_4_32.wasm +0 -0
  329. package/src/lua/aos2_0_6.wasm +0 -0
  330. package/src/lua/apm.lua +61 -0
  331. package/src/lua/llama.wasm +0 -0
  332. package/src/lua/process.wasm +0 -0
  333. package/src/lua/sqlite.js +1 -0
  334. package/src/lua/sqlite.wasm +0 -0
  335. package/src/lua/weavedb_mock.lua +44 -0
  336. package/src/lua/weavedrive.lua +53 -0
  337. package/src/run.js +25 -0
  338. package/src/server.js +173 -0
  339. package/src/storage-multi.js +183 -0
  340. package/src/tao.js +12 -0
  341. package/src/tar.js +10 -0
  342. package/src/test.js +42 -0
  343. package/src/tgql-d1.js +407 -0
  344. package/src/tgql.js +310 -0
  345. package/src/toerl.js +162 -0
  346. package/src/utils.js +777 -0
  347. package/src/wao.js +29 -0
  348. package/src/waosm/README.md +81 -0
  349. package/src/waosm/waosm.d.ts +40 -0
  350. package/src/waosm/waosm.js +240 -0
  351. package/src/waosm/waosm_bg.wasm +0 -0
  352. package/src/waosm/waosm_bg.wasm.d.ts +8 -0
  353. package/src/waosm-node/README.md +81 -0
  354. package/src/waosm-node/waosm.d.ts +8 -0
  355. package/src/waosm-node/waosm.js +4 -0
  356. package/src/waosm-node/waosm_bg.js +147 -0
  357. package/src/waosm-node/waosm_bg.wasm +0 -0
  358. package/src/waosm-node/waosm_bg.wasm.d.ts +8 -0
  359. package/src/waosm-node/waosm_bg.wasm.js +14 -0
  360. package/src/waosm-node.js +9 -0
  361. package/src/war.js +10 -0
  362. package/src/weavedrive.js +376 -0
  363. package/src/web.js +11 -0
  364. package/src/workspace/.mcp.json +8 -0
  365. package/src/workspace/CLAUDE.md +258 -0
  366. package/src/workspace/README.md +85 -0
  367. package/src/workspace/dashboard/index.html +163 -0
  368. package/src/workspace/dashboard/package.json +18 -0
  369. package/src/workspace/dashboard/public/favicon.ico +0 -0
  370. package/src/workspace/dashboard/public/favicon.png +0 -0
  371. package/src/workspace/dashboard/server.js +224 -0
  372. package/src/workspace/dashboard/src/App.jsx +2350 -0
  373. package/{cjs/workspace/frontend → src/workspace/dashboard}/vite.config.js +6 -0
  374. package/src/workspace/package.json +18 -0
  375. package/src/workspace/src/counter.lua +14 -0
  376. package/tsconfig.json +18 -0
  377. package/types/index.d.ts +329 -0
  378. package/waollama/.eslintrc.json +3 -0
  379. package/waollama/README.md +19 -0
  380. package/waollama/arweave.mjs +87 -0
  381. package/waollama/components/ui/avatar.jsx +49 -0
  382. package/waollama/components/ui/checkbox.jsx +17 -0
  383. package/waollama/components/ui/close-button.jsx +20 -0
  384. package/waollama/components/ui/color-mode.jsx +61 -0
  385. package/waollama/components/ui/dialog.jsx +54 -0
  386. package/waollama/components/ui/drawer.jsx +44 -0
  387. package/waollama/components/ui/field.jsx +22 -0
  388. package/waollama/components/ui/input-group.jsx +39 -0
  389. package/waollama/components/ui/popover.jsx +49 -0
  390. package/waollama/components/ui/provider.jsx +12 -0
  391. package/waollama/components/ui/radio.jsx +17 -0
  392. package/waollama/components/ui/slider.jsx +107 -0
  393. package/waollama/components/ui/tooltip.jsx +35 -0
  394. package/waollama/index.js +10 -0
  395. package/waollama/jsconfig.json +7 -0
  396. package/waollama/lib/ao-loader.js +30654 -0
  397. package/waollama/lib/client.js +1 -0
  398. package/waollama/lib/wasm.js +1 -0
  399. package/waollama/next.config.js +25 -0
  400. package/waollama/package.json +43 -0
  401. package/waollama/pages/404.js +9 -0
  402. package/waollama/pages/_app.js +9 -0
  403. package/waollama/pages/_document.js +14 -0
  404. package/waollama/pages/index.js +212 -0
  405. package/waollama/playwright.config.js +31 -0
  406. package/waollama/proxy.mjs +21 -0
  407. package/waollama/public/favicon.ico +0 -0
  408. package/waollama/public/human.png +0 -0
  409. package/waollama/public/llama.png +0 -0
  410. package/waosm/Cargo.toml +11 -0
  411. package/waosm/README.md +81 -0
  412. package/waosm/compress.js +112 -0
  413. package/waosm/make.js +33 -0
  414. package/waosm/package.json +10 -0
  415. package/waosm/src/lib.rs +180 -0
  416. package/waosm/test.js +16 -0
  417. package/cjs/workspace/.claude/agents/builder.md +0 -99
  418. package/cjs/workspace/.claude/agents/device-builder.md +0 -86
  419. package/cjs/workspace/.claude/agents/tester.md +0 -90
  420. package/cjs/workspace/.claude/mcp/dashboard/server.js +0 -128
  421. package/cjs/workspace/.claude/rules/deploy.md +0 -45
  422. package/cjs/workspace/.claude/rules/frontend.md +0 -69
  423. package/cjs/workspace/.claude/rules/hyperbeam.md +0 -104
  424. package/cjs/workspace/.claude/rules/lua.md +0 -108
  425. package/cjs/workspace/.claude/rules/testing.md +0 -257
  426. package/cjs/workspace/.claude/settings.json +0 -109
  427. package/cjs/workspace/.claude/skills/build/SKILL.md +0 -214
  428. package/cjs/workspace/.claude/skills/build-aos/SKILL.md +0 -129
  429. package/cjs/workspace/.claude/skills/build-device/SKILL.md +0 -192
  430. package/cjs/workspace/.claude/skills/build-frontend/SKILL.md +0 -134
  431. package/cjs/workspace/.claude/skills/build-module/SKILL.md +0 -281
  432. package/cjs/workspace/.claude/skills/create-aos/SKILL.md +0 -63
  433. package/cjs/workspace/.claude/skills/create-device/SKILL.md +0 -87
  434. package/cjs/workspace/.claude/skills/create-module/SKILL.md +0 -162
  435. package/cjs/workspace/.claude/skills/debug/SKILL.md +0 -57
  436. package/cjs/workspace/.claude/skills/deploy/SKILL.md +0 -85
  437. package/cjs/workspace/.claude/skills/dev/SKILL.md +0 -32
  438. package/cjs/workspace/.claude/skills/plan/SKILL.md +0 -176
  439. package/cjs/workspace/.claude/skills/readme/SKILL.md +0 -186
  440. package/cjs/workspace/.claude/skills/report/SKILL.md +0 -49
  441. package/cjs/workspace/.claude/skills/team/SKILL.md +0 -101
  442. package/cjs/workspace/.claude/skills/test/SKILL.md +0 -56
  443. package/cjs/workspace/.claude/skills/test-device/SKILL.md +0 -114
  444. package/cjs/workspace/.claude/skills/test-e2e/SKILL.md +0 -103
  445. package/cjs/workspace/.claude/skills/test-hb/SKILL.md +0 -76
  446. package/cjs/workspace/.claude/skills/validate/SKILL.md +0 -96
  447. package/cjs/workspace/.claude/skills/validate/scripts/check-lua.sh +0 -41
  448. package/cjs/workspace/docs/aos-lua.md +0 -428
  449. package/cjs/workspace/docs/debug.md +0 -230
  450. package/cjs/workspace/docs/hyperbeam-dev.md +0 -606
  451. package/cjs/workspace/docs/hyperbeam-devices.md +0 -618
  452. package/cjs/workspace/docs/wao-sdk.md +0 -807
  453. package/cjs/workspace/frontend/e2e/.gitkeep +0 -0
  454. package/cjs/workspace/frontend/index.html +0 -12
  455. package/cjs/workspace/frontend/package.json +0 -24
  456. package/cjs/workspace/frontend/playwright.config.js +0 -10
  457. package/cjs/workspace/frontend/src/App.jsx +0 -24
  458. package/cjs/workspace/frontend/test/.gitkeep +0 -0
  459. package/cjs/workspace/frontend/vitest.config.js +0 -10
  460. package/cjs/workspace/scripts/deploy.js +0 -140
  461. package/cjs/workspace/scripts/keygen.js +0 -52
  462. package/cjs/workspace/test/aos.test.js +0 -98
  463. package/cjs/workspace/test/hyperbeam.test.js +0 -80
  464. package/esm/compiler/native +0 -0
  465. package/esm/workspace/.claude/agents/builder.md +0 -99
  466. package/esm/workspace/.claude/agents/device-builder.md +0 -86
  467. package/esm/workspace/.claude/agents/tester.md +0 -90
  468. package/esm/workspace/.claude/mcp/dashboard/server.js +0 -128
  469. package/esm/workspace/.claude/rules/deploy.md +0 -45
  470. package/esm/workspace/.claude/rules/frontend.md +0 -69
  471. package/esm/workspace/.claude/rules/hyperbeam.md +0 -104
  472. package/esm/workspace/.claude/rules/lua.md +0 -108
  473. package/esm/workspace/.claude/rules/testing.md +0 -257
  474. package/esm/workspace/.claude/settings.json +0 -109
  475. package/esm/workspace/.claude/skills/build/SKILL.md +0 -214
  476. package/esm/workspace/.claude/skills/build-aos/SKILL.md +0 -129
  477. package/esm/workspace/.claude/skills/build-device/SKILL.md +0 -192
  478. package/esm/workspace/.claude/skills/build-frontend/SKILL.md +0 -134
  479. package/esm/workspace/.claude/skills/build-module/SKILL.md +0 -281
  480. package/esm/workspace/.claude/skills/create-aos/SKILL.md +0 -63
  481. package/esm/workspace/.claude/skills/create-device/SKILL.md +0 -87
  482. package/esm/workspace/.claude/skills/create-module/SKILL.md +0 -162
  483. package/esm/workspace/.claude/skills/debug/SKILL.md +0 -57
  484. package/esm/workspace/.claude/skills/deploy/SKILL.md +0 -85
  485. package/esm/workspace/.claude/skills/dev/SKILL.md +0 -32
  486. package/esm/workspace/.claude/skills/plan/SKILL.md +0 -176
  487. package/esm/workspace/.claude/skills/readme/SKILL.md +0 -186
  488. package/esm/workspace/.claude/skills/report/SKILL.md +0 -49
  489. package/esm/workspace/.claude/skills/team/SKILL.md +0 -101
  490. package/esm/workspace/.claude/skills/test/SKILL.md +0 -56
  491. package/esm/workspace/.claude/skills/test-device/SKILL.md +0 -114
  492. package/esm/workspace/.claude/skills/test-e2e/SKILL.md +0 -103
  493. package/esm/workspace/.claude/skills/test-hb/SKILL.md +0 -76
  494. package/esm/workspace/.claude/skills/validate/SKILL.md +0 -96
  495. package/esm/workspace/.claude/skills/validate/scripts/check-lua.sh +0 -41
  496. package/esm/workspace/docs/aos-lua.md +0 -428
  497. package/esm/workspace/docs/debug.md +0 -230
  498. package/esm/workspace/docs/hyperbeam-dev.md +0 -606
  499. package/esm/workspace/docs/hyperbeam-devices.md +0 -618
  500. package/esm/workspace/docs/wao-sdk.md +0 -807
  501. package/esm/workspace/frontend/e2e/.gitkeep +0 -0
  502. package/esm/workspace/frontend/index.html +0 -12
  503. package/esm/workspace/frontend/package.json +0 -24
  504. package/esm/workspace/frontend/playwright.config.js +0 -10
  505. package/esm/workspace/frontend/src/App.jsx +0 -24
  506. package/esm/workspace/frontend/src/main.jsx +0 -9
  507. package/esm/workspace/frontend/test/.gitkeep +0 -0
  508. package/esm/workspace/frontend/vite.config.js +0 -6
  509. package/esm/workspace/frontend/vitest.config.js +0 -10
  510. package/esm/workspace/scripts/deploy.js +0 -140
  511. package/esm/workspace/scripts/keygen.js +0 -52
  512. package/esm/workspace/test/aos.test.js +0 -98
  513. package/esm/workspace/test/hyperbeam.test.js +0 -80
  514. /package/{cjs/workspace/dashboard/public → devnet/app}/favicon.ico +0 -0
  515. /package/{cjs/workspace → dhfs-tutorial-app}/src/counter.lua +0 -0
  516. /package/{cjs → dist/cjs}/accounts-web.js +0 -0
  517. /package/{cjs → dist/cjs}/accounts.js +0 -0
  518. /package/{cjs → dist/cjs}/adaptor-base.js +0 -0
  519. /package/{cjs → dist/cjs}/adaptor-cf.js +0 -0
  520. /package/{cjs → dist/cjs}/adaptor-web.js +0 -0
  521. /package/{cjs → dist/cjs}/adaptor.js +0 -0
  522. /package/{cjs → dist/cjs}/ao-loader.js +0 -0
  523. /package/{cjs → dist/cjs}/ao.js +0 -0
  524. /package/{cjs → dist/cjs}/aoconnect-base.js +0 -0
  525. /package/{cjs → dist/cjs}/aoconnect-cf.js +0 -0
  526. /package/{cjs → dist/cjs}/aoconnect-web.js +0 -0
  527. /package/{cjs → dist/cjs}/aoconnect.js +0 -0
  528. /package/{cjs → dist/cjs}/aos_wamr.js +0 -0
  529. /package/{cjs → dist/cjs}/ar-remote.js +0 -0
  530. /package/{cjs → dist/cjs}/ar.js +0 -0
  531. /package/{cjs → dist/cjs}/armem-base.js +0 -0
  532. /package/{cjs → dist/cjs}/armem-cf.js +0 -0
  533. /package/{cjs → dist/cjs}/armem-web.js +0 -0
  534. /package/{cjs → dist/cjs}/armem.js +0 -0
  535. /package/{cjs → dist/cjs}/bao.js +0 -0
  536. /package/{cjs → dist/cjs}/bar.js +0 -0
  537. /package/{cjs → dist/cjs}/build.js +0 -0
  538. /package/{cjs → dist/cjs}/bundler.js +0 -0
  539. /package/{cjs → dist/cjs}/car.js +0 -0
  540. /package/{cjs → dist/cjs}/cf-env.js +0 -0
  541. /package/{cjs → dist/cjs}/cf.js +0 -0
  542. /package/{cjs → dist/cjs}/cli.js +0 -0
  543. /package/{cjs → dist/cjs}/compress.js +0 -0
  544. /package/{cjs → dist/cjs}/create.js +0 -0
  545. /package/{cjs → dist/cjs}/devs.js +0 -0
  546. /package/{cjs → dist/cjs}/dirname.js +0 -0
  547. /package/{cjs → dist/cjs}/dodb.js +0 -0
  548. /package/{cjs → dist/cjs}/erl_json.js +0 -0
  549. /package/{cjs → dist/cjs}/erl_str.js +0 -0
  550. /package/{cjs → dist/cjs}/gql.js +0 -0
  551. /package/{cjs → dist/cjs}/hb.js +0 -0
  552. /package/{cjs → dist/cjs}/helpers.js +0 -0
  553. /package/{cjs → dist/cjs}/http.js +0 -0
  554. /package/{cjs → dist/cjs}/hub/bundler.js +0 -0
  555. /package/{cjs → dist/cjs}/hub/cu.js +0 -0
  556. /package/{cjs → dist/cjs}/hub/fs.js +0 -0
  557. /package/{cjs → dist/cjs}/hub/index.js +0 -0
  558. /package/{cjs → dist/cjs}/hub/utils.js +0 -0
  559. /package/{cjs → dist/cjs}/hub/ws-proxy.js +0 -0
  560. /package/{cjs → dist/cjs}/hyper-aos.js +0 -0
  561. /package/{cjs → dist/cjs}/hyperbeam-server.js +0 -0
  562. /package/{cjs → dist/cjs}/hyperbeam.js +0 -0
  563. /package/{cjs → dist/cjs}/index.js +0 -0
  564. /package/{cjs → dist/cjs}/keygen.js +0 -0
  565. /package/{cjs → dist/cjs}/lfdb.js +0 -0
  566. /package/{cjs → dist/cjs}/lua/aos.wasm +0 -0
  567. /package/{cjs → dist/cjs}/lua/aos2_0_1.js +0 -0
  568. /package/{cjs → dist/cjs}/lua/aos2_0_1.wasm +0 -0
  569. /package/{cjs → dist/cjs}/lua/aos2_0_3.js +0 -0
  570. /package/{cjs → dist/cjs}/lua/aos2_0_3.wasm +0 -0
  571. /package/{cjs → dist/cjs}/lua/aos2_0_4_32.js +0 -0
  572. /package/{cjs → dist/cjs}/lua/aos2_0_4_32.wasm +0 -0
  573. /package/{cjs → dist/cjs}/lua/aos2_0_6.wasm +0 -0
  574. /package/{cjs → dist/cjs}/lua/apm.lua +0 -0
  575. /package/{cjs → dist/cjs}/lua/llama.wasm +0 -0
  576. /package/{cjs → dist/cjs}/lua/process.wasm +0 -0
  577. /package/{cjs → dist/cjs}/lua/sqlite.js +0 -0
  578. /package/{cjs → dist/cjs}/lua/sqlite.wasm +0 -0
  579. /package/{cjs → dist/cjs}/lua/weavedb_mock.lua +0 -0
  580. /package/{cjs → dist/cjs}/lua/weavedrive.lua +0 -0
  581. /package/{cjs → dist/cjs}/run.js +0 -0
  582. /package/{cjs → dist/cjs}/server.js +0 -0
  583. /package/{cjs → dist/cjs}/storage-multi.js +0 -0
  584. /package/{cjs → dist/cjs}/tao.js +0 -0
  585. /package/{cjs → dist/cjs}/tar.js +0 -0
  586. /package/{cjs → dist/cjs}/test.js +0 -0
  587. /package/{cjs → dist/cjs}/tgql-d1.js +0 -0
  588. /package/{cjs → dist/cjs}/tgql.js +0 -0
  589. /package/{cjs → dist/cjs}/toerl.js +0 -0
  590. /package/{cjs → dist/cjs}/utils.js +0 -0
  591. /package/{cjs → dist/cjs}/wao.js +0 -0
  592. /package/{cjs → dist/cjs}/waosm/waosm.js +0 -0
  593. /package/{cjs → dist/cjs}/waosm-node/waosm.js +0 -0
  594. /package/{cjs → dist/cjs}/waosm-node/waosm_bg.js +0 -0
  595. /package/{cjs → dist/cjs}/waosm-node/waosm_bg.wasm +0 -0
  596. /package/{cjs → dist/cjs}/waosm-node/waosm_bg.wasm.js +0 -0
  597. /package/{cjs → dist/cjs}/waosm-node.js +0 -0
  598. /package/{cjs → dist/cjs}/war.js +0 -0
  599. /package/{cjs → dist/cjs}/weavedrive.js +0 -0
  600. /package/{cjs → dist/cjs}/web.js +0 -0
  601. /package/{cjs → dist/cjs}/workspace/.mcp.json +0 -0
  602. /package/{cjs → dist/cjs}/workspace/CLAUDE.md +0 -0
  603. /package/{cjs → dist/cjs}/workspace/README.md +0 -0
  604. /package/{cjs → dist/cjs}/workspace/dashboard/index.html +0 -0
  605. /package/{cjs → dist/cjs}/workspace/dashboard/package.json +0 -0
  606. /package/{esm → dist/cjs}/workspace/dashboard/public/favicon.ico +0 -0
  607. /package/{cjs → dist/cjs}/workspace/dashboard/public/favicon.png +0 -0
  608. /package/{cjs → dist/cjs}/workspace/dashboard/server.js +0 -0
  609. /package/{cjs → dist/cjs}/workspace/dashboard/src/App.jsx +0 -0
  610. /package/{cjs → dist/cjs}/workspace/dashboard/src/main.jsx +0 -0
  611. /package/{cjs → dist/cjs}/workspace/dashboard/vite.config.js +0 -0
  612. /package/{cjs → dist/cjs}/workspace/package.json +0 -0
  613. /package/{esm → dist/cjs}/workspace/src/counter.lua +0 -0
  614. /package/{esm → dist/esm}/accounts-web.js +0 -0
  615. /package/{esm → dist/esm}/accounts.js +0 -0
  616. /package/{esm → dist/esm}/adaptor-base.js +0 -0
  617. /package/{esm → dist/esm}/adaptor-cf.js +0 -0
  618. /package/{esm → dist/esm}/adaptor-web.js +0 -0
  619. /package/{esm → dist/esm}/adaptor.js +0 -0
  620. /package/{esm → dist/esm}/ao-loader.js +0 -0
  621. /package/{esm → dist/esm}/ao.js +0 -0
  622. /package/{esm → dist/esm}/aoconnect-base.js +0 -0
  623. /package/{esm → dist/esm}/aoconnect-cf.js +0 -0
  624. /package/{esm → dist/esm}/aoconnect-web.js +0 -0
  625. /package/{esm → dist/esm}/aoconnect.js +0 -0
  626. /package/{esm → dist/esm}/aos_wamr.js +0 -0
  627. /package/{esm → dist/esm}/ar-remote.js +0 -0
  628. /package/{esm → dist/esm}/ar.js +0 -0
  629. /package/{esm → dist/esm}/armem-base.js +0 -0
  630. /package/{esm → dist/esm}/armem-cf.js +0 -0
  631. /package/{esm → dist/esm}/armem-web.js +0 -0
  632. /package/{esm → dist/esm}/armem.js +0 -0
  633. /package/{esm → dist/esm}/bao.js +0 -0
  634. /package/{esm → dist/esm}/bar.js +0 -0
  635. /package/{esm → dist/esm}/build.js +0 -0
  636. /package/{esm → dist/esm}/bundler.js +0 -0
  637. /package/{esm → dist/esm}/car.js +0 -0
  638. /package/{esm → dist/esm}/cf-env.js +0 -0
  639. /package/{esm → dist/esm}/cf.js +0 -0
  640. /package/{esm → dist/esm}/cli.js +0 -0
  641. /package/{esm → dist/esm}/compress.js +0 -0
  642. /package/{esm → dist/esm}/create.js +0 -0
  643. /package/{esm → dist/esm}/devs.js +0 -0
  644. /package/{esm → dist/esm}/dirname.js +0 -0
  645. /package/{esm → dist/esm}/dodb.js +0 -0
  646. /package/{esm → dist/esm}/erl_json.js +0 -0
  647. /package/{esm → dist/esm}/erl_str.js +0 -0
  648. /package/{esm → dist/esm}/gql.js +0 -0
  649. /package/{esm → dist/esm}/hb.js +0 -0
  650. /package/{esm → dist/esm}/helpers.js +0 -0
  651. /package/{esm → dist/esm}/http.js +0 -0
  652. /package/{esm → dist/esm}/hub/bundler.js +0 -0
  653. /package/{esm → dist/esm}/hub/cu.js +0 -0
  654. /package/{esm → dist/esm}/hub/fs.js +0 -0
  655. /package/{esm → dist/esm}/hub/index.js +0 -0
  656. /package/{esm → dist/esm}/hub/utils.js +0 -0
  657. /package/{esm → dist/esm}/hub/ws-proxy.js +0 -0
  658. /package/{esm → dist/esm}/hyper-aos.js +0 -0
  659. /package/{esm → dist/esm}/hyperbeam-server.js +0 -0
  660. /package/{esm → dist/esm}/hyperbeam.js +0 -0
  661. /package/{esm → dist/esm}/index.js +0 -0
  662. /package/{esm → dist/esm}/keygen.js +0 -0
  663. /package/{esm → dist/esm}/lfdb.js +0 -0
  664. /package/{esm → dist/esm}/lua/aos.wasm +0 -0
  665. /package/{esm → dist/esm}/lua/aos2_0_1.js +0 -0
  666. /package/{esm → dist/esm}/lua/aos2_0_1.wasm +0 -0
  667. /package/{esm → dist/esm}/lua/aos2_0_3.js +0 -0
  668. /package/{esm → dist/esm}/lua/aos2_0_3.wasm +0 -0
  669. /package/{esm → dist/esm}/lua/aos2_0_4_32.js +0 -0
  670. /package/{esm → dist/esm}/lua/aos2_0_4_32.wasm +0 -0
  671. /package/{esm → dist/esm}/lua/aos2_0_6.wasm +0 -0
  672. /package/{esm → dist/esm}/lua/apm.lua +0 -0
  673. /package/{esm → dist/esm}/lua/llama.wasm +0 -0
  674. /package/{esm → dist/esm}/lua/process.wasm +0 -0
  675. /package/{esm → dist/esm}/lua/sqlite.js +0 -0
  676. /package/{esm → dist/esm}/lua/sqlite.wasm +0 -0
  677. /package/{esm → dist/esm}/lua/weavedb_mock.lua +0 -0
  678. /package/{esm → dist/esm}/lua/weavedrive.lua +0 -0
  679. /package/{esm → dist/esm}/package.json +0 -0
  680. /package/{esm → dist/esm}/run.js +0 -0
  681. /package/{esm → dist/esm}/server.js +0 -0
  682. /package/{esm → dist/esm}/storage-multi.js +0 -0
  683. /package/{esm → dist/esm}/tao.js +0 -0
  684. /package/{esm → dist/esm}/tar.js +0 -0
  685. /package/{esm → dist/esm}/test.js +0 -0
  686. /package/{esm → dist/esm}/tgql-d1.js +0 -0
  687. /package/{esm → dist/esm}/tgql.js +0 -0
  688. /package/{esm → dist/esm}/toerl.js +0 -0
  689. /package/{esm → dist/esm}/utils.js +0 -0
  690. /package/{esm → dist/esm}/wao.js +0 -0
  691. /package/{esm → dist/esm}/waosm/README.md +0 -0
  692. /package/{esm → dist/esm}/waosm/waosm.d.ts +0 -0
  693. /package/{esm → dist/esm}/waosm/waosm.js +0 -0
  694. /package/{esm → dist/esm}/waosm/waosm_bg.wasm +0 -0
  695. /package/{esm → dist/esm}/waosm/waosm_bg.wasm.d.ts +0 -0
  696. /package/{esm → dist/esm}/waosm-node/README.md +0 -0
  697. /package/{esm → dist/esm}/waosm-node/waosm.d.ts +0 -0
  698. /package/{esm → dist/esm}/waosm-node/waosm.js +0 -0
  699. /package/{esm → dist/esm}/waosm-node/waosm_bg.js +0 -0
  700. /package/{esm → dist/esm}/waosm-node/waosm_bg.wasm +0 -0
  701. /package/{esm → dist/esm}/waosm-node/waosm_bg.wasm.d.ts +0 -0
  702. /package/{esm → dist/esm}/waosm-node/waosm_bg.wasm.js +0 -0
  703. /package/{esm → dist/esm}/waosm-node.js +0 -0
  704. /package/{esm → dist/esm}/war.js +0 -0
  705. /package/{esm → dist/esm}/weavedrive.js +0 -0
  706. /package/{esm → dist/esm}/web.js +0 -0
  707. /package/{esm → dist/esm}/workspace/.mcp.json +0 -0
  708. /package/{esm → dist/esm}/workspace/CLAUDE.md +0 -0
  709. /package/{esm → dist/esm}/workspace/README.md +0 -0
  710. /package/{esm → dist/esm}/workspace/dashboard/index.html +0 -0
  711. /package/{esm → dist/esm}/workspace/dashboard/package.json +0 -0
  712. /package/{esm/workspace/dashboard/public/favicon.png → dist/esm/workspace/dashboard/public/favicon.ico} +0 -0
  713. /package/{esm → dist/esm}/workspace/dashboard/server.js +0 -0
  714. /package/{esm → dist/esm}/workspace/dashboard/src/App.jsx +0 -0
  715. /package/{cjs/workspace/frontend → dist/esm/workspace/dashboard}/src/main.jsx +0 -0
  716. /package/{esm → dist/esm}/workspace/dashboard/vite.config.js +0 -0
  717. /package/{esm → dist/esm}/workspace/package.json +0 -0
  718. /package/{postinstall.cjs → dist/postinstall.cjs} +0 -0
  719. /package/{esm → src}/workspace/dashboard/src/main.jsx +0 -0
@@ -0,0 +1,585 @@
1
+ import { spawn, spawnSync } from "child_process"
2
+ import { resolve } from "path"
3
+ import { isNil, map } from "ramda"
4
+ import { toAddr } from "./test.js"
5
+ import HB from "./hb.js"
6
+ import { rmSync, readFileSync, readdirSync, writeFileSync, existsSync } from "fs"
7
+ import devs from "./devs.js"
8
+ import dotenv from "dotenv"
9
+ dotenv.config({ path: ".env.hyperbeam" })
10
+
11
+ export default class HyperBEAM {
12
+ static OPERATOR = Symbol("operator")
13
+ constructor({
14
+ port = 10001,
15
+ cu_port = 6363,
16
+ as = [],
17
+ bundler,
18
+ gateway,
19
+ wallet = ".wallet.json",
20
+ reset,
21
+ cwd = process.env.CWD ?? "./HyperBEAM",
22
+ c,
23
+ cmake,
24
+ faff,
25
+ simple_pay = false,
26
+ simple_pay_price,
27
+ bundler_ans104,
28
+ bundler_httpsig,
29
+ p4_non_chargable_routes,
30
+ p4_lua,
31
+ store_prefix,
32
+ operator,
33
+ logs = true,
34
+ shell = true,
35
+ devices,
36
+ genesis_wasm = false,
37
+ arweave_gateway,
38
+ force_signed = false,
39
+ linkify_mode, // v0.9-FINAL: HB linkify mode. undefined => HB default; pass "false" for hbsig-style inline-only responses
40
+ rebar3, // Use rebar3 shell (true) or direct erl (false). Defaults to HB_REBAR3 env or true
41
+ } = {}) {
42
+ // Determine rebar3 mode: option > env var > default (true)
43
+ const envRebar3 = process.env.HB_REBAR3
44
+ if (rebar3 !== undefined) {
45
+ this.rebar3 = rebar3
46
+ } else if (envRebar3 !== undefined) {
47
+ this.rebar3 = envRebar3.toLowerCase() !== "false"
48
+ } else {
49
+ this.rebar3 = true // default to rebar3 mode
50
+ }
51
+ this.genesis_wasm = genesis_wasm
52
+ this.force_signed = force_signed
53
+ this.linkify_mode = linkify_mode
54
+ this.cu_port = cu_port
55
+ this.arweave_gateway = arweave_gateway || process.env.ARWEAVE_GATEWAY
56
+ this.devices = devices
57
+ this.p4_non_chargable_routes = p4_non_chargable_routes
58
+ this.logs = logs
59
+ this.cwd = cwd
60
+ this.dirname = resolve(process.cwd(), this.cwd)
61
+ this.wallet = wallet
62
+ this.wallet_location = resolve(this.dirname, this.wallet)
63
+ this.jwk = JSON.parse(this.file(this.wallet_location))
64
+ this.addr = toAddr(this.jwk.n)
65
+ if (reset) {
66
+ for (let v of readdirSync(this.dirname)) {
67
+ if (/^cache-/.test(v)) {
68
+ try {
69
+ rmSync(resolve(this.dirname, v), { recursive: true, force: true })
70
+ } catch (e) {
71
+ console.log(e)
72
+ }
73
+ }
74
+ }
75
+ }
76
+ //this.cu = cu
77
+ this.store_prefix = store_prefix
78
+ ? "cache-mainnet-" + Math.floor(Math.random() * 10000000)
79
+ : "cache-mainnet"
80
+ this.p4_lua = p4_lua
81
+ this.simple_pay = simple_pay
82
+ this.spp = simple_pay_price
83
+ this.operator = operator
84
+ if (this.operator === HyperBEAM.OPERATOR) this.operator = this.addr
85
+ this.faff = faff
86
+ this.c = c
87
+ this.cmake = cmake
88
+ this.port = port
89
+ this.url = `http://127.0.0.1:${this.port}`
90
+ if (bundler) this.bundler = `http://localhost::${bundler}`
91
+ this.bundler_ans104 = bundler_ans104
92
+ if (bundler_httpsig) this.bundler = bundler_httpsig
93
+ this.as = as
94
+ this.gateway = gateway
95
+ if (Array.isArray(this.faff)) {
96
+ let i = 0
97
+ for (let v of this.faff) {
98
+ if (typeof v === "symbol" && v === HyperBEAM.OPERATOR) {
99
+ this.faff[i] = this.addr
100
+ }
101
+ i++
102
+ }
103
+ }
104
+ if (shell) this.shell()
105
+ }
106
+ shell() {
107
+ // Kill any stale beam.smp / process listening on our HB port before
108
+ // spawning a new shell. Without this, sequential test runs can hit a
109
+ // lingering Erlang VM from the previous test (kill() returned but the
110
+ // OS hadn't released the port yet) and end up either failing to bind
111
+ // 10001 or talking to the stale node with stale process registry —
112
+ // surface symptom is 400 "No scheduler information provided." on the
113
+ // first schedule of an otherwise-known process.
114
+ try {
115
+ spawnSync("bash", ["-c", `lsof -ti:${this.port} | xargs -r kill -9 2>/dev/null`], { stdio: "ignore" })
116
+ } catch (_e) {}
117
+ const evalCmd = this.genEval({ gateway: this.gateway, wallet: this.wallet })
118
+ const cwd = resolve(process.cwd(), this.cwd)
119
+ const env = this.genEnv() // genEnv() returns filtered process.env without proxy vars
120
+
121
+ if (this.rebar3) {
122
+ // rebar3 shell mode
123
+ const _as = this.as.length === 0 ? [] : ["as", this.as.join(",")]
124
+ this._shell = spawn(
125
+ "rebar3",
126
+ [
127
+ ..._as,
128
+ "shell",
129
+ "--eval",
130
+ evalCmd,
131
+ ],
132
+ { env, cwd }
133
+ )
134
+ } else {
135
+ // Direct erl mode - compile first if needed, then start
136
+ // This mode is better for proxy environments as it gives more control
137
+ // Manually expand glob pattern to avoid shell interpretation issues
138
+ const buildDir = resolve(cwd, "_build/default/lib")
139
+ let ebinDirs = []
140
+ try {
141
+ const libs = readdirSync(buildDir)
142
+ for (const lib of libs) {
143
+ const ebinPath = resolve(buildDir, lib, "ebin")
144
+ if (existsSync(ebinPath)) {
145
+ ebinDirs.push(ebinPath)
146
+ }
147
+ }
148
+ } catch (e) {
149
+ console.error("Failed to enumerate ebin directories:", e.message)
150
+ }
151
+
152
+ // Build -pa arguments for each ebin directory
153
+ const paArgs = ebinDirs.flatMap(dir => ["-pa", dir])
154
+
155
+ this._shell = spawn(
156
+ "erl",
157
+ [
158
+ "+A", "4", // Async threads for WAMR linked-in driver (see hb_beamr.erl)
159
+ ...paArgs,
160
+ "-sname", `hb_${this.port}`, // Unique node name to allow multiple instances
161
+ "-eval", evalCmd,
162
+ ],
163
+ { env, cwd }
164
+ )
165
+ }
166
+
167
+ if (this.logs) {
168
+ this._shell.stdout.on("data", chunk => console.log(chunk.toString()))
169
+ this._shell.stderr.on("data", err => console.error(err.toString()))
170
+ this._shell.on("error", err =>
171
+ console.error(`failed to start process: ${err}`)
172
+ )
173
+ this._shell.on("close", code => {
174
+ console.log(`child process exited with code ${code}`)
175
+ delete this._shell
176
+ })
177
+ }
178
+ }
179
+ file(path, type = "utf8") {
180
+ return readFileSync(resolve(this.dirname, path), type)
181
+ }
182
+ eunit(module, test) {
183
+ return new Promise(res => {
184
+ let isTest = !isNil(test)
185
+ if (Array.isArray(module)) {
186
+ for (const v of module) {
187
+ if (Array.isArray(v) || /:/.test(v)) {
188
+ isTest = true
189
+ break
190
+ }
191
+ }
192
+ }
193
+ const _as = this.as.length === 0 ? [] : ["as", this.as.join(",")]
194
+ const _test = Array.isArray(test) ? test.join("+") : test
195
+ let _module = ""
196
+
197
+ if (Array.isArray(module)) {
198
+ for (const v of module) {
199
+ _module += _module === "" ? "" : ","
200
+ if (Array.isArray(v)) _module += `${v[0]}:${v[1].join("+")}`
201
+ else _module += v
202
+ }
203
+ } else {
204
+ _module = test ? `${module}:${_test}` : module
205
+ }
206
+
207
+ const _arg = isTest ? "--test" : "--module"
208
+ let params = [..._as, "eunit", _arg, _module]
209
+ const _eunit = spawn("rebar3", params, {
210
+ env: this.genEnv(),
211
+ cwd: resolve(process.cwd(), this.cwd),
212
+ })
213
+ if (this.logs) {
214
+ _eunit.stdout.on("data", chunk => console.log(chunk.toString()))
215
+ _eunit.stderr.on("data", err => console.error(err.toString()))
216
+ _eunit.on("error", err =>
217
+ console.error(`failed to start process: ${err}`)
218
+ )
219
+ _eunit.on("close", code => {
220
+ console.log(`child process exited with code ${code}`)
221
+ res()
222
+ })
223
+ }
224
+ })
225
+ }
226
+ async ok() {
227
+ try {
228
+ const address = await fetch(`${this.url}/~meta@1.0/info/address`).then(
229
+ r => r.text()
230
+ )
231
+ if (address) {
232
+ if (this.logs) console.log("HyperBEAM ok(): initializing HB...")
233
+ this.hb = await new HB({ url: this.url }).init(this.jwk)
234
+ this._info = { address }
235
+ if (this.logs) console.log("HyperBEAM ok(): SUCCESS!")
236
+ return true
237
+ } else return false
238
+ } catch (e) {
239
+ if (this.logs) console.error("HyperBEAM ok() error:", e.message)
240
+ return false
241
+ }
242
+ }
243
+ async ready(timeout = 60000) {
244
+ // Start CU server if genesis_wasm is enabled
245
+ if (this.genesis_wasm) {
246
+ await this.startCU()
247
+ }
248
+
249
+ const start = Date.now()
250
+ while (Date.now() - start < timeout) {
251
+ try {
252
+ if (await this.ok()) {
253
+ return this
254
+ }
255
+ } catch (e) {
256
+ // Ignore errors, will retry
257
+ }
258
+ // Wait 1 second before next attempt
259
+ await new Promise(r => setTimeout(r, 1000))
260
+ }
261
+ return false
262
+ }
263
+
264
+ // Start the genesis-wasm CU server
265
+ async startCU() {
266
+ const cuDir = resolve(this.dirname, "genesis-wasm-server")
267
+ const dbDir = resolve(this.dirname, "cache-mainnet/genesis-wasm")
268
+
269
+ // Ensure DB directory exists
270
+ spawnSync("mkdir", ["-p", dbDir])
271
+
272
+ // Kill any stale CU process listening on cu_port before spawning a new
273
+ // one. Sequential test runs in the same OS share port 6363; if a prior
274
+ // run's CU lingered (e.g. detached but its parent died before SIGKILL
275
+ // could propagate), the new CU's bind silently fails and HB ends up
276
+ // talking to the stale CU, which has a different process registry and
277
+ // throws confusing 500/400s on the next spawn/schedule.
278
+ try {
279
+ spawnSync("bash", ["-c", `lsof -ti:${this.cu_port} | xargs -r kill -9 2>/dev/null`], { stdio: "ignore" })
280
+ } catch (_e) {}
281
+ // Brief settle so the OS can release the port.
282
+ await new Promise(r => setTimeout(r, 200))
283
+
284
+ // Use arweave_gateway option or ARWEAVE_GATEWAY env var for proxy environments
285
+ const gatewayUrl = this.arweave_gateway || process.env.GATEWAY_URL || "https://arweave.net"
286
+ const graphqlUrl = process.env.GRAPHQL_URL || `${gatewayUrl}/graphql`
287
+
288
+ // CU needs proxy for external services (arweave.net) but not for localhost
289
+ // Keep all env vars but ensure NO_PROXY is set for localhost connections
290
+ const noProxy = 'localhost,127.0.0.1,::1'
291
+ const env = {
292
+ ...process.env,
293
+ // Ensure NO_PROXY includes localhost for Node.js fetch and global-agent
294
+ NO_PROXY: noProxy,
295
+ no_proxy: noProxy,
296
+ GLOBAL_AGENT_NO_PROXY: noProxy,
297
+ UNIT_MODE: "hbu",
298
+ HB_URL: `http://localhost:${this.port}`,
299
+ NODE_CONFIG_ENV: "development",
300
+ DB_URL: resolve(dbDir, "genesis-wasm-db"),
301
+ PORT: String(this.cu_port),
302
+ WALLET_FILE: this.wallet_location,
303
+ DISABLE_PROCESS_FILE_CHECKPOINT_CREATION: "false",
304
+ PROCESS_MEMORY_FILE_CHECKPOINTS_DIR: resolve(dbDir, "checkpoints"),
305
+ GATEWAY_URL: gatewayUrl,
306
+ ARWEAVE_URL: gatewayUrl,
307
+ GRAPHQL_URL: graphqlUrl,
308
+ GRAPHQL_URLS: graphqlUrl,
309
+ CHECKPOINT_GRAPHQL_URL: graphqlUrl,
310
+ }
311
+
312
+ // Node 26 enables wasm-memory64 by default and rejects the experimental
313
+ // flag; older Node versions still need it. Detect from process.versions.
314
+ const nodeMajor = parseInt((process.versions.node || "0").split(".")[0], 10)
315
+ const memory64Flag = nodeMajor >= 24 ? [] : ["--experimental-wasm-memory64"]
316
+ this.cuProc = spawn("node", [...memory64Flag, "-r", "dotenv/config", "src/app.js"], {
317
+ cwd: cuDir,
318
+ env,
319
+ detached: true,
320
+ stdio: this.logs ? ["ignore", "pipe", "pipe"] : "ignore"
321
+ })
322
+
323
+ this.cuProc.unref()
324
+
325
+ if (this.logs) {
326
+ console.log(`CU server starting on port ${this.cu_port}...`)
327
+ if (this.cuProc.stdout) {
328
+ this.cuProc.stdout.on("data", chunk => console.log(`[CU] ${chunk.toString().trim()}`))
329
+ }
330
+ if (this.cuProc.stderr) {
331
+ this.cuProc.stderr.on("data", chunk => console.error(`[CU] ${chunk.toString().trim()}`))
332
+ }
333
+ }
334
+
335
+ // Wait for CU to be ready - check / endpoint instead of /status
336
+ const start = Date.now()
337
+ while (Date.now() - start < 30000) {
338
+ try {
339
+ const res = await fetch(`http://localhost:${this.cu_port}/`)
340
+ if (res.ok || res.status === 404) {
341
+ // Any response (including 404) means server is up
342
+ if (this.logs) console.log("CU server ready")
343
+ return true
344
+ }
345
+ } catch (e) {
346
+ // Not ready yet
347
+ }
348
+ await new Promise(r => setTimeout(r, 500))
349
+ }
350
+ if (this.logs) console.log("CU server startup timeout, continuing anyway...")
351
+ return true // Continue anyway, the CU process is running
352
+ }
353
+ genEnv() {
354
+ // Start with process.env but filter out proxy settings
355
+ // HyperBEAM uses arweave_gateway config for external access, not proxy
356
+ // This avoids httpc proxy issues with localhost CU connections
357
+ const proxyKeys = ['HTTPS_PROXY', 'HTTP_PROXY', 'https_proxy', 'http_proxy', 'ALL_PROXY', 'all_proxy']
358
+ let _env = Object.fromEntries(
359
+ Object.entries(process.env).filter(([key]) => !proxyKeys.includes(key))
360
+ )
361
+ if (this.diagnostic) _env.DIAGNOSTIC = this.diagnostic
362
+ if (this.c) {
363
+ _env.CC = `gcc-${this.c}`
364
+ _env.CXX = `g++-${this.c}`
365
+ }
366
+ if (this.cmake) _env.CMAKE_POLICY_VERSION_MINIMUM = this.cmake
367
+ // Ensure enough async threads for WAMR linked-in driver + HTTP client
368
+ // See hb_beamr.erl: "configure BEAM to have enough async worker threads (see erl +A N)"
369
+ const asyncThreads = "+A 4"
370
+ if (!_env.ERL_ZFLAGS) _env.ERL_ZFLAGS = asyncThreads
371
+ else if (!_env.ERL_ZFLAGS.includes("+A")) _env.ERL_ZFLAGS += ` ${asyncThreads}`
372
+ // Skip the hb application's default-port HTTP server start (8734). We call
373
+ // hb_http_server:start_node/1 explicitly with the actual port via genEval,
374
+ // so the default binding is redundant; skipping it avoids eaddrinuse and
375
+ // the downstream case_clause crashes when multiple HyperBEAM instances
376
+ // run side-by-side (p4.test.js, p4-lua.test.js).
377
+ _env.WAO_NO_DEFAULT_HTTP_SERVER = "1"
378
+ return _env
379
+ }
380
+
381
+ genEval({ gateway, wallet = ".wallet.json" }) {
382
+ let _devices = ""
383
+ let _devs = []
384
+ if (this.devices) {
385
+ for (const v of this.devices) {
386
+ if (typeof v === "object") {
387
+ _devs.push(
388
+ `#{<<"name">> => <<"${v.name}">>, <<"module">> => ${v.module}}`
389
+ )
390
+ } else if (devs[v])
391
+ _devs.push(
392
+ `#{<<"name">> => <<"${devs[v].name}">>, <<"module">> => ${devs[v].module}}`
393
+ )
394
+ }
395
+ }
396
+ if (_devs.length > 0) {
397
+ _devices = `, <<"preloaded-devices">> => [${_devs.join(", ")}]`
398
+ }
399
+ const _wallet = `, <<"priv-key-location">> => <<"${wallet}">>`
400
+ // Use arweave_gateway (Cloudflare proxy) if set, otherwise local gateway port, otherwise default
401
+ const _gateway = this.arweave_gateway
402
+ ? `, <<"gateway">> => <<"${this.arweave_gateway}">>`
403
+ : gateway
404
+ ? `, <<"gateway">> => <<"http://localhost:${gateway}">>`
405
+ : ""
406
+
407
+ // Store config: use single hb_store_fs matching HyperBEAM eunit test pattern.
408
+ // Multi-store with hb_store_gateway wrappers caused snapshot discovery failures
409
+ // because list_numbered/resolve interactions across stores break symlink following.
410
+ // The wao@1.0 device handles Arweave TX resolution independently via HTTP.
411
+ const _store = this.store_prefix
412
+ ? `, <<"store">> => #{ <<"store-module">> => hb_store_fs, <<"name">> => <<"${this.store_prefix}">> }`
413
+ : ""
414
+ let _bundler = this.bundler
415
+ ? `, <<"bundler-httpsig">> => <<"${this.bundler}">>`
416
+ : ""
417
+ // Only include bundler_ans104 if it's a truthy value (port number or URL)
418
+ // When false or omitted, don't include it - Erlang code expects either no option or a valid URL
419
+ let _bundler_ans104 = this.bundler_ans104 && this.bundler_ans104 !== false
420
+ ? `, <<"bundler-ans104">> => <<"http://localhost:${this.bundler_ans104}">>`
421
+ : ""
422
+ /*
423
+ const _routes = `, routes => [#{ <<"template">> => <<"/result/.*">>, <<"node">> => #{ <<"prefix">> => <<"http://localhost:${this.cu}">> } }, #{ <<\"template\">> => <<\"/dry-run\">>, <<\"node\">> => #{ <<\"prefix\">> => <<\"http://localhost:${this.cu}\">> } }, #{ <<"template">> => <<"/graphql">>, <<"nodes">> => [#{ <<"prefix">> => <<"http://localhost:${gateway}">>, <<"opts">> => #{ http_client => httpc, protocol => http2 } }, #{ <<"prefix">> => <<"http://localhost:${gateway}">>, <<"opts">> => #{ http_client => gun, protocol => http2 } }] }, #{ <<"template">> => <<"/raw">>, <<"node">> => #{ <<"prefix">> => <<"http://localhost:${gateway}">>, <<"opts">> => #{ http_client => gun, protocol => http2 } } }]`
424
+ */
425
+ const _p4_non_chargable = this.p4_non_chargable
426
+ ? `, <<"p4-non-chargable-routes">> => [${this.p4_non_chargable_routes
427
+ .map(() => `#{ <<"template">> => <<"/*~node-process@1.0/*">> }`)
428
+ .join(", ")}]`
429
+ : this.p4_lua
430
+ ? `, <<"p4-non-chargable-routes">> => [#{ <<"template">> => <<"/*~node-process@1.0/*">> }, #{ <<"template">> => <<"/~wao@1.0/*">> }, #{ <<"template">> => <<"/~p4@1.0/balance">> }, #{ <<"template">> => <<"/~meta@1.0/*">> }]`
431
+ : !this.simple_pay
432
+ ? ""
433
+ : `, <<"p4-non-chargable-routes">> => [#{ <<"template">> => <<"/~simple-pay@1.0/topup">> }, #{ <<"template">> => <<"/~meta@1.0/*">> }, #{ <<"template">> => <<"/~simple-pay@1.0/balance">> }]`
434
+
435
+ const _operator = this.operator
436
+ ? `, <<"operator">> => <<"${this.operator}">>`
437
+ : ""
438
+ const _spp = this.spp ? `, <<"simple-pay-price">> => ${this.spp}` : ""
439
+ const _genesis_wasm_port = this.genesis_wasm ? `, <<"genesis-wasm-port">> => ${this.cu_port}` : ""
440
+ const _force_signed = this.force_signed ? `, <<"force-signed-requests">> => true, <<"force-signed">> => true` : ""
441
+
442
+ // Helper to format module(s) for Erlang - supports ID string, inline object, or array
443
+ const formatModule = (mod) => {
444
+ if (typeof mod === "string") {
445
+ // ID string
446
+ return `<<"${mod}">>`
447
+ } else if (Array.isArray(mod)) {
448
+ // Array of inline modules
449
+ return `[${mod.map(m => `#{ <<"content-type">> => <<"text/x-lua">>, <<"body">> => <<"${escapeErlangString(m.body)}">>${m.name ? `, <<"name">> => <<"${m.name}">>` : ""} }`).join(", ")}]`
450
+ } else if (mod && mod.body) {
451
+ // Single inline module object
452
+ return `#{ <<"content-type">> => <<"text/x-lua">>, <<"body">> => <<"${escapeErlangString(mod.body)}">>${mod.name ? `, <<"name">> => <<"${mod.name}">>` : ""} }`
453
+ }
454
+ return `<<"${mod}">>`
455
+ }
456
+
457
+ // Helper to escape special characters for Erlang binary strings
458
+ const escapeErlangString = (str) => {
459
+ if (!str) return str
460
+ return str.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t")
461
+ }
462
+
463
+ const _node_processes = this.p4_lua
464
+ ? `, <<"node-processes">> => #{ <<"ledger">> => #{ <<"device">> => <<"process@1.0">>, <<"execution-device">> => <<"lua@5.3a">>, <<"scheduler-device">> => <<"scheduler@1.0">>, <<"module">> => ${formatModule(this.p4_lua.processor)}, <<"operator">> => <<"${this.operator}">>${this.p4_lua.admin ? `, <<"admin">> => <<"${this.p4_lua.admin}">>` : ""}${this.p4_lua.balance ? `, <<"balance">> => #{ ${Object.entries(this.p4_lua.balance).map(([k, v]) => `<<"${k}">> => ${v}`).join(", ")} }` : ""} } }`
465
+ : ""
466
+ const processor = this.p4_lua
467
+ ? `#{ <<"device">> => <<"p4@1.0">>, <<"pricing-device">> => <<"simple-pay@1.0">>, <<"ledger-device">> => <<"lua@5.3a">>, <<"module">> => ${formatModule(this.p4_lua.client)}, <<"ledger-path">> => <<"/ledger~node-process@1.0">> }`
468
+ : ""
469
+ const _port = `<<"port">> => ${this.port}`
470
+ const _faff = isNil(this.faff)
471
+ ? ""
472
+ : `, <<"faff-allow-list">> => [ ${map(addr => `<<"${addr}">>`)(this.faff).join(", ")} ]`
473
+
474
+ const _on = this.p4_lua
475
+ ? `, <<"on">> => #{ <<"request">> => ${processor}, <<"response">> => ${processor} }`
476
+ : this.simple_pay
477
+ ? `, <<"on">> => #{ <<"request">> => #{ <<"device">> => <<"p4@1.0">>, <<"pricing-device">> => <<"simple-pay@1.0">>, <<"ledger-device">> => <<"simple-pay@1.0">> }, <<"response">> => #{ <<"device">> => <<"p4@1.0">>, <<"pricing-device">> => <<"simple-pay@1.0">>, <<"ledger-device">> => <<"simple-pay@1.0">> } }`
478
+ : !isNil(this.faff)
479
+ ? `, <<"on">> => #{ <<"request">> => #{ <<"device">> => <<"p4@1.0">>, <<"pricing-device">> => <<"faff@1.0">>, <<"ledger-device">> => <<"faff@1.0">> }, <<"response">> => #{ <<"device">> => <<"p4@1.0">>, <<"pricing-device">> => <<"faff@1.0">>, <<"ledger-device">> => <<"faff@1.0">> } }`
480
+ : ""
481
+ // Add cache_writers to allow the wallet to write to cache (needed for WASM module uploads)
482
+ // Use the wallet address (this.addr) which is always available from the wallet file
483
+ const _cache_writers = `, <<"cache-writers">> => [<<"${this.addr}">>]`
484
+
485
+ // Use gun HTTP client for relay calls instead of httpc
486
+ // gun doesn't use system proxy settings, avoiding the proxy issue with localhost CU
487
+ const _relay_http_client = `, <<"relay-http-client">> => gun, <<"http-client">> => gun`
488
+
489
+ // Custom routes using Cloudflare proxy instead of arweave.net
490
+ // Also add CU routes for genesis_wasm when enabled
491
+ const cuRoutes = this.genesis_wasm
492
+ ? `#{ <<"template">> => <<"/result/*">>, <<"node">> => #{ <<"prefix">> => <<"http://localhost:${this.cu_port}">> } },
493
+ #{ <<"template">> => <<"/snapshot/*">>, <<"node">> => #{ <<"prefix">> => <<"http://localhost:${this.cu_port}">> } },
494
+ #{ <<"template">> => <<"/dry-run">>, <<"node">> => #{ <<"prefix">> => <<"http://localhost:${this.cu_port}">> } },`
495
+ : ""
496
+ const _routes = this.arweave_gateway || this.genesis_wasm
497
+ ? `, <<"routes">> => [
498
+ ${cuRoutes}
499
+ #{ <<"template">> => <<"/graphql">>, <<"nodes">> => [
500
+ #{ <<"prefix">> => <<"${this.arweave_gateway || 'https://arweave.net'}">>, <<"opts">> => #{ http_client => gun, protocol => http2 } }
501
+ ]},
502
+ #{ <<"template">> => <<"/arweave">>, <<"node">> => #{
503
+ <<"match">> => <<"^/arweave">>,
504
+ <<"with">> => <<"${this.arweave_gateway || 'https://arweave.net'}">>,
505
+ <<"opts">> => #{ http_client => gun, protocol => http2 }
506
+ }},
507
+ #{ <<"template">> => <<"/raw">>, <<"node">> => #{
508
+ <<"prefix">> => <<"${this.arweave_gateway || 'https://arweave.net'}">>,
509
+ <<"opts">> => #{ http_client => gun, protocol => http2 }
510
+ }}
511
+ ]`
512
+ : ""
513
+
514
+ // Explicitly clear httpc proxy settings at Erlang level before starting HyperBEAM
515
+ // This ensures no proxy is used regardless of any OS-level or cached settings
516
+ const clearProxy = `application:ensure_all_started(inets), httpc:set_options([{proxy, {undefined, []}}, {ipfamily, inet}]), `
517
+
518
+ // Force-load dev_hbsig early so its codec functions are available
519
+ // before any device-stack processing occurs
520
+ const loadHbsig = `code:ensure_loaded(dev_hbsig), `
521
+
522
+ // Pre-register device name atoms so hb_util:atom/1 (which uses list_to_existing_atom)
523
+ // doesn't crash with badarg when resolving device names from HTTP headers/binaries
524
+ const preRegisterAtoms = `lists:foreach(fun list_to_atom/1, ["wao@1.0", "hbsig@1.0", "stack@1.0", "patch@1.0", "inc@1.0", "double@1.0", "add@1.0", "mul@1.0", "inc2@1.0", "square@1.0", "mydev@1.0", "lua@5.3a", "process@1.0", "scheduler@1.0", "message@1.0", "meta@1.0", "cache@1.0", "json@1.0", "structured@1.0", "httpsig@1.0", "flat@1.0", "genesis-wasm@1.0", "compute@1.0", "delegated-compute@1.0", "relay@1.0", "router@1.0", "cron@1.0", "node-process@1.0", "p4@1.0", "simple-pay@1.0", "faff@1.0", "ans104@1.0", "test-device@1.0", "lookup@1.0", "local-name@1.0", "upload@1.0", "hook@1.0", "auth-hook@1.0", "http-auth@1.0", "greenzone@1.0", "apply@1.0", "dedup@1.0", "cookie@1.0", "push@1.0", "query@1.0", "manifest@1.0", "name@1.0", "profile@1.0", "monitor@1.0", "multipass@1.0", "poda@1.0", "snp@1.0", "trie@1.0", "volume@1.0", "secret@1.0", "wasi@1.0", "wasm-64@1.0", "whois@1.0", "cacheviz@1.0", "hyperbuddy@1.0", "copycat@1.0", "json-iface@1.0", "arweave@2.9", "b32-name@1.0", "blacklist@1.0", "bundler@1.0", "gzip@1.0", "location@1.0", "metering@1.0", "rate-limit@1.0", "tx@1.0"]), `
525
+
526
+ // Pre-create prometheus ETS tables owned by the shell process.
527
+ // dev_hbsig on_load also does this, but the module loads lazily so this
528
+ // covers the gap between rebar3 boot and module loading.
529
+ const initPrometheus = `lists:foreach(fun({N,{T,C}}) -> case ets:info(N) of undefined -> ets:new(N,[T,named_table,public,{C,true}]); _ -> ok end; ({N,C}) -> case ets:info(N) of undefined -> ets:new(N,[set,named_table,public,{C,true}]); _ -> ok end end, [{prometheus_registry_table,{bag,read_concurrency}},{prometheus_counter_table,write_concurrency},{prometheus_gauge_table,write_concurrency},{prometheus_summary_table,write_concurrency},{prometheus_quantile_summary_table,write_concurrency},{prometheus_histogram_table,write_concurrency},{prometheus_boolean_table,write_concurrency}]), `
530
+
531
+ // When running multiple HyperBEAM instances, rebar3 shell auto-starts the
532
+ // hb app which binds port 8734 (default). The second instance fails to start
533
+ // the hb app because port 8734 is already in use. This leaves hb_sup,
534
+ // dev_scheduler_registry, and ar_timestamp uninitialized. We idempotently
535
+ // ensure they are running before calling start_mainnet.
536
+ const ensureInit = `(fun() -> try hb:init() catch _:_ -> ok end, case whereis(hb_sup) of undefined -> catch hb_sup:start_link(); _ -> ok end, catch dev_scheduler_registry:start(), catch ar_timestamp:start() end)(), `
537
+
538
+ // The HTTPSig codec transforms 'authority' to '@authority' in signature params but
539
+ // not in component lines, causing internal message verification to fail (RFC 9421).
540
+ // This affects both node_processes definitions (which include 'authority' via
541
+ // augment_definition) and push device re-scheduling (which signs outbox messages
542
+ // with httpsig). Disable verification until upstream fixes the codec.
543
+ const _verify_assignments = (this.p4_lua || this.genesis_wasm) ? `, <<"verify-assignments">> => false` : ""
544
+
545
+ // Use hb_http_server:start_node directly instead of hb:start_mainnet.
546
+ // start_mainnet always overwrites the store config with a single hb_store_fs,
547
+ // which prevents hb_store_gateway from resolving Arweave TX IDs.
548
+ // start_node preserves user-provided store via set_default_opts.
549
+ const _priv_wallet = `, <<"priv-wallet">> => hb:wallet(<<"${wallet}">>)`
550
+ // cache_control => <<"always">> ensures compute results/snapshots are cached.
551
+ // process_snapshot_slots => 1 takes a snapshot every slot (not just every 60s).
552
+ // process_async_cache => false writes snapshots synchronously before returning
553
+ // the HTTP response, preventing race conditions where the next compute call
554
+ // arrives before the snapshot is written.
555
+ // Without these, hb_cache:write strips uncommitted keys (like device-stack)
556
+ // from the cached process state, and subsequent computes fail with
557
+ // {error, no_valid_device_stack} when loading from the corrupted cache.
558
+ const _cache_control = `, <<"cache-control">> => <<"always">>, <<"process-snapshot-slots">> => 1, <<"process-async-cache">> => false`
559
+
560
+ const _linkify =
561
+ this.linkify_mode === undefined
562
+ ? ""
563
+ : `, <<"linkify-mode">> => ${this.linkify_mode === false ? "false" : (this.linkify_mode === true ? "true" : this.linkify_mode)}`
564
+ const start = `${clearProxy}${initPrometheus}${preRegisterAtoms}${loadHbsig}${ensureInit}hb_http_server:start_node(#{ ${_port}${_gateway}${_priv_wallet}${_faff}${_bundler}${_bundler_ans104}${_on}${_p4_non_chargable}${_operator}${_spp}${_genesis_wasm_port}${_force_signed}${_devices}${_node_processes}${_cache_writers}${_relay_http_client}${_routes}${_store}${_verify_assignments}${_cache_control}, <<"prometheus">> => false${_linkify}}).`
565
+
566
+ return start
567
+ }
568
+
569
+ kill() {
570
+ // Kill CU server if we started it
571
+ if (this.cuProc && this.cuProc.pid) {
572
+ try {
573
+ process.kill(-this.cuProc.pid, "SIGKILL")
574
+ } catch (e) {
575
+ // Process may already be dead
576
+ }
577
+ }
578
+ // Kill main HyperBEAM shell process
579
+ if (this._shell) {
580
+ this._shell.kill("SIGKILL")
581
+ }
582
+ // Also kill any remaining beam.smp processes on our port
583
+ spawnSync("pkill", ["-9", "-f", `beam.smp.*${this.port}`], { stdio: "ignore" })
584
+ }
585
+ }
package/src/index.js ADDED
@@ -0,0 +1,5 @@
1
+ import AR from "./ar.js"
2
+ import AO from "./ao.js"
3
+ import HB from "./hb.js"
4
+ import GQL from "./gql.js"
5
+ export { AO, AR, HB, GQL }
package/src/keygen.js ADDED
@@ -0,0 +1,47 @@
1
+ import _Arweave from "arweave"
2
+ const Arweave = _Arweave.default ?? _Arweave
3
+ import { toAddr } from "./utils.js"
4
+ import { mkdirSync, writeFileSync, existsSync, readdirSync } from "fs"
5
+ import { fileURLToPath } from "url"
6
+ import { dirname, resolve } from "path"
7
+
8
+ const __filename = fileURLToPath(import.meta.url)
9
+ const __dirname = dirname(__filename)
10
+ const walletsDir = resolve(__dirname, "../devnet/.wallets")
11
+ const names = ["su", "cu", "mu", "acc0", "acc1", "acc2"]
12
+
13
+ async function main() {
14
+ const force = process.argv.includes("--force")
15
+
16
+ if (!force && existsSync(walletsDir)) {
17
+ const files = readdirSync(walletsDir).filter(f => f.endsWith(".json"))
18
+ if (files.length > 0) {
19
+ console.log("Wallets already exist in", walletsDir)
20
+ console.log("Use --force to regenerate")
21
+ return
22
+ }
23
+ }
24
+
25
+ mkdirSync(walletsDir, { recursive: true })
26
+
27
+ const arweave = Arweave.init({})
28
+
29
+ console.log("Generating wallets...\n")
30
+
31
+ for (const name of names) {
32
+ const jwk = await arweave.wallets.generate()
33
+ const addr = toAddr(jwk.n)
34
+ writeFileSync(
35
+ resolve(walletsDir, `${name}.json`),
36
+ JSON.stringify(jwk, null, 2),
37
+ )
38
+ console.log(` ${name.padEnd(5)} ${addr}`)
39
+ }
40
+
41
+ console.log(`\nWallets written to ${walletsDir}`)
42
+ }
43
+
44
+ main().catch(err => {
45
+ console.error(err)
46
+ process.exit(1)
47
+ })