@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
@@ -30,7 +30,7 @@ import { parseMessageWithAttachments } from "../chat-attachments.js";
30
30
  import { injectTimestamp, timestampOptsFromConfig } from "./agent-timestamp.js";
31
31
  import { normalizeRpcAttachmentsToChatAttachments } from "./attachment-normalize.js";
32
32
  import { appendInjectedAssistantMessageToTranscript } from "./chat-transcript-inject.js";
33
- import fs from "node:fs";
33
+ import syncFs from "node:fs";
34
34
  import path from "node:path";
35
35
 
36
36
  //#region src/gateway/server-methods/chat.ts
@@ -328,7 +328,7 @@ function resolveTranscriptPath(params) {
328
328
  }
329
329
  function transcriptHasIdempotencyKey(transcriptPath, idempotencyKey) {
330
330
  try {
331
- const lines = fs.readFileSync(transcriptPath, "utf-8").split(/\r?\n/);
331
+ const lines = syncFs.readFileSync(transcriptPath, "utf-8").split(/\r?\n/);
332
332
  for (const line of lines) {
333
333
  if (!line.trim()) {
334
334
  continue;
@@ -356,7 +356,7 @@ function appendAssistantTranscriptMessage(params) {
356
356
  error: "transcript path not resolved"
357
357
  };
358
358
  }
359
- if (!fs.existsSync(transcriptPath)) {
359
+ if (!syncFs.existsSync(transcriptPath)) {
360
360
  if (!params.createIfMissing) {
361
361
  return {
362
362
  ok: false,
@@ -1,6 +1,5 @@
1
1
  import { defaultRuntime } from "../../runtime.js";
2
2
  import { resolveAgentDir, resolveDefaultAgentId, resolveSessionAgentId } from "../../agents/agent-scope.js";
3
- import { listProviderBrandManifests } from "../../providers/registry.js";
4
3
  import { DEFAULT_PROVIDER } from "../../agents/defaults.js";
5
4
  import { normalizeSecretInput } from "../../utils/normalize-secret-input.js";
6
5
  import { normalizeProviderId } from "../../agents/provider-id.js";
@@ -11,6 +10,7 @@ import { loadConfig, writeConfigFile } from "../../config/io.js";
11
10
  import "../../config/config.js";
12
11
  import { resolveProfileUnusableUntilForDisplay } from "../../agents/auth-profiles/usage.js";
13
12
  import "../../agents/auth-profiles.js";
13
+ import { listProviderBrandManifests } from "../../providers/registry.js";
14
14
  import { ensureFasedModelsJson } from "../../agents/models-config.js";
15
15
  import { deriveModelMetadata } from "../../agents/model-metadata.js";
16
16
  import { ErrorCodes, errorShape } from "../protocol/schema/error-codes.js";
@@ -0,0 +1,40 @@
1
+ import { logMutatingAdminRpcAudit } from "./mutating-admin-rpc-audit.js";
2
+ import { ErrorCodes, errorShape } from "../protocol/schema/error-codes.js";
3
+ import "../protocol/index.js";
4
+ import { sanitizeGatewaySecretsRuntimeError } from "../server-secrets-runtime.js";
5
+
6
+ //#region src/gateway/server-methods/secrets.ts
7
+ function createSecretsHandlers(params) {
8
+ return { "secrets.reload": async ({ respond, client, context }) => {
9
+ try {
10
+ const result = await params.reloadSecrets();
11
+ logMutatingAdminRpcAudit({
12
+ context,
13
+ client,
14
+ method: "secrets.reload",
15
+ outcome: "succeeded",
16
+ details: { warningCount: result.warningCount }
17
+ });
18
+ respond(true, {
19
+ ok: true,
20
+ warningCount: result.warningCount
21
+ });
22
+ } catch (err) {
23
+ const safe = sanitizeGatewaySecretsRuntimeError(err);
24
+ logMutatingAdminRpcAudit({
25
+ context,
26
+ client,
27
+ method: "secrets.reload",
28
+ outcome: "failed",
29
+ details: { code: safe.code }
30
+ });
31
+ respond(false, undefined, errorShape(ErrorCodes.UNAVAILABLE, safe.message, {
32
+ retryable: true,
33
+ details: { code: safe.code }
34
+ }));
35
+ }
36
+ } };
37
+ }
38
+
39
+ //#endregion
40
+ export { createSecretsHandlers };
@@ -30,7 +30,7 @@ import { clearCheckpointBranchIsolationFields } from "../session-compaction-isol
30
30
  import { applySessionsPatchToStore } from "../sessions-patch.js";
31
31
  import { resolveSessionKeyFromResolveParams } from "../sessions-resolve.js";
32
32
  import { assertValidParams } from "./validation.js";
33
- import fs from "node:fs";
33
+ import syncFs from "node:fs";
34
34
  import path from "node:path";
35
35
  import { randomUUID } from "node:crypto";
36
36
  import { SessionManager } from "@mariozechner/pi-coding-agent";
@@ -196,7 +196,7 @@ function resolveCheckpointSnapshotFile(params) {
196
196
  return null;
197
197
  }
198
198
  try {
199
- if (!fs.statSync(filePath).isFile()) {
199
+ if (!syncFs.statSync(filePath).isFile()) {
200
200
  return null;
201
201
  }
202
202
  } catch {
@@ -543,7 +543,7 @@ const sessionsHandlers = {
543
543
  }
544
544
  const cleanupRestoredFile = () => {
545
545
  try {
546
- fs.rmSync(sessionFile, { force: true });
546
+ syncFs.rmSync(sessionFile, { force: true });
547
547
  } catch {}
548
548
  };
549
549
  const cleanupError = await ensureSessionRuntimeCleanup({
@@ -1068,7 +1068,7 @@ const sessionsHandlers = {
1068
1068
  }, undefined);
1069
1069
  return;
1070
1070
  }
1071
- const filePath = resolveSessionTranscriptCandidates(sessionId, storePath, entry?.sessionFile, target.agentId).find((candidate) => fs.existsSync(candidate));
1071
+ const filePath = resolveSessionTranscriptCandidates(sessionId, storePath, entry?.sessionFile, target.agentId).find((candidate) => syncFs.existsSync(candidate));
1072
1072
  if (!filePath) {
1073
1073
  respond(true, {
1074
1074
  ok: true,
@@ -1078,7 +1078,7 @@ const sessionsHandlers = {
1078
1078
  }, undefined);
1079
1079
  return;
1080
1080
  }
1081
- const raw = fs.readFileSync(filePath, "utf-8");
1081
+ const raw = syncFs.readFileSync(filePath, "utf-8");
1082
1082
  const lines = raw.split(/\r?\n/).filter((l) => l.trim().length > 0);
1083
1083
  if (lines.length <= maxLines) {
1084
1084
  respond(true, {
@@ -1096,7 +1096,7 @@ const sessionsHandlers = {
1096
1096
  const archived = archiveFileOnDisk(filePath, "bak");
1097
1097
  const keptLines = lines.slice(-maxLines);
1098
1098
  try {
1099
- fs.writeFileSync(filePath, `${keptLines.join("\n")}\n`, "utf-8");
1099
+ syncFs.writeFileSync(filePath, `${keptLines.join("\n")}\n`, "utf-8");
1100
1100
  } catch (error) {
1101
1101
  if (preCompactionSnapshot) {
1102
1102
  cleanupSessionCompactionSnapshot(preCompactionSnapshot);
@@ -12,7 +12,7 @@ import { readCronRunLogEntriesPageAll } from "../../cron/run-log.js";
12
12
  import { loadCronStore, resolveCronStorePath } from "../../cron/store.js";
13
13
  import { discoverAllSessions, loadCostUsageSummary, loadSessionCostSummary, loadSessionUsageTimeSeries } from "../../infra/session-cost-usage.js";
14
14
  import { buildUsageAggregateTail } from "../../shared/usage-aggregates.js";
15
- import fs from "node:fs";
15
+ import syncFs from "node:fs";
16
16
 
17
17
  //#region src/gateway/server-methods/usage.ts
18
18
  const COST_USAGE_CACHE_TTL_MS = 3e4;
@@ -662,7 +662,7 @@ const usageHandlers = {
662
662
  return;
663
663
  }
664
664
  try {
665
- const stats = fs.statSync(sessionFile);
665
+ const stats = syncFs.statSync(sessionFile);
666
666
  if (stats.isFile()) {
667
667
  mergedEntries.push({
668
668
  key: resolvedStoreKey,
@@ -55,10 +55,9 @@ const CONTROL_PLANE_WRITE_METHODS = new Set([
55
55
  ]);
56
56
  const SAT_MINING_MUTATION_METHODS = new Set([
57
57
  "sat.openCycle",
58
- "sat.bootstrapRegistryReserve",
58
+ "sat.topUpRegistryReserve",
59
59
  "sat.refillRegistryReserveFromTreasury",
60
60
  "sat.runProtocolMaintenanceOnce",
61
- "sat.setProtocolRecipients",
62
61
  "sat.claimProtocolTreasury",
63
62
  "sat.claimProtocolDistributorSat",
64
63
  "sat.initMinerCapital",
@@ -19,76 +19,201 @@ function shouldInvalidateGatewayModelCatalog(changedPaths) {
19
19
  return changedPaths.some((path) => path === "models" || path.startsWith("models.") || path === "agents.defaults.model" || path.startsWith("agents.defaults.model.") || path === "agents.defaults.models" || path.startsWith("agents.defaults.models."));
20
20
  }
21
21
  function createGatewayReloadHandlers(params) {
22
- const applyHotReload = async (plan, nextConfig) => {
23
- setGatewaySigusr1RestartPolicy({ allowExternal: isRestartEnabled(nextConfig) });
24
- const state = params.getState();
25
- const nextState = { ...state };
26
- if (plan.reloadHooks) {
27
- try {
28
- nextState.hooksConfig = resolveHooksConfig(nextConfig);
29
- } catch (err) {
30
- params.logHooks.warn(`hooks config reload failed: ${String(err)}`);
31
- }
32
- }
33
- if (plan.restartHeartbeat) {
34
- nextState.heartbeatRunner.updateConfig(nextConfig);
35
- }
36
- resetDirectoryCache();
37
- if (shouldInvalidateGatewayModelCatalog(plan.changedPaths)) {
38
- markGatewayModelCatalogStaleForReload();
39
- }
40
- if (plan.restartCron) {
41
- state.cronState.cron.stop();
42
- nextState.cronState = buildGatewayCronService({
43
- cfg: nextConfig,
44
- deps: params.deps,
45
- broadcast: params.broadcast
22
+ const createHotReloadTransaction = (plan) => {
23
+ const originalState = params.getState();
24
+ let workingState = { ...originalState };
25
+ let policyMutated = false;
26
+ let heartbeatMutated = false;
27
+ let cronMutated = false;
28
+ let browserMutated = false;
29
+ let gmailMutated = false;
30
+ let concurrencyMutated = false;
31
+ const channelsMutated = [];
32
+ let applyStarted = false;
33
+ let rollbackStarted = false;
34
+ const publishState = () => {
35
+ params.setState({ ...workingState });
36
+ };
37
+ const startGmailWatcherForReload = async (config, phase) => {
38
+ let failed = false;
39
+ await startGmailWatcherWithLogs({
40
+ cfg: config,
41
+ log: {
42
+ info: (message) => params.logHooks.info(message),
43
+ warn: () => params.logHooks.warn(`gmail watcher ${phase} did not start`),
44
+ error: () => {
45
+ failed = true;
46
+ params.logHooks.error(`gmail watcher ${phase} failed to start`);
47
+ }
48
+ },
49
+ onSkipped: () => params.logHooks.info(`skipping gmail watcher ${phase} (FASED_SKIP_GMAIL_WATCHER=1)`)
46
50
  });
47
- void nextState.cronState.cron.start().catch((err) => params.logCron.error(`failed to start: ${String(err)}`));
48
- }
49
- if (plan.restartBrowserControl) {
50
- if (state.browserControl) {
51
- await state.browserControl.stop().catch(() => {});
51
+ if (failed) {
52
+ throw new Error(`gmail watcher ${phase} failed`);
52
53
  }
53
- try {
54
- nextState.browserControl = await startBrowserControlServerIfEnabled();
55
- } catch (err) {
56
- params.logBrowser.error(`server failed to start: ${String(err)}`);
54
+ };
55
+ const apply = async (nextConfig) => {
56
+ if (applyStarted) {
57
+ throw new Error("hot reload transaction already started");
57
58
  }
58
- }
59
- if (plan.restartGmailWatcher) {
60
- await stopGmailWatcher().catch(() => {});
61
- await startGmailWatcherWithLogs({
62
- cfg: nextConfig,
63
- log: params.logHooks,
64
- onSkipped: () => params.logHooks.info("skipping gmail watcher restart (FASED_SKIP_GMAIL_WATCHER=1)")
65
- });
66
- }
67
- if (plan.restartChannels.size > 0) {
68
- if (isTruthyEnvValue(process.env.FASED_SKIP_CHANNELS) || isTruthyEnvValue(process.env.FASED_SKIP_PROVIDERS)) {
69
- params.logChannels.info("skipping channel reload (FASED_SKIP_CHANNELS=1 or FASED_SKIP_PROVIDERS=1)");
70
- } else {
71
- const restartChannel = async (name) => {
72
- params.logChannels.info(`restarting ${name} channel`);
73
- await params.stopChannel(name);
74
- await params.startChannel(name);
75
- };
76
- for (const channel of plan.restartChannels) {
77
- await restartChannel(channel);
59
+ applyStarted = true;
60
+ policyMutated = true;
61
+ setGatewaySigusr1RestartPolicy({ allowExternal: isRestartEnabled(nextConfig) });
62
+ if (plan.reloadHooks) {
63
+ workingState.hooksConfig = resolveHooksConfig(nextConfig);
64
+ }
65
+ if (plan.restartHeartbeat) {
66
+ heartbeatMutated = true;
67
+ workingState.heartbeatRunner.updateConfig(nextConfig);
68
+ }
69
+ resetDirectoryCache();
70
+ if (shouldInvalidateGatewayModelCatalog(plan.changedPaths)) {
71
+ markGatewayModelCatalogStaleForReload();
72
+ }
73
+ if (plan.restartCron) {
74
+ cronMutated = true;
75
+ workingState.cronState.cron.stop();
76
+ workingState.cronState = buildGatewayCronService({
77
+ cfg: nextConfig,
78
+ deps: params.deps,
79
+ broadcast: params.broadcast
80
+ });
81
+ publishState();
82
+ await workingState.cronState.cron.start();
83
+ }
84
+ if (plan.restartBrowserControl) {
85
+ browserMutated = true;
86
+ try {
87
+ await workingState.browserControl?.stop();
88
+ } finally {
89
+ workingState.browserControl = null;
90
+ publishState();
78
91
  }
92
+ workingState.browserControl = await startBrowserControlServerIfEnabled();
93
+ publishState();
79
94
  }
80
- }
81
- setCommandLaneConcurrency(CommandLane.Cron, nextConfig.cron?.maxConcurrentRuns ?? 1);
82
- setCommandLaneConcurrency(CommandLane.Main, resolveAgentMaxConcurrent(nextConfig));
83
- setCommandLaneConcurrency(CommandLane.Subagent, resolveSubagentMaxConcurrent(nextConfig));
84
- if (plan.hotReasons.length > 0) {
85
- params.logReload.info(`config hot reload applied (${plan.hotReasons.join(", ")})`);
86
- } else if (plan.noopPaths.length > 0) {
87
- params.logReload.info(`config change applied (dynamic reads: ${plan.noopPaths.join(", ")})`);
88
- }
89
- params.setState(nextState);
95
+ if (plan.restartGmailWatcher) {
96
+ gmailMutated = true;
97
+ await stopGmailWatcher();
98
+ await startGmailWatcherForReload(nextConfig, "apply");
99
+ }
100
+ if (plan.restartChannels.size > 0) {
101
+ if (isTruthyEnvValue(process.env.FASED_SKIP_CHANNELS) || isTruthyEnvValue(process.env.FASED_SKIP_PROVIDERS)) {
102
+ params.logChannels.info("skipping channel reload (FASED_SKIP_CHANNELS=1 or FASED_SKIP_PROVIDERS=1)");
103
+ } else {
104
+ for (const channel of plan.restartChannels) {
105
+ channelsMutated.push(channel);
106
+ params.logChannels.info(`restarting ${channel} channel`);
107
+ await params.stopChannel(channel);
108
+ await params.startChannel(channel);
109
+ }
110
+ }
111
+ }
112
+ concurrencyMutated = true;
113
+ setCommandLaneConcurrency(CommandLane.Cron, nextConfig.cron?.maxConcurrentRuns ?? 1);
114
+ setCommandLaneConcurrency(CommandLane.Main, resolveAgentMaxConcurrent(nextConfig));
115
+ setCommandLaneConcurrency(CommandLane.Subagent, resolveSubagentMaxConcurrent(nextConfig));
116
+ if (plan.hotReasons.length > 0) {
117
+ params.logReload.info(`config hot reload applied (${plan.hotReasons.join(", ")})`);
118
+ } else if (plan.noopPaths.length > 0) {
119
+ params.logReload.info(`config change applied (dynamic reads: ${plan.noopPaths.join(", ")})`);
120
+ }
121
+ publishState();
122
+ };
123
+ const rollback = async (previousConfig) => {
124
+ if (!applyStarted || rollbackStarted) {
125
+ return;
126
+ }
127
+ rollbackStarted = true;
128
+ const failures = [];
129
+ const capture = async (operation) => {
130
+ try {
131
+ await operation();
132
+ return true;
133
+ } catch (error) {
134
+ failures.push(error);
135
+ return false;
136
+ }
137
+ };
138
+ if (concurrencyMutated) {
139
+ await capture(() => {
140
+ setCommandLaneConcurrency(CommandLane.Cron, previousConfig.cron?.maxConcurrentRuns ?? 1);
141
+ setCommandLaneConcurrency(CommandLane.Main, resolveAgentMaxConcurrent(previousConfig));
142
+ setCommandLaneConcurrency(CommandLane.Subagent, resolveSubagentMaxConcurrent(previousConfig));
143
+ });
144
+ }
145
+ for (const channel of channelsMutated.toReversed()) {
146
+ const stopped = await capture(async () => await params.stopChannel(channel));
147
+ if (stopped) {
148
+ await capture(async () => await params.startChannel(channel));
149
+ }
150
+ }
151
+ if (gmailMutated) {
152
+ const stopped = await capture(async () => await stopGmailWatcher());
153
+ if (stopped) {
154
+ await capture(async () => await startGmailWatcherForReload(previousConfig, "rollback"));
155
+ }
156
+ }
157
+ if (browserMutated) {
158
+ const candidateBrowser = workingState.browserControl;
159
+ const candidateStopped = await capture(async () => await candidateBrowser?.stop());
160
+ workingState.browserControl = null;
161
+ publishState();
162
+ if (candidateStopped) {
163
+ let restoredBrowser = null;
164
+ const restored = await capture(async () => {
165
+ restoredBrowser = await startBrowserControlServerIfEnabled();
166
+ });
167
+ if (restored) {
168
+ workingState.browserControl = restoredBrowser;
169
+ publishState();
170
+ }
171
+ }
172
+ }
173
+ if (cronMutated) {
174
+ await capture(() => workingState.cronState.cron.stop());
175
+ workingState.cronState = originalState.cronState;
176
+ publishState();
177
+ await capture(async () => await originalState.cronState.cron.start());
178
+ }
179
+ if (heartbeatMutated) {
180
+ const restored = await capture(() => workingState.heartbeatRunner.updateConfig(previousConfig));
181
+ if (!restored) {
182
+ await capture(() => workingState.heartbeatRunner.stop());
183
+ }
184
+ }
185
+ workingState.hooksConfig = originalState.hooksConfig;
186
+ if (policyMutated) {
187
+ await capture(() => setGatewaySigusr1RestartPolicy({ allowExternal: isRestartEnabled(previousConfig) }));
188
+ }
189
+ resetDirectoryCache();
190
+ if (shouldInvalidateGatewayModelCatalog(plan.changedPaths)) {
191
+ markGatewayModelCatalogStaleForReload();
192
+ }
193
+ publishState();
194
+ if (failures.length > 0) {
195
+ throw new Error(`hot reload rollback incomplete (${failures.length} component failure(s))`);
196
+ }
197
+ };
198
+ return {
199
+ apply,
200
+ rollback
201
+ };
202
+ };
203
+ const applyHotReload = async (plan, nextConfig) => {
204
+ await createHotReloadTransaction(plan).apply(nextConfig);
90
205
  };
91
206
  let restartPending = false;
207
+ let restartDeferral = null;
208
+ const cancelPendingGatewayRestart = () => {
209
+ const cancelled = restartDeferral?.cancel() ?? false;
210
+ restartDeferral = null;
211
+ restartPending = false;
212
+ if (cancelled) {
213
+ params.logReload.info("cancelled deferred config restart before evaluating the latest revision");
214
+ }
215
+ return cancelled;
216
+ };
92
217
  const requestGatewayRestart = (plan, nextConfig) => {
93
218
  setGatewaySigusr1RestartPolicy({ allowExternal: isRestartEnabled(nextConfig) });
94
219
  const reasons = plan.restartReasons.length ? plan.restartReasons.join(", ") : plan.changedPaths.join(", ");
@@ -123,30 +248,33 @@ function createGatewayReloadHandlers(params) {
123
248
  const active = getActiveCounts();
124
249
  if (active.totalActive > 0) {
125
250
  if (restartPending) {
126
- params.logReload.info(`config change requires gateway restart (${reasons}) — already waiting for operations to complete`);
127
- return;
251
+ cancelPendingGatewayRestart();
128
252
  }
129
253
  restartPending = true;
130
254
  const initialDetails = formatActiveDetails(active);
131
255
  params.logReload.warn(`config change requires gateway restart (${reasons}) — deferring until ${initialDetails.join(", ")} complete`);
132
- deferGatewayRestartUntilIdle({
256
+ const deferral = deferGatewayRestartUntilIdle({
133
257
  getPendingCount: () => getActiveCounts().totalActive,
134
258
  hooks: {
135
259
  onReady: () => {
136
260
  restartPending = false;
261
+ restartDeferral = null;
137
262
  params.logReload.info("all operations and replies completed; restarting gateway now");
138
263
  },
139
264
  onTimeout: (_pending, elapsedMs) => {
140
265
  const remaining = formatActiveDetails(getActiveCounts());
141
266
  restartPending = false;
267
+ restartDeferral = null;
142
268
  params.logReload.warn(`restart timeout after ${elapsedMs}ms with ${remaining.join(", ")} still active; restarting anyway`);
143
269
  },
144
270
  onCheckError: (err) => {
145
271
  restartPending = false;
272
+ restartDeferral = null;
146
273
  params.logReload.warn(`restart deferral check failed (${String(err)}); restarting gateway now`);
147
274
  }
148
275
  }
149
276
  });
277
+ restartDeferral = deferral.isPending() ? deferral : null;
150
278
  } else {
151
279
  params.logReload.warn(`config change requires gateway restart (${reasons})`);
152
280
  const emitted = emitGatewayRestart();
@@ -157,6 +285,8 @@ function createGatewayReloadHandlers(params) {
157
285
  };
158
286
  return {
159
287
  applyHotReload,
288
+ cancelPendingGatewayRestart,
289
+ createHotReloadTransaction,
160
290
  requestGatewayRestart
161
291
  };
162
292
  }
@@ -1,7 +1,7 @@
1
1
  import { isLoopbackHost, isTrustedProxyAddress, isValidIPv4, resolveGatewayBindHost } from "./net.js";
2
2
  import { resolveWalletRuntimeConfig } from "../wallet/wallet-runtime-config.js";
3
- import { resolveWalletApprovalAuthMode } from "../wallet/wallet-approval-auth.js";
4
3
  import { normalizeControlUiBasePath } from "./control-ui-shared.js";
4
+ import { resolveWalletApprovalAuthMode } from "../wallet/wallet-approval-auth.js";
5
5
  import { resolveHooksConfig } from "./hooks.js";
6
6
  import { assertGatewayAuthConfigured, resolveGatewayAuth } from "./auth.js";
7
7