@fased/fased 0.1.62 → 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 (341) hide show
  1. package/CHANGELOG.md +32 -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/agents/auth-profiles/store.js +267 -31
  12. package/dist/agents/bash-tools.exec.js +10 -4
  13. package/dist/agents/current-model-catalog.js +3 -3
  14. package/dist/agents/memory-search.js +7 -1
  15. package/dist/agents/model-catalog-access.js +1 -2
  16. package/dist/agents/model-catalog-snapshot.js +1 -1
  17. package/dist/agents/model-catalog-source.js +1 -1
  18. package/dist/agents/model-metadata.js +1 -1
  19. package/dist/agents/model-selection.js +2 -28
  20. package/dist/agents/models-config.providers.js +6 -6
  21. package/dist/agents/pi-embedded-runner/compact.js +15 -7
  22. package/dist/agents/pi-embedded-runner/model.js +1 -1
  23. package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
  24. package/dist/agents/pi-embedded-runner/run.js +2 -0
  25. package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
  26. package/dist/agents/pi-tool-definition-adapter.js +16 -1
  27. package/dist/agents/pi-tools.js +2 -1
  28. package/dist/agents/sandbox/config.js +1 -1
  29. package/dist/agents/sandbox/context.js +27 -2
  30. package/dist/agents/skills/env-overrides.js +38 -28
  31. package/dist/agents/skills/trust.js +93 -0
  32. package/dist/agents/skills/workspace.js +128 -0
  33. package/dist/agents/skills-clawhub.js +36 -11
  34. package/dist/agents/skills-marketplace-scan.js +49 -0
  35. package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
  36. package/dist/agents/tools/mining-tool.js +1 -1
  37. package/dist/agents/tools/session-status-tool.js +1 -1
  38. package/dist/agents/tools/wallet-action-tool.js +172 -36
  39. package/dist/agents/tools/wallet-skill-policy.js +65 -23
  40. package/dist/agents/tools/wallet-tool.js +7 -11
  41. package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
  42. package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
  43. package/dist/auto-reply/reply/directive-handling.model.js +2 -1
  44. package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
  45. package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
  46. package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
  47. package/dist/auto-reply/reply/model-selection.js +7 -4
  48. package/dist/auto-reply/reply/session-reset-model.js +4 -4
  49. package/dist/brand.js +1 -1
  50. package/dist/build-info.json +3 -3
  51. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  52. package/dist/channel-web.js +2 -2
  53. package/dist/cli/gateway-cli/run.js +8 -0
  54. package/dist/cli/program/command-registry.js +1 -1
  55. package/dist/cli/program/register.onboard.js +2 -3
  56. package/dist/cli/program/register.wallet.js +16 -123
  57. package/dist/cli/providers-cli.js +1 -1
  58. package/dist/cli/sat-cli.js +129 -2
  59. package/dist/cli/update-cli/update-command.js +260 -11
  60. package/dist/commands/auth-choice.apply.api-providers.js +3 -3
  61. package/dist/commands/doctor-config-flow.js +1 -1
  62. package/dist/commands/doctor-legacy-config.js +2 -13
  63. package/dist/commands/model-picker.js +6 -6
  64. package/dist/commands/models/auth.js +1 -1
  65. package/dist/commands/onboard-auth.config-gateways.js +1 -1
  66. package/dist/commands/onboard-auth.credentials.js +32 -8
  67. package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
  68. package/dist/commands/onboard-non-interactive/local.js +5 -1
  69. package/dist/commands/wallet.js +568 -1911
  70. package/dist/config/config.js +2 -2
  71. package/dist/config/io.js +64 -2
  72. package/dist/config/schema.help.js +8 -7
  73. package/dist/config/schema.labels.js +5 -4
  74. package/dist/config/zod-schema.agent-runtime.js +1 -0
  75. package/dist/config/zod-schema.js +5 -0
  76. package/dist/control-ui/assets/{app-DLil9VO1.js → app-bR-fO5ty.js} +1511 -1555
  77. package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
  78. package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
  79. package/dist/control-ui/assets/{index-DdE_NIXo.js → index-ckCxHwjy.js} +3 -3
  80. package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-BgHFh0ei.js} +134 -114
  81. package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
  82. package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
  83. package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
  84. package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
  85. package/dist/control-ui/index.html +1 -1
  86. package/dist/control-ui/version.json +1 -1
  87. package/dist/daemon/systemd-system.js +56 -50
  88. package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
  89. package/dist/extensions/sat-mining/src/rpc-read.js +235 -67
  90. package/dist/extensions/sat-mining/src/sat-bond-layout.js +5 -2
  91. package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
  92. package/dist/extensions/sat-mining/src/solana-submit.js +1038 -397
  93. package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
  94. package/dist/federation/auto-connect.js +98 -8
  95. package/dist/federation/marketplace-capability-adapter.js +33 -7
  96. package/dist/federation/marketplace-delivery-outbox.js +196 -0
  97. package/dist/federation/marketplace-delivery.js +351 -215
  98. package/dist/federation/marketplace-direct-payment.js +272 -141
  99. package/dist/federation/marketplace-escrow.js +607 -249
  100. package/dist/federation/marketplace-settlement-ledger.js +352 -0
  101. package/dist/federation/offers.js +9 -7
  102. package/dist/federation/peer-auth-v2.js +529 -0
  103. package/dist/gateway/a2a-http.js +425 -96
  104. package/dist/gateway/a2a-settlement.js +259 -153
  105. package/dist/gateway/a2a-task-store.js +524 -0
  106. package/dist/gateway/auth.js +38 -2
  107. package/dist/gateway/config-reload.js +46 -33
  108. package/dist/gateway/durable-capacity.js +31 -0
  109. package/dist/gateway/federation-http.js +540 -135
  110. package/dist/gateway/federation-marketplace-run-store.js +397 -0
  111. package/dist/gateway/federation-marketplace.js +535 -230
  112. package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
  113. package/dist/gateway/security-path.js +1 -1
  114. package/dist/gateway/server-http.js +1084 -1205
  115. package/dist/gateway/server-methods/models.js +1 -1
  116. package/dist/gateway/server-methods/secrets.js +40 -0
  117. package/dist/gateway/server-methods.js +1 -2
  118. package/dist/gateway/server-reload-handlers.js +196 -66
  119. package/dist/gateway/server-runtime-config.js +1 -1
  120. package/dist/gateway/server-secrets-runtime.js +288 -0
  121. package/dist/gateway/server.impl.js +73 -42
  122. package/dist/gateway/sessions-patch.js +3 -5
  123. package/dist/index.js +4 -2
  124. package/dist/infra/fasedhub.js +64 -1
  125. package/dist/infra/local-source-paired-update.js +538 -0
  126. package/dist/infra/restart.js +41 -10
  127. package/dist/infra/update-runner.js +96 -0
  128. package/dist/light-update-status.js +11 -11
  129. package/dist/memory/backend-config.js +2 -1
  130. package/dist/memory/session-files.js +16 -2
  131. package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
  132. package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
  133. package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
  134. package/dist/plugin-sdk/{audio-preflight-Bwi2Oq03.js → audio-preflight-BYxAt775.js} +27 -27
  135. package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
  136. package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
  137. package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
  138. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  139. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  140. package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
  141. package/dist/plugin-sdk/{chunk-items-DzT4L4Ty.js → chunk-items-DIRHG2gJ.js} +1 -1
  142. package/dist/plugin-sdk/command-status.d.ts +2 -2
  143. package/dist/plugin-sdk/command-status.js +27 -27
  144. package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
  145. package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
  146. package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
  147. package/dist/plugin-sdk/{config-schema-BrkmtFxB.js → config-schema-BOT7kHb6.js} +6779 -3696
  148. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  149. package/dist/plugin-sdk/discord.d.ts +6 -6
  150. package/dist/plugin-sdk/discord.js +19 -19
  151. package/dist/plugin-sdk/file-lock.js +35 -4
  152. package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
  153. package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
  154. package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
  155. package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
  156. package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
  157. package/dist/plugin-sdk/index.d.ts +21 -39
  158. package/dist/plugin-sdk/index.js +29 -29
  159. package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
  160. package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
  161. package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
  162. package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
  163. package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
  164. package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
  165. package/dist/plugin-sdk/{monitor-M_ta2lMc.js → monitor-BCFDaqJ-.js} +31 -31
  166. package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-BgbjRiPM.js} +32 -32
  167. package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DFf87SMM.js} +27 -27
  168. package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
  169. package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
  170. package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
  171. package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-CS-9BHug.d.ts} +2 -2
  172. package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
  173. package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
  174. package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
  175. package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
  176. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  177. package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
  178. package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
  179. package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
  180. package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
  181. package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
  182. package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
  183. package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
  184. package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
  185. package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
  186. package/dist/plugin-sdk/sat-runtime.d.ts +549 -309
  187. package/dist/plugin-sdk/sat-runtime.js +29 -29
  188. package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
  189. package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
  190. package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
  191. package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
  192. package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
  193. package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
  194. package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
  195. package/dist/plugin-sdk/{slack-CxE1mfzj.js → slack-BUTt8cxK.js} +39 -39
  196. package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
  197. package/dist/plugin-sdk/slack.d.ts +6 -6
  198. package/dist/plugin-sdk/slack.js +9 -9
  199. package/dist/plugin-sdk/{sticker-cache-CGzGWu00.js → sticker-cache-D0wHVqjt.js} +3 -3
  200. package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
  201. package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
  202. package/dist/plugin-sdk/{telegram-actions-DaEcYQ8r.js → telegram-actions-CC_qN4v0.js} +30 -30
  203. package/dist/plugin-sdk/telegram.d.ts +6 -6
  204. package/dist/plugin-sdk/telegram.js +8 -8
  205. package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
  206. package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
  207. package/dist/plugin-sdk/tmp-fased-dir-xOTGlzBE.d.ts +486 -0
  208. package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-C3avNytw.d.ts} +3 -4
  209. package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
  210. package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-DWfbSAaM.d.ts} +2 -2
  211. package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
  212. package/dist/plugin-sdk/{web-CInY-lCv.js → web-BXsJ1vqe.js} +32 -32
  213. package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
  214. package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
  215. package/dist/plugin-sdk/whatsapp.d.ts +13 -13
  216. package/dist/plugin-sdk/whatsapp.js +12 -12
  217. package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
  218. package/dist/plugin-sdk/{zod-schema.providers-core-BEbNizPe.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +61 -61
  219. package/dist/providers/refresh.js +1 -1
  220. package/dist/providers/registry.js +1 -1
  221. package/dist/secrets/apply.js +1 -1
  222. package/dist/secrets/runtime.js +1 -1
  223. package/dist/wallet/external-submission-ledger.js +376 -0
  224. package/dist/wallet/legacy-embedded-keystore.js +40 -0
  225. package/dist/wallet/local-socket-signer-archive.js +30 -0
  226. package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
  227. package/dist/wallet/local-socket-signer-policy.js +166 -0
  228. package/dist/wallet/local-socket-signer-protocol.js +561 -118
  229. package/dist/wallet/native-signer-wallet-id.js +25 -0
  230. package/dist/wallet/providers/alchemy-adapter.js +3 -0
  231. package/dist/wallet/providers/local-socket-signer-adapter.js +380 -105
  232. package/dist/wallet/providers/turnkey-adapter.js +292 -34
  233. package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
  234. package/dist/wallet/signer-network-admin.js +184 -0
  235. package/dist/wallet/signer-protocol-v2.generated.js +90 -0
  236. package/dist/wallet/solana-bond-signing.js +157 -69
  237. package/dist/wallet/solana-reviewed-transaction.js +375 -0
  238. package/dist/wallet/solana-swap.js +520 -64
  239. package/dist/wallet/solana-transaction-inspection.js +106 -4
  240. package/dist/wallet/solana-trigger.js +658 -320
  241. package/dist/wallet/turnkey-reviewed-state.js +370 -0
  242. package/dist/wallet/wallet-approval-auth.js +17 -28
  243. package/dist/wallet/wallet-atomic-state.js +53 -0
  244. package/dist/wallet/wallet-canary.js +0 -1
  245. package/dist/wallet/wallet-inbound-events.js +16 -11
  246. package/dist/wallet/wallet-policy-simulation.js +1 -1
  247. package/dist/wallet/wallet-policy.js +90 -36
  248. package/dist/wallet/wallet-provider-capabilities.js +28 -4
  249. package/dist/wallet/wallet-provider-registry.js +57 -44
  250. package/dist/wallet/wallet-provider-resolver.js +62 -63
  251. package/dist/wallet/wallet-runtime-config.js +28 -41
  252. package/dist/wallet/wallet-secrets-store.js +22 -0
  253. package/dist/wallet/wallet-send-approvals.js +1891 -589
  254. package/dist/wallet/wallet-send-execution-ledger.js +292 -0
  255. package/dist/wallet/wallet-settlement-links.js +14 -13
  256. package/dist/wallet/wallet-standard-review.js +353 -0
  257. package/dist/wallet/wallet-status.js +0 -9
  258. package/dist/wallet/wallet-task-ledger.js +16 -2
  259. package/dist/web/auto-reply/heartbeat-runner.js +1 -1
  260. package/dist/web/auto-reply/monitor.js +2 -2
  261. package/dist/wizard/host-security-capability.js +14 -23
  262. package/dist/wizard/onboarding.finalize.js +63 -184
  263. package/dist/wizard/onboarding.host-security.js +117 -1367
  264. package/dist/wizard/onboarding.js +172 -217
  265. package/dist/wizard/onboarding.wallet.js +232 -785
  266. package/extensions/acpx/package.json +1 -1
  267. package/extensions/bluebubbles/package.json +1 -1
  268. package/extensions/copilot-proxy/package.json +1 -1
  269. package/extensions/diagnostics-otel/package.json +1 -1
  270. package/extensions/fased-federation/package.json +1 -1
  271. package/extensions/google-gemini-cli-auth/package.json +1 -1
  272. package/extensions/imessage/package.json +1 -1
  273. package/extensions/irc/package.json +1 -1
  274. package/extensions/line/package.json +1 -1
  275. package/extensions/llm-task/package.json +1 -1
  276. package/extensions/lobster/package.json +1 -1
  277. package/extensions/matrix/CHANGELOG.md +12 -0
  278. package/extensions/matrix/package.json +1 -1
  279. package/extensions/mattermost/package.json +1 -1
  280. package/extensions/memory-core/package.json +2 -2
  281. package/extensions/memory-lancedb/package.json +1 -1
  282. package/extensions/minimax-portal-auth/package.json +1 -1
  283. package/extensions/msteams/CHANGELOG.md +12 -0
  284. package/extensions/msteams/package.json +1 -1
  285. package/extensions/nextcloud-talk/package.json +1 -1
  286. package/extensions/nostr/CHANGELOG.md +12 -0
  287. package/extensions/nostr/package.json +1 -1
  288. package/extensions/open-prose/package.json +1 -1
  289. package/extensions/sat-mining/index.ts +498 -153
  290. package/extensions/sat-mining/package.json +1 -1
  291. package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
  292. package/extensions/sat-mining/src/audit-store.ts +50 -5
  293. package/extensions/sat-mining/src/claim-service.ts +85 -14
  294. package/extensions/sat-mining/src/config.ts +9 -0
  295. package/extensions/sat-mining/src/cycle-progress.ts +16 -8
  296. package/extensions/sat-mining/src/epoch-service.ts +9 -5
  297. package/extensions/sat-mining/src/gateway-runner.ts +21 -1
  298. package/extensions/sat-mining/src/protocol-contract.ts +45 -1
  299. package/extensions/sat-mining/src/recovery-service.ts +312 -0
  300. package/extensions/sat-mining/src/round-watcher.ts +391 -81
  301. package/extensions/sat-mining/src/rpc-read.ts +330 -89
  302. package/extensions/sat-mining/src/runtime.ts +14 -0
  303. package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
  304. package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
  305. package/extensions/sat-mining/src/solana-submit.ts +1199 -428
  306. package/extensions/sat-mining/src/submission-ledger.ts +433 -0
  307. package/extensions/signal/package.json +1 -1
  308. package/extensions/synology-chat/package.json +1 -1
  309. package/extensions/tlon/package.json +1 -1
  310. package/extensions/twitch/CHANGELOG.md +12 -0
  311. package/extensions/twitch/package.json +1 -1
  312. package/extensions/voice-call/CHANGELOG.md +12 -0
  313. package/extensions/voice-call/package.json +1 -1
  314. package/extensions/zalo/CHANGELOG.md +12 -0
  315. package/extensions/zalo/package.json +1 -1
  316. package/extensions/zalouser/CHANGELOG.md +12 -0
  317. package/extensions/zalouser/package.json +1 -1
  318. package/install.sh +4955 -0
  319. package/package.json +23 -5
  320. package/scripts/fased-host-updater.mjs +1421 -0
  321. package/scripts/fased-host-updaterctl.mjs +186 -0
  322. package/scripts/fased-managed-service.sh +36 -0
  323. package/scripts/fased-managed-updater.mjs +3065 -156
  324. package/scripts/fased-signer-enroll-hosting.sh +275 -0
  325. package/scripts/fased-signer-network-hosting.sh +143 -0
  326. package/scripts/fased-signer-owner-policy.mjs +1430 -0
  327. package/scripts/fased-signer-policy-hosting.sh +50 -0
  328. package/scripts/fased-signer-policy-local.sh +26 -0
  329. package/scripts/hosted-release-manifest.mjs +185 -0
  330. package/scripts/install-fased-signerd.sh +183 -108
  331. package/scripts/install-managed-runtime.mjs +212 -10
  332. package/scripts/managed-runtime-layout.mjs +75 -3
  333. package/scripts/migrate-hosted-signer-v2.mjs +58 -0
  334. package/scripts/start-managed.sh +169 -360
  335. package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
  336. package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
  337. package/dist/wallet/local-socket-signer-broker.js +0 -224
  338. package/dist/wallet/local-socket-signer-custody.js +0 -42
  339. package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
  340. package/dist/wallet/providers/privy-adapter.js +0 -80
  341. package/dist/wallet/wallet-custody.js +0 -1836
@@ -0,0 +1,433 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { resolveStateDir, withFileLock, type FileLockOptions } from "fased/plugin-sdk/sat-runtime";
5
+
6
+ export type SatSubmissionSignerState =
7
+ | "prepared"
8
+ | "reserved"
9
+ | "broadcast"
10
+ | "confirmed"
11
+ | "failed"
12
+ | "unknown";
13
+
14
+ export type SatSubmissionLease = {
15
+ owner: string;
16
+ pid: number;
17
+ acquiredAt: string;
18
+ expiresAt: string;
19
+ };
20
+
21
+ export type SatSubmissionRecord = {
22
+ requestId: string;
23
+ workflowId: string;
24
+ operationKey: string;
25
+ intentDigest: string;
26
+ walletId: string;
27
+ action: string;
28
+ state: SatSubmissionSignerState;
29
+ signature?: string;
30
+ error?: string;
31
+ attempts: number;
32
+ createdAt: string;
33
+ updatedAt: string;
34
+ lease?: SatSubmissionLease;
35
+ };
36
+
37
+ type SatSubmissionLedgerFile = {
38
+ version: 1;
39
+ records: Record<string, SatSubmissionRecord>;
40
+ };
41
+
42
+ export type SatSubmissionClaim = {
43
+ record: SatSubmissionRecord;
44
+ created: boolean;
45
+ claimed: boolean;
46
+ owner: string;
47
+ };
48
+
49
+ const DEFAULT_LOCK_OPTIONS: FileLockOptions = {
50
+ retries: {
51
+ retries: 120,
52
+ factor: 1.15,
53
+ minTimeout: 10,
54
+ maxTimeout: 100,
55
+ randomize: true,
56
+ },
57
+ stale: 120_000,
58
+ };
59
+
60
+ const localLedgerWriteChains = new Map<string, Promise<void>>();
61
+
62
+ async function withSatSubmissionLedgerLock<T>(
63
+ filePath: string,
64
+ task: () => Promise<T>,
65
+ ): Promise<T> {
66
+ const previous = localLedgerWriteChains.get(filePath) ?? Promise.resolve();
67
+ let releaseLocal!: () => void;
68
+ const localGate = new Promise<void>((resolve) => {
69
+ releaseLocal = resolve;
70
+ });
71
+ const current = previous.catch(() => undefined).then(async () => await localGate);
72
+ localLedgerWriteChains.set(filePath, current);
73
+ await previous.catch(() => undefined);
74
+ try {
75
+ return await withFileLock(filePath, DEFAULT_LOCK_OPTIONS, task);
76
+ } finally {
77
+ releaseLocal();
78
+ void current.finally(() => {
79
+ if (localLedgerWriteChains.get(filePath) === current) {
80
+ localLedgerWriteChains.delete(filePath);
81
+ }
82
+ });
83
+ }
84
+ }
85
+
86
+ function sha256(value: string): string {
87
+ return createHash("sha256").update(value).digest("hex");
88
+ }
89
+
90
+ function canonicalize(value: unknown): unknown {
91
+ if (Array.isArray(value)) {
92
+ return value.map((entry) => canonicalize(entry));
93
+ }
94
+ if (value && typeof value === "object") {
95
+ return Object.fromEntries(
96
+ Object.entries(value as Record<string, unknown>)
97
+ .filter(([, entry]) => entry !== undefined)
98
+ .sort(([left], [right]) => left.localeCompare(right))
99
+ .map(([key, entry]) => [key, canonicalize(entry)]),
100
+ );
101
+ }
102
+ if (typeof value === "bigint") {
103
+ return value.toString();
104
+ }
105
+ return value;
106
+ }
107
+
108
+ export function digestSatSubmissionIntent(value: unknown): string {
109
+ return `sha256:${sha256(JSON.stringify(canonicalize(value)))}`;
110
+ }
111
+
112
+ export function buildSatSubmissionOperationKey(intent: {
113
+ action?: unknown;
114
+ keys?: unknown;
115
+ instructions?: unknown;
116
+ }): string {
117
+ const action =
118
+ typeof intent.action === "string" && intent.action.trim() ? intent.action.trim() : "sat";
119
+ const accountShape = Array.isArray(intent.instructions)
120
+ ? intent.instructions.map((instruction) => {
121
+ const candidate = instruction as { action?: unknown; keys?: unknown };
122
+ return { action: candidate.action, keys: candidate.keys };
123
+ })
124
+ : intent.keys;
125
+ return `${action}:${sha256(JSON.stringify(canonicalize(accountShape))).slice(0, 24)}`;
126
+ }
127
+
128
+ function normalizeStateKey(value: string): string {
129
+ const normalized = value.trim().replace(/[^a-zA-Z0-9._-]+/g, "_");
130
+ return normalized || "unattached";
131
+ }
132
+
133
+ export function resolveSatSubmissionLedgerPath(params: {
134
+ walletId: string;
135
+ env?: NodeJS.ProcessEnv;
136
+ }): string {
137
+ const env = params.env ?? process.env;
138
+ return path.join(
139
+ resolveStateDir(env),
140
+ "sat-mining",
141
+ "wallets",
142
+ normalizeStateKey(params.walletId),
143
+ "submission-ledger.json",
144
+ );
145
+ }
146
+
147
+ function emptyLedger(): SatSubmissionLedgerFile {
148
+ return { version: 1, records: {} };
149
+ }
150
+
151
+ function normalizeRecord(value: unknown): SatSubmissionRecord | null {
152
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
153
+ return null;
154
+ }
155
+ const record = value as Partial<SatSubmissionRecord>;
156
+ if (
157
+ typeof record.requestId !== "string" ||
158
+ typeof record.workflowId !== "string" ||
159
+ typeof record.operationKey !== "string" ||
160
+ !/^sha256:[0-9a-f]{64}$/u.test(String(record.intentDigest ?? "")) ||
161
+ typeof record.walletId !== "string" ||
162
+ typeof record.action !== "string" ||
163
+ !["prepared", "reserved", "broadcast", "confirmed", "failed", "unknown"].includes(
164
+ String(record.state ?? ""),
165
+ )
166
+ ) {
167
+ return null;
168
+ }
169
+ return record as SatSubmissionRecord;
170
+ }
171
+
172
+ async function readLedger(filePath: string): Promise<SatSubmissionLedgerFile> {
173
+ try {
174
+ const parsed = JSON.parse(
175
+ await fs.readFile(filePath, "utf8"),
176
+ ) as Partial<SatSubmissionLedgerFile>;
177
+ if (parsed.version !== 1 || !parsed.records || typeof parsed.records !== "object") {
178
+ throw new Error(`invalid SAT submission ledger format at ${filePath}`);
179
+ }
180
+ const records: Record<string, SatSubmissionRecord> = {};
181
+ for (const [requestId, raw] of Object.entries(parsed.records)) {
182
+ const record = normalizeRecord(raw);
183
+ if (!record || record.requestId !== requestId) {
184
+ throw new Error(`invalid SAT submission ledger record ${requestId}`);
185
+ }
186
+ records[requestId] = record;
187
+ }
188
+ return { version: 1, records };
189
+ } catch (error) {
190
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") {
191
+ return emptyLedger();
192
+ }
193
+ throw error;
194
+ }
195
+ }
196
+
197
+ async function writeLedger(filePath: string, ledger: SatSubmissionLedgerFile): Promise<void> {
198
+ await fs.mkdir(path.dirname(filePath), { recursive: true, mode: 0o700 });
199
+ const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;
200
+ const handle = await fs.open(tempPath, "wx", 0o600);
201
+ try {
202
+ await handle.writeFile(`${JSON.stringify(ledger, null, 2)}\n`, "utf8");
203
+ await handle.sync();
204
+ } finally {
205
+ await handle.close();
206
+ }
207
+ try {
208
+ await fs.rename(tempPath, filePath);
209
+ const directory = await fs.open(path.dirname(filePath), "r");
210
+ try {
211
+ await directory.sync();
212
+ } finally {
213
+ await directory.close();
214
+ }
215
+ } catch (error) {
216
+ await fs.rm(tempPath, { force: true }).catch(() => undefined);
217
+ throw error;
218
+ }
219
+ }
220
+
221
+ function leaseDurationMs(env: NodeJS.ProcessEnv): number {
222
+ const configured = Number(env.FASED_SAT_SUBMISSION_LEASE_MS ?? "");
223
+ if (Number.isFinite(configured) && configured >= 50 && configured <= 300_000) {
224
+ return Math.floor(configured);
225
+ }
226
+ return 60_000;
227
+ }
228
+
229
+ function isPidAlive(pid: number): boolean {
230
+ if (!Number.isSafeInteger(pid) || pid <= 0) {
231
+ return false;
232
+ }
233
+ try {
234
+ process.kill(pid, 0);
235
+ return true;
236
+ } catch (error) {
237
+ return (error as NodeJS.ErrnoException).code === "EPERM";
238
+ }
239
+ }
240
+
241
+ function leaseIsLive(lease: SatSubmissionLease | undefined, now = Date.now()): boolean {
242
+ if (!lease || Date.parse(lease.expiresAt) <= now) {
243
+ return false;
244
+ }
245
+ return lease.pid === process.pid || isPidAlive(lease.pid);
246
+ }
247
+
248
+ function assertStateTransition(
249
+ requestId: string,
250
+ current: SatSubmissionSignerState,
251
+ next: SatSubmissionSignerState,
252
+ ): void {
253
+ const allowed: Record<SatSubmissionSignerState, ReadonlySet<SatSubmissionSignerState>> = {
254
+ prepared: new Set(["prepared", "reserved", "broadcast", "confirmed", "failed", "unknown"]),
255
+ reserved: new Set(["reserved", "broadcast", "confirmed", "failed", "unknown"]),
256
+ broadcast: new Set(["broadcast", "confirmed", "failed", "unknown"]),
257
+ unknown: new Set(["broadcast", "confirmed", "failed", "unknown"]),
258
+ confirmed: new Set(["confirmed"]),
259
+ failed: new Set(["failed"]),
260
+ };
261
+ if (!allowed[current].has(next)) {
262
+ throw new Error(`SAT submission ${requestId} cannot move from ${current} back to ${next}`);
263
+ }
264
+ }
265
+
266
+ export function buildSatSubmissionRequestId(params: {
267
+ walletId: string;
268
+ workflowId: string;
269
+ operationKey: string;
270
+ }): string {
271
+ const digest = sha256(
272
+ JSON.stringify([
273
+ "fased-sat-submission-v1",
274
+ params.walletId,
275
+ params.workflowId,
276
+ params.operationKey,
277
+ ]),
278
+ );
279
+ return `sat-v2-${digest.slice(0, 48)}`;
280
+ }
281
+
282
+ export async function claimSatSubmission(params: {
283
+ walletId: string;
284
+ workflowId: string;
285
+ operationKey: string;
286
+ intentDigest: string;
287
+ action: string;
288
+ env?: NodeJS.ProcessEnv;
289
+ owner?: string;
290
+ }): Promise<SatSubmissionClaim> {
291
+ const env = params.env ?? process.env;
292
+ const filePath = resolveSatSubmissionLedgerPath({ walletId: params.walletId, env });
293
+ const requestId = buildSatSubmissionRequestId(params);
294
+ const owner = params.owner ?? `${process.pid}:${randomUUID()}`;
295
+ return await withSatSubmissionLedgerLock(filePath, async () => {
296
+ const ledger = await readLedger(filePath);
297
+ const existing = ledger.records[requestId];
298
+ if (existing) {
299
+ if (
300
+ existing.intentDigest !== params.intentDigest ||
301
+ existing.walletId !== params.walletId ||
302
+ existing.workflowId !== params.workflowId ||
303
+ existing.operationKey !== params.operationKey
304
+ ) {
305
+ throw new Error(
306
+ `SAT idempotency collision for ${requestId}: the workflow key is already bound to a different immutable intent digest`,
307
+ );
308
+ }
309
+ if (leaseIsLive(existing.lease) && existing.lease?.owner !== owner) {
310
+ return { record: existing, created: false, claimed: false, owner };
311
+ }
312
+ const now = new Date().toISOString();
313
+ existing.lease = {
314
+ owner,
315
+ pid: process.pid,
316
+ acquiredAt: now,
317
+ expiresAt: new Date(Date.now() + leaseDurationMs(env)).toISOString(),
318
+ };
319
+ existing.attempts += 1;
320
+ existing.updatedAt = now;
321
+ await writeLedger(filePath, ledger);
322
+ return { record: existing, created: false, claimed: true, owner };
323
+ }
324
+ const now = new Date().toISOString();
325
+ const record: SatSubmissionRecord = {
326
+ requestId,
327
+ workflowId: params.workflowId,
328
+ operationKey: params.operationKey,
329
+ intentDigest: params.intentDigest,
330
+ walletId: params.walletId,
331
+ action: params.action,
332
+ state: "prepared",
333
+ attempts: 1,
334
+ createdAt: now,
335
+ updatedAt: now,
336
+ lease: {
337
+ owner,
338
+ pid: process.pid,
339
+ acquiredAt: now,
340
+ expiresAt: new Date(Date.now() + leaseDurationMs(env)).toISOString(),
341
+ },
342
+ };
343
+ ledger.records[requestId] = record;
344
+ await writeLedger(filePath, ledger);
345
+ return { record, created: true, claimed: true, owner };
346
+ });
347
+ }
348
+
349
+ export async function readSatSubmission(params: {
350
+ walletId: string;
351
+ requestId: string;
352
+ env?: NodeJS.ProcessEnv;
353
+ }): Promise<SatSubmissionRecord | null> {
354
+ const filePath = resolveSatSubmissionLedgerPath(params);
355
+ return await withSatSubmissionLedgerLock(filePath, async () => {
356
+ const ledger = await readLedger(filePath);
357
+ return ledger.records[params.requestId] ?? null;
358
+ });
359
+ }
360
+
361
+ export async function updateSatSubmission(params: {
362
+ walletId: string;
363
+ requestId: string;
364
+ intentDigest: string;
365
+ state: SatSubmissionSignerState;
366
+ signature?: string;
367
+ error?: string;
368
+ owner?: string;
369
+ releaseLease?: boolean;
370
+ env?: NodeJS.ProcessEnv;
371
+ }): Promise<SatSubmissionRecord> {
372
+ const filePath = resolveSatSubmissionLedgerPath(params);
373
+ return await withSatSubmissionLedgerLock(filePath, async () => {
374
+ const ledger = await readLedger(filePath);
375
+ const record = ledger.records[params.requestId];
376
+ if (!record) {
377
+ throw new Error(`SAT submission ${params.requestId} is missing from its durable ledger`);
378
+ }
379
+ if (record.intentDigest !== params.intentDigest) {
380
+ throw new Error(`SAT submission ${params.requestId} intent digest changed during execution`);
381
+ }
382
+ if (params.owner && record.lease?.owner !== params.owner) {
383
+ throw new Error(
384
+ `SAT submission ${params.requestId} lease ownership changed during execution`,
385
+ );
386
+ }
387
+ if (record.signature && params.signature && record.signature !== params.signature) {
388
+ throw new Error(
389
+ `SAT submission ${params.requestId} returned a different transaction signature`,
390
+ );
391
+ }
392
+ assertStateTransition(params.requestId, record.state, params.state);
393
+ record.state = params.state;
394
+ if (params.signature !== undefined) {
395
+ record.signature = params.signature;
396
+ }
397
+ if (params.error !== undefined) {
398
+ record.error = params.error;
399
+ } else if (params.state === "confirmed") {
400
+ delete record.error;
401
+ }
402
+ if (params.releaseLease) {
403
+ delete record.lease;
404
+ }
405
+ record.updatedAt = new Date().toISOString();
406
+ await writeLedger(filePath, ledger);
407
+ return record;
408
+ });
409
+ }
410
+
411
+ export async function waitForSatSubmissionLease(params: {
412
+ walletId: string;
413
+ requestId: string;
414
+ env?: NodeJS.ProcessEnv;
415
+ timeoutMs?: number;
416
+ }): Promise<SatSubmissionRecord> {
417
+ const timeoutAt = Date.now() + Math.max(100, params.timeoutMs ?? 65_000);
418
+ for (;;) {
419
+ const record = await readSatSubmission(params);
420
+ if (!record) {
421
+ throw new Error(`SAT submission ${params.requestId} disappeared while waiting for its lease`);
422
+ }
423
+ if (!leaseIsLive(record.lease)) {
424
+ return record;
425
+ }
426
+ if (Date.now() >= timeoutAt) {
427
+ throw new Error(
428
+ `SAT submission ${params.requestId} is already executing in another process; retry the same idempotency key`,
429
+ );
430
+ }
431
+ await new Promise((resolve) => setTimeout(resolve, 25));
432
+ }
433
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/signal",
3
- "version": "0.1.62",
3
+ "version": "0.1.64",
4
4
  "private": true,
5
5
  "description": "FasedAgent Signal channel plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/synology-chat",
3
- "version": "0.1.62",
3
+ "version": "0.1.64",
4
4
  "description": "Synology Chat channel plugin for FasedAgent",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/tlon",
3
- "version": "0.1.62",
3
+ "version": "0.1.64",
4
4
  "description": "FasedAgent Tlon/Urbit channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.64
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core FasedAgent release numbers.
8
+
9
+ ## 0.1.63
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core FasedAgent release numbers.
14
+
3
15
  ## 0.1.62
4
16
 
5
17
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/twitch",
3
- "version": "0.1.62",
3
+ "version": "0.1.64",
4
4
  "description": "FasedAgent Twitch channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.64
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core FasedAgent release numbers.
8
+
9
+ ## 0.1.63
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core FasedAgent release numbers.
14
+
3
15
  ## 0.1.62
4
16
 
5
17
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/voice-call",
3
- "version": "0.1.62",
3
+ "version": "0.1.64",
4
4
  "description": "FasedAgent voice-call plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.64
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core FasedAgent release numbers.
8
+
9
+ ## 0.1.63
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core FasedAgent release numbers.
14
+
3
15
  ## 0.1.62
4
16
 
5
17
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/zalo",
3
- "version": "0.1.62",
3
+ "version": "0.1.64",
4
4
  "description": "FasedAgent Zalo channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.64
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core FasedAgent release numbers.
8
+
9
+ ## 0.1.63
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core FasedAgent release numbers.
14
+
3
15
  ## 0.1.62
4
16
 
5
17
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/zalouser",
3
- "version": "0.1.62",
3
+ "version": "0.1.64",
4
4
  "description": "FasedAgent Zalo Personal Account plugin via zca-cli",
5
5
  "type": "module",
6
6
  "dependencies": {