@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,5 +1,5 @@
1
1
  import { ensureWalletStateDir } from "./wallet-runtime-config.js";
2
- import fs from "node:fs";
2
+ import syncFs from "node:fs";
3
3
 
4
4
  //#region src/wallet/wallet-observability.ts
5
5
  const OBSERVABILITY_FILENAME = "observability.v1.json";
@@ -37,11 +37,11 @@ function sanitizeBucket(input) {
37
37
  }
38
38
  function readSnapshot(env) {
39
39
  const file = observabilityPath(env);
40
- if (!fs.existsSync(file)) {
40
+ if (!syncFs.existsSync(file)) {
41
41
  return makeDefaultSnapshot();
42
42
  }
43
43
  try {
44
- const parsed = JSON.parse(fs.readFileSync(file, "utf8"));
44
+ const parsed = JSON.parse(syncFs.readFileSync(file, "utf8"));
45
45
  if (parsed?.version !== 1) {
46
46
  return makeDefaultSnapshot();
47
47
  }
@@ -60,12 +60,12 @@ function readSnapshot(env) {
60
60
  }
61
61
  function writeSnapshot(env, snapshot) {
62
62
  const file = observabilityPath(env);
63
- fs.writeFileSync(file, `${JSON.stringify(snapshot, null, 2)}\n`, {
63
+ syncFs.writeFileSync(file, `${JSON.stringify(snapshot, null, 2)}\n`, {
64
64
  mode: 384,
65
65
  encoding: "utf8"
66
66
  });
67
67
  try {
68
- fs.chmodSync(file, 384);
68
+ syncFs.chmodSync(file, 384);
69
69
  } catch {}
70
70
  }
71
71
  function incrementWalletObservabilityCounter(params) {
@@ -128,7 +128,7 @@ function simulateWalletPolicy(params) {
128
128
  diff
129
129
  };
130
130
  }
131
- checks.push(pass("wallet.approval", "Approval", "Autonomous mode may sign after custody and approval gates."));
131
+ checks.push(pass("wallet.approval", "Approval", "Autonomous mode may sign only after typed signer policy and cap checks."));
132
132
  return {
133
133
  ok: true,
134
134
  decision: "pass",
@@ -2,7 +2,8 @@ import { ensureWalletStateDir, resolveWalletRuntimeConfig } from "./wallet-runti
2
2
  import { readWalletProviderRegistry, resolveWalletUserRole } from "./wallet-provider-registry.js";
3
3
  import { assertValidSolanaAddress } from "./solana-address.js";
4
4
  import { tryResolveSatRuntimeIds } from "../config/sat-runtime-ids.js";
5
- import fs from "node:fs";
5
+ import { serializeWalletState, writeWalletStateFileAtomically } from "./wallet-atomic-state.js";
6
+ import syncFs from "node:fs";
6
7
  import path from "node:path";
7
8
 
8
9
  //#region src/wallet/wallet-policy.ts
@@ -44,26 +45,46 @@ function normalizeWalletUsageBucket(raw) {
44
45
  return null;
45
46
  }
46
47
  const value = raw;
48
+ if (!isNonNegativeIntegerString(value.solanaSpent)) {
49
+ return null;
50
+ }
51
+ if (!value.solanaTokenSpent || typeof value.solanaTokenSpent !== "object" || Array.isArray(value.solanaTokenSpent)) {
52
+ return null;
53
+ }
54
+ const solanaTokenSpent = {};
55
+ for (const [mintRaw, spent] of Object.entries(value.solanaTokenSpent)) {
56
+ const mint = mintRaw.trim();
57
+ if (!mint || !isNonNegativeIntegerString(spent)) {
58
+ return null;
59
+ }
60
+ solanaTokenSpent[mint] = spent;
61
+ }
47
62
  return {
48
- solanaSpent: typeof value.solanaSpent === "string" ? value.solanaSpent : "0",
49
- solanaTokenSpent: value.solanaTokenSpent && typeof value.solanaTokenSpent === "object" ? Object.fromEntries(Object.entries(value.solanaTokenSpent).map(([mint, spent]) => [mint.trim(), typeof spent === "string" ? spent : "0"]).filter(([mint]) => Boolean(mint))) : {}
63
+ solanaSpent: value.solanaSpent,
64
+ solanaTokenSpent
50
65
  };
51
66
  }
67
+ function isNonNegativeIntegerString(value) {
68
+ return typeof value === "string" && /^\d+$/.test(value);
69
+ }
52
70
  function loadLedger(paths) {
53
71
  const fallback = defaultWalletUsageLedger();
54
- if (!fs.existsSync(paths.dailyUsagePath)) {
72
+ if (!syncFs.existsSync(paths.dailyUsagePath)) {
55
73
  return fallback;
56
74
  }
57
75
  try {
58
- const raw = fs.readFileSync(paths.dailyUsagePath, "utf8");
76
+ const raw = syncFs.readFileSync(paths.dailyUsagePath, "utf8");
59
77
  const parsed = JSON.parse(raw);
60
78
  if (parsed && parsed.version === 2 && typeof parsed.date === "string") {
61
- const walletsRaw = parsed.wallets && typeof parsed.wallets === "object" && !Array.isArray(parsed.wallets) ? parsed.wallets : {};
79
+ if (!parsed.wallets || typeof parsed.wallets !== "object" || Array.isArray(parsed.wallets)) {
80
+ throw new Error("wallet usage ledger wallets must be an object");
81
+ }
82
+ const walletsRaw = parsed.wallets;
62
83
  const wallets = {};
63
84
  for (const [walletId, bucketRaw] of Object.entries(walletsRaw)) {
64
85
  const bucket = normalizeWalletUsageBucket(bucketRaw);
65
86
  if (!walletId.trim() || !bucket) {
66
- continue;
87
+ throw new Error(`wallet usage ledger contains an invalid bucket for ${walletId || "?"}`);
67
88
  }
68
89
  wallets[walletId.trim()] = bucket;
69
90
  }
@@ -73,24 +94,23 @@ function loadLedger(paths) {
73
94
  wallets
74
95
  };
75
96
  }
76
- if (parsed && parsed.version === 1) {
97
+ if (parsed && parsed.version === 1 && typeof parsed.date === "string" && isNonNegativeIntegerString(parsed.solanaSpent)) {
77
98
  return {
78
99
  version: 2,
79
- date: typeof parsed.date === "string" ? parsed.date : fallback.date,
100
+ date: parsed.date,
80
101
  wallets: { [LEDGER_LEGACY_GLOBAL_BUCKET_ID]: {
81
- solanaSpent: typeof parsed.solanaSpent === "string" ? parsed.solanaSpent : "0",
102
+ solanaSpent: parsed.solanaSpent,
82
103
  solanaTokenSpent: {}
83
104
  } }
84
105
  };
85
106
  }
86
- } catch {}
87
- return fallback;
107
+ throw new Error("wallet usage ledger has an unsupported shape");
108
+ } catch (error) {
109
+ throw new Error("wallet usage ledger is unreadable; refusing to reset spend counters", { cause: error });
110
+ }
88
111
  }
89
112
  function writeLedger(paths, ledger) {
90
- fs.writeFileSync(paths.dailyUsagePath, `${JSON.stringify(ledger, null, 2)}\n`, { mode: 384 });
91
- try {
92
- fs.chmodSync(paths.dailyUsagePath, 384);
93
- } catch {}
113
+ writeWalletStateFileAtomically(paths.dailyUsagePath, serializeWalletState(ledger));
94
114
  }
95
115
  function resolveWalletUsageBucket(ledger, walletId) {
96
116
  const normalizedWalletId = walletId?.trim() || DEFAULT_EFFECTIVE_WALLET_ID;
@@ -294,7 +314,13 @@ function resolveWalletRoleForId(params) {
294
314
  if (walletId && storedPurpose === "mining") {
295
315
  return "mining";
296
316
  }
297
- if (walletId && (registry.defaultWalletId && walletId === registry.defaultWalletId || storedPurpose === "agent")) {
317
+ if (walletId && storedPurpose === "vault") {
318
+ return "vault";
319
+ }
320
+ if (walletId && storedPurpose === "agent") {
321
+ return "agent";
322
+ }
323
+ if (walletId && registry.defaultWalletId && walletId === registry.defaultWalletId) {
298
324
  return "agent";
299
325
  }
300
326
  return "vault";
@@ -344,21 +370,24 @@ function readWalletPolicyState(env = process.env) {
344
370
  updatedAt: nowIso(),
345
371
  wallets: {}
346
372
  };
347
- if (!fs.existsSync(statePath)) {
373
+ if (!syncFs.existsSync(statePath)) {
348
374
  return fallback;
349
375
  }
350
376
  try {
351
- const raw = fs.readFileSync(statePath, "utf8");
377
+ const raw = syncFs.readFileSync(statePath, "utf8");
352
378
  const parsed = JSON.parse(raw);
353
379
  if (parsed.version !== 1) {
354
- return fallback;
380
+ throw new Error("wallet policy state version is unsupported");
355
381
  }
356
- const walletsRaw = parsed.wallets && typeof parsed.wallets === "object" && !Array.isArray(parsed.wallets) ? parsed.wallets : {};
382
+ if (!parsed.wallets || typeof parsed.wallets !== "object" || Array.isArray(parsed.wallets)) {
383
+ throw new Error("wallet policy wallets must be an object");
384
+ }
385
+ const walletsRaw = parsed.wallets;
357
386
  const wallets = {};
358
387
  for (const [walletId, recordRaw] of Object.entries(walletsRaw)) {
359
388
  const record = normalizeStoredWalletPolicyRecord(recordRaw);
360
- if (!walletId.trim() || !record) {
361
- continue;
389
+ if (!walletId.trim() || !record || record.walletId !== walletId.trim()) {
390
+ throw new Error(`wallet policy contains an invalid record for ${walletId || "?"}`);
362
391
  }
363
392
  wallets[walletId.trim()] = record;
364
393
  }
@@ -367,17 +396,14 @@ function readWalletPolicyState(env = process.env) {
367
396
  updatedAt: typeof parsed.updatedAt === "string" ? parsed.updatedAt : fallback.updatedAt,
368
397
  wallets
369
398
  };
370
- } catch {
371
- return fallback;
399
+ } catch (error) {
400
+ throw new Error("wallet policy state is unreadable; refusing to replace persisted policy", { cause: error });
372
401
  }
373
402
  }
374
403
  function writeWalletPolicyState(state, env = process.env) {
375
404
  const paths = ensureWalletStateDir(env);
376
405
  const statePath = resolveWalletPolicyStatePath(paths);
377
- fs.writeFileSync(statePath, `${JSON.stringify(state, null, 2)}\n`, { mode: 384 });
378
- try {
379
- fs.chmodSync(statePath, 384);
380
- } catch {}
406
+ writeWalletStateFileAtomically(statePath, serializeWalletState(state));
381
407
  }
382
408
  function buildResolvedPolicyFromDefaults(defaults) {
383
409
  return {
@@ -573,7 +599,7 @@ function applyWalletPolicyConfig(params) {
573
599
  const profile = resolveWalletRolePolicyProfile(role, env);
574
600
  return cloneWalletConfigWithPolicy(params.config, buildResolvedPolicyFromDefaults(profile.defaults));
575
601
  }
576
- function upsertWalletPolicyConfig(params) {
602
+ function prepareWalletPolicyConfigUpdate(params) {
577
603
  const env = params.env ?? process.env;
578
604
  const walletId = params.walletId.trim();
579
605
  if (!walletId) {
@@ -623,20 +649,41 @@ function upsertWalletPolicyConfig(params) {
623
649
  patch: params.patch.recurringTransfer,
624
650
  role
625
651
  }) : existingRecord?.recurringTransfer;
626
- state.wallets[walletId] = buildStoredPolicyRecord({
652
+ const preparedAt = nowIso();
653
+ const nextRecord = buildStoredPolicyRecord({
627
654
  walletId,
628
655
  role,
629
656
  policy: nextPolicy,
630
- recurringTransfer
657
+ recurringTransfer,
658
+ updatedAt: preparedAt
631
659
  });
632
- state.updatedAt = nowIso();
633
- writeWalletPolicyState(state, env);
634
660
  return {
635
661
  walletId,
636
662
  role,
637
- config: cloneWalletConfigWithPolicy(base, nextPolicy)
663
+ config: cloneWalletConfigWithPolicy(base, nextPolicy),
664
+ expectedRecordJson: JSON.stringify(existingRecord ?? null),
665
+ nextRecord,
666
+ preparedAt
667
+ };
668
+ }
669
+ function commitWalletPolicyConfigUpdate(prepared, env = process.env) {
670
+ const state = readWalletPolicyState(env);
671
+ if (JSON.stringify(state.wallets[prepared.walletId] ?? null) !== prepared.expectedRecordJson) {
672
+ throw new Error("wallet policy changed concurrently; reload the acknowledged signer policy");
673
+ }
674
+ state.wallets[prepared.walletId] = prepared.nextRecord;
675
+ state.updatedAt = prepared.preparedAt;
676
+ writeWalletPolicyState(state, env);
677
+ return {
678
+ walletId: prepared.walletId,
679
+ role: prepared.role,
680
+ config: prepared.config
638
681
  };
639
682
  }
683
+ function upsertWalletPolicyConfig(params) {
684
+ const env = params.env ?? process.env;
685
+ return commitWalletPolicyConfigUpdate(prepareWalletPolicyConfigUpdate(params), env);
686
+ }
640
687
  function resolveWalletRolePolicyProfile(role, env = process.env) {
641
688
  switch (role) {
642
689
  case "mining": return {
@@ -659,8 +706,8 @@ function resolveWalletRolePolicyProfile(role, env = process.env) {
659
706
  label: "Agent",
660
707
  summary: "Hot Agent wallet for reviewed payments, Fased Network payment evidence, and approved skill actions. Keep explicit caps and narrow token / contract routes.",
661
708
  defaults: {
662
- capsEnabled: false,
663
- directSigning: true,
709
+ capsEnabled: true,
710
+ directSigning: false,
664
711
  skillsEnabled: false,
665
712
  solana: {
666
713
  maxPerTx: DEFAULT_POLICY_CAPS.solana.maxPerTx,
@@ -673,9 +720,9 @@ function resolveWalletRolePolicyProfile(role, env = process.env) {
673
720
  default: return {
674
721
  role: "vault",
675
722
  label: "Vault",
676
- summary: "Manual-first Vault wallet for storage and federation bond assignment. No background agent execution by default; use split-key/passkey lock for custody.",
723
+ summary: "Manual-first Vault wallet for storage and federation bond assignment. No background agent execution by default; reviewed sends require signer-owned WebAuthn authorization.",
677
724
  defaults: {
678
- capsEnabled: false,
725
+ capsEnabled: true,
679
726
  directSigning: false,
680
727
  skillsEnabled: false,
681
728
  solana: {
@@ -769,7 +816,14 @@ function validateWalletTxPolicy(params) {
769
816
  }
770
817
  const capsEnabled = params.config.policy.capsEnabled;
771
818
  const allowPrograms = params.config.policy.solana.allowPrograms;
772
- if (params.program && allowPrograms.length > 0) {
819
+ if (params.program) {
820
+ if (allowPrograms.length === 0) {
821
+ return {
822
+ ok: false,
823
+ code: "wallet_program_allowlist_required",
824
+ message: "program execution requires an explicit non-empty allowlist"
825
+ };
826
+ }
773
827
  const normalized = params.program.trim();
774
828
  const allowed = allowPrograms.includes(normalized);
775
829
  if (!allowed) {
@@ -962,4 +1016,4 @@ function resolveWalletRecurringTransferPolicy(params) {
962
1016
  }
963
1017
 
964
1018
  //#endregion
965
- export { applyWalletPolicyConfig, checkWalletDailyCap, enforceWalletDailyCap, isWalletToolAllowed, resolveWalletPolicyConfig, resolveWalletRecurringTransferPolicy, resolveWalletRoleForId, resolveWalletRolePolicyProfile, upsertWalletPolicyConfig, validateWalletTxPolicy };
1019
+ export { applyWalletPolicyConfig, checkWalletDailyCap, commitWalletPolicyConfigUpdate, enforceWalletDailyCap, isWalletToolAllowed, prepareWalletPolicyConfigUpdate, resolveWalletPolicyConfig, resolveWalletRecurringTransferPolicy, resolveWalletRoleForId, resolveWalletRolePolicyProfile, upsertWalletPolicyConfig, validateWalletTxPolicy };
@@ -6,7 +6,12 @@ const FULL_CHAIN_OPS = {
6
6
  send: true
7
7
  };
8
8
  const PROVIDER_CHAIN_OPERATION_PROFILES = {
9
- "embedded-keystore": { solana: { ...FULL_CHAIN_OPS } },
9
+ "embedded-keystore": { solana: {
10
+ receiveAddress: false,
11
+ getBalance: false,
12
+ prepare: false,
13
+ send: false
14
+ } },
10
15
  "local-socket-signer": { solana: { ...FULL_CHAIN_OPS } },
11
16
  alchemy: { solana: {
12
17
  receiveAddress: true,
@@ -15,7 +20,18 @@ const PROVIDER_CHAIN_OPERATION_PROFILES = {
15
20
  send: false
16
21
  } },
17
22
  turnkey: { solana: { ...FULL_CHAIN_OPS } },
18
- privy: { solana: { ...FULL_CHAIN_OPS } }
23
+ privy: { solana: {
24
+ receiveAddress: true,
25
+ getBalance: false,
26
+ prepare: false,
27
+ send: false
28
+ } },
29
+ "wallet-standard": { solana: {
30
+ receiveAddress: true,
31
+ getBalance: true,
32
+ prepare: false,
33
+ send: false
34
+ } }
19
35
  };
20
36
  const KNOWN_RPC_PROVIDER_PROFILES = {
21
37
  alchemy: {
@@ -76,10 +92,12 @@ function resolveIntegrationMode(providerId) {
76
92
  case "local-socket-signer":
77
93
  case "alchemy":
78
94
  case "turnkey":
95
+ case "wallet-standard":
79
96
  case "privy": return "native";
80
97
  }
81
98
  }
82
99
  function buildWalletProviderCapabilityMatrix(adapter) {
100
+ const signingLocation = adapter.capabilities.signingLocation ?? "unavailable";
83
101
  const chains = { solana: emptyChainOps() };
84
102
  const defaultChainFlags = {
85
103
  receiveAddress: true,
@@ -105,8 +123,14 @@ function buildWalletProviderCapabilityMatrix(adapter) {
105
123
  providerId: adapter.id,
106
124
  supportedChains: [...adapter.capabilities.supportedChains],
107
125
  integrationMode: resolveIntegrationMode(adapter.id),
126
+ signingLocation,
127
+ signing: {
128
+ transaction: adapter.capabilities.supportsSignTransaction === true,
129
+ message: adapter.capabilities.supportsSignMessage === true,
130
+ interactiveSend: signingLocation === "browser" && adapter.capabilities.supportsSignTransaction === true
131
+ },
108
132
  operations: {
109
- createWallet: adapter.capabilities.supportsCreateWallet,
133
+ createWallet: adapter.capabilities.supportsCreateWallet || adapter.id === "local-socket-signer",
110
134
  receiveAddress: receiveAny,
111
135
  getBalance: balanceAny,
112
136
  prepare: prepareAny,
@@ -117,7 +141,7 @@ function buildWalletProviderCapabilityMatrix(adapter) {
117
141
  resetKeys: adapter.capabilities.supportsResetKeys
118
142
  },
119
143
  chains,
120
- requiresCredentials: adapter.id !== "embedded-keystore" && adapter.id !== "local-socket-signer",
144
+ requiresCredentials: adapter.id !== "local-socket-signer" && adapter.id !== "wallet-standard",
121
145
  requiresRpcSecret: false
122
146
  };
123
147
  }
@@ -1,6 +1,7 @@
1
1
  import { resolveStateDir } from "../config/paths.js";
2
+ import { throwLegacyEmbeddedKeystoreMigrationRequired } from "./legacy-embedded-keystore.js";
2
3
  import { ensureWalletStateDir } from "./wallet-runtime-config.js";
3
- import fs from "node:fs";
4
+ import syncFs from "node:fs";
4
5
  import path from "node:path";
5
6
  import { randomBytes } from "node:crypto";
6
7
 
@@ -8,10 +9,14 @@ import { randomBytes } from "node:crypto";
8
9
  const REGISTRY_FILE_MODE = 384;
9
10
  const PROVIDER_REGISTRY_FILENAME = "provider-registry.v1.json";
10
11
  const WALLET_PROVIDER_IDS = [
11
- "embedded-keystore",
12
12
  "local-socket-signer",
13
13
  "alchemy",
14
14
  "turnkey",
15
+ "wallet-standard"
16
+ ];
17
+ const WALLET_PROVIDER_REGISTRY_IDS = [
18
+ "embedded-keystore",
19
+ ...WALLET_PROVIDER_IDS,
15
20
  "privy"
16
21
  ];
17
22
  function normalizeWalletUserRole(value) {
@@ -54,6 +59,7 @@ function normalizeProviderId(value) {
54
59
  case "local-socket-signer":
55
60
  case "alchemy":
56
61
  case "turnkey":
62
+ case "wallet-standard":
57
63
  case "privy": return raw;
58
64
  default: return null;
59
65
  }
@@ -159,12 +165,12 @@ function buildMiningDeleteBlockedMessage(details) {
159
165
  }
160
166
  function readSatMiningRuntimeDeletionDetails(walletId, env) {
161
167
  const runtimeStorePath = path.join(resolveStateDir(env), "sat-mining", "wallets", normalizeSatWalletStateKey(walletId), "runtime-store.json");
162
- if (!fs.existsSync(runtimeStorePath)) {
168
+ if (!syncFs.existsSync(runtimeStorePath)) {
163
169
  return null;
164
170
  }
165
171
  let parsed;
166
172
  try {
167
- parsed = JSON.parse(fs.readFileSync(runtimeStorePath, "utf8"));
173
+ parsed = JSON.parse(syncFs.readFileSync(runtimeStorePath, "utf8"));
168
174
  } catch {
169
175
  return null;
170
176
  }
@@ -238,34 +244,18 @@ function normalizeWalletEntry(raw) {
238
244
  updatedAt
239
245
  };
240
246
  }
241
- function isLegacySelfHostedWallet(wallet) {
242
- if (wallet.providerId !== "embedded-keystore") {
243
- return false;
244
- }
245
- const metadata = wallet.metadata && typeof wallet.metadata === "object" && !Array.isArray(wallet.metadata) ? wallet.metadata : undefined;
246
- if (metadata?.selfHosted === true) {
247
- return true;
248
- }
249
- if (/^solana-\d+$/i.test(wallet.id)) {
250
- return true;
251
- }
252
- if (/^solana\s+\d+$/i.test(wallet.name)) {
253
- return true;
254
- }
255
- return false;
256
- }
257
247
  function makeDefaultRegistry() {
258
248
  const ts = nowIso();
259
249
  return {
260
250
  version: 1,
261
251
  providers: {
262
252
  "embedded-keystore": {
263
- enabled: true,
253
+ enabled: false,
264
254
  updatedAt: ts,
265
- label: "Self-hosted"
255
+ label: "Legacy embedded keystore (migration required)"
266
256
  },
267
257
  "local-socket-signer": {
268
- enabled: false,
258
+ enabled: true,
269
259
  updatedAt: ts,
270
260
  label: "Local signer"
271
261
  },
@@ -274,13 +264,19 @@ function makeDefaultRegistry() {
274
264
  updatedAt: ts
275
265
  },
276
266
  turnkey: {
267
+ enabled: false,
268
+ updatedAt: ts,
269
+ label: "Turnkey (policy-managed)"
270
+ },
271
+ "wallet-standard": {
277
272
  enabled: true,
278
273
  updatedAt: ts,
279
- label: "Turnkey (recommended hosted)"
274
+ label: "Wallet Standard (verify hardware on device)"
280
275
  },
281
276
  privy: {
282
- enabled: true,
283
- updatedAt: ts
277
+ enabled: false,
278
+ updatedAt: ts,
279
+ label: "Privy (integration unavailable)"
284
280
  }
285
281
  },
286
282
  wallets: [],
@@ -299,8 +295,15 @@ function normalizeRegistry(raw) {
299
295
  let changed = false;
300
296
  const value = raw;
301
297
  const providersRaw = value.providers && typeof value.providers === "object" && !Array.isArray(value.providers) ? value.providers : {};
302
- const providers = { ...defaults.providers };
303
- for (const providerId of WALLET_PROVIDER_IDS) {
298
+ const providers = {
299
+ "embedded-keystore": defaults.providers["embedded-keystore"],
300
+ "local-socket-signer": defaults.providers["local-socket-signer"],
301
+ alchemy: defaults.providers.alchemy,
302
+ turnkey: defaults.providers.turnkey,
303
+ "wallet-standard": defaults.providers["wallet-standard"],
304
+ privy: defaults.providers.privy
305
+ };
306
+ for (const providerId of WALLET_PROVIDER_REGISTRY_IDS) {
304
307
  const entryRaw = providersRaw[providerId];
305
308
  if (!entryRaw || typeof entryRaw !== "object" || Array.isArray(entryRaw)) {
306
309
  continue;
@@ -309,8 +312,8 @@ function normalizeRegistry(raw) {
309
312
  const enabled = Boolean(entry.enabled);
310
313
  let label = typeof entry.label === "string" ? entry.label.trim() || undefined : undefined;
311
314
  if (providerId === "embedded-keystore") {
312
- if (!label || label === "Embedded keystore (default)" || label === "Self-hosted wallet") {
313
- label = "Self-hosted";
315
+ if (!label || label === "Embedded keystore (default)" || label === "Self-hosted wallet" || label === "Self-hosted") {
316
+ label = "Legacy embedded keystore (migration required)";
314
317
  }
315
318
  }
316
319
  if (providerId === "local-socket-signer") {
@@ -325,23 +328,7 @@ function normalizeRegistry(raw) {
325
328
  updatedAt
326
329
  };
327
330
  }
328
- const wallets = (Array.isArray(value.wallets) ? value.wallets.map(normalizeWalletEntry).filter((entry) => Boolean(entry)) : []).map((wallet) => {
329
- if (!isLegacySelfHostedWallet(wallet)) {
330
- return wallet;
331
- }
332
- changed = true;
333
- const metadata = wallet.metadata && typeof wallet.metadata === "object" && !Array.isArray(wallet.metadata) ? wallet.metadata : undefined;
334
- return {
335
- ...wallet,
336
- providerId: "local-socket-signer",
337
- metadata: {
338
- ...metadata,
339
- selfHosted: true,
340
- migratedFromProviderId: metadata?.migratedFromProviderId ?? "embedded-keystore"
341
- },
342
- updatedAt: nowIso()
343
- };
344
- });
331
+ const wallets = Array.isArray(value.wallets) ? value.wallets.map(normalizeWalletEntry).filter((entry) => Boolean(entry)) : [];
345
332
  if (wallets.some((wallet) => wallet.providerId === "local-socket-signer")) {
346
333
  const current = providers["local-socket-signer"];
347
334
  if (!current.enabled) {
@@ -383,11 +370,11 @@ function normalizeRegistry(raw) {
383
370
  }
384
371
  function readWalletProviderRegistry(env = process.env) {
385
372
  const file = registryPath(env);
386
- if (!fs.existsSync(file)) {
373
+ if (!syncFs.existsSync(file)) {
387
374
  return makeDefaultRegistry();
388
375
  }
389
376
  try {
390
- const parsed = JSON.parse(fs.readFileSync(file, "utf8"));
377
+ const parsed = JSON.parse(syncFs.readFileSync(file, "utf8"));
391
378
  const normalized = normalizeRegistry(parsed);
392
379
  if (normalized.changed) {
393
380
  writeWalletProviderRegistry(normalized.registry, env);
@@ -404,15 +391,21 @@ function writeWalletProviderRegistry(registry, env = process.env) {
404
391
  version: 1,
405
392
  updatedAt: nowIso()
406
393
  };
407
- fs.writeFileSync(file, `${JSON.stringify(payload, null, 2)}\n`, {
394
+ syncFs.writeFileSync(file, `${JSON.stringify(payload, null, 2)}\n`, {
408
395
  encoding: "utf8",
409
396
  mode: REGISTRY_FILE_MODE
410
397
  });
411
398
  try {
412
- fs.chmodSync(file, REGISTRY_FILE_MODE);
399
+ syncFs.chmodSync(file, REGISTRY_FILE_MODE);
413
400
  } catch {}
414
401
  }
415
402
  function setWalletProviderEnabled(params) {
403
+ if (params.providerId === "embedded-keystore" && params.enabled) {
404
+ throwLegacyEmbeddedKeystoreMigrationRequired("cannot enable retired wallet provider");
405
+ }
406
+ if (params.providerId === "privy" && params.enabled) {
407
+ throw new Error("Privy wallet creation and signing are unavailable; the provider stays disabled.");
408
+ }
416
409
  const env = params.env ?? process.env;
417
410
  const registry = readWalletProviderRegistry(env);
418
411
  registry.providers[params.providerId] = {
@@ -428,6 +421,20 @@ function setWalletProvidersEnabled(params) {
428
421
  const registry = readWalletProviderRegistry(env);
429
422
  const enabledSet = new Set(params.enabledProviders);
430
423
  const now = nowIso();
424
+ const legacy = registry.providers["embedded-keystore"];
425
+ registry.providers["embedded-keystore"] = {
426
+ ...legacy,
427
+ enabled: false,
428
+ label: "Legacy embedded keystore (migration required)",
429
+ updatedAt: legacy.enabled ? now : legacy.updatedAt
430
+ };
431
+ const unavailablePrivy = registry.providers.privy;
432
+ registry.providers.privy = {
433
+ ...unavailablePrivy,
434
+ enabled: false,
435
+ label: "Privy (integration unavailable)",
436
+ updatedAt: unavailablePrivy.enabled ? now : unavailablePrivy.updatedAt
437
+ };
431
438
  for (const providerId of WALLET_PROVIDER_IDS) {
432
439
  const current = registry.providers[providerId] ?? {
433
440
  enabled: false,
@@ -444,6 +451,12 @@ function setWalletProvidersEnabled(params) {
444
451
  return registry;
445
452
  }
446
453
  function upsertNamedWallet(params) {
454
+ if (params.providerId === "embedded-keystore") {
455
+ throwLegacyEmbeddedKeystoreMigrationRequired("cannot register a new legacy wallet");
456
+ }
457
+ if (params.providerId === "privy") {
458
+ throw new Error("Privy wallet creation and signing are unavailable; no wallet was registered.");
459
+ }
447
460
  const env = params.env ?? process.env;
448
461
  const registry = readWalletProviderRegistry(env);
449
462
  const name = params.name.trim();