@fased/fased 0.1.62 → 0.1.65

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 (342) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +44 -29
  3. package/config/dependency-ownership.json +1 -1
  4. package/config/signer-policies/README.md +58 -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 +78 -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-MaQnPa5G.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-D4YMr1fA.js} +3 -3
  80. package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
  81. package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-qMYs4aD-.js} +70 -50
  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 +291 -84
  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 +1274 -390
  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-I4IngVlJ.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-DLQ6_lLK.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-D_8FVI1C.js} +6798 -3695
  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-B4KF4Kpo.js} +31 -31
  166. package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-Bb6x1KAG.js} +32 -32
  167. package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DCTO8JkL.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-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
  172. package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-DHPDFZbC.d.ts} +2 -2
  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 +565 -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-BHmvqgjH.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-By5AcorL.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-DGnBz1YT.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-EJGTmL1Q.d.ts +486 -0
  208. package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-BdwdFCD6.d.ts} +2 -3
  209. package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-BrCpYMxn.d.ts} +2 -2
  210. package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -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-DUJwrTYs.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 +578 -117
  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 +92 -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 +93 -37
  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 +18 -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 +18 -0
  284. package/extensions/msteams/package.json +1 -1
  285. package/extensions/nextcloud-talk/package.json +1 -1
  286. package/extensions/nostr/CHANGELOG.md +18 -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 +587 -154
  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 +91 -5
  293. package/extensions/sat-mining/src/claim-service.ts +85 -14
  294. package/extensions/sat-mining/src/client.ts +13 -0
  295. package/extensions/sat-mining/src/config.ts +9 -0
  296. package/extensions/sat-mining/src/cycle-progress.ts +16 -8
  297. package/extensions/sat-mining/src/epoch-service.ts +9 -5
  298. package/extensions/sat-mining/src/gateway-runner.ts +21 -1
  299. package/extensions/sat-mining/src/protocol-contract.ts +45 -1
  300. package/extensions/sat-mining/src/recovery-service.ts +312 -0
  301. package/extensions/sat-mining/src/round-watcher.ts +391 -81
  302. package/extensions/sat-mining/src/rpc-read.ts +431 -106
  303. package/extensions/sat-mining/src/runtime.ts +16 -0
  304. package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
  305. package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
  306. package/extensions/sat-mining/src/solana-submit.ts +1544 -436
  307. package/extensions/sat-mining/src/submission-ledger.ts +434 -0
  308. package/extensions/signal/package.json +1 -1
  309. package/extensions/synology-chat/package.json +1 -1
  310. package/extensions/tlon/package.json +1 -1
  311. package/extensions/twitch/CHANGELOG.md +18 -0
  312. package/extensions/twitch/package.json +1 -1
  313. package/extensions/voice-call/CHANGELOG.md +18 -0
  314. package/extensions/voice-call/package.json +1 -1
  315. package/extensions/zalo/CHANGELOG.md +18 -0
  316. package/extensions/zalo/package.json +1 -1
  317. package/extensions/zalouser/CHANGELOG.md +18 -0
  318. package/extensions/zalouser/package.json +1 -1
  319. package/install.sh +4951 -0
  320. package/package.json +23 -5
  321. package/scripts/fased-host-updater.mjs +1421 -0
  322. package/scripts/fased-host-updaterctl.mjs +186 -0
  323. package/scripts/fased-managed-service.sh +36 -0
  324. package/scripts/fased-managed-updater.mjs +3065 -156
  325. package/scripts/fased-signer-enroll-hosting.sh +275 -0
  326. package/scripts/fased-signer-network-hosting.sh +143 -0
  327. package/scripts/fased-signer-owner-policy.mjs +1442 -0
  328. package/scripts/fased-signer-policy-hosting.sh +50 -0
  329. package/scripts/fased-signer-policy-local.sh +26 -0
  330. package/scripts/hosted-release-manifest.mjs +185 -0
  331. package/scripts/install-fased-signerd.sh +183 -108
  332. package/scripts/install-managed-runtime.mjs +212 -10
  333. package/scripts/managed-runtime-layout.mjs +75 -3
  334. package/scripts/migrate-hosted-signer-v2.mjs +58 -0
  335. package/scripts/start-managed.sh +173 -360
  336. package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
  337. package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
  338. package/dist/wallet/local-socket-signer-broker.js +0 -224
  339. package/dist/wallet/local-socket-signer-custody.js +0 -42
  340. package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
  341. package/dist/wallet/providers/privy-adapter.js +0 -80
  342. 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
 
