agentvault 1.0.1 → 1.0.2

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 (292) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/dist/cli/commands/approve.js +5 -5
  3. package/dist/cli/commands/archive.js +5 -5
  4. package/dist/cli/commands/backup.js +5 -5
  5. package/dist/cli/commands/cloud-backup.js +12 -12
  6. package/dist/cli/commands/decrypt.js +2 -2
  7. package/dist/cli/commands/deploy.js +1 -1
  8. package/dist/cli/commands/exec.js +2 -2
  9. package/dist/cli/commands/fetch.js +4 -4
  10. package/dist/cli/commands/inference.js +5 -5
  11. package/dist/cli/commands/init.d.ts +1 -1
  12. package/dist/cli/commands/init.js +16 -16
  13. package/dist/cli/commands/list.js +4 -4
  14. package/dist/cli/commands/package.js +2 -2
  15. package/dist/cli/commands/profile.js +1 -1
  16. package/dist/cli/commands/rebuild.js +2 -2
  17. package/dist/cli/commands/show.js +1 -1
  18. package/dist/cli/commands/status.d.ts +1 -1
  19. package/dist/cli/commands/status.js +8 -8
  20. package/dist/cli/commands/trace.js +1 -1
  21. package/dist/cli/commands/wallet-export.js +1 -1
  22. package/dist/cli/commands/wallet-sign.js +1 -1
  23. package/dist/cli/commands/wallet.d.ts +1 -1
  24. package/dist/cli/commands/wallet.js +1 -1
  25. package/dist/cli/index.d.ts +2 -2
  26. package/dist/cli/index.js +3 -3
  27. package/dist/src/archival/archive-manager.d.ts +85 -0
  28. package/dist/src/archival/archive-manager.js +294 -0
  29. package/dist/src/archival/arweave-client.d.ts +88 -0
  30. package/dist/src/archival/arweave-client.js +223 -0
  31. package/dist/src/archival/index.d.ts +8 -0
  32. package/{src/archival/index.ts → dist/src/archival/index.js} +1 -1
  33. package/dist/src/backup/backup.d.ts +67 -0
  34. package/dist/src/backup/backup.js +231 -0
  35. package/dist/src/backup/index.d.ts +7 -0
  36. package/{src/backup/index.ts → dist/src/backup/index.js} +1 -1
  37. package/dist/src/cloud-storage/cloud-sync.d.ts +49 -0
  38. package/dist/src/cloud-storage/cloud-sync.js +372 -0
  39. package/dist/src/cloud-storage/index.d.ts +11 -0
  40. package/{src/cloud-storage/index.ts → dist/src/cloud-storage/index.js} +1 -1
  41. package/dist/src/cloud-storage/provider-detector.d.ts +34 -0
  42. package/dist/src/cloud-storage/provider-detector.js +158 -0
  43. package/{src/cloud-storage/types.ts → dist/src/cloud-storage/types.d.ts} +40 -53
  44. package/dist/src/cloud-storage/types.js +10 -0
  45. package/dist/src/debugging/index.d.ts +6 -0
  46. package/{src/debugging/index.ts → dist/src/debugging/index.js} +1 -1
  47. package/dist/src/debugging/logs.d.ts +32 -0
  48. package/dist/src/debugging/logs.js +158 -0
  49. package/dist/src/debugging/types.d.ts +91 -0
  50. package/dist/src/debugging/types.js +5 -0
  51. package/dist/src/deployment/deployer.d.ts +52 -0
  52. package/dist/src/deployment/deployer.js +211 -0
  53. package/dist/src/deployment/icpClient.d.ts +144 -0
  54. package/dist/src/deployment/icpClient.js +545 -0
  55. package/dist/src/deployment/index.d.ts +11 -0
  56. package/dist/src/deployment/index.js +14 -0
  57. package/dist/src/deployment/promotion.d.ts +32 -0
  58. package/dist/src/deployment/promotion.js +114 -0
  59. package/dist/src/deployment/types.d.ts +101 -0
  60. package/dist/src/deployment/types.js +5 -0
  61. package/dist/src/icp/batch.d.ts +112 -0
  62. package/dist/src/icp/batch.js +273 -0
  63. package/dist/src/icp/cycles.d.ts +29 -0
  64. package/{src/icp/cycles.ts → dist/src/icp/cycles.js} +8 -22
  65. package/dist/src/icp/environment.d.ts +60 -0
  66. package/dist/src/icp/environment.js +183 -0
  67. package/dist/src/icp/icpcli.d.ts +204 -0
  68. package/dist/src/icp/icpcli.js +374 -0
  69. package/dist/src/icp/icwasm.d.ts +94 -0
  70. package/dist/src/icp/icwasm.js +197 -0
  71. package/dist/src/icp/identity.d.ts +50 -0
  72. package/{src/icp/identity.ts → dist/src/icp/identity.js} +15 -28
  73. package/dist/src/icp/index.d.ts +16 -0
  74. package/dist/src/icp/index.js +20 -0
  75. package/dist/src/icp/optimization.d.ts +16 -0
  76. package/dist/src/icp/optimization.js +225 -0
  77. package/dist/src/icp/tokens.d.ts +24 -0
  78. package/{src/icp/tokens.ts → dist/src/icp/tokens.js} +5 -12
  79. package/dist/src/icp/tool-detector.d.ts +31 -0
  80. package/dist/src/icp/tool-detector.js +104 -0
  81. package/dist/src/icp/types.d.ts +493 -0
  82. package/dist/src/icp/types.js +7 -0
  83. package/dist/src/index.d.ts +12 -0
  84. package/dist/src/index.js +18 -0
  85. package/dist/src/inference/bittensor-client.d.ts +108 -0
  86. package/dist/src/inference/bittensor-client.js +224 -0
  87. package/dist/src/inference/index.d.ts +8 -0
  88. package/{src/inference/index.ts → dist/src/inference/index.js} +1 -1
  89. package/dist/src/inference/inference-manager.d.ts +76 -0
  90. package/dist/src/inference/inference-manager.js +228 -0
  91. package/dist/src/metrics/index.d.ts +7 -0
  92. package/{src/metrics/index.ts → dist/src/metrics/index.js} +1 -1
  93. package/dist/src/metrics/metrics.d.ts +39 -0
  94. package/dist/src/metrics/metrics.js +129 -0
  95. package/dist/src/monitoring/alerting.d.ts +51 -0
  96. package/dist/src/monitoring/alerting.js +169 -0
  97. package/dist/src/monitoring/health.d.ts +40 -0
  98. package/dist/src/monitoring/health.js +164 -0
  99. package/dist/src/monitoring/index.d.ts +10 -0
  100. package/dist/src/monitoring/index.js +12 -0
  101. package/dist/src/monitoring/info.d.ts +15 -0
  102. package/dist/src/monitoring/info.js +109 -0
  103. package/dist/src/monitoring/types.d.ts +93 -0
  104. package/dist/src/monitoring/types.js +7 -0
  105. package/dist/src/network/index.d.ts +5 -0
  106. package/{src/network/index.ts → dist/src/network/index.js} +1 -1
  107. package/dist/src/network/network-config.d.ts +31 -0
  108. package/dist/src/network/network-config.js +109 -0
  109. package/dist/src/packaging/compiler.d.ts +61 -0
  110. package/dist/src/packaging/compiler.js +562 -0
  111. package/dist/src/packaging/config-persistence.d.ts +46 -0
  112. package/dist/src/packaging/config-persistence.js +108 -0
  113. package/dist/src/packaging/config-schemas.d.ts +115 -0
  114. package/dist/src/packaging/config-schemas.js +43 -0
  115. package/dist/src/packaging/detector.d.ts +26 -0
  116. package/dist/src/packaging/detector.js +193 -0
  117. package/dist/src/packaging/index.d.ts +16 -0
  118. package/dist/src/packaging/index.js +22 -0
  119. package/dist/src/packaging/packager.d.ts +31 -0
  120. package/dist/src/packaging/packager.js +90 -0
  121. package/dist/src/packaging/parsers/clawdbot.d.ts +19 -0
  122. package/dist/src/packaging/parsers/clawdbot.js +231 -0
  123. package/dist/src/packaging/parsers/cline.d.ts +26 -0
  124. package/dist/src/packaging/parsers/cline.js +185 -0
  125. package/dist/src/packaging/parsers/generic.d.ts +27 -0
  126. package/dist/src/packaging/parsers/generic.js +228 -0
  127. package/dist/src/packaging/parsers/goose.d.ts +26 -0
  128. package/dist/src/packaging/parsers/goose.js +175 -0
  129. package/dist/src/packaging/parsers/index.d.ts +11 -0
  130. package/{src/packaging/parsers/index.ts → dist/src/packaging/parsers/index.js} +1 -1
  131. package/dist/src/packaging/serializer.d.ts +108 -0
  132. package/dist/src/packaging/serializer.js +153 -0
  133. package/dist/src/packaging/types.d.ts +131 -0
  134. package/dist/src/packaging/types.js +5 -0
  135. package/dist/src/packaging/wasmedge-compiler.d.ts +76 -0
  136. package/dist/src/packaging/wasmedge-compiler.js +349 -0
  137. package/dist/src/security/index.d.ts +11 -0
  138. package/{src/security/index.ts → dist/src/security/index.js} +1 -4
  139. package/dist/src/security/multisig.d.ts +102 -0
  140. package/dist/src/security/multisig.js +283 -0
  141. package/dist/src/security/types.d.ts +207 -0
  142. package/dist/src/security/types.js +217 -0
  143. package/dist/src/security/vetkeys.d.ts +179 -0
  144. package/dist/src/security/vetkeys.js +499 -0
  145. package/dist/src/testing/index.d.ts +6 -0
  146. package/{src/testing/index.ts → dist/src/testing/index.js} +1 -1
  147. package/dist/src/testing/local-runner.d.ts +23 -0
  148. package/dist/src/testing/local-runner.js +226 -0
  149. package/dist/src/testing/types.d.ts +98 -0
  150. package/dist/src/testing/types.js +5 -0
  151. package/dist/src/wallet/cbor-serializer.d.ts +82 -0
  152. package/dist/src/wallet/cbor-serializer.js +282 -0
  153. package/dist/src/wallet/chain-dispatcher.d.ts +112 -0
  154. package/dist/src/wallet/chain-dispatcher.js +241 -0
  155. package/dist/src/wallet/cross-chain-aggregator.d.ts +119 -0
  156. package/dist/src/wallet/cross-chain-aggregator.js +235 -0
  157. package/dist/src/wallet/index.d.ts +16 -0
  158. package/dist/src/wallet/index.js +22 -0
  159. package/dist/src/wallet/key-derivation.d.ts +117 -0
  160. package/dist/src/wallet/key-derivation.js +325 -0
  161. package/dist/src/wallet/providers/base-provider.d.ts +111 -0
  162. package/dist/src/wallet/providers/base-provider.js +58 -0
  163. package/dist/src/wallet/providers/cketh-provider.d.ts +104 -0
  164. package/dist/src/wallet/providers/cketh-provider.js +343 -0
  165. package/dist/src/wallet/providers/polkadot-provider.d.ts +115 -0
  166. package/dist/src/wallet/providers/polkadot-provider.js +407 -0
  167. package/dist/src/wallet/providers/solana-provider.d.ts +102 -0
  168. package/dist/src/wallet/providers/solana-provider.js +393 -0
  169. package/dist/src/wallet/transaction-queue.d.ts +133 -0
  170. package/dist/src/wallet/transaction-queue.js +195 -0
  171. package/dist/src/wallet/types.d.ts +167 -0
  172. package/dist/src/wallet/types.js +5 -0
  173. package/dist/src/wallet/vetkeys-adapter.d.ts +134 -0
  174. package/dist/src/wallet/vetkeys-adapter.js +313 -0
  175. package/dist/src/wallet/wallet-manager.d.ts +202 -0
  176. package/dist/src/wallet/wallet-manager.js +451 -0
  177. package/dist/src/wallet/wallet-storage.d.ts +131 -0
  178. package/dist/src/wallet/wallet-storage.js +274 -0
  179. package/macos-wallet-app/AgentVaultWallet/App/AgentVaultWalletApp.swift +54 -0
  180. package/macos-wallet-app/AgentVaultWallet/Models/AppState.swift +102 -0
  181. package/macos-wallet-app/AgentVaultWallet/Models/Chain.swift +121 -0
  182. package/macos-wallet-app/AgentVaultWallet/Models/Wallet.swift +98 -0
  183. package/macos-wallet-app/AgentVaultWallet/Resources/AgentVaultWallet.entitlements +27 -0
  184. package/macos-wallet-app/AgentVaultWallet/Resources/Info.plist +69 -0
  185. package/macos-wallet-app/AgentVaultWallet/Services/BackupService.swift +270 -0
  186. package/macos-wallet-app/AgentVaultWallet/Services/CLIBridge.swift +367 -0
  187. package/macos-wallet-app/AgentVaultWallet/Services/CryptoService.swift +157 -0
  188. package/macos-wallet-app/AgentVaultWallet/Services/FileService.swift +120 -0
  189. package/macos-wallet-app/AgentVaultWallet/Services/KeychainService.swift +219 -0
  190. package/macos-wallet-app/AgentVaultWallet/Utilities/Constants.swift +44 -0
  191. package/macos-wallet-app/AgentVaultWallet/Utilities/Extensions.swift +115 -0
  192. package/macos-wallet-app/AgentVaultWallet/ViewModels/BackupViewModel.swift +237 -0
  193. package/macos-wallet-app/AgentVaultWallet/ViewModels/CreateWalletViewModel.swift +137 -0
  194. package/macos-wallet-app/AgentVaultWallet/ViewModels/ImportWalletViewModel.swift +179 -0
  195. package/macos-wallet-app/AgentVaultWallet/ViewModels/WalletStore.swift +286 -0
  196. package/macos-wallet-app/AgentVaultWallet/Views/Backup/BackupView.swift +235 -0
  197. package/macos-wallet-app/AgentVaultWallet/Views/Backup/RestoreView.swift +316 -0
  198. package/macos-wallet-app/AgentVaultWallet/Views/Create/CreateWalletFlow.swift +438 -0
  199. package/macos-wallet-app/AgentVaultWallet/Views/Import/ImportWalletFlow.swift +399 -0
  200. package/macos-wallet-app/AgentVaultWallet/Views/MainView.swift +134 -0
  201. package/macos-wallet-app/AgentVaultWallet/Views/Settings/SettingsView.swift +276 -0
  202. package/macos-wallet-app/AgentVaultWallet/Views/Sidebar/SidebarView.swift +133 -0
  203. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/DashboardView.swift +233 -0
  204. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletDetailView.swift +281 -0
  205. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletListView.swift +280 -0
  206. package/macos-wallet-app/AgentVaultWallet/Views/Welcome/WelcomeView.swift +176 -0
  207. package/macos-wallet-app/Makefile +47 -0
  208. package/macos-wallet-app/project.yml +40 -0
  209. package/macos-wallet-app/setup.sh +73 -0
  210. package/package.json +10 -2
  211. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-28-967Z.json +0 -28
  212. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-29-032Z.backup +0 -1
  213. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-373Z.json +0 -28
  214. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-428Z.backup +0 -1
  215. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-132Z.json +0 -28
  216. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-247Z.backup +0 -1
  217. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-216Z.json +0 -28
  218. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-283Z.backup +0 -1
  219. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-772Z.backup +0 -1
  220. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-793Z.json +0 -28
  221. package/backups/test-backup.json +0 -28
  222. package/scripts/dev-dashboard.mjs +0 -84
  223. package/site/README.md +0 -63
  224. package/site/docusaurus.config.ts +0 -148
  225. package/site/package-lock.json +0 -18383
  226. package/site/package.json +0 -47
  227. package/site/sidebars.ts +0 -86
  228. package/site/static/.gitkeep +0 -0
  229. package/site/static/img/logo.svg +0 -28
  230. package/site/static/img/og-image.svg +0 -35
  231. package/src/archival/archive-manager.ts +0 -372
  232. package/src/archival/arweave-client.ts +0 -289
  233. package/src/backup/backup.ts +0 -315
  234. package/src/cloud-storage/cloud-sync.ts +0 -461
  235. package/src/cloud-storage/provider-detector.ts +0 -198
  236. package/src/debugging/logs.ts +0 -193
  237. package/src/debugging/types.ts +0 -100
  238. package/src/deployment/deployer.ts +0 -274
  239. package/src/deployment/icpClient.ts +0 -620
  240. package/src/deployment/index.ts +0 -46
  241. package/src/deployment/promotion.ts +0 -161
  242. package/src/deployment/types.ts +0 -111
  243. package/src/icp/batch.ts +0 -374
  244. package/src/icp/environment.ts +0 -215
  245. package/src/icp/icpcli.ts +0 -438
  246. package/src/icp/icwasm.ts +0 -222
  247. package/src/icp/index.ts +0 -94
  248. package/src/icp/optimization.ts +0 -242
  249. package/src/icp/tool-detector.ts +0 -110
  250. package/src/icp/types.ts +0 -574
  251. package/src/index.ts +0 -25
  252. package/src/inference/bittensor-client.ts +0 -304
  253. package/src/inference/inference-manager.ts +0 -327
  254. package/src/metrics/metrics.ts +0 -186
  255. package/src/monitoring/alerting.ts +0 -190
  256. package/src/monitoring/health.ts +0 -197
  257. package/src/monitoring/index.ts +0 -38
  258. package/src/monitoring/info.ts +0 -114
  259. package/src/monitoring/types.ts +0 -99
  260. package/src/network/network-config.ts +0 -129
  261. package/src/packaging/compiler.ts +0 -647
  262. package/src/packaging/config-persistence.ts +0 -135
  263. package/src/packaging/config-schemas.ts +0 -156
  264. package/src/packaging/detector.ts +0 -220
  265. package/src/packaging/index.ts +0 -90
  266. package/src/packaging/packager.ts +0 -118
  267. package/src/packaging/parsers/clawdbot.ts +0 -278
  268. package/src/packaging/parsers/cline.ts +0 -223
  269. package/src/packaging/parsers/generic.ts +0 -266
  270. package/src/packaging/parsers/goose.ts +0 -214
  271. package/src/packaging/serializer.ts +0 -260
  272. package/src/packaging/types.ts +0 -144
  273. package/src/packaging/wasmedge-compiler.ts +0 -406
  274. package/src/security/multisig.ts +0 -415
  275. package/src/security/types.ts +0 -416
  276. package/src/security/vetkeys.ts +0 -655
  277. package/src/testing/local-runner.ts +0 -264
  278. package/src/testing/types.ts +0 -104
  279. package/src/wallet/cbor-serializer.ts +0 -323
  280. package/src/wallet/chain-dispatcher.ts +0 -313
  281. package/src/wallet/cross-chain-aggregator.ts +0 -346
  282. package/src/wallet/index.ts +0 -76
  283. package/src/wallet/key-derivation.ts +0 -425
  284. package/src/wallet/providers/base-provider.ts +0 -154
  285. package/src/wallet/providers/cketh-provider.ts +0 -434
  286. package/src/wallet/providers/polkadot-provider.ts +0 -503
  287. package/src/wallet/providers/solana-provider.ts +0 -490
  288. package/src/wallet/transaction-queue.ts +0 -284
  289. package/src/wallet/types.ts +0 -178
  290. package/src/wallet/vetkeys-adapter.ts +0 -431
  291. package/src/wallet/wallet-manager.ts +0 -597
  292. package/src/wallet/wallet-storage.ts +0 -380
