@fased/fased 0.1.61 → 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 (514) hide show
  1. package/CHANGELOG.md +43 -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/acp/client.js +2 -2
  12. package/dist/acp/secret-file.js +2 -2
  13. package/dist/agents/agent-scope.js +2 -2
  14. package/dist/agents/apply-patch.js +8 -8
  15. package/dist/agents/auth-profiles/paths.js +2 -2
  16. package/dist/agents/auth-profiles/store.js +269 -33
  17. package/dist/agents/bash-tools.exec.js +10 -4
  18. package/dist/agents/bash-tools.shared.js +2 -2
  19. package/dist/agents/cli-credentials.js +4 -4
  20. package/dist/agents/current-model-catalog.js +3 -3
  21. package/dist/agents/docs-path.js +3 -3
  22. package/dist/agents/embedded-pi-mcp.js +4 -4
  23. package/dist/agents/identity-avatar.js +3 -3
  24. package/dist/agents/identity-file.js +2 -2
  25. package/dist/agents/memory-search.js +7 -1
  26. package/dist/agents/model-catalog-access.js +1 -2
  27. package/dist/agents/model-catalog-snapshot.js +1 -1
  28. package/dist/agents/model-catalog-source.js +1 -1
  29. package/dist/agents/model-metadata.js +1 -1
  30. package/dist/agents/model-selection.js +2 -28
  31. package/dist/agents/models-config.providers.js +6 -6
  32. package/dist/agents/openai-codex-app-server.js +5 -5
  33. package/dist/agents/pi-embedded-runner/compact.js +15 -7
  34. package/dist/agents/pi-embedded-runner/model.js +1 -1
  35. package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
  36. package/dist/agents/pi-embedded-runner/run.js +2 -0
  37. package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
  38. package/dist/agents/pi-embedded-subscribe.raw-stream.js +3 -3
  39. package/dist/agents/pi-extensions/compaction-safeguard.js +3 -3
  40. package/dist/agents/pi-model-discovery.js +6 -6
  41. package/dist/agents/pi-project-settings.js +3 -3
  42. package/dist/agents/pi-tool-definition-adapter.js +16 -1
  43. package/dist/agents/pi-tools.js +2 -1
  44. package/dist/agents/sandbox/config.js +1 -1
  45. package/dist/agents/sandbox/context.js +27 -2
  46. package/dist/agents/sandbox/fs-bridge.js +2 -2
  47. package/dist/agents/session-dirs.js +4 -4
  48. package/dist/agents/session-write-lock.js +13 -13
  49. package/dist/agents/shell-utils.js +5 -5
  50. package/dist/agents/skills/bundled-dir.js +4 -4
  51. package/dist/agents/skills/env-overrides.js +38 -28
  52. package/dist/agents/skills/local-loader.js +6 -6
  53. package/dist/agents/skills/plugin-skills.js +2 -2
  54. package/dist/agents/skills/trust.js +93 -0
  55. package/dist/agents/skills/workspace.js +141 -13
  56. package/dist/agents/skills-clawhub.js +36 -11
  57. package/dist/agents/skills-install-download.js +7 -7
  58. package/dist/agents/skills-install-plan.js +2 -2
  59. package/dist/agents/skills-install.js +2 -2
  60. package/dist/agents/skills-marketplace-scan.js +49 -0
  61. package/dist/agents/skills-status.js +2 -2
  62. package/dist/agents/subagent-depth.js +2 -2
  63. package/dist/agents/system-prompt-params.js +2 -2
  64. package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
  65. package/dist/agents/tools/mining-tool.js +1 -1
  66. package/dist/agents/tools/session-status-tool.js +1 -1
  67. package/dist/agents/tools/wallet-action-tool.js +172 -36
  68. package/dist/agents/tools/wallet-skill-policy.js +65 -23
  69. package/dist/agents/tools/wallet-tool.js +7 -11
  70. package/dist/agents/workspace.js +22 -22
  71. package/dist/auto-reply/reply/agent-runner-execution.js +2 -2
  72. package/dist/auto-reply/reply/agent-runner.js +2 -2
  73. package/dist/auto-reply/reply/commands-export-session.js +7 -7
  74. package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
  75. package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
  76. package/dist/auto-reply/reply/directive-handling.model.js +2 -1
  77. package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
  78. package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
  79. package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
  80. package/dist/auto-reply/reply/model-selection.js +7 -4
  81. package/dist/auto-reply/reply/post-compaction-audit.js +3 -3
  82. package/dist/auto-reply/reply/post-compaction-context.js +3 -3
  83. package/dist/auto-reply/reply/session-reset-model.js +4 -4
  84. package/dist/auto-reply/reply/session.js +3 -3
  85. package/dist/auto-reply/skill-commands.js +3 -3
  86. package/dist/auto-reply/status.js +6 -6
  87. package/dist/brand.js +1 -1
  88. package/dist/browser/chrome.executables.js +3 -3
  89. package/dist/browser/chrome.js +3 -3
  90. package/dist/browser/chrome.profile-decoration.js +6 -6
  91. package/dist/browser/profiles-service.js +2 -2
  92. package/dist/browser/server-context.js +2 -2
  93. package/dist/browser/trash.js +4 -4
  94. package/dist/build-info.json +3 -3
  95. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  96. package/dist/canvas-host/server.js +4 -4
  97. package/dist/capabilities/catalog.js +3 -3
  98. package/dist/channel-web.js +2 -2
  99. package/dist/channels/plugins/catalog.js +3 -3
  100. package/dist/cli/browser-cli-extension.js +6 -6
  101. package/dist/cli/command-format.js +2 -2
  102. package/dist/cli/cron-cli/register.cron-simple.js +2 -2
  103. package/dist/cli/dns-cli.js +9 -9
  104. package/dist/cli/gateway-cli/dev.js +5 -5
  105. package/dist/cli/gateway-cli/run.js +10 -2
  106. package/dist/cli/hooks-cli.js +5 -5
  107. package/dist/cli/lightweight/gateway-runtime-probe.js +2 -2
  108. package/dist/cli/memory-cli.js +7 -7
  109. package/dist/cli/nodes-media-utils.js +2 -2
  110. package/dist/cli/plugins-cli.js +2 -2
  111. package/dist/cli/program/command-registry.js +1 -1
  112. package/dist/cli/program/register.onboard.js +2 -3
  113. package/dist/cli/program/register.wallet.js +16 -123
  114. package/dist/cli/providers-cli.js +1 -1
  115. package/dist/cli/sat-cli.js +129 -2
  116. package/dist/cli/secrets-cli.js +3 -3
  117. package/dist/cli/update-cli/update-command.js +260 -11
  118. package/dist/cli/windows-argv.js +2 -2
  119. package/dist/commands/auth-choice.apply.api-providers.js +3 -3
  120. package/dist/commands/dashboard-link.js +3 -3
  121. package/dist/commands/doctor-config-flow.js +1 -1
  122. package/dist/commands/doctor-install.js +5 -5
  123. package/dist/commands/doctor-legacy-config.js +2 -13
  124. package/dist/commands/doctor-memory-search.js +2 -2
  125. package/dist/commands/doctor-platform-notes.js +2 -2
  126. package/dist/commands/doctor-sandbox.js +2 -2
  127. package/dist/commands/doctor-state-integrity.js +23 -23
  128. package/dist/commands/doctor-workspace.js +3 -3
  129. package/dist/commands/doctor.js +3 -3
  130. package/dist/commands/managed-up.js +2 -2
  131. package/dist/commands/model-picker.js +6 -6
  132. package/dist/commands/models/auth.js +1 -1
  133. package/dist/commands/onboard-auth.config-gateways.js +1 -1
  134. package/dist/commands/onboard-auth.credentials.js +35 -11
  135. package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
  136. package/dist/commands/onboard-non-interactive/local.js +5 -1
  137. package/dist/commands/onboarding/plugin-install.js +2 -2
  138. package/dist/commands/sessions-cleanup.js +2 -2
  139. package/dist/commands/signal-install.js +6 -6
  140. package/dist/commands/status-all/channels.js +2 -2
  141. package/dist/commands/wallet.js +570 -1913
  142. package/dist/config/cache-utils.js +2 -2
  143. package/dist/config/config.js +2 -2
  144. package/dist/config/includes.js +5 -5
  145. package/dist/config/io.js +66 -4
  146. package/dist/config/paths.js +3 -3
  147. package/dist/config/sat-runtime-ids.js +3 -3
  148. package/dist/config/schema.help.js +8 -7
  149. package/dist/config/schema.labels.js +5 -4
  150. package/dist/config/sessions/disk-budget.js +6 -6
  151. package/dist/config/sessions/paths.js +2 -2
  152. package/dist/config/sessions/store.js +17 -17
  153. package/dist/config/sessions/transcript.js +4 -4
  154. package/dist/config/talk.js +2 -2
  155. package/dist/config/zod-schema.agent-runtime.js +1 -0
  156. package/dist/config/zod-schema.js +5 -0
  157. package/dist/control-ui/assets/{app-BXA4gPvN.js → app-bR-fO5ty.js} +1511 -1555
  158. package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
  159. package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
  160. package/dist/control-ui/assets/{index-D2QbJhVg.js → index-ckCxHwjy.js} +3 -3
  161. package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-BgHFh0ei.js} +134 -114
  162. package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
  163. package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
  164. package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
  165. package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
  166. package/dist/control-ui/index.html +1 -1
  167. package/dist/control-ui/version.json +1 -1
  168. package/dist/cron/service/store.js +2 -2
  169. package/dist/cron/store.js +6 -6
  170. package/dist/daemon/systemd-system.js +60 -54
  171. package/dist/discord/monitor/thread-bindings.state.js +2 -2
  172. package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
  173. package/dist/extensions/sat-mining/src/rpc-read.js +235 -67
  174. package/dist/extensions/sat-mining/src/sat-bond-layout.js +14 -11
  175. package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
  176. package/dist/extensions/sat-mining/src/solana-submit.js +1038 -397
  177. package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
  178. package/dist/federation/auto-connect.js +98 -8
  179. package/dist/federation/marketplace-capability-adapter.js +33 -7
  180. package/dist/federation/marketplace-delivery-outbox.js +196 -0
  181. package/dist/federation/marketplace-delivery.js +351 -215
  182. package/dist/federation/marketplace-direct-payment.js +272 -141
  183. package/dist/federation/marketplace-escrow.js +607 -249
  184. package/dist/federation/marketplace-settlement-ledger.js +352 -0
  185. package/dist/federation/offers.js +9 -7
  186. package/dist/federation/peer-auth-v2.js +529 -0
  187. package/dist/gateway/a2a-http.js +425 -96
  188. package/dist/gateway/a2a-settlement.js +259 -153
  189. package/dist/gateway/a2a-task-store.js +524 -0
  190. package/dist/gateway/auth.js +38 -2
  191. package/dist/gateway/config-reload.js +46 -33
  192. package/dist/gateway/control-ui-boot-check.js +6 -6
  193. package/dist/gateway/control-ui-login.js +7 -7
  194. package/dist/gateway/control-ui.js +9 -9
  195. package/dist/gateway/durable-capacity.js +31 -0
  196. package/dist/gateway/federation-http.js +540 -135
  197. package/dist/gateway/federation-marketplace-run-store.js +397 -0
  198. package/dist/gateway/federation-marketplace.js +535 -230
  199. package/dist/gateway/hooks-mapping.js +4 -4
  200. package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
  201. package/dist/gateway/security-path.js +1 -1
  202. package/dist/gateway/server-discovery.js +2 -2
  203. package/dist/gateway/server-http.js +1088 -1209
  204. package/dist/gateway/server-methods/chat.js +3 -3
  205. package/dist/gateway/server-methods/models.js +1 -1
  206. package/dist/gateway/server-methods/secrets.js +40 -0
  207. package/dist/gateway/server-methods/sessions.js +6 -6
  208. package/dist/gateway/server-methods/usage.js +2 -2
  209. package/dist/gateway/server-methods.js +1 -2
  210. package/dist/gateway/server-reload-handlers.js +196 -66
  211. package/dist/gateway/server-runtime-config.js +1 -1
  212. package/dist/gateway/server-secrets-runtime.js +288 -0
  213. package/dist/gateway/server.impl.js +73 -42
  214. package/dist/gateway/session-compaction-checkpoints.js +4 -4
  215. package/dist/gateway/session-utils.fs.js +24 -24
  216. package/dist/gateway/session-utils.js +6 -6
  217. package/dist/gateway/sessions-patch.js +3 -5
  218. package/dist/hooks/bundled-dir.js +4 -4
  219. package/dist/hooks/gmail-setup-utils.js +6 -6
  220. package/dist/hooks/import-url.js +2 -2
  221. package/dist/hooks/loader.js +4 -4
  222. package/dist/hooks/workspace.js +7 -7
  223. package/dist/index.js +4 -2
  224. package/dist/infra/archive.js +17 -17
  225. package/dist/infra/boundary-file-read.js +2 -2
  226. package/dist/infra/boundary-path.js +15 -15
  227. package/dist/infra/brew.js +2 -2
  228. package/dist/infra/control-ui-assets.js +14 -14
  229. package/dist/infra/device-auth-store.js +8 -8
  230. package/dist/infra/device-identity.js +8 -8
  231. package/dist/infra/dotenv.js +2 -2
  232. package/dist/infra/exec-approvals.js +8 -8
  233. package/dist/infra/exec-command-resolution.js +4 -4
  234. package/dist/infra/exec-safe-bin-trust.js +2 -2
  235. package/dist/infra/fased-root.js +5 -5
  236. package/dist/infra/fasedhub.js +64 -1
  237. package/dist/infra/fs-safe.js +14 -14
  238. package/dist/infra/gateway-lock.js +11 -11
  239. package/dist/infra/git-commit.js +5 -5
  240. package/dist/infra/git-root.js +4 -4
  241. package/dist/infra/hosted-runtime-artifact.js +3 -3
  242. package/dist/infra/is-main.js +2 -2
  243. package/dist/infra/json-file.js +7 -7
  244. package/dist/infra/local-source-paired-update.js +538 -0
  245. package/dist/infra/managed-runtime-bootstrap.js +6 -6
  246. package/dist/infra/outbound/delivery-queue.js +16 -16
  247. package/dist/infra/path-env.js +3 -3
  248. package/dist/infra/ports-lsof.js +4 -4
  249. package/dist/infra/provider-usage.auth.js +3 -3
  250. package/dist/infra/restart.js +41 -10
  251. package/dist/infra/safe-open-sync.js +2 -2
  252. package/dist/infra/session-cost-usage.js +9 -9
  253. package/dist/infra/shell-env.js +2 -2
  254. package/dist/infra/state-migrations.fs.js +6 -6
  255. package/dist/infra/state-migrations.js +23 -23
  256. package/dist/infra/tmp-fased-dir.js +6 -6
  257. package/dist/infra/update-runner.js +96 -0
  258. package/dist/infra/widearea-dns.js +3 -3
  259. package/dist/infra/wsl.js +2 -2
  260. package/dist/light-update-status.js +11 -11
  261. package/dist/line/accounts.js +2 -2
  262. package/dist/line/download.js +2 -2
  263. package/dist/logging/config.js +3 -3
  264. package/dist/logging/logger.js +7 -7
  265. package/dist/managed/federation.js +3 -3
  266. package/dist/managed/tunnel.js +3 -3
  267. package/dist/media/store.js +13 -13
  268. package/dist/media-understanding/runner.js +3 -3
  269. package/dist/memory/backend-config.js +2 -1
  270. package/dist/memory/embeddings.js +2 -2
  271. package/dist/memory/internal.js +10 -10
  272. package/dist/memory/manager-sync-ops.js +7 -7
  273. package/dist/memory/repair-executor.js +17 -17
  274. package/dist/memory/session-files.js +16 -2
  275. package/dist/node-host/invoke-system-run-plan.js +8 -8
  276. package/dist/node-host/invoke.js +2 -2
  277. package/dist/node-host/runner.js +3 -3
  278. package/dist/pairing/pairing-store.js +3 -3
  279. package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
  280. package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
  281. package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
  282. package/dist/plugin-sdk/{audio-preflight-Bv0hUOWL.js → audio-preflight-BYxAt775.js} +27 -27
  283. package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
  284. package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
  285. package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
  286. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  287. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  288. package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
  289. package/dist/plugin-sdk/{chunk-items-Bk--NU3E.js → chunk-items-DIRHG2gJ.js} +1 -1
  290. package/dist/plugin-sdk/command-status.d.ts +2 -2
  291. package/dist/plugin-sdk/command-status.js +27 -27
  292. package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
  293. package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
  294. package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
  295. package/dist/plugin-sdk/{config-schema-CGW6J3Pv.js → config-schema-BOT7kHb6.js} +6779 -3696
  296. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  297. package/dist/plugin-sdk/discord.d.ts +5 -5
  298. package/dist/plugin-sdk/discord.js +19 -19
  299. package/dist/plugin-sdk/file-lock.js +35 -4
  300. package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
  301. package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
  302. package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
  303. package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
  304. package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
  305. package/dist/plugin-sdk/index.d.ts +9 -27
  306. package/dist/plugin-sdk/index.js +29 -29
  307. package/dist/plugin-sdk/json-store.js +6 -6
  308. package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
  309. package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
  310. package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
  311. package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
  312. package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
  313. package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
  314. package/dist/plugin-sdk/{monitor-B9Cmt_Je.js → monitor-BCFDaqJ-.js} +31 -31
  315. package/dist/plugin-sdk/{monitor-B71iwAgC.js → monitor-BgbjRiPM.js} +32 -32
  316. package/dist/plugin-sdk/{openresponses-http-Du4GMmwo.js → openresponses-http-DFf87SMM.js} +27 -27
  317. package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
  318. package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
  319. package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
  320. package/dist/plugin-sdk/{pairing-message-BMkkS038.d.ts → pairing-message-CS-9BHug.d.ts} +2 -2
  321. package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
  322. package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
  323. package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
  324. package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
  325. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  326. package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
  327. package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
  328. package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
  329. package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
  330. package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
  331. package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
  332. package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
  333. package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
  334. package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
  335. package/dist/plugin-sdk/sat-runtime.d.ts +549 -309
  336. package/dist/plugin-sdk/sat-runtime.js +29 -29
  337. package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
  338. package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
  339. package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
  340. package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
  341. package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
  342. package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
  343. package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
  344. package/dist/plugin-sdk/{slack-D_bbE6Yd.js → slack-BUTt8cxK.js} +39 -39
  345. package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
  346. package/dist/plugin-sdk/slack.d.ts +5 -5
  347. package/dist/plugin-sdk/slack.js +9 -9
  348. package/dist/plugin-sdk/{sticker-cache-Dqo9nRhi.js → sticker-cache-D0wHVqjt.js} +3 -3
  349. package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
  350. package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
  351. package/dist/plugin-sdk/{telegram-actions-Cnag7JTH.js → telegram-actions-CC_qN4v0.js} +30 -30
  352. package/dist/plugin-sdk/telegram.d.ts +5 -5
  353. package/dist/plugin-sdk/telegram.js +8 -8
  354. package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
  355. package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
  356. package/dist/plugin-sdk/tmp-fased-dir-xOTGlzBE.d.ts +486 -0
  357. package/dist/plugin-sdk/{types-CLIvQaVg.d.ts → types-C3avNytw.d.ts} +3 -4
  358. package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
  359. package/dist/plugin-sdk/{types-BYDL6dQj.d.ts → types-DWfbSAaM.d.ts} +2 -2
  360. package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
  361. package/dist/plugin-sdk/{web-BInKQkc4.js → web-BXsJ1vqe.js} +32 -32
  362. package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
  363. package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
  364. package/dist/plugin-sdk/whatsapp.d.ts +5 -5
  365. package/dist/plugin-sdk/whatsapp.js +12 -12
  366. package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
  367. package/dist/plugins/bundled-dir.js +3 -3
  368. package/dist/plugins/discovery.js +11 -11
  369. package/dist/plugins/loader.js +13 -13
  370. package/dist/plugins/manifest-registry.js +2 -2
  371. package/dist/plugins/manifest.js +4 -4
  372. package/dist/plugins/path-safety.js +3 -3
  373. package/dist/plugins/status-cache.js +9 -9
  374. package/dist/plugins/update.js +3 -3
  375. package/dist/plugins/web-search-install-catalog.js +3 -3
  376. package/dist/providers/refresh.js +1 -1
  377. package/dist/providers/registry.js +1 -1
  378. package/dist/secrets/apply.js +17 -17
  379. package/dist/secrets/audit.js +11 -11
  380. package/dist/secrets/runtime.js +1 -1
  381. package/dist/secrets/shared.js +9 -9
  382. package/dist/security/scan-paths.js +2 -2
  383. package/dist/shared/config-eval.js +2 -2
  384. package/dist/shared/pid-alive.js +2 -2
  385. package/dist/tasks/standing-orders.js +5 -5
  386. package/dist/tasks/task-flow-registry.js +5 -5
  387. package/dist/tasks/task-registry.js +5 -5
  388. package/dist/tasks/workflow-definitions.js +6 -6
  389. package/dist/telegram/token.js +5 -5
  390. package/dist/utils.js +5 -5
  391. package/dist/wallet/external-submission-ledger.js +376 -0
  392. package/dist/wallet/legacy-embedded-keystore.js +40 -0
  393. package/dist/wallet/local-socket-signer-archive.js +30 -0
  394. package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
  395. package/dist/wallet/local-socket-signer-policy.js +166 -0
  396. package/dist/wallet/local-socket-signer-protocol.js +561 -118
  397. package/dist/wallet/native-signer-wallet-id.js +25 -0
  398. package/dist/wallet/providers/alchemy-adapter.js +3 -0
  399. package/dist/wallet/providers/local-socket-signer-adapter.js +382 -107
  400. package/dist/wallet/providers/turnkey-adapter.js +292 -34
  401. package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
  402. package/dist/wallet/signer-network-admin.js +184 -0
  403. package/dist/wallet/signer-protocol-v2.generated.js +90 -0
  404. package/dist/wallet/solana-bond-signing.js +157 -69
  405. package/dist/wallet/solana-reviewed-transaction.js +375 -0
  406. package/dist/wallet/solana-swap.js +520 -64
  407. package/dist/wallet/solana-transaction-inspection.js +106 -4
  408. package/dist/wallet/solana-trigger.js +658 -320
  409. package/dist/wallet/turnkey-reviewed-state.js +370 -0
  410. package/dist/wallet/wallet-approval-auth.js +20 -31
  411. package/dist/wallet/wallet-atomic-state.js +53 -0
  412. package/dist/wallet/wallet-audit-log.js +5 -5
  413. package/dist/wallet/wallet-canary.js +0 -1
  414. package/dist/wallet/wallet-inbound-events.js +19 -14
  415. package/dist/wallet/wallet-observability.js +5 -5
  416. package/dist/wallet/wallet-policy-simulation.js +1 -1
  417. package/dist/wallet/wallet-policy.js +95 -41
  418. package/dist/wallet/wallet-provider-capabilities.js +28 -4
  419. package/dist/wallet/wallet-provider-registry.js +64 -51
  420. package/dist/wallet/wallet-provider-resolver.js +62 -63
  421. package/dist/wallet/wallet-runtime-config.js +31 -44
  422. package/dist/wallet/wallet-secrets-store.js +44 -22
  423. package/dist/wallet/wallet-send-approvals.js +1894 -592
  424. package/dist/wallet/wallet-send-execution-ledger.js +292 -0
  425. package/dist/wallet/wallet-settlement-links.js +17 -16
  426. package/dist/wallet/wallet-standard-review.js +353 -0
  427. package/dist/wallet/wallet-status.js +0 -9
  428. package/dist/wallet/wallet-task-ledger.js +16 -2
  429. package/dist/web/accounts.js +3 -3
  430. package/dist/web/auth-store.js +18 -18
  431. package/dist/web/auto-reply/heartbeat-runner.js +1 -1
  432. package/dist/web/auto-reply/monitor.js +2 -2
  433. package/dist/web/session.js +4 -4
  434. package/dist/wizard/host-security-capability.js +15 -24
  435. package/dist/wizard/onboarding.finalize.js +63 -184
  436. package/dist/wizard/onboarding.host-security.js +118 -1368
  437. package/dist/wizard/onboarding.js +180 -242
  438. package/dist/wizard/onboarding.wallet.js +323 -829
  439. package/extensions/acpx/package.json +1 -1
  440. package/extensions/bluebubbles/package.json +1 -1
  441. package/extensions/copilot-proxy/package.json +1 -1
  442. package/extensions/diagnostics-otel/package.json +1 -1
  443. package/extensions/fased-federation/package.json +1 -1
  444. package/extensions/google-gemini-cli-auth/package.json +1 -1
  445. package/extensions/imessage/package.json +1 -1
  446. package/extensions/irc/package.json +1 -1
  447. package/extensions/line/package.json +1 -1
  448. package/extensions/llm-task/package.json +1 -1
  449. package/extensions/lobster/package.json +1 -1
  450. package/extensions/matrix/CHANGELOG.md +18 -0
  451. package/extensions/matrix/package.json +1 -1
  452. package/extensions/mattermost/package.json +1 -1
  453. package/extensions/memory-core/package.json +2 -2
  454. package/extensions/memory-lancedb/package.json +1 -1
  455. package/extensions/minimax-portal-auth/package.json +1 -1
  456. package/extensions/msteams/CHANGELOG.md +18 -0
  457. package/extensions/msteams/package.json +1 -1
  458. package/extensions/nextcloud-talk/package.json +1 -1
  459. package/extensions/nostr/CHANGELOG.md +18 -0
  460. package/extensions/nostr/package.json +1 -1
  461. package/extensions/open-prose/package.json +1 -1
  462. package/extensions/sat-mining/index.ts +498 -153
  463. package/extensions/sat-mining/package.json +1 -1
  464. package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
  465. package/extensions/sat-mining/src/audit-store.ts +50 -5
  466. package/extensions/sat-mining/src/claim-service.ts +85 -14
  467. package/extensions/sat-mining/src/config.ts +9 -0
  468. package/extensions/sat-mining/src/cycle-progress.ts +16 -8
  469. package/extensions/sat-mining/src/epoch-service.ts +9 -5
  470. package/extensions/sat-mining/src/gateway-runner.ts +21 -1
  471. package/extensions/sat-mining/src/protocol-contract.ts +45 -1
  472. package/extensions/sat-mining/src/recovery-service.ts +312 -0
  473. package/extensions/sat-mining/src/round-watcher.ts +391 -81
  474. package/extensions/sat-mining/src/rpc-read.ts +330 -89
  475. package/extensions/sat-mining/src/runtime.ts +14 -0
  476. package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
  477. package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
  478. package/extensions/sat-mining/src/solana-submit.ts +1199 -428
  479. package/extensions/sat-mining/src/submission-ledger.ts +433 -0
  480. package/extensions/signal/package.json +1 -1
  481. package/extensions/synology-chat/package.json +1 -1
  482. package/extensions/tlon/package.json +1 -1
  483. package/extensions/twitch/CHANGELOG.md +18 -0
  484. package/extensions/twitch/package.json +1 -1
  485. package/extensions/voice-call/CHANGELOG.md +18 -0
  486. package/extensions/voice-call/package.json +1 -1
  487. package/extensions/zalo/CHANGELOG.md +18 -0
  488. package/extensions/zalo/package.json +1 -1
  489. package/extensions/zalouser/CHANGELOG.md +18 -0
  490. package/extensions/zalouser/package.json +1 -1
  491. package/install.sh +4955 -0
  492. package/package.json +24 -5
  493. package/scripts/fased-host-updater.mjs +1421 -0
  494. package/scripts/fased-host-updaterctl.mjs +186 -0
  495. package/scripts/fased-managed-service.sh +36 -0
  496. package/scripts/fased-managed-updater.mjs +3065 -156
  497. package/scripts/fased-signer-enroll-hosting.sh +275 -0
  498. package/scripts/fased-signer-network-hosting.sh +143 -0
  499. package/scripts/fased-signer-owner-policy.mjs +1430 -0
  500. package/scripts/fased-signer-policy-hosting.sh +50 -0
  501. package/scripts/fased-signer-policy-local.sh +26 -0
  502. package/scripts/hosted-release-manifest.mjs +185 -0
  503. package/scripts/install-fased-signerd.sh +217 -0
  504. package/scripts/install-managed-runtime.mjs +212 -10
  505. package/scripts/managed-runtime-layout.mjs +75 -3
  506. package/scripts/migrate-hosted-signer-v2.mjs +58 -0
  507. package/scripts/start-managed.sh +169 -360
  508. package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
  509. package/dist/plugin-sdk/tmp-fased-dir-BdFQvrvw.d.ts +0 -77
  510. package/dist/wallet/local-socket-signer-broker.js +0 -224
  511. package/dist/wallet/local-socket-signer-custody.js +0 -42
  512. package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
  513. package/dist/wallet/providers/privy-adapter.js +0 -80
  514. 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";
