@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
@@ -0,0 +1,288 @@
1
+ import { resolveMainSessionKeyFromConfig } from "../config/sessions/main-session.js";
2
+ import "../config/sessions.js";
3
+ import { enqueueSystemEvent } from "../infra/system-events.js";
4
+ import { activateSecretsRuntimeSnapshot, clearSecretsRuntimeSnapshot, getActiveSecretsRuntimeSnapshot, prepareSecretsRuntimeSnapshot } from "../secrets/runtime.js";
5
+ import { buildGatewayReloadPlan, diffConfigPaths, resolveGatewayReloadSettings } from "./config-reload.js";
6
+ import { isDeepStrictEqual } from "node:util";
7
+
8
+ //#region src/gateway/server-secrets-runtime.ts
9
+ var GatewaySecretsRuntimeError = class extends Error {
10
+ constructor(code, message, options) {
11
+ super(message, options);
12
+ this.name = "GatewaySecretsRuntimeError";
13
+ this.code = code;
14
+ }
15
+ };
16
+ function sanitizeGatewaySecretsRuntimeError(error) {
17
+ if (error instanceof GatewaySecretsRuntimeError) {
18
+ return {
19
+ code: error.code,
20
+ message: error.message
21
+ };
22
+ }
23
+ return {
24
+ code: "SECRETS_RELOAD_FAILED",
25
+ message: "Secret reload failed without changing the active runtime snapshot. Run `fased secrets audit --check` for local diagnostics."
26
+ };
27
+ }
28
+ function runtimeError(code, message, cause) {
29
+ return new GatewaySecretsRuntimeError(code, message, cause === undefined ? undefined : { cause });
30
+ }
31
+ function normalizeRuntimeError(error, fallbackCode, fallbackMessage) {
32
+ return error instanceof GatewaySecretsRuntimeError ? error : runtimeError(fallbackCode, fallbackMessage, error);
33
+ }
34
+ function invalidSnapshotError(snapshot) {
35
+ const paths = [...new Set(snapshot.issues.map((issue) => issue.path.trim() || "<root>"))].slice(0, 8);
36
+ const suffix = paths.length > 0 ? ` Invalid paths: ${paths.join(", ")}.` : "";
37
+ return runtimeError("SECRETS_CONFIG_INVALID", `Secret reload refused an invalid Gateway config.${suffix} Run \`fased doctor\` locally before retrying.`);
38
+ }
39
+ function missingSnapshotError() {
40
+ return runtimeError("SECRETS_CONFIG_MISSING", "Secret reload refused to replace the active snapshot because the Gateway config file is missing.");
41
+ }
42
+ function staleSourceError() {
43
+ return runtimeError("SECRETS_SOURCE_STALE", "Secret reload discarded a stale config revision; retry after the current config change finishes.");
44
+ }
45
+ function cloneConfig(config) {
46
+ return structuredClone(config);
47
+ }
48
+ function sameSourceSnapshot(left, right) {
49
+ if (left.exists !== right.exists || left.valid !== right.valid) {
50
+ return false;
51
+ }
52
+ if (left.hash && right.hash) {
53
+ return left.hash === right.hash;
54
+ }
55
+ return isDeepStrictEqual(left.config, right.config);
56
+ }
57
+ function planNeedsHotApply(plan) {
58
+ return plan.hotReasons.length > 0 || plan.reloadHooks || plan.restartGmailWatcher || plan.restartBrowserControl || plan.restartCron || plan.restartHeartbeat || plan.restartChannels.size > 0;
59
+ }
60
+ function assertManualSourceChangeAllowed(params) {
61
+ const changedPaths = diffConfigPaths(params.previous, params.next);
62
+ if (changedPaths.length === 0) {
63
+ return;
64
+ }
65
+ const plan = buildGatewayReloadPlan(changedPaths);
66
+ const settings = resolveGatewayReloadSettings(params.next);
67
+ if (settings.mode === "restart" || plan.restartGateway) {
68
+ throw runtimeError("SECRETS_SOURCE_RESTART_REQUIRED", "Secret reload refused config changes that require a Gateway restart. Let the config reloader restart the Gateway, then retry.");
69
+ }
70
+ if (planNeedsHotApply(plan)) {
71
+ throw runtimeError("SECRETS_SOURCE_HOT_RELOAD_REQUIRED", "Secret reload refused config changes that require live component reconfiguration. Let the config reloader apply them, then retry.");
72
+ }
73
+ }
74
+ function createGatewaySecretsRuntimeController(params) {
75
+ const prepareSnapshot = params.prepareSnapshot ?? prepareSecretsRuntimeSnapshot;
76
+ const activateSnapshot = params.activateSnapshot ?? activateSecretsRuntimeSnapshot;
77
+ const getActiveSnapshot = params.getActiveSnapshot ?? getActiveSecretsRuntimeSnapshot;
78
+ const clearSnapshot = params.clearSnapshot ?? clearSecretsRuntimeSnapshot;
79
+ let activeSourceConfig = null;
80
+ let degraded = false;
81
+ let closed = false;
82
+ let latestGeneration = 0;
83
+ let operationTail = Promise.resolve();
84
+ let shutdownPromise = null;
85
+ const runExclusive = (operation) => {
86
+ const result = operationTail.then(operation, operation);
87
+ operationTail = result.then(() => undefined, () => undefined);
88
+ return result;
89
+ };
90
+ const runTracked = (operation) => {
91
+ const generation = ++latestGeneration;
92
+ return runExclusive(async () => await operation(generation));
93
+ };
94
+ const assertCurrent = (generation) => {
95
+ if (closed) {
96
+ throw runtimeError("SECRETS_RUNTIME_CLOSED", "Secret reload was cancelled because the Gateway is shutting down.");
97
+ }
98
+ if (generation !== latestGeneration) {
99
+ throw staleSourceError();
100
+ }
101
+ };
102
+ const emitTransition = (code) => {
103
+ if (params.emitTransition) {
104
+ params.emitTransition(code);
105
+ return;
106
+ }
107
+ const text = code === "SECRETS_RELOADER_DEGRADED" ? `[${code}] Secret reload failed; the Gateway kept its last-known-good runtime snapshot.` : `[${code}] Secret references recovered and the Gateway activated a new runtime snapshot.`;
108
+ enqueueSystemEvent(text, {
109
+ sessionKey: resolveMainSessionKeyFromConfig(),
110
+ contextKey: "gateway-secrets-runtime",
111
+ trusted: true
112
+ });
113
+ };
114
+ const recordReloadFailure = (error) => {
115
+ const safe = sanitizeGatewaySecretsRuntimeError(error);
116
+ params.log.warn(`[SECRETS_RELOADER_DEGRADED] secret reload failed; keeping last-known-good runtime snapshot (${safe.code}): ${safe.message}`);
117
+ if (degraded || closed) {
118
+ return;
119
+ }
120
+ degraded = true;
121
+ emitTransition("SECRETS_RELOADER_DEGRADED");
122
+ };
123
+ const recordReloadSuccess = () => {
124
+ if (!degraded) {
125
+ return;
126
+ }
127
+ degraded = false;
128
+ params.log.info("[SECRETS_RELOADER_RECOVERED] secret runtime snapshot recovered");
129
+ emitTransition("SECRETS_RELOADER_RECOVERED");
130
+ };
131
+ const logWarnings = (prepared) => {
132
+ for (const warning of prepared.warnings) {
133
+ params.log.warn(`[${warning.code}] ${warning.message}`);
134
+ }
135
+ };
136
+ const prepareSafely = async (config) => {
137
+ try {
138
+ return await prepareSnapshot({ config });
139
+ } catch (error) {
140
+ throw normalizeRuntimeError(error, "SECRETS_RESOLUTION_FAILED", "One or more required secret references could not be resolved. Run `fased secrets audit --check` locally before retrying.");
141
+ }
142
+ };
143
+ const requireReloadableSnapshot = (snapshot) => {
144
+ if (!snapshot.exists) {
145
+ throw missingSnapshotError();
146
+ }
147
+ if (!snapshot.valid) {
148
+ throw invalidSnapshotError(snapshot);
149
+ }
150
+ };
151
+ const assertSnapshotStillCurrent = async (expected) => {
152
+ const current = await params.readConfigSnapshot();
153
+ requireReloadableSnapshot(current);
154
+ if (!sameSourceSnapshot(expected, current)) {
155
+ throw staleSourceError();
156
+ }
157
+ };
158
+ const restoreSnapshot = (previous) => {
159
+ try {
160
+ if (previous) {
161
+ activateSnapshot(previous);
162
+ } else {
163
+ clearSnapshot();
164
+ }
165
+ } catch {
166
+ clearSnapshot();
167
+ }
168
+ };
169
+ const activateStartup = (snapshot) => runTracked(async (generation) => {
170
+ if (!snapshot.valid) {
171
+ throw invalidSnapshotError(snapshot);
172
+ }
173
+ assertCurrent(generation);
174
+ const prepared = await prepareSafely(snapshot.config);
175
+ assertCurrent(generation);
176
+ activateSnapshot(prepared);
177
+ activeSourceConfig = cloneConfig(snapshot.config);
178
+ logWarnings(prepared);
179
+ return prepared;
180
+ });
181
+ const activateHotReload = (snapshot, transaction) => runTracked(async (generation) => {
182
+ try {
183
+ requireReloadableSnapshot(snapshot);
184
+ assertCurrent(generation);
185
+ await assertSnapshotStillCurrent(snapshot);
186
+ assertCurrent(generation);
187
+ const prepared = await prepareSafely(snapshot.config);
188
+ assertCurrent(generation);
189
+ await assertSnapshotStillCurrent(snapshot);
190
+ assertCurrent(generation);
191
+ const previous = getActiveSnapshot();
192
+ activateSnapshot(prepared);
193
+ try {
194
+ await transaction.apply(prepared.config);
195
+ assertCurrent(generation);
196
+ await assertSnapshotStillCurrent(snapshot);
197
+ assertCurrent(generation);
198
+ } catch (error) {
199
+ restoreSnapshot(previous);
200
+ if (previous) {
201
+ try {
202
+ await transaction.rollback(previous.config);
203
+ } catch (rollbackError) {
204
+ throw runtimeError("SECRETS_HOT_APPLY_FAILED", "Gateway hot reload failed. The last-known-good secret snapshot was restored, but one or more live components could not be restored and remain stopped.", rollbackError);
205
+ }
206
+ }
207
+ throw normalizeRuntimeError(error, "SECRETS_HOT_APPLY_FAILED", "Gateway hot reload failed; the last-known-good secret snapshot and live component state were restored.");
208
+ }
209
+ activeSourceConfig = cloneConfig(snapshot.config);
210
+ logWarnings(prepared);
211
+ recordReloadSuccess();
212
+ return prepared;
213
+ } catch (error) {
214
+ const safe = normalizeRuntimeError(error, "SECRETS_RELOAD_FAILED", "Secret reload failed without changing the active runtime snapshot.");
215
+ recordReloadFailure(safe);
216
+ throw safe;
217
+ }
218
+ });
219
+ const validateRestart = (snapshot) => runTracked(async (generation) => {
220
+ try {
221
+ requireReloadableSnapshot(snapshot);
222
+ assertCurrent(generation);
223
+ await assertSnapshotStillCurrent(snapshot);
224
+ assertCurrent(generation);
225
+ const prepared = await prepareSafely(snapshot.config);
226
+ assertCurrent(generation);
227
+ await assertSnapshotStillCurrent(snapshot);
228
+ assertCurrent(generation);
229
+ logWarnings(prepared);
230
+ return { warningCount: prepared.warnings.length };
231
+ } catch (error) {
232
+ const safe = normalizeRuntimeError(error, "SECRETS_RELOAD_FAILED", "Secret validation failed; the Gateway restart was not scheduled.");
233
+ recordReloadFailure(safe);
234
+ throw safe;
235
+ }
236
+ });
237
+ const reloadFromConfig = () => runTracked(async (generation) => {
238
+ try {
239
+ assertCurrent(generation);
240
+ const snapshot = await params.readConfigSnapshot();
241
+ requireReloadableSnapshot(snapshot);
242
+ if (!activeSourceConfig) {
243
+ throw runtimeError("SECRETS_RELOAD_FAILED", "Secret reload is unavailable before the startup snapshot is active.");
244
+ }
245
+ assertManualSourceChangeAllowed({
246
+ previous: activeSourceConfig,
247
+ next: snapshot.config
248
+ });
249
+ const prepared = await prepareSafely(snapshot.config);
250
+ assertCurrent(generation);
251
+ await assertSnapshotStillCurrent(snapshot);
252
+ assertCurrent(generation);
253
+ activateSnapshot(prepared);
254
+ activeSourceConfig = cloneConfig(snapshot.config);
255
+ logWarnings(prepared);
256
+ recordReloadSuccess();
257
+ return { warningCount: prepared.warnings.length };
258
+ } catch (error) {
259
+ const safe = normalizeRuntimeError(error, "SECRETS_RELOAD_FAILED", "Secret reload failed without changing the active runtime snapshot.");
260
+ recordReloadFailure(safe);
261
+ throw safe;
262
+ }
263
+ });
264
+ const shutdown = () => {
265
+ if (shutdownPromise) {
266
+ return shutdownPromise;
267
+ }
268
+ closed = true;
269
+ latestGeneration += 1;
270
+ shutdownPromise = (async () => {
271
+ await operationTail;
272
+ activeSourceConfig = null;
273
+ degraded = false;
274
+ clearSnapshot();
275
+ })();
276
+ return shutdownPromise;
277
+ };
278
+ return {
279
+ activateStartup,
280
+ activateHotReload,
281
+ validateRestart,
282
+ reloadFromConfig,
283
+ shutdown
284
+ };
285
+ }
286
+
287
+ //#endregion
288
+ export { createGatewaySecretsRuntimeController, sanitizeGatewaySecretsRuntimeError };
@@ -17,7 +17,8 @@ import { startDiagnosticHeartbeat, stopDiagnosticHeartbeat } from "../logging/di
17
17
  import { getTotalQueueSize } from "../process/command-queue.js";
