@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
@@ -7,10 +7,11 @@ import { ensureAuthProfileStore } from "../agents/auth-profiles/store.js";
7
7
  import { readConfigFileSnapshot, writeConfigFile } from "../config/io.js";
8
8
  import "../config/config.js";
9
9
  import "../agents/auth-profiles.js";
10
- import { ensureWalletStateDir, resolveLocalSignerBackendSocketPath, resolveLocalSignerMaterialRootDir, resolveLocalSignerRunAsUser, resolveLocalSignerSocketPath } from "../wallet/wallet-runtime-config.js";
10
+ import { ensureWalletStateDir, resolveLocalSignerControlSocketPath, resolveLocalSignerMaterialRootDir, resolveLocalSignerSocketPath } from "../wallet/wallet-runtime-config.js";
11
11
  import { checkNamedWalletDeletionSafety, deleteNamedWallet, readWalletProviderRegistry, resolveWalletUserRole, setDefaultWallet, setNamedWalletRole, upsertNamedWallet } from "../wallet/wallet-provider-registry.js";
12
12
  import { DEFAULT_WORKSPACE, applyWizardMetadata, ensureWorkspaceAndSessions, handleOnboardingRepair, printWizardHeader, probeGatewayReachable, summarizeExistingConfig } from "../commands/onboard-helpers.js";
13
- import { configureWalletForOnboarding, installSignerdBinary, migrateLocalSignerKeystoreToMaterialDir, resolveSignerdBinaryPath, restartLocalSocketSigner } from "./onboarding.wallet.js";
13
+ import { configureSignerOwnedWalletNetwork } from "../wallet/signer-network-admin.js";
14
+ import { configureWalletForOnboarding, installSignerdBinary, resolveSignerdBinaryPath, restartLocalSocketSigner } from "./onboarding.wallet.js";
14
15
  import { collectWalletSignerDoctorReport, walletSetupCommand } from "../commands/wallet.js";
15
16
  import { promptAuthChoiceGrouped } from "../commands/auth-choice-prompt.js";
16
17
  import { applyPrimaryModel, resolveAuthenticatedDefaultModel } from "../commands/model-picker.js";
@@ -25,6 +26,7 @@ import { promptCustomApiConfig } from "../commands/onboard-custom.js";
25
26
  import { setupInternalHooks } from "../commands/onboard-hooks.js";
26
27
  import { promptRemoteGatewayConfig } from "../commands/onboard-remote.js";
27
28
  import { setupSkills } from "../commands/onboard-skills.js";
29
+ import { lockSignerOwnedWalletForArchive } from "../wallet/local-socket-signer-archive.js";
28
30
  import { isHostedSecurityCapableSession } from "./host-security-capability.js";
29
31
  import { noteBullet, noteCommand, noteHeading, noteLabel, noteStep, noteSuccess, noteWarn } from "./onboarding-note-format.js";
30
32
  import { configureFederationForOnboarding } from "./onboarding.federation.js";
@@ -93,20 +95,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
93
95
  }
94
96
  return "FASED_WALLET_SOLANA_RPC_URL";
95
97
  };
96
- const keystoreEnvKeyFor = (_chain, walletId) => {
98
+ const fallbackRpcEnvKeyFor = (walletId) => {
97
99
  const suffix = walletIdEnvSuffix(walletId);
98
- if (suffix) {
99
- return `FASED_WALLET_SOLANA_KEYSTORE_PATH__${suffix}`;
100
- }
101
- return "FASED_WALLET_SOLANA_KEYSTORE_PATH";
102
- };
103
- const defaultKeystorePathFor = (_chain, walletId) => {
104
- const normalized = String(walletId ?? "").trim().toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "");
105
- const walletDir = ensureWalletStateDir(process.env).rootDir;
106
- if (!normalized || normalized === "default") {
107
- return path.join(walletDir, "keystore-solana.v1.enc");
108
- }
109
- return path.join(walletDir, `keystore-solana-${normalized}.v1.enc`);
100
+ return suffix ? `FASED_WALLET_SOLANA_WRITE_RPC_FALLBACK_URL__${suffix}` : "FASED_WALLET_SOLANA_WRITE_RPC_FALLBACK_URL";
110
101
  };
111
102
  const setConfigEnvVar = (cfg, key, value) => {
112
103
  const vars = { ...cfg.env?.vars };
@@ -124,29 +115,26 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
124
115
  };
125
116
  };
