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,161 +0,0 @@
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
-
8
- import fs from 'node:fs';
9
- import path from 'node:path';
10
- import os from 'node:os';
11
- import { parse, stringify } from 'yaml';
12
- import type { DeploymentHistory } from '../icp/types.js';
13
-
14
- const AGENTVAULT_DIR = path.join(os.homedir(), '.agentvault');
15
- const HISTORY_DIR = path.join(AGENTVAULT_DIR, 'history');
16
-
17
- function ensureHistoryDir(): void {
18
- if (!fs.existsSync(AGENTVAULT_DIR)) {
19
- fs.mkdirSync(AGENTVAULT_DIR, { recursive: true });
20
- }
21
- if (!fs.existsSync(HISTORY_DIR)) {
22
- fs.mkdirSync(HISTORY_DIR, { recursive: true });
23
- }
24
- }
25
-
26
- function getHistoryPath(agentName: string): string {
27
- ensureHistoryDir();
28
- return path.join(HISTORY_DIR, `${agentName}.yaml`);
29
- }
30
-
31
- export function loadDeploymentHistory(agentName: string): DeploymentHistory[] {
32
- const historyPath = getHistoryPath(agentName);
33
-
34
- if (!fs.existsSync(historyPath)) {
35
- return [];
36
- }
37
-
38
- const content = fs.readFileSync(historyPath, 'utf8');
39
- const parsed = parse(content) as unknown;
40
-
41
- if (Array.isArray(parsed)) {
42
- return parsed as DeploymentHistory[];
43
- }
44
-
45
- return [];
46
- }
47
-
48
- export function saveDeploymentHistory(agentName: string, history: DeploymentHistory[]): void {
49
- const historyPath = getHistoryPath(agentName);
50
- fs.writeFileSync(historyPath, stringify(history), 'utf8');
51
- }
52
-
53
- export function addDeploymentToHistory(deployment: DeploymentHistory): void {
54
- const history = loadDeploymentHistory(deployment.agentName);
55
- history.push(deployment);
56
- saveDeploymentHistory(deployment.agentName, history);
57
- }
58
-
59
- export function getLatestDeployment(agentName: string, environment: string): DeploymentHistory | null {
60
- const history = loadDeploymentHistory(agentName);
61
- const envHistory = history.filter((d) => d.environment === environment && d.success);
62
-
63
- if (envHistory.length === 0) {
64
- return null;
65
- }
66
-
67
- return envHistory.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())[0] ?? null;
68
- }
69
-
70
- export function getAllDeployments(agentName: string): DeploymentHistory[] {
71
- return loadDeploymentHistory(agentName);
72
- }
73
-
74
- export interface PromotionOptions {
75
- targetCanisterId?: string;
76
- blueGreen?: boolean;
77
- wasmPath?: string;
78
- skipDeploy?: boolean;
79
- }
80
-
81
- /**
82
- * Promote a canister from one environment to another
83
- * Now calls actual deploy when skipDeploy is false
84
- */
85
- export async function promoteCanister(
86
- agentName: string,
87
- fromEnv: string,
88
- toEnv: string,
89
- options: PromotionOptions = {},
90
- ): Promise<DeploymentHistory> {
91
- const sourceDeployment = getLatestDeployment(agentName, fromEnv);
92
-
93
- if (!sourceDeployment) {
94
- throw new Error(`No successful deployment found for ${agentName} in ${fromEnv} environment`);
95
- }
96
-
97
- const targetCanisterId = options.targetCanisterId || sourceDeployment.canisterId;
98
-
99
- if (!options.skipDeploy && options.wasmPath) {
100
- const { deployAgent } = await import('./deployer.js');
101
-
102
- const deployResult = await deployAgent({
103
- wasmPath: options.wasmPath,
104
- network: toEnv,
105
- canisterId: targetCanisterId,
106
- mode: 'upgrade',
107
- });
108
-
109
- const targetDeployment: DeploymentHistory = {
110
- agentName,
111
- environment: toEnv,
112
- canisterId: deployResult.canister.canisterId,
113
- wasmHash: deployResult.canister.wasmHash || sourceDeployment.wasmHash,
114
- timestamp: new Date(),
115
- version: sourceDeployment.version + 1,
116
- success: true,
117
- };
118
-
119
- addDeploymentToHistory(targetDeployment);
120
-
121
- return targetDeployment;
122
- }
123
-
124
- const targetDeployment: DeploymentHistory = {
125
- agentName,
126
- environment: toEnv,
127
- canisterId: targetCanisterId,
128
- wasmHash: sourceDeployment.wasmHash,
129
- timestamp: new Date(),
130
- version: sourceDeployment.version + 1,
131
- success: true,
132
- };
133
-
134
- addDeploymentToHistory(targetDeployment);
135
-
136
- return targetDeployment;
137
- }
138
-
139
- /**
140
- * Get deployment history for rollback
141
- */
142
- export function getDeploymentForRollback(agentName: string, environment: string, version: number): DeploymentHistory | null {
143
- const history = loadDeploymentHistory(agentName);
144
- const found = history.find((d) => d.environment === environment && d.version === version);
145
- return found !== undefined ? found : null;
146
- }
147
-
148
- /**
149
- * Get deployments by time range for rollback
150
- */
151
- export function getDeploymentsByTimeRange(
152
- agentName: string,
153
- environment: string,
154
- fromTime: Date,
155
- toTime: Date,
156
- ): DeploymentHistory[] {
157
- const history = loadDeploymentHistory(agentName);
158
- return history.filter(
159
- (d) => d.environment === environment && d.timestamp >= fromTime && d.timestamp <= toTime && d.success,
160
- ).sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
161
- }
@@ -1,111 +0,0 @@
1
- /**
2
- * Types for ICP canister deployment
3
- */
4
-
5
- /**
6
- * Network target for deployment
7
- *
8
- * - 'local': Local dfx/icp replica
9
- * - 'ic': IC mainnet
10
- * - string: Named environment from icp.yaml (e.g. 'dev', 'staging', 'production')
11
- */
12
- export type NetworkType = 'local' | 'ic' | string;
13
-
14
- /**
15
- * Which tool is being used for deployment
16
- */
17
- export type DeployToolType = 'icp' | 'dfx' | 'sdk';
18
-
19
- /**
20
- * Deployment status codes
21
- */
22
- export type DeploymentStatus = 'pending' | 'deploying' | 'deployed' | 'failed' | 'running' | 'stopping' | 'stopped';
23
-
24
- /**
25
- * Information about a deployed canister
26
- */
27
- export interface CanisterInfo {
28
- /** Canister ID on the network */
29
- canisterId: string;
30
- /** Network where the canister is deployed */
31
- network: NetworkType;
32
- /** Agent name associated with this canister */
33
- agentName: string;
34
- /** Deployment timestamp */
35
- deployedAt: Date;
36
- /** WASM module hash (for verification) */
37
- wasmHash?: string;
38
- }
39
-
40
- /**
41
- * Options for deployment operation
42
- */
43
- export interface DeployOptions {
44
- /** Path to the WASM file to deploy */
45
- wasmPath: string;
46
- /** Target network for deployment */
47
- network: NetworkType;
48
- /** Existing canister ID (for upgrades) */
49
- canisterId?: string;
50
- /** Skip confirmation prompts */
51
- skipConfirmation?: boolean;
52
- /** Path to dfx identity to use */
53
- identityPath?: string;
54
-
55
- // ── icp-cli options ───────────────────────────────────────────────────
56
-
57
- /** Named environment from icp.yaml */
58
- environment?: string;
59
- /** Identity name for icp-cli */
60
- identity?: string;
61
- /** Cycles allocation for deployment */
62
- cycles?: string;
63
- /** Deploy mode (auto, install, reinstall, upgrade) */
64
- mode?: 'auto' | 'install' | 'reinstall' | 'upgrade';
65
- /** Override project root for icp.yaml lookup */
66
- projectRoot?: string;
67
- }
68
-
69
- /**
70
- * Result of a successful deployment
71
- */
72
- export interface DeployResult {
73
- /** Deployed canister information */
74
- canister: CanisterInfo;
75
- /** Whether this was a new deployment or upgrade */
76
- isUpgrade: boolean;
77
- /** Cycles consumed by deployment */
78
- cyclesUsed?: bigint;
79
- /** Any warnings during deployment */
80
- warnings: string[];
81
- /** Which tool was used for deployment */
82
- deployTool?: DeployToolType;
83
- }
84
-
85
- /**
86
- * Error that occurred during deployment
87
- */
88
- export interface DeploymentError {
89
- /** Error code for programmatic handling */
90
- code: string;
91
- /** Human-readable error message */
92
- message: string;
93
- /** Network where the error occurred */
94
- network?: NetworkType;
95
- /** Canister ID if applicable */
96
- canisterId?: string;
97
- }
98
-
99
- /**
100
- * Configuration for ICP client
101
- */
102
- export interface ICPClientConfig {
103
- /** Target network */
104
- network: NetworkType;
105
- /** Host URL (defaults based on network) */
106
- host?: string;
107
- /** Path to dfx identity file for signing */
108
- identity?: string;
109
- /** Canister ID for operations (optional, used when deploying/upgrading) */
110
- canisterId?: string;
111
- }
package/src/icp/batch.ts DELETED
@@ -1,374 +0,0 @@
1
- /**
2
- * Batched canister operations
3
- *
4
- * Executes multiple canister operations in parallel with dependency ordering,
5
- * retries, and configurable concurrency.
6
- */
7
-
8
- import type { IcpCommonOptions } from '../icp/types.js';
9
- import { canisterStatus, canisterCall } from '../icp/icpcli.js';
10
-
11
- export type BatchOperationType = 'call' | 'query' | 'status' | 'deploy';
12
-
13
- export interface BatchOperation {
14
- /** Operation ID (auto-generated) */
15
- id: string;
16
- /** Operation type */
17
- type: BatchOperationType;
18
- /** Target canister ID */
19
- canisterId: string;
20
- /** Method name (for call/query) */
21
- method?: string;
22
- /** Arguments (Candid format) */
23
- args?: string;
24
- /** Options for the operation */
25
- options?: IcpCommonOptions;
26
- /** Dependencies (operation IDs that must complete first) */
27
- dependsOn?: string[];
28
- }
29
-
30
- export interface BatchResult {
31
- /** Operation ID */
32
- operationId: string;
33
- /** Whether this operation succeeded */
34
- success: boolean;
35
- /** Result data (if success) */
36
- data?: unknown;
37
- /** Error message (if failure) */
38
- error?: string;
39
- /** Execution duration in milliseconds */
40
- durationMs: number;
41
- }
42
-
43
- export interface BatchExecutionResult {
44
- /** Total operations */
45
- total: number;
46
- /** Successful operations */
47
- succeeded: number;
48
- /** Failed operations */
49
- failed: number;
50
- /** Individual results */
51
- results: BatchResult[];
52
- /** Total execution time */
53
- totalDurationMs: number;
54
- }
55
-
56
- export interface BatchConfig {
57
- /** Maximum concurrent operations */
58
- maxConcurrency: number;
59
- /** Timeout per operation in milliseconds */
60
- operationTimeoutMs: number;
61
- /** Whether to stop on first failure */
62
- stopOnFailure: boolean;
63
- /** Retry failed operations */
64
- retryCount: number;
65
- /** Retry delay in milliseconds */
66
- retryDelayMs: number;
67
- }
68
-
69
- const DEFAULT_BATCH_CONFIG: BatchConfig = {
70
- maxConcurrency: 10,
71
- operationTimeoutMs: 30000,
72
- stopOnFailure: false,
73
- retryCount: 2,
74
- retryDelayMs: 1000,
75
- };
76
-
77
- let operationCounter = 0;
78
-
79
- function generateOperationId(): string {
80
- return `op_${++operationCounter}_${Date.now()}`;
81
- }
82
-
83
- /**
84
- * Topologically sort operations by dependency graph
85
- */
86
- function sortOperationsByDeps(operations: BatchOperation[]): BatchOperation[] {
87
- const opMap = new Map(operations.map((op) => [op.id, op]));
88
- const visited = new Set<string>();
89
- const visiting = new Set<string>();
90
- const sorted: BatchOperation[] = [];
91
-
92
- function visit(opId: string): void {
93
- if (visited.has(opId)) return;
94
- if (visiting.has(opId)) {
95
- throw new Error(`Circular dependency detected involving operation: ${opId}`);
96
- }
97
-
98
- visiting.add(opId);
99
- const op = opMap.get(opId);
100
- if (op !== undefined) {
101
- if (op.dependsOn) {
102
- for (const depId of op.dependsOn) {
103
- visit(depId);
104
- }
105
- }
106
- visiting.delete(opId);
107
- visited.add(opId);
108
- sorted.push(op);
109
- }
110
- }
111
-
112
- for (const op of operations) {
113
- visit(op.id);
114
- }
115
-
116
- return sorted;
117
- }
118
-
119
- /**
120
- * Execute a single batch operation
121
- */
122
- async function executeOperation(operation: BatchOperation, config: BatchConfig): Promise<BatchResult> {
123
- const startTime = Date.now();
124
- let result: BatchResult;
125
-
126
- const timeoutPromise = new Promise<never>((_, reject) => {
127
- setTimeout(() => reject(new Error(`Operation timeout after ${config.operationTimeoutMs}ms`)), config.operationTimeoutMs);
128
- });
129
-
130
- try {
131
- const executionPromise = (async (): Promise<BatchResult> => {
132
- switch (operation.type) {
133
- case 'status': {
134
- const statusResult = await canisterStatus({
135
- canister: operation.canisterId,
136
- ...operation.options,
137
- });
138
- return {
139
- operationId: operation.id,
140
- success: statusResult.success,
141
- data: statusResult.stdout,
142
- error: statusResult.success ? undefined : statusResult.stderr,
143
- durationMs: 0,
144
- };
145
- }
146
- case 'call':
147
- case 'query': {
148
- if (!operation.method) {
149
- throw new Error('Method name is required for call/query operations');
150
- }
151
- const callResult = await canisterCall({
152
- canister: operation.canisterId,
153
- method: operation.method,
154
- args: operation.args,
155
- ...operation.options,
156
- });
157
- return {
158
- operationId: operation.id,
159
- success: callResult.success,
160
- data: callResult.stdout,
161
- error: callResult.success ? undefined : callResult.stderr,
162
- durationMs: 0,
163
- };
164
- }
165
- case 'deploy':
166
- return {
167
- operationId: operation.id,
168
- success: true,
169
- data: { message: 'Deploy operation placeholder' },
170
- durationMs: 0,
171
- };
172
- default:
173
- return {
174
- operationId: operation.id,
175
- success: false,
176
- error: `Unknown operation type: ${operation.type}`,
177
- durationMs: 0,
178
- };
179
- }
180
- })();
181
-
182
- result = await Promise.race([executionPromise, timeoutPromise]);
183
- } catch (error) {
184
- result = {
185
- operationId: operation.id,
186
- success: false,
187
- error: error instanceof Error ? error.message : 'Unknown error',
188
- durationMs: 0,
189
- };
190
- }
191
-
192
- result.durationMs = Date.now() - startTime;
193
- return result;
194
- }
195
-
196
- /**
197
- * BatchExecutor class for managing and executing batched canister operations
198
- */
199
- export class BatchExecutor {
200
- private operations: Map<string, BatchOperation> = new Map();
201
- private config: BatchConfig;
202
-
203
- constructor(config: Partial<BatchConfig> = {}) {
204
- this.config = { ...DEFAULT_BATCH_CONFIG, ...config };
205
- }
206
-
207
- /**
208
- * Add a single operation to the batch
209
- */
210
- addOperation(operation: BatchOperation): void {
211
- this.operations.set(generateOperationId(), operation);
212
- }
213
-
214
- /**
215
- * Add multiple operations to the batch
216
- */
217
- addOperations(ops: BatchOperation[]): void {
218
- for (const op of ops) {
219
- this.operations.set(generateOperationId(), op);
220
- }
221
- }
222
-
223
- /**
224
- * Execute all operations in the batch
225
- */
226
- async execute(): Promise<BatchExecutionResult> {
227
- const startTime = Date.now();
228
- const allOperations = Array.from(this.operations.values());
229
- const sortedOps = sortOperationsByDeps(allOperations);
230
-
231
- let succeeded = 0;
232
- let failed = 0;
233
- const executionResults: BatchResult[] = [];
234
-
235
- for (let i = 0; i < sortedOps.length; i += this.config.maxConcurrency) {
236
- const batch = sortedOps.slice(i, i + this.config.maxConcurrency);
237
- const batchResults = await Promise.all(
238
- batch.map((op) => this.executeWithRetry(op))
239
- );
240
-
241
- for (const result of batchResults) {
242
- executionResults.push(result);
243
- if (result.success) {
244
- succeeded++;
245
- } else {
246
- failed++;
247
- if (this.config.stopOnFailure) {
248
- break;
249
- }
250
- }
251
- }
252
- }
253
-
254
- return {
255
- total: allOperations.length,
256
- succeeded,
257
- failed,
258
- results: executionResults,
259
- totalDurationMs: Date.now() - startTime,
260
- };
261
- }
262
-
263
- /**
264
- * Execute an operation with retry logic
265
- */
266
- private async executeWithRetry(operation: BatchOperation): Promise<BatchResult> {
267
- let lastError: string | undefined;
268
- let delay = this.config.retryDelayMs;
269
-
270
- for (let attempt = 0; attempt <= this.config.retryCount; attempt++) {
271
- try {
272
- const result = await executeOperation(operation, this.config);
273
- if (result.success || attempt === this.config.retryCount) {
274
- return result;
275
- }
276
- lastError = result.error;
277
- } catch (error) {
278
- lastError = error instanceof Error ? error.message : 'Unknown error';
279
- }
280
-
281
- if (attempt < this.config.retryCount) {
282
- await new Promise((resolve) => setTimeout(resolve, delay));
283
- delay *= 2;
284
- }
285
- }
286
-
287
- return {
288
- operationId: operation.id,
289
- success: false,
290
- error: lastError || 'Max retries exceeded',
291
- durationMs: 0,
292
- };
293
- }
294
-
295
- /**
296
- * Get a dry-run plan of execution order
297
- */
298
- executeDryRun(): { order: string[]; parallelGroups: string[][] } {
299
- const allOperations = Array.from(this.operations.values());
300
- const sortedOps = sortOperationsByDeps(allOperations);
301
- const order = sortedOps.map((op) => op.id);
302
- const parallelGroups: string[][] = [];
303
-
304
- for (let i = 0; i < sortedOps.length; i += this.config.maxConcurrency) {
305
- parallelGroups.push(sortedOps.slice(i, i + this.config.maxConcurrency).map((op) => op.id));
306
- }
307
-
308
- return { order, parallelGroups };
309
- }
310
-
311
- /**
312
- * Clear all operations
313
- */
314
- clear(): void {
315
- this.operations.clear();
316
- }
317
- }
318
-
319
- /**
320
- * Create a new batch executor with custom config
321
- */
322
- export function createBatchExecutor(config?: Partial<BatchConfig>): BatchExecutor {
323
- return new BatchExecutor(config);
324
- }
325
-
326
- /**
327
- * Helper to create a status-check operation
328
- */
329
- export function createStatusOperation(canisterId: string, options?: IcpCommonOptions): BatchOperation {
330
- return {
331
- id: generateOperationId(),
332
- type: 'status',
333
- canisterId,
334
- options,
335
- };
336
- }
337
-
338
- /**
339
- * Helper to create a query operation
340
- */
341
- export function createQueryOperation(
342
- canisterId: string,
343
- method: string,
344
- args?: string,
345
- options?: IcpCommonOptions,
346
- ): BatchOperation {
347
- return {
348
- id: generateOperationId(),
349
- type: 'query',
350
- canisterId,
351
- method,
352
- args,
353
- options,
354
- };
355
- }
356
-
357
- /**
358
- * Helper to create a call operation
359
- */
360
- export function createCallOperation(
361
- canisterId: string,
362
- method: string,
363
- args?: string,
364
- options?: IcpCommonOptions,
365
- ): BatchOperation {
366
- return {
367
- id: generateOperationId(),
368
- type: 'call',
369
- canisterId,
370
- method,
371
- args,
372
- options,
373
- };
374
- }