@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
@@ -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";
@@ -1,12 +1,16 @@
1
+ import { resolveStateDir } from "../config/paths.js";
1
2
  import { theme } from "../terminal/theme.js";
2
3
  import { defaultRuntime } from "../runtime.js";
3
4
  import { formatCliCommand } from "./command-format.js";
5
+ import { withFileLock } from "../plugin-sdk/file-lock.js";
6
+ import { serializeWalletState, writeWalletStateFileAtomically } from "../wallet/wallet-atomic-state.js";
4
7
  import { runCommandWithRuntime } from "./cli-utils.js";
5
8
  import { formatHelpExamples } from "./help-format.js";
6
9
  import { addGatewayClientOptions, callGatewayFromCli } from "./gateway-rpc.js";
7
10
  import { tmpdir } from "node:os";
8
11
  import { dirname, join } from "node:path";
9
12
  import { appendFile, mkdir, open, readFile, rm, stat } from "node:fs/promises";
13
+ import { createHash, randomUUID } from "node:crypto";
10
14
  import { setTimeout } from "node:timers/promises";
11
15
 
12
16
  //#region src/cli/sat-cli.ts
@@ -14,6 +18,18 @@ const LAMPORTS_PER_SOL = 1000000000n;
14
18
  const DEFAULT_MAINTAIN_INTERVAL_SECONDS = 300;
15
19
  const DEFAULT_MAINTAIN_JITTER_SECONDS = 30;
16
20
  const DEFAULT_STALE_LOCK_SECONDS = 900;
