ethagent 3.3.4 → 4.0.0

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 (322) hide show
  1. package/.claude-plugin/marketplace.json +11 -0
  2. package/.claude-plugin/plugin.json +35 -0
  3. package/LICENSE +1 -1
  4. package/README.md +64 -104
  5. package/commands/ethagent.md +40 -0
  6. package/package.json +16 -16
  7. package/src/app/keybindings/KeybindingProvider.tsx +1 -6
  8. package/src/app/keybindings/types.ts +1 -6
  9. package/src/cli/ResetConfirmView.tsx +54 -53
  10. package/src/cli/demo.ts +86 -0
  11. package/src/cli/hookIo.ts +45 -0
  12. package/src/cli/main.tsx +94 -123
  13. package/src/cli/memoryGuard.ts +49 -0
  14. package/src/cli/reset.ts +28 -70
  15. package/src/cli/sessionStart.ts +33 -0
  16. package/src/cli/status.ts +46 -0
  17. package/src/cli/sync.ts +167 -0
  18. package/src/cli/syncAdapters/claude-code.ts +86 -0
  19. package/src/cli/syncAdapters/codex.ts +66 -0
  20. package/src/cli/syncAdapters/index.ts +45 -0
  21. package/src/cli/syncAdapters/managedBlock.ts +175 -0
  22. package/src/cli/syncAdapters/shared.ts +63 -0
  23. package/src/identity/continuity/envelopeParse.ts +20 -1
  24. package/src/identity/continuity/publicSkills.ts +3 -1
  25. package/src/identity/continuity/skills/publicSkillsSync.ts +2 -1
  26. package/src/identity/continuity/skills/scaffold.ts +5 -2
  27. package/src/identity/continuity/snapshots.ts +12 -5
  28. package/src/identity/continuity/storage/defaults.ts +20 -19
  29. package/src/identity/continuity/storage/status.ts +1 -1
  30. package/src/identity/ens/ensLookup/constants.ts +1 -1
  31. package/src/identity/manager/IdentityManager.tsx +33 -0
  32. package/src/identity/{hub → manager}/OperationalRoutes.tsx +37 -18
  33. package/src/identity/{hub → manager}/Routes.tsx +48 -34
  34. package/src/identity/{hub → manager}/continuity/ContinuityDashboardScreen.tsx +9 -19
  35. package/src/identity/{hub → manager}/continuity/RebackupStorageScreen.tsx +3 -3
  36. package/src/identity/manager/continuity/RecoveryConfirmScreen.tsx +102 -0
  37. package/src/identity/{hub → manager}/continuity/SavePromptScreen.tsx +2 -3
  38. package/src/identity/{hub → manager}/continuity/completion.ts +1 -1
  39. package/src/identity/{hub → manager}/continuity/effects.ts +1 -1
  40. package/src/identity/{hub → manager}/continuity/skills/DeleteSkillConfirmScreen.tsx +2 -2
  41. package/src/identity/{hub → manager}/continuity/skills/NewSkillScreen.tsx +0 -5
  42. package/src/identity/{hub → manager}/continuity/skills/NewSkillVisibilityScreen.tsx +4 -4
  43. package/src/identity/{hub → manager}/continuity/skills/SkillActionsScreen.tsx +6 -22
  44. package/src/identity/{hub → manager}/continuity/skills/SkillsTreeScreen.tsx +5 -17
  45. package/src/identity/{hub → manager}/continuity/snapshot.ts +1 -1
  46. package/src/identity/{hub → manager}/continuity/vault.ts +1 -1
  47. package/src/identity/{hub → manager}/create/CreateFlow.tsx +59 -32
  48. package/src/identity/{hub → manager}/create/effects.ts +19 -10
  49. package/src/identity/manager/create/importScan.ts +122 -0
  50. package/src/identity/{hub → manager}/custody/CustodyEditFlow.tsx +17 -61
  51. package/src/identity/{hub → manager}/custody/actions.ts +1 -15
  52. package/src/identity/{hub → manager}/custody/routes.tsx +20 -40
  53. package/src/identity/{hub → manager}/custody/transactions.ts +1 -0
  54. package/src/identity/{hub → manager}/custody/types.ts +1 -2
  55. package/src/identity/{hub → manager}/custody/useCustodyEffects.ts +1 -1
  56. package/src/identity/{hub → manager}/ens/EnsEditAdvancedScreens.tsx +2 -2
  57. package/src/identity/{hub → manager}/ens/EnsEditMaintenanceScreens.tsx +12 -23
  58. package/src/identity/{hub → manager}/ens/EnsEditReviewScreens.tsx +18 -42
  59. package/src/identity/{hub → manager}/ens/EnsEditRunners.tsx +1 -1
  60. package/src/identity/{hub → manager}/ens/EnsEditShared.tsx +0 -2
  61. package/src/identity/{hub → manager}/ens/EnsEditSimpleScreens.tsx +10 -19
  62. package/src/identity/{hub → manager}/ens/EnsFlow.tsx +133 -41
  63. package/src/identity/{hub → manager}/ens/EnsOperatorWalletsScreen.tsx +14 -19
  64. package/src/identity/{hub → manager}/ens/editCopy.ts +1 -14
  65. package/src/identity/{hub → manager}/profile/EditProfileFlow.tsx +99 -66
  66. package/src/identity/{hub → manager}/profile/effects.ts +1 -3
  67. package/src/identity/{hub → manager}/profile/operatorSave.ts +1 -1
  68. package/src/identity/{hub → manager}/profile/state.ts +1 -1
  69. package/src/identity/{hub/identityHubReducer.ts → manager/reducer.ts} +25 -26
  70. package/src/identity/{hub → manager}/restore/RestoreFlow.tsx +16 -24
  71. package/src/identity/{hub → manager}/restore/apply.ts +1 -1
  72. package/src/identity/{hub → manager}/restore/auth.ts +1 -1
  73. package/src/identity/{hub → manager}/restore/discover.ts +1 -1
  74. package/src/identity/{hub → manager}/restore/fetch.ts +1 -1
  75. package/src/identity/{hub → manager}/restore/restoreAdmin.ts +1 -1
  76. package/src/identity/{hub → manager}/restore/useRestoreEffects.ts +2 -9
  77. package/src/identity/{hub → manager}/settings/StorageCredentialScreen.tsx +10 -25
  78. package/src/identity/{hub → manager}/shared/components/DetailsScreen.tsx +5 -7
  79. package/src/identity/{hub → manager}/shared/components/ErrorScreen.tsx +6 -10
  80. package/src/identity/{hub → manager}/shared/components/FlowTimeline.tsx +4 -3
  81. package/src/identity/{hub → manager}/shared/components/IdentitySummary.tsx +19 -59
  82. package/src/identity/manager/shared/components/LazyMenu.tsx +147 -0
  83. package/src/identity/manager/shared/components/MenuScreen.tsx +220 -0
  84. package/src/identity/manager/shared/components/OperationCompleteScreen.tsx +28 -0
  85. package/src/identity/{hub → manager}/shared/components/UnlinkedIdentityScreen.tsx +9 -10
  86. package/src/identity/{hub → manager}/shared/components/WalletApprovalScreen.tsx +1 -2
  87. package/src/identity/manager/shared/components/Wordmark.tsx +54 -0
  88. package/src/identity/{hub → manager}/shared/components/menuFlagsFromReconciliation.ts +39 -15
  89. package/src/identity/{hub → manager}/shared/effects/profilePrep.ts +1 -1
  90. package/src/identity/manager/shared/effects/types.ts +30 -0
  91. package/src/identity/{hub → manager}/shared/model/copy.ts +0 -4
  92. package/src/identity/{hub → manager}/shared/model/errors.ts +32 -3
  93. package/src/identity/{hub → manager}/shared/model/network.ts +2 -2
  94. package/src/identity/{hub → manager}/shared/reconciliation/agentReconciliation/hook.ts +5 -0
  95. package/src/identity/{hub → manager}/shared/reconciliation/agentReconciliation/run.ts +1 -1
  96. package/src/identity/{hub/shared/reconciliation/useAgentReconciliation.ts → manager/shared/reconciliation/index.ts} +6 -0
  97. package/src/identity/{hub → manager}/shared/utils.ts +6 -10
  98. package/src/identity/{hub → manager}/transfer/TokenTransferFlow.tsx +3 -3
  99. package/src/identity/{hub → manager}/transfer/TokenTransferScreens.tsx +4 -10
  100. package/src/identity/{hub → manager}/transfer/effects.ts +1 -1
  101. package/src/identity/{hub → manager}/types.ts +5 -6
  102. package/src/identity/{hub/useIdentityHubContinuity.ts → manager/useContinuity.ts} +59 -27
  103. package/src/identity/{hub/useIdentityHubController.ts → manager/useController.ts} +38 -35
  104. package/src/identity/{hub/useIdentityHubSideEffects.ts → manager/useSideEffects.ts} +40 -4
  105. package/src/identity/registry/erc8004/discovery.ts +3 -17
  106. package/src/identity/registry/erc8004/utils.ts +1 -1
  107. package/src/identity/storage/ipfs.ts +21 -1
  108. package/src/identity/wallet/browserWallet/html.ts +10 -2
  109. package/src/identity/wallet/browserWallet/http.ts +18 -0
  110. package/src/identity/wallet/browserWallet/requestServer.ts +5 -1
  111. package/src/identity/wallet/browserWallet/requests.ts +10 -28
  112. package/src/identity/wallet/browserWallet/session.ts +26 -33
  113. package/src/identity/wallet/browserWallet/validation.ts +14 -0
  114. package/src/identity/wallet/browserWallet/walletPageSource.ts +22 -40
  115. package/src/identity/wallet/page/boot.ts +43 -0
  116. package/src/identity/wallet/page/config.ts +59 -0
  117. package/src/identity/wallet/page/constants.ts +12 -0
  118. package/src/identity/wallet/page/copy.ts +47 -68
  119. package/src/identity/wallet/page/css.ts +638 -0
  120. package/src/identity/wallet/page/{errorView.ts → errors.ts} +5 -14
  121. package/src/identity/wallet/page/{controller.ts → flow.ts} +4 -71
  122. package/src/identity/wallet/page/markup.ts +44 -34
  123. package/src/identity/wallet/page/{walletProvider.ts → provider.ts} +0 -3
  124. package/src/identity/wallet/page/resize.ts +95 -0
  125. package/src/identity/wallet/page/state.ts +135 -8
  126. package/src/identity/wallet/page/timeline.ts +161 -0
  127. package/src/identity/wallet/page/view.ts +22 -302
  128. package/src/storage/config.ts +30 -80
  129. package/src/storage/reset.ts +31 -0
  130. package/src/storage/secrets.ts +1 -16
  131. package/src/ui/Select.tsx +27 -5
  132. package/src/ui/Spinner.tsx +16 -15
  133. package/src/ui/Surface.tsx +21 -17
  134. package/src/ui/TextArea.tsx +173 -0
  135. package/src/ui/TextInput.tsx +31 -133
  136. package/src/ui/theme.ts +22 -13
  137. package/src/utils/clipboard.ts +0 -140
  138. package/src/app/FirstRun.tsx +0 -577
  139. package/src/app/FirstRunTimeline.tsx +0 -51
  140. package/src/app/firstRunConfig.ts +0 -26
  141. package/src/app/hooks/useCancelRequest.ts +0 -22
  142. package/src/app/hooks/useDoublePress.ts +0 -46
  143. package/src/app/hooks/useExitOnCtrlC.ts +0 -36
  144. package/src/auth/openaiOAuth/credentials.ts +0 -47
  145. package/src/auth/openaiOAuth/crypto.ts +0 -23
  146. package/src/auth/openaiOAuth/index.ts +0 -238
  147. package/src/auth/openaiOAuth/landingPage.ts +0 -116
  148. package/src/auth/openaiOAuth/listener.ts +0 -151
  149. package/src/auth/openaiOAuth/refresh.ts +0 -70
  150. package/src/auth/openaiOAuth/shared.ts +0 -115
  151. package/src/chat/ChatBottomPane.tsx +0 -296
  152. package/src/chat/ChatScreen.tsx +0 -1685
  153. package/src/chat/ConversationStack.tsx +0 -56
  154. package/src/chat/MessageList.tsx +0 -638
  155. package/src/chat/SessionStatus.tsx +0 -53
  156. package/src/chat/chatEnvironment.ts +0 -16
  157. package/src/chat/chatScreenUtils.ts +0 -194
  158. package/src/chat/chatSessionState.ts +0 -146
  159. package/src/chat/chatTurnContext.ts +0 -50
  160. package/src/chat/chatTurnOrchestrator.ts +0 -603
  161. package/src/chat/chatTurnRows.ts +0 -64
  162. package/src/chat/commands.ts +0 -494
  163. package/src/chat/continuityEditReview.ts +0 -42
  164. package/src/chat/display/DiffView.tsx +0 -193
  165. package/src/chat/display/SyntaxText.tsx +0 -192
  166. package/src/chat/display/toolCallDisplay.ts +0 -103
  167. package/src/chat/display/toolResultDisplay.ts +0 -19
  168. package/src/chat/input/ChatInput.tsx +0 -625
  169. package/src/chat/input/chatInputHelpers.ts +0 -62
  170. package/src/chat/input/chatInputState.ts +0 -247
  171. package/src/chat/input/chatPaste.ts +0 -49
  172. package/src/chat/input/imageRefs.ts +0 -30
  173. package/src/chat/input/inputRendering.tsx +0 -93
  174. package/src/chat/input/textCursor.ts +0 -212
  175. package/src/chat/messageMarkdown.ts +0 -220
  176. package/src/chat/messageRows.ts +0 -43
  177. package/src/chat/planImplementation.ts +0 -62
  178. package/src/chat/slashCommandHandlers.ts +0 -122
  179. package/src/chat/slashCommandViews.ts +0 -120
  180. package/src/chat/transcript/TranscriptView.tsx +0 -184
  181. package/src/chat/transcript/transcriptViewport.ts +0 -295
  182. package/src/chat/views/ContextLimitView.tsx +0 -95
  183. package/src/chat/views/ContinuityEditReviewView.tsx +0 -50
  184. package/src/chat/views/CopyPicker.tsx +0 -50
  185. package/src/chat/views/PermissionPrompt.tsx +0 -156
  186. package/src/chat/views/PermissionsView.tsx +0 -165
  187. package/src/chat/views/PlanApprovalView.tsx +0 -91
  188. package/src/chat/views/ResumeView.tsx +0 -273
  189. package/src/chat/views/RewindView.tsx +0 -412
  190. package/src/cli/preview.tsx +0 -14
  191. package/src/cli/updateNotice.ts +0 -54
  192. package/src/identity/continuity/privateEdit/apply.ts +0 -170
  193. package/src/identity/continuity/privateEdit/diff.ts +0 -6
  194. package/src/identity/continuity/privateEdit/files.ts +0 -23
  195. package/src/identity/continuity/privateEdit/types.ts +0 -28
  196. package/src/identity/continuity/privateEdit.ts +0 -46
  197. package/src/identity/hub/IdentityHub.tsx +0 -14
  198. package/src/identity/hub/continuity/RecoveryConfirmScreen.tsx +0 -104
  199. package/src/identity/hub/ens/effects.ts +0 -218
  200. package/src/identity/hub/shared/components/MenuScreen.tsx +0 -241
  201. package/src/identity/hub/shared/effects/types.ts +0 -53
  202. package/src/identity/hub/shared/reconciliation/index.ts +0 -14
  203. package/src/identity/wallet/page/grainient.ts +0 -278
  204. package/src/identity/wallet/page/html.ts +0 -28
  205. package/src/identity/wallet/page/styles/base.ts +0 -260
  206. package/src/identity/wallet/page/styles/components.ts +0 -262
  207. package/src/identity/wallet/page/styles/index.ts +0 -5
  208. package/src/identity/wallet/page/styles/responsive.ts +0 -247
  209. package/src/identity/wallet/page.tsx +0 -38
  210. package/src/mcp/approvals.ts +0 -113
  211. package/src/mcp/config.ts +0 -235
  212. package/src/mcp/manager.ts +0 -482
  213. package/src/mcp/managerHelpers.ts +0 -70
  214. package/src/mcp/names.ts +0 -19
  215. package/src/mcp/output.ts +0 -96
  216. package/src/models/ModelPicker.tsx +0 -1009
  217. package/src/models/catalog.ts +0 -327
  218. package/src/models/huggingface.ts +0 -712
  219. package/src/models/huggingfaceStorage.ts +0 -136
  220. package/src/models/llamacpp.ts +0 -848
  221. package/src/models/llamacppCommands.ts +0 -44
  222. package/src/models/llamacppConfig.ts +0 -34
  223. package/src/models/llamacppDiscovery.ts +0 -176
  224. package/src/models/llamacppOutput.ts +0 -65
  225. package/src/models/llamacppPreflight.ts +0 -158
  226. package/src/models/modelDisplay.ts +0 -180
  227. package/src/models/modelPickerCatalogFlow.ts +0 -56
  228. package/src/models/modelPickerCredentials.ts +0 -166
  229. package/src/models/modelPickerData.ts +0 -41
  230. package/src/models/modelPickerDisplay.tsx +0 -132
  231. package/src/models/modelPickerHfFlow.ts +0 -192
  232. package/src/models/modelPickerLocalRunnerFlow.ts +0 -115
  233. package/src/models/modelPickerOptions.ts +0 -457
  234. package/src/models/modelPickerTypes.ts +0 -69
  235. package/src/models/modelPickerUninstallFlow.ts +0 -48
  236. package/src/models/modelPickerViewHelpers.ts +0 -174
  237. package/src/models/modelRecommendation.ts +0 -139
  238. package/src/models/providerDisplay.ts +0 -16
  239. package/src/models/runtimeDetection.ts +0 -81
  240. package/src/models/uncensoredCatalog.ts +0 -86
  241. package/src/providers/anthropic.ts +0 -290
  242. package/src/providers/contracts.ts +0 -71
  243. package/src/providers/errors.ts +0 -80
  244. package/src/providers/gemini.ts +0 -391
  245. package/src/providers/openai-chat.ts +0 -474
  246. package/src/providers/openai-responses-format.ts +0 -177
  247. package/src/providers/openai-responses.ts +0 -306
  248. package/src/providers/openaiChatWire.ts +0 -124
  249. package/src/providers/registry.ts +0 -120
  250. package/src/providers/retry.ts +0 -58
  251. package/src/providers/sse.ts +0 -93
  252. package/src/runtime/compaction.ts +0 -395
  253. package/src/runtime/cwd.ts +0 -43
  254. package/src/runtime/providerTurn.ts +0 -38
  255. package/src/runtime/sessionMode.ts +0 -55
  256. package/src/runtime/systemPrompt.ts +0 -213
  257. package/src/runtime/textToolParser.ts +0 -161
  258. package/src/runtime/toolClaimGuards.ts +0 -143
  259. package/src/runtime/toolExecution.ts +0 -304
  260. package/src/runtime/toolIntent.ts +0 -143
  261. package/src/runtime/turn.ts +0 -369
  262. package/src/runtime/turnNudges.ts +0 -223
  263. package/src/runtime/turnTypes.ts +0 -86
  264. package/src/storage/factoryReset.ts +0 -127
  265. package/src/storage/history.ts +0 -58
  266. package/src/storage/permissions.ts +0 -76
  267. package/src/storage/rewind.ts +0 -266
  268. package/src/storage/sessionExport.ts +0 -49
  269. package/src/storage/sessions.ts +0 -495
  270. package/src/tools/bashSafety.ts +0 -186
  271. package/src/tools/bashTool.ts +0 -140
  272. package/src/tools/changeDirectoryTool.ts +0 -213
  273. package/src/tools/contracts.ts +0 -192
  274. package/src/tools/deleteFileTool.ts +0 -116
  275. package/src/tools/editTool.ts +0 -165
  276. package/src/tools/editUtils.ts +0 -170
  277. package/src/tools/fileDiff.ts +0 -261
  278. package/src/tools/listDirectoryTool.ts +0 -55
  279. package/src/tools/listSkillFilesTool.ts +0 -77
  280. package/src/tools/listSkillsTool.ts +0 -68
  281. package/src/tools/mcpResourceTools.ts +0 -95
  282. package/src/tools/permissionRules.ts +0 -85
  283. package/src/tools/privateContinuityEditTool.ts +0 -187
  284. package/src/tools/privateContinuityReadTool.ts +0 -106
  285. package/src/tools/readSkillTool.ts +0 -107
  286. package/src/tools/readTool.ts +0 -85
  287. package/src/tools/registry.ts +0 -103
  288. package/src/tools/writeFileTool.ts +0 -167
  289. package/src/ui/BrandSplash.tsx +0 -133
  290. package/src/ui/terminalTitle.ts +0 -30
  291. package/src/utils/images.ts +0 -140
  292. package/src/utils/markdownSegments.ts +0 -51
  293. package/src/utils/messages.ts +0 -37
  294. package/src/utils/withRetry.ts +0 -324
  295. /package/src/identity/{hub → manager}/continuity/state.ts +0 -0
  296. /package/src/identity/{hub → manager}/custody/helpers.ts +0 -0
  297. /package/src/identity/{hub → manager}/custody/preflight.ts +0 -0
  298. /package/src/identity/{hub → manager}/custody/state.ts +0 -0
  299. /package/src/identity/{hub → manager}/custody/useCustodyFlow.tsx +0 -0
  300. /package/src/identity/{hub → manager}/ens/EnsEditFlow.tsx +0 -0
  301. /package/src/identity/{hub → manager}/ens/advancedEnsValidation.ts +0 -0
  302. /package/src/identity/{hub → manager}/ens/state.ts +0 -0
  303. /package/src/identity/{hub → manager}/ens/transactions.ts +0 -0
  304. /package/src/identity/{hub → manager}/ens/types.ts +0 -0
  305. /package/src/identity/{hub → manager}/profile/identity.ts +0 -0
  306. /package/src/identity/{hub → manager}/restore/envelopes.ts +0 -0
  307. /package/src/identity/{hub → manager}/restore/helpers.ts +0 -0
  308. /package/src/identity/{hub → manager}/restore/recovery.ts +0 -0
  309. /package/src/identity/{hub → manager}/restore/resolve.ts +0 -0
  310. /package/src/identity/{hub → manager}/shared/components/BusyScreen.tsx +0 -0
  311. /package/src/identity/{hub → manager}/shared/components/NetworkScreen.tsx +0 -0
  312. /package/src/identity/{hub → manager}/shared/components/PinataJwtInput.tsx +0 -0
  313. /package/src/identity/{hub → manager}/shared/effects/receipts.ts +0 -0
  314. /package/src/identity/{hub → manager}/shared/effects/sync.ts +0 -0
  315. /package/src/identity/{hub → manager}/shared/model/format.ts +0 -0
  316. /package/src/identity/{hub → manager}/shared/operatorWallets.ts +0 -0
  317. /package/src/identity/{hub → manager}/shared/reconciliation/agentReconciliation/ownership.ts +0 -0
  318. /package/src/identity/{hub → manager}/shared/reconciliation/agentReconciliation/types.ts +0 -0
  319. /package/src/identity/{hub → manager}/shared/reconciliation/walletSetup.ts +0 -0
  320. /package/src/identity/{hub → manager}/shared/txGuard.ts +0 -0
  321. /package/src/identity/{hub → manager}/transfer/progress.ts +0 -0
  322. /package/src/identity/{hub → manager}/transfer/state.ts +0 -0
