@claude-flow/plugin-agent-federation 1.0.0-alpha.5 → 1.0.0-alpha.6

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 (31) hide show
  1. package/dist/application/federation-breaker-service.d.ts +182 -0
  2. package/dist/application/federation-breaker-service.d.ts.map +1 -0
  3. package/dist/application/federation-breaker-service.js +251 -0
  4. package/dist/application/federation-breaker-service.js.map +1 -0
  5. package/dist/application/federation-coordinator.d.ts +35 -1
  6. package/dist/application/federation-coordinator.d.ts.map +1 -1
  7. package/dist/application/federation-coordinator.js +72 -2
  8. package/dist/application/federation-coordinator.js.map +1 -1
  9. package/dist/application/policy-engine.d.ts.map +1 -1
  10. package/dist/application/policy-engine.js +9 -0
  11. package/dist/application/policy-engine.js.map +1 -1
  12. package/dist/domain/entities/federation-envelope.d.ts +1 -1
  13. package/dist/domain/entities/federation-envelope.d.ts.map +1 -1
  14. package/dist/domain/entities/federation-envelope.js +3 -0
  15. package/dist/domain/entities/federation-envelope.js.map +1 -1
  16. package/dist/domain/entities/federation-node.d.ts +55 -0
  17. package/dist/domain/entities/federation-node.d.ts.map +1 -1
  18. package/dist/domain/entities/federation-node.js +86 -0
  19. package/dist/domain/entities/federation-node.js.map +1 -1
  20. package/dist/domain/value-objects/federation-budget.d.ts +89 -0
  21. package/dist/domain/value-objects/federation-budget.d.ts.map +1 -0
  22. package/dist/domain/value-objects/federation-budget.js +165 -0
  23. package/dist/domain/value-objects/federation-budget.js.map +1 -0
  24. package/dist/domain/value-objects/federation-node-state.d.ts +92 -0
  25. package/dist/domain/value-objects/federation-node-state.d.ts.map +1 -0
  26. package/dist/domain/value-objects/federation-node-state.js +100 -0
  27. package/dist/domain/value-objects/federation-node-state.js.map +1 -0
  28. package/dist/mcp-tools.d.ts.map +1 -1
  29. package/dist/mcp-tools.js +34 -2
  30. package/dist/mcp-tools.js.map +1 -1
  31. package/package.json +2 -2
@@ -1 +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"}
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;AA4CD,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"}
@@ -29,6 +29,15 @@ const CLAIMS_FOR_MESSAGE_TYPE = {
29
29
  'handshake-accept': ['federation:connect'],
30
30
  'handshake-reject': ['federation:connect'],
31
31
  'session-terminate': ['federation:connect'],
32
+ // ADR-101 Component C — federated claims operations.
33
+ // claim-event: broadcasts a ClaimDomainEvent (state mutation across peers),
34
+ // same authorization shape as task-assignment.
35
+ 'claim-event': ['federation:write'],
36
+ // agent-handoff: transfers claim ownership to a remote agent. Requires
37
+ // both the write capability (state mutation) AND spawn-lifecycle authority
38
+ // (handoff is a sibling of agent-spawn — both reshape who owns work).
39
+ // Matches the consensus-gated security posture in ADR-101.
40
+ 'agent-handoff': ['federation:write', 'federation:spawn'],
32
41
  };
