@fased/fased 0.1.62 → 0.1.65

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 (342) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +44 -29
  3. package/config/dependency-ownership.json +1 -1
  4. package/config/signer-policies/README.md +58 -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 +78 -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-MaQnPa5G.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-D4YMr1fA.js} +3 -3
  80. package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
  81. package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-qMYs4aD-.js} +70 -50
  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 +291 -84
  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 +1274 -390
  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-I4IngVlJ.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-DLQ6_lLK.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-D_8FVI1C.js} +6798 -3695
  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-B4KF4Kpo.js} +31 -31
  166. package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-Bb6x1KAG.js} +32 -32
  167. package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DCTO8JkL.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-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
  172. package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-DHPDFZbC.d.ts} +2 -2
  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 +565 -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-BHmvqgjH.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-By5AcorL.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-DGnBz1YT.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-EJGTmL1Q.d.ts +486 -0
  208. package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-BdwdFCD6.d.ts} +2 -3
  209. package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-BrCpYMxn.d.ts} +2 -2
  210. package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -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-DUJwrTYs.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 +578 -117
  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 +92 -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 +93 -37
  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 +18 -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 +18 -0
  284. package/extensions/msteams/package.json +1 -1
  285. package/extensions/nextcloud-talk/package.json +1 -1
  286. package/extensions/nostr/CHANGELOG.md +18 -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 +587 -154
  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 +91 -5
  293. package/extensions/sat-mining/src/claim-service.ts +85 -14
  294. package/extensions/sat-mining/src/client.ts +13 -0
  295. package/extensions/sat-mining/src/config.ts +9 -0
  296. package/extensions/sat-mining/src/cycle-progress.ts +16 -8
  297. package/extensions/sat-mining/src/epoch-service.ts +9 -5
  298. package/extensions/sat-mining/src/gateway-runner.ts +21 -1
  299. package/extensions/sat-mining/src/protocol-contract.ts +45 -1
  300. package/extensions/sat-mining/src/recovery-service.ts +312 -0
  301. package/extensions/sat-mining/src/round-watcher.ts +391 -81
  302. package/extensions/sat-mining/src/rpc-read.ts +431 -106
  303. package/extensions/sat-mining/src/runtime.ts +16 -0
  304. package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
  305. package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
  306. package/extensions/sat-mining/src/solana-submit.ts +1544 -436
  307. package/extensions/sat-mining/src/submission-ledger.ts +434 -0
  308. package/extensions/signal/package.json +1 -1
  309. package/extensions/synology-chat/package.json +1 -1
  310. package/extensions/tlon/package.json +1 -1
  311. package/extensions/twitch/CHANGELOG.md +18 -0
  312. package/extensions/twitch/package.json +1 -1
  313. package/extensions/voice-call/CHANGELOG.md +18 -0
  314. package/extensions/voice-call/package.json +1 -1
  315. package/extensions/zalo/CHANGELOG.md +18 -0
  316. package/extensions/zalo/package.json +1 -1
  317. package/extensions/zalouser/CHANGELOG.md +18 -0
  318. package/extensions/zalouser/package.json +1 -1
  319. package/install.sh +4951 -0
  320. package/package.json +23 -5
  321. package/scripts/fased-host-updater.mjs +1421 -0
  322. package/scripts/fased-host-updaterctl.mjs +186 -0
  323. package/scripts/fased-managed-service.sh +36 -0
  324. package/scripts/fased-managed-updater.mjs +3065 -156
  325. package/scripts/fased-signer-enroll-hosting.sh +275 -0
  326. package/scripts/fased-signer-network-hosting.sh +143 -0
  327. package/scripts/fased-signer-owner-policy.mjs +1442 -0
  328. package/scripts/fased-signer-policy-hosting.sh +50 -0
  329. package/scripts/fased-signer-policy-local.sh +26 -0
  330. package/scripts/hosted-release-manifest.mjs +185 -0
  331. package/scripts/install-fased-signerd.sh +183 -108
  332. package/scripts/install-managed-runtime.mjs +212 -10
  333. package/scripts/managed-runtime-layout.mjs +75 -3
  334. package/scripts/migrate-hosted-signer-v2.mjs +58 -0
  335. package/scripts/start-managed.sh +173 -360
  336. package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
  337. package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
  338. package/dist/wallet/local-socket-signer-broker.js +0 -224
  339. package/dist/wallet/local-socket-signer-custody.js +0 -42
  340. package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
  341. package/dist/wallet/providers/privy-adapter.js +0 -80
  342. package/dist/wallet/wallet-custody.js +0 -1836
@@ -1,4 +1,4 @@
1
- import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-ledger-source-route-C-yTp0QU.js";import{a as i,c as a,t as o}from"./wallet-policy-C3ZS66Rl.js";var s=8,c=9n,l=11n;function u(e){let t=e.status?.approvalAuth?.mode??`none`,n=e.status?.approvalAuth?.ready??!1,r=e.status?.approvalAuth?.passkeyCount??0;return t===`webauthn`?!n||r<=0?{summary:`Not ready`,detail:`Enroll one passkey in this browser before wallet sends, policy changes, wallet security setup, unlock, recovery, or device changes.`,enableVisible:!1,enableLabel:`Passkey approval enabled`,enableDisabled:!0,enrollVisible:!0,enrollLabel:e.passkeyBusy?`Enrolling...`:`Enroll passkey`,enrollDisabled:e.settingsBusy||e.passkeyBusy}:{summary:`Ready`,detail:`Wallet Control Passkey is ready for sends, policy changes, wallet security setup, unlock, recovery, and device changes.`,enableVisible:!1,enableLabel:`Passkey approval ready`,enableDisabled:!0,enrollVisible:!1,enrollLabel:e.passkeyBusy?`Adding passkey...`:`Add passkey`,enrollDisabled:e.settingsBusy||e.passkeyBusy}:{summary:`Not ready`,detail:`Enable Wallet Control Passkey before approving sends, policy changes, wallet security setup, unlock, recovery, or device changes.`,enableVisible:!0,enableLabel:e.settingsBusy?`Enabling...`:`Enable passkey approval`,enableDisabled:e.settingsBusy||e.passkeyBusy,enrollVisible:!1,enrollLabel:`Enroll passkey`,enrollDisabled:!0}}function d(e){return{mode:`manual`,submitLabel:`Create Approval Request`,detail:`Direct user Send is always reviewed/manual. Confirm creates a pending wallet approval request below, and passkey approval happens on Approve when enabled.`}}function f(t){return e`
1
+ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-ledger-source-route-C-yTp0QU.js";import{a as i,c as a,t as o}from"./wallet-policy-C3ZS66Rl.js";var s=8,c=9n,l=11n;function u(e){let t=e.status?.approvalAuth?.mode??`none`,n=e.status?.approvalAuth?.ready??!1,r=e.status?.approvalAuth?.passkeyCount??0;return t===`webauthn`?!n||r<=0?{summary:`Not ready`,detail:`Enroll one passkey in this browser before wallet sends or policy changes.`,enableVisible:!1,enableLabel:`Passkey approval enabled`,enableDisabled:!0,enrollVisible:!0,enrollLabel:e.passkeyBusy?`Enrolling...`:`Enroll passkey`,enrollDisabled:e.settingsBusy||e.passkeyBusy}:{summary:`Ready`,detail:`Wallet Control Passkey is ready for sends and policy changes.`,enableVisible:!1,enableLabel:`Passkey approval ready`,enableDisabled:!0,enrollVisible:!1,enrollLabel:e.passkeyBusy?`Adding passkey...`:`Add passkey`,enrollDisabled:e.settingsBusy||e.passkeyBusy}:{summary:`Not ready`,detail:`Enable Wallet Control Passkey before approving sends or policy changes.`,enableVisible:!0,enableLabel:e.settingsBusy?`Enabling...`:`Enable passkey approval`,enableDisabled:e.settingsBusy||e.passkeyBusy,enrollVisible:!1,enrollLabel:`Enroll passkey`,enrollDisabled:!0}}function d(e){return{mode:`manual`,submitLabel:`Create Approval Request`,detail:`Direct user Send is always reviewed/manual. Confirm creates a pending wallet approval request below, and passkey approval happens on Approve when enabled.`}}function f(t){return e`
2
2
  <span class="wallet-help" role="img" tabindex="0" aria-label=${t} data-tooltip=${t}>
3
3
  <svg viewBox="0 0 24 24" aria-hidden="true">
4
4
  <circle cx="12" cy="12" r="10" />
@@ -6,7 +6,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
6
6
  <path d="M12 17h.01" />
7
7
  </svg>
8
8
  </span>
9
- `}function p(e){return e?.policy?.directSigning?{label:`Automation on`,detail:`This selected wallet can execute approved background actions when role policy, caps, and custody state allow it.`,operatorDetail:`These caps belong to the selected wallet. They are not SAT mining cycle limits, and they do not override custody or role restrictions.`}:{label:`Automation off`,detail:`This selected wallet is manual-first. Reviewed Wallet UI sends can still be approved, but background actions cannot execute.`,operatorDetail:`These caps belong to the selected wallet. They are not SAT mining cycle limits, and they do not override custody or role restrictions.`}}function m(e){return String(e.miningProfile?.walletId||e.miningStatus?.walletId||e.miningReadiness?.selectedWalletId||``).trim()||null}function h(e){return typeof e==`string`&&e.trim().length>0}function g(e){return e.id.startsWith(`solana-`)||e.name.toLowerCase().startsWith(`solana `)||e.addresses?.solana?`solana`:null}function ee(e){return!e||g(e),[`solana`]}function _(e,t){let n=String(t??``).trim();if(n)return e.find(e=>e.id===n)}function v(e){if(!e)return`No grant`;let t=Array.isArray(e.actions)?e.actions.map(e=>String(e)).filter(Boolean):[],n=Array.isArray(e.chains)?e.chains.map(e=>String(e)).filter(Boolean):[],r=Array.isArray(e.walletIds)?e.walletIds.map(e=>String(e)).filter(Boolean):[],i=[e.autonomous===!0?`autonomous`:null,e.cron===!0?`cron`:null].filter(Boolean).join(`, `);return[t.length>0?t.join(`, `):`actions unspecified`,r.length>0?`wallets ${r.join(`, `)}`:`wallet unspecified`,n.length>0?n.join(`, `):`chain unspecified`,i].filter(Boolean).join(` · `)}function y(e){return e?[e.actions?.length?e.actions.join(`, `):`actions unspecified`,e.chains?.length?e.chains.join(`, `):`chain unspecified`,[e.autonomous?`autonomous requested`:null,e.cron?`cron requested`:null].filter(Boolean).join(`, `)].filter(Boolean).join(` · `):`No marketplace wallet request recorded`}function b(e){let t=(typeof e?.metadata?.purpose==`string`?e.metadata.purpose:typeof e?.metadata?.role==`string`?e.metadata.role:``).toLowerCase();if(t===`agent`)return`agent`;if(t===`vault`)return`vault`;if(t===`mining`)return`mining`}function x(e,t){if(!e)return!1;let n=b(e);return n&&n!==`agent`?!1:e.id===String(t??``).trim()||n===`agent`}function S(e){let t=e.status?.approvalAuth?.mode??`none`,n=e.status?.approvalAuth?.ready??!1,r=String(e.defaultWalletId??``).trim()||null,i=_(e.namedWallets,r),a=e.namedWallets.filter(e=>x(e,r)),o=i&&x(i,r)?i:void 0,s=String(e.miningProfile?.walletId||e.miningStatus?.walletId||e.miningReadiness?.selectedWalletId||``).trim()||null,c=_(e.namedWallets,s),l=String(e.federationBond?.walletId??``).trim()||null,u=_(e.namedWallets,l);return{admin:e.status?t===`webauthn`&&n?{title:`Wallet Control Passkey`,summary:`Ready`,detail:`Use this passkey for send approvals, policy changes, wallet security setup, unlock, recovery, and device changes.`,tone:`success`}:t===`webauthn`?{title:`Wallet Control Passkey`,summary:`Not ready`,detail:`Enroll one passkey before wallet sends, policy changes, wallet security setup, unlock, recovery, or device changes.`,tone:`warn`}:{title:`Wallet Control Passkey`,summary:`Not ready`,detail:`Wallet control currently relies on the signed-in session. Add a passkey before enabling wallet security.`,tone:`warn`}:{title:`Wallet Control Passkey`,summary:`Wallet approval state unavailable`,detail:`Refresh the wallet surface before changing operator roles.`,tone:`neutral`},agent:o?{title:`Agent wallets`,summary:a.length>1?`${o.name} + ${a.length-1}`:o.name,detail:a.length>1?`Multiple Agent wallets can be selected by explicit @wallet:<id> handles. If no @wallet:<id> is specified, approved wallet actions use the primary Agent wallet fallback.`:`If no @wallet:<id> is specified, approved wallet actions use this default Agent wallet.`,tone:`success`,walletId:o.id}:a.length>0?{title:`Agent wallets`,summary:`${a.length} set · no primary`,detail:`Agent wallets can be selected by explicit @wallet:<id> handles. Set one default Agent wallet if approved actions should have a fallback.`,tone:`warn`,walletId:a[0]?.id}:r?{title:`Agent wallets`,summary:r,detail:`An Agent wallet is configured but not present in this wallet list right now. Refresh or repair the registry before paid Fased Network or skill wallet work.`,tone:`warn`,walletId:r}:{title:`Agent wallets`,summary:`Not set`,detail:`Mark at least one Agent wallet before paid Fased Network tasks, payment evidence, or skill wallet actions use a clear operator wallet.`,tone:`warn`},mining:c?{title:`SAT Mining`,summary:c.name,detail:`SAT mining uses the singleton @wallet:mining wallet for capital, cycle history, and restart recovery. Keep it separate from Agent wallets.`,tone:`success`,walletId:c.id}:s?{title:`SAT Mining`,summary:s,detail:`SAT runtime points at @wallet:mining, but that wallet is not visible in the current wallet list. Refresh mining and wallet state before SAT mining.`,tone:`warn`,walletId:s}:{title:`SAT Mining`,summary:`Not configured`,detail:`Create or import @wallet:mining in onboarding or CLI if you want SAT participation. Mining is optional and should not be assumed by Fased Network join.`,tone:`neutral`},bond:u?{title:`Fased Network Bond`,summary:u.name,detail:e.federationBond?.status===`active`?`This wallet currently holds the active SAT bond for Fased Network. Tier ${e.federationBond?.tier??`none`} · quota ${e.federationBond?.quotaBand??`standard`}.`:`This wallet is configured for Fased Network bond. Use the Fased Network page to open, increase, unlock, or re-prove the SAT bond.`,tone:e.federationBond?.status===`active`?`success`:e.federationBond?.status===`unlocking`?`warn`:`neutral`,walletId:u.id}:l?{title:`Fased Network Bond`,summary:l,detail:`A Fased Network bond Vault is configured but not visible in the current wallet list. Refresh wallet state or repair the local wallet registry before changing bond posture.`,tone:`warn`,walletId:l}:{title:`Fased Network Bond`,summary:`Not set`,detail:`Select a Vault wallet on Fased Network before longer-lived bond capital if you want bonded network access.`,tone:`neutral`},sharedWalletWarning:c&&a.some(e=>e.id===c.id)?`Agent and Mining wallets must stay separate. This singleton mining wallet is also marked Agent; use a dedicated Agent wallet and clear the Agent default before wallet work.`:null,miningWalletId:s,bondWalletId:l}}function te(e,t){return[]}function ne(r,i,a){if(r!==String(i?.walletId??``).trim())return t;let o=i?.status??`none`,s=o===`active`?`bond-active`:o===`unlocking`?`bond-unlocking`:`bond`,c=o===`active`?`Fased Network bond active`:o===`unlocking`?`Fased Network bond unlocking`:`Fased Network bond wallet`;return e`
9
+ `}function p(e){return e?.policy?.directSigning?{label:`Automation on`,detail:`This selected wallet can execute approved typed background actions when signer policy and caps allow it.`,operatorDetail:`These caps belong to the selected wallet. They are not SAT mining cycle limits, and they do not override signer or role restrictions.`}:{label:`Automation off`,detail:`This selected wallet is manual-first. Reviewed Wallet UI sends can still be approved, but background actions cannot execute.`,operatorDetail:`These caps belong to the selected wallet. They are not SAT mining cycle limits, and they do not override signer or role restrictions.`}}function m(e){return String(e.miningProfile?.walletId||e.miningStatus?.walletId||e.miningReadiness?.selectedWalletId||``).trim()||null}function h(e){return typeof e==`string`&&e.trim().length>0}function g(e){return e.id.startsWith(`solana-`)||e.name.toLowerCase().startsWith(`solana `)||e.addresses?.solana?`solana`:null}function ee(e){return!e||g(e),[`solana`]}function _(e,t){let n=String(t??``).trim();if(n)return e.find(e=>e.id===n)}function v(e){if(!e)return`No grant`;let t=Array.isArray(e.actions)?e.actions.map(e=>String(e)).filter(Boolean):[],n=Array.isArray(e.chains)?e.chains.map(e=>String(e)).filter(Boolean):[],r=Array.isArray(e.walletIds)?e.walletIds.map(e=>String(e)).filter(Boolean):[],i=[e.autonomous===!0?`autonomous`:null,e.cron===!0?`cron`:null].filter(Boolean).join(`, `);return[t.length>0?t.join(`, `):`actions unspecified`,r.length>0?`wallets ${r.join(`, `)}`:`wallet unspecified`,n.length>0?n.join(`, `):`chain unspecified`,i].filter(Boolean).join(` · `)}function y(e){return e?[e.actions?.length?e.actions.join(`, `):`actions unspecified`,e.chains?.length?e.chains.join(`, `):`chain unspecified`,[e.autonomous?`autonomous requested`:null,e.cron?`cron requested`:null].filter(Boolean).join(`, `)].filter(Boolean).join(` · `):`No marketplace wallet request recorded`}function b(e){let t=(typeof e?.metadata?.purpose==`string`?e.metadata.purpose:typeof e?.metadata?.role==`string`?e.metadata.role:``).toLowerCase();if(t===`agent`)return`agent`;if(t===`vault`)return`vault`;if(t===`mining`)return`mining`}function x(e,t){if(!e)return!1;let n=b(e);return n&&n!==`agent`?!1:e.id===String(t??``).trim()||n===`agent`}function S(e){let t=e.status?.approvalAuth?.mode??`none`,n=e.status?.approvalAuth?.ready??!1,r=String(e.defaultWalletId??``).trim()||null,i=_(e.namedWallets,r),a=e.namedWallets.filter(e=>x(e,r)),o=i&&x(i,r)?i:void 0,s=String(e.miningProfile?.walletId||e.miningStatus?.walletId||e.miningReadiness?.selectedWalletId||``).trim()||null,c=_(e.namedWallets,s),l=String(e.federationBond?.walletId??``).trim()||null,u=_(e.namedWallets,l);return{admin:e.status?t===`webauthn`&&n?{title:`Wallet Control Passkey`,summary:`Ready`,detail:`Use this passkey for reviewed sends and policy changes.`,tone:`success`}:t===`webauthn`?{title:`Wallet Control Passkey`,summary:`Not ready`,detail:`Enroll one passkey before reviewed wallet sends or policy changes.`,tone:`warn`}:{title:`Wallet Control Passkey`,summary:`Not ready`,detail:`Wallet control currently relies on the signed-in session. Add a passkey before approving reviewed sends.`,tone:`warn`}:{title:`Wallet Control Passkey`,summary:`Wallet approval state unavailable`,detail:`Refresh the wallet surface before changing operator roles.`,tone:`neutral`},agent:o?{title:`Agent wallets`,summary:a.length>1?`${o.name} + ${a.length-1}`:o.name,detail:a.length>1?`Multiple Agent wallets can be selected by explicit @wallet:<id> handles. If no @wallet:<id> is specified, approved wallet actions use the primary Agent wallet fallback.`:`If no @wallet:<id> is specified, approved wallet actions use this default Agent wallet.`,tone:`success`,walletId:o.id}:a.length>0?{title:`Agent wallets`,summary:`${a.length} set · no primary`,detail:`Agent wallets can be selected by explicit @wallet:<id> handles. Set one default Agent wallet if approved actions should have a fallback.`,tone:`warn`,walletId:a[0]?.id}:r?{title:`Agent wallets`,summary:r,detail:`An Agent wallet is configured but not present in this wallet list right now. Refresh or repair the registry before paid Fased Network or skill wallet work.`,tone:`warn`,walletId:r}:{title:`Agent wallets`,summary:`Not set`,detail:`Mark at least one Agent wallet before paid Fased Network tasks, payment evidence, or skill wallet actions use a clear operator wallet.`,tone:`warn`},mining:c?{title:`SAT Mining`,summary:c.name,detail:`SAT mining uses the singleton @wallet:mining wallet for capital, cycle history, and restart recovery. Keep it separate from Agent wallets.`,tone:`success`,walletId:c.id}:s?{title:`SAT Mining`,summary:s,detail:`SAT runtime points at @wallet:mining, but that wallet is not visible in the current wallet list. Refresh mining and wallet state before SAT mining.`,tone:`warn`,walletId:s}:{title:`SAT Mining`,summary:`Not configured`,detail:`Create or import @wallet:mining in onboarding or CLI if you want SAT participation. Mining is optional and should not be assumed by Fased Network join.`,tone:`neutral`},bond:u?{title:`Fased Network Bond`,summary:u.name,detail:e.federationBond?.status===`active`?`This wallet currently holds the active SAT bond for Fased Network. Tier ${e.federationBond?.tier??`none`} · quota ${e.federationBond?.quotaBand??`standard`}.`:`This wallet is configured for Fased Network bond. Use the Fased Network page to open, increase, unlock, or re-prove the SAT bond.`,tone:e.federationBond?.status===`active`?`success`:e.federationBond?.status===`unlocking`?`warn`:`neutral`,walletId:u.id}:l?{title:`Fased Network Bond`,summary:l,detail:`A Fased Network bond Vault is configured but not visible in the current wallet list. Refresh wallet state or repair the local wallet registry before changing bond posture.`,tone:`warn`,walletId:l}:{title:`Fased Network Bond`,summary:`Not set`,detail:`Select a Vault wallet on Fased Network before longer-lived bond capital if you want bonded network access.`,tone:`neutral`},sharedWalletWarning:c&&a.some(e=>e.id===c.id)?`Agent and Mining wallets must stay separate. This singleton mining wallet is also marked Agent; use a dedicated Agent wallet and clear the Agent default before wallet work.`:null,miningWalletId:s,bondWalletId:l}}function C(e,t){return[]}function te(r,i,a){if(r!==String(i?.walletId??``).trim())return t;let o=i?.status??`none`,s=o===`active`?`bond-active`:o===`unlocking`?`bond-unlocking`:`bond`,c=o===`active`?`Fased Network bond active`:o===`unlocking`?`Fased Network bond unlocking`:`Fased Network bond wallet`;return e`
10
10
  <button
