@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.
- package/dist/.setup/{channel-B0EC4IOq.mjs → channel-DtlupG0V.mjs} +195 -379
- package/dist/.setup/{channel.setup-B2tWt-Ro.mjs → channel.setup-DeVyQy6t.mjs} +4 -6
- package/dist/.setup/{secret-contract-api-nVWula4c.mjs → secret-contract-api-DhkjtAQ4.mjs} +1 -2
- package/dist/.setup/{secret-contract-api-sFIFEwqO.mjs → secret-contract-api-KACe-wY3.mjs} +1 -1
- package/dist/.setup/{setup-adapter-DTqb2Hne.mjs → setup-adapter-CCRkU3LC.mjs} +4 -8
- package/dist/.setup/setup-plugin-api-Cc2r8u0U.mjs +2 -0
- package/dist/.setup/{setup-surface-CadI9603.mjs → setup-surface-fC0kex9d.mjs} +5 -9
- package/dist/.source-module-urls/434fb4e7afdaac23908221824ec325d8f61be72ba97af41567f2cb4ebe3ad38c.json +1 -1
- package/dist/api.js +24 -38
- package/dist/channel-plugin-api.js +1 -1
- package/dist/control-ui/049680efcde098838c4459d157e51b99515dceb24211e236f157fca0abbdb516/chunk-1.js +1 -0
- package/dist/control-ui/049680efcde098838c4459d157e51b99515dceb24211e236f157fca0abbdb516/index.js +1 -0
- package/dist/doctor-contract-api.js +1 -2
- package/dist/index.js +1 -2
- package/dist/openclaw.plugin.json +40 -0
- package/dist/secret-contract-api.js +1 -1
- package/dist/setup-api.js +1 -1
- package/dist/setup-entry.js +3 -4
- package/dist/setup-plugin-api.js +1 -1
- package/node_modules/@solidjs/web/README.md +25 -0
- package/node_modules/@solidjs/web/dist/server.dev.js +5070 -0
- package/node_modules/@solidjs/web/dist/server.js +4722 -0
- package/node_modules/@solidjs/web/dist/server.observe.js +4877 -0
- package/node_modules/@solidjs/web/dist/web.dev.js +2516 -0
- package/node_modules/@solidjs/web/dist/web.js +2204 -0
- package/node_modules/@solidjs/web/dist/web.observe.js +2255 -0
- package/node_modules/@solidjs/web/frames/dist/assets.js +92 -0
- package/node_modules/@solidjs/web/frames/dist/client.dev.js +2108 -0
- package/node_modules/@solidjs/web/frames/dist/client.js +1927 -0
- package/node_modules/@solidjs/web/frames/dist/client.observe.js +2041 -0
- package/node_modules/@solidjs/web/frames/dist/regions.js +171 -0
- package/node_modules/@solidjs/web/frames/dist/server.dev.js +2549 -0
- package/node_modules/@solidjs/web/frames/dist/server.js +2547 -0
- package/node_modules/@solidjs/web/frames/dist/server.observe.js +2548 -0
- package/node_modules/@solidjs/web/frames/dist/trace.js +45 -0
- package/node_modules/@solidjs/web/frames/dist/wire.js +594 -0
- package/node_modules/@solidjs/web/frames/package.json +7 -0
- package/node_modules/@solidjs/web/node_modules/seroval/LICENSE +7 -0
- package/node_modules/@solidjs/web/node_modules/seroval/README.md +117 -0
- package/node_modules/@solidjs/web/node_modules/seroval/dist/dev/index.cjs +3716 -0
- package/node_modules/@solidjs/web/node_modules/seroval/dist/dev/index.d.cts +820 -0
- package/node_modules/@solidjs/web/node_modules/seroval/dist/dev/index.d.ts +820 -0
- package/node_modules/@solidjs/web/node_modules/seroval/dist/dev/index.js +3669 -0
- package/node_modules/@solidjs/web/node_modules/seroval/dist/index.cjs +3700 -0
- package/node_modules/@solidjs/web/node_modules/seroval/dist/index.d.cts +820 -0
- package/node_modules/@solidjs/web/node_modules/seroval/dist/index.d.ts +820 -0
- package/node_modules/@solidjs/web/node_modules/seroval/dist/index.js +3653 -0
- package/node_modules/@solidjs/web/node_modules/seroval/package.json +77 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/LICENSE +7 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/README.md +50 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/index-BG4YWylA.d.cts +101 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/index.cjs +8 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/index.d.cts +2 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/index.d.ts +2 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/index.js +2 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/web-B1lHT9kZ.cjs +812 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/web.cjs +16 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/web.d.cts +2 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/web.d.ts +97 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/dev/web.js +693 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/index-BG4YWylA.d.cts +101 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/index.cjs +8 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/index.d.cts +2 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/index.d.ts +2 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/index.js +2 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/web-B1lHT9kZ.cjs +812 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/web.cjs +16 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/web.d.cts +2 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/web.d.ts +97 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/dist/web.js +693 -0
- package/node_modules/@solidjs/web/node_modules/seroval-plugins/package.json +81 -0
- package/node_modules/@solidjs/web/package.json +396 -0
- package/node_modules/@solidjs/web/performance-tracks/dist/performance-tracks.dev.js +679 -0
- package/node_modules/@solidjs/web/performance-tracks/dist/performance-tracks.js +6 -0
- package/node_modules/@solidjs/web/performance-tracks/dist/performance-tracks.observe.js +667 -0
- package/node_modules/@solidjs/web/performance-tracks/package.json +7 -0
- package/node_modules/@solidjs/web/performance-tracks/types/index.d.ts +69 -0
- package/node_modules/@solidjs/web/serialization/decode/package.json +7 -0
- package/node_modules/@solidjs/web/serialization/dist/decode.js +229 -0
- package/node_modules/@solidjs/web/serialization/dist/serialization.js +398 -0
- package/node_modules/@solidjs/web/serialization/package.json +7 -0
- package/node_modules/@solidjs/web/serialization/types/index.d.ts +109 -0
- package/node_modules/@solidjs/web/serialization/types/serializer-decode.d.ts +241 -0
- package/node_modules/@solidjs/web/server-functions/dist/client.dev.js +1462 -0
- package/node_modules/@solidjs/web/server-functions/dist/client.js +1305 -0
- package/node_modules/@solidjs/web/server-functions/dist/client.observe.js +1441 -0
- package/node_modules/@solidjs/web/server-functions/dist/rich-args.js +92 -0
- package/node_modules/@solidjs/web/server-functions/dist/server.dev.js +3619 -0
- package/node_modules/@solidjs/web/server-functions/dist/server.js +3526 -0
- package/node_modules/@solidjs/web/server-functions/dist/server.observe.js +3589 -0
- package/node_modules/@solidjs/web/server-functions/package.json +7 -0
- package/node_modules/@solidjs/web/server-functions/rich-args/package.json +7 -0
- package/node_modules/@solidjs/web/skills/server-components/SKILL.md +117 -0
- package/node_modules/@solidjs/web/storage/dist/storage.js +10 -0
- package/node_modules/@solidjs/web/storage/package.json +7 -0
- package/node_modules/@solidjs/web/storage/types/index.d.ts +28 -0
- package/node_modules/@solidjs/web/types/client.d.ts +391 -0
- package/node_modules/@solidjs/web/types/constants.d.ts +22 -0
- package/node_modules/@solidjs/web/types/cookies.d.ts +41 -0
- package/node_modules/@solidjs/web/types/diagnostics.d.ts +80 -0
- package/node_modules/@solidjs/web/types/frames/assets-tier.d.ts +78 -0
- package/node_modules/@solidjs/web/types/frames/client.d.ts +75 -0
- package/node_modules/@solidjs/web/types/frames/frame-client.d.ts +519 -0
- package/node_modules/@solidjs/web/types/frames/frame-container-plugin.d.ts +64 -0
- package/node_modules/@solidjs/web/types/frames/frame-morph.d.ts +29 -0
- package/node_modules/@solidjs/web/types/frames/frame-sink.d.ts +174 -0
- package/node_modules/@solidjs/web/types/frames/frame-transport.d.ts +301 -0
- package/node_modules/@solidjs/web/types/frames/regions-tier.d.ts +60 -0
- package/node_modules/@solidjs/web/types/frames/server.d.ts +52 -0
- package/node_modules/@solidjs/web/types/frames/trace-tier.d.ts +2 -0
- package/node_modules/@solidjs/web/types/frames/tree-rewrite.d.ts +39 -0
- package/node_modules/@solidjs/web/types/frames/wire-tier.d.ts +169 -0
- package/node_modules/@solidjs/web/types/head.d.ts +20 -0
- package/node_modules/@solidjs/web/types/index.d.ts +261 -0
- package/node_modules/@solidjs/web/types/index.server.d.ts +159 -0
- package/node_modules/@solidjs/web/types/jsx-properties.d.ts +93 -0
- package/node_modules/@solidjs/web/types/jsx.d.ts +4164 -0
- package/node_modules/@solidjs/web/types/observe.d.ts +535 -0
- package/node_modules/@solidjs/web/types/reconcile.d.ts +1 -0
- package/node_modules/@solidjs/web/types/render.d.ts +11 -0
- package/node_modules/@solidjs/web/types/request-error-hook.d.ts +5 -0
- package/node_modules/@solidjs/web/types/response.d.ts +122 -0
- package/node_modules/@solidjs/web/types/server-functions/argument-codec.d.ts +30 -0
- package/node_modules/@solidjs/web/types/server-functions/client.d.ts +277 -0
- package/node_modules/@solidjs/web/types/server-functions/flash.d.ts +36 -0
- package/node_modules/@solidjs/web/types/server-functions/registry.d.ts +105 -0
- package/node_modules/@solidjs/web/types/server-functions/rich-args.d.ts +1 -0
- package/node_modules/@solidjs/web/types/server-functions/server.d.ts +689 -0
- package/node_modules/@solidjs/web/types/server-functions/shared.d.ts +496 -0
- package/node_modules/@solidjs/web/types/server-functions/uploads.d.ts +50 -0
- package/node_modules/@solidjs/web/types/server-mock.d.ts +393 -0
- package/node_modules/@solidjs/web/types/server-observe.d.ts +86 -0
- package/node_modules/@solidjs/web/types/server.d.ts +693 -0
- package/node_modules/@solidjs/web/types/trace.d.ts +127 -0
- package/node_modules/solid-js/CHEATSHEET.md +750 -0
- package/node_modules/solid-js/README.md +77 -0
- package/node_modules/solid-js/diagnostics.json +605 -0
- package/node_modules/solid-js/dist/attribution.js +1 -0
- package/node_modules/solid-js/dist/container-trace.js +267 -0
- package/node_modules/solid-js/dist/internal.js +29 -0
- package/node_modules/solid-js/dist/refresh.dev.js +286 -0
- package/node_modules/solid-js/dist/refresh.js +35 -0
- package/node_modules/solid-js/dist/server.dev.js +3672 -0
- package/node_modules/solid-js/dist/server.js +3314 -0
- package/node_modules/solid-js/dist/server.observe.js +3500 -0
- package/node_modules/solid-js/dist/solid.dev.js +1740 -0
- package/node_modules/solid-js/dist/solid.js +1644 -0
- package/node_modules/solid-js/dist/solid.observe.js +1690 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/LICENSE +21 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/README.md +260 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/dev-shared.js +6136 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/dev.attribution.js +3481 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/dev.js +10245 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/affects-marks.js +86 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/affects.js +102 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/attribution.js +7 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/boundaries.js +622 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/action.js +174 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/async.js +792 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/attribution-costs.js +66 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/attribution-feedback.js +280 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/attribution-hooks.js +83 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/attribution-queries.js +43 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/attribution.js +3077 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/constants.js +241 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/context.js +63 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/core.js +1599 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/dev.js +394 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/effect.js +188 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/error-hooks.js +71 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/error.js +82 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/external.js +97 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/graph.js +162 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/heap.js +124 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/identities.js +62 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/invariants.js +12 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/lanes.js +752 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/owner.js +370 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/scheduler.js +1099 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/truth.js +45 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/core/verdict.js +408 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/deferred.js +187 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/flatten.js +79 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/from.js +248 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/index.js +69 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/map.js +589 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/reveal.js +212 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/signals.js +675 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/affects.js +142 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/edges.js +39 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/hooks.js +13 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/index.js +47 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/optimistic.js +617 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/projection.js +321 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/reconcile.js +275 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/store.js +2081 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/storePath.js +103 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/target.js +46 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/types.js +73 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/observe/store/utils.js +1058 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/affects-marks.js +86 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/affects.js +102 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/attribution.js +45 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/boundaries.js +606 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/action.js +164 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/async.js +763 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/attribution-hooks.js +3 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/constants.js +233 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/context.js +63 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/core.js +1546 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/dev.js +20 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/effect.js +173 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/error-hooks.js +71 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/error.js +82 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/external.js +97 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/graph.js +162 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/heap.js +124 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/identities.js +62 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/invariants.js +12 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/lanes.js +714 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/owner.js +365 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/scheduler.js +1054 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/truth.js +45 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/core/verdict.js +403 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/deferred.js +185 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/flatten.js +77 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/from.js +248 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/index.js +67 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/map.js +585 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/reveal.js +212 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/signals.js +669 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/affects.js +142 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/edges.js +39 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/hooks.js +13 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/index.js +45 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/optimistic.js +611 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/projection.js +307 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/reconcile.js +275 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/store.js +1974 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/storePath.js +103 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/target.js +43 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/types.js +73 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/prod/store/utils.js +1058 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/affects-marks.d.ts +14 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/affects.d.ts +28 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/attribution.d.ts +19 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/attribution.prod.d.ts +22 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/boundaries.d.ts +138 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/carved.d.ts +1 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/action.d.ts +70 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/async.d.ts +48 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/attribution-costs.d.ts +35 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/attribution-feedback.d.ts +133 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/attribution-hooks.d.ts +351 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/attribution-queries.d.ts +24 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/attribution.d.ts +916 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/constants.d.ts +226 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/context.d.ts +36 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/core.d.ts +365 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/dev.d.ts +568 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/effect.d.ts +30 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/error-hooks.d.ts +71 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/error.d.ts +64 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/external.d.ts +15 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/graph.d.ts +45 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/heap.d.ts +22 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/identities.d.ts +17 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/index.d.ts +17 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/invariants.d.ts +34 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/lanes.d.ts +64 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/owner.d.ts +142 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/scheduler.d.ts +397 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/truth.d.ts +16 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/types.d.ts +212 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/core/verdict.d.ts +37 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/deferred.d.ts +28 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/flatten.d.ts +8 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/from.d.ts +47 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/index.d.ts +32 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/map.d.ts +71 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/reveal.d.ts +19 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/signals.d.ts +738 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/affects.d.ts +12 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/edges.d.ts +9 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/hooks.d.ts +48 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/index.d.ts +46 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/optimistic.d.ts +24 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/projection.d.ts +19 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/reconcile.d.ts +3 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/store.d.ts +134 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/storePath.d.ts +58 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/target.d.ts +159 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/types.d.ts +98 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/dist/types/store/utils.d.ts +262 -0
- package/node_modules/solid-js/node_modules/@solidjs/signals/package.json +74 -0
- package/node_modules/solid-js/node_modules/csstype/LICENSE +19 -0
- package/node_modules/solid-js/node_modules/csstype/README.md +291 -0
- package/node_modules/solid-js/node_modules/csstype/index.d.ts +22569 -0
- package/node_modules/solid-js/node_modules/csstype/index.js.flow +6863 -0
- package/node_modules/solid-js/node_modules/csstype/package.json +70 -0
- package/node_modules/solid-js/node_modules/seroval/LICENSE +7 -0
- package/node_modules/solid-js/node_modules/seroval/README.md +117 -0
- package/node_modules/solid-js/node_modules/seroval/dist/dev/index.cjs +3716 -0
- package/node_modules/solid-js/node_modules/seroval/dist/dev/index.d.cts +820 -0
- package/node_modules/solid-js/node_modules/seroval/dist/dev/index.d.ts +820 -0
- package/node_modules/solid-js/node_modules/seroval/dist/dev/index.js +3669 -0
- package/node_modules/solid-js/node_modules/seroval/dist/index.cjs +3700 -0
- package/node_modules/solid-js/node_modules/seroval/dist/index.d.cts +820 -0
- package/node_modules/solid-js/node_modules/seroval/dist/index.d.ts +820 -0
- package/node_modules/solid-js/node_modules/seroval/dist/index.js +3653 -0
- package/node_modules/solid-js/node_modules/seroval/package.json +77 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/LICENSE +7 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/README.md +50 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/index-BG4YWylA.d.cts +101 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/index.cjs +8 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/index.d.cts +2 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/index.d.ts +2 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/index.js +2 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/web-B1lHT9kZ.cjs +812 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/web.cjs +16 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/web.d.cts +2 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/web.d.ts +97 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/dev/web.js +693 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/index-BG4YWylA.d.cts +101 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/index.cjs +8 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/index.d.cts +2 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/index.d.ts +2 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/index.js +2 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/web-B1lHT9kZ.cjs +812 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/web.cjs +16 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/web.d.cts +2 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/web.d.ts +97 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/dist/web.js +693 -0
- package/node_modules/solid-js/node_modules/seroval-plugins/package.json +81 -0
- package/node_modules/solid-js/package.json +142 -0
- package/node_modules/solid-js/skills/reactivity-diagnostics/SKILL.md +1023 -0
- package/node_modules/solid-js/skills/solid-2.0/SKILL.md +114 -0
- package/node_modules/solid-js/skills/solid-2.0-cheatsheet/SKILL.md +757 -0
- package/node_modules/solid-js/types/attribution.d.ts +11 -0
- package/node_modules/solid-js/types/client/component.d.ts +176 -0
- package/node_modules/solid-js/types/client/container-trace.d.ts +73 -0
- package/node_modules/solid-js/types/client/core.d.ts +186 -0
- package/node_modules/solid-js/types/client/dynamic.d.ts +55 -0
- package/node_modules/solid-js/types/client/flow.d.ts +323 -0
- package/node_modules/solid-js/types/client/hydration.d.ts +619 -0
- package/node_modules/solid-js/types/client/store-hydration.d.ts +1 -0
- package/node_modules/solid-js/types/console-footer.d.ts +2 -0
- package/node_modules/solid-js/types/from.d.ts +24 -0
- package/node_modules/solid-js/types/index.d.ts +35 -0
- package/node_modules/solid-js/types/internal.d.ts +190 -0
- package/node_modules/solid-js/types/recovery.d.ts +28 -0
- package/node_modules/solid-js/types/refresh/index.d.ts +76 -0
- package/node_modules/solid-js/types/server/component.d.ts +113 -0
- package/node_modules/solid-js/types/server/core.d.ts +48 -0
- package/node_modules/solid-js/types/server/diagnostics.d.ts +45 -0
- package/node_modules/solid-js/types/server/dynamic.d.ts +29 -0
- package/node_modules/solid-js/types/server/edges.d.ts +1 -0
- package/node_modules/solid-js/types/server/flow.d.ts +168 -0
- package/node_modules/solid-js/types/server/hydration.d.ts +52 -0
- package/node_modules/solid-js/types/server/index.d.ts +17 -0
- package/node_modules/solid-js/types/server/observe.d.ts +94 -0
- package/node_modules/solid-js/types/server/shared.d.ts +137 -0
- package/node_modules/solid-js/types/server/signals.d.ts +345 -0
- package/node_modules/solid-js/types/types.d.ts +15 -0
- package/node_modules/zod/package.json +1 -1
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +27 -0
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +7 -0
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +6 -0
- package/node_modules/zod/src/v4/core/compile.ts +9 -0
- package/node_modules/zod/src/v4/core/schemas.ts +35 -1
- package/node_modules/zod/src/v4/core/util.ts +13 -0
- package/node_modules/zod/src/v4/core/versions.ts +1 -1
- package/node_modules/zod/v4/core/compile.cjs +8 -0
- package/node_modules/zod/v4/core/compile.js +8 -0
- package/node_modules/zod/v4/core/schemas.cjs +30 -0
- package/node_modules/zod/v4/core/schemas.d.cts +3 -1
- package/node_modules/zod/v4/core/schemas.d.ts +3 -1
- package/node_modules/zod/v4/core/schemas.js +30 -0
- package/node_modules/zod/v4/core/util.cjs +15 -0
- package/node_modules/zod/v4/core/util.d.cts +2 -0
- package/node_modules/zod/v4/core/util.d.ts +2 -0
- package/node_modules/zod/v4/core/util.js +14 -0
- package/node_modules/zod/v4/core/versions.cjs +1 -1
- package/node_modules/zod/v4/core/versions.js +1 -1
- package/openclaw.plugin.json +11 -0
- package/package.json +17 -5
- 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-
|
|
2
|
-
import { l as validatePrivateKey, u as DEFAULT_RELAYS } from "./setup-adapter-
|
|
3
|
-
import { n as NostrProfileSchema, t as nostrSetupPlugin } from "./channel.setup-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
105
|
-
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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: (
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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: (
|
|
251
|
-
receivedAt,
|
|
252
|
-
rawEvent:
|
|
225
|
+
serialize: ({ payload }) => ({
|
|
226
|
+
receivedAt: payload.receivedAt,
|
|
227
|
+
rawEvent: payload.rawEvent
|
|
253
228
|
}),
|
|
254
|
-
deserialize: (body, { claim }) =>
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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:
|
|
442
|
+
recentEventIds: params.recentEventIds ?? []
|
|
560
443
|
};
|
|
561
|
-
await openNostrBusStateStore(
|
|
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(
|
|
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(
|
|
467
|
+
await openNostrProfileStateStore().register(normalizeNostrStateAccountId(params.accountId), payload);
|
|
585
468
|
}
|
|
586
|
-
|
|
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
|
|
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,
|
|
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(
|
|
684
|
-
|
|
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
|
|
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
|
-
|
|
527
|
+
onRejected?.("self_message");
|
|
737
528
|
return;
|
|
738
529
|
}
|
|
739
530
|
if (event.created_at > Math.floor(Date.now() / 1e3) + guardPolicy.maxFutureSkewSec) {
|
|
740
|
-
|
|
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
|
-
|
|
535
|
+
onRejected?.("wrong_kind");
|
|
745
536
|
return;
|
|
746
537
|
}
|
|
747
538
|
if (!event.tags.some((tag) => tag[0] === "p" && tag[1] === pk)) {
|
|
748
|
-
|
|
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"
|
|
756
|
-
|
|
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"
|
|
550
|
+
if (rejectIfRateLimited(globalRateLimiter, "global")) throw new Error(`Nostr event ${event.id} hit the global rate limit.`);
|
|
760
551
|
if (!verifyEvent(event)) {
|
|
761
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
630
|
+
onRejected?.("stale");
|
|
844
631
|
return;
|
|
845
632
|
}
|
|
633
|
+
if (admissionPubkeys && !admissionPubkeys.has(event.pubkey)) return;
|
|
846
634
|
try {
|
|
847
|
-
|
|
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
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1177
|
-
|
|
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
|
|
1208
|
-
|
|
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
|
|
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 }) =>
|
|
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 };
|