21
+ const SAT_MAINTENANCE_IDEMPOTENCY_VERSION = 1;
22
+ const SAT_MAINTENANCE_IDEMPOTENCY_LIMIT = 64;
23
+ const SAT_MAINTENANCE_IDEMPOTENCY_LOCK_OPTIONS = {
24
+ retries: {
25
+ retries: 120,
26
+ factor: 1.15,
27
+ minTimeout: 10,
28
+ maxTimeout: 100,
29
+ randomize: true
30
+ },
31
+ stale: 12e4
32
+ };
17
33
  function runSatCommand(action, label) {
18
34
  return runCommandWithRuntime(defaultRuntime, action, (err) => {
19
35
  const message = err instanceof Error ? err.message : String(err);
@@ -113,6 +129,107 @@ function parseOptionalPositiveInteger(raw, label) {
113
129
  }
114
130
  return value;
115
131
  }
132
+ function normalizeMaintenanceIdempotencyKey(raw) {
133
+ const value = raw.trim();
134
+ if (!value || value.length > 160 || /[^\x20-\x7e]/u.test(value)) {
135
+ throw new Error("--idempotency-key must contain 1-160 printable characters");
136
+ }
137
+ return value;
138
+ }
139
+ function maintenanceParamsDigest(params) {
140
+ const canonical = Object.fromEntries(Object.entries(params).toSorted(([left], [right]) => left.localeCompare(right)));
141
+ return createHash("sha256").update(JSON.stringify(canonical)).digest("hex");
142
+ }
143
+ function maintenanceIdempotencyPath() {
144
+ return join(resolveStateDir(process.env), "sat-mining", "maintenance-cli-idempotency.json");
145
+ }
146
+ async function readMaintenanceIdempotencyFile(filePath) {
147
+ try {
148
+ const parsed = JSON.parse(await readFile(filePath, "utf8"));
149
+ if (parsed.version !== SAT_MAINTENANCE_IDEMPOTENCY_VERSION || !parsed.pending || typeof parsed.pending !== "object" || Array.isArray(parsed.pending)) {
150
+ throw new Error(`invalid SAT maintenance idempotency state at ${filePath}`);
151
+ }
152
+ const pending = {};
153
+ for (const [digest, value] of Object.entries(parsed.pending)) {
154
+ if (!/^[0-9a-f]{64}$/u.test(digest) || !value || typeof value.idempotencyKey !== "string" || value.paramsDigest !== digest || typeof value.createdAt !== "string") {
155
+ throw new Error(`invalid SAT maintenance idempotency record ${digest}`);
156
+ }
157
+ pending[digest] = {
158
+ idempotencyKey: normalizeMaintenanceIdempotencyKey(value.idempotencyKey),
159
+ paramsDigest: digest,
160
+ createdAt: value.createdAt
161
+ };
162
+ }
163
+ return {
164
+ version: SAT_MAINTENANCE_IDEMPOTENCY_VERSION,
165
+ pending
166
+ };
167
+ } catch (error) {
168
+ if (error.code === "ENOENT") {
169
+ return {
170
+ version: SAT_MAINTENANCE_IDEMPOTENCY_VERSION,
171
+ pending: {}
172
+ };
173
+ }
174
+ throw error;
175
+ }
176
+ }
177
+ function trimMaintenanceIdempotencyEntries(pending) {
178
+ return Object.fromEntries(Object.entries(pending).toSorted(([, left], [, right]) => left.createdAt.localeCompare(right.createdAt)).slice(-SAT_MAINTENANCE_IDEMPOTENCY_LIMIT));
179
+ }
180
+ async function claimMaintenanceIdempotency(params, explicitKey) {
181
+ const paramsDigest = maintenanceParamsDigest(params);
182
+ if (explicitKey?.trim()) {
183
+ return {
184
+ idempotencyKey: normalizeMaintenanceIdempotencyKey(explicitKey),
185
+ paramsDigest,
186
+ managed: false
187
+ };
188
+ }
189
+ const filePath = maintenanceIdempotencyPath();
190
+ return await withFileLock(filePath, SAT_MAINTENANCE_IDEMPOTENCY_LOCK_OPTIONS, async () => {
191
+ const state = await readMaintenanceIdempotencyFile(filePath);
192
+ const existing = state.pending[paramsDigest];
193
+ if (existing) {
194
+ return {
195
+ ...existing,
196
+ managed: true
197
+ };
198
+ }
199
+ const pending = {
200
+ idempotencyKey: `sat-maintain-${randomUUID()}`,
201
+ paramsDigest,
202
+ createdAt: new Date().toISOString()
203
+ };
204
+ state.pending[paramsDigest] = pending;
205
+ await mkdir(dirname(filePath), {
206
+ recursive: true,
207
+ mode: 448
208
+ });
209
+ writeWalletStateFileAtomically(filePath, serializeWalletState({
210
+ version: SAT_MAINTENANCE_IDEMPOTENCY_VERSION,
211
+ pending: trimMaintenanceIdempotencyEntries(state.pending)
212
+ }));
213
+ return {
214
+ ...pending,
215
+ managed: true
216
+ };
217
+ });
218
+ }
219
+ async function completeMaintenanceIdempotency(claim) {
220
+ if (!claim.managed) {
221
+ return;
222
+ }
223
+ const filePath = maintenanceIdempotencyPath();
224
+ await withFileLock(filePath, SAT_MAINTENANCE_IDEMPOTENCY_LOCK_OPTIONS, async () => {
225
+ const state = await readMaintenanceIdempotencyFile(filePath);
226
+ if (state.pending[claim.paramsDigest]?.idempotencyKey !== claim.idempotencyKey) {
227
+ return;
228
+ }
229
+ delete state.pending[claim.paramsDigest];
230
+ writeWalletStateFileAtomically(filePath, serializeWalletState(state));
231
+ });
232
+ }
116
233
  function renderSatResult(result, opts, successText) {
117
234
  if (opts.json || successText === undefined) {
118
235
  defaultRuntime.log(JSON.stringify(result, null, 2));
@@ -260,7 +377,14 @@ async function withMaintenanceLock(opts, action) {
260
377
  }
261
378
  }
262
379
  async function callMaintenancePass(opts) {
263
- return callGatewayFromCli("sat.runProtocolMaintenanceOnce", opts, buildMaintenanceParams(opts));
380
+ const params = buildMaintenanceParams(opts);
381
+ const claim = await claimMaintenanceIdempotency(params, opts.idempotencyKey);
382
+ const result = await callGatewayFromCli("sat.runProtocolMaintenanceOnce", opts, {
383
+ ...params,
384
+ idempotencyKey: claim.idempotencyKey
385
+ });
386
+ await completeMaintenanceIdempotency(claim);
387
+ return result;
264
388
  }
265
389
  function summarizeMaintenanceResult(result) {
266
390
  if (!result || typeof result !== "object") {
@@ -291,6 +415,9 @@ function maintenanceDelayMs(intervalSeconds, jitterSeconds) {
291
415
  return baseMs + Math.floor(Math.random() * (jitterSeconds * 1e3 + 1));
292
416
  }
293
417
  async function runMaintenanceLoop(opts) {
418
+ if (opts.idempotencyKey?.trim()) {
419
+ throw new Error("--idempotency-key is for one maintenance pass; loop mode manages a durable key per pass");
420
+ }
294
421
  const intervalSeconds = parseNonNegativeIntegerNumber(opts.intervalSeconds, "--interval-seconds", DEFAULT_MAINTAIN_INTERVAL_SECONDS);
295
422
  const jitterSeconds = parseNonNegativeIntegerNumber(opts.jitterSeconds, "--jitter-seconds", DEFAULT_MAINTAIN_JITTER_SECONDS);
296
423
  const maxIterations = parseOptionalPositiveInteger(opts.maxIterations, "--max-iterations");
@@ -351,7 +478,7 @@ function registerSatCli(program) {
351
478
  renderSatMainnetSyncResult(result, opts);
352
479
  }, "SAT mainnet sync failed");
353
480
  });
354
- addGatewayClientOptions(sat.command("maintain").description("Run one safe SAT protocol maintenance pass: reserve refill, fixed-recipient protocol claims, and bounded cleanup").option("--target-reserve-sol <amount>", "Reserve target in SOL").option("--target-reserve-lamports <amount>", "Reserve target in lamports").option("--min-sol <amount>", "Minimum pending SOL lane to submit").option("--min-sol-lamports <amount>", "Minimum pending SOL lane in lamports").option("--min-sat-raw <amount>", "Minimum pending SAT raw units to submit").option("--loop", "Run continuously with interval, jitter, and a local lock", false).option("--interval-seconds <seconds>", "Loop interval before jitter", `${DEFAULT_MAINTAIN_INTERVAL_SECONDS}`).option("--jitter-seconds <seconds>", "Random extra loop delay", `${DEFAULT_MAINTAIN_JITTER_SECONDS}`).option("--max-iterations <count>", "Stop after N loop passes; useful for tests and smoke runs").option("--cleanup-max-cycles <count>", "Maximum settled cycles to cleanup per maintenance pass").option("--cleanup-budget-ms <ms>", "Cleanup time budget per maintenance pass; remaining cleanup is deferred").option("--cleanup-max-transactions <count>", "Maximum cleanup transactions to submit per maintenance pass").option("--cleanup-batch-mode <mode>", "Cleanup batching mode: off or auto").option("--cleanup-max-batch-instructions <count>", "Maximum cleanup close instructions per batch transaction").option("--cleanup-scan-mode <mode>", "Cleanup discovery mode: recent, scan, or auto").option("--status-mode <mode>", "Response status mode: compact, ui, debug, or none").option("--log-file <path>", "Append JSONL audit records").option("--lock-file <path>", "Local lock file for the loop").option("--stale-lock-seconds <seconds>", "Remove a stale loop lock after this age", `${DEFAULT_STALE_LOCK_SECONDS}`).option("--json", "Output JSON", false)).action(async (opts) => {
481
+ addGatewayClientOptions(sat.command("maintain").description("Run one safe SAT protocol maintenance pass: reserve refill, fixed-recipient protocol claims, and bounded cleanup").option("--target-reserve-sol <amount>", "Reserve target in SOL").option("--target-reserve-lamports <amount>", "Reserve target in lamports").option("--min-sol <amount>", "Minimum pending SOL lane to submit").option("--min-sol-lamports <amount>", "Minimum pending SOL lane in lamports").option("--min-sat-raw <amount>", "Minimum pending SAT raw units to submit").option("--loop", "Run continuously with interval, jitter, and a local lock", false).option("--interval-seconds <seconds>", "Loop interval before jitter", `${DEFAULT_MAINTAIN_INTERVAL_SECONDS}`).option("--jitter-seconds <seconds>", "Random extra loop delay", `${DEFAULT_MAINTAIN_JITTER_SECONDS}`).option("--max-iterations <count>", "Stop after N loop passes; useful for tests and smoke runs").option("--cleanup-max-cycles <count>", "Maximum settled cycles to cleanup per maintenance pass").option("--cleanup-budget-ms <ms>", "Cleanup time budget per maintenance pass; remaining cleanup is deferred").option("--cleanup-max-transactions <count>", "Maximum cleanup transactions to submit per maintenance pass").option("--cleanup-batch-mode <mode>", "Cleanup batching mode: off or auto").option("--cleanup-max-batch-instructions <count>", "Maximum cleanup close instructions per batch transaction").option("--cleanup-scan-mode <mode>", "Cleanup discovery mode: recent, scan, or auto").option("--status-mode <mode>", "Response status mode: compact, ui, debug, or none").option("--idempotency-key <key>", "Retry key for one pass; reuse the same key after an ambiguous result").option("--log-file <path>", "Append JSONL audit records").option("--lock-file <path>", "Local lock file for the loop").option("--stale-lock-seconds <seconds>", "Remove a stale loop lock after this age", `${DEFAULT_STALE_LOCK_SECONDS}`).option("--json", "Output JSON", false)).action(async (opts) => {
355
482
  await runSatCommand(async () => {
356
483
  if (opts.loop) {
357
484
  await runMaintenanceLoop(opts);
@@ -7,12 +7,12 @@ import { isSecretsApplyPlan } from "../secrets/plan.js";
7
7
  import { runSecretsApply } from "../secrets/apply.js";
8
8
  import { resolveSecretsAuditExitCode, runSecretsAudit } from "../secrets/audit.js";
9
9
  import { runSecretsConfigureInteractive } from "../secrets/configure.js";
10
- import fs from "node:fs";
10
+ import syncFs from "node:fs";
11
11
  import { confirm } from "@clack/prompts";
12
12
 
13
13
  //#region src/cli/secrets-cli.ts
14
14
  function readPlanFile(pathname) {
15
- const raw = fs.readFileSync(pathname, "utf8");
15
+ const raw = syncFs.readFileSync(pathname, "utf8");
16
16
  const parsed = JSON.parse(raw);
17
17
  if (!isSecretsApplyPlan(parsed)) {
18
18
  throw new Error(`Invalid secrets plan file: ${pathname}`);
@@ -71,7 +71,7 @@ function registerSecretsCli(program) {
71
71
  skipProviderSetup: Boolean(opts.skipProviderSetup)
72
72
  });
73
73
  if (opts.planOut) {
74
- fs.writeFileSync(opts.planOut, `${JSON.stringify(configured.plan, null, 2)}\n`, "utf8");
74
+ syncFs.writeFileSync(opts.planOut, `${JSON.stringify(configured.plan, null, 2)}\n`, "utf8");
75
75
  }
76
76
  if (opts.json) {
77
77
  defaultRuntime.log(JSON.stringify({