11
11
  type="button"
12
12
  class="wallet-status-icon wallet-status-icon--button"
@@ -17,16 +17,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
17
17
  >
18
18
  ${n.shield}
19
19
  </button>
20
- `}function re(e,t){let n=t.custodyByWalletId?.[e];if(n)return n;let r=t.status?.custody;return r?.target?.walletId===e?r:null}function ie(r){let{custody:i,role:a}=r,o=!!i?.unlock?.active,s=!!(i&&i.mode!==`single-key`);if(a===`mining`)return t;if(a===`vault`){let r=s?e`
21
- <span
22
- class="wallet-status-icon"
23
- data-state=${o?`vault-split-unlocked`:`vault-split-locked`}
24
- title=${o?`Split-key window is open${i?.unlock?.expiresAt?` until ${N(i.unlock.expiresAt)}`:``}.`:`Split-key security is active and locked.`}
25
- aria-label=${o?`Vault split-key unlocked`:`Vault split-key locked`}
26
- >
27
- ${o?n.unlock:n.lock}
28
- </span>
29
- `:t;return e`
20
+ `}function ne(r){let{role:i}=r;if(i===`mining`)return t;if(i===`vault`)return e`
30
21
  <span
31
22
  class="wallet-status-icon"
32
23
  data-state="vault-manual"
@@ -35,22 +26,21 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
35
26
  >
36
27
  ${n.hand}
37
28
  </span>
38
- ${r}
39
- `}if(r.automationEnabled===void 0)return t;let c=r.automationEnabled;return e`
29
+ `;if(r.automationEnabled===void 0)return t;let a=r.automationEnabled;return e`
40
30
  <span
41
31
  class="wallet-status-icon"
42
- data-state=${c?`agent-auto-on`:`agent-auto-off`}
43
- title=${c?`Agent auto policy is on. Background sends can run within approval policy, caps, allowlists, and skill grants.`:`Agent auto policy is off. Sends require manual approval.`}
44
- aria-label=${c?`Agent auto on`:`Agent auto off`}
32
+ data-state=${a?`agent-auto-on`:`agent-auto-off`}
33
+ title=${a?`Agent auto policy is on. Background sends can run within approval policy, caps, allowlists, and skill grants.`:`Agent auto policy is off. Sends require manual approval.`}
34
+ aria-label=${a?`Agent auto on`:`Agent auto off`}
45
35
  >
46
- ${c?n.zap:n.hand}
36
+ ${a?n.zap:n.hand}
47
37
  </span>
48
- `}function C(t,n){let r=t.toLowerCase()===`ready`;return e`
38
+ `}function w(t,n){let r=t.toLowerCase()===`ready`;return e`
49
39
  <span class="wallet-lock-chip" data-state=${r?`unlocked`:`locked`} title=${n}>
50
40
  <span class="wallet-lock-chip__dot"></span>
51
41
  ${r?`Ready`:`Not ready`}
52
42
  </span>
53
- `}function ae(r){return r?.automation?.satSweep?.enabled?e`
43
+ `}function re(r){return r?.automation?.satSweep?.enabled?e`
54
44
  <span
55
45
  class="wallet-status-icon"
56
46
  data-role="sweep-on"
@@ -58,18 +48,34 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
58
48
  >
59
49
  ${n.arrowDown}
60
50
  </span>
61
- `:t}function oe(r){return r.walletId===r.props.walletDetailsWalletId?(r.role===`agent`?[r.props.policyCapsEnabled?{dataRole:`policy-on`,title:`Caps active`,icon:n.shield}:null,r.props.recurringTransferEnabled?{dataRole:`policy-on`,title:`Recurring send active`,icon:n.send}:null,r.props.policySkillsEnabled?{dataRole:`policy-on`,title:`Skill wallet access gate is active. Individual skills still need explicit Wallet > Skill Grants.`,icon:n.spark}:null]:r.role===`vault`?[r.props.policyCapsEnabled?{dataRole:`policy-on`,title:`Vault caps active`,icon:n.shield}:null,r.custody&&r.custody.mode!==`single-key`?{dataRole:`policy-on`,title:`Vault security active`,icon:n.lock}:null]:[]).filter(e=>e!==null).map(t=>e`
51
+ `:t}function ie(r){return r.walletId===r.props.walletDetailsWalletId?(r.role===`agent`?[r.props.policyCapsEnabled?{dataRole:`policy-on`,title:`Caps active`,icon:n.shield}:null,r.props.recurringTransferEnabled?{dataRole:`policy-on`,title:`Recurring send active`,icon:n.send}:null,r.props.policySkillsEnabled?{dataRole:`policy-on`,title:`Skill wallet access gate is active. Individual skills still need explicit Wallet > Skill Grants.`,icon:n.spark}:null]:r.role===`vault`?[r.props.policyCapsEnabled?{dataRole:`policy-on`,title:`Vault caps active`,icon:n.shield}:null]:[]).filter(e=>e!==null).map(t=>e`
62
52
  <span class="wallet-status-icon" data-role=${t.dataRole} title=${t.title}>
63
53
  ${t.icon}
64
54
  </span>
