agentvault 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/README.md +1 -1
  3. package/dist/cli/commands/approve.js +5 -5
  4. package/dist/cli/commands/archive.js +5 -5
  5. package/dist/cli/commands/backup.js +5 -5
  6. package/dist/cli/commands/cloud-backup.js +12 -12
  7. package/dist/cli/commands/decrypt.js +2 -2
  8. package/dist/cli/commands/deploy.js +1 -1
  9. package/dist/cli/commands/exec.js +2 -2
  10. package/dist/cli/commands/fetch.js +4 -4
  11. package/dist/cli/commands/inference.js +5 -5
  12. package/dist/cli/commands/init.d.ts +1 -1
  13. package/dist/cli/commands/init.js +16 -16
  14. package/dist/cli/commands/list.js +4 -4
  15. package/dist/cli/commands/package.js +2 -2
  16. package/dist/cli/commands/profile.js +1 -1
  17. package/dist/cli/commands/rebuild.js +2 -2
  18. package/dist/cli/commands/show.js +1 -1
  19. package/dist/cli/commands/status.d.ts +1 -1
  20. package/dist/cli/commands/status.js +8 -8
  21. package/dist/cli/commands/trace.js +1 -1
  22. package/dist/cli/commands/wallet-export.js +1 -1
  23. package/dist/cli/commands/wallet-sign.js +1 -1
  24. package/dist/cli/commands/wallet.d.ts +1 -1
  25. package/dist/cli/commands/wallet.js +1 -1
  26. package/dist/cli/index.d.ts +2 -2
  27. package/dist/cli/index.js +3 -3
  28. package/dist/src/archival/archive-manager.d.ts +85 -0
  29. package/dist/src/archival/archive-manager.js +294 -0
  30. package/dist/src/archival/arweave-client.d.ts +88 -0
  31. package/dist/src/archival/arweave-client.js +223 -0
  32. package/dist/src/archival/index.d.ts +8 -0
  33. package/{src/archival/index.ts → dist/src/archival/index.js} +1 -1
  34. package/dist/src/backup/backup.d.ts +67 -0
  35. package/dist/src/backup/backup.js +231 -0
  36. package/dist/src/backup/index.d.ts +7 -0
  37. package/{src/backup/index.ts → dist/src/backup/index.js} +1 -1
  38. package/dist/src/cloud-storage/cloud-sync.d.ts +49 -0
  39. package/dist/src/cloud-storage/cloud-sync.js +372 -0
  40. package/dist/src/cloud-storage/index.d.ts +11 -0
  41. package/{src/cloud-storage/index.ts → dist/src/cloud-storage/index.js} +1 -1
  42. package/dist/src/cloud-storage/provider-detector.d.ts +34 -0
  43. package/dist/src/cloud-storage/provider-detector.js +158 -0
  44. package/{src/cloud-storage/types.ts → dist/src/cloud-storage/types.d.ts} +40 -53
  45. package/dist/src/cloud-storage/types.js +10 -0
  46. package/dist/src/debugging/index.d.ts +6 -0
  47. package/{src/debugging/index.ts → dist/src/debugging/index.js} +1 -1
  48. package/dist/src/debugging/logs.d.ts +32 -0
  49. package/dist/src/debugging/logs.js +158 -0
  50. package/dist/src/debugging/types.d.ts +91 -0
  51. package/dist/src/debugging/types.js +5 -0
  52. package/dist/src/deployment/deployer.d.ts +52 -0
  53. package/dist/src/deployment/deployer.js +211 -0
  54. package/dist/src/deployment/icpClient.d.ts +144 -0
  55. package/dist/src/deployment/icpClient.js +545 -0
  56. package/dist/src/deployment/index.d.ts +11 -0
  57. package/dist/src/deployment/index.js +14 -0
  58. package/dist/src/deployment/promotion.d.ts +32 -0
  59. package/dist/src/deployment/promotion.js +114 -0
  60. package/dist/src/deployment/types.d.ts +101 -0
  61. package/dist/src/deployment/types.js +5 -0
  62. package/dist/src/icp/batch.d.ts +112 -0
  63. package/dist/src/icp/batch.js +273 -0
  64. package/dist/src/icp/cycles.d.ts +29 -0
  65. package/{src/icp/cycles.ts → dist/src/icp/cycles.js} +8 -22
  66. package/dist/src/icp/environment.d.ts +60 -0
  67. package/dist/src/icp/environment.js +183 -0
  68. package/dist/src/icp/icpcli.d.ts +204 -0
  69. package/dist/src/icp/icpcli.js +374 -0
  70. package/dist/src/icp/icwasm.d.ts +94 -0
  71. package/dist/src/icp/icwasm.js +197 -0
  72. package/dist/src/icp/identity.d.ts +50 -0
  73. package/{src/icp/identity.ts → dist/src/icp/identity.js} +15 -28
  74. package/dist/src/icp/index.d.ts +16 -0
  75. package/dist/src/icp/index.js +20 -0
  76. package/dist/src/icp/optimization.d.ts +16 -0
  77. package/dist/src/icp/optimization.js +225 -0
  78. package/dist/src/icp/tokens.d.ts +24 -0
  79. package/{src/icp/tokens.ts → dist/src/icp/tokens.js} +5 -12
  80. package/dist/src/icp/tool-detector.d.ts +31 -0
  81. package/dist/src/icp/tool-detector.js +104 -0
  82. package/dist/src/icp/types.d.ts +493 -0
  83. package/dist/src/icp/types.js +7 -0
  84. package/dist/src/index.d.ts +12 -0
  85. package/dist/src/index.js +18 -0
  86. package/dist/src/inference/bittensor-client.d.ts +108 -0
  87. package/dist/src/inference/bittensor-client.js +224 -0
  88. package/dist/src/inference/index.d.ts +8 -0
  89. package/{src/inference/index.ts → dist/src/inference/index.js} +1 -1
  90. package/dist/src/inference/inference-manager.d.ts +76 -0
  91. package/dist/src/inference/inference-manager.js +228 -0
  92. package/dist/src/metrics/index.d.ts +7 -0
  93. package/{src/metrics/index.ts → dist/src/metrics/index.js} +1 -1
  94. package/dist/src/metrics/metrics.d.ts +39 -0
  95. package/dist/src/metrics/metrics.js +129 -0
  96. package/dist/src/monitoring/alerting.d.ts +51 -0
  97. package/dist/src/monitoring/alerting.js +169 -0
  98. package/dist/src/monitoring/health.d.ts +40 -0
  99. package/dist/src/monitoring/health.js +164 -0
  100. package/dist/src/monitoring/index.d.ts +10 -0
  101. package/dist/src/monitoring/index.js +12 -0
  102. package/dist/src/monitoring/info.d.ts +15 -0
  103. package/dist/src/monitoring/info.js +109 -0
  104. package/dist/src/monitoring/types.d.ts +93 -0
  105. package/dist/src/monitoring/types.js +7 -0
  106. package/dist/src/network/index.d.ts +5 -0
  107. package/{src/network/index.ts → dist/src/network/index.js} +1 -1
  108. package/dist/src/network/network-config.d.ts +31 -0
  109. package/dist/src/network/network-config.js +109 -0
  110. package/dist/src/packaging/compiler.d.ts +61 -0
  111. package/dist/src/packaging/compiler.js +562 -0
  112. package/dist/src/packaging/config-persistence.d.ts +46 -0
  113. package/dist/src/packaging/config-persistence.js +108 -0
  114. package/dist/src/packaging/config-schemas.d.ts +115 -0
  115. package/dist/src/packaging/config-schemas.js +43 -0
  116. package/dist/src/packaging/detector.d.ts +26 -0
  117. package/dist/src/packaging/detector.js +193 -0
  118. package/dist/src/packaging/index.d.ts +16 -0
  119. package/dist/src/packaging/index.js +22 -0
  120. package/dist/src/packaging/packager.d.ts +31 -0
  121. package/dist/src/packaging/packager.js +90 -0
  122. package/dist/src/packaging/parsers/clawdbot.d.ts +19 -0
  123. package/dist/src/packaging/parsers/clawdbot.js +231 -0
  124. package/dist/src/packaging/parsers/cline.d.ts +26 -0
  125. package/dist/src/packaging/parsers/cline.js +185 -0
  126. package/dist/src/packaging/parsers/generic.d.ts +27 -0
  127. package/dist/src/packaging/parsers/generic.js +228 -0
  128. package/dist/src/packaging/parsers/goose.d.ts +26 -0
  129. package/dist/src/packaging/parsers/goose.js +175 -0
  130. package/dist/src/packaging/parsers/index.d.ts +11 -0
  131. package/{src/packaging/parsers/index.ts → dist/src/packaging/parsers/index.js} +1 -1
  132. package/dist/src/packaging/serializer.d.ts +108 -0
  133. package/dist/src/packaging/serializer.js +153 -0
  134. package/dist/src/packaging/types.d.ts +131 -0
  135. package/dist/src/packaging/types.js +5 -0
  136. package/dist/src/packaging/wasmedge-compiler.d.ts +76 -0
  137. package/dist/src/packaging/wasmedge-compiler.js +349 -0
  138. package/dist/src/security/index.d.ts +11 -0
  139. package/{src/security/index.ts → dist/src/security/index.js} +1 -4
  140. package/dist/src/security/multisig.d.ts +102 -0
  141. package/dist/src/security/multisig.js +283 -0
  142. package/dist/src/security/types.d.ts +207 -0
  143. package/dist/src/security/types.js +217 -0
  144. package/dist/src/security/vetkeys.d.ts +179 -0
  145. package/dist/src/security/vetkeys.js +499 -0
  146. package/dist/src/testing/index.d.ts +6 -0
  147. package/{src/testing/index.ts → dist/src/testing/index.js} +1 -1
  148. package/dist/src/testing/local-runner.d.ts +23 -0
  149. package/dist/src/testing/local-runner.js +226 -0
  150. package/dist/src/testing/types.d.ts +98 -0
  151. package/dist/src/testing/types.js +5 -0
  152. package/dist/src/wallet/cbor-serializer.d.ts +82 -0
  153. package/dist/src/wallet/cbor-serializer.js +282 -0
  154. package/dist/src/wallet/chain-dispatcher.d.ts +112 -0
  155. package/dist/src/wallet/chain-dispatcher.js +241 -0
  156. package/dist/src/wallet/cross-chain-aggregator.d.ts +119 -0
  157. package/dist/src/wallet/cross-chain-aggregator.js +235 -0
  158. package/dist/src/wallet/index.d.ts +16 -0
  159. package/dist/src/wallet/index.js +22 -0
  160. package/dist/src/wallet/key-derivation.d.ts +117 -0
  161. package/dist/src/wallet/key-derivation.js +325 -0
  162. package/dist/src/wallet/providers/base-provider.d.ts +111 -0
  163. package/dist/src/wallet/providers/base-provider.js +58 -0
  164. package/dist/src/wallet/providers/cketh-provider.d.ts +104 -0
  165. package/dist/src/wallet/providers/cketh-provider.js +343 -0
  166. package/dist/src/wallet/providers/polkadot-provider.d.ts +115 -0
  167. package/dist/src/wallet/providers/polkadot-provider.js +407 -0
  168. package/dist/src/wallet/providers/solana-provider.d.ts +102 -0
  169. package/dist/src/wallet/providers/solana-provider.js +393 -0
  170. package/dist/src/wallet/transaction-queue.d.ts +133 -0
  171. package/dist/src/wallet/transaction-queue.js +195 -0
  172. package/dist/src/wallet/types.d.ts +167 -0
  173. package/dist/src/wallet/types.js +5 -0
  174. package/dist/src/wallet/vetkeys-adapter.d.ts +134 -0
  175. package/dist/src/wallet/vetkeys-adapter.js +313 -0
  176. package/dist/src/wallet/wallet-manager.d.ts +202 -0
  177. package/dist/src/wallet/wallet-manager.js +451 -0
  178. package/dist/src/wallet/wallet-storage.d.ts +131 -0
  179. package/dist/src/wallet/wallet-storage.js +274 -0
  180. package/macos-wallet-app/AgentVaultWallet/App/AgentVaultWalletApp.swift +54 -0
  181. package/macos-wallet-app/AgentVaultWallet/Models/AppState.swift +102 -0
  182. package/macos-wallet-app/AgentVaultWallet/Models/Chain.swift +121 -0
  183. package/macos-wallet-app/AgentVaultWallet/Models/Wallet.swift +98 -0
  184. package/macos-wallet-app/AgentVaultWallet/Resources/AgentVaultWallet.entitlements +27 -0
  185. package/macos-wallet-app/AgentVaultWallet/Resources/Info.plist +69 -0
  186. package/macos-wallet-app/AgentVaultWallet/Services/BackupService.swift +270 -0
  187. package/macos-wallet-app/AgentVaultWallet/Services/CLIBridge.swift +367 -0
  188. package/macos-wallet-app/AgentVaultWallet/Services/CryptoService.swift +157 -0
  189. package/macos-wallet-app/AgentVaultWallet/Services/FileService.swift +120 -0
  190. package/macos-wallet-app/AgentVaultWallet/Services/KeychainService.swift +219 -0
  191. package/macos-wallet-app/AgentVaultWallet/Utilities/Constants.swift +44 -0
  192. package/macos-wallet-app/AgentVaultWallet/Utilities/Extensions.swift +115 -0
  193. package/macos-wallet-app/AgentVaultWallet/ViewModels/BackupViewModel.swift +237 -0
  194. package/macos-wallet-app/AgentVaultWallet/ViewModels/CreateWalletViewModel.swift +137 -0
  195. package/macos-wallet-app/AgentVaultWallet/ViewModels/ImportWalletViewModel.swift +179 -0
  196. package/macos-wallet-app/AgentVaultWallet/ViewModels/WalletStore.swift +286 -0
  197. package/macos-wallet-app/AgentVaultWallet/Views/Backup/BackupView.swift +235 -0
  198. package/macos-wallet-app/AgentVaultWallet/Views/Backup/RestoreView.swift +316 -0
  199. package/macos-wallet-app/AgentVaultWallet/Views/Create/CreateWalletFlow.swift +438 -0
  200. package/macos-wallet-app/AgentVaultWallet/Views/Import/ImportWalletFlow.swift +399 -0
  201. package/macos-wallet-app/AgentVaultWallet/Views/MainView.swift +134 -0
  202. package/macos-wallet-app/AgentVaultWallet/Views/Settings/SettingsView.swift +276 -0
  203. package/macos-wallet-app/AgentVaultWallet/Views/Sidebar/SidebarView.swift +133 -0
  204. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/DashboardView.swift +233 -0
  205. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletDetailView.swift +281 -0
  206. package/macos-wallet-app/AgentVaultWallet/Views/Wallet/WalletListView.swift +280 -0
  207. package/macos-wallet-app/AgentVaultWallet/Views/Welcome/WelcomeView.swift +176 -0
  208. package/macos-wallet-app/Makefile +47 -0
  209. package/macos-wallet-app/project.yml +40 -0
  210. package/macos-wallet-app/setup.sh +73 -0
  211. package/package.json +10 -2
  212. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-28-967Z.json +0 -28
  213. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-29-032Z.backup +0 -1
  214. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-373Z.json +0 -28
  215. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-428Z.backup +0 -1
  216. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-132Z.json +0 -28
  217. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-247Z.backup +0 -1
  218. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-216Z.json +0 -28
  219. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-283Z.backup +0 -1
  220. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-772Z.backup +0 -1
  221. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-793Z.json +0 -28
  222. package/backups/test-backup.json +0 -28
  223. package/scripts/dev-dashboard.mjs +0 -84
  224. package/site/README.md +0 -63
  225. package/site/docusaurus.config.ts +0 -148
  226. package/site/package-lock.json +0 -18383
  227. package/site/package.json +0 -47
  228. package/site/sidebars.ts +0 -86
  229. package/site/static/.gitkeep +0 -0
  230. package/site/static/img/logo.svg +0 -28
  231. package/site/static/img/og-image.svg +0 -35
  232. package/src/archival/archive-manager.ts +0 -372
  233. package/src/archival/arweave-client.ts +0 -289
  234. package/src/backup/backup.ts +0 -315
  235. package/src/cloud-storage/cloud-sync.ts +0 -461
  236. package/src/cloud-storage/provider-detector.ts +0 -198
  237. package/src/debugging/logs.ts +0 -193
  238. package/src/debugging/types.ts +0 -100
  239. package/src/deployment/deployer.ts +0 -274
  240. package/src/deployment/icpClient.ts +0 -620
  241. package/src/deployment/index.ts +0 -46
  242. package/src/deployment/promotion.ts +0 -161
  243. package/src/deployment/types.ts +0 -111
  244. package/src/icp/batch.ts +0 -374
  245. package/src/icp/environment.ts +0 -215
  246. package/src/icp/icpcli.ts +0 -438
  247. package/src/icp/icwasm.ts +0 -222
  248. package/src/icp/index.ts +0 -94
  249. package/src/icp/optimization.ts +0 -242
  250. package/src/icp/tool-detector.ts +0 -110
  251. package/src/icp/types.ts +0 -574
  252. package/src/index.ts +0 -25
  253. package/src/inference/bittensor-client.ts +0 -304
  254. package/src/inference/inference-manager.ts +0 -327
  255. package/src/metrics/metrics.ts +0 -186
  256. package/src/monitoring/alerting.ts +0 -190
  257. package/src/monitoring/health.ts +0 -197
  258. package/src/monitoring/index.ts +0 -38
  259. package/src/monitoring/info.ts +0 -114
  260. package/src/monitoring/types.ts +0 -99
  261. package/src/network/network-config.ts +0 -129
  262. package/src/packaging/compiler.ts +0 -647
  263. package/src/packaging/config-persistence.ts +0 -135
  264. package/src/packaging/config-schemas.ts +0 -156
  265. package/src/packaging/detector.ts +0 -220
  266. package/src/packaging/index.ts +0 -90
  267. package/src/packaging/packager.ts +0 -118
  268. package/src/packaging/parsers/clawdbot.ts +0 -278
  269. package/src/packaging/parsers/cline.ts +0 -223
  270. package/src/packaging/parsers/generic.ts +0 -266
  271. package/src/packaging/parsers/goose.ts +0 -214
  272. package/src/packaging/serializer.ts +0 -260
  273. package/src/packaging/types.ts +0 -144
  274. package/src/packaging/wasmedge-compiler.ts +0 -406
  275. package/src/security/multisig.ts +0 -415
  276. package/src/security/types.ts +0 -416
  277. package/src/security/vetkeys.ts +0 -655
  278. package/src/testing/local-runner.ts +0 -264
  279. package/src/testing/types.ts +0 -104
  280. package/src/wallet/cbor-serializer.ts +0 -323
  281. package/src/wallet/chain-dispatcher.ts +0 -313
  282. package/src/wallet/cross-chain-aggregator.ts +0 -346
  283. package/src/wallet/index.ts +0 -76
  284. package/src/wallet/key-derivation.ts +0 -425
  285. package/src/wallet/providers/base-provider.ts +0 -154
  286. package/src/wallet/providers/cketh-provider.ts +0 -434
  287. package/src/wallet/providers/polkadot-provider.ts +0 -503
  288. package/src/wallet/providers/solana-provider.ts +0 -490
  289. package/src/wallet/transaction-queue.ts +0 -284
  290. package/src/wallet/types.ts +0 -178
  291. package/src/wallet/vetkeys-adapter.ts +0 -431
  292. package/src/wallet/wallet-manager.ts +0 -597
  293. package/src/wallet/wallet-storage.ts +0 -380
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Metrics Module
3
+ *
4
+ * Stores and retrieves canister metrics (cycles, memory, messages, etc.)
5
+ * in JSONL format: ~/.agentvault/metrics/<canister-id>/YYYY-MM-DD.jsonl
6
+ */
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import os from 'node:os';
10
+ const AGENTVAULT_DIR = path.join(os.homedir(), '.agentvault');
11
+ const METRICS_DIR = path.join(AGENTVAULT_DIR, 'metrics');
12
+ function getMetricsDir(canisterId) {
13
+ const dir = path.join(METRICS_DIR, canisterId);
14
+ if (!fs.existsSync(dir)) {
15
+ fs.mkdirSync(dir, { recursive: true });
16
+ }
17
+ return dir;
18
+ }
19
+ function getMetricsFile(canisterId, date) {
20
+ const metricsDir = getMetricsDir(canisterId);
21
+ const dateStr = date.toISOString().split('T')[0];
22
+ return path.join(metricsDir, `${dateStr}.jsonl`);
23
+ }
24
+ export function storeMetrics(canisterId, metrics) {
25
+ const now = new Date();
26
+ const metricsFile = getMetricsFile(canisterId, now);
27
+ for (const [metric, value] of Object.entries(metrics)) {
28
+ const line = JSON.stringify({
29
+ timestamp: now.toISOString(),
30
+ metric,
31
+ value,
32
+ });
33
+ fs.appendFileSync(metricsFile, `${line}\n`);
34
+ }
35
+ }
36
+ export function getTimeSeries(canisterId, metric, from, to) {
37
+ const dataPoints = [];
38
+ const currentDate = new Date(from);
39
+ while (currentDate <= to) {
40
+ const metricsFile = getMetricsFile(canisterId, currentDate);
41
+ if (fs.existsSync(metricsFile)) {
42
+ const lines = fs.readFileSync(metricsFile, 'utf8').trim().split('\n');
43
+ for (const line of lines) {
44
+ if (line) {
45
+ const parsed = JSON.parse(line);
46
+ if (parsed.metric === metric) {
47
+ const timestamp = new Date(parsed.timestamp);
48
+ if (timestamp >= from && timestamp <= to) {
49
+ dataPoints.push({ timestamp, value: parsed.value });
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ currentDate.setDate(currentDate.getDate() + 1);
56
+ }
57
+ dataPoints.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
58
+ return { metric, dataPoints };
59
+ }
60
+ export function getSummary(canisterId, days = 7) {
61
+ const now = new Date();
62
+ const from = new Date(now);
63
+ from.setDate(now.getDate() - days);
64
+ const metricValues = {};
65
+ const metricCurrent = {};
66
+ for (const metric of ['cycles_balance', 'memory_heap', 'message_count', 'request_count', 'error_count']) {
67
+ const series = getTimeSeries(canisterId, metric, from, now);
68
+ if (series.dataPoints.length > 0) {
69
+ metricValues[metric] = series.dataPoints.map(dp => dp.value);
70
+ const lastPoint = series.dataPoints[series.dataPoints.length - 1];
71
+ if (lastPoint) {
72
+ metricCurrent[metric] = lastPoint.value;
73
+ }
74
+ }
75
+ }
76
+ const summary = {
77
+ canisterId,
78
+ metrics: {},
79
+ period: { start: from, end: now },
80
+ };
81
+ for (const [metric, values] of Object.entries(metricValues)) {
82
+ if (values) {
83
+ const currentValue = metricCurrent[metric];
84
+ if (currentValue !== undefined) {
85
+ const min = Math.min(...values);
86
+ const max = Math.max(...values);
87
+ const avg = values.reduce((a, b) => a + b, 0) / values.length;
88
+ summary.metrics[metric] = {
89
+ current: currentValue,
90
+ min,
91
+ max,
92
+ avg,
93
+ };
94
+ }
95
+ }
96
+ }
97
+ return summary;
98
+ }
99
+ export function pruneOldData(canisterId, retentionDays) {
100
+ const metricsDir = getMetricsDir(canisterId);
101
+ if (!fs.existsSync(metricsDir))
102
+ return;
103
+ const cutoff = new Date();
104
+ cutoff.setDate(cutoff.getDate() - retentionDays);
105
+ const files = fs.readdirSync(metricsDir);
106
+ for (const file of files) {
107
+ if (file.endsWith('.jsonl')) {
108
+ const dateStr = file.replace('.jsonl', '');
109
+ const fileDate = new Date(dateStr);
110
+ if (fileDate < cutoff) {
111
+ fs.unlinkSync(path.join(metricsDir, file));
112
+ }
113
+ }
114
+ }
115
+ }
116
+ export function startCollector(canisterId, config = {}) {
117
+ const { interval = 60000, retentionDays = 7 } = config;
118
+ const collect = async () => {
119
+ try {
120
+ pruneOldData(canisterId, retentionDays);
121
+ }
122
+ catch (error) {
123
+ console.error(`Failed to collect metrics for ${canisterId}:`, error);
124
+ }
125
+ };
126
+ collect();
127
+ return setInterval(collect, interval);
128
+ }
129
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Alerting
3
+ *
4
+ * Generates, stores, and retrieves monitoring alerts for canisters.
5
+ * Tracks cycle depletion, memory issues, and performance degradation.
6
+ */
7
+ import type { MonitoringAlert, CanisterStatusInfo, HealthThresholds } from './types.js';
8
+ /**
9
+ * Load alerts from storage.
10
+ *
11
+ * @param canisterId - Canister ID
12
+ * @returns Stored alerts array
13
+ */
14
+ export declare function loadAlerts(canisterId: string): MonitoringAlert[];
15
+ /**
16
+ * Save alerts to storage.
17
+ *
18
+ * @param canisterId - Canister ID
19
+ * @param alerts - Alerts to store
20
+ */
21
+ export declare function saveAlerts(canisterId: string, alerts: MonitoringAlert[]): void;
22
+ /**
23
+ * Append a new alert to storage.
24
+ *
25
+ * @param canisterId - Canister ID
26
+ * @param alert - Alert to add
27
+ */
28
+ export declare function appendAlert(canisterId: string, alert: MonitoringAlert): void;
29
+ /**
30
+ * Clear alerts for a canister.
31
+ *
32
+ * @param canisterId - Canister ID
33
+ */
34
+ export declare function clearAlerts(canisterId: string): void;
35
+ /**
36
+ * Generate health alerts for a canister based on its current status.
37
+ *
38
+ * @param statusInfo - Canister status information
39
+ * @param thresholds - Health check thresholds
40
+ * @returns Array of alerts
41
+ */
42
+ export declare function generateHealthAlerts(statusInfo: CanisterStatusInfo, thresholds?: HealthThresholds): MonitoringAlert[];
43
+ /**
44
+ * Get recent alerts for a canister.
45
+ *
46
+ * @param canisterId - Canister ID
47
+ * @param limit - Maximum number of alerts to return (default: 10)
48
+ * @returns Recent alerts (newest first)
49
+ */
50
+ export declare function getRecentAlerts(canisterId: string, limit?: number): MonitoringAlert[];
51
+ //# sourceMappingURL=alerting.d.ts.map
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Alerting
3
+ *
4
+ * Generates, stores, and retrieves monitoring alerts for canisters.
5
+ * Tracks cycle depletion, memory issues, and performance degradation.
6
+ */
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ /**
10
+ * Default alert storage path
11
+ */
12
+ const ALERTS_DIR = path.join(process.env.HOME || process.cwd(), '.agentvault', 'alerts');
13
+ /**
14
+ * Alert storage file path
15
+ */
16
+ const getAlertFilePath = (canisterId) => path.join(ALERTS_DIR, `${canisterId}.json`);
17
+ /**
18
+ * Load alerts from storage.
19
+ *
20
+ * @param canisterId - Canister ID
21
+ * @returns Stored alerts array
22
+ */
23
+ export function loadAlerts(canisterId) {
24
+ const alertFile = getAlertFilePath(canisterId);
25
+ if (!fs.existsSync(alertFile)) {
26
+ return [];
27
+ }
28
+ try {
29
+ const content = fs.readFileSync(alertFile, 'utf-8');
30
+ return JSON.parse(content);
31
+ }
32
+ catch {
33
+ return [];
34
+ }
35
+ }
36
+ /**
37
+ * Save alerts to storage.
38
+ *
39
+ * @param canisterId - Canister ID
40
+ * @param alerts - Alerts to store
41
+ */
42
+ export function saveAlerts(canisterId, alerts) {
43
+ const alertFile = getAlertFilePath(canisterId);
44
+ const content = JSON.stringify(alerts, null, 2);
45
+ fs.mkdirSync(path.dirname(alertFile), { recursive: true });
46
+ fs.writeFileSync(alertFile, content, 'utf-8');
47
+ }
48
+ /**
49
+ * Append a new alert to storage.
50
+ *
51
+ * @param canisterId - Canister ID
52
+ * @param alert - Alert to add
53
+ */
54
+ export function appendAlert(canisterId, alert) {
55
+ const alerts = loadAlerts(canisterId);
56
+ alerts.push(alert);
57
+ saveAlerts(canisterId, alerts);
58
+ }
59
+ /**
60
+ * Clear alerts for a canister.
61
+ *
62
+ * @param canisterId - Canister ID
63
+ */
64
+ export function clearAlerts(canisterId) {
65
+ const alertFile = getAlertFilePath(canisterId);
66
+ if (fs.existsSync(alertFile)) {
67
+ fs.unlinkSync(alertFile);
68
+ }
69
+ }
70
+ /**
71
+ * Generate health alerts for a canister based on its current status.
72
+ *
73
+ * @param statusInfo - Canister status information
74
+ * @param thresholds - Health check thresholds
75
+ * @returns Array of alerts
76
+ */
77
+ export function generateHealthAlerts(statusInfo, thresholds = {}) {
78
+ const alerts = [];
79
+ const cycles = statusInfo.cycles;
80
+ if (cycles !== undefined) {
81
+ if (thresholds.cyclesCritical !== undefined && cycles < thresholds.cyclesCritical) {
82
+ alerts.push({
83
+ severity: 'critical',
84
+ message: `Cycle balance critically low: ${cycles.toString()}`,
85
+ canisterId: statusInfo.canisterId,
86
+ metric: 'cycles',
87
+ value: cycles.toString(),
88
+ threshold: thresholds.cyclesCritical.toString(),
89
+ timestamp: new Date(),
90
+ });
91
+ }
92
+ else if (thresholds.cyclesWarning !== undefined && cycles < thresholds.cyclesWarning) {
93
+ alerts.push({
94
+ severity: 'warning',
95
+ message: `Cycle balance low: ${cycles.toString()}`,
96
+ canisterId: statusInfo.canisterId,
97
+ metric: 'cycles',
98
+ value: cycles.toString(),
99
+ threshold: thresholds.cyclesWarning.toString(),
100
+ timestamp: new Date(),
101
+ });
102
+ }
103
+ }
104
+ const memoryBytes = statusInfo.memorySize;
105
+ if (memoryBytes !== undefined) {
106
+ const memoryMB = Number(memoryBytes) / (1024 * 1024);
107
+ // IC canisters have ~4GB max memory (4096 MB)
108
+ const maxMemoryMB = 4096;
109
+ const criticalThresholdMB = maxMemoryMB * ((thresholds.memoryCriticalPercent ?? 0) / 100);
110
+ const warningThresholdMB = maxMemoryMB * ((thresholds.memoryWarningPercent ?? 0) / 100);
111
+ if (thresholds.memoryCriticalPercent !== undefined && memoryMB > criticalThresholdMB) {
112
+ alerts.push({
113
+ severity: 'critical',
114
+ message: `Memory usage critically high: ${memoryMB.toFixed(2)} MB`,
115
+ canisterId: statusInfo.canisterId,
116
+ metric: 'memory',
117
+ value: `${memoryMB.toFixed(2)} MB`,
118
+ threshold: `${thresholds.memoryCriticalPercent}%`,
119
+ timestamp: new Date(),
120
+ });
121
+ }
122
+ else if (thresholds.memoryWarningPercent !== undefined && memoryMB > warningThresholdMB) {
123
+ alerts.push({
124
+ severity: 'warning',
125
+ message: `Memory usage high: ${memoryMB.toFixed(2)} MB`,
126
+ canisterId: statusInfo.canisterId,
127
+ metric: 'memory',
128
+ value: `${memoryMB.toFixed(2)} MB`,
129
+ threshold: `${thresholds.memoryWarningPercent}%`,
130
+ timestamp: new Date(),
131
+ });
132
+ }
133
+ }
134
+ if (statusInfo.status === 'stopped') {
135
+ alerts.push({
136
+ severity: 'critical',
137
+ message: 'Canister is stopped',
138
+ canisterId: statusInfo.canisterId,
139
+ metric: 'status',
140
+ value: statusInfo.status,
141
+ threshold: 'healthy',
142
+ timestamp: new Date(),
143
+ });
144
+ }
145
+ else if (statusInfo.status === 'stopping') {
146
+ alerts.push({
147
+ severity: 'warning',
148
+ message: 'Canister is stopping',
149
+ canisterId: statusInfo.canisterId,
150
+ metric: 'status',
151
+ value: statusInfo.status,
152
+ threshold: 'healthy',
153
+ timestamp: new Date(),
154
+ });
155
+ }
156
+ return alerts;
157
+ }
158
+ /**
159
+ * Get recent alerts for a canister.
160
+ *
161
+ * @param canisterId - Canister ID
162
+ * @param limit - Maximum number of alerts to return (default: 10)
163
+ * @returns Recent alerts (newest first)
164
+ */
165
+ export function getRecentAlerts(canisterId, limit = 10) {
166
+ const alerts = loadAlerts(canisterId);
167
+ return alerts.slice(-limit);
168
+ }
169
+ //# sourceMappingURL=alerting.js.map
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Health Monitoring
3
+ *
4
+ * Performs health checks on canisters and determines overall health status
5
+ * based on resource usage thresholds.
6
+ */
7
+ import type { CanisterHealthStatus, CanisterStatusInfo, HealthThresholds, MonitoringOptions, MonitoringAlert } from './types.js';
8
+ /**
9
+ * Determine health status based on resource metrics.
10
+ *
11
+ * @param statusInfo - Canister status information
12
+ * @param thresholds - Health check thresholds
13
+ * @returns Health status
14
+ */
15
+ export declare function determineHealthStatus(statusInfo: CanisterStatusInfo, thresholds?: HealthThresholds): CanisterHealthStatus;
16
+ /**
17
+ * Generate alerts based on health status.
18
+ *
19
+ * @param statusInfo - Canister status information
20
+ * @param thresholds - Health check thresholds
21
+ * @param currentHealth - Current health status
22
+ * @returns Generated alerts
23
+ */
24
+ export declare function generateHealthAlerts(statusInfo: CanisterStatusInfo, thresholds?: HealthThresholds, currentHealth?: CanisterHealthStatus): MonitoringAlert[];
25
+ /**
26
+ * Perform a one-time health check.
27
+ *
28
+ * @param options - Monitoring options
29
+ * @returns Canister status with health status
30
+ */
31
+ export declare function checkHealth(canisterId: string, options?: Partial<MonitoringOptions>): Promise<CanisterStatusInfo>;
32
+ /**
33
+ * Check multiple canisters' health status.
34
+ *
35
+ * @param canisterIds - Array of canister IDs to check
36
+ * @param options - Monitoring options applied to all
37
+ * @returns Array of canister status info
38
+ */
39
+ export declare function checkMultipleHealth(canisterIds: string[], options?: Partial<MonitoringOptions>): Promise<CanisterStatusInfo[]>;
40
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Health Monitoring
3
+ *
4
+ * Performs health checks on canisters and determines overall health status
5
+ * based on resource usage thresholds.
6
+ */
7
+ import { getCanisterInfo } from './info.js';
8
+ /**
9
+ * Determine health status based on resource metrics.
10
+ *
11
+ * @param statusInfo - Canister status information
12
+ * @param thresholds - Health check thresholds
13
+ * @returns Health status
14
+ */
15
+ export function determineHealthStatus(statusInfo, thresholds = {}) {
16
+ // Check cycles
17
+ const cycles = statusInfo.cycles;
18
+ if (cycles !== undefined) {
19
+ if (thresholds.cyclesCritical && cycles < thresholds.cyclesCritical) {
20
+ return 'critical';
21
+ }
22
+ else if (thresholds.cyclesWarning && cycles < thresholds.cyclesWarning) {
23
+ return 'warning';
24
+ }
25
+ }
26
+ // Check memory
27
+ const memoryBytes = statusInfo.memorySize;
28
+ if (memoryBytes !== undefined) {
29
+ const memoryMB = Number(memoryBytes) / (1024 * 1024);
30
+ // IC canisters have ~4GB max memory (4096 MB)
31
+ const maxMemoryMB = 4096;
32
+ const criticalThresholdMB = maxMemoryMB * ((thresholds.memoryCriticalPercent ?? 0) / 100);
33
+ const warningThresholdMB = maxMemoryMB * ((thresholds.memoryWarningPercent ?? 0) / 100);
34
+ if (thresholds.memoryCriticalPercent && memoryMB > criticalThresholdMB) {
35
+ return 'critical';
36
+ }
37
+ else if (thresholds.memoryWarningPercent && memoryMB > warningThresholdMB) {
38
+ return 'warning';
39
+ }
40
+ }
41
+ // Check canister status
42
+ const status = statusInfo.status?.toLowerCase() ?? '';
43
+ if (status === 'stopped') {
44
+ return 'critical';
45
+ }
46
+ else if (status === 'stopping') {
47
+ return 'warning';
48
+ }
49
+ return 'healthy';
50
+ }
51
+ /**
52
+ * Generate alerts based on health status.
53
+ *
54
+ * @param statusInfo - Canister status information
55
+ * @param thresholds - Health check thresholds
56
+ * @param currentHealth - Current health status
57
+ * @returns Generated alerts
58
+ */
59
+ export function generateHealthAlerts(statusInfo, thresholds = {}, currentHealth = 'healthy') {
60
+ const alerts = [];
61
+ const cycles = statusInfo.cycles;
62
+ if (cycles !== undefined && thresholds.cyclesCritical !== undefined) {
63
+ if (cycles < thresholds.cyclesCritical) {
64
+ alerts.push({
65
+ severity: 'critical',
66
+ message: `Cycle balance critically low: ${formatCycles(cycles)}`,
67
+ canisterId: statusInfo.canisterId,
68
+ metric: 'cycles',
69
+ value: formatCycles(cycles),
70
+ threshold: formatCycles(thresholds.cyclesCritical),
71
+ timestamp: new Date(),
72
+ });
73
+ }
74
+ else if (thresholds.cyclesWarning !== undefined && cycles < thresholds.cyclesWarning) {
75
+ alerts.push({
76
+ severity: 'warning',
77
+ message: `Cycle balance low: ${formatCycles(cycles)}`,
78
+ canisterId: statusInfo.canisterId,
79
+ metric: 'cycles',
80
+ value: formatCycles(cycles),
81
+ threshold: formatCycles(thresholds.cyclesWarning),
82
+ timestamp: new Date(),
83
+ });
84
+ }
85
+ }
86
+ const memoryBytes = statusInfo.memorySize;
87
+ if (memoryBytes !== undefined) {
88
+ const memoryMB = Number(memoryBytes) / (1024 * 1024);
89
+ if (thresholds.memoryCriticalPercent !== undefined && memoryMB > 1024 * thresholds.memoryCriticalPercent) {
90
+ alerts.push({
91
+ severity: 'critical',
92
+ message: `Memory usage critically high: ${memoryMB.toFixed(2)} MB`,
93
+ canisterId: statusInfo.canisterId,
94
+ metric: 'memory',
95
+ value: `${memoryMB.toFixed(2)} MB`,
96
+ threshold: `${thresholds.memoryCriticalPercent}%`,
97
+ timestamp: new Date(),
98
+ });
99
+ }
100
+ else if (thresholds.memoryWarningPercent !== undefined && memoryMB > 1024 * thresholds.memoryWarningPercent) {
101
+ alerts.push({
102
+ severity: 'warning',
103
+ message: `Memory usage high: ${memoryMB.toFixed(2)} MB`,
104
+ canisterId: statusInfo.canisterId,
105
+ metric: 'memory',
106
+ value: `${memoryMB.toFixed(2)} MB`,
107
+ threshold: `${thresholds.memoryWarningPercent}%`,
108
+ timestamp: new Date(),
109
+ });
110
+ }
111
+ }
112
+ if (currentHealth !== 'healthy') {
113
+ alerts.push({
114
+ severity: 'warning',
115
+ message: `Canister status: ${statusInfo.status}`,
116
+ canisterId: statusInfo.canisterId,
117
+ metric: 'status',
118
+ value: statusInfo.status,
119
+ threshold: 'healthy',
120
+ timestamp: new Date(),
121
+ });
122
+ }
123
+ return alerts;
124
+ }
125
+ /**
126
+ * Format cycles bigint to human-readable string.
127
+ */
128
+ function formatCycles(cycles) {
129
+ if (cycles >= BigInt(1_000_000_000_000)) {
130
+ const value = Number(cycles) / 1_000_000_000_000;
131
+ return `${value.toFixed(2)} T`;
132
+ }
133
+ return cycles.toString();
134
+ }
135
+ /**
136
+ * Perform a one-time health check.
137
+ *
138
+ * @param options - Monitoring options
139
+ * @returns Canister status with health status
140
+ */
141
+ export async function checkHealth(canisterId, options) {
142
+ const monitoringOptions = { canister: canisterId, ...options };
143
+ const statusInfo = await getCanisterInfo(canisterId, monitoringOptions);
144
+ const health = determineHealthStatus(statusInfo, options?.thresholds ?? {});
145
+ return {
146
+ ...statusInfo,
147
+ health,
148
+ };
149
+ }
150
+ /**
151
+ * Check multiple canisters' health status.
152
+ *
153
+ * @param canisterIds - Array of canister IDs to check
154
+ * @param options - Monitoring options applied to all
155
+ * @returns Array of canister status info
156
+ */
157
+ export async function checkMultipleHealth(canisterIds, options) {
158
+ const results = await Promise.all(canisterIds.map((id) => getCanisterInfo(id, { canister: id, ...options })));
159
+ return results.map((statusInfo) => ({
160
+ ...statusInfo,
161
+ health: determineHealthStatus(statusInfo, options?.thresholds ?? {}),
162
+ }));
163
+ }
164
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Monitoring Module
3
+ *
4
+ * Provides canister health monitoring and alerting capabilities.
5
+ */
6
+ export { determineHealthStatus, generateHealthAlerts, checkHealth, checkMultipleHealth, } from './health.js';
7
+ export { getCanisterInfo, } from './info.js';
8
+ export { loadAlerts, saveAlerts, appendAlert, clearAlerts, getRecentAlerts, } from './alerting.js';
9
+ export type { CanisterHealthStatus, CanisterStatusInfo, HealthThresholds, MonitoringOptions, MonitoringAlert, AlertSeverity, ResourceUsageSnapshot, } from './types.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Monitoring Module
3
+ *
4
+ * Provides canister health monitoring and alerting capabilities.
5
+ */
6
+ // Health
7
+ export { determineHealthStatus, generateHealthAlerts, checkHealth, checkMultipleHealth, } from './health.js';
8
+ // Info
9
+ export { getCanisterInfo, } from './info.js';
10
+ // Alerting
11
+ export { loadAlerts, saveAlerts, appendAlert, clearAlerts, getRecentAlerts, } from './alerting.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Canister Information
3
+ *
4
+ * Queries canister status and metrics using icp-cli.
5
+ */
6
+ import type { CanisterStatusInfo, MonitoringOptions } from './types.js';
7
+ /**
8
+ * Get detailed canister information.
9
+ *
10
+ * @param canisterId - Canister ID to query
11
+ * @param options - Monitoring options
12
+ * @returns Canister status information
13
+ */
14
+ export declare function getCanisterInfo(canisterId: string, _options: MonitoringOptions): Promise<CanisterStatusInfo>;
15
+ //# sourceMappingURL=info.d.ts.map