@@ -32,7 +34,7 @@ import { finalizeOnboardingWizard } from "./onboarding.finalize.js";
32
34
  import { configureGatewayForOnboarding } from "./onboarding.gateway-config.js";
33
35
  import { applyHostingSecurity } from "./onboarding.host-security.js";
34
36
  import { normalizeHostedWalletPaths } from "./wallet-path-migration.js";
35
- import fs from "node:fs";
37
+ import syncFs from "node:fs";
36
38
  import path from "node:path";
37
39
  import { spawn, spawnSync } from "node:child_process";
38
40
 
@@ -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) => {
@@ -446,16 +413,10 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
446
413
  };
447
414
  const readAgentWalletSummary = () => readAgentDefaultWallet().walletId ? readAgentDefaultWallet() : readRoleWallet("agent");
448
415
  const goModernEnough = () => {
449
- const probe = spawnSync("bash", ["-lc", "if [ -n \"${FASED_GO_BIN:-}\" ] && [ -x \"$FASED_GO_BIN\" ]; then GOCMD=\"$FASED_GO_BIN\"; " + "elif [ -x /usr/local/go/bin/go ]; then GOCMD=/usr/local/go/bin/go; " + "elif command -v go >/dev/null 2>&1; then GOCMD=$(command -v go); " + "else exit 1; fi; " + "v=$($GOCMD version 2>/dev/null | awk '{print $3}' | sed 's/^go//'); " + "maj=$(echo \"$v\" | cut -d. -f1); min=$(echo \"$v\" | cut -d. -f2); " + "([ \"${maj:-0}\" -gt 1 ] || ([ \"${maj:-0}\" -eq 1 ] && [ \"${min:-0}\" -ge 21 ]))"], { stdio: "ignore" });
416
+ const probe = spawnSync("bash", ["-lc", "if [ -n \"${FASED_GO_BIN:-}\" ] && [ -x \"$FASED_GO_BIN\" ]; then GOCMD=\"$FASED_GO_BIN\"; " + "elif [ -x /usr/local/go/bin/go ]; then GOCMD=/usr/local/go/bin/go; " + "elif command -v go >/dev/null 2>&1; then GOCMD=$(command -v go); " + "else exit 1; fi; " + "v=$($GOCMD version 2>/dev/null | awk '{print $3}' | sed 's/^go//'); " + "maj=$(echo \"$v\" | cut -d. -f1); min=$(echo \"$v\" | cut -d. -f2); patch=$(echo \"$v\" | cut -d. -f3 | sed \"s/[^0-9].*$//\"); " + "([ \"${maj:-0}\" -gt 1 ] || ([ \"${maj:-0}\" -eq 1 ] && ([ \"${min:-0}\" -gt 25 ] || ([ \"${min:-0}\" -eq 25 ] && [ \"${patch:-0}\" -ge 7 ]))))"], { stdio: "ignore" });
450
417
  return probe.status === 0;
451
418
  };