65
- `):t}function w(e){let t=new Map,n=e=>{!e||e.mode===`single-key`||t.set(e.target.walletId,e)};n(e.status?.custody);for(let t of Object.values(e.custodyByWalletId??{}))n(t);return[...t.values()]}function T(e){return e?.storageMode===`encrypted-browser-storage`||e?.storageMode===`encrypted-browser-storage-untested`}function E(e,t){return e?T(e)?e.storageMode===`encrypted-browser-storage`?{label:t?`Encrypted browser storage`:`Encrypted browser storage ready`,detail:t?`This browser is holding the selected wallet's device share off-host in encrypted browser storage.`:`This browser supports passkey-gated encrypted storage for the selected wallet's device share.`}:{label:t?`Browser storage active`:`Browser storage ready after first unlock`,detail:t?`This browser already has the encrypted device share for the selected wallet.`:`This browser can try passkey-protected storage during the first unlock. If it cannot protect the share, the UI will keep recovery/manual mode instead.`}:{label:t?`Encrypted browser storage`:`Manual device share only`,detail:t?`An encrypted browser-held share already exists here, but this browser cannot create new protected browser storage without PRF support.`:`This client cannot protect a browser-held device share, so keep the device share manual or use another client.`}:{label:t?`Encrypted browser storage`:`Manual device share only`,detail:t?`This browser already has an encrypted device share for the selected wallet.`:`No compatible storage mode has been confirmed on this client yet.`}}function D(e){let t=T(e.support),n=!!String(e.recoveryShare??``).trim(),r=e.role===`agent`?`Agent`:`vault`,i=[];return e.custody.mode===`single-key`?(i.push({label:`1. Enable split-key`,state:`Next`,detail:`Turn on split-key for this ${r} wallet now before you rely on browser-held recovery and device-share handling.`}),i.push({label:`2. Download recovery kit`,state:`Blocked`,detail:`After split-key initializes, export the recovery kit once and store it offline.`})):(i.push({label:`1. Split-key`,state:`Ready`,detail:`Split-key is active for this ${r} wallet.`}),i.push(n?{label:`2. Download recovery kit`,state:`Ready now`,detail:`A new recovery share is shown below. Download or print it before leaving this screen.`}:{label:`2. Recovery kit`,state:`Keep offline`,detail:`This wallet already has a recovery kit. Keep it offline and export a new one only after recovery or rotation.`})),t?i.push(e.deviceShareStored?{label:`3. Store on this browser`,state:`Stored`,detail:`Encrypted browser storage is active for this wallet on the current client.`}:{label:`3. Store on this browser`,state:e.custody.mode===`single-key`?`Next`:`Ready after unlock`,detail:`This happens automatically after split-key setup or the first unlock when this browser supports passkey-protected storage.`}):i.push({label:`3. Store on this client`,state:`Manual`,detail:e.support?.storageMode===`manual-share-only`?`This browser cannot protect a stored device share. Keep the device share manual on this client and rely on the offline recovery kit.`:`Browser-held encrypted storage is not ready here. Keep the device share manual on this client and rely on the offline recovery kit.`}),i}function O(e,t){let n=e===String(t.defaultWalletId??``).trim(),r=!n&&e===m(t),i=b(_(t.namedWallets,e)),a=!!(i&&i!==`agent`);return{label:n?`Clear`:`Primary`,disabled:t.settingsBusy||r||a,title:r?`Agent and Mining wallets must stay separate. Create a dedicated Agent wallet instead.`:a?`Wallet purpose is permanent. Create a new Agent wallet instead of changing this wallet.`:n?`Clear this wallet as the primary Agent wallet. Existing Agent roles stay unchanged.`:`Make this wallet the primary Agent fallback. Other Agent wallets can still be selected by @wallet handle.`}}function k(e,t){if(e===m(t))return`mining`;let n=_(t.namedWallets,e);return b(n)===`mining`?`mining`:x(n,t.defaultWalletId)?`agent`:`vault`}function A(e){switch(e){case`mining`:return 0;case`vault`:return 1;case`agent`:return 2}}function j(e,t){let n=String(t.defaultWalletId??``).trim();return e.toSorted((e,r)=>{let i=k(e.id,t),a=k(r.id,t),o=A(i)-A(a);if(o!==0)return o;if(i===`agent`&&a===`agent`){if(e.id===n&&r.id!==n)return-1;if(r.id===n&&e.id!==n)return 1}return e.name.localeCompare(r.name)||e.id.localeCompare(r.id)})}function se(e){let t=String(e??``).trim();if(!t)return`0`;try{let e=BigInt(t),n=100000000000n,r=e/n,i=(e%n).toString().padStart(11,`0`).replace(/0+$/,``).slice(0,6);return i?`${r}.${i}`:`${r}`}catch{return`0`}}function M(e){let t=String(e??``).trim();if(!t||!/^\d+(\.\d{0,11})?$/.test(t))return`0`;let[n,r=``]=t.split(`.`);return(BigInt(n||`0`)*100000000000n+BigInt((r+`00000000000`).slice(0,11)||`0`)).toString()}function N(e){if(String(e??``).startsWith(`9999-12-31T23:59:59`))return`you lock it`;let t=Date.parse(String(e??``));return Number.isFinite(t)?new Date(t).toLocaleString():`n/a`}function P(e,t,n={}){try{let t=BigInt(e),r=10n**9n,i=t/r,a=(t%r).toString().padStart(9,`0`).replace(/0+$/,``),o=a?`${i.toString()}.${a}`:i.toString();return n.hideUnit?o:`${o} SOL`}catch{return`—`}}function F(e,t=`n/a`){return typeof e==`string`?e.trim()||t:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?String(e):t}function I(e){return F(e,`n/a`).toLowerCase()===`solana`?`SOL`:F(e,`n/a`)}function L(e){if(typeof e!=`string`&&typeof e!=`number`&&typeof e!=`bigint`)return null;let t=String(e).trim().toLowerCase();return t===`solana`||t===`sol`?`solana`:null}function R(e,t){if(typeof e!=`string`&&typeof e!=`number`&&typeof e!=`bigint`)return`n/a`;let n=String(e).trim();if(!n)return`n/a`;let r=L(t);if(!r)return n;try{return P(n,r)}catch{return n}}function z(e,t){let n=String(e??``).trim();if(!n||typeof t!=`number`||!Number.isFinite(t)||t<0)return null;try{let e=10n**BigInt(t),r=BigInt(n),i=r/e,a=(r%e).toString().padStart(t,`0`).replace(/0+$/,``);if(!a)return i.toString();let o=a.slice(0,6).replace(/0+$/,``);return o?`${i.toString()}.${o}`:i.toString()}catch{return null}}function B(e,t){return typeof e[t]==`string`?String(e[t]).trim():``}function V(e,t){let n=e[t];if(typeof n==`number`&&Number.isFinite(n))return n;if(typeof n==`string`&&n.trim()){let e=Number(n);return Number.isFinite(e)?e:null}return null}function H(e){let t=e.trim();if(!/^[0-9]+(\.[0-9]+)?$/.test(t))return t;let n=Number(t);return Number.isFinite(n)?n>0&&n<1e-6?`<0.000001`:new Intl.NumberFormat(`en-US`,{minimumFractionDigits:0,maximumFractionDigits:Math.abs(n)>=1?2:6}).format(n):t}function ce(e){let t=L(e.details.chain),n=B(e.details,`program`);if(t===`solana`&&n){let t=Array.isArray(e.balances?.assets?.solana)?e.balances.assets.solana.find(e=>!e.isNative&&e.program===n):void 0,r=B(e.details,`assetSymbol`)||t?.symbol||`SPL`,i=De({isNative:!1,program:n,symbol:r,name:B(e.details,`assetName`)||t?.name||``})?`SPL`:r,a=B(e.details,`amountDisplay`);if(a)return`${H(a)} ${i}`;let o=V(e.details,`assetDecimals`)??t?.decimals,s=z(F(e.details.amount,``),o);if(s)return`${H(s)} ${i}`;let c=F(e.details.amount,``);return c?`${c} raw ${i}`:`n/a`}return R(e.details.amount,t)}function U(e){return{name:String(e.payload.assetName??``).trim()||null,symbol:String(e.payload.assetSymbol??``).trim()||null,program:String(e.payload.program??``).trim()||null}}function le(e){if(e.request.payload.actionKind===`solana_swap`){let t=String(e.request.payload.inputSymbol??``).trim()||`SOL`,n=String(e.request.payload.outputSymbol??``).trim()||(e.request.payload.outputMint?Ee(e.request.payload.outputMint):`token`),r=typeof e.request.payload.inputDecimals==`number`&&Number.isFinite(e.request.payload.inputDecimals)?e.request.payload.inputDecimals:Number(c),i=String(e.request.payload.amountDisplay??``).trim()||z(e.request.payload.amount,r)||``;return{amountValueText:i?`${J(i)} ${t}`:R(e.request.payload.amount,e.request.payload.chain),assetPrimaryText:`${t} -> ${n}`,assetSecondaryText:e.request.payload.routeLabel?`Jupiter · ${e.request.payload.routeLabel}`:`Jupiter swap`,name:String(e.request.payload.outputName??``).trim()||null,symbol:n,program:e.request.payload.outputMint??null,usesFallbackIdentity:!1}}let t=U(e.request),n=t.program,r=n&&Array.isArray(e.balances?.assets?.solana)?e.balances.assets.solana.find(e=>e.program===n):void 0,i=t.symbol??r?.symbol??null,a=t.name??r?.name??null,o=De({isNative:!1,program:n??``,symbol:i??``,name:a??``}),s=String(e.request.payload.amountDisplay??``).trim()||z(e.request.payload.amount,r?.decimals)||``;return s?{amountValueText:J(s),assetPrimaryText:o?i:a??i??n,assetSecondaryText:!o&&i&&a&&i!==a?i:null,name:a,symbol:i,program:n,usesFallbackIdentity:o}:{amountValueText:R(e.request.payload.amount,e.request.payload.chain),assetPrimaryText:o?i:a??i??n,assetSecondaryText:!o&&i&&a&&i!==a?i:null,name:a,symbol:i,program:n,usesFallbackIdentity:o}}function ue(e){let t=String(e.request.payload.walletId??``).trim(),n=String(e.request.payload.walletName??``).trim(),r=e.request.payload.chain,i=_(e.namedWallets,t)??(n?e.namedWallets.find(e=>e.name.trim().toLowerCase()===n.toLowerCase()):void 0),a=i&&q(i,r)||null;return{fromLabel:i?.name?.trim()||n||t||null,fromAddress:a,toAddress:String(e.request.payload.to??``).trim()||null}}function de(n){let r=n.request.approvalDiff??n.request.simulation?.diff;if(!r)return t;let i=r.fromWalletName||n.endpoints.fromLabel||(r.fromWalletId?`@wallet:${r.fromWalletId}`:`wallet`),a=r.amountDisplay||n.display.amountValueText||r.amount||`amount`,o=r.token||n.display.assetPrimaryText||r.mint||r.chain,s=r.to||n.endpoints.toAddress||`destination`,c=[r.source,r.skillId?`skill ${r.skillId}`:``,r.taskId?`task ${r.taskId}`:``].filter(Boolean).join(` · `);return e`
55
+ `):t}function T(e,t){let n=e===String(t.defaultWalletId??``).trim(),r=!n&&e===m(t),i=b(_(t.namedWallets,e)),a=!!(i&&i!==`agent`);return{label:n?`Clear`:`Primary`,disabled:t.settingsBusy||r||a,title:r?`Agent and Mining wallets must stay separate. Create a dedicated Agent wallet instead.`:a?`Wallet purpose is permanent. Create a new Agent wallet instead of changing this wallet.`:n?`Clear this wallet as the primary Agent wallet. Existing Agent roles stay unchanged.`:`Make this wallet the primary Agent fallback. Other Agent wallets can still be selected by @wallet handle.`}}function E(e,t){if(e===m(t))return`mining`;let n=_(t.namedWallets,e);return b(n)===`mining`?`mining`:x(n,t.defaultWalletId)?`agent`:`vault`}function D(e){switch(e){case`mining`:return 0;case`vault`:return 1;case`agent`:return 2}}function O(e,t){let n=String(t.defaultWalletId??``).trim();return e.toSorted((e,r)=>{let i=E(e.id,t),a=E(r.id,t),o=D(i)-D(a);if(o!==0)return o;if(i===`agent`&&a===`agent`){if(e.id===n&&r.id!==n)return-1;if(r.id===n&&e.id!==n)return 1}return e.name.localeCompare(r.name)||e.id.localeCompare(r.id)})}function k(e){let t=String(e??``).trim();if(!t)return`0`;try{let e=BigInt(t),n=100000000000n,r=e/n,i=(e%n).toString().padStart(11,`0`).replace(/0+$/,``).slice(0,6);return i?`${r}.${i}`:`${r}`}catch{return`0`}}function A(e){let t=String(e??``).trim();if(!t||!/^\d+(\.\d{0,11})?$/.test(t))return`0`;let[n,r=``]=t.split(`.`);return(BigInt(n||`0`)*100000000000n+BigInt((r+`00000000000`).slice(0,11)||`0`)).toString()}function j(e,t,n={}){try{let t=BigInt(e),r=10n**9n,i=t/r,a=(t%r).toString().padStart(9,`0`).replace(/0+$/,``),o=a?`${i.toString()}.${a}`:i.toString();return n.hideUnit?o:`${o} SOL`}catch{return`—`}}function M(e,t=`n/a`){return typeof e==`string`?e.trim()||t:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?String(e):t}function N(e){return M(e,`n/a`).toLowerCase()===`solana`?`SOL`:M(e,`n/a`)}function P(e){if(typeof e!=`string`&&typeof e!=`number`&&typeof e!=`bigint`)return null;let t=String(e).trim().toLowerCase();return t===`solana`||t===`sol`?`solana`:null}function F(e,t){if(typeof e!=`string`&&typeof e!=`number`&&typeof e!=`bigint`)return`n/a`;let n=String(e).trim();if(!n)return`n/a`;let r=P(t);if(!r)return n;try{return j(n,r)}catch{return n}}function I(e,t){let n=String(e??``).trim();if(!n||typeof t!=`number`||!Number.isFinite(t)||t<0)return null;try{let e=10n**BigInt(t),r=BigInt(n),i=r/e,a=(r%e).toString().padStart(t,`0`).replace(/0+$/,``);if(!a)return i.toString();let o=a.slice(0,6).replace(/0+$/,``);return o?`${i.toString()}.${o}`:i.toString()}catch{return null}}function L(e,t){return typeof e[t]==`string`?String(e[t]).trim():``}function R(e,t){let n=e[t];if(typeof n==`number`&&Number.isFinite(n))return n;if(typeof n==`string`&&n.trim()){let e=Number(n);return Number.isFinite(e)?e:null}return null}function z(e){let t=e.trim();if(!/^[0-9]+(\.[0-9]+)?$/.test(t))return t;let n=Number(t);return Number.isFinite(n)?n>0&&n<1e-6?`<0.000001`:new Intl.NumberFormat(`en-US`,{minimumFractionDigits:0,maximumFractionDigits:Math.abs(n)>=1?2:6}).format(n):t}function ae(e){let t=P(e.details.chain),n=L(e.details,`program`);if(t===`solana`&&n){let t=Array.isArray(e.balances?.assets?.solana)?e.balances.assets.solana.find(e=>!e.isNative&&e.program===n):void 0,r=L(e.details,`assetSymbol`)||t?.symbol||`SPL`,i=we({isNative:!1,program:n,symbol:r,name:L(e.details,`assetName`)||t?.name||``})?`SPL`:r,a=L(e.details,`amountDisplay`);if(a)return`${z(a)} ${i}`;let o=R(e.details,`assetDecimals`)??t?.decimals,s=I(M(e.details.amount,``),o);if(s)return`${z(s)} ${i}`;let c=M(e.details.amount,``);return c?`${c} raw ${i}`:`n/a`}return F(e.details.amount,t)}function B(e){return{name:String(e.payload.assetName??``).trim()||null,symbol:String(e.payload.assetSymbol??``).trim()||null,program:String(e.payload.program??``).trim()||null}}function oe(e){if(e.request.payload.actionKind===`solana_swap`){let t=String(e.request.payload.inputSymbol??``).trim()||`SOL`,n=String(e.request.payload.outputSymbol??``).trim()||(e.request.payload.outputMint?Ce(e.request.payload.outputMint):`token`),r=typeof e.request.payload.inputDecimals==`number`&&Number.isFinite(e.request.payload.inputDecimals)?e.request.payload.inputDecimals:Number(c),i=String(e.request.payload.amountDisplay??``).trim()||I(e.request.payload.amount,r)||``;return{amountValueText:i?`${Y(i)} ${t}`:F(e.request.payload.amount,e.request.payload.chain),assetPrimaryText:`${t} -> ${n}`,assetSecondaryText:e.request.payload.routeLabel?`Jupiter · ${e.request.payload.routeLabel}`:`Jupiter swap`,name:String(e.request.payload.outputName??``).trim()||null,symbol:n,program:e.request.payload.outputMint??null,usesFallbackIdentity:!1}}let t=B(e.request),n=t.program,r=n&&Array.isArray(e.balances?.assets?.solana)?e.balances.assets.solana.find(e=>e.program===n):void 0,i=t.symbol??r?.symbol??null,a=t.name??r?.name??null,o=we({isNative:!1,program:n??``,symbol:i??``,name:a??``}),s=String(e.request.payload.amountDisplay??``).trim()||I(e.request.payload.amount,r?.decimals)||``;return s?{amountValueText:Y(s),assetPrimaryText:o?i:a??i??n,assetSecondaryText:!o&&i&&a&&i!==a?i:null,name:a,symbol:i,program:n,usesFallbackIdentity:o}:{amountValueText:F(e.request.payload.amount,e.request.payload.chain),assetPrimaryText:o?i:a??i??n,assetSecondaryText:!o&&i&&a&&i!==a?i:null,name:a,symbol:i,program:n,usesFallbackIdentity:o}}function se(e){let t=String(e.request.payload.walletId??``).trim(),n=String(e.request.payload.walletName??``).trim(),r=e.request.payload.chain,i=_(e.namedWallets,t)??(n?e.namedWallets.find(e=>e.name.trim().toLowerCase()===n.toLowerCase()):void 0),a=i&&J(i,r)||null;return{fromLabel:i?.name?.trim()||n||t||null,fromAddress:a,toAddress:String(e.request.payload.to??``).trim()||null}}function ce(n){let r=n.request.approvalDiff??n.request.simulation?.diff;if(!r)return t;let i=r.fromWalletName||n.endpoints.fromLabel||(r.fromWalletId?`@wallet:${r.fromWalletId}`:`wallet`),a=r.amountDisplay||n.display.amountValueText||r.amount||`amount`,o=r.token||n.display.assetPrimaryText||r.mint||r.chain,s=r.to||n.endpoints.toAddress||`destination`,c=[r.source,r.skillId?`skill ${r.skillId}`:``,r.taskId?`task ${r.taskId}`:``].filter(Boolean).join(` · `);return e`
66
56
  <div class="wallet-approval-diff">
67
57
  <span>Spend <strong>${a}</strong> ${o?e`<span>${o}</span>`:t}</span>
68
58
  <span>from <strong>${i}</strong> <span class="muted">(${r.fromRole})</span></span>
69
59
  <span>to <span class="mono">${X(s,8,6)}</span></span>
70
60
  ${c?e`<span class="muted">triggered by ${c}</span>`:t}
71
61
  </div>
