@claude-flow/plugin-agent-federation 1.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +45 -0
  2. package/dist/application/federation-coordinator.d.ts +51 -0
  3. package/dist/application/federation-coordinator.d.ts.map +1 -0
  4. package/dist/application/federation-coordinator.js +201 -0
  5. package/dist/application/federation-coordinator.js.map +1 -0
  6. package/dist/application/policy-engine.d.ts +41 -0
  7. package/dist/application/policy-engine.d.ts.map +1 -0
  8. package/dist/application/policy-engine.js +175 -0
  9. package/dist/application/policy-engine.js.map +1 -0
  10. package/dist/application/trust-evaluator.d.ts +42 -0
  11. package/dist/application/trust-evaluator.d.ts.map +1 -0
  12. package/dist/application/trust-evaluator.js +132 -0
  13. package/dist/application/trust-evaluator.js.map +1 -0
  14. package/dist/bin.d.ts +13 -0
  15. package/dist/bin.d.ts.map +1 -0
  16. package/dist/bin.js +189 -0
  17. package/dist/bin.js.map +1 -0
  18. package/dist/cli-commands.d.ts +7 -0
  19. package/dist/cli-commands.d.ts.map +1 -0
  20. package/dist/cli-commands.js +198 -0
  21. package/dist/cli-commands.js.map +1 -0
  22. package/dist/domain/entities/federation-envelope.d.ts +45 -0
  23. package/dist/domain/entities/federation-envelope.d.ts.map +1 -0
  24. package/dist/domain/entities/federation-envelope.js +68 -0
  25. package/dist/domain/entities/federation-envelope.js.map +1 -0
  26. package/dist/domain/entities/federation-node.d.ts +49 -0
  27. package/dist/domain/entities/federation-node.d.ts.map +1 -0
  28. package/dist/domain/entities/federation-node.js +66 -0
  29. package/dist/domain/entities/federation-node.js.map +1 -0
  30. package/dist/domain/entities/federation-session.d.ts +55 -0
  31. package/dist/domain/entities/federation-session.d.ts.map +1 -0
  32. package/dist/domain/entities/federation-session.js +105 -0
  33. package/dist/domain/entities/federation-session.js.map +1 -0
  34. package/dist/domain/entities/trust-level.d.ts +17 -0
  35. package/dist/domain/entities/trust-level.d.ts.map +1 -0
  36. package/dist/domain/entities/trust-level.js +35 -0
  37. package/dist/domain/entities/trust-level.js.map +1 -0
  38. package/dist/domain/services/audit-service.d.ts +69 -0
  39. package/dist/domain/services/audit-service.d.ts.map +1 -0
  40. package/dist/domain/services/audit-service.js +149 -0
  41. package/dist/domain/services/audit-service.js.map +1 -0
  42. package/dist/domain/services/discovery-service.d.ts +51 -0
  43. package/dist/domain/services/discovery-service.d.ts.map +1 -0
  44. package/dist/domain/services/discovery-service.js +140 -0
  45. package/dist/domain/services/discovery-service.js.map +1 -0
  46. package/dist/domain/services/handshake-service.d.ts +48 -0
  47. package/dist/domain/services/handshake-service.d.ts.map +1 -0
  48. package/dist/domain/services/handshake-service.js +94 -0
  49. package/dist/domain/services/handshake-service.js.map +1 -0
  50. package/dist/domain/services/pii-pipeline-service.d.ts +65 -0
  51. package/dist/domain/services/pii-pipeline-service.d.ts.map +1 -0
  52. package/dist/domain/services/pii-pipeline-service.js +208 -0
  53. package/dist/domain/services/pii-pipeline-service.js.map +1 -0
  54. package/dist/domain/services/routing-service.d.ts +51 -0
  55. package/dist/domain/services/routing-service.d.ts.map +1 -0
  56. package/dist/domain/services/routing-service.js +147 -0
  57. package/dist/domain/services/routing-service.js.map +1 -0
  58. package/dist/index.d.ts +14 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +14 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/mcp-tools.d.ts +8 -0
  63. package/dist/mcp-tools.d.ts.map +1 -0
  64. package/dist/mcp-tools.js +217 -0
  65. package/dist/mcp-tools.js.map +1 -0
  66. package/dist/plugin.d.ts +17 -0
  67. package/dist/plugin.d.ts.map +1 -0
  68. package/dist/plugin.js +174 -0
  69. package/dist/plugin.js.map +1 -0
  70. package/package.json +33 -0
