@terminals-tech/agent-zero 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 (263) hide show
  1. package/README.md +209 -0
  2. package/bin/agent-zero.js +332 -0
  3. package/dist/agency/commandRouter.d.ts +48 -0
  4. package/dist/agency/commandRouter.d.ts.map +1 -0
  5. package/dist/agency/commandRouter.js +343 -0
  6. package/dist/agency/commandRouter.js.map +1 -0
  7. package/dist/agency/runtime.d.ts +66 -0
  8. package/dist/agency/runtime.d.ts.map +1 -0
  9. package/dist/agency/runtime.js +247 -0
  10. package/dist/agency/runtime.js.map +1 -0
  11. package/dist/agency/summaryGenerator.d.ts +39 -0
  12. package/dist/agency/summaryGenerator.d.ts.map +1 -0
  13. package/dist/agency/summaryGenerator.js +110 -0
  14. package/dist/agency/summaryGenerator.js.map +1 -0
  15. package/dist/agency/summaryScheduler.d.ts +33 -0
  16. package/dist/agency/summaryScheduler.d.ts.map +1 -0
  17. package/dist/agency/summaryScheduler.js +68 -0
  18. package/dist/agency/summaryScheduler.js.map +1 -0
  19. package/dist/browser/agent-runtime/RuntimePanel.d.ts +20 -0
  20. package/dist/browser/agent-runtime/RuntimePanel.d.ts.map +1 -0
  21. package/dist/browser/agent-runtime/RuntimePanel.js +203 -0
  22. package/dist/browser/agent-runtime/RuntimePanel.js.map +1 -0
  23. package/dist/browser/agent-runtime/config.d.ts +28 -0
  24. package/dist/browser/agent-runtime/config.d.ts.map +1 -0
  25. package/dist/browser/agent-runtime/config.js +50 -0
  26. package/dist/browser/agent-runtime/config.js.map +1 -0
  27. package/dist/browser/agent-runtime/launcher.d.ts +71 -0
  28. package/dist/browser/agent-runtime/launcher.d.ts.map +1 -0
  29. package/dist/browser/agent-runtime/launcher.js +167 -0
  30. package/dist/browser/agent-runtime/launcher.js.map +1 -0
  31. package/dist/browser/rail-auth-bridge.d.ts +85 -0
  32. package/dist/browser/rail-auth-bridge.d.ts.map +1 -0
  33. package/dist/browser/rail-auth-bridge.js +209 -0
  34. package/dist/browser/rail-auth-bridge.js.map +1 -0
  35. package/dist/channels/index.d.ts +13 -0
  36. package/dist/channels/index.d.ts.map +1 -0
  37. package/dist/channels/index.js +12 -0
  38. package/dist/channels/index.js.map +1 -0
  39. package/dist/channels/moltbook.d.ts +114 -0
  40. package/dist/channels/moltbook.d.ts.map +1 -0
  41. package/dist/channels/moltbook.js +348 -0
  42. package/dist/channels/moltbook.js.map +1 -0
  43. package/dist/channels/sms.d.ts +33 -0
  44. package/dist/channels/sms.d.ts.map +1 -0
  45. package/dist/channels/sms.js +160 -0
  46. package/dist/channels/sms.js.map +1 -0
  47. package/dist/channels/telegram.d.ts +47 -0
  48. package/dist/channels/telegram.d.ts.map +1 -0
  49. package/dist/channels/telegram.js +276 -0
  50. package/dist/channels/telegram.js.map +1 -0
  51. package/dist/channels/twitter.d.ts +93 -0
  52. package/dist/channels/twitter.d.ts.map +1 -0
  53. package/dist/channels/twitter.js +411 -0
  54. package/dist/channels/twitter.js.map +1 -0
  55. package/dist/channels/whatsapp.d.ts +77 -0
  56. package/dist/channels/whatsapp.d.ts.map +1 -0
  57. package/dist/channels/whatsapp.js +514 -0
  58. package/dist/channels/whatsapp.js.map +1 -0
  59. package/dist/checkout/index.d.ts +92 -0
  60. package/dist/checkout/index.d.ts.map +1 -0
  61. package/dist/checkout/index.js +125 -0
  62. package/dist/checkout/index.js.map +1 -0
  63. package/dist/cli/moltbook.d.ts +11 -0
  64. package/dist/cli/moltbook.d.ts.map +1 -0
  65. package/dist/cli/moltbook.js +259 -0
  66. package/dist/cli/moltbook.js.map +1 -0
  67. package/dist/cli/setup.d.ts +10 -0
  68. package/dist/cli/setup.d.ts.map +1 -0
  69. package/dist/cli/setup.js +232 -0
  70. package/dist/cli/setup.js.map +1 -0
  71. package/dist/coherence/absorption.d.ts +141 -0
  72. package/dist/coherence/absorption.d.ts.map +1 -0
  73. package/dist/coherence/absorption.js +343 -0
  74. package/dist/coherence/absorption.js.map +1 -0
  75. package/dist/coherence/crossPlatform.d.ts +55 -0
  76. package/dist/coherence/crossPlatform.d.ts.map +1 -0
  77. package/dist/coherence/crossPlatform.js +219 -0
  78. package/dist/coherence/crossPlatform.js.map +1 -0
  79. package/dist/coherence/identityResolver.d.ts +27 -0
  80. package/dist/coherence/identityResolver.d.ts.map +1 -0
  81. package/dist/coherence/identityResolver.js +102 -0
  82. package/dist/coherence/identityResolver.js.map +1 -0
  83. package/dist/identity/burner.d.ts +100 -0
  84. package/dist/identity/burner.d.ts.map +1 -0
  85. package/dist/identity/burner.js +256 -0
  86. package/dist/identity/burner.js.map +1 -0
  87. package/dist/identity/burnerScheduler.d.ts +18 -0
  88. package/dist/identity/burnerScheduler.d.ts.map +1 -0
  89. package/dist/identity/burnerScheduler.js +82 -0
  90. package/dist/identity/burnerScheduler.js.map +1 -0
  91. package/dist/identity/moltbookBurnerAdapter.d.ts +14 -0
  92. package/dist/identity/moltbookBurnerAdapter.d.ts.map +1 -0
  93. package/dist/identity/moltbookBurnerAdapter.js +82 -0
  94. package/dist/identity/moltbookBurnerAdapter.js.map +1 -0
  95. package/dist/identity/operationalVault.d.ts +108 -0
  96. package/dist/identity/operationalVault.d.ts.map +1 -0
  97. package/dist/identity/operationalVault.js +259 -0
  98. package/dist/identity/operationalVault.js.map +1 -0
  99. package/dist/index.d.ts +43 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +57 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/moltbook/apiErrorHandler.d.ts +48 -0
  104. package/dist/moltbook/apiErrorHandler.d.ts.map +1 -0
  105. package/dist/moltbook/apiErrorHandler.js +125 -0
  106. package/dist/moltbook/apiErrorHandler.js.map +1 -0
  107. package/dist/moltbook/approvalGate.d.ts +81 -0
  108. package/dist/moltbook/approvalGate.d.ts.map +1 -0
  109. package/dist/moltbook/approvalGate.js +211 -0
  110. package/dist/moltbook/approvalGate.js.map +1 -0
  111. package/dist/moltbook/attentionField.d.ts +55 -0
  112. package/dist/moltbook/attentionField.d.ts.map +1 -0
  113. package/dist/moltbook/attentionField.js +163 -0
  114. package/dist/moltbook/attentionField.js.map +1 -0
  115. package/dist/moltbook/contentEnhancer.d.ts +28 -0
  116. package/dist/moltbook/contentEnhancer.d.ts.map +1 -0
  117. package/dist/moltbook/contentEnhancer.js +129 -0
  118. package/dist/moltbook/contentEnhancer.js.map +1 -0
  119. package/dist/moltbook/daemon.d.ts +111 -0
  120. package/dist/moltbook/daemon.d.ts.map +1 -0
  121. package/dist/moltbook/daemon.js +497 -0
  122. package/dist/moltbook/daemon.js.map +1 -0
  123. package/dist/moltbook/observer.d.ts +44 -0
  124. package/dist/moltbook/observer.d.ts.map +1 -0
  125. package/dist/moltbook/observer.js +71 -0
  126. package/dist/moltbook/observer.js.map +1 -0
  127. package/dist/moltbook/responseComposer.d.ts +54 -0
  128. package/dist/moltbook/responseComposer.d.ts.map +1 -0
  129. package/dist/moltbook/responseComposer.js +233 -0
  130. package/dist/moltbook/responseComposer.js.map +1 -0
  131. package/dist/openclaw/gateway.d.ts +45 -0
  132. package/dist/openclaw/gateway.d.ts.map +1 -0
  133. package/dist/openclaw/gateway.js +139 -0
  134. package/dist/openclaw/gateway.js.map +1 -0
  135. package/dist/openclaw/skill.d.ts +185 -0
  136. package/dist/openclaw/skill.d.ts.map +1 -0
  137. package/dist/openclaw/skill.js +297 -0
  138. package/dist/openclaw/skill.js.map +1 -0
  139. package/dist/primitives/index.d.ts +23 -0
  140. package/dist/primitives/index.d.ts.map +1 -0
  141. package/dist/primitives/index.js +27 -0
  142. package/dist/primitives/index.js.map +1 -0
  143. package/dist/primitives/types.d.ts +673 -0
  144. package/dist/primitives/types.d.ts.map +1 -0
  145. package/dist/primitives/types.js +205 -0
  146. package/dist/primitives/types.js.map +1 -0
  147. package/dist/rail/absorptionBridge.d.ts +47 -0
  148. package/dist/rail/absorptionBridge.d.ts.map +1 -0
  149. package/dist/rail/absorptionBridge.js +78 -0
  150. package/dist/rail/absorptionBridge.js.map +1 -0
  151. package/dist/rail/authProtocol.d.ts +32 -0
  152. package/dist/rail/authProtocol.d.ts.map +1 -0
  153. package/dist/rail/authProtocol.js +83 -0
  154. package/dist/rail/authProtocol.js.map +1 -0
  155. package/dist/rail/clientRateLimiter.d.ts +17 -0
  156. package/dist/rail/clientRateLimiter.d.ts.map +1 -0
  157. package/dist/rail/clientRateLimiter.js +64 -0
  158. package/dist/rail/clientRateLimiter.js.map +1 -0
  159. package/dist/rail/index.d.ts +8 -0
  160. package/dist/rail/index.d.ts.map +1 -0
  161. package/dist/rail/index.js +38 -0
  162. package/dist/rail/index.js.map +1 -0
  163. package/dist/rail/jwtVerifier.d.ts +11 -0
  164. package/dist/rail/jwtVerifier.d.ts.map +1 -0
  165. package/dist/rail/jwtVerifier.js +55 -0
  166. package/dist/rail/jwtVerifier.js.map +1 -0
  167. package/dist/rail/logger.d.ts +13 -0
  168. package/dist/rail/logger.d.ts.map +1 -0
  169. package/dist/rail/logger.js +29 -0
  170. package/dist/rail/logger.js.map +1 -0
  171. package/dist/rail/metadataBroadcaster.d.ts +53 -0
  172. package/dist/rail/metadataBroadcaster.d.ts.map +1 -0
  173. package/dist/rail/metadataBroadcaster.js +126 -0
  174. package/dist/rail/metadataBroadcaster.js.map +1 -0
  175. package/dist/rail/persistence.d.ts +57 -0
  176. package/dist/rail/persistence.d.ts.map +1 -0
  177. package/dist/rail/persistence.js +103 -0
  178. package/dist/rail/persistence.js.map +1 -0
  179. package/dist/rail/securityMonitor.d.ts +23 -0
  180. package/dist/rail/securityMonitor.d.ts.map +1 -0
  181. package/dist/rail/securityMonitor.js +52 -0
  182. package/dist/rail/securityMonitor.js.map +1 -0
  183. package/dist/rail/server.d.ts +186 -0
  184. package/dist/rail/server.d.ts.map +1 -0
  185. package/dist/rail/server.js +568 -0
  186. package/dist/rail/server.js.map +1 -0
  187. package/dist/rail/userSessionManager.d.ts +29 -0
  188. package/dist/rail/userSessionManager.d.ts.map +1 -0
  189. package/dist/rail/userSessionManager.js +87 -0
  190. package/dist/rail/userSessionManager.js.map +1 -0
  191. package/dist/rail/wsServer.d.ts +39 -0
  192. package/dist/rail/wsServer.d.ts.map +1 -0
  193. package/dist/rail/wsServer.js +544 -0
  194. package/dist/rail/wsServer.js.map +1 -0
  195. package/dist/resonance/globalKuramoto.d.ts +67 -0
  196. package/dist/resonance/globalKuramoto.d.ts.map +1 -0
  197. package/dist/resonance/globalKuramoto.js +161 -0
  198. package/dist/resonance/globalKuramoto.js.map +1 -0
  199. package/dist/resonance/index.d.ts +12 -0
  200. package/dist/resonance/index.d.ts.map +1 -0
  201. package/dist/resonance/index.js +9 -0
  202. package/dist/resonance/index.js.map +1 -0
  203. package/dist/resonance/kuramoto.d.ts +118 -0
  204. package/dist/resonance/kuramoto.d.ts.map +1 -0
  205. package/dist/resonance/kuramoto.js +212 -0
  206. package/dist/resonance/kuramoto.js.map +1 -0
  207. package/dist/routing/distributedRouter.d.ts +84 -0
  208. package/dist/routing/distributedRouter.d.ts.map +1 -0
  209. package/dist/routing/distributedRouter.js +209 -0
  210. package/dist/routing/distributedRouter.js.map +1 -0
  211. package/dist/routing/index.d.ts +8 -0
  212. package/dist/routing/index.d.ts.map +1 -0
  213. package/dist/routing/index.js +7 -0
  214. package/dist/routing/index.js.map +1 -0
  215. package/dist/routing/thermodynamic.d.ts +91 -0
  216. package/dist/routing/thermodynamic.d.ts.map +1 -0
  217. package/dist/routing/thermodynamic.js +184 -0
  218. package/dist/routing/thermodynamic.js.map +1 -0
  219. package/dist/runtime/agent-zero.d.ts +138 -0
  220. package/dist/runtime/agent-zero.d.ts.map +1 -0
  221. package/dist/runtime/agent-zero.js +435 -0
  222. package/dist/runtime/agent-zero.js.map +1 -0
  223. package/dist/runtime/index.d.ts +13 -0
  224. package/dist/runtime/index.d.ts.map +1 -0
  225. package/dist/runtime/index.js +15 -0
  226. package/dist/runtime/index.js.map +1 -0
  227. package/dist/security/capabilities.d.ts +178 -0
  228. package/dist/security/capabilities.d.ts.map +1 -0
  229. package/dist/security/capabilities.js +270 -0
  230. package/dist/security/capabilities.js.map +1 -0
  231. package/dist/security/channelFirewallMiddleware.d.ts +22 -0
  232. package/dist/security/channelFirewallMiddleware.d.ts.map +1 -0
  233. package/dist/security/channelFirewallMiddleware.js +52 -0
  234. package/dist/security/channelFirewallMiddleware.js.map +1 -0
  235. package/dist/security/index.d.ts +11 -0
  236. package/dist/security/index.d.ts.map +1 -0
  237. package/dist/security/index.js +11 -0
  238. package/dist/security/index.js.map +1 -0
  239. package/dist/security/injectionFirewall.d.ts +47 -0
  240. package/dist/security/injectionFirewall.d.ts.map +1 -0
  241. package/dist/security/injectionFirewall.js +262 -0
  242. package/dist/security/injectionFirewall.js.map +1 -0
  243. package/dist/security/outputSanitizer.d.ts +28 -0
  244. package/dist/security/outputSanitizer.d.ts.map +1 -0
  245. package/dist/security/outputSanitizer.js +66 -0
  246. package/dist/security/outputSanitizer.js.map +1 -0
  247. package/dist/security/sandbox.d.ts +192 -0
  248. package/dist/security/sandbox.d.ts.map +1 -0
  249. package/dist/security/sandbox.js +359 -0
  250. package/dist/security/sandbox.js.map +1 -0
  251. package/dist/security/skillVerify.d.ts +128 -0
  252. package/dist/security/skillVerify.d.ts.map +1 -0
  253. package/dist/security/skillVerify.js +220 -0
  254. package/dist/security/skillVerify.js.map +1 -0
  255. package/dist/security/vault.d.ts +60 -0
  256. package/dist/security/vault.d.ts.map +1 -0
  257. package/dist/security/vault.js +522 -0
  258. package/dist/security/vault.js.map +1 -0
  259. package/dist/utils/persistentRateLimiter.d.ts +69 -0
  260. package/dist/utils/persistentRateLimiter.d.ts.map +1 -0
  261. package/dist/utils/persistentRateLimiter.js +128 -0
  262. package/dist/utils/persistentRateLimiter.js.map +1 -0
  263. package/package.json +95 -0
