@fased/fased 0.1.67 → 0.1.69

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 (187) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +20 -22
  3. package/config/sat-runtime.env +6 -2
  4. package/config/signer-protocol-v2.json +10 -0
  5. package/dist/agents/tools/wallet-action-tool.js +2 -0
  6. package/dist/agents/tools/wallet-tool.js +5 -3
  7. package/dist/brand.js +1 -1
  8. package/dist/build-info.json +3 -3
  9. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  10. package/dist/cli/program/register.wallet.js +119 -5
  11. package/dist/commands/wallet.js +1286 -74
  12. package/dist/config/sat-runtime-ids.js +6 -1
  13. package/dist/control-ui/assets/{app-De8gTtZU.js → app-BLFLoFPk.js} +1526 -1526
  14. package/dist/control-ui/assets/{federation-DgA9e-Pn.js → federation-SGMAnM_8.js} +2 -2
  15. package/dist/control-ui/assets/{index-DYYBRBOS.js → index-S88kp5ZQ.js} +3 -3
  16. package/dist/control-ui/assets/{mining-Dg-3ll0F.js → mining-ClI8RW4u.js} +2 -2
  17. package/dist/control-ui/assets/{wallet-DvStR_AT.js → wallet-CRIhDQbW.js} +325 -156
  18. package/dist/control-ui/index.html +1 -1
  19. package/dist/control-ui/version.json +1 -1
  20. package/dist/gateway/server-http.js +394 -55
  21. package/dist/mining/mainnet-sync.js +67 -5
  22. package/dist/operator/operator-readiness.js +1 -1
  23. package/dist/plugin-sdk/{actions-DRu135h0.js → actions-B-Vwj64K.js} +3 -3
  24. package/dist/plugin-sdk/{allow-list-DyAxs4yw.js → allow-list-Bf45HfoP.js} +1 -1
  25. package/dist/plugin-sdk/{audio-preflight-Dq_rJtqH.js → audio-preflight-CS7Q_7-R.js} +26 -25
  26. package/dist/plugin-sdk/{audit-C5d2z5U1.js → audit-CUULWG22.js} +1 -1
  27. package/dist/plugin-sdk/{channel-access-configure-DaI5wevh.js → channel-access-configure-BoUsC-Ys.js} +1 -1
  28. package/dist/plugin-sdk/{channel-adapters.discord-BS4S4Svh.js → channel-adapters.discord-DSiR4X2Y.js} +1 -1
  29. package/dist/plugin-sdk/channel-plugin-common.d.ts +2 -2
  30. package/dist/plugin-sdk/channel-plugin-common.js +1 -1
  31. package/dist/plugin-sdk/{chunk-CyoyqpbG.js → chunk-CBpl-AiQ.js} +1 -1
  32. package/dist/plugin-sdk/{chunk-items-Dunoq4Er.js → chunk-items-BLBZNORg.js} +1 -1
  33. package/dist/plugin-sdk/command-status.js +26 -25
  34. package/dist/plugin-sdk/{commands-registry-BfqdEWdF.js → commands-registry-G5KXSi_y.js} +1 -1
  35. package/dist/plugin-sdk/{config-schema--vl89M7d.js → config-schema-BiBOUW89.js} +431 -125
  36. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  37. package/dist/plugin-sdk/{diagnostic-DLL_zekv.js → diagnostic-sYs6Agr-.js} +1 -1
  38. package/dist/plugin-sdk/{directory-live-CSuYxdwk.js → directory-live-BXMpuYAF.js} +1 -1
  39. package/dist/plugin-sdk/{directory-live-Dw7ZgC9_.js → directory-live-Rn1BzPof.js} +1 -1
  40. package/dist/plugin-sdk/discord.d.ts +4 -4
  41. package/dist/plugin-sdk/discord.js +20 -20
  42. package/dist/plugin-sdk/{draft-stream-controls-BqchW1vi.js → draft-stream-controls-CMNdKSx-.js} +1 -1
  43. package/dist/plugin-sdk/{guilds-CDhRIX57.js → guilds-Dkwl0yHv.js} +1 -1
  44. package/dist/plugin-sdk/{handle-action-hvwapMKg.js → handle-action-CRdM6B-8.js} +15 -15
  45. package/dist/plugin-sdk/index.d.ts +15 -15
  46. package/dist/plugin-sdk/index.js +28 -27
  47. package/dist/plugin-sdk/{login-Ca583Okc.js → login-D7WnK8-P.js} +1 -1
  48. package/dist/plugin-sdk/{login-qr-CGciBSNP.js → login-qr-CRueOKZK.js} +2 -114
  49. package/dist/plugin-sdk/{markdown-tables-DCOXEUfZ.js → markdown-tables-d7GlUs5R.js} +1 -1
  50. package/dist/plugin-sdk/{media-CAdQF5TG.js → media-BAoaxCrt.js} +1 -1
  51. package/dist/plugin-sdk/{monitor-DrTy_4CL.js → monitor-WXdn4mR-.js} +34 -33
  52. package/dist/plugin-sdk/{monitor-CV1sr0p2.js → monitor-xzVAPbg2.js} +44 -43
  53. package/dist/plugin-sdk/{openresponses-http-BAjgURZa.js → openresponses-http-DnI1LFgq.js} +26 -25
  54. package/dist/plugin-sdk/{outbound-attachment-QqTnIhZL.js → outbound-attachment-CyXM3cAv.js} +1 -1
  55. package/dist/plugin-sdk/{outbound-BgVDdHxx.js → outbound-zB6llMGW.js} +6 -6
  56. package/dist/plugin-sdk/{pairing-message-BjIJYVvp.d.ts → pairing-message-CiTcdD6m.d.ts} +1 -1
  57. package/dist/plugin-sdk/{pairing-store-BChahgI2.js → pairing-store-B6J2C0vP.js} +1 -1
  58. package/dist/plugin-sdk/{pi-model-discovery-runtime-DxTMz_XF.js → pi-model-discovery-runtime-6JzLw9Gk.js} +1 -1
  59. package/dist/plugin-sdk/{probe-CJb5uR8B.js → probe-BM7Oe40M.js} +2 -2
  60. package/dist/plugin-sdk/{probe-l_whvGLY.js → probe-CMPksimh.js} +1 -1
  61. package/dist/plugin-sdk/{probe-BFroeK3g.js → probe-oVp12D6L.js} +1 -1
  62. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +1 -1
  63. package/dist/plugin-sdk/{pw-ai-DlxqX6Es.js → pw-ai-DZYLDC-S.js} +1 -1
  64. package/dist/plugin-sdk/qr-image-B4MlMG4N.js +115 -0
  65. package/dist/plugin-sdk/{replies-ChYo5ZQM.js → replies-CY-V0Zob.js} +3 -3
  66. package/dist/plugin-sdk/{resolve-channels-87LZrFk_.js → resolve-channels-1HtDcMqh.js} +2 -2
  67. package/dist/plugin-sdk/{resolve-channels-_-nV-EK2.js → resolve-channels-CU72Qh2j.js} +1 -1
  68. package/dist/plugin-sdk/{resolve-outbound-target-D-KGgHJZ.js → resolve-outbound-target-nQSBVYz9.js} +2 -2
  69. package/dist/plugin-sdk/{resolve-route-C8tvQm8Z.js → resolve-route-Dufnu2cT.js} +1 -1
  70. package/dist/plugin-sdk/{resolve-users-DN9VQBwv.js → resolve-users-Bk_ss2vC.js} +1 -1
  71. package/dist/plugin-sdk/{resolve-users-V6dHh_2B.js → resolve-users-IevCOk4W.js} +2 -2
  72. package/dist/plugin-sdk/{runtime-2B9_WKoI.js → runtime-CXSQwMaR.js} +1 -1
  73. package/dist/plugin-sdk/{runtime-dependency-nup8niQL.js → runtime-dependency-DczkvPxn.js} +9 -9
  74. package/dist/plugin-sdk/sat-runtime.d.ts +105 -10
  75. package/dist/plugin-sdk/sat-runtime.js +26 -25
  76. package/dist/plugin-sdk/{send-DCO441U7.js → send-BXBS_mRK.js} +8 -8
  77. package/dist/plugin-sdk/{send-CFzGKJXo.js → send-D-HfKQZm.js} +4 -4
  78. package/dist/plugin-sdk/{send-B6KkGKZD.js → send-D1j12ZgX.js} +5 -5
  79. package/dist/plugin-sdk/{send-q9HXrSwK.js → send-DWKm6yay.js} +10 -10
  80. package/dist/plugin-sdk/{send-gDoGA-7e.js → send-Di1Jit3L.js} +7 -7
  81. package/dist/plugin-sdk/{skill-commands-FKEPLS7T.js → skill-commands-iJtvpqgb.js} +2 -2
  82. package/dist/plugin-sdk/{slack-DSC6T2KW.js → slack-CkIRVDUK.js} +45 -44
  83. package/dist/plugin-sdk/{slack-actions-DhbMcp8M.js → slack-actions-BzUEszJa.js} +10 -10
  84. package/dist/plugin-sdk/slack.d.ts +4 -4
  85. package/dist/plugin-sdk/slack.js +6 -6
  86. package/dist/plugin-sdk/{sticker-cache-C0l_5IKg.js → sticker-cache-Dpap5ce_.js} +2 -2
  87. package/dist/plugin-sdk/{tables-B3jr0Pvq.js → tables-_1W36GII.js} +2 -2
  88. package/dist/plugin-sdk/{targets-CtSbTxYX.js → targets-DDbNnLnB.js} +2 -2
  89. package/dist/plugin-sdk/{telegram-actions-BwGBIVDE.js → telegram-actions-Cewdga8H.js} +30 -29
  90. package/dist/plugin-sdk/telegram.d.ts +4 -4
  91. package/dist/plugin-sdk/telegram.js +3 -3
  92. package/dist/plugin-sdk/{thread-bindings.lifecycle-QbkNl-m6.js → thread-bindings.lifecycle-Y9T3CQGf.js} +3 -3
  93. package/dist/plugin-sdk/{thread-bindings.state-D9hg_M1c.js → thread-bindings.state-D2oOWDpv.js} +1 -1
  94. package/dist/plugin-sdk/{tmp-fased-dir-DXnGKKgi.d.ts → tmp-fased-dir-BSEHc8MQ.d.ts} +8 -2
  95. package/dist/plugin-sdk/{types-eG9aYqXF.d.ts → types-BakzIzGN.d.ts} +1 -1
  96. package/dist/plugin-sdk/{types-Cegc86EP.d.ts → types-CzF0YQqK.d.ts} +3 -3
  97. package/dist/plugin-sdk/{web-C_AH5PyB.js → web-DGWi7i3B.js} +33 -32
  98. package/dist/plugin-sdk/{whatsapp-actions-Bj_rOncr.js → whatsapp-actions-Blu9-eX-.js} +9 -9
  99. package/dist/plugin-sdk/{whatsapp-heartbeat-B1WHkJIg.js → whatsapp-heartbeat-DjmQM7hq.js} +2 -2
  100. package/dist/plugin-sdk/whatsapp.d.ts +9 -9
  101. package/dist/plugin-sdk/whatsapp.js +7 -7
  102. package/dist/plugin-sdk/{wsl-J-HscWxS.js → wsl-CTvIWvZz.js} +1 -1
  103. package/dist/plugin-sdk/{zod-schema.providers-core-FaYR6KdD.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +61 -61
  104. package/dist/wallet/local-socket-signer-lifecycle.js +107 -3
  105. package/dist/wallet/local-socket-signer-protocol.js +97 -10
  106. package/dist/wallet/mining-wallet-retirement.js +256 -0
  107. package/dist/wallet/providers/local-socket-signer-adapter.js +10 -0
  108. package/dist/wallet/signer-network-admin.js +11 -118
  109. package/dist/wallet/signer-protocol-v2.generated.js +10 -0
  110. package/dist/wallet/solana-assets.js +9 -3
  111. package/dist/wallet/solana-rpc-read-fetch.js +65 -0
  112. package/dist/wallet/wallet-agent-selection.js +6 -10
  113. package/dist/wallet/wallet-provider-registry.js +70 -29
  114. package/dist/wallet/wallet-send-approvals.js +6 -2
  115. package/dist/wallet/wallet-status.js +63 -1
  116. package/dist/web/login-qr.js +1 -1
  117. package/dist/wizard/onboarding.js +86 -84
  118. package/dist/wizard/onboarding.wallet.js +10 -1
  119. package/extensions/acpx/package.json +1 -1
  120. package/extensions/bluebubbles/package.json +1 -1
  121. package/extensions/copilot-proxy/package.json +1 -1
  122. package/extensions/diagnostics-otel/package.json +1 -1
  123. package/extensions/fased-federation/package.json +1 -1
  124. package/extensions/google-gemini-cli-auth/package.json +1 -1
  125. package/extensions/imessage/package.json +1 -1
  126. package/extensions/irc/package.json +1 -1
  127. package/extensions/line/package.json +1 -1
  128. package/extensions/llm-task/package.json +1 -1
  129. package/extensions/lobster/package.json +1 -1
  130. package/extensions/matrix/CHANGELOG.md +12 -0
  131. package/extensions/matrix/package.json +1 -1
  132. package/extensions/mattermost/package.json +1 -1
  133. package/extensions/memory-core/package.json +2 -2
  134. package/extensions/memory-lancedb/package.json +1 -1
  135. package/extensions/minimax-portal-auth/package.json +1 -1
  136. package/extensions/msteams/CHANGELOG.md +12 -0
  137. package/extensions/msteams/package.json +1 -1
  138. package/extensions/nextcloud-talk/package.json +1 -1
  139. package/extensions/nostr/CHANGELOG.md +12 -0
  140. package/extensions/nostr/package.json +1 -1
  141. package/extensions/open-prose/package.json +1 -1
  142. package/extensions/sat-mining/package.json +1 -1
  143. package/extensions/signal/package.json +1 -1
  144. package/extensions/synology-chat/package.json +1 -1
  145. package/extensions/tlon/package.json +1 -1
  146. package/extensions/twitch/CHANGELOG.md +12 -0
  147. package/extensions/twitch/package.json +1 -1
  148. package/extensions/voice-call/CHANGELOG.md +12 -0
  149. package/extensions/voice-call/package.json +1 -1
  150. package/extensions/zalo/CHANGELOG.md +12 -0
  151. package/extensions/zalo/package.json +1 -1
  152. package/extensions/zalouser/CHANGELOG.md +12 -0
  153. package/extensions/zalouser/package.json +1 -1
  154. package/install.sh +286 -107
  155. package/package.json +4 -2
  156. package/scripts/fased-managed-updater.mjs +10 -2
  157. package/scripts/install-fased-signerd.sh +4 -8
  158. package/scripts/install-managed-runtime.mjs +10 -7
  159. package/scripts/install-runtime-profile.sh +27 -0
  160. package/scripts/start-managed.sh +13 -1
  161. /package/dist/plugin-sdk/{active-listener-B_NMtgPL.js → active-listener-p9Ooc1qj.js} +0 -0
  162. /package/dist/plugin-sdk/{blocks-input-Bg-8S2pl.js → blocks-input-DiZaqaN7.js} +0 -0
  163. /package/dist/plugin-sdk/{channel-access-CcFRdRPO.js → channel-access-B0aZBSd2.js} +0 -0
  164. /package/dist/plugin-sdk/{channel-activity-DBDMQ3yI.js → channel-activity-F07DjroV.js} +0 -0
  165. /package/dist/plugin-sdk/{channel-core-CFRs8LPy.js → channel-core-DoF4X04L.js} +0 -0
  166. /package/dist/plugin-sdk/{client-pI228AVT.js → client-DLY-kWF_.js} +0 -0
  167. /package/dist/plugin-sdk/{command-poll-backoff-yJU83wEq.js → command-poll-backoff-NAePk3eL.js} +0 -0
  168. /package/dist/plugin-sdk/{date-time-uUevHscU.js → date-time-ChY_tHoG.js} +0 -0
  169. /package/dist/plugin-sdk/{draft-stream-loop-CrOPfV3F.js → draft-stream-loop-DMBwjjd1.js} +0 -0
  170. /package/dist/plugin-sdk/{fetch-BtmoPIlf.js → fetch-B0v6OTUZ.js} +0 -0
  171. /package/dist/plugin-sdk/{filesystem-manager-DoI8IBNF.js → filesystem-manager-BzuIJ9K9.js} +0 -0
  172. /package/dist/plugin-sdk/{gateway-registry-DZDsqicG.js → gateway-registry-Bgl2GFgy.js} +0 -0
  173. /package/dist/plugin-sdk/{inbound-context-DrAcXE0y.js → inbound-context-CQnfFFQ9.js} +0 -0
  174. /package/dist/plugin-sdk/{pi-model-discovery-BX_JLcEJ.js → pi-model-discovery-BHNVyRny.js} +0 -0
  175. /package/dist/plugin-sdk/{polls-DKQXVfJp.js → polls-DXd67TD8.js} +0 -0
  176. /package/dist/plugin-sdk/{proxy-DWpYcsvR.js → proxy-CLRUdShp.js} +0 -0
  177. /package/dist/plugin-sdk/{qmd-manager-CgRaTxUq.js → qmd-manager-B8Vnu0ND.js} +0 -0
  178. /package/dist/plugin-sdk/{render-e7fENCYH.js → render-DrBfVs0u.js} +0 -0
  179. /package/dist/plugin-sdk/{reply-reference-Bqk-7HXE.js → reply-reference-BnAk5Wjb.js} +0 -0
  180. /package/dist/plugin-sdk/{retry-policy-C6SjKjQA.js → retry-policy-CXh1owkc.js} +0 -0
  181. /package/dist/plugin-sdk/{sandbox-paths-Dx2lUqCu.js → sandbox-paths-Bzh1CuZc.js} +0 -0
  182. /package/dist/plugin-sdk/{session-DHD4ZKyG.js → session-iuGR_rdi.js} +0 -0
  183. /package/dist/plugin-sdk/{shared-CBgp_GBw.js → shared-D1AD2Ejn.js} +0 -0
  184. /package/dist/plugin-sdk/{target-errors-Ckufe179.js → target-errors-DfS1sLR9.js} +0 -0
  185. /package/dist/plugin-sdk/{tool-loop-detection-Bp8bPJLs.js → tool-loop-detection-sDZl27w7.js} +0 -0
  186. /package/dist/plugin-sdk/{ui-Be8cLHIS.js → ui-GQDYm_jw.js} +0 -0
  187. /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===1?`skill override ${r[0]}`:r.length>1?`wallet allowlist ${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 explicitly. Otherwise routing checks a skill override, then the Agent assignment, then this optional Default Agent wallet fallback.`:`If no explicit, skill, or Agent assignment exists, approved wallet actions use this optional fallback.`,tone:`success`,walletId:o.id}:a.length>0?{title:`Agent wallets`,summary:`${a.length} set · no fallback`,detail:`Agent wallets can be selected by explicit @wallet:<id> handles. Set one default Agent wallet if approved actions should have a fallback.`,tone:`warn`,walletId:a[0]?.id}:r?{title:`Agent wallets`,summary:r,detail:`An Agent wallet is configured but not present in this wallet list right now. Refresh or repair the registry before paid Fased Network or skill wallet work.`,tone:`warn`,walletId:r}:{title:`Agent wallets`,summary:`Not set`,detail:`Mark at least one Agent wallet before paid Fased Network tasks, payment evidence, or skill wallet actions use a clear operator wallet.`,tone:`warn`},mining:c?{title:`SAT Mining`,summary:c.name,detail:`SAT mining uses the singleton @wallet:mining wallet for capital, cycle history, and restart recovery. Keep it separate from Agent wallets.`,tone:`success`,walletId:c.id}:s?{title:`SAT Mining`,summary:s,detail:`SAT runtime points at @wallet:mining, but that wallet is not visible in the current wallet list. Refresh mining and wallet state before SAT mining.`,tone:`warn`,walletId:s}:{title:`SAT Mining`,summary:`Not configured`,detail:`Create or import @wallet:mining in onboarding or CLI if you want SAT participation. Mining is optional and should not be assumed by Fased Network join.`,tone:`neutral`},bond:u?{title:`Fased Network Bond`,summary:u.name,detail:e.federationBond?.status===`active`?`This wallet currently holds the active SAT bond for Fased Network. Tier ${e.federationBond?.tier??`none`} · quota ${e.federationBond?.quotaBand??`standard`}.`:`This wallet is configured for Fased Network bond. Use the Fased Network page to open, increase, unlock, or re-prove the SAT bond.`,tone:e.federationBond?.status===`active`?`success`:e.federationBond?.status===`unlocking`?`warn`:`neutral`,walletId:u.id}:l?{title:`Fased Network Bond`,summary:l,detail:`A Fased Network bond Vault is configured but not visible in the current wallet list. Refresh wallet state or repair the local wallet registry before changing bond posture.`,tone:`warn`,walletId:l}:{title:`Fased Network Bond`,summary:`Not set`,detail:`Select a Vault wallet on Fased Network before longer-lived bond capital if you want bonded network access.`,tone:`neutral`},sharedWalletWarning:c&&a.some(e=>e.id===c.id)?`Agent and Mining wallets must stay separate. This singleton mining wallet is also marked Agent; use a dedicated Agent wallet and clear the Agent default before wallet work.`:null,miningWalletId:s,bondWalletId:l}}function te(e,t){return[]}function ne(r,i,a){if(r!==String(i?.walletId??``).trim())return t;let o=i?.status??`none`,s=o===`active`?`bond-active`:o===`unlocking`?`bond-unlocking`:`bond`,c=o===`active`?`Fased Network bond active`:o===`unlocking`?`Fased Network bond unlocking`:`Fased Network bond wallet`;return e`
10
10
  <button
11
11
  type="button"
12
12
  class="wallet-status-icon wallet-status-icon--button"
@@ -17,7 +17,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
17
17
  >
18
18
  ${n.shield}
19
19
  </button>
20
- `}function ne(r){let{role:i}=r;if(i===`mining`)return t;if(i===`vault`)return e`
20
+ `}function re(r){let{role:i}=r;if(i===`mining`)return t;if(i===`vault`)return e`
21
21
  <span
22
22
  class="wallet-status-icon"
23
23
  data-state="vault-manual"
@@ -35,12 +35,12 @@ 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 w(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
- `}function re(r){return r?.automation?.satSweep?.enabled?e`
43
+ `}function ie(r){return r?.automation?.satSweep?.enabled?e`
44
44
  <span
45
45
  class="wallet-status-icon"
46
46
  data-role="sweep-on"
@@ -48,18 +48,18 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
48
48
  >
49
49
  ${n.arrowDown}
50
50
  </span>
51
- `:t}function ie(r){return r.walletId===r.props.walletDetailsWalletId?(r.role===`agent`?[r.props.policyCapsEnabled?{dataRole:`policy-on`,title:`Caps active`,icon:n.shield}:null,r.props.recurringTransferEnabled?{dataRole:`policy-on`,title:`Recurring send active`,icon:n.send}:null,r.props.policySkillsEnabled?{dataRole:`policy-on`,title:`Skill wallet access gate is active. Individual skills still need explicit Wallet > Skill Grants.`,icon:n.spark}:null]:r.role===`vault`?[r.props.policyCapsEnabled?{dataRole:`policy-on`,title:`Vault caps active`,icon:n.shield}:null]:[]).filter(e=>e!==null).map(t=>e`
51
+ `:t}function ae(r){return r.walletId===r.props.walletDetailsWalletId?(r.role===`agent`?[r.props.policyCapsEnabled?{dataRole:`policy-on`,title:`Caps active`,icon:n.shield}:null,r.props.recurringTransferEnabled?{dataRole:`policy-on`,title:`Recurring send active`,icon:n.send}:null,r.props.policySkillsEnabled?{dataRole:`policy-on`,title:`Skill wallet access gate is active. Individual skills still need explicit Wallet > Skill Grants.`,icon:n.spark}:null]:r.role===`vault`?[r.props.policyCapsEnabled?{dataRole:`policy-on`,title:`Vault caps active`,icon:n.shield}:null]:[]).filter(e=>e!==null).map(t=>e`
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 T(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 fallback`:`Set fallback`,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 optional Default Agent wallet fallback. Existing Agent roles and assignments stay unchanged.`:`Use this as the optional Default Agent wallet fallback after explicit, skill, and Agent assignments.`}}function E(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 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 oe(e){return M(e,`n/a`).toLowerCase()===`solana`?`SOL`:M(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 j(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=Te({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(M(e.details.amount,``),o);if(s)return`${R(s)} ${i}`;let c=M(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 V(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?we(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?`${J(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=Te({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:J(s),assetPrimaryText:o?i:a??i??n,assetSecondaryText:!o&&i&&a&&i!==a?i:null,name:a,symbol:i,program:n,usesFallbackIdentity:o}:{amountValueText: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 se(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&&q(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`
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
59
  <span>to <span class="mono">${X(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 H(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:null}function U(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=>U(e)).filter(Boolean);return t.length>0?t.join(`, `):null}return null}function le(n){let r=H(n.payload.signerSemanticIntent),i=U(r?.type);if(!r||!i)return t;let a=[],o=(e,t)=>{let n=U(t);n&&a.push({label:e,value:n})},s=[];if(i.startsWith(`solana.jupiter.`)){let e=H(r.jupiter),t=H(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=U(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=>U(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=>U(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=H(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=H(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 W(e){return e.replace(/\.0+$/,``).replace(/(\.\d*?)0+$/,`$1`)}function G(e,t){let n=String(e??``).trim();if(!n)return`0`;try{let e=t===`SOL`?c:l,r=Number(n)/10**Number(e);if(!Number.isFinite(r))return`0`;let i=Math.abs(r);return t===`SAT`?W(i>=1e3?r.toFixed(1):i>=1?r.toFixed(2):r.toFixed(3)):i>=1||i>=.01?W(r.toFixed(2)):i>0?`<0.01`:`0`}catch{return n}}function K(e,t){let n=String(e??``).trim();if(!n)return`—`;let r=RegExp(`\\s*${t}$`,`i`);return n.replace(r,``).trim()||`0`}function ue(e){return String(e.miningProfile?.walletId??e.miningStatus?.walletId??e.miningReadiness?.selectedWalletId??``).trim()}function de(e,t,n){if(typeof e.balances?.solana==`string`&&e.balances.solana.trim())return J(K(j(e.balances.solana,`solana`),`SOL`));if(n){let e=String(t.miningReadiness?.balances.solBalanceDisplay??``).trim();if(e)return J(K(e,`SOL`));let n=String(t.miningStatus?.currentSolBalanceLamports??``).trim();if(n)return J(G(n,`SOL`))}return e.addresses?.solana?t.balancesLoading?`Loading`:`0`:t.balancesLoading?`Loading`:`—`}function q(e,t){return e&&e.addresses?.solana||``}function fe(e,t){return!e||t?.walletId!==e.id?[]:Array.isArray(t.assets?.solana)?t.assets.solana:[]}function pe(e,t){if(!e)return[];let n=[],r=ue(t)===e.id,i=fe(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:de(e,t,r),amountRaw:e.balances?.solana,isNative:!0,address:e.addresses?.solana});return n}function J(e){let t=e.trim();if(!t||t===`—`||t.toLowerCase()===`loading`)return e;let n=Number.parseFloat(t.replaceAll(`,`,``));return Number.isFinite(n)?n>0&&n<.01?`<0.01`:new Intl.NumberFormat(`en-US`,{minimumFractionDigits:0,maximumFractionDigits:2}).format(n):e}function Y(e){let t=e.mint?.trim();if(!t)return``;let n=e.drafts[t]?.[e.field];if(n!==void 0)return(e.drafts[t]?.decimals??-1)<0?F(n,e.decimals)??n:n;let r=e.settings?.policy.solana.tokenCaps?.[t]?.[e.field];return F(r,e.decimals)??``}function me(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 he(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 ge(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:ve(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 _e(n){let{props:r,settings:i,policyDisplay:a,cardRole:o,selectedWalletId:s,cardWalletCanSpendSolana:c,selectedWalletTokens:l,canEditPolicy:u}=n,d=r.policyCapsEnabled===!0,f=ge({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,7 +115,7 @@ 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"
@@ -128,7 +128,7 @@ 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"
@@ -140,32 +140,32 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
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=${Y({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=>me(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=${Y({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=>me(r,t.mint,t.decimals,`maxPerTx`,e.target.value)}
169
169
  />
170
170
  </label>
171
171
  </div>
@@ -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=${()=>he(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 ve(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 ye(e,t){let n=pe(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 be(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 xe(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`:be(e.action)}function Se(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 Ce(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 we(e){let t=e.trim();return t?t.length<=12?t:`${t.slice(0,4)}…${t.slice(-4)}`:`TOKEN`}function Te(e){if(!e||e.isNative||!e.program)return!1;let t=we(e.program);return String(e.symbol??``).trim().toUpperCase()===t.toUpperCase()&&String(e.name??``).trim()===`Token ${t}`}async function Ee(e){let t=e.trim();if(!(!t||typeof navigator>`u`||!navigator.clipboard))try{await navigator.clipboard.writeText(t)}catch{}}function De(e){return e.replace(/[^a-zA-Z0-9_-]/g,`-`)||`wallet`}function Oe(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 ke(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 Ee(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()||X(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=>{Ee(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,15 +339,18 @@ 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?ke(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>
349
349
  <div class="card-title">Skill Grants</div>
350
- <div class="card-sub">Per-skill caps for Agent wallets that have Skills enabled.</div>
350
+ <div class="card-sub">
351
+ Per-skill caps for Agent wallets. One wallet id is the explicit skill override;
352
+ multiple ids are an allowlist and normal Agent routing continues.
353
+ </div>
351
354
  </div>
352
355
  <button class="btn" ?disabled=${n.skillGrantsLoading} @click=${n.onRefresh}>
353
356
  ${n.skillGrantsLoading?`Refreshing...`:`Refresh`}
@@ -379,7 +382,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
379
382
  ${t.version?` · ${t.version}`:``}
380
383
  </span>
381
384
  </span>
382
- <span class="muted">${v(t.grantedWalletActions)}</span>
385
+ <span class="muted">${y(t.grantedWalletActions)}</span>
383
386
  </button>
384
387
  `})}
385
388
  </div>
@@ -388,12 +391,12 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
388
391
  <div>
389
392
  <span>Requested</span>
390
393
  <strong>
391
- ${y(i?.requestedWalletActions??null)}
394
+ ${b(i?.requestedWalletActions??null)}
392
395
  </strong>
393
396
  </div>
394
397
  <div>
395
398
  <span>Current grant</span>
396
- <strong>${v(i?.grantedWalletActions??null)}</strong>
399
+ <strong>${y(i?.grantedWalletActions??null)}</strong>
397
400
  </div>
398
401
  </div>
399
402
  <label class="field">
@@ -505,14 +508,14 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
505
508
  </div>
506
509
  `}
507
510
  </div>
508
- `}function Ne(n){let r=n.status,i=u(n);return e`
511
+ `}function Pe(n){let r=n.status,i=u(n),a=n.namedWallets.filter(e=>S(e,n.defaultWalletId)),o=[...new Set([...(n.agents??[]).map(e=>e.id.trim()).filter(Boolean),...Object.keys(n.assignments??{})])].toSorted();return e`
509
512
  <div class="wallet-top-grid">
510
513
  <div id="wallet-admin-control" class="card wallet-top-card">
511
514
  <div class="wallet-top-card__head">
512
515
  <div>
513
516
  <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.`)}
517
+ <div class="card-title">Control UI account passkey</div>
518
+ ${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
519
  ${w(i.summary,i.detail)}
517
520
  </div>
518
521
  </div>
@@ -544,9 +547,9 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
544
547
  `:t}
545
548
  </div>
546
549
  <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.
550
+ This is optional account security for the browser Control UI. It is not requested during
551
+ installation or wallet creation and does not gate Agent or Mining automation. A Vault
552
+ approval device is a separate signer-owned feature configured only for Vault review.
550
553
  </div>
551
554
  ${!i.enableVisible&&!i.enrollVisible?e`
552
555
  <details class="wallet-advanced-box">
@@ -577,9 +580,72 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
577
580
  `:t}
578
581
  ${n.passkeyError?e`<div class="callout danger">${n.passkeyError}</div>`:t}
579
582
  </div>
583
+ <div id="wallet-agent-routing" class="card wallet-top-card">
584
+ <div class="wallet-top-card__head">
585
+ <div>
586
+ <div class="card-title">Agent wallet routing</div>
587
+ <div class="card-sub">
588
+ Explicit action → one-wallet skill override → Agent assignment → optional Default
589
+ Agent wallet fallback. If none exists, the action stops with Select an Agent wallet.
590
+ </div>
591
+ </div>
592
+ </div>
593
+ <div class="wallet-security-device-list" style="margin-top: 12px">
594
+ ${o.length>0?o.map(t=>{let r=n.assignments?.[t],i=r||n.defaultWalletId||null;return e`
595
+ <div class="wallet-security-device-row">
596
+ <div>
597
+ <strong>${n.agents?.find(e=>e.id===t)?.name?.trim()||t}</strong>
598
+ <div class="wallet-security-note mono">${t}</div>
599
+ <div class="wallet-security-note">
600
+ Assigned: ${r||`none`} · Effective fallback:
601
+ ${i||`Select an Agent wallet`}
602
+ </div>
603
+ </div>
604
+ <button
605
+ class="btn small"
606
+ ?disabled=${n.settingsBusy||!r}
607
+ @click=${()=>n.onDeleteAgentAssignment?.(t)}
608
+ >
609
+ Clear assignment
610
+ </button>
611
+ </div>
612
+ `}):e`
613
+ <div class="wallet-security-note">No Agents are available yet.</div>
614
+ `}
615
+ </div>
616
+ <div class="wallet-card-security__grid" style="margin-top: 12px">
617
+ <label class="field">
618
+ <span>Agent</span>
619
+ <select
620
+ .value=${n.assignAgentId??``}
621
+ @change=${e=>n.onAssignAgentIdChange?.(e.target.value)}
622
+ >
623
+ <option value="">Select Agent</option>
624
+ ${o.map(t=>e`<option value=${t}>${t}</option>`)}
625
+ </select>
626
+ </label>
627
+ <label class="field">
628
+ <span>Assigned Agent wallet</span>
629
+ <select
630
+ .value=${n.assignWalletId??``}
631
+ @change=${e=>n.onAssignWalletIdChange?.(e.target.value)}
632
+ >
633
+ <option value="">No assignment</option>
634
+ ${a.map(t=>e`<option value=${t.id}>${t.name} (${t.id})</option>`)}
635
+ </select>
636
+ </label>
637
+ <button
638
+ class="btn primary"
639
+ ?disabled=${n.settingsBusy||!n.assignAgentId?.trim()}
640
+ @click=${n.onAssignAgentWallet}
641
+ >
642
+ Save assignment
643
+ </button>
644
+ </div>
645
+ </div>
580
646
  </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)}
647
+ `}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,te=c?.policyDisplay,w=v(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),P=D.destinationAddress||!D.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`,H=(a.providers??[]).filter(e=>(e.id===`local-socket-signer`||e.id===`turnkey`)&&e.operationsImplemented&&e.capabilities.operations.createWallet),U=a.createProvider??H[0]?.id??`local-socket-signer`,W=H.find(e=>e.id===U),G=!!(W?.enabled&&W.health.ok&&(!W.capabilities.requiresCredentials||W.credentialsConfigured)),K=a.namedWallets.find(e=>E(e.id,a)===`mining`||e.id===`mining`),q=a.createRole===`mining`&&!!K,fe=!!(a.createRole&&a.createName?.trim()&&(U!==`local-socket-signer`||a.createId?.trim()&&a.createRpcUrl?.trim())&&!q),Y=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`
648
+ ${Le(a)}
583
649
  <style>
584
650
  .wallet-dashboard {
585
651
  display: grid;
@@ -1720,7 +1786,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1720
1786
  }
1721
1787
  </style>
1722
1788
  <section id="wallet-dashboard" class="wallet-dashboard">
1723
- ${d?e`
1789
+ ${f?e`
1724
1790
  <div class="wallet-message-stack">
1725
1791
  ${a.error?e`<div class="callout danger">${a.error}</div>`:t}
1726
1792
  ${a.settingsError?e`<div class="callout danger">${a.settingsError}</div>`:t}
@@ -1734,28 +1800,28 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1734
1800
  <button
1735
1801
  class="btn"
1736
1802
  role="tab"
1737
- aria-selected=${z===`wallets`?`true`:`false`}
1738
- @click=${()=>W(`wallets`)}
1803
+ aria-selected=${B===`wallets`?`true`:`false`}
1804
+ @click=${()=>Y(`wallets`)}
1739
1805
  >
1740
1806
  Wallets
1741
1807
  </button>
1742
1808
  <button
1743
1809
  class="btn"
1744
1810
  role="tab"
1745
- aria-selected=${z===`access`?`true`:`false`}
1746
- @click=${()=>W(`access`)}
1811
+ aria-selected=${B===`access`?`true`:`false`}
1812
+ @click=${()=>Y(`access`)}
1747
1813
  >
1748
- Access
1814
+ Account Security
1749
1815
  </button>
1750
1816
  <button
1751
1817
  class="btn"
1752
1818
  role="tab"
1753
- aria-selected=${z===`skill-grants`?`true`:`false`}
1754
- @click=${()=>W(`skill-grants`)}
1819
+ aria-selected=${B===`skill-grants`?`true`:`false`}
1820
+ @click=${()=>Y(`skill-grants`)}
1755
1821
  >
1756
1822
  Skill Grants
1757
1823
  </button>
1758
- ${z===`wallets`?e`
1824
+ ${B===`wallets`?e`
1759
1825
  <span class="wallet-main-tabs__spacer"></span>
1760
1826
  <button
1761
1827
  class="btn small"
@@ -1774,7 +1840,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1774
1840
  </button>
1775
1841
  `:t}
1776
1842
  </div>
1777
- ${z===`skill-grants`?Me(a):z===`access`?Ne(a):e`<div id="wallet-wallets" class="wallet-wallets-section">
1843
+ ${B===`skill-grants`?Ne(a):B===`access`?Pe(a):e`<div id="wallet-wallets" class="wallet-wallets-section">
1778
1844
  <details class="wallet-create-panel">
1779
1845
  <summary>Create a signer-owned wallet</summary>
1780
1846
  <div class="wallet-create-grid">
@@ -1782,7 +1848,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1782
1848
  <span>Name</span>
1783
1849
  <input
1784
1850
  .value=${a.createName??``}
1785
- placeholder="Primary Agent wallet"
1851
+ placeholder="Agent wallet"
1786
1852
  autocomplete="off"
1787
1853
  @input=${e=>a.onCreateNameChange?.(e.target.value)}
1788
1854
  />
@@ -1791,7 +1857,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1791
1857
  <span>Permanent wallet ID</span>
1792
1858
  <input
1793
1859
  .value=${a.createId??``}
1794
- placeholder=${V===`local-socket-signer`?`agent-primary (required)`:`optional local label`}
1860
+ placeholder=${U===`local-socket-signer`?`agent-operations (required)`:`optional local label`}
1795
1861
  autocomplete="off"
1796
1862
  @input=${e=>a.onCreateIdChange?.(e.target.value)}
1797
1863
  />
@@ -1799,10 +1865,10 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1799
1865
  <label class="field">
1800
1866
  <span>Custody provider</span>
1801
1867
  <select
1802
- .value=${V}
1868
+ .value=${U}
1803
1869
  @change=${e=>a.onCreateProviderChange?.(e.target.value)}
1804
1870
  >
1805
- ${B.map(t=>e`
1871
+ ${H.map(t=>e`
1806
1872
  <option value=${t.id}>
1807
1873
  ${t.label||(t.id===`local-socket-signer`?`Native Go signer`:`Turnkey`)}
1808
1874
  </option>
@@ -1812,42 +1878,56 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1812
1878
  <label class="field">
1813
1879
  <span>Wallet role</span>
1814
1880
  <select
1815
- .value=${a.createRole??`agent`}
1881
+ .value=${a.createRole??``}
1816
1882
  @change=${e=>a.onCreateRoleChange?.(e.target.value)}
1817
1883
  >
1884
+ <option value="" disabled>Select a role</option>
1818
1885
  <option value="agent">Agent — capped automation</option>
1886
+ <option value="mining">Mining — singleton SAT operations</option>
1819
1887
  <option value="vault">Vault — reviewed operations only</option>
1820
1888
  </select>
1821
1889
  </label>
1890
+ ${U===`local-socket-signer`?e`
1891
+ <label class="field">
1892
+ <span>Primary Solana RPC</span>
1893
+ <input
1894
+ .value=${a.createRpcUrl??``}
1895
+ placeholder="https://your-solana-rpc.example"
1896
+ autocomplete="off"
1897
+ spellcheck="false"
1898
+ @input=${e=>a.onCreateRpcUrlChange?.(e.target.value)}
1899
+ />
1900
+ </label>
1901
+ `:t}
1822
1902
  <div class="wallet-create-actions">
1823
1903
  <button
1824
1904
  class="btn primary"
1825
- ?disabled=${a.settingsBusy||!U}
1905
+ ?disabled=${a.settingsBusy||!G||!fe}
1826
1906
  @click=${a.onCreateWallet}
1827
1907
  >
1828
1908
  ${a.settingsBusy?`Creating...`:`Create wallet`}
1829
1909
  </button>
1830
1910
  <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.`}
1911
+ ${q?`Mining already uses ${K?.name??K?.id}. Open, Replace, or Archive that singleton wallet.`:a.createRole?W?W.enabled?W.health.ok?W.capabilities.requiresCredentials&&!W.credentialsConfigured?`Configure restricted provider credentials before creating a wallet.`:U===`local-socket-signer`?`The Go signer generates the key; Node receives only the public address.`:`Turnkey creates the account under the configured restrictive policy.`:W.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
1912
  </span>
1833
1913
  </div>
1834
1914
  </div>
1835
1915
  </details>
1836
1916
  ${a.balancesError?e`<div class="callout danger">${a.balancesError}</div>`:t}
1837
1917
  <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`
1918
+ ${T.map(r=>{let s=de(r,a,ue(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)?pe(r,a).filter(e=>e.chain===`solana`):[]).filter(e=>!e.isNative),h=r.addresses?.solana||``,g=`wallet-address-${De(r.id)}`,_=s,v=E(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,w=r.readiness?.signer,T=r.providerId!==`local-socket-signer`||w?.networkReady===!0,O=w?.networkVersion??(typeof r.metadata?.networkVersion==`number`?r.metadata.networkVersion:void 0),M=r.providerId!==`local-socket-signer`||r.readiness?.ready===!0,oe=ee(r).includes(`solana`),N=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.`}],I=a.policyPanel&&N.some(e=>e.id===a.policyPanel)?a.policyPanel:N[0]?.id??`caps`,R=i(a.recurringTransferCron??``),z=String(a.recurringTransferMint??``).trim(),B=z?`token`:`SOL`,V=e=>a.onPolicyDraftChange({recurringTransferCron:o({every:e.every??R.every,unit:e.unit??R.unit,time:e.time??R.time})});return e`
1839
1919
  <div class="wallet-card" title=${r.id}>
1840
1920
  <div class="wallet-card__header">
1841
1921
  <div class="wallet-card__identity">
1842
1922
  <div class="wallet-card__title-row">
1843
1923
  <div class="wallet-card__title">${r.name}</div>
1844
- ${te(r.id,a.federationBond,a.onNavigate)}
1845
- ${g===`mining`?re(a.miningProfile):t}
1846
- ${ie({walletId:r.id,role:g,props:a})}
1847
- ${ne({role:g,automationEnabled:_})}
1924
+ ${ne(r.id,a.federationBond,a.onNavigate)}
1925
+ ${v===`mining`?ie(a.miningProfile):t}
1926
+ ${ae({walletId:r.id,role:v,props:a})}
1927
+ ${re({role:v,automationEnabled:b})}
1848
1928
  </div>
1849
1929
  <div class="wallet-card__address-row">
1850
- ${p?e`
1930
+ ${h?e`
1851
1931
  <span
1852
1932
  class="wallet-card__wallet-icon"
1853
1933
  title="Wallet address configured"
@@ -1856,7 +1936,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1856
1936
  ${n.wallet}
1857
1937
  </span>
1858
1938
  <span
1859
- id=${m}
1939
+ id=${g}
1860
1940
  class="mono wallet-card__address"
1861
1941
  data-revealed="false"
1862
1942
  >
@@ -1868,35 +1948,57 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1868
1948
  class="wallet-icon-btn"
1869
1949
  title="Show wallet address"
1870
1950
  aria-label="Show wallet address"
1871
- @click=${()=>De(m,`******`,p)}
1951
+ @click=${()=>Oe(g,`******`,h)}
1872
1952
  >
1873
1953
  <span class="wallet-copy-btn__icon">${n.eye}</span>
1874
1954
  </button>
1875
- ${Oe(p,`wallet address`)}
1876
- ${Z(Q(`solana`,`address`,p),`Open wallet address`)}
1955
+ ${ke(h,`wallet address`)}
1956
+ ${Z(Q(`solana`,`address`,h),`Open wallet address`)}
1877
1957
  </span>
1878
1958
  `:e`
1879
1959
  <span class="muted">No wallet address</span>
1880
1960
  `}
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`})}
1961
+ ${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`})}
1962
+ ${h?e`
1963
+ <details>
1964
+ <summary>Receive QR</summary>
1965
+ <div class="qr-wrap">
1966
+ <img
1967
+ src=${`/api/wallet/receive-qr?walletId=${encodeURIComponent(r.id)}`}
1968
+ alt=${`Solana receive QR for ${r.name}`}
1969
+ loading="lazy"
1970
+ />
1971
+ </div>
1972
+ </details>
1973
+ `:t}
1882
1974
  </div>
1883
1975
  </div>
1884
1976
  <div class="row" style="gap: 8px;">
1885
1977
  <button
1886
- class="btn small ${d?`primary`:``}"
1978
+ class="btn small ${p?`primary`:``}"
1887
1979
  @click=${()=>a.onWalletDetailsWalletChange(r.id)}
1888
1980
  >
1889
1981
  Policy
1890
1982
  </button>
1983
+ ${r.providerId===`local-socket-signer`?e`
1984
+ <button
1985
+ class="btn small danger"
1986
+ ?disabled=${a.settingsBusy||!a.onArchiveWallet}
1987
+ title="The server requires Mining runtime obligations to be settled and locks the signer key deny-all. Confirm external balances and recovery before archiving."
1988
+ @click=${()=>a.onArchiveWallet?.(r.id)}
1989
+ >
1990
+ ${v===`mining`?`Archive Mining`:`Archive`}
1991
+ </button>
1992
+ `:t}
1891
1993
  </div>
1892
1994
  </div>
1893
1995
  <div class="wallet-card__balance-row">
1894
1996
  <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})}
1997
+ ${Me(`SOL`,_,`neutral`,{title:`Solana`,onClick:r.addresses?.solana?()=>(a.onWalletBalanceWalletChange??a.onWalletDetailsWalletChange)(r.id):void 0})}
1896
1998
  <button
1897
1999
  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`}
2000
+ ?disabled=${!S||!M}
2001
+ title=${M?`Send from this wallet`:`Setup incomplete: live signer key, role baseline, or network readiness is not confirmed`}
1900
2002
  @click=${()=>a.onSendModalOpen(r.id)}
1901
2003
  >
1902
2004
  Send
@@ -1906,28 +2008,28 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1906
2008
  <button
1907
2009
  type="button"
1908
2010
  class="wallet-balance-link"
1909
- data-active=${u?`true`:`false`}
2011
+ data-active=${f?`true`:`false`}
1910
2012
  @click=${()=>(a.onWalletBalanceWalletChange??a.onWalletDetailsWalletChange)(r.id)}
1911
2013
  >
1912
2014
  <span class="wallet-balance-link__icon">${n.barChart}</span>
1913
2015
  <span>Balance</span>
1914
2016
  </button>
1915
2017
  `:t}
1916
- ${f.length>0?e`
2018
+ ${m.length>0?e`
1917
2019
  <div class="wallet-token-details">
1918
2020
  <div class="wallet-token-list">
1919
- ${f.map(n=>e`
2021
+ ${m.map(n=>e`
1920
2022
  <div class="row" style="gap: 8px; align-items: center;">
1921
2023
  <button
1922
2024
  class="btn small"
1923
2025
  style="display: inline-flex; gap: 8px; align-items: center;"
1924
- ?disabled=${!x||!y}
2026
+ ?disabled=${!S||!M}
1925
2027
  @click=${()=>a.onSendModalOpen(r.id,n.id)}
1926
2028
  >
1927
- ${_e(n,20)}
2029
+ ${ve(n,20)}
1928
2030
  <span>${n.symbol}</span>
1929
2031
  <span class="muted"
1930
- >${Y(n.amountDisplay)}</span
2032
+ >${J(n.amountDisplay)}</span
1931
2033
  >
1932
2034
  </button>
1933
2035
  ${n.program?Z(Q(`solana`,`address`,n.program),`Open ${n.symbol} mint`):t}
@@ -1935,54 +2037,121 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
1935
2037
  `)}
1936
2038
  </div>
1937
2039
  </div>
1938
- `:u&&a.balancesLoading?e`
2040
+ `:f&&a.balancesLoading?e`
1939
2041
  <div class="muted" style="font-size: 0.85em">Loading balance...</div>
1940
- `:u&&r.addresses?.solana?e`
2042
+ `:f&&r.addresses?.solana?e`
1941
2043
  <div class="muted" style="font-size: 0.85em">Balance loaded. No SPL token balances detected.</div>
1942
2044
  `:t}
1943
2045
  </div>
1944
- ${d?e`
2046
+ ${p?e`
1945
2047
  <div id="wallet-security-card" class="wallet-card-security">
1946
2048
  <div class="wallet-policy-tabs" role="tablist" aria-label="Wallet policy sections">
1947
- ${w.map(t=>e`
2049
+ ${N.map(t=>e`
1948
2050
  <button
1949
2051
  type="button"
1950
2052
  class="wallet-policy-tab"
1951
- data-active=${T===t.id?`true`:`false`}
2053
+ data-active=${I===t.id?`true`:`false`}
1952
2054
  title=${t.title}
1953
2055
  role="tab"
1954
- aria-selected=${T===t.id?`true`:`false`}
2056
+ aria-selected=${I===t.id?`true`:`false`}
1955
2057
  @click=${()=>a.onPolicyPanelChange?.(t.id)}
1956
2058
  >
1957
2059
  ${t.label}
1958
2060
  </button>
1959
2061
  `)}
1960
2062
  </div>
1961
- ${v?e`
2063
+ ${r.providerId===`local-socket-signer`?e`
1962
2064
  <div
1963
- class="callout ${v.state===`acknowledged`?`success`:`warn`}"
2065
+ class="callout ${T?`success`:`warn`}"
2066
+ style="margin-top: 10px"
2067
+ data-testid="wallet-signer-network-status"
2068
+ >
2069
+ <strong
2070
+ >Signer RPC: ${T?`ready${O?` · version ${O}`:``}`:`not ready`}</strong
2071
+ >
2072
+ <div>
2073
+ Enter one primary RPC. The Go signer verifies its genesis;
2074
+ ordinary setup never asks for a Solana network or a second
2075
+ RPC.
2076
+ </div>
2077
+ <div class="wallet-card-security__grid" style="margin-top: 8px">
2078
+ <label class="field">
2079
+ <span>Replace primary Solana RPC</span>
2080
+ <input
2081
+ .value=${a.rpcUrl??``}
2082
+ placeholder="https://your-solana-rpc.example"
2083
+ autocomplete="off"
2084
+ spellcheck="false"
2085
+ @input=${e=>a.onRpcUrlChange?.(e.target.value)}
2086
+ />
2087
+ </label>
2088
+ <button
2089
+ class="btn small"
2090
+ ?disabled=${a.settingsBusy||!a.rpcUrl?.trim()||!a.onSaveWalletRpc}
2091
+ @click=${a.onSaveWalletRpc}
2092
+ >
2093
+ Verify and save RPC
2094
+ </button>
2095
+ </div>
2096
+ </div>
2097
+ `:t}
2098
+ ${C?e`
2099
+ <div
2100
+ class="callout ${C.state===`acknowledged`?`success`:`warn`}"
1964
2101
  style="margin-top: 10px"
1965
2102
  data-testid="wallet-signer-policy-status"
1966
2103
  >
1967
- <strong>Native signer policy: ${v.state}</strong>
1968
- ${v.state===`locked`?e`
2104
+ <strong>Native signer policy: ${C.state}</strong>
2105
+ ${C.state===`locked`?e`
1969
2106
  <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.
2107
+ This pre-role-baseline wallet remains deny-all. Review its immutable role, then select Activate
2108
+ role baseline with the native wallet CLI. No root policy helper is required.
1972
2109
  </div>
1973
2110
  `:t}
1974
- ${v.version&&v.hash?e`
2111
+ ${C.version&&C.hash?e`
1975
2112
  <div>
1976
- Version ${v.version} ·
2113
+ Version ${C.version} ·
1977
2114
  <span class="mono" style="overflow-wrap: anywhere"
1978
- >${v.hash}</span
2115
+ >${C.hash}</span
1979
2116
  >
1980
2117
  </div>
1981
2118
  `:t}
1982
- ${v.guidance?e`<div>${v.guidance}</div>`:t}
2119
+ ${C.guidance?e`<div>${C.guidance}</div>`:t}
2120
+ </div>
2121
+ `:t}
2122
+ ${w?e`
2123
+ <div
2124
+ class="callout ${w.ready?`success`:`warn`}"
2125
+ style="margin-top: 10px"
2126
+ data-testid="wallet-live-readiness"
2127
+ >
2128
+ <strong
2129
+ >Role readiness:
2130
+ ${w.ready?`ready`:`setup incomplete`}</strong
2131
+ >
2132
+ <div>
2133
+ ${w.role} baseline v${w.baselineVersion}
2134
+ · ${w.operationLane}
2135
+ </div>
2136
+ <div>
2137
+ Policy v${w.policyVersion} · Network
2138
+ v${w.networkVersion}
2139
+ </div>
2140
+ </div>
2141
+ `:t}
2142
+ ${v===`vault`&&r.providerId===`local-socket-signer`?e`
2143
+ <div class="callout" style="margin-top: 10px">
2144
+ <strong>Vault approval device · ${y.summary}</strong>
2145
+ <div>${y.detail}</div>
2146
+ ${y.setupCommand?e`<div class="mono" style="overflow-wrap: anywhere">
2147
+ ${y.setupCommand}
2148
+ </div>`:t}
2149
+ <div>
2150
+ This optional signer-owned device never changes Agent or Mining automation.
2151
+ </div>
1983
2152
  </div>
1984
2153
  `:t}
1985
- ${g===`mining`?T===`sweep`?e`
2154
+ ${v===`mining`?I===`sweep`?e`
1986
2155
  <div class="field">
1987
2156
  <div class="wallet-card-security__grid">
1988
2157
  <label class="field">
@@ -2013,7 +2182,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2013
2182
  >
2014
2183
  <option
2015
2184
  value="__external__"
2016
- ?selected=${F===`external`}
2185
+ ?selected=${P===`external`}
2017
2186
  >
2018
2187
  External
2019
2188
  </option>
@@ -2027,7 +2196,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2027
2196
  `)}
2028
2197
  </select>
2029
2198
  </label>
2030
- ${F===`external`?e`
2199
+ ${P===`external`?e`
2031
2200
  <label class="field">
2032
2201
  <span>Address</span>
2033
2202
  <input
@@ -2098,15 +2267,15 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2098
2267
  </div>
2099
2268
  </div>
2100
2269
  `: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`
2270
+ ${l&&I===`caps`?_e({props:a,settings:l,policyDisplay:te,cardRole:v,selectedWalletId:r.id,cardWalletCanSpendSolana:oe,selectedWalletTokens:m,canEditPolicy:x}):t}
2271
+ ${v===`agent`&&I===`schedule`?e`
2103
2272
  <div class="field">
2104
2273
  <div class="wallet-card-security__grid">
2105
2274
  <label class="field">
2106
2275
  <span>Status</span>
2107
2276
  <select
2108
2277
  .value=${a.recurringTransferEnabled?`enabled`:`disabled`}
2109
- ?disabled=${a.settingsBusy||!b}
2278
+ ?disabled=${a.settingsBusy||!x}
2110
2279
  @change=${e=>a.onPolicyDraftChange({recurringTransferEnabled:e.currentTarget.value===`enabled`})}
2111
2280
  >
2112
2281
  <option value="disabled">Off</option>
@@ -2118,7 +2287,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2118
2287
  <input
2119
2288
  placeholder="@wallet:vault or Solana address"
2120
2289
  .value=${a.recurringTransferDestination}
2121
- ?disabled=${a.settingsBusy||!b}
2290
+ ?disabled=${a.settingsBusy||!x}
2122
2291
  @input=${e=>a.onPolicyDraftChange({recurringTransferDestination:e.currentTarget.value})}
2123
2292
  />
2124
2293
  </label>
@@ -2127,18 +2296,18 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2127
2296
  <input
2128
2297
  placeholder="Blank for SOL"
2129
2298
  .value=${a.recurringTransferMint}
2130
- ?disabled=${a.settingsBusy||!b}
2299
+ ?disabled=${a.settingsBusy||!x}
2131
2300
  @input=${e=>a.onPolicyDraftChange({recurringTransferMint:e.currentTarget.value})}
2132
2301
  />
2133
2302
  </label>
2134
- ${M?e`
2303
+ ${z?e`
2135
2304
  <label class="field">
2136
2305
  <span>Decimals</span>
2137
2306
  <input
2138
2307
  inputmode="numeric"
2139
2308
  placeholder="6"
2140
2309
  .value=${a.recurringTransferDecimals}
2141
- ?disabled=${a.settingsBusy||!b}
2310
+ ?disabled=${a.settingsBusy||!x}
2142
2311
  @input=${e=>a.onPolicyDraftChange({recurringTransferDecimals:e.currentTarget.value})}
2143
2312
  />
2144
2313
  </label>
@@ -2147,7 +2316,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2147
2316
  <span>Amount mode</span>
2148
2317
  <select
2149
2318
  .value=${a.recurringTransferAmountMode}
2150
- ?disabled=${a.settingsBusy||!b}
2319
+ ?disabled=${a.settingsBusy||!x}
2151
2320
  @change=${e=>a.onPolicyDraftChange({recurringTransferAmountMode:e.currentTarget.value===`percentage`?`percentage`:`fixed`})}
2152
2321
  >
2153
2322
  <option value="fixed">Fixed</option>
@@ -2161,25 +2330,25 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2161
2330
  inputmode="numeric"
2162
2331
  placeholder="40"
2163
2332
  .value=${a.recurringTransferPercentage}
2164
- ?disabled=${a.settingsBusy||!b}
2333
+ ?disabled=${a.settingsBusy||!x}
2165
2334
  @input=${e=>a.onPolicyDraftChange({recurringTransferPercentage:e.currentTarget.value})}
2166
2335
  />
2167
2336
  </label>
2168
2337
  <label class="field">
2169
2338
  <span>Minimum</span>
2170
2339
  <input
2171
- placeholder=${`0.01 ${N}`}
2340
+ placeholder=${`0.01 ${B}`}
2172
2341
  .value=${a.recurringTransferMinAmount}
2173
- ?disabled=${a.settingsBusy||!b}
2342
+ ?disabled=${a.settingsBusy||!x}
2174
2343
  @input=${e=>a.onPolicyDraftChange({recurringTransferMinAmount:e.currentTarget.value})}
2175
2344
  />
2176
2345
  </label>
2177
2346
  <label class="field">
2178
2347
  <span>Keep</span>
2179
2348
  <input
2180
- placeholder=${`0 ${N}`}
2349
+ placeholder=${`0 ${B}`}
2181
2350
  .value=${a.recurringTransferKeepAmount}
2182
- ?disabled=${a.settingsBusy||!b}
2351
+ ?disabled=${a.settingsBusy||!x}
2183
2352
  @input=${e=>a.onPolicyDraftChange({recurringTransferKeepAmount:e.currentTarget.value})}
2184
2353
  />
2185
2354
  </label>
@@ -2187,9 +2356,9 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2187
2356
  <label class="field">
2188
2357
  <span>Amount</span>
2189
2358
  <input
2190
- placeholder=${`0.1 ${N}`}
2359
+ placeholder=${`0.1 ${B}`}
2191
2360
  .value=${a.recurringTransferAmount}
2192
- ?disabled=${a.settingsBusy||!b}
2361
+ ?disabled=${a.settingsBusy||!x}
2193
2362
  @input=${e=>a.onPolicyDraftChange({recurringTransferAmount:e.currentTarget.value})}
2194
2363
  />
2195
2364
  </label>
@@ -2201,17 +2370,17 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2201
2370
  min="1"
2202
2371
  step="1"
2203
2372
  placeholder="1"
2204
- .value=${O.every}
2205
- ?disabled=${a.settingsBusy||!b}
2206
- @input=${e=>P({every:e.currentTarget.value})}
2373
+ .value=${R.every}
2374
+ ?disabled=${a.settingsBusy||!x}
2375
+ @input=${e=>V({every:e.currentTarget.value})}
2207
2376
  />
2208
2377
  </label>
2209
2378
  <label class="field">
2210
2379
  <span>Unit</span>
2211
2380
  <select
2212
- .value=${O.unit}
2213
- ?disabled=${a.settingsBusy||!b}
2214
- @change=${e=>P({unit:e.currentTarget.value})}
2381
+ .value=${R.unit}
2382
+ ?disabled=${a.settingsBusy||!x}
2383
+ @change=${e=>V({unit:e.currentTarget.value})}
2215
2384
  >
2216
2385
  <option value="minutes">minutes</option>
2217
2386
  <option value="hours">hours</option>
@@ -2219,14 +2388,14 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2219
2388
  <option value="months">months</option>
2220
2389
  </select>
2221
2390
  </label>
2222
- ${O.unit===`days`||O.unit===`months`?e`
2391
+ ${R.unit===`days`||R.unit===`months`?e`
2223
2392
  <label class="field">
2224
2393
  <span>At</span>
2225
2394
  <input
2226
2395
  type="time"
2227
- .value=${O.time}
2228
- ?disabled=${a.settingsBusy||!b}
2229
- @input=${e=>P({time:e.currentTarget.value})}
2396
+ .value=${R.time}
2397
+ ?disabled=${a.settingsBusy||!x}
2398
+ @input=${e=>V({time:e.currentTarget.value})}
2230
2399
  />
2231
2400
  </label>
2232
2401
  `:t}
@@ -2235,7 +2404,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2235
2404
  <input
2236
2405
  placeholder="America/Chicago"
2237
2406
  .value=${a.recurringTransferTz}
2238
- ?disabled=${a.settingsBusy||!b}
2407
+ ?disabled=${a.settingsBusy||!x}
2239
2408
  @input=${e=>a.onPolicyDraftChange({recurringTransferTz:e.currentTarget.value})}
2240
2409
  />
2241
2410
  </label>
@@ -2244,26 +2413,26 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2244
2413
  <input
2245
2414
  placeholder="Daily transfer"
2246
2415
  .value=${a.recurringTransferName}
2247
- ?disabled=${a.settingsBusy||!b}
2416
+ ?disabled=${a.settingsBusy||!x}
2248
2417
  @input=${e=>a.onPolicyDraftChange({recurringTransferName:e.currentTarget.value})}
2249
2418
  />
2250
2419
  </label>
2251
2420
  <button
2252
2421
  class="btn"
2253
- ?disabled=${a.settingsBusy||!b}
2422
+ ?disabled=${a.settingsBusy||!x}
2254
2423
  @click=${a.onSavePolicy}
2255
2424
  >
2256
2425
  ${a.settingsBusy?`Saving...`:`Save`}
2257
2426
  </button>
2258
2427
  </div>
2259
- ${O.custom?e`
2428
+ ${R.custom?e`
2260
2429
  <div class="wallet-security-note" style="margin-top: 8px">
2261
2430
  Existing custom schedule is preserved until you edit Every, Unit, or At.
2262
2431
  </div>
2263
2432
  `:t}
2264
2433
  </div>
2265
2434
  `:t}
2266
- ${g===`agent`&&T===`automation`?e`
2435
+ ${v===`agent`&&I===`automation`?e`
2267
2436
  ${e`
2268
2437
  <div class="field">
2269
2438
  <div class="wallet-spend-limit-row">
@@ -2271,7 +2440,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2271
2440
  <span>Status</span>
2272
2441
  <select
2273
2442
  .value=${a.policyAutoEnabled??l?.policy.directSigning??!0?`enabled`:`disabled`}
2274
- ?disabled=${a.settingsBusy||!l||!b}
2443
+ ?disabled=${a.settingsBusy||!l||!x}
2275
2444
  @change=${e=>a.onPolicyDraftChange({directSigning:e.currentTarget.value===`enabled`})}
2276
2445
  >
2277
2446
  <option value="disabled">Off</option>
@@ -2280,7 +2449,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2280
2449
  </label>
2281
2450
  <button
2282
2451
  class="btn"
2283
- ?disabled=${a.settingsBusy||!l||!b}
2452
+ ?disabled=${a.settingsBusy||!l||!x}
2284
2453
  @click=${a.onSavePolicy}
2285
2454
  >
2286
2455
  ${a.settingsBusy?`Saving...`:`Save`}
@@ -2289,7 +2458,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2289
2458
  </div>
2290
2459
  `}
2291
2460
  `:t}
2292
- ${g===`agent`&&T===`skills`?e`
2461
+ ${v===`agent`&&I===`skills`?e`
2293
2462
  ${e`
2294
2463
  <div class="field">
2295
2464
  <div class="wallet-spend-limit-row">
@@ -2297,7 +2466,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2297
2466
  <span>Status</span>
2298
2467
  <select
2299
2468
  .value=${a.policySkillsEnabled??l?.policy.skillsEnabled??!1?`enabled`:`disabled`}
2300
- ?disabled=${a.settingsBusy||!l||!b}
2469
+ ?disabled=${a.settingsBusy||!l||!x}
2301
2470
  @change=${e=>a.onPolicyDraftChange({skillsEnabled:e.currentTarget.value===`enabled`})}
2302
2471
  >
2303
2472
  <option value="disabled">Off</option>
@@ -2306,7 +2475,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2306
2475
  </label>
2307
2476
  <button
2308
2477
  class="btn"
2309
- ?disabled=${a.settingsBusy||!l||!b}
2478
+ ?disabled=${a.settingsBusy||!l||!x}
2310
2479
  @click=${a.onSavePolicy}
2311
2480
  >
2312
2481
  ${a.settingsBusy?`Saving...`:`Save`}
@@ -2331,7 +2500,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2331
2500
  <div>
2332
2501
  <div class="card-title wallet-title-with-help">
2333
2502
  <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.`)}
2503
+ ${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
2504
  </div>
2336
2505
  <div class="card-sub">Pending and recent reviewed wallet operations.</div>
2337
2506
  </div>
@@ -2363,7 +2532,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2363
2532
  <div>Created</div>
2364
2533
  <div>Action</div>
2365
2534
  </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`
2535
+ ${a.approvals.map(n=>{let i=V({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`
2367
2536
  <div
2368
2537
  id=${r(`wallet-approval`,n.id)}
2369
2538
  class="table-row"
@@ -2382,7 +2551,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2382
2551
  <span
2383
2552
  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
2553
  >
2385
- ${xe(n.status)}
2554
+ ${Se(n.status)}
2386
2555
  </span>
2387
2556
  <span style="font-size: 0.9em; font-weight: 600; text-transform: lowercase;">
2388
2557
  ${n.status}
@@ -2486,45 +2655,45 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2486
2655
  </div>
2487
2656
  `}
2488
2657
  </div>
2489
- ${z===`wallets`?e`<div class="card wallet-activity-card" style="grid-column: 1 / -1;">
2658
+ ${B===`wallets`?e`<div class="card wallet-activity-card" style="grid-column: 1 / -1;">
2490
2659
  <div class="wallet-activity-card__head">
2491
2660
  <div>
2492
2661
  <div class="card-title">Wallet Activity</div>
2493
2662
  <div class="card-sub">Recent send requests and outcomes.</div>
2494
2663
  </div>
2495
- ${m>0?e`<div class="wallet-status-chip">
2496
- Showing ${v+1}-${Math.min(v+s,m)} of ${m}
2664
+ ${h>0?e`<div class="wallet-status-chip">
2665
+ Showing ${y+1}-${Math.min(y+s,h)} of ${h}
2497
2666
  </div>`:t}
2498
2667
  </div>
2499
- ${m>0?e`
2668
+ ${h>0?e`
2500
2669
  <div class="wallet-activity-toolbar">
2501
2670
  <div class="wallet-chip-row">
2502
- <span class="wallet-status-chip">Page ${g} / ${h}</span>
2671
+ <span class="wallet-status-chip">Page ${_} / ${g}</span>
2503
2672
  </div>
2504
2673
  <div class="row" style="gap: 8px; flex-wrap: wrap;">
2505
2674
  <button
2506
2675
  class="btn small"
2507
- ?disabled=${g<=1}
2508
- @click=${()=>a.onActivityPageChange(g-1)}
2676
+ ?disabled=${_<=1}
2677
+ @click=${()=>a.onActivityPageChange(_-1)}
2509
2678
  >
2510
2679
  Prev
2511
2680
  </button>
2512
2681
  <button
2513
2682
  class="btn small"
2514
- ?disabled=${g>=h}
2515
- @click=${()=>a.onActivityPageChange(g+1)}
2683
+ ?disabled=${_>=g}
2684
+ @click=${()=>a.onActivityPageChange(_+1)}
2516
2685
  >
2517
2686
  Next
2518
2687
  </button>
2519
2688
  </div>
2520
2689
  </div>
2521
2690
  <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`
2691
+ ${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=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=Fe(n.action);return e`
2523
2692
  <div class="wallet-activity-item" data-tone=${m}>
2524
2693
  <div class="wallet-activity-item__head">
2525
2694
  <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>
2695
+ <span style="color: ${m===`danger`?`var(--danger)`:m===`success`?`var(--ok)`:m===`warn`?`var(--warn)`:`var(--muted)`};">${Ce(n.action)}</span>
2696
+ <span>${xe(n)}</span>
2528
2697
  </div>
2529
2698
  <div class="wallet-activity-item__time">
2530
2699
  ${new Date(n.at).toLocaleString()}
@@ -2532,7 +2701,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2532
2701
  </div>
2533
2702
  <div class="wallet-activity-item__facts">
2534
2703
  ${o?t:e`<span class="wallet-status-chip"
2535
- >${i?N(i):`n/a`}</span
2704
+ >${i?oe(i):`n/a`}</span
2536
2705
  >`}
2537
2706
  <span class="wallet-status-chip">${s}</span>
2538
2707
  ${p?e`<span class="wallet-status-chip">${p}</span>`:t}
@@ -2557,7 +2726,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2557
2726
  </div>
2558
2727
  `:t}
2559
2728
  </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`
2729
+ `}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}=ye(i,n),s=[...new Set(o.map(e=>e.chain))],c=a?.chain??s[0]??n.sendCreateForm.chain,l=s.includes(n.sendCreateForm.chain)?n.sendCreateForm.chain:c,u=q(i,l),d=a&&a.chain===l?a:void 0,f=d?.symbol||`SOL`,p=i?`${i.name} (@wallet:${i.id})`:`Default wallet`;return e`
2561
2730
  <div class="modal-overlay" @click=${n.onSendModalClose}>
2562
2731
  <div class="modal-card card" @click=${e=>e.stopPropagation()}>
2563
2732
  <div class="row" style="justify-content: space-between; align-items: center; margin-bottom: 16px;">
@@ -2584,7 +2753,7 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2584
2753
  >
2585
2754
  ${o.map(t=>e`
2586
2755
  <option value=${t.id} ?selected=${t.id===d?.id}>
2587
- ${t.symbol}${t.name&&t.name!==t.symbol?` · ${t.name}`:``} · ${Y(t.amountDisplay)}
2756
+ ${t.symbol}${t.name&&t.name!==t.symbol?` · ${t.name}`:``} · ${J(t.amountDisplay)}
2588
2757
  </option>
2589
2758
  `)}
2590
2759
  </select>
@@ -2728,5 +2897,5 @@ import{a as e,r as t,t as n}from"./icons-D3-vEvih.js";import{n as r}from"./task-
2728
2897
  }
2729
2898
  }
2730
2899
  </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
2900
+ `}export{u as describeAdminControlShortcut,T as describeAgentDefaultAction,d as describeVaultSignerApproval,m as describeWalletAutomationPolicySummary,te as describeWalletRoleBadges,f as describeWalletSendFlow,g as hasWalletBalanceValue,O as orderWalletsForDisplay,Ie as renderWallet,h as resolveActiveMiningWalletId,C as resolveOperatorWalletRoles};
2901
+ //# sourceMappingURL=wallet-CRIhDQbW.js.map