@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
@@ -1,4 +1,5 @@
1
1
  import { loadConfig } from "../../../config/io.js";
2
+ import { fetchWithSsrFGuard } from "../../../infra/net/fetch-guard.js";
2
3
  import { redactSensitiveUrlLikeString } from "../../../shared/net/redact-sensitive-url.js";
3
4
  import { readWalletProviderRegistry } from "../../../wallet/wallet-provider-registry.js";
4
5
  import { resolveSatBondProgramIdFromEnv, resolveSatMintAddressFromEnv, resolveSatProgramIdFromEnv } from "../../../config/sat-runtime-ids.js";
@@ -6,6 +7,7 @@ import { loadWalletProviderSecret } from "../../../wallet/wallet-secrets-store.j
6
7
  import { resolveWalletProviderId } from "../../../wallet/wallet-provider-resolver.js";
7
8
  import "../../../plugin-sdk/index.js";
8
9
  import "../../../plugin-sdk/sat-runtime.js";
10
+ import { SAT_PROTOCOL_CONSTANTS, resolveSatGenesisProfileContract } from "./protocol-contract.js";
9
11
  import { loadSatBondLayout, loadSatBondPolicyLayout, loadSatBondStakingDistributorLayout, loadSatBondStakingPositionLayout } from "./sat-bond-layout.js";
10
12
  import { createRequire } from "node:module";
11
13
  import { createHash } from "node:crypto";
@@ -311,15 +313,19 @@ function decodeSatGlobalState(data, address) {
311
313
  }
