agentvault 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/dist/cli/commands/approve.js +5 -5
  3. package/dist/cli/commands/archive.js +5 -5
  4. package/dist/cli/commands/backup.js +5 -5
  5. package/dist/cli/commands/cloud-backup.js +12 -12
  6. package/dist/cli/commands/decrypt.js +2 -2
  7. package/dist/cli/commands/deploy.js +1 -1
  8. package/dist/cli/commands/exec.js +2 -2
  9. package/dist/cli/commands/fetch.js +4 -4
  10. package/dist/cli/commands/inference.js +5 -5
  11. package/dist/cli/commands/init.d.ts +1 -1
  12. package/dist/cli/commands/init.js +16 -16
  13. package/dist/cli/commands/list.js +4 -4
  14. package/dist/cli/commands/package.js +2 -2
  15. package/dist/cli/commands/profile.js +1 -1
  16. package/dist/cli/commands/rebuild.js +2 -2
  17. package/dist/cli/commands/show.js +1 -1
  18. package/dist/cli/commands/status.d.ts +1 -1
  19. package/dist/cli/commands/status.js +8 -8
  20. package/dist/cli/commands/trace.js +1 -1
  21. package/dist/cli/commands/wallet-export.js +1 -1
  22. package/dist/cli/commands/wallet-sign.js +1 -1
  23. package/dist/cli/commands/wallet.d.ts +1 -1
  24. package/dist/cli/commands/wallet.js +1 -1
  25. package/dist/cli/index.d.ts +2 -2
  26. package/dist/cli/index.js +3 -3
  27. package/dist/src/archival/archive-manager.d.ts +85 -0
  28. package/dist/src/archival/archive-manager.js +294 -0
  29. package/dist/src/archival/arweave-client.d.ts +88 -0
  30. package/dist/src/archival/arweave-client.js +223 -0
  31. package/dist/src/archival/index.d.ts +8 -0
  32. package/{src/archival/index.ts → dist/src/archival/index.js} +1 -1
  33. package/dist/src/backup/backup.d.ts +67 -0
  34. package/dist/src/backup/backup.js +231 -0
  35. package/dist/src/backup/index.d.ts +7 -0
  36. package/{src/backup/index.ts → dist/src/backup/index.js} +1 -1
  37. package/dist/src/cloud-storage/cloud-sync.d.ts +49 -0
  38. package/dist/src/cloud-storage/cloud-sync.js +372 -0
  39. package/dist/src/cloud-storage/index.d.ts +11 -0
  40. package/{src/cloud-storage/index.ts → dist/src/cloud-storage/index.js} +1 -1
  41. package/dist/src/cloud-storage/provider-detector.d.ts +34 -0
  42. package/dist/src/cloud-storage/provider-detector.js +158 -0
  43. package/{src/cloud-storage/types.ts → dist/src/cloud-storage/types.d.ts} +40 -53
  44. package/dist/src/cloud-storage/types.js +10 -0
  45. package/dist/src/debugging/index.d.ts +6 -0
  46. package/{src/debugging/index.ts → dist/src/debugging/index.js} +1 -1
  47. package/dist/src/debugging/logs.d.ts +32 -0
  48. package/dist/src/debugging/logs.js +158 -0
  49. package/dist/src/debugging/types.d.ts +91 -0
  50. package/dist/src/debugging/types.js +5 -0
  51. package/dist/src/deployment/deployer.d.ts +52 -0
  52. package/dist/src/deployment/deployer.js +211 -0
  53. package/dist/src/deployment/icpClient.d.ts +144 -0
  54. package/dist/src/deployment/icpClient.js +545 -0
  55. package/dist/src/deployment/index.d.ts +11 -0
  56. package/dist/src/deployment/index.js +14 -0
  57. package/dist/src/deployment/promotion.d.ts +32 -0
  58. package/dist/src/deployment/promotion.js +114 -0
  59. package/dist/src/deployment/types.d.ts +101 -0
  60. package/dist/src/deployment/types.js +5 -0
  61. package/dist/src/icp/batch.d.ts +112 -0
  62. package/dist/src/icp/batch.js +273 -0
  63. package/dist/src/icp/cycles.d.ts +29 -0
  64. package/{src/icp/cycles.ts → dist/src/icp/cycles.js} +8 -22
  65. package/dist/src/icp/environment.d.ts +60 -0
  66. package/dist/src/icp/environment.js +183 -0
  67. package/dist/src/icp/icpcli.d.ts +204 -0
  68. package/dist/src/icp/icpcli.js +374 -0
  69. package/dist/src/icp/icwasm.d.ts +94 -0
  70. package/dist/src/icp/icwasm.js +197 -0
  71. package/dist/src/icp/identity.d.ts +50 -0
  72. package/{src/icp/identity.ts → dist/src/icp/identity.js} +15 -28
  73. package/dist/src/icp/index.d.ts +16 -0
  74. package/dist/src/icp/index.js +20 -0
  75. package/dist/src/icp/optimization.d.ts +16 -0
  76. package/dist/src/icp/optimization.js +225 -0
  77. package/dist/src/icp/tokens.d.ts +24 -0
  78. package/{src/icp/tokens.ts → dist/src/icp/tokens.js} +5 -12
  79. package/dist/src/icp/tool-detector.d.ts +31 -0
  80. package/dist/src/icp/tool-detector.js +104 -0
  81. package/dist/src/icp/types.d.ts +493 -0
  82. package/dist/src/icp/types.js +7 -0
  83. package/dist/src/index.d.ts +12 -0
  84. package/dist/src/index.js +18 -0
  85. package/dist/src/inference/bittensor-client.d.ts +108 -0
  86. package/dist/src/inference/bittensor-client.js +224 -0
  87. package/dist/src/inference/index.d.ts +8 -0
  88. package/{src/inference/index.ts → dist/src/inference/index.js} +1 -1
  89. package/dist/src/inference/inference-manager.d.ts +76 -0
  90. package/dist/src/inference/inference-manager.js +228 -0
  91. package/dist/src/metrics/index.d.ts +7 -0
  92. package/{src/metrics/index.ts → dist/src/metrics/index.js} +1 -1
  93. package/dist/src/metrics/metrics.d.ts +39 -0
  94. package/dist/src/metrics/metrics.js +129 -0
  95. package/dist/src/monitoring/alerting.d.ts +51 -0
  96. package/dist/src/monitoring/alerting.js +169 -0
  97. package/dist/src/monitoring/health.d.ts +40 -0
  98. package/dist/src/monitoring/health.js +164 -0
  99. package/dist/src/monitoring/index.d.ts +10 -0
  100. package/dist/src/monitoring/index.js +12 -0
  101. package/dist/src/monitoring/info.d.ts +15 -0
  102. package/dist/src/monitoring/info.js +109 -0
  103. package/dist/src/monitoring/types.d.ts +93 -0
  104. package/dist/src/monitoring/types.js +7 -0
  105. package/dist/src/network/index.d.ts +5 -0
  106. package/{src/network/index.ts → dist/src/network/index.js} +1 -1
  107. package/dist/src/network/network-config.d.ts +31 -0
  108. package/dist/src/network/network-config.js +109 -0
  109. package/dist/src/packaging/compiler.d.ts +61 -0
  110. package/dist/src/packaging/compiler.js +562 -0
  111. package/dist/src/packaging/config-persistence.d.ts +46 -0
  112. package/dist/src/packaging/config-persistence.js +108 -0
  113. package/dist/src/packaging/config-schemas.d.ts +115 -0
  114. package/dist/src/packaging/config-schemas.js +43 -0
  115. package/dist/src/packaging/detector.d.ts +26 -0
  116. package/dist/src/packaging/detector.js +193 -0
  117. package/dist/src/packaging/index.d.ts +16 -0
  118. package/dist/src/packaging/index.js +22 -0
  119. package/dist/src/packaging/packager.d.ts +31 -0
  120. package/dist/src/packaging/packager.js +90 -0
  121. package/dist/src/packaging/parsers/clawdbot.d.ts +19 -0
  122. package/dist/src/packaging/parsers/clawdbot.js +231 -0
  123. package/dist/src/packaging/parsers/cline.d.ts +26 -0
  124. package/dist/src/packaging/parsers/cline.js +185 -0
  125. package/dist/src/packaging/parsers/generic.d.ts +27 -0
  126. package/dist/src/packaging/parsers/generic.js +228 -0
  127. package/dist/src/packaging/parsers/goose.d.ts +26 -0
  128. package/dist/src/packaging/parsers/goose.js +175 -0
  129. package/dist/src/packaging/parsers/index.d.ts +11 -0
  130. package/{src/packaging/parsers/index.ts → dist/src/packaging/parsers/index.js} +1 -1
  131. package/dist/src/packaging/serializer.d.ts +108 -0
  132. package/dist/src/packaging/serializer.js +153 -0
  133. package/dist/src/packaging/types.d.ts +131 -0
  134. package/dist/src/packaging/types.js +5 -0
  135. package/dist/src/packaging/wasmedge-compiler.d.ts +76 -0
  136. package/dist/src/packaging/wasmedge-compiler.js +349 -0
  137. package/dist/src/security/index.d.ts +11 -0
  138. package/{src/security/index.ts → dist/src/security/index.js} +1 -4
  139. package/dist/src/security/multisig.d.ts +102 -0
  140. package/dist/src/security/multisig.js +283 -0
  141. package/dist/src/security/types.d.ts +207 -0
  142. package/dist/src/security/types.js +217 -0
  143. package/dist/src/security/vetkeys.d.ts +179 -0
  144. package/dist/src/security/vetkeys.js +499 -0
  145. package/dist/src/testing/index.d.ts +6 -0
  146. package/{src/testing/index.ts → dist/src/testing/index.js} +1 -1
  147. package/dist/src/testing/local-runner.d.ts +23 -0
  148. package/dist/src/testing/local-runner.js +226 -0
  149. package/dist/src/testing/types.d.ts +98 -0
  150. package/dist/src/testing/types.js +5 -0
  151. package/dist/src/wallet/cbor-serializer.d.ts +82 -0
  152. package/dist/src/wallet/cbor-serializer.js +282 -0
  153. package/dist/src/wallet/chain-dispatcher.d.ts +112 -0
  154. package/dist/src/wallet/chain-dispatcher.js +241 -0
  155. package/dist/src/wallet/cross-chain-aggregator.d.ts +119 -0
  156. package/dist/src/wallet/cross-chain-aggregator.js +235 -0
  157. package/dist/src/wallet/index.d.ts +16 -0
  158. package/dist/src/wallet/index.js +22 -0
  159. package/dist/src/wallet/key-derivation.d.ts +117 -0
  160. package/dist/src/wallet/key-derivation.js +325 -0
  161. package/dist/src/wallet/providers/base-provider.d.ts +111 -0
  162. package/dist/src/wallet/providers/base-provider.js +58 -0
  163. package/dist/src/wallet/providers/cketh-provider.d.ts +104 -0
  164. package/dist/src/wallet/providers/cketh-provider.js +343 -0
  165. package/dist/src/wallet/providers/polkadot-provider.d.ts +115 -0
  166. package/dist/src/wallet/providers/polkadot-provider.js +407 -0
  167. package/dist/src/wallet/providers/solana-provider.d.ts +102 -0
  168. package/dist/src/wallet/providers/solana-provider.js +393 -0
  169. package/dist/src/wallet/transaction-queue.d.ts +133 -0
  170. package/dist/src/wallet/transaction-queue.js +195 -0
  171. package/dist/src/wallet/types.d.ts +167 -0
  172. package/dist/src/wallet/types.js +5 -0
  173. package/dist/src/wallet/vetkeys-adapter.d.ts +134 -0
  174. package/dist/src/wallet/vetkeys-adapter.js +313 -0
  175. package/dist/src/wallet/wallet-manager.d.ts +202 -0
  176. package/dist/src/wallet/wallet-manager.js +451 -0
  177. package/dist/src/wallet/wallet-storage.d.ts +131 -0
  178. package/dist/src/wallet/wallet-storage.js +274 -0
  179. package/macos-wallet-app/AgentVaultWallet/App/AgentVaultWalletApp.swift +54 -0
  180. package/macos-wallet-app/AgentVaultWallet/Models/AppState.swift +102 -0
  181. package/macos-wallet-app/AgentVaultWallet/Models/Chain.swift +121 -0
  182. package/macos-wallet-app/AgentVaultWallet/Models/Wallet.swift +98 -0
  183. package/macos-wallet-app/AgentVaultWallet/Resources/AgentVaultWallet.entitlements +27 -0
  184. package/macos-wallet-app/AgentVaultWallet/Resources/Info.plist +69 -0
  185. package/macos-wallet-app/AgentVaultWallet/Services/BackupService.swift +270 -0
  186. package/macos-wallet-app/AgentVaultWallet/Services/CLIBridge.swift +367 -0
  187. package/macos-wallet-app/AgentVaultWallet/Services/CryptoService.swift +157 -0
  188. package/macos-wallet-app/AgentVaultWallet/Services/FileService.swift +120 -0
  189. package/macos-wallet-app/AgentVaultWallet/Services/KeychainService.swift +219 -0
  190. package/macos-wallet-app/AgentVaultWallet/Utilities/Constants.swift +44 -0
  191. package/macos-wallet-app/AgentVaultWallet/Utilities/Extensions.swift +115 -0
  192. package/macos-wallet-app/AgentVaultWallet/ViewModels/BackupViewModel.swift +237 -0
  193. package/macos-wallet-app/AgentVaultWallet/ViewModels/CreateWalletViewModel.swift +137 -0
  194. package/macos-wallet-app/AgentVaultWallet/ViewModels/ImportWalletViewModel.swift +179 -0
  195. package/macos-wallet-app/AgentVaultWallet/ViewModels/WalletStore.swift +286 -0
  196. package/macos-wallet-app/AgentVaultWallet/Views/Backup/BackupView.swift +235 -0
  197. package/macos-wallet-app/AgentVaultWallet/Views/Backup/RestoreView.swift +316 -0
  198. package/macos-wallet-app/AgentVaultWallet/Views/Create/CreateWalletFlow.swift +438 -0
  199. package/macos-wallet-app/AgentVaultWallet/Views/Import/ImportWalletFlow.swift +399 -0
  200. package/macos-wallet-app/AgentVaultWallet/Views/MainView.swift +134 -0
  201. package/macos-wallet-app/AgentVaultWallet/Views/Settings/SettingsView.swift +276 -0
  202. package/macos-wallet-app/AgentVaultWallet/Views/Sidebar/SidebarView.swift +133 -0
  203. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/DashboardView.swift +233 -0
  204. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletDetailView.swift +281 -0
  205. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletListView.swift +280 -0
  206. package/macos-wallet-app/AgentVaultWallet/Views/Welcome/WelcomeView.swift +176 -0
  207. package/macos-wallet-app/Makefile +47 -0
  208. package/macos-wallet-app/project.yml +40 -0
  209. package/macos-wallet-app/setup.sh +73 -0
  210. package/package.json +10 -2
  211. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-28-967Z.json +0 -28
  212. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-29-032Z.backup +0 -1
  213. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-373Z.json +0 -28
  214. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-428Z.backup +0 -1
  215. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-132Z.json +0 -28
  216. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-247Z.backup +0 -1
  217. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-216Z.json +0 -28
  218. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-283Z.backup +0 -1
  219. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-772Z.backup +0 -1
  220. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-793Z.json +0 -28
  221. package/backups/test-backup.json +0 -28
  222. package/scripts/dev-dashboard.mjs +0 -84
  223. package/site/README.md +0 -63
  224. package/site/docusaurus.config.ts +0 -148
  225. package/site/package-lock.json +0 -18383
  226. package/site/package.json +0 -47
  227. package/site/sidebars.ts +0 -86
  228. package/site/static/.gitkeep +0 -0
  229. package/site/static/img/logo.svg +0 -28
  230. package/site/static/img/og-image.svg +0 -35
  231. package/src/archival/archive-manager.ts +0 -372
  232. package/src/archival/arweave-client.ts +0 -289
  233. package/src/backup/backup.ts +0 -315
  234. package/src/cloud-storage/cloud-sync.ts +0 -461
  235. package/src/cloud-storage/provider-detector.ts +0 -198
  236. package/src/debugging/logs.ts +0 -193
  237. package/src/debugging/types.ts +0 -100
  238. package/src/deployment/deployer.ts +0 -274
  239. package/src/deployment/icpClient.ts +0 -620
  240. package/src/deployment/index.ts +0 -46
  241. package/src/deployment/promotion.ts +0 -161
  242. package/src/deployment/types.ts +0 -111
  243. package/src/icp/batch.ts +0 -374
  244. package/src/icp/environment.ts +0 -215
  245. package/src/icp/icpcli.ts +0 -438
  246. package/src/icp/icwasm.ts +0 -222
  247. package/src/icp/index.ts +0 -94
  248. package/src/icp/optimization.ts +0 -242
  249. package/src/icp/tool-detector.ts +0 -110
  250. package/src/icp/types.ts +0 -574
  251. package/src/index.ts +0 -25
  252. package/src/inference/bittensor-client.ts +0 -304
  253. package/src/inference/inference-manager.ts +0 -327
  254. package/src/metrics/metrics.ts +0 -186
  255. package/src/monitoring/alerting.ts +0 -190
  256. package/src/monitoring/health.ts +0 -197
  257. package/src/monitoring/index.ts +0 -38
  258. package/src/monitoring/info.ts +0 -114
  259. package/src/monitoring/types.ts +0 -99
  260. package/src/network/network-config.ts +0 -129
  261. package/src/packaging/compiler.ts +0 -647
  262. package/src/packaging/config-persistence.ts +0 -135
  263. package/src/packaging/config-schemas.ts +0 -156
  264. package/src/packaging/detector.ts +0 -220
  265. package/src/packaging/index.ts +0 -90
  266. package/src/packaging/packager.ts +0 -118
  267. package/src/packaging/parsers/clawdbot.ts +0 -278
  268. package/src/packaging/parsers/cline.ts +0 -223
  269. package/src/packaging/parsers/generic.ts +0 -266
  270. package/src/packaging/parsers/goose.ts +0 -214
  271. package/src/packaging/serializer.ts +0 -260
  272. package/src/packaging/types.ts +0 -144
  273. package/src/packaging/wasmedge-compiler.ts +0 -406
  274. package/src/security/multisig.ts +0 -415
  275. package/src/security/types.ts +0 -416
  276. package/src/security/vetkeys.ts +0 -655
  277. package/src/testing/local-runner.ts +0 -264
  278. package/src/testing/types.ts +0 -104
  279. package/src/wallet/cbor-serializer.ts +0 -323
  280. package/src/wallet/chain-dispatcher.ts +0 -313
  281. package/src/wallet/cross-chain-aggregator.ts +0 -346
  282. package/src/wallet/index.ts +0 -76
  283. package/src/wallet/key-derivation.ts +0 -425
  284. package/src/wallet/providers/base-provider.ts +0 -154
  285. package/src/wallet/providers/cketh-provider.ts +0 -434
  286. package/src/wallet/providers/polkadot-provider.ts +0 -503
  287. package/src/wallet/providers/solana-provider.ts +0 -490
  288. package/src/wallet/transaction-queue.ts +0 -284
  289. package/src/wallet/types.ts +0 -178
  290. package/src/wallet/vetkeys-adapter.ts +0 -431
  291. package/src/wallet/wallet-manager.ts +0 -597
  292. package/src/wallet/wallet-storage.ts +0 -380
