agentvault 1.0.0 → 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 (293) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/README.md +1 -1
  3. package/dist/cli/commands/approve.js +5 -5
  4. package/dist/cli/commands/archive.js +5 -5
  5. package/dist/cli/commands/backup.js +5 -5
  6. package/dist/cli/commands/cloud-backup.js +12 -12
  7. package/dist/cli/commands/decrypt.js +2 -2
  8. package/dist/cli/commands/deploy.js +1 -1
  9. package/dist/cli/commands/exec.js +2 -2
  10. package/dist/cli/commands/fetch.js +4 -4
  11. package/dist/cli/commands/inference.js +5 -5
  12. package/dist/cli/commands/init.d.ts +1 -1
  13. package/dist/cli/commands/init.js +16 -16
  14. package/dist/cli/commands/list.js +4 -4
  15. package/dist/cli/commands/package.js +2 -2
  16. package/dist/cli/commands/profile.js +1 -1
  17. package/dist/cli/commands/rebuild.js +2 -2
  18. package/dist/cli/commands/show.js +1 -1
  19. package/dist/cli/commands/status.d.ts +1 -1
  20. package/dist/cli/commands/status.js +8 -8
  21. package/dist/cli/commands/trace.js +1 -1
  22. package/dist/cli/commands/wallet-export.js +1 -1
  23. package/dist/cli/commands/wallet-sign.js +1 -1
  24. package/dist/cli/commands/wallet.d.ts +1 -1
  25. package/dist/cli/commands/wallet.js +1 -1
  26. package/dist/cli/index.d.ts +2 -2
  27. package/dist/cli/index.js +3 -3
  28. package/dist/src/archival/archive-manager.d.ts +85 -0
  29. package/dist/src/archival/archive-manager.js +294 -0
  30. package/dist/src/archival/arweave-client.d.ts +88 -0
  31. package/dist/src/archival/arweave-client.js +223 -0
  32. package/dist/src/archival/index.d.ts +8 -0
  33. package/{src/archival/index.ts → dist/src/archival/index.js} +1 -1
  34. package/dist/src/backup/backup.d.ts +67 -0
  35. package/dist/src/backup/backup.js +231 -0
  36. package/dist/src/backup/index.d.ts +7 -0
  37. package/{src/backup/index.ts → dist/src/backup/index.js} +1 -1
  38. package/dist/src/cloud-storage/cloud-sync.d.ts +49 -0
  39. package/dist/src/cloud-storage/cloud-sync.js +372 -0
  40. package/dist/src/cloud-storage/index.d.ts +11 -0
  41. package/{src/cloud-storage/index.ts → dist/src/cloud-storage/index.js} +1 -1
  42. package/dist/src/cloud-storage/provider-detector.d.ts +34 -0
  43. package/dist/src/cloud-storage/provider-detector.js +158 -0
  44. package/{src/cloud-storage/types.ts → dist/src/cloud-storage/types.d.ts} +40 -53
  45. package/dist/src/cloud-storage/types.js +10 -0
  46. package/dist/src/debugging/index.d.ts +6 -0
  47. package/{src/debugging/index.ts → dist/src/debugging/index.js} +1 -1
  48. package/dist/src/debugging/logs.d.ts +32 -0
  49. package/dist/src/debugging/logs.js +158 -0
  50. package/dist/src/debugging/types.d.ts +91 -0
  51. package/dist/src/debugging/types.js +5 -0
  52. package/dist/src/deployment/deployer.d.ts +52 -0
  53. package/dist/src/deployment/deployer.js +211 -0
  54. package/dist/src/deployment/icpClient.d.ts +144 -0
  55. package/dist/src/deployment/icpClient.js +545 -0
  56. package/dist/src/deployment/index.d.ts +11 -0
  57. package/dist/src/deployment/index.js +14 -0
  58. package/dist/src/deployment/promotion.d.ts +32 -0
  59. package/dist/src/deployment/promotion.js +114 -0
  60. package/dist/src/deployment/types.d.ts +101 -0
  61. package/dist/src/deployment/types.js +5 -0
  62. package/dist/src/icp/batch.d.ts +112 -0
  63. package/dist/src/icp/batch.js +273 -0
  64. package/dist/src/icp/cycles.d.ts +29 -0
  65. package/{src/icp/cycles.ts → dist/src/icp/cycles.js} +8 -22
  66. package/dist/src/icp/environment.d.ts +60 -0
  67. package/dist/src/icp/environment.js +183 -0
  68. package/dist/src/icp/icpcli.d.ts +204 -0
  69. package/dist/src/icp/icpcli.js +374 -0
  70. package/dist/src/icp/icwasm.d.ts +94 -0
  71. package/dist/src/icp/icwasm.js +197 -0
  72. package/dist/src/icp/identity.d.ts +50 -0
  73. package/{src/icp/identity.ts → dist/src/icp/identity.js} +15 -28
  74. package/dist/src/icp/index.d.ts +16 -0
  75. package/dist/src/icp/index.js +20 -0
  76. package/dist/src/icp/optimization.d.ts +16 -0
  77. package/dist/src/icp/optimization.js +225 -0
  78. package/dist/src/icp/tokens.d.ts +24 -0
  79. package/{src/icp/tokens.ts → dist/src/icp/tokens.js} +5 -12
  80. package/dist/src/icp/tool-detector.d.ts +31 -0
  81. package/dist/src/icp/tool-detector.js +104 -0
  82. package/dist/src/icp/types.d.ts +493 -0
  83. package/dist/src/icp/types.js +7 -0
  84. package/dist/src/index.d.ts +12 -0
  85. package/dist/src/index.js +18 -0
  86. package/dist/src/inference/bittensor-client.d.ts +108 -0
  87. package/dist/src/inference/bittensor-client.js +224 -0
  88. package/dist/src/inference/index.d.ts +8 -0
  89. package/{src/inference/index.ts → dist/src/inference/index.js} +1 -1
  90. package/dist/src/inference/inference-manager.d.ts +76 -0
  91. package/dist/src/inference/inference-manager.js +228 -0
  92. package/dist/src/metrics/index.d.ts +7 -0
  93. package/{src/metrics/index.ts → dist/src/metrics/index.js} +1 -1
  94. package/dist/src/metrics/metrics.d.ts +39 -0
  95. package/dist/src/metrics/metrics.js +129 -0
  96. package/dist/src/monitoring/alerting.d.ts +51 -0
  97. package/dist/src/monitoring/alerting.js +169 -0
  98. package/dist/src/monitoring/health.d.ts +40 -0
  99. package/dist/src/monitoring/health.js +164 -0
  100. package/dist/src/monitoring/index.d.ts +10 -0
  101. package/dist/src/monitoring/index.js +12 -0
  102. package/dist/src/monitoring/info.d.ts +15 -0
  103. package/dist/src/monitoring/info.js +109 -0
  104. package/dist/src/monitoring/types.d.ts +93 -0
  105. package/dist/src/monitoring/types.js +7 -0
  106. package/dist/src/network/index.d.ts +5 -0
  107. package/{src/network/index.ts → dist/src/network/index.js} +1 -1
  108. package/dist/src/network/network-config.d.ts +31 -0
  109. package/dist/src/network/network-config.js +109 -0
  110. package/dist/src/packaging/compiler.d.ts +61 -0
  111. package/dist/src/packaging/compiler.js +562 -0
  112. package/dist/src/packaging/config-persistence.d.ts +46 -0
  113. package/dist/src/packaging/config-persistence.js +108 -0
  114. package/dist/src/packaging/config-schemas.d.ts +115 -0
  115. package/dist/src/packaging/config-schemas.js +43 -0
  116. package/dist/src/packaging/detector.d.ts +26 -0
  117. package/dist/src/packaging/detector.js +193 -0
  118. package/dist/src/packaging/index.d.ts +16 -0
  119. package/dist/src/packaging/index.js +22 -0
  120. package/dist/src/packaging/packager.d.ts +31 -0
  121. package/dist/src/packaging/packager.js +90 -0
  122. package/dist/src/packaging/parsers/clawdbot.d.ts +19 -0
  123. package/dist/src/packaging/parsers/clawdbot.js +231 -0
  124. package/dist/src/packaging/parsers/cline.d.ts +26 -0
  125. package/dist/src/packaging/parsers/cline.js +185 -0
  126. package/dist/src/packaging/parsers/generic.d.ts +27 -0
  127. package/dist/src/packaging/parsers/generic.js +228 -0
  128. package/dist/src/packaging/parsers/goose.d.ts +26 -0
  129. package/dist/src/packaging/parsers/goose.js +175 -0
  130. package/dist/src/packaging/parsers/index.d.ts +11 -0
  131. package/{src/packaging/parsers/index.ts → dist/src/packaging/parsers/index.js} +1 -1
  132. package/dist/src/packaging/serializer.d.ts +108 -0
  133. package/dist/src/packaging/serializer.js +153 -0
  134. package/dist/src/packaging/types.d.ts +131 -0
  135. package/dist/src/packaging/types.js +5 -0
  136. package/dist/src/packaging/wasmedge-compiler.d.ts +76 -0
  137. package/dist/src/packaging/wasmedge-compiler.js +349 -0
  138. package/dist/src/security/index.d.ts +11 -0
  139. package/{src/security/index.ts → dist/src/security/index.js} +1 -4
  140. package/dist/src/security/multisig.d.ts +102 -0
  141. package/dist/src/security/multisig.js +283 -0
  142. package/dist/src/security/types.d.ts +207 -0
  143. package/dist/src/security/types.js +217 -0
  144. package/dist/src/security/vetkeys.d.ts +179 -0
  145. package/dist/src/security/vetkeys.js +499 -0
  146. package/dist/src/testing/index.d.ts +6 -0
  147. package/{src/testing/index.ts → dist/src/testing/index.js} +1 -1
  148. package/dist/src/testing/local-runner.d.ts +23 -0
  149. package/dist/src/testing/local-runner.js +226 -0
  150. package/dist/src/testing/types.d.ts +98 -0
  151. package/dist/src/testing/types.js +5 -0
  152. package/dist/src/wallet/cbor-serializer.d.ts +82 -0
  153. package/dist/src/wallet/cbor-serializer.js +282 -0
  154. package/dist/src/wallet/chain-dispatcher.d.ts +112 -0
  155. package/dist/src/wallet/chain-dispatcher.js +241 -0
  156. package/dist/src/wallet/cross-chain-aggregator.d.ts +119 -0
  157. package/dist/src/wallet/cross-chain-aggregator.js +235 -0
  158. package/dist/src/wallet/index.d.ts +16 -0
  159. package/dist/src/wallet/index.js +22 -0
  160. package/dist/src/wallet/key-derivation.d.ts +117 -0
  161. package/dist/src/wallet/key-derivation.js +325 -0
  162. package/dist/src/wallet/providers/base-provider.d.ts +111 -0
  163. package/dist/src/wallet/providers/base-provider.js +58 -0
  164. package/dist/src/wallet/providers/cketh-provider.d.ts +104 -0
  165. package/dist/src/wallet/providers/cketh-provider.js +343 -0
  166. package/dist/src/wallet/providers/polkadot-provider.d.ts +115 -0
  167. package/dist/src/wallet/providers/polkadot-provider.js +407 -0
  168. package/dist/src/wallet/providers/solana-provider.d.ts +102 -0
  169. package/dist/src/wallet/providers/solana-provider.js +393 -0
  170. package/dist/src/wallet/transaction-queue.d.ts +133 -0
  171. package/dist/src/wallet/transaction-queue.js +195 -0
  172. package/dist/src/wallet/types.d.ts +167 -0
  173. package/dist/src/wallet/types.js +5 -0
  174. package/dist/src/wallet/vetkeys-adapter.d.ts +134 -0
  175. package/dist/src/wallet/vetkeys-adapter.js +313 -0
  176. package/dist/src/wallet/wallet-manager.d.ts +202 -0
  177. package/dist/src/wallet/wallet-manager.js +451 -0
  178. package/dist/src/wallet/wallet-storage.d.ts +131 -0
  179. package/dist/src/wallet/wallet-storage.js +274 -0
  180. package/macos-wallet-app/AgentVaultWallet/App/AgentVaultWalletApp.swift +54 -0
  181. package/macos-wallet-app/AgentVaultWallet/Models/AppState.swift +102 -0
  182. package/macos-wallet-app/AgentVaultWallet/Models/Chain.swift +121 -0
  183. package/macos-wallet-app/AgentVaultWallet/Models/Wallet.swift +98 -0
  184. package/macos-wallet-app/AgentVaultWallet/Resources/AgentVaultWallet.entitlements +27 -0
  185. package/macos-wallet-app/AgentVaultWallet/Resources/Info.plist +69 -0
  186. package/macos-wallet-app/AgentVaultWallet/Services/BackupService.swift +270 -0
  187. package/macos-wallet-app/AgentVaultWallet/Services/CLIBridge.swift +367 -0
  188. package/macos-wallet-app/AgentVaultWallet/Services/CryptoService.swift +157 -0
  189. package/macos-wallet-app/AgentVaultWallet/Services/FileService.swift +120 -0
  190. package/macos-wallet-app/AgentVaultWallet/Services/KeychainService.swift +219 -0
  191. package/macos-wallet-app/AgentVaultWallet/Utilities/Constants.swift +44 -0
  192. package/macos-wallet-app/AgentVaultWallet/Utilities/Extensions.swift +115 -0
  193. package/macos-wallet-app/AgentVaultWallet/ViewModels/BackupViewModel.swift +237 -0
  194. package/macos-wallet-app/AgentVaultWallet/ViewModels/CreateWalletViewModel.swift +137 -0
  195. package/macos-wallet-app/AgentVaultWallet/ViewModels/ImportWalletViewModel.swift +179 -0
  196. package/macos-wallet-app/AgentVaultWallet/ViewModels/WalletStore.swift +286 -0
  197. package/macos-wallet-app/AgentVaultWallet/Views/Backup/BackupView.swift +235 -0
  198. package/macos-wallet-app/AgentVaultWallet/Views/Backup/RestoreView.swift +316 -0
  199. package/macos-wallet-app/AgentVaultWallet/Views/Create/CreateWalletFlow.swift +438 -0
  200. package/macos-wallet-app/AgentVaultWallet/Views/Import/ImportWalletFlow.swift +399 -0
  201. package/macos-wallet-app/AgentVaultWallet/Views/MainView.swift +134 -0
  202. package/macos-wallet-app/AgentVaultWallet/Views/Settings/SettingsView.swift +276 -0
  203. package/macos-wallet-app/AgentVaultWallet/Views/Sidebar/SidebarView.swift +133 -0
  204. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/DashboardView.swift +233 -0
  205. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletDetailView.swift +281 -0
  206. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletListView.swift +280 -0
  207. package/macos-wallet-app/AgentVaultWallet/Views/Welcome/WelcomeView.swift +176 -0
  208. package/macos-wallet-app/Makefile +47 -0
  209. package/macos-wallet-app/project.yml +40 -0
  210. package/macos-wallet-app/setup.sh +73 -0
  211. package/package.json +10 -2
  212. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-28-967Z.json +0 -28
  213. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-29-032Z.backup +0 -1
  214. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-373Z.json +0 -28
  215. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-428Z.backup +0 -1
  216. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-132Z.json +0 -28
  217. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-247Z.backup +0 -1
  218. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-216Z.json +0 -28
  219. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-283Z.backup +0 -1
  220. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-772Z.backup +0 -1
  221. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-793Z.json +0 -28
  222. package/backups/test-backup.json +0 -28
  223. package/scripts/dev-dashboard.mjs +0 -84
  224. package/site/README.md +0 -63
  225. package/site/docusaurus.config.ts +0 -148
  226. package/site/package-lock.json +0 -18383
  227. package/site/package.json +0 -47
  228. package/site/sidebars.ts +0 -86
  229. package/site/static/.gitkeep +0 -0
  230. package/site/static/img/logo.svg +0 -28
  231. package/site/static/img/og-image.svg +0 -35
  232. package/src/archival/archive-manager.ts +0 -372
  233. package/src/archival/arweave-client.ts +0 -289
  234. package/src/backup/backup.ts +0 -315
  235. package/src/cloud-storage/cloud-sync.ts +0 -461
  236. package/src/cloud-storage/provider-detector.ts +0 -198
  237. package/src/debugging/logs.ts +0 -193
  238. package/src/debugging/types.ts +0 -100
  239. package/src/deployment/deployer.ts +0 -274
  240. package/src/deployment/icpClient.ts +0 -620
  241. package/src/deployment/index.ts +0 -46
  242. package/src/deployment/promotion.ts +0 -161
  243. package/src/deployment/types.ts +0 -111
  244. package/src/icp/batch.ts +0 -374
  245. package/src/icp/environment.ts +0 -215
  246. package/src/icp/icpcli.ts +0 -438
  247. package/src/icp/icwasm.ts +0 -222
  248. package/src/icp/index.ts +0 -94
  249. package/src/icp/optimization.ts +0 -242
  250. package/src/icp/tool-detector.ts +0 -110
  251. package/src/icp/types.ts +0 -574
  252. package/src/index.ts +0 -25
  253. package/src/inference/bittensor-client.ts +0 -304
  254. package/src/inference/inference-manager.ts +0 -327
  255. package/src/metrics/metrics.ts +0 -186
  256. package/src/monitoring/alerting.ts +0 -190
  257. package/src/monitoring/health.ts +0 -197
  258. package/src/monitoring/index.ts +0 -38
  259. package/src/monitoring/info.ts +0 -114
  260. package/src/monitoring/types.ts +0 -99
  261. package/src/network/network-config.ts +0 -129
  262. package/src/packaging/compiler.ts +0 -647
  263. package/src/packaging/config-persistence.ts +0 -135
  264. package/src/packaging/config-schemas.ts +0 -156
  265. package/src/packaging/detector.ts +0 -220
  266. package/src/packaging/index.ts +0 -90
  267. package/src/packaging/packager.ts +0 -118
  268. package/src/packaging/parsers/clawdbot.ts +0 -278
  269. package/src/packaging/parsers/cline.ts +0 -223
  270. package/src/packaging/parsers/generic.ts +0 -266
  271. package/src/packaging/parsers/goose.ts +0 -214
  272. package/src/packaging/serializer.ts +0 -260
  273. package/src/packaging/types.ts +0 -144
  274. package/src/packaging/wasmedge-compiler.ts +0 -406
  275. package/src/security/multisig.ts +0 -415
  276. package/src/security/types.ts +0 -416
  277. package/src/security/vetkeys.ts +0 -655
  278. package/src/testing/local-runner.ts +0 -264
  279. package/src/testing/types.ts +0 -104
  280. package/src/wallet/cbor-serializer.ts +0 -323
  281. package/src/wallet/chain-dispatcher.ts +0 -313
  282. package/src/wallet/cross-chain-aggregator.ts +0 -346
  283. package/src/wallet/index.ts +0 -76
  284. package/src/wallet/key-derivation.ts +0 -425
  285. package/src/wallet/providers/base-provider.ts +0 -154
  286. package/src/wallet/providers/cketh-provider.ts +0 -434
  287. package/src/wallet/providers/polkadot-provider.ts +0 -503
  288. package/src/wallet/providers/solana-provider.ts +0 -490
  289. package/src/wallet/transaction-queue.ts +0 -284
  290. package/src/wallet/types.ts +0 -178
  291. package/src/wallet/vetkeys-adapter.ts +0 -431
  292. package/src/wallet/wallet-manager.ts +0 -597
  293. 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
+ }