@openclaw/nostr 2026.10.10-beta.5 → 2026.11.5-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/dist/.setup/{channel-B0EC4IOq.mjs → channel-DtlupG0V.mjs} +195 -379
  2. package/dist/.setup/{channel.setup-B2tWt-Ro.mjs → channel.setup-DeVyQy6t.mjs} +4 -6
  3. package/dist/.setup/{secret-contract-api-nVWula4c.mjs → secret-contract-api-DhkjtAQ4.mjs} +1 -2
  4. package/dist/.setup/{secret-contract-api-sFIFEwqO.mjs → secret-contract-api-KACe-wY3.mjs} +1 -1
  5. package/dist/.setup/{setup-adapter-DTqb2Hne.mjs → setup-adapter-CCRkU3LC.mjs} +4 -8
  6. package/dist/.setup/setup-plugin-api-Cc2r8u0U.mjs +2 -0
  7. package/dist/.setup/{setup-surface-CadI9603.mjs → setup-surface-fC0kex9d.mjs} +5 -9
  8. package/dist/.source-module-urls/434fb4e7afdaac23908221824ec325d8f61be72ba97af41567f2cb4ebe3ad38c.json +1 -1
  9. package/dist/api.js +24 -38
  10. package/dist/channel-plugin-api.js +1 -1
  11. package/dist/control-ui/049680efcde098838c4459d157e51b99515dceb24211e236f157fca0abbdb516/chunk-1.js +1 -0
  12. package/dist/control-ui/049680efcde098838c4459d157e51b99515dceb24211e236f157fca0abbdb516/index.js +1 -0
  13. package/dist/doctor-contract-api.js +1 -2
  14. package/dist/index.js +1 -2
  15. package/dist/openclaw.plugin.json +40 -0
  16. package/dist/secret-contract-api.js +1 -1
  17. package/dist/setup-api.js +1 -1
  18. package/dist/setup-entry.js +3 -4
  19. package/dist/setup-plugin-api.js +1 -1
  20. package/node_modules/@solidjs/web/README.md +25 -0
  21. package/node_modules/@solidjs/web/dist/server.dev.js +5070 -0
  22. package/node_modules/@solidjs/web/dist/server.js +4722 -0
  23. package/node_modules/@solidjs/web/dist/server.observe.js +4877 -0
  24. package/node_modules/@solidjs/web/dist/web.dev.js +2516 -0
  25. package/node_modules/@solidjs/web/dist/web.js +2204 -0
  26. package/node_modules/@solidjs/web/dist/web.observe.js +2255 -0
  27. package/node_modules/@solidjs/web/frames/dist/assets.js +92 -0
  28. package/node_modules/@solidjs/web/frames/dist/client.dev.js +2108 -0
  29. package/node_modules/@solidjs/web/frames/dist/client.js +1927 -0
  30. package/node_modules/@solidjs/web/frames/dist/client.observe.js +2041 -0
  31. package/node_modules/@solidjs/web/frames/dist/regions.js +171 -0
  32. package/node_modules/@solidjs/web/frames/dist/server.dev.js +2549 -0
  33. package/node_modules/@solidjs/web/frames/dist/server.js +2547 -0
  34. package/node_modules/@solidjs/web/frames/dist/server.observe.js +2548 -0
  35. package/node_modules/@solidjs/web/frames/dist/trace.js +45 -0
  36. package/node_modules/@solidjs/web/frames/dist/wire.js +594 -0
  37. package/node_modules/@solidjs/web/frames/package.json +7 -0
  38. package/node_modules/@solidjs/web/node_modules/seroval/LICENSE +7 -0
  39. package/node_modules/@solidjs/web/node_modules/seroval/README.md +117 -0
  40. package/node_modules/@solidjs/web/node_modules/seroval/dist/dev/index.cjs +3716 -0
  41. package/node_modules/@solidjs/web/node_modules/seroval/dist/dev/index.d.cts +820 -0
  42. package/node_modules/@solidjs/web/node_modules/seroval/dist/dev/index.d.ts +820 -0
  43. package/node_modules/@solidjs/web/node_modules/seroval/dist/dev/index.js +3669 -0
  44. package/node_modules/@solidjs/web/node_modules/seroval/dist/index.cjs +3700 -0
  45. package/node_modules/@solidjs/web/node_modules/seroval/dist/index.d.cts +820 -0
  46. package/node_modules/@solidjs/web/node_modules/seroval/dist/index.d.ts +820 -0
  47. package/node_modules/@solidjs/web/node_modules/seroval/dist/index.js +3653 -0
  48. package/node_modules/@solidjs/web/node_modules/seroval/package.json +77 -0
  49. package/node_modules/@solidjs/web/node_modules/seroval-plugins/LICENSE +7 -0
  50. package/node_modules/@solidjs/web/node_modules/seroval-plugins/README.md +50 -0
  51. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/index-BG4YWylA.d.cts +101 -0
  52. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/index.cjs +8 -0
  53. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/index.d.cts +2 -0
  54. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/index.d.ts +2 -0
  55. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/index.js +2 -0
  56. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/web-B1lHT9kZ.cjs +812 -0
  57. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/web.cjs +16 -0
  58. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/web.d.cts +2 -0
  59. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/web.d.ts +97 -0
  60. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/web.js +693 -0
  61. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/index-BG4YWylA.d.cts +101 -0
  62. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/index.cjs +8 -0
  63. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/index.d.cts +2 -0
  64. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/index.d.ts +2 -0
  65. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/index.js +2 -0
  66. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/web-B1lHT9kZ.cjs +812 -0
  67. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/web.cjs +16 -0
  68. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/web.d.cts +2 -0
  69. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/web.d.ts +97 -0
  70. package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/web.js +693 -0
  71. package/node_modules/@solidjs/web/node_modules/seroval-plugins/package.json +81 -0
  72. package/node_modules/@solidjs/web/package.json +396 -0
  73. package/node_modules/@solidjs/web/performance-tracks/dist/performance-tracks.dev.js +679 -0
  74. package/node_modules/@solidjs/web/performance-tracks/dist/performance-tracks.js +6 -0
  75. package/node_modules/@solidjs/web/performance-tracks/dist/performance-tracks.observe.js +667 -0
  76. package/node_modules/@solidjs/web/performance-tracks/package.json +7 -0
  77. package/node_modules/@solidjs/web/performance-tracks/types/index.d.ts +69 -0
  78. package/node_modules/@solidjs/web/serialization/decode/package.json +7 -0
  79. package/node_modules/@solidjs/web/serialization/dist/decode.js +229 -0
  80. package/node_modules/@solidjs/web/serialization/dist/serialization.js +398 -0
  81. package/node_modules/@solidjs/web/serialization/package.json +7 -0
  82. package/node_modules/@solidjs/web/serialization/types/index.d.ts +109 -0
  83. package/node_modules/@solidjs/web/serialization/types/serializer-decode.d.ts +241 -0
  84. package/node_modules/@solidjs/web/server-functions/dist/client.dev.js +1462 -0
  85. package/node_modules/@solidjs/web/server-functions/dist/client.js +1305 -0
  86. package/node_modules/@solidjs/web/server-functions/dist/client.observe.js +1441 -0
  87. package/node_modules/@solidjs/web/server-functions/dist/rich-args.js +92 -0
  88. package/node_modules/@solidjs/web/server-functions/dist/server.dev.js +3619 -0
  89. package/node_modules/@solidjs/web/server-functions/dist/server.js +3526 -0
  90. package/node_modules/@solidjs/web/server-functions/dist/server.observe.js +3589 -0
  91. package/node_modules/@solidjs/web/server-functions/package.json +7 -0
  92. package/node_modules/@solidjs/web/server-functions/rich-args/package.json +7 -0
  93. package/node_modules/@solidjs/web/skills/server-components/SKILL.md +117 -0
  94. package/node_modules/@solidjs/web/storage/dist/storage.js +10 -0
  95. package/node_modules/@solidjs/web/storage/package.json +7 -0
  96. package/node_modules/@solidjs/web/storage/types/index.d.ts +28 -0
  97. package/node_modules/@solidjs/web/types/client.d.ts +391 -0
  98. package/node_modules/@solidjs/web/types/constants.d.ts +22 -0
  99. package/node_modules/@solidjs/web/types/cookies.d.ts +41 -0
  100. package/node_modules/@solidjs/web/types/diagnostics.d.ts +80 -0
  101. package/node_modules/@solidjs/web/types/frames/assets-tier.d.ts +78 -0
  102. package/node_modules/@solidjs/web/types/frames/client.d.ts +75 -0
  103. package/node_modules/@solidjs/web/types/frames/frame-client.d.ts +519 -0
  104. package/node_modules/@solidjs/web/types/frames/frame-container-plugin.d.ts +64 -0
  105. package/node_modules/@solidjs/web/types/frames/frame-morph.d.ts +29 -0
  106. package/node_modules/@solidjs/web/types/frames/frame-sink.d.ts +174 -0
  107. package/node_modules/@solidjs/web/types/frames/frame-transport.d.ts +301 -0
  108. package/node_modules/@solidjs/web/types/frames/regions-tier.d.ts +60 -0
  109. package/node_modules/@solidjs/web/types/frames/server.d.ts +52 -0
  110. package/node_modules/@solidjs/web/types/frames/trace-tier.d.ts +2 -0
  111. package/node_modules/@solidjs/web/types/frames/tree-rewrite.d.ts +39 -0
  112. package/node_modules/@solidjs/web/types/frames/wire-tier.d.ts +169 -0
  113. package/node_modules/@solidjs/web/types/head.d.ts +20 -0
  114. package/node_modules/@solidjs/web/types/index.d.ts +261 -0
  115. package/node_modules/@solidjs/web/types/index.server.d.ts +159 -0
  116. package/node_modules/@solidjs/web/types/jsx-properties.d.ts +93 -0
  117. package/node_modules/@solidjs/web/types/jsx.d.ts +4164 -0
  118. package/node_modules/@solidjs/web/types/observe.d.ts +535 -0
  119. package/node_modules/@solidjs/web/types/reconcile.d.ts +1 -0
  120. package/node_modules/@solidjs/web/types/render.d.ts +11 -0
  121. package/node_modules/@solidjs/web/types/request-error-hook.d.ts +5 -0
  122. package/node_modules/@solidjs/web/types/response.d.ts +122 -0
  123. package/node_modules/@solidjs/web/types/server-functions/argument-codec.d.ts +30 -0
  124. package/node_modules/@solidjs/web/types/server-functions/client.d.ts +277 -0
  125. package/node_modules/@solidjs/web/types/server-functions/flash.d.ts +36 -0
  126. package/node_modules/@solidjs/web/types/server-functions/registry.d.ts +105 -0
  127. package/node_modules/@solidjs/web/types/server-functions/rich-args.d.ts +1 -0
  128. package/node_modules/@solidjs/web/types/server-functions/server.d.ts +689 -0
  129. package/node_modules/@solidjs/web/types/server-functions/shared.d.ts +496 -0
  130. package/node_modules/@solidjs/web/types/server-functions/uploads.d.ts +50 -0
  131. package/node_modules/@solidjs/web/types/server-mock.d.ts +393 -0
  132. package/node_modules/@solidjs/web/types/server-observe.d.ts +86 -0
  133. package/node_modules/@solidjs/web/types/server.d.ts +693 -0
  134. package/node_modules/@solidjs/web/types/trace.d.ts +127 -0
  135. package/node_modules/solid-js/CHEATSHEET.md +750 -0
  136. package/node_modules/solid-js/README.md +77 -0
  137. package/node_modules/solid-js/diagnostics.json +605 -0
  138. package/node_modules/solid-js/dist/attribution.js +1 -0
  139. package/node_modules/solid-js/dist/container-trace.js +267 -0
  140. package/node_modules/solid-js/dist/internal.js +29 -0
  141. package/node_modules/solid-js/dist/refresh.dev.js +286 -0
  142. package/node_modules/solid-js/dist/refresh.js +35 -0
  143. package/node_modules/solid-js/dist/server.dev.js +3672 -0
  144. package/node_modules/solid-js/dist/server.js +3314 -0
  145. package/node_modules/solid-js/dist/server.observe.js +3500 -0
  146. package/node_modules/solid-js/dist/solid.dev.js +1740 -0
  147. package/node_modules/solid-js/dist/solid.js +1644 -0
  148. package/node_modules/solid-js/dist/solid.observe.js +1690 -0
  149. package/node_modules/solid-js/node_modules/@solidjs/signals/LICENSE +21 -0
  150. package/node_modules/solid-js/node_modules/@solidjs/signals/README.md +260 -0
  151. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/dev-shared.js +6136 -0
  152. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/dev.attribution.js +3481 -0
  153. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/dev.js +10245 -0
  154. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/affects-marks.js +86 -0
  155. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/affects.js +102 -0
  156. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/attribution.js +7 -0
  157. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/boundaries.js +622 -0
  158. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/action.js +174 -0
  159. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/async.js +792 -0
  160. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/attribution-costs.js +66 -0
  161. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/attribution-feedback.js +280 -0
  162. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/attribution-hooks.js +83 -0
  163. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/attribution-queries.js +43 -0
  164. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/attribution.js +3077 -0
  165. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/constants.js +241 -0
  166. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/context.js +63 -0
  167. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/core.js +1599 -0
  168. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/dev.js +394 -0
  169. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/effect.js +188 -0
  170. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/error-hooks.js +71 -0
  171. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/error.js +82 -0
  172. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/external.js +97 -0
  173. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/graph.js +162 -0
  174. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/heap.js +124 -0
  175. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/identities.js +62 -0
  176. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/invariants.js +12 -0
  177. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/lanes.js +752 -0
  178. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/owner.js +370 -0
  179. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/scheduler.js +1099 -0
  180. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/truth.js +45 -0
  181. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/verdict.js +408 -0
  182. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/deferred.js +187 -0
  183. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/flatten.js +79 -0
  184. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/from.js +248 -0
  185. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/index.js +69 -0
  186. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/map.js +589 -0
  187. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/reveal.js +212 -0
  188. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/signals.js +675 -0
  189. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/affects.js +142 -0
  190. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/edges.js +39 -0
  191. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/hooks.js +13 -0
  192. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/index.js +47 -0
  193. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/optimistic.js +617 -0
  194. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/projection.js +321 -0
  195. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/reconcile.js +275 -0
  196. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/store.js +2081 -0
  197. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/storePath.js +103 -0
  198. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/target.js +46 -0
  199. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/types.js +73 -0
  200. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/utils.js +1058 -0
  201. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/affects-marks.js +86 -0
  202. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/affects.js +102 -0
  203. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/attribution.js +45 -0
  204. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/boundaries.js +606 -0
  205. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/action.js +164 -0
  206. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/async.js +763 -0
  207. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/attribution-hooks.js +3 -0
  208. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/constants.js +233 -0
  209. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/context.js +63 -0
  210. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/core.js +1546 -0
  211. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/dev.js +20 -0
  212. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/effect.js +173 -0
  213. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/error-hooks.js +71 -0
  214. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/error.js +82 -0
  215. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/external.js +97 -0
  216. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/graph.js +162 -0
  217. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/heap.js +124 -0
  218. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/identities.js +62 -0
  219. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/invariants.js +12 -0
  220. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/lanes.js +714 -0
  221. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/owner.js +365 -0
  222. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/scheduler.js +1054 -0
  223. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/truth.js +45 -0
  224. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/verdict.js +403 -0
  225. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/deferred.js +185 -0
  226. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/flatten.js +77 -0
  227. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/from.js +248 -0
  228. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/index.js +67 -0
  229. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/map.js +585 -0
  230. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/reveal.js +212 -0
  231. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/signals.js +669 -0
  232. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/affects.js +142 -0
  233. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/edges.js +39 -0
  234. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/hooks.js +13 -0
  235. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/index.js +45 -0
  236. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/optimistic.js +611 -0
  237. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/projection.js +307 -0
  238. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/reconcile.js +275 -0
  239. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/store.js +1974 -0
  240. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/storePath.js +103 -0
  241. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/target.js +43 -0
  242. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/types.js +73 -0
  243. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/utils.js +1058 -0
  244. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/affects-marks.d.ts +14 -0
  245. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/affects.d.ts +28 -0
  246. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/attribution.d.ts +19 -0
  247. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/attribution.prod.d.ts +22 -0
  248. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/boundaries.d.ts +138 -0
  249. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/carved.d.ts +1 -0
  250. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/action.d.ts +70 -0
  251. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/async.d.ts +48 -0
  252. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/attribution-costs.d.ts +35 -0
  253. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/attribution-feedback.d.ts +133 -0
  254. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/attribution-hooks.d.ts +351 -0
  255. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/attribution-queries.d.ts +24 -0
  256. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/attribution.d.ts +916 -0
  257. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/constants.d.ts +226 -0
  258. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/context.d.ts +36 -0
  259. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/core.d.ts +365 -0
  260. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/dev.d.ts +568 -0
  261. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/effect.d.ts +30 -0
  262. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/error-hooks.d.ts +71 -0
  263. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/error.d.ts +64 -0
  264. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/external.d.ts +15 -0
  265. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/graph.d.ts +45 -0
  266. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/heap.d.ts +22 -0
  267. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/identities.d.ts +17 -0
  268. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/index.d.ts +17 -0
  269. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/invariants.d.ts +34 -0
  270. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/lanes.d.ts +64 -0
  271. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/owner.d.ts +142 -0
  272. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/scheduler.d.ts +397 -0
  273. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/truth.d.ts +16 -0
  274. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/types.d.ts +212 -0
  275. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/verdict.d.ts +37 -0
  276. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/deferred.d.ts +28 -0
  277. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/flatten.d.ts +8 -0
  278. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/from.d.ts +47 -0
  279. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/index.d.ts +32 -0
  280. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/map.d.ts +71 -0
  281. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/reveal.d.ts +19 -0
  282. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/signals.d.ts +738 -0
  283. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/affects.d.ts +12 -0
  284. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/edges.d.ts +9 -0
  285. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/hooks.d.ts +48 -0
  286. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/index.d.ts +46 -0
  287. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/optimistic.d.ts +24 -0
  288. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/projection.d.ts +19 -0
  289. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/reconcile.d.ts +3 -0
  290. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/store.d.ts +134 -0
  291. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/storePath.d.ts +58 -0
  292. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/target.d.ts +159 -0
  293. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/types.d.ts +98 -0
  294. package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/utils.d.ts +262 -0
  295. package/node_modules/solid-js/node_modules/@solidjs/signals/package.json +74 -0
  296. package/node_modules/solid-js/node_modules/csstype/LICENSE +19 -0
  297. package/node_modules/solid-js/node_modules/csstype/README.md +291 -0
  298. package/node_modules/solid-js/node_modules/csstype/index.d.ts +22569 -0
  299. package/node_modules/solid-js/node_modules/csstype/index.js.flow +6863 -0
  300. package/node_modules/solid-js/node_modules/csstype/package.json +70 -0
  301. package/node_modules/solid-js/node_modules/seroval/LICENSE +7 -0
  302. package/node_modules/solid-js/node_modules/seroval/README.md +117 -0
  303. package/node_modules/solid-js/node_modules/seroval/dist/dev/index.cjs +3716 -0
  304. package/node_modules/solid-js/node_modules/seroval/dist/dev/index.d.cts +820 -0
  305. package/node_modules/solid-js/node_modules/seroval/dist/dev/index.d.ts +820 -0
  306. package/node_modules/solid-js/node_modules/seroval/dist/dev/index.js +3669 -0
  307. package/node_modules/solid-js/node_modules/seroval/dist/index.cjs +3700 -0
  308. package/node_modules/solid-js/node_modules/seroval/dist/index.d.cts +820 -0
  309. package/node_modules/solid-js/node_modules/seroval/dist/index.d.ts +820 -0
  310. package/node_modules/solid-js/node_modules/seroval/dist/index.js +3653 -0
  311. package/node_modules/solid-js/node_modules/seroval/package.json +77 -0
  312. package/node_modules/solid-js/node_modules/seroval-plugins/LICENSE +7 -0
  313. package/node_modules/solid-js/node_modules/seroval-plugins/README.md +50 -0
  314. package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/index-BG4YWylA.d.cts +101 -0
  315. package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/index.cjs +8 -0
  316. package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/index.d.cts +2 -0
  317. package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/index.d.ts +2 -0
  318. package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/index.js +2 -0
  319. package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/web-B1lHT9kZ.cjs +812 -0
  320. package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/web.cjs +16 -0
  321. package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/web.d.cts +2 -0
  322. package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/web.d.ts +97 -0
  323. package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/web.js +693 -0
  324. package/node_modules/solid-js/node_modules/seroval-plugins/dist/index-BG4YWylA.d.cts +101 -0
  325. package/node_modules/solid-js/node_modules/seroval-plugins/dist/index.cjs +8 -0
  326. package/node_modules/solid-js/node_modules/seroval-plugins/dist/index.d.cts +2 -0
  327. package/node_modules/solid-js/node_modules/seroval-plugins/dist/index.d.ts +2 -0
  328. package/node_modules/solid-js/node_modules/seroval-plugins/dist/index.js +2 -0
  329. package/node_modules/solid-js/node_modules/seroval-plugins/dist/web-B1lHT9kZ.cjs +812 -0
  330. package/node_modules/solid-js/node_modules/seroval-plugins/dist/web.cjs +16 -0
  331. package/node_modules/solid-js/node_modules/seroval-plugins/dist/web.d.cts +2 -0
  332. package/node_modules/solid-js/node_modules/seroval-plugins/dist/web.d.ts +97 -0
  333. package/node_modules/solid-js/node_modules/seroval-plugins/dist/web.js +693 -0
  334. package/node_modules/solid-js/node_modules/seroval-plugins/package.json +81 -0
  335. package/node_modules/solid-js/package.json +142 -0
  336. package/node_modules/solid-js/skills/reactivity-diagnostics/SKILL.md +1023 -0
  337. package/node_modules/solid-js/skills/solid-2.0/SKILL.md +114 -0
  338. package/node_modules/solid-js/skills/solid-2.0-cheatsheet/SKILL.md +757 -0
  339. package/node_modules/solid-js/types/attribution.d.ts +11 -0
  340. package/node_modules/solid-js/types/client/component.d.ts +176 -0
  341. package/node_modules/solid-js/types/client/container-trace.d.ts +73 -0
  342. package/node_modules/solid-js/types/client/core.d.ts +186 -0
  343. package/node_modules/solid-js/types/client/dynamic.d.ts +55 -0
  344. package/node_modules/solid-js/types/client/flow.d.ts +323 -0
  345. package/node_modules/solid-js/types/client/hydration.d.ts +619 -0
  346. package/node_modules/solid-js/types/client/store-hydration.d.ts +1 -0
  347. package/node_modules/solid-js/types/console-footer.d.ts +2 -0
  348. package/node_modules/solid-js/types/from.d.ts +24 -0
  349. package/node_modules/solid-js/types/index.d.ts +35 -0
  350. package/node_modules/solid-js/types/internal.d.ts +190 -0
  351. package/node_modules/solid-js/types/recovery.d.ts +28 -0
  352. package/node_modules/solid-js/types/refresh/index.d.ts +76 -0
  353. package/node_modules/solid-js/types/server/component.d.ts +113 -0
  354. package/node_modules/solid-js/types/server/core.d.ts +48 -0
  355. package/node_modules/solid-js/types/server/diagnostics.d.ts +45 -0
  356. package/node_modules/solid-js/types/server/dynamic.d.ts +29 -0
  357. package/node_modules/solid-js/types/server/edges.d.ts +1 -0
  358. package/node_modules/solid-js/types/server/flow.d.ts +168 -0
  359. package/node_modules/solid-js/types/server/hydration.d.ts +52 -0
  360. package/node_modules/solid-js/types/server/index.d.ts +17 -0
  361. package/node_modules/solid-js/types/server/observe.d.ts +94 -0
  362. package/node_modules/solid-js/types/server/shared.d.ts +137 -0
  363. package/node_modules/solid-js/types/server/signals.d.ts +345 -0
  364. package/node_modules/solid-js/types/types.d.ts +15 -0
  365. package/node_modules/zod/package.json +1 -1
  366. package/node_modules/zod/src/v4/classic/tests/array.test.ts +27 -0
  367. package/node_modules/zod/src/v4/classic/tests/map.test.ts +7 -0
  368. package/node_modules/zod/src/v4/classic/tests/set.test.ts +6 -0
  369. package/node_modules/zod/src/v4/core/compile.ts +9 -0
  370. package/node_modules/zod/src/v4/core/schemas.ts +35 -1
  371. package/node_modules/zod/src/v4/core/util.ts +13 -0
  372. package/node_modules/zod/src/v4/core/versions.ts +1 -1
  373. package/node_modules/zod/v4/core/compile.cjs +8 -0
  374. package/node_modules/zod/v4/core/compile.js +8 -0
  375. package/node_modules/zod/v4/core/schemas.cjs +30 -0
  376. package/node_modules/zod/v4/core/schemas.d.cts +3 -1
  377. package/node_modules/zod/v4/core/schemas.d.ts +3 -1
  378. package/node_modules/zod/v4/core/schemas.js +30 -0
  379. package/node_modules/zod/v4/core/util.cjs +15 -0
  380. package/node_modules/zod/v4/core/util.d.cts +2 -0
  381. package/node_modules/zod/v4/core/util.d.ts +2 -0
  382. package/node_modules/zod/v4/core/util.js +14 -0
  383. package/node_modules/zod/v4/core/versions.cjs +1 -1
  384. package/node_modules/zod/v4/core/versions.js +1 -1
  385. package/openclaw.plugin.json +11 -0
  386. package/package.json +17 -5
  387. package/dist/.setup/setup-plugin-api-BT2_wr33.mjs +0 -2