72
- `}function W(e){return e.replace(/\.0+$/,``).replace(/(\.\d*?)0+$/,`$1`)}function G(e,t){let n=String(e??``).trim();if(!n)return`0`;try{let e=t===`SOL`?c:l,r=Number(n)/10**Number(e);if(!Number.isFinite(r))return`0`;let i=Math.abs(r);return t===`SAT`?W(i>=1e3?r.toFixed(1):i>=1?r.toFixed(2):r.toFixed(3)):i>=1||i>=.01?W(r.toFixed(2)):i>0?`<0.01`:`0`}catch{return n}}function K(e,t){let n=String(e??``).trim();if(!n)return`—`;let r=RegExp(`\\s*${t}$`,`i`);return n.replace(r,``).trim()||`0`}function fe(e){return String(e.miningProfile?.walletId??e.miningStatus?.walletId??e.miningReadiness?.selectedWalletId??``).trim()}function pe(e,t,n){if(typeof e.balances?.solana==`string`&&e.balances.solana.trim())return J(K(P(e.balances.solana,`solana`),`SOL`));if(n){let e=String(t.miningReadiness?.balances.solBalanceDisplay??``).trim();if(e)return J(K(e,`SOL`));let n=String(t.miningStatus?.currentSolBalanceLamports??``).trim();if(n)return J(G(n,`SOL`))}return e.addresses?.solana?t.balancesLoading?`Loading`:`0`:t.balancesLoading?`Loading`:`—`}function q(e,t){return e&&e.addresses?.solana||``}function me(e,t){return!e||t?.walletId!==e.id?[]:Array.isArray(t.assets?.solana)?t.assets.solana:[]}function he(e,t){if(!e)return[];let n=[],r=fe(t)===e.id,i=me(e,t.balances);if(i.length>0)for(let e of i)n.push({id:e.id,chain:`solana`,symbol:e.symbol,name:e.name,amountDisplay:e.amountDisplay,amountRaw:e.amountRaw,decimals:e.decimals,isNative:e.isNative,program:e.program,tokenProgramId:e.tokenProgramId,address:e.address,logoUri:e.logoUri,verificationStatus:e.verificationStatus,priceUsd:e.priceUsd,valueUsd:e.valueUsd,tags:e.tags});else n.push({id:`solana:native`,chain:`solana`,symbol:`SOL`,name:`Solana`,amountDisplay:pe(e,t,r),amountRaw:e.balances?.solana,isNative:!0,address:e.addresses?.solana});return n}function J(e){let t=e.trim();if(!t||t===`—`||t.toLowerCase()===`loading`)return e;let n=Number.parseFloat(t.replaceAll(`,`,``));return Number.isFinite(n)?n>0&&n<.01?`<0.01`:new Intl.NumberFormat(`en-US`,{minimumFractionDigits:0,maximumFractionDigits:2}).format(n):e}function Y(e){let t=e.mint?.trim();if(!t)return``;let n=e.drafts[t]?.[e.field];if(n!==void 0)return(e.drafts[t]?.decimals??-1)<0?z(n,e.decimals)??n:n;let r=e.settings?.policy.solana.tokenCaps?.[t]?.[e.field];return z(r,e.decimals)??``}function ge(e,t,n,r,i){let a=t?.trim();if(!a)return;let o=e.policySolanaTokenCaps[a],s=o&&o.decimals<0?{decimals:n,maxPerTx:z(o.maxPerTx,n)??``,maxDaily:z(o.maxDaily,n)??``}:o??{decimals:n};e.onPolicyDraftChange({solanaTokenCaps:{...e.policySolanaTokenCaps,[a]:{...s,decimals:n,[r]:i}}})}function _e(e){let t=e.policyTokenCapMint.trim();if(!t)return;let n=Number.parseInt(e.policyTokenCapDecimals.trim(),10),r=Number.isFinite(n)?Math.max(0,Math.min(18,n)):0;e.onPolicyDraftChange({solanaTokenCaps:{...e.policySolanaTokenCaps,[t]:{decimals:r,maxPerTx:e.policyTokenCapMaxPerTx.trim(),maxDaily:e.policyTokenCapMaxDaily.trim()}},tokenCapMint:``,tokenCapDecimals:``,tokenCapMaxPerTx:``,tokenCapMaxDaily:``})}function ve(e){let t=[],n=new Set;for(let r of e.selectedWalletTokens){let e=r.program?.trim();if(r.isNative||!e||n.has(e))continue;let i=X(e,2,2),a=String(r.symbol||``).trim(),o=!a||a===`Token`||a.includes(`...`)||a.includes(`…`)||a.length>8?i:a;n.add(e),t.push({key:e,label:o,detail:i,mint:e,decimals:r.decimals??0,logo:be(r,20)})}let r=new Set([...Object.keys(e.props.settings?.policy.solana.tokenCaps??{}),...Object.keys(e.props.policySolanaTokenCaps??{})]);for(let i of r){let r=i.trim();!r||n.has(r)||(n.add(r),t.push({key:r,label:X(r,2,2),detail:X(r,2,2),mint:r,decimals:e.props.policySolanaTokenCaps[r]?.decimals??-1}))}return t}function ye(n){let{props:r,settings:i,policyDisplay:a,cardRole:o,selectedWalletId:s,cardWalletCanSpendSolana:c,selectedWalletTokens:l,canEditPolicy:u}=n,d=r.policyCapsEnabled===!0,p=ve({props:r,selectedWalletTokens:l});return e`
62
+ `}function V(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:null}function H(e){if(typeof e==`string`)return e.trim()||null;if(typeof e==`number`&&Number.isFinite(e))return String(e);if(typeof e==`boolean`)return e?`yes`:`no`;if(Array.isArray(e)){let t=e.map(e=>H(e)).filter(Boolean);return t.length>0?t.join(`, `):null}return null}function le(n){let r=V(n.payload.signerSemanticIntent),i=H(r?.type);if(!r||!i)return t;let a=[],o=(e,t)=>{let n=H(t);n&&a.push({label:e,value:n})},s=[];if(i.startsWith(`solana.jupiter.`)){let e=V(r.jupiter),t=V(e?.trigger);if(o(`Owner`,e?.owner),o(`Input mint`,e?.inputMint),o(`Output mint`,e?.outputMint),o(`Input amount`,e?.inputAmount),o(`Maximum input`,e?.maxInputAmount),o(`Minimum output`,e?.minimumOutputAmount),o(`Fee ceiling (lamports)`,e?.maxFeeLamports),o(`Source token account`,e?.sourceTokenAccount),o(`Destination token account`,e?.destinationTokenAccount),o(`Programs`,e?.programs),o(`Trigger operation`,t?.operation),o(`Trigger program`,t?.program),o(`Trigger order ID`,t?.order),o(`Trigger mint`,t?.triggerMint),o(`Condition`,t?.condition),o(`Target price (USD)`,t?.targetPriceUsd),o(`Slippage (bps)`,t?.slippageBps),o(`Order expiry`,t?.expiresAt),o(`Expected order state`,t?.expectedOrderState),i.includes(`.trigger.`)){let n=H(t?.operation);s=(n===`create`?[[`input mint`,e?.inputMint],[`output mint`,e?.outputMint],[`exact input amount`,e?.inputAmount],[`trigger mint`,t?.triggerMint],[`condition`,t?.condition],[`target price`,t?.targetPriceUsd],[`slippage`,t?.slippageBps],[`order expiry`,t?.expiresAt],[`expected new state`,t?.expectedOrderState]]:n===`cancel`?[[`order ID`,t?.order],[`refund mint`,e?.outputMint],[`minimum refund`,e?.minimumOutputAmount],[`refund destination`,e?.destinationTokenAccount],[`expected open state`,t?.expectedOrderState]]:[[`operation`,t?.operation]]).filter(e=>H(e[1])===null).map(e=>String(e[0]));let r=[[`vault`,t?.vault],[`external request ID`,t?.requestId],[`source token account`,e?.sourceTokenAccount],...n===`create`?[[`destination token account`,e?.destinationTokenAccount]]:[]].filter(e=>H(e[1])!==null).map(e=>String(e[0]));s.push(...r.map(e=>`remove caller-provided ${e}`))}}else if(i===`solana.nativeTransfer`)o(`Destination`,r.destination),o(`Lamports`,r.lamports);else if(i===`solana.splTransferChecked`)o(`Token program`,r.tokenProgram),o(`Mint`,r.mint),o(`Destination`,r.destination),o(`Amount`,r.amount);else if(i===`solana.vaultBondAction`){let e=V(r.context);o(`Cluster`,r.cluster),o(`Vault action`,r.action),o(`Program`,r.programId),o(`Target authority`,e?.targetAuthority),o(`Dispute authority`,e?.disputeAuthority),o(`Interval start cycle`,e?.intervalStartCycleId),o(`Registry page`,e?.registryPageIndex),o(`Miner authorities`,e?.minerAuthorities),o(`Front cycle IDs`,e?.frontCycleIds),o(`Back cycle IDs`,e?.backCycleIds)}else if(i===`federation.bondChallenge`){let e=V(r.federation);o(`Challenge ID`,e?.challengeId),o(`Bond ID`,e?.bondId),o(`Bond tier`,e?.tier),o(`Bond amount`,e?.amountRaw),o(`Federation handle`,e?.handle),o(`Node ID`,e?.nodeId),o(`Token ID`,e?.tokenId),o(`Federation origin`,e?.federationOrigin),o(`Challenge expiry`,e?.expiresAt)}return e`
63
+ <div class="wallet-approval-diff" style="margin-top: 6px;">
64
+ <span><strong>Signer intent</strong> <span class="mono">${i}</span></span>
65
+ ${a.map(t=>e`
66
+ <span>
67
+ ${t.label}:
68
+ <span class="mono" style="overflow-wrap: anywhere;">${t.value}</span>
69
+ </span>
70
+ `)}
71
+ ${s.length>0?e`
72
+ <span class="muted">
73
+ Invalid or incomplete signer binding: ${s.join(`, `)}. Do not
74
+ approve this Trigger review.
75
+ </span>
76
+ `:t}
77
+ </div>
78
+ `}function U(e){return e.replace(/\.0+$/,``).replace(/(\.\d*?)0+$/,`$1`)}function W(e,t){let n=String(e??``).trim();if(!n)return`0`;try{let e=t===`SOL`?c:l,r=Number(n)/10**Number(e);if(!Number.isFinite(r))return`0`;let i=Math.abs(r);return t===`SAT`?U(i>=1e3?r.toFixed(1):i>=1?r.toFixed(2):r.toFixed(3)):i>=1||i>=.01?U(r.toFixed(2)):i>0?`<0.01`:`0`}catch{return n}}function G(e,t){let n=String(e??``).trim();if(!n)return`—`;let r=RegExp(`\\s*${t}$`,`i`);return n.replace(r,``).trim()||`0`}function K(e){return String(e.miningProfile?.walletId??e.miningStatus?.walletId??e.miningReadiness?.selectedWalletId??``).trim()}function q(e,t,n){if(typeof e.balances?.solana==`string`&&e.balances.solana.trim())return Y(G(j(e.balances.solana,`solana`),`SOL`));if(n){let e=String(t.miningReadiness?.balances.solBalanceDisplay??``).trim();if(e)return Y(G(e,`SOL`));let n=String(t.miningStatus?.currentSolBalanceLamports??``).trim();if(n)return Y(W(n,`SOL`))}return e.addresses?.solana?t.balancesLoading?`Loading`:`0`:t.balancesLoading?`Loading`:`—`}function J(e,t){return e&&e.addresses?.solana||``}function ue(e,t){return!e||t?.walletId!==e.id?[]:Array.isArray(t.assets?.solana)?t.assets.solana:[]}function de(e,t){if(!e)return[];let n=[],r=K(t)===e.id,i=ue(e,t.balances);if(i.length>0)for(let e of i)n.push({id:e.id,chain:`solana`,symbol:e.symbol,name:e.name,amountDisplay:e.amountDisplay,amountRaw:e.amountRaw,decimals:e.decimals,isNative:e.isNative,program:e.program,tokenProgramId:e.tokenProgramId,address:e.address,logoUri:e.logoUri,verificationStatus:e.verificationStatus,priceUsd:e.priceUsd,valueUsd:e.valueUsd,tags:e.tags});else n.push({id:`solana:native`,chain:`solana`,symbol:`SOL`,name:`Solana`,amountDisplay:q(e,t,r),amountRaw:e.balances?.solana,isNative:!0,address:e.addresses?.solana});return n}function Y(e){let t=e.trim();if(!t||t===`—`||t.toLowerCase()===`loading`)return e;let n=Number.parseFloat(t.replaceAll(`,`,``));return Number.isFinite(n)?n>0&&n<.01?`<0.01`:new Intl.NumberFormat(`en-US`,{minimumFractionDigits:0,maximumFractionDigits:2}).format(n):e}function fe(e){let t=e.mint?.trim();if(!t)return``;let n=e.drafts[t]?.[e.field];if(n!==void 0)return(e.drafts[t]?.decimals??-1)<0?I(n,e.decimals)??n:n;let r=e.settings?.policy.solana.tokenCaps?.[t]?.[e.field];return I(r,e.decimals)??``}function pe(e,t,n,r,i){let a=t?.trim();if(!a)return;let o=e.policySolanaTokenCaps[a],s=o&&o.decimals<0?{decimals:n,maxPerTx:I(o.maxPerTx,n)??``,maxDaily:I(o.maxDaily,n)??``}:o??{decimals:n};e.onPolicyDraftChange({solanaTokenCaps:{...e.policySolanaTokenCaps,[a]:{...s,decimals:n,[r]:i}}})}function me(e){let t=e.policyTokenCapMint.trim();if(!t)return;let n=Number.parseInt(e.policyTokenCapDecimals.trim(),10),r=Number.isFinite(n)?Math.max(0,Math.min(18,n)):0;e.onPolicyDraftChange({solanaTokenCaps:{...e.policySolanaTokenCaps,[t]:{decimals:r,maxPerTx:e.policyTokenCapMaxPerTx.trim(),maxDaily:e.policyTokenCapMaxDaily.trim()}},tokenCapMint:``,tokenCapDecimals:``,tokenCapMaxPerTx:``,tokenCapMaxDaily:``})}function he(e){let t=[],n=new Set;for(let r of e.selectedWalletTokens){let e=r.program?.trim();if(r.isNative||!e||n.has(e))continue;let i=X(e,2,2),a=String(r.symbol||``).trim(),o=!a||a===`Token`||a.includes(`...`)||a.includes(`…`)||a.length>8?i:a;n.add(e),t.push({key:e,label:o,detail:i,mint:e,decimals:r.decimals??0,logo:_e(r,20)})}let r=new Set([...Object.keys(e.props.settings?.policy.solana.tokenCaps??{}),...Object.keys(e.props.policySolanaTokenCaps??{})]);for(let i of r){let r=i.trim();!r||n.has(r)||(n.add(r),t.push({key:r,label:X(r,2,2),detail:X(r,2,2),mint:r,decimals:e.props.policySolanaTokenCaps[r]?.decimals??-1}))}return t}function ge(n){let{props:r,settings:i,policyDisplay:a,cardRole:o,selectedWalletId:s,cardWalletCanSpendSolana:c,selectedWalletTokens:l,canEditPolicy:u}=n,d=r.policyCapsEnabled===!0,p=he({props:r,selectedWalletTokens:l});return e`
73
79
  <div class="field">
74
80
  <div class="wallet-spend-limit-row" style="align-items: end;">
75
81
  <label class="field">
@@ -114,7 +120,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
114
120
  <input
115
121
  aria-label="Daily SOL cap"
116
122
  placeholder="5.0"
117
- .value=${r.policySolMaxDaily||a?.solana.maxDaily.human.split(` `)[0]||P(i.policy.solana.maxDaily,`solana`,{hideUnit:!0})}
123
+ .value=${r.policySolMaxDaily||a?.solana.maxDaily.human.split(` `)[0]||j(i.policy.solana.maxDaily,`solana`,{hideUnit:!0})}
118
124
  ?disabled=${r.settingsBusy||!u}
119
125
  @input=${e=>r.onPolicyDraftChange({solMaxDaily:e.target.value})}
120
126
  />
@@ -127,7 +133,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
127
133
  <input
128
134
  aria-label="Per transaction SOL cap"
129
135
  placeholder="1.0"
130
- .value=${r.policySolMaxPerTx||a?.solana.maxPerTx.human.split(` `)[0]||P(i.policy.solana.maxPerTx,`solana`,{hideUnit:!0})}
136
+ .value=${r.policySolMaxPerTx||a?.solana.maxPerTx.human.split(` `)[0]||j(i.policy.solana.maxPerTx,`solana`,{hideUnit:!0})}
131
137
  ?disabled=${r.settingsBusy||!u}
132
138
  @input=${e=>r.onPolicyDraftChange({solMaxPerTx:e.target.value})}
133
139
  />
@@ -144,9 +150,9 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
144
150
  <input
145
151
  aria-label=${`Daily cap for ${t.label}`}
146
152
  placeholder="0"
147
- .value=${Y({drafts:r.policySolanaTokenCaps,settings:i,mint:t.mint,field:`maxDaily`,decimals:t.decimals})}
153
+ .value=${fe({drafts:r.policySolanaTokenCaps,settings:i,mint:t.mint,field:`maxDaily`,decimals:t.decimals})}
148
154
  ?disabled=${r.settingsBusy||!u}
149
- @input=${e=>ge(r,t.mint,t.decimals,`maxDaily`,e.target.value)}
155
+ @input=${e=>pe(r,t.mint,t.decimals,`maxDaily`,e.target.value)}
150
156
  />
151
157
  </label>
152
158
  <label class="field wallet-cap-field">
@@ -157,9 +163,9 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
157
163
  <input
158
164
  aria-label=${`Per transaction cap for ${t.label}`}
159
165
  placeholder="0"
160
- .value=${Y({drafts:r.policySolanaTokenCaps,settings:i,mint:t.mint,field:`maxPerTx`,decimals:t.decimals})}
166
+ .value=${fe({drafts:r.policySolanaTokenCaps,settings:i,mint:t.mint,field:`maxPerTx`,decimals:t.decimals})}
161
167
  ?disabled=${r.settingsBusy||!u}
162
- @input=${e=>ge(r,t.mint,t.decimals,`maxPerTx`,e.target.value)}
168
+ @input=${e=>pe(r,t.mint,t.decimals,`maxPerTx`,e.target.value)}
163
169
  />
164
170
  </label>
165
171
  </div>
@@ -187,7 +193,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
187
193
  ${r.policyTokenSearchLoading?`Searching...`:`Search`}
188
194
  </button>
189
195
  </div>
