@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
@@ -105,6 +105,7 @@ if [[ "${FASED_MANAGED_INTERNAL:-0}" != "1" ]]; then
105
105
  fi
106
106
 
107
107
  set -euo pipefail
108
+ umask 077
108
109
 
109
110
  NODE_BIN="$(resolve_node_bin || true)"
110
111
  if [[ -z "$NODE_BIN" ]]; then
@@ -187,12 +188,53 @@ mask_secret() {
187
188
  local raw="$1"
188
189
  local n=${#raw}
189
190
  if [[ $n -le 10 ]]; then
190
- printf "%s" "$raw"
191
+ printf "%s" "[redacted]"
191
192
  return
192
193
  fi
193
194
  printf "%s...%s" "${raw:0:6}" "${raw: -4}"
194
195
  }
195
196
 
197
+ read_private_zrok_reservation() {
198
+ local file="$1"
199
+ local owner="" mode="" links="" size=""
200
+ [[ -f "$file" && ! -L "$file" ]] || return 1
201
+ read -r owner mode links size <<<"$(stat -c '%u %a %h %s' "$file" 2>/dev/null || true)"
202
+ [[ "$mode" =~ ^[0-7]{3,4}$ ]] || return 1
203
+ [[ "$owner" == "$(id -u)" && "$links" == "1" && "$size" =~ ^[0-9]+$ && \
204
+ "$size" -gt 0 && "$size" -le 4096 ]] || return 1
205
+ chmod 0600 "$file"
206
+ local token=""
207
+ IFS= read -r token <"$file" || true
208
+ [[ -n "$token" ]] || return 1
209
+ printf '%s' "$token"
210
+ }
211
+
212
+ write_private_zrok_reservation() {
213
+ local file="$1"
214
+ local token="$2"
215
+ local temp_file=""
216
+ [[ -n "$token" ]] || return 1
217
+ mkdir -p "$(dirname "$file")"
218
+ chmod 0700 "$(dirname "$file")" 2>/dev/null || true
219
+ temp_file="$(mktemp "${file}.tmp.XXXXXXXX")"
220
+ trap 'rm -f -- "${temp_file:-}"' RETURN
221
+ printf '%s\n' "$token" >"$temp_file"
222
+ chmod 0600 "$temp_file"
223
+ mv -f -- "$temp_file" "$file"
224
+ temp_file=""
225
+ chmod 0600 "$file"
226
+ trap - RETURN
227
+ }
228
+
229
+ filter_zrok_runtime_output() {
230
+ local line=""
231
+ while IFS= read -r line || [[ -n "$line" ]]; do
232
+ if [[ "$line" == *"issuedAt of token is in the future"* ]]; then
233
+ printf '%s\n' '[zrok] clock-skew-auth-failure'
234
+ fi
235
+ done
236
+ }
237
+
196
238
  is_gateway_listener_ready() {
197
239
  (echo >"/dev/tcp/127.0.0.1/${FASED_GATEWAY_PORT}") >/dev/null 2>&1
198
240
  }
@@ -206,21 +248,6 @@ abs_int() {
206
248
  printf '%s\n' "$value"
207
249
  }
208
250
 
209
- can_run_privileged_time_sync_command() {
210
- if [[ "$(id -u)" -eq 0 ]]; then
211
- return 0
212
- fi
213
- command -v sudo >/dev/null 2>&1 && sudo -n true >/dev/null 2>&1
214
- }
215
-
216
- run_privileged_time_sync_command() {
217
- if [[ "$(id -u)" -eq 0 ]]; then
218
- "$@"
219
- return $?
220
- fi
221
- sudo -n "$@"
222
- }
223
-
224
251
  fetch_remote_epoch_from_http_date() {
225
252
  local url="$1"
226
253
  local date_header=""
@@ -261,21 +288,13 @@ measure_managed_clock_skew_seconds() {
261
288
  }
262
289
 
263
290
  zrok_log_indicates_clock_skew() {
264
- tail -n 80 "$ZROK_RUNTIME_LOG" 2>/dev/null | grep -Fqi "issuedAt of token is in the future"
291
+ tail -n 80 "$ZROK_RUNTIME_LOG" 2>/dev/null | grep -Fqi "[zrok] clock-skew-auth-failure"
265
292
  }
266
293
 
267
294
  attempt_managed_clock_sync_repair() {
268
- if ! can_run_privileged_time_sync_command; then
269
- return 1
270
- fi
271
- echo "[tunnel] Attempting automatic host clock sync repair..."
272
- run_privileged_time_sync_command timedatectl set-ntp true >/dev/null 2>&1 || true
273
- run_privileged_time_sync_command systemctl restart systemd-timesyncd >/dev/null 2>&1 || \
274
- run_privileged_time_sync_command systemctl restart chronyd >/dev/null 2>&1 || true
275
- if command -v chronyc >/dev/null 2>&1; then
276
- run_privileged_time_sync_command chronyc -a makestep >/dev/null 2>&1 || true
277
- fi
278
- sleep 2
295
+ # Host time synchronization is installed during root bootstrap. The running
296
+ # Gateway intentionally has no privilege path for changing the host clock.
297
+ return 1
279
298
  }
280
299
 
281
300
  ensure_managed_clock_sync() {
@@ -293,7 +312,7 @@ ensure_managed_clock_sync() {
293
312
 
294
313
  echo "[tunnel] WARNING: Host clock skew detected (${skew_seconds}s versus public control plane)."
295
314
  if ! attempt_managed_clock_sync_repair; then
296
- echo "[tunnel] WARNING: Automatic host clock repair requires root or passwordless sudo."
315
+ echo "[tunnel] WARNING: Repair only from the provider root console using the exact tagged, attested Hosting release; never run the app checkout with sudo."
297
316
  return 1
298
317
  fi
299
318
 
@@ -315,7 +334,8 @@ start_initial_zrok_share() {
315
334
 
316
335
  while (( attempt <= attempts )); do
317
336
  echo "[tunnel] Starting tunnel for ${slug} (attempt ${attempt}/${attempts})..."
318
- "$ZROK_BIN" share reserved "$RES_TOKEN" --headless >>"$ZROK_RUNTIME_LOG" 2>&1 &
337
+ "$ZROK_BIN" share reserved "$RES_TOKEN" --headless 2>&1 \
338
+ | filter_zrok_runtime_output >>"$ZROK_RUNTIME_LOG" &
319
339
  ZROK_PID=$!
320
340
  echo "$ZROK_PID" > "$FASED_CONFIG_DIR/.zrok-pid"
321
341
  sleep 5
@@ -349,8 +369,7 @@ start_initial_zrok_share() {
349
369
 
350
370
  echo "[tunnel] WARNING: zrok share died during startup."
351
371
  if [[ "$VERBOSE_STARTUP" != "1" ]]; then
352
- echo "[debug] Last zrok startup logs:"
353
- tail -n 40 "$ZROK_RUNTIME_LOG" || true
372
+ echo "[debug] zrok output was reduced to non-secret diagnostics in $ZROK_RUNTIME_LOG"
354
373
  fi
355
374
  if zrok_log_indicates_clock_skew; then
356
375
  echo "[tunnel] Detected zrok auth failure caused by host clock skew."
@@ -454,6 +473,7 @@ mkdir -p "$FASED_CONFIG_DIR"
454
473
  mkdir -p "$LOG_DIR"
455
474
  : > "$ZROK_RUNTIME_LOG"
456
475
  : > "$WALLET_SETUP_LOG"
476
+ chmod 0600 "$ZROK_RUNTIME_LOG" "$WALLET_SETUP_LOG"
457
477
  SERVICE_GATEWAY_TOKEN="${FASED_GATEWAY_TOKEN:-}"
458
478
  if [ ! -f "$GW_TOKEN_PATH" ]; then
459
479
  if [[ -n "$SERVICE_GATEWAY_TOKEN" ]]; then
@@ -480,15 +500,11 @@ start_gateway_if_needed
480
500
  # 0a. Start local key signer daemon (fased-signerd) if available
481
501
  SIGNERD_BIN="${FASED_CONFIG_DIR}/bin/fased-signerd"
482
502
  SIGNERD_SOCKET="${FASED_CONFIG_DIR}/wallet/local-signer.sock"
483
- SIGNERD_BACKEND_SOCKET="$SIGNERD_SOCKET"
484
503
  SIGNERD_MATERIAL_DIR="${FASED_CONFIG_DIR}/wallet"
485
- SIGNERD_PASSPHRASE_FILE="$SIGNERD_MATERIAL_DIR/passphrase"
486
- SIGNERD_EVM_KEYSTORE="$SIGNERD_MATERIAL_DIR/keystore-evm.v1.enc"
487
- SIGNERD_SOL_KEYSTORE="$SIGNERD_MATERIAL_DIR/keystore-solana.v1.enc"
504
+ SIGNERD_CONTROL_SOCKET="${SIGNERD_MATERIAL_DIR}/local-signer-control.sock"
505
+ SIGNERD_STATE_DB="${SIGNERD_MATERIAL_DIR}/signerd-v2.db"
506
+ SIGNERD_MASTER_KEY="${SIGNERD_MATERIAL_DIR}/signerd-v2.master.key"
488
507
  SIGNERD_LOG="${LOG_DIR}/fased-signerd.log"
489
- SIGNERD_BROKER_LOG="${LOG_DIR}/local-signer-broker.log"
490
- SIGNER_MAINTENANCE_HELPER="/usr/local/sbin/fased-signer-maintenance"
491
- SIGNER_ISOLATION_HELPER="/usr/local/sbin/fased-signer-isolation"
492
508
  CONFIG_JSON="${FASED_CONFIG_DIR}/fased.json"
493
509
  SIGNERD_ENV_FILE="${FASED_CONFIG_DIR}/wallet/signer.env"
494
510
  WALLET_REGISTRY_JSON="${FASED_CONFIG_DIR}/wallet/provider-registry.v1.json"
@@ -513,13 +529,13 @@ load_wallet_signer_env_from_config() {
513
529
  [[ "$line" == *=* ]] || continue
514
530
  local key="${line%%=*}"
515
531
  local value="${line#*=}"
516
- if [[ "$key" =~ ^FASED_WALLET_(EVM|SOLANA)_(RPC_URL|KEYSTORE_PATH)(__[A-Za-z0-9_-]+)?$ ]] \
532
+ if [[ "$key" =~ ^FASED_WALLET_SOLANA_RPC_URL(__[A-Za-z0-9_-]+)?$ ]] \
517
533
  || [[ "$key" == "FASED_WALLET_CHAINS" ]] \
518
- || [[ "$key" == "FASED_WALLET_PASSPHRASE_FILE" ]] \
519
534
  || [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_SOCKET" ]] \
520
- || [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET" ]] \
535
+ || [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_CONTROL_SOCKET" ]] \
536
+ || [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_STATE_DB" ]] \
537
+ || [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_MASTER_KEY" ]] \
521
538
  || [[ "$key" == "FASED_WALLET_SIGNER_STATE_DIR" ]] \
522
- || [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER" ]] \
523
539
  || [[ "$key" == "FASED_WALLET_LOCAL_SIGNER_BIN" ]] \
524
540
  || [[ "$key" =~ ^FASED_WALLET_LOCAL_SIGNER_(ROLE|DIRECT_SIGNING|CAPS_ENABLED|SOLANA_MAX_PER_TX|SOLANA_MAX_DAILY|SOLANA_ALLOW_PROGRAMS)(__[A-Za-z0-9_-]+)?$ ]]; then
525
541
  export "$key=$value"
@@ -530,13 +546,13 @@ load_wallet_signer_env_from_config() {
530
546
  | to_entries[]
531
547
  | select(
532
548
  .key
533
- | test("^FASED_WALLET_(EVM|SOLANA)_(RPC_URL|KEYSTORE_PATH)(__[A-Za-z0-9_-]+)?$")
549
+ | test("^FASED_WALLET_SOLANA_RPC_URL(__[A-Za-z0-9_-]+)?$")
534
550
  or . == "FASED_WALLET_CHAINS"
535
- or . == "FASED_WALLET_PASSPHRASE_FILE"
536
551
  or . == "FASED_WALLET_LOCAL_SIGNER_SOCKET"
537
- or . == "FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET"
552
+ or . == "FASED_WALLET_LOCAL_SIGNER_CONTROL_SOCKET"
553
+ or . == "FASED_WALLET_LOCAL_SIGNER_STATE_DB"
554
+ or . == "FASED_WALLET_LOCAL_SIGNER_MASTER_KEY"
538
555
  or . == "FASED_WALLET_SIGNER_STATE_DIR"
539
- or . == "FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER"
540
556
  or . == "FASED_WALLET_LOCAL_SIGNER_BIN"
541
557
  or test("^FASED_WALLET_LOCAL_SIGNER_(ROLE|DIRECT_SIGNING|CAPS_ENABLED|SOLANA_MAX_PER_TX|SOLANA_MAX_DAILY|SOLANA_ALLOW_PROGRAMS)(__[A-Za-z0-9_-]+)?$")
542
558
  )
@@ -551,100 +567,32 @@ load_wallet_signer_env_file() {
551
567
  fi
552
568
 
553
569
  set -a
554
- # signer.env is generated by onboarding.wallet.ts; only import export lines, not the launch command.
555
- source <(grep -E '^export FASED_WALLET_' "$SIGNERD_ENV_FILE" || true)
556
- set +a
557
- }
558
-
559
- has_scoped_wallet_env_value() {
560
- local prefix="$1"
561
- local name=""
562
- while IFS= read -r name; do
563
- [[ -n "$name" ]] || continue
564
- if [[ -n "${!name:-}" ]]; then
565
- return 0
566
- fi
567
- done < <(compgen -A variable "${prefix}__" || true)
568
- return 1
569
- }
570
-
571
- normalize_wallet_env_suffix() {
572
- local raw="${1:-}"
573
- printf '%s' "$raw" \
574
- | tr '[:upper:]' '[:lower:]' \
575
- | sed -E 's/[^a-z0-9]+/_/g; s/^_+//; s/_+$//'
576
- }
577
-
578
- normalize_wallet_filename_id() {
579
- local raw="${1:-}"
580
- printf '%s' "$raw" \
581
- | tr '[:upper:]' '[:lower:]' \
582
- | sed -E 's/[^a-z0-9_-]+/-/g; s/^-+//; s/-+$//'
583
- }
584
-
585
- hydrate_scoped_wallet_keystore_env_from_registry() {
586
- local material_dir="$1"
587
- if [[ ! -f "$WALLET_REGISTRY_JSON" ]] || ! command -v jq >/dev/null 2>&1; then
588
- return 0
589
- fi
590
-
591
- while IFS=$'\t' read -r wallet_id provider_id; do
592
- [[ -n "$wallet_id" ]] || continue
593
- if [[ "$provider_id" != "local-socket-signer" && "$provider_id" != "embedded-keystore" ]]; then
594
- continue
595
- fi
596
- local env_suffix
597
- local file_suffix
598
- env_suffix="$(normalize_wallet_env_suffix "$wallet_id")"
599
- file_suffix="$(normalize_wallet_filename_id "$wallet_id")"
600
- [[ -n "$env_suffix" && -n "$file_suffix" ]] || continue
601
-
602
- local sol_key="FASED_WALLET_SOLANA_KEYSTORE_PATH__${env_suffix^^}"
603
- if [[ -z "${!sol_key:-}" ]]; then
604
- local sol_candidate="${material_dir}/keystore-solana-${file_suffix}.v1.enc"
605
- if [[ -f "$sol_candidate" ]]; then
606
- export "$sol_key=$sol_candidate"
607
- fi
608
- fi
609
-
610
- local evm_key="FASED_WALLET_EVM_KEYSTORE_PATH__${env_suffix^^}"
611
- if [[ -z "${!evm_key:-}" ]]; then
612
- local evm_candidate="${material_dir}/keystore-evm-${file_suffix}.v1.enc"
613
- if [[ -f "$evm_candidate" ]]; then
614
- export "$evm_key=$evm_candidate"
615
- fi
616
- fi
617
- done < <(
618
- jq -r '
619
- (.wallets // [])
620
- | .[]
621
- | select(.id != null and .providerId != null)
622
- | "\(.id|tostring)\t\(.providerId|tostring)"
623
- ' "$WALLET_REGISTRY_JSON" 2>/dev/null || true
570
+ # Older signer.env files may contain Node-era key/passphrase variables. Import only
571
+ # the non-custody settings required by the native signer, never every wallet variable.
572
+ source <(
573
+ grep -E '^export FASED_WALLET_(SOLANA_RPC_URL(__[A-Za-z0-9_-]+)?|CHAINS|SIGNER_STATE_DIR|WEBAUTHN_(RP_ID|ORIGINS)|LOCAL_SIGNER_(SOCKET|CONTROL_SOCKET|STATE_DB|MASTER_KEY|BIN|ROLE|DIRECT_SIGNING|CAPS_ENABLED|SOLANA_MAX_PER_TX|SOLANA_MAX_DAILY|SOLANA_ALLOW_PROGRAMS)(__[A-Za-z0-9_-]+)?)=' "$SIGNERD_ENV_FILE" || true
624
574
  )
575
+ set +a
625
576
  }
626
577
 
627
- resolve_signerd_keystore_export() {
628
- local explicit_value="$1"
629
- local scoped_prefix="$2"
630
- local default_path="$3"
631
-
632
- if has_scoped_wallet_env_value "$scoped_prefix"; then
633
- printf '\n'
634
- return 0
635
- fi
636
-
637
- if [[ -n "$explicit_value" && "$explicit_value" != "$default_path" ]]; then
638
- printf '%s\n' "$explicit_value"
639
- return 0
640
- fi
641
-
642
- if [[ -n "$explicit_value" ]]; then
643
- printf '%s\n' "$explicit_value"
644
- return 0
645
- fi
646
-
647
- printf '%s\n' "$default_path"
578
+ clear_legacy_wallet_key_env() {
579
+ local key
580
+ while IFS= read -r key; do
581
+ case "$key" in
582
+ FASED_WALLET_KEYSTORE_PATH|FASED_WALLET_KEYSTORE_PATH__*|\
583
+ FASED_WALLET_SOLANA_KEYSTORE_PATH|FASED_WALLET_SOLANA_KEYSTORE_PATH__*|\
584
+ FASED_WALLET_EVM_KEYSTORE_PATH|FASED_WALLET_EVM_KEYSTORE_PATH__*|\
585
+ FASED_WALLET_PASSPHRASE|FASED_WALLET_PASSPHRASE__*|\
586
+ FASED_WALLET_PASSPHRASE_FILE|FASED_WALLET_PASSPHRASE_FILE__*|\
587
+ FASED_WALLET_PRIVATE_KEY|FASED_WALLET_PRIVATE_KEY__*|\
588
+ FASED_WALLET_SECRET_KEY|FASED_WALLET_SECRET_KEY__*|\
589
+ FASED_WALLET_KEYPAIR|FASED_WALLET_KEYPAIR__*|\
590
+ FASED_WALLET_MNEMONIC|FASED_WALLET_MNEMONIC__*|\
591
+ FASED_WALLET_SEED|FASED_WALLET_SEED__*)
592
+ unset "$key"
593
+ ;;
594
+ esac
595
+ done < <(compgen -A variable | grep -E '^FASED_WALLET_' || true)
648
596
  }
649
597
 
650
598
  resolve_wallet_chains_from_config() {
@@ -693,34 +641,18 @@ registry_has_local_signer_wallet() {
693
641
  ' "$WALLET_REGISTRY_JSON" >/dev/null 2>&1
694
642
  }
695
643
 
696
- has_local_signer_keystore_material() {
697
- if [[ -n "${FASED_WALLET_SOLANA_KEYSTORE_PATH:-}" ]] || has_scoped_wallet_env_value "FASED_WALLET_SOLANA_KEYSTORE_PATH"; then
698
- return 0
699
- fi
700
- local candidate
701
- for candidate in "$SIGNERD_MATERIAL_DIR"/keystore-solana*.v1.enc "$SIGNERD_MATERIAL_DIR"/keystore-evm*.v1.enc; do
702
- [[ -f "$candidate" ]] && return 0
703
- done
704
- return 1
705
- }
706
-
707
644
  should_start_signerd() {
708
- registry_has_local_signer_wallet || has_local_signer_keystore_material
645
+ registry_has_local_signer_wallet
709
646
  }
710
647
 
711
648
  collect_existing_signerd_pids() {
712
- local pid_file app_pid_file
713
- pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_BACKEND_SOCKET" "pid")"
714
- app_pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")"
649
+ local pid_file
650
+ pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")"
715
651
  {
716
652
  if [[ -f "$pid_file" ]]; then
717
653
  cat "$pid_file" 2>/dev/null || true
718
654
  fi
719
- if [[ "$app_pid_file" != "$pid_file" && -f "$app_pid_file" ]]; then
720
- cat "$app_pid_file" 2>/dev/null || true
721
- fi
722
655
  pgrep -f "$SIGNERD_BIN" 2>/dev/null || true
723
- pgrep -f "wallet signer broker" 2>/dev/null || true
724
656
  } | awk '/^[0-9]+$/ { if (!seen[$1]++) print $1 }'
725
657
  }
726
658
 
@@ -737,16 +669,8 @@ dump_existing_signerd_processes() {
737
669
  }
738
670
 
739
671
  stop_existing_signerd() {
740
- local pid_file app_pid_file
741
- pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_BACKEND_SOCKET" "pid")"
742
- app_pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")"
743
- if signer_isolation_helper_available; then
744
- run_signer_isolation_helper stop "$SIGNERD_BACKEND_SOCKET" "$pid_file" >/dev/null 2>&1 || true
745
- if [[ "$SIGNERD_SOCKET" != "$SIGNERD_BACKEND_SOCKET" ]]; then
746
- run_signer_isolation_helper stop "$SIGNERD_SOCKET" "$app_pid_file" >/dev/null 2>&1 || true
747
- fi
748
- return 0
749
- fi
672
+ local pid_file
673
+ pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")"
750
674
  local pid=""
751
675
  while IFS= read -r pid; do
752
676
  [[ "$pid" =~ ^[0-9]+$ ]] || continue
@@ -757,7 +681,7 @@ stop_existing_signerd() {
757
681
  [[ "$pid" =~ ^[0-9]+$ ]] || continue
758
682
  kill -9 "$pid" >/dev/null 2>&1 || true
759
683
  done < <(collect_existing_signerd_pids)
760
- rm -f "$SIGNERD_SOCKET" "$SIGNERD_BACKEND_SOCKET" "$pid_file" "$app_pid_file"
684
+ rm -f "$SIGNERD_SOCKET" "$SIGNERD_CONTROL_SOCKET" "$pid_file"
761
685
  }
762
686
 
763
687
  wait_for_signerd_ready() {
@@ -766,7 +690,7 @@ wait_for_signerd_ready() {
766
690
  while true; do
767
691
  local active_count
768
692
  active_count="$(count_existing_signerd_pids)"
769
- if [[ "$active_count" == "1" && -S "$SIGNERD_BACKEND_SOCKET" ]]; then
693
+ if [[ "$active_count" == "1" && -S "$SIGNERD_SOCKET" && -S "$SIGNERD_CONTROL_SOCKET" ]]; then
770
694
  return 0
771
695
  fi
772
696
  if [[ "$active_count" -gt 1 ]]; then
@@ -785,194 +709,70 @@ wait_for_signerd_ready() {
785
709
  done
786
710
  }
787
711
 
788
- wait_for_signer_broker_ready() {
789
- local retries="$1"
790
- local count=0
791
- while true; do
792
- if [[ -S "$SIGNERD_SOCKET" ]]; then
793
- return 0
794
- fi
795
- sleep 1
796
- count=$((count + 1))
797
- if [[ $count -ge $retries ]]; then
798
- echo "[signerd] ERROR: signer broker did not create app socket within ${retries}s."
799
- tail -n 40 "$SIGNERD_BROKER_LOG" 2>/dev/null || true
800
- return 1
801
- fi
802
- done
803
- }
804
-
805
- collect_wallet_env_args() {
806
- local key value
807
- while IFS='=' read -r key value; do
808
- [[ "$key" == FASED_WALLET_* ]] || continue
809
- printf '%s=%s\0' "$key" "$value"
810
- done < <(env)
811
- }
812
-
813
- current_app_user() {
814
- id -un 2>/dev/null || printf '%s\n' "${USER:-app}"
815
- }
816
-
817
- signer_isolation_helper_available() {
818
- [[ -n "${FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER:-}" ]] || return 1
819
- [[ -x "$SIGNER_MAINTENANCE_HELPER" || -x "$SIGNER_ISOLATION_HELPER" ]] || return 1
820
- command -v sudo >/dev/null 2>&1 || return 1
821
- }
822
-
823
- run_signer_isolation_helper() {
824
- if [[ -x "$SIGNER_MAINTENANCE_HELPER" ]]; then
825
- sudo -n -E "$SIGNER_MAINTENANCE_HELPER" "$@"
826
- else
827
- local app_user
828
- app_user="$(current_app_user)"
829
- sudo -n -E "$SIGNER_ISOLATION_HELPER" "$app_user" "$FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER" "$@"
830
- fi
831
- }
832
-
833
712
  start_signerd_process() {
834
713
  local pid_file audit_log
835
- pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_BACKEND_SOCKET" "pid")"
836
- audit_log="$(resolve_local_signer_sidecar_path "$SIGNERD_BACKEND_SOCKET" "audit")"
837
- if [[ -n "${FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER:-}" ]]; then
838
- if signer_isolation_helper_available; then
839
- run_signer_isolation_helper start-signerd \
840
- "$SIGNERD_BIN" \
841
- "$SIGNERD_BACKEND_SOCKET" \
842
- "$pid_file" \
843
- "$audit_log" \
844
- >>"$SIGNERD_LOG" 2>&1 &
845
- return 0
846
- fi
847
- if ! command -v sudo >/dev/null 2>&1; then
848
- return 1
849
- fi
850
- local env_args=()
851
- while IFS= read -r -d '' env_arg; do
852
- env_args+=("$env_arg")
853
- done < <(collect_wallet_env_args)
854
- sudo -n -u "$FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER" -H env "${env_args[@]}" \
855
- "$SIGNERD_BIN" \
856
- -socket "$SIGNERD_BACKEND_SOCKET" \
857
- -pid-file "$pid_file" \
858
- -audit-log "$audit_log" \
859
- >>"$SIGNERD_LOG" 2>&1 &
860
- return 0
861
- fi
714
+ pid_file="$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")"
715
+ audit_log="$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "audit")"
862
716
  "$SIGNERD_BIN" \
863
- -socket "$SIGNERD_BACKEND_SOCKET" \
717
+ -socket "$SIGNERD_SOCKET" \
718
+ -control-socket "$SIGNERD_CONTROL_SOCKET" \
719
+ -state-db "$SIGNERD_STATE_DB" \
720
+ -master-key "$SIGNERD_MASTER_KEY" \
864
721
  -pid-file "$pid_file" \
865
722
  -audit-log "$audit_log" \
866
723
  >>"$SIGNERD_LOG" 2>&1 &
867
724
  }
868
725
 
869
- start_signer_broker_process() {
870
- if [[ "$SIGNERD_SOCKET" == "$SIGNERD_BACKEND_SOCKET" ]]; then
871
- return 0
872
- fi
873
- local gateway_entry
874
- gateway_entry="$(resolve_gateway_cli_entry || true)"
875
- if [[ -z "$gateway_entry" ]]; then
876
- echo "[signerd] ERROR: signer broker CLI unavailable under $FASED_ROOT/dist"
877
- return 1
878
- fi
879
- if [[ -n "${FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER:-}" ]]; then
880
- if signer_isolation_helper_available; then
881
- run_signer_isolation_helper start-broker \
882
- "$NODE_BIN" \
883
- "$gateway_entry" \
884
- "$SIGNERD_SOCKET" \
885
- "$SIGNERD_BACKEND_SOCKET" \
886
- "$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")" \
887
- "$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "audit")" \
888
- >>"$SIGNERD_BROKER_LOG" 2>&1 &
889
- return 0
890
- fi
891
- if ! command -v sudo >/dev/null 2>&1; then
892
- return 1
893
- fi
894
- local env_args=()
895
- while IFS= read -r -d '' env_arg; do
896
- env_args+=("$env_arg")
897
- done < <(collect_wallet_env_args)
898
- sudo -n -u "$FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER" -H env "${env_args[@]}" \
899
- "$NODE_BIN" "$gateway_entry" wallet signer broker \
900
- --socket "$SIGNERD_SOCKET" \
901
- --backend-socket "$SIGNERD_BACKEND_SOCKET" \
902
- --pid-file "$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")" \
903
- --audit-log "$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "audit")" \
904
- >>"$SIGNERD_BROKER_LOG" 2>&1 &
905
- return 0
906
- fi
907
- "$NODE_BIN" "$gateway_entry" wallet signer broker \
908
- --socket "$SIGNERD_SOCKET" \
909
- --backend-socket "$SIGNERD_BACKEND_SOCKET" \
910
- --pid-file "$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")" \
911
- --audit-log "$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "audit")" \
912
- >>"$SIGNERD_BROKER_LOG" 2>&1 &
913
- }
914
-
915
726
  load_wallet_signer_env_from_config
916
727
  load_wallet_signer_env_file
728
+ clear_legacy_wallet_key_env
917
729
  SIGNERD_BIN="${FASED_WALLET_LOCAL_SIGNER_BIN:-$SIGNERD_BIN}"
918
730
  SIGNERD_MATERIAL_DIR="${FASED_WALLET_SIGNER_STATE_DIR:-$SIGNERD_MATERIAL_DIR}"
919
- if [[ -n "${FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER:-}" ]]; then
920
- SIGNERD_BROKER_LOG="$(dirname "${FASED_WALLET_LOCAL_SIGNER_SOCKET:-$SIGNERD_SOCKET}")/local-signer-broker.log"
921
- fi
922
- hydrate_scoped_wallet_keystore_env_from_registry "$SIGNERD_MATERIAL_DIR"
923
- if should_start_signerd; then
731
+ SIGNERD_CONTROL_SOCKET="${FASED_WALLET_LOCAL_SIGNER_CONTROL_SOCKET:-$SIGNERD_MATERIAL_DIR/local-signer-control.sock}"
732
+ SIGNERD_STATE_DB="${FASED_WALLET_LOCAL_SIGNER_STATE_DB:-$SIGNERD_MATERIAL_DIR/signerd-v2.db}"
733
+ SIGNERD_MASTER_KEY="${FASED_WALLET_LOCAL_SIGNER_MASTER_KEY:-$SIGNERD_MATERIAL_DIR/signerd-v2.master.key}"
734
+ HOSTED_ROOT_SIGNER=0
735
+ if [[ "${FASED_HOST_PROFILE:-}" == "hosting" ]]; then
736
+ HOSTED_ROOT_SIGNER=1
737
+ SIGNERD_SOCKET="/run/fased-signerd/app.sock"
738
+ export FASED_WALLET_LOCAL_SIGNER_SOCKET="$SIGNERD_SOCKET"
739
+ unset FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET
740
+ unset FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER
741
+ if [[ -S "$SIGNERD_SOCKET" ]]; then
742
+ SIGNERD_STARTUP_MODE="external"
743
+ echo "==> Using root-managed fased-signerd service (socket: $SIGNERD_SOCKET)"
744
+ else
745
+ mark_signerd_degraded "root-managed fased-signerd socket is unavailable. Repair only from the provider root console using the exact tagged, attested Hosting release; never run the app checkout with sudo."
746
+ fi
747
+ elif should_start_signerd; then
924
748
  SIGNERD_STARTUP_MODE="healthy"
925
749
  SIGNERD_SOCKET="${FASED_WALLET_LOCAL_SIGNER_SOCKET:-$SIGNERD_SOCKET}"
926
- SIGNERD_BACKEND_SOCKET="${FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET:-$SIGNERD_SOCKET}"
927
- SIGNERD_EVM_KEYSTORE="$(resolve_signerd_keystore_export "${FASED_WALLET_EVM_KEYSTORE_PATH:-}" "FASED_WALLET_EVM_KEYSTORE_PATH" "$SIGNERD_MATERIAL_DIR/keystore-evm.v1.enc")"
928
- SIGNERD_SOL_KEYSTORE="$(resolve_signerd_keystore_export "${FASED_WALLET_SOLANA_KEYSTORE_PATH:-}" "FASED_WALLET_SOLANA_KEYSTORE_PATH" "$SIGNERD_MATERIAL_DIR/keystore-solana.v1.enc")"
929
- SIGNERD_PASSPHRASE="${FASED_WALLET_PASSPHRASE:-}"
930
- SIGNERD_PASSPHRASE_FILE="${FASED_WALLET_PASSPHRASE_FILE:-}"
750
+ unset FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET
751
+ unset FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER
931
752
  SIGNERD_CHAINS="${FASED_WALLET_CHAINS:-$(resolve_wallet_chains_from_config)}"
932
753
  export FASED_WALLET_LOCAL_SIGNER_SOCKET="$SIGNERD_SOCKET"
933
- export FASED_WALLET_LOCAL_SIGNER_BACKEND_SOCKET="$SIGNERD_BACKEND_SOCKET"
934
754
  export FASED_WALLET_SIGNER_STATE_DIR="$SIGNERD_MATERIAL_DIR"
935
755
  export FASED_WALLET_CHAINS="${SIGNERD_CHAINS:-evm,solana}"
936
- if [[ -n "$SIGNERD_EVM_KEYSTORE" ]]; then
937
- export FASED_WALLET_EVM_KEYSTORE_PATH="$SIGNERD_EVM_KEYSTORE"
938
- else
939
- unset FASED_WALLET_EVM_KEYSTORE_PATH
940
- fi
941
- if [[ -n "$SIGNERD_SOL_KEYSTORE" ]]; then
942
- export FASED_WALLET_SOLANA_KEYSTORE_PATH="$SIGNERD_SOL_KEYSTORE"
943
- else
944
- unset FASED_WALLET_SOLANA_KEYSTORE_PATH
945
- fi
946
- if [[ -n "$SIGNERD_PASSPHRASE" ]]; then
947
- export FASED_WALLET_PASSPHRASE="$SIGNERD_PASSPHRASE"
948
- unset FASED_WALLET_PASSPHRASE_FILE
949
- else
950
- SIGNERD_PASSPHRASE_FILE="${SIGNERD_PASSPHRASE_FILE:-$SIGNERD_MATERIAL_DIR/passphrase}"
951
- export FASED_WALLET_PASSPHRASE_FILE="$SIGNERD_PASSPHRASE_FILE"
952
- unset FASED_WALLET_PASSPHRASE
953
- fi
756
+ unset FASED_WALLET_SOLANA_KEYSTORE_PATH
757
+ unset FASED_WALLET_EVM_KEYSTORE_PATH
758
+ unset FASED_WALLET_PASSPHRASE
759
+ unset FASED_WALLET_PASSPHRASE_FILE
954
760
  if [[ -f "$SIGNERD_BIN" ]]; then
955
- if [[ -S "$SIGNERD_SOCKET" ]] || [[ -S "$SIGNERD_BACKEND_SOCKET" ]] || [[ -f "$(resolve_local_signer_sidecar_path "$SIGNERD_BACKEND_SOCKET" "pid")" ]] || [[ "$(count_existing_signerd_pids)" -gt 0 ]]; then
761
+ if [[ -S "$SIGNERD_SOCKET" ]] || [[ -f "$(resolve_local_signer_sidecar_path "$SIGNERD_SOCKET" "pid")" ]] || [[ "$(count_existing_signerd_pids)" -gt 0 ]]; then
956
762
  echo "==> Restarting fased-signerd to apply current wallet chain/runtime config..."
957
763
  stop_existing_signerd
958
764
  fi
959
765
  echo "==> Starting fased-signerd (Go key signer)..."
960
766
  mkdir -p "$LOG_DIR"
961
- mkdir -p "$(dirname "$SIGNERD_LOG")" "$(dirname "$SIGNERD_BROKER_LOG")" 2>/dev/null || true
767
+ mkdir -p "$(dirname "$SIGNERD_LOG")" 2>/dev/null || true
962
768
  if start_signerd_process; then
963
769
  SIGNERD_PID=$!
964
770
  else
965
- mark_signerd_degraded "failed to start isolated fased-signerd as ${FASED_WALLET_LOCAL_SIGNER_RUN_AS_USER:-current user}. Check sudoers and $SIGNERD_LOG"
771
+ mark_signerd_degraded "failed to start fased-signerd as the current Local user. Check $SIGNERD_LOG"
966
772
  SIGNERD_PID=""
967
773
  fi
968
774
  if [[ -n "$SIGNERD_PID" ]] && wait_for_signerd_ready "$SIGNERD_READY_TIMEOUT_SECONDS"; then
969
- if ! start_signer_broker_process; then
970
- mark_signerd_degraded "fased-signerd started but signer broker failed. Check $SIGNERD_BROKER_LOG"
971
- elif wait_for_signer_broker_ready "$SIGNERD_READY_TIMEOUT_SECONDS"; then
972
- echo "==> fased-signerd started (PID=$SIGNERD_PID, socket: $SIGNERD_BACKEND_SOCKET)"
973
- else
974
- mark_signerd_degraded "fased-signerd broker did not become ready. Check $SIGNERD_BROKER_LOG"
975
- fi
775
+ echo "==> fased-signerd started (PID=$SIGNERD_PID, socket: $SIGNERD_SOCKET)"
976
776
  else
977
777
  mark_signerd_degraded "fased-signerd did not create socket. Check $SIGNERD_LOG"
978
778
  fi
@@ -1024,9 +824,11 @@ start_health_monitor() {
1024
824
  ensure_managed_clock_sync || true
1025
825
  fi
1026
826
  if [[ -n "$RES_TOKEN" ]]; then
1027
- "$ZROK_BIN" share reserved "$RES_TOKEN" --headless >>"$ZROK_RUNTIME_LOG" 2>&1 &
827
+ "$ZROK_BIN" share reserved "$RES_TOKEN" --headless 2>&1 \
828
+ | filter_zrok_runtime_output >>"$ZROK_RUNTIME_LOG" &
1028
829
  else
1029
- "$ZROK_BIN" share public "http://127.0.0.1:${FASED_GATEWAY_PORT}" --unique-name "$SLUG" >>"$ZROK_RUNTIME_LOG" 2>&1 &
830
+ "$ZROK_BIN" share public "http://127.0.0.1:${FASED_GATEWAY_PORT}" --unique-name "$SLUG" 2>&1 \
831
+ | filter_zrok_runtime_output >>"$ZROK_RUNTIME_LOG" &
1030
832
  fi
1031
833
  pid=$!
1032
834
  echo "$pid" > "$FASED_CONFIG_DIR/.zrok-pid"
@@ -1217,8 +1019,12 @@ echo "[tunnel] Target Slug: $SLUG"
1217
1019
  RES_FILE="$FASED_CONFIG_DIR/${SLUG}.zrok-reservation"
1218
1020
  RES_TOKEN=""
1219
1021
  if [[ -f "$RES_FILE" ]]; then
1220
- RES_TOKEN=$(cat "$RES_FILE")
1221
- echo "[tunnel] Found cached reservation: $RES_TOKEN"
1022
+ RES_TOKEN="$(read_private_zrok_reservation "$RES_FILE" || true)"
1023
+ if [[ -n "$RES_TOKEN" ]]; then
1024
+ echo "[tunnel] Found a private cached reservation (token hidden)."
1025
+ else
1026
+ echo "[tunnel] Ignoring an unsafe or unreadable cached reservation file."
1027
+ fi
1222
1028
  fi
1223
1029
 
1224
1030
  # Recovery when exact slug file is missing: use the only reservation token in config dir.
@@ -1226,14 +1032,16 @@ if [[ -z "$RES_TOKEN" ]]; then
1226
1032
  mapfile -t RES_FILES < <(ls "$FASED_CONFIG_DIR"/*.zrok-reservation 2>/dev/null || true)
1227
1033
  if [[ ${#RES_FILES[@]} -eq 1 ]]; then
1228
1034
  RES_FILE="${RES_FILES[0]}"
1229
- RES_TOKEN=$(cat "$RES_FILE")
1035
+ RES_TOKEN="$(read_private_zrok_reservation "$RES_FILE" || true)"
1230
1036
  RECOVERED_BASENAME=$(basename "$RES_FILE")
1231
1037
  RECOVERED_SLUG="${RECOVERED_BASENAME%.zrok-reservation}"
1232
1038
  if [[ -n "$RECOVERED_SLUG" ]]; then
1233
1039
  SLUG="$RECOVERED_SLUG"
1234
1040
  echo "[tunnel] Recovered slug from cached reservation filename: $SLUG"
1235
1041
  fi
1236
- echo "[tunnel] Recovered cached reservation: $RES_TOKEN"
1042
+ if [[ -n "$RES_TOKEN" ]]; then
1043
+ echo "[tunnel] Recovered a private cached reservation (token hidden)."
1044
+ fi
1237
1045
  fi
1238
1046
  fi
1239
1047
 
@@ -1274,7 +1082,7 @@ if [[ "$MANAGED_TUNNEL_DISABLED" != "1" && "$ZROK_TOKEN" != "null" && -n "$ZROK_
1274
1082
  # zrok enable (idempotent-ish, or just try)
1275
1083
  # Remove --force as it's not supported in v1.1+
1276
1084
  # We ignore error if already enabled, but capture output to be safe
1277
- "$ZROK_BIN" enable "$ZROK_TOKEN" --description "fased-agent" 2>/dev/null || true
1085
+ "$ZROK_BIN" enable "$ZROK_TOKEN" --description "fased-agent" >/dev/null 2>&1 || true
1278
1086
 
1279
1087
  # If no token, check if we already reserved it (recovery from lost file)
1280
1088
  if [[ -z "$RES_TOKEN" ]]; then
@@ -1283,9 +1091,10 @@ if [[ "$MANAGED_TUNNEL_DISABLED" != "1" && "$ZROK_TOKEN" != "null" && -n "$ZROK_
1283
1091
  EXISTING_TOKEN=$(echo "$OVERVIEW_JSON" | jq -r --arg SLUG "$SLUG" '(.shares // [])[] | select(.frontendEndpoints[] | contains($SLUG)) | .token' 2>/dev/null | head -n 1 || true)
1284
1092
 
1285
1093
  if [[ -n "$EXISTING_TOKEN" ]]; then
1286
- echo "[tunnel] Recovered existing token: $EXISTING_TOKEN"
1094
+ echo "[tunnel] Recovered an existing reservation (token hidden)."
1287
1095
  RES_TOKEN="$EXISTING_TOKEN"
1288
- echo "$RES_TOKEN" > "$RES_FILE"
1096
+ write_private_zrok_reservation "$RES_FILE" "$RES_TOKEN"
1097
+ unset EXISTING_TOKEN OVERVIEW_JSON
1289
1098
  fi
1290
1099
  fi
1291
1100
 
@@ -1293,25 +1102,27 @@ if [[ "$MANAGED_TUNNEL_DISABLED" != "1" && "$ZROK_TOKEN" != "null" && -n "$ZROK_
1293
1102
  if [[ -z "$RES_TOKEN" ]]; then
1294
1103
  echo "[tunnel] Reserving public share..."
1295
1104
  # Use --json-output to parse output reliably; separate stderr
1296
- PARAMS="--unique-name $SLUG --backend-mode proxy --json-output"
1105
+ ZROK_RESERVE_ARGS=(--unique-name "$SLUG" --backend-mode proxy --json-output)
1297
1106
 
1298
1107
  # Capture logic: stdout to variable, stderr to temp file
1299
- ZROK_LOG="/tmp/zrok-reserve.log"
1300
- rm -f "$ZROK_LOG"
1108
+ ZROK_LOG="$(mktemp "$FASED_CONFIG_DIR/.zrok-reserve.XXXXXXXX")"
1109
+ chmod 0600 "$ZROK_LOG"
1110
+ OUT=""
1301
1111
 
1302
- if OUT=$("$ZROK_BIN" reserve public "http://127.0.0.1:${FASED_GATEWAY_PORT}" $PARAMS 2> "$ZROK_LOG"); then
1112
+ if OUT=$("$ZROK_BIN" reserve public "http://127.0.0.1:${FASED_GATEWAY_PORT}" "${ZROK_RESERVE_ARGS[@]}" 2> "$ZROK_LOG"); then
1303
1113
  RES_TOKEN=$(echo "$OUT" | jq -r '.token // empty')
1304
1114
  else
1305
- echo "[tunnel] Reserve failed. Log:"
1306
- cat "$ZROK_LOG"
1115
+ echo "[tunnel] Reservation request failed; provider output was suppressed because it may contain credentials."
1307
1116
  fi
1117
+ rm -f -- "$ZROK_LOG"
1118
+ unset ZROK_LOG ZROK_RESERVE_ARGS OUT
1308
1119
 
1309
1120
  if [[ -z "$RES_TOKEN" ]]; then
1310
- echo "[tunnel] Reservation failed or already reserved. Output: $OUT"
1121
+ echo "[tunnel] Reservation failed or was already reserved; secret-bearing output was not logged."
1311
1122
  disable_managed_tunnel "Could not establish reserved tunnel for '$SLUG'."
1312
1123
  else
1313
- echo "$RES_TOKEN" > "$RES_FILE"
1314
- echo "[tunnel] Reserved: $RES_TOKEN"
1124
+ write_private_zrok_reservation "$RES_FILE" "$RES_TOKEN"
1125
+ echo "[tunnel] Reserved a private share (token hidden)."
1315
1126
  fi
1316
1127
  fi
1317
1128
 
@@ -1439,13 +1250,11 @@ TAILSCALE_ADMIN_URL="N/A"
1439
1250
  TAILSCALE_SSH_CMD="N/A"
1440
1251
  TAILSCALE_SERVE_READY=0
1441
1252
  if command -v tailscale >/dev/null 2>&1; then
1442
- if [[ "${FASED_TAILSCALE_AUTO_SERVE:-1}" == "1" ]]; then
1253
+ if [[ "${FASED_TAILSCALE_AUTO_SERVE:-1}" == "1" && "${FASED_HOST_PROFILE:-}" != "hosting" ]]; then
1443
1254
  tailscale serve --bg "http://127.0.0.1:${FASED_GATEWAY_PORT}" >/dev/null 2>&1 || \
1444
- printf '%s\n' "${FASED_GATEWAY_PORT}" | sudo -n /usr/local/sbin/fased-host-maintenance tailscale-serve >/dev/null 2>&1 || \
1445
1255
  tailscale serve https / "http://127.0.0.1:${FASED_GATEWAY_PORT}" >/dev/null 2>&1 || true
1446
1256
  fi
1447
- if tailscale serve status 2>/dev/null | grep -q "127.0.0.1:${FASED_GATEWAY_PORT}" || \
1448
- sudo -n /usr/local/sbin/fased-host-maintenance tailscale-serve-status 2>/dev/null | grep -q "127.0.0.1:${FASED_GATEWAY_PORT}"; then
1257
+ if tailscale serve status 2>/dev/null | grep -q "127.0.0.1:${FASED_GATEWAY_PORT}"; then
1449
1258
  TAILSCALE_SERVE_READY=1
1450
1259
  fi
1451
1260
  if command -v jq >/dev/null 2>&1; then
@@ -1465,22 +1274,20 @@ FED_TOKEN_ID="N/A"
1465
1274
  FED_EXPIRES_AT="N/A"
1466
1275
  FED_AGENT_SLUG="N/A"
1467
1276
  FED_PUBLIC_URL="N/A"
1468
- FED_ZROK_TOKEN=""
1277
+ FED_ZROK_CREDENTIAL_STATE="not present"
1469
1278
  if command -v jq >/dev/null 2>&1; then
1470
1279
  FED_HANDLE=$(jq -r '.handle // "N/A"' "$TOKEN_PATH" 2>/dev/null || echo "N/A")
1471
1280
  FED_TOKEN_ID=$(jq -r '.tokenId // "N/A"' "$TOKEN_PATH" 2>/dev/null || echo "N/A")
1472
1281
  FED_EXPIRES_AT=$(jq -r '.expiresAt // "N/A"' "$TOKEN_PATH" 2>/dev/null || echo "N/A")
1473
1282
  FED_AGENT_SLUG=$(jq -r '.agentSlug // "N/A"' "$TOKEN_PATH" 2>/dev/null || echo "N/A")
1474
1283
  FED_PUBLIC_URL=$(jq -r '.publicUrl // "N/A"' "$TOKEN_PATH" 2>/dev/null || echo "N/A")
1475
- FED_ZROK_TOKEN=$(jq -r '.zrokToken // empty' "$TOKEN_PATH" 2>/dev/null || true)
1476
- fi
1477
- FED_ZROK_TOKEN_MASKED="N/A"
1478
- if [[ -n "$FED_ZROK_TOKEN" ]]; then
1479
- FED_ZROK_TOKEN_MASKED=$(mask_secret "$FED_ZROK_TOKEN")
1284
+ if jq -e '.zrokToken | type == "string" and length > 0' "$TOKEN_PATH" >/dev/null 2>&1; then
1285
+ FED_ZROK_CREDENTIAL_STATE="present (hidden)"
1286
+ fi
1480
1287
  fi
1481
- RES_TOKEN_MASKED="N/A"
1288
+ RES_TOKEN_STATE="not present"
1482
1289
  if [[ -n "${RES_TOKEN:-}" ]]; then
1483
- RES_TOKEN_MASKED=$(mask_secret "$RES_TOKEN")
1290
+ RES_TOKEN_STATE="present (hidden)"
1484
1291
  fi
1485
1292
  GATEWAY_TOKEN_MASKED=$(mask_secret "$(tr -d '\n' < "$GW_TOKEN_PATH")")
1486
1293
 
@@ -1497,11 +1304,11 @@ echo " Token ID: $FED_TOKEN_ID"
1497
1304
  echo " Expires At: $FED_EXPIRES_AT"
1498
1305
  echo " Agent Slug: $FED_AGENT_SLUG"
1499
1306
  echo " Public URL (token): $FED_PUBLIC_URL"
1500
- echo " zrokToken: $FED_ZROK_TOKEN_MASKED"
1307
+ echo " zrok credential: $FED_ZROK_CREDENTIAL_STATE"
1501
1308
  echo "Federation/A2A Tunnel (zrok)"
1502
1309
  echo " PID: ${ZROK_PID:-N/A}"
1503
1310
  echo " Slug: ${SLUG:-N/A}"
1504
- echo " Reservation token: $RES_TOKEN_MASKED"
1311
+ echo " Reservation: $RES_TOKEN_STATE"
1505
1312
  echo " Public URL (A2A): $FINAL_URL"
1506
1313
  echo " Runtime log: $ZROK_RUNTIME_LOG"
1507
1314
  if [[ "$MANAGED_TUNNEL_DISABLED" == "1" ]]; then
@@ -1583,7 +1390,9 @@ cleanup_managed_runtime() {
1583
1390
  kill "$ZROK_MONITOR_PID" 2>/dev/null || true
1584
1391
  fi
1585
1392
  rm -f "$FASED_CONFIG_DIR/.zrok-pid" "$ZROK_MONITOR_PID_FILE" 2>/dev/null || true
1586
- stop_existing_signerd >/dev/null 2>&1 || true
1393
+ if [[ "${HOSTED_ROOT_SIGNER:-0}" != "1" ]]; then
1394
+ stop_existing_signerd >/dev/null 2>&1 || true
1395
+ fi
1587
1396
  force_stop_local_gateway
1588
1397
  }
1589
1398