@fased/fased 0.1.62 → 0.1.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +38 -30
  3. package/config/dependency-ownership.json +1 -1
  4. package/config/signer-policies/README.md +49 -0
  5. package/config/signer-policies/agent.json.template +32 -0
  6. package/config/signer-policies/mining.json.template +69 -0
  7. package/config/signer-policies/network.json.template +5 -0
  8. package/config/signer-policies/vault.json.template +70 -0
  9. package/config/signer-protocol-v2.json +76 -0
  10. package/config/typescript-noemit-baseline.json +680 -0
  11. package/dist/agents/auth-profiles/store.js +267 -31
  12. package/dist/agents/bash-tools.exec.js +10 -4
  13. package/dist/agents/current-model-catalog.js +3 -3
  14. package/dist/agents/memory-search.js +7 -1
  15. package/dist/agents/model-catalog-access.js +1 -2
  16. package/dist/agents/model-catalog-snapshot.js +1 -1
  17. package/dist/agents/model-catalog-source.js +1 -1
  18. package/dist/agents/model-metadata.js +1 -1
  19. package/dist/agents/model-selection.js +2 -28
  20. package/dist/agents/models-config.providers.js +6 -6
  21. package/dist/agents/pi-embedded-runner/compact.js +15 -7
  22. package/dist/agents/pi-embedded-runner/model.js +1 -1
  23. package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
  24. package/dist/agents/pi-embedded-runner/run.js +2 -0
  25. package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
  26. package/dist/agents/pi-tool-definition-adapter.js +16 -1
  27. package/dist/agents/pi-tools.js +2 -1
  28. package/dist/agents/sandbox/config.js +1 -1
  29. package/dist/agents/sandbox/context.js +27 -2
  30. package/dist/agents/skills/env-overrides.js +38 -28
  31. package/dist/agents/skills/trust.js +93 -0
  32. package/dist/agents/skills/workspace.js +128 -0
  33. package/dist/agents/skills-clawhub.js +36 -11
  34. package/dist/agents/skills-marketplace-scan.js +49 -0
  35. package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
  36. package/dist/agents/tools/mining-tool.js +1 -1
  37. package/dist/agents/tools/session-status-tool.js +1 -1
  38. package/dist/agents/tools/wallet-action-tool.js +172 -36
  39. package/dist/agents/tools/wallet-skill-policy.js +65 -23
  40. package/dist/agents/tools/wallet-tool.js +7 -11
  41. package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
  42. package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
  43. package/dist/auto-reply/reply/directive-handling.model.js +2 -1
  44. package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
  45. package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
  46. package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
  47. package/dist/auto-reply/reply/model-selection.js +7 -4
  48. package/dist/auto-reply/reply/session-reset-model.js +4 -4
  49. package/dist/brand.js +1 -1
  50. package/dist/build-info.json +3 -3
  51. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  52. package/dist/channel-web.js +2 -2
  53. package/dist/cli/gateway-cli/run.js +8 -0
  54. package/dist/cli/program/command-registry.js +1 -1
  55. package/dist/cli/program/register.onboard.js +2 -3
  56. package/dist/cli/program/register.wallet.js +16 -123
  57. package/dist/cli/providers-cli.js +1 -1
  58. package/dist/cli/sat-cli.js +129 -2
  59. package/dist/cli/update-cli/update-command.js +260 -11
  60. package/dist/commands/auth-choice.apply.api-providers.js +3 -3
  61. package/dist/commands/doctor-config-flow.js +1 -1
  62. package/dist/commands/doctor-legacy-config.js +2 -13
  63. package/dist/commands/model-picker.js +6 -6
  64. package/dist/commands/models/auth.js +1 -1
  65. package/dist/commands/onboard-auth.config-gateways.js +1 -1
  66. package/dist/commands/onboard-auth.credentials.js +32 -8
  67. package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
  68. package/dist/commands/onboard-non-interactive/local.js +5 -1
  69. package/dist/commands/wallet.js +568 -1911
  70. package/dist/config/config.js +2 -2
  71. package/dist/config/io.js +64 -2
  72. package/dist/config/schema.help.js +8 -7
  73. package/dist/config/schema.labels.js +5 -4
  74. package/dist/config/zod-schema.agent-runtime.js +1 -0
  75. package/dist/config/zod-schema.js +5 -0
  76. package/dist/control-ui/assets/{app-DLil9VO1.js → app-bR-fO5ty.js} +1511 -1555
  77. package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
  78. package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
  79. package/dist/control-ui/assets/{index-DdE_NIXo.js → index-ckCxHwjy.js} +3 -3
  80. package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-BgHFh0ei.js} +134 -114
  81. package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
  82. package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
  83. package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
  84. package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
  85. package/dist/control-ui/index.html +1 -1
  86. package/dist/control-ui/version.json +1 -1
  87. package/dist/daemon/systemd-system.js +56 -50
  88. package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
  89. package/dist/extensions/sat-mining/src/rpc-read.js +235 -67
  90. package/dist/extensions/sat-mining/src/sat-bond-layout.js +5 -2
  91. package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
  92. package/dist/extensions/sat-mining/src/solana-submit.js +1038 -397
  93. package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
  94. package/dist/federation/auto-connect.js +98 -8
  95. package/dist/federation/marketplace-capability-adapter.js +33 -7
  96. package/dist/federation/marketplace-delivery-outbox.js +196 -0
  97. package/dist/federation/marketplace-delivery.js +351 -215
  98. package/dist/federation/marketplace-direct-payment.js +272 -141
  99. package/dist/federation/marketplace-escrow.js +607 -249
  100. package/dist/federation/marketplace-settlement-ledger.js +352 -0
  101. package/dist/federation/offers.js +9 -7
  102. package/dist/federation/peer-auth-v2.js +529 -0
  103. package/dist/gateway/a2a-http.js +425 -96
  104. package/dist/gateway/a2a-settlement.js +259 -153
  105. package/dist/gateway/a2a-task-store.js +524 -0
  106. package/dist/gateway/auth.js +38 -2
  107. package/dist/gateway/config-reload.js +46 -33
  108. package/dist/gateway/durable-capacity.js +31 -0
  109. package/dist/gateway/federation-http.js +540 -135
  110. package/dist/gateway/federation-marketplace-run-store.js +397 -0
  111. package/dist/gateway/federation-marketplace.js +535 -230
  112. package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
  113. package/dist/gateway/security-path.js +1 -1
  114. package/dist/gateway/server-http.js +1084 -1205
  115. package/dist/gateway/server-methods/models.js +1 -1
  116. package/dist/gateway/server-methods/secrets.js +40 -0
  117. package/dist/gateway/server-methods.js +1 -2
  118. package/dist/gateway/server-reload-handlers.js +196 -66
  119. package/dist/gateway/server-runtime-config.js +1 -1
  120. package/dist/gateway/server-secrets-runtime.js +288 -0
  121. package/dist/gateway/server.impl.js +73 -42
  122. package/dist/gateway/sessions-patch.js +3 -5
  123. package/dist/index.js +4 -2
  124. package/dist/infra/fasedhub.js +64 -1
  125. package/dist/infra/local-source-paired-update.js +538 -0
  126. package/dist/infra/restart.js +41 -10
  127. package/dist/infra/update-runner.js +96 -0
  128. package/dist/light-update-status.js +11 -11
  129. package/dist/memory/backend-config.js +2 -1
  130. package/dist/memory/session-files.js +16 -2
  131. package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
  132. package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
  133. package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
  134. package/dist/plugin-sdk/{audio-preflight-Bwi2Oq03.js → audio-preflight-BYxAt775.js} +27 -27
  135. package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
  136. package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
  137. package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
  138. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  139. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  140. package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
  141. package/dist/plugin-sdk/{chunk-items-DzT4L4Ty.js → chunk-items-DIRHG2gJ.js} +1 -1
  142. package/dist/plugin-sdk/command-status.d.ts +2 -2
  143. package/dist/plugin-sdk/command-status.js +27 -27
  144. package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
  145. package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
  146. package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
  147. package/dist/plugin-sdk/{config-schema-BrkmtFxB.js → config-schema-BOT7kHb6.js} +6779 -3696
  148. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  149. package/dist/plugin-sdk/discord.d.ts +6 -6
  150. package/dist/plugin-sdk/discord.js +19 -19
  151. package/dist/plugin-sdk/file-lock.js +35 -4
  152. package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
  153. package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
  154. package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
  155. package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
  156. package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
  157. package/dist/plugin-sdk/index.d.ts +21 -39
  158. package/dist/plugin-sdk/index.js +29 -29
  159. package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
  160. package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
  161. package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
  162. package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
  163. package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
  164. package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
  165. package/dist/plugin-sdk/{monitor-M_ta2lMc.js → monitor-BCFDaqJ-.js} +31 -31
  166. package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-BgbjRiPM.js} +32 -32
  167. package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DFf87SMM.js} +27 -27
  168. package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
  169. package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
  170. package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
  171. package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-CS-9BHug.d.ts} +2 -2
  172. package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
  173. package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
  174. package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
  175. package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
  176. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  177. package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
  178. package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
  179. package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
  180. package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
  181. package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
  182. package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
  183. package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
  184. package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
  185. package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
  186. package/dist/plugin-sdk/sat-runtime.d.ts +549 -309
  187. package/dist/plugin-sdk/sat-runtime.js +29 -29
  188. package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
  189. package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
  190. package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
  191. package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
  192. package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
  193. package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
  194. package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
  195. package/dist/plugin-sdk/{slack-CxE1mfzj.js → slack-BUTt8cxK.js} +39 -39
  196. package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
  197. package/dist/plugin-sdk/slack.d.ts +6 -6
  198. package/dist/plugin-sdk/slack.js +9 -9
  199. package/dist/plugin-sdk/{sticker-cache-CGzGWu00.js → sticker-cache-D0wHVqjt.js} +3 -3
  200. package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
  201. package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
  202. package/dist/plugin-sdk/{telegram-actions-DaEcYQ8r.js → telegram-actions-CC_qN4v0.js} +30 -30
  203. package/dist/plugin-sdk/telegram.d.ts +6 -6
  204. package/dist/plugin-sdk/telegram.js +8 -8
  205. package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
  206. package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
  207. package/dist/plugin-sdk/tmp-fased-dir-xOTGlzBE.d.ts +486 -0
  208. package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-C3avNytw.d.ts} +3 -4
  209. package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
  210. package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-DWfbSAaM.d.ts} +2 -2
  211. package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
  212. package/dist/plugin-sdk/{web-CInY-lCv.js → web-BXsJ1vqe.js} +32 -32
  213. package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
  214. package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
  215. package/dist/plugin-sdk/whatsapp.d.ts +13 -13
  216. package/dist/plugin-sdk/whatsapp.js +12 -12
  217. package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
  218. package/dist/plugin-sdk/{zod-schema.providers-core-BEbNizPe.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +61 -61
  219. package/dist/providers/refresh.js +1 -1
  220. package/dist/providers/registry.js +1 -1
  221. package/dist/secrets/apply.js +1 -1
  222. package/dist/secrets/runtime.js +1 -1
  223. package/dist/wallet/external-submission-ledger.js +376 -0
  224. package/dist/wallet/legacy-embedded-keystore.js +40 -0
  225. package/dist/wallet/local-socket-signer-archive.js +30 -0
  226. package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
  227. package/dist/wallet/local-socket-signer-policy.js +166 -0
  228. package/dist/wallet/local-socket-signer-protocol.js +561 -118
  229. package/dist/wallet/native-signer-wallet-id.js +25 -0
  230. package/dist/wallet/providers/alchemy-adapter.js +3 -0
  231. package/dist/wallet/providers/local-socket-signer-adapter.js +380 -105
  232. package/dist/wallet/providers/turnkey-adapter.js +292 -34
  233. package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
  234. package/dist/wallet/signer-network-admin.js +184 -0
  235. package/dist/wallet/signer-protocol-v2.generated.js +90 -0
  236. package/dist/wallet/solana-bond-signing.js +157 -69
  237. package/dist/wallet/solana-reviewed-transaction.js +375 -0
  238. package/dist/wallet/solana-swap.js +520 -64
  239. package/dist/wallet/solana-transaction-inspection.js +106 -4
  240. package/dist/wallet/solana-trigger.js +658 -320
  241. package/dist/wallet/turnkey-reviewed-state.js +370 -0
  242. package/dist/wallet/wallet-approval-auth.js +17 -28
  243. package/dist/wallet/wallet-atomic-state.js +53 -0
  244. package/dist/wallet/wallet-canary.js +0 -1
  245. package/dist/wallet/wallet-inbound-events.js +16 -11
  246. package/dist/wallet/wallet-policy-simulation.js +1 -1
  247. package/dist/wallet/wallet-policy.js +90 -36
  248. package/dist/wallet/wallet-provider-capabilities.js +28 -4
  249. package/dist/wallet/wallet-provider-registry.js +57 -44
  250. package/dist/wallet/wallet-provider-resolver.js +62 -63
  251. package/dist/wallet/wallet-runtime-config.js +28 -41
  252. package/dist/wallet/wallet-secrets-store.js +22 -0
  253. package/dist/wallet/wallet-send-approvals.js +1891 -589
  254. package/dist/wallet/wallet-send-execution-ledger.js +292 -0
  255. package/dist/wallet/wallet-settlement-links.js +14 -13
  256. package/dist/wallet/wallet-standard-review.js +353 -0
  257. package/dist/wallet/wallet-status.js +0 -9
  258. package/dist/wallet/wallet-task-ledger.js +16 -2
  259. package/dist/web/auto-reply/heartbeat-runner.js +1 -1
  260. package/dist/web/auto-reply/monitor.js +2 -2
  261. package/dist/wizard/host-security-capability.js +14 -23
  262. package/dist/wizard/onboarding.finalize.js +63 -184
  263. package/dist/wizard/onboarding.host-security.js +117 -1367
  264. package/dist/wizard/onboarding.js +172 -217
  265. package/dist/wizard/onboarding.wallet.js +232 -785
  266. package/extensions/acpx/package.json +1 -1
  267. package/extensions/bluebubbles/package.json +1 -1
  268. package/extensions/copilot-proxy/package.json +1 -1
  269. package/extensions/diagnostics-otel/package.json +1 -1
  270. package/extensions/fased-federation/package.json +1 -1
  271. package/extensions/google-gemini-cli-auth/package.json +1 -1
  272. package/extensions/imessage/package.json +1 -1
  273. package/extensions/irc/package.json +1 -1
  274. package/extensions/line/package.json +1 -1
  275. package/extensions/llm-task/package.json +1 -1
  276. package/extensions/lobster/package.json +1 -1
  277. package/extensions/matrix/CHANGELOG.md +12 -0
  278. package/extensions/matrix/package.json +1 -1
  279. package/extensions/mattermost/package.json +1 -1
  280. package/extensions/memory-core/package.json +2 -2
  281. package/extensions/memory-lancedb/package.json +1 -1
  282. package/extensions/minimax-portal-auth/package.json +1 -1
  283. package/extensions/msteams/CHANGELOG.md +12 -0
  284. package/extensions/msteams/package.json +1 -1
  285. package/extensions/nextcloud-talk/package.json +1 -1
  286. package/extensions/nostr/CHANGELOG.md +12 -0
  287. package/extensions/nostr/package.json +1 -1
  288. package/extensions/open-prose/package.json +1 -1
  289. package/extensions/sat-mining/index.ts +498 -153
  290. package/extensions/sat-mining/package.json +1 -1
  291. package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
  292. package/extensions/sat-mining/src/audit-store.ts +50 -5
  293. package/extensions/sat-mining/src/claim-service.ts +85 -14
  294. package/extensions/sat-mining/src/config.ts +9 -0
  295. package/extensions/sat-mining/src/cycle-progress.ts +16 -8
  296. package/extensions/sat-mining/src/epoch-service.ts +9 -5
  297. package/extensions/sat-mining/src/gateway-runner.ts +21 -1
  298. package/extensions/sat-mining/src/protocol-contract.ts +45 -1
  299. package/extensions/sat-mining/src/recovery-service.ts +312 -0
  300. package/extensions/sat-mining/src/round-watcher.ts +391 -81
  301. package/extensions/sat-mining/src/rpc-read.ts +330 -89
  302. package/extensions/sat-mining/src/runtime.ts +14 -0
  303. package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
  304. package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
  305. package/extensions/sat-mining/src/solana-submit.ts +1199 -428
  306. package/extensions/sat-mining/src/submission-ledger.ts +433 -0
  307. package/extensions/signal/package.json +1 -1
  308. package/extensions/synology-chat/package.json +1 -1
  309. package/extensions/tlon/package.json +1 -1
  310. package/extensions/twitch/CHANGELOG.md +12 -0
  311. package/extensions/twitch/package.json +1 -1
  312. package/extensions/voice-call/CHANGELOG.md +12 -0
  313. package/extensions/voice-call/package.json +1 -1
  314. package/extensions/zalo/CHANGELOG.md +12 -0
  315. package/extensions/zalo/package.json +1 -1
  316. package/extensions/zalouser/CHANGELOG.md +12 -0
  317. package/extensions/zalouser/package.json +1 -1
  318. package/install.sh +4955 -0
  319. package/package.json +23 -5
  320. package/scripts/fased-host-updater.mjs +1421 -0
  321. package/scripts/fased-host-updaterctl.mjs +186 -0
  322. package/scripts/fased-managed-service.sh +36 -0
  323. package/scripts/fased-managed-updater.mjs +3065 -156
  324. package/scripts/fased-signer-enroll-hosting.sh +275 -0
  325. package/scripts/fased-signer-network-hosting.sh +143 -0
  326. package/scripts/fased-signer-owner-policy.mjs +1430 -0
  327. package/scripts/fased-signer-policy-hosting.sh +50 -0
  328. package/scripts/fased-signer-policy-local.sh +26 -0
  329. package/scripts/hosted-release-manifest.mjs +185 -0
  330. package/scripts/install-fased-signerd.sh +183 -108
  331. package/scripts/install-managed-runtime.mjs +212 -10
  332. package/scripts/managed-runtime-layout.mjs +75 -3
  333. package/scripts/migrate-hosted-signer-v2.mjs +58 -0
  334. package/scripts/start-managed.sh +169 -360
  335. package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
  336. package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
  337. package/dist/wallet/local-socket-signer-broker.js +0 -224
  338. package/dist/wallet/local-socket-signer-custody.js +0 -42
  339. package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
  340. package/dist/wallet/providers/privy-adapter.js +0 -80
  341. package/dist/wallet/wallet-custody.js +0 -1836
@@ -15,6 +15,7 @@ async function applyInlineDirectiveOverrides(params) {
15
15
  let { provider, model } = params;
16
16
  let { contextTokens } = params;
17
17
  const directiveModelState = {
18
+ allowAnyModel: modelState.allowAnyModel,
18
19
  allowedModelKeys: modelState.allowedModelKeys,
19
20
  allowedModelCatalog: modelState.allowedModelCatalog,
20
21
  resetModelOverride: modelState.resetModelOverride
@@ -155,6 +156,7 @@ async function applyInlineDirectiveOverrides(params) {
155
156
  defaultProvider,
156
157
  defaultModel,
157
158
  aliasIndex,
159
+ allowAnyModel: modelState.allowAnyModel,
158
160
  allowedModelKeys: modelState.allowedModelKeys,
159
161
  provider,
160
162
  model,
@@ -5,6 +5,8 @@ import { applyOwnerOnlyToolPolicy } from "../../agents/tool-policy.js";
5
5
  import { generateSecureToken } from "../../infra/secure-random.js";
6
6
  import { clearAbortCutoffInSession, readAbortCutoffFromSessionEntry, resolveAbortCutoffFromContext, shouldSkipMessageByAbortCutoff } from "./abort-cutoff.js";
7
7
  import { getAbortMemory, isAbortRequestText } from "./abort.js";
8
+ import { readClawHubSkillOrigin } from "../../agents/skills-clawhub.js";
9
+ import { isMarketplaceSkillDir, marketplaceSkillProvenanceMatchesContent } from "../../agents/skills/trust.js";
8
10
  import { createFasedAgentTools } from "../../agents/fased-tools.js";
9
11
  import { collectTextContentBlocks } from "../../agents/content-blocks.js";
10
12
  import { listReservedChatSlashCommandNames, listSkillCommandsForWorkspace, resolveSkillCommandInvocation } from "../skill-commands.js";
@@ -14,6 +16,7 @@ import { isDirectiveOnly } from "./directive-handling.parse.js";
14
16
  import "./directive-handling.js";
15
17
  import "./commands.js";
16
18
  import { extractInlineSimpleCommand } from "./reply-inline.js";
19
+ import path from "node:path";
17
20
 
18
21
  //#region src/auto-reply/reply/get-reply-inline-actions.ts
19
22
  const builtinSlashCommands = (() => {
@@ -77,6 +80,24 @@ async function handleInlineActions(params) {
77
80
  }
78
81
  const dispatch = skillInvocation.command.dispatch;
79
82
  if (dispatch?.kind === "tool") {
83
+ const sourceFile = skillInvocation.command.sourceFilePath?.trim();
84
+ const skillDir = sourceFile ? path.dirname(sourceFile) : "";
85
+ const marketplaceSkill = Boolean(skillDir && isMarketplaceSkillDir(skillDir));
86
+ const marketplaceOrigin = skillDir ? await readClawHubSkillOrigin(skillDir) : null;
87
+ if (marketplaceSkill && (!marketplaceOrigin || !marketplaceSkillProvenanceMatchesContent(skillDir))) {
88
+ typing.cleanup();
89
+ return {
90
+ kind: "reply",
91
+ reply: { text: `❌ Marketplace skill ${skillInvocation.command.skillName} failed its installed-content integrity check. Reinstall the reviewed archive before using direct tool commands.` }
92
+ };
93
+ }
94
+ if (marketplaceOrigin && !(marketplaceOrigin.permissions?.toolAccess ?? []).includes(dispatch.toolName)) {
95
+ typing.cleanup();
96
+ return {
97
+ kind: "reply",
98
+ reply: { text: `❌ Marketplace skill ${marketplaceOrigin.slug} is not authorized for tool ${dispatch.toolName}. Reinstall a reviewed version whose manifest explicitly requests that tool.` }
99
+ };
100
+ }
80
101
  const rawArgs = (skillInvocation.args ?? "").trim();
81
102
  const channel = resolveGatewayMessageChannel(ctx.Surface) ?? resolveGatewayMessageChannel(ctx.Provider) ?? undefined;
82
103
  const tools = createFasedAgentTools({
@@ -122,7 +143,10 @@ async function handleInlineActions(params) {
122
143
  };
123
144
  }
124
145
  }
125
- const promptParts = [`Use the "${skillInvocation.command.skillName}" skill for this request.`, skillInvocation.args ? `User input:\n${skillInvocation.args}` : null].filter((entry) => Boolean(entry));
146
+ const commandTemplate = skillInvocation.command.promptTemplate?.trim();
147
+ const commandArgs = skillInvocation.args?.trim();
148
+ const renderedTemplate = commandTemplate ? commandTemplate.includes("$ARGUMENTS") ? commandTemplate.replaceAll("$ARGUMENTS", commandArgs ?? "") : commandTemplate : null;
149
+ const promptParts = [renderedTemplate ?? `Use the "${skillInvocation.command.skillName}" skill for this request.`, commandArgs && (!renderedTemplate || !commandTemplate?.includes("$ARGUMENTS")) ? `User input:\n${commandArgs}` : null].filter((entry) => Boolean(entry));
126
150
  const rewrittenBody = promptParts.join("\n\n");
127
151
  ctx.Body = rewrittenBody;
128
152
  ctx.BodyForAgent = rewrittenBody;
@@ -207,6 +207,7 @@ async function createModelSelectionState(params) {
207
207
  const needsModelCatalog = params.hasModelDirective || hasAllowlist || hasStoredOverride;
208
208
  let allowedModelKeys = new Set();
209
209
  let allowedModelCatalog = [];
210
+ let allowAnyModel = true;
210
211
  let modelCatalog = null;
211
212
  let resetModelOverride = false;
212
213
  if (needsModelCatalog) {
@@ -228,13 +229,14 @@ async function createModelSelectionState(params) {
228
229
  });
229
230
  allowedModelCatalog = allowed.allowedCatalog;
230
231
  allowedModelKeys = allowed.allowedKeys;
232
+ allowAnyModel = allowed.allowAny;
231
233
  }
232
234
  if (sessionEntry && sessionStore && sessionKey && hasStoredOverride) {
233
235
  const overrideProvider = sessionEntry.providerOverride?.trim() || defaultProvider;
234
236
  const overrideModel = sessionEntry.modelOverride?.trim();
235
237
  if (overrideModel) {
236
238
  const key = modelKey(overrideProvider, overrideModel);
237
- if (allowedModelKeys.size > 0 && !allowedModelKeys.has(key)) {
239
+ if (!allowAnyModel && !allowedModelKeys.has(key)) {
238
240
  const { updated } = applyModelOverrideToSessionEntry({
239
241
  entry: sessionEntry,
240
242
  selection: {
@@ -265,7 +267,7 @@ async function createModelSelectionState(params) {
265
267
  if (storedOverride?.model && !skipStoredOverride) {
266
268
  const candidateProvider = storedOverride.provider || defaultProvider;
267
269
  const key = modelKey(candidateProvider, storedOverride.model);
268
- if (allowedModelKeys.size === 0 || allowedModelKeys.has(key)) {
270
+ if (allowAnyModel || allowedModelKeys.has(key)) {
269
271
  provider = candidateProvider;
270
272
  model = storedOverride.model;
271
273
  }
@@ -318,6 +320,7 @@ async function createModelSelectionState(params) {
318
320
  return {
319
321
  provider,
320
322
  model,
323
+ allowAnyModel,
321
324
  allowedModelKeys,
322
325
  allowedModelCatalog,
323
326
  resetModelOverride,
@@ -327,7 +330,7 @@ async function createModelSelectionState(params) {
327
330
  };
328
331
  }
329
332
  function resolveModelDirectiveSelection(params) {
330
- const { raw, defaultProvider, defaultModel, aliasIndex, allowedModelKeys } = params;
333
+ const { raw, defaultProvider, defaultModel, aliasIndex, allowAnyModel, allowedModelKeys } = params;
331
334
  const rawTrimmed = raw.trim();
332
335
  const rawLower = rawTrimmed.toLowerCase();
333
336
  const pickAliasForKey = (provider, model) => aliasIndex.byKey.get(modelKey(provider, model))?.[0];
@@ -438,7 +441,7 @@ function resolveModelDirectiveSelection(params) {
438
441
  return { error: `Unrecognized model "${rawTrimmed}". Use /models to list providers, or /models <provider> to list models.` };
439
442
  }
440
443
  const resolvedKey = modelKey(resolved.ref.provider, resolved.ref.model);
441
- if (allowedModelKeys.size === 0 || allowedModelKeys.has(resolvedKey)) {
444
+ if (allowAnyModel || allowedModelKeys.has(resolvedKey)) {
442
445
  return { selection: {
443
446
  provider: resolved.ref.provider,
444
447
  model: resolved.ref.model,
@@ -29,7 +29,7 @@ function buildSelectionFromExplicit(params) {
29
29
  return undefined;
30
30
  }
31
31
  const key = modelKey(resolved.ref.provider, resolved.ref.model);
32
- if (params.allowedModelKeys.size > 0 && !params.allowedModelKeys.has(key)) {
32
+ if (!params.allowAnyModel && !params.allowedModelKeys.has(key)) {
33
33
  return undefined;
34
34
  }
35
35
  const isDefault = resolved.ref.provider === params.defaultProvider && resolved.ref.model === params.defaultModel;
@@ -82,10 +82,8 @@ async function applyResetModelOverride(params) {
82
82
  config: params.cfg
83
83
  }) : resolveDefaultAgentId(params.cfg)), { allowKeychainPrompt: false })
84
84
  });
85
+ const allowAnyModel = allowed.allowAny;
85
86
  const allowedModelKeys = allowed.allowedKeys;
86
- if (allowedModelKeys.size === 0) {
87
- return {};
88
- }
89
87
  const providers = new Set();
90
88
  for (const key of allowedModelKeys) {
91
89
  const slash = key.indexOf("/");
@@ -99,6 +97,7 @@ async function applyResetModelOverride(params) {
99
97
  defaultProvider: params.defaultProvider,
100
98
  defaultModel: params.defaultModel,
101
99
  aliasIndex: params.aliasIndex,
100
+ allowAnyModel,
102
101
  allowedModelKeys
103
102
  });
104
103
  let selection;
@@ -117,6 +116,7 @@ async function applyResetModelOverride(params) {
117
116
  defaultProvider: params.defaultProvider,
118
117
  defaultModel: params.defaultModel,
119
118
  aliasIndex: params.aliasIndex,
119
+ allowAnyModel,
120
120
  allowedModelKeys
121
121
  });
122
122
  if (selection) {
package/dist/brand.js CHANGED
@@ -2,7 +2,7 @@
2
2
  const FASED_BRAND_NAME = "Fased";
3
3
  const FASED_AGENT_NAME = "Fased Agent";
4
4
  const FASED_CONTROL_NAME = "Fased Control";
5
- const FASED_PRODUCT_VERSION = "0.1.62";
5
+ const FASED_PRODUCT_VERSION = "0.1.64";
6
6
  const FASED_DISPLAY_VERSION = `v${FASED_PRODUCT_VERSION}`;
7
7
  function formatFasedDisplayLine() {
8
8
  return `${FASED_AGENT_NAME} ${FASED_DISPLAY_VERSION}`;
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.62",
3
- "commit": "1363215001390a35a7338616392a7f9d36ae910b",
4
- "builtAt": "2026-07-16T14:59:30.808Z"
2
+ "version": "0.1.64",
3
+ "commit": "3b1f5fc2be332eabd2055a752e96f9e8e1c84f3d",
4
+ "builtAt": "2026-07-18T13:15:58.022Z"
5
5
  }
@@ -1 +1 @@
1
- 1125727177e49cfcaf2e551412ded002525b5d9e61227f5f1b13522c2a73a5e1
1
+ 991ad74433070833894e32b9ce584814bd21790717ff793eadb8f705787184d2
@@ -2,9 +2,9 @@ import { WA_WEB_AUTH_DIR, logWebSelfId, logoutWeb, pickWebChannel, webAuthExists
2
2
  import { HEARTBEAT_TOKEN } from "./auto-reply/tokens.js";
3
3
  import { HEARTBEAT_PROMPT } from "./auto-reply/heartbeat.js";
4
4
  import { loadWebMedia, optimizeImageToJpeg } from "./web/media.js";
5
- import { DEFAULT_WEB_MEDIA_BYTES } from "./web/auto-reply/constants.js";
6
5
  import { createWaSocket, formatError, getStatusCode, waitForWaConnection } from "./web/session.js";
7
6
  import { sendMessageWhatsApp } from "./web/outbound.js";
7
+ import { DEFAULT_WEB_MEDIA_BYTES } from "./web/auto-reply/constants.js";
8
8
  import { extractMediaPlaceholder, extractText } from "./web/inbound/extract.js";
9
9
  import { monitorWebInbox } from "./web/inbound/monitor.js";
10
10
  import "./web/inbound.js";
@@ -12,4 +12,4 @@ import { monitorWebChannel } from "./web/auto-reply/monitor.js";
12
12
  import "./web/auto-reply.js";
13
13
  import { loginWeb } from "./web/login.js";
14
14
 
15
- export { };
15
+ export { monitorWebChannel };
@@ -18,6 +18,7 @@ import { describeUnknownError, extractGatewayMiskeys, maybeExplainGatewayService
18
18
  import { GatewayLockError } from "../../infra/gateway-lock.js";
19
19
  import { startGatewayServer } from "../../gateway/server.impl.js";
20
20
  import "../../gateway/server.js";
21
+ import { assertLocalSourcePairedGatewayStartAllowed } from "../../infra/local-source-paired-update.js";
21
22
  import { ensureDevGatewayConfig } from "./dev.js";
22
23
  import { runGatewayLoop } from "./run-loop.js";
23
24
  import syncFs from "node:fs";
@@ -55,6 +56,13 @@ function inheritGatewayRunOptions(opts, command) {
55
56
  return merged;
56
57
  }
57
58
  async function runGatewayCommand(opts) {
59
+ try {
60
+ await assertLocalSourcePairedGatewayStartAllowed({ runtimeRoot: path.resolve(process.cwd()) });
61
+ } catch (error) {
62
+ defaultRuntime.error(String(error));
63
+ defaultRuntime.exit(1);
64
+ return;
65
+ }
58
66
  const isDevProfile = process.env.FASED_PROFILE?.trim().toLowerCase() === "dev";
59
67
  const devMode = Boolean(opts.dev) || isDevProfile;
60
68
  if (opts.reset && !devMode) {
@@ -163,7 +163,7 @@ const coreEntries = [
163
163
  {
164
164
  commands: [{
165
165
  name: "wallet",
166
- description: "Wallet providers, keystore, custody, and policy status",
166
+ description: "Wallet providers, signer keys, and policy status",
167
167
  hasSubcommands: true
168
168
  }],
169
169
  register: ({ program }) => {
@@ -60,11 +60,11 @@ const AUTH_CHOICE_HELP = formatAuthChoiceChoicesForCli({
60
60
  });
61
61
  function registerOnboardCommand(program) {
62
62
  const providerAuthFlags = resolveOnboardProviderAuthFlags();
63
- const command = program.command("onboard").description("Interactive wizard to set up the gateway, workspace, and skills").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/onboard", "docs.fased.ai/cli/onboard")}\n`).option("--workspace <dir>", "Agent workspace directory (default: ~/.fased/workspace)").option("--reset", "Repair auth/session state before running wizard").option("--reset-scope <scope>", "Repair scope: sessions|auth|auth+sessions").option("--non-interactive", "Run without prompts", false).option("--accept-risk", "Acknowledge that agents are powerful and full system access is risky (required for --non-interactive)", false).option("--flow <flow>", "Wizard flow: quickstart|advanced|manual").option("--mode <mode>", "Wizard mode: local|remote").option("--host-profile <profile>", "Host security profile: local|hosting").option("--host-security-capable", "Internal: host security was prepared by a root-started installer session").option("--host-maintenance-session", "Internal: post-bootstrap hosted rerun from the app user over Tailscale").option("--ts-authkey <key>", "Tailscale auth key for hosting setup").option("--allow-insecure", "Allow continuing when hosting security setup fails").option("--swap-gb <n>", "Override automatic swap size in GB for hosting setup").option("--auth-choice <choice>", `Auth: ${AUTH_CHOICE_HELP}`).option("--token-provider <id>", "Token provider id (non-interactive; used with --auth-choice token)").option("--token <token>", "Token value (non-interactive; used with --auth-choice token)").option("--token-profile-id <id>", "Auth profile id (non-interactive; default: <provider>:manual)").option("--token-expires-in <duration>", "Optional token expiry duration (e.g. 365d, 12h)").option("--cloudflare-ai-gateway-account-id <id>", "Cloudflare Account ID").option("--cloudflare-ai-gateway-gateway-id <id>", "Cloudflare AI Gateway ID");
63
+ const command = program.command("onboard").description("Interactive wizard to set up the gateway, workspace, and skills").addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/onboard", "docs.fased.ai/cli/onboard")}\n`).option("--workspace <dir>", "Agent workspace directory (default: ~/.fased/workspace)").option("--reset", "Repair auth/session state before running wizard").option("--reset-scope <scope>", "Repair scope: sessions|auth|auth+sessions").option("--non-interactive", "Run without prompts", false).option("--accept-risk", "Acknowledge that agents are powerful and full system access is risky (required for --non-interactive)", false).option("--flow <flow>", "Wizard flow: quickstart|advanced|manual").option("--mode <mode>", "Wizard mode: local|remote").option("--host-profile <profile>", "Host security profile: local|hosting").option("--host-security-capable", "Internal: host security was prepared by a root-started installer session").option("--host-maintenance-session", "Internal: post-bootstrap hosted rerun from the app user over Tailscale").option("--allow-insecure", "Allow continuing when hosting security setup fails").option("--swap-gb <n>", "Override automatic swap size in GB for hosting setup").option("--auth-choice <choice>", `Auth: ${AUTH_CHOICE_HELP}`).option("--token-provider <id>", "Token provider id (non-interactive; used with --auth-choice token)").option("--token <token>", "Token value (non-interactive; used with --auth-choice token)").option("--token-profile-id <id>", "Auth profile id (non-interactive; default: <provider>:manual)").option("--token-expires-in <duration>", "Optional token expiry duration (e.g. 365d, 12h)").option("--cloudflare-ai-gateway-account-id <id>", "Cloudflare Account ID").option("--cloudflare-ai-gateway-gateway-id <id>", "Cloudflare AI Gateway ID");
64
64
  for (const providerFlag of providerAuthFlags) {
65
65
  command.option(providerFlag.cliOption, providerFlag.description);
66
66
  }
67
- command.option("--custom-base-url <url>", "Custom provider base URL").option("--custom-api-key <key>", "Custom provider API key (optional)").option("--custom-model-id <id>", "Custom provider model ID").option("--custom-provider-id <id>", "Custom provider ID (optional; auto-derived by default)").option("--custom-compatibility <mode>", "Custom provider API compatibility: openai|anthropic (default: openai)").option("--allow-private-network", "Allow a custom local/private model provider endpoint in non-interactive onboarding").option("--gateway-port <port>", "Gateway port").option("--gateway-bind <mode>", "Gateway bind: loopback|tailnet|lan|auto|custom").option("--gateway-auth <mode>", "Gateway auth: token|password").option("--gateway-token <token>", "Gateway token (token auth)").option("--gateway-password <password>", "Gateway password (password auth)").option("--wallet-enabled", "Enable wallet integration").option("--wallet-disabled", "Disable wallet integration").option("--wallet-mode <mode>", "Wallet mode: managed|external").option("--wallet-runtime <runtime>", "Wallet runtime: external-docker|external-custom").option("--wallet-providers <ids>", "Enabled wallet providers CSV (embedded-keystore,local-socket-signer,alchemy,turnkey,privy)").option("--wallet-default-provider <id>", "Default wallet provider id (embedded-keystore|local-socket-signer|alchemy|turnkey|privy)").option("--wallet-chains <chains>", "Wallet chains CSV (solana)").option("--wallet-host <host>", "External self-hosted signer host (advanced/deprecated)").option("--wallet-port <port>", "External self-hosted signer port (advanced/deprecated)").option("--wallet-install-enabled", "Enable wallet runtime auto-install").option("--wallet-install-disabled", "Disable wallet runtime auto-install").option("--wallet-install-version <version>", "Legacy self-host signer runtime version").option("--wallet-direct-signing", "Enable automated wallet execution for approved Agent tools").option("--wallet-no-direct-signing", "Disable automated wallet execution for approved Agent tools").option("--wallet-solana-allow-programs <programs>", "CSV allowlist of Solana programs").option("--wallet-solana-max-per-tx <amount>", "Solana per-transaction cap (lamports)").option("--wallet-solana-max-daily <amount>", "Solana daily cap (lamports)").option("--wallet-tool-access-mode <mode>", "Wallet tool access: owner-only|allowlist|all").option("--wallet-tool-access-allow-agents <agents>", "CSV allowlist agent IDs for wallet tool").option("--remote-url <url>", "Remote Gateway WebSocket URL").option("--remote-token <token>", "Remote Gateway token (optional)").option("--tailscale <mode>", "Tailscale: off|serve|funnel").option("--tailscale-reset-on-exit", "Reset tailscale serve/funnel on exit").option("--install-daemon", "Install gateway service").option("--no-install-daemon", "Skip gateway service install").option("--skip-daemon", "Skip gateway service install").option("--daemon-runtime <runtime>", "Daemon runtime: node|bun").option("--skip-channels", "Skip channel setup").option("--skip-skills", "Skip skills setup").option("--skip-health", "Skip health check").option("--fast-health", "Use fast health mode (skip long probe waits and non-critical startup gating)", true).option("--no-fast-health", "Disable fast health mode").option("--skip-ui", "Skip Control UI/TUI prompts").option("--node-manager <name>", "Node manager for skills: npm|pnpm|bun").option("--json", "Output JSON summary", false);
67
+ command.option("--custom-base-url <url>", "Custom provider base URL").option("--custom-api-key <key>", "Custom provider API key (optional)").option("--custom-model-id <id>", "Custom provider model ID").option("--custom-provider-id <id>", "Custom provider ID (optional; auto-derived by default)").option("--custom-compatibility <mode>", "Custom provider API compatibility: openai|anthropic (default: openai)").option("--allow-private-network", "Allow a custom local/private model provider endpoint in non-interactive onboarding").option("--gateway-port <port>", "Gateway port").option("--gateway-bind <mode>", "Gateway bind: loopback|tailnet|lan|auto|custom").option("--gateway-auth <mode>", "Gateway auth: token|password").option("--gateway-token <token>", "Gateway token (token auth)").option("--gateway-password <password>", "Gateway password (password auth)").option("--wallet-enabled", "Enable wallet integration").option("--wallet-disabled", "Disable wallet integration").option("--wallet-mode <mode>", "Wallet mode: managed|external").option("--wallet-runtime <runtime>", "Wallet runtime: external-docker|external-custom").option("--wallet-providers <ids>", "Enabled wallet providers CSV (local-socket-signer,alchemy,turnkey,wallet-standard)").option("--wallet-default-provider <id>", "Default wallet provider id (local-socket-signer|alchemy|turnkey|wallet-standard)").option("--wallet-chains <chains>", "Wallet chains CSV (solana)").option("--wallet-host <host>", "External self-hosted signer host (advanced/deprecated)").option("--wallet-port <port>", "External self-hosted signer port (advanced/deprecated)").option("--wallet-install-enabled", "Enable wallet runtime auto-install").option("--wallet-install-disabled", "Disable wallet runtime auto-install").option("--wallet-install-version <version>", "Legacy self-host signer runtime version").option("--wallet-direct-signing", "Enable automated wallet execution for approved Agent tools").option("--wallet-no-direct-signing", "Disable automated wallet execution for approved Agent tools").option("--wallet-solana-allow-programs <programs>", "CSV allowlist of Solana programs").option("--wallet-solana-max-per-tx <amount>", "Solana per-transaction cap (lamports)").option("--wallet-solana-max-daily <amount>", "Solana daily cap (lamports)").option("--wallet-tool-access-mode <mode>", "Wallet tool access: owner-only|allowlist|all").option("--wallet-tool-access-allow-agents <agents>", "CSV allowlist agent IDs for wallet tool").option("--remote-url <url>", "Remote Gateway WebSocket URL").option("--remote-token <token>", "Remote Gateway token (optional)").option("--tailscale <mode>", "Tailscale: off|serve|funnel").option("--tailscale-reset-on-exit", "Reset tailscale serve/funnel on exit").option("--install-daemon", "Install gateway service").option("--no-install-daemon", "Skip gateway service install").option("--skip-daemon", "Skip gateway service install").option("--daemon-runtime <runtime>", "Daemon runtime: node|bun").option("--skip-channels", "Skip channel setup").option("--skip-skills", "Skip skills setup").option("--skip-health", "Skip health check").option("--fast-health", "Use fast health mode (skip long probe waits and non-critical startup gating)", true).option("--no-fast-health", "Disable fast health mode").option("--skip-ui", "Skip Control UI/TUI prompts").option("--node-manager <name>", "Node manager for skills: npm|pnpm|bun").option("--json", "Output JSON summary", false);
68
68
  command.action(async (opts, commandRuntime) => {
69
69
  await runCommandWithRuntime(defaultRuntime, async () => {
70
70
  const installDaemon = resolveInstallDaemonFlag(commandRuntime, { installDaemon: Boolean(opts.installDaemon) });
@@ -87,7 +87,6 @@ function registerOnboardCommand(program) {
87
87
  hostProfile: opts.hostProfile,
88
88
  hostSecurityCapable: Boolean(opts.hostSecurityCapable),
89
89
  hostMaintenanceSession: Boolean(opts.hostMaintenanceSession),
90
- tsAuthkey: opts.tsAuthkey,
91
90
  allowInsecure: Boolean(opts.allowInsecure),
92
91
  swapGb: typeof swapGbRaw === "number" && Number.isFinite(swapGbRaw) ? swapGbRaw : undefined,
93
92
  workspace: opts.workspace,
@@ -1,6 +1,6 @@
1
1
  import { defaultRuntime } from "../../runtime.js";
2
2
  import { runCommandWithRuntime } from "../cli-utils.js";
3
- import { walletCanaryCommand, walletCustodyInitCommand, walletCustodyLockCommand, walletInboundListCommand, walletInboundPollCommand, walletInboundReconcileCommand, walletKeystoreExportCommand, walletKeystoreImportCommand, walletKeystoreInitCommand, walletKeystorePassphraseInitCommand, walletKeystorePassphraseRotateCommand, walletKeystoreStatusCommand, walletKeystoreValidateCommand, walletLimitOrdersConfigureCommand, walletMigrateCommand, walletPolicyProfileApplyCommand, walletProviderConfigureCommand, walletRoleSetCommand, walletRotateKeysCommand, walletSetupCommand, walletSignerBrokerCommand, walletSignerDoctorCommand, walletSignerServeCommand, walletStatusCommand } from "../../commands/wallet.js";
3
+ import { walletCanaryCommand, walletInboundListCommand, walletInboundPollCommand, walletInboundReconcileCommand, walletLegacyMigrationFinalizeCommand, walletLimitOrdersConfigureCommand, walletMigrateCommand, walletPolicyProfileApplyCommand, walletProviderConfigureCommand, walletRoleSetCommand, walletRotateKeysCommand, walletSetupCommand, walletSignerDoctorCommand, walletSignerServeCommand, walletStatusCommand } from "../../commands/wallet.js";
4
4
 
5
5
  //#region src/cli/program/register.wallet.ts
6
6
  function resolvePublicWalletSetupChain(raw) {
@@ -14,10 +14,10 @@ function resolvePublicWalletSetupChain(raw) {
14
14
  throw new Error("Wallet setup is Solana-only. Use --chain solana.");
15
15
  }
16
16
  function registerWalletCommands(program) {
17
- const wallet = program.command("wallet").description("Wallet providers, keystore, custody, and policy status").action(() => {
17
+ const wallet = program.command("wallet").description("Wallet providers, native signer, and policy status").action(() => {
18
18
  wallet.help({ error: true });
19
19
  });
20
- wallet.command("setup").description("Guided Solana wallet setup (create/import local signer wallet)").option("--mode <mode>", "embedded-create|embedded-import|local-signer|turnkey (embedded alias allowed)").option("--chain <chain>", "solana", "solana").option("--wallet-id <id>", "Named wallet id (examples: agent, mining, vault)").option("--wallet-name <value>", "Friendly wallet display name (for UI/skills/plugins)").option("--role <role>", "agent|vault. SAT mining is attached separately.").option("--private-key <value>", "Private key for import mode (prefer env)").option("--api-key <value>", "Hosted wallet provider API key (alchemy/privy mode)").option("--rpc-url <url>", "RPC URL hint for embedded create/import").option("--show-private-key-once", "For embedded-create: print generated private key once", false).option("--confirm-private-key-print <text>", "Required with --show-private-key-once; type \"SHOW PRIVATE KEY\"").option("--turnkey-api-public-key <value>", "Turnkey API public key (turnkey mode)").option("--turnkey-api-private-key <value>", "Turnkey API private key (turnkey mode)").option("--turnkey-organization-id <value>", "Turnkey organization ID (turnkey mode)").option("--turnkey-base-url <value>", "Turnkey base URL override (turnkey mode)").option("--enable-limit-orders", "Store Jupiter API key config for policy-gated wallet actions", false).option("--disable-limit-orders", "Remove stored Jupiter wallet-action config", false).option("--jupiter-api-key <value>", "Jupiter API key for policy-gated wallet actions").option("--jupiter-trigger-api-base-url <url>", "Advanced: Jupiter Trigger API base URL override").option("--non-interactive", "Do not prompt; require mode/inputs", false).option("--no-doctor", "Skip signer doctor in local-signer mode", false).option("--json", "Print JSON output", false).action(async (opts) => {
20
+ wallet.command("setup").description("Create a signer-owned Solana wallet or configure a supported provider").option("--mode <mode>", "local-signer-create|local-signer-import|local-signer|turnkey|alchemy").option("--chain <chain>", "solana", "solana").option("--wallet-id <id>", "Named wallet id (examples: agent, mining, vault)").option("--wallet-name <value>", "Friendly wallet display name (for UI/skills/plugins)").option("--role <role>", "Permanent signer role: agent|mining|vault").option("--api-key <value>", "Alchemy API key").option("--rpc-url <url>", "Solana RPC URL").option("--turnkey-api-public-key <value>", "Turnkey API public key (turnkey mode)").option("--turnkey-api-private-key <value>", "Turnkey API private key (turnkey mode)").option("--turnkey-organization-id <value>", "Turnkey organization ID (turnkey mode)").option("--turnkey-policy-id <value>", "Turnkey policy ID (turnkey mode)").option("--turnkey-base-url <value>", "Turnkey base URL override (turnkey mode)").option("--enable-limit-orders", "Legacy alias: configure Gateway Jupiter Swap API access (Trigger is signer-owned)", false).option("--disable-limit-orders", "Remove stored Gateway Jupiter Swap API key", false).option("--jupiter-api-key <value>", "Jupiter API key for Gateway swap crafting only").option("--non-interactive", "Do not prompt; require mode/inputs", false).option("--no-doctor", "Skip signer doctor in local-signer mode", false).option("--json", "Print JSON output", false).action(async (opts) => {
21
21
  await runCommandWithRuntime(defaultRuntime, async () => {
22
22
  await walletSetupCommand(defaultRuntime, {
23
23
  mode: typeof opts.mode === "string" ? opts.mode : undefined,
@@ -25,32 +25,28 @@ function registerWalletCommands(program) {
25
25
  walletId: typeof opts.walletId === "string" ? opts.walletId : undefined,
26
26
  walletName: typeof opts.walletName === "string" ? opts.walletName : undefined,
27
27
  role: typeof opts.role === "string" ? opts.role : undefined,
28
- privateKey: typeof opts.privateKey === "string" ? opts.privateKey : undefined,
29
28
  apiKey: typeof opts.apiKey === "string" ? opts.apiKey : undefined,
30
29
  rpcUrl: typeof opts.rpcUrl === "string" ? opts.rpcUrl : undefined,
31
- showPrivateKeyOnce: Boolean(opts.showPrivateKeyOnce),
32
- confirmPrivateKeyPrint: typeof opts.confirmPrivateKeyPrint === "string" ? opts.confirmPrivateKeyPrint : undefined,
33
30
  turnkeyApiPublicKey: typeof opts.turnkeyApiPublicKey === "string" ? opts.turnkeyApiPublicKey : undefined,
34
31
  turnkeyApiPrivateKey: typeof opts.turnkeyApiPrivateKey === "string" ? opts.turnkeyApiPrivateKey : undefined,
35
32
  turnkeyOrganizationId: typeof opts.turnkeyOrganizationId === "string" ? opts.turnkeyOrganizationId : undefined,
33
+ turnkeyPolicyId: typeof opts.turnkeyPolicyId === "string" ? opts.turnkeyPolicyId : undefined,
36
34
  turnkeyBaseUrl: typeof opts.turnkeyBaseUrl === "string" ? opts.turnkeyBaseUrl : undefined,
37
35
  enableLimitOrders: Boolean(opts.enableLimitOrders),
38
36
  disableLimitOrders: Boolean(opts.disableLimitOrders),
39
37
  jupiterApiKey: typeof opts.jupiterApiKey === "string" ? opts.jupiterApiKey : undefined,
40
- jupiterTriggerApiBaseUrl: typeof opts.jupiterTriggerApiBaseUrl === "string" ? opts.jupiterTriggerApiBaseUrl : undefined,
41
38
  nonInteractive: Boolean(opts.nonInteractive),
42
39
  noDoctor: Boolean(opts.noDoctor),
43
40
  json: Boolean(opts.json)
44
41
  });
45
42
  });
46
43
  });
47
- wallet.command("limit-orders").description("Configure Jupiter Trigger support for policy-gated Agent wallet actions").option("--enable", "Enable Jupiter wallet-action support and store API key config", false).option("--disable", "Remove stored Jupiter wallet-action config", false).option("--jupiter-api-key <value>", "Jupiter API key for policy-gated wallet actions").option("--jupiter-trigger-api-base-url <url>", "Advanced: Jupiter Trigger API base URL override").option("--non-interactive", "Do not prompt; require explicit inputs", false).option("--json", "Print JSON output", false).action(async (opts) => {
44
+ wallet.command("limit-orders").description("Configure Gateway Jupiter Swap API access; Trigger credentials remain signer-owned").option("--enable", "Store a Gateway Jupiter Swap API key", false).option("--disable", "Remove the stored Gateway Jupiter Swap API key", false).option("--jupiter-api-key <value>", "Jupiter API key for Gateway swap crafting only").option("--non-interactive", "Do not prompt; require explicit inputs", false).option("--json", "Print JSON output", false).action(async (opts) => {
48
45
  await runCommandWithRuntime(defaultRuntime, async () => {
49
46
  await walletLimitOrdersConfigureCommand(defaultRuntime, {
50
47
  enable: Boolean(opts.enable),
51
48
  disable: Boolean(opts.disable),
52
49
  jupiterApiKey: typeof opts.jupiterApiKey === "string" ? opts.jupiterApiKey : undefined,
53
- jupiterTriggerApiBaseUrl: typeof opts.jupiterTriggerApiBaseUrl === "string" ? opts.jupiterTriggerApiBaseUrl : undefined,
54
50
  nonInteractive: Boolean(opts.nonInteractive),
55
51
  json: Boolean(opts.json)
56
52
  });
@@ -61,42 +57,17 @@ function registerWalletCommands(program) {
61
57
  await walletStatusCommand(defaultRuntime, { json: Boolean(opts.json) });
62
58
  });
63
59
  });
64
- wallet.command("rotate-keys").description("Rotate local wallet keys (provider-specific; deprecated command name)").option("--json", "Print JSON output", false).action(async (opts) => {
60
+ wallet.command("rotate-keys").description("Removed Gateway key rotation; prints native/provider authority guidance").option("--json", "Print JSON output", false).action(async (opts) => {
65
61
  await runCommandWithRuntime(defaultRuntime, async () => {
66
62
  await walletRotateKeysCommand(defaultRuntime, { json: Boolean(opts.json) });
67
63
  });
68
64
  });
69
- const keystore = wallet.command("keystore").description("Manage encrypted local Solana keystore wallets");
70
- keystore.command("init").description("Create a new encrypted keystore and set provider=embedded-keystore").option("--chain <chain>", "Key type: solana", "solana").option("--wallet-id <id>", "Named wallet id (agent, mining, vault, ...)").option("--out <path>", "Output keystore path (default: <state>/wallet/keystore.v1.enc)").option("--passphrase <value>", "Keystore passphrase (prefer env/file in shell history-safe use)").option("--rpc-url <url>", "Optional RPC URL hint (still typically set via env)").option("--show-private-key-once", "Print generated private key once (dangerous)", false).option("--confirm-private-key-print <text>", "Required with --show-private-key-once; type \"SHOW PRIVATE KEY\"").option("--name <value>", "Named wallet label for UI").option("--role <role>", "agent|vault. SAT mining is attached separately.").option("--force", "Overwrite existing keystore", false).option("--json", "Print JSON output", false).action(async (opts) => {
65
+ wallet.command("finalize-legacy-migration").description("Verify a completed native signer import and retire legacy config/registry references").requiredOption("--wallet-id <id>", "Legacy wallet id imported into fased-signerd").option("--wallet-name <name>", "Name when the legacy registry row is missing").option("--json", "Print JSON output", false).action(async (opts) => {
71
66
  await runCommandWithRuntime(defaultRuntime, async () => {
72
- await walletKeystoreInitCommand(defaultRuntime, {
73
- json: Boolean(opts.json),
74
- chain: resolvePublicWalletSetupChain(opts.chain) ?? "solana",
75
- walletId: typeof opts.walletId === "string" ? opts.walletId : undefined,
76
- out: typeof opts.out === "string" ? opts.out : undefined,
77
- passphrase: typeof opts.passphrase === "string" ? opts.passphrase : undefined,
78
- rpcUrl: typeof opts.rpcUrl === "string" ? opts.rpcUrl : undefined,
79
- showPrivateKeyOnce: Boolean(opts.showPrivateKeyOnce),
80
- confirmPrivateKeyPrint: typeof opts.confirmPrivateKeyPrint === "string" ? opts.confirmPrivateKeyPrint : undefined,
81
- name: typeof opts.name === "string" ? opts.name : undefined,
82
- role: typeof opts.role === "string" ? opts.role : undefined,
83
- force: Boolean(opts.force)
84
- });
85
- });
86
- });
87
- keystore.command("import").description("Import a raw Solana private key into an encrypted keystore and set provider").option("--chain <chain>", "Key type: solana", "solana").option("--wallet-id <id>", "Named wallet id (agent, mining, vault, ...)").option("--private-key <value>", "Solana private key (prefer env FASED_WALLET_PRIVATE_KEY)").option("--out <path>", "Output keystore path (default: <state>/wallet/keystore.v1.enc)").option("--passphrase <value>", "Keystore passphrase (prefer env/file in shell history-safe use)").option("--rpc-url <url>", "Optional RPC URL hint (still typically set via env)").option("--name <value>", "Named wallet label for UI").option("--role <role>", "agent|vault. SAT mining is attached separately.").option("--force", "Overwrite existing keystore", false).option("--json", "Print JSON output", false).action(async (opts) => {
88
- await runCommandWithRuntime(defaultRuntime, async () => {
89
- await walletKeystoreImportCommand(defaultRuntime, {
90
- json: Boolean(opts.json),
91
- walletId: typeof opts.walletId === "string" ? opts.walletId : undefined,
92
- out: typeof opts.out === "string" ? opts.out : undefined,
93
- passphrase: typeof opts.passphrase === "string" ? opts.passphrase : undefined,
94
- rpcUrl: typeof opts.rpcUrl === "string" ? opts.rpcUrl : undefined,
95
- privateKey: typeof opts.privateKey === "string" ? opts.privateKey : undefined,
96
- chain: resolvePublicWalletSetupChain(opts.chain) ?? "solana",
97
- name: typeof opts.name === "string" ? opts.name : undefined,
98
- role: typeof opts.role === "string" ? opts.role : undefined,
99
- force: Boolean(opts.force)
67
+ await walletLegacyMigrationFinalizeCommand(defaultRuntime, {
68
+ walletId: String(opts.walletId),
69
+ walletName: typeof opts.walletName === "string" ? opts.walletName : undefined,
70
+ json: Boolean(opts.json)
100
71
  });
101
72
  });
102
73
  });
@@ -110,59 +81,11 @@ function registerWalletCommands(program) {
110
81
  });
111
82
  });
112
83
  });
113
- keystore.command("passphrase-init").description("Generate keystore passphrase file (0600) and print env export hint").option("--out <path>", "Passphrase file path (default: <state>/wallet/passphrase)").option("--length <bytes>", "Random bytes length", (v) => Number.parseInt(v, 10)).option("--force", "Overwrite existing file", false).option("--json", "Print JSON output", false).action(async (opts) => {
114
- await runCommandWithRuntime(defaultRuntime, async () => {
115
- await walletKeystorePassphraseInitCommand(defaultRuntime, {
116
- out: typeof opts.out === "string" ? opts.out : undefined,
117
- length: typeof opts.length === "number" && Number.isFinite(opts.length) ? opts.length : undefined,
118
- force: Boolean(opts.force),
119
- json: Boolean(opts.json)
120
- });
121
- });
122
- });
123
- keystore.command("rotate-passphrase").description("Re-encrypt embedded keystore with a new passphrase and update passphrase file").option("--file <path>", "Passphrase file path (default: env or <state>/wallet/passphrase)").option("--old-passphrase <value>", "Old passphrase (avoid shell history; prefer file/env)").option("--new-passphrase <value>", "New passphrase (omit to auto-generate)").option("--json", "Print JSON output", false).action(async (opts) => {
124
- await runCommandWithRuntime(defaultRuntime, async () => {
125
- await walletKeystorePassphraseRotateCommand(defaultRuntime, {
126
- file: typeof opts.file === "string" ? opts.file : undefined,
127
- oldPassphrase: typeof opts.oldPassphrase === "string" ? opts.oldPassphrase : undefined,
128
- newPassphrase: typeof opts.newPassphrase === "string" ? opts.newPassphrase : undefined,
129
- json: Boolean(opts.json)
130
- });
131
- });
132
- });
133
- keystore.command("export").description("Export encrypted keystore backup (dangerous if printing)").option("--out <path>", "Write backup copy to path").option("--include-secret", "Include encrypted keystore content in JSON output", false).option("--confirm-include-secret <text>", "Required with --include-secret; type \"EXPORT KEYSTORE\"").option("--json", "Print JSON output", false).action(async (opts) => {
134
- await runCommandWithRuntime(defaultRuntime, async () => {
135
- await walletKeystoreExportCommand(defaultRuntime, {
136
- out: typeof opts.out === "string" ? opts.out : undefined,
137
- includeSecret: Boolean(opts.includeSecret),
138
- confirmIncludeSecret: typeof opts.confirmIncludeSecret === "string" ? opts.confirmIncludeSecret : undefined,
139
- json: Boolean(opts.json)
140
- });
141
- });
142
- });
143
- keystore.command("status").description("Show embedded keystore presence/unlock status").option("--chain <chain>", "Target chain: solana", "solana").option("--wallet-id <id>", "Named wallet id (uses chain-specific signer env fallback paths)").option("--json", "Print JSON output", false).action(async (opts) => {
144
- await runCommandWithRuntime(defaultRuntime, async () => {
145
- await walletKeystoreStatusCommand(defaultRuntime, {
146
- json: Boolean(opts.json),
147
- walletId: typeof opts.walletId === "string" ? opts.walletId : undefined,
148
- chain: resolvePublicWalletSetupChain(opts.chain) ?? "solana"
149
- });
150
- });
151
- });
152
- keystore.command("validate").description("Validate embedded keystore unlock + RPC connectivity + chain + balance").option("--chain <chain>", "Keystore chain override: solana").option("--wallet-id <id>", "Named wallet id (agent, mining, vault, ...)").option("--json", "Print JSON output", false).action(async (opts) => {
153
- await runCommandWithRuntime(defaultRuntime, async () => {
154
- await walletKeystoreValidateCommand(defaultRuntime, {
155
- json: Boolean(opts.json),
156
- walletId: typeof opts.walletId === "string" ? opts.walletId : undefined,
157
- chain: resolvePublicWalletSetupChain(opts.chain)
158
- });
159
- });
160
- });
161
84
  const provider = wallet.command("provider").description("Configure hosted wallet provider credentials (stored encrypted locally)");
162
85
  provider.command("configure <providerId>").description("Configure hosted provider credentials and set wallet.provider.id").option("--set <key=value>", "Credential field (repeatable)", (v, acc) => [...acc, v], []).option("--rpc-url <url>", "Optional RPC URL hint to store with provider credentials").option("--json", "Print JSON output", false).action(async (providerArg, opts) => {
163
- const providerId = providerArg === "turnkey" || providerArg === "privy" || providerArg === "alchemy" ? providerArg : null;
86
+ const providerId = providerArg === "turnkey" || providerArg === "alchemy" ? providerArg : null;
164
87
  if (!providerId) {
165
- throw new Error("provider must be one of: turnkey, privy, alchemy");
88
+ throw new Error("provider must be one of: turnkey, alchemy; Privy is unavailable");
166
89
  }
167
90
  await runCommandWithRuntime(defaultRuntime, async () => {
168
91
  await walletProviderConfigureCommand(defaultRuntime, {
@@ -198,17 +121,6 @@ function registerWalletCommands(program) {
198
121
  });
199
122
  });
200
123
  });
201
- signer.command("broker").description("Run the app-facing local signer broker daemon").option("--socket <path>", "App-facing Unix socket path").option("--backend-socket <path>", "Private backend signer socket path").option("--read-only", "Read-only mode", false).option("--pid-file <path>", "PID file path").option("--audit-log <path>", "Audit log path").action(async (opts) => {
202
- await runCommandWithRuntime(defaultRuntime, async () => {
203
- await walletSignerBrokerCommand(defaultRuntime, {
204
- socketPath: typeof opts.socket === "string" ? opts.socket : undefined,
205
- backendSocketPath: typeof opts.backendSocket === "string" ? opts.backendSocket : undefined,
206
- readOnly: Boolean(opts.readOnly),
207
- pidFile: typeof opts.pidFile === "string" ? opts.pidFile : undefined,
208
- auditLog: typeof opts.auditLog === "string" ? opts.auditLog : undefined
209
- });
210
- });
211
- });
212
124
  signer.command("doctor").description("Validate native/local signer socket, pid, audit log, rpc, and keystore readiness").option("--socket <path>", "Unix socket path").option("--json", "Print JSON output", false).action(async (opts) => {
213
125
  await runCommandWithRuntime(defaultRuntime, async () => {
214
126
  await walletSignerDoctorCommand(defaultRuntime, {
@@ -217,25 +129,6 @@ function registerWalletCommands(program) {
217
129
  });
218
130
  });
219
131
  });
220
- wallet.command("custody-init").description("Initialize split-key custody ceremony (device/hot/cold share state)").option("--json", "Print JSON output", false).option("--force", "Overwrite existing custody ceremony state", false).option("--wallet <walletId>", "Target wallet id for per-wallet custody state").option("--device-share <base64>", "Optional pre-generated device share (base64/base64url, 32 bytes)").action(async (opts) => {
221
- await runCommandWithRuntime(defaultRuntime, async () => {
222
- await walletCustodyInitCommand(defaultRuntime, {
223
- json: Boolean(opts.json),
224
- force: Boolean(opts.force),
225
- walletId: typeof opts.wallet === "string" ? opts.wallet : undefined,
226
- deviceShare: typeof opts.deviceShare === "string" ? opts.deviceShare : undefined
227
- });
228
- });
229
- });
230
- wallet.command("custody-lock").description("Immediately end active custody unlock sessions (clears ephemeral signing material)").option("--host <host>", "Only lock unlock sessions for this host").option("--wallet <walletId>", "Only lock unlock sessions for this wallet").option("--json", "Print JSON output", false).action(async (opts) => {
231
- await runCommandWithRuntime(defaultRuntime, async () => {
232
- await walletCustodyLockCommand(defaultRuntime, {
233
- json: Boolean(opts.json),
234
- host: typeof opts.host === "string" ? opts.host : undefined,
235
- walletId: typeof opts.wallet === "string" ? opts.wallet : undefined
236
- });
237
- });
238
- });
239
132
  wallet.command("migrate").description("Migrate wallet runtime source").requiredOption("--from <runtime>", "Current runtime: external-docker|external-custom").requiredOption("--to <runtime>", "Target runtime: external-docker|external-custom").option("--json", "Print JSON output", false).action(async (opts) => {
240
133
  await runCommandWithRuntime(defaultRuntime, async () => {
241
134
  await walletMigrateCommand(defaultRuntime, {
@@ -245,7 +138,7 @@ function registerWalletCommands(program) {
245
138
  });
246
139
  });
247
140
  });
248
- wallet.command("canary").description("Run real-chain canary checks (and optional recovery drill)").option("--json", "Print JSON output", false).option("--no-require-real-chain", "Allow non-real-chain readiness failures in checks").option("--execute-provider-e2e", "Run provider-level E2E checks (create/address/balance/reject/audit; send when enabled)", false).option("--execute-live-send", "Allow real on-chain send execution in provider E2E (requires canary target env vars)", false).option("--providers <ids>", "Comma-separated provider ids (embedded-keystore,alchemy,turnkey,privy)").option("--execute-recovery-drill", "Run stack down/up recovery drill (external-docker runtime only)", false).action(async (opts) => {
141
+ wallet.command("canary").description("Run real-chain canary checks (and optional recovery drill)").option("--json", "Print JSON output", false).option("--no-require-real-chain", "Allow non-real-chain readiness failures in checks").option("--execute-provider-e2e", "Run provider-level E2E checks (create/address/balance/reject/audit; send when enabled)", false).option("--execute-live-send", "Allow real on-chain send execution in provider E2E (requires canary target env vars)", false).option("--providers <ids>", "Comma-separated provider ids (alchemy,turnkey)").option("--execute-recovery-drill", "Run stack down/up recovery drill (external-docker runtime only)", false).action(async (opts) => {
249
142
  await runCommandWithRuntime(defaultRuntime, async () => {
250
143
  await walletCanaryCommand(defaultRuntime, {
251
144
  json: Boolean(opts.json),
@@ -258,7 +151,7 @@ function registerWalletCommands(program) {
258
151
  });
259
152
  });
260
153
  const inbound = wallet.command("inbound").description("Inbound receive/deposit monitoring");
261
- inbound.command("poll").description("Poll balances and detect inbound/outbound delta events").option("--provider <id>", "Provider id (embedded-keystore|alchemy|turnkey|privy)").option("--wallet-id <id>", "Named wallet id scope").option("--wallet-name <name>", "Named wallet name scope").option("--chain <chain>", "solana|all", "all").option("--json", "Print JSON output", false).action(async (opts) => {
154
+ inbound.command("poll").description("Poll balances and detect inbound/outbound delta events").option("--provider <id>", "Provider id (local-socket-signer|alchemy|turnkey|wallet-standard)").option("--wallet-id <id>", "Named wallet id scope").option("--wallet-name <name>", "Named wallet name scope").option("--chain <chain>", "solana|all", "all").option("--json", "Print JSON output", false).action(async (opts) => {
262
155
  await runCommandWithRuntime(defaultRuntime, async () => {
263
156
  await walletInboundPollCommand(defaultRuntime, {
264
157
  json: Boolean(opts.json),
@@ -269,7 +162,7 @@ function registerWalletCommands(program) {
269
162
  });
270
163
  });
271
164
  });
272
- inbound.command("list").description("List inbound/deposit events from local wallet ledger").option("--provider <id>", "Provider id (embedded-keystore|alchemy|turnkey|privy)").option("--wallet-id <id>", "Named wallet id filter").option("--chain <chain>", "solana").option("--status <status>", "all|detected|confirmed|reconciled|ignored", "all").option("--limit <count>", "Result limit", "100").option("--json", "Print JSON output", false).action(async (opts) => {
165
+ inbound.command("list").description("List inbound/deposit events from local wallet ledger").option("--provider <id>", "Provider id (local-socket-signer|alchemy|turnkey|wallet-standard)").option("--wallet-id <id>", "Named wallet id filter").option("--chain <chain>", "solana").option("--status <status>", "all|detected|confirmed|reconciled|ignored", "all").option("--limit <count>", "Result limit", "100").option("--json", "Print JSON output", false).action(async (opts) => {
273
166
  const limit = typeof opts.limit === "string" && opts.limit.trim() ? Number.parseInt(opts.limit, 10) : undefined;
274
167
  await runCommandWithRuntime(defaultRuntime, async () => {
275
168
  await walletInboundListCommand(defaultRuntime, {
@@ -1,11 +1,11 @@
1
1
  import { theme } from "../terminal/theme.js";
2
2
  import { defaultRuntime } from "../runtime.js";
3
3
  import { listAgentIds, resolveAgentDir, resolveDefaultAgentId } from "../agents/agent-scope.js";
4
- import { getProviderBrandManifestForRoute } from "../providers/registry.js";
5
4
  import { ensureAuthProfileStore, loadAuthProfileStoreForRuntime } from "../agents/auth-profiles/store.js";
6
5
  import { loadConfig, writeConfigFile } from "../config/io.js";
7
6
  import "../config/config.js";
8
7
  import "../agents/auth-profiles.js";
8
+ import { getProviderBrandManifestForRoute } from "../providers/registry.js";
9
9
  import { ensureFasedModelsJson } from "../agents/models-config.js";
10
10
  import { applyProviderRefreshToRegistrySource, buildProviderCapabilityOverridesSource, buildProviderRefreshEnvFromCredentials, buildProviderRefreshReport, buildProviderRegistryReviewPatch, fetchOfficialProviderRefreshSnapshot, loadProviderRefreshSnapshotFromFile } from "../providers/refresh.js";
11
11
  import { buildAuthChoiceGroups } from "../commands/auth-choice-options.js";