190
- ${r.policyTokenSearchError?e`<div class="wallet-custody-note error" style="margin-top: 8px;">${r.policyTokenSearchError}</div>`:t}
196
+ ${r.policyTokenSearchError?e`<div class="wallet-security-note error" style="margin-top: 8px;">${r.policyTokenSearchError}</div>`:t}
191
197
  ${(r.policyTokenSearchResults??[]).length>0?e`
192
198
  <div class="wallet-token-list" style="margin-top: 8px;">
193
199
  ${(r.policyTokenSearchResults??[]).map(n=>e`
@@ -256,7 +262,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
256
262
  <button
257
263
  class="btn"
258
264
  ?disabled=${r.settingsBusy||!u||!(r.policyTokenCapMint??``).trim()}
259
- @click=${()=>_e(r)}
265
+ @click=${()=>me(r)}
260
266
  >
261
267
  Add
262
268
  </button>
@@ -279,32 +285,32 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
279
285
  </details>
280
286
  `:t}
281
287
  </div>
282
- `}function be(t,n=28){let r=t.symbol.trim().slice(0,1).toUpperCase()||`?`,i=`width:${n}px;height:${n}px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:rgba(255,255,255,0.08);color:rgba(255,255,255,0.92);font-weight:600;font-size:0.8em;overflow:hidden;flex-shrink:0;`;return t.logoUri?e`<span style=${i}
288
+ `}function _e(t,n=28){let r=t.symbol.trim().slice(0,1).toUpperCase()||`?`,i=`width:${n}px;height:${n}px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:rgba(255,255,255,0.08);color:rgba(255,255,255,0.92);font-weight:600;font-size:0.8em;overflow:hidden;flex-shrink:0;`;return t.logoUri?e`<span style=${i}
283
289
  ><img
284
290
  src=${t.logoUri}
285
291
  alt=${`${t.symbol} logo`}
286
292
  style=${`width:${n}px;height:${n}px;object-fit:cover;display:block;`}
287
293
  @error=${e=>{let t=e.currentTarget,n=t?.parentElement;t&&n&&(t.style.display=`none`,n.textContent=r)}}
288
294
  /></span
289
- >`:e`<span style=${i}>${r}</span>`}function xe(e,t){let n=he(e,t);if(n.length===0)return{options:n};let r=String(t.sendCreateForm.assetId??``).trim(),i=t.sendCreateForm.chain;return{selected:n.find(e=>e.id===r)??n.find(e=>e.chain===i&&e.isNative)??n.find(e=>e.chain===i)??n[0],options:n}}function Se(e){switch(e){case`send_requested`:return`Request created`;case`send_approved`:return`Approved`;case`send_rejected`:return`Rejected`;case`send_executed`:return`Executed`;case`send_failed`:return`Failed`;default:return e.replace(/_/g,` `)}}function Ce(e){let t=B(e.details??{},`actionKind`);return t===`solana_limit_order`?e.action===`send_executed`?`Limit order created`:e.action===`send_failed`?`Limit order failed`:`Limit order request`:t===`solana_limit_cancel`?e.action===`send_executed`?`Limit order cancelled`:e.action===`send_failed`?`Cancel failed`:`Cancel request`:Se(e.action)}function we(e){switch(e){case`pending`:return n.loader;case`approved`:return n.check;case`executed`:return n.send;case`failed`:case`rejected`:case`expired`:return n.x;default:return n.fileText}}function Te(e){switch(e){case`send_requested`:return n.penLine;case`send_approved`:return n.check;case`send_rejected`:return n.x;case`send_executed`:return n.send;case`send_failed`:return n.bug;default:return n.fileText}}function X(e,t=8,n=6){let r=e.trim();return r?r.length<=t+n+1?r:`${r.slice(0,t)}...${r.slice(-n)}`:`—`}function Ee(e){let t=e.trim();return t?t.length<=12?t:`${t.slice(0,4)}…${t.slice(-4)}`:`TOKEN`}function De(e){if(!e||e.isNative||!e.program)return!1;let t=Ee(e.program);return String(e.symbol??``).trim().toUpperCase()===t.toUpperCase()&&String(e.name??``).trim()===`Token ${t}`}async function Oe(e){let t=e.trim();if(!(!t||typeof navigator>`u`||!navigator.clipboard))try{await navigator.clipboard.writeText(t)}catch{}}function ke(e){return e.replace(/[^a-zA-Z0-9_-]/g,`-`)||`wallet`}function Ae(e,t,n){if(typeof document>`u`)return;let r=document.getElementById(e);if(!r)return;let i=r.dataset.revealed===`true`;r.textContent=i?t:n,r.dataset.revealed=i?`false`:`true`}function je(r,i){let a=r.trim();return a?e`<button
295
+ >`:e`<span style=${i}>${r}</span>`}function ve(e,t){let n=de(e,t);if(n.length===0)return{options:n};let r=String(t.sendCreateForm.assetId??``).trim(),i=t.sendCreateForm.chain;return{selected:n.find(e=>e.id===r)??n.find(e=>e.chain===i&&e.isNative)??n.find(e=>e.chain===i)??n[0],options:n}}function ye(e){switch(e){case`send_requested`:return`Request created`;case`send_approved`:return`Approved`;case`send_rejected`:return`Rejected`;case`send_executed`:return`Executed`;case`send_failed`:return`Failed`;default:return e.replace(/_/g,` `)}}function be(e){let t=L(e.details??{},`actionKind`);return t===`solana_limit_order`?e.action===`send_executed`?`Limit order created`:e.action===`send_failed`?`Limit order failed`:`Limit order request`:t===`solana_limit_cancel`?e.action===`send_executed`?`Limit order cancelled`:e.action===`send_failed`?`Cancel failed`:`Cancel request`:ye(e.action)}function xe(e){switch(e){case`pending`:return n.loader;case`approved`:return n.check;case`executed`:return n.send;case`failed`:case`rejected`:case`expired`:return n.x;default:return n.fileText}}function Se(e){switch(e){case`send_requested`:return n.penLine;case`send_approved`:return n.check;case`send_rejected`:return n.x;case`send_executed`:return n.send;case`send_failed`:return n.bug;default:return n.fileText}}function X(e,t=8,n=6){let r=e.trim();return r?r.length<=t+n+1?r:`${r.slice(0,t)}...${r.slice(-n)}`:`—`}function Ce(e){let t=e.trim();return t?t.length<=12?t:`${t.slice(0,4)}…${t.slice(-4)}`:`TOKEN`}function we(e){if(!e||e.isNative||!e.program)return!1;let t=Ce(e.program);return String(e.symbol??``).trim().toUpperCase()===t.toUpperCase()&&String(e.name??``).trim()===`Token ${t}`}async function Te(e){let t=e.trim();if(!(!t||typeof navigator>`u`||!navigator.clipboard))try{await navigator.clipboard.writeText(t)}catch{}}function Ee(e){return e.replace(/[^a-zA-Z0-9_-]/g,`-`)||`wallet`}function De(e,t,n){if(typeof document>`u`)return;let r=document.getElementById(e);if(!r)return;let i=r.dataset.revealed===`true`;r.textContent=i?t:n,r.dataset.revealed=i?`false`:`true`}function Oe(r,i){let a=r.trim();return a?e`<button
290
296
  type="button"
291
297
  class="wallet-copy-btn"
292
298
  title=${`Copy ${i}`}
293
299
  aria-label=${`Copy ${i}`}
294
- @click=${()=>void Oe(a)}
300
+ @click=${()=>void Te(a)}
295
301
  >
296
302
  <span class="wallet-copy-btn__icon">${n.copy}</span>
297
- </button>`:t}function Me(n){let r=String(n.value??``).trim();if(!r)return t;let i=n.display.trim()||X(r);return e`<button
303
+ </button>`:t}function ke(n){let r=String(n.value??``).trim();if(!r)return t;let i=n.display.trim()||X(r);return e`<button
298
304
  type="button"
299
305
  class=${`wallet-copy-text ${n.className??``}`.trim()}
300
306
  data-copied="false"
301
307
  title=${n.title??`Copy ${n.label}`}
302
308
  aria-label=${`Copy ${n.label}`}
303
- @click=${e=>{Oe(r).then(()=>{let t=e.currentTarget;if(!t)return;let n=t.querySelector(`.wallet-copy-popover`);t.dataset.copied=`true`,n&&(n.textContent=`Copied`),window.setTimeout(()=>{n&&(n.textContent=`Copy`),t.dataset.copied=`false`},1200)})}}
309
+ @click=${e=>{Te(r).then(()=>{let t=e.currentTarget;if(!t)return;let n=t.querySelector(`.wallet-copy-popover`);t.dataset.copied=`true`,n&&(n.textContent=`Copied`),window.setTimeout(()=>{n&&(n.textContent=`Copy`),t.dataset.copied=`false`},1200)})}}
304
310
  >
305
311
  <span class="wallet-copy-text__label">${i}</span>
306
312
  <span class="wallet-copy-popover" aria-hidden="true">Copy</span>
307
- </button>`}function Ne(t,r){let i=`${t}: ${r}`;return e`<button
313
+ </button>`}function Ae(t,r){let i=`${t}: ${r}`;return e`<button
308
314
  type="button"
309
315
  class="wallet-icon-btn"
310
316
  title=${i}
@@ -320,7 +326,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
320
326
  aria-label=${i}
321
327
  >
322
328
  <span class="wallet-copy-btn__icon">${n.externalLink}</span>
323
- </a>`:t}function Q(e,t,n){let r=String(n??``).trim();return!r||!e?null:t===`tx`?`https://solscan.io/tx/${encodeURIComponent(r)}`:`https://solscan.io/account/${encodeURIComponent(r)}`}function Pe(t,n,r=`neutral`,i={}){let a=i.title??t,o=e`<div class="wallet-balance-pill__value">${n}</div>`;return i.onClick?e`<button
329
+ </a>`:t}function Q(e,t,n){let r=String(n??``).trim();return!r||!e?null:t===`tx`?`https://solscan.io/tx/${encodeURIComponent(r)}`:`https://solscan.io/account/${encodeURIComponent(r)}`}function je(t,n,r=`neutral`,i={}){let a=i.title??t,o=e`<div class="wallet-balance-pill__value">${n}</div>`;return i.onClick?e`<button
324
330
  type="button"
325
331
  class="wallet-balance-pill wallet-balance-pill--button"
326
332
  data-tone=${r}
@@ -333,10 +339,10 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
333
339
  <span class="wallet-meta-row__label">${n.label}</span>
334
340
  <span class="wallet-meta-row__value mono">${n.value}</span>
335
341
  <span class="wallet-meta-row__actions">
336
- ${n.rawValue&&n.copyLabel?je(n.rawValue,n.copyLabel):t}
342
+ ${n.rawValue&&n.copyLabel?Oe(n.rawValue,n.copyLabel):t}
337
343
  ${Z(n.href,`Open ${n.label}`)}
338
344
  </span>
339
- </div>`}function Fe(n){let r=n.skillGrantDraft,i=n.skillGrantRows.find(e=>e.skillId===r.skillId)??n.skillGrantRows[0],o=(r.walletIds??``).split(`,`).map(e=>e.trim()).filter(Boolean),s=n.skillGrantBusy||!r.skillId.trim()||r.actions.length===0||o.length===0;return e`
345
+ </div>`}function Me(n){let r=n.skillGrantDraft,i=n.skillGrantRows.find(e=>e.skillId===r.skillId)??n.skillGrantRows[0],o=(r.walletIds??``).split(`,`).map(e=>e.trim()).filter(Boolean),s=n.skillGrantBusy||!r.skillId.trim()||r.actions.length===0||o.length===0;return e`
340
346
  <div id="wallet-skill-grants" class="card wallet-panel">
341
347
  <div class="wallet-panel__head">
342
348
  <div>
@@ -351,7 +357,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
351
357
  ${n.skillGrantsError?e`<div class="callout danger" style="margin-top: 12px;">${n.skillGrantsError}</div>`:t}
352
358
  ${n.skillGrantsMessage?e`<div class="callout success" style="margin-top: 12px;">${n.skillGrantsMessage}</div>`:t}
353
359
  ${n.skillGrantRows.length===0?e`
354
- <div class="wallet-custody-note" style="margin-top: 12px">
360
+ <div class="wallet-security-note" style="margin-top: 12px">
355
361
  No reviewed wallet-capable skills or existing wallet grants found yet.
356
362
  </div>
357
363
  `:e`
@@ -499,15 +505,15 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
499
505
  </div>
500
506
  `}
501
507
  </div>
502
- `}function Ie(n){let r=n.status,i=u(n),a=w(n),o=r?.approvalAuth?.passkeys?.length??r?.approvalAuth?.passkeyCount??0,s=a.length>0&&o<=1,c=`Disable wallet security on every secured wallet before removing the last Wallet Control Passkey.`;return e`
508
+ `}function Ne(n){let r=n.status,i=u(n);return e`
503
509
  <div class="wallet-top-grid">
504
510
  <div id="wallet-admin-control" class="card wallet-top-card">
505
511
  <div class="wallet-top-card__head">
506
512
  <div>
507
513
  <div class="wallet-top-card__title-row">
508
514
  <div class="card-title">Wallet Control Passkey</div>
509
- ${Ne(`Wallet Control Passkey`,`${i.detail} Use a device passkey such as Touch ID, Windows Hello, a phone passkey, or a supported security key.`)}
510
- ${C(i.summary,i.detail)}
515
+ ${Ae(`Wallet Control Passkey`,`${i.detail} Use a device passkey such as Touch ID, Windows Hello, a phone passkey, or a supported security key.`)}
516
+ ${w(i.summary,i.detail)}
511
517
  </div>
512
518
  </div>
513
519
  </div>
@@ -537,27 +543,28 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
537
543
  </button>
538
544
  `:t}
539
545
  </div>
540
- <div class="wallet-custody-note" style="margin-top: 10px;">
541
- Required before wallet security setup, unlock, recovery, second-device changes, policy changes, and approving sends.
546
+ <div class="wallet-security-note" style="margin-top: 10px;">
547
+ Protects Gateway policy and administration changes. Native signer
548
+ wallets use a separate signer-owned WebAuthn credential for each exact
549
+ reviewed send.
542
550
  </div>
543
551
  ${!i.enableVisible&&!i.enrollVisible?e`
544
552
  <details class="wallet-advanced-box">
545
553
  <summary>Manage passkey</summary>
546
554
  ${(r?.approvalAuth?.passkeys?.length??0)>0?e`
547
- <div class="wallet-custody-device-list">
555
+ <div class="wallet-security-device-list">
548
556
  ${r.approvalAuth.passkeys.map(t=>e`
549
- <div class="wallet-custody-device-row">
557
+ <div class="wallet-security-device-row">
550
558
  <div>
551
559
  <div>Label: ${t.label||`Wallet passkey`}</div>
552
- <div class="wallet-custody-note">
560
+ <div class="wallet-security-note">
553
561
  Credential ID <span class="mono">${X(t.id)}</span>
554
562
  · added ${new Date(t.createdAt).toLocaleString()}
555
563
  </div>
556
564
  </div>
557
565
  <button
558
566
  class="btn small"
559
- title=${s?c:``}
560
- ?disabled=${n.passkeyBusy||!n.onDeletePasskey||s}
567
+ ?disabled=${n.passkeyBusy||!n.onDeletePasskey}
561
568
  @click=${()=>n.onDeletePasskey?.(t.id)}
562
569
  >
563
570
  Remove passkey
@@ -565,19 +572,14 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
565
572
  </div>
566
573
  `)}
567
574
  </div>
568
- ${s?e`
569
- <div class="wallet-custody-note" style="margin-top: 10px;">
570
- ${c}
571
- </div>
572
- `:t}
573
575
  `:t}
574
576
  </details>
575
577
  `:t}
576
578
  ${n.passkeyError?e`<div class="callout danger">${n.passkeyError}</div>`:t}
577
579
  </div>
578
580
  </div>
579
- `}function Le(e){switch(e){case`send_executed`:case`send_approved`:return`success`;case`send_failed`:case`send_rejected`:return`danger`;case`send_requested`:return`warn`;default:return`neutral`}}function Re(a){let c=a.status,l=a.settings,u=S(a),d=!!(a.error||a.settingsError||a.actionMessage||a.settingsMessage||u.sharedWalletWarning),p=a.auditEntries.filter(e=>[`send_requested`,`send_approved`,`send_rejected`,`send_executed`,`send_failed`].includes(e.action)).slice(0,48),m=p.length,h=Math.max(1,Math.ceil(m/s)),g=Math.min(Math.max(a.activityPage,1),h),v=(g-1)*s,y=p.slice(v,v+s),b=c?.capabilities?.canEditPolicy??!0,x=c?.capabilities?.canSend??!0,te=c?.policyDisplay,C=_(a.namedWallets,a.walletDetailsWalletId),w=j(a.namedWallets,a);ee(C).includes(`solana`);let T=c?.custody??null,O=(c?.approvalAuth?.mode??`none`)===`webauthn`&&!!c?.approvalAuth?.ready&&(c?.approvalAuth?.passkeyCount??0)>0,A=T?.unlock?.active??!1,P=T?.unlock?.expiresAt;C&&k(C.id,a);let R=C&&a.securitySetupWalletId?.trim()===C.id&&(a.securitySetupRole===`agent`||a.securitySetupRole===`vault`)?a.securitySetupRole:null,z=!!T?.target?.walletId&&T?.target?.walletId===(a.walletDetailsWalletId.trim()||C?.id||``);C?.readiness?.keystore,C&&z&&T?.mode,T?.mode,T?.mode,T?.mode===`single-key`||A&&`${N(P)}`,T?.mode===`single-key`||A&&`${N(P)}`;let V={enabled:!1,mode:`all`,percentage:100,minRaw:`1`,keepRaw:`0`,...a.miningProfile?.automation?.satSweep},H=a.namedWallets.filter(e=>e.id!==C?.id&&!!e.addresses?.solana),U=V.destinationAddress||!V.destinationWalletId?`external`:`wallet`;z&&T?.ceremony?.devices,E(a.clientSecuritySupport,!!a.custodyDeviceShareStored),(a.clientSecuritySupport?.notes??[]).filter(e=>!e.toLowerCase().includes(`helper`)),R&&T&&z&&D({role:R,custody:T,recoveryShare:a.custodyRecoveryShare,deviceShareStored:!!a.custodyDeviceShareStored,support:a.clientSecuritySupport});let W=String(a.expandedWalletId??``).trim(),G=a.expandedPanel??``,K=(typeof window<`u`&&window.location.hash.replace(/^#/,``)===`wallet-skill-grants`?`skill-grants`:typeof window<`u`&&[`wallet-access`,`wallet-admin-control`].includes(window.location.hash.replace(/^#/,``))?`access`:null)??a.mainPanel??`wallets`,q=e=>{if(a.onMainPanelChange?.(e),typeof window>`u`)return;let t=new URL(window.location.href);t.hash=e===`skill-grants`?`wallet-skill-grants`:e===`access`?`wallet-access`:``,window.history.replaceState({},``,t.toString())};return e`
580
- ${ze(a)}
581
+ `}function Pe(e){switch(e){case`send_executed`:case`send_approved`:return`success`;case`send_failed`:case`send_rejected`:return`danger`;case`send_requested`:return`warn`;default:return`neutral`}}function Fe(a){let c=a.status,l=a.settings,u=S(a),d=!!(a.error||a.settingsError||a.actionMessage||a.settingsMessage||u.sharedWalletWarning),p=a.auditEntries.filter(e=>[`send_requested`,`send_approved`,`send_rejected`,`send_executed`,`send_failed`].includes(e.action)).slice(0,48),m=p.length,h=Math.max(1,Math.ceil(m/s)),g=Math.min(Math.max(a.activityPage,1),h),v=(g-1)*s,y=p.slice(v,v+s),b=c?.capabilities?.canEditPolicy??!0,x=c?.capabilities?.canSend??!0,C=c?.policyDisplay,w=_(a.namedWallets,a.walletDetailsWalletId),T=O(a.namedWallets,a),D={enabled:!1,mode:`all`,percentage:100,minRaw:`1`,keepRaw:`0`,...a.miningProfile?.automation?.satSweep},j=a.namedWallets.filter(e=>e.id!==w?.id&&!!e.addresses?.solana),F=D.destinationAddress||!D.destinationWalletId?`external`:`wallet`,I=String(a.expandedWalletId??``).trim(),R=a.expandedPanel??``,z=(typeof window<`u`&&window.location.hash.replace(/^#/,``)===`wallet-skill-grants`?`skill-grants`:typeof window<`u`&&[`wallet-access`,`wallet-admin-control`].includes(window.location.hash.replace(/^#/,``))?`access`:null)??a.mainPanel??`wallets`,B=(a.providers??[]).filter(e=>(e.id===`local-socket-signer`||e.id===`turnkey`)&&e.operationsImplemented&&e.capabilities.operations.createWallet),V=a.createProvider??B[0]?.id??`local-socket-signer`,H=B.find(e=>e.id===V),U=!!(H?.enabled&&H.health.ok&&(!H.capabilities.requiresCredentials||H.credentialsConfigured)),W=e=>{if(a.onMainPanelChange?.(e),typeof window>`u`)return;let t=new URL(window.location.href);t.hash=e===`skill-grants`?`wallet-skill-grants`:e===`access`?`wallet-access`:``,window.history.replaceState({},``,t.toString())};return e`
582
+ ${Ie(a)}
581
583
  <style>