@@ -0,0 +1,638 @@
1
+ export const WALLET_CSS = String.raw`
2
+ *,
3
+ *::before,
4
+ *::after { box-sizing: border-box; }
5
+
6
+ :root {
7
+ /* Monospace everywhere. JetBrains Mono is imported as a Google Font in
8
+ markup.ts, with a system mono fallback stack. */
9
+ --font-mono: "JetBrains Mono", ui-monospace, "SF Mono", SFMono-Regular, Menlo,
10
+ Consolas, "DejaVu Sans Mono", "Liberation Mono", monospace;
11
+ --font-ui: var(--font-mono);
12
+ --font-display: var(--font-mono);
13
+
14
+ /* Solid pitch-black ladder: the page is pure black, the card sits a hair off
15
+ it, and the panels ("connecting wallet", message, error) lift once more.
16
+ Depth and the glass edge come from shadows + a white rim, not translucency. */
17
+ --bg: #000000;
18
+ --surface: #000000;
19
+ --panel: #0a0a0c;
20
+ --raise: #131316;
21
+
22
+ --line: #1d1d21;
23
+ --line-soft: #161619;
24
+ --line-strong: #2a2a30;
25
+
26
+ /* Glass rim-light: faint white edge highlights, layered over the borders. */
27
+ --rim: rgba(255, 255, 255, 0.04);
28
+ --rim-strong: rgba(255, 255, 255, 0.06);
29
+
30
+ --radius: 0;
31
+ --radius-sm: 0;
32
+ --radius-xs: 0;
33
+
34
+ --fg: #eef0f6;
35
+ --fg-2: #b7bbc5;
36
+ --fg-3: #82868f;
37
+ --fg-4: #585c65;
38
+ --fg-5: #3d4047;
39
+
40
+ --ease-standard: cubic-bezier(0.2, 0, 0, 1);
41
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
42
+ }
43
+
44
+ html, body { height: 100%; margin: 0; overflow: hidden; }
45
+
46
+ body {
47
+ position: relative;
48
+ font-family: var(--font-ui);
49
+ color: var(--fg);
50
+ background: var(--bg);
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ padding: clamp(18px, 3vw, 28px);
55
+ }
56
+
57
+ main {
58
+ position: relative;
59
+ z-index: 1;
60
+ width: min(380px, 100%);
61
+ max-height: calc(100dvh - 36px);
62
+ color: var(--fg);
63
+ background: var(--surface);
64
+ border: 1px solid var(--line-soft);
65
+ border-radius: var(--radius);
66
+ overflow: hidden;
67
+ box-shadow:
68
+ 0 24px 64px -24px rgba(0, 0, 0, 0.8);
69
+ animation: card-in 540ms var(--ease-out) both;
70
+ will-change: height;
71
+ }
72
+
73
+ .card-inner {
74
+ display: flex;
75
+ flex-direction: column;
76
+ }
77
+
78
+ @keyframes card-in {
79
+ from { opacity: 0; transform: translateY(12px) scale(0.984); }
80
+ to { opacity: 1; transform: translateY(0) scale(1); }
81
+ }
82
+
83
+ @keyframes block-in {
84
+ from { opacity: 0; transform: translateY(5px); }
85
+ to { opacity: 1; transform: translateY(0); }
86
+ }
87
+
88
+ main, .flow-title, .flow-subtitle, .status, .status-line, .status-hint, .flow-detail,
89
+ #error-block-slot, .details {
90
+ transition: background-color 300ms var(--ease-standard),
91
+ border-color 300ms var(--ease-standard),
92
+ box-shadow 320ms var(--ease-standard),
93
+ color 300ms var(--ease-standard);
94
+ }
95
+
96
+ .chrome {
97
+ display: flex;
98
+ align-items: center;
99
+ justify-content: space-between;
100
+ gap: 12px;
101
+ padding: 12px 14px 12px 20px;
102
+ border-bottom: 1px solid var(--line);
103
+ background: var(--bg);
104
+ flex: none;
105
+ }
106
+
107
+ .chrome-brand {
108
+ flex: 1 1 0;
109
+ min-width: 0;
110
+ font-family: var(--font-ui);
111
+ font-size: 11px;
112
+ font-weight: 700;
113
+ letter-spacing: 0.01em;
114
+ color: var(--fg-2);
115
+ white-space: nowrap;
116
+ overflow: hidden;
117
+ text-overflow: ellipsis;
118
+ }
119
+
120
+ .chrome-title {
121
+ flex: 0 1 auto;
122
+ text-align: center;
123
+ font-family: var(--font-ui);
124
+ font-size: 10.5px;
125
+ color: var(--fg-4);
126
+ font-weight: 400;
127
+ letter-spacing: 0.01em;
128
+ margin: 0;
129
+ white-space: nowrap;
130
+ overflow: hidden;
131
+ text-overflow: ellipsis;
132
+ }
133
+
134
+ .chrome-actions { flex: 1 1 0; display: flex; justify-content: flex-end; align-items: center; }
135
+
136
+ .body {
137
+ flex: 1;
138
+ min-height: 0;
139
+ padding: clamp(18px, 2.5vw, 24px) clamp(20px, 3vw, 26px) clamp(20px, 2.5vw, 26px);
140
+ display: flex;
141
+ flex-direction: column;
142
+ gap: 14px;
143
+ overflow: hidden;
144
+ }
145
+
146
+ .card-header {
147
+ display: flex;
148
+ flex-direction: column;
149
+ align-items: flex-start;
150
+ gap: 5px;
151
+ }
152
+
153
+ .flow-title {
154
+ font-family: var(--font-display);
155
+ font-size: 13.5px;
156
+ font-weight: 700;
157
+ line-height: 1.3;
158
+ letter-spacing: -0.01em;
159
+ margin: 0;
160
+ color: var(--fg);
161
+ text-wrap: balance;
162
+ text-align: left;
163
+ }
164
+
165
+ .flow-subtitle {
166
+ font-family: var(--font-ui);
167
+ font-size: 11px;
168
+ font-weight: 400;
169
+ line-height: 1.5;
170
+ letter-spacing: -0.005em;
171
+ margin: 0;
172
+ color: var(--fg-3);
173
+ text-align: left;
174
+ text-wrap: pretty;
175
+ }
176
+
177
+ .flow-subtitle[hidden] { display: none; }
178
+
179
+ .timeline {
180
+ margin: 0;
181
+ padding: 1px 0 0;
182
+ display: flex;
183
+ flex-direction: column;
184
+ gap: 8px;
185
+ overflow: hidden;
186
+ animation: block-in 380ms var(--ease-out) both;
187
+ }
188
+
189
+ .timeline[hidden] { display: none; }
190
+
191
+ .timeline-head {
192
+ display: flex;
193
+ align-items: baseline;
194
+ justify-content: space-between;
195
+ gap: 12px;
196
+ }
197
+
198
+ .timeline-now {
199
+ min-width: 0;
200
+ font-family: var(--font-ui);
201
+ font-size: 11.5px;
202
+ font-weight: 700;
203
+ letter-spacing: 0;
204
+ color: var(--fg);
205
+ white-space: nowrap;
206
+ overflow: hidden;
207
+ text-overflow: ellipsis;
208
+ transition: color 280ms var(--ease-standard);
209
+ }
210
+
211
+ .timeline-count {
212
+ flex: none;
213
+ font-family: var(--font-mono);
214
+ font-size: 10px;
215
+ font-weight: 400;
216
+ letter-spacing: 0.08em;
217
+ color: var(--fg-4);
218
+ font-variant-numeric: tabular-nums;
219
+ }
220
+
221
+ .timeline-track {
222
+ display: flex;
223
+ align-items: stretch;
224
+ gap: 5px;
225
+ width: 100%;
226
+ }
227
+
228
+ .timeline-seg {
229
+ flex: 1 1 0;
230
+ min-width: 0;
231
+ height: 3px;
232
+ border-radius: 0;
233
+ background: #1f1f24;
234
+ transition: background-color 420ms var(--ease-standard),
235
+ opacity 420ms var(--ease-standard);
236
+ }
237
+
238
+ .timeline-seg.is-done {
239
+ background: #6b6f79;
240
+ }
241
+
242
+ .timeline-seg.is-active {
243
+ background: #34363c;
244
+ animation: seg-pulse 1.4s var(--ease-standard) infinite;
245
+ }
246
+
247
+ @keyframes seg-pulse {
248
+ 0%, 100% { opacity: 0.55; }
249
+ 50% { opacity: 1; }
250
+ }
251
+
252
+ .details {
253
+ display: flex;
254
+ flex-direction: column;
255
+ gap: 9px;
256
+ padding: 14px 16px;
257
+ background: var(--panel);
258
+ border: 1px solid var(--line-soft);
259
+ border-radius: var(--radius-sm);
260
+ overflow: hidden;
261
+ box-shadow: 0 4px 16px -4px rgba(0, 0, 0, 0.45),
262
+ 0 1px 0 var(--rim) inset;
263
+ animation: block-in 380ms var(--ease-out) both;
264
+ }
265
+
266
+ .details[hidden] { display: none; }
267
+
268
+ .flow-detail {
269
+ display: grid;
270
+ grid-template-columns: max-content 1fr;
271
+ align-items: center;
272
+ gap: 12px;
273
+ font-family: var(--font-ui);
274
+ font-size: 12px;
275
+ color: var(--fg-2);
276
+ margin: 0;
277
+ line-height: 1.35;
278
+ }
279
+
280
+ .flow-detail[hidden] { display: none; }
281
+
282
+ .flow-detail .key {
283
+ font-family: var(--font-mono);
284
+ font-size: 10px;
285
+ font-weight: 500;
286
+ color: var(--fg-3);
287
+ text-transform: lowercase;
288
+ letter-spacing: 0.05em;
289
+ padding: 3px 8px;
290
+ background: var(--raise);
291
+ border: 1px solid var(--line-strong);
292
+ border-radius: 0;
293
+ justify-self: start;
294
+ align-self: center;
295
+ min-width: 0;
296
+ }
297
+
298
+ .flow-detail span:last-child {
299
+ overflow: hidden;
300
+ text-overflow: ellipsis;
301
+ white-space: nowrap;
302
+ color: var(--fg);
303
+ font-weight: 500;
304
+ }
305
+
306
+ .flow-detail[data-detail="message"] {
307
+ display: block;
308
+ }
309
+
310
+ .flow-detail[data-detail="message"] .key {
311
+ display: block;
312
+ margin: 0 0 8px;
313
+ padding: 0;
314
+ background: none;
315
+ border: 0;
316
+ text-transform: lowercase;
317
+ letter-spacing: 0.08em;
318
+ color: var(--fg-3);
319
+ }
320
+
321
+ .flow-detail[data-detail="message"] span:last-child {
322
+ display: -webkit-box;
323
+ -webkit-line-clamp: 2;
324
+ -webkit-box-orient: vertical;
325
+ white-space: normal;
326
+ overflow: hidden;
327
+ word-break: break-word;
328
+ font-size: 12px;
329
+ line-height: 1.45;
330
+ color: var(--fg);
331
+ }
332
+
333
+ .status {
334
+ display: flex;
335
+ flex-direction: column;
336
+ gap: 6px;
337
+ padding: 14px 16px;
338
+ background: var(--panel);
339
+ border: 1px solid var(--line-soft);
340
+ border-radius: var(--radius-sm);
341
+ box-shadow: 0 4px 16px -4px rgba(0, 0, 0, 0.45),
342
+ 0 1px 0 var(--rim) inset;
343
+ }
344
+
345
+ .status-line, .status-hint {
346
+ transition: opacity 260ms var(--ease-standard),
347
+ transform 260ms var(--ease-standard),
348
+ color 300ms var(--ease-standard);
349
+ }
350
+
351
+ .status-line.is-changing, .status-hint.is-changing {
352
+ opacity: 0;
353
+ transform: translateY(-3px);
354
+ }
355
+
356
+ .status-line {
357
+ display: flex;
358
+ align-items: flex-start;
359
+ gap: 9px;
360
+ font-family: var(--font-ui);
361
+ font-size: 11px;
362
+ font-weight: 700;
363
+ letter-spacing: -0.01em;
364
+ line-height: 1.4;
365
+ color: var(--fg);
366
+ margin: 0;
367
+ }
368
+
369
+ .status-line .marker {
370
+ font-family: var(--font-mono);
371
+ font-size: 11px;
372
+ width: 14px;
373
+ height: 16.8px;
374
+ display: inline-flex;
375
+ align-items: center;
376
+ justify-content: center;
377
+ color: var(--fg-4);
378
+ flex: none;
379
+ font-variant-numeric: tabular-nums;
380
+ font-weight: 600;
381
+ line-height: 1;
382
+ transition: color 300ms var(--ease-standard);
383
+ }
384
+
385
+ /* The success / done terminal state drops the panel chrome entirely and shows a
386
+ clean unboxed glyph, so a finished action reads as a calm closing message
387
+ rather than another live input prompt. Cancelled keeps the panel (below). */
388
+ .status[data-tone="success"] {
389
+ background: transparent;
390
+ border-color: transparent;
391
+ box-shadow: none;
392
+ padding: 4px 2px;
393
+ gap: 8px;
394
+ }
395
+
396
+ .status[data-tone="cancelled"] .status-line,
397
+ .status[data-tone="success"] .status-line {
398
+ align-items: center;
399
+ }
400
+
401
+ .status[data-tone="success"] .marker {
402
+ width: 20px;
403
+ height: 20px;
404
+ border: 0;
405
+ background: none;
406
+ color: var(--fg);
407
+ }
408
+
409
+ /* Cancelled / aborted closes calmly with no glyph: just the text and its hint,
410
+ both flush to the panel's left edge. */
411
+ .status[data-tone="cancelled"] .marker { display: none; }
412
+ .status[data-tone="cancelled"] .status-hint { margin-left: 0; }
413
+
414
+ .status[data-tone="success"] .status-hint {
415
+ margin-left: 29px;
416
+ }
417
+
418
+ /* On a finished (terminal) screen, drop the message-detail panel and the footer
419
+ action row so nothing reads as still-actionable: just the closing message. */
420
+ #card[data-phase="terminal"] .details,
421
+ #card[data-phase="terminal"] .footer { display: none; }
422
+
423
+ .spinner {
424
+ display: inline-block;
425
+ position: relative;
426
+ top: 1px;
427
+ font-family: var(--font-mono);
428
+ font-size: 12px;
429
+ line-height: 1;
430
+ color: var(--fg-3);
431
+ }
432
+
433
+ .status-hint {
434
+ font-family: var(--font-ui);
435
+ font-size: 10.5px;
436
+ font-weight: 400;
437
+ color: var(--fg-4);
438
+ margin: 4px 0 0 23px;
439
+ line-height: 1.55;
440
+ }
441
+
442
+ #error-block-slot:empty { display: none; }
443
+
444
+ #error-block-slot {
445
+ padding: 16px 18px;
446
+ background: var(--panel);
447
+ border: 1px solid var(--line-soft);
448
+ border-radius: var(--radius-sm);
449
+ overflow: hidden;
450
+ box-shadow: 0 8px 24px -6px rgba(0, 0, 0, 0.5),
451
+ 0 1px 0 var(--rim) inset;
452
+ animation: block-in 380ms var(--ease-out) both;
453
+ }
454
+
455
+ /* Trailing element (often .error-msg when there's no hint, e.g. a "Rejected"
456
+ error) keeps its bottom margin, which stacks onto the slot padding and leaves
457
+ a gap under the last line. Collapse it so every error variant sits tight. */
458
+ #error-block-slot > :last-child { margin-bottom: 0; }
459
+
460
+ .error-title {
461
+ font-family: var(--font-ui);
462
+ color: var(--fg);
463
+ font-size: 12.5px;
464
+ font-weight: 700;
465
+ letter-spacing: -0.01em;
466
+ line-height: 1.35;
467
+ margin: 0 0 5px;
468
+ }
469
+
470
+ .error-msg {
471
+ font-family: var(--font-ui);
472
+ color: var(--fg-4);
473
+ font-size: 10.5px;
474
+ font-weight: 400;
475
+ margin: 0 0 10px;
476
+ line-height: 1.55;
477
+ }
478
+
479
+ .error-action {
480
+ font-family: var(--font-ui);
481
+ color: var(--fg-4);
482
+ font-size: 11px;
483
+ margin: 0 0 6px;
484
+ line-height: 1.5;
485
+ }
486
+
487
+ .error-cause {
488
+ font-family: var(--font-ui);
489
+ color: var(--fg-4);
490
+ font-size: 11px;
491
+ margin: 0 0 4px 8px;
492
+ line-height: 1.5;
493
+ border-left: 1px solid var(--line-strong);
494
+ padding-left: 8px;
495
+ }
496
+
497
+ .error-hint {
498
+ font-family: var(--font-ui);
499
+ color: var(--fg-3);
500
+ font-size: 11px;
501
+ margin: 8px 0 0;
502
+ line-height: 1.5;
503
+ }
504
+
505
+ .error-hint a {
506
+ color: var(--fg);
507
+ text-decoration: none;
508
+ font-weight: 600;
509
+ border-bottom: 1px solid var(--line-strong);
510
+ padding-bottom: 1px;
511
+ transition: border-color 160ms var(--ease-out);
512
+ }
513
+
514
+ .error-hint a:hover { border-bottom-color: var(--fg-4); }
515
+
516
+ .error-hint code {
517
+ font-family: var(--font-mono);
518
+ font-size: 11px;
519
+ display: inline-flex;
520
+ align-items: center;
521
+ padding: 1px 6px;
522
+ color: var(--fg-2);
523
+ background: var(--raise);
524
+ border: 1px solid var(--line-strong);
525
+ border-radius: 0;
526
+ letter-spacing: 0.02em;
527
+ }
528
+
529
+ .footer {
530
+ flex: none;
531
+ padding: 13px 18px 14px;
532
+ border-top: 1px solid var(--line);
533
+ background: transparent;
534
+ display: flex;
535
+ align-items: center;
536
+ justify-content: flex-end;
537
+ gap: 8px;
538
+ }
539
+
540
+ .actions { display: inline-flex; align-items: center; gap: 14px; }
541
+
542
+ /* Bare keyboard-hint buttons: no box chrome, just the boxed keycap + a muted
543
+ label. Keeps the footer light and terminal-like instead of two chunky slabs. */
544
+ .shortcut {
545
+ font-family: var(--font-ui);
546
+ font-size: 11px;
547
+ font-weight: 500;
548
+ letter-spacing: 0;
549
+ background: none;
550
+ border: 0;
551
+ padding: 5px 4px;
552
+ cursor: pointer;
553
+ color: var(--fg-3);
554
+ display: inline-flex;
555
+ align-items: center;
556
+ justify-content: center;
557
+ gap: 7px;
558
+ transition: color 120ms var(--ease-out);
559
+ }
560
+
561
+ .shortcut:focus { outline: none; }
562
+ .shortcut:focus-visible { outline: 1px solid var(--fg-3); outline-offset: 2px; }
563
+
564
+ .shortcut:hover:not(:disabled) { color: var(--fg); }
565
+ .shortcut:active:not(:disabled) { color: var(--fg-2); }
566
+ .shortcut:hover:not(:disabled) .key {
567
+ color: var(--fg);
568
+ border-color: var(--line-strong);
569
+ background: var(--raise);
570
+ }
571
+ .shortcut:active:not(:disabled) .key { transform: translateY(0.5px); }
572
+
573
+ .shortcut:disabled { color: var(--fg-5); cursor: not-allowed; }
574
+ .shortcut:disabled .key { color: var(--fg-5); border-color: var(--line); }
575
+ .shortcut[hidden] { display: none; }
576
+
577
+ /* Primary (retry) reads as primary through brighter text + keycap, not a fill. */
578
+ .shortcut.primary { color: var(--fg); font-weight: 600; }
579
+ .shortcut.primary:hover:not(:disabled) { color: var(--fg); }
580
+ .shortcut.primary:hover:not(:disabled) .key { color: var(--fg); border-color: #3a3a42; background: var(--raise); }
581
+ .shortcut.primary:disabled { color: var(--fg-4); }
582
+ .shortcut.primary .key { color: var(--fg-2); border-color: var(--line-strong); }
583
+
584
+ .key {
585
+ display: inline-flex;
586
+ align-items: center;
587
+ justify-content: center;
588
+ gap: 4px;
589
+ padding: 2px 6px;
590
+ font-family: var(--font-mono);
591
+ font-size: 10px;
592
+ font-weight: 500;
593
+ color: var(--fg-3);
594
+ background: var(--surface);
595
+ border: 1px solid var(--line-strong);
596
+ border-radius: 0;
597
+ letter-spacing: 0.02em;
598
+ box-shadow: 0 1px 0 var(--rim) inset;
599
+ transition: background-color 120ms var(--ease-out),
600
+ border-color 120ms var(--ease-out),
601
+ color 120ms var(--ease-out),
602
+ transform 90ms var(--ease-out);
603
+ }
604
+
605
+ /* The esc/enter caps are real keys: layer the rim highlight with a soft drop so
606
+ they sit proud of the button. Scoped to the footer so the reused .key class on
607
+ the detail chips / message caption keeps its flat inset-only treatment. */
608
+ .shortcut .key {
609
+ box-shadow: 0 1px 0 var(--rim) inset,
610
+ 0 1px 1.5px rgba(0, 0, 0, 0.45);
611
+ }
612
+
613
+ @media (max-width: 560px), (max-height: 680px) {
614
+ body { padding: 10px; }
615
+ main { max-height: calc(100dvh - 20px); border-radius: 0; }
616
+ .chrome { padding: 9px 12px 9px 16px; }
617
+ .body { padding: 12px 13px 14px; gap: 9px; }
618
+ .flow-title { font-size: 13px; }
619
+ .flow-subtitle { font-size: 10.5px; }
620
+ .details, .status { padding: 10px 11px; border-radius: 0; }
621
+ .flow-detail { grid-template-columns: max-content 1fr; gap: 8px; font-size: 11.5px; }
622
+ .timeline-now { font-size: 11px; }
623
+ .status-line { gap: 8px; font-size: 11px; }
624
+ .status-hint { margin-left: 22px; font-size: 10.5px; }
625
+ #error-block-slot { padding: 13px 14px; }
626
+ .footer { padding: 11px 14px 12px; gap: 12px; }
627
+ .actions { gap: 12px; }
628
+ .shortcut { font-size: 11px; padding: 5px 4px; }
629
+ }
630
+
631
+ @media (prefers-reduced-motion: reduce) {
632
+ *, *::before, *::after {
633
+ transition-duration: 1ms !important;
634
+ animation-duration: 1ms !important;
635
+ animation-iteration-count: 1 !important;
636
+ }
637
+ }
638
+ `;
@@ -1,12 +1,3 @@
1
- import { config } from './state.js'
2
- import type { WalletErrorPayload } from './types.js'
3
- import { escapeHtml } from './html.js'
4
- import {
5
- chainLabel,
6
- PURPOSE_COPY,
7
- type PurposeCopyEntry,
8
- } from './copy.js'
9
-
10
1
  export function serializeWalletError(err: unknown, method: string | null): WalletErrorPayload {
11
2
  const e = err as any
12
3
  const message = ((e && (e.message ?? String(err))) || 'Something went wrong.').trim()
@@ -40,7 +31,7 @@ export function walletErrorHtml(payload: WalletErrorPayload): string {
40
31
  const isOperatorWalletRequired = /operator wallet required/i.test(msg)
41
32
  let title = 'Wallet Error'
42
33
  let body = msg
43
- let hint = 'Press <code>enter</code> to retry or <code>esc</code> to abort.'
34
+ let hint = ''
44
35
  const codeClass = classifyByCode(payload.code)
45
36
  if (codeClass) {
46
37
  title = codeClass.title
@@ -62,7 +53,7 @@ export function walletErrorHtml(payload: WalletErrorPayload): string {
62
53
  } else if (isUserReject) {
63
54
  title = 'Rejected'
64
55
  body = 'Request declined in wallet.'
65
- hint = 'Press <code>enter</code> to retry or <code>esc</code> to abort.'
56
+ hint = ''
66
57
  } else if (isWrongChain) {
67
58
  title = 'Wrong Network'
68
59
  hint = `Switch to <code>${escapeHtml(chainLabel(config.chainIdHex))}</code>, then retry.`
@@ -81,7 +72,7 @@ export function walletErrorHtml(payload: WalletErrorPayload): string {
81
72
  html += `<p class="error-cause">Caused by: ${escapeHtml(cause)}</p>`
82
73
  }
83
74
  }
84
- html += `<p class="error-hint">${hint}</p>`
75
+ if (hint) html += `<p class="error-hint">${hint}</p>`
85
76
  return html
86
77
  }
87
78
 
@@ -107,13 +98,13 @@ function actionContextFor(payload: WalletErrorPayload): string {
107
98
  function classifyByCode(code: string | undefined): { title: string; hint: string } | null {
108
99
  if (!code) return null
109
100
  switch (code) {
110
- case '4001': return { title: 'Rejected', hint: 'Press <code>enter</code> to retry or <code>esc</code> to abort.' }
101
+ case '4001': return { title: 'Rejected', hint: '' }
111
102
  case '4100': return { title: 'Wallet Not Authorized', hint: 'Connect this site in your wallet, then retry.' }
112
103
  case '4200': return { title: 'Method Not Supported by Wallet', hint: 'Use a wallet that supports this transaction type, then retry.' }
113
104
  case '4900': return { title: 'Wallet Disconnected', hint: 'Reconnect your wallet, then retry.' }
114
105
  case '4901': return { title: 'Wrong Network', hint: `Switch to <code>${escapeHtml(chainLabel(config.chainIdHex))}</code>, then retry.` }
115
106
  case '-32603': return { title: 'Internal Wallet RPC Error', hint: "The wallet's connected RPC failed. Try again, or switch RPC in your wallet settings." }
116
- case '-32602': return { title: 'Invalid Request Parameters', hint: 'Press <code>enter</code> to retry or <code>esc</code> to abort.' }
107
+ case '-32602': return { title: 'Invalid Request Parameters', hint: '' }
117
108
  case '-32000': case '-32001': case '-32002': case '-32003': case '-32004':
118
109
  case '-32005': case '-32006': case '-32007': case '-32008': case '-32009':
119
110
  return { title: 'Wallet RPC Error', hint: 'The wallet RPC reported a server error. Try again or switch RPC in your wallet.' }