@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
@@ -23,7 +23,7 @@ const SAT_SETTLEMENT_ACTIONS = new Set([
23
23
  "distributeCyclePage",
24
24
  ]);
25
25
  const SAT_CLOSE_ACTIONS = new Set(["closeResolvedCycleAccounts", "closeResolvedCycleArtifacts"]);
26
- const SAT_SUBMIT_ACTIONS = new Set(["submitCycle", "openCycle"]);
26
+ const SAT_PARTICIPATION_ACTIONS = new Set(["commitCycle", "revealCycle", "submitCycle"]);
27
27
  const SAT_RUNTIME_PENDING_CYCLE_WINDOW = 12;
28
28
 
29
29
  function actionTimeMs(entry: { at?: string }) {
@@ -86,8 +86,13 @@ export function hasSuccessfulClaimOrCloseRecord(
86
86
  cycleId: number,
87
87
  ): boolean {
88
88
  return (
89
- hasSuccessfulCycleAction(state, cycleId, ["claimCycleRewards", "claimCycleRewardsBatch"]) ||
90
- hasAuthoritativeCloseRecord(state, cycleId)
89
+ state.recentActions.some(
90
+ (entry) =>
91
+ entry.status === "success" &&
92
+ entry.complete !== false &&
93
+ entry.cycleId === cycleId &&
94
+ (entry.action === "claimCycleRewards" || entry.action === "claimCycleRewardsBatch"),
95
+ ) || hasAuthoritativeCloseRecord(state, cycleId)
91
96
  );
92
97
  }
93
98
 
@@ -112,7 +117,7 @@ export function hasAuthoritativeCloseRecord(
112
117
  return false;
113
118
  }
114
119
  const latestSettlementAt = latestSuccessfulActionTimeMs(state, cycleId, SAT_SETTLEMENT_ACTIONS);
115
- const latestSubmitAt = latestSuccessfulActionTimeMs(state, cycleId, SAT_SUBMIT_ACTIONS);
120
+ const latestSubmitAt = latestSuccessfulActionTimeMs(state, cycleId, SAT_PARTICIPATION_ACTIONS);
116
121
  const latestProgressAt = Math.max(latestSettlementAt ?? 0, latestSubmitAt ?? 0);
117
122
  return latestCloseAt >= latestProgressAt;
118
123
  }