@@ -10,6 +11,7 @@ const SOLANA_SYSTEM_PROGRAM_ID = "11111111111111111111111111111111";
10
11
  const SOLANA_TOKEN_PROGRAM_ID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
11
12
  const SOLANA_TOKEN_2022_PROGRAM_ID = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb";
12
13
  const SOLANA_ASSOCIATED_TOKEN_PROGRAM_ID = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL";
14
+ const SOLANA_ADDRESS_LOOKUP_TABLE_PROGRAM_ID = "AddressLookupTab1e1111111111111111111111111";
13
15
  const DEFAULT_POLICY_CAPS = { solana: {
14
16
  maxPerTx: "1000000000",
15
17
  maxDaily: "5000000000"
@@ -44,11 +46,28 @@ function normalizeWalletUsageBucket(raw) {
44
46
  return null;
45
47
  }
46
48
  const value = raw;
49
+ if (!isNonNegativeIntegerString(value.solanaSpent)) {
50
+ return null;
51
+ }
52
+ if (!value.solanaTokenSpent || typeof value.solanaTokenSpent !== "object" || Array.isArray(value.solanaTokenSpent)) {
53
+ return null;
54
+ }
55
+ const solanaTokenSpent = {};
56
+ for (const [mintRaw, spent] of Object.entries(value.solanaTokenSpent)) {
57
+ const mint = mintRaw.trim();
58
+ if (!mint || !isNonNegativeIntegerString(spent)) {
59
+ return null;
60
+ }
61
+ solanaTokenSpent[mint] = spent;
62
+ }
47
63
  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))) : {}
64
+ solanaSpent: value.solanaSpent,
65
+ solanaTokenSpent
50
66
  };
51
67
  }
68
+ function isNonNegativeIntegerString(value) {
69
+ return typeof value === "string" && /^\d+$/.test(value);
70
+ }
52
71
  function loadLedger(paths) {
53
72
  const fallback = defaultWalletUsageLedger();
54
73
  if (!syncFs.existsSync(paths.dailyUsagePath)) {
@@ -58,12 +77,15 @@ function loadLedger(paths) {
58
77
  const raw = syncFs.readFileSync(paths.dailyUsagePath, "utf8");
59
78
  const parsed = JSON.parse(raw);
60
79
  if (parsed && parsed.version === 2 && typeof parsed.date === "string") {
61
- const walletsRaw = parsed.wallets && typeof parsed.wallets === "object" && !Array.isArray(parsed.wallets) ? parsed.wallets : {};
80
+ if (!parsed.wallets || typeof parsed.wallets !== "object" || Array.isArray(parsed.wallets)) {
81
+ throw new Error("wallet usage ledger wallets must be an object");
82
+ }
83
+ const walletsRaw = parsed.wallets;
62
84
  const wallets = {};
63
85
  for (const [walletId, bucketRaw] of Object.entries(walletsRaw)) {
64
86
  const bucket = normalizeWalletUsageBucket(bucketRaw);
65
87
  if (!walletId.trim() || !bucket) {
66
- continue;
88
+ throw new Error(`wallet usage ledger contains an invalid bucket for ${walletId || "?"}`);
67
89
  }
68
90
  wallets[walletId.trim()] = bucket;
69
91
  }
@@ -73,24 +95,23 @@ function loadLedger(paths) {
73
95
  wallets
74
96
  };
75
97
  }
76
- if (parsed && parsed.version === 1) {
98
+ if (parsed && parsed.version === 1 && typeof parsed.date === "string" && isNonNegativeIntegerString(parsed.solanaSpent)) {
77
99
  return {
78
100
  version: 2,
79
- date: typeof parsed.date === "string" ? parsed.date : fallback.date,
101
+ date: parsed.date,
80
102
  wallets: { [LEDGER_LEGACY_GLOBAL_BUCKET_ID]: {
81
- solanaSpent: typeof parsed.solanaSpent === "string" ? parsed.solanaSpent : "0",
103
+ solanaSpent: parsed.solanaSpent,
82
104
  solanaTokenSpent: {}
83
105
  } }
84
106
  };
85
107
  }
86
- } catch {}
87
- return fallback;
108
+ throw new Error("wallet usage ledger has an unsupported shape");
109
+ } catch (error) {
110
+ throw new Error("wallet usage ledger is unreadable; refusing to reset spend counters", { cause: error });
111
+ }
88
112
  }
89
113
  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 {}
114
+ writeWalletStateFileAtomically(paths.dailyUsagePath, serializeWalletState(ledger));
94
115
  }
