@fased/fased 0.1.66 → 0.1.68

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 (175) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +4 -0
  3. package/config/signer-protocol-v2.json +4 -0
  4. package/dist/brand.js +1 -1
  5. package/dist/build-info.json +3 -3
  6. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  7. package/dist/cli/program/register.wallet.js +33 -2
  8. package/dist/commands/onboard.js +0 -8
  9. package/dist/commands/wallet.js +485 -58
  10. package/dist/control-ui/assets/{app-DYxADzeH.js → app-DyPTS0oM.js} +1526 -1526
  11. package/dist/control-ui/assets/{index-vw_10Zeo.js → index-Cu13yYHr.js} +3 -3
  12. package/dist/control-ui/assets/{wallet-DvStR_AT.js → wallet-ByKBcYhm.js} +272 -188
  13. package/dist/control-ui/index.html +1 -1
  14. package/dist/control-ui/version.json +1 -1
  15. package/dist/gateway/server-http.js +349 -47
  16. package/dist/infra/runtime-guard.js +16 -0
  17. package/dist/plugin-sdk/{actions-DRu135h0.js → actions-B-Vwj64K.js} +3 -3
  18. package/dist/plugin-sdk/{allow-list-DyAxs4yw.js → allow-list-Bf45HfoP.js} +1 -1
  19. package/dist/plugin-sdk/{audio-preflight-BFLoas5R.js → audio-preflight-_FVQjR1r.js} +26 -25
  20. package/dist/plugin-sdk/{audit-C5d2z5U1.js → audit-CUULWG22.js} +1 -1
  21. package/dist/plugin-sdk/{channel-access-configure-DaI5wevh.js → channel-access-configure-BoUsC-Ys.js} +1 -1
  22. package/dist/plugin-sdk/{channel-adapters.discord-BS4S4Svh.js → channel-adapters.discord-DSiR4X2Y.js} +1 -1
  23. package/dist/plugin-sdk/channel-plugin-common.d.ts +2 -2
  24. package/dist/plugin-sdk/channel-plugin-common.js +1 -1
  25. package/dist/plugin-sdk/{chunk-CyoyqpbG.js → chunk-CBpl-AiQ.js} +1 -1
  26. package/dist/plugin-sdk/{chunk-items-TErs62MC.js → chunk-items-LH4uKSnh.js} +1 -1
  27. package/dist/plugin-sdk/command-status.js +26 -25
  28. package/dist/plugin-sdk/{commands-registry-BfqdEWdF.js → commands-registry-G5KXSi_y.js} +1 -1
  29. package/dist/plugin-sdk/{config-schema-BPnaDBwZ.js → config-schema-DjU_uD-6.js} +192 -94
  30. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  31. package/dist/plugin-sdk/{diagnostic-DLL_zekv.js → diagnostic-sYs6Agr-.js} +1 -1
  32. package/dist/plugin-sdk/{directory-live-CSuYxdwk.js → directory-live-BXMpuYAF.js} +1 -1
  33. package/dist/plugin-sdk/{directory-live-Dw7ZgC9_.js → directory-live-Rn1BzPof.js} +1 -1
  34. package/dist/plugin-sdk/discord.d.ts +4 -4
  35. package/dist/plugin-sdk/discord.js +20 -20
  36. package/dist/plugin-sdk/{draft-stream-controls-BqchW1vi.js → draft-stream-controls-CMNdKSx-.js} +1 -1
  37. package/dist/plugin-sdk/{guilds-CDhRIX57.js → guilds-Dkwl0yHv.js} +1 -1
  38. package/dist/plugin-sdk/{handle-action-hvwapMKg.js → handle-action-CRdM6B-8.js} +15 -15
  39. package/dist/plugin-sdk/index.d.ts +16 -16
  40. package/dist/plugin-sdk/index.js +28 -27
  41. package/dist/plugin-sdk/{login-Ca583Okc.js → login-D7WnK8-P.js} +1 -1
  42. package/dist/plugin-sdk/{login-qr-CGciBSNP.js → login-qr-CRueOKZK.js} +2 -114
  43. package/dist/plugin-sdk/{markdown-tables-DCOXEUfZ.js → markdown-tables-d7GlUs5R.js} +1 -1
  44. package/dist/plugin-sdk/{media-CAdQF5TG.js → media-BAoaxCrt.js} +1 -1
  45. package/dist/plugin-sdk/{monitor-FuBPk-AL.js → monitor-DUMMbG4h.js} +34 -33
  46. package/dist/plugin-sdk/{monitor-sW6dQdX1.js → monitor-DXIM16Hj.js} +44 -43
  47. package/dist/plugin-sdk/{openresponses-http-CVZq0H-P.js → openresponses-http-C8lKwta1.js} +26 -25
  48. package/dist/plugin-sdk/{outbound-attachment-QqTnIhZL.js → outbound-attachment-CyXM3cAv.js} +1 -1
  49. package/dist/plugin-sdk/{outbound-BgVDdHxx.js → outbound-zB6llMGW.js} +6 -6
  50. package/dist/plugin-sdk/{pairing-message-L6L6L2YF.d.ts → pairing-message-mKO92L-M.d.ts} +1 -1
  51. package/dist/plugin-sdk/{pairing-store-BChahgI2.js → pairing-store-B6J2C0vP.js} +1 -1
  52. package/dist/plugin-sdk/{pi-model-discovery-runtime-DxTMz_XF.js → pi-model-discovery-runtime-6JzLw9Gk.js} +1 -1
  53. package/dist/plugin-sdk/{probe-CJb5uR8B.js → probe-BM7Oe40M.js} +2 -2
  54. package/dist/plugin-sdk/{probe-l_whvGLY.js → probe-CMPksimh.js} +1 -1
  55. package/dist/plugin-sdk/{probe-BFroeK3g.js → probe-oVp12D6L.js} +1 -1
  56. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +1 -1
  57. package/dist/plugin-sdk/{pw-ai-natjh3rm.js → pw-ai-DJ_gTc4M.js} +1 -1
  58. package/dist/plugin-sdk/qr-image-B4MlMG4N.js +115 -0
  59. package/dist/plugin-sdk/{replies-ChYo5ZQM.js → replies-CY-V0Zob.js} +3 -3
  60. package/dist/plugin-sdk/{resolve-channels-87LZrFk_.js → resolve-channels-1HtDcMqh.js} +2 -2
  61. package/dist/plugin-sdk/{resolve-channels-_-nV-EK2.js → resolve-channels-CU72Qh2j.js} +1 -1
  62. package/dist/plugin-sdk/{resolve-outbound-target-D-KGgHJZ.js → resolve-outbound-target-nQSBVYz9.js} +2 -2
  63. package/dist/plugin-sdk/{resolve-route-C8tvQm8Z.js → resolve-route-Dufnu2cT.js} +1 -1
  64. package/dist/plugin-sdk/{resolve-users-DN9VQBwv.js → resolve-users-Bk_ss2vC.js} +1 -1
  65. package/dist/plugin-sdk/{resolve-users-V6dHh_2B.js → resolve-users-IevCOk4W.js} +2 -2
  66. package/dist/plugin-sdk/{runtime-2B9_WKoI.js → runtime-CXSQwMaR.js} +1 -1
  67. package/dist/plugin-sdk/{runtime-dependency-DczkvPxn.js → runtime-dependency-nup8niQL.js} +9 -9
  68. package/dist/plugin-sdk/sat-runtime.d.ts +18 -2
  69. package/dist/plugin-sdk/sat-runtime.js +26 -25
  70. package/dist/plugin-sdk/{send-DCO441U7.js → send-BXBS_mRK.js} +8 -8
  71. package/dist/plugin-sdk/{send-CFzGKJXo.js → send-D-HfKQZm.js} +4 -4
  72. package/dist/plugin-sdk/{send-B6KkGKZD.js → send-D1j12ZgX.js} +5 -5
  73. package/dist/plugin-sdk/{send-q9HXrSwK.js → send-DWKm6yay.js} +10 -10
  74. package/dist/plugin-sdk/{send-gDoGA-7e.js → send-Di1Jit3L.js} +7 -7
  75. package/dist/plugin-sdk/{skill-commands-FKEPLS7T.js → skill-commands-iJtvpqgb.js} +2 -2
  76. package/dist/plugin-sdk/{slack-BZISDxDd.js → slack-B-nOOLM0.js} +45 -44
  77. package/dist/plugin-sdk/{slack-actions-DhbMcp8M.js → slack-actions-BzUEszJa.js} +10 -10
  78. package/dist/plugin-sdk/slack.d.ts +4 -4
  79. package/dist/plugin-sdk/slack.js +6 -6
  80. package/dist/plugin-sdk/{sticker-cache-B0aPv6Lg.js → sticker-cache-BLiId8Em.js} +2 -2
  81. package/dist/plugin-sdk/{tables-B3jr0Pvq.js → tables-_1W36GII.js} +2 -2
  82. package/dist/plugin-sdk/{targets-CtSbTxYX.js → targets-DDbNnLnB.js} +2 -2
  83. package/dist/plugin-sdk/{telegram-actions-H3gePEn6.js → telegram-actions-1X9A32Dn.js} +30 -29
  84. package/dist/plugin-sdk/telegram.d.ts +4 -4
  85. package/dist/plugin-sdk/telegram.js +3 -3
  86. package/dist/plugin-sdk/{thread-bindings.lifecycle-QbkNl-m6.js → thread-bindings.lifecycle-Y9T3CQGf.js} +3 -3
  87. package/dist/plugin-sdk/{thread-bindings.state-D9hg_M1c.js → thread-bindings.state-D2oOWDpv.js} +1 -1
  88. package/dist/plugin-sdk/{tmp-fased-dir-d1CmFAnJ.d.ts → tmp-fased-dir-BkpWlGUe.d.ts} +7 -1
  89. package/dist/plugin-sdk/{types-DUjYaWB2.d.ts → types-B-zL9gSv.d.ts} +1 -1
  90. package/dist/plugin-sdk/{types-xWjHXl1z.d.ts → types-DtCOO_hW.d.ts} +1 -1
  91. package/dist/plugin-sdk/{web-JwP9PAZR.js → web-BvjNyYBz.js} +33 -32
  92. package/dist/plugin-sdk/{whatsapp-actions-Bj_rOncr.js → whatsapp-actions-Blu9-eX-.js} +9 -9
  93. package/dist/plugin-sdk/{whatsapp-heartbeat-B1WHkJIg.js → whatsapp-heartbeat-DjmQM7hq.js} +2 -2
  94. package/dist/plugin-sdk/whatsapp.d.ts +9 -9
  95. package/dist/plugin-sdk/whatsapp.js +7 -7
  96. package/dist/plugin-sdk/{wsl-J-HscWxS.js → wsl-CTvIWvZz.js} +1 -1
  97. package/dist/plugin-sdk/{zod-schema.providers-core-CIzCjXH9.d.ts → zod-schema.providers-core-BCDlgtls.d.ts} +63 -63
  98. package/dist/wallet/local-socket-signer-lifecycle.js +29 -1
  99. package/dist/wallet/local-socket-signer-protocol.js +27 -0
  100. package/dist/wallet/providers/local-socket-signer-adapter.js +8 -0
  101. package/dist/wallet/signer-network-admin.js +11 -118
  102. package/dist/wallet/signer-protocol-v2.generated.js +4 -0
  103. package/dist/wallet/solana-assets.js +9 -3
  104. package/dist/wallet/solana-rpc-read-fetch.js +65 -0
  105. package/dist/wallet/wallet-status.js +7 -0
  106. package/dist/web/login-qr.js +1 -1
  107. package/dist/wizard/onboarding.js +61 -61
  108. package/extensions/acpx/package.json +1 -1
  109. package/extensions/bluebubbles/package.json +1 -1
  110. package/extensions/copilot-proxy/package.json +1 -1
  111. package/extensions/diagnostics-otel/package.json +1 -1
  112. package/extensions/fased-federation/package.json +1 -1
  113. package/extensions/google-gemini-cli-auth/package.json +1 -1
  114. package/extensions/imessage/package.json +1 -1
  115. package/extensions/irc/package.json +1 -1
  116. package/extensions/line/package.json +1 -1
  117. package/extensions/llm-task/package.json +1 -1
  118. package/extensions/lobster/package.json +1 -1
  119. package/extensions/matrix/CHANGELOG.md +12 -0
  120. package/extensions/matrix/package.json +1 -1
  121. package/extensions/mattermost/package.json +1 -1
  122. package/extensions/memory-core/package.json +2 -2
  123. package/extensions/memory-lancedb/package.json +1 -1
  124. package/extensions/minimax-portal-auth/package.json +1 -1
  125. package/extensions/msteams/CHANGELOG.md +12 -0
  126. package/extensions/msteams/package.json +1 -1
  127. package/extensions/nextcloud-talk/package.json +1 -1
  128. package/extensions/nostr/CHANGELOG.md +12 -0
  129. package/extensions/nostr/package.json +1 -1
  130. package/extensions/open-prose/package.json +1 -1
  131. package/extensions/sat-mining/package.json +1 -1
  132. package/extensions/signal/package.json +1 -1
  133. package/extensions/synology-chat/package.json +1 -1
  134. package/extensions/tlon/package.json +1 -1
  135. package/extensions/twitch/CHANGELOG.md +12 -0
  136. package/extensions/twitch/package.json +1 -1
  137. package/extensions/voice-call/CHANGELOG.md +12 -0
  138. package/extensions/voice-call/package.json +1 -1
  139. package/extensions/zalo/CHANGELOG.md +12 -0
  140. package/extensions/zalo/package.json +1 -1
  141. package/extensions/zalouser/CHANGELOG.md +12 -0
  142. package/extensions/zalouser/package.json +1 -1
  143. package/fased.mjs +14 -1
  144. package/install.sh +16 -10
  145. package/package.json +6 -1
  146. package/scripts/fased-managed-updater.mjs +10 -2
  147. package/scripts/fased-signer-wallet-import-hosting.sh +78 -0
  148. package/scripts/install-managed-runtime.mjs +10 -7
  149. /package/dist/plugin-sdk/{active-listener-B_NMtgPL.js → active-listener-p9Ooc1qj.js} +0 -0
  150. /package/dist/plugin-sdk/{blocks-input-Bg-8S2pl.js → blocks-input-DiZaqaN7.js} +0 -0
  151. /package/dist/plugin-sdk/{channel-access-CcFRdRPO.js → channel-access-B0aZBSd2.js} +0 -0
  152. /package/dist/plugin-sdk/{channel-activity-DBDMQ3yI.js → channel-activity-F07DjroV.js} +0 -0
  153. /package/dist/plugin-sdk/{channel-core-CFRs8LPy.js → channel-core-DoF4X04L.js} +0 -0
  154. /package/dist/plugin-sdk/{client-pI228AVT.js → client-DLY-kWF_.js} +0 -0
  155. /package/dist/plugin-sdk/{command-poll-backoff-yJU83wEq.js → command-poll-backoff-NAePk3eL.js} +0 -0
  156. /package/dist/plugin-sdk/{date-time-uUevHscU.js → date-time-ChY_tHoG.js} +0 -0
  157. /package/dist/plugin-sdk/{draft-stream-loop-CrOPfV3F.js → draft-stream-loop-DMBwjjd1.js} +0 -0
  158. /package/dist/plugin-sdk/{fetch-BtmoPIlf.js → fetch-B0v6OTUZ.js} +0 -0
  159. /package/dist/plugin-sdk/{filesystem-manager-DoI8IBNF.js → filesystem-manager-BzuIJ9K9.js} +0 -0
  160. /package/dist/plugin-sdk/{gateway-registry-DZDsqicG.js → gateway-registry-Bgl2GFgy.js} +0 -0
  161. /package/dist/plugin-sdk/{inbound-context-DrAcXE0y.js → inbound-context-CQnfFFQ9.js} +0 -0
  162. /package/dist/plugin-sdk/{pi-model-discovery-BX_JLcEJ.js → pi-model-discovery-BHNVyRny.js} +0 -0
  163. /package/dist/plugin-sdk/{polls-DKQXVfJp.js → polls-DXd67TD8.js} +0 -0
  164. /package/dist/plugin-sdk/{proxy-DWpYcsvR.js → proxy-CLRUdShp.js} +0 -0
  165. /package/dist/plugin-sdk/{qmd-manager-CgRaTxUq.js → qmd-manager-B8Vnu0ND.js} +0 -0
  166. /package/dist/plugin-sdk/{render-e7fENCYH.js → render-DrBfVs0u.js} +0 -0
  167. /package/dist/plugin-sdk/{reply-reference-Bqk-7HXE.js → reply-reference-BnAk5Wjb.js} +0 -0
  168. /package/dist/plugin-sdk/{retry-policy-C6SjKjQA.js → retry-policy-CXh1owkc.js} +0 -0
  169. /package/dist/plugin-sdk/{sandbox-paths-Dx2lUqCu.js → sandbox-paths-Bzh1CuZc.js} +0 -0
  170. /package/dist/plugin-sdk/{session-DHD4ZKyG.js → session-iuGR_rdi.js} +0 -0
  171. /package/dist/plugin-sdk/{shared-CBgp_GBw.js → shared-D1AD2Ejn.js} +0 -0
  172. /package/dist/plugin-sdk/{target-errors-Ckufe179.js → target-errors-DfS1sLR9.js} +0 -0
  173. /package/dist/plugin-sdk/{tool-loop-detection-Bp8bPJLs.js → tool-loop-detection-sDZl27w7.js} +0 -0
  174. /package/dist/plugin-sdk/{ui-Be8cLHIS.js → ui-GQDYm_jw.js} +0 -0
  175. /package/dist/plugin-sdk/{with-timeout-ckWB8rTo.js → with-timeout-CVV8tytk.js} +0 -0