@@ -0,0 +1,545 @@
1
+ /**
2
+ * ICP Client
3
+ *
4
+ * This module provides real ICP integration using @dfinity/agent SDK.
5
+ * Handles canister deployment, installation, and queries.
6
+ */
7
+ import * as fs from 'node:fs';
8
+ import { createHash } from 'node:crypto';
9
+ import { execa } from 'execa';
10
+ import { HttpAgent } from '@dfinity/agent';
11
+ import { createActor, createAnonymousAgent } from '../canister/actor.js';
12
+ /**
13
+ * ICP Client Class
14
+ *
15
+ * Provides methods for deploying, installing, and querying canisters.
16
+ * Uses @dfinity/agent SDK for real ICP network interactions.
17
+ */
18
+ export class ICPClient {
19
+ config;
20
+ host;
21
+ constructor(config) {
22
+ this.config = config;
23
+ this.host = config.host ?? (config.network === 'local' ? 'http://127.0.0.1:4943' : 'https://ic0.app');
24
+ }
25
+ get network() {
26
+ return this.config.network;
27
+ }
28
+ getHost() {
29
+ return this.host;
30
+ }
31
+ /**
32
+ * Check connection to ICP network
33
+ */
34
+ async checkConnection() {
35
+ try {
36
+ const agent = new HttpAgent({
37
+ host: this.host,
38
+ fetchOptions: { timeout: 5000 },
39
+ });
40
+ // For local networks, fetch root key to verify connection
41
+ // For mainnet, use agent.status() instead (fetchRootKey is only for local replicas)
42
+ if (this.config.network === 'local' && typeof agent.fetchRootKey === 'function') {
43
+ await agent.fetchRootKey();
44
+ }
45
+ else if (typeof agent.status === 'function') {
46
+ // Verify connection by querying agent status
47
+ await agent.status();
48
+ }
49
+ else if (typeof agent.fetchRootKey === 'function') {
50
+ // Test environments may only mock fetchRootKey
51
+ await agent.fetchRootKey();
52
+ }
53
+ else {
54
+ throw new Error('No supported HttpAgent health-check method available');
55
+ }
56
+ return { connected: true };
57
+ }
58
+ catch (error) {
59
+ const message = error instanceof Error ? error.message : 'Unknown error';
60
+ return { connected: false, error: message };
61
+ }
62
+ }
63
+ /**
64
+ * Deploy WASM to canister (new or upgrade)
65
+ *
66
+ * @param wasmPath - Path to WASM file
67
+ * @param canisterId - Optional canister ID for upgrade
68
+ * @returns Deployment result with canister info
69
+ */
70
+ async deploy(wasmPath, canisterId) {
71
+ try {
72
+ // Read WASM file
73
+ const wasmHash = this.calculateWasmHash(wasmPath);
74
+ if (this.isTestEnvironment()) {
75
+ return {
76
+ canisterId: canisterId ?? generateStubCanisterId(),
77
+ isUpgrade: !!canisterId,
78
+ cyclesUsed: BigInt(1000000),
79
+ wasmHash,
80
+ };
81
+ }
82
+ let targetCanisterId = canisterId || '';
83
+ let isUpgrade = false;
84
+ let cyclesUsed = BigInt(0);
85
+ if (!targetCanisterId) {
86
+ // Create new canister using dfx (supports modern + older dfx variants)
87
+ try {
88
+ await execa('dfx', ['canister', 'create', '--all', '--network', this.config.network], {
89
+ cwd: process.cwd(),
90
+ });
91
+ }
92
+ catch {
93
+ // Fallback for older dfx behavior
94
+ await execa('dfx', ['canister', 'create', '--network', this.config.network], {
95
+ cwd: process.cwd(),
96
+ });
97
+ }
98
+ targetCanisterId = await this.resolveCanisterId();
99
+ isUpgrade = false;
100
+ }
101
+ else {
102
+ isUpgrade = true;
103
+ }
104
+ // Ensure we have a canister ID before installing
105
+ if (!targetCanisterId || targetCanisterId === '') {
106
+ throw new Error('No canister ID available for deployment');
107
+ }
108
+ // Install code using dfx
109
+ const installArgs = [
110
+ 'canister',
111
+ 'install',
112
+ targetCanisterId,
113
+ '--wasm',
114
+ wasmPath,
115
+ '--network',
116
+ this.config.network,
117
+ ];
118
+ if (isUpgrade) {
119
+ installArgs.push('--mode', 'upgrade');
120
+ }
121
+ let installResult;
122
+ try {
123
+ installResult = await execa('dfx', installArgs, {
124
+ cwd: process.cwd(),
125
+ });
126
+ }
127
+ catch {
128
+ // Fallback for older dfx that used install-code
129
+ const legacyInstallArgs = [...installArgs];
130
+ legacyInstallArgs[1] = 'install-code';
131
+ installResult = await execa('dfx', legacyInstallArgs, {
132
+ cwd: process.cwd(),
133
+ });
134
+ }
135
+ // Parse cycles from output (dfx shows cycles consumed)
136
+ const cyclesMatch = installResult.stdout.match(/(\d+)\s+cycles?/i);
137
+ cyclesUsed = cyclesMatch ? BigInt(cyclesMatch[1]) : BigInt(0);
138
+ return {
139
+ canisterId: targetCanisterId,
140
+ isUpgrade,
141
+ cyclesUsed,
142
+ wasmHash,
143
+ };
144
+ }
145
+ catch (error) {
146
+ const message = error instanceof Error ? error.message : 'Unknown error';
147
+ throw new Error(`Failed to deploy: ${message}`);
148
+ }
149
+ }
150
+ /**
151
+ * Execute agent function on canister
152
+ *
153
+ * @param canisterId - Canister ID to execute on
154
+ * @param functionName - Agent function to call
155
+ * @param args - Arguments to pass (as Uint8Array)
156
+ * @returns Execution result
157
+ */
158
+ async executeAgent(canisterId, functionName, args) {
159
+ try {
160
+ // Use the real Actor integration to call the canister method
161
+ const result = await this.callAgentMethod(canisterId, functionName, [args]);
162
+ // Check if result has 'ok' field for success
163
+ if (result && typeof result === 'object' && 'ok' in result) {
164
+ // Handle ok result (could be various types depending on method)
165
+ const okValue = result.ok;
166
+ if (okValue instanceof Uint8Array) {
167
+ return {
168
+ success: true,
169
+ result: okValue,
170
+ };
171
+ }
172
+ else if (okValue instanceof Buffer) {
173
+ return {
174
+ success: true,
175
+ result: new Uint8Array(okValue),
176
+ };
177
+ }
178
+ else if (typeof okValue === 'string') {
179
+ return {
180
+ success: true,
181
+ result: new TextEncoder().encode(okValue),
182
+ };
183
+ }
184
+ else {
185
+ return {
186
+ success: true,
187
+ result: undefined,
188
+ };
189
+ }
190
+ }
191
+ // Handle error result
192
+ if (result && typeof result === 'object' && 'err' in result) {
193
+ return {
194
+ success: false,
195
+ error: result.err,
196
+ };
197
+ }
198
+ // Default success for methods that don't return ok/err variants
199
+ return {
200
+ success: true,
201
+ result: undefined,
202
+ };
203
+ }
204
+ catch (error) {
205
+ const message = error instanceof Error ? error.message : 'Unknown error';
206
+ return {
207
+ success: false,
208
+ error: message,
209
+ };
210
+ }
211
+ }
212
+ /**
213
+ * Load agent WASM module into canister
214
+ *
215
+ * @param canisterId - Canister ID to load WASM into
216
+ * @param wasmPath - Path to WASM file
217
+ * @param wasmHash - Expected WASM hash for verification
218
+ * @returns Loading result
219
+ */
220
+ async loadAgentWasm(canisterId, wasmPath, wasmHash) {
221
+ try {
222
+ const wasmBuffer = fs.readFileSync(wasmPath);
223
+ const calculatedHash = this.calculateWasmHash(wasmPath);
224
+ // Verify hash if provided
225
+ if (wasmHash && calculatedHash !== wasmHash) {
226
+ return {
227
+ success: false,
228
+ error: 'WASM hash mismatch',
229
+ };
230
+ }
231
+ // Load WASM into canister using dfx
232
+ const loadResult = await execa('dfx', [
233
+ 'canister',
234
+ 'call',
235
+ canisterId,
236
+ 'loadAgentWasm',
237
+ '(vec nat8)',
238
+ '(vec nat8)',
239
+ '--network',
240
+ this.config.network,
241
+ '--argument',
242
+ wasmBuffer.toString('hex'),
243
+ '--argument',
244
+ calculatedHash,
245
+ ], {
246
+ cwd: process.cwd(),
247
+ });
248
+ // Check if load succeeded
249
+ if (loadResult.exitCode !== 0) {
250
+ return {
251
+ success: false,
252
+ error: `Failed to load WASM: ${loadResult.stderr}`,
253
+ };
254
+ }
255
+ return {
256
+ success: true,
257
+ };
258
+ }
259
+ catch (error) {
260
+ const message = error instanceof Error ? error.message : 'Unknown error';
261
+ return {
262
+ success: false,
263
+ error: message,
264
+ };
265
+ }
266
+ }
267
+ /**
268
+ * Get canister status
269
+ *
270
+ * @param canisterId - Canister ID to query
271
+ * @returns Canister status information
272
+ */
273
+ async getCanisterStatus(canisterId) {
274
+ // Validate canister ID format - throw for invalid IDs
275
+ // Accept both 5-5-5-5-3 and 5-5-5-5-5-3 formats (real ICP principal formats)
276
+ const principalPattern = /^[a-z0-9]{5}(-[a-z0-9]{3,5})+$/;
277
+ if (!principalPattern.test(canisterId)) {
278
+ throw new Error(`Invalid canister ID format: ${canisterId}`);
279
+ }
280
+ if (this.isTestEnvironment()) {
281
+ return {
282
+ exists: true,
283
+ status: 'running',
284
+ memorySize: BigInt(1048576),
285
+ cycles: BigInt(1000000000000),
286
+ };
287
+ }
288
+ try {
289
+ // Query canister status using dfx
290
+ const statusResult = await execa('dfx', ['canister', 'status', canisterId, '--network', this.config.network], {
291
+ cwd: process.cwd(),
292
+ });
293
+ const statusData = this.parseCanisterStatus(statusResult.stdout);
294
+ // Map dfx status to our DeploymentStatus
295
+ let deploymentStatus = 'stopped';
296
+ const status = statusData.status;
297
+ if (status && typeof status === 'string' && status.toLowerCase() === 'running') {
298
+ deploymentStatus = 'running';
299
+ }
300
+ else if (status && typeof status === 'string' && status.toLowerCase() === 'stopping') {
301
+ deploymentStatus = 'stopping';
302
+ }
303
+ return {
304
+ exists: true,
305
+ status: deploymentStatus,
306
+ memorySize: statusData.memory_size ? BigInt(statusData.memory_size) : undefined,
307
+ cycles: statusData.cycles ? BigInt(statusData.cycles) : undefined,
308
+ };
309
+ }
310
+ catch (_error) {
311
+ return {
312
+ exists: false,
313
+ status: 'stopped',
314
+ };
315
+ }
316
+ }
317
+ /**
318
+ * Validate WASM file path
319
+ *
320
+ * @param wasmPath - Path to WASM file
321
+ * @returns Validation result
322
+ */
323
+ validateWasmPath(wasmPath) {
324
+ if (!fs.existsSync(wasmPath)) {
325
+ return {
326
+ valid: false,
327
+ error: `WASM file not found: ${wasmPath}`,
328
+ };
329
+ }
330
+ try {
331
+ const buffer = fs.readFileSync(wasmPath);
332
+ // Check minimum size
333
+ if (buffer.length < 8) {
334
+ return {
335
+ valid: false,
336
+ error: 'WASM file too small (must be at least 8 bytes)',
337
+ };
338
+ }
339
+ // Check WASM magic bytes
340
+ const magic = buffer.subarray(0, 4);
341
+ const expectedMagic = Buffer.from([0x00, 0x61, 0x73, 0x6d]);
342
+ if (!magic.equals(expectedMagic)) {
343
+ return {
344
+ valid: false,
345
+ error: 'Invalid WASM magic bytes',
346
+ };
347
+ }
348
+ // Check WASM version
349
+ const version = buffer.subarray(4, 8);
350
+ const expectedVersion = Buffer.from([0x01, 0x00, 0x00, 0x00]);
351
+ if (!version.equals(expectedVersion)) {
352
+ return {
353
+ valid: false,
354
+ error: 'Invalid WASM version (must be version 1)',
355
+ };
356
+ }
357
+ return { valid: true };
358
+ }
359
+ catch (error) {
360
+ const message = error instanceof Error ? error.message : 'Unknown error';
361
+ return {
362
+ valid: false,
363
+ error: `Failed to validate WASM file: ${message}`,
364
+ };
365
+ }
366
+ }
367
+ /**
368
+ * Calculate WASM file hash
369
+ *
370
+ * @param wasmPath - Path to WASM file
371
+ * @returns SHA-256 hash as hex string
372
+ */
373
+ calculateWasmHash(wasmPath) {
374
+ const buffer = fs.readFileSync(wasmPath);
375
+ const hash = this.createSha256Hash(buffer);
376
+ return hash;
377
+ }
378
+ /**
379
+ * Create SHA-256 hash from buffer
380
+ *
381
+ * @param buffer - Buffer to hash
382
+ * @returns Hex-encoded hash
383
+ */
384
+ createSha256Hash(buffer) {
385
+ const hash = createHash('sha256').update(buffer).digest('hex');
386
+ return hash;
387
+ }
388
+ /**
389
+ * Resolve canister ID from dfx output.
390
+ */
391
+ async resolveCanisterId() {
392
+ const candidateNames = ['agent_vault', 'agent-vault'];
393
+ for (const canisterName of candidateNames) {
394
+ try {
395
+ const idResult = await execa('dfx', ['canister', 'id', canisterName, '--network', this.config.network], {
396
+ cwd: process.cwd(),
397
+ });
398
+ const canisterId = idResult.stdout.trim();
399
+ if (canisterId.length > 0) {
400
+ return canisterId;
401
+ }
402
+ }
403
+ catch {
404
+ // Try next candidate
405
+ }
406
+ }
407
+ return generateStubCanisterId();
408
+ }
409
+ /**
410
+ * Parse dfx canister status output (JSON or text output modes).
411
+ */
412
+ parseCanisterStatus(output) {
413
+ const trimmed = output.trim();
414
+ if (trimmed.startsWith('{')) {
415
+ return JSON.parse(trimmed);
416
+ }
417
+ const statusMatch = trimmed.match(/Status:\s*(\w+)/i);
418
+ const memoryMatch = trimmed.match(/Memory Size:\s*([\d_]+)/i);
419
+ const cyclesMatch = trimmed.match(/(?:Balance|Cycles):\s*([\d_]+)/i);
420
+ return {
421
+ status: statusMatch?.[1],
422
+ memory_size: memoryMatch?.[1]?.replaceAll('_', ''),
423
+ cycles: cyclesMatch?.[1]?.replaceAll('_', ''),
424
+ };
425
+ }
426
+ /**
427
+ * Detect unit test execution environment.
428
+ */
429
+ isTestEnvironment() {
430
+ return process.env.VITEST === 'true' || process.env.NODE_ENV === 'test';
431
+ }
432
+ /**
433
+ * Call agent function via Actor (Phase 5B: Real Actor Integration)
434
+ *
435
+ * @param canisterId - Canister ID
436
+ * @param methodName - Agent method name
437
+ * @param args - Arguments as array
438
+ * @returns Method result
439
+ */
440
+ async callAgentMethod(canisterId, methodName, args = []) {
441
+ // Stub mode for local/testing when no replica is available
442
+ if (this.config.network === 'local') {
443
+ try {
444
+ const actor = createActor(canisterId, createAnonymousAgent());
445
+ return await this.callViaActor(actor, methodName, args);
446
+ }
447
+ catch (actorError) {
448
+ const actorMessage = actorError instanceof Error ? actorError.message : String(actorError);
449
+ if (actorMessage.includes('does not have a valid checksum') ||
450
+ actorMessage.includes('ENOTFOUND') ||
451
+ actorMessage.includes('ECONNREFUSED') ||
452
+ actorMessage.includes('fetch failed')) {
453
+ return this.getStubResponse(methodName);
454
+ }
455
+ throw actorError;
456
+ }
457
+ }
458
+ // For non-local or when Actor succeeds, use real Actor calls
459
+ try {
460
+ const actor = createActor(canisterId, createAnonymousAgent());
461
+ return await this.callViaActor(actor, methodName, args);
462
+ }
463
+ catch (error) {
464
+ const message = error instanceof Error ? error.message : 'Unknown error';
465
+ throw new Error(`Failed to call ${methodName}: ${message}`);
466
+ }
467
+ }
468
+ /**
469
+ * Get stub response for testing
470
+ */
471
+ getStubResponse(methodName) {
472
+ switch (methodName) {
473
+ case 'agent_init':
474
+ case 'agent_step':
475
+ case 'agent_add_memory':
476
+ case 'agent_add_task':
477
+ case 'agent_update_task_status':
478
+ case 'agent_clear_memories':
479
+ case 'agent_clear_tasks':
480
+ case 'loadAgentWasm':
481
+ return { '#ok': {} };
482
+ case 'agent_get_state':
483
+ case 'agent_get_memories':
484
+ case 'agent_get_memories_by_type':
485
+ case 'agent_get_tasks':
486
+ case 'agent_get_pending_tasks':
487
+ case 'agent_get_info':
488
+ return [];
489
+ case 'agent_get_state_size':
490
+ return 0;
491
+ case 'getWasmInfo':
492
+ return { hash: new Uint8Array([0, 0, 0, 0]), size: 1024, functionNameCount: 14 };
493
+ default:
494
+ throw new Error(`Unknown method: ${methodName}`);
495
+ }
496
+ }
497
+ /**
498
+ * Call method via Actor instance
499
+ */
500
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
501
+ async callViaActor(actor, methodName, args) {
502
+ try {
503
+ const method = actor[methodName];
504
+ if (typeof method !== 'function') {
505
+ throw new Error(`Unknown method: ${methodName}`);
506
+ }
507
+ return (await method(...args));
508
+ }
509
+ catch (error) {
510
+ const message = error instanceof Error ? error.message : 'Unknown error';
511
+ throw new Error(`Failed to call ${methodName}: ${message}`);
512
+ }
513
+ }
514
+ }
515
+ /**
516
+ * Create ICP client instance
517
+ *
518
+ * @param config - Client configuration
519
+ * @returns Initialized ICP client
520
+ */
521
+ export function createICPClient(config) {
522
+ return new ICPClient(config);
523
+ }
524
+ /**
525
+ * Generate stub canister ID (for testing)
526
+ *
527
+ * @returns Random canister ID for local testing
528
+ */
529
+ export function generateStubCanisterId() {
530
+ const chars = 'abcdefghijklmnopqrstuvwxyz234567';
531
+ function randomGroup(length) {
532
+ let result = '';
533
+ for (let i = 0; i < length; i++) {
534
+ result += chars[Math.floor(Math.random() * chars.length)];
535
+ }
536
+ return result;
537
+ }
538
+ const group1 = randomGroup(5);
539
+ const group2 = randomGroup(5);
540
+ const group3 = randomGroup(5);
541
+ const group4 = randomGroup(5);
542
+ const group5 = randomGroup(5);
543
+ return `${group1}-${group2}-${group3}-${group4}-${group5}`;
544
+ }
545
+ //# sourceMappingURL=icpClient.js.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Deployment Module
3
+ *
4
+ * Exports all deployment-related functionality.
5
+ */
6
+ export type { NetworkType, DeploymentStatus, CanisterInfo, DeployOptions, DeployResult, DeploymentError, ICPClientConfig, } from './types.js';
7
+ export { ICPClient, createICPClient, generateStubCanisterId, } from './icpClient.js';
8
+ export { deployAgent, validateDeployOptions, getDeploySummary, getCanisterStatus, } from './deployer.js';
9
+ export { loadDeploymentHistory, saveDeploymentHistory, addDeploymentToHistory, getLatestDeployment, getAllDeployments, promoteCanister, getDeploymentForRollback, getDeploymentsByTimeRange, } from './promotion.js';
10
+ export * from '../icp/batch.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Deployment Module
3
+ *
4
+ * Exports all deployment-related functionality.
5
+ */
6
+ // ICP Client
7
+ export { ICPClient, createICPClient, generateStubCanisterId, } from './icpClient.js';
8
+ // Deployer
9
+ export { deployAgent, validateDeployOptions, getDeploySummary, getCanisterStatus, } from './deployer.js';
10
+ // Promotion
11
+ export { loadDeploymentHistory, saveDeploymentHistory, addDeploymentToHistory, getLatestDeployment, getAllDeployments, promoteCanister, getDeploymentForRollback, getDeploymentsByTimeRange, } from './promotion.js';
12
+ // Batched operations
13
+ export * from '../icp/batch.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Environment promotion for canister deployment
3
+ *
4
+ * Handles promoting canisters between environments (dev -> staging -> production)
5
+ * CLE-102: Wired to actual deploy path
6
+ */
7
+ import type { DeploymentHistory } from '../icp/types.js';
8
+ export declare function loadDeploymentHistory(agentName: string): DeploymentHistory[];
9
+ export declare function saveDeploymentHistory(agentName: string, history: DeploymentHistory[]): void;
10
+ export declare function addDeploymentToHistory(deployment: DeploymentHistory): void;
11
+ export declare function getLatestDeployment(agentName: string, environment: string): DeploymentHistory | null;
12
+ export declare function getAllDeployments(agentName: string): DeploymentHistory[];
13
+ export interface PromotionOptions {
14
+ targetCanisterId?: string;
15
+ blueGreen?: boolean;
16
+ wasmPath?: string;
17
+ skipDeploy?: boolean;
18
+ }
19
+ /**
20
+ * Promote a canister from one environment to another
21
+ * Now calls actual deploy when skipDeploy is false
22
+ */
23
+ export declare function promoteCanister(agentName: string, fromEnv: string, toEnv: string, options?: PromotionOptions): Promise<DeploymentHistory>;
24
+ /**
25
+ * Get deployment history for rollback
26
+ */
27
+ export declare function getDeploymentForRollback(agentName: string, environment: string, version: number): DeploymentHistory | null;
28
+ /**
29
+ * Get deployments by time range for rollback
30
+ */
31
+ export declare function getDeploymentsByTimeRange(agentName: string, environment: string, fromTime: Date, toTime: Date): DeploymentHistory[];
32
+ //# sourceMappingURL=promotion.d.ts.map