@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,375 @@
1
+ import { fetchSolanaMintInfoViaRpc, fetchSolanaRpc } from "./solana-assets.js";
2
+ import { WalletProviderError } from "./wallet-provider-adapter.js";
3
+ import { buildCreateAssociatedTokenAccountIdempotentInstruction, buildTransferCheckedInstruction, deriveAssociatedTokenAddress, toTransactionInstruction } from "./solana-spl-transfer.js";
4
+ import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
5
+ import { PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js";
6
+
7
+ //#region src/wallet/solana-reviewed-transaction.ts
8
+ const MEMO_PROGRAM_ID = new PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr");
9
+ const MAX_TRANSACTION_BYTES = 1232;
10
+ const MAX_MEMO_BYTES = 256;
11
+ const MAX_U64 = (1n << 64n) - 1n;
12
+ const INTENT_DOMAIN = "FasedAgent reviewed Solana transaction v1\0";
13
+ const REQUEST_DOMAIN = "FasedAgent reviewed Solana request v1\0";
14
+ function invalid(message) {
15
+ return new WalletProviderError({
16
+ code: "wallet_provider_invalid_config",
17
+ message
18
+ });
19
+ }
20
+ function unavailable(message) {
21
+ return new WalletProviderError({
22
+ code: "wallet_provider_unavailable",
23
+ message,
24
+ retryable: false
25
+ });
26
+ }
27
+ function parsePositiveAmount(raw) {
28
+ const value = String(raw ?? "").trim();
29
+ if (!/^\d+$/.test(value)) {
30
+ throw invalid("reviewed Solana transfer amount must be a positive base-unit integer");
31
+ }
32
+ const amount = BigInt(value);
33
+ if (amount <= 0n || amount > MAX_U64) {
34
+ throw invalid("reviewed Solana transfer amount is outside the supported u64 range");
35
+ }
36
+ return amount;
37
+ }
38
+ function parsePublicKey(value, label) {
39
+ try {
40
+ return new PublicKey(String(value ?? "").trim());
41
+ } catch {
42
+ throw invalid(`${label} is not a valid Solana address`);
43
+ }
44
+ }
45
+ function normalizeRpcUrl(rpcUrl) {
46
+ const value = rpcUrl.trim();
47
+ let parsed;
48
+ try {
49
+ parsed = new URL(value);
50
+ } catch {
51
+ throw invalid("Solana RPC URL is invalid");
52
+ }
53
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
54
+ throw invalid("Solana RPC URL must use HTTPS or HTTP");
55
+ }
56
+ return parsed.toString();
57
+ }
58
+ async function fetchStrictSolanaRpc(rpcUrl, method, params) {
59
+ let response;
60
+ try {
61
+ response = await fetch(normalizeRpcUrl(rpcUrl), {
62
+ method: "POST",
63
+ headers: { "Content-Type": "application/json" },
64
+ body: JSON.stringify({
65
+ jsonrpc: "2.0",
66
+ id: 1,
67
+ method,
68
+ params
69
+ })
70
+ });
71
+ } catch {
72
+ throw unavailable(`Solana RPC ${method} reconciliation request failed`);
73
+ }
74
+ if (!response.ok) {
75
+ throw unavailable(`Solana RPC ${method} reconciliation request failed`);
76
+ }
77
+ let payload;
78
+ try {
79
+ payload = await response.json();
80
+ } catch {
81
+ throw unavailable(`Solana RPC ${method} reconciliation returned invalid JSON`);
82
+ }
83
+ if (payload.error != null || !("result" in payload)) {
84
+ throw unavailable(`Solana RPC ${method} reconciliation returned an error`);
85
+ }
86
+ return payload.result;
87
+ }
88
+ function canonicalIntent(params) {
89
+ return JSON.stringify({
90
+ version: 1,
91
+ chain: "solana",
92
+ signer: params.signer,
93
+ to: String(params.request.to ?? "").trim(),
94
+ amount: String(params.request.amount ?? "").trim(),
95
+ mint: String(params.request.program ?? params.request.tokenMint ?? "").trim() || null,
96
+ memo: String(params.request.memo ?? "").trim() || null,
97
+ messageBase64: params.messageBase64
98
+ });
99
+ }
100
+ function canonicalRequest(params) {
101
+ return JSON.stringify({
102
+ version: 1,
103
+ chain: params.request.chain,
104
+ signer: params.signer,
105
+ to: String(params.request.to ?? "").trim(),
106
+ amount: String(params.request.amount ?? "").trim(),
107
+ mint: String(params.request.program ?? params.request.tokenMint ?? "").trim() || null,
108
+ memo: String(params.request.memo ?? "").trim() || null
109
+ });
110
+ }
111
+ function computeReviewedSolanaRequestDigest(params) {
112
+ return createHash("sha256").update(REQUEST_DOMAIN, "utf8").update(canonicalRequest(params), "utf8").digest("base64url");
113
+ }
114
+ function computeReviewedSolanaIntentDigest(params) {
115
+ return createHash("sha256").update(INTENT_DOMAIN, "utf8").update(canonicalIntent(params), "utf8").digest("base64url");
116
+ }
117
+ async function buildTransferInstructions(params) {
118
+ const mint = String(params.request.program ?? params.request.tokenMint ?? "").trim();
119
+ if (!mint) {
120
+ if (params.amount > BigInt(Number.MAX_SAFE_INTEGER)) {
121
+ throw invalid("native SOL transfer exceeds JavaScript safe integer range");
122
+ }
123
+ return [SystemProgram.transfer({
124
+ fromPubkey: params.signer,
125
+ toPubkey: params.destination,
126
+ lamports: Number(params.amount)
127
+ })];
128
+ }
129
+ parsePublicKey(mint, "SPL mint");
130
+ const mintInfo = await fetchSolanaMintInfoViaRpc({
131
+ rpcUrl: params.rpcUrl,
132
+ mint
133
+ });
134
+ if (!mintInfo) {
135
+ throw unavailable("Solana RPC could not resolve the SPL mint owner and decimals");
136
+ }
137
+ const sourceTokenAccount = await deriveAssociatedTokenAddress({
138
+ owner: params.signer.toBase58(),
139
+ mint,
140
+ tokenProgramId: mintInfo.tokenProgramId
141
+ });
142
+ const destinationTokenAccount = await deriveAssociatedTokenAddress({
143
+ owner: params.destination.toBase58(),
144
+ mint,
145
+ tokenProgramId: mintInfo.tokenProgramId
146
+ });
147
+ return [await toTransactionInstruction(await buildCreateAssociatedTokenAccountIdempotentInstruction({
148
+ payer: params.signer.toBase58(),
149
+ owner: params.destination.toBase58(),
150
+ mint,
151
+ tokenProgramId: mintInfo.tokenProgramId
152
+ })), await toTransactionInstruction(buildTransferCheckedInstruction({
153
+ sourceTokenAccount,
154
+ mint,
155
+ destinationTokenAccount,
156
+ authority: params.signer.toBase58(),
157
+ amountRaw: params.amount.toString(),
158
+ decimals: mintInfo.decimals,
159
+ tokenProgramId: mintInfo.tokenProgramId
160
+ }))];
161
+ }
162
+ function appendMemo(transaction, memo, signer) {
163
+ const normalized = String(memo ?? "").trim();
164
+ if (!normalized) {
165
+ return;
166
+ }
167
+ const bytes = Buffer.from(normalized, "utf8");
168
+ if (bytes.length > MAX_MEMO_BYTES) {
169
+ throw invalid(`Solana memo must not exceed ${MAX_MEMO_BYTES} UTF-8 bytes`);
170
+ }
171
+ transaction.add(new TransactionInstruction({
172
+ programId: MEMO_PROGRAM_ID,
173
+ keys: [{
174
+ pubkey: signer,
175
+ isSigner: true,
176
+ isWritable: false
177
+ }],
178
+ data: bytes
179
+ }));
180
+ }
181
+ async function buildReviewedSolanaTransaction(params) {
182
+ if (params.request.chain !== "solana") {
183
+ throw new WalletProviderError({
184
+ code: "wallet_provider_unsupported_chain",
185
+ message: "reviewed transaction builder supports Solana only"
186
+ });
187
+ }
188
+ const untypedSerializedTransaction = params.request.serializedTxBase64;
189
+ if (typeof untypedSerializedTransaction === "string" && untypedSerializedTransaction.trim()) {
190
+ throw invalid("reviewed SOL/SPL sends do not accept caller-supplied serialized transactions");
191
+ }
192
+ const rpcUrl = normalizeRpcUrl(params.rpcUrl);
193
+ const signer = parsePublicKey(params.signerAddress, "signer");
194
+ const destination = parsePublicKey(params.request.to, "destination");
195
+ const amount = parsePositiveAmount(params.request.amount);
196
+ const latest = await fetchSolanaRpc(rpcUrl, "getLatestBlockhash", [{ commitment: "confirmed" }]);
197
+ const recentBlockhash = String(latest?.value?.blockhash ?? "").trim();
198
+ const lastValidBlockHeight = Number(latest?.value?.lastValidBlockHeight);
199
+ if (!recentBlockhash || !Number.isSafeInteger(lastValidBlockHeight)) {
200
+ throw unavailable("Solana RPC did not return a valid recent blockhash");
201
+ }
202
+ const transaction = new Transaction({
203
+ feePayer: signer,
204
+ recentBlockhash
205
+ });
206
+ transaction.add(...await buildTransferInstructions({
207
+ request: params.request,
208
+ rpcUrl,
209
+ signer,
210
+ destination,
211
+ amount
212
+ }));
213
+ appendMemo(transaction, params.request.memo, signer);
214
+ const unsignedBytes = transaction.serialize({
215
+ requireAllSignatures: false,
216
+ verifySignatures: false
217
+ });
218
+ if (unsignedBytes.length > MAX_TRANSACTION_BYTES) {
219
+ throw invalid("reviewed Solana transaction exceeds the network packet limit");
220
+ }
221
+ const unsignedTxBase64 = unsignedBytes.toString("base64");
222
+ const messageBase64 = transaction.serializeMessage().toString("base64");
223
+ const simulation = await fetchSolanaRpc(rpcUrl, "simulateTransaction", [unsignedTxBase64, {
224
+ encoding: "base64",
225
+ commitment: "confirmed",
226
+ sigVerify: false,
227
+ replaceRecentBlockhash: false
228
+ }]);
229
+ if (!simulation?.value || simulation.value.err != null) {
230
+ throw unavailable("reviewed Solana transaction simulation failed");
231
+ }
232
+ return {
233
+ unsignedTxBase64,
234
+ messageBase64,
235
+ intentDigest: computeReviewedSolanaIntentDigest({
236
+ request: params.request,
237
+ signer: signer.toBase58(),
238
+ messageBase64
239
+ }),
240
+ signer: signer.toBase58(),
241
+ recentBlockhash,
242
+ lastValidBlockHeight,
243
+ simulation: {
244
+ ok: true,
245
+ ...Number.isFinite(simulation.value.unitsConsumed) ? { unitsConsumed: simulation.value.unitsConsumed } : {}
246
+ }
247
+ };
248
+ }
249
+ function encodeBase58(bytes) {
250
+ if (bytes.length === 0) {
251
+ return "";
252
+ }
253
+ const digits = [0];
254
+ for (const byte of bytes) {
255
+ let carry = byte;
256
+ for (let index = 0; index < digits.length; index += 1) {
257
+ const value = digits[index] * 256 + carry;
258
+ digits[index] = value % 58;
259
+ carry = Math.floor(value / 58);
260
+ }
261
+ while (carry > 0) {
262
+ digits.push(carry % 58);
263
+ carry = Math.floor(carry / 58);
264
+ }
265
+ }
266
+ let output = "";
267
+ for (const byte of bytes) {
268
+ if (byte !== 0) {
269
+ break;
270
+ }
271
+ output += "1";
272
+ }
273
+ const alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
274
+ for (let index = digits.length - 1; index >= 0; index -= 1) {
275
+ output += alphabet[digits[index]];
276
+ }
277
+ return output;
278
+ }
279
+ function validateReviewedSolanaSignedTransaction(params) {
280
+ let unsignedTransaction;
281
+ let signedTransaction;
282
+ let signedBytes;
283
+ try {
284
+ const unsignedBytes = Buffer.from(params.unsignedTxBase64, "base64");
285
+ signedBytes = Buffer.from(params.signedTxBase64, "base64");
286
+ if (unsignedBytes.length === 0 || signedBytes.length === 0) {
287
+ throw new Error("empty transaction");
288
+ }
289
+ if (signedBytes.length > MAX_TRANSACTION_BYTES) {
290
+ throw new Error("transaction exceeds packet limit");
291
+ }
292
+ unsignedTransaction = Transaction.from(unsignedBytes);
293
+ signedTransaction = Transaction.from(signedBytes);
294
+ } catch {
295
+ throw invalid("wallet returned an invalid signed Solana transaction");
296
+ }
297
+ const expectedMessage = unsignedTransaction.serializeMessage();
298
+ const actualMessage = signedTransaction.serializeMessage();
299
+ if (expectedMessage.length !== actualMessage.length || !timingSafeEqual(expectedMessage, actualMessage)) {
300
+ throw invalid("wallet changed the reviewed Solana transaction intent");
301
+ }
302
+ const expectedSigner = parsePublicKey(params.signerAddress, "signer");
303
+ if (!signedTransaction.feePayer?.equals(expectedSigner)) {
304
+ throw invalid("wallet signed with a different Solana fee payer");
305
+ }
306
+ const signerEntry = signedTransaction.signatures.find((entry) => entry.publicKey.equals(expectedSigner));
307
+ if (!signerEntry?.signature || !signedTransaction.verifySignatures(true)) {
308
+ throw invalid("wallet did not return a valid signature for the reviewed account");
309
+ }
310
+ return {
311
+ signedBytes,
312
+ txHash: encodeBase58(signerEntry.signature)
313
+ };
314
+ }
315
+ async function broadcastReviewedSolanaTransaction(params) {
316
+ const rpcUrl = normalizeRpcUrl(params.rpcUrl);
317
+ const txHash = await fetchSolanaRpc(rpcUrl, "sendTransaction", [params.signedTxBase64, {
318
+ encoding: "base64",
319
+ skipPreflight: false,
320
+ preflightCommitment: "confirmed",
321
+ maxRetries: 0
322
+ }]);
323
+ if (!txHash) {
324
+ throw new WalletProviderError({
325
+ code: "wallet_provider_ambiguous",
326
+ message: `Solana broadcast result is unknown; reconcile signature ${params.expectedTxHash} before any new send`,
327
+ retryable: false
328
+ });
329
+ }
330
+ if (txHash !== params.expectedTxHash) {
331
+ throw unavailable("Solana RPC returned a transaction signature that did not match the signed payload");
332
+ }
333
+ return txHash;
334
+ }
335
+ async function reconcileReviewedSolanaTransaction(params) {
336
+ const expectedTxHash = params.expectedTxHash.trim();
337
+ if (!expectedTxHash) {
338
+ throw invalid("Solana reconciliation requires the exact transaction signature");
339
+ }
340
+ if (!Number.isSafeInteger(params.lastValidBlockHeight) || params.lastValidBlockHeight < 0) {
341
+ throw invalid("Solana reconciliation requires a valid last block height");
342
+ }
343
+ const statuses = await fetchStrictSolanaRpc(params.rpcUrl, "getSignatureStatuses", [[expectedTxHash], { searchTransactionHistory: true }]);
344
+ const status = Array.isArray(statuses?.value) ? statuses.value[0] : undefined;
345
+ if (status) {
346
+ if (status.err != null) {
347
+ return {
348
+ state: "failed",
349
+ reason: "Solana reported a terminal transaction error for the reviewed signature"
350
+ };
351
+ }
352
+ const confirmationStatus = status.confirmationStatus === "confirmed" || status.confirmationStatus === "finalized" ? status.confirmationStatus : "processed";
353
+ return {
354
+ state: "landed",
355
+ confirmationStatus
356
+ };
357
+ }
358
+ const blockHeight = await fetchStrictSolanaRpc(params.rpcUrl, "getBlockHeight", [{ commitment: "confirmed" }]);
359
+ if (!Number.isSafeInteger(blockHeight) || blockHeight < 0) {
360
+ throw unavailable("Solana RPC returned an invalid block height during reconciliation");
361
+ }
362
+ return blockHeight > params.lastValidBlockHeight ? {
363
+ state: "expired",
364
+ blockHeight
365
+ } : {
366
+ state: "pending",
367
+ blockHeight
368
+ };
369
+ }
370
+ function newReviewedSolanaPreparedId() {
371
+ return randomBytes(24).toString("base64url");
372
+ }
373
+
374
+ //#endregion
375
+ export { broadcastReviewedSolanaTransaction, buildReviewedSolanaTransaction, computeReviewedSolanaRequestDigest, reconcileReviewedSolanaTransaction, validateReviewedSolanaSignedTransaction };