18
18
  import { clearAgentRunContext, onAgentEvent } from "../infra/agent-events.js";
19
19
  import { initSubagentRegistry } from "../agents/subagent-registry.js";
20
- import { resolveLocalSignerMaterialRootDir, resolveWalletRuntimeConfig } from "../wallet/wallet-runtime-config.js";
20
+ import { resolveWalletRuntimeConfig } from "../wallet/wallet-runtime-config.js";
21
+ import { readWalletProviderRegistry } from "../wallet/wallet-provider-registry.js";
21
22
  import { createWalletProviderAdapter, resolveWalletProviderId } from "../wallet/wallet-provider-resolver.js";
22
23
  import { getTotalPendingReplies } from "../auto-reply/reply/dispatcher-registry.js";
23
24
  import { applyPluginAutoEnable } from "../config/plugin-auto-enable.js";
@@ -38,6 +39,7 @@ import { createDefaultDeps } from "../cli/deps.js";
38
39
  import { ensureFasedAgentCliOnPath } from "../infra/path-env.js";
39
40
  import { createExecApprovalForwarder } from "../infra/exec-approval-forwarder.js";
40
41
  import { scheduleGatewayUpdateCheck } from "../infra/update-startup.js";
42
+ import { clearSecretsRuntimeSnapshot } from "../secrets/runtime.js";
41
43
  import { runOnboardingWizard } from "../wizard/onboarding.js";
