@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,397 @@
1
+ import { resolveStateDir } from "../config/paths.js";
2
+ import { withFileLock } from "../plugin-sdk/file-lock.js";
3
+ import "../infra/file-lock.js";
4
+ import { serializeWalletState, writeWalletStateFileAtomically } from "../wallet/wallet-atomic-state.js";
5
+ import { emitDurableCapacityWarning } from "./durable-capacity.js";
6
+ import syncFs from "node:fs";
7
+ import path from "node:path";
8
+ import { createCipheriv, createDecipheriv, createHash, randomBytes } from "node:crypto";
9
+
10
+ //#region src/gateway/federation-marketplace-run-store.ts
11
+ const STATUSES = new Set([
12
+ "reserved",
13
+ "payment_pending",
14
+ "paid",
15
+ "task_created",
16
+ "completed",
17
+ "failed",
18
+ "refund_required",
19
+ "refunded",
20
+ "disputed",
21
+ "unknown"
22
+ ]);
23
+ const TRANSITIONS = {
24
+ reserved: new Set([
25
+ "reserved",
26
+ "payment_pending",
27
+ "failed"
28
+ ]),
29
+ payment_pending: new Set([
30
+ "payment_pending",
31
+ "paid",
32
+ "failed",
33
+ "unknown"
34
+ ]),
35
+ paid: new Set([
36
+ "paid",
37
+ "task_created",
38
+ "refund_required",
39
+ "unknown"
40
+ ]),
41
+ task_created: new Set([
42
+ "task_created",
43
+ "completed",
44
+ "refund_required",
45
+ "unknown"
46
+ ]),
47
+ completed: new Set(["completed"]),
48
+ failed: new Set(["failed"]),
49
+ refund_required: new Set([
50
+ "refund_required",
51
+ "refunded",
52
+ "disputed"
53
+ ]),
54
+ refunded: new Set(["refunded"]),
55
+ disputed: new Set(["disputed"]),
56
+ unknown: new Set([
57
+ "unknown",
58
+ "paid",
59
+ "failed"
60
+ ])
61
+ };
62
+ const LOCK_OPTIONS = {
63
+ retries: {
64
+ retries: 400,
65
+ factor: 1.15,
66
+ minTimeout: 10,
67
+ maxTimeout: 500,
68
+ randomize: true
69
+ },
70
+ stale: 12e4
71
+ };
72
+ const MAX_RUN_FILES_ON_DISK = 1e4;
73
+ const MAX_RETAINED_TERMINAL_RUNS = 5e3;
74
+ const TERMINAL_RETENTION_MS = 30 * 24 * 60 * 6e4;
75
+ const SECRET_KEY_BYTES = 32;
76
+ const REDACTED_TERMINAL_TASK_TOKEN = "terminal-capability-redacted-after-run-completion";
77
+ function canonicalJson(value) {
78
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
79
+ return JSON.stringify(value);
80
+ }
81
+ if (typeof value === "number") {
82
+ if (!Number.isFinite(value)) {
83
+ throw new Error("Marketplace run intent contains a non-finite number");
84
+ }
85
+ return JSON.stringify(value);
86
+ }
87
+ if (Array.isArray(value)) {
88
+ return `[${value.map((entry) => canonicalJson(entry)).join(",")}]`;
89
+ }
90
+ if (value && typeof value === "object") {
91
+ const record = value;
92
+ return `{${Object.keys(record).filter((key) => record[key] !== undefined).toSorted().map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`).join(",")}}`;
93
+ }
94
+ throw new Error("Marketplace run intent contains an unsupported value");
95
+ }
96
+ function intentDigest(intent) {
97
+ return `sha256:${createHash("sha256").update(canonicalJson(intent)).digest("hex")}`;
98
+ }
99
+ function validateExecutionIntentId(value) {
100
+ const normalized = value.trim();
101
+ if (!normalized || normalized.length > 240 || Array.from(normalized).some((character) => character.charCodeAt(0) <= 31)) {
102
+ throw new Error("Marketplace executionIntentId is invalid");
103
+ }
104
+ return normalized;
105
+ }
106
+ function runDirectory(env) {
107
+ return path.join(resolveStateDir(env), "federation", "marketplace-runs");
108
+ }
109
+ function runPath(executionIntentId, env) {
110
+ const digest = createHash("sha256").update(executionIntentId).digest("hex");
111
+ return path.join(runDirectory(env), `${digest}.json`);
112
+ }
113
+ function retentionLockPath(env) {
114
+ return path.join(runDirectory(env), ".retention");
115
+ }
116
+ function secretKeyPath(env) {
117
+ return path.join(resolveStateDir(env), "secrets", "marketplace-runs.key");
118
+ }
119
+ function readOrCreateSecretKey(env) {
120
+ const filePath = secretKeyPath(env);
121
+ syncFs.mkdirSync(path.dirname(filePath), {
122
+ recursive: true,
123
+ mode: 448
124
+ });
125
+ if (syncFs.existsSync(filePath)) {
126
+ const key = Buffer.from(syncFs.readFileSync(filePath, "utf8").trim(), "hex");
127
+ if (key.length !== SECRET_KEY_BYTES) {
128
+ throw new Error("Marketplace run encryption key is invalid");
129
+ }
130
+ return key;
131
+ }
132
+ const key = randomBytes(SECRET_KEY_BYTES);
133
+ syncFs.writeFileSync(filePath, `${key.toString("hex")}\n`, {
134
+ encoding: "utf8",
135
+ mode: 384
136
+ });
137
+ try {
138
+ syncFs.chmodSync(filePath, 384);
139
+ } catch {}
140
+ return key;
141
+ }
142
+ function encryptTaskAccessToken(params) {
143
+ const iv = randomBytes(12);
144
+ const cipher = createCipheriv("aes-256-gcm", readOrCreateSecretKey(params.env), iv);
145
+ cipher.setAAD(Buffer.from(params.executionIntentId, "utf8"));
146
+ const ciphertext = Buffer.concat([cipher.update(Buffer.from(params.token, "utf8")), cipher.final()]);
147
+ return {
148
+ version: 1,
149
+ algorithm: "aes-256-gcm",
150
+ iv: iv.toString("base64url"),
151
+ authTag: cipher.getAuthTag().toString("base64url"),
152
+ ciphertext: ciphertext.toString("base64url")
153
+ };
154
+ }
155
+ function decryptTaskAccessToken(params) {
156
+ if (!isRecord(params.encrypted) || params.encrypted.version !== 1 || params.encrypted.algorithm !== "aes-256-gcm" || typeof params.encrypted.iv !== "string" || typeof params.encrypted.authTag !== "string" || typeof params.encrypted.ciphertext !== "string") {
157
+ throw new Error("durable Marketplace run has invalid encrypted task access state");
158
+ }
159
+ try {
160
+ const decipher = createDecipheriv("aes-256-gcm", readOrCreateSecretKey(params.env), Buffer.from(params.encrypted.iv, "base64url"));
161
+ decipher.setAAD(Buffer.from(params.executionIntentId, "utf8"));
162
+ decipher.setAuthTag(Buffer.from(params.encrypted.authTag, "base64url"));
163
+ return Buffer.concat([decipher.update(Buffer.from(params.encrypted.ciphertext, "base64url")), decipher.final()]).toString("utf8");
164
+ } catch (error) {
165
+ throw new Error("durable Marketplace task access token cannot be decrypted", { cause: error });
166
+ }
167
+ }
168
+ function isRecord(value) {
169
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
170
+ }
171
+ function validatePrepared(value) {
172
+ if (value === undefined) {
173
+ return undefined;
174
+ }
175
+ if (!isRecord(value) || !isRecord(value.asset)) {
176
+ throw new Error("durable Marketplace run has invalid prepared state");
177
+ }
178
+ const requiredStrings = [
179
+ "handle",
180
+ "endpoint",
181
+ "offerId",
182
+ "walletId",
183
+ "walletName",
184
+ "providerId",
185
+ "walletAddress",
186
+ "senderHandle",
187
+ "taskId",
188
+ "challengeId",
189
+ "paymentMemo",
190
+ "invoiceId",
191
+ "receiptId",
192
+ "taskAccessToken",
193
+ "sourceText",
194
+ "requestedOutput",
195
+ "amount",
196
+ "currency",
197
+ "payeeAddress",
198
+ "issuedAt",
199
+ "expiresAt",
200
+ "settledAt"
201
+ ];
202
+ if (requiredStrings.some((field) => typeof value[field] !== "string" || !value[field].trim()) || ![
203
+ "embedded-keystore",
204
+ "local-socket-signer",
205
+ "alchemy",
206
+ "turnkey",
207
+ "wallet-standard",
208
+ "privy"
209
+ ].includes(String(value.providerId)) || !/^[A-Za-z0-9_-]{43,256}$/u.test(String(value.taskAccessToken)) || value.summaryStyle !== "plain" && value.summaryStyle !== "bullets" || typeof value.maxSentences !== "number" || !Number.isSafeInteger(value.maxSentences) || value.maxSentences < 1 || value.maxSentences > 20 || value.asset.kind !== "native" && value.asset.kind !== "spl-token" || value.asset.address !== undefined && typeof value.asset.address !== "string") {
210
+ throw new Error("durable Marketplace run has invalid prepared fields");
211
+ }
212
+ return value;
213
+ }
214
+ function validateRecord(value, executionIntentId) {
215
+ if (!isRecord(value) || value.version !== 1 || value.executionIntentId !== executionIntentId || typeof value.intentDigest !== "string" || !/^sha256:[0-9a-f]{64}$/u.test(value.intentDigest) || typeof value.status !== "string" || !STATUSES.has(value.status) || typeof value.createdAt !== "string" || typeof value.updatedAt !== "string" || value.txRef !== undefined && typeof value.txRef !== "string" || value.payerAddress !== undefined && typeof value.payerAddress !== "string" || value.refundTxRef !== undefined && typeof value.refundTxRef !== "string" || value.taskCreatedAt !== undefined && typeof value.taskCreatedAt !== "string" || value.reason !== undefined && typeof value.reason !== "string") {
216
+ throw new Error("durable Marketplace run contains an invalid record");
217
+ }
218
+ validatePrepared(value.prepared);
219
+ if (value.status !== "reserved" && value.status !== "failed" && (!value.prepared || !isRecord(value.prepared))) {
220
+ throw new Error("durable Marketplace run is missing prepared state");
221
+ }
222
+ if ((value.status === "paid" || value.status === "task_created" || value.status === "completed" || value.status === "refund_required" || value.status === "refunded" || value.status === "disputed") && (typeof value.txRef !== "string" || !value.txRef.trim() || typeof value.payerAddress !== "string" || !value.payerAddress.trim())) {
223
+ throw new Error("durable Marketplace run is missing its payment result");
224
+ }
225
+ if (value.status === "completed" && value.result === undefined) {
226
+ throw new Error("durable Marketplace run is missing its completed result");
227
+ }
228
+ if (value.status === "refunded" && (typeof value.refundTxRef !== "string" || !value.refundTxRef.trim())) {
229
+ throw new Error("durable Marketplace run is missing its refund transaction");
230
+ }
231
+ return value;
232
+ }
233
+ function readRecord(executionIntentId, env) {
234
+ const filePath = runPath(executionIntentId, env);
235
+ if (!syncFs.existsSync(filePath)) {
236
+ return null;
237
+ }
238
+ try {
239
+ const stored = JSON.parse(syncFs.readFileSync(filePath, "utf8"));
240
+ if (isRecord(stored) && isRecord(stored.prepared)) {
241
+ const prepared = { ...stored.prepared };
242
+ if (prepared.taskAccessToken === undefined) {
243
+ prepared.taskAccessToken = [
244
+ "completed",
245
+ "failed",
246
+ "refunded",
247
+ "disputed"
248
+ ].includes(String(stored.status)) ? REDACTED_TERMINAL_TASK_TOKEN : decryptTaskAccessToken({
249
+ encrypted: prepared.taskAccessTokenEncrypted,
250
+ executionIntentId,
251
+ env
252
+ });
253
+ }
254
+ delete prepared.taskAccessTokenEncrypted;
255
+ stored.prepared = prepared;
256
+ }
257
+ return validateRecord(stored, executionIntentId);
258
+ } catch (error) {
259
+ throw new Error("durable Marketplace run is unreadable; refusing to replace it", { cause: error });
260
+ }
261
+ }
262
+ function writeRecord(record, env) {
263
+ syncFs.mkdirSync(runDirectory(env), {
264
+ recursive: true,
265
+ mode: 448
266
+ });
267
+ const terminal = [
268
+ "completed",
269
+ "failed",
270
+ "refunded",
271
+ "disputed"
272
+ ].includes(record.status);
273
+ const stored = record.prepared ? {
274
+ ...record,
275
+ prepared: {
276
+ ...record.prepared,
277
+ taskAccessToken: undefined,
278
+ taskAccessTokenEncrypted: terminal ? undefined : encryptTaskAccessToken({
279
+ token: record.prepared.taskAccessToken,
280
+ executionIntentId: record.executionIntentId,
281
+ env
282
+ }),
283
+ taskAccessTokenRedactedAt: terminal ? record.updatedAt : undefined
284
+ }
285
+ } : record;
286
+ writeWalletStateFileAtomically(runPath(record.executionIntentId, env), serializeWalletState(stored));
287
+ }
288
+ function listRunFiles(env) {
289
+ const dir = runDirectory(env);
290
+ if (!syncFs.existsSync(dir)) {
291
+ return [];
292
+ }
293
+ const files = syncFs.readdirSync(dir).filter((name) => /^[a-f0-9]{64}\.json$/u.test(name));
294
+ emitDurableCapacityWarning("Marketplace run store", files.length, MAX_RUN_FILES_ON_DISK);
295
+ if (files.length > MAX_RUN_FILES_ON_DISK) {
296
+ throw new Error("Marketplace run store exceeds its safe on-disk record limit");
297
+ }
298
+ return files;
299
+ }
300
+ function pruneTerminalRuns(env) {
301
+ const now = Date.now();
302
+ const terminal = listRunFiles(env).map((name) => {
303
+ const filePath = path.join(runDirectory(env), name);
304
+ try {
305
+ const value = JSON.parse(syncFs.readFileSync(filePath, "utf8"));
306
+ if (!isRecord(value) || typeof value.status !== "string" || ![
307
+ "completed",
308
+ "failed",
309
+ "refunded",
310
+ "disputed"
311
+ ].includes(value.status) || typeof value.updatedAt !== "string") {
312
+ return null;
313
+ }
314
+ return {
315
+ filePath,
316
+ updatedAt: Date.parse(value.updatedAt)
317
+ };
318
+ } catch {
319
+ return null;
320
+ }
321
+ }).filter((entry) => Boolean(entry)).toSorted((left, right) => left.updatedAt - right.updatedAt);
322
+ for (const [index, entry] of terminal.entries()) {
323
+ if (now - entry.updatedAt > TERMINAL_RETENTION_MS || terminal.length - index > MAX_RETAINED_TERMINAL_RUNS) {
324
+ try {
325
+ syncFs.unlinkSync(entry.filePath);
326
+ } catch {}
327
+ }
328
+ }
329
+ }
330
+ async function withDurableMarketplaceRun(params) {
331
+ const env = params.env ?? process.env;
332
+ const executionIntentId = validateExecutionIntentId(params.executionIntentId);
333
+ const digest = intentDigest(params.intent);
334
+ const filePath = runPath(executionIntentId, env);
335
+ syncFs.mkdirSync(runDirectory(env), {
336
+ recursive: true,
337
+ mode: 448
338
+ });
339
+ return await withFileLock(filePath, LOCK_OPTIONS, async () => {
340
+ let record = readRecord(executionIntentId, env);
341
+ if (!record) {
342
+ await withFileLock(retentionLockPath(env), LOCK_OPTIONS, async () => {
343
+ record = readRecord(executionIntentId, env);
344
+ if (record) {
345
+ return;
346
+ }
347
+ pruneTerminalRuns(env);
348
+ if (listRunFiles(env).length >= MAX_RUN_FILES_ON_DISK) {
349
+ throw new Error("Marketplace run store reached its safe on-disk record limit");
350
+ }
351
+ const now = new Date().toISOString();
352
+ record = {
353
+ version: 1,
354
+ executionIntentId,
355
+ intentDigest: digest,
356
+ status: "reserved",
357
+ createdAt: now,
358
+ updatedAt: now
359
+ };
360
+ writeRecord(record, env);
361
+ });
362
+ } else if (record.intentDigest !== digest) {
363
+ throw new Error("Marketplace executionIntentId is bound to a different immutable request");
364
+ }
365
+ if (!record) {
366
+ throw new Error("Marketplace run reservation failed");
367
+ }
368
+ if (record.intentDigest !== digest) {
369
+ throw new Error("Marketplace executionIntentId is bound to a different immutable request");
370
+ }
371
+ const update = (params) => {
372
+ if (!TRANSITIONS[record.status].has(params.status)) {
373
+ throw new Error(`invalid Marketplace run transition ${record.status} -> ${params.status}`);
374
+ }
375
+ record = validateRecord({
376
+ ...record,
377
+ ...params.patch,
378
+ status: params.status,
379
+ updatedAt: new Date().toISOString()
380
+ }, executionIntentId);
381
+ writeRecord(record, env);
382
+ return record;
383
+ };
384
+ return await params.run({
385
+ get record() {
386
+ return record;
387
+ },
388
+ update
389
+ });
390
+ });
391
+ }
392
+ function createMarketplaceTaskAccessToken() {
393
+ return randomBytes(32).toString("base64url");
394
+ }
395
+
396
+ //#endregion
397
+ export { createMarketplaceTaskAccessToken, withDurableMarketplaceRun };