@fased/fased 0.1.61 → 0.1.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (514) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +38 -30
  3. package/config/dependency-ownership.json +1 -1
  4. package/config/signer-policies/README.md +49 -0
  5. package/config/signer-policies/agent.json.template +32 -0
  6. package/config/signer-policies/mining.json.template +69 -0
  7. package/config/signer-policies/network.json.template +5 -0
  8. package/config/signer-policies/vault.json.template +70 -0
  9. package/config/signer-protocol-v2.json +76 -0
  10. package/config/typescript-noemit-baseline.json +680 -0
  11. package/dist/acp/client.js +2 -2
  12. package/dist/acp/secret-file.js +2 -2
  13. package/dist/agents/agent-scope.js +2 -2
  14. package/dist/agents/apply-patch.js +8 -8
  15. package/dist/agents/auth-profiles/paths.js +2 -2
  16. package/dist/agents/auth-profiles/store.js +269 -33
  17. package/dist/agents/bash-tools.exec.js +10 -4
  18. package/dist/agents/bash-tools.shared.js +2 -2
  19. package/dist/agents/cli-credentials.js +4 -4
  20. package/dist/agents/current-model-catalog.js +3 -3
  21. package/dist/agents/docs-path.js +3 -3
  22. package/dist/agents/embedded-pi-mcp.js +4 -4
  23. package/dist/agents/identity-avatar.js +3 -3
  24. package/dist/agents/identity-file.js +2 -2
  25. package/dist/agents/memory-search.js +7 -1
  26. package/dist/agents/model-catalog-access.js +1 -2
  27. package/dist/agents/model-catalog-snapshot.js +1 -1
  28. package/dist/agents/model-catalog-source.js +1 -1
  29. package/dist/agents/model-metadata.js +1 -1
  30. package/dist/agents/model-selection.js +2 -28
  31. package/dist/agents/models-config.providers.js +6 -6
  32. package/dist/agents/openai-codex-app-server.js +5 -5
  33. package/dist/agents/pi-embedded-runner/compact.js +15 -7
  34. package/dist/agents/pi-embedded-runner/model.js +1 -1
  35. package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
  36. package/dist/agents/pi-embedded-runner/run.js +2 -0
  37. package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
  38. package/dist/agents/pi-embedded-subscribe.raw-stream.js +3 -3
  39. package/dist/agents/pi-extensions/compaction-safeguard.js +3 -3
  40. package/dist/agents/pi-model-discovery.js +6 -6
  41. package/dist/agents/pi-project-settings.js +3 -3
  42. package/dist/agents/pi-tool-definition-adapter.js +16 -1
  43. package/dist/agents/pi-tools.js +2 -1
  44. package/dist/agents/sandbox/config.js +1 -1
  45. package/dist/agents/sandbox/context.js +27 -2
  46. package/dist/agents/sandbox/fs-bridge.js +2 -2
  47. package/dist/agents/session-dirs.js +4 -4
  48. package/dist/agents/session-write-lock.js +13 -13
  49. package/dist/agents/shell-utils.js +5 -5
  50. package/dist/agents/skills/bundled-dir.js +4 -4
  51. package/dist/agents/skills/env-overrides.js +38 -28
  52. package/dist/agents/skills/local-loader.js +6 -6
  53. package/dist/agents/skills/plugin-skills.js +2 -2
  54. package/dist/agents/skills/trust.js +93 -0
  55. package/dist/agents/skills/workspace.js +141 -13
  56. package/dist/agents/skills-clawhub.js +36 -11
  57. package/dist/agents/skills-install-download.js +7 -7
  58. package/dist/agents/skills-install-plan.js +2 -2
  59. package/dist/agents/skills-install.js +2 -2
  60. package/dist/agents/skills-marketplace-scan.js +49 -0
  61. package/dist/agents/skills-status.js +2 -2
  62. package/dist/agents/subagent-depth.js +2 -2
  63. package/dist/agents/system-prompt-params.js +2 -2
  64. package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
  65. package/dist/agents/tools/mining-tool.js +1 -1
  66. package/dist/agents/tools/session-status-tool.js +1 -1
  67. package/dist/agents/tools/wallet-action-tool.js +172 -36
  68. package/dist/agents/tools/wallet-skill-policy.js +65 -23
  69. package/dist/agents/tools/wallet-tool.js +7 -11
  70. package/dist/agents/workspace.js +22 -22
  71. package/dist/auto-reply/reply/agent-runner-execution.js +2 -2
  72. package/dist/auto-reply/reply/agent-runner.js +2 -2
  73. package/dist/auto-reply/reply/commands-export-session.js +7 -7
  74. package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
  75. package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
  76. package/dist/auto-reply/reply/directive-handling.model.js +2 -1
  77. package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
  78. package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
  79. package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
  80. package/dist/auto-reply/reply/model-selection.js +7 -4
  81. package/dist/auto-reply/reply/post-compaction-audit.js +3 -3
  82. package/dist/auto-reply/reply/post-compaction-context.js +3 -3
  83. package/dist/auto-reply/reply/session-reset-model.js +4 -4
  84. package/dist/auto-reply/reply/session.js +3 -3
  85. package/dist/auto-reply/skill-commands.js +3 -3
  86. package/dist/auto-reply/status.js +6 -6
  87. package/dist/brand.js +1 -1
  88. package/dist/browser/chrome.executables.js +3 -3
  89. package/dist/browser/chrome.js +3 -3
  90. package/dist/browser/chrome.profile-decoration.js +6 -6
  91. package/dist/browser/profiles-service.js +2 -2
  92. package/dist/browser/server-context.js +2 -2
  93. package/dist/browser/trash.js +4 -4
  94. package/dist/build-info.json +3 -3
  95. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  96. package/dist/canvas-host/server.js +4 -4
  97. package/dist/capabilities/catalog.js +3 -3
  98. package/dist/channel-web.js +2 -2
  99. package/dist/channels/plugins/catalog.js +3 -3
  100. package/dist/cli/browser-cli-extension.js +6 -6
  101. package/dist/cli/command-format.js +2 -2
  102. package/dist/cli/cron-cli/register.cron-simple.js +2 -2
  103. package/dist/cli/dns-cli.js +9 -9
  104. package/dist/cli/gateway-cli/dev.js +5 -5
  105. package/dist/cli/gateway-cli/run.js +10 -2
  106. package/dist/cli/hooks-cli.js +5 -5
  107. package/dist/cli/lightweight/gateway-runtime-probe.js +2 -2
  108. package/dist/cli/memory-cli.js +7 -7
  109. package/dist/cli/nodes-media-utils.js +2 -2
  110. package/dist/cli/plugins-cli.js +2 -2
  111. package/dist/cli/program/command-registry.js +1 -1
  112. package/dist/cli/program/register.onboard.js +2 -3
  113. package/dist/cli/program/register.wallet.js +16 -123
  114. package/dist/cli/providers-cli.js +1 -1
  115. package/dist/cli/sat-cli.js +129 -2
  116. package/dist/cli/secrets-cli.js +3 -3
  117. package/dist/cli/update-cli/update-command.js +260 -11
  118. package/dist/cli/windows-argv.js +2 -2
  119. package/dist/commands/auth-choice.apply.api-providers.js +3 -3
  120. package/dist/commands/dashboard-link.js +3 -3
  121. package/dist/commands/doctor-config-flow.js +1 -1
  122. package/dist/commands/doctor-install.js +5 -5
  123. package/dist/commands/doctor-legacy-config.js +2 -13
  124. package/dist/commands/doctor-memory-search.js +2 -2
  125. package/dist/commands/doctor-platform-notes.js +2 -2
  126. package/dist/commands/doctor-sandbox.js +2 -2
  127. package/dist/commands/doctor-state-integrity.js +23 -23
  128. package/dist/commands/doctor-workspace.js +3 -3
  129. package/dist/commands/doctor.js +3 -3
  130. package/dist/commands/managed-up.js +2 -2
  131. package/dist/commands/model-picker.js +6 -6
  132. package/dist/commands/models/auth.js +1 -1
  133. package/dist/commands/onboard-auth.config-gateways.js +1 -1
  134. package/dist/commands/onboard-auth.credentials.js +35 -11
  135. package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
  136. package/dist/commands/onboard-non-interactive/local.js +5 -1
  137. package/dist/commands/onboarding/plugin-install.js +2 -2
  138. package/dist/commands/sessions-cleanup.js +2 -2
  139. package/dist/commands/signal-install.js +6 -6
  140. package/dist/commands/status-all/channels.js +2 -2
  141. package/dist/commands/wallet.js +570 -1913
  142. package/dist/config/cache-utils.js +2 -2
  143. package/dist/config/config.js +2 -2
  144. package/dist/config/includes.js +5 -5
  145. package/dist/config/io.js +66 -4
  146. package/dist/config/paths.js +3 -3
  147. package/dist/config/sat-runtime-ids.js +3 -3
  148. package/dist/config/schema.help.js +8 -7
  149. package/dist/config/schema.labels.js +5 -4
  150. package/dist/config/sessions/disk-budget.js +6 -6
  151. package/dist/config/sessions/paths.js +2 -2
  152. package/dist/config/sessions/store.js +17 -17
  153. package/dist/config/sessions/transcript.js +4 -4
  154. package/dist/config/talk.js +2 -2
  155. package/dist/config/zod-schema.agent-runtime.js +1 -0
  156. package/dist/config/zod-schema.js +5 -0
  157. package/dist/control-ui/assets/{app-BXA4gPvN.js → app-bR-fO5ty.js} +1511 -1555
  158. package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
  159. package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
  160. package/dist/control-ui/assets/{index-D2QbJhVg.js → index-ckCxHwjy.js} +3 -3
  161. package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-BgHFh0ei.js} +134 -114
  162. package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
  163. package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
  164. package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
  165. package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
  166. package/dist/control-ui/index.html +1 -1
  167. package/dist/control-ui/version.json +1 -1
  168. package/dist/cron/service/store.js +2 -2
  169. package/dist/cron/store.js +6 -6
  170. package/dist/daemon/systemd-system.js +60 -54
  171. package/dist/discord/monitor/thread-bindings.state.js +2 -2
  172. package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
  173. package/dist/extensions/sat-mining/src/rpc-read.js +235 -67
  174. package/dist/extensions/sat-mining/src/sat-bond-layout.js +14 -11
  175. package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
  176. package/dist/extensions/sat-mining/src/solana-submit.js +1038 -397
  177. package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
  178. package/dist/federation/auto-connect.js +98 -8
  179. package/dist/federation/marketplace-capability-adapter.js +33 -7
  180. package/dist/federation/marketplace-delivery-outbox.js +196 -0
  181. package/dist/federation/marketplace-delivery.js +351 -215
  182. package/dist/federation/marketplace-direct-payment.js +272 -141
  183. package/dist/federation/marketplace-escrow.js +607 -249
  184. package/dist/federation/marketplace-settlement-ledger.js +352 -0
  185. package/dist/federation/offers.js +9 -7
  186. package/dist/federation/peer-auth-v2.js +529 -0
  187. package/dist/gateway/a2a-http.js +425 -96
  188. package/dist/gateway/a2a-settlement.js +259 -153
  189. package/dist/gateway/a2a-task-store.js +524 -0
  190. package/dist/gateway/auth.js +38 -2
  191. package/dist/gateway/config-reload.js +46 -33
  192. package/dist/gateway/control-ui-boot-check.js +6 -6
  193. package/dist/gateway/control-ui-login.js +7 -7
  194. package/dist/gateway/control-ui.js +9 -9
  195. package/dist/gateway/durable-capacity.js +31 -0
  196. package/dist/gateway/federation-http.js +540 -135
  197. package/dist/gateway/federation-marketplace-run-store.js +397 -0
  198. package/dist/gateway/federation-marketplace.js +535 -230
  199. package/dist/gateway/hooks-mapping.js +4 -4
  200. package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
  201. package/dist/gateway/security-path.js +1 -1
  202. package/dist/gateway/server-discovery.js +2 -2
  203. package/dist/gateway/server-http.js +1088 -1209
  204. package/dist/gateway/server-methods/chat.js +3 -3
  205. package/dist/gateway/server-methods/models.js +1 -1
  206. package/dist/gateway/server-methods/secrets.js +40 -0
  207. package/dist/gateway/server-methods/sessions.js +6 -6
  208. package/dist/gateway/server-methods/usage.js +2 -2
  209. package/dist/gateway/server-methods.js +1 -2
  210. package/dist/gateway/server-reload-handlers.js +196 -66
  211. package/dist/gateway/server-runtime-config.js +1 -1
  212. package/dist/gateway/server-secrets-runtime.js +288 -0
  213. package/dist/gateway/server.impl.js +73 -42
  214. package/dist/gateway/session-compaction-checkpoints.js +4 -4
  215. package/dist/gateway/session-utils.fs.js +24 -24
  216. package/dist/gateway/session-utils.js +6 -6
  217. package/dist/gateway/sessions-patch.js +3 -5
  218. package/dist/hooks/bundled-dir.js +4 -4
  219. package/dist/hooks/gmail-setup-utils.js +6 -6
  220. package/dist/hooks/import-url.js +2 -2
  221. package/dist/hooks/loader.js +4 -4
  222. package/dist/hooks/workspace.js +7 -7
  223. package/dist/index.js +4 -2
  224. package/dist/infra/archive.js +17 -17
  225. package/dist/infra/boundary-file-read.js +2 -2
  226. package/dist/infra/boundary-path.js +15 -15
  227. package/dist/infra/brew.js +2 -2
  228. package/dist/infra/control-ui-assets.js +14 -14
  229. package/dist/infra/device-auth-store.js +8 -8
  230. package/dist/infra/device-identity.js +8 -8
  231. package/dist/infra/dotenv.js +2 -2
  232. package/dist/infra/exec-approvals.js +8 -8
  233. package/dist/infra/exec-command-resolution.js +4 -4
  234. package/dist/infra/exec-safe-bin-trust.js +2 -2
  235. package/dist/infra/fased-root.js +5 -5
  236. package/dist/infra/fasedhub.js +64 -1
  237. package/dist/infra/fs-safe.js +14 -14
  238. package/dist/infra/gateway-lock.js +11 -11
  239. package/dist/infra/git-commit.js +5 -5
  240. package/dist/infra/git-root.js +4 -4
  241. package/dist/infra/hosted-runtime-artifact.js +3 -3
  242. package/dist/infra/is-main.js +2 -2
  243. package/dist/infra/json-file.js +7 -7
  244. package/dist/infra/local-source-paired-update.js +538 -0
  245. package/dist/infra/managed-runtime-bootstrap.js +6 -6
  246. package/dist/infra/outbound/delivery-queue.js +16 -16
  247. package/dist/infra/path-env.js +3 -3
  248. package/dist/infra/ports-lsof.js +4 -4
  249. package/dist/infra/provider-usage.auth.js +3 -3
  250. package/dist/infra/restart.js +41 -10
  251. package/dist/infra/safe-open-sync.js +2 -2
  252. package/dist/infra/session-cost-usage.js +9 -9
  253. package/dist/infra/shell-env.js +2 -2
  254. package/dist/infra/state-migrations.fs.js +6 -6
  255. package/dist/infra/state-migrations.js +23 -23
  256. package/dist/infra/tmp-fased-dir.js +6 -6
  257. package/dist/infra/update-runner.js +96 -0
  258. package/dist/infra/widearea-dns.js +3 -3
  259. package/dist/infra/wsl.js +2 -2
  260. package/dist/light-update-status.js +11 -11
  261. package/dist/line/accounts.js +2 -2
  262. package/dist/line/download.js +2 -2
  263. package/dist/logging/config.js +3 -3
  264. package/dist/logging/logger.js +7 -7
  265. package/dist/managed/federation.js +3 -3
  266. package/dist/managed/tunnel.js +3 -3
  267. package/dist/media/store.js +13 -13
  268. package/dist/media-understanding/runner.js +3 -3
  269. package/dist/memory/backend-config.js +2 -1
  270. package/dist/memory/embeddings.js +2 -2
  271. package/dist/memory/internal.js +10 -10
  272. package/dist/memory/manager-sync-ops.js +7 -7
  273. package/dist/memory/repair-executor.js +17 -17
  274. package/dist/memory/session-files.js +16 -2
  275. package/dist/node-host/invoke-system-run-plan.js +8 -8
  276. package/dist/node-host/invoke.js +2 -2
  277. package/dist/node-host/runner.js +3 -3
  278. package/dist/pairing/pairing-store.js +3 -3
  279. package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
  280. package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
  281. package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
  282. package/dist/plugin-sdk/{audio-preflight-Bv0hUOWL.js → audio-preflight-BYxAt775.js} +27 -27
  283. package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
  284. package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
  285. package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
  286. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  287. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  288. package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
  289. package/dist/plugin-sdk/{chunk-items-Bk--NU3E.js → chunk-items-DIRHG2gJ.js} +1 -1
  290. package/dist/plugin-sdk/command-status.d.ts +2 -2
  291. package/dist/plugin-sdk/command-status.js +27 -27
  292. package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
  293. package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
  294. package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
  295. package/dist/plugin-sdk/{config-schema-CGW6J3Pv.js → config-schema-BOT7kHb6.js} +6779 -3696
  296. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  297. package/dist/plugin-sdk/discord.d.ts +5 -5
  298. package/dist/plugin-sdk/discord.js +19 -19
  299. package/dist/plugin-sdk/file-lock.js +35 -4
  300. package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
  301. package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
  302. package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
  303. package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
  304. package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
  305. package/dist/plugin-sdk/index.d.ts +9 -27
  306. package/dist/plugin-sdk/index.js +29 -29
  307. package/dist/plugin-sdk/json-store.js +6 -6
  308. package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
  309. package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
  310. package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
  311. package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
  312. package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
  313. package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
  314. package/dist/plugin-sdk/{monitor-B9Cmt_Je.js → monitor-BCFDaqJ-.js} +31 -31
  315. package/dist/plugin-sdk/{monitor-B71iwAgC.js → monitor-BgbjRiPM.js} +32 -32
  316. package/dist/plugin-sdk/{openresponses-http-Du4GMmwo.js → openresponses-http-DFf87SMM.js} +27 -27
  317. package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
  318. package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
  319. package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
  320. package/dist/plugin-sdk/{pairing-message-BMkkS038.d.ts → pairing-message-CS-9BHug.d.ts} +2 -2
  321. package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
  322. package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
  323. package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
  324. package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
  325. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  326. package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
  327. package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
  328. package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
  329. package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
  330. package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
  331. package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
  332. package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
  333. package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
  334. package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
  335. package/dist/plugin-sdk/sat-runtime.d.ts +549 -309
  336. package/dist/plugin-sdk/sat-runtime.js +29 -29
  337. package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
  338. package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
  339. package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
  340. package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
  341. package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
  342. package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
  343. package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
  344. package/dist/plugin-sdk/{slack-D_bbE6Yd.js → slack-BUTt8cxK.js} +39 -39
  345. package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
  346. package/dist/plugin-sdk/slack.d.ts +5 -5
  347. package/dist/plugin-sdk/slack.js +9 -9
  348. package/dist/plugin-sdk/{sticker-cache-Dqo9nRhi.js → sticker-cache-D0wHVqjt.js} +3 -3
  349. package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
  350. package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
  351. package/dist/plugin-sdk/{telegram-actions-Cnag7JTH.js → telegram-actions-CC_qN4v0.js} +30 -30
  352. package/dist/plugin-sdk/telegram.d.ts +5 -5
  353. package/dist/plugin-sdk/telegram.js +8 -8
  354. package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
  355. package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
  356. package/dist/plugin-sdk/tmp-fased-dir-xOTGlzBE.d.ts +486 -0
  357. package/dist/plugin-sdk/{types-CLIvQaVg.d.ts → types-C3avNytw.d.ts} +3 -4
  358. package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
  359. package/dist/plugin-sdk/{types-BYDL6dQj.d.ts → types-DWfbSAaM.d.ts} +2 -2
  360. package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
  361. package/dist/plugin-sdk/{web-BInKQkc4.js → web-BXsJ1vqe.js} +32 -32
  362. package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
  363. package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
  364. package/dist/plugin-sdk/whatsapp.d.ts +5 -5
  365. package/dist/plugin-sdk/whatsapp.js +12 -12
  366. package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
  367. package/dist/plugins/bundled-dir.js +3 -3
  368. package/dist/plugins/discovery.js +11 -11
  369. package/dist/plugins/loader.js +13 -13
  370. package/dist/plugins/manifest-registry.js +2 -2
  371. package/dist/plugins/manifest.js +4 -4
  372. package/dist/plugins/path-safety.js +3 -3
  373. package/dist/plugins/status-cache.js +9 -9
  374. package/dist/plugins/update.js +3 -3
  375. package/dist/plugins/web-search-install-catalog.js +3 -3
  376. package/dist/providers/refresh.js +1 -1
  377. package/dist/providers/registry.js +1 -1
  378. package/dist/secrets/apply.js +17 -17
  379. package/dist/secrets/audit.js +11 -11
  380. package/dist/secrets/runtime.js +1 -1
  381. package/dist/secrets/shared.js +9 -9
  382. package/dist/security/scan-paths.js +2 -2
  383. package/dist/shared/config-eval.js +2 -2
  384. package/dist/shared/pid-alive.js +2 -2
  385. package/dist/tasks/standing-orders.js +5 -5
  386. package/dist/tasks/task-flow-registry.js +5 -5
  387. package/dist/tasks/task-registry.js +5 -5
  388. package/dist/tasks/workflow-definitions.js +6 -6
  389. package/dist/telegram/token.js +5 -5
  390. package/dist/utils.js +5 -5
  391. package/dist/wallet/external-submission-ledger.js +376 -0
  392. package/dist/wallet/legacy-embedded-keystore.js +40 -0
  393. package/dist/wallet/local-socket-signer-archive.js +30 -0
  394. package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
  395. package/dist/wallet/local-socket-signer-policy.js +166 -0
  396. package/dist/wallet/local-socket-signer-protocol.js +561 -118
  397. package/dist/wallet/native-signer-wallet-id.js +25 -0
  398. package/dist/wallet/providers/alchemy-adapter.js +3 -0
  399. package/dist/wallet/providers/local-socket-signer-adapter.js +382 -107
  400. package/dist/wallet/providers/turnkey-adapter.js +292 -34
  401. package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
  402. package/dist/wallet/signer-network-admin.js +184 -0
  403. package/dist/wallet/signer-protocol-v2.generated.js +90 -0
  404. package/dist/wallet/solana-bond-signing.js +157 -69
  405. package/dist/wallet/solana-reviewed-transaction.js +375 -0
  406. package/dist/wallet/solana-swap.js +520 -64
  407. package/dist/wallet/solana-transaction-inspection.js +106 -4
  408. package/dist/wallet/solana-trigger.js +658 -320
  409. package/dist/wallet/turnkey-reviewed-state.js +370 -0
  410. package/dist/wallet/wallet-approval-auth.js +20 -31
  411. package/dist/wallet/wallet-atomic-state.js +53 -0
  412. package/dist/wallet/wallet-audit-log.js +5 -5
  413. package/dist/wallet/wallet-canary.js +0 -1
  414. package/dist/wallet/wallet-inbound-events.js +19 -14
  415. package/dist/wallet/wallet-observability.js +5 -5
  416. package/dist/wallet/wallet-policy-simulation.js +1 -1
  417. package/dist/wallet/wallet-policy.js +95 -41
  418. package/dist/wallet/wallet-provider-capabilities.js +28 -4
  419. package/dist/wallet/wallet-provider-registry.js +64 -51
  420. package/dist/wallet/wallet-provider-resolver.js +62 -63
  421. package/dist/wallet/wallet-runtime-config.js +31 -44
  422. package/dist/wallet/wallet-secrets-store.js +44 -22
  423. package/dist/wallet/wallet-send-approvals.js +1894 -592
  424. package/dist/wallet/wallet-send-execution-ledger.js +292 -0
  425. package/dist/wallet/wallet-settlement-links.js +17 -16
  426. package/dist/wallet/wallet-standard-review.js +353 -0
  427. package/dist/wallet/wallet-status.js +0 -9
  428. package/dist/wallet/wallet-task-ledger.js +16 -2
  429. package/dist/web/accounts.js +3 -3
  430. package/dist/web/auth-store.js +18 -18
  431. package/dist/web/auto-reply/heartbeat-runner.js +1 -1
  432. package/dist/web/auto-reply/monitor.js +2 -2
  433. package/dist/web/session.js +4 -4
  434. package/dist/wizard/host-security-capability.js +15 -24
  435. package/dist/wizard/onboarding.finalize.js +63 -184
  436. package/dist/wizard/onboarding.host-security.js +118 -1368
  437. package/dist/wizard/onboarding.js +180 -242
  438. package/dist/wizard/onboarding.wallet.js +323 -829
  439. package/extensions/acpx/package.json +1 -1
  440. package/extensions/bluebubbles/package.json +1 -1
  441. package/extensions/copilot-proxy/package.json +1 -1
  442. package/extensions/diagnostics-otel/package.json +1 -1
  443. package/extensions/fased-federation/package.json +1 -1
  444. package/extensions/google-gemini-cli-auth/package.json +1 -1
  445. package/extensions/imessage/package.json +1 -1
  446. package/extensions/irc/package.json +1 -1
  447. package/extensions/line/package.json +1 -1
  448. package/extensions/llm-task/package.json +1 -1
  449. package/extensions/lobster/package.json +1 -1
  450. package/extensions/matrix/CHANGELOG.md +18 -0
  451. package/extensions/matrix/package.json +1 -1
  452. package/extensions/mattermost/package.json +1 -1
  453. package/extensions/memory-core/package.json +2 -2
  454. package/extensions/memory-lancedb/package.json +1 -1
  455. package/extensions/minimax-portal-auth/package.json +1 -1
  456. package/extensions/msteams/CHANGELOG.md +18 -0
  457. package/extensions/msteams/package.json +1 -1
  458. package/extensions/nextcloud-talk/package.json +1 -1
  459. package/extensions/nostr/CHANGELOG.md +18 -0
  460. package/extensions/nostr/package.json +1 -1
  461. package/extensions/open-prose/package.json +1 -1
  462. package/extensions/sat-mining/index.ts +498 -153
  463. package/extensions/sat-mining/package.json +1 -1
  464. package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
  465. package/extensions/sat-mining/src/audit-store.ts +50 -5
  466. package/extensions/sat-mining/src/claim-service.ts +85 -14
  467. package/extensions/sat-mining/src/config.ts +9 -0
  468. package/extensions/sat-mining/src/cycle-progress.ts +16 -8
  469. package/extensions/sat-mining/src/epoch-service.ts +9 -5
  470. package/extensions/sat-mining/src/gateway-runner.ts +21 -1
  471. package/extensions/sat-mining/src/protocol-contract.ts +45 -1
  472. package/extensions/sat-mining/src/recovery-service.ts +312 -0
  473. package/extensions/sat-mining/src/round-watcher.ts +391 -81
  474. package/extensions/sat-mining/src/rpc-read.ts +330 -89
  475. package/extensions/sat-mining/src/runtime.ts +14 -0
  476. package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
  477. package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
  478. package/extensions/sat-mining/src/solana-submit.ts +1199 -428
  479. package/extensions/sat-mining/src/submission-ledger.ts +433 -0
  480. package/extensions/signal/package.json +1 -1
  481. package/extensions/synology-chat/package.json +1 -1
  482. package/extensions/tlon/package.json +1 -1
  483. package/extensions/twitch/CHANGELOG.md +18 -0
  484. package/extensions/twitch/package.json +1 -1
  485. package/extensions/voice-call/CHANGELOG.md +18 -0
  486. package/extensions/voice-call/package.json +1 -1
  487. package/extensions/zalo/CHANGELOG.md +18 -0
  488. package/extensions/zalo/package.json +1 -1
  489. package/extensions/zalouser/CHANGELOG.md +18 -0
  490. package/extensions/zalouser/package.json +1 -1
  491. package/install.sh +4955 -0
  492. package/package.json +24 -5
  493. package/scripts/fased-host-updater.mjs +1421 -0
  494. package/scripts/fased-host-updaterctl.mjs +186 -0
  495. package/scripts/fased-managed-service.sh +36 -0
  496. package/scripts/fased-managed-updater.mjs +3065 -156
  497. package/scripts/fased-signer-enroll-hosting.sh +275 -0
  498. package/scripts/fased-signer-network-hosting.sh +143 -0
  499. package/scripts/fased-signer-owner-policy.mjs +1430 -0
  500. package/scripts/fased-signer-policy-hosting.sh +50 -0
  501. package/scripts/fased-signer-policy-local.sh +26 -0
  502. package/scripts/hosted-release-manifest.mjs +185 -0
  503. package/scripts/install-fased-signerd.sh +217 -0
  504. package/scripts/install-managed-runtime.mjs +212 -10
  505. package/scripts/managed-runtime-layout.mjs +75 -3
  506. package/scripts/migrate-hosted-signer-v2.mjs +58 -0
  507. package/scripts/start-managed.sh +169 -360
  508. package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
  509. package/dist/plugin-sdk/tmp-fased-dir-BdFQvrvw.d.ts +0 -77
  510. package/dist/wallet/local-socket-signer-broker.js +0 -224
  511. package/dist/wallet/local-socket-signer-custody.js +0 -42
  512. package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
  513. package/dist/wallet/providers/privy-adapter.js +0 -80
  514. package/dist/wallet/wallet-custody.js +0 -1836
