@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
@@ -1,186 +1,292 @@
1
- import { loadConfig } from "../config/io.js";
2
- import "../config/config.js";
3
- import { resolveWalletRuntimeConfig } from "../wallet/wallet-runtime-config.js";
4
- import { appendWalletAuditEntry } from "../wallet/wallet-audit-log.js";
5
- import { createOrExecuteWalletSend } from "../wallet/wallet-send-approvals.js";
1
+ import { isValidSolanaAddress } from "../wallet/solana-address.js";
2
+ import { fetchSolanaRpc } from "../wallet/solana-assets.js";
3
+ import { resolveScopedRpcUrlForWallet } from "../wallet/wallet-provider-resolver.js";
6
4
 
7
5
  //#region src/gateway/a2a-settlement.ts
6
+ const A2A_PAYMENT_MEMO_PROGRAM = "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr";
8
7
  function isRecord(value) {
9
- return typeof value === "object" && value !== null;
8
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
10
9
  }
11
- function asString(value) {
12
- if (typeof value !== "string") {
13
- return undefined;
14
- }
15
- const trimmed = value.trim();
16
- return trimmed.length > 0 ? trimmed : undefined;
17
- }
18
- function asAmountString(value) {
19
- if (typeof value === "number" && Number.isFinite(value)) {
20
- return String(value);
21
- }
22
- return asString(value);
10
+ function stringField(record, field) {
11
+ return typeof record[field] === "string" ? record[field].trim() : "";
23
12
  }
24
- function normalizeChain(value) {
25
- const chain = asString(value)?.toLowerCase();
26
- if (chain === "solana") {
27
- return "solana";
28
- }
29
- return null;
13
+ function recordsEqual(left, right) {
14
+ return JSON.stringify(left) === JSON.stringify(right);
30
15
  }
31
- function normalizeProviderId(value) {
32
- const normalized = asString(value)?.toLowerCase();
33
- if (normalized === "embedded-keystore" || normalized === "local-socket-signer" || normalized === "alchemy" || normalized === "turnkey" || normalized === "privy") {
34
- return normalized;
16
+ function canonicalAsset(value) {
17
+ if (!isRecord(value)) {
18
+ return null;
35
19
  }
36
- return undefined;
37
- }
38
- function pickString(...values) {
39
- for (const value of values) {
40
- const found = asString(value);
41
- if (found) {
42
- return found;
43
- }
20
+ const kind = stringField(value, "kind").toLowerCase();
21
+ if (kind === "native") {
22
+ return { kind };
44
23
  }
45
- return undefined;
46
- }
47
- function extractCanonicalProgramAddress(assetValue) {
48
- if (!isRecord(assetValue)) {
49
- return undefined;
24
+ const address = stringField(value, "address");
25
+ if (kind === "spl-token" && isValidSolanaAddress(address)) {
26
+ return {
27
+ kind,
28
+ address
29
+ };
50
30
  }
51
- const kind = asString(assetValue.kind)?.toLowerCase();
52
- const address = asString(assetValue.address);
53
- return kind === "spl-token" && address ? address : undefined;
31
+ return null;
54
32
  }
55
- function extractA2aSettlementIntent(taskInput) {
56
- if (!isRecord(taskInput)) {
33
+ function canonicalWallet(value) {
34
+ if (!isRecord(value) || stringField(value, "chain").toLowerCase() !== "solana") {
57
35
  return null;
58
36
  }
59
- const invoiceRecord = isRecord(taskInput.invoice) ? taskInput.invoice : null;
60
- const paymentRecord = isRecord(taskInput.payment) ? taskInput.payment : isRecord(taskInput.settlement) ? taskInput.settlement : null;
61
- const taskWalletRecord = isRecord(taskInput.wallet) ? taskInput.wallet : null;
62
- const paymentWalletRecord = isRecord(paymentRecord?.wallet) ? paymentRecord.wallet : null;
63
- const invoiceWalletRecord = isRecord(invoiceRecord?.wallet) ? invoiceRecord.wallet : null;
64
- const paymentAssetRecord = isRecord(paymentRecord?.asset) ? paymentRecord.asset : null;
65
- const invoiceAssetRecord = isRecord(invoiceRecord?.asset) ? invoiceRecord.asset : null;
66
- const invoiceId = pickString(taskInput.invoiceId, taskInput.invoiceRef, taskInput.receiptRef, invoiceRecord?.id, invoiceRecord?.invoiceId, invoiceRecord?.invoiceRef, paymentRecord?.invoiceId, paymentRecord?.invoiceRef);
67
- const chain = normalizeChain(taskInput.chain ?? paymentRecord?.chain ?? invoiceRecord?.chain ?? taskInput.network);
68
- if (!chain) {
37
+ const address = stringField(value, "address");
38
+ return isValidSolanaAddress(address) ? {
39
+ chain: "solana",
40
+ address
41
+ } : null;
42
+ }
43
+ function positiveSafeInteger(value) {
44
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : null;
45
+ }
46
+ function offerAmountInBaseUnits(offer) {
47
+ const amount = offer.pricing.amount;
48
+ const decimals = offer.paymentDefaults?.assetDecimals;
49
+ if (typeof amount !== "number" || !Number.isFinite(amount) || amount <= 0 || typeof decimals !== "number" || !Number.isInteger(decimals) || decimals < 0 || decimals > 18) {
69
50
  return null;
70
51
  }
71
- const amount = asAmountString(taskInput.amount ?? paymentRecord?.amount ?? invoiceRecord?.amount ?? taskInput.value);
72
- if (!amount) {
52
+ const scaled = amount * 10 ** decimals;
53
+ const rounded = Math.round(scaled);
54
+ return Number.isSafeInteger(rounded) && Math.abs(scaled - rounded) < 1e-6 ? rounded : null;
55
+ }
56
+ function parseTimestamp(value) {
57
+ if (typeof value !== "string" || !value.trim()) {
73
58
  return null;
74
59
  }
75
- const providerId = normalizeProviderId(taskInput.providerId ?? taskInput.walletProvider ?? paymentRecord?.providerId ?? paymentRecord?.walletProvider ?? invoiceRecord?.providerId);
76
- const walletId = pickString(taskInput.walletId, taskWalletRecord?.id, paymentRecord?.walletId, paymentWalletRecord?.id, invoiceRecord?.walletId);
77
- const walletName = pickString(taskInput.walletName, taskInput.wallet, taskWalletRecord?.name, paymentRecord?.walletName, paymentRecord?.wallet, paymentWalletRecord?.name, invoiceRecord?.walletName, invoiceWalletRecord?.name);
78
- const payload = {
79
- chain,
80
- to: pickString(taskInput.to, paymentRecord?.to, paymentRecord?.recipient, invoiceRecord?.to),
81
- amount,
82
- program: pickString(taskInput.program, paymentRecord?.program, invoiceRecord?.program, extractCanonicalProgramAddress(paymentAssetRecord), extractCanonicalProgramAddress(invoiceAssetRecord)),
83
- memo: pickString(taskInput.memo, paymentRecord?.memo, invoiceId),
84
- providerId,
85
- walletId,
86
- walletName
87
- };
88
- return {
89
- payload,
90
- invoiceId
91
- };
60
+ const parsed = Date.parse(value);
61
+ return Number.isFinite(parsed) ? parsed : null;
62
+ }
63
+ function accountKeyStrings(transaction) {
64
+ return (transaction.transaction?.message?.accountKeys ?? []).map((key) => typeof key === "string" ? key : String(key.pubkey ?? ""));
65
+ }
66
+ function parsedInstructions(transaction) {
67
+ return [...transaction.transaction?.message?.instructions ?? [], ...(transaction.meta?.innerInstructions ?? []).flatMap((entry) => entry.instructions ?? [])];
68
+ }
69
+ function hasExactNativeTransfer(params) {
70
+ return parsedInstructions(params.transaction).some((instruction) => {
71
+ const parsed = isRecord(instruction.parsed) ? instruction.parsed : null;
72
+ if (instruction.program !== "system" || parsed?.type !== "transfer") {
73
+ return false;
74
+ }
75
+ const info = isRecord(parsed.info) ? parsed.info : null;
76
+ return info?.source === params.payer && info?.destination === params.payee && positiveSafeInteger(info?.lamports) === params.amount;
77
+ });
78
+ }
79
+ function balanceAmount(entry) {
80
+ const value = entry?.uiTokenAmount?.amount;
81
+ return typeof value === "string" && /^\d+$/u.test(value) ? BigInt(value) : 0n;
82
+ }
83
+ function tokenBalanceFor(params) {
84
+ return params.balances.find((entry) => entry.accountIndex === params.accountIndex && entry.mint === params.mint && entry.owner === params.owner);
85
+ }
86
+ function hasExactTokenTransfer(params) {
87
+ const keys = accountKeyStrings(params.transaction);
88
+ const pre = params.transaction.meta?.preTokenBalances ?? [];
89
+ const post = params.transaction.meta?.postTokenBalances ?? [];
90
+ const expected = BigInt(params.amount);
91
+ return parsedInstructions(params.transaction).some((instruction) => {
92
+ if (instruction.program !== "spl-token") {
93
+ return false;
94
+ }
95
+ const parsed = isRecord(instruction.parsed) ? instruction.parsed : null;
96
+ const parsedType = parsed?.type;
97
+ if (parsedType !== "transfer" && parsedType !== "transferChecked") {
98
+ return false;
99
+ }
100
+ const info = isRecord(parsed?.info) ? parsed.info : null;
101
+ if (!info || info.authority !== params.payer) {
102
+ return false;
103
+ }
104
+ const instructionAmount = positiveSafeInteger(info.amount) ?? (isRecord(info.tokenAmount) ? positiveSafeInteger(Number(info.tokenAmount.amount)) : null);
105
+ if (instructionAmount !== params.amount) {
106
+ return false;
107
+ }
108
+ const sourceIndex = keys.indexOf(stringField(info, "source"));
109
+ const destinationIndex = keys.indexOf(stringField(info, "destination"));
110
+ if (sourceIndex < 0 || destinationIndex < 0) {
111
+ return false;
112
+ }
113
+ const sourcePre = tokenBalanceFor({
114
+ balances: pre,
115
+ accountIndex: sourceIndex,
116
+ mint: params.mint,
117
+ owner: params.payer
118
+ });
119
+ const sourcePost = tokenBalanceFor({
120
+ balances: post,
121
+ accountIndex: sourceIndex,
122
+ mint: params.mint,
123
+ owner: params.payer
124
+ });
125
+ const destinationPre = tokenBalanceFor({
126
+ balances: pre,
127
+ accountIndex: destinationIndex,
128
+ mint: params.mint,
129
+ owner: params.payee
130
+ });
131
+ const destinationPost = tokenBalanceFor({
132
+ balances: post,
133
+ accountIndex: destinationIndex,
134
+ mint: params.mint,
135
+ owner: params.payee
136
+ });
137
+ return Boolean(sourcePre && sourcePost && destinationPost) && balanceAmount(sourcePre) - balanceAmount(sourcePost) === expected && balanceAmount(destinationPost) - balanceAmount(destinationPre) === expected;
138
+ });
139
+ }
140
+ function hasExactPaymentMemo(transaction, expected) {
141
+ return parsedInstructions(transaction).some((instruction) => {
142
+ const isMemoProgram = instruction.program === "spl-memo" || instruction.programId === A2A_PAYMENT_MEMO_PROGRAM;
143
+ if (!isMemoProgram) {
144
+ return false;
145
+ }
146
+ if (typeof instruction.parsed === "string") {
147
+ return instruction.parsed === expected;
148
+ }
149
+ const parsed = isRecord(instruction.parsed) ? instruction.parsed : null;
150
+ return parsed?.memo === expected || parsed?.info === expected;
151
+ });
92
152
  }
93
153
  const DEFAULT_DEPS = {
94
- loadConfig,
95
- resolveWalletRuntimeConfig,
96
- createOrExecuteWalletSend
154
+ fetchSolanaRpc,
155
+ now: Date.now,
156
+ resolveRpcUrl: (env) => resolveScopedRpcUrlForWallet({
157
+ env,
158
+ chains: ["solana"]
159
+ })
97
160
  };
98
161
  async function orchestrateA2aTaskSettlement(params) {
99
162
  const deps = {
100
163
  ...DEFAULT_DEPS,
101
164
  ...params.deps
102
165
  };
103
- const intent = extractA2aSettlementIntent(params.taskInput);
104
- if (!intent) {
105
- return {
106
- status: "skipped",
107
- reason: "no settlement intent fields (requires chain + amount for paid-task settlement)"
108
- };
166
+ const env = params.env ?? process.env;
167
+ const task = isRecord(params.taskInput) ? params.taskInput : null;
168
+ const invoice = isRecord(params.invoice) ? params.invoice : null;
169
+ const receipt = isRecord(params.receipt) ? params.receipt : null;
170
+ const offer = params.offer;
171
+ const fail = (reason) => ({
172
+ status: "failed",
173
+ reason
174
+ });
175
+ const challenge = params.challenge;
176
+ if (!task || !invoice || !receipt || !offer || !offer.paymentDefaults || !challenge) {
177
+ return fail("paid task requires a seller-issued challenge, known offer, and complete invoice and receipt evidence");
109
178
  }
110
- const cfg = deps.loadConfig();
111
- const walletCfg = deps.resolveWalletRuntimeConfig(cfg, params.env ?? process.env);
112
- if (!walletCfg.enabled) {
113
- return {
114
- status: "skipped",
115
- invoiceId: intent.invoiceId,
116
- providerId: intent.payload.providerId,
117
- walletId: intent.payload.walletId,
118
- walletName: intent.payload.walletName,
119
- chain: intent.payload.chain,
120
- amount: intent.payload.amount,
121
- reason: "wallet is disabled"
122
- };
179
+ if (stringField(task, "taskId") !== params.taskId) {
180
+ return fail("task.taskId must match the durable task identity");
123
181
  }
124
- const send = await deps.createOrExecuteWalletSend({
125
- payload: intent.payload,
126
- requestedBy: params.actor?.trim() || "a2a-settlement",
127
- sendPath: "automation",
128
- settlementContext: {
129
- taskId: params.taskId,
130
- invoiceId: intent.invoiceId,
131
- senderHandle: params.senderHandle
132
- },
133
- config: walletCfg,
134
- env: params.env
135
- });
136
- if (!send.ok) {
137
- appendWalletAuditEntry({
138
- action: "send_failed",
139
- actor: params.actor?.trim() || "a2a-settlement",
140
- details: {
141
- taskId: params.taskId,
142
- invoiceId: intent.invoiceId,
143
- senderHandle: params.senderHandle,
144
- reason: send.message
145
- },
146
- env: params.env
147
- });
148
- return {
149
- status: "failed",
150
- invoiceId: intent.invoiceId,
151
- providerId: intent.payload.providerId,
152
- walletId: intent.payload.walletId,
153
- walletName: intent.payload.walletName,
154
- chain: intent.payload.chain,
155
- amount: intent.payload.amount,
156
- reason: send.message,
157
- requestId: send.requestId
158
- };
182
+ const offerIds = [
183
+ task,
184
+ invoice,
185
+ receipt
186
+ ].map((entry) => stringField(entry, "offerId"));
187
+ if (offerIds.some((value) => value !== offer.id)) {
188
+ return fail("task, invoice, and receipt must bind the exact seller offerId");
159
189
  }
160
- if (send.mode === "manual") {
161
- return {
162
- status: "queued",
163
- mode: "manual",
164
- requestId: send.request.id,
165
- invoiceId: intent.invoiceId,
166
- providerId: intent.payload.providerId,
167
- walletId: intent.payload.walletId,
168
- walletName: intent.payload.walletName,
169
- chain: intent.payload.chain,
170
- amount: intent.payload.amount
171
- };
190
+ const invoiceId = stringField(invoice, "invoiceId");
191
+ const receiptId = stringField(receipt, "receiptId");
192
+ if (!invoiceId || !receiptId || stringField(task, "invoice") !== invoiceId || stringField(task, "receipt") !== receiptId || stringField(receipt, "invoiceId") !== invoiceId || stringField(invoice, "taskId") !== params.taskId || stringField(receipt, "taskId") !== params.taskId) {
193
+ return fail("invoice and receipt identities are not bound to the task");
194
+ }
195
+ if (challenge.taskId !== params.taskId || challenge.senderHandle !== params.senderHandle.trim().toLowerCase() || challenge.offerId !== offer.id || challenge.invoiceId !== invoiceId || challenge.receiptId !== receiptId || challenge.challengeId !== stringField(invoice, "challengeId") || challenge.challengeId !== stringField(receipt, "challengeId") || challenge.paymentMemo !== stringField(invoice, "paymentMemo") || challenge.paymentMemo !== stringField(receipt, "paymentMemo")) {
196
+ return fail("payment evidence does not match the seller-issued challenge");
197
+ }
198
+ const expectedAmount = offerAmountInBaseUnits(offer);
199
+ if (!expectedAmount) {
200
+ return fail("seller offer must define a positive fixed price before paid execution");
201
+ }
202
+ const invoiceAmount = positiveSafeInteger(invoice.amount);
203
+ const receiptAmount = positiveSafeInteger(receipt.amount);
204
+ if (invoiceAmount !== expectedAmount || receiptAmount !== expectedAmount) {
205
+ return fail("invoice and receipt amount must equal the seller offer price");
206
+ }
207
+ if (challenge.amount !== expectedAmount) {
208
+ return fail("seller-issued challenge amount no longer matches the offer");
209
+ }
210
+ const expectedCurrency = offer.paymentDefaults.currency.trim().toUpperCase();
211
+ if (stringField(invoice, "currency").toUpperCase() !== expectedCurrency || stringField(receipt, "currency").toUpperCase() !== expectedCurrency || stringField(invoice, "chain").toLowerCase() !== "solana" || stringField(receipt, "chain").toLowerCase() !== "solana") {
212
+ return fail("invoice and receipt payment rail does not match the seller offer");
213
+ }
214
+ if (challenge.currency !== expectedCurrency) {
215
+ return fail("seller-issued challenge currency no longer matches the offer");
216
+ }
217
+ const expectedAsset = canonicalAsset(offer.paymentDefaults.asset);
218
+ const invoiceAsset = canonicalAsset(invoice.asset);
219
+ const receiptAsset = canonicalAsset(receipt.asset);
220
+ if (!expectedAsset || !recordsEqual(invoiceAsset, expectedAsset) || !recordsEqual(receiptAsset, expectedAsset)) {
221
+ return fail("invoice and receipt asset does not match the seller offer");
222
+ }
223
+ if (!recordsEqual(challenge.asset, expectedAsset)) {
224
+ return fail("seller-issued challenge asset no longer matches the offer");
225
+ }
226
+ const expectedPayee = canonicalWallet(offer.paymentDefaults.payee);
227
+ const invoicePayee = canonicalWallet(invoice.payee);
228
+ const receiptPayee = canonicalWallet(receipt.payee);
229
+ const payer = canonicalWallet(receipt.payer);
230
+ if (!expectedPayee || !payer || !recordsEqual(invoicePayee, expectedPayee) || !recordsEqual(receiptPayee, expectedPayee) || payer.address === expectedPayee.address) {
231
+ return fail("invoice or receipt payer/payee is invalid");
232
+ }
233
+ if (challenge.payerAddress !== payer.address || challenge.payeeAddress !== expectedPayee.address) {
234
+ return fail("payment payer/payee does not match the seller-issued challenge");
235
+ }
236
+ const issuedAt = parseTimestamp(invoice.issuedAt);
237
+ const expiresAt = parseTimestamp(invoice.expiresAt);
238
+ const settledAt = parseTimestamp(receipt.settledAt);
239
+ const now = deps.now();
240
+ if (issuedAt === null || expiresAt === null || settledAt === null || issuedAt !== Date.parse(challenge.issuedAt) || expiresAt !== Date.parse(challenge.expiresAt) || issuedAt >= expiresAt || settledAt < issuedAt || settledAt > expiresAt || now > expiresAt) {
241
+ return fail("invoice or receipt timestamp is invalid or expired");
242
+ }
243
+ const txRef = stringField(receipt, "txRef");
244
+ if (!/^[1-9A-HJ-NP-Za-km-z]{80,100}$/u.test(txRef)) {
245
+ return fail("receipt.txRef must be a Solana transaction signature");
246
+ }
247
+ const rpcUrl = deps.resolveRpcUrl(env);
248
+ if (!rpcUrl) {
249
+ return fail("seller Solana RPC is not configured; payment cannot be verified");
250
+ }
251
+ const transaction = await deps.fetchSolanaRpc(rpcUrl, "getTransaction", [txRef, {
252
+ commitment: "finalized",
253
+ encoding: "jsonParsed",
254
+ maxSupportedTransactionVersion: 0
255
+ }]);
256
+ if (!transaction || !transaction.meta || transaction.meta.err != null) {
257
+ return fail("payment transaction is unavailable, not finalized, or failed");
258
+ }
259
+ const blockTimeMs = typeof transaction.blockTime === "number" && Number.isSafeInteger(transaction.blockTime) ? transaction.blockTime * 1e3 : null;
260
+ if (blockTimeMs === null || blockTimeMs < issuedAt || blockTimeMs > expiresAt || blockTimeMs > now + 6e4) {
261
+ return fail("finalized payment block time is outside the seller-issued challenge window");
262
+ }
263
+ if (!hasExactPaymentMemo(transaction, challenge.paymentMemo)) {
264
+ return fail("finalized payment does not contain the exact seller-issued challenge memo");
265
+ }
266
+ const paymentMatches = expectedAsset.kind === "native" ? hasExactNativeTransfer({
267
+ transaction,
268
+ payer: payer.address,
269
+ payee: expectedPayee.address,
270
+ amount: expectedAmount
271
+ }) : hasExactTokenTransfer({
272
+ transaction,
273
+ payer: payer.address,
274
+ payee: expectedPayee.address,
275
+ mint: expectedAsset.address,
276
+ amount: expectedAmount
277
+ });
278
+ if (!paymentMatches) {
279
+ return fail("finalized transaction does not contain the exact expected seller payment");
172
280
  }
173
281
  return {
174
282
  status: "executed",
175
- mode: "autonomous",
176
- requestId: send.requestId,
177
- txHash: send.tx.txHash,
178
- invoiceId: intent.invoiceId,
179
- providerId: intent.payload.providerId,
180
- walletId: intent.payload.walletId,
181
- walletName: intent.payload.walletName,
182
- chain: intent.payload.chain,
183
- amount: intent.payload.amount
283
+ txHash: txRef,
284
+ invoiceId,
285
+ chain: "solana",
286
+ amount: String(expectedAmount),
287
+ challengeId: challenge.challengeId,
288
+ payerAddress: payer.address,
289
+ paymentMemo: challenge.paymentMemo
184
290
  };
185
291
  }
186
292