312
314
  function decodeSatCycle(data, address) {
313
315
  const body = expectAccountData(data, ACCOUNT_DISCRIMINATOR.satCycleState, "SAT cycle state");
316
+ const validMinerCount = readU64String(body, 192);
317
+ const cycleSeed = readHash32(body, 40);
314
318
  return {
315
319
  address,
316
320
  cycleId: readU64Number(body, 0),
317
321
  openTs: readI64Number(body, 8),
318
322
  closeTs: readI64Number(body, 16),
319
323
  status: body.readUInt8(24),
324
+ cycleSeed,
325
+ entropyUnavailable: cycleSeed === SAT_PROTOCOL_CONSTANTS.entropyUnavailableSeedHex,
320
326
  unlockTargetLamports: readU64String(body, 176),
321
327
  totalCommittedLamports: readU64String(body, 184),
322
- validMinerCount: readU64String(body, 192),
328
+ validMinerCount,
323
329
  unlockRatioFp: readU64String(body, 200),
324
330
  issuedCycleMinerSatRaw: readU64String(body, 208),
325
331
  unissuedCycleMinerSatRaw: readU64String(body, 216),
@@ -328,7 +334,22 @@ function decodeSatCycle(data, address) {
328
334
  performanceRebatePoolLamports: readU64String(body, 240),
329
335
  treasurySolLamports: readU64String(body, 248),
330
336
  submittedSolErosionPoolLamports: readU64String(body, 256),
331
- keeperBountyPaidLamports: readU64String(body, 264)
337
+ keeperBountyPaidLamports: readU64String(body, 264),
338
+ commitDeadlineTs: readI64Number(body, 272),
339
+ revealDeadlineTs: readI64Number(body, 280),
340
+ entropyTargetSlot: readU64Number(body, 288),
341
+ committedMinerCount: readU64String(body, 296),
342
+ revealedMinerCount: validMinerCount,
343
+ resolvedCommitCount: readU64String(body, 304),
344
+ entropySealedSlot: readU64Number(body, 312),
345
+ ...body.length >= 368 ? {
346
+ openSlot: readU64Number(body, 320),
347
+ commitDeadlineSlot: readU64Number(body, 328),
348
+ revealDeadlineSlot: readU64Number(body, 336),
349
+ entropyHashCount: readU64Number(body, 344),
350
+ unlockIntervalStartCycleId: readU64Number(body, 352),
351
+ releasedCommitCount: readU64String(body, 360)
352
+ } : {}
332
353
  };
333
354
  }
334
355
  function decodeSatMinerCycle(data, address) {
@@ -351,7 +372,13 @@ function decodeSatMinerCycle(data, address) {
351
372
  claimedDetRebateLamports: readU64String(body, 160),
352
373
  claimedPerfRebateLamports: readU64String(body, 168),
353
374
  validParticipation: body.readUInt8(176) === 1,
354
- capitalLockReleased: body.readUInt8(177) === 1
375
+ capitalLockReleased: body.readUInt8(177) === 1,
376
+ ...body.length >= 336 ? {
377
+ commitment: readHash32(body, 184),
378
+ commitSlot: readU64Number(body, 216),
379
+ revealSlot: readU64Number(body, 224)
380
+ } : {},
381
+ ...body.length >= 344 ? { lockedCollateralLamports: readU64String(body, 232) } : {}
355
382
  };
356
383
  }
357
384
  function decodeSatMinerCapital(data, address) {
@@ -476,6 +503,8 @@ function decodeSatBondStakingDistributor(data, address) {
476
503
  totalActiveStakeRaw: readU64String(body, layout.offsets.totalActiveStakeRaw),
477
504
  rewardIndexFp: readU128String(body, layout.offsets.rewardIndexFp),
478
505
  observedRewardVaultRaw: readU64String(body, layout.offsets.observedRewardVaultRaw),
506
+ unallocatedRewardRaw: readU64String(body, layout.offsets.unallocatedRewardRaw),
507
+ fractionalRemainderFp: readU64String(body, layout.offsets.fractionalRemainderFp),
479
508
  lastSyncedSlot: readU64Number(body, layout.offsets.lastSyncedSlot),
480
509
  mintMatchesRuntime: rewardMint === SAT_MINT_ADDRESS(),
481
510
  vaultMatchesExpected: rewardVault === expectedRewardVault
@@ -497,6 +526,7 @@ function decodeSatBondStakingPosition(data, address) {
497
526
  activeStakeRaw: readU64String(body, layout.offsets.activeStakeRaw),
498
527
  claimableRewardRaw: readU64String(body, layout.offsets.claimableRewardRaw),
499
528
  rewardDebtFp: readU128String(body, layout.offsets.rewardDebtFp),
529
+ fractionalRemainderFp: readU64String(body, layout.offsets.fractionalRemainderFp),
500
530
  lastSyncedSlot: readU64Number(body, layout.offsets.lastSyncedSlot)
501
531
  };
502
532
  }
@@ -723,6 +753,7 @@ const satReadRpcRuntimeState = {
723
753
  lastRpcUrl: null,
724
754
  quotaLikely: false
725
755
  };
756
+ const satReadRpcEndpointStates = new Map();
726
757
  function readPositiveIntEnv(name, fallback) {
727
758
  const value = Number.parseInt(String(process.env[name] ?? ""), 10);
728
759
  return Number.isFinite(value) && value > 0 ? value : fallback;
@@ -736,6 +767,13 @@ const SAT_RPC_RENT_EXEMPTION_CACHE_TTL_MS = 5 * 6e4;
736
767
  const SAT_RPC_METHOD_METRIC_BUCKET_MS = 60 * 6e4;
737
768
  const SAT_RPC_METHOD_METRIC_RETENTION_MS = 24 * 60 * 6e4;
738
769
  const SAT_RPC_QUOTA_BACKOFF_MS = 3e4;
770
+ const SAT_RPC_FAILURE_BACKOFF_THRESHOLD = 2;
771
+ const SAT_RPC_FAILURE_BACKOFF_BASE_MS = 5e3;
772
+ const SAT_RPC_FAILURE_BACKOFF_MAX_MS = 3e4;
773
+ const SAT_RPC_MAX_RESPONSE_BYTES = 16 * 1024 * 1024;
774
+ function satRpcRequestTimeoutMs() {
775
+ return readPositiveIntEnv("FASED_SAT_RPC_REQUEST_TIMEOUT_MS", 1e4);
776
+ }
739
777
  const satRpcReadCache = new Map();
740
778
  const satRpcReadInFlight = new Map();
741
779
  const satRpcMethodMetrics = new Map();
@@ -894,36 +932,75 @@ function looksLikeRpcQuotaFailure(value) {
894
932
  }
895
933
  return message.includes("429") || message.includes("rate limit") || message.includes("too many requests") || message.includes("quota") || message.includes("credit") || message.includes("credits exhausted") || message.includes("resource exhausted");
896
934
  }
897
- function currentReadRpcQuotaBackoffMs(nowMs = Date.now()) {
898
- if (!satReadRpcRuntimeState.quotaLikely || !satReadRpcRuntimeState.lastFailureAt) {
899
- return 0;
935
+ function getOrCreateReadRpcEndpointState(rpcUrl) {
936
+ const key = normalizeRpcUrlForComparison(rpcUrl);
937
+ const existing = satReadRpcEndpointStates.get(key);
938
+ if (existing) {
939
+ return existing;
900
940
  }
901
- const failedAtMs = Date.parse(satReadRpcRuntimeState.lastFailureAt);
902
- if (!Number.isFinite(failedAtMs)) {
941
+ const created = {
942
+ consecutiveFailures: 0,
943
+ backoffUntilMs: 0,
944
+ quotaLikely: false,
945
+ lastError: null,
946
+ lastFailureAt: null,
947
+ lastSuccessAt: null
948
+ };
949
+ satReadRpcEndpointStates.set(key, created);
950
+ return created;
951
+ }
952
+ function currentReadRpcBackoffMs(rpcUrl, nowMs = Date.now()) {
953
+ const state = satReadRpcEndpointStates.get(normalizeRpcUrlForComparison(rpcUrl));
954
+ if (!state) {
903
955
  return 0;
904
956
  }
905
- const remainingMs = SAT_RPC_QUOTA_BACKOFF_MS - (nowMs - failedAtMs);
906
- return remainingMs > 0 ? remainingMs : 0;
957
+ return Math.max(0, state.backoffUntilMs - nowMs);
958
+ }
959
+ function makeReadRpcBackoffError(method, remainingMs) {
960
+ return new Error(`rpc ${method} skipped during endpoint circuit backoff; retry in ${Math.ceil(remainingMs / 1e3)}s`);
907
961
  }
908
- function makeReadRpcQuotaBackoffError(method, remainingMs) {
909
- return new Error(`rpc ${method} skipped during provider quota backoff; retry in ${Math.ceil(remainingMs / 1e3)}s`);
962
+ function markReadRpcEndpointSuccess(rpcUrl) {
963
+ const state = getOrCreateReadRpcEndpointState(rpcUrl);
964
+ state.consecutiveFailures = 0;
965
+ state.backoffUntilMs = 0;
966
+ state.quotaLikely = false;
967
+ state.lastError = null;
968
+ state.lastSuccessAt = new Date().toISOString();
969
+ }
970
+ function markReadRpcEndpointFailure(rpcUrl, error) {
971
+ const state = getOrCreateReadRpcEndpointState(rpcUrl);
972
+ const message = error instanceof Error ? error.message : String(error);
973
+ const quotaLikely = looksLikeRpcQuotaFailure(message);
974
+ state.consecutiveFailures += 1;
975
+ state.quotaLikely = quotaLikely;
976
+ state.lastError = message;
977
+ state.lastFailureAt = new Date().toISOString();
978
+ if (quotaLikely) {
979
+ state.backoffUntilMs = Date.now() + SAT_RPC_QUOTA_BACKOFF_MS;
980
+ } else if (state.consecutiveFailures >= SAT_RPC_FAILURE_BACKOFF_THRESHOLD) {
981
+ const exponent = state.consecutiveFailures - SAT_RPC_FAILURE_BACKOFF_THRESHOLD;
982
+ state.backoffUntilMs = Date.now() + Math.min(SAT_RPC_FAILURE_BACKOFF_MAX_MS, SAT_RPC_FAILURE_BACKOFF_BASE_MS * 2 ** exponent);
983
+ }
910
984
  }
911
985
  function markReadRpcSuccess(mode, rpcUrl) {
986
+ markReadRpcEndpointSuccess(rpcUrl);
912
987
  satReadRpcRuntimeState.lastMode = mode;
913
988
  satReadRpcRuntimeState.lastRpcUrl = rpcUrl;
914
- satReadRpcRuntimeState.lastError = null;
915
989
  satReadRpcRuntimeState.lastSuccessAt = new Date().toISOString();
916
- satReadRpcRuntimeState.quotaLikely = false;
917
- if (mode === "fallback") {
990
+ if (mode === "primary") {
991
+ satReadRpcRuntimeState.lastError = null;
992
+ satReadRpcRuntimeState.quotaLikely = false;
993
+ } else {
918
994
  satReadRpcRuntimeState.fallbackCount += 1;
919
995
  }
920
996
  }
921
- function markReadRpcFailure(error) {
997
+ function markReadRpcFailure(error, rpcUrl) {
922
998
  const message = error instanceof Error ? error.message : String(error);
999
+ markReadRpcEndpointFailure(rpcUrl, error);
923
1000
  satReadRpcRuntimeState.lastMode = "unavailable";
924
1001
  satReadRpcRuntimeState.lastError = message;
925
1002
  satReadRpcRuntimeState.lastFailureAt = new Date().toISOString();
926
- satReadRpcRuntimeState.quotaLikely = looksLikeRpcQuotaFailure(message);
1003
+ satReadRpcRuntimeState.quotaLikely = satReadRpcRuntimeState.quotaLikely || looksLikeRpcQuotaFailure(message);
927
1004
  }
928
1005
  function firstNonEmpty(...values) {
929
1006
  for (const value of values) {
@@ -1044,9 +1121,9 @@ function resolveReadRpcConfig(cfg, env) {
1044
1121
  const walletId = typeof satMiningConfig.walletId === "string" ? String(satMiningConfig.walletId).trim() : undefined;
1045
1122
  const registryProviderId = walletId ? readWalletProviderRegistry(env).wallets.find((wallet) => wallet.id === walletId)?.providerId : undefined;
1046
1123
  const providerId = registryProviderId || resolveWalletProviderId(cfg, env);
1047
- const walletReadRpcUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_READ_RPC_URL", walletId) || walletEnvValue(env, "FASED_WALLET_EMBEDDED_KEYSTORE_READ_RPC_URL", walletId);
1048
- const walletRpcUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_RPC_URL", walletId) || walletEnvValue(env, "FASED_WALLET_EMBEDDED_KEYSTORE_RPC_URL", walletId);
1049
- const walletReadRpcFallbackUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_READ_RPC_FALLBACK_URL", walletId) || walletEnvValue(env, "FASED_WALLET_SOLANA_RPC_FALLBACK_URL", walletId) || walletEnvValue(env, "FASED_WALLET_EMBEDDED_KEYSTORE_READ_RPC_FALLBACK_URL", walletId) || walletEnvValue(env, "FASED_WALLET_EMBEDDED_KEYSTORE_RPC_FALLBACK_URL", walletId);
1124
+ const walletReadRpcUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_READ_RPC_URL", walletId);
1125
+ const walletRpcUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_RPC_URL", walletId);
1126
+ const walletReadRpcFallbackUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_READ_RPC_FALLBACK_URL", walletId) || walletEnvValue(env, "FASED_WALLET_SOLANA_RPC_FALLBACK_URL", walletId);
1050
1127
  if (providerId === "local-socket-signer") {
1051
1128
  const primaryUrl = firstNonEmpty(walletReadRpcUrl, walletRpcUrl);
1052
1129
  if (!primaryUrl) {
@@ -1101,50 +1178,98 @@ function resolveEffectiveReadRpcConfig() {
1101
1178
  };
1102
1179
  return resolveReadRpcConfig(cfg, mergedEnv);
1103
1180
  }
1181
+ function createAbortableReadRpcFetch() {
1182
+ return (async (input, init) => {
1183
+ const timeoutMs = satRpcRequestTimeoutMs();
1184
+ const requestUrl = typeof input === "string" || input instanceof URL ? input.toString() : input.url;
1185
+ let guardedFetch;
1186
+ try {
1187
+ guardedFetch = await fetchWithSsrFGuard({
1188
+ url: requestUrl,
1189
+ init,
1190
+ timeoutMs,
1191
+ signal: init?.signal ?? (input instanceof Request ? input.signal : undefined),
1192
+ policy: { allowPrivateNetwork: true },
1193
+ auditContext: "sat-mining-read-rpc"
1194
+ });
1195
+ } catch (error) {
1196
+ const reason = redactSensitiveUrlLikeString(error instanceof Error ? `${error.name}: ${error.message}` : String(error));
1197
+ throw new Error(`rpc fetch failed after at most ${timeoutMs}ms (${redactSensitiveUrlLikeString(requestUrl)}): ${reason}`);
1198
+ }
1199
+ const { response, release } = guardedFetch;
1200
+ try {
1201
+ const body = await response.arrayBuffer();
1202
+ return new Response(body, {
1203
+ headers: response.headers,
1204
+ status: response.status,
1205
+ statusText: response.statusText
1206
+ });
1207
+ } finally {
1208
+ await release();
1209
+ }
1210
+ });
1211
+ }
1212
+ async function withReadRpcTimeout(task, method, rpcUrl) {
1213
+ const timeoutMs = satRpcRequestTimeoutMs();
1214
+ let timer;
1215
+ try {
1216
+ return await Promise.race([task, new Promise((_resolve, reject) => {
1217
+ timer = setTimeout(() => reject(new Error(`rpc ${method} timed out after ${timeoutMs}ms (${redactSensitiveUrlLikeString(rpcUrl)})`)), timeoutMs);
1218
+ timer.unref?.();
1219
+ })]);
1220
+ } finally {
1221
+ if (timer) {
1222
+ clearTimeout(timer);
1223
+ }
1224
+ }
1225
+ }
1104
1226
  function createReadConnection(solana, rpc) {
1105
- const primary = new solana.Connection(rpc.primaryUrl);
1106
- const secondary = rpc.secondaryUrl ? new solana.Connection(rpc.secondaryUrl) : null;
1227
+ const primary = new solana.Connection(rpc.primaryUrl, {
1228
+ disableRetryOnRateLimit: true,
1229
+ fetch: createAbortableReadRpcFetch()
1230
+ });
1231
+ const secondary = rpc.secondaryUrl ? new solana.Connection(rpc.secondaryUrl, {
1232
+ disableRetryOnRateLimit: true,
1233
+ fetch: createAbortableReadRpcFetch()
1234
+ }) : null;
1107
1235
  const withFallback = (method) => {
1108
1236
  return (async (...args) => {
1109
- const quotaBackoffMs = currentReadRpcQuotaBackoffMs();
1110
- if (quotaBackoffMs > 0) {
1111
- if (!secondary) {
1112
- throw makeReadRpcQuotaBackoffError(method, quotaBackoffMs);
1113
- }
1237
+ const primaryBackoffMs = currentReadRpcBackoffMs(rpc.primaryUrl);
1238
+ const secondaryBackoffMs = rpc.secondaryUrl ? currentReadRpcBackoffMs(rpc.secondaryUrl) : 0;
1239
+ const callEndpoint = async (connection, mode, rpcUrl) => {
1240
+ updateSatRpcMethodMetric(method, "request");
1114
1241
  try {
1115
- updateSatRpcMethodMetric(method, "request");
1116
- const result = await secondary[method](...args);
1242
+ const task = connection[method](...args);
1243
+ const result = await withReadRpcTimeout(task, method, rpcUrl);
1117
1244
  updateSatRpcMethodMetric(method, "success");
1118
- markReadRpcSuccess("fallback", rpc.secondaryUrl ?? rpc.primaryUrl);
1245
+ markReadRpcSuccess(mode, rpcUrl);
1119
1246
  return result;
1120
- } catch (secondaryError) {
1247
+ } catch (error) {
1121
1248
  updateSatRpcMethodMetric(method, "failure");
1122
- markReadRpcFailure(secondaryError);
1123
- throw secondaryError;
1249
+ markReadRpcFailure(error, rpcUrl);
1250
+ throw error;
1124
1251
  }
1252
+ };
1253
+ if (primaryBackoffMs > 0) {
1254
+ if (!secondary || !rpc.secondaryUrl || secondaryBackoffMs > 0) {
1255
+ throw makeReadRpcBackoffError(method, Math.min(primaryBackoffMs, secondaryBackoffMs > 0 ? secondaryBackoffMs : primaryBackoffMs));
1256
+ }
1257
+ return await callEndpoint(secondary, "fallback", rpc.secondaryUrl);
1125
1258
  }
1126
1259
  try {
1127
- updateSatRpcMethodMetric(method, "request");
1128
- const result = await primary[method](...args);
1129
- updateSatRpcMethodMetric(method, "success");
1130
- markReadRpcSuccess("primary", rpc.primaryUrl);
1131
- return result;
1260
+ return await callEndpoint(primary, "primary", rpc.primaryUrl);
1132
1261
  } catch (primaryError) {
1133
- updateSatRpcMethodMetric(method, "failure");
1134
- if (!secondary) {
1135
- markReadRpcFailure(primaryError);
1262
+ if (!secondary || !rpc.secondaryUrl) {
1136
1263
  throw primaryError;
1137
1264
  }
1265
+ const fallbackBackoffMs = currentReadRpcBackoffMs(rpc.secondaryUrl);
1266
+ if (fallbackBackoffMs > 0) {
1267
+ throw makeReadRpcBackoffError(method, fallbackBackoffMs);
1268
+ }
1138
1269
  try {
1139
- updateSatRpcMethodMetric(method, "request");
1140
- const result = await secondary[method](...args);
1141
- updateSatRpcMethodMetric(method, "success");
1142
- markReadRpcSuccess("fallback", rpc.secondaryUrl ?? rpc.primaryUrl);
1143
- return result;
1270
+ return await callEndpoint(secondary, "fallback", rpc.secondaryUrl);
1144
1271
  } catch (secondaryError) {
1145
- updateSatRpcMethodMetric(method, "failure");
1146
- markReadRpcFailure(new Error(`${String(primaryError instanceof Error ? primaryError.message : primaryError)}; ${String(secondaryError instanceof Error ? secondaryError.message : secondaryError)}`));
1147
- throw secondaryError;
1272
+ throw new Error(`rpc ${method} failed on primary (${String(primaryError instanceof Error ? primaryError.message : primaryError)}) and fallback (${String(secondaryError instanceof Error ? secondaryError.message : secondaryError)})`);
1148
1273
  }
1149
1274
  }
1150
1275
  });
@@ -1187,7 +1312,6 @@ async function resolveBondProgramContext(env) {
1187
1312
  programId: new solana.PublicKey(SAT_BOND_PROGRAM_ID())
1188
1313
  };
1189
1314
  }
1190
- const SAT_REGISTRY_RESERVE_TARGET_LAMPORTS = 2e8;
1191
1315
  const SAT_PROTOCOL_VAULT_ACCOUNT_SPACE = 0;
1192
1316
  const SAT_CYCLE_STATE_ACCOUNT_SPACE = 336;
1193
1317
  const SAT_CYCLE_REGISTRY_META_ACCOUNT_SPACE = 88;
@@ -1212,6 +1336,14 @@ async function rpcRequestOnce(rpcUrl, method, params) {
1212
1336
  const target = new URL(rpcUrl);
1213
1337
  const transport = target.protocol === "https:" ? https : http;
1214
1338
  const payload = await new Promise((resolve, reject) => {
1339
+ let settled = false;
1340
+ const finishReject = (error) => {
1341
+ if (settled) {
1342
+ return;
1343
+ }
1344
+ settled = true;
1345
+ reject(error);
1346
+ };
1215
1347
  const req = transport.request(target, {
1216
1348
  method: "POST",
1217
1349
  headers: {
@@ -1220,17 +1352,33 @@ async function rpcRequestOnce(rpcUrl, method, params) {
1220
1352
  }
1221
1353
  }, (res) => {
1222
1354
  const chunks = [];
1223
- res.on("data", (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
1355
+ let responseBytes = 0;
1356
+ res.on("data", (chunk) => {
1357
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
1358
+ responseBytes += buffer.length;
1359
+ if (responseBytes > SAT_RPC_MAX_RESPONSE_BYTES) {
1360
+ req.destroy(new Error(`rpc ${method} response exceeded size limit`));
1361
+ return;
1362
+ }
1363
+ chunks.push(buffer);
1364
+ });
1224
1365
  res.on("end", () => {
1366
+ if (settled) {
1367
+ return;
1368
+ }
1225
1369
  const text = Buffer.concat(chunks).toString("utf8");
1226
1370
  if ((res.statusCode ?? 500) >= 400) {
1227
- reject(new Error(text || `rpc ${method} failed`));
1371
+ finishReject(new Error(text || `rpc ${method} failed`));
1228
1372
  return;
1229
1373
  }
1374
+ settled = true;
1230
1375
  resolve(text);
1231
1376
  });
1232
1377
  });
1233
- req.on("error", reject);
1378
+ req.setTimeout(satRpcRequestTimeoutMs(), () => {
1379
+ req.destroy(new Error(`rpc ${method} timed out after ${satRpcRequestTimeoutMs()}ms (${rpcUrl})`));
1380
+ });
1381
+ req.on("error", (error) => finishReject(error));
1234
1382
  req.write(body);
1235
1383
  req.end();
1236
1384
  });
@@ -1247,29 +1395,35 @@ async function rpcRequestOnce(rpcUrl, method, params) {
1247
1395
  }
1248
1396
  async function rpcRequest(rpc, method, params) {
1249
1397
  const normalized = normalizeReadRpcConfig(rpc);
1250
- const quotaBackoffMs = currentReadRpcQuotaBackoffMs();
1251
- if (quotaBackoffMs > 0 && !normalized.secondaryUrl) {
1252
- throw makeReadRpcQuotaBackoffError(method, quotaBackoffMs);
1398
+ const primaryBackoffMs = currentReadRpcBackoffMs(normalized.primaryUrl);
1399
+ const secondaryBackoffMs = normalized.secondaryUrl ? currentReadRpcBackoffMs(normalized.secondaryUrl) : 0;
1400
+ if (primaryBackoffMs > 0 && (!normalized.secondaryUrl || secondaryBackoffMs > 0)) {
1401
+ throw makeReadRpcBackoffError(method, Math.min(primaryBackoffMs, secondaryBackoffMs > 0 ? secondaryBackoffMs : primaryBackoffMs));
1253
1402
  }
1254
- const useFallbackDueToQuota = quotaBackoffMs > 0 && Boolean(normalized.secondaryUrl);
1403
+ const useFallbackDueToBackoff = primaryBackoffMs > 0 && Boolean(normalized.secondaryUrl);
1255
1404
  try {
1256
- const rpcUrl = useFallbackDueToQuota && normalized.secondaryUrl ? normalized.secondaryUrl : normalized.primaryUrl;
1405
+ const rpcUrl = useFallbackDueToBackoff && normalized.secondaryUrl ? normalized.secondaryUrl : normalized.primaryUrl;
1257
1406
  const result = await rpcRequestOnce(rpcUrl, method, params);
1258
- markReadRpcSuccess(useFallbackDueToQuota && normalized.secondaryUrl ? "fallback" : "primary", rpcUrl);
1407
+ markReadRpcSuccess(useFallbackDueToBackoff && normalized.secondaryUrl ? "fallback" : "primary", rpcUrl);
1259
1408
  return result;
1260
1409
  } catch (primaryError) {
1261
- if (!normalized.secondaryUrl || useFallbackDueToQuota) {
1262
- markReadRpcFailure(primaryError);
1410
+ const failedRpcUrl = useFallbackDueToBackoff && normalized.secondaryUrl ? normalized.secondaryUrl : normalized.primaryUrl;
1411
+ markReadRpcFailure(primaryError, failedRpcUrl);
1412
+ if (!normalized.secondaryUrl || useFallbackDueToBackoff) {
1263
1413
  throw primaryError;
1264
1414
  }
1415
+ const fallbackBackoffMs = currentReadRpcBackoffMs(normalized.secondaryUrl);
1416
+ if (fallbackBackoffMs > 0) {
1417
+ throw makeReadRpcBackoffError(method, fallbackBackoffMs);
1418
+ }
1265
1419
  try {
1266
1420
  const result = await rpcRequestOnce(normalized.secondaryUrl, method, params);
1267
1421
  markReadRpcSuccess("fallback", normalized.secondaryUrl);
1268
1422
  return result;
1269
1423
  } catch (secondaryError) {
1424
+ markReadRpcFailure(secondaryError, normalized.secondaryUrl);
1270
1425
  const primaryMessage = primaryError instanceof Error ? primaryError.message : String(primaryError);
1271
1426
  const secondaryMessage = secondaryError instanceof Error ? secondaryError.message : String(secondaryError);
1272
- markReadRpcFailure(new Error(`rpc ${method} failed on primary (${primaryMessage}) and fallback (${secondaryMessage})`));
1273
1427
  throw new Error(`rpc ${method} failed on primary (${primaryMessage}) and fallback (${secondaryMessage})`);
1274
1428
  }
1275
1429
  }
@@ -2013,10 +2167,11 @@ async function inspectSatTreasuryVaultLamports(_config) {
2013
2167
  lamports: await fetchLamportBalanceRaw(rpc, address.toBase58())
2014
2168
  };
2015
2169
  }
2016
- async function inspectSatRentExemptionLamports(_config) {
2170
+ async function inspectSatRentExemptionLamports(config) {
2017
2171
  const { connection } = await resolveConnection(process.env);
2018
2172
  const rpc = resolveEffectiveReadRpcConfig();
2019
- return await getOrLoadRpcCacheValue(`view:rent-exemption:${rpcCacheScope(rpc)}`, SAT_RPC_RENT_EXEMPTION_CACHE_TTL_MS, async () => {
2173
+ const registryReserveTargetLamports = resolveSatGenesisProfileContract(config.network).registryReserveTargetLamports;
2174
+ return await getOrLoadRpcCacheValue(`view:rent-exemption:${rpcCacheScope(rpc)}:${registryReserveTargetLamports}`, SAT_RPC_RENT_EXEMPTION_CACHE_TTL_MS, async () => {
2020
2175
  const [protocolVaultLamports, cycleStateLamports, cycleRegistryMetaLamports, cycleRegistryPageLamports, cycleSettlementProgressLamports, minerCycleLamports] = await Promise.all([
2021
2176
  connection.getMinimumBalanceForRentExemption(SAT_PROTOCOL_VAULT_ACCOUNT_SPACE),
2022
2177
  connection.getMinimumBalanceForRentExemption(SAT_CYCLE_STATE_ACCOUNT_SPACE),
@@ -2028,7 +2183,7 @@ async function inspectSatRentExemptionLamports(_config) {
2028
2183
  const openCycleLamports = cycleStateLamports + cycleRegistryMetaLamports;
2029
2184
  const submitCycleSharedLamports = cycleSettlementProgressLamports + cycleRegistryPageLamports;
2030
2185
  return {
2031
- registryReserveTargetLamports: String(SAT_REGISTRY_RESERVE_TARGET_LAMPORTS),
2186
+ registryReserveTargetLamports: String(registryReserveTargetLamports),
2032
2187
  protocolVaultLamports: String(protocolVaultLamports),
2033
2188
  cycleStateLamports: String(cycleStateLamports),
2034
2189
  cycleRegistryMetaLamports: String(cycleRegistryMetaLamports),
@@ -2158,6 +2313,18 @@ async function inspectSatRoundState(_config, params) {
2158
2313
  }
2159
2314
  function inspectSatConnectionDetails() {
2160
2315
  const rpc = resolveEffectiveReadRpcConfig();
2316
+ const endpointStates = [rpc.primaryUrl, rpc.secondaryUrl].filter((rpcUrl) => Boolean(rpcUrl)).map((rpcUrl) => {
2317
+ const state = satReadRpcEndpointStates.get(normalizeRpcUrlForComparison(rpcUrl));
2318
+ return {
2319
+ rpcUrl: redactSensitiveUrlLikeString(rpcUrl),
2320
+ consecutiveFailures: state?.consecutiveFailures ?? 0,
2321
+ backoffRemainingMs: currentReadRpcBackoffMs(rpcUrl),
2322
+ quotaLikely: state?.quotaLikely ?? false,
2323
+ lastError: state?.lastError ? redactSensitiveUrlLikeString(state.lastError) : null,
2324
+ lastFailureAt: state?.lastFailureAt ?? null,
2325
+ lastSuccessAt: state?.lastSuccessAt ?? null
2326
+ };
2327
+ });
2161
2328
  return {
2162
2329
  programId: SAT_PROGRAM_ID(),
2163
2330
  bondProgramId: SAT_BOND_PROGRAM_ID(),
@@ -2167,7 +2334,8 @@ function inspectSatConnectionDetails() {
2167
2334
  ...satReadRpcRuntimeState,
2168
2335
  lastError: satReadRpcRuntimeState.lastError ? redactSensitiveUrlLikeString(satReadRpcRuntimeState.lastError) : null,
2169
2336
  lastRpcUrl: satReadRpcRuntimeState.lastRpcUrl ? redactSensitiveUrlLikeString(satReadRpcRuntimeState.lastRpcUrl) : null,
2170
- quotaLikely: satReadRpcRuntimeState.quotaLikely || looksLikeRpcQuotaFailure(satReadRpcRuntimeState.lastError)
2337
+ quotaLikely: satReadRpcRuntimeState.quotaLikely || looksLikeRpcQuotaFailure(satReadRpcRuntimeState.lastError),
2338
+ endpoints: endpointStates
2171
2339
  },
2172
2340
  rpcMetrics: summarizeSatRpcMethodMetrics()
2173
2341
  };
@@ -2286,4 +2454,4 @@ function sortableValue(row, sortBy) {
2286
2454
  }
2287
2455
 
2288
2456
  //#endregion
2289
- export { inspectSatBondPosition, inspectSatBondStakingDistributor, inspectSatBondStakingPosition, inspectSatBondTierPolicy, inspectSatChainSlot, inspectSatCycleRegistryMeta, inspectSatMinerCyclesByAddress, invalidateSatReadCaches };
2457
+ export { inspectSatBondPosition, inspectSatBondStakingDistributor, inspectSatBondStakingPosition, inspectSatChainSlot, inspectSatCycle, inspectSatCycleRegistryMeta, inspectSatMinerCyclesByAddress, invalidateSatReadCaches };
@@ -1,6 +1,6 @@
1
1
  import { SAT_RUNTIME_DEFAULTS } from "../../../config/sat-runtime-ids.js";
2
2
  import "../../../plugin-sdk/sat-runtime.js";
3
- import fs from "node:fs";
3
+ import syncFs from "node:fs";
4
4
  import path from "node:path";
5
5
 
6
6
  //#region extensions/sat-mining/src/sat-bond-layout.ts
@@ -122,7 +122,9 @@ const DEDICATED_FALLBACK_STAKING_DISTRIBUTOR_LAYOUT = {
122
122
  totalActiveStakeRaw: 120,
123
123
  rewardIndexFp: 128,
124
124
  observedRewardVaultRaw: 144,
125
- lastSyncedSlot: 152
125
+ lastSyncedSlot: 152,
126
+ unallocatedRewardRaw: 160,
127
+ fractionalRemainderFp: 168
126
128
  }
127
129
  };
128
130
  const DEDICATED_FALLBACK_STAKING_POSITION_LAYOUT = {
@@ -142,7 +144,8 @@ const DEDICATED_FALLBACK_STAKING_POSITION_LAYOUT = {
142
144
  activeStakeRaw: 80,
143
145
  claimableRewardRaw: 88,
144
146
  rewardDebtFp: 96,
145
- lastSyncedSlot: 112
147
+ lastSyncedSlot: 112,
148
+ fractionalRemainderFp: 120
146
149
  }
147
150
  };
148
151
  function hasDedicatedBondProgram(env = process.env) {
@@ -162,7 +165,7 @@ function resolveLayoutPath(env = process.env) {
162
165
  path.resolve(import.meta.dirname, "..", "..", "..", "..", "..", "token", "sat", "bond-api", "bond-position-layout.json")
163
166
  ];
164
167
  for (const candidate of candidates) {
165
- if (candidate && fs.existsSync(candidate)) {
168
+ if (candidate && syncFs.existsSync(candidate)) {
166
169
  return candidate;
167
170
  }
168
171
  }
@@ -178,7 +181,7 @@ function resolvePolicyLayoutPath(env = process.env) {
178
181
  path.resolve(import.meta.dirname, "..", "..", "..", "..", "..", "token", "sat", "bond-api", "bond-tier-policy-layout.json")
179
182
  ];
180
183
  for (const candidate of candidates) {
181
- if (candidate && fs.existsSync(candidate)) {
184
+ if (candidate && syncFs.existsSync(candidate)) {
182
185
  return candidate;
183
186
  }
184
187
  }
@@ -194,7 +197,7 @@ function resolveStakingDistributorLayoutPath(env = process.env) {
194
197
  path.resolve(import.meta.dirname, "..", "..", "..", "..", "..", "token", "sat", "bond-api", "bond-staking-distributor-layout.json")
195
198
  ];
196
199
  for (const candidate of candidates) {
197
- if (candidate && fs.existsSync(candidate)) {
200
+ if (candidate && syncFs.existsSync(candidate)) {
198
201
  return candidate;
199
202
  }
200
203
  }
@@ -210,7 +213,7 @@ function resolveStakingPositionLayoutPath(env = process.env) {
210
213
  path.resolve(import.meta.dirname, "..", "..", "..", "..", "..", "token", "sat", "bond-api", "bond-staking-position-layout.json")
211
214
  ];
212
215
  for (const candidate of candidates) {
213
- if (candidate && fs.existsSync(candidate)) {
216
+ if (candidate && syncFs.existsSync(candidate)) {
214
217
  return candidate;
215
218
  }
216
219
  }
@@ -224,7 +227,7 @@ function loadSatBondLayout(env = process.env) {
224
227
  }
225
228
  const layoutPath = resolveLayoutPath(env);
226
229
  if (layoutPath) {
227
- const loaded = JSON.parse(fs.readFileSync(layoutPath, "utf-8"));
230
+ const loaded = JSON.parse(syncFs.readFileSync(layoutPath, "utf-8"));
228
231
  cachedLayout = {
229
232
  mode,
230
233
  value: loaded
@@ -244,7 +247,7 @@ function loadSatBondPolicyLayout(env = process.env) {
244
247
  }
245
248
  const layoutPath = resolvePolicyLayoutPath(env);
246
249
  if (layoutPath) {
247
- cachedPolicyLayout = JSON.parse(fs.readFileSync(layoutPath, "utf-8"));
250
+ cachedPolicyLayout = JSON.parse(syncFs.readFileSync(layoutPath, "utf-8"));
248
251
  return cachedPolicyLayout;
249
252
  }
250
253
  cachedPolicyLayout = DEDICATED_FALLBACK_POLICY_LAYOUT;
@@ -257,7 +260,7 @@ function loadSatBondStakingDistributorLayout(env = process.env) {
257
260
  }
258
261
  const layoutPath = resolveStakingDistributorLayoutPath(env);
259
262
  if (layoutPath) {
260
- cachedStakingDistributorLayout = JSON.parse(fs.readFileSync(layoutPath, "utf-8"));
263
+ cachedStakingDistributorLayout = JSON.parse(syncFs.readFileSync(layoutPath, "utf-8"));
261
264
  return cachedStakingDistributorLayout;
262
265
  }
263
266
  cachedStakingDistributorLayout ??= DEDICATED_FALLBACK_STAKING_DISTRIBUTOR_LAYOUT;
@@ -270,7 +273,7 @@ function loadSatBondStakingPositionLayout(env = process.env) {
270
273
  }
271
274
  const layoutPath = resolveStakingPositionLayoutPath(env);
272
275
  if (layoutPath) {
273
- cachedStakingPositionLayout = JSON.parse(fs.readFileSync(layoutPath, "utf-8"));
276
+ cachedStakingPositionLayout = JSON.parse(syncFs.readFileSync(layoutPath, "utf-8"));
274
277
  return cachedStakingPositionLayout;
275
278
  }
276
279
  cachedStakingPositionLayout ??= DEDICATED_FALLBACK_STAKING_POSITION_LAYOUT;