@ninelives/agent-governance-sdk 5.0.1

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 (126) hide show
  1. package/README.md +363 -0
  2. package/dist/audit.d.ts +26 -0
  3. package/dist/audit.d.ts.map +1 -0
  4. package/dist/audit.js +107 -0
  5. package/dist/audit.js.map +1 -0
  6. package/dist/cascade-containment.d.ts +84 -0
  7. package/dist/cascade-containment.d.ts.map +1 -0
  8. package/dist/cascade-containment.js +387 -0
  9. package/dist/cascade-containment.js.map +1 -0
  10. package/dist/client.d.ts +34 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +112 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/context-poisoning.d.ts +58 -0
  15. package/dist/context-poisoning.d.ts.map +1 -0
  16. package/dist/context-poisoning.js +410 -0
  17. package/dist/context-poisoning.js.map +1 -0
  18. package/dist/credential-vault.d.ts +213 -0
  19. package/dist/credential-vault.d.ts.map +1 -0
  20. package/dist/credential-vault.js +567 -0
  21. package/dist/credential-vault.js.map +1 -0
  22. package/dist/discovery.d.ts +80 -0
  23. package/dist/discovery.d.ts.map +1 -0
  24. package/dist/discovery.js +404 -0
  25. package/dist/discovery.js.map +1 -0
  26. package/dist/encryption/channel.d.ts +29 -0
  27. package/dist/encryption/channel.d.ts.map +1 -0
  28. package/dist/encryption/channel.js +78 -0
  29. package/dist/encryption/channel.js.map +1 -0
  30. package/dist/encryption/index.d.ts +9 -0
  31. package/dist/encryption/index.d.ts.map +1 -0
  32. package/dist/encryption/index.js +23 -0
  33. package/dist/encryption/index.js.map +1 -0
  34. package/dist/encryption/mesh-client.d.ts +281 -0
  35. package/dist/encryption/mesh-client.d.ts.map +1 -0
  36. package/dist/encryption/mesh-client.js +1110 -0
  37. package/dist/encryption/mesh-client.js.map +1 -0
  38. package/dist/encryption/ratchet.d.ts +38 -0
  39. package/dist/encryption/ratchet.d.ts.map +1 -0
  40. package/dist/encryption/ratchet.js +223 -0
  41. package/dist/encryption/ratchet.js.map +1 -0
  42. package/dist/encryption/registry-client.d.ts +136 -0
  43. package/dist/encryption/registry-client.d.ts.map +1 -0
  44. package/dist/encryption/registry-client.js +369 -0
  45. package/dist/encryption/registry-client.js.map +1 -0
  46. package/dist/encryption/x3dh.d.ts +80 -0
  47. package/dist/encryption/x3dh.d.ts.map +1 -0
  48. package/dist/encryption/x3dh.js +238 -0
  49. package/dist/encryption/x3dh.js.map +1 -0
  50. package/dist/framework-adapter.d.ts +63 -0
  51. package/dist/framework-adapter.d.ts.map +1 -0
  52. package/dist/framework-adapter.js +253 -0
  53. package/dist/framework-adapter.js.map +1 -0
  54. package/dist/identity.d.ts +124 -0
  55. package/dist/identity.d.ts.map +1 -0
  56. package/dist/identity.js +446 -0
  57. package/dist/identity.js.map +1 -0
  58. package/dist/index.d.ts +39 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +95 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/kill-switch.d.ts +22 -0
  63. package/dist/kill-switch.d.ts.map +1 -0
  64. package/dist/kill-switch.js +60 -0
  65. package/dist/kill-switch.js.map +1 -0
  66. package/dist/lifecycle.d.ts +50 -0
  67. package/dist/lifecycle.d.ts.map +1 -0
  68. package/dist/lifecycle.js +113 -0
  69. package/dist/lifecycle.js.map +1 -0
  70. package/dist/mcp.d.ts +41 -0
  71. package/dist/mcp.d.ts.map +1 -0
  72. package/dist/mcp.js +233 -0
  73. package/dist/mcp.js.map +1 -0
  74. package/dist/metrics.d.ts +123 -0
  75. package/dist/metrics.d.ts.map +1 -0
  76. package/dist/metrics.js +289 -0
  77. package/dist/metrics.js.map +1 -0
  78. package/dist/oci-manifest.d.ts +49 -0
  79. package/dist/oci-manifest.d.ts.map +1 -0
  80. package/dist/oci-manifest.js +182 -0
  81. package/dist/oci-manifest.js.map +1 -0
  82. package/dist/policy-backends/cedar.d.ts +15 -0
  83. package/dist/policy-backends/cedar.d.ts.map +1 -0
  84. package/dist/policy-backends/cedar.js +88 -0
  85. package/dist/policy-backends/cedar.js.map +1 -0
  86. package/dist/policy-backends/opa.d.ts +17 -0
  87. package/dist/policy-backends/opa.d.ts.map +1 -0
  88. package/dist/policy-backends/opa.js +74 -0
  89. package/dist/policy-backends/opa.js.map +1 -0
  90. package/dist/policy.d.ts +77 -0
  91. package/dist/policy.d.ts.map +1 -0
  92. package/dist/policy.js +760 -0
  93. package/dist/policy.js.map +1 -0
  94. package/dist/prompt-defense.d.ts +37 -0
  95. package/dist/prompt-defense.d.ts.map +1 -0
  96. package/dist/prompt-defense.js +229 -0
  97. package/dist/prompt-defense.js.map +1 -0
  98. package/dist/protocol-facets.d.ts +87 -0
  99. package/dist/protocol-facets.d.ts.map +1 -0
  100. package/dist/protocol-facets.js +728 -0
  101. package/dist/protocol-facets.js.map +1 -0
  102. package/dist/rings.d.ts +17 -0
  103. package/dist/rings.d.ts.map +1 -0
  104. package/dist/rings.js +61 -0
  105. package/dist/rings.js.map +1 -0
  106. package/dist/sandbox.d.ts +61 -0
  107. package/dist/sandbox.d.ts.map +1 -0
  108. package/dist/sandbox.js +199 -0
  109. package/dist/sandbox.js.map +1 -0
  110. package/dist/surface-parity.d.ts +45 -0
  111. package/dist/surface-parity.d.ts.map +1 -0
  112. package/dist/surface-parity.js +216 -0
  113. package/dist/surface-parity.js.map +1 -0
  114. package/dist/trust.d.ts +28 -0
  115. package/dist/trust.d.ts.map +1 -0
  116. package/dist/trust.js +209 -0
  117. package/dist/trust.js.map +1 -0
  118. package/dist/types.d.ts +422 -0
  119. package/dist/types.d.ts.map +1 -0
  120. package/dist/types.js +29 -0
  121. package/dist/types.js.map +1 -0
  122. package/dist/verify.d.ts +135 -0
  123. package/dist/verify.d.ts.map +1 -0
  124. package/dist/verify.js +356 -0
  125. package/dist/verify.js.map +1 -0
  126. package/package.json +66 -0
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT License.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.SurfaceParityChecker = void 0;
6
+ const KNOWN_SURFACES = ['cli', 'ide', 'api'];
7
+ const SURFACE_CONDITION_PATTERNS = [
8
+ { pattern: /\bsurface\s*==\s*['"]cli['"]/i, surface: 'cli' },
9
+ { pattern: /\bsurface\s*==\s*['"]ide['"]/i, surface: 'ide' },
10
+ { pattern: /\bsurface\s*==\s*['"]api['"]/i, surface: 'api' },
11
+ { pattern: /\bcontext\.surface\s*==\s*['"]cli['"]/i, surface: 'cli' },
12
+ { pattern: /\bcontext\.surface\s*==\s*['"]ide['"]/i, surface: 'ide' },
13
+ { pattern: /\bcontext\.surface\s*==\s*['"]api['"]/i, surface: 'api' },
14
+ { pattern: /\bsurface\s+in\s+\[.*?['"]cli['"].*?\]/i, surface: 'cli' },
15
+ { pattern: /\bsurface\s+in\s+\[.*?['"]ide['"].*?\]/i, surface: 'ide' },
16
+ { pattern: /\bsurface\s+in\s+\[.*?['"]api['"].*?\]/i, surface: 'api' },
17
+ ];
18
+ /**
19
+ * Detects governance parity gaps between enforcement surfaces (CLI, IDE, API).
20
+ *
21
+ * When organizations deploy governance policies, rules may be enforced
22
+ * differently depending on the surface. This checker identifies rules
23
+ * that only apply to some surfaces, highlighting enforcement gaps.
24
+ */
25
+ class SurfaceParityChecker {
26
+ /**
27
+ * Analyze a set of policies for surface parity gaps.
28
+ */
29
+ analyzePolicies(policies) {
30
+ const mappings = [];
31
+ for (const policy of policies) {
32
+ for (const rule of policy.rules) {
33
+ if (rule.enabled === false)
34
+ continue;
35
+ const detected = this.detectSurfaces(rule);
36
+ mappings.push({
37
+ rule,
38
+ policyName: policy.name,
39
+ detectedSurfaces: detected,
40
+ isUniversal: detected.length === 0,
41
+ });
42
+ }
43
+ }
44
+ const gaps = this.findGaps(mappings);
45
+ const universalRules = mappings.filter((m) => m.isUniversal).length;
46
+ const surfaceSpecificRules = mappings.length - universalRules;
47
+ const surfaceCoverage = this.computeCoverage(mappings);
48
+ const parityScore = this.computeParityScore(mappings, gaps);
49
+ return {
50
+ analyzedAt: new Date(),
51
+ totalRules: mappings.length,
52
+ universalRules,
53
+ surfaceSpecificRules,
54
+ gaps,
55
+ mappings,
56
+ surfaceCoverage,
57
+ parityScore,
58
+ };
59
+ }
60
+ /**
61
+ * Detect which surfaces a rule targets.
62
+ * Returns empty array for universal rules (no surface restriction).
63
+ */
64
+ detectSurfaces(rule) {
65
+ const surfaces = new Set();
66
+ // Explicit surfaces field takes precedence
67
+ if (rule.surfaces && rule.surfaces.length > 0) {
68
+ return [...rule.surfaces];
69
+ }
70
+ // Parse condition string for surface references
71
+ if (typeof rule.condition === 'string') {
72
+ for (const { pattern, surface } of SURFACE_CONDITION_PATTERNS) {
73
+ if (pattern.test(rule.condition)) {
74
+ surfaces.add(surface);
75
+ }
76
+ }
77
+ }
78
+ // Check object-form conditions for surface keys
79
+ if (rule.condition && typeof rule.condition === 'object') {
80
+ const condObj = rule.condition;
81
+ if (condObj.surface && typeof condObj.surface === 'string') {
82
+ const val = condObj.surface.toLowerCase();
83
+ if (KNOWN_SURFACES.includes(val)) {
84
+ surfaces.add(val);
85
+ }
86
+ }
87
+ if (condObj['context.surface'] && typeof condObj['context.surface'] === 'string') {
88
+ const val = condObj['context.surface'].toLowerCase();
89
+ if (KNOWN_SURFACES.includes(val)) {
90
+ surfaces.add(val);
91
+ }
92
+ }
93
+ }
94
+ return [...surfaces];
95
+ }
96
+ /**
97
+ * Find gaps by grouping surface-specific rules by their normalized semantics
98
+ * and checking which surfaces are missing counterparts.
99
+ */
100
+ findGaps(mappings) {
101
+ const gaps = [];
102
+ const surfaceSpecific = mappings.filter((m) => !m.isUniversal);
103
+ // Group by normalized key (action + non-surface conditions)
104
+ const groups = new Map();
105
+ for (const mapping of surfaceSpecific) {
106
+ const key = this.normalizeRuleKey(mapping.rule);
107
+ const group = groups.get(key) ?? [];
108
+ group.push(mapping);
109
+ groups.set(key, group);
110
+ }
111
+ for (const [, group] of groups) {
112
+ const coveredSurfaces = new Set();
113
+ for (const m of group) {
114
+ for (const s of m.detectedSurfaces) {
115
+ coveredSurfaces.add(s);
116
+ }
117
+ }
118
+ // Only flag gaps if rule exists for some surfaces but not all
119
+ if (coveredSurfaces.size > 0 && coveredSurfaces.size < KNOWN_SURFACES.length) {
120
+ const presentOn = [...coveredSurfaces];
121
+ const missingFrom = KNOWN_SURFACES.filter((s) => !coveredSurfaces.has(s));
122
+ const representative = group[0];
123
+ const ruleAction = representative.rule.ruleAction;
124
+ const severity = this.classifySeverity(ruleAction);
125
+ gaps.push({
126
+ ruleName: representative.rule.name ?? 'unnamed-rule',
127
+ policyName: representative.policyName,
128
+ presentOn,
129
+ missingFrom,
130
+ ruleAction,
131
+ severity,
132
+ recommendation: this.generateRecommendation(representative.rule.name ?? 'unnamed-rule', presentOn, missingFrom, ruleAction),
133
+ });
134
+ }
135
+ }
136
+ return gaps;
137
+ }
138
+ /**
139
+ * Generate a normalized key for a rule based on its semantics
140
+ * (action + non-surface conditions), so we can group rules that
141
+ * do the same thing on different surfaces.
142
+ */
143
+ normalizeRuleKey(rule) {
144
+ const action = rule.ruleAction ?? rule.effect ?? 'unknown';
145
+ const condStr = this.stripSurfaceFromCondition(rule);
146
+ return `${action}::${condStr}`;
147
+ }
148
+ /**
149
+ * Remove surface-related parts from a condition to get the
150
+ * "semantic core" of a rule for comparison purposes.
151
+ */
152
+ stripSurfaceFromCondition(rule) {
153
+ if (typeof rule.condition === 'string') {
154
+ let stripped = rule.condition;
155
+ // Remove surface == 'x' clauses and surrounding connectives
156
+ stripped = stripped.replace(/\bsurface\s*==\s*['"][^'"]*['"]/gi, '');
157
+ stripped = stripped.replace(/\bcontext\.surface\s*==\s*['"][^'"]*['"]/gi, '');
158
+ stripped = stripped.replace(/\bsurface\s+in\s+\[[^\]]*\]/gi, '');
159
+ // Clean up dangling 'and'/'or'
160
+ stripped = stripped.replace(/^\s*(and|or)\s+/i, '');
161
+ stripped = stripped.replace(/\s+(and|or)\s*$/i, '');
162
+ stripped = stripped.replace(/\s+(and|or)\s+(and|or)\s+/gi, ' and ');
163
+ return stripped.trim() || (rule.name ?? '');
164
+ }
165
+ if (rule.condition && typeof rule.condition === 'object') {
166
+ const condObj = { ...rule.condition };
167
+ delete condObj.surface;
168
+ delete condObj['context.surface'];
169
+ return JSON.stringify(condObj);
170
+ }
171
+ return rule.name ?? rule.action ?? '';
172
+ }
173
+ classifySeverity(action) {
174
+ if (action === 'deny' || action === 'require_approval')
175
+ return 'high';
176
+ if (action === 'warn' || action === 'log')
177
+ return 'medium';
178
+ return 'low';
179
+ }
180
+ generateRecommendation(ruleName, presentOn, missingFrom, action) {
181
+ const present = presentOn.join(', ');
182
+ const missing = missingFrom.join(', ');
183
+ if (action === 'deny' || action === 'require_approval') {
184
+ return (`Rule "${ruleName}" enforces ${action} on ${present} but not ${missing}. ` +
185
+ `This creates a bypass path: users can avoid governance by switching surfaces.`);
186
+ }
187
+ return (`Rule "${ruleName}" applies on ${present} but not ${missing}. ` +
188
+ `Consider extending coverage for consistent governance.`);
189
+ }
190
+ computeCoverage(mappings) {
191
+ const coverage = { cli: 0, ide: 0, api: 0, unknown: 0 };
192
+ const universalCount = mappings.filter((m) => m.isUniversal).length;
193
+ for (const surface of KNOWN_SURFACES) {
194
+ const surfaceCount = mappings.filter((m) => !m.isUniversal && m.detectedSurfaces.includes(surface)).length;
195
+ coverage[surface] = surfaceCount + universalCount;
196
+ }
197
+ return coverage;
198
+ }
199
+ /**
200
+ * Compute a 0-100 parity score.
201
+ * 100 = perfect parity (all rules are universal or all surfaces equally covered).
202
+ * Deductions for each gap, weighted by severity.
203
+ */
204
+ computeParityScore(mappings, gaps) {
205
+ if (mappings.length === 0)
206
+ return 100;
207
+ const severityWeights = { high: 15, medium: 8, low: 3 };
208
+ let deductions = 0;
209
+ for (const gap of gaps) {
210
+ deductions += severityWeights[gap.severity] * gap.missingFrom.length;
211
+ }
212
+ return Math.max(0, Math.round(100 - deductions));
213
+ }
214
+ }
215
+ exports.SurfaceParityChecker = SurfaceParityChecker;
216
+ //# sourceMappingURL=surface-parity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-parity.js","sourceRoot":"","sources":["../src/surface-parity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { AgentIdentity } from './identity';
2
+ import { TrustConfig, TrustScore, TrustVerificationResult } from './types';
3
+ /**
4
+ * Manages trust scores for peer agents using a simple Bayesian-inspired model
5
+ * with configurable decay.
6
+ */
7
+ export declare class TrustManager {
8
+ private readonly config;
9
+ private readonly agents;
10
+ private readonly persistPath?;
11
+ constructor(config?: TrustConfig);
12
+ /** Verify a peer agent's identity and return a trust result. */
13
+ verifyPeer(peerId: string, peerIdentity: AgentIdentity): Promise<TrustVerificationResult>;
14
+ /** Get the current trust score for an agent. */
15
+ getTrustScore(agentId: string): TrustScore;
16
+ /** Record a successful interaction with an agent. */
17
+ recordSuccess(agentId: string, reward?: number): void;
18
+ /** Record a failed interaction with an agent. */
19
+ recordFailure(agentId: string, penalty?: number): void;
20
+ private getOrCreateState;
21
+ private applyDecay;
22
+ private computeTier;
23
+ private computeReliability;
24
+ private getPeerVerificationFailure;
25
+ private saveToDisk;
26
+ private loadFromDisk;
27
+ }
28
+ //# sourceMappingURL=trust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../src/trust.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,WAAW,EACX,UAAU,EAEV,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAgBjB;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6C;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;gBAE1B,MAAM,CAAC,EAAE,WAAW;IAgBhC,gEAAgE;IAC1D,UAAU,CACd,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,aAAa,GAC1B,OAAO,CAAC,uBAAuB,CAAC;IAWnC,gDAAgD;IAChD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IAgB1C,qDAAqD;IACrD,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAa,GAAG,IAAI;IAS3D,iDAAiD;IACjD,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAY,GAAG,IAAI;IAW3D,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,0BAA0B;IAiClC,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,YAAY;CAgBrB"}
package/dist/trust.js ADDED
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TrustManager = void 0;
37
+ // Copyright (c) Microsoft Corporation.
38
+ // Licensed under the MIT License.
39
+ const crypto_1 = require("crypto");
40
+ const fs = __importStar(require("fs"));
41
+ const DEFAULT_THRESHOLDS = {
42
+ untrusted: 0.0,
43
+ provisional: 0.3,
44
+ trusted: 0.6,
45
+ verified: 0.85,
46
+ };
47
+ /**
48
+ * Manages trust scores for peer agents using a simple Bayesian-inspired model
49
+ * with configurable decay.
50
+ */
51
+ class TrustManager {
52
+ config;
53
+ agents = new Map();
54
+ persistPath;
55
+ constructor(config) {
56
+ this.config = {
57
+ initialScore: config?.initialScore ?? 0.5,
58
+ decayFactor: config?.decayFactor ?? 0.95,
59
+ thresholds: { ...DEFAULT_THRESHOLDS, ...config?.thresholds },
60
+ };
61
+ this.persistPath = config?.persistPath;
62
+ if (this.persistPath) {
63
+ // Reject paths containing traversal components
64
+ if (this.persistPath.includes('..')) {
65
+ throw new Error('persistPath must not contain path traversal components');
66
+ }
67
+ this.loadFromDisk();
68
+ }
69
+ }
70
+ /** Verify a peer agent's identity and return a trust result. */
71
+ async verifyPeer(peerId, peerIdentity) {
72
+ const trustScore = this.getTrustScore(peerId);
73
+ const reason = this.getPeerVerificationFailure(peerId, peerIdentity);
74
+ return {
75
+ verified: reason === undefined,
76
+ trustScore,
77
+ reason,
78
+ };
79
+ }
80
+ /** Get the current trust score for an agent. */
81
+ getTrustScore(agentId) {
82
+ const state = this.getOrCreateState(agentId);
83
+ this.applyDecay(state);
84
+ const tier = this.computeTier(state.score);
85
+ return {
86
+ overall: Math.round(state.score * 1000) / 1000,
87
+ dimensions: {
88
+ reliability: this.computeReliability(state),
89
+ consistency: state.score,
90
+ },
91
+ tier,
92
+ };
93
+ }
94
+ /** Record a successful interaction with an agent. */
95
+ recordSuccess(agentId, reward = 0.05) {
96
+ const state = this.getOrCreateState(agentId);
97
+ this.applyDecay(state);
98
+ state.successes += 1;
99
+ state.score = Math.min(1, state.score + Math.max(0, Math.min(1, reward)));
100
+ state.lastUpdate = Date.now();
101
+ this.saveToDisk();
102
+ }
103
+ /** Record a failed interaction with an agent. */
104
+ recordFailure(agentId, penalty = 0.1) {
105
+ const state = this.getOrCreateState(agentId);
106
+ this.applyDecay(state);
107
+ state.failures += 1;
108
+ state.score = Math.max(0, state.score - Math.max(0, Math.min(1, penalty)));
109
+ state.lastUpdate = Date.now();
110
+ this.saveToDisk();
111
+ }
112
+ // ── Private helpers ──
113
+ getOrCreateState(agentId) {
114
+ let state = this.agents.get(agentId);
115
+ if (!state) {
116
+ state = {
117
+ successes: 0,
118
+ failures: 0,
119
+ score: this.config.initialScore,
120
+ lastUpdate: Date.now(),
121
+ };
122
+ this.agents.set(agentId, state);
123
+ }
124
+ return state;
125
+ }
126
+ applyDecay(state) {
127
+ const elapsed = Date.now() - state.lastUpdate;
128
+ const hours = elapsed / (1000 * 60 * 60);
129
+ if (hours >= 1) {
130
+ const decaySteps = Math.floor(hours);
131
+ state.score *= Math.pow(this.config.decayFactor, decaySteps);
132
+ state.lastUpdate = Date.now();
133
+ }
134
+ }
135
+ computeTier(score) {
136
+ const t = this.config.thresholds;
137
+ if (score >= t.verified)
138
+ return 'Verified';
139
+ if (score >= t.trusted)
140
+ return 'Trusted';
141
+ if (score >= t.provisional)
142
+ return 'Provisional';
143
+ return 'Untrusted';
144
+ }
145
+ computeReliability(state) {
146
+ const total = state.successes + state.failures;
147
+ if (total === 0)
148
+ return this.config.initialScore;
149
+ return Math.round((state.successes / total) * 1000) / 1000;
150
+ }
151
+ getPeerVerificationFailure(peerId, peerIdentity) {
152
+ if (!peerId) {
153
+ return 'Peer ID is required';
154
+ }
155
+ if (!peerIdentity.isActive()) {
156
+ return 'Peer identity is inactive or expired';
157
+ }
158
+ const didPrefix = `did:agentmesh:${peerId}:`;
159
+ if (!peerIdentity.did.startsWith(didPrefix)) {
160
+ return 'Peer identity DID does not match the claimed peer ID';
161
+ }
162
+ const didFingerprint = peerIdentity.did.slice(didPrefix.length);
163
+ if (!/^[0-9a-f]{16}$/i.test(didFingerprint)) {
164
+ return 'Peer identity DID fingerprint is invalid';
165
+ }
166
+ const expectedFingerprint = (0, crypto_1.createHash)('sha256')
167
+ .update(peerIdentity.publicKey)
168
+ .digest('hex')
169
+ .slice(0, 16);
170
+ if (didFingerprint !== expectedFingerprint) {
171
+ return 'Peer identity DID fingerprint does not match the public key';
172
+ }
173
+ return undefined;
174
+ }
175
+ saveToDisk() {
176
+ if (!this.persistPath)
177
+ return;
178
+ try {
179
+ const data = {};
180
+ for (const [key, value] of this.agents) {
181
+ data[key] = value;
182
+ }
183
+ fs.writeFileSync(this.persistPath, JSON.stringify(data), 'utf-8');
184
+ }
185
+ catch {
186
+ // best-effort: ignore write errors
187
+ }
188
+ }
189
+ loadFromDisk() {
190
+ if (!this.persistPath)
191
+ return;
192
+ try {
193
+ const raw = fs.readFileSync(this.persistPath, 'utf-8');
194
+ const data = JSON.parse(raw);
195
+ for (const [key, value] of Object.entries(data)) {
196
+ // Clamp deserialized scores to valid [0, 1] range
197
+ if (typeof value.score === 'number') {
198
+ value.score = Math.max(0, Math.min(1, value.score));
199
+ }
200
+ this.agents.set(key, value);
201
+ }
202
+ }
203
+ catch {
204
+ // best-effort: ignore missing or corrupt files
205
+ }
206
+ }
207
+ }
208
+ exports.TrustManager = TrustManager;
209
+ //# sourceMappingURL=trust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust.js","sourceRoot":"","sources":["../src/trust.ts"],"names":[],"mappings":"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"}