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,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