126
117
  const applyHostedLocalSignerDefaults = (cfg) => {
127
- const signerUser = String(process.env.FASED_SIGNER_USER ?? "fased-signer").trim();
128
- if (!signerUser) {
129
- return cfg;
130
- }
131
- const appHome = String(process.env.HOME ?? "/home/app").trim() || "/home/app";
132
- const signerHome = `/home/${signerUser}`;
133
- const defaults = {
134
- FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER: signerUser,
135
- FASED_WALLET_SIGNER_STATE_DIR: `${signerHome}/.fased/wallet`,
136
- FASED_WALLET_LOCAL_SIGNER_SOCKET: `${appHome}/.fased/wallet/local-signer.sock`,
137
- FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET: `${signerHome}/.fased/wallet/local-signer.sock`,
138
- FASED_WALLET_LOCAL_SIGNER_BIN: `${signerHome}/.fased/bin/fased-signerd`
139
- };
118
+ const appSocket = "/run/fased-signerd/app.sock";
119
+ const signerOwnedKeys = [
120
+ "FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET",
121
+ "FASED_WALLET_LOCAL_SIGNER_CONTROL_SOCKET",
122
+ "FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER",
123
+ "FASED_WALLET_LOCAL_SIGNER_BIN",
124
+ "FASED_WALLET_SIGNER_STATE_DIR",
125
+ "FASED_WALLET_LOCAL_SIGNER_STATE_DB",
126
+ "FASED_WALLET_LOCAL_SIGNER_MASTER_KEY",
127
+ "FASED_WALLET_PASSPHRASE_FILE",
128
+ "FASED_WALLET_WEBAUTHN_RP_ID",
129
+ "FASED_WALLET_WEBAUTHN_ORIGINS"
130
+ ];
140
131
  let next = cfg;
141
- for (const [key, value] of Object.entries(defaults)) {
142
- const existing = String(process.env[key] ?? cfg.env?.vars?.[key] ?? "").trim();
143
- if (existing) {
144
- process.env[key] = existing;
145
- continue;
146
- }
147
- process.env[key] = value;
148
- next = setConfigEnvVar(next, key, value);
132
+ for (const key of signerOwnedKeys) {
133
+ delete process.env[key];
134
+ next = setConfigEnvVar(next, key, undefined);
149
135
  }
136
+ process.env.FASED_WALLET_LOCAL_SIGNER_SOCKET = appSocket;
137
+ next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_SOCKET", appSocket);
150
138
  return next;
151
139
  };
152
140
  const syncLocalSignerRuntimeEnvIntoConfig = (cfg) => {
@@ -157,14 +145,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
157
145
  const signerSocketPath = resolveLocalSignerSocketPath(process.env);
158
146
  process.env.FASED_WALLET_LOCAL_SIGNER_SOCKET = signerSocketPath;
159
147
  next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_SOCKET", signerSocketPath);
160
- const backendSocketPath = resolveLocalSignerBackendSocketPath(process.env);
161
- if (backendSocketPath !== signerSocketPath) {
162
- process.env.FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET = backendSocketPath;
163
- next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET", backendSocketPath);
164
- } else {
165
- delete process.env.FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET;
166
- next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET", undefined);
167
- }
148
+ delete process.env.FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET;
149
+ next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET", undefined);
168
150
  const signerStateDir = resolveLocalSignerMaterialRootDir(process.env);
169
151
  if (signerStateDir !== ensureWalletStateDir(process.env).rootDir) {
170
152
  process.env.FASED_WALLET_SIGNER_STATE_DIR = signerStateDir;
@@ -173,14 +155,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
173
155
  delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
174
156
  next = setConfigEnvVar(next, "FASED_WALLET_SIGNER_STATE_DIR", undefined);
175
157
  }
176
- const signerRunAsUser = resolveLocalSignerRunAsUser(process.env);
177
- if (signerRunAsUser) {
178
- process.env.FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER = signerRunAsUser;
179
- next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER", signerRunAsUser);
180
- } else {
181
- delete process.env.FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER;
182
- next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER", undefined);
183
- }
158
+ delete process.env.FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER;
159
+ next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER", undefined);
184
160
  const signerBinPath = String(process.env.FASED_WALLET_LOCAL_SIGNER_BIN ?? "").trim();
185
161
  if (signerBinPath) {
186
162
  next = setConfigEnvVar(next, "FASED_WALLET_LOCAL_SIGNER_BIN", signerBinPath);
@@ -191,24 +167,21 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
191
167
  return next;
192
168
  };
193
169
  const jupiterApiKeyEnvKey = "FASED_JUPITER_API_KEY";
194
- const jupiterTriggerApiBaseUrlEnvKey = "FASED_JUPITER_TRIGGER_API_BASE_URL";
195
- const readJupiterLimitOrderApiKey = () => String(process.env[jupiterApiKeyEnvKey] ?? nextConfig.env?.vars?.[jupiterApiKeyEnvKey] ?? process.env.JUPITER_API_KEY ?? nextConfig.env?.vars?.JUPITER_API_KEY ?? "").trim();
196
- const readJupiterTriggerApiBaseUrl = () => String(process.env[jupiterTriggerApiBaseUrlEnvKey] ?? nextConfig.env?.vars?.[jupiterTriggerApiBaseUrlEnvKey] ?? "").trim();
197
- const promptAndStoreJupiterLimitOrders = async () => {
198
- const existingKey = readJupiterLimitOrderApiKey();
170
+ const legacyJupiterTriggerApiBaseUrlEnvKey = "FASED_JUPITER_TRIGGER_API_BASE_URL";
171
+ const readJupiterSwapApiKey = () => String(process.env[jupiterApiKeyEnvKey] ?? nextConfig.env?.vars?.[jupiterApiKeyEnvKey] ?? process.env.JUPITER_API_KEY ?? nextConfig.env?.vars?.JUPITER_API_KEY ?? "").trim();
172
+ const promptAndStoreJupiterSwapApi = async () => {
173
+ const existingKey = readJupiterSwapApiKey();
199
174
  const enable = await prompter.confirm({
200
- message: existingKey ? "Keep Jupiter wallet-action support enabled?" : "Enable Jupiter support for policy-gated Agent wallet actions?",
175
+ message: existingKey ? "Keep Gateway Jupiter Swap API access enabled?" : "Enable Gateway Jupiter Swap API access? Trigger credentials remain signer-owned.",
201
176
  initialValue: Boolean(existingKey)
202
177
  });
203
178
  if (!enable) {
204
179
  nextConfig = setConfigEnvVar(nextConfig, jupiterApiKeyEnvKey, undefined);
205
- nextConfig = setConfigEnvVar(nextConfig, jupiterTriggerApiBaseUrlEnvKey, undefined);
206
180
  delete process.env[jupiterApiKeyEnvKey];
207
- delete process.env[jupiterTriggerApiBaseUrlEnvKey];
208
- await prompter.note("Jupiter wallet-action support disabled. Other approved wallet actions still use the normal wallet flow.", "Wallet actions");
181
+ await prompter.note("Gateway Jupiter Swap API access disabled. Native signer Trigger configuration is unchanged.", "Jupiter swaps");
209
182
  return false;
210
183
  }
211
- const keyPrompt = existingKey ? "Jupiter API key (blank keeps current)" : "Jupiter API key";
184
+ const keyPrompt = existingKey ? "Jupiter Swap API key (blank keeps current)" : "Jupiter Swap API key";
212
185
  const keyInput = (typeof prompter.secret === "function" ? await prompter.secret({
213
186
  message: keyPrompt,
214
187
  validate: (value) => value.trim() || existingKey ? undefined : "Jupiter API key is required"
@@ -218,21 +191,15 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
218
191
  })).trim();
219
192
  const effectiveKey = keyInput || existingKey;
220
193
  if (!effectiveKey) {
221
- throw new Error("Jupiter API key is required to enable Jupiter wallet-action support.");
194
+ throw new Error("Jupiter API key is required to enable Gateway swap crafting.");
222
195
  }
223
196
  nextConfig = setConfigEnvVar(nextConfig, jupiterApiKeyEnvKey, effectiveKey);
224
197
  process.env[jupiterApiKeyEnvKey] = effectiveKey;
225
- const existingBaseUrl = readJupiterTriggerApiBaseUrl();
226
- if (existingBaseUrl) {
227
- const baseUrlInput = (await prompter.text({
228
- message: "Jupiter Trigger API base URL (blank keeps current)",
229
- initialValue: existingBaseUrl
230
- })).trim();
231
- const effectiveBaseUrl = baseUrlInput || existingBaseUrl;
232
- nextConfig = setConfigEnvVar(nextConfig, jupiterTriggerApiBaseUrlEnvKey, effectiveBaseUrl);
233
- process.env[jupiterTriggerApiBaseUrlEnvKey] = effectiveBaseUrl;
234
- }
235
- await prompter.note(["Jupiter wallet-action support enabled for Agent wallet actions.", `${jupiterApiKeyEnvKey} is stored in local config env vars and is never printed in chat.`].join("\n"), "Wallet actions");
198
+ await prompter.note([
199
+ "Gateway Jupiter Swap API access enabled for Agent wallet swap crafting.",
200
+ `${jupiterApiKeyEnvKey} is stored in Gateway config for swaps only and is never printed in chat.`,
201
+ "Jupiter Trigger credentials and production routing stay inside fased-signerd."
202
+ ].join("\n"), "Jupiter swaps");
236
203
  return true;
237
204
  };
238
205
  const promptAndStoreWalletRpcUrl = async (params) => {
@@ -639,16 +606,25 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
639
606
  }
640
607
  const interactiveHostProfileInitialValue = !hostSecurityCapable && requestedHostProfile === "hosting" ? "local" : requestedHostProfile || "local";
641
608
  const explicitHostProfileRequested = requestedHostProfile !== undefined;
642
- const hostedProfileUnavailableNote = ["This session cannot run hosting security setup.", `Rerun ${formatCliCommand("./install.sh")} from root on the VPS and choose a hosting profile there.`].join("\n");
609
+ const hostedProfileUnavailableNote = [
610
+ "This session cannot run hosting security setup.",
611
+ "Start from the provider root console with the exact tagged, attested Hosting command and --release vX.Y.Z.",
612
+ "Never run the app-owned checkout with sudo or as root."
613
+ ].join("\n");
614
+ if (opts.mode !== "remote" && !requestedHostProfile) {
615
+ await prompter.note(["Local runs under your current OS account and does no VPS SSH/firewall hardening.", "Hosting uses the verified root bootstrap for an independent signer service, private Tailscale access and hosted SSH/firewall hardening."].join("\n"), "Setup map");
616
+ }
643
617
  const hostProfile = opts.mode === "remote" ? "local" : requestedHostProfile ? requestedHostProfile : await (async () => {
644
618
  const selected = await prompter.select({
645
619
  message: "Host setup profile",
646
620
  options: [{
647
621
  value: "local",
648
- label: "Local"
622
+ label: "Local",
623
+ hint: "Current machine and account; no VPS hardening."
649
624
  }, {
650
625
  value: "hosting",
651
- label: "Hosting"
626
+ label: "Hosting",
627
+ hint: "Verified root bootstrap; Tailscale required."
652
628
  }],
653
629
  initialValue: interactiveHostProfileInitialValue
654
630
  });
@@ -787,6 +763,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
787
763
  }));
788
764
  const workspaceDir = resolveUserPath(workspaceInput.trim() || DEFAULT_WORKSPACE);
789
765
  let nextConfig = applyOnboardingLocalWorkspaceConfig(baseConfig, workspaceDir);
766
+ nextConfig = setConfigEnvVar(nextConfig, legacyJupiterTriggerApiBaseUrlEnvKey, undefined);
767
+ delete process.env[legacyJupiterTriggerApiBaseUrlEnvKey];
790
768
  nextConfig = normalizeHostedWalletPaths(nextConfig, process.env);
791
769
  const authChoice = opts.authChoice;
792
770
  if (authChoice === "custom-api-key") {
@@ -846,6 +824,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
846
824
  const hostingMode = hostProfile === "hosting";
847
825
  if (hostingMode) {
848
826
  nextConfig = applyHostedLocalSignerDefaults(nextConfig);
827
+ } else if (!String(process.env.FASED_WALLET_WEBAUTHN_RP_ID ?? "").trim() && !String(process.env.FASED_WALLET_WEBAUTHN_ORIGINS ?? "").trim()) {
828
+ process.env.FASED_WALLET_WEBAUTHN_RP_ID = "localhost";
829
+ process.env.FASED_WALLET_WEBAUTHN_ORIGINS = `http://localhost:${settings.port}`;
849
830
  }
850
831
  const buildNativeSignerFromSource = String(process.env.FASED_BUILD_NATIVE_SIGNER_FROM_SOURCE ?? "").trim() === "1";
851
832
  const skipNativeSignerBuild = String(process.env.FASED_SKIP_NATIVE_SIGNER_BUILD ?? "").trim() === "1";
@@ -882,7 +863,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
882
863
  nextConfig,
883
864
  prompter
884
865
  });
885
- nextConfig = syncLocalSignerRuntimeEnvIntoConfig(nextConfig);
866
+ nextConfig = hostingMode ? applyHostedLocalSignerDefaults(nextConfig) : syncLocalSignerRuntimeEnvIntoConfig(nextConfig);
886
867
  let onboardingWalletSecurityFocus = null;
887
868
  const offerHostedWalletSetup = hostingMode && flow === "quickstart" && nextConfig.wallet?.runtime?.enabled !== true;
888
869
  if (nextConfig.wallet?.runtime?.enabled || offerHostedWalletSetup) {
@@ -906,9 +887,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
906
887
  label: "Manage wallet"
907
888
  },
908
889
  {
909
- value: "limit-orders",
910
- label: "Limit orders",
911
- hint: readJupiterLimitOrderApiKey() ? "Jupiter key configured" : "Enable Jupiter Trigger limit orders for Agent wallets"
890
+ value: "jupiter-swaps",
891
+ label: "Jupiter swaps",
892
+ hint: readJupiterSwapApiKey() ? "Gateway swap key configured" : "Optional API key for Gateway swap crafting; Trigger is signer-owned"
912
893
  },
913
894
  {
914
895
  value: "skip",
@@ -921,8 +902,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
921
902
  if (setupMode === "skip") {
922
903
  break;
923
904
  }
924
- if (setupMode === "limit-orders") {
925
- await promptAndStoreJupiterLimitOrders();
905
+ if (setupMode === "jupiter-swaps") {
906
+ await promptAndStoreJupiterSwapApi();
926
907
  addAnotherWallet = await prompter.confirm({
927
908
  message: "Run another wallet setup action?",
928
909
  initialValue: false
@@ -931,7 +912,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
931
912
  }
932
913
  if (setupMode === "manage-self-hosted") {
933
914
  const registry = readWalletProviderRegistry(process.env);
934
- const managedWallets = registry.wallets.filter((wallet) => wallet.providerId === "local-socket-signer" || wallet.providerId === "embedded-keystore" || wallet.metadata?.selfHosted === true);
915
+ const managedWallets = registry.wallets.filter((wallet) => wallet.providerId === "local-socket-signer" || wallet.metadata?.selfHosted === true && wallet.providerId !== "embedded-keystore");
935
916
  if (managedWallets.length === 0) {
936
917
  await prompter.note("No wallets are registered yet. Create or import one first.", "Wallet setup");
937
918
  addAnotherWallet = await prompter.confirm({
@@ -960,8 +941,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
960
941
  const currentMiningWalletId = satMiningAttachment.walletId ?? "";
961
942
  const currentBondWalletId = federationBondWalletId ?? "";
962
943
  const configuredSolanaRpcUrl = (nextConfig.env?.vars?.[rpcEnvKeyFor("solana", walletId)] ?? "").trim() || String(process.env[rpcEnvKeyFor("solana", walletId)] ?? "").trim();
963
- const configuredSolanaKeystore = (nextConfig.env?.vars?.[keystoreEnvKeyFor("solana", walletId)] ?? "").trim() || String(process.env[keystoreEnvKeyFor("solana", walletId)] ?? "").trim();
964
- const supportsSolanaWallet = Boolean(targetWallet.addresses?.solana || configuredSolanaKeystore);
944
+ const supportsSolanaWallet = Boolean(targetWallet.addresses?.solana || targetWallet.providerId === "local-socket-signer");
965
945
  const targetWalletPurpose = resolveWalletUserRole(targetWallet);
966
946
  const manageAction = await prompter.select({
967
947
  message: "Wallet action",
@@ -969,7 +949,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
969
949
  ...supportsSolanaWallet ? [{
970
950
  value: "configure-solana-rpc",
971
951
  label: configuredSolanaRpcUrl ? "Update Solana RPC" : "Add Solana RPC",
972
- hint: configuredSolanaRpcUrl ? configuredSolanaRpcUrl : "Restore the per-wallet Solana RPC used for balances, readiness, and SAT mining."
952
+ hint: configuredSolanaRpcUrl ? "Signer-owned RPC is configured; replace it without displaying credentials." : "Restore the per-wallet Solana RPC used for balances, readiness, and SAT mining."
973
953
  }] : [],
974
954
  ...supportsSolanaWallet && currentBondWalletId === walletId ? [{
975
955
  value: "detach-federation-bond",
@@ -981,9 +961,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
981
961
  hint: currentBondWalletId && currentBondWalletId !== walletId ? `Current bond Vault: ${currentBondWalletId}` : "Use this Vault wallet for longer-lived SAT bond authority."
982
962
  }] : [],
983
963
  {
984
- value: "delete",
985
- label: "Delete wallet",
986
- hint: "Remove this wallet registration and local keystore mapping."
964
+ value: "archive",
965
+ label: "Archive/remove from Fased",
966
+ hint: "Disable signer use first, then remove this wallet registration."
987
967
  },
988
968
  {
989
969
  value: "cancel",
@@ -1010,8 +990,27 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1010
990
  walletName: targetWallet.name,
1011
991
  currentValue: configuredSolanaRpcUrl
1012
992
  });
1013
- await restartLocalSocketSigner(ensureWalletStateDir(process.env).rootDir);
1014
- await prompter.note(`Updated Solana RPC for ${targetWallet.name} (${walletId}): ${effectiveSolanaRpcUrl}`, "Wallet setup");
993
+ let signerNetworkVersion;
994
+ let signerNetworkRootCommand;
995
+ if (targetWallet.providerId === "local-socket-signer") {
996
+ const effectiveEnv = {
997
+ ...process.env,
998
+ ...nextConfig.env?.vars,
999
+ FASED_HOST_PROFILE: hostProfile
1000
+ };
1001
+ const network = configureSignerOwnedWalletNetwork({
1002
+ walletId,
1003
+ primaryRpcUrl: effectiveSolanaRpcUrl,
1004
+ fallbackRpcUrl: String(effectiveEnv[fallbackRpcEnvKeyFor(walletId)] ?? "").trim() || undefined,
1005
+ env: effectiveEnv,
1006
+ signerBinPath: hostProfile === "hosting" ? undefined : resolveSignerdBinaryPath(effectiveEnv)
1007
+ });
1008
+ signerNetworkVersion = network.version;
1009
+ signerNetworkRootCommand = network.rootCommand;
1010
+ } else {
1011
+ await restartLocalSocketSigner(ensureWalletStateDir(process.env).rootDir);
1012
+ }
1013
+ await prompter.note([`Updated the app-side Solana RPC setting for ${targetWallet.name} (${walletId})${signerNetworkVersion ? `; signer network version ${signerNetworkVersion} is ready` : "."}`, ...signerNetworkRootCommand ? ["The hosted signer was not changed because the app has no root channel. Activate the RPC from a root-owned file:", signerNetworkRootCommand] : []].join("\n"), "Wallet setup");
1015
1014
  addAnotherWallet = await prompter.confirm({
1016
1015
  message: "Run another wallet setup action?",
1017
1016
  initialValue: false
@@ -1063,51 +1062,62 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1063
1062
  });
1064
1063
  continue;
1065
1064
  }
1065
+ const archiveEnv = {
1066
+ ...process.env,
1067
+ ...nextConfig.env?.vars,
1068
+ FASED_HOST_PROFILE: hostProfile
1069
+ };
1066
1070
  const deletionSafety = checkNamedWalletDeletionSafety({
1067
1071
  walletId: targetWallet.id,
1068
- env: process.env
1072
+ env: archiveEnv
1069
1073
  });
1070
1074
  if (!deletionSafety.ok) {
1071
- await prompter.note(deletionSafety.message, "Delete blocked");
1075
+ await prompter.note(deletionSafety.message, "Archive blocked");
1072
1076
  addAnotherWallet = await prompter.confirm({
1073
1077
  message: "Run another wallet setup action?",
1074
1078
  initialValue: false
1075
1079
  });
1076
1080
  continue;
1077
1081
  }
1078
- const deleteWarnings = [
1079
- `This deletes the local wallet registration and local keystore files for ${targetWallet.name} (${targetWallet.id}).`,
1080
- "It does not transfer funds and it cannot recover funds if you did not save the seed/private key first.",
1081
- "Move funds out, save recovery material, and clear active Mining/Fased Network use before deleting."
1082
+ const signerOwned = targetWallet.providerId === "local-socket-signer";
1083
+ const archiveWarnings = [
1084
+ `This removes the Fased registration for ${targetWallet.name} (${targetWallet.id}); it does not transfer funds or erase provider custody.`,
1085
+ signerOwned ? "Before removal, Fased must durably replace the native signer policy with deny-all. The encrypted signer-owned key remains archived in signer storage for host-administrator recovery." : "The external provider or hardware wallet keeps its key; remove it there separately only if you intend to destroy that custody relationship.",
1086
+ "Move funds out or verify your recovery procedure, and clear active Mining/Fased Network use before archiving."
1082
1087
  ];
1083
1088
  if (currentMiningWalletId === targetWallet.id || targetWalletPurpose === "mining") {
1084
- deleteWarnings.push("For @wallet:mining, stop mining first; move SAT/SOL out; save recovery material; then delete and recreate the singleton Mining wallet.");
1089
+ archiveWarnings.push("For @wallet:mining, stop mining first; move SAT/SOL out or verify recovery; then archive and re-register the singleton Mining wallet if needed.");
1085
1090
  }
1086
- deleteWarnings.push("If balances cannot be checked from this terminal, treat the balance as unknown and verify it from the Wallet or Mining page first.", "Use repair for auth/session recovery only; wallet deletion is always per-wallet.");
1087
- await prompter.note(deleteWarnings.join("\n"), "Delete wallet");
1091
+ archiveWarnings.push("If balances cannot be checked from this terminal, treat the balance as unknown and verify it from the Wallet or Mining page first.", "Use repair for auth/session recovery only; wallet archive is always per-wallet.");
1092
+ await prompter.note(archiveWarnings.join("\n"), "Archive wallet");
1088
1093
  const typedWalletId = await prompter.text({
1089
- message: `Type wallet id "${targetWallet.id}" to delete this wallet`,
1094
+ message: `Type wallet id "${targetWallet.id}" to archive/remove this wallet from Fased`,
1090
1095
  validate: (value) => value.trim() === targetWallet.id ? undefined : `Type ${targetWallet.id}`
1091
1096
  });
1092
1097
  if (typedWalletId.trim() === targetWallet.id) {
1093
1098
  const walletId = targetWallet.id;
1094
- const keystoreKeys = [keystoreEnvKeyFor("solana", walletId)];
1095
- const defaultKeystorePaths = [defaultKeystorePathFor("solana", walletId)];
1096
- const configuredPaths = keystoreKeys.map((key) => (nextConfig.env?.vars?.[key] ?? "").trim() || String(process.env[key] ?? "").trim()).filter(Boolean);
1097
- for (const file of new Set([...configuredPaths, ...defaultKeystorePaths])) {
1099
+ let archivedSignerPolicy;
1100
+ if (signerOwned) {
1098
1101
  try {
1099
- if (file && syncFs.existsSync(file)) {
1100
- syncFs.rmSync(file, { force: true });
1101
- }
1102
- } catch {}
1103
- }
1104
- for (const key of keystoreKeys) {
1105
- nextConfig = setConfigEnvVar(nextConfig, key, undefined);
1106
- delete process.env[key];
1102
+ archivedSignerPolicy = await lockSignerOwnedWalletForArchive({
1103
+ wallet: targetWallet,
1104
+ socketPath: resolveLocalSignerSocketPath(archiveEnv)
1105
+ });
1106
+ } catch (error) {
1107
+ await prompter.note([
1108
+ "The native signer did not durably acknowledge deny-all, so no Fased registration or attachment was removed.",
1109
+ `Detail: ${error instanceof Error ? error.message : String(error)}`,
1110
+ "Repair the signer and retry the archive operation."
1111
+ ].join("\n"), "Archive blocked");
1112
+ addAnotherWallet = await prompter.confirm({
1113
+ message: "Run another wallet setup action?",
1114
+ initialValue: false
1115
+ });
1116
+ continue;
1117
+ }
1107
1118
  }
1108
1119
  for (const key of [rpcEnvKeyFor("solana", walletId)]) {
1109
1120
  nextConfig = setConfigEnvVar(nextConfig, key, undefined);
1110
- delete process.env[key];
1111
1121
  }
1112
1122
  if (satMiningAttachment.walletId === walletId) {
1113
1123
  satMiningAttachment = {};
@@ -1117,14 +1127,15 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1117
1127
  federationBondWalletId = undefined;
1118
1128
  nextConfig = clearFederationBondWallet(nextConfig);
1119
1129
  }
1130
+ await writeConfigFile(nextConfig);
1120
1131
  deleteNamedWallet({
1121
1132
  walletId,
1122
- env: process.env
1133
+ env: archiveEnv
1123
1134
  });
1124
- await restartLocalSocketSigner(ensureWalletStateDir(process.env).rootDir);
1125
- await prompter.note(`Deleted wallet ${targetWallet.name} (${walletId}) from onboarding-safe management.`, "Wallet setup");
1135
+ delete process.env[rpcEnvKeyFor("solana", walletId)];
1136
+ await prompter.note(archivedSignerPolicy ? `Archived ${targetWallet.name} (${walletId}) from Fased. Native signer wallet ${archivedSignerPolicy.walletId} remains encrypted and locked by deny-all policy version ${archivedSignerPolicy.version}.` : `Removed ${targetWallet.name} (${walletId}) from Fased. Its external custody was not erased.`, "Wallet setup");
1126
1137
  } else {
1127
- await prompter.note("Wallet deletion cancelled.", "Wallet setup");
1138
+ await prompter.note("Wallet archive cancelled.", "Wallet setup");
1128
1139
  }
1129
1140
  addAnotherWallet = await prompter.confirm({
1130
1141
  message: "Run another wallet setup action?",
@@ -1188,21 +1199,39 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1188
1199
  continue;
1189
1200
  }
1190
1201
  }
1191
- const mode = selfHostedAction === "create" ? "local-signer-create" : "local-signer-import";
1202
+ const mode = "local-signer-create";
1192
1203
  const walletIdentity = await resolveWalletIdentityForOnboarding({
1193
1204
  flow,
1194
1205
  purpose: walletPurpose
1195
1206
  });
1196
1207
  const walletName = walletIdentity.walletName;
1197
1208
  const walletId = walletIdentity.walletId || undefined;
1198
- const keystoreKey = keystoreEnvKeyFor(chain, walletId);
1199
- const currentKeystoreValue = (nextConfig.env?.vars?.[keystoreKey] ?? "").trim() || String(process.env[keystoreKey] ?? "").trim();
1200
- const isolatedSignerRunAsUser = resolveLocalSignerRunAsUser(process.env);
1201
- const stagingKeystorePath = defaultKeystorePathFor(chain, walletId);
1202
- const effectiveKeystorePath = isolatedSignerRunAsUser ? stagingKeystorePath : currentKeystoreValue || stagingKeystorePath;
1203
- const isolatedTargetKeystorePath = isolatedSignerRunAsUser ? path.join(resolveLocalSignerMaterialRootDir(process.env), path.basename(stagingKeystorePath)) : undefined;
1204
- nextConfig = setConfigEnvVar(nextConfig, keystoreKey, effectiveKeystorePath);
1205
- process.env[keystoreKey] = effectiveKeystorePath;
1209
+ if (selfHostedAction === "import") {
1210
+ const effectiveWalletId = walletId ?? walletPurpose;
1211
+ const hosting = hostProfile === "hosting";
1212
+ const signerBin = hosting ? "/opt/fased/signer/fased-signerd" : resolveSignerdBinaryPath();
1213
+ const controlSocket = hosting ? "/run/fased-signerd/control.sock" : resolveLocalSignerControlSocketPath(process.env);
1214
+ const signerImportCommand = [
1215
+ shellQuote(signerBin),
1216
+ "admin wallet import",
1217
+ `--control-socket ${shellQuote(controlSocket)}`,
1218
+ `--wallet-id ${shellQuote(effectiveWalletId)}`,
1219
+ `--locked-role ${shellQuote(walletPurpose)}`,
1220
+ `< ${shellQuote("/absolute/path/to/solana-keypair.json")}`
1221
+ ].join(" ");
1222
+ const command = hosting ? `/usr/sbin/runuser -u fased-signer -- /usr/bin/env HOME=/var/lib/fased-signerd ${signerImportCommand}` : signerImportCommand;
1223
+ await prompter.note([
1224
+ "The normal Gateway and Node wizard paths do not accept plaintext wallet keys. Local same-user isolation is not a hard compromise boundary; Hosting isolates the signer account.",
1225
+ hosting ? "Open the VPS provider root console and run this root-administrator command. Do not run it from the app shell and do not grant app sudo:" : "Run this from an authenticated terminal on the signer host:",
1226
+ command,
1227
+ "Then rerun wallet setup and choose Manage wallet to register/verify the returned public address."
1228
+ ].join("\n"), "Native signer import");
1229
+ addAnotherWallet = await prompter.confirm({
1230
+ message: "Run another wallet setup action?",
1231
+ initialValue: false
1232
+ });
1233
+ continue;
1234
+ }
1206
1235
  const rpcKey = rpcEnvKeyFor(chain, walletId);
1207
1236
  const currentRpcValue = (nextConfig.env?.vars?.[rpcKey] ?? "").trim() || String(process.env[rpcKey] ?? "").trim();
1208
1237
  const rpcUrlInput = (await prompter.text({
@@ -1217,37 +1246,15 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1217
1246
  nextConfig = setConfigEnvVar(nextConfig, rpcKey, effectiveRpcUrl);
1218
1247
  process.env[rpcKey] = effectiveRpcUrl;
1219
1248
  try {
1220
- let moveToSignerDir = false;
1221
- if (isolatedTargetKeystorePath && syncFs.existsSync(isolatedTargetKeystorePath)) {
1222
- moveToSignerDir = await prompter.confirm({
1223
- message: "Signer keystore already exists. Overwrite it?",
1224
- initialValue: false
1225
- });
1226
- if (!moveToSignerDir) {
1227
- throw new Error(`Keystore already exists: ${isolatedTargetKeystorePath}`);
1228
- }
1229
- }
1230
- const prevSignerStateDir = process.env.FASED_WALLET_SIGNER_STATE_DIR;
1231
- const prevPassphraseFile = process.env.FASED_WALLET_PASSPHRASE_FILE;
1232
1249
  if (mode === "local-signer-create") {
1233
- const showPrivateKeyOnce = await prompter.confirm({
1234
- message: "Show generated private key once for offline backup?",
1235
- initialValue: false
1236
- });
1237
- const confirmPrivateKeyPrint = showPrivateKeyOnce ? "SHOW PRIVATE KEY" : undefined;
1238
1250
  try {
1239
- if (isolatedSignerRunAsUser) {
1240
- delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
1241
- delete process.env.FASED_WALLET_PASSPHRASE_FILE;
1242
- }
1243
1251
  await walletSetupCommand(runtime, {
1244
1252
  mode,
1245
1253
  chain,
1246
1254
  walletId,
1247
1255
  walletName,
1248
1256
  rpcUrl: effectiveRpcUrl,
1249
- showPrivateKeyOnce,
1250
- confirmPrivateKeyPrint,
1257
+ force: true,
1251
1258
  noDoctor: true,
1252
1259
  noSignerHints: true,
1253
1260
  nonInteractive: true
@@ -1262,15 +1269,12 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1262
1269
  if (!overwrite) {
1263
1270
  throw err;
1264
1271
  }
1265
- moveToSignerDir = true;
1266
1272
  await walletSetupCommand(runtime, {
1267
1273
  mode,
1268
1274
  chain,
1269
1275
  walletId,
1270
1276
  walletName,
1271
1277
  rpcUrl: effectiveRpcUrl,
1272
- showPrivateKeyOnce,
1273
- confirmPrivateKeyPrint,
1274
1278
  force: true,
1275
1279
  noDoctor: true,
1276
1280
  noSignerHints: true,
@@ -1279,68 +1283,18 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1279
1283
  } else {
1280
1284
  throw err;
1281
1285
  }
1282
- } finally {
1283
- if (isolatedSignerRunAsUser) {
1284
- if (prevSignerStateDir == null) {
1285
- delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
1286
- } else {
1287
- process.env.FASED_WALLET_SIGNER_STATE_DIR = prevSignerStateDir;
1288
- }
1289
- if (prevPassphraseFile == null) {
1290
- delete process.env.FASED_WALLET_PASSPHRASE_FILE;
1291
- } else {
1292
- process.env.FASED_WALLET_PASSPHRASE_FILE = prevPassphraseFile;
1293
- }
1294
- }
1295
1286
  }
1296
- } else {
1297
- const keyInput = typeof prompter.secret === "function" ? await prompter.secret({
1298
- message: "Solana private key (base58/json/base64/hex)",
1299
- validate: (value) => value.trim() ? undefined : "Required"
1300
- }) : await prompter.text({
1301
- message: "Solana private key (base58/json/base64/hex)",
1302
- validate: (value) => value.trim() ? undefined : "Required"
1303
- });
1304
- try {
1305
- if (isolatedSignerRunAsUser) {
1306
- delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
1307
- delete process.env.FASED_WALLET_PASSPHRASE_FILE;
1308
- }
1309
- await walletSetupCommand(runtime, {
1310
- mode: "local-signer-import",
1311
- chain,
1312
- walletId,
1313
- walletName,
1314
- privateKey: keyInput.trim(),
1315
- rpcUrl: effectiveRpcUrl,
1316
- noDoctor: true,
1317
- noSignerHints: true,
1318
- nonInteractive: true
1319
- });
1320
- } finally {
1321
- if (isolatedSignerRunAsUser) {
1322
- if (prevSignerStateDir == null) {
1323
- delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
1324
- } else {
1325
- process.env.FASED_WALLET_SIGNER_STATE_DIR = prevSignerStateDir;
1326
- }
1327
- if (prevPassphraseFile == null) {
1328
- delete process.env.FASED_WALLET_PASSPHRASE_FILE;
1329
- } else {
1330
- process.env.FASED_WALLET_PASSPHRASE_FILE = prevPassphraseFile;
1331
- }
1332
- }
1287
+ if (hostProfile === "hosting") {
1288
+ const nativeWalletId = (walletId ?? walletPurpose).trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "");
1289
+ await prompter.note([
1290
+ "The wallet key was created inside the root-managed signer with deny-all policy.",
1291
+ "The Gateway has no sudo or root control socket, so RPC activation is a separate host-administrator step.",
1292
+ "From a provider/root console, copy the installed network template to a root-owned mode-0600 file, set the exact RPC URLs, then run:",
1293
+ `/usr/local/sbin/fased-signer-network --wallet-id ${nativeWalletId} --network-file /root/fased-network.json`,
1294
+ "Signing stays disabled until network activation, owner enrollment, and an explicit positive-cap policy all succeed."
1295
+ ].join("\n"), "Hosted wallet owner handoff");
1333
1296
  }
1334
1297
  }
1335
- let configuredKeystorePath = effectiveKeystorePath;
1336
- if (isolatedSignerRunAsUser) {
1337
- configuredKeystorePath = migrateLocalSignerKeystoreToMaterialDir({
1338
- keystorePath: effectiveKeystorePath,
1339
- force: moveToSignerDir
1340
- });
1341
- nextConfig = setConfigEnvVar(nextConfig, keystoreKey, configuredKeystorePath);
1342
- process.env[keystoreKey] = configuredKeystorePath;
1343
- }
1344
1298
  walletCeremonyEvents.push({
1345
1299
  mode,
1346
1300
  chain,
@@ -1390,9 +1344,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1390
1344
  });
1391
1345
  }
1392
1346
  if (walletId) {
1393
- onboardingWalletSecurityFocus = walletPurpose === "mining" ? null : {
1347
+ onboardingWalletSecurityFocus = {
1394
1348
  walletId,
1395
- role: isAgentWallet ? "agent" : "vault"
1349
+ role: walletPurpose
1396
1350
  };
1397
1351
  }
1398
1352
  if (chain === "solana" && walletId) {
@@ -1421,7 +1375,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1421
1375
  await prompter.note([
1422
1376
  noteHeading("Mining wallet"),
1423
1377
  noteBullet(`${walletName} (${walletId})`),
1424
- noteBullet("Open Mining after onboarding to fund and start workers.")
1378
+ noteBullet("Receive-only until the signer network and an owner-reviewed Mining policy are acknowledged."),
1379
+ noteBullet("Open Wallet > Policy after onboarding; fund and start workers only after it reports acknowledged.")
1425
1380
  ].join("\n"), "Mining");
1426
1381
  } else if (currentMiningWalletId && currentMiningWalletId !== walletId) {
1427
1382
  await prompter.note([noteHeading("Mining wallet"), noteBullet(`Keeping existing: ${currentMiningWalletId}`)].join("\n"), "Mining");
@@ -1470,7 +1425,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1470
1425
  walletId: federationBondWalletId,
1471
1426
  walletName: readWalletProviderRegistry(process.env).wallets.find((wallet) => wallet.id === federationBondWalletId)?.name
1472
1427
  }) : "not assigned"}`),
1473
- noteBullet(`Jupiter wallet actions: ${readJupiterLimitOrderApiKey() ? "configured" : "not configured"}`)
1428
+ noteBullet(`Gateway Jupiter swaps: ${readJupiterSwapApiKey() ? "configured" : "not configured"}; Trigger: signer-owned configuration`)
1474
1429
  ];
1475
1430
  const rpcKeys = Array.from(new Set(walletCeremonyEvents.map((evt) => evt.rpcEnvKey).filter((key) => Boolean(key))));
1476
1431
  if (rpcKeys.length > 0) {