@fased/fased 0.1.62 → 0.1.64

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 (341) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +38 -30
  3. package/config/dependency-ownership.json +1 -1
  4. package/config/signer-policies/README.md +49 -0
  5. package/config/signer-policies/agent.json.template +32 -0
  6. package/config/signer-policies/mining.json.template +69 -0
  7. package/config/signer-policies/network.json.template +5 -0
  8. package/config/signer-policies/vault.json.template +70 -0
  9. package/config/signer-protocol-v2.json +76 -0
  10. package/config/typescript-noemit-baseline.json +680 -0
  11. package/dist/agents/auth-profiles/store.js +267 -31
  12. package/dist/agents/bash-tools.exec.js +10 -4
  13. package/dist/agents/current-model-catalog.js +3 -3
  14. package/dist/agents/memory-search.js +7 -1
  15. package/dist/agents/model-catalog-access.js +1 -2
  16. package/dist/agents/model-catalog-snapshot.js +1 -1
  17. package/dist/agents/model-catalog-source.js +1 -1
  18. package/dist/agents/model-metadata.js +1 -1
  19. package/dist/agents/model-selection.js +2 -28
  20. package/dist/agents/models-config.providers.js +6 -6
  21. package/dist/agents/pi-embedded-runner/compact.js +15 -7
  22. package/dist/agents/pi-embedded-runner/model.js +1 -1
  23. package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
  24. package/dist/agents/pi-embedded-runner/run.js +2 -0
  25. package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
  26. package/dist/agents/pi-tool-definition-adapter.js +16 -1
  27. package/dist/agents/pi-tools.js +2 -1
  28. package/dist/agents/sandbox/config.js +1 -1
  29. package/dist/agents/sandbox/context.js +27 -2
  30. package/dist/agents/skills/env-overrides.js +38 -28
  31. package/dist/agents/skills/trust.js +93 -0
  32. package/dist/agents/skills/workspace.js +128 -0
  33. package/dist/agents/skills-clawhub.js +36 -11
  34. package/dist/agents/skills-marketplace-scan.js +49 -0
  35. package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
  36. package/dist/agents/tools/mining-tool.js +1 -1
  37. package/dist/agents/tools/session-status-tool.js +1 -1
  38. package/dist/agents/tools/wallet-action-tool.js +172 -36
  39. package/dist/agents/tools/wallet-skill-policy.js +65 -23
  40. package/dist/agents/tools/wallet-tool.js +7 -11
  41. package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
  42. package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
  43. package/dist/auto-reply/reply/directive-handling.model.js +2 -1
  44. package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
  45. package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
  46. package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
  47. package/dist/auto-reply/reply/model-selection.js +7 -4
  48. package/dist/auto-reply/reply/session-reset-model.js +4 -4
  49. package/dist/brand.js +1 -1
  50. package/dist/build-info.json +3 -3
  51. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  52. package/dist/channel-web.js +2 -2
  53. package/dist/cli/gateway-cli/run.js +8 -0
  54. package/dist/cli/program/command-registry.js +1 -1
  55. package/dist/cli/program/register.onboard.js +2 -3
  56. package/dist/cli/program/register.wallet.js +16 -123
  57. package/dist/cli/providers-cli.js +1 -1
  58. package/dist/cli/sat-cli.js +129 -2
  59. package/dist/cli/update-cli/update-command.js +260 -11
  60. package/dist/commands/auth-choice.apply.api-providers.js +3 -3
  61. package/dist/commands/doctor-config-flow.js +1 -1
  62. package/dist/commands/doctor-legacy-config.js +2 -13
  63. package/dist/commands/model-picker.js +6 -6
  64. package/dist/commands/models/auth.js +1 -1
  65. package/dist/commands/onboard-auth.config-gateways.js +1 -1
  66. package/dist/commands/onboard-auth.credentials.js +32 -8
  67. package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
  68. package/dist/commands/onboard-non-interactive/local.js +5 -1
  69. package/dist/commands/wallet.js +568 -1911
  70. package/dist/config/config.js +2 -2
  71. package/dist/config/io.js +64 -2
  72. package/dist/config/schema.help.js +8 -7
  73. package/dist/config/schema.labels.js +5 -4
  74. package/dist/config/zod-schema.agent-runtime.js +1 -0
  75. package/dist/config/zod-schema.js +5 -0
  76. package/dist/control-ui/assets/{app-DLil9VO1.js → app-bR-fO5ty.js} +1511 -1555
  77. package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
  78. package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
  79. package/dist/control-ui/assets/{index-DdE_NIXo.js → index-ckCxHwjy.js} +3 -3
  80. package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-BgHFh0ei.js} +134 -114
  81. package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
  82. package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
  83. package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
  84. package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
  85. package/dist/control-ui/index.html +1 -1
  86. package/dist/control-ui/version.json +1 -1
  87. package/dist/daemon/systemd-system.js +56 -50
  88. package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
  89. package/dist/extensions/sat-mining/src/rpc-read.js +235 -67
  90. package/dist/extensions/sat-mining/src/sat-bond-layout.js +5 -2
  91. package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
  92. package/dist/extensions/sat-mining/src/solana-submit.js +1038 -397
  93. package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
  94. package/dist/federation/auto-connect.js +98 -8
  95. package/dist/federation/marketplace-capability-adapter.js +33 -7
  96. package/dist/federation/marketplace-delivery-outbox.js +196 -0
  97. package/dist/federation/marketplace-delivery.js +351 -215
  98. package/dist/federation/marketplace-direct-payment.js +272 -141
  99. package/dist/federation/marketplace-escrow.js +607 -249
  100. package/dist/federation/marketplace-settlement-ledger.js +352 -0
  101. package/dist/federation/offers.js +9 -7
  102. package/dist/federation/peer-auth-v2.js +529 -0
  103. package/dist/gateway/a2a-http.js +425 -96
  104. package/dist/gateway/a2a-settlement.js +259 -153
  105. package/dist/gateway/a2a-task-store.js +524 -0
  106. package/dist/gateway/auth.js +38 -2
  107. package/dist/gateway/config-reload.js +46 -33
  108. package/dist/gateway/durable-capacity.js +31 -0
  109. package/dist/gateway/federation-http.js +540 -135
  110. package/dist/gateway/federation-marketplace-run-store.js +397 -0
  111. package/dist/gateway/federation-marketplace.js +535 -230
  112. package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
  113. package/dist/gateway/security-path.js +1 -1
  114. package/dist/gateway/server-http.js +1084 -1205
  115. package/dist/gateway/server-methods/models.js +1 -1
  116. package/dist/gateway/server-methods/secrets.js +40 -0
  117. package/dist/gateway/server-methods.js +1 -2
  118. package/dist/gateway/server-reload-handlers.js +196 -66
  119. package/dist/gateway/server-runtime-config.js +1 -1
  120. package/dist/gateway/server-secrets-runtime.js +288 -0
  121. package/dist/gateway/server.impl.js +73 -42
  122. package/dist/gateway/sessions-patch.js +3 -5
  123. package/dist/index.js +4 -2
  124. package/dist/infra/fasedhub.js +64 -1
  125. package/dist/infra/local-source-paired-update.js +538 -0
  126. package/dist/infra/restart.js +41 -10
  127. package/dist/infra/update-runner.js +96 -0
  128. package/dist/light-update-status.js +11 -11
  129. package/dist/memory/backend-config.js +2 -1
  130. package/dist/memory/session-files.js +16 -2
  131. package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
  132. package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
  133. package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
  134. package/dist/plugin-sdk/{audio-preflight-Bwi2Oq03.js → audio-preflight-BYxAt775.js} +27 -27
  135. package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
  136. package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
  137. package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
  138. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  139. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  140. package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
  141. package/dist/plugin-sdk/{chunk-items-DzT4L4Ty.js → chunk-items-DIRHG2gJ.js} +1 -1
  142. package/dist/plugin-sdk/command-status.d.ts +2 -2
  143. package/dist/plugin-sdk/command-status.js +27 -27
  144. package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
  145. package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
  146. package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
  147. package/dist/plugin-sdk/{config-schema-BrkmtFxB.js → config-schema-BOT7kHb6.js} +6779 -3696
  148. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  149. package/dist/plugin-sdk/discord.d.ts +6 -6
  150. package/dist/plugin-sdk/discord.js +19 -19
  151. package/dist/plugin-sdk/file-lock.js +35 -4
  152. package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
  153. package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
  154. package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
  155. package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
  156. package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
  157. package/dist/plugin-sdk/index.d.ts +21 -39
  158. package/dist/plugin-sdk/index.js +29 -29
  159. package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
  160. package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
  161. package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
  162. package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
  163. package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
  164. package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
  165. package/dist/plugin-sdk/{monitor-M_ta2lMc.js → monitor-BCFDaqJ-.js} +31 -31
  166. package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-BgbjRiPM.js} +32 -32
  167. package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DFf87SMM.js} +27 -27
  168. package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
  169. package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
  170. package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
  171. package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-CS-9BHug.d.ts} +2 -2
  172. package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
  173. package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
  174. package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
  175. package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
  176. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  177. package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
  178. package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
  179. package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
  180. package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
  181. package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
  182. package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
  183. package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
  184. package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
  185. package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
  186. package/dist/plugin-sdk/sat-runtime.d.ts +549 -309
  187. package/dist/plugin-sdk/sat-runtime.js +29 -29
  188. package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
  189. package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
  190. package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
  191. package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
  192. package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
  193. package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
  194. package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
  195. package/dist/plugin-sdk/{slack-CxE1mfzj.js → slack-BUTt8cxK.js} +39 -39
  196. package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
  197. package/dist/plugin-sdk/slack.d.ts +6 -6
  198. package/dist/plugin-sdk/slack.js +9 -9
  199. package/dist/plugin-sdk/{sticker-cache-CGzGWu00.js → sticker-cache-D0wHVqjt.js} +3 -3
  200. package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
  201. package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
  202. package/dist/plugin-sdk/{telegram-actions-DaEcYQ8r.js → telegram-actions-CC_qN4v0.js} +30 -30
  203. package/dist/plugin-sdk/telegram.d.ts +6 -6
  204. package/dist/plugin-sdk/telegram.js +8 -8
  205. package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
  206. package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
  207. package/dist/plugin-sdk/tmp-fased-dir-xOTGlzBE.d.ts +486 -0
  208. package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-C3avNytw.d.ts} +3 -4
  209. package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
  210. package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-DWfbSAaM.d.ts} +2 -2
  211. package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
  212. package/dist/plugin-sdk/{web-CInY-lCv.js → web-BXsJ1vqe.js} +32 -32
  213. package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
  214. package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
  215. package/dist/plugin-sdk/whatsapp.d.ts +13 -13
  216. package/dist/plugin-sdk/whatsapp.js +12 -12
  217. package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
  218. package/dist/plugin-sdk/{zod-schema.providers-core-BEbNizPe.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +61 -61
  219. package/dist/providers/refresh.js +1 -1
  220. package/dist/providers/registry.js +1 -1
  221. package/dist/secrets/apply.js +1 -1
  222. package/dist/secrets/runtime.js +1 -1
  223. package/dist/wallet/external-submission-ledger.js +376 -0
  224. package/dist/wallet/legacy-embedded-keystore.js +40 -0
  225. package/dist/wallet/local-socket-signer-archive.js +30 -0
  226. package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
  227. package/dist/wallet/local-socket-signer-policy.js +166 -0
  228. package/dist/wallet/local-socket-signer-protocol.js +561 -118
  229. package/dist/wallet/native-signer-wallet-id.js +25 -0
  230. package/dist/wallet/providers/alchemy-adapter.js +3 -0
  231. package/dist/wallet/providers/local-socket-signer-adapter.js +380 -105
  232. package/dist/wallet/providers/turnkey-adapter.js +292 -34
  233. package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
  234. package/dist/wallet/signer-network-admin.js +184 -0
  235. package/dist/wallet/signer-protocol-v2.generated.js +90 -0
  236. package/dist/wallet/solana-bond-signing.js +157 -69
  237. package/dist/wallet/solana-reviewed-transaction.js +375 -0
  238. package/dist/wallet/solana-swap.js +520 -64
  239. package/dist/wallet/solana-transaction-inspection.js +106 -4
  240. package/dist/wallet/solana-trigger.js +658 -320
  241. package/dist/wallet/turnkey-reviewed-state.js +370 -0
  242. package/dist/wallet/wallet-approval-auth.js +17 -28
  243. package/dist/wallet/wallet-atomic-state.js +53 -0
  244. package/dist/wallet/wallet-canary.js +0 -1
  245. package/dist/wallet/wallet-inbound-events.js +16 -11
  246. package/dist/wallet/wallet-policy-simulation.js +1 -1
  247. package/dist/wallet/wallet-policy.js +90 -36
  248. package/dist/wallet/wallet-provider-capabilities.js +28 -4
  249. package/dist/wallet/wallet-provider-registry.js +57 -44
  250. package/dist/wallet/wallet-provider-resolver.js +62 -63
  251. package/dist/wallet/wallet-runtime-config.js +28 -41
  252. package/dist/wallet/wallet-secrets-store.js +22 -0
  253. package/dist/wallet/wallet-send-approvals.js +1891 -589
  254. package/dist/wallet/wallet-send-execution-ledger.js +292 -0
  255. package/dist/wallet/wallet-settlement-links.js +14 -13
  256. package/dist/wallet/wallet-standard-review.js +353 -0
  257. package/dist/wallet/wallet-status.js +0 -9
  258. package/dist/wallet/wallet-task-ledger.js +16 -2
  259. package/dist/web/auto-reply/heartbeat-runner.js +1 -1
  260. package/dist/web/auto-reply/monitor.js +2 -2
  261. package/dist/wizard/host-security-capability.js +14 -23
  262. package/dist/wizard/onboarding.finalize.js +63 -184
  263. package/dist/wizard/onboarding.host-security.js +117 -1367
  264. package/dist/wizard/onboarding.js +172 -217
  265. package/dist/wizard/onboarding.wallet.js +232 -785
  266. package/extensions/acpx/package.json +1 -1
  267. package/extensions/bluebubbles/package.json +1 -1
  268. package/extensions/copilot-proxy/package.json +1 -1
  269. package/extensions/diagnostics-otel/package.json +1 -1
  270. package/extensions/fased-federation/package.json +1 -1
  271. package/extensions/google-gemini-cli-auth/package.json +1 -1
  272. package/extensions/imessage/package.json +1 -1
  273. package/extensions/irc/package.json +1 -1
  274. package/extensions/line/package.json +1 -1
  275. package/extensions/llm-task/package.json +1 -1
  276. package/extensions/lobster/package.json +1 -1
  277. package/extensions/matrix/CHANGELOG.md +12 -0
  278. package/extensions/matrix/package.json +1 -1
  279. package/extensions/mattermost/package.json +1 -1
  280. package/extensions/memory-core/package.json +2 -2
  281. package/extensions/memory-lancedb/package.json +1 -1
  282. package/extensions/minimax-portal-auth/package.json +1 -1
  283. package/extensions/msteams/CHANGELOG.md +12 -0
  284. package/extensions/msteams/package.json +1 -1
  285. package/extensions/nextcloud-talk/package.json +1 -1
  286. package/extensions/nostr/CHANGELOG.md +12 -0
  287. package/extensions/nostr/package.json +1 -1
  288. package/extensions/open-prose/package.json +1 -1
  289. package/extensions/sat-mining/index.ts +498 -153
  290. package/extensions/sat-mining/package.json +1 -1
  291. package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
  292. package/extensions/sat-mining/src/audit-store.ts +50 -5
  293. package/extensions/sat-mining/src/claim-service.ts +85 -14
  294. package/extensions/sat-mining/src/config.ts +9 -0
  295. package/extensions/sat-mining/src/cycle-progress.ts +16 -8
  296. package/extensions/sat-mining/src/epoch-service.ts +9 -5
  297. package/extensions/sat-mining/src/gateway-runner.ts +21 -1
  298. package/extensions/sat-mining/src/protocol-contract.ts +45 -1
  299. package/extensions/sat-mining/src/recovery-service.ts +312 -0
  300. package/extensions/sat-mining/src/round-watcher.ts +391 -81
  301. package/extensions/sat-mining/src/rpc-read.ts +330 -89
  302. package/extensions/sat-mining/src/runtime.ts +14 -0
  303. package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
  304. package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
  305. package/extensions/sat-mining/src/solana-submit.ts +1199 -428
  306. package/extensions/sat-mining/src/submission-ledger.ts +433 -0
  307. package/extensions/signal/package.json +1 -1
  308. package/extensions/synology-chat/package.json +1 -1
  309. package/extensions/tlon/package.json +1 -1
  310. package/extensions/twitch/CHANGELOG.md +12 -0
  311. package/extensions/twitch/package.json +1 -1
  312. package/extensions/voice-call/CHANGELOG.md +12 -0
  313. package/extensions/voice-call/package.json +1 -1
  314. package/extensions/zalo/CHANGELOG.md +12 -0
  315. package/extensions/zalo/package.json +1 -1
  316. package/extensions/zalouser/CHANGELOG.md +12 -0
  317. package/extensions/zalouser/package.json +1 -1
  318. package/install.sh +4955 -0
  319. package/package.json +23 -5
  320. package/scripts/fased-host-updater.mjs +1421 -0
  321. package/scripts/fased-host-updaterctl.mjs +186 -0
  322. package/scripts/fased-managed-service.sh +36 -0
  323. package/scripts/fased-managed-updater.mjs +3065 -156
  324. package/scripts/fased-signer-enroll-hosting.sh +275 -0
  325. package/scripts/fased-signer-network-hosting.sh +143 -0
  326. package/scripts/fased-signer-owner-policy.mjs +1430 -0
  327. package/scripts/fased-signer-policy-hosting.sh +50 -0
  328. package/scripts/fased-signer-policy-local.sh +26 -0
  329. package/scripts/hosted-release-manifest.mjs +185 -0
  330. package/scripts/install-fased-signerd.sh +183 -108
  331. package/scripts/install-managed-runtime.mjs +212 -10
  332. package/scripts/managed-runtime-layout.mjs +75 -3
  333. package/scripts/migrate-hosted-signer-v2.mjs +58 -0
  334. package/scripts/start-managed.sh +169 -360
  335. package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
  336. package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
  337. package/dist/wallet/local-socket-signer-broker.js +0 -224
  338. package/dist/wallet/local-socket-signer-custody.js +0 -42
  339. package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
  340. package/dist/wallet/providers/privy-adapter.js +0 -80
  341. package/dist/wallet/wallet-custody.js +0 -1836
@@ -2,6 +2,7 @@ import { ensureWalletStateDir, resolveWalletRuntimeConfig } from "./wallet-runti
2
2
  import { readWalletProviderRegistry, resolveWalletUserRole } from "./wallet-provider-registry.js";
3
3
  import { assertValidSolanaAddress } from "./solana-address.js";
4
4
  import { tryResolveSatRuntimeIds } from "../config/sat-runtime-ids.js";
5
+ import { serializeWalletState, writeWalletStateFileAtomically } from "./wallet-atomic-state.js";
5
6
  import syncFs from "node:fs";
6
7
  import path from "node:path";
7
8
 
@@ -44,11 +45,28 @@ function normalizeWalletUsageBucket(raw) {
44
45
  return null;
45
46
  }
46
47
  const value = raw;
48
+ if (!isNonNegativeIntegerString(value.solanaSpent)) {
49
+ return null;
50
+ }
51
+ if (!value.solanaTokenSpent || typeof value.solanaTokenSpent !== "object" || Array.isArray(value.solanaTokenSpent)) {
52
+ return null;
53
+ }
54
+ const solanaTokenSpent = {};
55
+ for (const [mintRaw, spent] of Object.entries(value.solanaTokenSpent)) {
56
+ const mint = mintRaw.trim();
57
+ if (!mint || !isNonNegativeIntegerString(spent)) {
58
+ return null;
59
+ }
60
+ solanaTokenSpent[mint] = spent;
61
+ }
47
62
  return {
48
- solanaSpent: typeof value.solanaSpent === "string" ? value.solanaSpent : "0",
49
- solanaTokenSpent: value.solanaTokenSpent && typeof value.solanaTokenSpent === "object" ? Object.fromEntries(Object.entries(value.solanaTokenSpent).map(([mint, spent]) => [mint.trim(), typeof spent === "string" ? spent : "0"]).filter(([mint]) => Boolean(mint))) : {}
63
+ solanaSpent: value.solanaSpent,
64
+ solanaTokenSpent
50
65
  };
51
66
  }