95
116
  function resolveWalletUsageBucket(ledger, walletId) {
96
117
  const normalizedWalletId = walletId?.trim() || DEFAULT_EFFECTIVE_WALLET_ID;
@@ -133,7 +154,8 @@ function miningPolicyProgramAllowlist(env) {
133
154
  SOLANA_SYSTEM_PROGRAM_ID,
134
155
  SOLANA_TOKEN_PROGRAM_ID,
135
156
  SOLANA_TOKEN_2022_PROGRAM_ID,
136
- SOLANA_ASSOCIATED_TOKEN_PROGRAM_ID
157
+ SOLANA_ASSOCIATED_TOKEN_PROGRAM_ID,
158
+ String(env.FASED_SAT_ENABLE_ALT_V0 ?? "").trim() === "1" ? SOLANA_ADDRESS_LOOKUP_TABLE_PROGRAM_ID : ""
137
159
  ]);
138
160
  }
139
161
  function isWalletHandle(value) {
@@ -294,7 +316,13 @@ function resolveWalletRoleForId(params) {
294
316
  if (walletId && storedPurpose === "mining") {
295
317
  return "mining";
296
318
  }
297
- if (walletId && (registry.defaultWalletId && walletId === registry.defaultWalletId || storedPurpose === "agent")) {
319
+ if (walletId && storedPurpose === "vault") {
320
+ return "vault";
321
+ }
322
+ if (walletId && storedPurpose === "agent") {
323
+ return "agent";
324
+ }
325
+ if (walletId && registry.defaultWalletId && walletId === registry.defaultWalletId) {
298
326
  return "agent";
299
327
  }
300
328
  return "vault";
@@ -351,14 +379,17 @@ function readWalletPolicyState(env = process.env) {
351
379
  const raw = syncFs.readFileSync(statePath, "utf8");
352
380
  const parsed = JSON.parse(raw);
353
381
  if (parsed.version !== 1) {
354
- return fallback;
382
+ throw new Error("wallet policy state version is unsupported");
355
383
  }
356
- const walletsRaw = parsed.wallets && typeof parsed.wallets === "object" && !Array.isArray(parsed.wallets) ? parsed.wallets : {};
384
+ if (!parsed.wallets || typeof parsed.wallets !== "object" || Array.isArray(parsed.wallets)) {
385
+ throw new Error("wallet policy wallets must be an object");
386
+ }
387
+ const walletsRaw = parsed.wallets;
357
388
  const wallets = {};
358
389
  for (const [walletId, recordRaw] of Object.entries(walletsRaw)) {
359
390
  const record = normalizeStoredWalletPolicyRecord(recordRaw);
360
- if (!walletId.trim() || !record) {
361
- continue;
391
+ if (!walletId.trim() || !record || record.walletId !== walletId.trim()) {
392
+ throw new Error(`wallet policy contains an invalid record for ${walletId || "?"}`);
362
393
  }
363
394
  wallets[walletId.trim()] = record;
364
395
  }
@@ -367,17 +398,14 @@ function readWalletPolicyState(env = process.env) {
367
398
  updatedAt: typeof parsed.updatedAt === "string" ? parsed.updatedAt : fallback.updatedAt,
368
399
  wallets
369
400
  };
370
- } catch {
371
- return fallback;
401
+ } catch (error) {
402
+ throw new Error("wallet policy state is unreadable; refusing to replace persisted policy", { cause: error });
372
403
  }
373
404
  }
374
405
  function writeWalletPolicyState(state, env = process.env) {
375
406
  const paths = ensureWalletStateDir(env);
376
407
  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 {}
408
+ writeWalletStateFileAtomically(statePath, serializeWalletState(state));
381
409
  }
382
410
  function buildResolvedPolicyFromDefaults(defaults) {
383
411
  return {
@@ -573,7 +601,7 @@ function applyWalletPolicyConfig(params) {
573
601
  const profile = resolveWalletRolePolicyProfile(role, env);
574
602
  return cloneWalletConfigWithPolicy(params.config, buildResolvedPolicyFromDefaults(profile.defaults));
575
603
  }
576
- function upsertWalletPolicyConfig(params) {
604
+ function prepareWalletPolicyConfigUpdate(params) {
577
605
  const env = params.env ?? process.env;
578
606
  const walletId = params.walletId.trim();
579
607
  if (!walletId) {
@@ -623,20 +651,41 @@ function upsertWalletPolicyConfig(params) {
623
651
  patch: params.patch.recurringTransfer,
624
652
  role
625
653
  }) : existingRecord?.recurringTransfer;
626
- state.wallets[walletId] = buildStoredPolicyRecord({
654
+ const preparedAt = nowIso();
655
+ const nextRecord = buildStoredPolicyRecord({
627
656
  walletId,
628
657
  role,
629
658
  policy: nextPolicy,
630
- recurringTransfer
659
+ recurringTransfer,
660
+ updatedAt: preparedAt
631
661
  });
632
- state.updatedAt = nowIso();
633
- writeWalletPolicyState(state, env);
634
662
  return {
635
663
  walletId,
636
664
  role,
637
- config: cloneWalletConfigWithPolicy(base, nextPolicy)
665
+ config: cloneWalletConfigWithPolicy(base, nextPolicy),
666
+ expectedRecordJson: JSON.stringify(existingRecord ?? null),
667
+ nextRecord,
668
+ preparedAt
669
+ };
670
+ }
671
+ function commitWalletPolicyConfigUpdate(prepared, env = process.env) {
672
+ const state = readWalletPolicyState(env);
673
+ if (JSON.stringify(state.wallets[prepared.walletId] ?? null) !== prepared.expectedRecordJson) {
674
+ throw new Error("wallet policy changed concurrently; reload the acknowledged signer policy");
675
+ }
676
+ state.wallets[prepared.walletId] = prepared.nextRecord;
677
+ state.updatedAt = prepared.preparedAt;
678
+ writeWalletPolicyState(state, env);
679
+ return {
680
+ walletId: prepared.walletId,
681
+ role: prepared.role,
682
+ config: prepared.config
638
683
  };
639
684
  }
685
+ function upsertWalletPolicyConfig(params) {
686
+ const env = params.env ?? process.env;
687
+ return commitWalletPolicyConfigUpdate(prepareWalletPolicyConfigUpdate(params), env);
688
+ }
640
689
  function resolveWalletRolePolicyProfile(role, env = process.env) {
641
690
  switch (role) {
642
691
  case "mining": return {
@@ -659,8 +708,8 @@ function resolveWalletRolePolicyProfile(role, env = process.env) {
659
708
  label: "Agent",
660
709
  summary: "Hot Agent wallet for reviewed payments, Fased Network payment evidence, and approved skill actions. Keep explicit caps and narrow token / contract routes.",
661
710
  defaults: {
662
- capsEnabled: false,
663
- directSigning: true,
711
+ capsEnabled: true,
712
+ directSigning: false,
664
713
  skillsEnabled: false,
665
714
  solana: {
666
715
  maxPerTx: DEFAULT_POLICY_CAPS.solana.maxPerTx,
@@ -673,9 +722,9 @@ function resolveWalletRolePolicyProfile(role, env = process.env) {
673
722
  default: return {
674
723
  role: "vault",
675
724
  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.",
725
+ 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
726
  defaults: {
678
- capsEnabled: false,
727
+ capsEnabled: true,
679
728
  directSigning: false,
680
729
  skillsEnabled: false,
681
730
  solana: {
@@ -769,7 +818,14 @@ function validateWalletTxPolicy(params) {
769
818
  }
770
819
  const capsEnabled = params.config.policy.capsEnabled;
771
820
  const allowPrograms = params.config.policy.solana.allowPrograms;
772
- if (params.program && allowPrograms.length > 0) {
821
+ if (params.program) {
822
+ if (allowPrograms.length === 0) {
823
+ return {
824
+ ok: false,
825
+ code: "wallet_program_allowlist_required",
826
+ message: "program execution requires an explicit non-empty allowlist"
827
+ };
828
+ }
773
829
  const normalized = params.program.trim();
774
830
  const allowed = allowPrograms.includes(normalized);
775
831
  if (!allowed) {
@@ -962,4 +1018,4 @@ function resolveWalletRecurringTransferPolicy(params) {
962
1018
  }
963
1019
 
964
1020
  //#endregion
965
- export { applyWalletPolicyConfig, checkWalletDailyCap, enforceWalletDailyCap, isWalletToolAllowed, resolveWalletPolicyConfig, resolveWalletRecurringTransferPolicy, resolveWalletRoleForId, resolveWalletRolePolicyProfile, upsertWalletPolicyConfig, validateWalletTxPolicy };
1021
+ 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();