@@ -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 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`
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:`Setup incomplete`,detail:`Account passkey mode is enabled but no device is enrolled. Wallet creation, Agent automation, and Mining automation are unaffected.`,enableVisible:!1,enableLabel:`Passkey approval enabled`,enableDisabled:!0,enrollVisible:!0,enrollLabel:e.passkeyBusy?`Enrolling...`:`Enroll passkey`,enrollDisabled:e.settingsBusy||e.passkeyBusy}:{summary:`Enabled`,detail:`Optional Control UI account passkey is enabled. Agent and Mining autonomous signer policies remain independent.`,enableVisible:!1,enableLabel:`Passkey approval ready`,enableDisabled:!0,enrollVisible:!1,enrollLabel:e.passkeyBusy?`Adding passkey...`:`Add passkey`,enrollDisabled:e.settingsBusy||e.passkeyBusy}:{summary:`Optional`,detail:`Optional extra approval for Control UI account actions. It is not part of Agent or Mining wallet readiness.`,enableVisible:!0,enableLabel:e.settingsBusy?`Enabling...`:`Add account passkey`,enableDisabled:e.settingsBusy||e.passkeyBusy,enrollVisible:!1,enrollLabel:`Enroll passkey`,enrollDisabled:!0}}function d(e){let t=e?.nativeSignerApproval;return t?t.configured?!t.ready||t.credentialCount<=0?{summary:`Not enrolled`,detail:`No signer-owned approval device is enrolled. Run the native signer-owner ceremony from the host terminal; ordinary Gateway JavaScript cannot enroll it.`,setupCommand:`Local: ~/.fased/bin/fased-signer-enroll · Hosting root console: /usr/local/sbin/fased-signer-enroll`}:{summary:`Ready · ${t.credentialCount} device${t.credentialCount===1?``:`s`}`,detail:`The native signer has an approval device. This Vault still needs an acknowledged manual policy for the exact operation before Send becomes available.`,setupCommand:null}:{summary:`Not configured`,detail:`This signer has no WebAuthn origin configured. Vault creation and receiving still work, but native Vault review cannot be enabled yet.`,setupCommand:null}:{summary:`Status unavailable`,detail:`Signer-owned Vault approval readiness is unavailable. Vault remains manual and receive-only until signer health is restored and an exact manual policy is acknowledged.`,setupCommand:null}}function f(e){return{mode:`manual`,submitLabel:`Create Approval Request`,detail:`Direct user Send is always reviewed/manual. Confirm creates a pending wallet approval request below. The optional account passkey is requested only when the user enabled it.`}}function p(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 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`
9
+ `}function m(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 h(e){return String(e.miningProfile?.walletId||e.miningStatus?.walletId||e.miningReadiness?.selectedWalletId||``).trim()||null}function g(e){return typeof e==`string`&&e.trim().length>0}function _(e){return e.id.startsWith(`solana-`)||e.name.toLowerCase().startsWith(`solana `)||e.addresses?.solana?`solana`:null}function ee(e){return!e||_(e),[`solana`]}function v(e,t){let n=String(t??``).trim();if(n)return e.find(e=>e.id===n)}function y(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 b(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 x(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 S(e,t){if(!e)return!1;let n=x(e);return n&&n!==`agent`?!1:e.id===String(t??``).trim()||n===`agent`}function C(e){let t=e.status?.approvalAuth?.mode??`none`,n=e.status?.approvalAuth?.ready??!1,r=String(e.defaultWalletId??``).trim()||null,i=v(e.namedWallets,r),a=e.namedWallets.filter(e=>S(e,r)),o=i&&S(i,r)?i:void 0,s=String(e.miningProfile?.walletId||e.miningStatus?.walletId||e.miningReadiness?.selectedWalletId||``).trim()||null,c=v(e.namedWallets,s),l=String(e.federationBond?.walletId??``).trim()||null,u=v(e.namedWallets,l);return{admin:e.status?t===`webauthn`&&n?{title:`Control UI account passkey`,summary:`Optional · enabled`,detail:`Adds account-level approval without changing Agent or Mining readiness.`,tone:`success`}:t===`webauthn`?{title:`Control UI account passkey`,summary:`Optional · setup incomplete`,detail:`Finish or disable account passkey mode. Wallet role readiness is separate.`,tone:`warn`}:{title:`Control UI account passkey`,summary:`Optional · off`,detail:`The signed-in Control UI session is active. Add an account passkey only if you want the extra approval step.`,tone:`neutral`}:{title:`Control UI account passkey`,summary:`Optional status unavailable`,detail:`Refresh Account Security before changing account-level approval.`,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 w(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"
@@ -35,10 +35,10 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
35
35
  >
36
36
  ${a?n.zap:n.hand}
37
37
  </span>
38
- `}function w(t,n){let r=t.toLowerCase()===`ready`;return e`
39
- <span class="wallet-lock-chip" data-state=${r?`unlocked`:`locked`} title=${n}>
38
+ `}function T(t,n){return e`
39
+ <span class="wallet-lock-chip" data-state=${t.toLowerCase()===`enabled`?`unlocked`:`locked`} title=${n}>
40
40
  <span class="wallet-lock-chip__dot"></span>
41
- ${r?`Ready`:`Not ready`}
41
+ ${t}
42
42
  </span>
43
43
  `}function re(r){return r?.automation?.satSweep?.enabled?e`
44
44
  <span
@@ -52,14 +52,14 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
52
52
  <span class="wallet-status-icon" data-role=${t.dataRole} title=${t.title}>
53
53
  ${t.icon}
54
54
  </span>
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`
55
+ `):t}function E(e,t){let n=e===String(t.defaultWalletId??``).trim(),r=!n&&e===h(t),i=x(v(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 D(e,t){if(e===h(t))return`mining`;let n=v(t.namedWallets,e);return x(n)===`mining`?`mining`:S(n,t.defaultWalletId)?`agent`:`vault`}function O(e){switch(e){case`mining`:return 0;case`vault`:return 1;case`agent`:return 2}}function k(e,t){let n=String(t.defaultWalletId??``).trim();return e.toSorted((e,r)=>{let i=D(e.id,t),a=D(r.id,t),o=O(i)-O(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 ae(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 oe(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 A(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 j(e,t=`n/a`){return typeof e==`string`?e.trim()||t:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?String(e):t}function M(e){return j(e,`n/a`).toLowerCase()===`solana`?`SOL`:j(e,`n/a`)}function N(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 P(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=N(t);if(!r)return n;try{return A(n,r)}catch{return n}}function F(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 I(e,t){return typeof e[t]==`string`?String(e[t]).trim():``}function L(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 R(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 z(e){let t=N(e.details.chain),n=I(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=I(e.details,`assetSymbol`)||t?.symbol||`SPL`,i=Ee({isNative:!1,program:n,symbol:r,name:I(e.details,`assetName`)||t?.name||``})?`SPL`:r,a=I(e.details,`amountDisplay`);if(a)return`${R(a)} ${i}`;let o=L(e.details,`assetDecimals`)??t?.decimals,s=F(j(e.details.amount,``),o);if(s)return`${R(s)} ${i}`;let c=j(e.details.amount,``);return c?`${c} raw ${i}`:`n/a`}return P(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 se(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?Te(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()||F(e.request.payload.amount,r)||``;return{amountValueText:i?`${q(i)} ${t}`:P(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=Ee({isNative:!1,program:n??``,symbol:i??``,name:a??``}),s=String(e.request.payload.amountDisplay??``).trim()||F(e.request.payload.amount,r?.decimals)||``;return s?{amountValueText:q(s),assetPrimaryText:o?i:a??i??n,assetSecondaryText:!o&&i&&a&&i!==a?i:null,name:a,symbol:i,program:n,usesFallbackIdentity:o}:{amountValueText:P(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 ce(e){let t=String(e.request.payload.walletId??``).trim(),n=String(e.request.payload.walletName??``).trim(),r=e.request.payload.chain,i=v(e.namedWallets,t)??(n?e.namedWallets.find(e=>e.name.trim().toLowerCase()===n.toLowerCase()):void 0),a=i&&K(i,r)||null;return{fromLabel:i?.name?.trim()||n||t||null,fromAddress:a,toAddress:String(e.request.payload.to??``).trim()||null}}function le(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`
56
56
  <div class="wallet-approval-diff">
57
57
  <span>Spend <strong>${a}</strong> ${o?e`<span>${o}</span>`:t}</span>
58
58
  <span>from <strong>${i}</strong> <span class="muted">(${r.fromRole})</span></span>
59
- <span>to <span class="mono">${X(s,8,6)}</span></span>
59
+ <span>to <span class="mono">${Y(s,8,6)}</span></span>
60
60
  ${c?e`<span class="muted">triggered by ${c}</span>`:t}
61
61
  </div>
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`
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 ue(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
63
  <div class="wallet-approval-diff" style="margin-top: 6px;">
64
64
  <span><strong>Signer intent</strong> <span class="mono">${i}</span></span>
65
65
  ${a.map(t=>e`
@@ -75,7 +75,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
75
75
  </span>
76
76
  `:t}
77
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`
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 de(e){return String(e.miningProfile?.walletId??e.miningStatus?.walletId??e.miningReadiness?.selectedWalletId??``).trim()}function fe(e,t,n){if(typeof e.balances?.solana==`string`&&e.balances.solana.trim())return q(G(A(e.balances.solana,`solana`),`SOL`));if(n){let e=String(t.miningReadiness?.balances.solBalanceDisplay??``).trim();if(e)return q(G(e,`SOL`));let n=String(t.miningStatus?.currentSolBalanceLamports??``).trim();if(n)return q(W(n,`SOL`))}return e.addresses?.solana?t.balancesLoading?`Loading`:`0`:t.balancesLoading?`Loading`:`—`}function K(e,t){return e&&e.addresses?.solana||``}function pe(e,t){return!e||t?.walletId!==e.id?[]:Array.isArray(t.assets?.solana)?t.assets.solana:[]}function me(e,t){if(!e)return[];let n=[],r=de(t)===e.id,i=pe(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:fe(e,t,r),amountRaw:e.balances?.solana,isNative:!0,address:e.addresses?.solana});return n}function q(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 J(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?F(n,e.decimals)??n:n;let r=e.settings?.policy.solana.tokenCaps?.[t]?.[e.field];return F(r,e.decimals)??``}function he(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:F(o.maxPerTx,n)??``,maxDaily:F(o.maxDaily,n)??``}:o??{decimals:n};e.onPolicyDraftChange({solanaTokenCaps:{...e.policySolanaTokenCaps,[a]:{...s,decimals:n,[r]:i}}})}function ge(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 _e(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=Y(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:ye(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:Y(r,2,2),detail:Y(r,2,2),mint:r,decimals:e.props.policySolanaTokenCaps[r]?.decimals??-1}))}return t}function ve(n){let{props:r,settings:i,policyDisplay:a,cardRole:o,selectedWalletId:s,cardWalletCanSpendSolana:c,selectedWalletTokens:l,canEditPolicy:u}=n,d=r.policyCapsEnabled===!0,f=_e({props:r,selectedWalletTokens:l});return e`
79
79
  <div class="field">
80
80
  <div class="wallet-spend-limit-row" style="align-items: end;">
81
81
  <label class="field">
@@ -115,12 +115,12 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
115
115
  <label class="field wallet-cap-field">
116
116
  <span class="wallet-field-label wallet-field-label--mint">
117
117
  <span>SOL</span>
118
- ${f(`Maximum SOL this wallet may spend in one day under this policy.`)}
118
+ ${p(`Maximum SOL this wallet may spend in one day under this policy.`)}
119
119
  </span>
120
120
  <input
121
121
  aria-label="Daily SOL cap"
122
122
  placeholder="5.0"
123
- .value=${r.policySolMaxDaily||a?.solana.maxDaily.human.split(` `)[0]||j(i.policy.solana.maxDaily,`solana`,{hideUnit:!0})}
123
+ .value=${r.policySolMaxDaily||a?.solana.maxDaily.human.split(` `)[0]||A(i.policy.solana.maxDaily,`solana`,{hideUnit:!0})}
124
124
  ?disabled=${r.settingsBusy||!u}
125
125
  @input=${e=>r.onPolicyDraftChange({solMaxDaily:e.target.value})}
126
126
  />
@@ -128,44 +128,44 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
128
128
  <label class="field wallet-cap-field">
129
129
  <span class="wallet-field-label">
130
130
  <span>Tx</span>
131
- ${f(`Maximum SOL this wallet may spend in one approved transaction.`)}
131
+ ${p(`Maximum SOL this wallet may spend in one approved transaction.`)}
132
132
  </span>
133
133
  <input
134
134
  aria-label="Per transaction SOL cap"
135
135
  placeholder="1.0"
136
- .value=${r.policySolMaxPerTx||a?.solana.maxPerTx.human.split(` `)[0]||j(i.policy.solana.maxPerTx,`solana`,{hideUnit:!0})}
136
+ .value=${r.policySolMaxPerTx||a?.solana.maxPerTx.human.split(` `)[0]||A(i.policy.solana.maxPerTx,`solana`,{hideUnit:!0})}
137
137
  ?disabled=${r.settingsBusy||!u}
138
138
  @input=${e=>r.onPolicyDraftChange({solMaxPerTx:e.target.value})}
139
139
  />
140
140
  </label>
141
141
  </div>
142
142
  `:t}