42
44
  import { startGatewayConfigReloader } from "./config-reload.js";
43
45
  import { ExecApprovalManager } from "./exec-approval-manager.js";
@@ -54,6 +56,8 @@ import { startGatewayMaintenanceTimers } from "./server-maintenance.js";
54
56
  import { GATEWAY_EVENTS, listGatewayMethods } from "./server-methods-list.js";
55
57
  import { coreGatewayHandlers } from "./server-methods.js";
56
58
  import { createExecApprovalHandlers } from "./server-methods/exec-approval.js";
59
+ import { createGatewaySecretsRuntimeController, sanitizeGatewaySecretsRuntimeError } from "./server-secrets-runtime.js";
60
+ import { createSecretsHandlers } from "./server-methods/secrets.js";
57
61
  import { hasConnectedMobileNode } from "./server-mobile-nodes.js";
58
62
  import { createNodeSubscriptionManager } from "./server-node-subscriptions.js";
59
63
  import { loadGatewayPlugins } from "./server-plugins.js";
@@ -68,7 +72,6 @@ import { createWizardSessionTracker } from "./server-wizard-sessions.js";
68
72
  import { attachGatewayWsHandlers } from "./server-ws-runtime.js";
69
73
  import { loadGatewayTlsRuntime } from "./server/tls.js";