@@ -0,0 +1,349 @@
1
+ import { resolveStateDir } from "../../../config/paths.js";
2
+ import { withFileLock } from "../../../plugin-sdk/file-lock.js";
3
+ import "../../../plugin-sdk/sat-runtime.js";
4
+ import path from "node:path";
5
+ import fs from "node:fs/promises";
6
+ import { createHash, randomUUID } from "node:crypto";
7
+
8
+ //#region extensions/sat-mining/src/submission-ledger.ts
9
+ const DEFAULT_LOCK_OPTIONS = {
10
+ retries: {
11
+ retries: 120,
12
+ factor: 1.15,
13
+ minTimeout: 10,
14
+ maxTimeout: 100,
15
+ randomize: true
16
+ },
17
+ stale: 12e4
18
+ };
19
+ const localLedgerWriteChains = new Map();
20
+ async function withSatSubmissionLedgerLock(filePath, task) {
21
+ const previous = localLedgerWriteChains.get(filePath) ?? Promise.resolve();
22
+ let releaseLocal;
23
+ const localGate = new Promise((resolve) => {
24
+ releaseLocal = resolve;
25
+ });
26
+ const current = previous.catch(() => undefined).then(async () => await localGate);
27
+ localLedgerWriteChains.set(filePath, current);
28
+ await previous.catch(() => undefined);
29
+ try {
30
+ return await withFileLock(filePath, DEFAULT_LOCK_OPTIONS, task);
31
+ } finally {
32
+ releaseLocal();
33
+ void current.finally(() => {
34
+ if (localLedgerWriteChains.get(filePath) === current) {
35
+ localLedgerWriteChains.delete(filePath);
36
+ }
37
+ });
38
+ }
39
+ }
40
+ function sha256(value) {
41
+ return createHash("sha256").update(value).digest("hex");
42
+ }
43
+ function canonicalize(value) {
44
+ if (Array.isArray(value)) {
45
+ return value.map((entry) => canonicalize(entry));
46
+ }
47
+ if (value && typeof value === "object") {
48
+ return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => [key, canonicalize(entry)]));
49
+ }
50
+ if (typeof value === "bigint") {
51
+ return value.toString();
52
+ }
53
+ return value;
54
+ }
55
+ function digestSatSubmissionIntent(value) {
56
+ return `sha256:${sha256(JSON.stringify(canonicalize(value)))}`;
57
+ }
58
+ function buildSatSubmissionOperationKey(intent) {
59
+ const action = typeof intent.action === "string" && intent.action.trim() ? intent.action.trim() : "sat";
60
+ const accountShape = Array.isArray(intent.instructions) ? intent.instructions.map((instruction) => {
61
+ const candidate = instruction;
62
+ return {
63
+ action: candidate.action,
64
+ keys: candidate.keys
65
+ };
66
+ }) : intent.keys;
67
+ return `${action}:${sha256(JSON.stringify(canonicalize(accountShape))).slice(0, 24)}`;
68
+ }
69
+ function normalizeStateKey(value) {
70
+ const normalized = value.trim().replace(/[^a-zA-Z0-9._-]+/g, "_");
71
+ return normalized || "unattached";
72
+ }
73
+ function resolveSatSubmissionLedgerPath(params) {
74
+ const env = params.env ?? process.env;
75
+ return path.join(resolveStateDir(env), "sat-mining", "wallets", normalizeStateKey(params.walletId), "submission-ledger.json");
76
+ }
77
+ function emptyLedger() {
78
+ return {
79
+ version: 1,
80
+ records: {}
81
+ };
82
+ }
83
+ function normalizeRecord(value) {
84
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
85
+ return null;
86
+ }
87
+ const record = value;
88
+ if (typeof record.requestId !== "string" || typeof record.workflowId !== "string" || typeof record.operationKey !== "string" || !/^sha256:[0-9a-f]{64}$/u.test(String(record.intentDigest ?? "")) || typeof record.walletId !== "string" || typeof record.action !== "string" || ![
89
+ "prepared",
90
+ "reserved",
91
+ "broadcast",
92
+ "confirmed",
93
+ "failed",
94
+ "unknown"
95
+ ].includes(String(record.state ?? ""))) {
96
+ return null;
97
+ }
98
+ return record;
99
+ }
100
+ async function readLedger(filePath) {
101
+ try {
102
+ const parsed = JSON.parse(await fs.readFile(filePath, "utf8"));
103
+ if (parsed.version !== 1 || !parsed.records || typeof parsed.records !== "object") {
104
+ throw new Error(`invalid SAT submission ledger format at ${filePath}`);
105
+ }
106
+ const records = {};
107
+ for (const [requestId, raw] of Object.entries(parsed.records)) {
108
+ const record = normalizeRecord(raw);
109
+ if (!record || record.requestId !== requestId) {
110
+ throw new Error(`invalid SAT submission ledger record ${requestId}`);
111
+ }
112
+ records[requestId] = record;
113
+ }
114
+ return {
115
+ version: 1,
116
+ records
117
+ };
118
+ } catch (error) {
119
+ if (error.code === "ENOENT") {
120
+ return emptyLedger();
121
+ }
122
+ throw error;
123
+ }
124
+ }
125
+ async function writeLedger(filePath, ledger) {
126
+ await fs.mkdir(path.dirname(filePath), {
127
+ recursive: true,
128
+ mode: 448
129
+ });
130
+ const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;
131
+ const handle = await fs.open(tempPath, "wx", 384);
132
+ try {
133
+ await handle.writeFile(`${JSON.stringify(ledger, null, 2)}\n`, "utf8");
134
+ await handle.sync();
135
+ } finally {
136
+ await handle.close();
137
+ }
138
+ try {
139
+ await fs.rename(tempPath, filePath);
140
+ const directory = await fs.open(path.dirname(filePath), "r");
141
+ try {
142
+ await directory.sync();
143
+ } finally {
144
+ await directory.close();
145
+ }
146
+ } catch (error) {
147
+ await fs.rm(tempPath, { force: true }).catch(() => undefined);
148
+ throw error;
149
+ }
150
+ }
151
+ function leaseDurationMs(env) {
152
+ const configured = Number(env.FASED_SAT_SUBMISSION_LEASE_MS ?? "");
153
+ if (Number.isFinite(configured) && configured >= 50 && configured <= 3e5) {
154
+ return Math.floor(configured);
155
+ }
156
+ return 6e4;
157
+ }
158
+ function isPidAlive(pid) {
159
+ if (!Number.isSafeInteger(pid) || pid <= 0) {
160
+ return false;
161
+ }
162
+ try {
163
+ process.kill(pid, 0);
164
+ return true;
165
+ } catch (error) {
166
+ return error.code === "EPERM";
167
+ }
168
+ }
169
+ function leaseIsLive(lease, now = Date.now()) {
170
+ if (!lease || Date.parse(lease.expiresAt) <= now) {
171
+ return false;
172
+ }
173
+ return lease.pid === process.pid || isPidAlive(lease.pid);
174
+ }
175
+ function assertStateTransition(requestId, current, next) {
176
+ const allowed = {
177
+ prepared: new Set([
178
+ "prepared",
179
+ "reserved",
180
+ "broadcast",
181
+ "confirmed",
182
+ "failed",
183
+ "unknown"
184
+ ]),
185
+ reserved: new Set([
186
+ "reserved",
187
+ "broadcast",
188
+ "confirmed",
189
+ "failed",
190
+ "unknown"
191
+ ]),
192
+ broadcast: new Set([
193
+ "broadcast",
194
+ "confirmed",
195
+ "failed",
196
+ "unknown"
197
+ ]),
198
+ unknown: new Set([
199
+ "broadcast",
200
+ "confirmed",
201
+ "failed",
202
+ "unknown"
203
+ ]),
204
+ confirmed: new Set(["confirmed"]),
205
+ failed: new Set(["failed"])
206
+ };
207
+ if (!allowed[current].has(next)) {
208
+ throw new Error(`SAT submission ${requestId} cannot move from ${current} back to ${next}`);
209
+ }
210
+ }
211
+ function buildSatSubmissionRequestId(params) {
212
+ const digest = sha256(JSON.stringify([
213
+ "fased-sat-submission-v1",
214
+ params.walletId,
215
+ params.workflowId,
216
+ params.operationKey
217
+ ]));
218
+ return `sat-v2-${digest.slice(0, 48)}`;
219
+ }
220
+ async function claimSatSubmission(params) {
221
+ const env = params.env ?? process.env;
222
+ const filePath = resolveSatSubmissionLedgerPath({
223
+ walletId: params.walletId,
224
+ env
225
+ });
226
+ const requestId = buildSatSubmissionRequestId(params);
227
+ const owner = params.owner ?? `${process.pid}:${randomUUID()}`;
228
+ return await withSatSubmissionLedgerLock(filePath, async () => {
229
+ const ledger = await readLedger(filePath);
230
+ const existing = ledger.records[requestId];
231
+ if (existing) {
232
+ if (existing.intentDigest !== params.intentDigest || existing.walletId !== params.walletId || existing.workflowId !== params.workflowId || existing.operationKey !== params.operationKey) {
233
+ throw new Error(`SAT idempotency collision for ${requestId}: the workflow key is already bound to a different immutable intent digest`);
234
+ }
235
+ if (leaseIsLive(existing.lease) && existing.lease?.owner !== owner) {
236
+ return {
237
+ record: existing,
238
+ created: false,
239
+ claimed: false,
240
+ owner
241
+ };
242
+ }
243
+ const now = new Date().toISOString();
244
+ existing.lease = {
245
+ owner,
246
+ pid: process.pid,
247
+ acquiredAt: now,
248
+ expiresAt: new Date(Date.now() + leaseDurationMs(env)).toISOString()
249
+ };
250
+ existing.attempts += 1;
251
+ existing.updatedAt = now;
252
+ await writeLedger(filePath, ledger);
253
+ return {
254
+ record: existing,
255
+ created: false,
256
+ claimed: true,
257
+ owner
258
+ };
259
+ }
260
+ const now = new Date().toISOString();
261
+ const record = {
262
+ requestId,
263
+ workflowId: params.workflowId,
264
+ operationKey: params.operationKey,
265
+ intentDigest: params.intentDigest,
266
+ walletId: params.walletId,
267
+ action: params.action,
268
+ state: "prepared",
269
+ attempts: 1,
270
+ createdAt: now,
271
+ updatedAt: now,
272
+ lease: {
273
+ owner,
274
+ pid: process.pid,
275
+ acquiredAt: now,
276
+ expiresAt: new Date(Date.now() + leaseDurationMs(env)).toISOString()
277
+ }
278
+ };
279
+ ledger.records[requestId] = record;
280
+ await writeLedger(filePath, ledger);
281
+ return {
282
+ record,
283
+ created: true,
284
+ claimed: true,
285
+ owner
286
+ };
287
+ });
288
+ }
289
+ async function readSatSubmission(params) {
290
+ const filePath = resolveSatSubmissionLedgerPath(params);
291
+ return await withSatSubmissionLedgerLock(filePath, async () => {
292
+ const ledger = await readLedger(filePath);
293
+ return ledger.records[params.requestId] ?? null;
294
+ });
295
+ }
296
+ async function updateSatSubmission(params) {
297
+ const filePath = resolveSatSubmissionLedgerPath(params);
298
+ return await withSatSubmissionLedgerLock(filePath, async () => {
299
+ const ledger = await readLedger(filePath);
300
+ const record = ledger.records[params.requestId];
301
+ if (!record) {
302
+ throw new Error(`SAT submission ${params.requestId} is missing from its durable ledger`);
303
+ }
304
+ if (record.intentDigest !== params.intentDigest) {
305
+ throw new Error(`SAT submission ${params.requestId} intent digest changed during execution`);
306
+ }
307
+ if (params.owner && record.lease?.owner !== params.owner) {
308
+ throw new Error(`SAT submission ${params.requestId} lease ownership changed during execution`);
309
+ }
310
+ if (record.signature && params.signature && record.signature !== params.signature) {
311
+ throw new Error(`SAT submission ${params.requestId} returned a different transaction signature`);
312
+ }
313
+ assertStateTransition(params.requestId, record.state, params.state);
314
+ record.state = params.state;
315
+ if (params.signature !== undefined) {
316
+ record.signature = params.signature;
317
+ }
318
+ if (params.error !== undefined) {
319
+ record.error = params.error;
320
+ } else if (params.state === "confirmed") {
321
+ delete record.error;
322
+ }
323
+ if (params.releaseLease) {
324
+ delete record.lease;
325
+ }
326
+ record.updatedAt = new Date().toISOString();
327
+ await writeLedger(filePath, ledger);
328
+ return record;
329
+ });
330
+ }
331
+ async function waitForSatSubmissionLease(params) {
332
+ const timeoutAt = Date.now() + Math.max(100, params.timeoutMs ?? 65e3);
333
+ for (;;) {
334
+ const record = await readSatSubmission(params);
335
+ if (!record) {
336
+ throw new Error(`SAT submission ${params.requestId} disappeared while waiting for its lease`);
337
+ }
338
+ if (!leaseIsLive(record.lease)) {
339
+ return record;
340
+ }
341
+ if (Date.now() >= timeoutAt) {
342
+ throw new Error(`SAT submission ${params.requestId} is already executing in another process; retry the same idempotency key`);
343
+ }
344
+ await new Promise((resolve) => setTimeout(resolve, 25));
345
+ }
346
+ }
347
+
348
+ //#endregion
349
+ export { buildSatSubmissionOperationKey, claimSatSubmission, digestSatSubmissionIntent, updateSatSubmission, waitForSatSubmissionLease };
@@ -1,7 +1,7 @@
1
1
  import { resolveStateDir } from "../config/paths.js";
