@agent-relay/daemon 0.1.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.
- package/dist/agent-manager.d.ts +134 -0
- package/dist/agent-manager.d.ts.map +1 -0
- package/dist/agent-manager.js +578 -0
- package/dist/agent-manager.js.map +1 -0
- package/dist/agent-registry.d.ts +99 -0
- package/dist/agent-registry.d.ts.map +1 -0
- package/dist/agent-registry.js +213 -0
- package/dist/agent-registry.js.map +1 -0
- package/dist/agent-signing.d.ts +158 -0
- package/dist/agent-signing.d.ts.map +1 -0
- package/dist/agent-signing.js +523 -0
- package/dist/agent-signing.js.map +1 -0
- package/dist/api.d.ts +106 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +876 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +94 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +197 -0
- package/dist/auth.js.map +1 -0
- package/dist/channel-membership-store.d.ts +55 -0
- package/dist/channel-membership-store.d.ts.map +1 -0
- package/dist/channel-membership-store.js +176 -0
- package/dist/channel-membership-store.js.map +1 -0
- package/dist/cli-auth.d.ts +89 -0
- package/dist/cli-auth.d.ts.map +1 -0
- package/dist/cli-auth.js +792 -0
- package/dist/cli-auth.js.map +1 -0
- package/dist/cloud-sync.d.ts +150 -0
- package/dist/cloud-sync.d.ts.map +1 -0
- package/dist/cloud-sync.js +446 -0
- package/dist/cloud-sync.js.map +1 -0
- package/dist/connection.d.ts +130 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +438 -0
- package/dist/connection.js.map +1 -0
- package/dist/consensus-integration.d.ts +167 -0
- package/dist/consensus-integration.d.ts.map +1 -0
- package/dist/consensus-integration.js +371 -0
- package/dist/consensus-integration.js.map +1 -0
- package/dist/consensus.d.ts +271 -0
- package/dist/consensus.d.ts.map +1 -0
- package/dist/consensus.js +632 -0
- package/dist/consensus.js.map +1 -0
- package/dist/delivery-tracker.d.ts +34 -0
- package/dist/delivery-tracker.d.ts.map +1 -0
- package/dist/delivery-tracker.js +104 -0
- package/dist/delivery-tracker.js.map +1 -0
- package/dist/enhanced-features.d.ts +118 -0
- package/dist/enhanced-features.d.ts.map +1 -0
- package/dist/enhanced-features.js +176 -0
- package/dist/enhanced-features.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/index.d.ts +73 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +241 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/orchestrator.d.ts +217 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +1143 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/rate-limiter.d.ts +68 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +130 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/registry.d.ts +9 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +9 -0
- package/dist/registry.js.map +1 -0
- package/dist/relay-ledger.d.ts +261 -0
- package/dist/relay-ledger.d.ts.map +1 -0
- package/dist/relay-ledger.js +532 -0
- package/dist/relay-ledger.js.map +1 -0
- package/dist/relay-watchdog.d.ts +125 -0
- package/dist/relay-watchdog.d.ts.map +1 -0
- package/dist/relay-watchdog.js +611 -0
- package/dist/relay-watchdog.js.map +1 -0
- package/dist/repo-manager.d.ts +116 -0
- package/dist/repo-manager.d.ts.map +1 -0
- package/dist/repo-manager.js +384 -0
- package/dist/repo-manager.js.map +1 -0
- package/dist/router.d.ts +370 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +1437 -0
- package/dist/router.js.map +1 -0
- package/dist/server.d.ts +174 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1001 -0
- package/dist/server.js.map +1 -0
- package/dist/spawn-manager.d.ts +78 -0
- package/dist/spawn-manager.d.ts.map +1 -0
- package/dist/spawn-manager.js +165 -0
- package/dist/spawn-manager.js.map +1 -0
- package/dist/sync-queue.d.ts +116 -0
- package/dist/sync-queue.d.ts.map +1 -0
- package/dist/sync-queue.js +361 -0
- package/dist/sync-queue.js.map +1 -0
- package/dist/types.d.ts +133 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace-manager.d.ts +80 -0
- package/dist/workspace-manager.d.ts.map +1 -0
- package/dist/workspace-manager.js +314 -0
- package/dist/workspace-manager.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Authentication via Cryptographic Signing
|
|
3
|
+
*
|
|
4
|
+
* Provides agent identity verification through message signing.
|
|
5
|
+
* Extends the existing UID/GID-based auth with cryptographic guarantees.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - HMAC-SHA256 for shared-secret signing (simpler deployment)
|
|
9
|
+
* - Ed25519 for asymmetric signing (zero-trust mode)
|
|
10
|
+
* - Message signature verification
|
|
11
|
+
* - Key rotation support
|
|
12
|
+
* - Agent identity attestation
|
|
13
|
+
*/
|
|
14
|
+
import { createHmac, randomBytes, createHash, generateKeyPairSync, sign, verify, createPrivateKey, createPublicKey, } from 'node:crypto';
|
|
15
|
+
import fs from 'node:fs';
|
|
16
|
+
import path from 'node:path';
|
|
17
|
+
import os from 'node:os';
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// Default Configuration
|
|
20
|
+
// =============================================================================
|
|
21
|
+
const DEFAULT_CONFIG = {
|
|
22
|
+
enabled: false,
|
|
23
|
+
algorithm: 'hmac-sha256',
|
|
24
|
+
requireSignatures: false,
|
|
25
|
+
};
|
|
26
|
+
const DEFAULT_KEY_DIR = path.join(os.homedir(), '.agent-relay', 'keys');
|
|
27
|
+
// =============================================================================
|
|
28
|
+
// Key Management
|
|
29
|
+
// =============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Generate a new agent key pair.
|
|
32
|
+
*/
|
|
33
|
+
export function generateAgentKey(agentName, algorithm = 'hmac-sha256', expiresInHours) {
|
|
34
|
+
const now = Date.now();
|
|
35
|
+
if (algorithm === 'hmac-sha256') {
|
|
36
|
+
// For HMAC, we generate a random secret
|
|
37
|
+
const secret = randomBytes(32).toString('hex');
|
|
38
|
+
const keyId = createHash('sha256')
|
|
39
|
+
.update(`${agentName}:${secret}:${now}`)
|
|
40
|
+
.digest('hex')
|
|
41
|
+
.substring(0, 16);
|
|
42
|
+
return {
|
|
43
|
+
agentName,
|
|
44
|
+
publicKey: keyId, // Key ID serves as public identifier
|
|
45
|
+
privateKey: secret,
|
|
46
|
+
createdAt: now,
|
|
47
|
+
expiresAt: expiresInHours ? now + expiresInHours * 3600000 : undefined,
|
|
48
|
+
algorithm,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Ed25519 asymmetric key generation
|
|
52
|
+
const { publicKey: pubKeyObj, privateKey: privKeyObj } = generateKeyPairSync('ed25519');
|
|
53
|
+
// Export keys in PEM format for storage
|
|
54
|
+
const privateKeyPem = privKeyObj.export({ type: 'pkcs8', format: 'pem' });
|
|
55
|
+
const publicKeyPem = pubKeyObj.export({ type: 'spki', format: 'pem' });
|
|
56
|
+
// Create a key ID from the public key hash (for rotation tracking)
|
|
57
|
+
const _keyId = createHash('sha256')
|
|
58
|
+
.update(publicKeyPem)
|
|
59
|
+
.digest('hex')
|
|
60
|
+
.substring(0, 16);
|
|
61
|
+
return {
|
|
62
|
+
agentName,
|
|
63
|
+
publicKey: publicKeyPem,
|
|
64
|
+
privateKey: privateKeyPem,
|
|
65
|
+
createdAt: now,
|
|
66
|
+
expiresAt: expiresInHours ? now + expiresInHours * 3600000 : undefined,
|
|
67
|
+
algorithm,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Save agent key to disk (private key file).
|
|
72
|
+
*/
|
|
73
|
+
export function saveAgentKey(key, keyDir = DEFAULT_KEY_DIR) {
|
|
74
|
+
if (!fs.existsSync(keyDir)) {
|
|
75
|
+
fs.mkdirSync(keyDir, { recursive: true, mode: 0o700 });
|
|
76
|
+
}
|
|
77
|
+
const keyPath = path.join(keyDir, `${key.agentName}.key.json`);
|
|
78
|
+
fs.writeFileSync(keyPath, JSON.stringify(key, null, 2), {
|
|
79
|
+
mode: 0o600, // Owner read/write only
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Load agent key from disk.
|
|
84
|
+
*/
|
|
85
|
+
export function loadAgentKey(agentName, keyDir = DEFAULT_KEY_DIR) {
|
|
86
|
+
const keyPath = path.join(keyDir, `${agentName}.key.json`);
|
|
87
|
+
if (!fs.existsSync(keyPath)) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const content = fs.readFileSync(keyPath, 'utf-8');
|
|
92
|
+
const key = JSON.parse(content);
|
|
93
|
+
// Check expiry
|
|
94
|
+
if (key.expiresAt && Date.now() > key.expiresAt) {
|
|
95
|
+
console.warn(`[signing] Key for ${agentName} has expired`);
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
return key;
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
console.error(`[signing] Failed to load key for ${agentName}:`, err);
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Load or generate agent key.
|
|
107
|
+
*/
|
|
108
|
+
export function getOrCreateAgentKey(agentName, config, keyDir = DEFAULT_KEY_DIR) {
|
|
109
|
+
let key = loadAgentKey(agentName, keyDir);
|
|
110
|
+
if (!key) {
|
|
111
|
+
key = generateAgentKey(agentName, config.algorithm, config.keyRotationHours);
|
|
112
|
+
saveAgentKey(key, keyDir);
|
|
113
|
+
console.log(`[signing] Generated new key for ${agentName}`);
|
|
114
|
+
}
|
|
115
|
+
return key;
|
|
116
|
+
}
|
|
117
|
+
// =============================================================================
|
|
118
|
+
// Message Signing
|
|
119
|
+
// =============================================================================
|
|
120
|
+
/**
|
|
121
|
+
* Sign a message using the agent's private key.
|
|
122
|
+
*/
|
|
123
|
+
export function signMessage(content, key) {
|
|
124
|
+
const signedAt = Date.now();
|
|
125
|
+
const dataToSign = `${key.agentName}:${signedAt}:${content}`;
|
|
126
|
+
let signature;
|
|
127
|
+
let keyId;
|
|
128
|
+
if (key.algorithm === 'hmac-sha256') {
|
|
129
|
+
signature = createHmac('sha256', key.privateKey)
|
|
130
|
+
.update(dataToSign)
|
|
131
|
+
.digest('hex');
|
|
132
|
+
keyId = key.publicKey; // For HMAC, publicKey is the key ID
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// Ed25519 signing using Node.js native crypto
|
|
136
|
+
const privateKeyObj = createPrivateKey(key.privateKey);
|
|
137
|
+
const signatureBuffer = sign(null, Buffer.from(dataToSign), privateKeyObj);
|
|
138
|
+
signature = signatureBuffer.toString('hex');
|
|
139
|
+
// For Ed25519, derive key ID from public key hash
|
|
140
|
+
keyId = createHash('sha256')
|
|
141
|
+
.update(key.publicKey)
|
|
142
|
+
.digest('hex')
|
|
143
|
+
.substring(0, 16);
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
content,
|
|
147
|
+
signature,
|
|
148
|
+
signer: key.agentName,
|
|
149
|
+
signedAt,
|
|
150
|
+
keyId,
|
|
151
|
+
algorithm: key.algorithm,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Sign with shared secret (HMAC mode where all agents share a secret).
|
|
156
|
+
*/
|
|
157
|
+
export function signWithSharedSecret(content, agentName, sharedSecret) {
|
|
158
|
+
const signedAt = Date.now();
|
|
159
|
+
const dataToSign = `${agentName}:${signedAt}:${content}`;
|
|
160
|
+
const signature = createHmac('sha256', sharedSecret)
|
|
161
|
+
.update(dataToSign)
|
|
162
|
+
.digest('hex');
|
|
163
|
+
const keyId = createHash('sha256')
|
|
164
|
+
.update(sharedSecret)
|
|
165
|
+
.digest('hex')
|
|
166
|
+
.substring(0, 16);
|
|
167
|
+
return {
|
|
168
|
+
content,
|
|
169
|
+
signature,
|
|
170
|
+
signer: agentName,
|
|
171
|
+
signedAt,
|
|
172
|
+
keyId,
|
|
173
|
+
algorithm: 'hmac-sha256',
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// =============================================================================
|
|
177
|
+
// Message Verification
|
|
178
|
+
// =============================================================================
|
|
179
|
+
/**
|
|
180
|
+
* Verify a signed message using the agent's public key.
|
|
181
|
+
*/
|
|
182
|
+
export function verifyMessage(signed, key) {
|
|
183
|
+
// Check signer matches key
|
|
184
|
+
if (signed.signer !== key.agentName) {
|
|
185
|
+
return {
|
|
186
|
+
valid: false,
|
|
187
|
+
error: `Signer mismatch: expected ${key.agentName}, got ${signed.signer}`,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// Check key ID for HMAC, or derive it for Ed25519
|
|
191
|
+
const expectedKeyId = key.algorithm === 'hmac-sha256'
|
|
192
|
+
? key.publicKey
|
|
193
|
+
: createHash('sha256').update(key.publicKey).digest('hex').substring(0, 16);
|
|
194
|
+
if (signed.keyId !== expectedKeyId) {
|
|
195
|
+
return {
|
|
196
|
+
valid: false,
|
|
197
|
+
error: `Key ID mismatch: expected ${expectedKeyId}, got ${signed.keyId}`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// Check expiry
|
|
201
|
+
if (key.expiresAt && Date.now() > key.expiresAt) {
|
|
202
|
+
return {
|
|
203
|
+
valid: false,
|
|
204
|
+
error: 'Signing key has expired',
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
// Verify signature
|
|
208
|
+
const dataToVerify = `${signed.signer}:${signed.signedAt}:${signed.content}`;
|
|
209
|
+
if (key.algorithm === 'hmac-sha256') {
|
|
210
|
+
// HMAC verification: recompute and compare
|
|
211
|
+
const expectedSignature = createHmac('sha256', key.privateKey)
|
|
212
|
+
.update(dataToVerify)
|
|
213
|
+
.digest('hex');
|
|
214
|
+
if (signed.signature !== expectedSignature) {
|
|
215
|
+
return {
|
|
216
|
+
valid: false,
|
|
217
|
+
error: 'Invalid signature',
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
// Ed25519 verification using public key only (true asymmetric verification)
|
|
223
|
+
try {
|
|
224
|
+
const publicKeyObj = createPublicKey(key.publicKey);
|
|
225
|
+
const signatureBuffer = Buffer.from(signed.signature, 'hex');
|
|
226
|
+
const isValid = verify(null, Buffer.from(dataToVerify), publicKeyObj, signatureBuffer);
|
|
227
|
+
if (!isValid) {
|
|
228
|
+
return {
|
|
229
|
+
valid: false,
|
|
230
|
+
error: 'Invalid signature',
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
return {
|
|
236
|
+
valid: false,
|
|
237
|
+
error: `Signature verification failed: ${err instanceof Error ? err.message : 'unknown error'}`,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
valid: true,
|
|
243
|
+
signer: signed.signer,
|
|
244
|
+
signedAt: signed.signedAt,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Verify an Ed25519 signed message using only the public key.
|
|
249
|
+
* This is the key advantage of asymmetric signing - verifiers don't need the private key.
|
|
250
|
+
*/
|
|
251
|
+
export function verifyEd25519WithPublicKey(signed, publicKeyPem, expectedSigner) {
|
|
252
|
+
if (signed.algorithm !== 'ed25519') {
|
|
253
|
+
return {
|
|
254
|
+
valid: false,
|
|
255
|
+
error: `Algorithm mismatch: expected ed25519, got ${signed.algorithm}`,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
if (signed.signer !== expectedSigner) {
|
|
259
|
+
return {
|
|
260
|
+
valid: false,
|
|
261
|
+
error: `Signer mismatch: expected ${expectedSigner}, got ${signed.signer}`,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
const expectedKeyId = createHash('sha256')
|
|
265
|
+
.update(publicKeyPem)
|
|
266
|
+
.digest('hex')
|
|
267
|
+
.substring(0, 16);
|
|
268
|
+
if (signed.keyId !== expectedKeyId) {
|
|
269
|
+
return {
|
|
270
|
+
valid: false,
|
|
271
|
+
error: `Key ID mismatch: expected ${expectedKeyId}, got ${signed.keyId}`,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
const dataToVerify = `${signed.signer}:${signed.signedAt}:${signed.content}`;
|
|
275
|
+
try {
|
|
276
|
+
const publicKeyObj = createPublicKey(publicKeyPem);
|
|
277
|
+
const signatureBuffer = Buffer.from(signed.signature, 'hex');
|
|
278
|
+
const isValid = verify(null, Buffer.from(dataToVerify), publicKeyObj, signatureBuffer);
|
|
279
|
+
if (!isValid) {
|
|
280
|
+
return {
|
|
281
|
+
valid: false,
|
|
282
|
+
error: 'Invalid signature',
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
return {
|
|
288
|
+
valid: false,
|
|
289
|
+
error: `Signature verification failed: ${err instanceof Error ? err.message : 'unknown error'}`,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
valid: true,
|
|
294
|
+
signer: signed.signer,
|
|
295
|
+
signedAt: signed.signedAt,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Verify with shared secret.
|
|
300
|
+
*/
|
|
301
|
+
export function verifyWithSharedSecret(signed, sharedSecret) {
|
|
302
|
+
const dataToSign = `${signed.signer}:${signed.signedAt}:${signed.content}`;
|
|
303
|
+
const expectedSignature = createHmac('sha256', sharedSecret)
|
|
304
|
+
.update(dataToSign)
|
|
305
|
+
.digest('hex');
|
|
306
|
+
if (signed.signature !== expectedSignature) {
|
|
307
|
+
return {
|
|
308
|
+
valid: false,
|
|
309
|
+
error: 'Invalid signature',
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
valid: true,
|
|
314
|
+
signer: signed.signer,
|
|
315
|
+
signedAt: signed.signedAt,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
// =============================================================================
|
|
319
|
+
// Agent Signing Manager
|
|
320
|
+
// =============================================================================
|
|
321
|
+
/**
|
|
322
|
+
* Manages agent signing keys and verification.
|
|
323
|
+
*/
|
|
324
|
+
export class AgentSigningManager {
|
|
325
|
+
config;
|
|
326
|
+
keyDir;
|
|
327
|
+
keys = new Map();
|
|
328
|
+
constructor(config = {}, keyDir) {
|
|
329
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
330
|
+
this.keyDir = keyDir ?? DEFAULT_KEY_DIR;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Check if signing is enabled.
|
|
334
|
+
*/
|
|
335
|
+
get enabled() {
|
|
336
|
+
return this.config.enabled;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get or load key for an agent.
|
|
340
|
+
*/
|
|
341
|
+
getKey(agentName) {
|
|
342
|
+
// Check cache
|
|
343
|
+
const cached = this.keys.get(agentName);
|
|
344
|
+
if (cached) {
|
|
345
|
+
// Check expiry
|
|
346
|
+
if (cached.expiresAt && Date.now() > cached.expiresAt) {
|
|
347
|
+
this.keys.delete(agentName);
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
return cached;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
// Load from disk
|
|
354
|
+
const key = loadAgentKey(agentName, this.keyDir);
|
|
355
|
+
if (key) {
|
|
356
|
+
this.keys.set(agentName, key);
|
|
357
|
+
}
|
|
358
|
+
return key;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Register a new agent (generate and save key).
|
|
362
|
+
*/
|
|
363
|
+
registerAgent(agentName) {
|
|
364
|
+
const key = getOrCreateAgentKey(agentName, this.config, this.keyDir);
|
|
365
|
+
this.keys.set(agentName, key);
|
|
366
|
+
return key;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Sign a message for an agent.
|
|
370
|
+
*/
|
|
371
|
+
sign(agentName, content) {
|
|
372
|
+
if (!this.config.enabled) {
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
// Shared secret mode
|
|
376
|
+
if (this.config.sharedSecret) {
|
|
377
|
+
return signWithSharedSecret(content, agentName, this.config.sharedSecret);
|
|
378
|
+
}
|
|
379
|
+
// Per-agent key mode
|
|
380
|
+
const key = this.getKey(agentName);
|
|
381
|
+
if (!key) {
|
|
382
|
+
console.warn(`[signing] No key found for ${agentName}, cannot sign`);
|
|
383
|
+
return null;
|
|
384
|
+
}
|
|
385
|
+
return signMessage(content, key);
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Verify a signed message.
|
|
389
|
+
*/
|
|
390
|
+
verify(signed) {
|
|
391
|
+
if (!this.config.enabled) {
|
|
392
|
+
return { valid: true }; // Signing disabled, accept all
|
|
393
|
+
}
|
|
394
|
+
// Check if unsigned messages are allowed from this agent
|
|
395
|
+
if (this.config.allowUnsignedFrom?.includes(signed.signer)) {
|
|
396
|
+
return { valid: true, signer: signed.signer };
|
|
397
|
+
}
|
|
398
|
+
// Shared secret mode
|
|
399
|
+
if (this.config.sharedSecret) {
|
|
400
|
+
return verifyWithSharedSecret(signed, this.config.sharedSecret);
|
|
401
|
+
}
|
|
402
|
+
// Per-agent key mode
|
|
403
|
+
const key = this.getKey(signed.signer);
|
|
404
|
+
if (!key) {
|
|
405
|
+
if (this.config.requireSignatures) {
|
|
406
|
+
return {
|
|
407
|
+
valid: false,
|
|
408
|
+
error: `No key found for signer ${signed.signer}`,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
// Key not found but signatures not required
|
|
412
|
+
return { valid: true, signer: signed.signer };
|
|
413
|
+
}
|
|
414
|
+
return verifyMessage(signed, key);
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Check if a message requires verification.
|
|
418
|
+
*/
|
|
419
|
+
requiresVerification(agentName) {
|
|
420
|
+
if (!this.config.enabled)
|
|
421
|
+
return false;
|
|
422
|
+
if (!this.config.requireSignatures)
|
|
423
|
+
return false;
|
|
424
|
+
if (this.config.allowUnsignedFrom?.includes(agentName))
|
|
425
|
+
return false;
|
|
426
|
+
return true;
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Rotate key for an agent.
|
|
430
|
+
*/
|
|
431
|
+
rotateKey(agentName) {
|
|
432
|
+
// Generate new key
|
|
433
|
+
const newKey = generateAgentKey(agentName, this.config.algorithm, this.config.keyRotationHours);
|
|
434
|
+
// Save and cache
|
|
435
|
+
saveAgentKey(newKey, this.keyDir);
|
|
436
|
+
this.keys.set(agentName, newKey);
|
|
437
|
+
console.log(`[signing] Rotated key for ${agentName}`);
|
|
438
|
+
return newKey;
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Export public key for an agent (for sharing with other systems).
|
|
442
|
+
*/
|
|
443
|
+
exportPublicKey(agentName) {
|
|
444
|
+
const key = this.getKey(agentName);
|
|
445
|
+
if (!key)
|
|
446
|
+
return null;
|
|
447
|
+
return {
|
|
448
|
+
agentName: key.agentName,
|
|
449
|
+
publicKey: key.publicKey,
|
|
450
|
+
algorithm: key.algorithm,
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// =============================================================================
|
|
455
|
+
// Integration Helpers
|
|
456
|
+
// =============================================================================
|
|
457
|
+
/**
|
|
458
|
+
* Attach signature to protocol envelope.
|
|
459
|
+
*/
|
|
460
|
+
export function attachSignature(envelope, signed) {
|
|
461
|
+
return {
|
|
462
|
+
...envelope,
|
|
463
|
+
_sig: {
|
|
464
|
+
s: signed.signature,
|
|
465
|
+
k: signed.keyId,
|
|
466
|
+
t: signed.signedAt,
|
|
467
|
+
a: signed.algorithm,
|
|
468
|
+
},
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Extract signature from protocol envelope.
|
|
473
|
+
*/
|
|
474
|
+
export function extractSignature(envelope) {
|
|
475
|
+
const sig = envelope._sig;
|
|
476
|
+
if (!sig || !sig.s || !sig.k || !sig.t) {
|
|
477
|
+
return null;
|
|
478
|
+
}
|
|
479
|
+
// Reconstruct the signed content (envelope without _sig)
|
|
480
|
+
const { _sig, ...rest } = envelope;
|
|
481
|
+
const content = JSON.stringify(rest);
|
|
482
|
+
// Safely extract signer from envelope
|
|
483
|
+
const signer = typeof envelope.from === 'string' ? envelope.from : 'unknown';
|
|
484
|
+
// Validate algorithm value
|
|
485
|
+
const algorithm = sig.a === 'ed25519' ? 'ed25519' : 'hmac-sha256';
|
|
486
|
+
return {
|
|
487
|
+
content,
|
|
488
|
+
signature: sig.s,
|
|
489
|
+
signer,
|
|
490
|
+
signedAt: sig.t,
|
|
491
|
+
keyId: sig.k,
|
|
492
|
+
algorithm,
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
// =============================================================================
|
|
496
|
+
// Configuration Loading
|
|
497
|
+
// =============================================================================
|
|
498
|
+
const SIGNING_CONFIG_PATHS = [
|
|
499
|
+
path.join(os.homedir(), '.agent-relay', 'signing.json'),
|
|
500
|
+
path.join(os.homedir(), '.config', 'agent-relay', 'signing.json'),
|
|
501
|
+
'/etc/agent-relay/signing.json',
|
|
502
|
+
];
|
|
503
|
+
/**
|
|
504
|
+
* Load signing configuration from file.
|
|
505
|
+
*/
|
|
506
|
+
export function loadSigningConfig(configPath) {
|
|
507
|
+
const paths = configPath ? [configPath] : SIGNING_CONFIG_PATHS;
|
|
508
|
+
for (const p of paths) {
|
|
509
|
+
if (fs.existsSync(p)) {
|
|
510
|
+
try {
|
|
511
|
+
const content = fs.readFileSync(p, 'utf-8');
|
|
512
|
+
const config = JSON.parse(content);
|
|
513
|
+
console.log(`[signing] Loaded config from ${p}`);
|
|
514
|
+
return { ...DEFAULT_CONFIG, ...config };
|
|
515
|
+
}
|
|
516
|
+
catch (err) {
|
|
517
|
+
console.error(`[signing] Failed to parse ${p}:`, err);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
return DEFAULT_CONFIG;
|
|
522
|
+
}
|
|
523
|
+
//# sourceMappingURL=agent-signing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-signing.js","sourceRoot":"","sources":["../src/agent-signing.ts"],"names":[],"mappings":"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"}
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon API
|
|
3
|
+
* REST and WebSocket API for dashboard communication.
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
import type { ApiDaemonConfig } from './types.js';
|
|
7
|
+
export declare class DaemonApi extends EventEmitter {
|
|
8
|
+
private server?;
|
|
9
|
+
private wss?;
|
|
10
|
+
private workspaceManager;
|
|
11
|
+
private agentManager;
|
|
12
|
+
private sessions;
|
|
13
|
+
private routes;
|
|
14
|
+
private config;
|
|
15
|
+
private allowedOrigins;
|
|
16
|
+
private allowAllOrigins;
|
|
17
|
+
private outputSubscribers;
|
|
18
|
+
private wsSubscriptions;
|
|
19
|
+
private clientAlive;
|
|
20
|
+
private pingInterval?;
|
|
21
|
+
constructor(config: ApiDaemonConfig);
|
|
22
|
+
/**
|
|
23
|
+
* Resolve allowed origins from config/env (comma-separated list).
|
|
24
|
+
* Empty list means no cross-origin access is permitted.
|
|
25
|
+
*/
|
|
26
|
+
private loadAllowedOrigins;
|
|
27
|
+
/**
|
|
28
|
+
* Return allowed origin for CORS or null if explicitly blocked.
|
|
29
|
+
* Undefined means no CORS header will be set (same-origin/server-to-server).
|
|
30
|
+
*/
|
|
31
|
+
private resolveAllowedOrigin;
|
|
32
|
+
/**
|
|
33
|
+
* Track an output subscription for a client/agent pair
|
|
34
|
+
*/
|
|
35
|
+
private addOutputSubscription;
|
|
36
|
+
/**
|
|
37
|
+
* Remove output subscriptions for a client. If agentId is provided, only that
|
|
38
|
+
* subscription is removed.
|
|
39
|
+
*/
|
|
40
|
+
private removeOutputSubscription;
|
|
41
|
+
/**
|
|
42
|
+
* Send a snapshot of recent output to the client.
|
|
43
|
+
*/
|
|
44
|
+
private sendOutputSnapshot;
|
|
45
|
+
/**
|
|
46
|
+
* Broadcast output events only to subscribed clients
|
|
47
|
+
*/
|
|
48
|
+
private broadcastOutputEvent;
|
|
49
|
+
/**
|
|
50
|
+
* Clamp and normalize requested output limit
|
|
51
|
+
*/
|
|
52
|
+
private normalizeLimit;
|
|
53
|
+
/**
|
|
54
|
+
* Start the API server
|
|
55
|
+
*/
|
|
56
|
+
start(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Stop the API server
|
|
59
|
+
*/
|
|
60
|
+
stop(): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Setup API routes
|
|
63
|
+
*/
|
|
64
|
+
private setupRoutes;
|
|
65
|
+
/**
|
|
66
|
+
* Handle HTTP request
|
|
67
|
+
*/
|
|
68
|
+
private handleRequest;
|
|
69
|
+
/**
|
|
70
|
+
* Parse incoming request
|
|
71
|
+
*/
|
|
72
|
+
private parseRequest;
|
|
73
|
+
/**
|
|
74
|
+
* Parse request body
|
|
75
|
+
*/
|
|
76
|
+
private parseBody;
|
|
77
|
+
/**
|
|
78
|
+
* Route request to handler
|
|
79
|
+
*/
|
|
80
|
+
private routeRequest;
|
|
81
|
+
/**
|
|
82
|
+
* Match route pattern against request
|
|
83
|
+
*/
|
|
84
|
+
private matchRoute;
|
|
85
|
+
/**
|
|
86
|
+
* Handle WebSocket connection
|
|
87
|
+
*/
|
|
88
|
+
private handleWebSocketConnection;
|
|
89
|
+
/**
|
|
90
|
+
* Send initial state to WebSocket client
|
|
91
|
+
*/
|
|
92
|
+
private sendInitialState;
|
|
93
|
+
/**
|
|
94
|
+
* Handle WebSocket message from client
|
|
95
|
+
*/
|
|
96
|
+
private handleWebSocketMessage;
|
|
97
|
+
/**
|
|
98
|
+
* Send message to WebSocket client
|
|
99
|
+
*/
|
|
100
|
+
private sendToClient;
|
|
101
|
+
/**
|
|
102
|
+
* Broadcast event to all WebSocket clients
|
|
103
|
+
*/
|
|
104
|
+
private broadcastEvent;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,OAAO,KAAK,EACV,eAAe,EAOhB,MAAM,YAAY,CAAC;AA4BpB,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,eAAe,CAAU;IAEjC,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,eAAe,CAAkC;IAGzD,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,YAAY,CAAC,CAAiB;gBAE1B,MAAM,EAAE,eAAe;IAqBnC;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAU7B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAuBhC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAwB5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3B;;OAEG;IACH,OAAO,CAAC,WAAW;IA2bnB;;OAEG;YACW,aAAa;IAqD3B;;OAEG;YACW,YAAY;IAsB1B;;OAEG;IACH,OAAO,CAAC,SAAS;IAiBjB;;OAEG;YACW,YAAY;IAY1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAkClB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA0CjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA4B9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,OAAO,CAAC,cAAc;CAWvB"}
|