67
+ function isNonNegativeIntegerString(value) {
68
+ return typeof value === "string" && /^\d+$/.test(value);
69
+ }
52
70
  function loadLedger(paths) {
53
71
  const fallback = defaultWalletUsageLedger();
54
72
  if (!syncFs.existsSync(paths.dailyUsagePath)) {
@@ -58,12 +76,15 @@ function loadLedger(paths) {
58
76
  const raw = syncFs.readFileSync(paths.dailyUsagePath, "utf8");
59
77
  const parsed = JSON.parse(raw);
60
78
  if (parsed && parsed.version === 2 && typeof parsed.date === "string") {
61
- const walletsRaw = parsed.wallets && typeof parsed.wallets === "object" && !Array.isArray(parsed.wallets) ? parsed.wallets : {};
79
+ if (!parsed.wallets || typeof parsed.wallets !== "object" || Array.isArray(parsed.wallets)) {
80
+ throw new Error("wallet usage ledger wallets must be an object");
81
+ }
82
+ const walletsRaw = parsed.wallets;
62
83
  const wallets = {};
63
84
  for (const [walletId, bucketRaw] of Object.entries(walletsRaw)) {
64
85
  const bucket = normalizeWalletUsageBucket(bucketRaw);
65
86
  if (!walletId.trim() || !bucket) {
66
- continue;
87
+ throw new Error(`wallet usage ledger contains an invalid bucket for ${walletId || "?"}`);
67
88
  }
68
89
  wallets[walletId.trim()] = bucket;
69
90
  }
@@ -73,24 +94,23 @@ function loadLedger(paths) {
73
94
  wallets
74
95
  };
75
96
  }
76
- if (parsed && parsed.version === 1) {
97
+ if (parsed && parsed.version === 1 && typeof parsed.date === "string" && isNonNegativeIntegerString(parsed.solanaSpent)) {
77
98
  return {
78
99
  version: 2,
79
- date: typeof parsed.date === "string" ? parsed.date : fallback.date,
100
+ date: parsed.date,
80
101
  wallets: { [LEDGER_LEGACY_GLOBAL_BUCKET_ID]: {
81
- solanaSpent: typeof parsed.solanaSpent === "string" ? parsed.solanaSpent : "0",
102
+ solanaSpent: parsed.solanaSpent,
82
103
  solanaTokenSpent: {}
83
104
  } }
84
105
  };
85
106
  }
86
- } catch {}
87
- return fallback;
107
+ throw new Error("wallet usage ledger has an unsupported shape");
108
+ } catch (error) {
109
+ throw new Error("wallet usage ledger is unreadable; refusing to reset spend counters", { cause: error });
110
+ }
88
111
  }
89
112
  function writeLedger(paths, ledger) {
90
- syncFs.writeFileSync(paths.dailyUsagePath, `${JSON.stringify(ledger, null, 2)}\n`, { mode: 384 });
91
- try {
92
- syncFs.chmodSync(paths.dailyUsagePath, 384);
93
- } catch {}
113
+ writeWalletStateFileAtomically(paths.dailyUsagePath, serializeWalletState(ledger));
94
114
  }
95
115
  function resolveWalletUsageBucket(ledger, walletId) {
96
116
  const normalizedWalletId = walletId?.trim() || DEFAULT_EFFECTIVE_WALLET_ID;
@@ -294,7 +314,13 @@ function resolveWalletRoleForId(params) {
294
314
  if (walletId && storedPurpose === "mining") {
295
315
  return "mining";
296
316
  }
297
- if (walletId && (registry.defaultWalletId && walletId === registry.defaultWalletId || storedPurpose === "agent")) {
317
+ if (walletId && storedPurpose === "vault") {
318
+ return "vault";
319
+ }
320
+ if (walletId && storedPurpose === "agent") {
321
+ return "agent";
322
+ }
323
+ if (walletId && registry.defaultWalletId && walletId === registry.defaultWalletId) {
298
324
  return "agent";
299
325
  }
300
326
  return "vault";
@@ -351,14 +377,17 @@ function readWalletPolicyState(env = process.env) {
351
377
  const raw = syncFs.readFileSync(statePath, "utf8");
352
378
  const parsed = JSON.parse(raw);
353
379
  if (parsed.version !== 1) {
354
- return fallback;
380
+ throw new Error("wallet policy state version is unsupported");
355
381
  }
356
- const walletsRaw = parsed.wallets && typeof parsed.wallets === "object" && !Array.isArray(parsed.wallets) ? parsed.wallets : {};
382
+ if (!parsed.wallets || typeof parsed.wallets !== "object" || Array.isArray(parsed.wallets)) {
383
+ throw new Error("wallet policy wallets must be an object");
384
+ }
385
+ const walletsRaw = parsed.wallets;
357
386
  const wallets = {};
358
387
  for (const [walletId, recordRaw] of Object.entries(walletsRaw)) {
359
388
  const record = normalizeStoredWalletPolicyRecord(recordRaw);
360
- if (!walletId.trim() || !record) {
361
- continue;
389
+ if (!walletId.trim() || !record || record.walletId !== walletId.trim()) {
390
+ throw new Error(`wallet policy contains an invalid record for ${walletId || "?"}`);
362
391
  }
363
392
  wallets[walletId.trim()] = record;
364
393
  }
@@ -367,17 +396,14 @@ function readWalletPolicyState(env = process.env) {
367
396
  updatedAt: typeof parsed.updatedAt === "string" ? parsed.updatedAt : fallback.updatedAt,
368
397
  wallets
369
398
  };
370
- } catch {
371
- return fallback;
399
+ } catch (error) {
400
+ throw new Error("wallet policy state is unreadable; refusing to replace persisted policy", { cause: error });
372
401
  }
373
402
  }
374
403
  function writeWalletPolicyState(state, env = process.env) {
375
404
  const paths = ensureWalletStateDir(env);
376
405
  const statePath = resolveWalletPolicyStatePath(paths);
377
- syncFs.writeFileSync(statePath, `${JSON.stringify(state, null, 2)}\n`, { mode: 384 });
378
- try {
379
- syncFs.chmodSync(statePath, 384);
380
- } catch {}
406
+ writeWalletStateFileAtomically(statePath, serializeWalletState(state));
381
407
  }
382
408
  function buildResolvedPolicyFromDefaults(defaults) {
383
409
  return {
@@ -573,7 +599,7 @@ function applyWalletPolicyConfig(params) {
573
599
  const profile = resolveWalletRolePolicyProfile(role, env);
574
600
  return cloneWalletConfigWithPolicy(params.config, buildResolvedPolicyFromDefaults(profile.defaults));
575
601
  }
576
- function upsertWalletPolicyConfig(params) {
602
+ function prepareWalletPolicyConfigUpdate(params) {
577
603
  const env = params.env ?? process.env;
578
604
  const walletId = params.walletId.trim();
579
605
  if (!walletId) {
@@ -623,20 +649,41 @@ function upsertWalletPolicyConfig(params) {
623
649
  patch: params.patch.recurringTransfer,
624
650
  role
625
651
  }) : existingRecord?.recurringTransfer;
626
- state.wallets[walletId] = buildStoredPolicyRecord({
652
+ const preparedAt = nowIso();
653
+ const nextRecord = buildStoredPolicyRecord({
627
654
  walletId,
628
655
  role,
629
656
  policy: nextPolicy,
630
- recurringTransfer
657
+ recurringTransfer,
658
+ updatedAt: preparedAt
631
659
  });
632
- state.updatedAt = nowIso();
633
- writeWalletPolicyState(state, env);
634
660
  return {
635
661
  walletId,
636
662
  role,
637
- config: cloneWalletConfigWithPolicy(base, nextPolicy)
663
+ config: cloneWalletConfigWithPolicy(base, nextPolicy),
664
+ expectedRecordJson: JSON.stringify(existingRecord ?? null),
665
+ nextRecord,
666
+ preparedAt
667
+ };
668
+ }
669
+ function commitWalletPolicyConfigUpdate(prepared, env = process.env) {
670
+ const state = readWalletPolicyState(env);
671
+ if (JSON.stringify(state.wallets[prepared.walletId] ?? null) !== prepared.expectedRecordJson) {
672
+ throw new Error("wallet policy changed concurrently; reload the acknowledged signer policy");
673
+ }
674
+ state.wallets[prepared.walletId] = prepared.nextRecord;
675
+ state.updatedAt = prepared.preparedAt;
676
+ writeWalletPolicyState(state, env);
677
+ return {
678
+ walletId: prepared.walletId,
679
+ role: prepared.role,
680
+ config: prepared.config
638
681
  };
639
682
  }
683
+ function upsertWalletPolicyConfig(params) {
684
+ const env = params.env ?? process.env;
685
+ return commitWalletPolicyConfigUpdate(prepareWalletPolicyConfigUpdate(params), env);
686
+ }
640
687
  function resolveWalletRolePolicyProfile(role, env = process.env) {
641
688
  switch (role) {
642
689
  case "mining": return {
@@ -659,8 +706,8 @@ function resolveWalletRolePolicyProfile(role, env = process.env) {
659
706
  label: "Agent",
660
707
  summary: "Hot Agent wallet for reviewed payments, Fased Network payment evidence, and approved skill actions. Keep explicit caps and narrow token / contract routes.",
661
708
  defaults: {
662
- capsEnabled: false,
663
- directSigning: true,
709
+ capsEnabled: true,
710
+ directSigning: false,
664
711
  skillsEnabled: false,
665
712
  solana: {
666
713
  maxPerTx: DEFAULT_POLICY_CAPS.solana.maxPerTx,
@@ -673,9 +720,9 @@ function resolveWalletRolePolicyProfile(role, env = process.env) {
673
720
  default: return {
674
721
  role: "vault",
675
722
  label: "Vault",
676
- summary: "Manual-first Vault wallet for storage and federation bond assignment. No background agent execution by default; use split-key/passkey lock for custody.",
723
+ summary: "Manual-first Vault wallet for storage and federation bond assignment. No background agent execution by default; reviewed sends require signer-owned WebAuthn authorization.",
677
724
  defaults: {
678
- capsEnabled: false,
725
+ capsEnabled: true,
679
726
  directSigning: false,
680
727
  skillsEnabled: false,
681
728
  solana: {
@@ -769,7 +816,14 @@ function validateWalletTxPolicy(params) {
769
816
  }
770
817
  const capsEnabled = params.config.policy.capsEnabled;
771
818
  const allowPrograms = params.config.policy.solana.allowPrograms;
772
- if (params.program && allowPrograms.length > 0) {
819
+ if (params.program) {
820
+ if (allowPrograms.length === 0) {
821
+ return {
822
+ ok: false,
823
+ code: "wallet_program_allowlist_required",
824
+ message: "program execution requires an explicit non-empty allowlist"
825
+ };
826
+ }
773
827
  const normalized = params.program.trim();
774
828
  const allowed = allowPrograms.includes(normalized);
775
829
  if (!allowed) {
@@ -962,4 +1016,4 @@ function resolveWalletRecurringTransferPolicy(params) {
962
1016
  }
963
1017
 
964
1018
  //#endregion
965
- export { applyWalletPolicyConfig, checkWalletDailyCap, enforceWalletDailyCap, isWalletToolAllowed, resolveWalletPolicyConfig, resolveWalletRecurringTransferPolicy, resolveWalletRoleForId, resolveWalletRolePolicyProfile, upsertWalletPolicyConfig, validateWalletTxPolicy };
1019
+ export { applyWalletPolicyConfig, checkWalletDailyCap, commitWalletPolicyConfigUpdate, enforceWalletDailyCap, isWalletToolAllowed, prepareWalletPolicyConfigUpdate, resolveWalletPolicyConfig, resolveWalletRecurringTransferPolicy, resolveWalletRoleForId, resolveWalletRolePolicyProfile, upsertWalletPolicyConfig, validateWalletTxPolicy };
@@ -6,7 +6,12 @@ const FULL_CHAIN_OPS = {
6
6
  send: true
7
7
  };
8
8
  const PROVIDER_CHAIN_OPERATION_PROFILES = {
9
- "embedded-keystore": { solana: { ...FULL_CHAIN_OPS } },
9
+ "embedded-keystore": { solana: {
10
+ receiveAddress: false,
11
+ getBalance: false,
12
+ prepare: false,
13
+ send: false
14
+ } },
10
15
  "local-socket-signer": { solana: { ...FULL_CHAIN_OPS } },
11
16
  alchemy: { solana: {
12
17
  receiveAddress: true,
@@ -15,7 +20,18 @@ const PROVIDER_CHAIN_OPERATION_PROFILES = {
15
20
  send: false
16
21
  } },
17
22
  turnkey: { solana: { ...FULL_CHAIN_OPS } },
18
- privy: { solana: { ...FULL_CHAIN_OPS } }
23
+ privy: { solana: {
24
+ receiveAddress: true,
25
+ getBalance: false,
26
+ prepare: false,
27
+ send: false
28
+ } },
29
+ "wallet-standard": { solana: {
30
+ receiveAddress: true,
31
+ getBalance: true,
32
+ prepare: false,
33
+ send: false
34
+ } }
19
35
  };
20
36
  const KNOWN_RPC_PROVIDER_PROFILES = {
21
37
  alchemy: {
@@ -76,10 +92,12 @@ function resolveIntegrationMode(providerId) {
76
92
  case "local-socket-signer":
77
93
  case "alchemy":
78
94
  case "turnkey":
95
+ case "wallet-standard":
79
96
  case "privy": return "native";
80
97
  }
81
98
  }
82
99
  function buildWalletProviderCapabilityMatrix(adapter) {
100
+ const signingLocation = adapter.capabilities.signingLocation ?? "unavailable";
83
101
  const chains = { solana: emptyChainOps() };
84
102
  const defaultChainFlags = {
85
103
  receiveAddress: true,
@@ -105,8 +123,14 @@ function buildWalletProviderCapabilityMatrix(adapter) {
105
123
  providerId: adapter.id,
106
124
  supportedChains: [...adapter.capabilities.supportedChains],
107
125
  integrationMode: resolveIntegrationMode(adapter.id),
126
+ signingLocation,
127
+ signing: {
128
+ transaction: adapter.capabilities.supportsSignTransaction === true,
129
+ message: adapter.capabilities.supportsSignMessage === true,
130
+ interactiveSend: signingLocation === "browser" && adapter.capabilities.supportsSignTransaction === true
131
+ },
108
132
  operations: {
109
- createWallet: adapter.capabilities.supportsCreateWallet,
133
+ createWallet: adapter.capabilities.supportsCreateWallet || adapter.id === "local-socket-signer",
110
134
  receiveAddress: receiveAny,
111
135
  getBalance: balanceAny,
112
136
  prepare: prepareAny,
@@ -117,7 +141,7 @@ function buildWalletProviderCapabilityMatrix(adapter) {
117
141
  resetKeys: adapter.capabilities.supportsResetKeys
118
142
  },
119
143
  chains,
120
- requiresCredentials: adapter.id !== "embedded-keystore" && adapter.id !== "local-socket-signer",
144
+ requiresCredentials: adapter.id !== "local-socket-signer" && adapter.id !== "wallet-standard",
121
145
  requiresRpcSecret: false
122
146
  };
123
147
  }
@@ -1,4 +1,5 @@
1
1
  import { resolveStateDir } from "../config/paths.js";
2
+ import { throwLegacyEmbeddedKeystoreMigrationRequired } from "./legacy-embedded-keystore.js";
2
3
  import { ensureWalletStateDir } from "./wallet-runtime-config.js";
3
4
  import syncFs from "node:fs";
4
5
  import path from "node:path";
@@ -8,10 +9,14 @@ import { randomBytes } from "node:crypto";
8
9
  const REGISTRY_FILE_MODE = 384;
9
10
  const PROVIDER_REGISTRY_FILENAME = "provider-registry.v1.json";
10
11
  const WALLET_PROVIDER_IDS = [
11
- "embedded-keystore",
12
12
  "local-socket-signer",
13
13
  "alchemy",
14
14
  "turnkey",
15
+ "wallet-standard"
16
+ ];
17
+ const WALLET_PROVIDER_REGISTRY_IDS = [
18
+ "embedded-keystore",
19
+ ...WALLET_PROVIDER_IDS,
15
20
  "privy"
16
21
  ];
17
22
  function normalizeWalletUserRole(value) {
@@ -54,6 +59,7 @@ function normalizeProviderId(value) {
54
59
  case "local-socket-signer":
55
60
  case "alchemy":
56
61
  case "turnkey":
62
+ case "wallet-standard":
57
63
  case "privy": return raw;
58
64
  default: return null;
59
65
  }
@@ -238,34 +244,18 @@ function normalizeWalletEntry(raw) {
238
244
  updatedAt
239
245
  };
240
246
  }
241
- function isLegacySelfHostedWallet(wallet) {
242
- if (wallet.providerId !== "embedded-keystore") {
243
- return false;
244
- }
245
- const metadata = wallet.metadata && typeof wallet.metadata === "object" && !Array.isArray(wallet.metadata) ? wallet.metadata : undefined;
246
- if (metadata?.selfHosted === true) {
247
- return true;
248
- }
249
- if (/^solana-\d+$/i.test(wallet.id)) {
250
- return true;
251
- }
252
- if (/^solana\s+\d+$/i.test(wallet.name)) {
253
- return true;
254
- }
255
- return false;
256
- }
257
247
  function makeDefaultRegistry() {
258
248
  const ts = nowIso();
259
249
  return {
260
250
  version: 1,
261
251
  providers: {
262
252
  "embedded-keystore": {
263
- enabled: true,
253
+ enabled: false,
264
254
  updatedAt: ts,
265
- label: "Self-hosted"
255
+ label: "Legacy embedded keystore (migration required)"
266
256
  },
267
257
  "local-socket-signer": {
268
- enabled: false,
258
+ enabled: true,
269
259
  updatedAt: ts,
270
260
  label: "Local signer"
271
261
  },
@@ -274,13 +264,19 @@ function makeDefaultRegistry() {
274
264
  updatedAt: ts
275
265
  },
276
266
  turnkey: {
267
+ enabled: false,
268
+ updatedAt: ts,
269
+ label: "Turnkey (policy-managed)"
270
+ },
271
+ "wallet-standard": {
277
272
  enabled: true,
278
273
  updatedAt: ts,
279
- label: "Turnkey (recommended hosted)"
274
+ label: "Wallet Standard (verify hardware on device)"
280
275
  },
281
276
  privy: {
282
- enabled: true,
283
- updatedAt: ts
277
+ enabled: false,
278
+ updatedAt: ts,
279
+ label: "Privy (integration unavailable)"
284
280
  }
285
281
  },
286
282
  wallets: [],
@@ -299,8 +295,15 @@ function normalizeRegistry(raw) {
299
295
  let changed = false;
300
296
  const value = raw;
301
297
  const providersRaw = value.providers && typeof value.providers === "object" && !Array.isArray(value.providers) ? value.providers : {};
302
- const providers = { ...defaults.providers };
303
- for (const providerId of WALLET_PROVIDER_IDS) {
298
+ const providers = {
299
+ "embedded-keystore": defaults.providers["embedded-keystore"],
300
+ "local-socket-signer": defaults.providers["local-socket-signer"],
301
+ alchemy: defaults.providers.alchemy,
302
+ turnkey: defaults.providers.turnkey,
303
+ "wallet-standard": defaults.providers["wallet-standard"],
304
+ privy: defaults.providers.privy
305
+ };
306
+ for (const providerId of WALLET_PROVIDER_REGISTRY_IDS) {
304
307
  const entryRaw = providersRaw[providerId];
305
308
  if (!entryRaw || typeof entryRaw !== "object" || Array.isArray(entryRaw)) {
306
309
  continue;
@@ -309,8 +312,8 @@ function normalizeRegistry(raw) {
309
312
  const enabled = Boolean(entry.enabled);
310
313
  let label = typeof entry.label === "string" ? entry.label.trim() || undefined : undefined;
311
314
  if (providerId === "embedded-keystore") {
312
- if (!label || label === "Embedded keystore (default)" || label === "Self-hosted wallet") {
313
- label = "Self-hosted";
315
+ if (!label || label === "Embedded keystore (default)" || label === "Self-hosted wallet" || label === "Self-hosted") {
316
+ label = "Legacy embedded keystore (migration required)";
314
317
  }
315
318
  }
316
319
  if (providerId === "local-socket-signer") {
@@ -325,23 +328,7 @@ function normalizeRegistry(raw) {
325
328
  updatedAt
326
329
  };
327
330
  }
328
- const wallets = (Array.isArray(value.wallets) ? value.wallets.map(normalizeWalletEntry).filter((entry) => Boolean(entry)) : []).map((wallet) => {
329
- if (!isLegacySelfHostedWallet(wallet)) {
330
- return wallet;
331
- }
332
- changed = true;
333
- const metadata = wallet.metadata && typeof wallet.metadata === "object" && !Array.isArray(wallet.metadata) ? wallet.metadata : undefined;
334
- return {
335
- ...wallet,
336
- providerId: "local-socket-signer",
337
- metadata: {
338
- ...metadata,
339
- selfHosted: true,
340
- migratedFromProviderId: metadata?.migratedFromProviderId ?? "embedded-keystore"
341
- },
342
- updatedAt: nowIso()
343
- };
344
- });
331
+ const wallets = Array.isArray(value.wallets) ? value.wallets.map(normalizeWalletEntry).filter((entry) => Boolean(entry)) : [];
345
332
  if (wallets.some((wallet) => wallet.providerId === "local-socket-signer")) {
346
333
  const current = providers["local-socket-signer"];
347
334
  if (!current.enabled) {
@@ -413,6 +400,12 @@ function writeWalletProviderRegistry(registry, env = process.env) {
413
400
  } catch {}
414
401
  }
415
402
  function setWalletProviderEnabled(params) {
403
+ if (params.providerId === "embedded-keystore" && params.enabled) {
404
+ throwLegacyEmbeddedKeystoreMigrationRequired("cannot enable retired wallet provider");
405
+ }
406
+ if (params.providerId === "privy" && params.enabled) {
407
+ throw new Error("Privy wallet creation and signing are unavailable; the provider stays disabled.");
408
+ }
416
409
  const env = params.env ?? process.env;
417
410
  const registry = readWalletProviderRegistry(env);
418
411
  registry.providers[params.providerId] = {
@@ -428,6 +421,20 @@ function setWalletProvidersEnabled(params) {
428
421
  const registry = readWalletProviderRegistry(env);
429
422
  const enabledSet = new Set(params.enabledProviders);
430
423
  const now = nowIso();
424
+ const legacy = registry.providers["embedded-keystore"];
425
+ registry.providers["embedded-keystore"] = {
426
+ ...legacy,
427
+ enabled: false,
428
+ label: "Legacy embedded keystore (migration required)",
429
+ updatedAt: legacy.enabled ? now : legacy.updatedAt
430
+ };
431
+ const unavailablePrivy = registry.providers.privy;
432
+ registry.providers.privy = {
433
+ ...unavailablePrivy,
434
+ enabled: false,
435
+ label: "Privy (integration unavailable)",
436
+ updatedAt: unavailablePrivy.enabled ? now : unavailablePrivy.updatedAt
437
+ };
431
438
  for (const providerId of WALLET_PROVIDER_IDS) {
432
439
  const current = registry.providers[providerId] ?? {
433
440
  enabled: false,
@@ -444,6 +451,12 @@ function setWalletProvidersEnabled(params) {
444
451
  return registry;
445
452
  }
446
453
  function upsertNamedWallet(params) {
454
+ if (params.providerId === "embedded-keystore") {
455
+ throwLegacyEmbeddedKeystoreMigrationRequired("cannot register a new legacy wallet");
456
+ }
457
+ if (params.providerId === "privy") {
458
+ throw new Error("Privy wallet creation and signing are unavailable; no wallet was registered.");
459
+ }
447
460
  const env = params.env ?? process.env;
448
461
  const registry = readWalletProviderRegistry(env);
449
462
  const name = params.name.trim();