@@ -0,0 +1,220 @@
1
+ import { createHash, generateKeyPairSync, sign, verify } from 'node:crypto';
2
+ import { readFile, readdir, stat } from 'node:fs/promises';
3
+ import { join, relative } from 'node:path';
4
+ import { z } from 'zod';
5
+ // ============================================================================
6
+ // SCHEMAS
7
+ // ============================================================================
8
+ const FileHashSchema = z.object({
9
+ path: z.string(),
10
+ sha256: z.string().regex(/^[a-f0-9]{64}$/)
11
+ });
12
+ export const SkillManifestSchema = z.object({
13
+ name: z.string(),
14
+ version: z.string(),
15
+ files: z.array(FileHashSchema),
16
+ timestamp: z.number(),
17
+ publicKey: z.string()
18
+ });
19
+ export const SignedManifestSchema = SkillManifestSchema.extend({
20
+ signature: z.string()
21
+ });
22
+ // ============================================================================
23
+ // KEYPAIR GENERATION
24
+ // ============================================================================
25
+ /**
26
+ * Generate Ed25519 keypair for skill signing
27
+ */
28
+ export function generateSigningKeyPair() {
29
+ const { publicKey, privateKey } = generateKeyPairSync('ed25519', {
30
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
31
+ privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
32
+ });
33
+ return { publicKey, privateKey };
34
+ }
35
+ // ============================================================================
36
+ // FILE HASHING
37
+ // ============================================================================
38
+ /**
39
+ * Compute SHA256 hash of file contents
40
+ */
41
+ export async function hashFile(filePath) {
42
+ const contents = await readFile(filePath);
43
+ return createHash('sha256').update(contents).digest('hex');
44
+ }
45
+ /**
46
+ * Walk directory recursively and collect file paths
47
+ */
48
+ async function walkDirectory(dir, baseDir = dir) {
49
+ const entries = await readdir(dir, { withFileTypes: true });
50
+ const files = [];
51
+ for (const entry of entries) {
52
+ const fullPath = join(dir, entry.name);
53
+ if (entry.isDirectory()) {
54
+ // Skip node_modules, .git, etc.
55
+ if (['node_modules', '.git', 'dist', 'build'].includes(entry.name)) {
56
+ continue;
57
+ }
58
+ files.push(...(await walkDirectory(fullPath, baseDir)));
59
+ }
60
+ else if (entry.isFile()) {
61
+ files.push(relative(baseDir, fullPath));
62
+ }
63
+ }
64
+ return files.sort(); // Deterministic ordering
65
+ }
66
+ // ============================================================================
67
+ // MANIFEST CREATION
68
+ // ============================================================================
69
+ /**
70
+ * Create skill manifest by hashing all files in directory
71
+ */
72
+ export async function createManifest(skillDir, name, version) {
73
+ const filePaths = await walkDirectory(skillDir);
74
+ const files = [];
75
+ for (const relPath of filePaths) {
76
+ const fullPath = join(skillDir, relPath);
77
+ const sha256 = await hashFile(fullPath);
78
+ files.push({ path: relPath, sha256 });
79
+ }
80
+ // Configure via SKILL_VERIFY_PUBLIC_KEY env var or pass to constructor
81
+ return {
82
+ name,
83
+ version,
84
+ files,
85
+ timestamp: Date.now(),
86
+ publicKey: process.env['SKILL_VERIFY_PUBLIC_KEY'] ?? ''
87
+ };
88
+ }
89
+ // ============================================================================
90
+ // SIGNING & VERIFICATION
91
+ // ============================================================================
92
+ /**
93
+ * Compute deterministic hash chain from manifest files
94
+ */
95
+ function computeManifestHash(manifest) {
96
+ // Concatenate all file hashes in order
97
+ const hashChain = manifest.files
98
+ .map(f => f.sha256)
99
+ .join('');
100
+ // Add metadata
101
+ const payload = JSON.stringify({
102
+ name: manifest.name,
103
+ version: manifest.version,
104
+ timestamp: manifest.timestamp,
105
+ publicKey: manifest.publicKey,
106
+ hashChain
107
+ });
108
+ return Buffer.from(payload, 'utf8');
109
+ }
110
+ /**
111
+ * Sign manifest with Ed25519 private key
112
+ */
113
+ export function signManifest(manifest, privateKey) {
114
+ // Set public key from private key if not already set
115
+ if (!manifest.publicKey) {
116
+ const { publicKey } = generateKeyPairSync('ed25519', {
117
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
118
+ privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
119
+ });
120
+ manifest.publicKey = publicKey;
121
+ }
122
+ const payload = computeManifestHash(manifest);
123
+ const signature = sign(null, payload, privateKey);
124
+ return {
125
+ ...manifest,
126
+ signature: signature.toString('base64')
127
+ };
128
+ }
129
+ /**
130
+ * Verify manifest signature using embedded public key
131
+ */
132
+ export function verifyManifest(signed) {
133
+ try {
134
+ // Validate schema
135
+ SignedManifestSchema.parse(signed);
136
+ const payload = computeManifestHash(signed);
137
+ const signature = Buffer.from(signed.signature, 'base64');
138
+ return verify(null, payload, signed.publicKey, signature);
139
+ }
140
+ catch (error) {
141
+ return false;
142
+ }
143
+ }
144
+ // ============================================================================
145
+ // INTEGRITY VERIFICATION
146
+ // ============================================================================
147
+ /**
148
+ * Verify skill directory matches signed manifest
149
+ * Returns list of tampered files (empty if valid)
150
+ */
151
+ export async function verifySkillIntegrity(skillDir, signed) {
152
+ // First verify signature
153
+ if (!verifyManifest(signed)) {
154
+ return { valid: false, tamperedFiles: ['__SIGNATURE_INVALID__'] };
155
+ }
156
+ const tamperedFiles = [];
157
+ // Re-hash all files and compare to manifest
158
+ for (const fileEntry of signed.files) {
159
+ const fullPath = join(skillDir, fileEntry.path);
160
+ try {
161
+ const currentHash = await hashFile(fullPath);
162
+ if (currentHash !== fileEntry.sha256) {
163
+ tamperedFiles.push(fileEntry.path);
164
+ }
165
+ }
166
+ catch (error) {
167
+ // File missing or unreadable
168
+ tamperedFiles.push(fileEntry.path);
169
+ }
170
+ }
171
+ // Check for unexpected files
172
+ const currentFiles = await walkDirectory(skillDir);
173
+ const manifestPaths = new Set(signed.files.map(f => f.path));
174
+ for (const filePath of currentFiles) {
175
+ if (!manifestPaths.has(filePath)) {
176
+ tamperedFiles.push(`__EXTRA__:${filePath}`);
177
+ }
178
+ }
179
+ return {
180
+ valid: tamperedFiles.length === 0,
181
+ tamperedFiles
182
+ };
183
+ }
184
+ // ============================================================================
185
+ // UTILITY
186
+ // ============================================================================
187
+ /**
188
+ * Load and parse signed manifest from JSON file
189
+ */
190
+ export async function loadSignedManifest(manifestPath) {
191
+ const contents = await readFile(manifestPath, 'utf8');
192
+ const parsed = JSON.parse(contents);
193
+ return SignedManifestSchema.parse(parsed);
194
+ }
195
+ /**
196
+ * Check if skill directory has been modified since signing
197
+ * Useful for hot-reload scenarios
198
+ */
199
+ export async function needsReVerification(skillDir, signed) {
200
+ // Quick check: compare file count first
201
+ const currentFiles = await walkDirectory(skillDir);
202
+ if (currentFiles.length !== signed.files.length) {
203
+ return true;
204
+ }
205
+ // Check modification times (heuristic - not cryptographically secure)
206
+ for (const fileEntry of signed.files) {
207
+ const fullPath = join(skillDir, fileEntry.path);
208
+ try {
209
+ const stats = await stat(fullPath);
210
+ if (stats.mtimeMs > signed.timestamp) {
211
+ return true;
212
+ }
213
+ }
214
+ catch {
215
+ return true; // File missing
216
+ }
217
+ }
218
+ return false;
219
+ }
220
+ //# sourceMappingURL=skillVerify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillVerify.js","sourceRoot":"","sources":["../../src/security/skillVerify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ export declare class Vault {
2
+ private masterKey;
3
+ private passphrase;
4
+ private deviceSlots;
5
+ private data;
6
+ private locked;
7
+ private version;
8
+ private masterSalt?;
9
+ private constructor();
10
+ /**
11
+ * Native machine fingerprint (ignores VAULT_MACHINE_FINGERPRINT override).
12
+ * Used by addDevice() to register the actual current machine.
13
+ */
14
+ static getNativeFingerprint(): string;
15
+ /**
16
+ * Auth fingerprint — respects VAULT_MACHINE_FINGERPRINT override.
17
+ * Used for vault open/key derivation.
18
+ */
19
+ private static getAuthFingerprint;
20
+ private static deriveDeviceKey;
21
+ /** v1 compat: derive key using auth fingerprint (old behavior). */
22
+ private static deriveKeyV1;
23
+ private static encryptMasterKey;
24
+ private static decryptMasterKey;
25
+ static create(passphrase: string): Promise<Vault>;
26
+ private static createFreshV2;
27
+ private static openV2;
28
+ private static openV1;
29
+ private static migrateV1ToV2;
30
+ /**
31
+ * Register the current machine's native fingerprint as a new device slot.
32
+ * Always uses the NATIVE fingerprint (ignores VAULT_MACHINE_FINGERPRINT override),
33
+ * so you can open with an override and add-device to register the real machine.
34
+ */
35
+ addDevice(label?: string): Promise<string>;
36
+ /**
37
+ * List registered device slots (no secrets exposed).
38
+ */
39
+ listDevices(): Array<{
40
+ index: number;
41
+ addedAt: string;
42
+ label?: string;
43
+ }>;
44
+ getVersion(): number;
45
+ private static ensureVaultDirStatic;
46
+ private acquireLock;
47
+ private releaseLock;
48
+ private encrypt;
49
+ private decrypt;
50
+ store(key: string, value: string): Promise<void>;
51
+ retrieve(key: string): Promise<string | null>;
52
+ rotate(key: string, newValue: string): Promise<void>;
53
+ delete(key: string): Promise<void>;
54
+ list(): Promise<string[]>;
55
+ migrateFromPlaintext(dir: string): Promise<number>;
56
+ destroy(): Promise<void>;
57
+ private persist;
58
+ }
59
+ export declare function createVault(passphrase: string): Promise<Vault>;
60
+ //# sourceMappingURL=vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/security/vault.ts"],"names":[],"mappings":"AAgEA,qBAAa,KAAK;IAChB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAY;IAE3B,OAAO,CAAC,UAAU,CAAC,CAAS;IAE5B,OAAO;IAWP;;;OAGG;IACH,MAAM,CAAC,oBAAoB,IAAI,MAAM;IAOrC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;mBAQZ,eAAe;IAUpC,mEAAmE;mBAC9C,WAAW;IAQhC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B,OAAO,CAAC,MAAM,CAAC,gBAAgB;WAalB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;mBA0BlC,aAAa;mBAqBb,MAAM;mBAwBN,MAAM;mBAsDN,aAAa;IAkElC;;;;OAIG;IACG,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBhD;;OAEG;IACH,WAAW,IAAI,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAQxE,UAAU,IAAI,MAAM;mBAQC,oBAAoB;YAQ3B,WAAW;YAgCX,WAAW;IAczB,OAAO,CAAC,OAAO;IAoBf,OAAO,CAAC,OAAO;IAoBT,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAY7C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBlD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAqBhB,OAAO;CAgBtB;AAMD,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAEpE"}