143
- ${p.map(t=>e`
143
+ ${f.map(t=>e`
144
144
  <div class="wallet-token-cap-row">
145
145
  <label class="field wallet-cap-field">
146
146
  <span class="wallet-field-label wallet-field-label--mint mono" title=${t.mint??t.label}>
147
147
  <span>${t.label}</span>
148
- ${f(`Maximum token amount this wallet may spend in one day under this policy.`)}
148
+ ${p(`Maximum token amount this wallet may spend in one day under this policy.`)}
149
149
  </span>
150
150
  <input
151
151
  aria-label=${`Daily cap for ${t.label}`}
152
152
  placeholder="0"
153
- .value=${fe({drafts:r.policySolanaTokenCaps,settings:i,mint:t.mint,field:`maxDaily`,decimals:t.decimals})}
153
+ .value=${J({drafts:r.policySolanaTokenCaps,settings:i,mint:t.mint,field:`maxDaily`,decimals:t.decimals})}
154
154
  ?disabled=${r.settingsBusy||!u}
155
- @input=${e=>pe(r,t.mint,t.decimals,`maxDaily`,e.target.value)}
155
+ @input=${e=>he(r,t.mint,t.decimals,`maxDaily`,e.target.value)}
156
156
  />
157
157
  </label>
158
158
  <label class="field wallet-cap-field">
159
159
  <span class="wallet-field-label">
160
160
  <span>Tx</span>
161
- ${f(`Maximum token amount this wallet may spend in one approved transaction.`)}
161
+ ${p(`Maximum token amount this wallet may spend in one approved transaction.`)}
162
162
  </span>
163
163
  <input
164
164
  aria-label=${`Per transaction cap for ${t.label}`}
165
165
  placeholder="0"
166
- .value=${fe({drafts:r.policySolanaTokenCaps,settings:i,mint:t.mint,field:`maxPerTx`,decimals:t.decimals})}
166
+ .value=${J({drafts:r.policySolanaTokenCaps,settings:i,mint:t.mint,field:`maxPerTx`,decimals:t.decimals})}
167
167
  ?disabled=${r.settingsBusy||!u}
168
- @input=${e=>pe(r,t.mint,t.decimals,`maxPerTx`,e.target.value)}
168
+ @input=${e=>he(r,t.mint,t.decimals,`maxPerTx`,e.target.value)}
169
169
  />
170
170
  </label>
171
171
  </div>
@@ -206,7 +206,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
206
206
  </div>
207
207
  </div>
208
208
  <div class="muted mono wallet-token-cap-row__detail" title=${n.mint}>
209
- ${X(n.mint,2,2)}
209
+ ${Y(n.mint,2,2)}
210
210
  </div>
211
211
  <button class="btn" ?disabled=${r.settingsBusy||!u} @click=${()=>r.onTokenSearchSelect(n)}>
212
212
  Use
@@ -237,7 +237,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
237
237
  </label>
238
238
  <label class="field">
239
239
  <span class="wallet-field-label wallet-field-label--icon-only">
240
- ${f(`Maximum token amount this wallet may spend in one day under this policy.`)}
240
+ ${p(`Maximum token amount this wallet may spend in one day under this policy.`)}
241
241
  </span>
242
242
  <input
243
243
  aria-label="Daily token cap"
@@ -249,7 +249,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
249
249
  </label>
250
250
  <label class="field">
251
251
  <span class="wallet-field-label wallet-field-label--icon-only">
252
- ${f(`Maximum token amount this wallet may spend in one approved transaction.`)}
252
+ ${p(`Maximum token amount this wallet may spend in one approved transaction.`)}
253
253
  </span>
254
254
  <input
255
255
  aria-label="Per transaction token cap"
@@ -262,7 +262,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
262
262
  <button
263
263
  class="btn"
264
264
  ?disabled=${r.settingsBusy||!u||!(r.policyTokenCapMint??``).trim()}
265
- @click=${()=>me(r)}
265
+ @click=${()=>ge(r)}
266
266
  >
267
267
  Add
268
268
  </button>
@@ -285,32 +285,32 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
285
285
  </details>
286
286
  `:t}
287
287
  </div>
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}
288
+ `}function ye(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}
289
289
  ><img
290
290
  src=${t.logoUri}
291
291
  alt=${`${t.symbol} logo`}
292
292
  style=${`width:${n}px;height:${n}px;object-fit:cover;display:block;`}
293
293
  @error=${e=>{let t=e.currentTarget,n=t?.parentElement;t&&n&&(t.style.display=`none`,n.textContent=r)}}
294
294
  /></span
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
295
+ >`:e`<span style=${i}>${r}</span>`}function be(e,t){let n=me(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 xe(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 Se(e){let t=I(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`:xe(e.action)}function Ce(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 we(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 Y(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 Te(e){let t=e.trim();return t?t.length<=12?t:`${t.slice(0,4)}…${t.slice(-4)}`:`TOKEN`}function Ee(e){if(!e||e.isNative||!e.program)return!1;let t=Te(e.program);return String(e.symbol??``).trim().toUpperCase()===t.toUpperCase()&&String(e.name??``).trim()===`Token ${t}`}async function De(e){let t=e.trim();if(!(!t||typeof navigator>`u`||!navigator.clipboard))try{await navigator.clipboard.writeText(t)}catch{}}function Oe(e){return e.replace(/[^a-zA-Z0-9_-]/g,`-`)||`wallet`}function ke(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 X(r,i){let a=r.trim();return a?e`<button
296
296
  type="button"
297
297
  class="wallet-copy-btn"
298
298
  title=${`Copy ${i}`}
299
299
  aria-label=${`Copy ${i}`}
300
- @click=${()=>void Te(a)}
300
+ @click=${()=>void De(a)}
301
301
  >
302
302
  <span class="wallet-copy-btn__icon">${n.copy}</span>
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
303
+ </button>`:t}function Ae(n){let r=String(n.value??``).trim();if(!r)return t;let i=n.display.trim()||Y(r);return e`<button
304
304
  type="button"
305
305
  class=${`wallet-copy-text ${n.className??``}`.trim()}
306
306
  data-copied="false"
307
307
  title=${n.title??`Copy ${n.label}`}
308
308
  aria-label=${`Copy ${n.label}`}
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)})}}
309
+ @click=${e=>{De(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)})}}
310
310
  >
311
311
  <span class="wallet-copy-text__label">${i}</span>
312
312
  <span class="wallet-copy-popover" aria-hidden="true">Copy</span>
313
- </button>`}function Ae(t,r){let i=`${t}: ${r}`;return e`<button
313
+ </button>`}function je(t,r){let i=`${t}: ${r}`;return e`<button
314
314
  type="button"
315
315
  class="wallet-icon-btn"
316
316
  title=${i}
@@ -326,7 +326,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
326
326
  aria-label=${i}
327
327
  >
328
328
  <span class="wallet-copy-btn__icon">${n.externalLink}</span>
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
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 Me(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
330
330
  type="button"
331
331
  class="wallet-balance-pill wallet-balance-pill--button"
332
332
  data-tone=${r}
@@ -339,10 +339,10 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
339
339
  <span class="wallet-meta-row__label">${n.label}</span>
340
340
  <span class="wallet-meta-row__value mono">${n.value}</span>
341
341
  <span class="wallet-meta-row__actions">
342
- ${n.rawValue&&n.copyLabel?Oe(n.rawValue,n.copyLabel):t}
342
+ ${n.rawValue&&n.copyLabel?X(n.rawValue,n.copyLabel):t}
343
343
  ${Z(n.href,`Open ${n.label}`)}
344
344
  </span>
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`
345
+ </div>`}function Ne(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`
346
346
  <div id="wallet-skill-grants" class="card wallet-panel">
347
347
  <div class="wallet-panel__head">
348
348
  <div>
@@ -379,7 +379,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
379
379
  ${t.version?` · ${t.version}`:``}
380
380
  </span>
381
381
  </span>
382
- <span class="muted">${v(t.grantedWalletActions)}</span>
382
+ <span class="muted">${y(t.grantedWalletActions)}</span>
383
383
  </button>
384
384
  `})}
385
385
  </div>
@@ -388,12 +388,12 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
388
388
  <div>
389
389
  <span>Requested</span>
390
390
  <strong>
391
- ${y(i?.requestedWalletActions??null)}
391
+ ${b(i?.requestedWalletActions??null)}
392
392
  </strong>
393
393
  </div>
394
394
  <div>
395
395
  <span>Current grant</span>
396
- <strong>${v(i?.grantedWalletActions??null)}</strong>
396
+ <strong>${y(i?.grantedWalletActions??null)}</strong>
397
397
  </div>
398
398
  </div>
399
399
  <label class="field">
@@ -505,15 +505,15 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
505
505
  </div>
506
506
  `}
507
507
  </div>
508
- `}function Ne(n){let r=n.status,i=u(n);return e`
508
+ `}function Pe(n){let r=n.status,i=u(n);return e`
509
509
  <div class="wallet-top-grid">
510
510
  <div id="wallet-admin-control" class="card wallet-top-card">
511
511
  <div class="wallet-top-card__head">
512
512
  <div>
513
513
  <div class="wallet-top-card__title-row">
514
- <div class="card-title">Wallet Control Passkey</div>
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)}
514
+ <div class="card-title">Control UI account passkey</div>
515
+ ${je(`Optional Control UI account passkey`,`${i.detail} Use a device passkey such as Touch ID, Windows Hello, a phone passkey, or a supported security key.`)}
516
+ ${T(i.summary,i.detail)}
517
517
  </div>
518
518
  </div>
519
519
  </div>
@@ -544,9 +544,9 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
544
544
  `:t}
545
545
  </div>
546
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.
547
+ This is optional account security for the browser Control UI. It is not requested during
548
+ installation or wallet creation and does not gate Agent or Mining automation. A Vault
549
+ approval device is a separate signer-owned feature configured only for Vault review.
550
550
  </div>
551
551
  ${!i.enableVisible&&!i.enrollVisible?e`
552
552
  <details class="wallet-advanced-box">
@@ -558,7 +558,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
558
558
  <div>
559
559
  <div>Label: ${t.label||`Wallet passkey`}</div>
560
560
  <div class="wallet-security-note">
561
- Credential ID <span class="mono">${X(t.id)}</span>
561
+ Credential ID <span class="mono">${Y(t.id)}</span>
562
562
  · added ${new Date(t.createdAt).toLocaleString()}
563
563
  </div>
564
564
  </div>
@@ -578,8 +578,8 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
578
578
  ${n.passkeyError?e`<div class="callout danger">${n.passkeyError}</div>`:t}
579
579
  </div>
580
580
  </div>
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
+ `}function Fe(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 Ie(a){let c=a.status,l=a.settings,u=C(a),f=!!(a.error||a.settingsError||a.actionMessage||a.settingsMessage||u.sharedWalletWarning),m=a.auditEntries.filter(e=>[`send_requested`,`send_approved`,`send_rejected`,`send_executed`,`send_failed`].includes(e.action)).slice(0,48),h=m.length,g=Math.max(1,Math.ceil(h/s)),_=Math.min(Math.max(a.activityPage,1),g),y=(_-1)*s,b=m.slice(y,y+s),x=c?.capabilities?.canEditPolicy??!0,S=c?.capabilities?.canSend??!0,w=c?.policyDisplay,T=v(a.namedWallets,a.walletDetailsWalletId),E=k(a.namedWallets,a),O={enabled:!1,mode:`all`,percentage:100,minRaw:`1`,keepRaw:`0`,...a.miningProfile?.automation?.satSweep},A=a.namedWallets.filter(e=>e.id!==T?.id&&!!e.addresses?.solana),P=O.destinationAddress||!O.destinationWalletId?`external`:`wallet`,F=String(a.expandedWalletId??``).trim(),L=a.expandedPanel??``,R=typeof window<`u`?String(window.location?.hash??``).replace(/^#/,``):``,B=(R===`wallet-skill-grants`?`skill-grants`:[`wallet-access`,`wallet-admin-control`].includes(R)?`access`:null)??a.mainPanel??`wallets`,V=(a.providers??[]).filter(e=>(e.id===`local-socket-signer`||e.id===`turnkey`)&&e.operationsImplemented&&e.capabilities.operations.createWallet),H=a.createProvider??V[0]?.id??`local-socket-signer`,U=V.find(e=>e.id===H),W=!!(U?.enabled&&U.health.ok&&(!U.capabilities.requiresCredentials||U.credentialsConfigured)),G=a.namedWallets.find(e=>D(e.id,a)===`mining`||e.id===`mining`),K=a.createRole===`mining`&&!!G,pe=!!(a.createRole&&a.createName?.trim()&&(H!==`local-socket-signer`||a.createId?.trim()&&a.createRpcUrl?.trim())&&!K),J=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
+ ${Le(a)}
583
583
  <style>
584
584
  .wallet-dashboard {
585
585
  display: grid;
@@ -1720,7 +1720,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1720
1720
  }
1721
1721
  </style>
1722
1722
  <section id="wallet-dashboard" class="wallet-dashboard">
1723
- ${d?e`
1723
+ ${f?e`
1724
1724
  <div class="wallet-message-stack">
1725
1725
  ${a.error?e`<div class="callout danger">${a.error}</div>`:t}
1726
1726
  ${a.settingsError?e`<div class="callout danger">${a.settingsError}</div>`:t}
@@ -1734,28 +1734,28 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1734
1734
  <button
1735
1735
  class="btn"
1736
1736
  role="tab"
1737
- aria-selected=${z===`wallets`?`true`:`false`}
1738
- @click=${()=>W(`wallets`)}
1737
+ aria-selected=${B===`wallets`?`true`:`false`}
1738
+ @click=${()=>J(`wallets`)}
1739
1739
  >
1740
1740
  Wallets
1741
1741
  </button>
1742
1742
  <button
1743
1743
  class="btn"
1744
1744
  role="tab"
1745
- aria-selected=${z===`access`?`true`:`false`}
1746
- @click=${()=>W(`access`)}
1745
+ aria-selected=${B===`access`?`true`:`false`}
1746
+ @click=${()=>J(`access`)}
1747
1747
  >
1748
- Access
1748
+ Account Security
1749
1749
  </button>
1750
1750
  <button
1751
1751
  class="btn"
1752
1752
  role="tab"
1753
- aria-selected=${z===`skill-grants`?`true`:`false`}
1754
- @click=${()=>W(`skill-grants`)}
1753
+ aria-selected=${B===`skill-grants`?`true`:`false`}
1754
+ @click=${()=>J(`skill-grants`)}
1755
1755
  >
1756
1756
  Skill Grants
1757
1757
  </button>
1758
- ${z===`wallets`?e`
1758
+ ${B===`wallets`?e`
1759
1759
  <span class="wallet-main-tabs__spacer"></span>
1760
1760
  <button
1761
1761
  class="btn small"
@@ -1774,7 +1774,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1774
1774
  </button>
1775
1775
  `:t}
1776
1776
  </div>
1777
- ${z===`skill-grants`?Me(a):z===`access`?Ne(a):e`<div id="wallet-wallets" class="wallet-wallets-section">
1777
+ ${B===`skill-grants`?Ne(a):B===`access`?Pe(a):e`<div id="wallet-wallets" class="wallet-wallets-section">
1778
1778
  <details class="wallet-create-panel">
1779
1779
  <summary>Create a signer-owned wallet</summary>
1780
1780
  <div class="wallet-create-grid">
@@ -1791,7 +1791,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1791
1791
  <span>Permanent wallet ID</span>
1792
1792
  <input
1793
1793
  .value=${a.createId??``}
1794
- placeholder=${V===`local-socket-signer`?`agent-primary (required)`:`optional local label`}
1794
+ placeholder=${H===`local-socket-signer`?`agent-primary (required)`:`optional local label`}
1795
1795
  autocomplete="off"
1796
1796
  @input=${e=>a.onCreateIdChange?.(e.target.value)}
1797
1797
  />
@@ -1799,10 +1799,10 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1799
1799
  <label class="field">
1800
1800
  <span>Custody provider</span>
1801
1801
  <select
1802
- .value=${V}
1802
+ .value=${H}
1803
1803
  @change=${e=>a.onCreateProviderChange?.(e.target.value)}
1804
1804
  >
1805
- ${B.map(t=>e`
1805
+ ${V.map(t=>e`
1806
1806
  <option value=${t.id}>
1807
1807
  ${t.label||(t.id===`local-socket-signer`?`Native Go signer`:`Turnkey`)}
1808
1808
  </option>
@@ -1812,42 +1812,56 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1812
1812
  <label class="field">
1813
1813
  <span>Wallet role</span>
1814
1814
  <select
1815
- .value=${a.createRole??`agent`}
1815
+ .value=${a.createRole??``}
1816
1816
  @change=${e=>a.onCreateRoleChange?.(e.target.value)}
1817
1817
  >
1818
+ <option value="" disabled>Select a role</option>
1818
1819
  <option value="agent">Agent — capped automation</option>
1820
+ <option value="mining">Mining — singleton SAT operations</option>
1819
1821
  <option value="vault">Vault — reviewed operations only</option>
1820
1822
  </select>
1821
1823
  </label>
1824
+ ${H===`local-socket-signer`?e`
1825
+ <label class="field">
1826
+ <span>Primary Solana RPC</span>
1827
+ <input
1828
+ .value=${a.createRpcUrl??``}
1829
+ placeholder="https://your-solana-rpc.example"
1830
+ autocomplete="off"
1831
+ spellcheck="false"
1832
+ @input=${e=>a.onCreateRpcUrlChange?.(e.target.value)}
1833
+ />
1834
+ </label>
1835
+ `:t}
1822
1836
  <div class="wallet-create-actions">
1823
1837
  <button
1824
1838
  class="btn primary"
1825
- ?disabled=${a.settingsBusy||!U}
1839
+ ?disabled=${a.settingsBusy||!W||!pe}
1826
1840
  @click=${a.onCreateWallet}
1827
1841
  >
1828
1842
  ${a.settingsBusy?`Creating...`:`Create wallet`}
1829
1843
  </button>
1830
1844
  <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.`}
1845
+ ${K?`Mining already uses ${G?.name??G?.id}. Open, Replace, or Archive that singleton wallet.`:a.createRole?U?U.enabled?U.health.ok?U.capabilities.requiresCredentials&&!U.credentialsConfigured?`Configure restricted provider credentials before creating a wallet.`:H===`local-socket-signer`?`The Go signer generates the key; Node receives only the public address.`:`Turnkey creates the account under the configured restrictive policy.`:U.health.details||`Provider health check failed.`:`Enable this provider in Wallet Access first.`:`No production wallet-creation provider is available.`:`Choose a wallet role; Agent is never selected silently.`}
1832
1846
  </span>
1833
1847
  </div>
1834
1848
  </div>
1835
1849
  </details>
1836
1850
  ${a.balancesError?e`<div class="callout danger">${a.balancesError}</div>`:t}
1837
1851
  <div class="wallet-grid">
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`
1852
+ ${E.map(r=>{let s=fe(r,a,de(a)===r.id),u=String(a.balanceWalletId??``).trim(),f=r.id===F&&L===`balance`,p=r.id===F&&L===`security`,m=((f||p)&&r.id===(u||a.balances?.walletId)?me(r,a).filter(e=>e.chain===`solana`):[]).filter(e=>!e.isNative),h=r.addresses?.solana||``,g=`wallet-address-${Oe(r.id)}`,_=s,v=D(r.id,a),y=d(c),b=v===`agent`&&r.id===a.walletDetailsWalletId&&l?l.policy.directSigning:void 0,C=r.id===a.walletDetailsWalletId?l?.signerPolicy:void 0,T=r.providerId!==`local-socket-signer`||r.metadata?.networkReady===!0,E=typeof r.metadata?.networkVersion==`number`?r.metadata.networkVersion:void 0,k=r.providerId!==`local-socket-signer`||C?.state===`acknowledged`,j=ee(r).includes(`solana`),M=v===`mining`?[{id:`sweep`,label:`Sweep`,title:`Mining-only sweep after SAT claims.`}]:v===`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.`}],N=a.policyPanel&&M.some(e=>e.id===a.policyPanel)?a.policyPanel:M[0]?.id??`caps`,I=i(a.recurringTransferCron??``),R=String(a.recurringTransferMint??``).trim(),z=R?`token`:`SOL`,B=e=>a.onPolicyDraftChange({recurringTransferCron:o({every:e.every??I.every,unit:e.unit??I.unit,time:e.time??I.time})});return e`
1839
1853
  <div class="wallet-card" title=${r.id}>
1840
1854
  <div class="wallet-card__header">
1841
1855
  <div class="wallet-card__identity">
1842
1856
  <div class="wallet-card__title-row">
1843
1857
  <div class="wallet-card__title">${r.name}</div>
1844
1858
  ${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:_})}
1859
+ ${v===`mining`?re(a.miningProfile):t}
1860
+ ${ie({walletId:r.id,role:v,props:a})}
1861
+ ${ne({role:v,automationEnabled:b})}
1848
1862
  </div>
1849
1863
  <div class="wallet-card__address-row">
1850
- ${p?e`
1864
+ ${h?e`
1851
1865
  <span
1852
1866
  class="wallet-card__wallet-icon"
1853
1867
  title="Wallet address configured"
@@ -1856,7 +1870,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1856
1870
  ${n.wallet}
1857
1871
  </span>
1858
1872
  <span
1859
- id=${m}
1873
+ id=${g}
1860
1874
  class="mono wallet-card__address"
1861
1875
  data-revealed="false"
1862
1876
  >
@@ -1868,35 +1882,57 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1868
1882
  class="wallet-icon-btn"
1869
1883
  title="Show wallet address"
1870
1884
  aria-label="Show wallet address"
1871
- @click=${()=>De(m,`******`,p)}
1885
+ @click=${()=>ke(g,`******`,h)}
1872
1886
  >
1873
1887
  <span class="wallet-copy-btn__icon">${n.eye}</span>
1874
1888
  </button>
1875
- ${Oe(p,`wallet address`)}
1876
- ${Z(Q(`solana`,`address`,p),`Open wallet address`)}
1889
+ ${X(h,`wallet address`)}
1890
+ ${Z(Q(`solana`,`address`,h),`Open wallet address`)}
1877
1891
  </span>
1878
1892
  `:e`
1879
1893
  <span class="muted">No wallet address</span>
1880
1894
  `}
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`})}
1895
+ ${Ae({value:`@wallet:${r.id}`,display:`@wallet:${r.id}`,label:`wallet handle`,title:v===`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`})}
1896
+ ${h?e`
1897
+ <details>
1898
+ <summary>Receive QR</summary>
1899
+ <div class="qr-wrap">
1900
+ <img
1901
+ src=${`/api/wallet/receive-qr?walletId=${encodeURIComponent(r.id)}`}
1902
+ alt=${`Solana receive QR for ${r.name}`}
1903
+ loading="lazy"
1904
+ />
1905
+ </div>
1906
+ </details>
1907
+ `:t}
1882
1908
  </div>
1883
1909
  </div>
1884
1910
  <div class="row" style="gap: 8px;">
1885
1911
  <button
1886
- class="btn small ${d?`primary`:``}"
1912
+ class="btn small ${p?`primary`:``}"
1887
1913
  @click=${()=>a.onWalletDetailsWalletChange(r.id)}
1888
1914
  >
1889
1915
  Policy
1890
1916
  </button>
1917
+ ${r.providerId===`local-socket-signer`?e`
1918
+ <button
1919
+ class="btn small danger"
1920
+ ?disabled=${a.settingsBusy||!a.onArchiveWallet}
1921
+ title="The server requires Mining runtime obligations to be settled and locks the signer key deny-all. Confirm external balances and recovery before archiving."
1922
+ @click=${()=>a.onArchiveWallet?.(r.id)}
1923
+ >
1924
+ ${v===`mining`?`Archive Mining`:`Archive`}
1925
+ </button>
1926
+ `:t}
1891
1927
  </div>
1892
1928
  </div>
1893
1929
  <div class="wallet-card__balance-row">
1894
1930
  <div class="wallet-card__balance-main">
1895
- ${je(`SOL`,h,`neutral`,{title:`Solana`,onClick:r.addresses?.solana?()=>(a.onWalletBalanceWalletChange??a.onWalletDetailsWalletChange)(r.id):void 0})}
1931
+ ${Me(`SOL`,_,`neutral`,{title:`Solana`,onClick:r.addresses?.solana?()=>(a.onWalletBalanceWalletChange??a.onWalletDetailsWalletChange)(r.id):void 0})}
1896
1932
  <button
1897
1933
  class="btn small primary wallet-card__send-btn"
1898
- ?disabled=${!x||!y}
1899
- title=${y?`Send from this wallet`:`Receive-only: open Policy and complete signer activation first`}
1934
+ ?disabled=${!S||!k}
1935
+ title=${k?`Send from this wallet`:`Receive-only: the role-safe deny-all baseline is active; install an owner-reviewed spending policy before sending`}
1900
1936
  @click=${()=>a.onSendModalOpen(r.id)}
1901
1937
  >
1902
1938
  Send
@@ -1906,28 +1942,28 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1906
1942
  <button
1907
1943
  type="button"
1908
1944
  class="wallet-balance-link"
1909
- data-active=${u?`true`:`false`}
1945
+ data-active=${f?`true`:`false`}
1910
1946
  @click=${()=>(a.onWalletBalanceWalletChange??a.onWalletDetailsWalletChange)(r.id)}
1911
1947
  >
1912
1948
  <span class="wallet-balance-link__icon">${n.barChart}</span>
1913
1949
  <span>Balance</span>
1914
1950
  </button>
1915
1951
  `:t}
1916
- ${f.length>0?e`
1952
+ ${m.length>0?e`
1917
1953
  <div class="wallet-token-details">
1918
1954
  <div class="wallet-token-list">
1919
- ${f.map(n=>e`
1955
+ ${m.map(n=>e`
1920
1956
  <div class="row" style="gap: 8px; align-items: center;">
1921
1957
  <button
1922
1958
  class="btn small"
1923
1959
  style="display: inline-flex; gap: 8px; align-items: center;"
1924
- ?disabled=${!x||!y}
1960
+ ?disabled=${!S||!k}
1925
1961
  @click=${()=>a.onSendModalOpen(r.id,n.id)}
1926
1962
  >
1927
- ${_e(n,20)}
1963
+ ${ye(n,20)}
1928
1964
  <span>${n.symbol}</span>
1929
1965
  <span class="muted"
1930
- >${Y(n.amountDisplay)}</span
1966
+ >${q(n.amountDisplay)}</span
1931
1967
  >
1932
1968
  </button>
1933
1969
  ${n.program?Z(Q(`solana`,`address`,n.program),`Open ${n.symbol} mint`):t}
@@ -1935,54 +1971,102 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1935
1971
  `)}
1936
1972
  </div>
1937
1973
  </div>
1938
- `:u&&a.balancesLoading?e`
1974
+ `:f&&a.balancesLoading?e`
1939
1975
  <div class="muted" style="font-size: 0.85em">Loading balance...</div>
1940
- `:u&&r.addresses?.solana?e`
1976
+ `:f&&r.addresses?.solana?e`
1941
1977
  <div class="muted" style="font-size: 0.85em">Balance loaded. No SPL token balances detected.</div>
1942
1978
  `:t}
1943
1979
  </div>
1944
- ${d?e`
1980
+ ${p?e`
1945
1981
  <div id="wallet-security-card" class="wallet-card-security">
1946
1982
  <div class="wallet-policy-tabs" role="tablist" aria-label="Wallet policy sections">
1947
- ${w.map(t=>e`
1983
+ ${M.map(t=>e`
1948
1984
  <button
1949
1985
  type="button"
1950
1986
  class="wallet-policy-tab"
1951
- data-active=${T===t.id?`true`:`false`}
1987
+ data-active=${N===t.id?`true`:`false`}
1952
1988
  title=${t.title}
1953
1989
  role="tab"
1954
- aria-selected=${T===t.id?`true`:`false`}
1990
+ aria-selected=${N===t.id?`true`:`false`}
1955
1991
  @click=${()=>a.onPolicyPanelChange?.(t.id)}
1956
1992
  >
1957
1993
  ${t.label}
1958
1994
  </button>
1959
1995
  `)}
1960
1996
  </div>
1961
- ${v?e`
1997
+ ${r.providerId===`local-socket-signer`?e`
1998
+ <div
1999
+ class="callout ${T?`success`:`warn`}"
2000
+ style="margin-top: 10px"
2001
+ data-testid="wallet-signer-network-status"
2002
+ >
2003
+ <strong
2004
+ >Signer RPC: ${T?`ready${E?` · version ${E}`:``}`:`not ready`}</strong
2005
+ >
2006
+ <div>
2007
+ Enter one primary RPC. The Go signer verifies its genesis;
2008
+ ordinary setup never asks for a Solana network or a second
2009
+ RPC.
2010
+ </div>
2011
+ <div class="wallet-card-security__grid" style="margin-top: 8px">
2012
+ <label class="field">
2013
+ <span>Replace primary Solana RPC</span>
2014
+ <input
2015
+ .value=${a.rpcUrl??``}
2016
+ placeholder="https://your-solana-rpc.example"
2017
+ autocomplete="off"
2018
+ spellcheck="false"
2019
+ @input=${e=>a.onRpcUrlChange?.(e.target.value)}
2020
+ />
2021
+ </label>
2022
+ <button
2023
+ class="btn small"
2024
+ ?disabled=${a.settingsBusy||!a.rpcUrl?.trim()||!a.onSaveWalletRpc}
2025
+ @click=${a.onSaveWalletRpc}
2026
+ >
2027
+ Verify and save RPC
2028
+ </button>
2029
+ </div>
2030
+ </div>
2031
+ `:t}
2032
+ ${C?e`
1962
2033
  <div
1963
- class="callout ${v.state===`acknowledged`?`success`:`warn`}"
2034
+ class="callout ${C.state===`acknowledged`?`success`:`warn`}"
1964
2035
  style="margin-top: 10px"
1965
2036
  data-testid="wallet-signer-policy-status"
1966
2037
  >
1967
- <strong>Native signer policy: ${v.state}</strong>
1968
- ${v.state===`locked`?e`
2038
+ <strong>Native signer policy: ${C.state}</strong>
2039
+ ${C.state===`locked`?e`
1969
2040
  <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.
2041
+ The role-safe deny-all baseline is active, so the wallet can receive but cannot send, swap, mine,
2042
+ bond, or execute wallet-capable skills. Spending authority requires a separate owner-reviewed
2043
+ policy; the Gateway cannot grant it silently.
1972
2044
  </div>
1973
2045
  `:t}
1974
- ${v.version&&v.hash?e`
2046
+ ${C.version&&C.hash?e`
1975
2047
  <div>
1976
- Version ${v.version} ·
2048
+ Version ${C.version} ·
1977
2049
  <span class="mono" style="overflow-wrap: anywhere"
1978
- >${v.hash}</span
2050
+ >${C.hash}</span
1979
2051
  >
1980
2052
  </div>
1981
2053
  `:t}
1982
- ${v.guidance?e`<div>${v.guidance}</div>`:t}
2054
+ ${C.guidance?e`<div>${C.guidance}</div>`:t}
2055
+ </div>
2056
+ `:t}
2057
+ ${v===`vault`&&r.providerId===`local-socket-signer`?e`
2058
+ <div class="callout" style="margin-top: 10px">
2059
+ <strong>Vault approval device · ${y.summary}</strong>
2060
+ <div>${y.detail}</div>
2061
+ ${y.setupCommand?e`<div class="mono" style="overflow-wrap: anywhere">
2062
+ ${y.setupCommand}
2063
+ </div>`:t}
2064
+ <div>
2065
+ This optional signer-owned device never changes Agent or Mining automation.
2066
+ </div>
1983
2067
  </div>
1984
2068
  `:t}
1985
- ${g===`mining`?T===`sweep`?e`
2069
+ ${v===`mining`?N===`sweep`?e`
1986
2070
  <div class="field">
1987
2071
  <div class="wallet-card-security__grid">
1988
2072
  <label class="field">
@@ -1993,13 +2077,13 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1993
2077
  >
1994
2078
  <option
1995
2079
  value="disabled"
1996
- ?selected=${!D.enabled}
2080
+ ?selected=${!O.enabled}
1997
2081
  >
1998
2082
  Off
1999
2083
  </option>
2000
2084
  <option
2001
2085
  value="enabled"
2002
- ?selected=${D.enabled}
2086
+ ?selected=${O.enabled}
2003
2087
  >
2004
2088
  On
2005
2089
  </option>
@@ -2008,38 +2092,38 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2008
2092
  <label class="field">
2009
2093
  <span>Destination</span>
2010
2094
  <select
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})}}
2095
+ ?disabled=${a.settingsBusy||!O.enabled||!a.onMiningSatSweepChange}
2096
+ @change=${e=>{let t=e.currentTarget.value;a.onMiningSatSweepChange?.(t===`__external__`?{destinationWalletId:void 0,destinationAddress:O.destinationAddress??``}:{destinationWalletId:t||void 0,destinationAddress:void 0})}}
2013
2097
  >
2014
2098
  <option
2015
2099
  value="__external__"
2016
- ?selected=${F===`external`}
2100
+ ?selected=${P===`external`}
2017
2101
  >
2018
2102
  External
2019
2103
  </option>
2020
- ${j.map(t=>e`
2104
+ ${A.map(t=>e`
2021
2105
  <option
2022
2106
  value=${t.id}
2023
- ?selected=${D.destinationWalletId===t.id}
2107
+ ?selected=${O.destinationWalletId===t.id}
2024
2108
  >
2025
2109
  ${t.name}
2026
2110
  </option>
2027
2111
  `)}
2028
2112
  </select>
2029
2113
  </label>
2030
- ${F===`external`?e`
2114
+ ${P===`external`?e`
2031
2115
  <label class="field">
2032
2116
  <span>Address</span>
2033
2117
  <input
2034
2118
  type="text"
2035
- .value=${D.destinationAddress??``}
2036
- ?disabled=${a.settingsBusy||!D.enabled||!a.onMiningSatSweepChange}
2119
+ .value=${O.destinationAddress??``}
2120
+ ?disabled=${a.settingsBusy||!O.enabled||!a.onMiningSatSweepChange}
2037
2121
  @change=${e=>a.onMiningSatSweepChange?.({destinationAddress:e.currentTarget.value.trim()||void 0,destinationWalletId:void 0})}
2038
2122
  placeholder="Solana address"
2039
2123
  />
2040
2124
  </label>
2041
2125
  `:t}
2042
- ${D.mode===`percentage`?e`
2126
+ ${O.mode===`percentage`?e`
2043
2127
  <label class="field">
2044
2128
  <span>Percent</span>
2045
2129
  <input
@@ -2047,8 +2131,8 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2047
2131
  min="1"
2048
2132
  max="100"
2049
2133
  step="1"
2050
- .value=${String(D.percentage??100)}
2051
- ?disabled=${a.settingsBusy||!D.enabled||!a.onMiningSatSweepChange}
2134
+ .value=${String(O.percentage??100)}
2135
+ ?disabled=${a.settingsBusy||!O.enabled||!a.onMiningSatSweepChange}
2052
2136
  @change=${e=>a.onMiningSatSweepChange?.({percentage:Math.max(1,Math.min(100,Number(e.currentTarget.value)||100))})}
2053
2137
  />
2054
2138
  </label>
@@ -2056,18 +2140,18 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2056
2140
  <label class="field">
2057
2141
  <span>Amount</span>
2058
2142
  <select
2059
- ?disabled=${a.settingsBusy||!D.enabled||!a.onMiningSatSweepChange}
2143
+ ?disabled=${a.settingsBusy||!O.enabled||!a.onMiningSatSweepChange}
2060
2144
  @change=${e=>a.onMiningSatSweepChange?.({mode:e.currentTarget.value===`percentage`?`percentage`:`all`})}
2061
2145
  >
2062
2146
  <option
2063
2147
  value="all"
2064
- ?selected=${D.mode!==`percentage`}
2148
+ ?selected=${O.mode!==`percentage`}
2065
2149
  >
2066
2150
  All
2067
2151
  </option>
2068
2152
  <option
2069
2153
  value="percentage"
2070
- ?selected=${D.mode===`percentage`}
2154
+ ?selected=${O.mode===`percentage`}
2071
2155
  >
2072
2156
  %
2073
2157
  </option>
@@ -2078,9 +2162,9 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2078
2162
  <input
2079
2163
  type="text"
2080
2164
  inputmode="decimal"
2081
- .value=${k(D.minRaw??`1`)}
2082
- ?disabled=${a.settingsBusy||!D.enabled||!a.onMiningSatSweepChange}
2083
- @change=${e=>a.onMiningSatSweepChange?.({minRaw:A(e.currentTarget.value)})}
2165
+ .value=${ae(O.minRaw??`1`)}
2166
+ ?disabled=${a.settingsBusy||!O.enabled||!a.onMiningSatSweepChange}
2167
+ @change=${e=>a.onMiningSatSweepChange?.({minRaw:oe(e.currentTarget.value)})}
2084
2168
  placeholder="1"
2085
2169
  />
2086
2170
  </label>
@@ -2089,24 +2173,24 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2089
2173
  <input
2090
2174
  type="text"
2091
2175
  inputmode="decimal"
2092
- .value=${k(D.keepRaw??`0`)}
2093
- ?disabled=${a.settingsBusy||!D.enabled||!a.onMiningSatSweepChange}
2094
- @change=${e=>a.onMiningSatSweepChange?.({keepRaw:A(e.currentTarget.value)})}
2176
+ .value=${ae(O.keepRaw??`0`)}
2177
+ ?disabled=${a.settingsBusy||!O.enabled||!a.onMiningSatSweepChange}
2178
+ @change=${e=>a.onMiningSatSweepChange?.({keepRaw:oe(e.currentTarget.value)})}
2095
2179
  placeholder="0"
2096
2180
  />
2097
2181
  </label>
2098
2182
  </div>
2099
2183
  </div>
2100
2184
  `:t: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`
2185
+ ${l&&N===`caps`?ve({props:a,settings:l,policyDisplay:w,cardRole:v,selectedWalletId:r.id,cardWalletCanSpendSolana:j,selectedWalletTokens:m,canEditPolicy:x}):t}
2186
+ ${v===`agent`&&N===`schedule`?e`
2103
2187
  <div class="field">
2104
2188
  <div class="wallet-card-security__grid">
2105
2189
  <label class="field">
2106
2190
  <span>Status</span>
2107
2191
  <select
2108
2192
  .value=${a.recurringTransferEnabled?`enabled`:`disabled`}
2109
- ?disabled=${a.settingsBusy||!b}
2193
+ ?disabled=${a.settingsBusy||!x}
2110
2194
  @change=${e=>a.onPolicyDraftChange({recurringTransferEnabled:e.currentTarget.value===`enabled`})}
2111
2195
  >
2112
2196
  <option value="disabled">Off</option>
@@ -2118,7 +2202,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2118
2202
  <input
2119
2203
  placeholder="@wallet:vault or Solana address"
2120
2204
  .value=${a.recurringTransferDestination}
2121
- ?disabled=${a.settingsBusy||!b}
2205
+ ?disabled=${a.settingsBusy||!x}
2122
2206
  @input=${e=>a.onPolicyDraftChange({recurringTransferDestination:e.currentTarget.value})}
2123
2207
  />
2124
2208
  </label>
@@ -2127,18 +2211,18 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2127
2211
  <input
2128
2212
  placeholder="Blank for SOL"
2129
2213
  .value=${a.recurringTransferMint}
2130
- ?disabled=${a.settingsBusy||!b}
2214
+ ?disabled=${a.settingsBusy||!x}
2131
2215
  @input=${e=>a.onPolicyDraftChange({recurringTransferMint:e.currentTarget.value})}
2132
2216
  />
2133
2217
  </label>
2134
- ${M?e`
2218
+ ${R?e`
2135
2219
  <label class="field">
2136
2220
  <span>Decimals</span>
2137
2221
  <input
2138
2222
  inputmode="numeric"
2139
2223
  placeholder="6"
2140
2224
  .value=${a.recurringTransferDecimals}
2141
- ?disabled=${a.settingsBusy||!b}
2225
+ ?disabled=${a.settingsBusy||!x}
2142
2226
  @input=${e=>a.onPolicyDraftChange({recurringTransferDecimals:e.currentTarget.value})}
2143
2227
  />
2144
2228
  </label>
@@ -2147,7 +2231,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2147
2231
  <span>Amount mode</span>
2148
2232
  <select
2149
2233
  .value=${a.recurringTransferAmountMode}
2150
- ?disabled=${a.settingsBusy||!b}
2234
+ ?disabled=${a.settingsBusy||!x}
2151
2235
  @change=${e=>a.onPolicyDraftChange({recurringTransferAmountMode:e.currentTarget.value===`percentage`?`percentage`:`fixed`})}
2152
2236
  >
2153
2237
  <option value="fixed">Fixed</option>
@@ -2161,25 +2245,25 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2161
2245
  inputmode="numeric"
2162
2246
  placeholder="40"
2163
2247
  .value=${a.recurringTransferPercentage}
2164
- ?disabled=${a.settingsBusy||!b}
2248
+ ?disabled=${a.settingsBusy||!x}
2165
2249
  @input=${e=>a.onPolicyDraftChange({recurringTransferPercentage:e.currentTarget.value})}
2166
2250
  />
2167
2251
  </label>
2168
2252
  <label class="field">
2169
2253
  <span>Minimum</span>
2170
2254
  <input
2171
- placeholder=${`0.01 ${N}`}
2255
+ placeholder=${`0.01 ${z}`}
2172
2256
  .value=${a.recurringTransferMinAmount}
2173
- ?disabled=${a.settingsBusy||!b}
2257
+ ?disabled=${a.settingsBusy||!x}
2174
2258
  @input=${e=>a.onPolicyDraftChange({recurringTransferMinAmount:e.currentTarget.value})}
2175
2259
  />
2176
2260
  </label>
2177
2261
  <label class="field">
2178
2262
  <span>Keep</span>
2179
2263
  <input
2180
- placeholder=${`0 ${N}`}
2264
+ placeholder=${`0 ${z}`}
2181
2265
  .value=${a.recurringTransferKeepAmount}
2182
- ?disabled=${a.settingsBusy||!b}
2266
+ ?disabled=${a.settingsBusy||!x}
2183
2267
  @input=${e=>a.onPolicyDraftChange({recurringTransferKeepAmount:e.currentTarget.value})}
2184
2268
  />
2185
2269
  </label>
@@ -2187,9 +2271,9 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2187
2271
  <label class="field">
2188
2272
  <span>Amount</span>
2189
2273
  <input
2190
- placeholder=${`0.1 ${N}`}
2274
+ placeholder=${`0.1 ${z}`}
2191
2275
  .value=${a.recurringTransferAmount}
2192
- ?disabled=${a.settingsBusy||!b}
2276
+ ?disabled=${a.settingsBusy||!x}
2193
2277
  @input=${e=>a.onPolicyDraftChange({recurringTransferAmount:e.currentTarget.value})}
2194
2278
  />
2195
2279
  </label>
@@ -2201,17 +2285,17 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2201
2285
  min="1"
2202
2286
  step="1"
2203
2287
  placeholder="1"
2204
- .value=${O.every}
2205
- ?disabled=${a.settingsBusy||!b}
2206
- @input=${e=>P({every:e.currentTarget.value})}
2288
+ .value=${I.every}
2289
+ ?disabled=${a.settingsBusy||!x}
2290
+ @input=${e=>B({every:e.currentTarget.value})}
2207
2291
  />
2208
2292
  </label>
2209
2293
  <label class="field">
2210
2294
  <span>Unit</span>
2211
2295
  <select
2212
- .value=${O.unit}
2213
- ?disabled=${a.settingsBusy||!b}
2214
- @change=${e=>P({unit:e.currentTarget.value})}
2296
+ .value=${I.unit}
2297
+ ?disabled=${a.settingsBusy||!x}
2298
+ @change=${e=>B({unit:e.currentTarget.value})}
2215
2299
  >
2216
2300
  <option value="minutes">minutes</option>
2217
2301
  <option value="hours">hours</option>
@@ -2219,14 +2303,14 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2219
2303
  <option value="months">months</option>
2220
2304
  </select>
2221
2305
  </label>
2222
- ${O.unit===`days`||O.unit===`months`?e`
2306
+ ${I.unit===`days`||I.unit===`months`?e`
2223
2307
  <label class="field">
2224
2308
  <span>At</span>
2225
2309
  <input
2226
2310
  type="time"
2227
- .value=${O.time}
2228
- ?disabled=${a.settingsBusy||!b}
2229
- @input=${e=>P({time:e.currentTarget.value})}
2311
+ .value=${I.time}
2312
+ ?disabled=${a.settingsBusy||!x}
2313
+ @input=${e=>B({time:e.currentTarget.value})}
2230
2314
  />
2231
2315
  </label>
2232
2316
  `:t}
@@ -2235,7 +2319,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2235
2319
  <input
2236
2320
  placeholder="America/Chicago"
2237
2321
  .value=${a.recurringTransferTz}
2238
- ?disabled=${a.settingsBusy||!b}
2322
+ ?disabled=${a.settingsBusy||!x}
2239
2323
  @input=${e=>a.onPolicyDraftChange({recurringTransferTz:e.currentTarget.value})}
2240
2324
  />
2241
2325
  </label>
@@ -2244,26 +2328,26 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2244
2328
  <input
2245
2329
  placeholder="Daily transfer"
2246
2330
  .value=${a.recurringTransferName}
2247
- ?disabled=${a.settingsBusy||!b}
2331
+ ?disabled=${a.settingsBusy||!x}
2248
2332
  @input=${e=>a.onPolicyDraftChange({recurringTransferName:e.currentTarget.value})}
2249
2333
  />
2250
2334
  </label>
2251
2335
  <button
2252
2336
  class="btn"
2253
- ?disabled=${a.settingsBusy||!b}
2337
+ ?disabled=${a.settingsBusy||!x}
2254
2338
  @click=${a.onSavePolicy}
2255
2339
  >
2256
2340
  ${a.settingsBusy?`Saving...`:`Save`}
2257
2341
  </button>
2258
2342
  </div>
2259
- ${O.custom?e`
2343
+ ${I.custom?e`
2260
2344
  <div class="wallet-security-note" style="margin-top: 8px">
2261
2345
  Existing custom schedule is preserved until you edit Every, Unit, or At.
2262
2346
  </div>
2263
2347
  `:t}
2264
2348
  </div>
2265
2349
  `:t}
2266
- ${g===`agent`&&T===`automation`?e`
2350
+ ${v===`agent`&&N===`automation`?e`
2267
2351
  ${e`
2268
2352
  <div class="field">
2269
2353
  <div class="wallet-spend-limit-row">
@@ -2271,7 +2355,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2271
2355
  <span>Status</span>
2272
2356
  <select
2273
2357
  .value=${a.policyAutoEnabled??l?.policy.directSigning??!0?`enabled`:`disabled`}
2274
- ?disabled=${a.settingsBusy||!l||!b}
2358
+ ?disabled=${a.settingsBusy||!l||!x}
2275
2359
  @change=${e=>a.onPolicyDraftChange({directSigning:e.currentTarget.value===`enabled`})}
2276
2360
  >
2277
2361
  <option value="disabled">Off</option>
@@ -2280,7 +2364,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2280
2364
  </label>
2281
2365
  <button
2282
2366
  class="btn"
2283
- ?disabled=${a.settingsBusy||!l||!b}
2367
+ ?disabled=${a.settingsBusy||!l||!x}
2284
2368
  @click=${a.onSavePolicy}
2285
2369
  >
2286
2370
  ${a.settingsBusy?`Saving...`:`Save`}
@@ -2289,7 +2373,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2289
2373
  </div>
2290
2374
  `}
2291
2375
  `:t}
2292
- ${g===`agent`&&T===`skills`?e`
2376
+ ${v===`agent`&&N===`skills`?e`
2293
2377
  ${e`
2294
2378
  <div class="field">
2295
2379
  <div class="wallet-spend-limit-row">
@@ -2297,7 +2381,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2297
2381
  <span>Status</span>
2298
2382
  <select
2299
2383
  .value=${a.policySkillsEnabled??l?.policy.skillsEnabled??!1?`enabled`:`disabled`}
2300
- ?disabled=${a.settingsBusy||!l||!b}
2384
+ ?disabled=${a.settingsBusy||!l||!x}
2301
2385
  @change=${e=>a.onPolicyDraftChange({skillsEnabled:e.currentTarget.value===`enabled`})}
2302
2386
  >
2303
2387
  <option value="disabled">Off</option>
@@ -2306,7 +2390,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2306
2390
  </label>
2307
2391
  <button
2308
2392
  class="btn"
2309
- ?disabled=${a.settingsBusy||!l||!b}
2393
+ ?disabled=${a.settingsBusy||!l||!x}
2310
2394
  @click=${a.onSavePolicy}
2311
2395
  >
2312
2396
  ${a.settingsBusy?`Saving...`:`Save`}
@@ -2331,7 +2415,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2331
2415
  <div>
2332
2416
  <div class="card-title wallet-title-with-help">
2333
2417
  <span>Wallet Approvals</span>
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.`)}
2418
+ ${p(`Reviewed sends, Vault actions, and federation signatures appear here. The signer executes only the exact prepared operation; Vault review may require its separately configured approval device.`)}
2335
2419
  </div>
2336
2420
  <div class="card-sub">Pending and recent reviewed wallet operations.</div>
2337
2421
  </div>
@@ -2363,7 +2447,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2363
2447
  <div>Created</div>
2364
2448
  <div>Action</div>
2365
2449
  </div>
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`
2450
+ ${a.approvals.map(n=>{let i=se({request:n,balances:a.balances}),o=ce({request:n,namedWallets:a.namedWallets}),s=Array.isArray(n.payload.routeProgramIds)?n.payload.routeProgramIds.map(e=>String(e).trim()).filter(Boolean):[];return e`
2367
2451
  <div
2368
2452
  id=${r(`wallet-approval`,n.id)}
2369
2453
  class="table-row"
@@ -2374,15 +2458,15 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2374
2458
  <div class="muted" style="font-size: 0.8em; margin-top: 4px;">
2375
2459
  expires ${new Date(n.expiresAt).toLocaleString()}
2376
2460
  </div>
2377
- ${ce({request:n,display:i,endpoints:o})}
2378
- ${le(n)}
2461
+ ${le({request:n,display:i,endpoints:o})}
2462
+ ${ue(n)}
2379
2463
  </div>
2380
2464
  <div>
2381
2465
  <div class="row" style="gap: 8px; align-items: center;">
2382
2466
  <span
2383
2467
  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)`};"
2384
2468
  >
2385
- ${xe(n.status)}
2469
+ ${Ce(n.status)}
2386
2470
  </span>
2387
2471
  <span style="font-size: 0.9em; font-weight: 600; text-transform: lowercase;">
2388
2472
  ${n.status}
@@ -2422,14 +2506,14 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2422
2506
  `:t}
2423
2507
  ${s.length>0?e`
2424
2508
  <div class="muted" style="font-size: 0.76em; margin-top: 4px;">
2425
- route ${s.map(e=>X(e,4,4)).join(`, `)}
2509
+ route ${s.map(e=>Y(e,4,4)).join(`, `)}
2426
2510
  </div>
2427
2511
  `:t}
2428
2512
  </div>
2429
2513
  <div style="min-width: 0;">
2430
2514
  ${o.fromAddress?e`
2431
2515
  <div class="mono" style="font-size: 0.82em;">
2432
- ${X(o.fromAddress)}
2516
+ ${Y(o.fromAddress)}
2433
2517
  </div>
2434
2518
  `:e`
2435
2519
  <div class="muted">—</div>
@@ -2438,7 +2522,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2438
2522
  <div style="min-width: 0;">
2439
2523
  ${o.toAddress?e`
2440
2524
  <div class="mono" style="font-size: 0.82em;">
2441
- ${X(o.toAddress)}
2525
+ ${Y(o.toAddress)}
2442
2526
  </div>
2443
2527
  `:e`
2444
2528
  <div class="muted">—</div>
@@ -2469,7 +2553,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2469
2553
  </span>
2470
2554
  `:n.result?.txHash?e`
2471
2555
  <span class="mono muted" style="font-size: 0.8em;">
2472
- ${X(n.result.txHash)}
2556
+ ${Y(n.result.txHash)}
2473
2557
  </span>
2474
2558
  `:e`
2475
2559
  <span class="muted">—</span>
@@ -2486,45 +2570,45 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2486
2570
  </div>
2487
2571
  `}
2488
2572
  </div>
2489
- ${z===`wallets`?e`<div class="card wallet-activity-card" style="grid-column: 1 / -1;">
2573
+ ${B===`wallets`?e`<div class="card wallet-activity-card" style="grid-column: 1 / -1;">
2490
2574
  <div class="wallet-activity-card__head">
2491
2575
  <div>
2492
2576
  <div class="card-title">Wallet Activity</div>
2493
2577
  <div class="card-sub">Recent send requests and outcomes.</div>
2494
2578
  </div>
2495
- ${m>0?e`<div class="wallet-status-chip">
2496
- Showing ${v+1}-${Math.min(v+s,m)} of ${m}
2579
+ ${h>0?e`<div class="wallet-status-chip">
2580
+ Showing ${y+1}-${Math.min(y+s,h)} of ${h}
2497
2581
  </div>`:t}
2498
2582
  </div>
2499
- ${m>0?e`
2583
+ ${h>0?e`
2500
2584
  <div class="wallet-activity-toolbar">
2501
2585
  <div class="wallet-chip-row">
2502
- <span class="wallet-status-chip">Page ${g} / ${h}</span>
2586
+ <span class="wallet-status-chip">Page ${_} / ${g}</span>
2503
2587
  </div>
2504
2588
  <div class="row" style="gap: 8px; flex-wrap: wrap;">
2505
2589
  <button
2506
2590
  class="btn small"
2507
- ?disabled=${g<=1}
2508
- @click=${()=>a.onActivityPageChange(g-1)}
2591
+ ?disabled=${_<=1}
2592
+ @click=${()=>a.onActivityPageChange(_-1)}
2509
2593
  >
2510
2594
  Prev
2511
2595
  </button>
2512
2596
  <button
2513
2597
  class="btn small"
2514
- ?disabled=${g>=h}
2515
- @click=${()=>a.onActivityPageChange(g+1)}
2598
+ ?disabled=${_>=g}
2599
+ @click=${()=>a.onActivityPageChange(_+1)}
2516
2600
  >
2517
2601
  Next
2518
2602
  </button>
2519
2603
  </div>
2520
2604
  </div>
2521
2605
  <div class="wallet-activity-list">
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`
2606
+ ${b.map(n=>{let r=n.details??{},i=N(r.chain),o=i===`solana`?I(r,`program`):``,s=z({details:r,balances:a.balances}),c=j(r.to,`n/a`),l=j(r.txHash||r.txId,``),u=j(r.reason,``),d=j(r.orderId,``),f=j(r.vaultPubkey,``),p=j(r.executionProvider,``),m=Fe(n.action);return e`
2523
2607
  <div class="wallet-activity-item" data-tone=${m}>
2524
2608
  <div class="wallet-activity-item__head">
2525
2609
  <div class="wallet-activity-item__title">
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>
2610
+ <span style="color: ${m===`danger`?`var(--danger)`:m===`success`?`var(--ok)`:m===`warn`?`var(--warn)`:`var(--muted)`};">${we(n.action)}</span>
2611
+ <span>${Se(n)}</span>
2528
2612
  </div>
2529
2613
  <div class="wallet-activity-item__time">
2530
2614
  ${new Date(n.at).toLocaleString()}
@@ -2532,17 +2616,17 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2532
2616
  </div>
2533
2617
  <div class="wallet-activity-item__facts">
2534
2618
  ${o?t:e`<span class="wallet-status-chip"
2535
- >${i?N(i):`n/a`}</span
2619
+ >${i?M(i):`n/a`}</span
2536
2620
  >`}
2537
2621
  <span class="wallet-status-chip">${s}</span>
2538
2622
  ${p?e`<span class="wallet-status-chip">${p}</span>`:t}
2539
2623
  </div>
2540
2624
  <div class="wallet-activity-item__rows">
2541
- ${c===`n/a`?t:$({label:`To`,value:X(c,10,8),rawValue:c,copyLabel:`destination address`,href:Q(i,`address`,c)})}
2542
- ${o?$({label:`Mint`,value:X(o,10,8),rawValue:o,copyLabel:`token mint`,href:Q(`solana`,`address`,o)}):t}
2543
- ${d?$({label:`Order`,value:X(d,10,8),rawValue:d,copyLabel:`order id`}):t}
2544
- ${f?$({label:`Vault`,value:X(f,10,8),rawValue:f,copyLabel:`vault address`,href:Q(`solana`,`address`,f)}):t}
2545
- ${l?$({label:`Tx`,value:X(l,10,8),rawValue:l,copyLabel:`transaction hash`,href:Q(i,`tx`,l)}):u?e`<div class="wallet-meta-row">
2625
+ ${c===`n/a`?t:$({label:`To`,value:Y(c,10,8),rawValue:c,copyLabel:`destination address`,href:Q(i,`address`,c)})}
2626
+ ${o?$({label:`Mint`,value:Y(o,10,8),rawValue:o,copyLabel:`token mint`,href:Q(`solana`,`address`,o)}):t}
2627
+ ${d?$({label:`Order`,value:Y(d,10,8),rawValue:d,copyLabel:`order id`}):t}
2628
+ ${f?$({label:`Vault`,value:Y(f,10,8),rawValue:f,copyLabel:`vault address`,href:Q(`solana`,`address`,f)}):t}
2629
+ ${l?$({label:`Tx`,value:Y(l,10,8),rawValue:l,copyLabel:`transaction hash`,href:Q(i,`tx`,l)}):u?e`<div class="wallet-meta-row">
2546
2630
  <span class="wallet-meta-row__label">Note</span>
2547
2631
  <span class="wallet-meta-row__value">${u}</span>
2548
2632
  <span class="wallet-meta-row__actions"></span>
@@ -2557,7 +2641,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2557
2641
  </div>
2558
2642
  `:t}
2559
2643
  </section>
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`
2644
+ `}function Le(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}=be(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=K(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`
2561
2645
  <div class="modal-overlay" @click=${n.onSendModalClose}>
2562
2646
  <div class="modal-card card" @click=${e=>e.stopPropagation()}>
2563
2647
  <div class="row" style="justify-content: space-between; align-items: center; margin-bottom: 16px;">
@@ -2566,7 +2650,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2566
2650
  <div class="muted" style="margin-top: 6px;">
2567
2651
  From ${p}
2568
2652
  ${u?e`<span class="mono" style="margin-left: 8px;">
2569
- ${X(u,4,4)}
2653
+ ${Y(u,4,4)}
2570
2654
  </span>`:t}
2571
2655
  </div>
2572
2656
  </div>
@@ -2584,7 +2668,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2584
2668
  >
2585
2669
  ${o.map(t=>e`
2586
2670
  <option value=${t.id} ?selected=${t.id===d?.id}>
2587
- ${t.symbol}${t.name&&t.name!==t.symbol?` · ${t.name}`:``} · ${Y(t.amountDisplay)}
2671
+ ${t.symbol}${t.name&&t.name!==t.symbol?` · ${t.name}`:``} · ${q(t.amountDisplay)}
2588
2672
  </option>
2589
2673
  `)}
2590
2674
  </select>
@@ -2728,5 +2812,5 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2728
2812
  }
2729
2813
  }
2730
2814
  </style>
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
2815
+ `}export{u as describeAdminControlShortcut,E as describeAgentDefaultAction,d as describeVaultSignerApproval,m as describeWalletAutomationPolicySummary,w as describeWalletRoleBadges,f as describeWalletSendFlow,g as hasWalletBalanceValue,k as orderWalletsForDisplay,Ie as renderWallet,h as resolveActiveMiningWalletId,C as resolveOperatorWalletRoles};
2816
+ //# sourceMappingURL=wallet-ByKBcYhm.js.map