452
419
  const shellQuote = (value) => `'${value.replaceAll("'", `'"'"'`)}'`;
453
- const hasExplicitSignerAssetSource = () => {
454
- const baseUrl = String(process.env.FASED_LOCAL_SIGNER_BASE_URL ?? "").trim();
455
- const version = String(process.env.FASED_LOCAL_SIGNER_VERSION ?? "").trim();
456
- const latestTag = String(process.env.FASED_LOCAL_SIGNER_LATEST_TAG ?? "").trim();
457
- return Boolean(baseUrl && !baseUrl.includes("github.com/fased-ai/fased/releases/download") || version && version !== "latest" || latestTag && latestTag !== "latest");
458
- };
459
420
  const runShell = async (command) => {
460
421
  await new Promise((resolve, reject) => {
461
422
  const proc = spawn("bash", ["-lc", command], {
@@ -490,11 +451,11 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
490
451
  if (process.platform !== "linux" || !hasCommand("curl") || !hasCommand("tar")) {
491
452
  return "unavailable";
492
453
  }
493
- const goVersion = String(process.env.FASED_GO_VERSION ?? "1.23.6").trim() || "1.23.6";
454
+ const goVersion = String(process.env.FASED_GO_VERSION ?? "1.25.7").trim() || "1.25.7";
494
455
  const stateRoot = String(process.env.FASED_STATE_DIR ?? "").trim() || path.join(String(process.env.HOME ?? "").trim() || process.cwd(), ".fased");
495
456
  const installRoot = path.join(stateRoot, "toolchains", `go${goVersion}`);
496
457
  const goBin = path.join(installRoot, "bin", "go");
497
- if (fs.existsSync(goBin)) {
458
+ if (syncFs.existsSync(goBin)) {
498
459
  process.env.FASED_GO_BIN = goBin;
499
460
  return goModernEnough() ? "installed" : "unavailable";
500
461
  }
@@ -527,7 +488,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
527
488
  if (String(process.env.FASED_FORCE_NATIVE_SIGNER_BUILD ?? "").trim() === "1") {
528
489
  return false;
529
490
  }
530
- return fs.existsSync(resolveSignerdBinaryPath(process.env));
491
+ return syncFs.existsSync(resolveSignerdBinaryPath(process.env));
531
492
  };
532
493
  const maybeInstallGoForOnboarding = async () => {
533
494
  if (goModernEnough()) {
@@ -544,7 +505,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
544
505
  return false;
545
506
  }
546
507
  const installNow = await prompter.confirm({
547
- message: "Go >=1.21 is required for native signer. Install/update Go now?",
508
+ message: "Go >=1.25.7 is required for a source-built native signer. Install/update Go now?",
548
509
  initialValue: true
549
510
  });
550
511
  if (!installNow) {
@@ -552,7 +513,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
552
513
  }
553
514
  const progress = prompter.progress("Installing Go toolchain…");
554
515
  try {
555
- await runShell("arch=$(dpkg --print-architecture 2>/dev/null || uname -m); " + "case \"$arch\" in amd64|x86_64) goarch=amd64 ;; arm64|aarch64) goarch=arm64 ;; *) echo \"Unsupported arch: $arch\"; exit 1 ;; esac; " + "goversion=${FASED_GO_VERSION:-1.23.6}; " + "tmp=$(mktemp); " + "curl -fsSL \"https://go.dev/dl/go${goversion}.linux-${goarch}.tar.gz\" -o \"$tmp\"; " + "sudo rm -rf /usr/local/go; " + "sudo tar -C /usr/local -xzf \"$tmp\"; " + "rm -f \"$tmp\"; " + "sudo ln -sf /usr/local/go/bin/go /usr/local/bin/go");
516
+ await runShell("arch=$(dpkg --print-architecture 2>/dev/null || uname -m); " + "case \"$arch\" in amd64|x86_64) goarch=amd64 ;; arm64|aarch64) goarch=arm64 ;; *) echo \"Unsupported arch: $arch\"; exit 1 ;; esac; " + "goversion=${FASED_GO_VERSION:-1.25.7}; " + "tmp=$(mktemp); " + "curl -fsSL \"https://go.dev/dl/go${goversion}.linux-${goarch}.tar.gz\" -o \"$tmp\"; " + "sudo rm -rf /usr/local/go; " + "sudo tar -C /usr/local -xzf \"$tmp\"; " + "rm -f \"$tmp\"; " + "sudo ln -sf /usr/local/go/bin/go /usr/local/bin/go");
556
517
  progress.stop("Go toolchain ready.");
557
518
  } catch (error) {
558
519
  progress.stop("Go toolchain install failed.");
@@ -560,15 +521,6 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
560
521
  }
561
522
  return goModernEnough();
562
523
  };
563
- const prepareLocalSignerForOnboarding = async (params) => {
564
- if (fs.existsSync(params.binPath) || String(process.env.FASED_SKIP_NATIVE_SIGNER_BUILD ?? "").trim() === "1" || hasExplicitSignerAssetSource()) {
565
- return;
566
- }
567
- if (goModernEnough()) {
568
- return;
569
- }
570
- await installPrivateGoForOnboarding();
571
- };
572
524
  printWizardHeader(runtime);
573
525
  await requireRiskAcknowledgement({
574
526
  opts,
@@ -654,16 +606,25 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
654
606
  }
655
607
  const interactiveHostProfileInitialValue = !hostSecurityCapable && requestedHostProfile === "hosting" ? "local" : requestedHostProfile || "local";
656
608
  const explicitHostProfileRequested = requestedHostProfile !== undefined;
657
- 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
+ }
658
617
  const hostProfile = opts.mode === "remote" ? "local" : requestedHostProfile ? requestedHostProfile : await (async () => {
659
618
  const selected = await prompter.select({
660
619
  message: "Host setup profile",
661
620
  options: [{
662
621
  value: "local",
663
- label: "Local"
622
+ label: "Local",
623
+ hint: "Current machine and account; no VPS hardening."
664
624
  }, {
665
625
  value: "hosting",
666
- label: "Hosting"
626
+ label: "Hosting",
627
+ hint: "Verified root bootstrap; Tailscale required."
667
628
  }],
668
629
  initialValue: interactiveHostProfileInitialValue
669
630
  });
@@ -802,6 +763,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
802
763
  }));
803
764
  const workspaceDir = resolveUserPath(workspaceInput.trim() || DEFAULT_WORKSPACE);
804
765
  let nextConfig = applyOnboardingLocalWorkspaceConfig(baseConfig, workspaceDir);
766
+ nextConfig = setConfigEnvVar(nextConfig, legacyJupiterTriggerApiBaseUrlEnvKey, undefined);
767
+ delete process.env[legacyJupiterTriggerApiBaseUrlEnvKey];
805
768
  nextConfig = normalizeHostedWalletPaths(nextConfig, process.env);
806
769
  const authChoice = opts.authChoice;
807
770
  if (authChoice === "custom-api-key") {
@@ -861,6 +824,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
861
824
  const hostingMode = hostProfile === "hosting";
862
825
  if (hostingMode) {
863
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}`;
864
830
  }
865
831
  const buildNativeSignerFromSource = String(process.env.FASED_BUILD_NATIVE_SIGNER_FROM_SOURCE ?? "").trim() === "1";
866
832
  const skipNativeSignerBuild = String(process.env.FASED_SKIP_NATIVE_SIGNER_BUILD ?? "").trim() === "1";
@@ -874,7 +840,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
874
840
  await prompter.note("Native signer already current.", "Native signer");
875
841
  }
876
842
  } else if (!await maybeInstallGoForOnboarding()) {
877
- const detail = "Go >=1.21 is required for native signer build/install.";
843
+ const detail = "Go >=1.25.7 is required for a source-built native signer.";
878
844
  if (hostingMode && !opts.allowInsecure) {
879
845
  throw new Error(`${detail} Install Go and rerun onboarding, or unset FASED_BUILD_NATIVE_SIGNER_FROM_SOURCE.`);
880
846
  }
@@ -895,10 +861,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
895
861
  flow,
896
862
  hostProfile,
897
863
  nextConfig,
898
- prepareLocalSigner: prepareLocalSignerForOnboarding,
899
864
  prompter
900
865
  });
901
- nextConfig = syncLocalSignerRuntimeEnvIntoConfig(nextConfig);
866
+ nextConfig = hostingMode ? applyHostedLocalSignerDefaults(nextConfig) : syncLocalSignerRuntimeEnvIntoConfig(nextConfig);
902
867
  let onboardingWalletSecurityFocus = null;
903
868
  const offerHostedWalletSetup = hostingMode && flow === "quickstart" && nextConfig.wallet?.runtime?.enabled !== true;
904
869
  if (nextConfig.wallet?.runtime?.enabled || offerHostedWalletSetup) {
@@ -922,9 +887,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
922
887
  label: "Manage wallet"
923
888
  },
924
889
  {
925
- value: "limit-orders",
926
- label: "Limit orders",
927
- 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"
928
893
  },
929
894
  {
930
895
  value: "skip",
@@ -937,8 +902,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
937
902
  if (setupMode === "skip") {
938
903
  break;
939
904
  }
940
- if (setupMode === "limit-orders") {
941
- await promptAndStoreJupiterLimitOrders();
905
+ if (setupMode === "jupiter-swaps") {
906
+ await promptAndStoreJupiterSwapApi();
942
907
  addAnotherWallet = await prompter.confirm({
943
908
  message: "Run another wallet setup action?",
944
909
  initialValue: false
@@ -947,7 +912,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
947
912
  }
948
913
  if (setupMode === "manage-self-hosted") {
949
914
  const registry = readWalletProviderRegistry(process.env);
950
- 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");
951
916
  if (managedWallets.length === 0) {
952
917
  await prompter.note("No wallets are registered yet. Create or import one first.", "Wallet setup");
953
918
  addAnotherWallet = await prompter.confirm({
@@ -976,8 +941,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
976
941
  const currentMiningWalletId = satMiningAttachment.walletId ?? "";
977
942
  const currentBondWalletId = federationBondWalletId ?? "";
978
943
  const configuredSolanaRpcUrl = (nextConfig.env?.vars?.[rpcEnvKeyFor("solana", walletId)] ?? "").trim() || String(process.env[rpcEnvKeyFor("solana", walletId)] ?? "").trim();
979
- const configuredSolanaKeystore = (nextConfig.env?.vars?.[keystoreEnvKeyFor("solana", walletId)] ?? "").trim() || String(process.env[keystoreEnvKeyFor("solana", walletId)] ?? "").trim();
980
- const supportsSolanaWallet = Boolean(targetWallet.addresses?.solana || configuredSolanaKeystore);
944
+ const supportsSolanaWallet = Boolean(targetWallet.addresses?.solana || targetWallet.providerId === "local-socket-signer");
981
945
  const targetWalletPurpose = resolveWalletUserRole(targetWallet);
982
946
  const manageAction = await prompter.select({
983
947
  message: "Wallet action",
@@ -985,7 +949,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
985
949
  ...supportsSolanaWallet ? [{
986
950
  value: "configure-solana-rpc",
987
951
  label: configuredSolanaRpcUrl ? "Update Solana RPC" : "Add Solana RPC",
988
- 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."
989
953
  }] : [],
990
954
  ...supportsSolanaWallet && currentBondWalletId === walletId ? [{
991
955
  value: "detach-federation-bond",
@@ -997,9 +961,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
997
961
  hint: currentBondWalletId && currentBondWalletId !== walletId ? `Current bond Vault: ${currentBondWalletId}` : "Use this Vault wallet for longer-lived SAT bond authority."
998
962
  }] : [],
999
963
  {
1000
- value: "delete",
1001
- label: "Delete wallet",
1002
- 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."
1003
967
  },
1004
968
  {
1005
969
  value: "cancel",
@@ -1026,8 +990,27 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1026
990
  walletName: targetWallet.name,
1027
991
  currentValue: configuredSolanaRpcUrl
1028
992
  });
1029
- await restartLocalSocketSigner(ensureWalletStateDir(process.env).rootDir);
1030
- 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");
1031
1014
  addAnotherWallet = await prompter.confirm({
1032
1015
  message: "Run another wallet setup action?",
1033
1016
  initialValue: false
@@ -1079,51 +1062,62 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1079
1062
  });
1080
1063
  continue;
1081
1064
  }
1065
+ const archiveEnv = {
1066
+ ...process.env,
1067
+ ...nextConfig.env?.vars,
1068
+ FASED_HOST_PROFILE: hostProfile
1069
+ };
1082
1070
  const deletionSafety = checkNamedWalletDeletionSafety({
1083
1071
  walletId: targetWallet.id,
1084
- env: process.env
1072
+ env: archiveEnv
1085
1073
  });
1086
1074
  if (!deletionSafety.ok) {
1087
- await prompter.note(deletionSafety.message, "Delete blocked");
1075
+ await prompter.note(deletionSafety.message, "Archive blocked");
1088
1076
  addAnotherWallet = await prompter.confirm({
1089
1077
  message: "Run another wallet setup action?",
1090
1078
  initialValue: false
1091
1079
  });
1092
1080
  continue;
1093
1081
  }
1094
- const deleteWarnings = [
1095
- `This deletes the local wallet registration and local keystore files for ${targetWallet.name} (${targetWallet.id}).`,
1096
- "It does not transfer funds and it cannot recover funds if you did not save the seed/private key first.",
1097
- "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."
1098
1087
  ];
1099
1088
  if (currentMiningWalletId === targetWallet.id || targetWalletPurpose === "mining") {
1100
- 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.");
1101
1090
  }
1102
- 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.");
1103
- 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");
1104
1093
  const typedWalletId = await prompter.text({
1105
- message: `Type wallet id "${targetWallet.id}" to delete this wallet`,
1094
+ message: `Type wallet id "${targetWallet.id}" to archive/remove this wallet from Fased`,
1106
1095
  validate: (value) => value.trim() === targetWallet.id ? undefined : `Type ${targetWallet.id}`
1107
1096
  });
1108
1097
  if (typedWalletId.trim() === targetWallet.id) {
1109
1098
  const walletId = targetWallet.id;
1110
- const keystoreKeys = [keystoreEnvKeyFor("solana", walletId)];
1111
- const defaultKeystorePaths = [defaultKeystorePathFor("solana", walletId)];
1112
- const configuredPaths = keystoreKeys.map((key) => (nextConfig.env?.vars?.[key] ?? "").trim() || String(process.env[key] ?? "").trim()).filter(Boolean);
1113
- for (const file of new Set([...configuredPaths, ...defaultKeystorePaths])) {
1099
+ let archivedSignerPolicy;
1100
+ if (signerOwned) {
1114
1101
  try {
1115
- if (file && fs.existsSync(file)) {
1116
- fs.rmSync(file, { force: true });
1117
- }
1118
- } catch {}
1119
- }
1120
- for (const key of keystoreKeys) {
1121
- nextConfig = setConfigEnvVar(nextConfig, key, undefined);
1122
- 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
+ }
1123
1118
  }
1124
1119
  for (const key of [rpcEnvKeyFor("solana", walletId)]) {
1125
1120
  nextConfig = setConfigEnvVar(nextConfig, key, undefined);
1126
- delete process.env[key];
1127
1121
  }
1128
1122
  if (satMiningAttachment.walletId === walletId) {
1129
1123
  satMiningAttachment = {};
@@ -1133,14 +1127,15 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1133
1127
  federationBondWalletId = undefined;
1134
1128
  nextConfig = clearFederationBondWallet(nextConfig);
1135
1129
  }
1130
+ await writeConfigFile(nextConfig);
1136
1131
  deleteNamedWallet({
1137
1132
  walletId,
1138
- env: process.env
1133
+ env: archiveEnv
1139
1134
  });
1140
- await restartLocalSocketSigner(ensureWalletStateDir(process.env).rootDir);
1141
- 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");
1142
1137
  } else {
1143
- await prompter.note("Wallet deletion cancelled.", "Wallet setup");
1138
+ await prompter.note("Wallet archive cancelled.", "Wallet setup");
1144
1139
  }
1145
1140
  addAnotherWallet = await prompter.confirm({
1146
1141
  message: "Run another wallet setup action?",
@@ -1157,7 +1152,6 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1157
1152
  forceEnable: true,
1158
1153
  hostProfile,
1159
1154
  nextConfig,
1160
- prepareLocalSigner: prepareLocalSignerForOnboarding,
1161
1155
  prompter
1162
1156
  });
1163
1157
  nextConfig = syncLocalSignerRuntimeEnvIntoConfig(nextConfig);
@@ -1205,21 +1199,39 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1205
1199
  continue;
1206
1200
  }
1207
1201
  }
1208
- const mode = selfHostedAction === "create" ? "local-signer-create" : "local-signer-import";
1202
+ const mode = "local-signer-create";
1209
1203
  const walletIdentity = await resolveWalletIdentityForOnboarding({
1210
1204
  flow,
1211
1205
  purpose: walletPurpose
1212
1206
  });
1213
1207
  const walletName = walletIdentity.walletName;
1214
1208
  const walletId = walletIdentity.walletId || undefined;
1215
- const keystoreKey = keystoreEnvKeyFor(chain, walletId);
1216
- const currentKeystoreValue = (nextConfig.env?.vars?.[keystoreKey] ?? "").trim() || String(process.env[keystoreKey] ?? "").trim();
1217
- const isolatedSignerRunAsUser = resolveLocalSignerRunAsUser(process.env);
1218
- const stagingKeystorePath = defaultKeystorePathFor(chain, walletId);
1219
- const effectiveKeystorePath = isolatedSignerRunAsUser ? stagingKeystorePath : currentKeystoreValue || stagingKeystorePath;
1220
- const isolatedTargetKeystorePath = isolatedSignerRunAsUser ? path.join(resolveLocalSignerMaterialRootDir(process.env), path.basename(stagingKeystorePath)) : undefined;
1221
- nextConfig = setConfigEnvVar(nextConfig, keystoreKey, effectiveKeystorePath);
1222
- 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
+ }
1223
1235
  const rpcKey = rpcEnvKeyFor(chain, walletId);
1224
1236
  const currentRpcValue = (nextConfig.env?.vars?.[rpcKey] ?? "").trim() || String(process.env[rpcKey] ?? "").trim();
1225
1237
  const rpcUrlInput = (await prompter.text({
@@ -1234,37 +1246,15 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1234
1246
  nextConfig = setConfigEnvVar(nextConfig, rpcKey, effectiveRpcUrl);
1235
1247
  process.env[rpcKey] = effectiveRpcUrl;
1236
1248
  try {
1237
- let moveToSignerDir = false;
1238
- if (isolatedTargetKeystorePath && fs.existsSync(isolatedTargetKeystorePath)) {
1239
- moveToSignerDir = await prompter.confirm({
1240
- message: "Signer keystore already exists. Overwrite it?",
1241
- initialValue: false
1242
- });
1243
- if (!moveToSignerDir) {
1244
- throw new Error(`Keystore already exists: ${isolatedTargetKeystorePath}`);
1245
- }
1246
- }
1247
- const prevSignerStateDir = process.env.FASED_WALLET_SIGNER_STATE_DIR;
1248
- const prevPassphraseFile = process.env.FASED_WALLET_PASSPHRASE_FILE;
1249
1249
  if (mode === "local-signer-create") {
1250
- const showPrivateKeyOnce = await prompter.confirm({
1251
- message: "Show generated private key once for offline backup?",
1252
- initialValue: false
1253
- });
1254
- const confirmPrivateKeyPrint = showPrivateKeyOnce ? "SHOW PRIVATE KEY" : undefined;
1255
1250
  try {
1256
- if (isolatedSignerRunAsUser) {
1257
- delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
1258
- delete process.env.FASED_WALLET_PASSPHRASE_FILE;
1259
- }
1260
1251
  await walletSetupCommand(runtime, {
1261
1252
  mode,
1262
1253
  chain,
1263
1254
  walletId,
1264
1255
  walletName,
1265
1256
  rpcUrl: effectiveRpcUrl,
1266
- showPrivateKeyOnce,
1267
- confirmPrivateKeyPrint,
1257
+ force: true,
1268
1258
  noDoctor: true,
1269
1259
  noSignerHints: true,
1270
1260
  nonInteractive: true
@@ -1279,15 +1269,12 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1279
1269
  if (!overwrite) {
1280
1270
  throw err;
1281
1271
  }
1282
- moveToSignerDir = true;
1283
1272
  await walletSetupCommand(runtime, {
1284
1273
  mode,
1285
1274
  chain,
1286
1275
  walletId,
1287
1276
  walletName,
1288
1277
  rpcUrl: effectiveRpcUrl,
1289
- showPrivateKeyOnce,
1290
- confirmPrivateKeyPrint,
1291
1278
  force: true,
1292
1279
  noDoctor: true,
1293
1280
  noSignerHints: true,
@@ -1296,68 +1283,18 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1296
1283
  } else {
1297
1284
  throw err;
1298
1285
  }
1299
- } finally {
1300
- if (isolatedSignerRunAsUser) {
1301
- if (prevSignerStateDir == null) {
1302
- delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
1303
- } else {
1304
- process.env.FASED_WALLET_SIGNER_STATE_DIR = prevSignerStateDir;
1305
- }
1306
- if (prevPassphraseFile == null) {
1307
- delete process.env.FASED_WALLET_PASSPHRASE_FILE;
1308
- } else {
1309
- process.env.FASED_WALLET_PASSPHRASE_FILE = prevPassphraseFile;
1310
- }
1311
- }
1312
1286
  }
1313
- } else {
1314
- const keyInput = typeof prompter.secret === "function" ? await prompter.secret({
1315
- message: "Solana private key (base58/json/base64/hex)",
1316
- validate: (value) => value.trim() ? undefined : "Required"
1317
- }) : await prompter.text({
1318
- message: "Solana private key (base58/json/base64/hex)",
1319
- validate: (value) => value.trim() ? undefined : "Required"
1320
- });
1321
- try {
1322
- if (isolatedSignerRunAsUser) {
1323
- delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
1324
- delete process.env.FASED_WALLET_PASSPHRASE_FILE;
1325
- }
1326
- await walletSetupCommand(runtime, {
1327
- mode: "local-signer-import",
1328
- chain,
1329
- walletId,
1330
- walletName,
1331
- privateKey: keyInput.trim(),
1332
- rpcUrl: effectiveRpcUrl,
1333
- noDoctor: true,
1334
- noSignerHints: true,
1335
- nonInteractive: true
1336
- });
1337
- } finally {
1338
- if (isolatedSignerRunAsUser) {
1339
- if (prevSignerStateDir == null) {
1340
- delete process.env.FASED_WALLET_SIGNER_STATE_DIR;
1341
- } else {
1342
- process.env.FASED_WALLET_SIGNER_STATE_DIR = prevSignerStateDir;
1343
- }
1344
- if (prevPassphraseFile == null) {
1345
- delete process.env.FASED_WALLET_PASSPHRASE_FILE;
1346
- } else {
1347
- process.env.FASED_WALLET_PASSPHRASE_FILE = prevPassphraseFile;
1348
- }
1349
- }
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");
1350
1296
  }
1351
1297
  }
1352
- let configuredKeystorePath = effectiveKeystorePath;
1353
- if (isolatedSignerRunAsUser) {
1354
- configuredKeystorePath = migrateLocalSignerKeystoreToMaterialDir({
1355
- keystorePath: effectiveKeystorePath,
1356
- force: moveToSignerDir
1357
- });
1358
- nextConfig = setConfigEnvVar(nextConfig, keystoreKey, configuredKeystorePath);
1359
- process.env[keystoreKey] = configuredKeystorePath;
1360
- }
1361
1298
  walletCeremonyEvents.push({
1362
1299
  mode,
1363
1300
  chain,
@@ -1407,9 +1344,9 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1407
1344
  });
1408
1345
  }
1409
1346
  if (walletId) {
1410
- onboardingWalletSecurityFocus = walletPurpose === "mining" ? null : {
1347
+ onboardingWalletSecurityFocus = {
1411
1348
  walletId,
1412
- role: isAgentWallet ? "agent" : "vault"
1349
+ role: walletPurpose
1413
1350
  };
1414
1351
  }
1415
1352
  if (chain === "solana" && walletId) {
@@ -1438,7 +1375,8 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1438
1375
  await prompter.note([
1439
1376
  noteHeading("Mining wallet"),
1440
1377
  noteBullet(`${walletName} (${walletId})`),
1441
- 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.")
1442
1380
  ].join("\n"), "Mining");
1443
1381
  } else if (currentMiningWalletId && currentMiningWalletId !== walletId) {
1444
1382
  await prompter.note([noteHeading("Mining wallet"), noteBullet(`Keeping existing: ${currentMiningWalletId}`)].join("\n"), "Mining");
@@ -1487,7 +1425,7 @@ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
1487
1425
  walletId: federationBondWalletId,
1488
1426
  walletName: readWalletProviderRegistry(process.env).wallets.find((wallet) => wallet.id === federationBondWalletId)?.name
1489
1427
  }) : "not assigned"}`),
1490
- noteBullet(`Jupiter wallet actions: ${readJupiterLimitOrderApiKey() ? "configured" : "not configured"}`)
1428
+ noteBullet(`Gateway Jupiter swaps: ${readJupiterSwapApiKey() ? "configured" : "not configured"}; Trigger: signer-owned configuration`)
1491
1429
  ];
1492
1430
  const rpcKeys = Array.from(new Set(walletCeremonyEvents.map((evt) => evt.rpcEnvKey).filter((key) => Boolean(key))));
1493
1431
  if (rpcKeys.length > 0) {