@@ -1,11 +1,12 @@
1
- import { a as listNostrAccountIds, c as normalizePubkey, n as nostrSetupContract, o as resolveDefaultNostrAccountId, r as nostrSetupWizard, s as resolveNostrAccount } from "./setup-surface-CadI9603.mjs";
2
- import { l as validatePrivateKey, u as DEFAULT_RELAYS } from "./setup-adapter-DTqb2Hne.mjs";
3
- import { n as NostrProfileSchema, t as nostrSetupPlugin } from "./channel.setup-B2tWt-Ro.mjs";
1
+ import { a as listNostrAccountIds, c as normalizePubkey, n as nostrSetupContract, o as resolveDefaultNostrAccountId, r as nostrSetupWizard, s as resolveNostrAccount } from "./setup-surface-fC0kex9d.mjs";
2
+ import { l as validatePrivateKey, u as DEFAULT_RELAYS } from "./setup-adapter-CCRkU3LC.mjs";
3
+ import { n as NostrProfileSchema, t as nostrSetupPlugin } from "./channel.setup-DeVyQy6t.mjs";
4
4
  import { createScopedDmSecurityResolver, createTopLevelChannelConfigAdapter } from "openclaw/plugin-sdk/channel-config-helpers";
5
5
  import { createChatChannelPlugin } from "openclaw/plugin-sdk/channel-core";