package/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # @claude-flow/plugin-agent-federation
2
+
3
+ Cross-installation agent federation with zero-trust security, PII-gated data flow, and compliance-grade audit trails.
4
+
5
+ ## Install + run
6
+
7
+ ```bash
8
+ npx -y -p @claude-flow/plugin-agent-federation@latest ruflo-federation --help
9
+ ```
10
+
11
+ ## Subcommands
12
+
13
+ | Command | Description |
14
+ |---|---|
15
+ | `ruflo-federation init` | Initialize federation on this node (generates keypair) |
16
+ | `ruflo-federation join <peer-url>` | Join a federation by connecting to a peer |
17
+ | `ruflo-federation leave` | Leave the current federation |
18
+ | `ruflo-federation peers` | List known peers and their trust levels |
19
+ | `ruflo-federation peers add <node-id>` | Add a peer to the federation |
20
+ | `ruflo-federation peers remove <node-id>` | Remove a peer |
21
+ | `ruflo-federation status` | Show federation health, sessions, trust levels |
22
+ | `ruflo-federation audit` | Query compliance-grade audit logs |
23
+ | `ruflo-federation trust` | Manage trust scores and tiers |
24
+ | `ruflo-federation config` | Show/update federation config |
25
+
26
+ ## Configuration via `.env`
27
+
28
+ ```bash
29
+ FEDERATION_NODE_NAME=my-node # default: hostname
30
+ FEDERATION_BIND_HOST=0.0.0.0 # default: 0.0.0.0
31
+ FEDERATION_BIND_PORT=8443 # default: 8443
32
+ FEDERATION_TRUST_LEVEL=untrusted # default: untrusted
33
+ ```
34
+
35
+ ## Tests
36
+
37
+ 325 unit tests covering audit, routing, discovery, plugin lifecycle.
38
+
39
+ ```bash
40
+ npm test
41
+ ```
42
+
43
+ ## License
44
+
45
+ MIT — Claude Flow Team.
@@ -0,0 +1,51 @@
1
+ import { FederationSession } from '../domain/entities/federation-session.js';
2
+ import { type FederationMessageType } from '../domain/entities/federation-envelope.js';
3
+ import { TrustLevel } from '../domain/entities/trust-level.js';
4
+ import { DiscoveryService, type FederationManifest } from '../domain/services/discovery-service.js';
5
+ import { HandshakeService } from '../domain/services/handshake-service.js';
6
+ import { RoutingService, type RoutingResult } from '../domain/services/routing-service.js';
7
+ import { AuditService } from '../domain/services/audit-service.js';
8
+ import { PIIPipelineService } from '../domain/services/pii-pipeline-service.js';
9
+ import { TrustEvaluator } from './trust-evaluator.js';
10
+ import { PolicyEngine } from './policy-engine.js';
11
+ export interface FederationCoordinatorConfig {
12
+ readonly nodeId: string;
13
+ readonly publicKey: string;
14
+ readonly endpoint: string;
15
+ readonly capabilities: readonly string[];
16
+ }
17
+ export interface FederationStatus {
18
+ readonly nodeId: string;
19
+ readonly activeSessions: number;
20
+ readonly knownPeers: number;
21
+ readonly trustLevels: Record<string, TrustLevel>;
22
+ readonly healthy: boolean;
23
+ }
24
+ export declare class FederationCoordinator {
25
+ private readonly config;
26
+ private readonly discovery;
27
+ private readonly handshake;
28
+ private readonly routing;
29
+ private readonly audit;
30
+ private readonly piiPipeline;
31
+ private readonly trustEvaluator;
32
+ private readonly policyEngine;
33
+ private readonly sessions;
34
+ private initialized;
35
+ constructor(config: FederationCoordinatorConfig, discovery: DiscoveryService, handshake: HandshakeService, routing: RoutingService, audit: AuditService, piiPipeline: PIIPipelineService, trustEvaluator: TrustEvaluator, policyEngine: PolicyEngine);
36
+ initialize(manifest: Omit<FederationManifest, 'signature'>): Promise<void>;
37
+ shutdown(): Promise<void>;
38
+ joinPeer(endpoint: string): Promise<FederationSession>;
39
+ leavePeer(nodeId: string): Promise<void>;
40
+ sendMessage<T>(targetNodeId: string, messageType: FederationMessageType, payload: T): Promise<RoutingResult>;
41
+ broadcastMessage<T>(messageType: FederationMessageType, payload: T): Promise<RoutingResult[]>;
42
+ handleThreatDetection(nodeId: string): void;
43
+ handleHmacFailure(nodeId: string): void;
44
+ getStatus(): FederationStatus;
45
+ getSession(sessionId: string): FederationSession | undefined;
46
+ getActiveSessions(): FederationSession[];
47
+ private establishSession;
48
+ private findSessionByNodeId;
49
+ private ensureInitialized;
50
+ }
51
+ //# sourceMappingURL=federation-coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation-coordinator.d.ts","sourceRoot":"","sources":["../../src/application/federation-coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,201 @@
1
+ import { TrustLevel } from '../domain/entities/trust-level.js';
2
+ export class FederationCoordinator {
3
+ config;
4
+ discovery;
5
+ handshake;
6
+ routing;
7
+ audit;
8
+ piiPipeline;
9
+ trustEvaluator;
10
+ policyEngine;
11
+ sessions;
12
+ initialized;
13
+ constructor(config, discovery, handshake, routing, audit, piiPipeline, trustEvaluator, policyEngine) {
14
+ this.config = config;
15
+ this.discovery = discovery;
16
+ this.handshake = handshake;
17
+ this.routing = routing;
18
+ this.audit = audit;
19
+ this.piiPipeline = piiPipeline;
20
+ this.trustEvaluator = trustEvaluator;
21
+ this.policyEngine = policyEngine;
22
+ this.sessions = new Map();
23
+ this.initialized = false;
24
+ }
25
+ async initialize(manifest) {
26
+ await this.discovery.publishManifest(manifest);
27
+ this.discovery.startPeriodicDiscovery();
28
+ this.initialized = true;
29
+ await this.audit.log('peer_manifest_published', {
30
+ metadata: { endpoint: this.config.endpoint },
31
+ });
32
+ }
33
+ async shutdown() {
34
+ this.discovery.stopPeriodicDiscovery();
35
+ for (const [sessionId, session] of this.sessions) {
36
+ session.terminate();
37
+ await this.audit.log('session_terminated', {
38
+ sessionId,
39
+ targetNodeId: session.remoteNodeId,
40
+ });
41
+ }
42
+ this.sessions.clear();
43
+ await this.audit.flush();
44
+ this.initialized = false;
45
+ }
46
+ async joinPeer(endpoint) {
47
+ this.ensureInitialized();
48
+ const node = await this.discovery.addStaticPeer(endpoint);
49
+ await this.audit.log('peer_discovered', {
50
+ targetNodeId: node.nodeId,
51
+ metadata: { endpoint },
52
+ });
53
+ return this.establishSession(node);
54
+ }
55
+ async leavePeer(nodeId) {
56
+ this.ensureInitialized();
57
+ const session = this.findSessionByNodeId(nodeId);
58
+ if (session) {
59
+ session.terminate();
60
+ this.sessions.delete(session.sessionId);
61
+ await this.audit.log('session_terminated', {
62
+ sessionId: session.sessionId,
63
+ targetNodeId: nodeId,
64
+ });
65
+ }
66
+ this.discovery.removePeer(nodeId);
67
+ }
68
+ async sendMessage(targetNodeId, messageType, payload) {
69
+ this.ensureInitialized();
70
+ const session = this.findSessionByNodeId(targetNodeId);
71
+ if (!session) {
72
+ return {
73
+ success: false,
74
+ mode: 'direct',
75
+ envelopeId: '',
76
+ targetNodeIds: [targetNodeId],
77
+ error: `No active session with node ${targetNodeId}`,
78
+ };
79
+ }
80
+ const policyResult = this.policyEngine.evaluateMessage(messageType, session.trustLevel, JSON.stringify(payload).length, this.config.nodeId);
81
+ if (!policyResult.allowed) {
82
+ await this.audit.log('message_rejected', {
83
+ targetNodeId,
84
+ sessionId: session.sessionId,
85
+ metadata: { reason: policyResult.reason },
86
+ });
87
+ return {
88
+ success: false,
89
+ mode: 'direct',
90
+ envelopeId: '',
91
+ targetNodeIds: [targetNodeId],
92
+ error: policyResult.reason,
93
+ };
94
+ }
95
+ const result = await this.routing.send(session, messageType, payload);
96
+ await this.audit.log(result.success ? 'message_sent' : 'message_rejected', {
97
+ targetNodeId,
98
+ sessionId: session.sessionId,
99
+ latencyMs: result.latencyMs,
100
+ metadata: { messageType, mode: result.mode },
101
+ });
102
+ return result;
103
+ }
104
+ async broadcastMessage(messageType, payload) {
105
+ this.ensureInitialized();
106
+ return this.routing.broadcast(messageType, payload);
107
+ }
108
+ handleThreatDetection(nodeId) {
109
+ const exceedsThreshold = this.trustEvaluator.recordThreatDetection(nodeId);
110
+ const node = this.discovery.getPeer(nodeId);
111
+ if (node && exceedsThreshold) {
112
+ this.trustEvaluator.downgrade(node, 'repeated-threat-detection');
113
+ const session = this.findSessionByNodeId(nodeId);
114
+ if (session) {
115
+ session.terminate();
116
+ this.sessions.delete(session.sessionId);
117
+ }
118
+ this.audit.log('threat_blocked', {
119
+ sourceNodeId: nodeId,
120
+ trustLevel: TrustLevel.UNTRUSTED,
121
+ threatDetected: true,
122
+ metadata: { reason: 'repeated-threat-detection' },
123
+ });
124
+ }
125
+ }
126
+ handleHmacFailure(nodeId) {
127
+ const node = this.discovery.getPeer(nodeId);
128
+ if (node) {
129
+ this.trustEvaluator.downgrade(node, 'hmac-verification-failure');
130
+ const session = this.findSessionByNodeId(nodeId);
131
+ if (session) {
132
+ session.terminate();
133
+ this.sessions.delete(session.sessionId);
134
+ }
135
+ this.audit.log('threat_blocked', {
136
+ sourceNodeId: nodeId,
137
+ trustLevel: TrustLevel.UNTRUSTED,
138
+ metadata: { reason: 'hmac-verification-failure' },
139
+ });
140
+ }
141
+ }
142
+ getStatus() {
143
+ const peers = this.discovery.listPeers();
144
+ const trustLevels = {};
145
+ for (const peer of peers) {
146
+ trustLevels[peer.nodeId] = peer.trustLevel;
147
+ }
148
+ return {
149
+ nodeId: this.config.nodeId,
150
+ activeSessions: Array.from(this.sessions.values()).filter(s => s.active).length,
151
+ knownPeers: peers.length,
152
+ trustLevels,
153
+ healthy: this.initialized,
154
+ };
155
+ }
156
+ getSession(sessionId) {
157
+ return this.sessions.get(sessionId);
158
+ }
159
+ getActiveSessions() {
160
+ return Array.from(this.sessions.values()).filter(s => s.active && !s.isExpired());
161
+ }
162
+ async establishSession(node) {
163
+ await this.audit.log('handshake_initiated', { targetNodeId: node.nodeId });
164
+ const challenge = await this.handshake.initiateHandshake(node);
165
+ const response = await this.handshake.respondToHandshake(challenge);
166
+ const result = await this.handshake.verifyChallenge(response, node);
167
+ if (!result.success || !result.session) {
168
+ await this.audit.log('handshake_failed', {
169
+ targetNodeId: node.nodeId,
170
+ metadata: { error: result.error },
171
+ });
172
+ throw new Error(`Handshake failed: ${result.error}`);
173
+ }
174
+ this.sessions.set(result.session.sessionId, result.session);
175
+ await this.audit.log('handshake_completed', {
176
+ targetNodeId: node.nodeId,
177
+ sessionId: result.session.sessionId,
178
+ trustLevel: result.session.trustLevel,
179
+ });
180
+ await this.audit.log('session_created', {
181
+ sessionId: result.session.sessionId,
182
+ targetNodeId: node.nodeId,
183
+ trustLevel: result.session.trustLevel,
184
+ });
185
+ return result.session;
186
+ }
187
+ findSessionByNodeId(nodeId) {
188
+ for (const session of this.sessions.values()) {
189
+ if (session.remoteNodeId === nodeId && session.active) {
190
+ return session;
191
+ }
192
+ }
193
+ return undefined;
194
+ }
195
+ ensureInitialized() {
196
+ if (!this.initialized) {
197
+ throw new Error('FederationCoordinator is not initialized. Call initialize() first.');
198
+ }
199
+ }
200
+ }
201
+ //# sourceMappingURL=federation-coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation-coordinator.js","sourceRoot":"","sources":["../../src/application/federation-coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { TrustLevel } from '../domain/entities/trust-level.js';
2
+ import { type PIIAction, type PIIDetection, type PIIPolicyConfig } from '../domain/services/pii-pipeline-service.js';
3
+ import { type FederationMessageType } from '../domain/entities/federation-envelope.js';
4
+ export type FederationClaimType = 'federation:discover' | 'federation:connect' | 'federation:read' | 'federation:write' | 'federation:admin' | 'federation:memory' | 'federation:spawn';
5
+ export interface SecurityPolicy {
6
+ readonly maxMessageSizeBytes: number;
7
+ readonly maxMessagesPerMinute: number;
8
+ readonly allowedMessageTypes: readonly FederationMessageType[];
9
+ readonly requirePiiScan: boolean;
10
+ readonly requireAiDefenceScan: boolean;
11
+ readonly minTrustLevelForWrite: TrustLevel;
12
+ readonly minTrustLevelForMemory: TrustLevel;
13
+ readonly minTrustLevelForSpawn: TrustLevel;
14
+ }
15
+ export interface PolicyEvaluationResult {
16
+ readonly allowed: boolean;
17
+ readonly reason: string;
18
+ readonly requiredClaims: readonly FederationClaimType[];
19
+ readonly trustLevelSufficient: boolean;
20
+ readonly piiAction?: PIIAction;
21
+ }
22
+ export interface PolicyEngineDeps {
23
+ checkClaim: (claim: FederationClaimType) => boolean;
24
+ }
25
+ export declare class PolicyEngine {
26
+ private readonly deps;
27
+ private readonly securityPolicy;
28
+ private readonly piiPolicy;
29
+ private readonly rateLimitCounters;
30
+ constructor(deps: PolicyEngineDeps, securityPolicy?: Partial<SecurityPolicy>, piiPolicy?: PIIPolicyConfig);
31
+ evaluateMessage(messageType: FederationMessageType, trustLevel: TrustLevel, messageSizeBytes: number, sourceNodeId: string): PolicyEvaluationResult;
32
+ evaluatePiiDetection(detection: PIIDetection, trustLevel: TrustLevel): PIIAction;
33
+ evaluateTrustChange(currentLevel: TrustLevel, proposedLevel: TrustLevel): {
34
+ allowed: boolean;
35
+ requiresHumanApproval: boolean;
36
+ reason: string;
37
+ };
38
+ private checkRateLimit;
39
+ private getOperationForMessageType;
40
+ }
41
+ //# sourceMappingURL=policy-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-engine.d.ts","sourceRoot":"","sources":["../../src/application/policy-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,mCAAmC,CAAC;AACnF,OAAO,EAAE,KAAK,SAAS,EAAgB,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,4CAA4C,CAAC;AACnI,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAEvF,MAAM,MAAM,mBAAmB,GAC3B,qBAAqB,GACrB,oBAAoB,GACpB,iBAAiB,GACjB,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,mBAAmB,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC/D,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,qBAAqB,EAAE,UAAU,CAAC;IAC3C,QAAQ,CAAC,sBAAsB,EAAE,UAAU,CAAC;IAC5C,QAAQ,CAAC,qBAAqB,EAAE,UAAU,CAAC;CAC5C;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACxD,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAmCD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC;CACrD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsD;gBAGtF,IAAI,EAAE,gBAAgB,EACtB,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,EACxC,SAAS,CAAC,EAAE,eAAe;IAc7B,eAAe,CACb,WAAW,EAAE,qBAAqB,EAClC,UAAU,EAAE,UAAU,EACtB,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,GACnB,sBAAsB;IAyDzB,oBAAoB,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,GAAG,SAAS;IAWhF,mBAAmB,CACjB,YAAY,EAAE,UAAU,EACxB,aAAa,EAAE,UAAU,GACxB;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,qBAAqB,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAgCvE,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,0BAA0B;CAyBnC"}
@@ -0,0 +1,175 @@
1
+ import { TrustLevel, isOperationAllowed } from '../domain/entities/trust-level.js';
2
+ const DEFAULT_SECURITY_POLICY = {
3
+ maxMessageSizeBytes: 1_048_576,
4
+ maxMessagesPerMinute: 120,
5
+ allowedMessageTypes: [
6
+ 'task-assignment', 'memory-query', 'memory-response',
7
+ 'context-share', 'status-broadcast', 'heartbeat',
8
+ 'trust-change', 'topology-change', 'agent-spawn',
9
+ ],
10
+ requirePiiScan: true,
11
+ requireAiDefenceScan: true,
12
+ minTrustLevelForWrite: TrustLevel.ATTESTED,
13
+ minTrustLevelForMemory: TrustLevel.TRUSTED,
14
+ minTrustLevelForSpawn: TrustLevel.PRIVILEGED,
15
+ };
16
+ const CLAIMS_FOR_MESSAGE_TYPE = {
17
+ 'task-assignment': ['federation:write'],
18
+ 'memory-query': ['federation:read', 'federation:memory'],
19
+ 'memory-response': ['federation:read', 'federation:memory'],
20
+ 'context-share': ['federation:write'],
21
+ 'status-broadcast': ['federation:read'],
22
+ 'trust-change': ['federation:admin'],
23
+ 'topology-change': ['federation:admin'],
24
+ 'agent-spawn': ['federation:spawn'],
25
+ 'heartbeat': ['federation:connect'],
26
+ 'challenge': ['federation:connect'],
27
+ 'challenge-response': ['federation:connect'],
28
+ 'handshake-init': ['federation:connect'],
29
+ 'handshake-accept': ['federation:connect'],
30
+ 'handshake-reject': ['federation:connect'],
31
+ 'session-terminate': ['federation:connect'],
32
+ };
33
+ export class PolicyEngine {
34
+ deps;
35
+ securityPolicy;
36
+ piiPolicy;
37
+ rateLimitCounters;
38
+ constructor(deps, securityPolicy, piiPolicy) {
39
+ this.deps = deps;
40
+ this.securityPolicy = { ...DEFAULT_SECURITY_POLICY, ...securityPolicy };
41
+ this.piiPolicy = piiPolicy ?? {
42
+ defaultAction: 'redact',
43
+ overrides: {},
44
+ hashAlgorithm: 'sha256',
45
+ hashSalt: '',
46
+ redactionPlaceholder: '[REDACTED:{type}]',
47
+ };
48
+ this.rateLimitCounters = new Map();
49
+ }
50
+ evaluateMessage(messageType, trustLevel, messageSizeBytes, sourceNodeId) {
51
+ if (!this.securityPolicy.allowedMessageTypes.includes(messageType)) {
52
+ return {
53
+ allowed: false,
54
+ reason: `Message type '${messageType}' is not allowed by security policy`,
55
+ requiredClaims: [],
56
+ trustLevelSufficient: false,
57
+ };
58
+ }
59
+ if (messageSizeBytes > this.securityPolicy.maxMessageSizeBytes) {
60
+ return {
61
+ allowed: false,
62
+ reason: `Message size ${messageSizeBytes} exceeds maximum ${this.securityPolicy.maxMessageSizeBytes}`,
63
+ requiredClaims: [],
64
+ trustLevelSufficient: true,
65
+ };
66
+ }
67
+ if (!this.checkRateLimit(sourceNodeId)) {
68
+ return {
69
+ allowed: false,
70
+ reason: `Rate limit exceeded for node ${sourceNodeId}`,
71
+ requiredClaims: [],
72
+ trustLevelSufficient: true,
73
+ };
74
+ }
75
+ const requiredClaims = CLAIMS_FOR_MESSAGE_TYPE[messageType] ?? [];
76
+ const missingClaims = requiredClaims.filter(c => !this.deps.checkClaim(c));
77
+ if (missingClaims.length > 0) {
78
+ return {
79
+ allowed: false,
80
+ reason: `Missing required claims: ${missingClaims.join(', ')}`,
81
+ requiredClaims,
82
+ trustLevelSufficient: true,
83
+ };
84
+ }
85
+ const operationForType = this.getOperationForMessageType(messageType);
86
+ if (!isOperationAllowed(trustLevel, operationForType)) {
87
+ return {
88
+ allowed: false,
89
+ reason: `Trust level ${trustLevel} insufficient for operation '${operationForType}'`,
90
+ requiredClaims,
91
+ trustLevelSufficient: false,
92
+ };
93
+ }
94
+ return {
95
+ allowed: true,
96
+ reason: 'Policy check passed',
97
+ requiredClaims,
98
+ trustLevelSufficient: true,
99
+ };
100
+ }
101
+ evaluatePiiDetection(detection, trustLevel) {
102
+ const override = this.piiPolicy.overrides[detection.type];
103
+ if (override?.trustLevelOverride?.[trustLevel]) {
104
+ return override.trustLevelOverride[trustLevel];
105
+ }
106
+ if (override?.action) {
107
+ return override.action;
108
+ }
109
+ return this.piiPolicy.defaultAction;
110
+ }
111
+ evaluateTrustChange(currentLevel, proposedLevel) {
112
+ if (proposedLevel > currentLevel && proposedLevel === TrustLevel.PRIVILEGED) {
113
+ return {
114
+ allowed: true,
115
+ requiresHumanApproval: true,
116
+ reason: 'Elevation to PRIVILEGED requires institutional attestation and human approval',
117
+ };
118
+ }
119
+ if (proposedLevel > currentLevel) {
120
+ return {
121
+ allowed: true,
122
+ requiresHumanApproval: false,
123
+ reason: `Trust upgrade from ${currentLevel} to ${proposedLevel} allowed`,
124
+ };
125
+ }
126
+ if (proposedLevel < currentLevel) {
127
+ return {
128
+ allowed: true,
129
+ requiresHumanApproval: false,
130
+ reason: `Trust downgrade from ${currentLevel} to ${proposedLevel} allowed`,
131
+ };
132
+ }
133
+ return {
134
+ allowed: false,
135
+ requiresHumanApproval: false,
136
+ reason: 'No trust level change',
137
+ };
138
+ }
139
+ checkRateLimit(nodeId) {
140
+ const now = Date.now();
141
+ const counter = this.rateLimitCounters.get(nodeId);
142
+ if (!counter || now - counter.windowStart > 60_000) {
143
+ this.rateLimitCounters.set(nodeId, { count: 1, windowStart: now });
144
+ return true;
145
+ }
146
+ counter.count++;
147
+ return counter.count <= this.securityPolicy.maxMessagesPerMinute;
148
+ }
149
+ getOperationForMessageType(messageType) {
150
+ switch (messageType) {
151
+ case 'memory-query':
152
+ case 'memory-response':
153
+ return 'query-redacted';
154
+ case 'context-share':
155
+ return 'share-context';
156
+ case 'task-assignment':
157
+ return 'send';
158
+ case 'agent-spawn':
159
+ return 'remote-spawn';
160
+ case 'status-broadcast':
161
+ return 'status';
162
+ case 'heartbeat':
163
+ case 'challenge':
164
+ case 'challenge-response':
165
+ case 'handshake-init':
166
+ case 'handshake-accept':
167
+ case 'handshake-reject':
168
+ case 'session-terminate':
169
+ return 'ping';
170
+ default:
171
+ return 'send';
172
+ }
173
+ }
174
+ }
175
+ //# sourceMappingURL=policy-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-engine.js","sourceRoot":"","sources":["../../src/application/policy-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { TrustLevel } from '../domain/entities/trust-level.js';
2
+ import { FederationNode } from '../domain/entities/federation-node.js';
3
+ import { type SessionMetrics } from '../domain/entities/federation-session.js';
4
+ export interface TrustScoreComponents {
5
+ readonly successRate: number;
6
+ readonly uptime: number;
7
+ readonly threatPenalty: number;
8
+ readonly dataIntegrityScore: number;
9
+ }
10
+ export interface TrustTransitionResult {
11
+ readonly previousLevel: TrustLevel;
12
+ readonly newLevel: TrustLevel;
13
+ readonly score: number;
14
+ readonly components: TrustScoreComponents;
15
+ readonly reason: string;
16
+ readonly requiresHumanApproval: boolean;
17
+ }
18
+ export type ImmediateDowngradeReason = 'repeated-threat-detection' | 'hmac-verification-failure' | 'session-hijack-attempt';
19
+ export interface TrustEvaluatorDeps {
20
+ onTrustChange?: (nodeId: string, result: TrustTransitionResult) => void;
21
+ }
22
+ export interface ThreatWindow {
23
+ readonly detections: Date[];
24
+ readonly windowMs: number;
25
+ readonly threshold: number;
26
+ }
27
+ export declare class TrustEvaluator {
28
+ private readonly deps;
29
+ private readonly threatWindows;
30
+ constructor(deps?: TrustEvaluatorDeps);
31
+ computeScore(metrics: SessionMetrics, uptimeRatio: number): {
32
+ score: number;
33
+ components: TrustScoreComponents;
34
+ };
35
+ evaluateTransition(node: FederationNode, metrics: SessionMetrics, uptimeRatio: number, hasInstitutionalAttestation?: boolean): TrustTransitionResult | null;
36
+ downgrade(node: FederationNode, reason: ImmediateDowngradeReason): TrustTransitionResult;
37
+ recordThreatDetection(nodeId: string): boolean;
38
+ private checkUpgrade;
39
+ private checkDowngrade;
40
+ private computeThreatPenalty;
41
+ }
42
+ //# sourceMappingURL=trust-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust-evaluator.d.ts","sourceRoot":"","sources":["../../src/application/trust-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA+B,MAAM,mCAAmC,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE/E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;CACzC;AAED,MAAM,MAAM,wBAAwB,GAChC,2BAA2B,GAC3B,2BAA2B,GAC3B,wBAAwB,CAAC;AAE7B,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACzE;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAQD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;gBAExC,IAAI,GAAE,kBAAuB;IAKzC,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,oBAAoB,CAAA;KAAE;IA8B/G,kBAAkB,CAChB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,MAAM,EACnB,2BAA2B,GAAE,OAAe,GAC3C,qBAAqB,GAAG,IAAI;IA4C/B,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,wBAAwB,GAAG,qBAAqB;IAmBxF,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAY9C,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,oBAAoB;CAK7B"}