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,372 @@
1
+ /**
2
+ * Cloud Sync
3
+ *
4
+ * Archive and restore AgentVault data to/from a cloud-synced
5
+ * local directory. Creates a self-contained folder with a JSON
6
+ * manifest so any cloud provider can sync it as plain files.
7
+ *
8
+ * No blockchain, no crypto, no API keys — just files.
9
+ */
10
+ import fs from 'node:fs';
11
+ import path from 'node:path';
12
+ import os from 'node:os';
13
+ import crypto from 'node:crypto';
14
+ import { VERSION } from '../index.js';
15
+ import { resolveCloudBackupDir } from './provider-detector.js';
16
+ const MANIFEST_FILENAME = 'manifest.json';
17
+ const MANIFEST_VERSION = '1.0';
18
+ /**
19
+ * Return the default AgentVault data directory.
20
+ */
21
+ export function getDefaultVaultDir() {
22
+ return path.join(os.homedir(), '.agentvault');
23
+ }
24
+ /**
25
+ * Compute SHA-256 hex digest of a buffer.
26
+ */
27
+ function sha256(data) {
28
+ return crypto.createHash('sha256').update(data).digest('hex');
29
+ }
30
+ /**
31
+ * Recursively collect all files under a directory.
32
+ * Returns paths relative to `baseDir`.
33
+ */
34
+ function collectFiles(baseDir) {
35
+ const results = [];
36
+ function walk(dir) {
37
+ if (!fs.existsSync(dir))
38
+ return;
39
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
40
+ for (const entry of entries) {
41
+ const full = path.join(dir, entry.name);
42
+ if (entry.isDirectory()) {
43
+ walk(full);
44
+ }
45
+ else if (entry.isFile()) {
46
+ results.push(path.relative(baseDir, full));
47
+ }
48
+ }
49
+ }
50
+ walk(baseDir);
51
+ return results;
52
+ }
53
+ /**
54
+ * Get the list of source directories/files to include,
55
+ * scoped to a specific agent or the entire vault.
56
+ */
57
+ function getSourcePaths(options, vaultDir) {
58
+ const sources = [];
59
+ const agentName = options.agentName;
60
+ if (options.includeConfigs) {
61
+ if (agentName) {
62
+ sources.push({
63
+ label: 'configs',
64
+ absPath: path.join(vaultDir, 'agents', agentName),
65
+ });
66
+ }
67
+ else {
68
+ sources.push({
69
+ label: 'configs',
70
+ absPath: path.join(vaultDir, 'agents'),
71
+ });
72
+ }
73
+ }
74
+ if (options.includeWallets) {
75
+ if (agentName) {
76
+ sources.push({
77
+ label: 'wallets',
78
+ absPath: path.join(vaultDir, 'wallets', agentName),
79
+ });
80
+ }
81
+ else {
82
+ sources.push({
83
+ label: 'wallets',
84
+ absPath: path.join(vaultDir, 'wallets'),
85
+ });
86
+ }
87
+ }
88
+ if (options.includeBackups) {
89
+ sources.push({
90
+ label: 'backups',
91
+ absPath: path.join(vaultDir, 'backups'),
92
+ });
93
+ }
94
+ if (options.includeNetworks) {
95
+ sources.push({
96
+ label: 'networks',
97
+ absPath: path.join(vaultDir, 'networks'),
98
+ });
99
+ }
100
+ return sources;
101
+ }
102
+ /**
103
+ * Archive AgentVault data to a cloud-synced directory.
104
+ *
105
+ * Creates a timestamped folder inside the cloud backup dir
106
+ * containing a copy of the selected vault data plus a manifest.
107
+ *
108
+ * @param providerBasePath - Root path of the cloud provider sync directory
109
+ * @param options - What to include in the archive
110
+ * @param subdirectory - Subdirectory name inside provider (default: AgentVault-Backups)
111
+ * @param vaultDir - Path to the AgentVault data directory (default: ~/.agentvault)
112
+ */
113
+ export function archiveToCloud(providerBasePath, options, subdirectory, vaultDir) {
114
+ try {
115
+ const effectiveVaultDir = vaultDir || getDefaultVaultDir();
116
+ const cloudDir = resolveCloudBackupDir(providerBasePath, subdirectory);
117
+ const timestamp = new Date()
118
+ .toISOString()
119
+ .replace(/[:.]/g, '-');
120
+ const folderName = options.agentName
121
+ ? `${options.agentName}-${timestamp}`
122
+ : `vault-${timestamp}`;
123
+ const archiveDir = path.join(cloudDir, folderName);
124
+ // Create archive directory
125
+ fs.mkdirSync(archiveDir, { recursive: true });
126
+ const sources = getSourcePaths(options, effectiveVaultDir);
127
+ const fileEntries = [];
128
+ const components = [];
129
+ let totalBytes = 0;
130
+ for (const source of sources) {
131
+ if (!fs.existsSync(source.absPath))
132
+ continue;
133
+ const stat = fs.statSync(source.absPath);
134
+ const componentDir = path.join(archiveDir, source.label);
135
+ if (stat.isDirectory()) {
136
+ const files = collectFiles(source.absPath);
137
+ if (files.length === 0)
138
+ continue;
139
+ components.push(source.label);
140
+ for (const relFile of files) {
141
+ const srcFile = path.join(source.absPath, relFile);
142
+ const destFile = path.join(componentDir, relFile);
143
+ fs.mkdirSync(path.dirname(destFile), { recursive: true });
144
+ fs.copyFileSync(srcFile, destFile);
145
+ const fileData = fs.readFileSync(destFile);
146
+ fileEntries.push({
147
+ relativePath: path.join(source.label, relFile),
148
+ sizeBytes: fileData.length,
149
+ checksum: sha256(fileData),
150
+ });
151
+ totalBytes += fileData.length;
152
+ }
153
+ }
154
+ else {
155
+ // Single file (e.g. a specific agent config)
156
+ components.push(source.label);
157
+ fs.mkdirSync(componentDir, { recursive: true });
158
+ const destFile = path.join(componentDir, path.basename(source.absPath));
159
+ fs.copyFileSync(source.absPath, destFile);
160
+ const fileData = fs.readFileSync(destFile);
161
+ fileEntries.push({
162
+ relativePath: path.join(source.label, path.basename(source.absPath)),
163
+ sizeBytes: fileData.length,
164
+ checksum: sha256(fileData),
165
+ });
166
+ totalBytes += fileData.length;
167
+ }
168
+ }
169
+ if (fileEntries.length === 0) {
170
+ // Clean up empty dir
171
+ fs.rmSync(archiveDir, { recursive: true, force: true });
172
+ return {
173
+ success: false,
174
+ error: 'No data found to archive. Check that ~/.agentvault contains data.',
175
+ };
176
+ }
177
+ // Compute overall checksum from sorted file checksums
178
+ const overallChecksum = sha256(Buffer.from(fileEntries
179
+ .map((f) => f.checksum)
180
+ .sort()
181
+ .join('')));
182
+ const manifest = {
183
+ version: MANIFEST_VERSION,
184
+ createdAt: new Date().toISOString(),
185
+ platform: os.platform(),
186
+ hostname: os.hostname(),
187
+ agentVaultVersion: VERSION,
188
+ agentName: options.agentName,
189
+ components,
190
+ files: fileEntries,
191
+ checksum: overallChecksum,
192
+ };
193
+ const manifestPath = path.join(archiveDir, MANIFEST_FILENAME);
194
+ fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf8');
195
+ return {
196
+ success: true,
197
+ archivePath: archiveDir,
198
+ manifestPath,
199
+ fileCount: fileEntries.length,
200
+ totalBytes,
201
+ };
202
+ }
203
+ catch (error) {
204
+ return {
205
+ success: false,
206
+ error: error instanceof Error ? error.message : 'Unknown error',
207
+ };
208
+ }
209
+ }
210
+ /**
211
+ * List available archives in a cloud backup directory.
212
+ */
213
+ export function listCloudArchives(providerBasePath, subdirectory) {
214
+ const cloudDir = resolveCloudBackupDir(providerBasePath, subdirectory);
215
+ if (!fs.existsSync(cloudDir)) {
216
+ return [];
217
+ }
218
+ const entries = fs.readdirSync(cloudDir, { withFileTypes: true });
219
+ const archives = [];
220
+ for (const entry of entries) {
221
+ if (!entry.isDirectory())
222
+ continue;
223
+ const manifestPath = path.join(cloudDir, entry.name, MANIFEST_FILENAME);
224
+ if (!fs.existsSync(manifestPath))
225
+ continue;
226
+ try {
227
+ const raw = fs.readFileSync(manifestPath, 'utf8');
228
+ const manifest = JSON.parse(raw);
229
+ archives.push({
230
+ manifestPath,
231
+ archivePath: path.join(cloudDir, entry.name),
232
+ manifest,
233
+ });
234
+ }
235
+ catch {
236
+ // Skip malformed manifests
237
+ }
238
+ }
239
+ // Sort newest first
240
+ archives.sort((a, b) => new Date(b.manifest.createdAt).getTime() -
241
+ new Date(a.manifest.createdAt).getTime());
242
+ return archives;
243
+ }
244
+ /**
245
+ * Restore AgentVault data from a cloud archive.
246
+ *
247
+ * Copies files from the archive back into the vault directory,
248
+ * verifying checksums along the way.
249
+ *
250
+ * @param archivePath - Path to the archive directory
251
+ * @param overwrite - Whether to overwrite existing files
252
+ * @param vaultDir - Path to the AgentVault data directory (default: ~/.agentvault)
253
+ */
254
+ export function restoreFromCloud(archivePath, overwrite = false, vaultDir) {
255
+ try {
256
+ const effectiveVaultDir = vaultDir || getDefaultVaultDir();
257
+ const manifestPath = path.join(archivePath, MANIFEST_FILENAME);
258
+ if (!fs.existsSync(manifestPath)) {
259
+ return {
260
+ success: false,
261
+ warnings: [],
262
+ error: `No manifest found at ${manifestPath}`,
263
+ };
264
+ }
265
+ const raw = fs.readFileSync(manifestPath, 'utf8');
266
+ const manifest = JSON.parse(raw);
267
+ const warnings = [];
268
+ let restoredFiles = 0;
269
+ // Component-to-vault-dir mapping
270
+ const componentDirMap = {
271
+ configs: 'agents',
272
+ wallets: 'wallets',
273
+ backups: 'backups',
274
+ networks: 'networks',
275
+ };
276
+ for (const fileEntry of manifest.files) {
277
+ const srcFile = path.join(archivePath, fileEntry.relativePath);
278
+ if (!fs.existsSync(srcFile)) {
279
+ warnings.push(`Missing file in archive: ${fileEntry.relativePath}`);
280
+ continue;
281
+ }
282
+ // Verify checksum
283
+ const fileData = fs.readFileSync(srcFile);
284
+ const actualChecksum = sha256(fileData);
285
+ if (actualChecksum !== fileEntry.checksum) {
286
+ warnings.push(`Checksum mismatch for ${fileEntry.relativePath} (expected ${fileEntry.checksum.slice(0, 8)}..., got ${actualChecksum.slice(0, 8)}...)`);
287
+ continue;
288
+ }
289
+ // Determine destination: map component prefix to vault dir
290
+ const firstSlash = fileEntry.relativePath.indexOf(path.sep);
291
+ // Handle both / and path.sep for cross-platform paths in manifests
292
+ const firstSlashAlt = fileEntry.relativePath.indexOf('/');
293
+ const slashIdx = firstSlash >= 0 && firstSlashAlt >= 0
294
+ ? Math.min(firstSlash, firstSlashAlt)
295
+ : Math.max(firstSlash, firstSlashAlt);
296
+ if (slashIdx < 0) {
297
+ warnings.push(`Skipping file with no component prefix: ${fileEntry.relativePath}`);
298
+ continue;
299
+ }
300
+ const component = fileEntry.relativePath.slice(0, slashIdx);
301
+ const restOfPath = fileEntry.relativePath.slice(slashIdx + 1);
302
+ const vaultSubdir = componentDirMap[component];
303
+ if (!vaultSubdir) {
304
+ warnings.push(`Unknown component "${component}" for ${fileEntry.relativePath}`);
305
+ continue;
306
+ }
307
+ const destFile = path.join(effectiveVaultDir, vaultSubdir, restOfPath);
308
+ if (fs.existsSync(destFile) && !overwrite) {
309
+ warnings.push(`Skipping existing file (use --overwrite): ${destFile}`);
310
+ continue;
311
+ }
312
+ fs.mkdirSync(path.dirname(destFile), { recursive: true });
313
+ fs.copyFileSync(srcFile, destFile);
314
+ restoredFiles++;
315
+ }
316
+ return {
317
+ success: true,
318
+ restoredFiles,
319
+ components: manifest.components,
320
+ warnings,
321
+ };
322
+ }
323
+ catch (error) {
324
+ return {
325
+ success: false,
326
+ warnings: [],
327
+ error: error instanceof Error ? error.message : 'Unknown error',
328
+ };
329
+ }
330
+ }
331
+ /**
332
+ * Verify integrity of a cloud archive by checking all file checksums.
333
+ */
334
+ export function verifyCloudArchive(archivePath) {
335
+ const errors = [];
336
+ const manifestPath = path.join(archivePath, MANIFEST_FILENAME);
337
+ if (!fs.existsSync(manifestPath)) {
338
+ return { valid: false, errors: ['Manifest file not found'] };
339
+ }
340
+ try {
341
+ const raw = fs.readFileSync(manifestPath, 'utf8');
342
+ const manifest = JSON.parse(raw);
343
+ for (const fileEntry of manifest.files) {
344
+ const filePath = path.join(archivePath, fileEntry.relativePath);
345
+ if (!fs.existsSync(filePath)) {
346
+ errors.push(`Missing: ${fileEntry.relativePath}`);
347
+ continue;
348
+ }
349
+ const fileData = fs.readFileSync(filePath);
350
+ const actualChecksum = sha256(fileData);
351
+ if (actualChecksum !== fileEntry.checksum) {
352
+ errors.push(`Checksum mismatch: ${fileEntry.relativePath}`);
353
+ }
354
+ }
355
+ // Verify overall checksum
356
+ const expectedOverall = sha256(Buffer.from(manifest.files
357
+ .map((f) => f.checksum)
358
+ .sort()
359
+ .join('')));
360
+ if (expectedOverall !== manifest.checksum) {
361
+ errors.push('Overall archive checksum mismatch');
362
+ }
363
+ return { valid: errors.length === 0, errors };
364
+ }
365
+ catch (error) {
366
+ return {
367
+ valid: false,
368
+ errors: [error instanceof Error ? error.message : 'Unknown error'],
369
+ };
370
+ }
371
+ }
372
+ //# sourceMappingURL=cloud-sync.js.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Cloud Storage Module
3
+ *
4
+ * Archive and restore AgentVault data to consumer cloud storage
5
+ * providers (Google Drive, iCloud, Dropbox, OneDrive, etc.)
6
+ * using their local sync directories. No crypto required.
7
+ */
8
+ export * from './types.js';
9
+ export * from './provider-detector.js';
10
+ export * from './cloud-sync.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -5,7 +5,7 @@
5
5
  * providers (Google Drive, iCloud, Dropbox, OneDrive, etc.)