@@ -0,0 +1,276 @@
1
+ import SwiftUI
2
+
3
+ /// Application settings
4
+ struct SettingsView: View {
5
+ @EnvironmentObject var walletStore: WalletStore
6
+ @EnvironmentObject var appState: AppState
7
+ @State private var showPurgeConfirmation = false
8
+ @State private var showResetConfirmation = false
9
+ @State private var customCLIPath: String = ""
10
+
11
+ var body: some View {
12
+ ScrollView {
13
+ VStack(spacing: 24) {
14
+ // General
15
+ settingsSection("General") {
16
+ VStack(spacing: 0) {
17
+ SettingsRow(label: "Default Network") {
18
+ Picker("", selection: $appState.defaultChain) {
19
+ ForEach(Chain.allCases) { chain in
20
+ Text(chain.displayName).tag(chain.rawValue)
21
+ }
22
+ }
23
+ .frame(width: 180)
24
+ }
25
+
26
+ Divider().padding(.leading, 16)
27
+
28
+ SettingsRow(label: "Auto-refresh Balances") {
29
+ Toggle("", isOn: $appState.autoRefreshBalances)
30
+ .labelsHidden()
31
+ }
32
+ }
33
+ .settingsCard()
34
+ }
35
+
36
+ // Environment
37
+ settingsSection("Environment") {
38
+ VStack(spacing: 0) {
39
+ SettingsRow(label: "Node.js") {
40
+ HStack(spacing: 8) {
41
+ Circle()
42
+ .fill(appState.environment.nodeInstalled ? .green : .red)
43
+ .frame(width: 8, height: 8)
44
+ Text(appState.environment.nodeVersion ?? "Not installed")
45
+ .font(.callout.monospaced())
46
+ .foregroundStyle(.secondary)
47
+ }
48
+ }
49
+
50
+ Divider().padding(.leading, 16)
51
+
52
+ SettingsRow(label: "npm") {
53
+ HStack(spacing: 8) {
54
+ Circle()
55
+ .fill(appState.environment.npmInstalled ? .green : .red)
56
+ .frame(width: 8, height: 8)
57
+ Text(appState.environment.npmInstalled ? "Installed" : "Not installed")
58
+ .font(.callout)
59
+ .foregroundStyle(.secondary)
60
+ }
61
+ }
62
+
63
+ Divider().padding(.leading, 16)
64
+
65
+ SettingsRow(label: "AgentVault CLI") {
66
+ HStack(spacing: 8) {
67
+ Circle()
68
+ .fill(appState.environment.agentVaultInstalled ? .green : .red)
69
+ .frame(width: 8, height: 8)
70
+ Text(appState.environment.agentVaultInstalled ? "Available" : "Not found")
71
+ .font(.callout)
72
+ .foregroundStyle(.secondary)
73
+ }
74
+ }
75
+
76
+ Divider().padding(.leading, 16)
77
+
78
+ SettingsRow(label: "CLI Path Override") {
79
+ HStack {
80
+ TextField("Auto-detect", text: $customCLIPath)
81
+ .textFieldStyle(.roundedBorder)
82
+ .frame(width: 200)
83
+ Button("Browse") {
84
+ let panel = NSOpenPanel()
85
+ panel.canChooseFiles = false
86
+ panel.canChooseDirectories = true
87
+ panel.allowsMultipleSelection = false
88
+ panel.prompt = "Select AgentVault Directory"
89
+ if panel.runModal() == .OK, let url = panel.url {
90
+ customCLIPath = url.path
91
+ appState.cliPath = url.path
92
+ }
93
+ }
94
+ .buttonStyle(.bordered)
95
+ .controlSize(.small)
96
+ }
97
+ }
98
+ }
99
+ .settingsCard()
100
+
101
+ Button("Re-check Environment") {
102
+ appState.checkEnvironment()
103
+ }
104
+ .buttonStyle(.bordered)
105
+ .controlSize(.small)
106
+ .disabled(appState.isCheckingEnvironment)
107
+ }
108
+
109
+ // Security
110
+ settingsSection("Security") {
111
+ VStack(spacing: 0) {
112
+ SettingsRow(label: "Wallet Count") {
113
+ Text("\(walletStore.totalWalletCount)")
114
+ .foregroundStyle(.secondary)
115
+ }
116
+
117
+ Divider().padding(.leading, 16)
118
+
119
+ SettingsRow(label: "Storage") {
120
+ Text("macOS Keychain")
121
+ .font(.callout)
122
+ .foregroundStyle(.secondary)
123
+ }
124
+
125
+ Divider().padding(.leading, 16)
126
+
127
+ SettingsRow(label: "Encryption") {
128
+ Text("AES-256-GCM")
129
+ .font(.callout)
130
+ .foregroundStyle(.secondary)
131
+ }
132
+ }
133
+ .settingsCard()
134
+ }
135
+
136
+ // Data management
137
+ settingsSection("Data Management") {
138
+ VStack(spacing: 0) {
139
+ SettingsRow(label: "Data Location") {
140
+ Button("Reveal in Finder") {
141
+ NSWorkspace.shared.selectFile(nil,
142
+ inFileViewerRootedAtPath: FileService.shared.appDataDirectory.path)
143
+ }
144
+ .buttonStyle(.bordered)
145
+ .controlSize(.small)
146
+ }
147
+
148
+ Divider().padding(.leading, 16)
149
+
150
+ SettingsRow(label: "Backup Directory") {
151
+ Button("Open") {
152
+ NSWorkspace.shared.selectFile(nil,
153
+ inFileViewerRootedAtPath: BackupService.shared.defaultBackupDirectory.path)
154
+ }
155
+ .buttonStyle(.bordered)
156
+ .controlSize(.small)
157
+ }
158
+ }
159
+ .settingsCard()
160
+ }
161
+
162
+ // Danger zone
163
+ settingsSection("Danger Zone") {
164
+ VStack(spacing: 12) {
165
+ HStack {
166
+ VStack(alignment: .leading, spacing: 4) {
167
+ Text("Purge All Keychain Data")
168
+ .font(.callout.bold())
169
+ Text("Remove all wallet secrets from the macOS Keychain.")
170
+ .font(.caption)
171
+ .foregroundStyle(.secondary)
172
+ }
173
+ Spacer()
174
+ Button("Purge", role: .destructive) {
175
+ showPurgeConfirmation = true
176
+ }
177
+ .buttonStyle(.bordered)
178
+ .tint(.red)
179
+ .controlSize(.small)
180
+ }
181
+
182
+ Divider()
183
+
184
+ HStack {
185
+ VStack(alignment: .leading, spacing: 4) {
186
+ Text("Reset Application")
187
+ .font(.callout.bold())
188
+ Text("Delete all wallets, settings, and cached data. This cannot be undone.")
189
+ .font(.caption)
190
+ .foregroundStyle(.secondary)
191
+ }
192
+ Spacer()
193
+ Button("Reset", role: .destructive) {
194
+ showResetConfirmation = true
195
+ }
196
+ .buttonStyle(.bordered)
197
+ .tint(.red)
198
+ .controlSize(.small)
199
+ }
200
+ }
201
+ .padding(16)
202
+ .background(.red.opacity(0.05), in: RoundedRectangle(cornerRadius: 12))
203
+ .overlay(RoundedRectangle(cornerRadius: 12).stroke(.red.opacity(0.2)))
204
+ }
205
+
206
+ // About
207
+ settingsSection("About") {
208
+ VStack(spacing: 0) {
209
+ SettingsRow(label: "Version") {
210
+ Text("1.0.0")
211
+ .foregroundStyle(.secondary)
212
+ }
213
+ Divider().padding(.leading, 16)
214
+ SettingsRow(label: "Platform") {
215
+ Text("macOS \(ProcessInfo.processInfo.operatingSystemVersionString)")
216
+ .foregroundStyle(.secondary)
217
+ }
218
+ }
219
+ .settingsCard()
220
+ }
221
+ }
222
+ .padding(24)
223
+ }
224
+ .navigationTitle("Settings")
225
+ .confirmationDialog("Purge Keychain", isPresented: $showPurgeConfirmation) {
226
+ Button("Purge All Secrets", role: .destructive) {
227
+ KeychainService.shared.purgeAll()
228
+ appState.showSuccess("All Keychain data has been purged.")
229
+ }
230
+ } message: {
231
+ Text("This will delete ALL wallet private keys and mnemonics from the Keychain. Make sure you have backups!")
232
+ }
233
+ .confirmationDialog("Reset Application", isPresented: $showResetConfirmation) {
234
+ Button("Reset Everything", role: .destructive) {
235
+ KeychainService.shared.purgeAll()
236
+ walletStore.wallets.removeAll()
237
+ walletStore.saveWallets()
238
+ appState.hasCompletedOnboarding = false
239
+ appState.isFirstLaunch = true
240
+ }
241
+ } message: {
242
+ Text("This will delete all wallets, purge the Keychain, and reset the app to its initial state. This CANNOT be undone.")
243
+ }
244
+ }
245
+
246
+ private func settingsSection(_ title: String, @ViewBuilder content: () -> some View) -> some View {
247
+ VStack(alignment: .leading, spacing: 8) {
248
+ Text(title)
249
+ .font(.headline)
250
+ content()
251
+ }
252
+ }
253
+ }
254
+
255
+ struct SettingsRow<Content: View>: View {
256
+ let label: String
257
+ @ViewBuilder let content: () -> Content
258
+
259
+ var body: some View {
260
+ HStack {
261
+ Text(label)
262
+ Spacer()
263
+ content()
264
+ }
265
+ .padding(.horizontal, 16)
266
+ .padding(.vertical, 10)
267
+ }
268
+ }
269
+
270
+ extension View {
271
+ func settingsCard() -> some View {
272
+ self
273
+ .background(.background, in: RoundedRectangle(cornerRadius: 12))
274
+ .overlay(RoundedRectangle(cornerRadius: 12).stroke(.secondary.opacity(0.15)))
275
+ }
276
+ }
@@ -0,0 +1,133 @@
1
+ import SwiftUI
2
+
3
+ /// Navigation sidebar with wallet groups and actions
4
+ struct SidebarView: View {
5
+ @EnvironmentObject var walletStore: WalletStore
6
+ @EnvironmentObject var appState: AppState
7
+
8
+ var body: some View {
9
+ List(selection: $appState.selectedDestination) {
10
+ // Main navigation
11
+ Section {
12
+ NavigationLink(value: NavigationDestination.dashboard) {
13
+ Label("Dashboard", systemImage: "square.grid.2x2")
14
+ }
15
+
16
+ NavigationLink(value: NavigationDestination.walletList) {
17
+ Label {
18
+ HStack {
19
+ Text("All Wallets")
20
+ Spacer()
21
+ Text("\(walletStore.totalWalletCount)")
22
+ .font(.caption)
23
+ .foregroundStyle(.secondary)
24
+ .padding(.horizontal, 6)
25
+ .padding(.vertical, 2)
26
+ .background(.quaternary, in: Capsule())
27
+ }
28
+ } icon: {
29
+ Image(systemName: "wallet.pass.fill")
30
+ }
31
+ }
32
+ }
33
+
34
+ // Wallets by chain
35
+ Section("Networks") {
36
+ ForEach(Chain.allCases) { chain in
37
+ DisclosureGroup {
38
+ let chainWallets = walletStore.wallets.filter { $0.chain == chain }
39
+ if chainWallets.isEmpty {
40
+ Text("No wallets")
41
+ .font(.caption)
42
+ .foregroundStyle(.tertiary)
43
+ .padding(.leading, 4)
44
+ } else {
45
+ ForEach(chainWallets) { wallet in
46
+ NavigationLink(value: NavigationDestination.walletDetail(wallet.id)) {
47
+ WalletSidebarRow(wallet: wallet)
48
+ }
49
+ }
50
+ }
51
+ } label: {
52
+ Label {
53
+ HStack {
54
+ Text(chain.displayName)
55
+ Spacer()
56
+ Text("\(walletStore.wallets.filter { $0.chain == chain }.count)")
57
+ .font(.caption2)
58
+ .foregroundStyle(.secondary)
59
+ }
60
+ } icon: {
61
+ Image(systemName: chain.iconName)
62
+ .foregroundStyle(chain.color)
63
+ }
64
+ }
65
+ }
66
+ }
67
+
68
+ // Tools
69
+ Section("Tools") {
70
+ NavigationLink(value: NavigationDestination.backup) {
71
+ Label("Backup & Restore", systemImage: "arrow.triangle.2.circlepath")
72
+ }
73
+
74
+ NavigationLink(value: NavigationDestination.settings) {
75
+ Label("Settings", systemImage: "gearshape")
76
+ }
77
+ }
78
+ }
79
+ .listStyle(.sidebar)
80
+ .safeAreaInset(edge: .bottom) {
81
+ sidebarActions
82
+ }
83
+ .navigationSplitViewColumnWidth(min: 220, ideal: 260)
84
+ }
85
+
86
+ private var sidebarActions: some View {
87
+ VStack(spacing: 8) {
88
+ Divider()
89
+
90
+ HStack(spacing: 12) {
91
+ Button {
92
+ appState.activeSheet = .createWallet
93
+ } label: {
94
+ Label("Create", systemImage: "plus.circle.fill")
95
+ .frame(maxWidth: .infinity)
96
+ }
97
+ .buttonStyle(.borderedProminent)
98
+ .controlSize(.regular)
99
+
100
+ Button {
101
+ appState.activeSheet = .importWallet
102
+ } label: {
103
+ Label("Import", systemImage: "square.and.arrow.down")
104
+ .frame(maxWidth: .infinity)
105
+ }
106
+ .buttonStyle(.bordered)
107
+ .controlSize(.regular)
108
+ }
109
+ .padding(.horizontal, 16)
110
+ .padding(.bottom, 12)
111
+ }
112
+ .background(.bar)
113
+ }
114
+ }
115
+
116
+ /// Compact wallet row for the sidebar
117
+ struct WalletSidebarRow: View {
118
+ let wallet: Wallet
119
+
120
+ var body: some View {
121
+ VStack(alignment: .leading, spacing: 2) {
122
+ Text(wallet.name)
123
+ .font(.body)
124
+ .lineLimit(1)
125
+
126
+ Text(wallet.shortAddress)
127
+ .font(.caption)
128
+ .foregroundStyle(.secondary)
129
+ .lineLimit(1)
130
+ }
131
+ .padding(.vertical, 2)
132
+ }
133
+ }
@@ -0,0 +1,233 @@
1
+ import SwiftUI
2
+
3
+ /// Main dashboard showing wallet overview and quick actions
4
+ struct DashboardView: View {
5
+ @EnvironmentObject var walletStore: WalletStore
6
+ @EnvironmentObject var appState: AppState
7
+
8
+ var body: some View {
9
+ ScrollView {
10
+ VStack(spacing: 24) {
11
+ // Hero header
12
+ heroSection
13
+
14
+ // Quick actions
15
+ quickActions
16
+
17
+ // Network overview
18
+ if !walletStore.wallets.isEmpty {
19
+ networkOverview
20
+ }
21
+
22
+ // Recent wallets
23
+ if !walletStore.wallets.isEmpty {
24
+ recentWallets
25
+ }
26
+ }
27
+ .padding(24)
28
+ }
29
+ .navigationTitle("Dashboard")
30
+ }
31
+
32
+ private var heroSection: some View {
33
+ VStack(spacing: 16) {
34
+ HStack(spacing: 20) {
35
+ VStack(alignment: .leading, spacing: 8) {
36
+ Text("AgentVault Wallet")
37
+ .font(.system(size: 28, weight: .bold, design: .rounded))
38
+
39
+ Text("Manage your blockchain wallets securely")
40
+ .font(.body)
41
+ .foregroundStyle(.secondary)
42
+ }
43
+
44
+ Spacer()
45
+
46
+ // Stats
47
+ HStack(spacing: 24) {
48
+ StatCard(value: "\(walletStore.totalWalletCount)", label: "Wallets", icon: "wallet.pass.fill")
49
+ StatCard(value: "\(Set(walletStore.wallets.map(\.chain)).count)", label: "Networks", icon: "network")
50
+ }
51
+ }
52
+ .padding(24)
53
+ .background(
54
+ LinearGradient(
55
+ colors: [Color.accentColor.opacity(0.08), Color.accentColor.opacity(0.03)],
56
+ startPoint: .topLeading,
57
+ endPoint: .bottomTrailing
58
+ )
59
+ )
60
+ .clipShape(RoundedRectangle(cornerRadius: 16))
61
+ .overlay(
62
+ RoundedRectangle(cornerRadius: 16)
63
+ .stroke(Color.accentColor.opacity(0.15))
64
+ )
65
+ }
66
+ }
67
+
68
+ private var quickActions: some View {
69
+ VStack(alignment: .leading, spacing: 12) {
70
+ Text("Quick Actions")
71
+ .font(.headline)
72
+
73
+ HStack(spacing: 12) {
74
+ ActionCard(
75
+ title: "Create Wallet",
76
+ description: "Generate a new wallet",
77
+ icon: "plus.circle.fill",
78
+ color: .blue
79
+ ) {
80
+ appState.activeSheet = .createWallet
81
+ }
82
+
83
+ ActionCard(
84
+ title: "Import Wallet",
85
+ description: "From phrase, key, or file",
86
+ icon: "square.and.arrow.down.fill",
87
+ color: .green
88
+ ) {
89
+ appState.activeSheet = .importWallet
90
+ }
91
+
92
+ ActionCard(
93
+ title: "Backup",
94
+ description: "Secure your wallets",
95
+ icon: "arrow.down.doc.fill",
96
+ color: .orange
97
+ ) {
98
+ appState.activeSheet = .backup
99
+ }
100
+
101
+ ActionCard(
102
+ title: "Restore",
103
+ description: "From backup file",
104
+ icon: "arrow.uturn.backward.circle.fill",
105
+ color: .purple
106
+ ) {
107
+ appState.activeSheet = .restore
108
+ }
109
+ }
110
+ }
111
+ }
112
+
113
+ private var networkOverview: some View {
114
+ VStack(alignment: .leading, spacing: 12) {
115
+ Text("Networks")
116
+ .font(.headline)
117
+
118
+ HStack(spacing: 12) {
119
+ ForEach(Chain.allCases) { chain in
120
+ let chainWallets = walletStore.wallets.filter { $0.chain == chain }
121
+
122
+ VStack(spacing: 12) {
123
+ ZStack {
124
+ RoundedRectangle(cornerRadius: 12)
125
+ .fill(
126
+ LinearGradient(colors: chain.gradientColors,
127
+ startPoint: .topLeading, endPoint: .bottomTrailing)
128
+ )
129
+ .frame(width: 44, height: 44)
130
+
131
+ Image(systemName: chain.iconName)
132
+ .font(.title3)
133
+ .foregroundStyle(.white)
134
+ }
135
+
136
+ Text(chain.displayName)
137
+ .font(.callout.bold())
138
+
139
+ Text("\(chainWallets.count) wallet\(chainWallets.count == 1 ? "" : "s")")
140
+ .font(.caption)
141
+ .foregroundStyle(.secondary)
142
+ }
143
+ .frame(maxWidth: .infinity)
144
+ .padding(16)
145
+ .background(.background, in: RoundedRectangle(cornerRadius: 12))
146
+ .overlay(RoundedRectangle(cornerRadius: 12).stroke(.secondary.opacity(0.1)))
147
+ }
148
+ }
149
+ }
150
+ }
151
+
152
+ private var recentWallets: some View {
153
+ VStack(alignment: .leading, spacing: 12) {
154
+ HStack {
155
+ Text("Your Wallets")
156
+ .font(.headline)
157
+ Spacer()
158
+ Button("View All") {
159
+ appState.selectedDestination = .walletList
160
+ }
161
+ .buttonStyle(.plain)
162
+ .foregroundStyle(.accentColor)
163
+ .font(.callout)
164
+ }
165
+
166
+ let recent = Array(walletStore.wallets.prefix(5))
167
+ VStack(spacing: 8) {
168
+ ForEach(recent) { wallet in
169
+ WalletRowView(wallet: wallet)
170
+ .onTapGesture {
171
+ appState.selectedDestination = .walletDetail(wallet.id)
172
+ }
173
+ }
174
+ }
175
+ }
176
+ }
177
+ }
178
+
179
+ // MARK: - Supporting Views
180
+
181
+ struct StatCard: View {
182
+ let value: String
183
+ let label: String
184
+ let icon: String
185
+
186
+ var body: some View {
187
+ VStack(spacing: 6) {
188
+ Image(systemName: icon)
189
+ .font(.title3)
190
+ .foregroundStyle(.accentColor)
191
+ Text(value)
192
+ .font(.title.bold().monospacedDigit())
193
+ Text(label)
194
+ .font(.caption)
195
+ .foregroundStyle(.secondary)
196
+ }
197
+ .frame(width: 80)
198
+ }
199
+ }
200
+
201
+ struct ActionCard: View {
202
+ let title: String
203
+ let description: String
204
+ let icon: String
205
+ let color: Color
206
+ let action: () -> Void
207
+
208
+ var body: some View {
209
+ Button(action: action) {
210
+ VStack(spacing: 10) {
211
+ Image(systemName: icon)
212
+ .font(.title2)
213
+ .foregroundStyle(color)
214
+
215
+ VStack(spacing: 2) {
216
+ Text(title)
217
+ .font(.callout.bold())
218
+ Text(description)
219
+ .font(.caption2)
220
+ .foregroundStyle(.secondary)
221
+ }
222
+ }
223
+ .frame(maxWidth: .infinity)
224
+ .padding(.vertical, 16)
225
+ .background(.background, in: RoundedRectangle(cornerRadius: 12))
226
+ .overlay(
227
+ RoundedRectangle(cornerRadius: 12)
228
+ .stroke(Color.secondary.opacity(0.15))
229
+ )
230
+ }
231
+ .buttonStyle(.plain)
232
+ }
233
+ }