582
584
  .wallet-dashboard {
583
585
  display: grid;
@@ -805,31 +807,16 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
805
807
  line-height: 1;
806
808
  font-weight: 560;
807
809
  }
808
- .wallet-custody-grid {
809
- display: grid;
810
- gap: 12px;
811
- }
812
- .wallet-custody-fields {
813
- display: grid;
814
- grid-template-columns: repeat(2, minmax(0, 1fr));
815
- gap: 12px;
816
- }
817
- .wallet-custody-actions {
818
- display: flex;
819
- flex-wrap: wrap;
820
- gap: 10px;
821
- align-items: center;
822
- }
823
- .wallet-custody-note {
810
+ .wallet-security-note {
824
811
  color: var(--muted);
825
812
  font-size: 13px;
826
813
  line-height: 1.5;
827
814
  }
828
- .wallet-custody-device-list {
815
+ .wallet-security-device-list {
829
816
  display: grid;
830
817
  gap: 10px;
831
818
  }
832
- .wallet-custody-device-row {
819
+ .wallet-security-device-row {
833
820
  display: flex;
834
821
  justify-content: space-between;
835
822
  gap: 12px;
@@ -838,17 +825,6 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
838
825
  border-radius: 12px;
839
826
  padding: 10px 12px;
840
827
  }
841
- .wallet-custody-remember {
842
- display: inline-flex;
843
- align-items: center;
844
- gap: 8px;
845
- color: var(--muted);
846
- font-size: 13px;
847
- }
848
- .wallet-custody-stored {
849
- color: var(--ok);
850
- font-size: 12px;
851
- }
852
828
  .wallet-inline-badges {
853
829
  display: inline-flex;
854
830
  align-items: center;
@@ -1567,7 +1543,34 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1567
1543
  font-size: 12px;
1568
1544
  line-height: 1.45;
1569
1545
  }
1546
+ .wallet-create-panel {
1547
+ border: 1px solid var(--border);
1548
+ border-radius: 12px;
1549
+ background: var(--surface-muted);
1550
+ padding: 10px 12px;
1551
+ }
1552
+ .wallet-create-panel > summary {
1553
+ cursor: pointer;
1554
+ color: var(--text-strong);
1555
+ font-weight: 700;
1556
+ }
1557
+ .wallet-create-grid {
1558
+ display: grid;
1559
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1560
+ gap: 10px;
1561
+ margin-top: 12px;
1562
+ }
1563
+ .wallet-create-actions {
1564
+ align-items: center;
1565
+ display: flex;
1566
+ flex-wrap: wrap;
1567
+ gap: 10px;
1568
+ grid-column: 1 / -1;
1569
+ }
1570
1570
  @media (max-width: 720px) {
1571
+ .wallet-create-grid {
1572
+ grid-template-columns: 1fr;
1573
+ }
1571
1574
  .wallet-spend-limit-row {
1572
1575
  grid-template-columns: 1fr;
1573
1576
  }
@@ -1714,13 +1717,9 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1714
1717
  .wallet-meta-row {
1715
1718
  grid-template-columns: minmax(54px, auto) minmax(0, 1fr) auto;
1716
1719
  }
1717
- .wallet-custody-fields {
1718
- grid-template-columns: 1fr;
1719
- }
1720
1720
  }
1721
1721
  </style>
1722
1722
  <section id="wallet-dashboard" class="wallet-dashboard">
1723
- ${t}
1724
1723
  ${d?e`
1725
1724
  <div class="wallet-message-stack">
1726
1725
  ${a.error?e`<div class="callout danger">${a.error}</div>`:t}
@@ -1735,29 +1734,37 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1735
1734
  <button
1736
1735
  class="btn"
1737
1736
  role="tab"
1738
- aria-selected=${K===`wallets`?`true`:`false`}
1739
- @click=${()=>q(`wallets`)}
1737
+ aria-selected=${z===`wallets`?`true`:`false`}
1738
+ @click=${()=>W(`wallets`)}
1740
1739
  >
1741
1740
  Wallets
1742
1741
  </button>
1743
1742
  <button
1744
1743
  class="btn"
1745
1744
  role="tab"
1746
- aria-selected=${K===`access`?`true`:`false`}
1747
- @click=${()=>q(`access`)}
1745
+ aria-selected=${z===`access`?`true`:`false`}
1746
+ @click=${()=>W(`access`)}
1748
1747
  >
1749
1748
  Access
1750
1749
  </button>
1751
1750
  <button
1752
1751
  class="btn"
1753
1752
  role="tab"
1754
- aria-selected=${K===`skill-grants`?`true`:`false`}
1755
- @click=${()=>q(`skill-grants`)}
1753
+ aria-selected=${z===`skill-grants`?`true`:`false`}
1754
+ @click=${()=>W(`skill-grants`)}
1756
1755
  >
1757
1756
  Skill Grants
1758
1757
  </button>
1759
- ${K===`wallets`?e`
1758
+ ${z===`wallets`?e`
1760
1759
  <span class="wallet-main-tabs__spacer"></span>
1760
+ <button
1761
+ class="btn small"
1762
+ ?disabled=${a.settingsBusy}
1763
+ @click=${a.onAttachWalletStandardVault}
1764
+ title="Attach a Solana Wallet Standard account. Wallet discovery cannot prove hardware backing; verify a reserve account on its device."
1765
+ >
1766
+ Attach Wallet Standard Vault
1767
+ </button>
1761
1768
  <button
1762
1769
  class="btn small"
1763
1770
  ?disabled=${a.loading||a.balancesLoading}
@@ -1767,19 +1774,77 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1767
1774
  </button>
1768
1775
  `:t}
1769
1776
  </div>
1770
- ${K===`skill-grants`?Fe(a):K===`access`?Ie(a):e`<div id="wallet-wallets" class="wallet-wallets-section">
1777
+ ${z===`skill-grants`?Me(a):z===`access`?Ne(a):e`<div id="wallet-wallets" class="wallet-wallets-section">
1778
+ <details class="wallet-create-panel">
1779
+ <summary>Create a signer-owned wallet</summary>
1780
+ <div class="wallet-create-grid">
1781
+ <label class="field">
1782
+ <span>Name</span>
1783
+ <input
1784
+ .value=${a.createName??``}
1785
+ placeholder="Primary Agent wallet"
1786
+ autocomplete="off"
1787
+ @input=${e=>a.onCreateNameChange?.(e.target.value)}
1788
+ />
1789
+ </label>
1790
+ <label class="field">
1791
+ <span>Permanent wallet ID</span>
1792
+ <input
1793
+ .value=${a.createId??``}
1794
+ placeholder=${V===`local-socket-signer`?`agent-primary (required)`:`optional local label`}
1795
+ autocomplete="off"
1796
+ @input=${e=>a.onCreateIdChange?.(e.target.value)}
1797
+ />
1798
+ </label>
1799
+ <label class="field">
1800
+ <span>Custody provider</span>
1801
+ <select
1802
+ .value=${V}
1803
+ @change=${e=>a.onCreateProviderChange?.(e.target.value)}
1804
+ >
1805
+ ${B.map(t=>e`
1806
+ <option value=${t.id}>
1807
+ ${t.label||(t.id===`local-socket-signer`?`Native Go signer`:`Turnkey`)}
1808
+ </option>
1809
+ `)}
1810
+ </select>
1811
+ </label>
1812
+ <label class="field">
1813
+ <span>Wallet role</span>
1814
+ <select
1815
+ .value=${a.createRole??`agent`}
1816
+ @change=${e=>a.onCreateRoleChange?.(e.target.value)}
1817
+ >
1818
+ <option value="agent">Agent — capped automation</option>
1819
+ <option value="vault">Vault — reviewed operations only</option>
1820
+ </select>
1821
+ </label>
1822
+ <div class="wallet-create-actions">
1823
+ <button
1824
+ class="btn primary"
1825
+ ?disabled=${a.settingsBusy||!U}
1826
+ @click=${a.onCreateWallet}
1827
+ >
1828
+ ${a.settingsBusy?`Creating...`:`Create wallet`}
1829
+ </button>
1830
+ <span class="muted">
1831
+ ${H?H.enabled?H.health.ok?H.capabilities.requiresCredentials&&!H.credentialsConfigured?`Configure restricted provider credentials before creating a wallet.`:V===`local-socket-signer`?`The Go signer generates the key; Node receives only the public address.`:`Turnkey creates the account under the configured restrictive policy.`:H.health.details||`Provider health check failed.`:`Enable this provider in Wallet Access first.`:`No production wallet-creation provider is available.`}
1832
+ </span>
1833
+ </div>
1834
+ </div>
1835
+ </details>
1771
1836
  ${a.balancesError?e`<div class="callout danger">${a.balancesError}</div>`:t}
1772
1837
  <div class="wallet-grid">
1773
- ${w.map(r=>{let s=pe(r,a,fe(a)===r.id),c=String(a.balanceWalletId??``).trim(),u=r.id===W&&G===`balance`,d=r.id===W&&G===`security`,f=((u||d)&&r.id===(c||a.balances?.walletId)?he(r,a).filter(e=>e.chain===`solana`):[]).filter(e=>!e.isNative),p=r.addresses?.solana||``,m=`wallet-address-${ke(r.id)}`,h=s,g=k(r.id,a),_=re(r.id,a),v=g===`agent`&&r.id===a.walletDetailsWalletId&&l?l.policy.directSigning:void 0,y=_?.unlock?.active??!1,S=g===`agent`&&v===!0&&_?.mode===`split-key-active`&&!y,C=_?.unlock?.expiresAt,w=_?.mode===`single-key`?`No wallet security lock is active for this wallet.`:y?`Signing window is active until ${N(C)}.`:`Signing window is locked. Unlock this wallet before it can sign.`,T=_?.mode===`single-key`&&!r.readiness?.keystore,E=_?.ceremony?.devices??[],D=ee(r).includes(`solana`),A=g===`mining`?[{id:`sweep`,label:`Sweep`,title:`Mining-only sweep after SAT claims.`}]:g===`agent`?[{id:`caps`,label:`Caps`,title:`Limits used by chat, scheduled sends, swaps, and approved automation.`},{id:`schedule`,label:`Send`,title:`One Agent-wallet recurring send policy shared by chat and Wallet UI.`},{id:`automation`,label:`Auto`,title:`Stop or resume background wallet execution for this Agent wallet.`},{id:`skills`,label:`Skills`,title:`Allow reviewed skills to use this Agent wallet after separate skill grants.`}]:[{id:`caps`,label:`Caps`,title:`Vault guardrails for reviewed Wallet UI sends only.`},{id:`custody`,label:`Security`,title:`Vault custody, unlock, recovery, and device controls.`}],j=a.policyPanel&&A.some(e=>e.id===a.policyPanel)?a.policyPanel:A[0]?.id??`caps`,P=i(a.recurringTransferCron??``),F=String(a.recurringTransferMint??``).trim(),I=F?`token`:`SOL`,L=e=>a.onPolicyDraftChange({recurringTransferCron:o({every:e.every??P.every,unit:e.unit??P.unit,time:e.time??P.time})});return e`
1838
+ ${T.map(r=>{let s=q(r,a,K(a)===r.id),c=String(a.balanceWalletId??``).trim(),u=r.id===I&&R===`balance`,d=r.id===I&&R===`security`,f=((u||d)&&r.id===(c||a.balances?.walletId)?de(r,a).filter(e=>e.chain===`solana`):[]).filter(e=>!e.isNative),p=r.addresses?.solana||``,m=`wallet-address-${Ee(r.id)}`,h=s,g=E(r.id,a),_=g===`agent`&&r.id===a.walletDetailsWalletId&&l?l.policy.directSigning:void 0,v=r.id===a.walletDetailsWalletId?l?.signerPolicy:void 0,y=r.providerId!==`local-socket-signer`||v?.state===`acknowledged`,S=ee(r).includes(`solana`),w=g===`mining`?[{id:`sweep`,label:`Sweep`,title:`Mining-only sweep after SAT claims.`}]:g===`agent`?[{id:`caps`,label:`Caps`,title:`Limits used by chat, scheduled sends, swaps, and approved automation.`},{id:`schedule`,label:`Send`,title:`One Agent-wallet recurring send policy shared by chat and Wallet UI.`},{id:`automation`,label:`Auto`,title:`Stop or resume background wallet execution for this Agent wallet.`},{id:`skills`,label:`Skills`,title:`Allow reviewed skills to use this Agent wallet after separate skill grants.`}]:[{id:`caps`,label:`Caps`,title:`Vault guardrails for reviewed Wallet UI sends only.`}],T=a.policyPanel&&w.some(e=>e.id===a.policyPanel)?a.policyPanel:w[0]?.id??`caps`,O=i(a.recurringTransferCron??``),M=String(a.recurringTransferMint??``).trim(),N=M?`token`:`SOL`,P=e=>a.onPolicyDraftChange({recurringTransferCron:o({every:e.every??O.every,unit:e.unit??O.unit,time:e.time??O.time})});return e`
1774
1839
  <div class="wallet-card" title=${r.id}>
1775
1840
  <div class="wallet-card__header">
1776
1841
  <div class="wallet-card__identity">
1777
1842
  <div class="wallet-card__title-row">
1778
1843
  <div class="wallet-card__title">${r.name}</div>
1779
- ${ne(r.id,a.federationBond,a.onNavigate)}
1780
- ${g===`mining`?ae(a.miningProfile):t}
1781
- ${oe({walletId:r.id,role:g,custody:_,props:a})}
1782
- ${ie({custody:_,role:g,automationEnabled:v})}
1844
+ ${te(r.id,a.federationBond,a.onNavigate)}
1845
+ ${g===`mining`?re(a.miningProfile):t}
1846
+ ${ie({walletId:r.id,role:g,props:a})}
1847
+ ${ne({role:g,automationEnabled:_})}
1783
1848
  </div>
1784
1849
  <div class="wallet-card__address-row">
1785
1850
  ${p?e`
@@ -1803,17 +1868,17 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1803
1868
  class="wallet-icon-btn"
1804
1869
  title="Show wallet address"
1805
1870
  aria-label="Show wallet address"
1806
- @click=${()=>Ae(m,`******`,p)}
1871
+ @click=${()=>De(m,`******`,p)}
1807
1872
  >
1808
1873
  <span class="wallet-copy-btn__icon">${n.eye}</span>
1809
1874
  </button>
1810
- ${je(p,`wallet address`)}
1875
+ ${Oe(p,`wallet address`)}
1811
1876
  ${Z(Q(`solana`,`address`,p),`Open wallet address`)}
1812
1877
  </span>
1813
1878
  `:e`
1814
1879
  <span class="muted">No wallet address</span>
1815
1880
  `}
1816
- ${Me({value:`@wallet:${r.id}`,display:`@wallet:${r.id}`,label:`wallet handle`,title:g===`mining`?`Copy wallet handle. Mining wallets are reserved for SAT mining and SAT sweep.`:`Copy wallet handle for approved chat, skill, plugin, or scheduled wallet actions.`,className:`mono wallet-card__handle`})}
1881
+ ${ke({value:`@wallet:${r.id}`,display:`@wallet:${r.id}`,label:`wallet handle`,title:g===`mining`?`Copy wallet handle. Mining wallets are reserved for SAT mining and SAT sweep.`:`Copy wallet handle for approved chat, skill, plugin, or scheduled wallet actions.`,className:`mono wallet-card__handle`})}
1817
1882
  </div>
1818
1883
  </div>
1819
1884
  <div class="row" style="gap: 8px;">
@@ -1827,10 +1892,11 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1827
1892
  </div>
1828
1893
  <div class="wallet-card__balance-row">
1829
1894
  <div class="wallet-card__balance-main">
1830
- ${Pe(`SOL`,h,`neutral`,{title:`Solana`,onClick:r.addresses?.solana?()=>(a.onWalletBalanceWalletChange??a.onWalletDetailsWalletChange)(r.id):void 0})}
1895
+ ${je(`SOL`,h,`neutral`,{title:`Solana`,onClick:r.addresses?.solana?()=>(a.onWalletBalanceWalletChange??a.onWalletDetailsWalletChange)(r.id):void 0})}
1831
1896
  <button
1832
1897
  class="btn small primary wallet-card__send-btn"
1833
- ?disabled=${!x}
1898
+ ?disabled=${!x||!y}
1899
+ title=${y?`Send from this wallet`:`Receive-only: open Policy and complete signer activation first`}
1834
1900
  @click=${()=>a.onSendModalOpen(r.id)}
1835
1901
  >
1836
1902
  Send
@@ -1855,13 +1921,13 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1855
1921
  <button
1856
1922
  class="btn small"
1857
1923
  style="display: inline-flex; gap: 8px; align-items: center;"
1858
- ?disabled=${!x}
1924
+ ?disabled=${!x||!y}
1859
1925
  @click=${()=>a.onSendModalOpen(r.id,n.id)}
1860
1926
  >
1861
- ${be(n,20)}
1927
+ ${_e(n,20)}
1862
1928
  <span>${n.symbol}</span>
1863
1929
  <span class="muted"
1864
- >${J(n.amountDisplay)}</span
1930
+ >${Y(n.amountDisplay)}</span
1865
1931
  >
1866
1932
  </button>
1867
1933
  ${n.program?Z(Q(`solana`,`address`,n.program),`Open ${n.symbol} mint`):t}
@@ -1875,40 +1941,48 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1875
1941
  <div class="muted" style="font-size: 0.85em">Balance loaded. No SPL token balances detected.</div>
1876
1942
  `:t}
1877
1943
  </div>
1878
- ${d&&_?e`
1944
+ ${d?e`
1879
1945
  <div id="wallet-security-card" class="wallet-card-security">
1880
1946
  <div class="wallet-policy-tabs" role="tablist" aria-label="Wallet policy sections">
1881
- ${A.map(t=>e`
1947
+ ${w.map(t=>e`
1882
1948
  <button
1883
1949
  type="button"
1884
1950
  class="wallet-policy-tab"
1885
- data-active=${j===t.id?`true`:`false`}
1951
+ data-active=${T===t.id?`true`:`false`}
1886
1952
  title=${t.title}
1887
1953
  role="tab"
1888
- aria-selected=${j===t.id?`true`:`false`}
1954
+ aria-selected=${T===t.id?`true`:`false`}
1889
1955
  @click=${()=>a.onPolicyPanelChange?.(t.id)}
1890
1956
  >
1891
1957
  ${t.label}
1892
1958
  </button>
1893
1959
  `)}
1894
1960
  </div>
1895
- ${S?e`
1896
- <div class="callout warn" style="margin-top: 10px">
1897
- This Agent wallet is automated but still has stale split-key security attached. Marketplace Pay
1898
- cannot sign until that stale security is disabled or this Agent role is moved to a normal Agent wallet.
1899
- <div class="wallet-card-security__actions" style="margin-top: 10px;">
1900
- <button
1901
- class="btn danger"
1902
- title="Requires Wallet Control Passkey plus this wallet's stored device share, pasted device share, or recovery share."
1903
- ?disabled=${(a.actionBusy??!1)||!a.onDisableCustody||!O}
1904
- @click=${()=>a.onDisableCustody?.(r.id)}
1905
- >
1906
- Disable stale security
1907
- </button>
1908
- </div>
1961
+ ${v?e`
1962
+ <div
1963
+ class="callout ${v.state===`acknowledged`?`success`:`warn`}"
1964
+ style="margin-top: 10px"
1965
+ data-testid="wallet-signer-policy-status"
1966
+ >
1967
+ <strong>Native signer policy: ${v.state}</strong>
1968
+ ${v.state===`locked`?e`
1969
+ <div>
1970
+ This wallet cannot send, swap, mine, bond, or execute wallet-capable skills until a host
1971
+ administrator installs an owner-reviewed policy and the signer acknowledges its exact hash.
1972
+ </div>
1973
+ `:t}
1974
+ ${v.version&&v.hash?e`
1975
+ <div>
1976
+ Version ${v.version} ·
1977
+ <span class="mono" style="overflow-wrap: anywhere"
1978
+ >${v.hash}</span
1979
+ >
1980
+ </div>
1981
+ `:t}
1982
+ ${v.guidance?e`<div>${v.guidance}</div>`:t}
1909
1983
  </div>
1910
1984
  `:t}
1911
- ${g===`mining`?j===`sweep`?e`
1985
+ ${g===`mining`?T===`sweep`?e`
1912
1986
  <div class="field">
1913
1987
  <div class="wallet-card-security__grid">
1914
1988
  <label class="field">
@@ -1919,13 +1993,13 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1919
1993
  >
1920
1994
  <option
1921
1995
  value="disabled"
1922
- ?selected=${!V.enabled}
1996
+ ?selected=${!D.enabled}
1923
1997
  >
1924
1998
  Off
1925
1999
  </option>
1926
2000
  <option
1927
2001
  value="enabled"
1928
- ?selected=${V.enabled}
2002
+ ?selected=${D.enabled}
1929
2003
  >
1930
2004
  On
1931
2005
  </option>
@@ -1934,38 +2008,38 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1934
2008
  <label class="field">
1935
2009
  <span>Destination</span>
1936
2010
  <select
1937
- ?disabled=${a.settingsBusy||!V.enabled||!a.onMiningSatSweepChange}
1938
- @change=${e=>{let t=e.currentTarget.value;a.onMiningSatSweepChange?.(t===`__external__`?{destinationWalletId:void 0,destinationAddress:V.destinationAddress??``}:{destinationWalletId:t||void 0,destinationAddress:void 0})}}
2011
+ ?disabled=${a.settingsBusy||!D.enabled||!a.onMiningSatSweepChange}
2012
+ @change=${e=>{let t=e.currentTarget.value;a.onMiningSatSweepChange?.(t===`__external__`?{destinationWalletId:void 0,destinationAddress:D.destinationAddress??``}:{destinationWalletId:t||void 0,destinationAddress:void 0})}}
1939
2013
  >
1940
2014
  <option
1941
2015
  value="__external__"
1942
- ?selected=${U===`external`}
2016
+ ?selected=${F===`external`}
1943
2017
  >
1944
2018
  External
1945
2019
  </option>
1946
- ${H.map(t=>e`
2020
+ ${j.map(t=>e`
1947
2021
  <option
1948
2022
  value=${t.id}
1949
- ?selected=${V.destinationWalletId===t.id}
2023
+ ?selected=${D.destinationWalletId===t.id}
1950
2024
  >
1951
2025
  ${t.name}
1952
2026
  </option>
1953
2027
  `)}
1954
2028
  </select>
1955
2029
  </label>
1956
- ${U===`external`?e`
2030
+ ${F===`external`?e`
1957
2031
  <label class="field">
1958
2032
  <span>Address</span>
1959
2033
  <input
1960
2034
  type="text"
1961
- .value=${V.destinationAddress??``}
1962
- ?disabled=${a.settingsBusy||!V.enabled||!a.onMiningSatSweepChange}
2035
+ .value=${D.destinationAddress??``}
2036
+ ?disabled=${a.settingsBusy||!D.enabled||!a.onMiningSatSweepChange}
1963
2037
  @change=${e=>a.onMiningSatSweepChange?.({destinationAddress:e.currentTarget.value.trim()||void 0,destinationWalletId:void 0})}
1964
2038
  placeholder="Solana address"
1965
2039
  />
1966
2040
  </label>
1967
2041
  `:t}
1968
- ${V.mode===`percentage`?e`
2042
+ ${D.mode===`percentage`?e`
1969
2043
  <label class="field">
1970
2044
  <span>Percent</span>
1971
2045
  <input
@@ -1973,8 +2047,8 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1973
2047
  min="1"
1974
2048
  max="100"
1975
2049
  step="1"
1976
- .value=${String(V.percentage??100)}
1977
- ?disabled=${a.settingsBusy||!V.enabled||!a.onMiningSatSweepChange}
2050
+ .value=${String(D.percentage??100)}
2051
+ ?disabled=${a.settingsBusy||!D.enabled||!a.onMiningSatSweepChange}
1978
2052
  @change=${e=>a.onMiningSatSweepChange?.({percentage:Math.max(1,Math.min(100,Number(e.currentTarget.value)||100))})}
1979
2053
  />
1980
2054
  </label>
@@ -1982,18 +2056,18 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1982
2056
  <label class="field">
1983
2057
  <span>Amount</span>
1984
2058
  <select
1985
- ?disabled=${a.settingsBusy||!V.enabled||!a.onMiningSatSweepChange}
2059
+ ?disabled=${a.settingsBusy||!D.enabled||!a.onMiningSatSweepChange}
1986
2060
  @change=${e=>a.onMiningSatSweepChange?.({mode:e.currentTarget.value===`percentage`?`percentage`:`all`})}
1987
2061
  >
1988
2062
  <option
1989
2063
  value="all"
1990
- ?selected=${V.mode!==`percentage`}
2064
+ ?selected=${D.mode!==`percentage`}
1991
2065
  >
1992
2066
  All
1993
2067
  </option>
1994
2068
  <option
1995
2069
  value="percentage"
1996
- ?selected=${V.mode===`percentage`}
2070
+ ?selected=${D.mode===`percentage`}
1997
2071
  >
1998
2072
  %
1999
2073
  </option>
@@ -2004,9 +2078,9 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2004
2078
  <input
2005
2079
  type="text"
2006
2080
  inputmode="decimal"
2007
- .value=${se(V.minRaw??`1`)}
2008
- ?disabled=${a.settingsBusy||!V.enabled||!a.onMiningSatSweepChange}
2009
- @change=${e=>a.onMiningSatSweepChange?.({minRaw:M(e.currentTarget.value)})}
2081
+ .value=${k(D.minRaw??`1`)}
2082
+ ?disabled=${a.settingsBusy||!D.enabled||!a.onMiningSatSweepChange}
2083
+ @change=${e=>a.onMiningSatSweepChange?.({minRaw:A(e.currentTarget.value)})}
2010
2084
  placeholder="1"
2011
2085
  />
2012
2086
  </label>
@@ -2015,23 +2089,17 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2015
2089
  <input
2016
2090
  type="text"
2017
2091
  inputmode="decimal"
2018
- .value=${se(V.keepRaw??`0`)}
2019
- ?disabled=${a.settingsBusy||!V.enabled||!a.onMiningSatSweepChange}
2020
- @change=${e=>a.onMiningSatSweepChange?.({keepRaw:M(e.currentTarget.value)})}
2092
+ .value=${k(D.keepRaw??`0`)}
2093
+ ?disabled=${a.settingsBusy||!D.enabled||!a.onMiningSatSweepChange}
2094
+ @change=${e=>a.onMiningSatSweepChange?.({keepRaw:A(e.currentTarget.value)})}
2021
2095
  placeholder="0"
2022
2096
  />
2023
2097
  </label>
2024
2098
  </div>
2025
2099
  </div>
2026
2100
  `:t:e`
2027
- ${j===`custody`&&g===`vault`&&!O?e`
2028
- <div class="callout warn">Enable Wallet Control Passkey first to turn on wallet security.</div>
2029
- `:t}
2030
- ${j===`custody`&&g===`vault`&&T?e`
2031
- <div class="callout warn">This wallet has no local signer key yet.</div>
2032
- `:t}
2033
- ${l&&j===`caps`?ye({props:a,settings:l,policyDisplay:te,cardRole:g,selectedWalletId:r.id,cardWalletCanSpendSolana:D,selectedWalletTokens:f,canEditPolicy:b}):t}
2034
- ${g===`agent`&&j===`schedule`?e`
2101
+ ${l&&T===`caps`?ge({props:a,settings:l,policyDisplay:C,cardRole:g,selectedWalletId:r.id,cardWalletCanSpendSolana:S,selectedWalletTokens:f,canEditPolicy:b}):t}
2102
+ ${g===`agent`&&T===`schedule`?e`
2035
2103
  <div class="field">
2036
2104
  <div class="wallet-card-security__grid">
2037
2105
  <label class="field">
@@ -2063,7 +2131,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2063
2131
  @input=${e=>a.onPolicyDraftChange({recurringTransferMint:e.currentTarget.value})}
2064
2132
  />
2065
2133
  </label>
2066
- ${F?e`
2134
+ ${M?e`
2067
2135
  <label class="field">
2068
2136
  <span>Decimals</span>
2069
2137
  <input
@@ -2100,7 +2168,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2100
2168
  <label class="field">
2101
2169
  <span>Minimum</span>
2102
2170
  <input
2103
- placeholder=${`0.01 ${I}`}
2171
+ placeholder=${`0.01 ${N}`}
2104
2172
  .value=${a.recurringTransferMinAmount}
2105
2173
  ?disabled=${a.settingsBusy||!b}
2106
2174
  @input=${e=>a.onPolicyDraftChange({recurringTransferMinAmount:e.currentTarget.value})}
@@ -2109,7 +2177,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2109
2177
  <label class="field">
2110
2178
  <span>Keep</span>
2111
2179
  <input
2112
- placeholder=${`0 ${I}`}
2180
+ placeholder=${`0 ${N}`}
2113
2181
  .value=${a.recurringTransferKeepAmount}
2114
2182
  ?disabled=${a.settingsBusy||!b}
2115
2183
  @input=${e=>a.onPolicyDraftChange({recurringTransferKeepAmount:e.currentTarget.value})}
@@ -2119,7 +2187,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2119
2187
  <label class="field">
2120
2188
  <span>Amount</span>
2121
2189
  <input
2122
- placeholder=${`0.1 ${I}`}
2190
+ placeholder=${`0.1 ${N}`}
2123
2191
  .value=${a.recurringTransferAmount}
2124
2192
  ?disabled=${a.settingsBusy||!b}
2125
2193
  @input=${e=>a.onPolicyDraftChange({recurringTransferAmount:e.currentTarget.value})}
@@ -2133,17 +2201,17 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2133
2201
  min="1"
2134
2202
  step="1"
2135
2203
  placeholder="1"
2136
- .value=${P.every}
2204
+ .value=${O.every}
2137
2205
  ?disabled=${a.settingsBusy||!b}
2138
- @input=${e=>L({every:e.currentTarget.value})}
2206
+ @input=${e=>P({every:e.currentTarget.value})}
2139
2207
  />
2140
2208
  </label>
2141
2209
  <label class="field">
2142
2210
  <span>Unit</span>
2143
2211
  <select
2144
- .value=${P.unit}
2212
+ .value=${O.unit}
2145
2213
  ?disabled=${a.settingsBusy||!b}
2146
- @change=${e=>L({unit:e.currentTarget.value})}
2214
+ @change=${e=>P({unit:e.currentTarget.value})}
2147
2215
  >
2148
2216
  <option value="minutes">minutes</option>
2149
2217
  <option value="hours">hours</option>
@@ -2151,14 +2219,14 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2151
2219
  <option value="months">months</option>
2152
2220
  </select>
2153
2221
  </label>
2154
- ${P.unit===`days`||P.unit===`months`?e`
2222
+ ${O.unit===`days`||O.unit===`months`?e`
2155
2223
  <label class="field">
2156
2224
  <span>At</span>
2157
2225
  <input
2158
2226
  type="time"
2159
- .value=${P.time}
2227
+ .value=${O.time}
2160
2228
  ?disabled=${a.settingsBusy||!b}
2161
- @input=${e=>L({time:e.currentTarget.value})}
2229
+ @input=${e=>P({time:e.currentTarget.value})}
2162
2230
  />
2163
2231
  </label>
2164
2232
  `:t}
@@ -2188,14 +2256,14 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2188
2256
  ${a.settingsBusy?`Saving...`:`Save`}
2189
2257
  </button>
2190
2258
  </div>
2191
- ${P.custom?e`
2192
- <div class="wallet-custody-note" style="margin-top: 8px">
2259
+ ${O.custom?e`
2260
+ <div class="wallet-security-note" style="margin-top: 8px">
2193
2261
  Existing custom schedule is preserved until you edit Every, Unit, or At.
2194
2262
  </div>
2195
2263
  `:t}
2196
2264
  </div>
2197
2265
  `:t}
2198
- ${g===`agent`&&j===`automation`?e`
2266
+ ${g===`agent`&&T===`automation`?e`
2199
2267
  ${e`
2200
2268
  <div class="field">
2201
2269
  <div class="wallet-spend-limit-row">
@@ -2221,7 +2289,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2221
2289
  </div>
2222
2290
  `}
2223
2291
  `:t}
2224
- ${g===`agent`&&j===`skills`?e`
2292
+ ${g===`agent`&&T===`skills`?e`
2225
2293
  ${e`
2226
2294
  <div class="field">
2227
2295
  <div class="wallet-spend-limit-row">
@@ -2247,186 +2315,6 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2247
2315
  </div>
2248
2316
  `}
2249
2317
  `:t}
2250
- ${g===`vault`&&j===`custody`?e`
2251
- <div class="wallet-card-security__actions">
2252
- ${_.mode===`single-key`?e`
2253
- <button
2254
- class="btn primary"
2255
- ?disabled=${(a.actionBusy??!1)||!a.onInitializeCustody||T||!O}
2256
- @click=${()=>a.onInitializeCustody?.()}
2257
- >
2258
- ${a.actionBusy?`Working...`:`Enable security`}
2259
- </button>
2260
- ${O?t:e`
2261
- <span class="wallet-card-security__note"> Wallet Control Passkey required first. </span>
2262
- `}
2263
- `:e`
2264
- <label
2265
- class="field"
2266
- style="max-width: 140px; margin: 0;"
2267
- >
2268
- <span>Unlock</span>
2269
- <select
2270
- .value=${a.custodyUnlockMinutes??`manual`}
2271
- ?disabled=${a.actionBusy??!1}
2272
- @change=${e=>a.onCustodyUnlockMinutesChange?.(e.currentTarget.value)}
2273
- >
2274
- <option value="manual">Until lock</option>
2275
- <option value="15">15 min</option>
2276
- <option value="60">60 min</option>
2277
- </select>
2278
- </label>
2279
- <button
2280
- class="btn primary"
2281
- ?disabled=${(a.actionBusy??!1)||!a.onUnlockCustody||!O}
2282
- @click=${()=>a.onUnlockCustody?.()}
2283
- >
2284
- ${y?`Extend`:`Unlock`}
2285
- </button>
2286
- <button
2287
- class="btn"
2288
- ?disabled=${(a.actionBusy??!1)||!y||!a.onLockCustody}
2289
- @click=${()=>a.onLockCustody?.()}
2290
- >
2291
- Lock
2292
- </button>
2293
- <button
2294
- class="btn"
2295
- ?disabled=${(a.actionBusy??!1)||!a.onEnrollCustodyDevice||!O}
2296
- @click=${()=>a.onEnrollCustodyDevice?.()}
2297
- >
2298
- Add device
2299
- </button>
2300
- `}
2301
- </div>
2302
- ${_.mode===`single-key`?t:e`
2303
- <div class="wallet-card-security__note">
2304
- ${w}
2305
- </div>
2306
- <div class="wallet-card-security__actions">
2307
- <button
2308
- class="btn danger"
2309
- title="Turns this wallet back to normal local-signer mode. Requires Wallet Control Passkey plus this wallet's device share or recovery share."
2310
- ?disabled=${(a.actionBusy??!1)||!a.onDisableCustody||!O}
2311
- @click=${()=>a.onDisableCustody?.(r.id)}
2312
- >
2313
- Disable security
2314
- </button>
2315
- </div>
2316
- `}
2317
- ${a.custodyRecoveryShare?.trim()?e`
2318
- <div class="field">
2319
- <span>New recovery share</span>
2320
- <textarea readonly rows="3"
2321
- >${a.custodyRecoveryShare}</textarea
2322
- >
2323
- <div class="wallet-card-security__actions">
2324
- <button
2325
- class="btn"
2326
- ?disabled=${(a.actionBusy??!1)||!a.onDownloadRecoveryKit}
2327
- @click=${()=>a.onDownloadRecoveryKit?.()}
2328
- >
2329
- Download recovery kit
2330
- </button>
2331
- <button
2332
- class="btn"
2333
- ?disabled=${(a.actionBusy??!1)||!a.onPrintRecoveryKit}
2334
- @click=${()=>a.onPrintRecoveryKit?.()}
2335
- >
2336
- Print
2337
- </button>
2338
- </div>
2339
- </div>
2340
- `:t}
2341
- ${a.custodyEnrolledDeviceShare?.trim()?e`
2342
- <div class="field">
2343
- <span>New device share</span>
2344
- <textarea readonly rows="3"
2345
- >${a.custodyEnrolledDeviceShare}</textarea
2346
- >
2347
- <div class="wallet-card-security__actions">
2348
- <button
2349
- class="btn"
2350
- ?disabled=${(a.actionBusy??!1)||!a.onDownloadEnrolledDeviceShare}
2351
- @click=${()=>a.onDownloadEnrolledDeviceShare?.()}
2352
- >
2353
- Download device share
2354
- </button>
2355
- </div>
2356
- </div>
2357
- `:t}
2358
- ${E.length>0?e`
2359
- <div class="field">
2360
- <span>Enrolled devices</span>
2361
- <div class="wallet-custody-device-list">
2362
- ${E.map(t=>e`
2363
- <div class="wallet-custody-device-row">
2364
- <div>
2365
- <div>${t.label||t.id}</div>
2366
- <div class="wallet-card-security__note mono">
2367
- ${X(t.id)} ·
2368
- ${new Date(t.createdAt).toLocaleString()}
2369
- </div>
2370
- </div>
2371
- <button
2372
- class="btn small"
2373
- ?disabled=${(a.actionBusy??!1)||E.length<=1||!a.onRevokeCustodyDevice}
2374
- @click=${()=>a.onRevokeCustodyDevice?.(t.id)}
2375
- >
2376
- Revoke
2377
- </button>
2378
- </div>
2379
- `)}
2380
- </div>
2381
- </div>
2382
- `:t}
2383
- ${_.mode===`single-key`?t:e`
2384
- <details class="wallet-advanced-box">
2385
- <summary>Recovery and device transfer</summary>
2386
- <div class="wallet-recovery-grid">
2387
- <label class="field">
2388
- <span>Temporary device share</span>
2389
- <input
2390
- .value=${a.custodyDeviceShare??``}
2391
- @input=${e=>a.onCustodyDeviceShareChange?.(e.target.value)}
2392
- placeholder="Paste only for recovery or moving devices"
2393
- />
2394
- </label>
2395
- <label class="field">
2396
- <span>Recovery share</span>
2397
- <input
2398
- .value=${a.custodyRecoveryInput??``}
2399
- @input=${e=>a.onCustodyRecoveryInputChange?.(e.target.value)}
2400
- placeholder="Paste offline recovery share"
2401
- />
2402
- </label>
2403
- </div>
2404
- <div class="wallet-card-security__actions">
2405
- <button
2406
- class="btn"
2407
- ?disabled=${(a.actionBusy??!1)||!a.onRecoverCustody}
2408
- @click=${()=>a.onRecoverCustody?.()}
2409
- >
2410
- ${a.actionBusy?`Working...`:`Recover here`}
2411
- </button>
2412
- <button
2413
- class="btn"
2414
- ?disabled=${(a.actionBusy??!1)||!a.custodyDeviceShareStored||!a.onForgetCustodyDeviceShare}
2415
- @click=${()=>a.onForgetCustodyDeviceShare?.()}
2416
- >
2417
- Forget stored share
2418
- </button>
2419
- <button
2420
- class="btn"
2421
- ?disabled=${(a.actionBusy??!1)||!a.custodyDeviceShare?.trim()||!a.onDownloadDeviceShare}
2422
- @click=${()=>a.onDownloadDeviceShare?.()}
2423
- >
2424
- Download device share
2425
- </button>
2426
- </div>
2427
- </details>
2428
- `}
2429
- `:t}
2430
2318
  `}
2431
2319
  </div>
2432
2320
  `:t}
@@ -2443,9 +2331,9 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2443
2331
  <div>
2444
2332
  <div class="card-title wallet-title-with-help">
2445
2333
  <span>Wallet Approvals</span>
2446
- ${f(`Direct user Send creates a pending approval request here, and Approve is the step that triggers passkey and broadcast when passkey approval is enabled.`)}
2334
+ ${f(`Reviewed sends, Vault actions, and federation signatures appear here. Approve triggers the signer-owned passkey ceremony and executes only the exact prepared operation.`)}
2447
2335
  </div>
2448
- <div class="card-sub">Pending and recent send requests.</div>
2336
+ <div class="card-sub">Pending and recent reviewed wallet operations.</div>
2449
2337
  </div>
2450
2338
  <div class="row" style="gap: 8px; flex-wrap: wrap;">
2451
2339
  ${[`pending`,`approved`,`executed`,`failed`,`all`].map(t=>e`
@@ -2475,7 +2363,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2475
2363
  <div>Created</div>
2476
2364
  <div>Action</div>
2477
2365
  </div>
2478
- ${a.approvals.map(n=>{let i=le({request:n,balances:a.balances}),o=ue({request:n,namedWallets:a.namedWallets}),s=Array.isArray(n.payload.routeProgramIds)?n.payload.routeProgramIds.map(e=>String(e).trim()).filter(Boolean):[];return e`
2366
+ ${a.approvals.map(n=>{let i=oe({request:n,balances:a.balances}),o=se({request:n,namedWallets:a.namedWallets}),s=Array.isArray(n.payload.routeProgramIds)?n.payload.routeProgramIds.map(e=>String(e).trim()).filter(Boolean):[];return e`
2479
2367
  <div
2480
2368
  id=${r(`wallet-approval`,n.id)}
2481
2369
  class="table-row"
@@ -2486,14 +2374,15 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2486
2374
  <div class="muted" style="font-size: 0.8em; margin-top: 4px;">
2487
2375
  expires ${new Date(n.expiresAt).toLocaleString()}
2488
2376
  </div>
2489
- ${de({request:n,display:i,endpoints:o})}
2377
+ ${ce({request:n,display:i,endpoints:o})}
2378
+ ${le(n)}
2490
2379
  </div>
2491
2380
  <div>
2492
2381
  <div class="row" style="gap: 8px; align-items: center;">
2493
2382
  <span
2494
2383
  style="width: 16px; height: 16px; display: inline-flex; color: ${n.status===`failed`||n.status===`rejected`||n.status===`expired`?`rgba(248,113,113,0.95)`:n.status===`executed`||n.status===`approved`?`rgba(104,211,145,0.95)`:`rgba(96,165,250,0.95)`};"
2495
2384
  >
2496
- ${we(n.status)}
2385
+ ${xe(n.status)}
2497
2386
  </span>
2498
2387
  <span style="font-size: 0.9em; font-weight: 600; text-transform: lowercase;">
2499
2388
  ${n.status}
@@ -2597,7 +2486,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2597
2486
  </div>
2598
2487
  `}
2599
2488
  </div>
2600
- ${K===`wallets`?e`<div class="card wallet-activity-card" style="grid-column: 1 / -1;">
2489
+ ${z===`wallets`?e`<div class="card wallet-activity-card" style="grid-column: 1 / -1;">
2601
2490
  <div class="wallet-activity-card__head">
2602
2491
  <div>
2603
2492
  <div class="card-title">Wallet Activity</div>
@@ -2630,12 +2519,12 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2630
2519
  </div>
2631
2520
  </div>
2632
2521
  <div class="wallet-activity-list">
2633
- ${y.map(n=>{let r=n.details??{},i=L(r.chain),o=i===`solana`?B(r,`program`):``,s=ce({details:r,balances:a.balances}),c=F(r.to,`n/a`),l=F(r.txHash||r.txId,``),u=F(r.reason,``),d=F(r.orderId,``),f=F(r.vaultPubkey,``),p=F(r.externalVault,``),m=Le(n.action);return e`
2522
+ ${y.map(n=>{let r=n.details??{},i=P(r.chain),o=i===`solana`?L(r,`program`):``,s=ae({details:r,balances:a.balances}),c=M(r.to,`n/a`),l=M(r.txHash||r.txId,``),u=M(r.reason,``),d=M(r.orderId,``),f=M(r.vaultPubkey,``),p=M(r.executionProvider,``),m=Pe(n.action);return e`
2634
2523
  <div class="wallet-activity-item" data-tone=${m}>
2635
2524
  <div class="wallet-activity-item__head">
2636
2525
  <div class="wallet-activity-item__title">
2637
- <span style="color: ${m===`danger`?`var(--danger)`:m===`success`?`var(--ok)`:m===`warn`?`var(--warn)`:`var(--muted)`};">${Te(n.action)}</span>
2638
- <span>${Ce(n)}</span>
2526
+ <span style="color: ${m===`danger`?`var(--danger)`:m===`success`?`var(--ok)`:m===`warn`?`var(--warn)`:`var(--muted)`};">${Se(n.action)}</span>
2527
+ <span>${be(n)}</span>
2639
2528
  </div>
2640
2529
  <div class="wallet-activity-item__time">
2641
2530
  ${new Date(n.at).toLocaleString()}
@@ -2643,7 +2532,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2643
2532
  </div>
2644
2533
  <div class="wallet-activity-item__facts">
2645
2534
  ${o?t:e`<span class="wallet-status-chip"
2646
- >${i?I(i):`n/a`}</span
2535
+ >${i?N(i):`n/a`}</span
2647
2536
  >`}
2648
2537
  <span class="wallet-status-chip">${s}</span>
2649
2538
  ${p?e`<span class="wallet-status-chip">${p}</span>`:t}
@@ -2668,7 +2557,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2668
2557
  </div>
2669
2558
  `:t}
2670
2559
  </section>
2671
- `}function ze(n){if(!n.sendModalVisible)return t;let r=n.status?.capabilities?.canSend??!0,i=n.namedWallets.find(e=>e.id===n.sendCreateForm.walletId),{selected:a,options:o}=xe(i,n),s=[...new Set(o.map(e=>e.chain))],c=a?.chain??s[0]??n.sendCreateForm.chain,l=s.includes(n.sendCreateForm.chain)?n.sendCreateForm.chain:c,u=q(i,l),d=a&&a.chain===l?a:void 0,f=d?.symbol||`SOL`,p=i?`${i.name} (@wallet:${i.id})`:`Default wallet`,m=i?re(i.id,n):null,h=!!(i?.id&&m?.mode===`split-key-active`&&!m.unlock?.active);return e`
2560
+ `}function Ie(n){if(!n.sendModalVisible)return t;let r=n.status?.capabilities?.canSend??!0,i=n.namedWallets.find(e=>e.id===n.sendCreateForm.walletId),{selected:a,options:o}=ve(i,n),s=[...new Set(o.map(e=>e.chain))],c=a?.chain??s[0]??n.sendCreateForm.chain,l=s.includes(n.sendCreateForm.chain)?n.sendCreateForm.chain:c,u=J(i,l),d=a&&a.chain===l?a:void 0,f=d?.symbol||`SOL`,p=i?`${i.name} (@wallet:${i.id})`:`Default wallet`;return e`
2672
2561
  <div class="modal-overlay" @click=${n.onSendModalClose}>
2673
2562
  <div class="modal-card card" @click=${e=>e.stopPropagation()}>
2674
2563
  <div class="row" style="justify-content: space-between; align-items: center; margin-bottom: 16px;">
@@ -2684,13 +2573,6 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2684
2573
  <button class="btn small" @click=${n.onSendModalClose}>Close</button>
2685
2574
  </div>
2686
2575
 
2687
- ${h?e`
2688
- <div class="callout warn" style="margin-bottom: 16px">
2689
- This wallet is locked. You can create the approval request now, but it must be unlocked with
2690
- passkey before approval can sign and broadcast.
2691
- </div>
2692
- `:t}
2693
-
2694
2576
  <div class="wallet-send-form-grid">
2695
2577
  <div class="wallet-send-column">
2696
2578
  <label class="field wallet-send-field">
@@ -2702,7 +2584,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2702
2584
  >
2703
2585
  ${o.map(t=>e`
2704
2586
  <option value=${t.id} ?selected=${t.id===d?.id}>
2705
- ${t.symbol}${t.name&&t.name!==t.symbol?` · ${t.name}`:``} · ${J(t.amountDisplay)}
2587
+ ${t.symbol}${t.name&&t.name!==t.symbol?` · ${t.name}`:``} · ${Y(t.amountDisplay)}
2706
2588
  </option>
2707
2589
  `)}
2708
2590
  </select>
@@ -2846,5 +2728,5 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2846
2728
  }
2847
2729
  }
2848
2730
  </style>
2849
- `}export{u as describeAdminControlShortcut,O as describeAgentDefaultAction,p as describeWalletAutomationPolicySummary,te as describeWalletRoleBadges,d as describeWalletSendFlow,h as hasWalletBalanceValue,j as orderWalletsForDisplay,Re as renderWallet,m as resolveActiveMiningWalletId,S as resolveOperatorWalletRoles};
2850
- //# sourceMappingURL=wallet-C2g294QT.js.map
2731
+ `}export{u as describeAdminControlShortcut,T as describeAgentDefaultAction,p as describeWalletAutomationPolicySummary,C as describeWalletRoleBadges,d as describeWalletSendFlow,h as hasWalletBalanceValue,O as orderWalletsForDisplay,Fe as renderWallet,m as resolveActiveMiningWalletId,S as resolveOperatorWalletRoles};
2732
+ //# sourceMappingURL=wallet-DvStR_AT.js.map