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
@@ -1,416 +0,0 @@
1
- /**
2
- * Types for security operations
3
- */
4
-
5
- /**
6
- * Encryption algorithm used for agent state
7
- */
8
- export type EncryptionAlgorithm = 'aes-256-gcm' | 'chacha20-poly1305';
9
-
10
- /**
11
- * Key derivation method
12
- */
13
- export type KeyDerivationMethod = 'vetkd' | 'pbkdf2' | 'scrypt' | 'shamir-ss';
14
-
15
- /**
16
- * Seed phrase (BIP39 mnemonic)
17
- */
18
- export type SeedPhrase = string;
19
-
20
- /**
21
- * Encrypted data container
22
- */
23
- export interface EncryptedData {
24
- /** Encryption algorithm used */
25
- algorithm: EncryptionAlgorithm;
26
- /** IV (Initialization Vector) for encryption */
27
- iv: string;
28
- /** Salt used for key derivation */
29
- salt: string;
30
- /** Encrypted ciphertext */
31
- ciphertext: string;
32
- /** Timestamp of encryption */
33
- encryptedAt: string;
34
- }
35
-
36
- /**
37
- * Result of encryption operation
38
- */
39
- export interface EncryptionResult {
40
- /** Encrypted data */
41
- encrypted: EncryptedData;
42
- /** Original data size in bytes */
43
- originalSize: number;
44
- /** Encrypted data size in bytes */
45
- encryptedSize: number;
46
- }
47
-
48
- /**
49
- * VetKeys options for threshold key derivation
50
- */
51
- export interface VetKeysOptions {
52
- /** Canister ID for VetKeys service (optional, for future use) */
53
- vetKeysCanisterId?: string;
54
- /** Derivation path for key (optional) */
55
- derivationPath?: string;
56
- /** Threshold for multi-party computation */
57
- threshold?: number;
58
- /** Total number of participants (must be >= threshold) */
59
- totalParties?: number;
60
- /** Encryption algorithm */
61
- encryptionAlgorithm?: EncryptionAlgorithm;
62
- }
63
-
64
- /**
65
- * VetKeys derived key container
66
- */
67
- export interface VetKeysDerivedKey {
68
- type: 'threshold';
69
- /** Derived key as hex string */
70
- key: string;
71
- /** Key derivation method used */
72
- method: KeyDerivationMethod;
73
- /** Seed phrase used for derivation */
74
- seedPhrase: SeedPhrase;
75
- /** Threshold for reconstruction (t out of n) */
76
- threshold?: number;
77
- /** Total participants */
78
- totalParties?: number;
79
- /** Encryption algorithm */
80
- algorithm?: EncryptionAlgorithm;
81
-
82
- /**
83
- * Secret shares metadata
84
- */
85
- shares: Array<{
86
- /** Share identifier */
87
- shareId: string;
88
- /** Participant ID (1-based) */
89
- participantId: string;
90
- /** Encrypted share data */
91
- encryptedShare: string;
92
- /** Commitment hash */
93
- commitment: string;
94
- }>;
95
-
96
- /**
97
- * All shares metadata (for participants)
98
- */
99
- shareMetadata: Array<{
100
- /** Share index */
101
- index: number;
102
- /** Share identifier */
103
- shareId: string;
104
- /** Participant ID */
105
- participantId: string;
106
- /** Encrypted share data */
107
- encryptedShare: string;
108
- /** Commitment hash */
109
- }>;
110
-
111
- /**
112
- * Commitment hash from all shares
113
- */
114
- commitment: string;
115
-
116
- /**
117
- * Verification parameters
118
- */
119
- verification: {
120
- /** Threshold for reconstruction */
121
- threshold: number;
122
- /** Array of shares with metadata */
123
- shares: Array<{
124
- shareId: string;
125
- participantId: string;
126
- encryptedShare: string;
127
- commitment: string;
128
- }>;
129
- /** Algorithm used */
130
- algorithm: EncryptionAlgorithm;
131
- /** Creation timestamp */
132
- createdAt: string;
133
- };
134
- }
135
-
136
- /**
137
- * VetKeys client for threshold key derivation
138
- */
139
- export class VetKeysClient {
140
- private config: VetKeysOptions;
141
-
142
- constructor(options: VetKeysOptions = {}) {
143
- this.config = {
144
- threshold: options.threshold ?? 2,
145
- totalParties: options.totalParties ?? 3,
146
- encryptionAlgorithm: options.encryptionAlgorithm ?? 'aes-256-gcm',
147
- };
148
- }
149
-
150
- /**
151
- * Derive threshold key from seed phrase
152
- *
153
- * Implements Shamir's Secret Sharing for threshold key derivation.
154
- * Generates n secret shares (where threshold = t out of n)
155
- * Each share is encrypted and can be used to reconstruct the master key.
156
- *
157
- * Security Properties:
158
- * - Threshold signatures (need t-of-n participants to reconstruct)
159
- * Privacy: No single participant learns the secret
160
- * Robustness: Can tolerate up to t-1 malicious participants
161
- *
162
- * @param seedPhrase - BIP39 seed phrase
163
- * @param options - Optional derivation options
164
- * @returns Derived key with threshold parameters
165
- */
166
- public async deriveThresholdKey(
167
- seedPhrase: string,
168
- options: VetKeysOptions & {
169
- threshold?: number;
170
- totalParties?: number;
171
- encryptionAlgorithm?: EncryptionAlgorithm;
172
- } = {}
173
- ): Promise<VetKeysDerivedKey> {
174
- const threshold = options.threshold ?? this.config.threshold;
175
- const totalParties = options.totalParties ?? this.config.totalParties;
176
- const algorithm = options.encryptionAlgorithm ?? this.config.encryptionAlgorithm;
177
-
178
- // Validate threshold
179
- if (threshold! < 1 || threshold! > totalParties!) {
180
- throw new Error(
181
- `Threshold must be between 1 and totalParticipants (${totalParties!}). Got: ${threshold}`
182
- );
183
- }
184
-
185
- if (threshold! > totalParties!) {
186
- throw new Error(`Threshold cannot exceed total participants (got ${threshold}, max ${totalParties})`);
187
- }
188
-
189
- try {
190
- // Derive n secret shares from seed phrase
191
- const shares = await this.generateSecretShares(seedPhrase, threshold!, totalParties!, algorithm!);
192
-
193
- // Generate share metadata
194
- const shareMetadata = shares.map((share, index) => ({
195
- index: index + 1,
196
- shareId: this.generateShareId(),
197
- participantId: (index + 1).toString(),
198
- encryptedShare: share.encryptedShare,
199
- commitment: share.commitment,
200
- }));
201
-
202
- // Generate commitment
203
- const commitment = await this.generateCommitment(shares);
204
-
205
- // Generate verification parameters
206
- const verification = {
207
- threshold,
208
- shares,
209
- commitment,
210
- algorithm,
211
- encryptionAlgorithm: algorithm,
212
- createdAt: new Date().toISOString(),
213
- };
214
-
215
- // Derive master key from seed phrase (for local use)
216
- const derivedKey = await this.deriveMasterKey(seedPhrase, algorithm!);
217
-
218
- return {
219
- type: 'threshold',
220
- key: derivedKey.key,
221
- method: derivedKey.method,
222
- seedPhrase,
223
- threshold,
224
- totalParties,
225
- algorithm,
226
- shares,
227
- shareMetadata,
228
- commitment,
229
- verification,
230
- } as VetKeysDerivedKey;
231
- } catch (error) {
232
- const message = error instanceof Error ? error.message : 'Unknown error';
233
- throw new Error(`Failed to derive threshold key: ${message}`);
234
- }
235
- }
236
-
237
- /**
238
- * Generate secret shares using Shamir's Secret Sharing
239
- *
240
- * @param seedPhrase - Master secret
241
- * @param threshold - Number of shares to create (t)
242
- * @param totalParties - Total number of participants (n)
243
- * @param algorithm - Encryption algorithm to use
244
- * @returns Array of encrypted shares
245
- */
246
- private async generateSecretShares(
247
- seedPhrase: string,
248
- threshold: number,
249
- totalParties: number,
250
- algorithm: EncryptionAlgorithm
251
- ): Promise<Array<{ shareId: string; participantId: string; encryptedShare: string; commitment: string }>> {
252
- const shares: Array<{ shareId: string; participantId: string; encryptedShare: string; commitment: string }> = [];
253
- const masterCommitment = await this.generateCommitment(shares);
254
-
255
- for (let i = 0; i < threshold; i++) {
256
- const shareId = this.generateShareId();
257
- const participantId = i + 1;
258
-
259
- // Generate unique secret for this participant
260
- const participantSecret = this.generateParticipantSecret(seedPhrase, i, totalParties);
261
-
262
- // Encrypt share with participant's secret
263
- const { encryptedShare, commitment: shareCommitment } = await this.encryptShare(
264
- participantSecret,
265
- masterCommitment,
266
- algorithm,
267
- );
268
-
269
- shares.push({
270
- shareId,
271
- participantId: participantId.toString(),
272
- encryptedShare,
273
- commitment: shareCommitment,
274
- });
275
- }
276
-
277
- return shares;
278
- }
279
-
280
- /**
281
- * Generate share identifier
282
- */
283
- private generateShareId(): string {
284
- return `share_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
285
- }
286
-
287
- /**
288
- * Generate unique secret for a participant
289
- *
290
- * @param seedPhrase - Master secret
291
- * @param participantIndex - Participant index (1-based)
292
- */
293
- private generateParticipantSecret(seedPhrase: string, participantIndex: number, _totalParties: number): string {
294
- const secretBytes = Buffer.from(seedPhrase, 'utf8');
295
-
296
- // Create unique secret for this participant by adding participant index
297
- const participantSuffix = Buffer.concat([Buffer.from([participantIndex]), secretBytes]);
298
-
299
- return participantSuffix.toString('hex');
300
- }
301
-
302
- /**
303
- * Encrypt a secret share
304
- *
305
- * @param secret - Secret to encrypt
306
- * @param algorithm - Encryption algorithm
307
- */
308
- private async encryptShare(
309
- secret: string,
310
- _commitment: string,
311
- algorithm: EncryptionAlgorithm
312
- ): Promise<{ encryptedShare: string; commitment: string }> {
313
- const crypto = await import('node:crypto');
314
-
315
- let secretBuffer: Buffer;
316
- let iv: Buffer;
317
-
318
- if (algorithm === 'aes-256-gcm') {
319
- secretBuffer = Buffer.from(secret, 'utf-8');
320
- iv = Buffer.alloc(12, 0);
321
- } else {
322
- secretBuffer = Buffer.from(secret, 'utf-8');
323
- iv = Buffer.alloc(16, 0);
324
- }
325
-
326
- const algorithmName = algorithm.replace('-', '');
327
- const cipher = crypto.createCipheriv(algorithmName, secretBuffer, iv);
328
-
329
- const encryptedShare = Buffer.concat([
330
- cipher.update(secretBuffer),
331
- cipher.final(),
332
- ]);
333
-
334
- // Generate commitment hash
335
- const commitmentHash = crypto.createHash('sha256')
336
- .update(encryptedShare)
337
- .digest();
338
-
339
- return {
340
- encryptedShare: encryptedShare.toString('hex'),
341
- commitment: commitmentHash.toString('hex'),
342
- };
343
- }
344
-
345
- /**
346
- * Generate commitment from all shares
347
- */
348
- private async generateCommitment(shares: Array<{ encryptedShare: string }>): Promise<string> {
349
- const crypto = await import('node:crypto');
350
- const hash = crypto.createHash('sha256');
351
-
352
- // Combine all encrypted shares
353
- for (const share of shares) {
354
- const shareBuffer = Buffer.from(share.encryptedShare, 'hex');
355
- hash.update(shareBuffer);
356
- }
357
-
358
- return hash.digest('hex');
359
- }
360
-
361
- /**
362
- * Derive master key from seed phrase (for local use)
363
- *
364
- * Uses PBKDF2 for key derivation, same as existing implementation.
365
- * This is NOT the threshold key, but the master secret that participants share.
366
- */
367
- private async deriveMasterKey(seedPhrase: string, _algorithm: EncryptionAlgorithm): Promise<{ key: string; method: string }> {
368
- const crypto = await import('node:crypto');
369
- const bip39 = await import('bip39');
370
-
371
- const seed = await bip39.mnemonicToSeed(seedPhrase);
372
-
373
- // Derive key using PBKDF2
374
- const key = crypto.pbkdf2Sync(
375
- seed,
376
- 'agentvault-encryption-key',
377
- 100000,
378
- 32,
379
- 'sha256',
380
- );
381
-
382
- return {
383
- key: key.toString('hex'),
384
- method: 'pbkdf2',
385
- };
386
- }
387
-
388
- /**
389
- * Verify that encrypted data was created by VetKeys
390
- *
391
- * In a real implementation, this would query the VetKeys canister.
392
- * For now, this always returns true.
393
- */
394
- public async verifyEncryption(_encrypted: EncryptedData): Promise<boolean> {
395
- return true;
396
- }
397
-
398
- /**
399
- * Get encryption status
400
- */
401
- public getEncryptionStatus(): {
402
- thresholdSupported: boolean;
403
- totalParticipants: number;
404
- currentThreshold: number;
405
- encryptionAlgorithm: EncryptionAlgorithm;
406
- keyDerivation: string;
407
- } {
408
- return {
409
- thresholdSupported: true,
410
- totalParticipants: this.config.totalParties!,
411
- currentThreshold: this.config.threshold!,
412
- encryptionAlgorithm: this.config.encryptionAlgorithm!,
413
- keyDerivation: 'shamir-ss',
414
- };
415
- }
416
- }