6
6
  import { missingTargetError } from "openclaw/plugin-sdk/channel-feedback";
7
- import { DEFAULT_INGRESS_ADOPTION_STALL_MS, bindIngressLifecycleToReplyOptions, createChannelIngressError, createChannelIngressMonitor, createChannelMessageAdapterFromOutbound, runPassiveAccountLifecycle } from "openclaw/plugin-sdk/channel-outbound";
7
+ import { bindIngressLifecycleToReplyOptions, createChannelIngressError, createChannelIngressMonitor, createChannelMessageAdapterFromOutbound, runPassiveAccountLifecycle } from "openclaw/plugin-sdk/channel-outbound";
8
8
  import { DEFAULT_ACCOUNT_ID, formatPairingApproveHint } from "openclaw/plugin-sdk/channel-plugin-common";
9
+ import { buildChannelOutboundSessionRoute, stripChannelTargetPrefix } from "openclaw/plugin-sdk/core";
9
10
  import { buildPassiveChannelStatusSummary, buildTrafficStatusSummary } from "openclaw/plugin-sdk/extension-shared";
10
11
  import { collectStatusIssuesFromLastError, createComputedAccountStatusAdapter, createDefaultChannelRuntimeState } from "openclaw/plugin-sdk/status-helpers";
11
12
  import { isRecord, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -19,25 +20,12 @@ import { decrypt, encrypt } from "nostr-tools/nip04";
19
20
  import { createDirectDmPreCryptoGuardPolicy } from "openclaw/plugin-sdk/direct-dm-guard-policy";
20
21
  import { captureEffectAuthority } from "openclaw/plugin-sdk/fetch-runtime";
21
22
  import { createFixedWindowRateLimiter } from "openclaw/plugin-sdk/webhook-ingress";
22
- import { retryAsync } from "openclaw/plugin-sdk/retry-runtime";
23
+ import { isStateDatabaseAdmissionClosedError, retryAsync } from "openclaw/plugin-sdk/retry-runtime";
23
24
  import { sleepWithAbort } from "openclaw/plugin-sdk/runtime-env";
24
25
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
25
26
  import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
26
27
  import { withTimeout } from "openclaw/plugin-sdk/time-runtime";
27
- import { buildChannelOutboundSessionRoute, stripChannelTargetPrefix } from "openclaw/plugin-sdk/core";
28
- //#region extensions/nostr/src/metrics.ts
29
- function createMetrics(onMetric) {
30
- return { emit(name, value = 1, labels) {
31
- onMetric?.({
32
- name,
33
- value,
34
- timestamp: Date.now(),
35
- labels
36
- });
37
- } };
38
- }
39
- //#endregion
40
- //#region extensions/nostr/src/nostr-cursor.ts
28
+ // extensions/nostr/src/nostr-cursor.ts
41
29
  const CURSOR_WRITE_RETRY_MS = [
42
30
  0,
43
31
  100,
@@ -46,7 +34,6 @@ const CURSOR_WRITE_RETRY_MS = [
46
34
  const CURSOR_RECOVERY_RETRY_MS = 1e3;
47
35
  /** Tracks the largest EOSE-safe Nostr timestamp without skipping undurable relay events. */
48
36
  function createNostrDurableCursor(options) {
49
- const nowSec = options.nowSec ?? (() => Math.floor(Date.now() / 1e3));
50
37
  let durableCandidate;
51
38
  let transientReplayCeiling;
52
39
  let backfillComplete = false;
@@ -58,7 +45,8 @@ function createNostrDurableCursor(options) {
58
45
  recordDurableAppend: (event) => {
59
46
  if (!Number.isSafeInteger(event.created_at)) return;
60
47
  const previousSafeCandidate = safeCandidate();
61
- durableCandidate = Math.max(durableCandidate ?? 0, Math.min(event.created_at, nowSec()));
48
+ const nowSec = Math.floor(Date.now() / 1e3);
49
+ durableCandidate = Math.max(durableCandidate ?? 0, Math.min(event.created_at, nowSec));
62
50
  const nextSafeCandidate = safeCandidate();
63
51
  return backfillComplete && nextSafeCandidate !== previousSafeCandidate ? nextSafeCandidate : void 0;
64
52
  },
@@ -80,7 +68,6 @@ function createNostrCursorStateWriter(options) {
80
68
  let desiredCursor = Math.max(options.minimumCursor, options.initialCursor);
81
69
  let dirty = false;
82
70
  let timer;
83
- let writeTail = Promise.resolve();
84
71
  let activeFlush;
85
72
  let recoveryFlush;
86
73
  const writeWithRetry = async (cursor) => {
@@ -95,27 +82,20 @@ function createNostrCursorStateWriter(options) {
95
82
  throw new Error("Nostr cursor state write failed.", { cause: error });
96
83
  }
97
84
  };
98
- const enqueueWrite = (cursor) => {
99
- const write = writeTail.then(() => writeWithRetry(cursor));
100
- writeTail = write.catch(() => void 0);
101
- return write;
102
- };
103
85
  const clearTimer = () => {
104
- if (timer) {
105
- clearTimeout(timer);
106
- timer = void 0;
107
- }
86
+ clearTimeout(timer);
87
+ timer = void 0;
108
88
  };
109
89
  const runFlush = async () => {
110
90
  for (;;) {
111
91
  if (!dirty) {
112
- await writeTail;
92
+ await Promise.resolve();
113
93
  if (!dirty) return;
114
94
  }
115
95
  dirty = false;
116
96
  const cursor = desiredCursor;
117
97
  try {
118
- await enqueueWrite(cursor);
98
+ await Promise.resolve().then(() => writeWithRetry(cursor));
119
99
  } catch (error) {
120
100
  dirty = true;
121
101
  throw error;
@@ -155,6 +135,7 @@ function createNostrCursorStateWriter(options) {
155
135
  await flush();
156
136
  return;
157
137
  } catch (error) {
138
+ if (isStateDatabaseAdmissionClosedError(error)) throw error;
158
139
  options.onBackgroundError?.(error);
159
140
  await sleepWithAbort(CURSOR_RECOVERY_RETRY_MS);
160
141
  }
@@ -179,8 +160,7 @@ function inspectNostrIngressEvent(event) {
179
160
  }
180
161
  /** Convert the retired persisted LRU seed into durable completion tombstones. */
181
162
  async function migrateNostrLegacyRecentEventIds(params) {
182
- const migratedAt = params.migratedAt ?? Date.now();
183
- let migrated = 0;
163
+ const migratedAt = Date.now();
184
164
  for (const eventId of new Set(params.eventIds)) {
185
165
  if (!eventId.trim()) continue;
186
166
  const result = await params.queue.enqueue(eventId, {
@@ -194,24 +174,15 @@ async function migrateNostrLegacyRecentEventIds(params) {
194
174
  if (result.kind === "accepted" || result.kind === "pending" && result.record.payload.rawEvent === "") {
195
175
  if (!await params.queue.complete(eventId, { completedAt: migratedAt })) throw new Error(`Failed to migrate Nostr replay event ${eventId}.`);
196
176
  }
197
- migrated += 1;
198
177
  }
199
- return migrated;
200
178
  }
201
- //#endregion
202
- //#region extensions/nostr/src/runtime.ts
179
+ // extensions/nostr/src/runtime.ts
203
180
  const { setRuntime: setNostrRuntime, getRuntime: getNostrRuntime } = createPluginRuntimeStore({
204
181
  pluginId: "nostr",
205
182
  errorMessage: "Nostr runtime not initialized"
206
183
  });
207
- //#endregion
208
- //#region extensions/nostr/src/nostr-ingress.ts
184
+ // extensions/nostr/src/nostr-ingress.ts
209
185
  const NOSTR_INGRESS_POLL_INTERVAL_MS = 500;
210
- const NOSTR_INGRESS_APPEND_RETRY_MS = [
211
- 0,
212
- 100,
213
- 300
214
- ];
215
186
  const NostrIngressAdmissionRejectedError = createChannelIngressError("NostrIngressAdmissionRejectedError", { withReason: true });
216
187
  function deserializeNostrIngressEvent(rawEvent, claimedId) {
217
188
  let parsed;
@@ -238,20 +209,35 @@ function createNostrIngress(options) {
238
209
  };
239
210
  const monitor = createChannelIngressMonitor({
240
211
  queue: getQueue,
241
- inspect: (event) => {
242
- const facts = inspectNostrIngressEvent(event);
243
- return {
244
- eventId: facts.eventId,
245
- laneKey: facts.laneKey
246
- };
212
+ inspect: ({ facts }) => facts,
213
+ inspectAsync: async ({ facts }, context) => {
214
+ if (context.phase === "admission") {
215
+ await monitorStart;
216
+ if (admissionFailure) throw admissionFailure;
217
+ const pending = await getQueue().listPending({ limit: options.maxPendingEvents });
218
+ const claims = await getQueue().listClaims();
219
+ if (pending.length + claims.length >= options.maxPendingEvents) throw new NostrIngressAdmissionRejectedError("backpressure", "Nostr event exceeds the durable ingress backlog.");
220
+ }
221
+ return facts;
247
222
  },
248
223
  payload: {
249
224
  version: 1,
250
- serialize: (event, { receivedAt }) => ({
251
- receivedAt,
252
- rawEvent: JSON.stringify(event)
225
+ serialize: ({ payload }) => ({
226
+ receivedAt: payload.receivedAt,
227
+ rawEvent: payload.rawEvent
253
228
  }),
254
- deserialize: (body, { claim }) => deserializeNostrIngressEvent(body.rawEvent, claim.id),
229
+ deserialize: (body, { claim }) => {
230
+ const event = deserializeNostrIngressEvent(body.rawEvent, claim.id);
231
+ return {
232
+ event,
233
+ facts: inspectNostrIngressEvent(event),
234
+ receivedAt: body.receivedAt,
235
+ payload: {
236
+ version: 1,
237
+ ...body
238
+ }
239
+ };
240
+ },
255
241
  encode: ({ body }) => ({
256
242
  version: 1,
257
243
  ...body
@@ -268,14 +254,19 @@ function createNostrIngress(options) {
268
254
  },
269
255
  createClaimError: (kind, claim) => new NostrIngressPermanentError("invalid-event", kind === "invalid-version" ? `Nostr ingress row ${claim.id} has an unsupported version.` : `Nostr ingress row ${claim.id} changed event identity.`)
270
256
  },
271
- deliver: options.deliver,
272
- pollIntervalMs: options.pollIntervalMs ?? NOSTR_INGRESS_POLL_INTERVAL_MS,
257
+ deliver: ({ event }, lifecycle) => options.deliver(event, lifecycle),
258
+ onDurableAdmission: ({ event }) => options.afterDurableAppend(event),
259
+ onAdmissionFailure: (_event, error) => {
260
+ if (error instanceof NostrIngressAdmissionRejectedError || error instanceof NostrIngressPermanentError) return;
261
+ admissionFailure ??= new Error(`Nostr durable admission failed: ${formatErrorMessage(error)}`, { cause: error });
262
+ throw admissionFailure;
263
+ },
264
+ pollIntervalMs: NOSTR_INGRESS_POLL_INTERVAL_MS,
273
265
  retention: {
274
266
  completedMaxEntries: 1e5,
275
267
  failedMaxEntries: 1e5
276
268
  },
277
269
  drain: {
278
- adoptionStallTimeoutMs: options.adoptionStallTimeoutMs ?? DEFAULT_INGRESS_ADOPTION_STALL_MS,
279
270
  resolveNonRetryableFailure: (error) => error instanceof NostrIngressPermanentError ? {
280
271
  reason: error.reason,
281
272
  message: error.message
@@ -294,7 +285,6 @@ function createNostrIngress(options) {
294
285
  if (!stopping) monitor.start();
295
286
  })();
296
287
  monitorStart.catch((error) => options.onError?.(error, "ingress drain"));
297
- let admissionTail = Promise.resolve();
298
288
  const prepareAdmission = (event) => {
299
289
  const facts = inspectNostrIngressEvent(event);
300
290
  const receivedAt = Date.now();
@@ -325,34 +315,8 @@ function createNostrIngress(options) {
325
315
  payload
326
316
  };
327
317
  };
328
- const admitOnce = async (prepared) => {
329
- await monitorStart;
330
- const pending = await getQueue().listPending({ limit: options.maxPendingEvents });
331
- const claims = await getQueue().listClaims();
332
- if (pending.length + claims.length >= options.maxPendingEvents) throw new NostrIngressAdmissionRejectedError("backpressure", "Nostr event exceeds the durable ingress backlog.");
333
- try {
334
- return await retryAsync(async () => {
335
- const result = await getQueue().enqueue(prepared.facts.eventId, prepared.payload, {
336
- receivedAt: prepared.receivedAt,
337
- laneKey: prepared.facts.laneKey
338
- });
339
- options.afterDurableAppend(prepared.event);
340
- monitor.requestDrain();
341
- return result.kind === "accepted" ? "accepted" : "duplicate";
342
- }, {
343
- attempts: NOSTR_INGRESS_APPEND_RETRY_MS.length,
344
- minDelayMs: 0,
345
- delayMs: ({ attempt }) => NOSTR_INGRESS_APPEND_RETRY_MS[attempt] ?? 0,
346
- sleep: (delayMs) => sleepWithAbort(delayMs)
347
- });
348
- } catch (error) {
349
- throw new Error(`Nostr durable admission failed: ${formatErrorMessage(error)}`, { cause: error });
350
- }
351
- };
352
318
  return {
353
- ready: async () => {
354
- await monitorStart;
355
- },
319
+ ready: () => monitorStart,
356
320
  receive: (event) => {
357
321
  if (stopping) return Promise.reject(createStoppedError());
358
322
  let prepared;
@@ -362,27 +326,15 @@ function createNostrIngress(options) {
362
326
  return Promise.reject(error);
363
327
  }
364
328
  queuedAdmissions += 1;
365
- const settledAdmission = admissionTail.then(async () => {
366
- if (admissionFailure) throw admissionFailure;
367
- try {
368
- return await admitOnce(prepared);
369
- } catch (error) {
370
- if (error instanceof NostrIngressAdmissionRejectedError || error instanceof NostrIngressPermanentError) throw error;
371
- admissionFailure = error instanceof Error ? error : new Error(formatErrorMessage(error), { cause: error });
372
- throw admissionFailure;
373
- }
374
- }).finally(() => {
329
+ return monitor.admit(prepared, { receivedAt: prepared.receivedAt }).then((result) => result.queueResult?.kind === "accepted" ? "accepted" : "duplicate").finally(() => {
375
330
  queuedAdmissions -= 1;
376
331
  });
377
- admissionTail = settledAdmission.then(() => void 0, () => void 0);
378
- return settledAdmission;
379
332
  },
380
333
  stop: () => {
381
334
  if (stopTask) return stopTask;
382
335
  stopping = true;
383
336
  const pauseTask = monitor.pause();
384
337
  stopTask = (async () => {
385
- await admissionTail;
386
338
  await monitorStart.catch(() => void 0);
387
339
  await pauseTask;
388
340
  await monitor.stop();
@@ -390,14 +342,12 @@ function createNostrIngress(options) {
390
342
  return stopTask;
391
343
  },
392
344
  waitForIdle: async () => {
393
- await admissionTail;
394
345
  await monitorStart;
395
346
  await monitor.waitForIdle();
396
347
  }
397
348
  };
398
349
  }
399
- //#endregion
400
- //#region extensions/nostr/src/nostr-profile-core.ts
350
+ // extensions/nostr/src/nostr-profile-core.ts
401
351
  const PROFILE_FIELDS = [
402
352
  ["name", "name"],
403
353
  ["displayName", "display_name"],
@@ -426,8 +376,7 @@ function contentToProfile(content) {
426
376
  }
427
377
  return profile;
428
378
  }
429
- //#endregion
430
- //#region extensions/nostr/src/nostr-profile.ts
379
+ // extensions/nostr/src/nostr-profile.ts
431
380
  const RELAY_PUBLISH_TIMEOUT_MS = 5e3;
432
381
  /** Publish one signed kind:0 event, reporting each relay's result without retrying. */
433
382
  async function publishProfile(pool, sk, relays, profile, lastPublishedAt) {
@@ -461,104 +410,38 @@ async function publishProfile(pool, sk, relays, profile, lastPublishedAt) {
461
410
  createdAt: event.created_at
462
411
  };
463
412
  }
464
- //#endregion
465
- //#region extensions/nostr/src/nostr-relay-subscription.ts
466
- const DEFAULT_EOSE_CONFIRM_DEADLINE_MS = 1e4;
467
- /** Separates real relay EOSE frames from nostr-tools timeout/close synthesis. */
468
- function createNostrRelaySubscriptionGroup(options) {
469
- const relays = [...new Set(options.relays)];
470
- const subscriptions = [];
471
- const deadlineTimers = /* @__PURE__ */ new Set();
472
- let locallyClosing = false;
473
- const backfillStatus = new Map(relays.map((relay) => [relay, "pending"]));
474
- const settleBackfill = (relay, status) => {
475
- if (backfillStatus.get(relay) !== "pending") return;
476
- backfillStatus.set(relay, status);
477
- if ([...backfillStatus.values()].some((value) => value === "pending")) return;
478
- if ([...backfillStatus.values()].every((value) => value === "confirmed")) options.onBackfillComplete(relays);
479
- };
480
- const clearDeadlines = () => {
481
- for (const timer of deadlineTimers) clearTimeout(timer);
482
- deadlineTimers.clear();
483
- };
484
- return {
485
- start: () => {
486
- for (const relay of relays) {
487
- let relayClosed = false;
488
- let deadlineReached = false;
489
- const deadlineTimer = setTimeout(() => {
490
- deadlineTimers.delete(deadlineTimer);
491
- deadlineReached = true;
492
- settleBackfill(relay, "incomplete");
493
- }, DEFAULT_EOSE_CONFIRM_DEADLINE_MS);
494
- deadlineTimer.unref?.();
495
- deadlineTimers.add(deadlineTimer);
496
- subscriptions.push(options.pool.subscribeMany([relay], options.filter, {
497
- onevent: options.onEvent,
498
- oneose: () => {
499
- queueMicrotask(() => {
500
- if (!relayClosed && !deadlineReached) {
501
- clearTimeout(deadlineTimer);
502
- deadlineTimers.delete(deadlineTimer);
503
- settleBackfill(relay, "confirmed");
504
- }
505
- });
506
- },
507
- onclose: (reasons) => {
508
- relayClosed = true;
509
- clearTimeout(deadlineTimer);
510
- deadlineTimers.delete(deadlineTimer);
511
- settleBackfill(relay, "incomplete");
512
- if (!locallyClosing && !options.abort.aborted) options.onClose(relay, reasons.map(({ reason }) => reason));
513
- },
514
- maxWait: 11e3,
515
- abort: options.abort
516
- }));
517
- }
518
- },
519
- close: async (reason) => {
520
- locallyClosing = true;
521
- clearDeadlines();
522
- await Promise.all(subscriptions.map(async (subscription) => subscription.close(reason)));
523
- }
524
- };
525
- }
526
- //#endregion
527
- //#region extensions/nostr/src/state-account-id.ts
413
+ // extensions/nostr/src/state-account-id.ts
528
414
  function normalizeNostrStateAccountId(accountId) {
529
415
  const trimmed = accountId?.trim();
530
416
  if (!trimmed) return "default";
531
417
  return trimmed.replace(/[^a-z0-9._-]+/gi, "_");
532
418
  }
533
- //#endregion
534
- //#region extensions/nostr/src/nostr-state-store.ts
419
+ // extensions/nostr/src/nostr-state-store.ts
535
420
  const STORE_VERSION = 2;
536
421
  const PROFILE_STATE_VERSION = 1;
537
- function openNostrBusStateStore(env) {
422
+ function openNostrBusStateStore() {
538
423
  return getNostrRuntime().state.openKeyedStore({
539
424
  namespace: "bus-state",
540
- maxEntries: 256,
541
- ...env ? { env } : {}
425
+ maxEntries: 256
542
426
  });
543
427
  }
544
- function openNostrProfileStateStore(env) {
428
+ function openNostrProfileStateStore() {
545
429
  return getNostrRuntime().state.openKeyedStore({
546
430
  namespace: "profile-state",
547
- maxEntries: 256,
548
- ...env ? { env } : {}
431
+ maxEntries: 256
549
432
  });
550
433
  }
551
434
  async function readNostrBusState(params) {
552
- return await openNostrBusStateStore(params.env).lookup(normalizeNostrStateAccountId(params.accountId)) ?? null;
435
+ return await openNostrBusStateStore().lookup(normalizeNostrStateAccountId(params.accountId)) ?? null;
553
436
  }
554
437
  async function writeNostrBusState(params) {
555
438
  const payload = {
556
439
  version: STORE_VERSION,
557
440
  lastProcessedAt: params.lastProcessedAt,
558
441
  gatewayStartedAt: params.gatewayStartedAt,
559
- recentEventIds: (params.recentEventIds ?? []).filter((x) => typeof x === "string")
442
+ recentEventIds: params.recentEventIds ?? []
560
443
  };
561
- await openNostrBusStateStore(params.env).register(normalizeNostrStateAccountId(params.accountId), payload);
444
+ await openNostrBusStateStore().register(normalizeNostrStateAccountId(params.accountId), payload);
562
445
  }
563
446
  /**
564
447
  * Determine the `since` timestamp for subscription.
@@ -572,7 +455,7 @@ function computeSinceTimestamp(state, nowSec = Math.floor(Date.now() / 1e3)) {
572
455
  return Math.max(...candidates);
573
456
  }
574
457
  async function readNostrProfileState(params) {
575
- return await openNostrProfileStateStore(params.env).lookup(normalizeNostrStateAccountId(params.accountId)) ?? null;
458
+ return await openNostrProfileStateStore().lookup(normalizeNostrStateAccountId(params.accountId)) ?? null;
576
459
  }
577
460
  async function writeNostrProfileState(params) {
578
461
  const payload = {
@@ -581,110 +464,26 @@ async function writeNostrProfileState(params) {
581
464
  lastPublishedEventId: params.lastPublishedEventId,
582
465
  lastPublishResults: params.lastPublishResults
583
466
  };
584
- await openNostrProfileStateStore(params.env).register(normalizeNostrStateAccountId(params.accountId), payload);
467
+ await openNostrProfileStateStore().register(normalizeNostrStateAccountId(params.accountId), payload);
585
468
  }
586
- //#endregion
587
- //#region extensions/nostr/src/nostr-bus.ts
469
+ // extensions/nostr/src/nostr-bus.ts
588
470
  const STARTUP_LOOKBACK_SEC = 120;
589
471
  const STATE_PERSIST_DEBOUNCE_MS = 5e3;
590
472
  const NOSTR_INGRESS_ENVELOPE_OVERHEAD_BYTES = 16384;
591
473
  const NOSTR_INGRESS_MAX_PENDING_EVENTS = 1e3;
592
- const CIRCUIT_BREAKER_THRESHOLD = 5;
593
- const CIRCUIT_BREAKER_RESET_MS = 3e4;
594
- const HEALTH_WINDOW_MS = 6e4;
595
- function createCircuitBreaker(relay, metrics) {
596
- const state = {
597
- state: "closed",
598
- failures: 0,
599
- lastFailure: 0
600
- };
601
- return {
602
- canAttempt() {
603
- if (state.state === "open") {
604
- if (Date.now() - state.lastFailure >= CIRCUIT_BREAKER_RESET_MS) {
605
- state.state = "half_open";
606
- metrics.emit("relay.circuit_breaker.half_open", 1, { relay });
607
- return true;
608
- }
609
- return false;
610
- }
611
- return true;
612
- },
613
- recordSuccess() {
614
- if (state.state === "half_open") {
615
- state.state = "closed";
616
- state.failures = 0;
617
- metrics.emit("relay.circuit_breaker.close", 1, { relay });
618
- } else if (state.state === "closed") state.failures = 0;
619
- },
620
- recordFailure() {
621
- state.failures++;
622
- state.lastFailure = Date.now();
623
- if (state.state === "half_open" || state.state === "closed" && state.failures >= CIRCUIT_BREAKER_THRESHOLD) {
624
- state.state = "open";
625
- metrics.emit("relay.circuit_breaker.open", 1, { relay });
626
- }
627
- }
628
- };
629
- }
630
- function createRelayHealthTracker() {
631
- const stats = /* @__PURE__ */ new Map();
632
- function getOrCreate(relay) {
633
- let s = stats.get(relay);
634
- if (!s) {
635
- s = {
636
- successCount: 0,
637
- failureCount: 0,
638
- latencySum: 0,
639
- lastSuccess: 0,
640
- lastFailure: 0
641
- };
642
- stats.set(relay, s);
643
- }
644
- return s;
645
- }
646
- return {
647
- recordSuccess(relay, latencyMs) {
648
- const s = getOrCreate(relay);
649
- s.successCount++;
650
- s.latencySum += latencyMs;
651
- s.lastSuccess = Date.now();
652
- },
653
- recordFailure(relay) {
654
- const s = getOrCreate(relay);
655
- s.failureCount++;
656
- s.lastFailure = Date.now();
657
- },
658
- getScore(relay) {
659
- const s = stats.get(relay);
660
- if (!s) return .5;
661
- const total = s.successCount + s.failureCount;
662
- const successRate = s.successCount / total;
663
- const now = Date.now();
664
- const recencyBonus = s.lastSuccess > s.lastFailure ? Math.max(0, 1 - (now - s.lastSuccess) / HEALTH_WINDOW_MS) * .2 : 0;
665
- const avgLatency = s.successCount > 0 ? s.latencySum / s.successCount : 1e3;
666
- const latencyPenalty = Math.min(.2, avgLatency / 1e4);
667
- return Math.max(0, Math.min(1, successRate + recencyBonus - latencyPenalty));
668
- },
669
- getSortedRelays(relays) {
670
- return relays.toSorted((a, b) => this.getScore(b) - this.getScore(a));
671
- }
672
- };
673
- }
474
+ const DEFAULT_EOSE_CONFIRM_DEADLINE_MS = 1e4;
674
475
  /** Subscribe to NIP-04 encrypted DMs. */
675
476
  async function startNostrBus(options) {
676
- const { privateKey, relays = DEFAULT_RELAYS, onMessage, authorizeSender, onError, onEose, onMetric } = options;
477
+ const { privateKey, relays = DEFAULT_RELAYS, onMessage, authorizeSender, onError, onEose, onRejected } = options;
677
478
  const sk = validatePrivateKey(privateKey);
678
479
  const pk = getPublicKey(sk);
679
480
  const pool = new SimplePool();
481
+ const admissionPubkeys = options.admissionPubkeys ? new Set(options.admissionPubkeys) : void 0;
680
482
  pool.onRelayConnectionSuccess = options.onConnect;
681
483
  const accountId = options.accountId ?? pk.slice(0, 16);
682
484
  const gatewayStartedAt = Math.floor(Date.now() / 1e3);
683
- const guardPolicy = createDirectDmPreCryptoGuardPolicy(options.guardPolicy);
684
- const metrics = createMetrics(onMetric);
685
- const circuitBreakers = /* @__PURE__ */ new Map();
686
- const healthTracker = createRelayHealthTracker();
687
- for (const relay of relays) circuitBreakers.set(relay, createCircuitBreaker(relay, metrics));
485
+ const guardPolicy = createDirectDmPreCryptoGuardPolicy();
486
+ let preferredRelay;
688
487
  const state = await readNostrBusState({ accountId });
689
488
  const baseSince = computeSinceTimestamp(state, gatewayStartedAt);
690
489
  const since = Math.max(0, baseSince - STARTUP_LOOKBACK_SEC);
@@ -718,52 +517,44 @@ async function startNostrBus(options) {
718
517
  maxRequests: guardPolicy.rateLimit.maxGlobalPerWindow,
719
518
  maxTrackedKeys: 1
720
519
  });
721
- const updateRateLimiterSizeMetric = () => {
722
- metrics.emit("memory.rate_limiter_entries", perSenderRateLimiter.size() + globalRateLimiter.size());
723
- };
724
- const rejectIfRateLimited = (limiter, key, metric) => {
725
- updateRateLimiterSizeMetric();
520
+ const rejectIfRateLimited = (limiter, key) => {
726
521
  const limited = limiter.isRateLimited(key);
727
- if (limited) {
728
- metrics.emit(metric);
729
- metrics.emit("event.rejected.rate_limited");
730
- }
731
- updateRateLimiterSizeMetric();
522
+ if (limited) onRejected?.("rate_limited");
732
523
  return limited;
733
524
  };
734
525
  async function dispatchEvent(event, lifecycle) {
735
526
  if (event.pubkey === pk) {
736
- metrics.emit("event.rejected.self_message");
527
+ onRejected?.("self_message");
737
528
  return;
738
529
  }
739
530
  if (event.created_at > Math.floor(Date.now() / 1e3) + guardPolicy.maxFutureSkewSec) {
740
- metrics.emit("event.rejected.future");
531
+ onRejected?.("future");
741
532
  throw new Error(`Nostr event ${event.id} is too far in the future.`);
742
533
  }
743
534
  if (!guardPolicy.allowedKinds.includes(event.kind)) {
744
- metrics.emit("event.rejected.wrong_kind");
535
+ onRejected?.("wrong_kind");
745
536
  return;
746
537
  }
747
538
  if (!event.tags.some((tag) => tag[0] === "p" && tag[1] === pk)) {
748
- metrics.emit("event.rejected.wrong_kind");
539
+ onRejected?.("wrong_kind");
749
540
  return;
750
541
  }
751
542
  const replyTo = async (text) => {
752
543
  await sendEncryptedDm(event.pubkey, text, { replyToEventId: event.id });
753
544
  };
754
545
  if (Buffer.byteLength(event.content, "utf8") > guardPolicy.maxCiphertextBytes) {
755
- if (rejectIfRateLimited(globalRateLimiter, "global", "rate_limit.global")) throw new Error(`Nostr event ${event.id} hit the global rate limit.`);
756
- metrics.emit("event.rejected.oversized_ciphertext");
546
+ if (rejectIfRateLimited(globalRateLimiter, "global")) throw new Error(`Nostr event ${event.id} hit the global rate limit.`);
547
+ onRejected?.("oversized_ciphertext");
757
548
  return;
758
549
  }
759
- if (rejectIfRateLimited(globalRateLimiter, "global", "rate_limit.global")) throw new Error(`Nostr event ${event.id} hit the global rate limit.`);
550
+ if (rejectIfRateLimited(globalRateLimiter, "global")) throw new Error(`Nostr event ${event.id} hit the global rate limit.`);
760
551
  if (!verifyEvent(event)) {
761
- metrics.emit("event.rejected.invalid_signature");
552
+ onRejected?.("invalid_signature");
762
553
  const error = new NostrIngressPermanentError("invalid-signature", `Nostr event ${event.id} has an invalid signature.`);
763
554
  onError?.(error, `event ${event.id}`);
764
555
  throw error;
765
556
  }
766
- if (rejectIfRateLimited(perSenderRateLimiter, event.pubkey, "rate_limit.per_sender")) throw new Error(`Nostr sender ${event.pubkey} hit the rate limit.`);
557
+ if (rejectIfRateLimited(perSenderRateLimiter, event.pubkey)) throw new Error(`Nostr sender ${event.pubkey} hit the rate limit.`);
767
558
  if (authorizeSender) {
768
559
  if (await authorizeSender({
769
560
  senderPubkey: event.pubkey,
@@ -773,15 +564,13 @@ async function startNostrBus(options) {
773
564
  let plaintext;
774
565
  try {
775
566
  plaintext = decrypt(sk, event.pubkey, event.content);
776
- metrics.emit("decrypt.success");
777
567
  } catch (error) {
778
- metrics.emit("decrypt.failure");
779
- metrics.emit("event.rejected.decrypt_failed");
568
+ onRejected?.("decrypt_failed");
780
569
  onError?.(error, `decrypt from ${event.pubkey}`);
781
570
  throw new NostrIngressPermanentError("decrypt-failed", `Nostr event ${event.id} could not be decrypted.`, { cause: error });
782
571
  }
783
572
  if (Buffer.byteLength(plaintext, "utf8") > guardPolicy.maxPlaintextBytes) {
784
- metrics.emit("event.rejected.oversized_plaintext");
573
+ onRejected?.("oversized_plaintext");
785
574
  return;
786
575
  }
787
576
  if (lifecycle.abortSignal.aborted) throw new Error(`Nostr event ${event.id} stopped before dispatch.`);
@@ -789,7 +578,6 @@ async function startNostrBus(options) {
789
578
  eventId: event.id,
790
579
  createdAt: event.created_at
791
580
  }, lifecycle);
792
- metrics.emit("event.processed");
793
581
  }
794
582
  const dmFilter = {
795
583
  kinds: [4],
@@ -797,13 +585,13 @@ async function startNostrBus(options) {
797
585
  since
798
586
  };
799
587
  const relayAbort = new AbortController();
800
- let relaySubscriptions;
588
+ let closeRelaySubscriptions;
801
589
  let relayStopPromise;
802
590
  const stopRelays = (reason) => {
803
591
  relayStopPromise ??= (async () => {
804
592
  relayAbort.abort(reason);
805
593
  try {
806
- await relaySubscriptions?.close(reason);
594
+ await closeRelaySubscriptions?.(reason);
807
595
  } catch (error) {
808
596
  onError?.(error, "close subscription");
809
597
  } finally {
@@ -838,20 +626,17 @@ async function startNostrBus(options) {
838
626
  if (cursor !== void 0) await cursorWriter.persistNow(cursor);
839
627
  };
840
628
  const handleRelayEvent = async (event) => {
841
- metrics.emit("event.received");
842
629
  if (typeof event.created_at === "number" && event.created_at < since) {
843
- metrics.emit("event.rejected.stale");
630
+ onRejected?.("stale");
844
631
  return;
845
632
  }
633
+ if (admissionPubkeys && !admissionPubkeys.has(event.pubkey)) return;
846
634
  try {
847
- if (await ingress.receive(event) === "duplicate") metrics.emit("event.duplicate");
635
+ await ingress.receive(event);
848
636
  } catch (error) {
849
637
  onError?.(error, `durable admission for event ${event.id}`);
850
638
  if (error instanceof NostrIngressAdmissionRejectedError) {
851
- if (error.reason === "rate-limited") {
852
- metrics.emit("rate_limit.global");
853
- metrics.emit("event.rejected.rate_limited");
854
- }
639
+ if (error.reason === "rate-limited") onRejected?.("rate_limited");
855
640
  if (error.reason !== "oversized-event") try {
856
641
  await persistTransientReplayCursor(event);
857
642
  } catch (cursorError) {
@@ -882,30 +667,68 @@ async function startNostrBus(options) {
882
667
  gatewayStartedAt: cursorStartedAt,
883
668
  recentEventIds: []
884
669
  });
885
- relaySubscriptions = createNostrRelaySubscriptionGroup({
886
- pool,
887
- relays,
888
- filter: dmFilter,
889
- abort: relayAbort.signal,
890
- onEvent: (event) => {
891
- const task = handleRelayEvent(event);
892
- if (options.trackIngressTask) options.trackIngressTask(task.then(() => ingress.waitForIdle()));
893
- },
894
- onBackfillComplete: (confirmedRelays) => {
895
- backfillFinalizePromise ??= ingress.waitForIdle().then(() => {
896
- const cursor = durableCursor.markBackfillComplete();
897
- if (cursor !== void 0) cursorWriter.schedule(cursor);
898
- for (const relay of confirmedRelays) metrics.emit("relay.message.eose", 1, { relay });
899
- onEose?.(confirmedRelays.join(", "));
900
- }).catch((error) => onError?.(error, "finalize relay backfill"));
901
- },
902
- onClose: (relay, reasons) => {
903
- metrics.emit("relay.message.closed", 1, { relay });
904
- options.onDisconnect?.(relay);
905
- onError?.(/* @__PURE__ */ new Error(`Subscription closed: ${reasons.join(", ")}`), "subscription");
906
- }
907
- });
908
- relaySubscriptions.start();
670
+ /** Separates real relay EOSE frames from nostr-tools timeout/close synthesis. */
671
+ const subscriptionRelays = [...new Set(relays)];
672
+ const subscriptions = [];
673
+ const deadlineTimers = /* @__PURE__ */ new Set();
674
+ let locallyClosing = false;
675
+ const backfillStatus = new Map(subscriptionRelays.map((relay) => [relay, "pending"]));
676
+ const settleBackfill = (relay, status) => {
677
+ if (backfillStatus.get(relay) !== "pending") return;
678
+ backfillStatus.set(relay, status);
679
+ if ([...backfillStatus.values()].some((value) => value === "pending")) return;
680
+ if ([...backfillStatus.values()].every((value) => value === "confirmed")) backfillFinalizePromise ??= ingress.waitForIdle().then(() => {
681
+ const cursor = durableCursor.markBackfillComplete();
682
+ if (cursor !== void 0) cursorWriter.schedule(cursor);
683
+ onEose?.(subscriptionRelays.join(", "));
684
+ }).catch((error) => onError?.(error, "finalize relay backfill"));
685
+ };
686
+ closeRelaySubscriptions = async (reason) => {
687
+ locallyClosing = true;
688
+ for (const timer of deadlineTimers) clearTimeout(timer);
689
+ deadlineTimers.clear();
690
+ await Promise.all(subscriptions.map(async (subscription) => subscription.close(reason)));
691
+ };
692
+ const onRelayEvent = (event) => {
693
+ const task = handleRelayEvent(event);
694
+ if (options.trackIngressTask) options.trackIngressTask(task.then(() => ingress.waitForIdle()));
695
+ };
696
+ for (const relay of subscriptionRelays) {
697
+ let relayClosed = false;
698
+ let deadlineReached = false;
699
+ const deadlineTimer = setTimeout(() => {
700
+ deadlineTimers.delete(deadlineTimer);
701
+ deadlineReached = true;
702
+ settleBackfill(relay, "incomplete");
703
+ }, DEFAULT_EOSE_CONFIRM_DEADLINE_MS);
704
+ deadlineTimer.unref?.();
705
+ deadlineTimers.add(deadlineTimer);
706
+ subscriptions.push(pool.subscribeMany([relay], dmFilter, {
707
+ onevent: onRelayEvent,
708
+ oneose: () => {
709
+ queueMicrotask(() => {
710
+ if (!relayClosed && !deadlineReached) {
711
+ clearTimeout(deadlineTimer);
712
+ deadlineTimers.delete(deadlineTimer);
713
+ settleBackfill(relay, "confirmed");
714
+ }
715
+ });
716
+ },
717
+ onclose: (reasons) => {
718
+ relayClosed = true;
719
+ clearTimeout(deadlineTimer);
720
+ deadlineTimers.delete(deadlineTimer);
721
+ settleBackfill(relay, "incomplete");
722
+ if (!locallyClosing && !relayAbort.signal.aborted) {
723
+ const closeReasons = reasons.map(({ reason }) => reason);
724
+ options.onDisconnect?.(relay);
725
+ onError?.(/* @__PURE__ */ new Error(`Subscription closed: ${closeReasons.join(", ")}`), "subscription");
726
+ }
727
+ },
728
+ maxWait: 11e3,
729
+ abort: relayAbort.signal
730
+ }));
731
+ }
909
732
  } catch (error) {
910
733
  await Promise.allSettled([stopRelays("startup failed"), ingress.stop()]);
911
734
  throw error;
@@ -955,22 +778,12 @@ async function startNostrBus(options) {
955
778
  tags,
956
779
  created_at: Math.floor(Date.now() / 1e3)
957
780
  }, sk);
958
- const sortedRelays = healthTracker.getSortedRelays(relays);
781
+ const sortedRelays = relays.toSorted((left, right) => Number(right === preferredRelay) - Number(left === preferredRelay));
959
782
  let lastError;
960
783
  for (const relay of sortedRelays) {
961
784
  sendOptions?.assertDirectAdapterHandoff?.();
962
- const cb = circuitBreakers.get(relay);
963
- if (cb && !cb.canAttempt()) continue;
964
- const startTime = Date.now();
965
785
  const recordFailure = (err) => {
966
786
  lastError = err instanceof Error ? err : new Error(String(err));
967
- const latency = Date.now() - startTime;
968
- cb?.recordFailure();
969
- healthTracker.recordFailure(relay);
970
- metrics.emit("relay.error", 1, {
971
- relay,
972
- latency
973
- });
974
787
  onError?.(lastError, `publish to ${relay}`);
975
788
  };
976
789
  const connection = await pool.ensureRelay(relay, { connectionTimeout: pool.maxWaitForConnection }).catch((err) => {
@@ -989,9 +802,7 @@ async function startNostrBus(options) {
989
802
  initiated = true;
990
803
  return connection.publish(reply);
991
804
  });
992
- const latency = Date.now() - startTime;
993
- cb?.recordSuccess();
994
- healthTracker.recordSuccess(relay, latency);
805
+ preferredRelay = relay;
995
806
  return reply.id;
996
807
  } catch (err) {
997
808
  if (!initiated) throw err;
@@ -1008,8 +819,7 @@ async function startNostrBus(options) {
1008
819
  getProfileState
1009
820
  };
1010
821
  }
1011
- //#endregion
1012
- //#region extensions/nostr/src/gateway.ts
822
+ // extensions/nostr/src/gateway.ts
1013
823
  const activeBuses = /* @__PURE__ */ new Map();
1014
824
  function normalizeRelayLifecycleKey(relay) {
1015
825
  return new URL(relay).toString();
@@ -1033,6 +843,17 @@ function normalizeNostrSenderPubkey(value) {
1033
843
  return null;
1034
844
  }
1035
845
  }
846
+ function resolveAdmissionPubkeys(account) {
847
+ if (account.config.dmPolicy !== "allowlist" || !account.config.allowFrom?.length) return;
848
+ const pubkeys = [];
849
+ for (const entry of account.config.allowFrom) {
850
+ if (typeof entry !== "string") return;
851
+ const normalized = normalizeNostrAllowEntry(entry);
852
+ if (!normalized || !/^[0-9a-f]{64}$/.test(normalized)) return;
853
+ pubkeys.push(normalized);
854
+ }
855
+ return [...new Set(pubkeys)];
856
+ }
1036
857
  const nostrIngressIdentity = {
1037
858
  key: "nostr-pubkey",
1038
859
  normalizeEntry: normalizeNostrAllowEntry,
@@ -1103,6 +924,7 @@ async function startNostrGatewayAccount(ctx) {
1103
924
  privateKey: account.privateKey,
1104
925
  relays: account.relays,
1105
926
  authorizeSender,
927
+ admissionPubkeys: resolveAdmissionPubkeys(account),
1106
928
  onMessage: async (senderPubkey, text, reply, meta, lifecycle) => {
1107
929
  const resolvedAccess = await resolveInboundAccess(senderPubkey, text);
1108
930
  if (resolvedAccess.senderAccess.decision !== "allow") {
@@ -1173,11 +995,8 @@ async function startNostrGatewayAccount(ctx) {
1173
995
  onEose: (relays) => {
1174
996
  ctx.log?.debug?.(`[${account.accountId}] EOSE received from relays: ${relays}`);
1175
997
  },
1176
- onMetric: (event) => {
1177
- if (event.name.startsWith("event.rejected.")) ctx.log?.debug?.(`[${account.accountId}] Metric: ${event.name} ${JSON.stringify(event.labels)}`);
1178
- else if (event.name === "relay.circuit_breaker.open") ctx.log?.warn?.(`[${account.accountId}] Circuit breaker opened for relay: ${event.labels?.relay}`);
1179
- else if (event.name === "relay.circuit_breaker.close") ctx.log?.info?.(`[${account.accountId}] Circuit breaker closed for relay: ${event.labels?.relay}`);
1180
- else if (event.name === "relay.error") ctx.log?.debug?.(`[${account.accountId}] Relay error: ${event.labels?.relay}`);
998
+ onRejected: (reason) => {
999
+ ctx.log?.debug?.(`[${account.accountId}] Event rejected: ${reason}`);
1181
1000
  }
1182
1001
  });
1183
1002
  activeBuses.set(account.accountId, bus);
@@ -1204,8 +1023,10 @@ const nostrPairingTextAdapter = {
1204
1023
  }
1205
1024
  },
1206
1025
  notify: async ({ cfg, id, message, accountId }) => {
1207
- const bus = activeBuses.get(accountId ?? resolveDefaultNostrAccountId(cfg));
1208
- if (bus) await bus.sendDm(id, message);
1026
+ const aid = accountId ?? resolveDefaultNostrAccountId(cfg);
1027
+ const bus = activeBuses.get(aid);
1028
+ if (!bus) throw new Error(`Nostr bus not running for account ${aid}`);
1029
+ await bus.sendDm(id, message);
1209
1030
  }
1210
1031
  };
1211
1032
  const nostrOutboundAdapter = {
@@ -1241,10 +1062,21 @@ const nostrOutboundAdapter = {
1241
1062
  }
1242
1063
  };
1243
1064
  function getActiveNostrBuses() {
1244
- return new Map(activeBuses);
1065
+ return activeBuses;
1066
+ }
1067
+ // extensions/nostr/src/channel.ts
1068
+ const NOSTR_TARGET_HINT = "<npub|hex pubkey|nostr:npub...>";
1069
+ function stripNostrTargetPrefix(target) {
1070
+ return target.trim().replace(/^nostr:/i, "");
1071
+ }
1072
+ function normalizeNostrTarget(target) {
1073
+ const cleaned = stripNostrTargetPrefix(target);
1074
+ try {
1075
+ return normalizePubkey(cleaned);
1076
+ } catch {
1077
+ return target.trim();
1078
+ }
1245
1079
  }
1246
- //#endregion
1247
- //#region extensions/nostr/src/session-route.ts
1248
1080
  function resolveNostrOutboundSessionRoute(params) {
1249
1081
  const rawTarget = stripChannelTargetPrefix(params.target, "nostr");
1250
1082
  let target;
@@ -1268,28 +1100,6 @@ function resolveNostrOutboundSessionRoute(params) {
1268
1100
  to: `nostr:${target}`
1269
1101
  });
1270
1102
  }
1271
- //#endregion
1272
- //#region extensions/nostr/src/channel.ts
1273
- const NOSTR_TARGET_HINT = "<npub|hex pubkey|nostr:npub...>";
1274
- function stripNostrTargetPrefix(target) {
1275
- return target.trim().replace(/^nostr:/i, "");
1276
- }
1277
- function normalizeNostrTarget(target) {
1278
- const cleaned = stripNostrTargetPrefix(target);
1279
- try {
1280
- return normalizePubkey(cleaned);
1281
- } catch {
1282
- return target.trim();
1283
- }
1284
- }
1285
- function inferNostrTargetChatType(target) {
1286
- try {
1287
- normalizePubkey(stripNostrTargetPrefix(target));
1288
- return "direct";
1289
- } catch {
1290
- return;
1291
- }
1292
- }
1293
1103
  const resolveNostrDmPolicy = createScopedDmSecurityResolver({
1294
1104
  channelKey: "nostr",
1295
1105
  resolvePolicy: (account) => account.config.dmPolicy,
@@ -1354,7 +1164,14 @@ const nostrPlugin = createChatChannelPlugin({
1354
1164
  messaging: {
1355
1165
  targetPrefixes: ["nostr"],
1356
1166
  normalizeTarget: normalizeNostrTarget,
1357
- inferTargetChatType: ({ to }) => inferNostrTargetChatType(to),
1167
+ inferTargetChatType: ({ to }) => {
1168
+ try {
1169
+ normalizePubkey(stripNostrTargetPrefix(to));
1170
+ return "direct";
1171
+ } catch {
1172
+ return;
1173
+ }
1174
+ },
1358
1175
  targetResolver: {
1359
1176
  looksLikeId: (input, normalized) => {
1360
1177
  const trimmed = normalized?.trim() || stripNostrTargetPrefix(input);
@@ -1398,5 +1215,4 @@ async function getNostrProfileState(accountId = DEFAULT_ACCOUNT_ID) {
1398
1215
  if (!bus) return null;
1399
1216
  return bus.getProfileState();
1400
1217
  }
1401
- //#endregion
1402
1218
  export { getNostrRuntime as a, contentToProfile as i, nostrPlugin as n, setNostrRuntime as o, publishNostrProfile as r, getNostrProfileState as t };