agentvault 1.0.0

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 (188) hide show
  1. package/.dfx/local/network-id +4 -0
  2. package/.next/trace +2 -0
  3. package/.vercel/README.txt +11 -0
  4. package/.vercel/project.json +1 -0
  5. package/AGENTS.md +43 -0
  6. package/CHANGELOG.md +196 -0
  7. package/LICENSE +21 -0
  8. package/PLAN_VAULT_INTEGRATION.md +318 -0
  9. package/README.md +253 -0
  10. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-28-967Z.json +28 -0
  11. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-29-032Z.backup +1 -0
  12. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-373Z.json +28 -0
  13. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-428Z.backup +1 -0
  14. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-132Z.json +28 -0
  15. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-247Z.backup +1 -0
  16. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-216Z.json +28 -0
  17. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-283Z.backup +1 -0
  18. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-772Z.backup +1 -0
  19. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-793Z.json +28 -0
  20. package/backups/test-backup.json +28 -0
  21. package/dist/cli/commands/approve.d.ts +4 -0
  22. package/dist/cli/commands/approve.js +232 -0
  23. package/dist/cli/commands/archive.d.ts +4 -0
  24. package/dist/cli/commands/archive.js +192 -0
  25. package/dist/cli/commands/backup.d.ts +4 -0
  26. package/dist/cli/commands/backup.js +164 -0
  27. package/dist/cli/commands/cloud-backup.d.ts +4 -0
  28. package/dist/cli/commands/cloud-backup.js +221 -0
  29. package/dist/cli/commands/cycles.d.ts +8 -0
  30. package/dist/cli/commands/cycles.js +83 -0
  31. package/dist/cli/commands/decrypt.d.ts +16 -0
  32. package/dist/cli/commands/decrypt.js +101 -0
  33. package/dist/cli/commands/deploy.d.ts +32 -0
  34. package/dist/cli/commands/deploy.js +208 -0
  35. package/dist/cli/commands/exec.d.ts +26 -0
  36. package/dist/cli/commands/exec.js +109 -0
  37. package/dist/cli/commands/fetch.d.ts +23 -0
  38. package/dist/cli/commands/fetch.js +164 -0
  39. package/dist/cli/commands/health.d.ts +8 -0
  40. package/dist/cli/commands/health.js +72 -0
  41. package/dist/cli/commands/identity.d.ts +8 -0
  42. package/dist/cli/commands/identity.js +140 -0
  43. package/dist/cli/commands/inference.d.ts +4 -0
  44. package/dist/cli/commands/inference.js +225 -0
  45. package/dist/cli/commands/info.d.ts +8 -0
  46. package/dist/cli/commands/info.js +59 -0
  47. package/dist/cli/commands/init.d.ts +19 -0
  48. package/dist/cli/commands/init.js +135 -0
  49. package/dist/cli/commands/instrument.d.ts +8 -0
  50. package/dist/cli/commands/instrument.js +35 -0
  51. package/dist/cli/commands/list.d.ts +36 -0
  52. package/dist/cli/commands/list.js +173 -0
  53. package/dist/cli/commands/logs.d.ts +8 -0
  54. package/dist/cli/commands/logs.js +96 -0
  55. package/dist/cli/commands/monitor.d.ts +8 -0
  56. package/dist/cli/commands/monitor.js +84 -0
  57. package/dist/cli/commands/network.d.ts +14 -0
  58. package/dist/cli/commands/network.js +258 -0
  59. package/dist/cli/commands/package.d.ts +36 -0
  60. package/dist/cli/commands/package.js +188 -0
  61. package/dist/cli/commands/profile.d.ts +8 -0
  62. package/dist/cli/commands/profile.js +76 -0
  63. package/dist/cli/commands/promote.d.ts +8 -0
  64. package/dist/cli/commands/promote.js +89 -0
  65. package/dist/cli/commands/rebuild.d.ts +21 -0
  66. package/dist/cli/commands/rebuild.js +140 -0
  67. package/dist/cli/commands/rollback.d.ts +8 -0
  68. package/dist/cli/commands/rollback.js +120 -0
  69. package/dist/cli/commands/show.d.ts +36 -0
  70. package/dist/cli/commands/show.js +200 -0
  71. package/dist/cli/commands/stats.d.ts +8 -0
  72. package/dist/cli/commands/stats.js +34 -0
  73. package/dist/cli/commands/status.d.ts +14 -0
  74. package/dist/cli/commands/status.js +83 -0
  75. package/dist/cli/commands/test.d.ts +8 -0
  76. package/dist/cli/commands/test.js +109 -0
  77. package/dist/cli/commands/tokens.d.ts +8 -0
  78. package/dist/cli/commands/tokens.js +62 -0
  79. package/dist/cli/commands/trace.d.ts +8 -0
  80. package/dist/cli/commands/trace.js +68 -0
  81. package/dist/cli/commands/wallet-export.d.ts +13 -0
  82. package/dist/cli/commands/wallet-export.js +140 -0
  83. package/dist/cli/commands/wallet-history.d.ts +10 -0
  84. package/dist/cli/commands/wallet-history.js +127 -0
  85. package/dist/cli/commands/wallet-import.d.ts +10 -0
  86. package/dist/cli/commands/wallet-import.js +209 -0
  87. package/dist/cli/commands/wallet-multi-send.d.ts +17 -0
  88. package/dist/cli/commands/wallet-multi-send.js +195 -0
  89. package/dist/cli/commands/wallet-process-queue.d.ts +19 -0
  90. package/dist/cli/commands/wallet-process-queue.js +209 -0
  91. package/dist/cli/commands/wallet-sign.d.ts +13 -0
  92. package/dist/cli/commands/wallet-sign.js +207 -0
  93. package/dist/cli/commands/wallet.d.ts +12 -0
  94. package/dist/cli/commands/wallet.js +794 -0
  95. package/dist/cli/index.d.ts +10 -0
  96. package/dist/cli/index.js +96 -0
  97. package/dist/vitest.config.d.ts +3 -0
  98. package/dist/vitest.config.js +14 -0
  99. package/fixup_1_0_OSS_release.md +136 -0
  100. package/fixup_REALEASE_PRD.md +136 -0
  101. package/package.json +79 -0
  102. package/pnpm-workspace.yaml +5 -0
  103. package/scripts/dev-dashboard.mjs +84 -0
  104. package/site/README.md +63 -0
  105. package/site/docusaurus.config.ts +148 -0
  106. package/site/package-lock.json +18383 -0
  107. package/site/package.json +47 -0
  108. package/site/sidebars.ts +86 -0
  109. package/site/static/.gitkeep +0 -0
  110. package/site/static/img/logo.svg +28 -0
  111. package/site/static/img/og-image.svg +35 -0
  112. package/src/archival/archive-manager.ts +372 -0
  113. package/src/archival/arweave-client.ts +289 -0
  114. package/src/archival/index.ts +8 -0
  115. package/src/backup/backup.ts +315 -0
  116. package/src/backup/index.ts +7 -0
  117. package/src/cloud-storage/cloud-sync.ts +461 -0
  118. package/src/cloud-storage/index.ts +11 -0
  119. package/src/cloud-storage/provider-detector.ts +198 -0
  120. package/src/cloud-storage/types.ts +104 -0
  121. package/src/debugging/index.ts +6 -0
  122. package/src/debugging/logs.ts +193 -0
  123. package/src/debugging/types.ts +100 -0
  124. package/src/deployment/deployer.ts +274 -0
  125. package/src/deployment/icpClient.ts +620 -0
  126. package/src/deployment/index.ts +46 -0
  127. package/src/deployment/promotion.ts +161 -0
  128. package/src/deployment/types.ts +111 -0
  129. package/src/icp/batch.ts +374 -0
  130. package/src/icp/cycles.ts +50 -0
  131. package/src/icp/environment.ts +215 -0
  132. package/src/icp/icpcli.ts +438 -0
  133. package/src/icp/icwasm.ts +222 -0
  134. package/src/icp/identity.ts +77 -0
  135. package/src/icp/index.ts +94 -0
  136. package/src/icp/optimization.ts +242 -0
  137. package/src/icp/tokens.ts +36 -0
  138. package/src/icp/tool-detector.ts +110 -0
  139. package/src/icp/types.ts +574 -0
  140. package/src/index.ts +25 -0
  141. package/src/inference/bittensor-client.ts +304 -0
  142. package/src/inference/index.ts +8 -0
  143. package/src/inference/inference-manager.ts +327 -0
  144. package/src/metrics/index.ts +7 -0
  145. package/src/metrics/metrics.ts +186 -0
  146. package/src/monitoring/alerting.ts +190 -0
  147. package/src/monitoring/health.ts +197 -0
  148. package/src/monitoring/index.ts +38 -0
  149. package/src/monitoring/info.ts +114 -0
  150. package/src/monitoring/types.ts +99 -0
  151. package/src/network/index.ts +5 -0
  152. package/src/network/network-config.ts +129 -0
  153. package/src/packaging/compiler.ts +647 -0
  154. package/src/packaging/config-persistence.ts +135 -0
  155. package/src/packaging/config-schemas.ts +156 -0
  156. package/src/packaging/detector.ts +220 -0
  157. package/src/packaging/index.ts +90 -0
  158. package/src/packaging/packager.ts +118 -0
  159. package/src/packaging/parsers/clawdbot.ts +278 -0
  160. package/src/packaging/parsers/cline.ts +223 -0
  161. package/src/packaging/parsers/generic.ts +266 -0
  162. package/src/packaging/parsers/goose.ts +214 -0
  163. package/src/packaging/parsers/index.ts +11 -0
  164. package/src/packaging/serializer.ts +260 -0
  165. package/src/packaging/types.ts +144 -0
  166. package/src/packaging/wasmedge-compiler.ts +406 -0
  167. package/src/security/index.ts +17 -0
  168. package/src/security/multisig.ts +415 -0
  169. package/src/security/types.ts +416 -0
  170. package/src/security/vetkeys.ts +655 -0
  171. package/src/testing/index.ts +6 -0
  172. package/src/testing/local-runner.ts +264 -0
  173. package/src/testing/types.ts +104 -0
  174. package/src/wallet/cbor-serializer.ts +323 -0
  175. package/src/wallet/chain-dispatcher.ts +313 -0
  176. package/src/wallet/cross-chain-aggregator.ts +346 -0
  177. package/src/wallet/index.ts +76 -0
  178. package/src/wallet/key-derivation.ts +425 -0
  179. package/src/wallet/providers/base-provider.ts +154 -0
  180. package/src/wallet/providers/cketh-provider.ts +434 -0
  181. package/src/wallet/providers/polkadot-provider.ts +503 -0
  182. package/src/wallet/providers/solana-provider.ts +490 -0
  183. package/src/wallet/transaction-queue.ts +284 -0
  184. package/src/wallet/types.ts +178 -0
  185. package/src/wallet/vetkeys-adapter.ts +431 -0
  186. package/src/wallet/wallet-manager.ts +597 -0
  187. package/src/wallet/wallet-storage.ts +380 -0
  188. package/vercel.json +8 -0
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "agentvault-site",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "docusaurus": "docusaurus",
7
+ "start": "docusaurus start",
8
+ "build": "docusaurus build",
9
+ "swizzle": "docusaurus swizzle",
10
+ "deploy": "docusaurus deploy",
11
+ "clear": "docusaurus clear",
12
+ "serve": "docusaurus serve",
13
+ "write-translations": "docusaurus write-translations",
14
+ "write-heading-ids": "docusaurus write-heading-ids",
15
+ "typecheck": "tsc"
16
+ },
17
+ "dependencies": {
18
+ "@docusaurus/core": "^3.9.2",
19
+ "@docusaurus/preset-classic": "^3.9.2",
20
+ "@mdx-js/react": "^3.0.0",
21
+ "clsx": "^2.0.0",
22
+ "prism-react-renderer": "^2.3.0",
23
+ "react": "^18.0.0",
24
+ "react-dom": "^18.0.0"
25
+ },
26
+ "devDependencies": {
27
+ "@docusaurus/module-type-aliases": "^3.9.2",
28
+ "@docusaurus/tsconfig": "^3.9.2",
29
+ "@docusaurus/types": "^3.9.2",
30
+ "typescript": "~5.6.2"
31
+ },
32
+ "browserslist": {
33
+ "production": [
34
+ ">0.5%",
35
+ "not dead",
36
+ "not op_mini all"
37
+ ],
38
+ "development": [
39
+ "last 3 chrome version",
40
+ "last 3 firefox version",
41
+ "last 5 safari version"
42
+ ]
43
+ },
44
+ "engines": {
45
+ "node": ">=18.0"
46
+ }
47
+ }
@@ -0,0 +1,86 @@
1
+ import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
2
+
3
+ const sidebars: SidebarsConfig = {
4
+ docsSidebar: [
5
+ {
6
+ type: 'doc',
7
+ id: 'index',
8
+ label: 'Introduction',
9
+ },
10
+ {
11
+ type: 'category',
12
+ label: 'Core Hierarchy',
13
+ items: [
14
+ 'getting-started/installation',
15
+ 'getting-started/quick-start',
16
+ 'getting-started/configuration',
17
+ ],
18
+ },
19
+ {
20
+ type: 'category',
21
+ label: 'Sovereign Operations',
22
+ items: [
23
+ 'user/tutorial-v1.0',
24
+ 'user/deployment',
25
+ 'user/wallets',
26
+ 'user/backups',
27
+ 'user/webapp',
28
+ 'user/troubleshooting',
29
+ 'user/clawdbot-claude-skill',
30
+ ],
31
+ },
32
+ {
33
+ type: 'category',
34
+ label: 'Command Protocols',
35
+ items: [
36
+ 'cli/reference',
37
+ 'cli/options',
38
+ ],
39
+ },
40
+ {
41
+ type: 'category',
42
+ label: 'Guardian Layer',
43
+ items: [
44
+ 'security/overview',
45
+ 'security/best-practices',
46
+ ],
47
+ },
48
+ {
49
+ type: 'category',
50
+ label: 'System Cartography',
51
+ items: [
52
+ 'architecture/overview',
53
+ 'architecture/modules',
54
+ 'architecture/canister',
55
+ ],
56
+ },
57
+ {
58
+ type: 'category',
59
+ label: 'Builder Notes',
60
+ items: [
61
+ 'development/contributing',
62
+ 'development/testing',
63
+ ],
64
+ },
65
+ {
66
+ type: 'category',
67
+ label: 'Advanced Rituals',
68
+ items: [
69
+ 'guides/monitoring',
70
+ 'guides/advanced/promotion',
71
+ 'guides/advanced/rollback',
72
+ ],
73
+ },
74
+ {
75
+ type: 'category',
76
+ label: 'Archive',
77
+ items: [
78
+ 'dev/SECURITY_AUDIT',
79
+ 'marketing/release-notes',
80
+ 'PRD',
81
+ ],
82
+ },
83
+ ],
84
+ };
85
+
86
+ export default sidebars;
File without changes
@@ -0,0 +1,28 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-labelledby="title desc">
2
+ <title id="title">Agent Vault Logo</title>
3
+ <desc id="desc">Neon framed AV monogram</desc>
4
+ <defs>
5
+ <linearGradient id="ring" x1="0%" y1="0%" x2="100%" y2="100%">
6
+ <stop offset="0%" stop-color="#22d3ee" />
7
+ <stop offset="52%" stop-color="#8b5cf6" />
8
+ <stop offset="100%" stop-color="#ec4899" />
9
+ </linearGradient>
10
+ <filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
11
+ <feGaussianBlur stdDeviation="2.6" result="blur" />
12
+ <feMerge>
13
+ <feMergeNode in="blur" />
14
+ <feMergeNode in="SourceGraphic" />
15
+ </feMerge>
16
+ </filter>
17
+ </defs>
18
+
19
+ <rect width="128" height="128" rx="18" fill="#060811" />
20
+ <rect x="10" y="10" width="108" height="108" rx="14" fill="none" stroke="url(#ring)" stroke-width="4" filter="url(#glow)" />
21
+
22
+ <path d="M33 90L50 38H60L77 90H66L62 78H48L44 90Z" fill="#eff7ff" />
23
+ <path d="M51 68H59L55 53Z" fill="#0a1222" />
24
+ <path d="M79 38H96L87 90H72L66 62H77L82 80L86 56H79Z" fill="#eff7ff" />
25
+
26
+ <circle cx="21" cy="21" r="2" fill="#22d3ee" opacity="0.7" />
27
+ <circle cx="107" cy="104" r="2" fill="#ec4899" opacity="0.7" />
28
+ </svg>
@@ -0,0 +1,35 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 630" role="img" aria-labelledby="title desc">
2
+ <title id="title">Agent Vault Open Graph Image</title>
3
+ <desc id="desc">Agent Vault branding for social previews</desc>
4
+ <defs>
5
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
6
+ <stop offset="0%" stop-color="#05070f" />
7
+ <stop offset="55%" stop-color="#0b1020" />
8
+ <stop offset="100%" stop-color="#07111e" />
9
+ </linearGradient>
10
+ <linearGradient id="line" x1="0%" y1="0%" x2="100%" y2="100%">
11
+ <stop offset="0%" stop-color="#22d3ee" />
12
+ <stop offset="50%" stop-color="#8b5cf6" />
13
+ <stop offset="100%" stop-color="#ec4899" />
14
+ </linearGradient>
15
+ <pattern id="grid" width="48" height="48" patternUnits="userSpaceOnUse" patternTransform="rotate(40)">
16
+ <line x1="0" y1="0" x2="0" y2="48" stroke="#2a3550" stroke-opacity="0.26" stroke-width="1" />
17
+ </pattern>
18
+ </defs>
19
+
20
+ <rect width="1200" height="630" fill="url(#bg)" />
21
+ <rect width="1200" height="630" fill="url(#grid)" />
22
+
23
+ <rect x="82" y="72" width="104" height="104" rx="16" fill="#060811" stroke="url(#line)" stroke-width="4" />
24
+ <path d="M110 146L124 92H133L147 146H138L135 136H122L119 146Z" fill="#eff7ff" />
25
+ <path d="M124 128H132L128 113Z" fill="#0a1222" />
26
+ <path d="M150 92H164L157 146H145L140 124H149L153 136L156 108H150Z" fill="#eff7ff" />
27
+
28
+ <text x="210" y="136" fill="#d5e7ff" font-family="Inter, Arial, sans-serif" font-size="40" letter-spacing="8">AGENT_VAULT_V1</text>
29
+ <text x="82" y="302" fill="#ffffff" font-family="Inter, Arial, sans-serif" font-size="116" font-weight="800" letter-spacing="6">AGENT VAULT</text>
30
+ <text x="82" y="372" fill="#22d3ee" font-family="Inter, Arial, sans-serif" font-size="34" letter-spacing="6">NEURAL SOVEREIGNTY</text>
31
+ <text x="82" y="440" fill="#b8c9e6" font-family="Inter, Arial, sans-serif" font-size="34">Protecting your agent's neural sovereignty through cryptographic decentralization.</text>
32
+
33
+ <line x1="82" y1="492" x2="1118" y2="492" stroke="url(#line)" stroke-opacity="0.6" stroke-width="2" />
34
+ <text x="82" y="550" fill="#c4d3ee" font-family="Inter, Arial, sans-serif" font-size="28">github.com/johnnyclem/agentvault</text>
35
+ </svg>
@@ -0,0 +1,372 @@
1
+ /**
2
+ * Archive Manager
3
+ *
4
+ * Manages archiving of agent data to Arweave.
5
+ * Handles metadata tracking, batch uploads, and retrieval.
6
+ */
7
+
8
+ import fs from 'node:fs';
9
+ import path from 'node:path';
10
+ import os from 'node:os';
11
+ import crypto from 'node:crypto';
12
+ import { parse, stringify } from 'yaml';
13
+
14
+ const AGENTVAULT_DIR = path.join(os.homedir(), '.agentvault');
15
+ const ARCHIVES_DIR = path.join(AGENTVAULT_DIR, 'archives');
16
+ const ARCHIVE_INDEX_PATH = path.join(ARCHIVES_DIR, 'index.yaml');
17
+
18
+ export interface ArchiveMetadata {
19
+ id: string;
20
+ agentName: string;
21
+ agentVersion: string;
22
+ transactionId?: string;
23
+ timestamp: Date;
24
+ sizeBytes: number;
25
+ checksum: string;
26
+ tags: Record<string, string>;
27
+ status: 'pending' | 'uploading' | 'confirmed' | 'failed';
28
+ blockHeight?: number;
29
+ }
30
+
31
+ export interface ArchiveOptions {
32
+ includeConfig?: boolean;
33
+ includeLogs?: boolean;
34
+ includeMetrics?: boolean;
35
+ tags?: Record<string, string>;
36
+ }
37
+
38
+ export interface ArchiveResult {
39
+ success: boolean;
40
+ archiveId?: string;
41
+ transactionId?: string;
42
+ error?: string;
43
+ }
44
+
45
+ function ensureArchivesDir(): void {
46
+ if (!fs.existsSync(AGENTVAULT_DIR)) {
47
+ fs.mkdirSync(AGENTVAULT_DIR, { recursive: true });
48
+ }
49
+ if (!fs.existsSync(ARCHIVES_DIR)) {
50
+ fs.mkdirSync(ARCHIVES_DIR, { recursive: true });
51
+ }
52
+ }
53
+
54
+ function getIndex(): ArchiveMetadata[] {
55
+ if (!fs.existsSync(ARCHIVE_INDEX_PATH)) {
56
+ return [];
57
+ }
58
+
59
+ try {
60
+ const content = fs.readFileSync(ARCHIVE_INDEX_PATH, 'utf8');
61
+ const parsed = parse(content) as unknown;
62
+
63
+ if (Array.isArray(parsed)) {
64
+ return parsed.map((item) => ({
65
+ ...item,
66
+ timestamp: new Date(item.timestamp),
67
+ })) as ArchiveMetadata[];
68
+ }
69
+
70
+ return [];
71
+ } catch (error) {
72
+ console.error('Failed to load archive index:', error);
73
+ return [];
74
+ }
75
+ }
76
+
77
+ function saveIndex(index: ArchiveMetadata[]): void {
78
+ ensureArchivesDir();
79
+ fs.writeFileSync(ARCHIVE_INDEX_PATH, stringify(index), 'utf8');
80
+ }
81
+
82
+ function generateChecksum(data: string | Buffer): string {
83
+ return crypto.createHash('sha256').update(data).digest('hex');
84
+ }
85
+
86
+ function generateArchiveId(): string {
87
+ return `archive-${Date.now()}-${crypto.randomBytes(4).toString('hex')}`;
88
+ }
89
+
90
+ /**
91
+ * Archive agent data to local storage (for later upload)
92
+ */
93
+ export function prepareArchive(
94
+ agentName: string,
95
+ agentVersion: string,
96
+ data: Record<string, any>,
97
+ options: ArchiveOptions = {},
98
+ ): ArchiveResult {
99
+ try {
100
+ ensureArchivesDir();
101
+
102
+ const archiveId = generateArchiveId();
103
+ const timestamp = new Date();
104
+ const dataStr = JSON.stringify(data);
105
+ const checksum = generateChecksum(dataStr);
106
+
107
+ const metadata: ArchiveMetadata = {
108
+ id: archiveId,
109
+ agentName,
110
+ agentVersion,
111
+ timestamp,
112
+ sizeBytes: Buffer.byteLength(dataStr),
113
+ checksum,
114
+ tags: {
115
+ 'agent-name': agentName,
116
+ 'agent-version': agentVersion,
117
+ 'content-type': 'application/json',
118
+ ...options.tags,
119
+ },
120
+ status: 'pending',
121
+ };
122
+
123
+ const archivePath = path.join(ARCHIVES_DIR, `${archiveId}.json`);
124
+ fs.writeFileSync(archivePath, dataStr, 'utf8');
125
+
126
+ const index = getIndex();
127
+ index.push(metadata);
128
+ saveIndex(index);
129
+
130
+ return {
131
+ success: true,
132
+ archiveId,
133
+ };
134
+ } catch (error) {
135
+ return {
136
+ success: false,
137
+ error: error instanceof Error ? error.message : 'Unknown error',
138
+ };
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Mark archive as uploading
144
+ */
145
+ export function markArchiveUploading(archiveId: string): boolean {
146
+ try {
147
+ const index = getIndex();
148
+ const archive = index.find((a) => a.id === archiveId);
149
+
150
+ if (!archive) {
151
+ return false;
152
+ }
153
+
154
+ archive.status = 'uploading';
155
+ saveIndex(index);
156
+
157
+ return true;
158
+ } catch (error) {
159
+ console.error('Failed to mark archive as uploading:', error);
160
+ return false;
161
+ }
162
+ }
163
+
164
+ /**
165
+ * Update archive with transaction ID
166
+ */
167
+ export function updateArchiveTransaction(
168
+ archiveId: string,
169
+ transactionId: string,
170
+ ): boolean {
171
+ try {
172
+ const index = getIndex();
173
+ const archive = index.find((a) => a.id === archiveId);
174
+
175
+ if (!archive) {
176
+ return false;
177
+ }
178
+
179
+ archive.transactionId = transactionId;
180
+ archive.status = 'pending';
181
+ saveIndex(index);
182
+
183
+ return true;
184
+ } catch (error) {
185
+ console.error('Failed to update archive transaction:', error);
186
+ return false;
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Mark archive as confirmed
192
+ */
193
+ export function confirmArchive(
194
+ archiveId: string,
195
+ blockHeight?: number,
196
+ ): boolean {
197
+ try {
198
+ const index = getIndex();
199
+ const archive = index.find((a) => a.id === archiveId);
200
+
201
+ if (!archive) {
202
+ return false;
203
+ }
204
+
205
+ archive.status = 'confirmed';
206
+ if (blockHeight) {
207
+ archive.blockHeight = blockHeight;
208
+ }
209
+ saveIndex(index);
210
+
211
+ return true;
212
+ } catch (error) {
213
+ console.error('Failed to confirm archive:', error);
214
+ return false;
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Mark archive as failed
220
+ */
221
+ export function failArchive(archiveId: string, error?: string): boolean {
222
+ try {
223
+ const index = getIndex();
224
+ const archive = index.find((a) => a.id === archiveId);
225
+
226
+ if (!archive) {
227
+ return false;
228
+ }
229
+
230
+ archive.status = 'failed';
231
+ if (error) {
232
+ archive.tags['error'] = error;
233
+ }
234
+ saveIndex(index);
235
+
236
+ return true;
237
+ } catch (err) {
238
+ console.error('Failed to mark archive as failed:', err);
239
+ return false;
240
+ }
241
+ }
242
+
243
+ /**
244
+ * Get archive metadata by ID
245
+ */
246
+ export function getArchive(archiveId: string): ArchiveMetadata | null {
247
+ try {
248
+ const index = getIndex();
249
+ return index.find((a) => a.id === archiveId) || null;
250
+ } catch (error) {
251
+ console.error('Failed to get archive:', error);
252
+ return null;
253
+ }
254
+ }
255
+
256
+ /**
257
+ * List all archives for an agent
258
+ */
259
+ export function listArchives(agentName?: string): ArchiveMetadata[] {
260
+ try {
261
+ const index = getIndex();
262
+ if (agentName) {
263
+ return index.filter((a) => a.agentName === agentName);
264
+ }
265
+ return index;
266
+ } catch (error) {
267
+ console.error('Failed to list archives:', error);
268
+ return [];
269
+ }
270
+ }
271
+
272
+ /**
273
+ * List pending archives (ready for upload)
274
+ */
275
+ export function listPendingArchives(): ArchiveMetadata[] {
276
+ try {
277
+ const index = getIndex();
278
+ return index.filter((a) => a.status === 'pending');
279
+ } catch (error) {
280
+ console.error('Failed to list pending archives:', error);
281
+ return [];
282
+ }
283
+ }
284
+
285
+ /**
286
+ * Get archive data by ID
287
+ */
288
+ export function getArchiveData(archiveId: string): Record<string, any> | null {
289
+ try {
290
+ const archivePath = path.join(ARCHIVES_DIR, `${archiveId}.json`);
291
+ if (!fs.existsSync(archivePath)) {
292
+ return null;
293
+ }
294
+
295
+ const content = fs.readFileSync(archivePath, 'utf8');
296
+ return JSON.parse(content);
297
+ } catch (error) {
298
+ console.error('Failed to get archive data:', error);
299
+ return null;
300
+ }
301
+ }
302
+
303
+ /**
304
+ * Delete archive (local storage only, does not affect Arweave)
305
+ */
306
+ export function deleteArchive(archiveId: string): boolean {
307
+ try {
308
+ const index = getIndex();
309
+ const archiveIndex = index.findIndex((a) => a.id === archiveId);
310
+
311
+ if (archiveIndex === -1) {
312
+ return false;
313
+ }
314
+
315
+ const archivePath = path.join(ARCHIVES_DIR, `${archiveId}.json`);
316
+ if (fs.existsSync(archivePath)) {
317
+ fs.unlinkSync(archivePath);
318
+ }
319
+
320
+ index.splice(archiveIndex, 1);
321
+ saveIndex(index);
322
+
323
+ return true;
324
+ } catch (error) {
325
+ console.error('Failed to delete archive:', error);
326
+ return false;
327
+ }
328
+ }
329
+
330
+ /**
331
+ * Get archive statistics
332
+ */
333
+ export function getArchiveStats(agentName?: string): {
334
+ total: number;
335
+ confirmed: number;
336
+ pending: number;
337
+ failed: number;
338
+ totalBytes: number;
339
+ } {
340
+ const archives = listArchives(agentName);
341
+
342
+ return {
343
+ total: archives.length,
344
+ confirmed: archives.filter((a) => a.status === 'confirmed').length,
345
+ pending: archives.filter((a) => a.status === 'pending').length,
346
+ failed: archives.filter((a) => a.status === 'failed').length,
347
+ totalBytes: archives.reduce((sum, a) => sum + a.sizeBytes, 0),
348
+ };
349
+ }
350
+
351
+ /**
352
+ * Verify archive checksum
353
+ */
354
+ export function verifyArchive(archiveId: string): boolean {
355
+ try {
356
+ const metadata = getArchive(archiveId);
357
+ if (!metadata) {
358
+ return false;
359
+ }
360
+
361
+ const data = getArchiveData(archiveId);
362
+ if (!data) {
363
+ return false;
364
+ }
365
+
366
+ const actualChecksum = generateChecksum(JSON.stringify(data));
367
+ return actualChecksum === metadata.checksum;
368
+ } catch (error) {
369
+ console.error('Failed to verify archive:', error);
370
+ return false;
371
+ }
372
+ }