@onsignet/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/index.js ADDED
@@ -0,0 +1,524 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ /**
5
+ * Signet daemon: identity, relay client, HTTP API, audit log, pending approvals,
6
+ * policies, webhook, attestation/capability verification, key revocation.
7
+ */
8
+ const node_http_1 = require("node:http");
9
+ const node_path_1 = require("node:path");
10
+ const node_fs_1 = require("node:fs");
11
+ const node_crypto_1 = require("node:crypto");
12
+ const core_1 = require("@onsignet/core");
13
+ const config_js_1 = require("./config.js");
14
+ const identity_js_1 = require("./identity.js");
15
+ const relay_client_js_1 = require("./relay-client.js");
16
+ const server_js_1 = require("./server.js");
17
+ const audit_log_js_1 = require("./audit-log.js");
18
+ const agent_process_js_1 = require("./agent-process.js");
19
+ const policies_js_1 = require("./policies.js");
20
+ const REVOKED_KEYS_FILE = "revoked-keys.json";
21
+ function notifyWebhook(url, secret, payload) {
22
+ const body = JSON.stringify(payload);
23
+ const signature = secret
24
+ ? (0, node_crypto_1.createHmac)("sha256", secret).update(body).digest("base64")
25
+ : "";
26
+ const headers = { "Content-Type": "application/json" };
27
+ if (signature)
28
+ headers["X-Signet-Signature"] = signature;
29
+ fetch(url, { method: "POST", body, headers }).catch(() => { });
30
+ }
31
+ function loadRevokedKeys(dataDir) {
32
+ const path = (0, node_path_1.join)(dataDir, REVOKED_KEYS_FILE);
33
+ try {
34
+ if ((0, node_fs_1.existsSync)(path)) {
35
+ const data = JSON.parse((0, node_fs_1.readFileSync)(path, "utf8"));
36
+ return new Set(data);
37
+ }
38
+ }
39
+ catch { /* ignore */ }
40
+ return new Set();
41
+ }
42
+ function saveRevokedKeys(dataDir, keys) {
43
+ const path = (0, node_path_1.join)(dataDir, REVOKED_KEYS_FILE);
44
+ try {
45
+ (0, node_fs_1.writeFileSync)(path, JSON.stringify(Array.from(keys)));
46
+ }
47
+ catch { /* ignore */ }
48
+ }
49
+ async function main() {
50
+ const config = (0, config_js_1.loadConfig)();
51
+ (0, identity_js_1.ensureDataDir)(config.dataDir);
52
+ const identity = (0, identity_js_1.loadOrCreateIdentity)(config.dataDir);
53
+ const owner = (0, identity_js_1.loadOrCreateOwner)(config.dataDir);
54
+ const attestation = (0, identity_js_1.createOwnerAttestation)(identity.nodeId, owner.ed25519.secretKey);
55
+ const capability = (0, core_1.createCapabilityToken)("general", {}, owner.ed25519.secretKey);
56
+ const ownerPublicKeyBase64 = (0, core_1.encodeBase64)(owner.ed25519.publicKey);
57
+ const auditLog = new audit_log_js_1.AuditLog(config.dataDir);
58
+ const messages = [];
59
+ const pending = new Map();
60
+ const MAX_MESSAGES = 500;
61
+ const revokedKeys = loadRevokedKeys(config.dataDir);
62
+ // ── accepts_from inbound tier filter ──────────────────────────────────
63
+ // Cached preferences so we don't hit the directory API on every message.
64
+ const PREFS_CACHE_TTL_MS = 60_000;
65
+ const TIER_CACHE_TTL_MS = 300_000; // sender tiers change rarely
66
+ let cachedAcceptsFrom = null;
67
+ let prefsLastFetched = 0;
68
+ const senderTierCache = new Map();
69
+ async function getOwnAcceptsFrom() {
70
+ const now = Date.now();
71
+ if (cachedAcceptsFrom !== null && now - prefsLastFetched < PREFS_CACHE_TTL_MS) {
72
+ return cachedAcceptsFrom;
73
+ }
74
+ const dirBase = config.directoryApiUrl ?? config.marketplaceApiUrl;
75
+ if (!dirBase)
76
+ return "all";
77
+ try {
78
+ const res = await fetch(`${dirBase.replace(/\/$/, "")}/agents/${encodeURIComponent(identity.nodeId)}`, { signal: AbortSignal.timeout(5000) });
79
+ if (!res.ok)
80
+ return cachedAcceptsFrom ?? "all";
81
+ const data = (await res.json());
82
+ cachedAcceptsFrom = data.communication_preferences?.accepts_from ?? "all";
83
+ prefsLastFetched = now;
84
+ return cachedAcceptsFrom;
85
+ }
86
+ catch {
87
+ return cachedAcceptsFrom ?? "all";
88
+ }
89
+ }
90
+ async function getSenderTier(senderNodeId) {
91
+ const now = Date.now();
92
+ const cached = senderTierCache.get(senderNodeId);
93
+ if (cached && now - cached.fetchedAt < TIER_CACHE_TTL_MS)
94
+ return cached.tier;
95
+ const dirBase = config.directoryApiUrl ?? config.marketplaceApiUrl;
96
+ if (!dirBase)
97
+ return "free";
98
+ try {
99
+ const res = await fetch(`${dirBase.replace(/\/$/, "")}/agents/${encodeURIComponent(senderNodeId)}`, { signal: AbortSignal.timeout(5000) });
100
+ if (!res.ok)
101
+ return cached?.tier ?? "free";
102
+ const data = (await res.json());
103
+ const tier = data.owner_verification_tier ?? "free";
104
+ senderTierCache.set(senderNodeId, { tier, fetchedAt: now });
105
+ return tier;
106
+ }
107
+ catch {
108
+ return cached?.tier ?? "free";
109
+ }
110
+ }
111
+ /**
112
+ * Returns true if the sender's tier satisfies the recipient's accepts_from policy.
113
+ * Tier hierarchy: business > pro > verified > free
114
+ */
115
+ function tierSatisfiesPolicy(senderTier, acceptsFrom) {
116
+ if (acceptsFrom === "all")
117
+ return true;
118
+ if (acceptsFrom === "verified") {
119
+ return senderTier === "pro" || senderTier === "business";
120
+ }
121
+ if (acceptsFrom === "signet_pro") {
122
+ return senderTier === "pro" || senderTier === "business";
123
+ }
124
+ if (acceptsFrom === "signet_business") {
125
+ return senderTier === "business";
126
+ }
127
+ return true;
128
+ }
129
+ function getPolicies() {
130
+ return (0, policies_js_1.loadPolicies)(config.dataDir);
131
+ }
132
+ function setPolicies(rules) {
133
+ (0, policies_js_1.savePolicies)(config.dataDir, rules);
134
+ auditLog.append({ timestamp: new Date().toISOString(), event: "policy_change" });
135
+ }
136
+ function deliverMessage(decrypted) {
137
+ if (messages.length >= MAX_MESSAGES)
138
+ messages.shift();
139
+ messages.push(decrypted);
140
+ auditLog.append({
141
+ timestamp: new Date().toISOString(),
142
+ event: "message_received",
143
+ messageId: decrypted.id,
144
+ from: decrypted.from.nodeId,
145
+ to: identity.nodeId,
146
+ });
147
+ if (config.openclawWebhookUrl) {
148
+ const summary = typeof decrypted.payload.content?.summary === "string"
149
+ ? decrypted.payload.content.summary
150
+ : undefined;
151
+ const payload = {
152
+ messageId: decrypted.id,
153
+ from: decrypted.from.nodeId,
154
+ to: decrypted.to,
155
+ payloadType: decrypted.payload.type,
156
+ timestamp: decrypted.timestamp,
157
+ };
158
+ if (summary !== undefined)
159
+ payload.summary = summary;
160
+ notifyWebhook(config.openclawWebhookUrl, config.openclawWebhookSecret, payload);
161
+ }
162
+ }
163
+ function buildAndSend(to, payload, recipientX25519PublicKeyBase64) {
164
+ if (!relayClient.isConnected())
165
+ return null;
166
+ let recipientX25519;
167
+ try {
168
+ recipientX25519 = (0, core_1.decodeBase64)(recipientX25519PublicKeyBase64);
169
+ if (recipientX25519.length !== 32)
170
+ return null;
171
+ }
172
+ catch {
173
+ return null;
174
+ }
175
+ const wire = (0, core_1.createEnvelope)(identity.ed25519, identity.x25519, to, { type: payload.type, version: "1.0", content: payload.content }, capability, {
176
+ recipientX25519PublicKey: recipientX25519,
177
+ ownerAttestation: attestation,
178
+ ownerPublicKey: ownerPublicKeyBase64,
179
+ });
180
+ const ok = relayClient.send(wire);
181
+ if (!ok)
182
+ return null;
183
+ auditLog.append({
184
+ timestamp: new Date().toISOString(),
185
+ event: "message_sent",
186
+ messageId: wire.id,
187
+ from: identity.nodeId,
188
+ to,
189
+ });
190
+ return wire;
191
+ }
192
+ const webChatIncoming = [];
193
+ const MAX_WEB_CHAT_INCOMING = 100;
194
+ const relayClient = new relay_client_js_1.RelayClient({
195
+ relayUrl: config.relayUrl,
196
+ nodeId: identity.nodeId,
197
+ ed25519KeyPair: identity.ed25519,
198
+ onWebChatMessage: (payload) => {
199
+ if (webChatIncoming.length >= MAX_WEB_CHAT_INCOMING)
200
+ webChatIncoming.shift();
201
+ webChatIncoming.push({
202
+ sessionId: payload.sessionId,
203
+ visitorAuthLevel: payload.visitorAuthLevel,
204
+ content: payload.content,
205
+ receivedAt: new Date().toISOString(),
206
+ });
207
+ auditLog.append({
208
+ timestamp: new Date().toISOString(),
209
+ event: "message_received",
210
+ from: "signet_web_chat",
211
+ to: identity.nodeId,
212
+ });
213
+ },
214
+ onKeyRevocation: (revocation) => {
215
+ if ((0, core_1.verifyKeyRevocation)(revocation)) {
216
+ revokedKeys.add(revocation.revokedNodeId);
217
+ saveRevokedKeys(config.dataDir, revokedKeys);
218
+ auditLog.append({
219
+ timestamp: new Date().toISOString(),
220
+ event: "key_revoked",
221
+ from: revocation.revokedNodeId,
222
+ });
223
+ console.log(`[daemon] Received key revocation for ${revocation.revokedNodeId.slice(0, 20)}… reason=${revocation.reason}`);
224
+ if (revocation.revokedNodeId === identity.nodeId) {
225
+ console.error("[daemon] THIS NODE'S KEY HAS BEEN REVOKED. Shutting down.");
226
+ process.exit(1);
227
+ }
228
+ }
229
+ },
230
+ onMessage: async (wire) => {
231
+ // Reject messages from revoked keys
232
+ if (revokedKeys.has(wire.from.nodeId)) {
233
+ auditLog.append({
234
+ timestamp: new Date().toISOString(),
235
+ event: "message_rejected_revoked",
236
+ messageId: wire.id,
237
+ from: wire.from.nodeId,
238
+ to: identity.nodeId,
239
+ });
240
+ return;
241
+ }
242
+ // Verify envelope signature
243
+ const senderPublicKey = (0, core_1.parseNodeId)(wire.from.nodeId);
244
+ if (!senderPublicKey)
245
+ return;
246
+ if (!(0, core_1.verifyEnvelope)(wire, senderPublicKey))
247
+ return;
248
+ // Verify owner attestation if present
249
+ if (wire.from.ownerAttestation && wire.from.ownerPublicKey) {
250
+ try {
251
+ const ownerPubKey = (0, core_1.decodeBase64)(wire.from.ownerPublicKey);
252
+ if (!(0, core_1.verifyOwnerAttestation)(wire.from.nodeId, wire.from.ownerAttestation, ownerPubKey)) {
253
+ auditLog.append({
254
+ timestamp: new Date().toISOString(),
255
+ event: "attestation_invalid",
256
+ messageId: wire.id,
257
+ from: wire.from.nodeId,
258
+ });
259
+ // Don't reject — just log. Attestation is informational for now.
260
+ }
261
+ }
262
+ catch {
263
+ // Invalid key format — log but don't reject
264
+ }
265
+ }
266
+ // Verify capability signature if ownerPublicKey is available
267
+ if (wire.capability?.ownerSignature && wire.from.ownerPublicKey) {
268
+ try {
269
+ const ownerPubKey = (0, core_1.decodeBase64)(wire.from.ownerPublicKey);
270
+ if (!(0, core_1.verifyCapabilitySignature)(wire.capability, ownerPubKey)) {
271
+ auditLog.append({
272
+ timestamp: new Date().toISOString(),
273
+ event: "capability_invalid",
274
+ messageId: wire.id,
275
+ from: wire.from.nodeId,
276
+ });
277
+ // Log but don't reject — capability verification is defense-in-depth
278
+ }
279
+ }
280
+ catch {
281
+ // Invalid key format
282
+ }
283
+ }
284
+ let decrypted;
285
+ try {
286
+ decrypted = (0, core_1.decryptEnvelope)(wire, identity.x25519.secretKey);
287
+ }
288
+ catch {
289
+ return;
290
+ }
291
+ const rules = getPolicies();
292
+ const payloadType = decrypted.payload?.type ?? "general/1";
293
+ if ((0, policies_js_1.isDenied)(rules, decrypted.from.nodeId, payloadType)) {
294
+ auditLog.append({
295
+ timestamp: new Date().toISOString(),
296
+ event: "message_denied",
297
+ messageId: wire.id,
298
+ from: wire.from.nodeId,
299
+ to: identity.nodeId,
300
+ });
301
+ return;
302
+ }
303
+ // Enforce accepts_from tier preference — check sender's tier against our policy
304
+ try {
305
+ const acceptsFrom = await getOwnAcceptsFrom();
306
+ if (acceptsFrom !== "all") {
307
+ const senderTier = await getSenderTier(decrypted.from.nodeId);
308
+ if (!tierSatisfiesPolicy(senderTier, acceptsFrom)) {
309
+ auditLog.append({
310
+ timestamp: new Date().toISOString(),
311
+ event: "message_filtered_tier",
312
+ messageId: wire.id,
313
+ from: wire.from.nodeId,
314
+ to: identity.nodeId,
315
+ });
316
+ return;
317
+ }
318
+ }
319
+ }
320
+ catch {
321
+ // Directory API unreachable — fail open (deliver the message)
322
+ }
323
+ if ((0, policies_js_1.shouldRequireApproval)(rules, decrypted.from.nodeId, payloadType)) {
324
+ pending.set(wire.id, decrypted);
325
+ return;
326
+ }
327
+ deliverMessage(decrypted);
328
+ },
329
+ onConnectionChange: (connected) => {
330
+ auditLog.append({
331
+ timestamp: new Date().toISOString(),
332
+ event: connected ? "connection_up" : "connection_down",
333
+ });
334
+ },
335
+ });
336
+ const relayHttpUrl = config.relayUrl.replace(/^ws/, "http").replace(/\/$/, "");
337
+ async function discoverAgents() {
338
+ const res = await fetch(`${relayHttpUrl}/discover`);
339
+ if (!res.ok)
340
+ throw new Error(`relay discover: ${res.status}`);
341
+ const data = (await res.json());
342
+ const agents = data.agents ?? [];
343
+ return agents.map((a) => ({ nodeId: a.nodeId }));
344
+ }
345
+ function getPending() {
346
+ return Array.from(pending.values()).map((e) => ({
347
+ messageId: e.id,
348
+ from: e.from.nodeId,
349
+ to: e.to,
350
+ timestamp: e.timestamp,
351
+ payload: e.payload,
352
+ capabilityScope: e.capability?.scope,
353
+ }));
354
+ }
355
+ function approve(messageId) {
356
+ const decrypted = pending.get(messageId);
357
+ if (!decrypted)
358
+ return false;
359
+ pending.delete(messageId);
360
+ deliverMessage(decrypted);
361
+ auditLog.append({
362
+ timestamp: new Date().toISOString(),
363
+ event: "message_approved",
364
+ messageId,
365
+ from: decrypted.from.nodeId,
366
+ to: identity.nodeId,
367
+ });
368
+ return true;
369
+ }
370
+ function deny(messageId, _reason) {
371
+ const decrypted = pending.get(messageId);
372
+ if (!decrypted)
373
+ return false;
374
+ pending.delete(messageId);
375
+ auditLog.append({
376
+ timestamp: new Date().toISOString(),
377
+ event: "message_denied",
378
+ messageId,
379
+ from: decrypted.from.nodeId,
380
+ to: identity.nodeId,
381
+ });
382
+ return true;
383
+ }
384
+ /** Revoke this daemon's key. Broadcasts revocation to all peers via relay. */
385
+ function revokeKey(reason, replacementNodeId) {
386
+ const revocation = (0, core_1.createKeyRevocation)(identity.nodeId, reason, owner.ed25519.secretKey, owner.ed25519.publicKey, replacementNodeId);
387
+ const sent = relayClient.sendRaw({ type: "key_revocation", revocation });
388
+ if (sent) {
389
+ revokedKeys.add(identity.nodeId);
390
+ saveRevokedKeys(config.dataDir, revokedKeys);
391
+ auditLog.append({
392
+ timestamp: new Date().toISOString(),
393
+ event: "key_self_revoked",
394
+ from: identity.nodeId,
395
+ });
396
+ }
397
+ return sent;
398
+ }
399
+ const uiPath = [(0, node_path_1.join)(process.cwd(), "public"), (0, node_path_1.join)(process.cwd(), "packages", "daemon", "public")].find((p) => (0, node_fs_1.existsSync)(p));
400
+ function getConversationHistory(withNodeId, limit = 100) {
401
+ const { entries } = auditLog.readRecent(5000);
402
+ const selfId = identity.nodeId;
403
+ const filtered = entries.filter((e) => (e.event === "message_sent" || e.event === "message_received" || e.event === "message_approved" || e.event === "message_denied") &&
404
+ ((e.from === withNodeId && e.to === selfId) || (e.from === selfId && e.to === withNodeId)));
405
+ return filtered.slice(-limit).map((e) => {
406
+ const out = {
407
+ timestamp: e.timestamp,
408
+ event: e.event,
409
+ };
410
+ if (e.messageId !== undefined)
411
+ out.messageId = e.messageId;
412
+ if (e.from !== undefined)
413
+ out.from = e.from;
414
+ if (e.to !== undefined)
415
+ out.to = e.to;
416
+ return out;
417
+ });
418
+ }
419
+ let agentRunner = null;
420
+ if (config.agent?.command) {
421
+ agentRunner = (0, agent_process_js_1.createAgentProcessRunner)(config.agent);
422
+ }
423
+ function rotateKey() {
424
+ try {
425
+ const { oldIdentity, newIdentity } = (0, identity_js_1.rotateIdentity)(config.dataDir);
426
+ // Revoke old key with rotation reason, pointing to replacement
427
+ revokeKey("rotation", newIdentity.nodeId);
428
+ auditLog.append({
429
+ timestamp: new Date().toISOString(),
430
+ event: "key_rotated",
431
+ from: oldIdentity.nodeId,
432
+ to: newIdentity.nodeId,
433
+ });
434
+ return { oldNodeId: oldIdentity.nodeId, newNodeId: newIdentity.nodeId };
435
+ }
436
+ catch (e) {
437
+ console.error("[daemon] Key rotation failed:", e instanceof Error ? e.message : e);
438
+ return null;
439
+ }
440
+ }
441
+ const app = (0, server_js_1.createHttpServer)({
442
+ nodeId: identity.nodeId,
443
+ relayUrl: config.relayUrl,
444
+ x25519PublicKeyBase64: (0, core_1.encodeBase64)(identity.x25519.publicKey),
445
+ ownerAttestation: true,
446
+ isConnected: () => relayClient.isConnected(),
447
+ buildAndSend,
448
+ getMessages: (limit) => (limit != null ? messages.slice(-limit) : [...messages]),
449
+ discoverAgents,
450
+ getPending,
451
+ approve,
452
+ deny,
453
+ getPolicies,
454
+ setPolicies,
455
+ getActivity: (limit) => auditLog.readRecent(limit),
456
+ getConversationHistory,
457
+ sendWebChatReply: (sessionId, content) => relayClient.sendRaw({ type: "web_chat_out", sessionId, content }),
458
+ getWebChatIncoming: () => [...webChatIncoming],
459
+ revokeKey,
460
+ getRevokedKeys: () => Array.from(revokedKeys),
461
+ rotateKey,
462
+ halt: () => shutdown(),
463
+ ...(agentRunner != null && {
464
+ getAgentStatus: () => {
465
+ const s = agentRunner.getStatus();
466
+ return {
467
+ status: s.status,
468
+ pid: s.pid,
469
+ restartCount: s.restartCount,
470
+ lastExitCode: s.lastExitCode,
471
+ lastExitSignal: s.lastExitSignal,
472
+ };
473
+ },
474
+ }),
475
+ ...(uiPath !== undefined && { uiPath }),
476
+ ...(config.marketplaceApiUrl !== undefined && { marketplaceApiUrl: config.marketplaceApiUrl }),
477
+ ...(config.directoryApiUrl !== undefined && { directoryApiUrl: config.directoryApiUrl }),
478
+ });
479
+ const pidFile = (0, node_path_1.join)(config.dataDir, "signet.pid");
480
+ try {
481
+ (0, node_fs_1.writeFileSync)(pidFile, String(process.pid));
482
+ }
483
+ catch {
484
+ // ignore if dataDir not writable
485
+ }
486
+ const httpServer = (0, node_http_1.createServer)(app);
487
+ httpServer.listen(config.httpPort, config.httpHost, () => {
488
+ console.log(`Signet daemon listening on http://${config.httpHost}:${config.httpPort} (nodeId=${identity.nodeId})`);
489
+ });
490
+ relayClient.connect();
491
+ if (agentRunner != null) {
492
+ agentRunner.start((err) => {
493
+ if (err)
494
+ console.error("[signet] agent process start error:", err.message);
495
+ });
496
+ }
497
+ function shutdown() {
498
+ try {
499
+ if ((0, node_fs_1.existsSync)(pidFile))
500
+ (0, node_fs_1.unlinkSync)(pidFile);
501
+ }
502
+ catch {
503
+ // ignore
504
+ }
505
+ if (agentRunner != null) {
506
+ agentRunner.clearRestartTimeout();
507
+ agentRunner.stop(() => {
508
+ relayClient.disconnect();
509
+ httpServer.close(() => process.exit(0));
510
+ });
511
+ }
512
+ else {
513
+ relayClient.disconnect();
514
+ httpServer.close(() => process.exit(0));
515
+ }
516
+ }
517
+ process.on("SIGINT", shutdown);
518
+ process.on("SIGTERM", shutdown);
519
+ }
520
+ main().catch((err) => {
521
+ console.error(err instanceof Error ? err.message : String(err));
522
+ process.exit(1);
523
+ });
524
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface PolicyRule {
2
+ id: string;
3
+ action: "allow" | "deny" | "require_approval";
4
+ scope?: string;
5
+ description?: string;
6
+ }
7
+ export declare function loadPolicies(dataDir: string): PolicyRule[];
8
+ export declare function savePolicies(dataDir: string, rules: PolicyRule[]): void;
9
+ export declare function isDenied(rules: PolicyRule[], fromNodeId: string, _payloadType: string): boolean;
10
+ export declare function shouldRequireApproval(rules: PolicyRule[], fromNodeId: string, _payloadType: string): boolean;
11
+ //# sourceMappingURL=policies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,kBAAkB,CAAC;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAiB1D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAIvE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAM/F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAM5G"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadPolicies = loadPolicies;
4
+ exports.savePolicies = savePolicies;
5
+ exports.isDenied = isDenied;
6
+ exports.shouldRequireApproval = shouldRequireApproval;
7
+ /**
8
+ * Policy rules: load/save from data dir, evaluate allow/deny/require_approval.
9
+ */
10
+ const node_fs_1 = require("node:fs");
11
+ const node_path_1 = require("node:path");
12
+ const POLICIES_FILE = "policies.json";
13
+ function getPath(dataDir) {
14
+ return (0, node_path_1.join)(dataDir, POLICIES_FILE);
15
+ }
16
+ function loadPolicies(dataDir) {
17
+ const path = getPath(dataDir);
18
+ if (!(0, node_fs_1.existsSync)(path))
19
+ return [];
20
+ try {
21
+ const raw = (0, node_fs_1.readFileSync)(path, "utf8");
22
+ const data = JSON.parse(raw);
23
+ if (!Array.isArray(data?.rules))
24
+ return [];
25
+ return data.rules.filter((r) => r != null &&
26
+ typeof r === "object" &&
27
+ typeof r.id === "string" &&
28
+ ["allow", "deny", "require_approval"].includes(r.action));
29
+ }
30
+ catch {
31
+ return [];
32
+ }
33
+ }
34
+ function savePolicies(dataDir, rules) {
35
+ if (!(0, node_fs_1.existsSync)(dataDir))
36
+ (0, node_fs_1.mkdirSync)(dataDir, { recursive: true });
37
+ const path = getPath(dataDir);
38
+ (0, node_fs_1.writeFileSync)(path, JSON.stringify({ rules }));
39
+ }
40
+ function isDenied(rules, fromNodeId, _payloadType) {
41
+ for (const r of rules) {
42
+ if (r.action !== "deny")
43
+ continue;
44
+ if (r.id === "*" || r.id === fromNodeId)
45
+ return true;
46
+ }
47
+ return false;
48
+ }
49
+ function shouldRequireApproval(rules, fromNodeId, _payloadType) {
50
+ for (const r of rules) {
51
+ if (r.action !== "require_approval")
52
+ continue;
53
+ if (r.id === "*" || r.id === fromNodeId)
54
+ return true;
55
+ }
56
+ return false;
57
+ }
58
+ //# sourceMappingURL=policies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.js","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":";;AAmBA,oCAiBC;AAED,oCAIC;AAED,4BAMC;AAED,sDAMC;AA1DD;;GAEG;AACH,qCAA6E;AAC7E,yCAAiC;AAEjC,MAAM,aAAa,GAAG,eAAe,CAAC;AAStC,SAAS,OAAO,CAAC,OAAe;IAC9B,OAAO,IAAA,gBAAI,EAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CACtB,CAAC,CAAC,EAAmB,EAAE,CACrB,CAAC,IAAI,IAAI;YACT,OAAO,CAAC,KAAK,QAAQ;YACrB,OAAQ,CAAgB,CAAC,EAAE,KAAK,QAAQ;YACxC,CAAC,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAE,CAAgB,CAAC,MAAM,CAAC,CAC3D,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe,EAAE,KAAmB;IAC/D,IAAI,CAAC,IAAA,oBAAU,EAAC,OAAO,CAAC;QAAE,IAAA,mBAAS,EAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAA,uBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAgB,QAAQ,CAAC,KAAmB,EAAE,UAAkB,EAAE,YAAoB;IACpF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;YAAE,SAAS;QAClC,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,qBAAqB,CAAC,KAAmB,EAAE,UAAkB,EAAE,YAAoB;IACjG,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,KAAK,kBAAkB;YAAE,SAAS;QAC9C,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * WebSocket client to relay: signed challenge auth, send envelopes, reconnect with backoff.
3
+ */
4
+ import { type SignetEnvelopeWire, type Ed25519KeyPair, type KeyRevocation } from "@onsignet/core";
5
+ export interface WebChatInPayload {
6
+ sessionId: string;
7
+ visitorAuthLevel: string;
8
+ content: unknown;
9
+ }
10
+ export interface RelayClientOptions {
11
+ relayUrl: string;
12
+ nodeId: string;
13
+ ed25519KeyPair: Ed25519KeyPair;
14
+ onMessage: (_wire: SignetEnvelopeWire) => void | Promise<void>;
15
+ onConnectionChange?: (_connected: boolean) => void;
16
+ onWebChatMessage?: (_payload: WebChatInPayload) => void;
17
+ onKeyRevocation?: (_revocation: KeyRevocation) => void;
18
+ }
19
+ export declare class RelayClient {
20
+ private options;
21
+ private ws;
22
+ private backoff;
23
+ private reconnectTimer;
24
+ private registered;
25
+ private awaitingChallenge;
26
+ constructor(options: RelayClientOptions);
27
+ connect(): void;
28
+ private scheduleReconnect;
29
+ send(wire: SignetEnvelopeWire): boolean;
30
+ sendRaw(payload: unknown): boolean;
31
+ disconnect(): void;
32
+ isConnected(): boolean;
33
+ }
34
+ //# sourceMappingURL=relay-client.d.ts.map