6
6
  * using their local sync directories. No crypto required.
7
7
  */
8
-
9
8
  export * from './types.js';
10
9
  export * from './provider-detector.js';
11
10
  export * from './cloud-sync.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Cloud Provider Detector
3
+ *
4
+ * Auto-detects consumer cloud storage providers by checking for
5
+ * their well-known local sync directories on the current platform.
6
+ * No API keys, no SDK installs — just plain filesystem checks.
7
+ */
8
+ import type { CloudProvider, DetectedProvider } from './types.js';
9
+ /**
10
+ * Detect all available cloud storage providers on this machine.
11
+ * Returns one entry per provider, using the first matching path found.
12
+ */
13
+ export declare function detectProviders(): DetectedProvider[];
14
+ /**
15
+ * Detect only available (installed/syncing) providers.
16
+ */
17
+ export declare function detectAvailableProviders(): DetectedProvider[];
18
+ /**
19
+ * Get the default AgentVault subdirectory name inside a cloud provider.
20
+ */
21
+ export declare function getCloudSubdirectory(): string;
22
+ /**
23
+ * Resolve the full cloud backup directory for a given provider path.
24
+ */
25
+ export declare function resolveCloudBackupDir(providerPath: string, subdirectory?: string): string;
26
+ /**
27
+ * Build a DetectedProvider for a custom/user-specified path.
28
+ */
29
+ export declare function createCustomProvider(customPath: string): DetectedProvider;
30
+ /**
31
+ * Get a human-readable label for a provider.
32
+ */
33
+ export declare function getProviderLabel(provider: CloudProvider): string;
34
+ //# sourceMappingURL=provider-detector.d.ts.map
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Cloud Provider Detector
3
+ *
4
+ * Auto-detects consumer cloud storage providers by checking for
5
+ * their well-known local sync directories on the current platform.
6
+ * No API keys, no SDK installs — just plain filesystem checks.
7
+ */
8
+ import fs from 'node:fs';
9
+ import path from 'node:path';
10
+ import os from 'node:os';
11
+ /**
12
+ * Build the list of well-known sync directory paths per provider.
13
+ * Paths vary by OS, so we enumerate all known locations.
14
+ */
15
+ function getCandidates() {
16
+ const home = os.homedir();
17
+ const platform = os.platform();
18
+ const candidates = [
19
+ {
20
+ provider: 'google-drive',
21
+ label: 'Google Drive',
22
+ paths: [
23
+ path.join(home, 'Google Drive'),
24
+ path.join(home, 'My Drive'),
25
+ ...(platform === 'darwin'
26
+ ? [
27
+ path.join(home, 'Library', 'CloudStorage', 'GoogleDrive'),
28
+ path.join(home, 'Library', 'CloudStorage', 'GoogleDrive-My Drive'),
29
+ ]
30
+ : []),
31
+ ...(platform === 'win32'
32
+ ? [path.join('G:', 'My Drive')]
33
+ : []),
34
+ ],
35
+ },
36
+ {
37
+ provider: 'icloud-drive',
38
+ label: 'iCloud Drive',
39
+ paths: platform === 'darwin'
40
+ ? [
41
+ path.join(home, 'Library', 'Mobile Documents', 'com~apple~CloudDocs'),
42
+ ]
43
+ : platform === 'win32'
44
+ ? [
45
+ path.join(home, 'iCloudDrive'),
46
+ path.join(process.env['USERPROFILE'] || home, 'iCloudDrive'),
47
+ ]
48
+ : [],
49
+ },
50
+ {
51
+ provider: 'dropbox',
52
+ label: 'Dropbox',
53
+ paths: [
54
+ path.join(home, 'Dropbox'),
55
+ ...(platform === 'win32'
56
+ ? [path.join('D:', 'Dropbox')]
57
+ : []),
58
+ ],
59
+ },
60
+ {
61
+ provider: 'onedrive',
62
+ label: 'OneDrive',
63
+ paths: [
64
+ path.join(home, 'OneDrive'),
65
+ ...(platform === 'win32'
66
+ ? [
67
+ path.join(process.env['USERPROFILE'] || home, 'OneDrive'),
68
+ ]
69
+ : []),
70
+ ...(platform === 'darwin'
71
+ ? [
72
+ path.join(home, 'Library', 'CloudStorage', 'OneDrive'),
73
+ ]
74
+ : []),
75
+ ],
76
+ },
77
+ ];
78
+ return candidates;
79
+ }
80
+ /**
81
+ * Check if a directory exists and is accessible.
82
+ */
83
+ function directoryExists(dirPath) {
84
+ try {
85
+ const stat = fs.statSync(dirPath);
86
+ return stat.isDirectory();
87
+ }
88
+ catch {
89
+ return false;
90
+ }
91
+ }
92
+ /**
93
+ * Detect all available cloud storage providers on this machine.
94
+ * Returns one entry per provider, using the first matching path found.
95
+ */
96
+ export function detectProviders() {
97
+ const candidates = getCandidates();
98
+ const results = [];
99
+ for (const candidate of candidates) {
100
+ let foundPath = null;
101
+ for (const candidatePath of candidate.paths) {
102
+ if (directoryExists(candidatePath)) {
103
+ foundPath = candidatePath;
104
+ break;
105
+ }
106
+ }
107
+ results.push({
108
+ provider: candidate.provider,
109
+ label: candidate.label,
110
+ path: foundPath || candidate.paths[0] || '',
111
+ available: foundPath !== null,
112
+ });
113
+ }
114
+ return results;
115
+ }
116
+ /**
117
+ * Detect only available (installed/syncing) providers.
118
+ */
119
+ export function detectAvailableProviders() {
120
+ return detectProviders().filter((p) => p.available);
121
+ }
122
+ /**
123
+ * Get the default AgentVault subdirectory name inside a cloud provider.
124
+ */
125
+ export function getCloudSubdirectory() {
126
+ return 'AgentVault-Backups';
127
+ }
128
+ /**
129
+ * Resolve the full cloud backup directory for a given provider path.
130
+ */
131
+ export function resolveCloudBackupDir(providerPath, subdirectory) {
132
+ return path.join(providerPath, subdirectory || getCloudSubdirectory());
133
+ }
134
+ /**
135
+ * Build a DetectedProvider for a custom/user-specified path.
136
+ */
137
+ export function createCustomProvider(customPath) {
138
+ return {
139
+ provider: 'custom',
140
+ label: 'Custom Directory',
141
+ path: customPath,
142
+ available: directoryExists(customPath),
143
+ };
144
+ }
145
+ /**
146
+ * Get a human-readable label for a provider.
147
+ */
148
+ export function getProviderLabel(provider) {
149
+ const labels = {
150
+ 'google-drive': 'Google Drive',
151
+ 'icloud-drive': 'iCloud Drive',
152
+ 'dropbox': 'Dropbox',
153
+ 'onedrive': 'OneDrive',
154
+ 'custom': 'Custom Directory',
155
+ };
156
+ return labels[provider];
157
+ }
158
+ //# sourceMappingURL=provider-detector.js.map