@@ -152,7 +157,7 @@ export function collectRuntimePendingCycleIds(params: {
152
157
  cycleId == null ||
153
158
  cycleId < minRuntimePendingCycleId ||
154
159
  cycleId >= params.currentCycleId ||
155
- !execution.participationSubmitted ||
160
+ (!execution.commitSubmitted && !execution.participationSubmitted) ||
156
161
  execution.claimSubmitted ||
157
162
  hasSuccessfulClaimOrCloseRecord(params.state, cycleId)
158
163
  ) {
@@ -163,7 +168,7 @@ export function collectRuntimePendingCycleIds(params: {
163
168
  for (const entry of params.state.recentActions) {
164
169
  if (
165
170
  entry.status === "success" &&
166
- entry.action === "submitCycle" &&
171
+ SAT_PARTICIPATION_ACTIONS.has(entry.action) &&
167
172
  typeof entry.cycleId === "number" &&
168
173
  Number.isFinite(entry.cycleId) &&
169
174
  entry.cycleId > 0 &&
@@ -213,7 +218,7 @@ export function derivePendingCycleStage(
213
218
  return "stale-closed";
214
219
  }
215
220
  const execution = state.roundExecution.get(`${cycleId}:0`) ?? null;
216
- if (hasSuccessfulCycleAction(state, cycleId, ["claimCycleRewards", "claimCycleRewardsBatch"])) {
221
+ if (hasSuccessfulClaimOrCloseRecord(state, cycleId)) {
217
222
  return "closing";
218
223
  }
219
224
  if (execution?.claimSubmitted) {
@@ -230,10 +235,13 @@ export function derivePendingCycleStage(
230
235
  }
231
236
  if (
232
237
  execution?.participationSubmitted ||
233
- hasSuccessfulCycleAction(state, cycleId, ["submitCycle", "openCycle"])
238
+ hasSuccessfulCycleAction(state, cycleId, ["revealCycle", "submitCycle"])
234
239
  ) {
235
240
  return "settling";
236
241
  }
242
+ if (execution?.commitSubmitted || hasSuccessfulCycleAction(state, cycleId, ["commitCycle"])) {
243
+ return "submitted";
244
+ }
237
245
  return "unknown";
238
246
  }
239
247
 
@@ -619,17 +619,21 @@ async function selectEpochTargetCycle(params: {
619
619
  execution.openRoundSubmitted = true;
620
620
  }
621
621
  if (!execution.participationSubmitted && authority) {
622
- minerCycleExists = await Promise.resolve(
623
- withEpochReadTimeout("miner-cycle existence", () =>
624
- inspectSatMinerCycleAccountExists(state.activeConfig, {
622
+ const minerCycle = await Promise.resolve(
623
+ withEpochReadTimeout("miner-cycle participation", () =>
624
+ inspectSatMinerCycle(state.activeConfig, {
625
625
  authority,
626
626
  cycleId,
627
627
  }),
628
628
  ),
629
- ).catch(() => false);
630
- if (minerCycleExists) {
629
+ ).catch(swallowSatReadErrorUnlessTimeout);
630
+ minerCycleExists = minerCycle != null;
631
+ if (minerCycle?.validParticipation === true) {
631
632
  execution.openRoundSubmitted = true;
632
633
  execution.participationSubmitted = true;
634
+ } else if (minerCycle) {
635
+ execution.openRoundSubmitted = true;
636
+ execution.commitSubmitted = true;
633
637
  }
634
638
  }
635
639
  if (!execution.participationSubmitted) {
@@ -1,6 +1,7 @@
1
1
  import type { FasedAgentPluginApi } from "fased/plugin-sdk";
2
2
  import { callGatewayScoped, resolveGatewayPort } from "fased/plugin-sdk/sat-runtime";
3
3
  import { consumeSatGatewayMethodChaosOnce } from "./live-chaos.js";
4
+ import { digestSatSubmissionIntent } from "./submission-ledger.js";
4
5
 
5
6
  function chaosError(envName: string, fallback: string): Error {
6
7
  return new Error(process.env[envName]?.trim() || fallback);
@@ -10,6 +11,7 @@ export async function runSatGatewayMethod<T = Record<string, unknown>>(params: {
10
11
  api: FasedAgentPluginApi;
11
12
  method: string;
12
13
  payload: unknown;
14
+ workflowId?: string;
13
15
  }): Promise<T> {
14
16
  if (
15
17
  consumeSatGatewayMethodChaosOnce({
@@ -30,12 +32,30 @@ export async function runSatGatewayMethod<T = Record<string, unknown>>(params: {
30
32
  ? currentConfig.gateway.auth.token.trim() || undefined
31
33
  : undefined;
32
34
  const url = `ws://127.0.0.1:${resolveGatewayPort(currentConfig, process.env)}`;
35
+ const payloadRecord =
36
+ params.payload && typeof params.payload === "object" && !Array.isArray(params.payload)
37
+ ? (params.payload as Record<string, unknown>)
38
+ : null;
39
+ const idempotencyKey =
40
+ params.workflowId?.trim() ||
41
+ `worker:${params.method}:${digestSatSubmissionIntent(params.payload)}`;
42
+ const mutationMethod = !/^sat\.(?:get|list|status)/u.test(params.method);
43
+ const gatewayParams =
44
+ mutationMethod && payloadRecord
45
+ ? {
46
+ ...payloadRecord,
47
+ idempotencyKey:
48
+ typeof payloadRecord.idempotencyKey === "string" && payloadRecord.idempotencyKey.trim()
49
+ ? payloadRecord.idempotencyKey.trim()
50
+ : idempotencyKey,
51
+ }
52
+ : params.payload;
33
53
  const result = await callGatewayScoped<T>({
34
54
  url,
35
55
  token,
36
56
  config: currentConfig,
37
57
  method: params.method,
38
- params: params.payload,
58
+ params: gatewayParams,
39
59
  scopes: ["operator.admin"],
40
60
  timeoutMs: 15_000,
41
61
  });
@@ -36,8 +36,15 @@ export const SAT_INSTRUCTION_DISCRIMINATORS = {
36
36
  requestBondUnlock: 81,
37
37
  cancelBondUnlock: 82,
38
38
  finalizeBondUnlock: 83,
39
+ topUpRegistryReserve: 84,
39
40
  claimProtocolDistributorSat: 85,
40
41
  refillRegistryReserveFromTreasury: 88,
42
+ commitCycle: 89,
43
+ closeCommitPhase: 90,
44
+ sealCycleEntropy: 91,
45
+ revealCycle: 92,
46
+ releaseUnrevealedCommit: 93,
47
+ abortEmptyCycle: 94,
41
48
  miningCrank: 33,
42
49
  } as const;
43
50
 
@@ -53,12 +60,49 @@ export const SAT_BOND_INSTRUCTION_DISCRIMINATORS = {
53
60
  syncStakingRewards: 8,
54
61
  syncStakingPosition: 9,
55
62
  claimStakingRewards: 10,
63
+ claimUnallocatedStakingRewards: 11,
64
+ recordProtocolStakingRewards: 12,
56
65
  } as const;
57
66
 
58
67
  export const SAT_PROTOCOL_CONSTANTS = {
59
68
  allocationBuckets: 25,
60
69
  cycleSeconds: 300,
70
+ cycleOpenGraceSeconds: 30,
71
+ cycleCommitSeconds: 120,
72
+ cycleCommitSlots: 300,
73
+ cycleRevealSlots: 375,
74
+ cycleSettlementBufferSeconds: 30,
75
+ cycleEntropyDelaySlots: 8,
76
+ cycleEntropyHashCount: 8,
77
+ cycleRecoveryRevealSeconds: 120,
61
78
  cycleErosionPpm: 83n,
79
+ cycleNonRevealPenaltyBps: 100,
80
+ cycleUnlockRetargetIntervalCycles: 12,
81
+ cycleUnlockWindowIntervals: 24,
82
+ cycleUnlockMaxStepBps: 1_000,
62
83
  minimumEntryLamports: 250_000_000,
63
- registryReserveTargetLamports: 200_000_000n,
84
+ entropyUnavailableSeedHex: "ff".repeat(32),
64
85
  } as const;
86
+
87
+ export const SAT_GENESIS_PROFILE_CONTRACTS = {
88
+ devnet: {
89
+ cluster: "devnet",
90
+ configSha256: "79c536b73d7682842c9574f6785e7a8ab5916eb0a99e29f98c00bde4b18e3500",
91
+ registryReserveTargetLamports: 200_000_000n,
92
+ registryReserveMaxLamports: 200_000_000n,
93
+ keeperReserveSpendableLamports: 10_000_000n,
94
+ },
95
+ "mainnet-beta": {
96
+ cluster: "mainnet-beta",
97
+ configSha256: "f35ccf88352efc6f86e6ff18b5c6f349e7ba792916ec8a4ae5c3705fde4c963b",
98
+ registryReserveTargetLamports: 500_000_000n,
99
+ registryReserveMaxLamports: 1_000_000_000n,
100
+ keeperReserveSpendableLamports: 10_000_000n,
101
+ },
102
+ } as const;
103
+
104
+ export function resolveSatGenesisProfileContract(network: string | null | undefined) {
105
+ return network === "mainnet-beta"
106
+ ? SAT_GENESIS_PROFILE_CONTRACTS["mainnet-beta"]
107
+ : SAT_GENESIS_PROFILE_CONTRACTS.devnet;
108
+ }
@@ -3,8 +3,11 @@ import { refreshSatChainTime } from "./chain-time.js";
3
3
  import type { SatMiningConfig } from "./config.js";
4
4
  import { deriveExactPendingCycle } from "./cycle-progress.js";
5
5
  import { runSatGatewayMethod } from "./gateway-runner.js";
6
+ import { SAT_PROTOCOL_CONSTANTS } from "./protocol-contract.js";
6
7
  import {
8
+ inspectSatCycle,
7
9
  inspectSatCycleSettlementProgressV2,
10
+ inspectSatChainSlot,
8
11
  inspectSatMinerCapital,
9
12
  inspectSatMinerCycle,
10
13
  } from "./rpc-read.js";
@@ -20,6 +23,7 @@ import {
20
23
  satRateLimitBackoffMs,
21
24
  scheduleWorkerNextRun,
22
25
  type SatMiningRuntimeState,
26
+ type SatRoundExecutionState,
23
27
  } from "./runtime.js";
24
28
  import {
25
29
  isSatServiceReadTimeoutError,
@@ -97,6 +101,53 @@ function hasPendingCapitalRange(firstPendingCycleId?: number, lastPendingCycleId
97
101
  );
98
102
  }
99
103
 
104
+ function isZeroCycleSeed(value: string | undefined): boolean {
105
+ return !value || /^0+$/.test(value);
106
+ }
107
+
108
+ function isEntropyUnavailable(cycle: {
109
+ cycleSeed?: string;
110
+ entropyUnavailable?: boolean;
111
+ }): boolean {
112
+ return (
113
+ cycle.entropyUnavailable === true ||
114
+ cycle.cycleSeed === SAT_PROTOCOL_CONSTANTS.entropyUnavailableSeedHex
115
+ );
116
+ }
117
+
118
+ function hasDurableRevealMaterial(execution: SatRoundExecutionState): boolean {
119
+ return (
120
+ typeof execution.revealNonceBase64 === "string" &&
121
+ execution.revealNonceBase64.length > 0 &&
122
+ Array.isArray(execution.allocationFp) &&
123
+ execution.allocationFp.length > 0
124
+ );
125
+ }
126
+
127
+ function isFullyResolvedEmptyCycle(
128
+ cycle: Awaited<ReturnType<typeof inspectSatCycle>> | null,
129
+ ): boolean {
130
+ if (!cycle || cycle.status !== 1 || BigInt(cycle.validMinerCount ?? "0") !== 0n) {
131
+ return false;
132
+ }
133
+ const committed = BigInt(cycle.committedMinerCount ?? "0");
134
+ const resolved = BigInt(cycle.resolvedCommitCount ?? "0");
135
+ const released = BigInt(cycle.releasedCommitCount ?? committed);
136
+ return committed > 0n && resolved === committed && released === committed;
137
+ }
138
+
139
+ function isMinerCycleResolvedForCleanup(
140
+ minerCycle: Awaited<ReturnType<typeof inspectSatMinerCycle>> | null,
141
+ ): boolean {
142
+ return Boolean(
143
+ minerCycle &&
144
+ minerCycle.capitalLockReleased === true &&
145
+ BigInt(minerCycle.claimableSatRaw ?? "0") === 0n &&
146
+ BigInt(minerCycle.claimableDetRebateLamports ?? "0") === 0n &&
147
+ BigInt(minerCycle.claimablePerfRebateLamports ?? "0") === 0n,
148
+ );
149
+ }
150
+
100
151
  function collectCloseCandidateCycleIds(state: SatMiningRuntimeState, current: number): number[] {
101
152
  const candidateIds = new Set<number>();
102
153
  const minCandidateCycleId = Math.max(1, current - RECOVERY_CLOSE_BACKLOG_WINDOW);
@@ -174,6 +225,248 @@ export function createSatRecoveryService(params: {
174
225
  let tickInFlight = false;
175
226
  let lastPendingRangeCompactAt = 0;
176
227
 
228
+ const recoverPendingCommit = async (params: {
229
+ cycleId: number;
230
+ authority: string;
231
+ nowSec: number;
232
+ currentSlot: number | null;
233
+ anchor: string;
234
+ backlogDetail: string;
235
+ }): Promise<boolean> => {
236
+ const execution = state.roundExecution.get(`${params.cycleId}:0`) ?? null;
237
+ const [cycle, minerCycle] = await Promise.all([
238
+ withRecoveryReadTimeout("commit/reveal cycle", () =>
239
+ inspectSatCycle(state.activeConfig, { cycleId: params.cycleId }),
240
+ ).catch(swallowSatReadErrorUnlessTimeout),
241
+ withRecoveryReadTimeout("commit/reveal miner cycle", () =>
242
+ inspectSatMinerCycle(state.activeConfig, {
243
+ authority: params.authority,
244
+ cycleId: params.cycleId,
245
+ }),
246
+ ).catch(swallowSatReadErrorUnlessTimeout),
247
+ ]);
248
+ if (!cycle || !minerCycle) {
249
+ return false;
250
+ }
251
+ if (cycle.status === 2 && isMinerCycleResolvedForCleanup(minerCycle)) {
252
+ await runSatGatewayMethod({
253
+ api,
254
+ method: "sat.closeResolvedCycleAccounts",
255
+ payload: { cycleId: params.cycleId },
256
+ });
257
+ state.roundExecution.delete(`${params.cycleId}:0`);
258
+ await persistRuntimeState?.();
259
+ markWorkerSuccess(
260
+ state,
261
+ "recovery",
262
+ `${params.anchor}${params.backlogDetail} closed resolved commitment cycle ${params.cycleId}`,
263
+ );
264
+ scheduleWorkerNextRun(state, "recovery", RECOVERY_TICK_INTERVAL_MS);
265
+ return true;
266
+ }
267
+ if (cycle.status !== 1) {
268
+ return false;
269
+ }
270
+ if (minerCycle.validParticipation) {
271
+ if (execution) {
272
+ execution.participationSubmitted = true;
273
+ execution.entropySealed = !isZeroCycleSeed(cycle.cycleSeed) && !isEntropyUnavailable(cycle);
274
+ await persistRuntimeState?.();
275
+ }
276
+ }
277
+
278
+ const detailPrefix = `${params.anchor}${params.backlogDetail}`;
279
+ const commitDeadlineTs = cycle.commitDeadlineTs ?? 0;
280
+ const revealDeadlineTs = cycle.revealDeadlineTs ?? 0;
281
+ const commitPhaseOpen =
282
+ params.currentSlot != null && cycle.commitDeadlineSlot != null
283
+ ? params.currentSlot < cycle.commitDeadlineSlot
284
+ : params.nowSec < commitDeadlineTs;
285
+ const revealPhaseOpen =
286
+ params.currentSlot != null && cycle.revealDeadlineSlot != null
287
+ ? params.currentSlot < cycle.revealDeadlineSlot
288
+ : params.nowSec < revealDeadlineTs;
289
+ if (commitPhaseOpen) {
290
+ markWorkerWaiting(
291
+ state,
292
+ "recovery",
293
+ `cycle ${params.cycleId} commitment is waiting for the commit window to close`,
294
+ );
295
+ scheduleWorkerNextRun(
296
+ state,
297
+ "recovery",
298
+ Math.max(1_000, Math.min(10_000, (commitDeadlineTs - params.nowSec) * 1_000 + 500)),
299
+ );
300
+ return true;
301
+ }
302
+
303
+ if (execution?.entropyTargetPinned !== true) {
304
+ if (execution) {
305
+ execution.entropyTargetPinned = true;
306
+ await persistRuntimeState?.();
307
+ }
308
+ }
309
+
310
+ if (isEntropyUnavailable(cycle)) {
311
+ if (!minerCycle.capitalLockReleased) {
312
+ await runSatGatewayMethod({
313
+ api,
314
+ method: "sat.releaseUnrevealedCommit",
315
+ payload: { cycleId: params.cycleId, minerAuthority: params.authority },
316
+ });
317
+ }
318
+ const refreshedCycle = await withRecoveryReadTimeout("cancelled entropy cycle", () =>
319
+ inspectSatCycle(state.activeConfig, { cycleId: params.cycleId }),
320
+ ).catch(swallowSatReadErrorUnlessTimeout);
321
+ if (isFullyResolvedEmptyCycle(refreshedCycle)) {
322
+ await runSatGatewayMethod({
323
+ api,
324
+ method: "sat.abortEmptyCycle",
325
+ payload: { cycleId: params.cycleId },
326
+ });
327
+ await runSatGatewayMethod({
328
+ api,
329
+ method: "sat.closeResolvedCycleAccounts",
330
+ payload: { cycleId: params.cycleId },
331
+ });
332
+ state.roundExecution.delete(`${params.cycleId}:0`);
333
+ await persistRuntimeState?.();
334
+ markWorkerSuccess(
335
+ state,
336
+ "recovery",
337
+ `${detailPrefix} unwound unprovable entropy without penalty and aborted cycle ${params.cycleId}`,
338
+ );
339
+ } else {
340
+ markWorkerWaiting(
341
+ state,
342
+ "recovery",
343
+ `cycle ${params.cycleId} cancelled without penalty; waiting for remaining commitments to unwind`,
344
+ );
345
+ }
346
+ scheduleWorkerNextRun(state, "recovery", RECOVERY_TICK_INTERVAL_MS);
347
+ return true;
348
+ }
349
+
350
+ if (isZeroCycleSeed(cycle.cycleSeed) && revealPhaseOpen) {
351
+ if (minerCycle.validParticipation) {
352
+ markWorkerWaiting(
353
+ state,
354
+ "recovery",
355
+ `cycle ${params.cycleId} reveal is recorded; waiting for the sealed-strategy window to close`,
356
+ );
357
+ scheduleWorkerNextRun(state, "recovery", 1_000);
358
+ return true;
359
+ }
360
+ if (!execution || !hasDurableRevealMaterial(execution)) {
361
+ markWorkerWaiting(
362
+ state,
363
+ "recovery",
364
+ `cycle ${params.cycleId} cannot reveal safely because its durable nonce or allocation is unavailable`,
365
+ );
366
+ scheduleWorkerNextRun(state, "recovery", RECOVERY_TICK_INTERVAL_MS);
367
+ return true;
368
+ }
369
+ await runSatGatewayMethod({
370
+ api,
371
+ method: "sat.revealCycle",
372
+ payload: {
373
+ cycleId: params.cycleId,
374
+ nonceBase64: execution.revealNonceBase64,
375
+ allocationFp: execution.allocationFp,
376
+ },
377
+ });
378
+ execution.participationSubmitted = true;
379
+ await persistRuntimeState?.();
380
+ markWorkerSuccess(
381
+ state,
382
+ "recovery",
383
+ `${detailPrefix} recovered reveal for cycle ${params.cycleId}`,
384
+ );
385
+ scheduleWorkerNextRun(state, "recovery", 1_000);
386
+ return true;
387
+ }
388
+
389
+ if (isZeroCycleSeed(cycle.cycleSeed)) {
390
+ if (
391
+ params.currentSlot != null &&
392
+ cycle.entropyTargetSlot != null &&
393
+ params.currentSlot <= cycle.entropyTargetSlot
394
+ ) {
395
+ markWorkerWaiting(
396
+ state,
397
+ "recovery",
398
+ `cycle ${params.cycleId} reveal window closed; waiting for future entropy slots`,
399
+ );
400
+ scheduleWorkerNextRun(state, "recovery", 1_000);
401
+ return true;
402
+ }
403
+ try {
404
+ await runSatGatewayMethod({
405
+ api,
406
+ method: "sat.sealCycleEntropy",
407
+ payload: { cycleId: params.cycleId },
408
+ });
409
+ } catch (error) {
410
+ api.logger.debug?.(
411
+ `[sat-mining] recovery is waiting for cycle ${params.cycleId} entropy: ${String(error)}`,
412
+ );
413
+ }
414
+ markWorkerWaiting(
415
+ state,
416
+ "recovery",
417
+ `cycle ${params.cycleId} is sealing post-reveal entropy`,
418
+ );
419
+ scheduleWorkerNextRun(state, "recovery", 1_000);
420
+ return true;
421
+ }
422
+
423
+ if (execution) {
424
+ execution.entropySealed = true;
425
+ await persistRuntimeState?.();
426
+ }
427
+ if (minerCycle.validParticipation) {
428
+ return false;
429
+ }
430
+
431
+ if (!minerCycle.capitalLockReleased) {
432
+ await runSatGatewayMethod({
433
+ api,
434
+ method: "sat.releaseUnrevealedCommit",
435
+ payload: { cycleId: params.cycleId, minerAuthority: params.authority },
436
+ });
437
+ }
438
+ const refreshedCycle = await withRecoveryReadTimeout("released commit cycle", () =>
439
+ inspectSatCycle(state.activeConfig, { cycleId: params.cycleId }),
440
+ ).catch(swallowSatReadErrorUnlessTimeout);
441
+ if (isFullyResolvedEmptyCycle(refreshedCycle)) {
442
+ await runSatGatewayMethod({
443
+ api,
444
+ method: "sat.abortEmptyCycle",
445
+ payload: { cycleId: params.cycleId },
446
+ });
447
+ await runSatGatewayMethod({
448
+ api,
449
+ method: "sat.closeResolvedCycleAccounts",
450
+ payload: { cycleId: params.cycleId },
451
+ });
452
+ state.roundExecution.delete(`${params.cycleId}:0`);
453
+ await persistRuntimeState?.();
454
+ markWorkerSuccess(
455
+ state,
456
+ "recovery",
457
+ `${detailPrefix} released missed reveal and aborted empty cycle ${params.cycleId}`,
458
+ );
459
+ } else {
460
+ markWorkerSuccess(
461
+ state,
462
+ "recovery",
463
+ `${detailPrefix} released missed reveal for cycle ${params.cycleId}`,
464
+ );
465
+ }
466
+ scheduleWorkerNextRun(state, "recovery", RECOVERY_TICK_INTERVAL_MS);
467
+ return true;
468
+ };
469
+
177
470
  const collectPrioritizedCloseCycleIds = (params: {
178
471
  current: number;
179
472
  exactPendingCycleId?: number | null;
@@ -273,6 +566,25 @@ export function createSatRecoveryService(params: {
273
566
  backlogDetail = backlogDetail || ` ${exactPendingCycle.reason}`;
274
567
  }
275
568
  markWorkerRun(state, "recovery", `${anchor}${backlogDetail}`);
569
+ const currentSlot = exactPendingCycle
570
+ ? await withRecoveryReadTimeout("chain slot", () =>
571
+ inspectSatChainSlot(state.activeConfig),
572
+ ).catch(swallowSatReadErrorUnlessTimeout)
573
+ : null;
574
+ if (
575
+ exactPendingCycle?.stage === "submitted" &&
576
+ chainTime.chainUnixTime != null &&
577
+ (await recoverPendingCommit({
578
+ cycleId: exactPendingCycle.cycleId,
579
+ authority: activeWalletAddress,
580
+ nowSec: chainTime.chainUnixTime,
581
+ currentSlot,
582
+ anchor,
583
+ backlogDetail,
584
+ }))
585
+ ) {
586
+ return;
587
+ }
276
588
  const pendingCapitalRangeExists = hasPendingCapitalRange(
277
589
  minerCapital?.firstPendingCycleId,
278
590
  minerCapital?.lastPendingCycleId,