70
74
  import { createSessionEventSubscriberRegistry, createSessionMessageSubscriberRegistry } from "./session-event-subscribers.js";
71
- import fs from "node:fs";
72
75
  import path from "node:path";
73
76
 
74
77
  //#region src/gateway/server.impl.ts
@@ -88,25 +91,6 @@ const logWsControl = log.child("ws");
88
91
  const gatewayRuntime = runtimeForLogger(log);
89
92
  const canvasRuntime = runtimeForLogger(logCanvas);
90
93
  const LOCAL_SIGNER_STARTUP_RECOVERY_TIMEOUT_MS = 2e3;
91
- function hasConfiguredLocalSignerKeystoreMaterial(env) {
92
- for (const [key, rawValue] of Object.entries(env)) {
93
- if (typeof rawValue !== "string" || rawValue.trim().length === 0) {
94
- continue;
95
- }
96
- if (key === "FASED_WALLET_SOLANA_KEYSTORE_PATH" || key.startsWith("FASED_WALLET_SOLANA_KEYSTORE_PATH__")) {
97
- return true;
98
- }
99
- }
100
- try {
101
- const materialDir = resolveLocalSignerMaterialRootDir(env);
102
- if (!fs.existsSync(materialDir)) {
103
- return false;
104
- }
105
- return fs.readdirSync(materialDir, { withFileTypes: true }).some((entry) => entry.isFile() && /^keystore-solana(?:-.+)?\.v1\.enc$/i.test(entry.name));
106
- } catch {
107
- return false;
108
- }
109
- }
110
94
  async function ensureLocalSignerReadyAtGatewayStart(cfg) {
111
95
  const effectiveEnv = {
112
96
  ...process.env,
@@ -116,8 +100,8 @@ async function ensureLocalSignerReadyAtGatewayStart(cfg) {
116
100
  if (providerId !== "local-socket-signer") {
117
101
  return;
118
102
  }
119
- if (!hasConfiguredLocalSignerKeystoreMaterial(effectiveEnv)) {
120
- log.debug("local signer startup check skipped: no self-hosted signer keystore material found");
103
+ if (!readWalletProviderRegistry(effectiveEnv).wallets.some((wallet) => wallet.providerId === "local-socket-signer")) {
104
+ log.debug("local signer startup check skipped: no signer-owned wallet is registered");
121
105
  return;
122
106
  }
123
107
  const wallet = resolveWalletRuntimeConfig(cfg, effectiveEnv);
@@ -152,6 +136,14 @@ async function ensureLocalSignerReadyAtGatewayStart(cfg) {
152
136
  }
153
137
  }
154
138
  async function startGatewayServer(port = 18789, opts = {}) {
139
+ try {
140
+ return await startGatewayServerInternal(port, opts);
141
+ } catch (error) {
142
+ clearSecretsRuntimeSnapshot();
143
+ throw error;
144
+ }
145
+ }
146
+ async function startGatewayServerInternal(port, opts) {
155
147
  const minimalTestGateway = process.env.VITEST === "1" && process.env.FASED_TEST_MINIMAL_GATEWAY === "1";
156
148
  process.env.FASED_GATEWAY_PORT = String(port);
157
149
  logAcceptedEnvOption({
@@ -197,6 +189,19 @@ async function startGatewayServer(port = 18789, opts = {}) {
197
189
  log.warn(`gateway: failed to persist plugin auto-enable changes: ${String(err)}`);
198
190
  }
199
191
  }
192
+ configSnapshot = await startupTrace.measure("config.secrets-source", () => readConfigFileSnapshot());
193
+ if (configSnapshot.exists && !configSnapshot.valid) {
194
+ const issues = configSnapshot.issues.map((issue) => `${issue.path || "<root>"}: ${issue.message}`).join("\n");
195
+ throw new Error(`Invalid config at ${configSnapshot.path}.\n${issues || "Unknown validation issue."}\nRun "${formatCliCommand("fased doctor")}" to repair, then retry.`);
196
+ }
197
+ const secretsRuntime = createGatewaySecretsRuntimeController({
198
+ readConfigSnapshot: readConfigFileSnapshot,
199
+ log: logReload
200
+ });
201
+ const startupSecretsSnapshot = await startupTrace.measure("secrets.activate", () => secretsRuntime.activateStartup(configSnapshot)).catch((error) => {
202
+ const safe = sanitizeGatewaySecretsRuntimeError(error);
203
+ throw new Error(`Startup failed: required secrets are unavailable (${safe.code}). ${safe.message}`);
204
+ });
200
205
  const cfgAtStart = startupTrace.measureSync("config.load", () => loadConfig());
201
206
  const diagnosticsEnabled = isDiagnosticsEnabled(cfgAtStart);
202
207
  if (diagnosticsEnabled) {
@@ -534,6 +539,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
534
539
  const execApprovalForwarder = createExecApprovalForwarder();
535
540
  const execApprovalHandlers = createExecApprovalHandlers(execApprovalManager, { forwarder: execApprovalForwarder });
536
541
  Object.assign(extraGatewayHandlers, execApprovalHandlers);
542
+ Object.assign(extraGatewayHandlers, createSecretsHandlers({ reloadSecrets: secretsRuntime.reloadFromConfig }));
537
543
  const canvasHostServerPort = canvasHostServer?.port;
538
544
  startupTrace.measureSync("ws.attach", () => {
539
545
  attachGatewayWsHandlers({
@@ -653,7 +659,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
653
659
  }
654
660
  }
655
661
  const configReloader = minimalTestGateway ? { stop: async () => {} } : startupTrace.measureSync("config-reload.start", () => {
656
- const { applyHotReload, requestGatewayRestart } = createGatewayReloadHandlers({
662
+ const { cancelPendingGatewayRestart, createHotReloadTransaction, requestGatewayRestart } = createGatewayReloadHandlers({
657
663
  deps,
658
664
  broadcast,
659
665
  getState: () => ({
@@ -679,10 +685,29 @@ async function startGatewayServer(port = 18789, opts = {}) {
679
685
  logReload
680
686
  });
681
687
  return startGatewayConfigReloader({
682
- initialConfig: cfgAtStart,
688
+ initialConfig: startupSecretsSnapshot.sourceConfig,
683
689
  readSnapshot: readConfigFileSnapshot,
684
- onHotReload: applyHotReload,
685
- onRestart: requestGatewayRestart,
690
+ onSourceRevision: () => {
691
+ cancelPendingGatewayRestart();
692
+ },
693
+ onStop: () => {
694
+ cancelPendingGatewayRestart();
695
+ },
696
+ onHotReload: async (plan, _nextConfig, snapshot) => {
697
+ const transaction = createHotReloadTransaction(plan);
698
+ await secretsRuntime.activateHotReload(snapshot, {
699
+ apply: async (preparedConfig) => {
700
+ await transaction.apply(preparedConfig);
701
+ },
702
+ rollback: async (previousConfig) => {
703
+ await transaction.rollback(previousConfig);
704
+ }
705
+ });
706
+ },
707
+ onRestart: async (plan, nextConfig, snapshot) => {
708
+ await secretsRuntime.validateRestart(snapshot);
709
+ requestGatewayRestart(plan, nextConfig);
710
+ },
686
711
  log: {
687
712
  info: (msg) => logReload.info(msg),
688
713
  warn: (msg) => logReload.warn(msg),
@@ -722,22 +747,28 @@ async function startGatewayServer(port = 18789, opts = {}) {
722
747
  }]
723
748
  });
724
749
  return { close: async (opts) => {
725
- await runGlobalGatewayStopSafely({
726
- event: { reason: opts?.reason ?? "gateway stopping" },
727
- ctx: { port },
728
- onError: (err) => log.warn(`gateway_stop hook failed: ${String(err)}`)
729
- });
730
- if (diagnosticsEnabled) {
731
- stopDiagnosticHeartbeat();
732
- stopDiagnosticStabilityRecorder();
733
- }
734
- if (skillsRefreshTimer) {
735
- clearTimeout(skillsRefreshTimer);
736
- skillsRefreshTimer = null;
750
+ try {
751
+ await runGlobalGatewayStopSafely({
752
+ event: { reason: opts?.reason ?? "gateway stopping" },
753
+ ctx: { port },
754
+ onError: (err) => log.warn(`gateway_stop hook failed: ${String(err)}`)
755
+ });
756
+ await configReloader.stop().catch(() => {});
757
+ await secretsRuntime.shutdown();
758
+ if (diagnosticsEnabled) {
759
+ stopDiagnosticHeartbeat();
760
+ stopDiagnosticStabilityRecorder();
761
+ }
762
+ if (skillsRefreshTimer) {
763
+ clearTimeout(skillsRefreshTimer);
764
+ skillsRefreshTimer = null;
765
+ }
766
+ skillsChangeUnsub();
767
+ authRateLimiter?.dispose();
768
+ await close(opts);
769
+ } finally {
770
+ await secretsRuntime.shutdown();
737
771
  }
738
- skillsChangeUnsub();
739
- authRateLimiter?.dispose();
740
- await close(opts);
741
772
  } };
742
773
  }
743
774
 
@@ -1,6 +1,6 @@
1
1
  import { isSessionCompactionCheckpointArtifactName } from "../config/sessions/artifacts.js";
2
2
  import "../config/sessions.js";
3
- import fs from "node:fs";
3
+ import syncFs from "node:fs";
4
4
  import path from "node:path";
5
5
  import { randomUUID } from "node:crypto";
6
6
 
@@ -88,7 +88,7 @@ function deleteCheckpointSnapshotIfSafe(filePath, expectedDir) {
88
88
  return;
89
89
  }
90
90
  try {
91
- fs.unlinkSync(resolved);
91
+ syncFs.unlinkSync(resolved);
92
92
  } catch {}
93
93
  }
94
94
  function cleanupSessionCompactionSnapshot(reference) {
@@ -105,7 +105,7 @@ function captureSessionCompactionSnapshot(params) {
105
105
  const resolved = path.resolve(sessionFile);
106
106
  let stat;
107
107
  try {
108
- stat = fs.statSync(resolved);
108
+ stat = syncFs.statSync(resolved);
109
109
  } catch {
110
110
  return null;
111
111
  }
@@ -123,7 +123,7 @@ function captureSessionCompactionSnapshot(params) {
123
123
  const base = path.basename(resolved, ".jsonl");
124
124
  const snapshotFile = path.join(dir, `${base}.checkpoint.${randomUUID()}.jsonl`);
125
125
  try {
126
- fs.copyFileSync(resolved, snapshotFile);
126
+ syncFs.copyFileSync(resolved, snapshotFile);
127
127
  } catch {
128
128
  return null;
129
129
  }