33
42
  export class PolicyEngine {
34
43
  deps;
@@ -1 +1 @@
1
- {"version":3,"file":"policy-engine.js","sourceRoot":"","sources":["../../src/application/policy-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"policy-engine.js","sourceRoot":"","sources":["../../src/application/policy-engine.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export type FederationMessageType = 'task-assignment' | 'memory-query' | 'memory-response' | 'context-share' | 'status-broadcast' | 'trust-change' | 'topology-change' | 'agent-spawn' | 'heartbeat' | 'challenge' | 'challenge-response' | 'handshake-init' | 'handshake-accept' | 'handshake-reject' | 'session-terminate';
1
+ export type FederationMessageType = 'task-assignment' | 'memory-query' | 'memory-response' | 'context-share' | 'status-broadcast' | 'trust-change' | 'topology-change' | 'agent-spawn' | 'heartbeat' | 'challenge' | 'challenge-response' | 'handshake-init' | 'handshake-accept' | 'handshake-reject' | 'session-terminate' | 'claim-event' | 'agent-handoff';
2
2
  export type PIIScanAction = 'pass' | 'redact' | 'hash' | 'block';
3
3
  export interface PIIScanResult {
4
4
  readonly scanned: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"federation-envelope.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/federation-envelope.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAC7B,iBAAiB,GACjB,cAAc,GACd,iBAAiB,GACjB,eAAe,GACf,kBAAkB,GAClB,cAAc,GACd,iBAAiB,GACjB,aAAa,GACb,WAAW,GACX,WAAW,GACX,oBAAoB,GACpB,gBAAgB,GAChB,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,CAAC;AAExB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACjD,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IAClD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,OAAO;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;CACvC;AAED,qBAAa,kBAAkB,CAAC,CAAC,GAAG,OAAO;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;gBAE1B,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAa7C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAejC,iBAAiB,IAAI,MAAM;IAa3B,MAAM,CAAC,eAAe,IAAI,aAAa;CASxC;AAED,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,qBAAqB,CAItE,CAAC"}
1
+ {"version":3,"file":"federation-envelope.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/federation-envelope.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAC7B,iBAAiB,GACjB,cAAc,GACd,iBAAiB,GACjB,eAAe,GACf,kBAAkB,GAClB,cAAc,GACd,iBAAiB,GACjB,aAAa,GACb,WAAW,GACX,WAAW,GACX,oBAAoB,GACpB,gBAAgB,GAChB,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,GAEnB,aAAa,GACb,eAAe,CAAC;AAEpB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACjD,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IAClD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,OAAO;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;CACvC;AAED,qBAAa,kBAAkB,CAAC,CAAC,GAAG,OAAO;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;gBAE1B,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAa7C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAejC,iBAAiB,IAAI,MAAM;IAa3B,MAAM,CAAC,eAAe,IAAI,aAAa;CASxC;AAED,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,qBAAqB,CAOtE,CAAC"}
@@ -64,5 +64,8 @@ export const CONSENSUS_REQUIRED_TYPES = new Set([
64
64
  'trust-change',
65
65
  'topology-change',
66
66
  'agent-spawn',
67
+ // ADR-101 Component C: handoffs cross trust boundaries — optionally
68
+ // require quorum from validators in high-trust deployments.
69
+ 'agent-handoff',
67
70
  ]);
68
71
  //# sourceMappingURL=federation-envelope.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"federation-envelope.js","sourceRoot":"","sources":["../../../src/domain/entities/federation-envelope.ts"],"names":[],"mappings":"AA8CA,MAAM,OAAO,kBAAkB;IACpB,UAAU,CAAS;IACnB,YAAY,CAAS;IACrB,YAAY,CAAS;IACrB,SAAS,CAAS;IAClB,WAAW,CAAwB;IACnC,OAAO,CAAI;IACX,SAAS,CAAO;IAChB,KAAK,CAAS;IACd,aAAa,CAAS;IACtB,aAAa,CAAgB;IAEtC,YAAY,KAAiC;QAC3C,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC3C,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC;IAC1D,CAAC;IAED,MAAM;QACJ,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;YACvC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;YACvC,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,eAAe;QACpB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,EAAE;YAClB,cAAc,EAAE,CAAC;SAClB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAuC,IAAI,GAAG,CAAC;IAClF,cAAc;IACd,iBAAiB;IACjB,aAAa;CACd,CAAC,CAAC"}
1
+ {"version":3,"file":"federation-envelope.js","sourceRoot":"","sources":["../../../src/domain/entities/federation-envelope.ts"],"names":[],"mappings":"AAiDA,MAAM,OAAO,kBAAkB;IACpB,UAAU,CAAS;IACnB,YAAY,CAAS;IACrB,YAAY,CAAS;IACrB,SAAS,CAAS;IAClB,WAAW,CAAwB;IACnC,OAAO,CAAI;IACX,SAAS,CAAO;IAChB,KAAK,CAAS;IACd,aAAa,CAAS;IACtB,aAAa,CAAgB;IAEtC,YAAY,KAAiC;QAC3C,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC3C,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC;IAC1D,CAAC;IAED,MAAM;QACJ,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;YACvC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;YACvC,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,eAAe;QACpB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,EAAE;YAClB,cAAc,EAAE,CAAC;SAClB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAuC,IAAI,GAAG,CAAC;IAClF,cAAc;IACd,iBAAiB;IACjB,aAAa;IACb,oEAAoE;IACpE,4DAA4D;IAC5D,eAAe;CAChB,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { TrustLevel } from './trust-level.js';
2
+ import { FederationNodeState, SuspensionReason, TransitionReason } from '../value-objects/federation-node-state.js';
2
3
  export interface FederationNodeCapabilities {
3
4
  readonly agentTypes: readonly string[];
4
5
  readonly maxConcurrentSessions: number;
@@ -11,6 +12,13 @@ export interface FederationNodeMetadata {
11
12
  readonly version?: string;
12
13
  readonly [key: string]: unknown;
13
14
  }
15
+ /** Last-transition record kept on the entity for the audit trail. */
16
+ export interface FederationNodeStateRecord {
17
+ readonly state: FederationNodeState;
18
+ readonly changedAt: Date;
19
+ readonly reason?: SuspensionReason;
20
+ readonly correlationId?: string;
21
+ }
14
22
  export interface FederationNodeProps {
15
23
  readonly nodeId: string;
16
24
  readonly publicKey: string;
@@ -20,6 +28,14 @@ export interface FederationNodeProps {
20
28
  readonly trustScore: number;
21
29
  readonly lastSeen: Date;
22
30
  readonly metadata: FederationNodeMetadata;
31
+ /** Phase 2: peer state. Defaults to ACTIVE if unset. */
32
+ readonly state?: FederationNodeState;
33
+ /** Phase 2: when the current state was entered. Defaults to now. */
34
+ readonly stateChangedAt?: Date;
35
+ /** Phase 2: why we entered the current non-ACTIVE state. */
36
+ readonly stateReason?: SuspensionReason;
37
+ /** Phase 2: caller correlation key for the last transition. */
38
+ readonly stateCorrelationId?: string;
23
39
  }
24
40
  export declare class FederationNode {
25
41
  readonly nodeId: string;
@@ -30,15 +46,54 @@ export declare class FederationNode {
30
46
  private _trustScore;
31
47
  private _lastSeen;
32
48
  private readonly _metadata;
49
+ private _state;
50
+ private _stateChangedAt;
51
+ private _stateReason?;
52
+ private _stateCorrelationId?;
33
53
  constructor(props: FederationNodeProps);
34
54
  get trustLevel(): TrustLevel;
35
55
  get trustScore(): number;
36
56
  get lastSeen(): Date;
37
57
  get metadata(): FederationNodeMetadata;
58
+ /** Current peer state (ADR-097 Phase 2). */
59
+ get state(): FederationNodeState;
60
+ /** When the current state was entered. */
61
+ get stateChangedAt(): Date;
62
+ /** Last-transition record for the audit trail. */
63
+ get stateRecord(): FederationNodeStateRecord;
64
+ /** Convenience predicate: is this peer accepting outbound sends? */
65
+ get isActive(): boolean;
66
+ /** Convenience predicate: is this peer terminally evicted? */
67
+ get isEvicted(): boolean;
38
68
  updateTrustLevel(level: TrustLevel): void;
39
69
  updateTrustScore(score: number): void;
40
70
  markSeen(): void;
41
71
  isStale(maxAgeMs: number): boolean;
72
+ /**
73
+ * Transition this peer to SUSPENDED. Legal from ACTIVE only — calling
74
+ * from SUSPENDED or EVICTED returns false (the entity is already at or
75
+ * past the breaker threshold, so a duplicate trip is a no-op).
76
+ *
77
+ * Returns true if the state changed, false if the call was rejected
78
+ * (illegal transition). The breaker treats false as "already handled."
79
+ */
80
+ suspend(reason: TransitionReason, now?: Date): boolean;
81
+ /**
82
+ * Transition this peer to EVICTED. Legal from ACTIVE or SUSPENDED.
83
+ * EVICTED is terminal under normal flow — only `reactivate` (operator-
84
+ * initiated) can move the peer back to ACTIVE.
85
+ */
86
+ evict(reason: TransitionReason, now?: Date): boolean;
87
+ /**
88
+ * Transition back to ACTIVE. Legal from SUSPENDED (after cooldown +
89
+ * probe success — the breaker is responsible for those checks; this
90
+ * entity does not gate on time) or from EVICTED (operator override).
91
+ *
92
+ * `correlationId` lets the caller record *why* they're reactivating
93
+ * (probe ID, operator ticket, etc.) for the audit trail.
94
+ */
95
+ reactivate(correlationId?: string, now?: Date): boolean;
96
+ private _transition;
42
97
  toProps(): FederationNodeProps;
43
98
  static create(props: Omit<FederationNodeProps, 'trustLevel' | 'trustScore' | 'lastSeen'> & {
44
99
  trustLevel?: TrustLevel;
@@ -1 +1 @@
1
- {"version":3,"file":"federation-node.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/federation-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,0BAA0B,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;CAC3C;AAED,qBAAa,cAAc;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,0BAA0B,CAAC;IAElD,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;gBAEvC,KAAK,EAAE,mBAAmB;IAWtC,IAAI,UAAU,IAAI,UAAU,CAE3B;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,QAAQ,IAAI,IAAI,CAEnB;IAED,IAAI,QAAQ,IAAI,sBAAsB,CAErC;IAED,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAIzC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC,QAAQ,IAAI,IAAI;IAIhB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIlC,OAAO,IAAI,mBAAmB;IAa9B,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC,GAAG;QACzF,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,IAAI,CAAC;KACjB,GAAG,cAAc;CAQnB"}
1
+ {"version":3,"file":"federation-node.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/federation-node.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { TrustLevel } from './trust-level.js';
2
+ import { FederationNodeState, canTransition, } from '../value-objects/federation-node-state.js';
2
3
  export class FederationNode {
3
4
  nodeId;
4
5
  publicKey;
@@ -8,6 +9,13 @@ export class FederationNode {
8
9
  _trustScore;
9
10
  _lastSeen;
10
11
  _metadata;
12
+ // Phase 2 state machine. Mutated only via suspend()/evict()/reactivate().
13
+ // Direct field writes are not permitted — every transition flows through
14
+ // canTransition() in federation-node-state.ts.
15
+ _state;
16
+ _stateChangedAt;
17
+ _stateReason;
18
+ _stateCorrelationId;
11
19
  constructor(props) {
12
20
  this.nodeId = props.nodeId;
13
21
  this.publicKey = props.publicKey;
@@ -17,6 +25,10 @@ export class FederationNode {
17
25
  this._trustScore = props.trustScore;
18
26
  this._lastSeen = props.lastSeen;
19
27
  this._metadata = props.metadata;
28
+ this._state = props.state ?? FederationNodeState.ACTIVE;
29
+ this._stateChangedAt = props.stateChangedAt ?? new Date();
30
+ this._stateReason = props.stateReason;
31
+ this._stateCorrelationId = props.stateCorrelationId;
20
32
  }
21
33
  get trustLevel() {
22
34
  return this._trustLevel;
@@ -30,6 +42,31 @@ export class FederationNode {
30
42
  get metadata() {
31
43
  return this._metadata;
32
44
  }
45
+ /** Current peer state (ADR-097 Phase 2). */
46
+ get state() {
47
+ return this._state;
48
+ }
49
+ /** When the current state was entered. */
50
+ get stateChangedAt() {
51
+ return this._stateChangedAt;
52
+ }
53
+ /** Last-transition record for the audit trail. */
54
+ get stateRecord() {
55
+ return {
56
+ state: this._state,
57
+ changedAt: this._stateChangedAt,
58
+ reason: this._stateReason,
59
+ correlationId: this._stateCorrelationId,
60
+ };
61
+ }
62
+ /** Convenience predicate: is this peer accepting outbound sends? */
63
+ get isActive() {
64
+ return this._state === FederationNodeState.ACTIVE;
65
+ }
66
+ /** Convenience predicate: is this peer terminally evicted? */
67
+ get isEvicted() {
68
+ return this._state === FederationNodeState.EVICTED;
69
+ }
33
70
  updateTrustLevel(level) {
34
71
  this._trustLevel = level;
35
72
  }
@@ -42,6 +79,51 @@ export class FederationNode {
42
79
  isStale(maxAgeMs) {
43
80
  return Date.now() - this._lastSeen.getTime() > maxAgeMs;
44
81
  }
82
+ /**
83
+ * Transition this peer to SUSPENDED. Legal from ACTIVE only — calling
84
+ * from SUSPENDED or EVICTED returns false (the entity is already at or
85
+ * past the breaker threshold, so a duplicate trip is a no-op).
86
+ *
87
+ * Returns true if the state changed, false if the call was rejected
88
+ * (illegal transition). The breaker treats false as "already handled."
89
+ */
90
+ suspend(reason, now = new Date()) {
91
+ return this._transition(FederationNodeState.SUSPENDED, reason, now);
92
+ }
93
+ /**
94
+ * Transition this peer to EVICTED. Legal from ACTIVE or SUSPENDED.
95
+ * EVICTED is terminal under normal flow — only `reactivate` (operator-
96
+ * initiated) can move the peer back to ACTIVE.
97
+ */
98
+ evict(reason, now = new Date()) {
99
+ return this._transition(FederationNodeState.EVICTED, reason, now);
100
+ }
101
+ /**
102
+ * Transition back to ACTIVE. Legal from SUSPENDED (after cooldown +
103
+ * probe success — the breaker is responsible for those checks; this
104
+ * entity does not gate on time) or from EVICTED (operator override).
105
+ *
106
+ * `correlationId` lets the caller record *why* they're reactivating
107
+ * (probe ID, operator ticket, etc.) for the audit trail.
108
+ */
109
+ reactivate(correlationId, now = new Date()) {
110
+ if (!canTransition(this._state, FederationNodeState.ACTIVE))
111
+ return false;
112
+ this._state = FederationNodeState.ACTIVE;
113
+ this._stateChangedAt = now;
114
+ this._stateReason = undefined;
115
+ this._stateCorrelationId = correlationId;
116
+ return true;
117
+ }
118
+ _transition(target, reason, now) {
119
+ if (!canTransition(this._state, target))
120
+ return false;
121
+ this._state = target;
122
+ this._stateChangedAt = now;
123
+ this._stateReason = reason.reason;
124
+ this._stateCorrelationId = reason.correlationId;
125
+ return true;
126
+ }
45
127
  toProps() {
46
128
  return {
47
129
  nodeId: this.nodeId,
@@ -52,6 +134,10 @@ export class FederationNode {
52
134
  trustScore: this._trustScore,
53
135
  lastSeen: this._lastSeen,
54
136
  metadata: this._metadata,
137
+ state: this._state,
138
+ stateChangedAt: this._stateChangedAt,
139
+ stateReason: this._stateReason,
140
+ stateCorrelationId: this._stateCorrelationId,
55
141
  };
56
142
  }
57
143
  static create(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"federation-node.js","sourceRoot":"","sources":["../../../src/domain/entities/federation-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AA2B9C,MAAM,OAAO,cAAc;IAChB,MAAM,CAAS;IACf,SAAS,CAAS;IAClB,QAAQ,CAAS;IACjB,YAAY,CAA6B;IAE1C,WAAW,CAAa;IACxB,WAAW,CAAS;IACpB,SAAS,CAAO;IACP,SAAS,CAAyB;IAEnD,YAAY,KAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,gBAAgB,CAAC,KAAiB;QAChC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,QAAgB;QACtB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC;IAC1D,CAAC;IAED,OAAO;QACL,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,QAAQ,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,KAIb;QACC,OAAO,IAAI,cAAc,CAAC;YACxB,GAAG,KAAK;YACR,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS;YACpD,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,CAAC;YACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI,IAAI,EAAE;SACvC,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"federation-node.js","sourceRoot":"","sources":["../../../src/domain/entities/federation-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Federation budget + hop counter (ADR-097 Phase 1).
3
+ *
4
+ * Carried in {@link FederationEnvelope} alongside the existing
5
+ * sourceNodeId/targetNodeId/payload. Sender supplies the original limits;
6
+ * each outbound hop increments hopCount and decrements remaining budget.
7
+ *
8
+ * Phase 1 enforces at the *send* side because there is no inbound
9
+ * dispatcher today (sendToNode is a stub — see researcher report).
10
+ * Phase 2 will move the decrement to receive once the inbound path lands.
11
+ *
12
+ * Security invariants pinned by the reviewer (audit_1776853149979 follow-up):
13
+ *
14
+ * 1. validateBudget rejects NaN, ±Infinity, negative numbers, and
15
+ * non-integer hop counts. Returns a discriminated result so callers
16
+ * cannot accidentally use a bad budget unchecked.
17
+ * 2. enforceBudget runs check-then-decrement in a single synchronous
18
+ * function with no awaits inside — two concurrent send calls cannot
19
+ * both pass the pre-check.
20
+ * 3. Errors return constant strings ("HOP_LIMIT_EXCEEDED" /
21
+ * "BUDGET_EXCEEDED") with no remaining-budget echo so a caller can't
22
+ * use the error response as an oracle for the threshold.
23
+ */
24
+ /** Maximum hops a federation message may travel before the breaker opens. */
25
+ export declare const DEFAULT_MAX_HOPS = 8;
26
+ /**
27
+ * Caller-supplied budget. All fields are optional; omitted fields are
28
+ * treated as Infinity for the corresponding axis. Created via validateBudget;
29
+ * never construct directly.
30
+ */
31
+ export interface Budget {
32
+ readonly maxHops: number;
33
+ readonly maxTokens: number;
34
+ readonly maxUsd: number;
35
+ }
36
+ /** Discriminated result of validating raw user input into a Budget. */
37
+ export type BudgetValidationResult = {
38
+ ok: true;
39
+ budget: Budget;
40
+ } | {
41
+ ok: false;
42
+ error: string;
43
+ };
44
+ /**
45
+ * Validate a raw budget object. Pure, no side effects. Caller obtains either
46
+ * a guaranteed-safe Budget or a structured error suitable for logging.
47
+ *
48
+ * Accepts undefined/null and returns a default unbounded budget (maxHops =
49
+ * DEFAULT_MAX_HOPS, tokens/usd = Infinity). This preserves backward
50
+ * compatibility for callers that don't pass a budget at all.
51
+ */
52
+ export declare function validateBudget(raw: unknown, overrideMaxHops?: unknown): BudgetValidationResult;
53
+ /**
54
+ * Enforcement decision returned by enforceBudget. Discriminated so the
55
+ * caller can map directly to a constant-string error — no remaining-budget
56
+ * echo on the failure side (anti-oracle).
57
+ */
58
+ export type BudgetEnforcement = {
59
+ ok: true;
60
+ nextHopCount: number;
61
+ remaining: Budget;
62
+ } | {
63
+ ok: false;
64
+ reason: 'HOP_LIMIT_EXCEEDED' | 'BUDGET_EXCEEDED';
65
+ };
66
+ /**
67
+ * Atomic (single synchronous function, no internal awaits) hop check.
68
+ *
69
+ * Returns the hopCount value the OUTBOUND envelope should carry plus the
70
+ * remaining budget that downstream peers will see. Callers must use the
71
+ * returned values; mutating the input Budget is forbidden (it's readonly).
72
+ *
73
+ * Contract:
74
+ * - hopCount represents how many hops the message has already taken.
75
+ * - The next outbound hop increments it: nextHopCount = hopCount + 1.
76
+ * - The check fires AFTER increment: nextHopCount must be <= maxHops.
77
+ * - This means maxHops=0 refuses to forward at all, which matches the
78
+ * ADR's "no remote delegation allowed" semantic.
79
+ *
80
+ * tokensSpent / usdSpent are caller-reported actuals from the immediately
81
+ * preceding leg (or 0 on the originator). The check fires on the
82
+ * *post-spend* totals so a leg that overshoots is caught before the next
83
+ * outbound dispatch.
84
+ */
85
+ export declare function enforceBudget(budget: Budget, hopCount: number, spent?: {
86
+ tokens: number;
87
+ usd: number;
88
+ }): BudgetEnforcement;
89
+ //# sourceMappingURL=federation-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation-budget.d.ts","sourceRoot":"","sources":["../../../src/domain/value-objects/federation-budget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAQlC;;;;GAIG;AACH,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,uEAAuE;AACvE,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EACZ,eAAe,CAAC,EAAE,OAAO,GACxB,sBAAsB,CA6DxB;AAkCD;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,oBAAoB,GAAG,iBAAiB,CAAA;CAAE,CAAC;AAEpE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAA0B,GAC7D,iBAAiB,CAuBnB"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Federation budget + hop counter (ADR-097 Phase 1).
3
+ *
4
+ * Carried in {@link FederationEnvelope} alongside the existing
5
+ * sourceNodeId/targetNodeId/payload. Sender supplies the original limits;
6
+ * each outbound hop increments hopCount and decrements remaining budget.
7
+ *
8
+ * Phase 1 enforces at the *send* side because there is no inbound
9
+ * dispatcher today (sendToNode is a stub — see researcher report).
10
+ * Phase 2 will move the decrement to receive once the inbound path lands.
11
+ *
12
+ * Security invariants pinned by the reviewer (audit_1776853149979 follow-up):
13
+ *
14
+ * 1. validateBudget rejects NaN, ±Infinity, negative numbers, and
15
+ * non-integer hop counts. Returns a discriminated result so callers
16
+ * cannot accidentally use a bad budget unchecked.
17
+ * 2. enforceBudget runs check-then-decrement in a single synchronous
18
+ * function with no awaits inside — two concurrent send calls cannot
19
+ * both pass the pre-check.
20
+ * 3. Errors return constant strings ("HOP_LIMIT_EXCEEDED" /
21
+ * "BUDGET_EXCEEDED") with no remaining-budget echo so a caller can't
22
+ * use the error response as an oracle for the threshold.
23
+ */
24
+ /** Maximum hops a federation message may travel before the breaker opens. */
25
+ export const DEFAULT_MAX_HOPS = 8;
26
+ /** Hard ceiling on caller-supplied maxUsd to prevent absurd integer math. */
27
+ const MAX_USD_CEILING = 1_000_000;
28
+ /** Hard ceiling on caller-supplied maxTokens. 1B tokens is more than any real session. */
29
+ const MAX_TOKENS_CEILING = 1_000_000_000;
30
+ /** Hard ceiling on hop count. */
31
+ const MAX_HOPS_CEILING = 64;
32
+ /**
33
+ * Validate a raw budget object. Pure, no side effects. Caller obtains either
34
+ * a guaranteed-safe Budget or a structured error suitable for logging.
35
+ *
36
+ * Accepts undefined/null and returns a default unbounded budget (maxHops =
37
+ * DEFAULT_MAX_HOPS, tokens/usd = Infinity). This preserves backward
38
+ * compatibility for callers that don't pass a budget at all.
39
+ */
40
+ export function validateBudget(raw, overrideMaxHops) {
41
+ // Default unbounded budget when caller passes nothing.
42
+ if (raw == null && overrideMaxHops == null) {
43
+ return {
44
+ ok: true,
45
+ budget: {
46
+ maxHops: DEFAULT_MAX_HOPS,
47
+ maxTokens: Number.POSITIVE_INFINITY,
48
+ maxUsd: Number.POSITIVE_INFINITY,
49
+ },
50
+ };
51
+ }
52
+ // Caller passed a bare maxHops without a budget object — accept it as a
53
+ // hop-only budget. Useful for "no remote delegation allowed" via
54
+ // maxHops: 0.
55
+ if (raw == null && overrideMaxHops != null) {
56
+ const hopCheck = checkHops(overrideMaxHops);
57
+ if (!hopCheck.ok)
58
+ return hopCheck;
59
+ return {
60
+ ok: true,
61
+ budget: {
62
+ maxHops: hopCheck.value,
63
+ maxTokens: Number.POSITIVE_INFINITY,
64
+ maxUsd: Number.POSITIVE_INFINITY,
65
+ },
66
+ };
67
+ }
68
+ if (typeof raw !== 'object' || Array.isArray(raw)) {
69
+ return { ok: false, error: 'budget must be an object' };
70
+ }
71
+ const obj = raw;
72
+ const hopsRaw = overrideMaxHops ?? obj.maxHops;
73
+ const hopCheck = hopsRaw == null
74
+ ? { ok: true, value: DEFAULT_MAX_HOPS }
75
+ : checkHops(hopsRaw);
76
+ if (!hopCheck.ok)
77
+ return hopCheck;
78
+ const tokensCheck = obj.maxTokens == null
79
+ ? { ok: true, value: Number.POSITIVE_INFINITY }
80
+ : checkBound(obj.maxTokens, MAX_TOKENS_CEILING, 'maxTokens', true);
81
+ if (!tokensCheck.ok)
82
+ return tokensCheck;
83
+ const usdCheck = obj.maxUsd == null
84
+ ? { ok: true, value: Number.POSITIVE_INFINITY }
85
+ : checkBound(obj.maxUsd, MAX_USD_CEILING, 'maxUsd', false);
86
+ if (!usdCheck.ok)
87
+ return usdCheck;
88
+ return {
89
+ ok: true,
90
+ budget: {
91
+ maxHops: hopCheck.value,
92
+ maxTokens: tokensCheck.value,
93
+ maxUsd: usdCheck.value,
94
+ },
95
+ };
96
+ }
97
+ function checkHops(v) {
98
+ if (typeof v !== 'number' || !Number.isFinite(v) || !Number.isInteger(v)) {
99
+ return { ok: false, error: 'maxHops must be a finite integer' };
100
+ }
101
+ if (v < 0)
102
+ return { ok: false, error: 'maxHops must be >= 0' };
103
+ if (v > MAX_HOPS_CEILING) {
104
+ return { ok: false, error: `maxHops exceeds ceiling (${MAX_HOPS_CEILING})` };
105
+ }
106
+ return { ok: true, value: v };
107
+ }
108
+ function checkBound(v, ceiling, label, requireInteger) {
109
+ if (typeof v !== 'number' || !Number.isFinite(v)) {
110
+ return { ok: false, error: `${label} must be a finite number` };
111
+ }
112
+ if (requireInteger && !Number.isInteger(v)) {
113
+ return { ok: false, error: `${label} must be an integer` };
114
+ }
115
+ if (v < 0)
116
+ return { ok: false, error: `${label} must be >= 0` };
117
+ if (v > ceiling) {
118
+ return { ok: false, error: `${label} exceeds ceiling (${ceiling})` };
119
+ }
120
+ return { ok: true, value: v };
121
+ }
122
+ /**
123
+ * Atomic (single synchronous function, no internal awaits) hop check.
124
+ *
125
+ * Returns the hopCount value the OUTBOUND envelope should carry plus the
126
+ * remaining budget that downstream peers will see. Callers must use the
127
+ * returned values; mutating the input Budget is forbidden (it's readonly).
128
+ *
129
+ * Contract:
130
+ * - hopCount represents how many hops the message has already taken.
131
+ * - The next outbound hop increments it: nextHopCount = hopCount + 1.
132
+ * - The check fires AFTER increment: nextHopCount must be <= maxHops.
133
+ * - This means maxHops=0 refuses to forward at all, which matches the
134
+ * ADR's "no remote delegation allowed" semantic.
135
+ *
136
+ * tokensSpent / usdSpent are caller-reported actuals from the immediately
137
+ * preceding leg (or 0 on the originator). The check fires on the
138
+ * *post-spend* totals so a leg that overshoots is caught before the next
139
+ * outbound dispatch.
140
+ */
141
+ export function enforceBudget(budget, hopCount, spent = { tokens: 0, usd: 0 }) {
142
+ const nextHopCount = hopCount + 1;
143
+ if (nextHopCount > budget.maxHops) {
144
+ return { ok: false, reason: 'HOP_LIMIT_EXCEEDED' };
145
+ }
146
+ // Negative spend is a programming error; treat as 0 rather than refunding
147
+ // the budget (which would let a malicious caller inflate remaining).
148
+ const ts = Math.max(0, spent.tokens);
149
+ const us = Math.max(0, spent.usd);
150
+ const remainingTokens = budget.maxTokens - ts;
151
+ const remainingUsd = budget.maxUsd - us;
152
+ if (remainingTokens < 0 || remainingUsd < 0) {
153
+ return { ok: false, reason: 'BUDGET_EXCEEDED' };
154
+ }
155
+ return {
156
+ ok: true,
157
+ nextHopCount,
158
+ remaining: {
159
+ maxHops: budget.maxHops,
160
+ maxTokens: remainingTokens,
161
+ maxUsd: remainingUsd,
162
+ },
163
+ };
164
+ }
165
+ //# sourceMappingURL=federation-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation-budget.js","sourceRoot":"","sources":["../../../src/domain/value-objects/federation-budget.ts"],"names":[],"mappings":"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"}