2
2
  import { isTruthyEnvValue } from "../infra/env.js";
3
3
  import { resolveAgentPublicOrigin, resolveFederationBaseUrl, resolveFederationBondWalletId, resolveFederationHandle } from "./runtime.js";
4
- import { resolveFederationBondWallet, signFederationBondChallenge } from "../wallet/solana-bond-signing.js";
4
+ import { FEDERATION_BOND_SIGNATURE_DOMAIN, federationBondSigningMessageBase64, resolveFederationBondWallet, signFederationBondChallenge } from "../wallet/solana-bond-signing.js";
5
5
  import { buildAttestation } from "./attestation.js";
6
6
  import path from "node:path";
7
7
  import fs from "node:fs/promises";
@@ -116,7 +116,7 @@ async function loadPersistedFederationBondProof(env) {
116
116
  try {
117
117
  const raw = await fs.readFile(proofPath, "utf-8");
118
118
  const parsed = JSON.parse(raw);
119
- if (typeof parsed.challengeId !== "string" || typeof parsed.bondId !== "string" || typeof parsed.walletId !== "string" || typeof parsed.walletAddress !== "string" || typeof parsed.handle !== "string" || typeof parsed.nodeId !== "string" || typeof parsed.federationBaseUrl !== "string" || typeof parsed.expiresAt !== "string" || typeof parsed.payload !== "string" || typeof parsed.payloadBase64 !== "string" || typeof parsed.signatureBase64 !== "string" || typeof parsed.signedAt !== "string") {
119
+ if (typeof parsed.challengeId !== "string" || typeof parsed.bondId !== "string" || typeof parsed.walletId !== "string" || typeof parsed.walletAddress !== "string" || typeof parsed.handle !== "string" || typeof parsed.nodeId !== "string" || typeof parsed.federationBaseUrl !== "string" || typeof parsed.expiresAt !== "string" || typeof parsed.payload !== "string" || typeof parsed.payloadBase64 !== "string" || parsed.signatureDomain !== FEDERATION_BOND_SIGNATURE_DOMAIN || typeof parsed.signedMessageBase64 !== "string" || typeof parsed.signatureBase64 !== "string" || typeof parsed.signedAt !== "string") {
120
120
  return null;
121
121
  }
122
122
  return {
@@ -130,6 +130,8 @@ async function loadPersistedFederationBondProof(env) {
130
130
  expiresAt: parsed.expiresAt,
131
131
  payload: parsed.payload,
132
132
  payloadBase64: parsed.payloadBase64,
133
+ signatureDomain: FEDERATION_BOND_SIGNATURE_DOMAIN,
134
+ signedMessageBase64: parsed.signedMessageBase64,
133
135
  signatureBase64: parsed.signatureBase64,
134
136
  signedAt: parsed.signedAt,
135
137
  verifiedAt: typeof parsed.verifiedAt === "string" ? parsed.verifiedAt : undefined,
@@ -371,12 +373,38 @@ async function createFederationBondProof(opts) {
371
373
  const challengeBody = challenge.json ?? {};
372
374
  const challengeId = challengeBody.challengeId?.trim();
373
375
  const expiresAt = challengeBody.expiresAt?.trim();
374
- const payload = challengeBody.payload?.trim() || (challengeBody.payloadBase64 ? Buffer.from(challengeBody.payloadBase64, "base64").toString("utf-8") : "");
375
- if (!challengeId || !expiresAt || !payload) {
376
+ let payloadBase64 = challengeBody.payloadBase64?.trim() ?? "";
377
+ let payload = challengeBody.payload ?? "";
378
+ if (payloadBase64) {
379
+ const decoded = Buffer.from(payloadBase64, "base64");
380
+ if (decoded.toString("base64") !== payloadBase64) {
381
+ throw new Error("federation bond challenge failed: payloadBase64 is not canonical");
382
+ }
383
+ const decodedPayload = decoded.toString("utf-8");
384
+ if (payload && payload !== decodedPayload) {
385
+ throw new Error("federation bond challenge failed: payload encodings disagree");
386
+ }
387
+ payload = decodedPayload;
388
+ } else if (payload) {
389
+ payloadBase64 = Buffer.from(payload, "utf-8").toString("base64");
390
+ }
391
+ if (!challengeId || !expiresAt || !payload || !payloadBase64) {
376
392
  throw new Error("federation bond challenge failed: incomplete challenge payload");
377
393
  }
394
+ if (!opts?.tier) {
395
+ throw new Error("federation bond challenge requires the locally reviewed bond tier");
396
+ }
378
397
  const signedWallet = await signFederationBondChallenge({
379
- payload,
398
+ challengeId,
399
+ federationOrigin: baseUrl,
400
+ payloadBase64,
401
+ handle: federationToken.handle,
402
+ nodeId: federationToken.nodeId,
403
+ tokenId: federationToken.tokenId,
404
+ bondId,
405
+ tier: opts.tier,
406
+ ...opts.amountRaw?.trim() ? { amountRaw: opts.amountRaw.trim() } : {},
407
+ expiresAt,
380
408
  env,
381
409
  cfg: opts?.cfg,
382
410
  walletId: resolvedWallet.walletId
@@ -391,14 +419,74 @@ async function createFederationBondProof(opts) {
391
419
  federationBaseUrl: baseUrl,
392
420
  expiresAt,
393
421
  payload,
394
- payloadBase64: challengeBody.payloadBase64?.trim() || Buffer.from(payload, "utf-8").toString("base64"),
422
+ payloadBase64,
423
+ signatureDomain: FEDERATION_BOND_SIGNATURE_DOMAIN,
424
+ signedMessageBase64: federationBondSigningMessageBase64({
425
+ challengeId,
426
+ federationOrigin: baseUrl,
427
+ payloadBase64
428
+ }),
395
429
  signatureBase64: signedWallet.signatureBase64,
396
- signedAt: new Date().toISOString()
430
+ signedAt: new Date().toISOString(),
431
+ ...opts?.amountRaw?.trim() ? { bondAmountRaw: opts.amountRaw.trim() } : {},
432
+ ...opts?.tier ? { bondTier: opts.tier } : {}
397
433
  };
398
434
  await persistFederationBondProof(env, proof);
399
435
  opts?.log?.info?.(`federation bond proof prepared (${proof.handle} -> ${proof.walletAddress}, bond=${proof.bondId})`);
400
436
  return proof;
401
437
  }
438
+ async function persistFederationBondProofFromSignerReview(params) {
439
+ const env = params.env ?? process.env;
440
+ const review = params.review;
441
+ if (review.state !== "signed" || review.intentType !== "federation.bondChallenge" || review.semanticIntent.type !== "federation.bondChallenge" || review.artifactKind !== "domain-separated-message" || review.asset !== "federation:bond-challenge" || review.amount !== "1" || review.policyOperation !== "federation.bondChallenge" || review.requiredRole !== "vault" || review.requiredPrograms.length !== 1 || review.requiredPrograms[0] !== "domain:fased:federation-bond-challenge-v1") {
442
+ throw new Error("signed signer review is not an exact federation bond challenge");
443
+ }
444
+ const federation = review.semanticIntent.federation;
445
+ const signedMessageBase64 = federationBondSigningMessageBase64(federation);
446
+ if (!review.walletPublicKey || review.destination !== review.walletPublicKey || review.messageBase64 !== signedMessageBase64 || review.signature !== params.signatureBase64) {
447
+ throw new Error("signed federation review artifact does not match its wallet or payload");
448
+ }
449
+ const signature = Buffer.from(params.signatureBase64, "base64");
450
+ if (signature.length !== 64 || signature.toString("base64") !== params.signatureBase64) {
451
+ throw new Error("signed federation review returned a non-canonical Ed25519 signature");
452
+ }
453
+ const payloadBytes = Buffer.from(federation.payloadBase64, "base64");
454
+ if (payloadBytes.toString("base64") !== federation.payloadBase64) {
455
+ throw new Error("signed federation review payload is not canonical base64");
456
+ }
457
+ const payload = payloadBytes.toString("utf8");
458
+ if (!Buffer.from(payload, "utf8").equals(payloadBytes)) {
459
+ throw new Error("signed federation review payload is not valid UTF-8");
460
+ }
461
+ const challengeExpiresAt = Date.parse(federation.expiresAt);
462
+ if (!Number.isFinite(challengeExpiresAt) || challengeExpiresAt <= Date.now()) {
463
+ throw new Error("signed federation review challenge has expired");
464
+ }
465
+ const token = await loadPersistedFederationToken(env, { includeExpired: true });
466
+ if (!token || token.tokenId !== federation.tokenId || token.nodeId !== federation.nodeId || token.handle !== federation.handle) {
467
+ throw new Error("signed federation review does not match the persisted federation identity");
468
+ }
469
+ const configuredOrigin = resolveFederationBaseUrl(env);
470
+ if (!configuredOrigin || new URL(configuredOrigin).origin !== federation.federationOrigin) {
471
+ throw new Error("signed federation review does not match the configured federation origin");
472
+ }
473
+ return await persistFederationBondProof(env, {
474
+ challengeId: federation.challengeId,
475
+ bondId: federation.bondId,
476
+ walletId: params.walletId,
477
+ walletAddress: review.walletPublicKey,
478
+ handle: federation.handle,
479
+ nodeId: federation.nodeId,
480
+ federationBaseUrl: federation.federationOrigin,
481
+ expiresAt: federation.expiresAt,
482
+ payload,
483
+ payloadBase64: federation.payloadBase64,
484
+ signatureDomain: FEDERATION_BOND_SIGNATURE_DOMAIN,
485
+ signedMessageBase64,
486
+ signatureBase64: params.signatureBase64,
487
+ signedAt: review.updatedAt
488
+ });
489
+ }
402
490
  async function submitFederationBondProof(opts) {
403
491
  const env = opts?.env ?? process.env;
404
492
  const proof = opts?.proof ?? await loadPersistedFederationBondProof(env);
@@ -415,6 +503,8 @@ async function submitFederationBondProof(opts) {
415
503
  body: {
416
504
  challengeId: proof.challengeId,
417
505
  payloadBase64: proof.payloadBase64,
506
+ signatureDomain: proof.signatureDomain,
507
+ signedMessageBase64: proof.signedMessageBase64,
418
508
  signatureBase64: proof.signatureBase64
419
509
  }
420
510
  });
@@ -713,4 +803,4 @@ function startFederationAutoConnect(opts) {
713
803
  }
714
804
 
715
805
  //#endregion
716
- export { createAndSubmitFederationBondProof, loadPersistedFederationBondProof, runFederationAutoConnectOnce, startFederationAutoConnect };
806
+ export { createAndSubmitFederationBondProof, loadPersistedFederationBondProof, persistFederationBondProofFromSignerReview, runFederationAutoConnectOnce, startFederationAutoConnect, submitFederationBondProof };
@@ -1,3 +1,4 @@
1
+ import { fetchWithSsrFGuard } from "../infra/net/fetch-guard.js";
1
2
  import { isMarketplaceAutomatedAdapterServiceKind } from "./marketplace-service-kinds.js";
2
3
  import { listLocalMarketplaceDeliveryTargets, listLocalMarketplaceOrders, upsertMarketplaceOrderConfig } from "./offers.js";
3
4
 
@@ -168,14 +169,36 @@ async function postWebhookDelivery(params) {
168
169
  };
169
170
  }
170
171
  try {
171
- const response = await params.fetchImpl(url, {
172
- method: "POST",
173
- headers: {
174
- "content-type": "application/json",
175
- "x-fased-marketplace-delivery": "capability"
176
- },
177
- body: JSON.stringify(params.payload)
172
+ if (new URL(url).protocol !== "https:") {
173
+ return {
174
+ ok: false,
175
+ reason: "webhook delivery requires HTTPS"
176
+ };
177
+ }
178
+ } catch {
179
+ return {
180
+ ok: false,
181
+ reason: "webhook delivery target has an invalid URL"
182
+ };
183
+ }
184
+ let guarded;
185
+ try {
186
+ guarded = await fetchWithSsrFGuard({
187
+ url,
188
+ fetchImpl: params.fetchImpl,
189
+ lookupFn: params.ssrfLookupFn,
190
+ timeoutMs: 1e4,
191
+ auditContext: "marketplace-capability-webhook",
192
+ init: {
193
+ method: "POST",
194
+ headers: {
195
+ "content-type": "application/json",
196
+ "x-fased-marketplace-delivery": "capability"
197
+ },
198
+ body: JSON.stringify(params.payload)
199
+ }
178
200
  });
201
+ const response = guarded.response;
179
202
  if (!response.ok) {
180
203
  return {
181
204
  ok: false,
@@ -188,6 +211,8 @@ async function postWebhookDelivery(params) {
188
211
  ok: false,
189
212
  reason: error instanceof Error ? error.message : String(error)
190
213
  };
214
+ } finally {
215
+ await guarded?.release();
191
216
  }
192
217
  }
193
218
  function resolveSubscriptionUpdate(params) {
@@ -279,6 +304,7 @@ async function runMarketplaceCapabilityAdapter(params) {
279
304
  } else if (targetKind === "webhook") {
280
305
  const webhookResult = await postWebhookDelivery({
281
306
  fetchImpl: deps.fetchImpl,
307
+ ssrfLookupFn: deps.ssrfLookupFn,
282
308
  target,
283
309
  payload: deliveryPayload
284
310
  });