@vinkius-core/mcp-fusion 2.7.0 → 2.8.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.
- package/dist/cli/fusion.d.ts +101 -0
- package/dist/cli/fusion.d.ts.map +1 -0
- package/dist/cli/fusion.js +333 -0
- package/dist/cli/fusion.js.map +1 -0
- package/dist/index.d.ts +41 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/introspection/BehaviorDigest.d.ts +112 -0
- package/dist/introspection/BehaviorDigest.d.ts.map +1 -0
- package/dist/introspection/BehaviorDigest.js +147 -0
- package/dist/introspection/BehaviorDigest.js.map +1 -0
- package/dist/introspection/CapabilityLockfile.d.ts +261 -0
- package/dist/introspection/CapabilityLockfile.d.ts.map +1 -0
- package/dist/introspection/CapabilityLockfile.js +392 -0
- package/dist/introspection/CapabilityLockfile.js.map +1 -0
- package/dist/introspection/ContractAwareSelfHealing.d.ts +90 -0
- package/dist/introspection/ContractAwareSelfHealing.d.ts.map +1 -0
- package/dist/introspection/ContractAwareSelfHealing.js +132 -0
- package/dist/introspection/ContractAwareSelfHealing.js.map +1 -0
- package/dist/introspection/ContractDiff.d.ts +91 -0
- package/dist/introspection/ContractDiff.d.ts.map +1 -0
- package/dist/introspection/ContractDiff.js +466 -0
- package/dist/introspection/ContractDiff.js.map +1 -0
- package/dist/introspection/CryptoAttestation.d.ts +143 -0
- package/dist/introspection/CryptoAttestation.d.ts.map +1 -0
- package/dist/introspection/CryptoAttestation.js +194 -0
- package/dist/introspection/CryptoAttestation.js.map +1 -0
- package/dist/introspection/EntitlementScanner.d.ts +177 -0
- package/dist/introspection/EntitlementScanner.d.ts.map +1 -0
- package/dist/introspection/EntitlementScanner.js +459 -0
- package/dist/introspection/EntitlementScanner.js.map +1 -0
- package/dist/introspection/GovernanceObserver.d.ts +88 -0
- package/dist/introspection/GovernanceObserver.d.ts.map +1 -0
- package/dist/introspection/GovernanceObserver.js +132 -0
- package/dist/introspection/GovernanceObserver.js.map +1 -0
- package/dist/introspection/SemanticProbe.d.ts +207 -0
- package/dist/introspection/SemanticProbe.d.ts.map +1 -0
- package/dist/introspection/SemanticProbe.js +255 -0
- package/dist/introspection/SemanticProbe.js.map +1 -0
- package/dist/introspection/TokenEconomics.d.ts +210 -0
- package/dist/introspection/TokenEconomics.d.ts.map +1 -0
- package/dist/introspection/TokenEconomics.js +286 -0
- package/dist/introspection/TokenEconomics.js.map +1 -0
- package/dist/introspection/ToolContract.d.ts +161 -0
- package/dist/introspection/ToolContract.d.ts.map +1 -0
- package/dist/introspection/ToolContract.js +192 -0
- package/dist/introspection/ToolContract.js.map +1 -0
- package/dist/introspection/canonicalize.d.ts +20 -0
- package/dist/introspection/canonicalize.d.ts.map +1 -0
- package/dist/introspection/canonicalize.js +51 -0
- package/dist/introspection/canonicalize.js.map +1 -0
- package/dist/introspection/index.d.ts +20 -0
- package/dist/introspection/index.d.ts.map +1 -1
- package/dist/introspection/index.js +20 -0
- package/dist/introspection/index.js.map +1 -1
- package/dist/observability/DebugObserver.d.ts +26 -1
- package/dist/observability/DebugObserver.d.ts.map +1 -1
- package/dist/observability/DebugObserver.js +8 -1
- package/dist/observability/DebugObserver.js.map +1 -1
- package/dist/observability/index.d.ts +1 -1
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js.map +1 -1
- package/dist/server/ServerAttachment.d.ts +41 -0
- package/dist/server/ServerAttachment.d.ts.map +1 -1
- package/dist/server/ServerAttachment.js +25 -1
- package/dist/server/ServerAttachment.js.map +1 -1
- package/package.json +8 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContractDiff — Behavioral Contract Diffing Engine
|
|
3
|
+
*
|
|
4
|
+
* Computes the semantic difference between two snapshots of a
|
|
5
|
+
* `ToolContract`. Unlike naive JSON diffing, this engine understands
|
|
6
|
+
* the behavioral semantics of each field and classifies changes by
|
|
7
|
+
* severity:
|
|
8
|
+
*
|
|
9
|
+
* - **BREAKING**: The behavioral surface changed in a way that will
|
|
10
|
+
* cause an LLM that was previously calibrated to this tool to
|
|
11
|
+
* fail or hallucinate. Examples: egress schema fields removed,
|
|
12
|
+
* system rules changed, affordance topology altered.
|
|
13
|
+
*
|
|
14
|
+
* - **RISKY**: The behavioral surface changed in a way that might
|
|
15
|
+
* affect LLM behavior but won't cause immediate failure. Examples:
|
|
16
|
+
* cognitive guardrails loosened, middleware chain changed.
|
|
17
|
+
*
|
|
18
|
+
* - **SAFE**: The change is additive and won't affect existing
|
|
19
|
+
* LLM behavior. Examples: new action added, description improved.
|
|
20
|
+
*
|
|
21
|
+
* - **COSMETIC**: No behavioral impact. Examples: description
|
|
22
|
+
* rewording with identical semantics.
|
|
23
|
+
*
|
|
24
|
+
* Pure-function module: no state, no side effects.
|
|
25
|
+
*
|
|
26
|
+
* @module
|
|
27
|
+
*/
|
|
28
|
+
import type { ToolContract } from './ToolContract.js';
|
|
29
|
+
/** Severity classification for a contract change */
|
|
30
|
+
export type DeltaSeverity = 'BREAKING' | 'RISKY' | 'SAFE' | 'COSMETIC';
|
|
31
|
+
/**
|
|
32
|
+
* A single atomic change in a tool contract.
|
|
33
|
+
*
|
|
34
|
+
* Designed to be human-readable, machine-diffable, and injectable
|
|
35
|
+
* into LLM correction prompts (Self-Healing Context).
|
|
36
|
+
*/
|
|
37
|
+
export interface ContractDelta {
|
|
38
|
+
/** Which part of the contract changed */
|
|
39
|
+
readonly category: DeltaCategory;
|
|
40
|
+
/** Specific field or sub-path that changed */
|
|
41
|
+
readonly field: string;
|
|
42
|
+
/** Severity classification */
|
|
43
|
+
readonly severity: DeltaSeverity;
|
|
44
|
+
/** Human-readable description of the change */
|
|
45
|
+
readonly description: string;
|
|
46
|
+
/** Previous value (serialized) */
|
|
47
|
+
readonly before: string | null;
|
|
48
|
+
/** New value (serialized) */
|
|
49
|
+
readonly after: string | null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Broad category of what changed in the contract.
|
|
53
|
+
* Maps to the major sections of `ToolContract`.
|
|
54
|
+
*/
|
|
55
|
+
export type DeltaCategory = 'surface' | 'surface.action' | 'behavior.egress' | 'behavior.rules' | 'behavior.guardrails' | 'behavior.middleware' | 'behavior.stateSync' | 'behavior.affordances' | 'tokenEconomics' | 'entitlements';
|
|
56
|
+
/**
|
|
57
|
+
* Result of a full contract diff operation.
|
|
58
|
+
*/
|
|
59
|
+
export interface ContractDiffResult {
|
|
60
|
+
/** Tool name */
|
|
61
|
+
readonly toolName: string;
|
|
62
|
+
/** All detected deltas, sorted by severity */
|
|
63
|
+
readonly deltas: readonly ContractDelta[];
|
|
64
|
+
/** Highest severity found */
|
|
65
|
+
readonly maxSeverity: DeltaSeverity;
|
|
66
|
+
/** Whether the overall behavior digest changed */
|
|
67
|
+
readonly digestChanged: boolean;
|
|
68
|
+
/** Whether the contract is backwards-compatible */
|
|
69
|
+
readonly isBackwardsCompatible: boolean;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Compute the semantic diff between two snapshots of a tool contract.
|
|
73
|
+
*
|
|
74
|
+
* @param before - Previous contract snapshot
|
|
75
|
+
* @param after - Current contract snapshot
|
|
76
|
+
* @returns Classified, sorted list of deltas
|
|
77
|
+
*/
|
|
78
|
+
export declare function diffContracts(before: ToolContract, after: ToolContract): ContractDiffResult;
|
|
79
|
+
/**
|
|
80
|
+
* Format a diff result as a human-readable report.
|
|
81
|
+
*
|
|
82
|
+
* Designed for both terminal output and injection into
|
|
83
|
+
* LLM correction prompts (Self-Healing Context).
|
|
84
|
+
*/
|
|
85
|
+
export declare function formatDiffReport(result: ContractDiffResult): string;
|
|
86
|
+
/**
|
|
87
|
+
* Format deltas as XML for injection into LLM correction prompts.
|
|
88
|
+
* Compatible with ValidationErrorFormatter's XML format.
|
|
89
|
+
*/
|
|
90
|
+
export declare function formatDeltasAsXml(deltas: readonly ContractDelta[]): string;
|
|
91
|
+
//# sourceMappingURL=ContractDiff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContractDiff.d.ts","sourceRoot":"","sources":["../../src/introspection/ContractDiff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,YAAY,EAA4E,MAAM,mBAAmB,CAAC;AAMhI,oDAAoD;AACpD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC1B,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,6BAA6B;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GACnB,SAAS,GACT,gBAAgB,GAChB,iBAAiB,GACjB,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,GACrB,oBAAoB,GACpB,sBAAsB,GACtB,gBAAgB,GAChB,cAAc,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,gBAAgB;IAChB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,6BAA6B;IAC7B,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,kDAAkD;IAClD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,mDAAmD;IACnD,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;CAC3C;AAaD;;;;;;GAMG;AACH,wBAAgB,aAAa,CACzB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,GACpB,kBAAkB,CAmCpB;AAkaD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAgBnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAe1E"}
|
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Diff Engine
|
|
3
|
+
// ============================================================================
|
|
4
|
+
const SEVERITY_ORDER = {
|
|
5
|
+
BREAKING: 3,
|
|
6
|
+
RISKY: 2,
|
|
7
|
+
SAFE: 1,
|
|
8
|
+
COSMETIC: 0,
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Compute the semantic diff between two snapshots of a tool contract.
|
|
12
|
+
*
|
|
13
|
+
* @param before - Previous contract snapshot
|
|
14
|
+
* @param after - Current contract snapshot
|
|
15
|
+
* @returns Classified, sorted list of deltas
|
|
16
|
+
*/
|
|
17
|
+
export function diffContracts(before, after) {
|
|
18
|
+
const deltas = [];
|
|
19
|
+
// Surface diff
|
|
20
|
+
diffSurface(before, after, deltas);
|
|
21
|
+
// Action-level diff
|
|
22
|
+
diffActions(before, after, deltas);
|
|
23
|
+
// Behavior diff
|
|
24
|
+
diffBehavior(before.behavior, after.behavior, deltas);
|
|
25
|
+
// Token Economics diff
|
|
26
|
+
diffTokenEconomics(before.tokenEconomics, after.tokenEconomics, deltas);
|
|
27
|
+
// Entitlements diff
|
|
28
|
+
diffEntitlements(before.entitlements, after.entitlements, deltas);
|
|
29
|
+
// Sort by severity (BREAKING first)
|
|
30
|
+
deltas.sort((a, b) => SEVERITY_ORDER[b.severity] - SEVERITY_ORDER[a.severity]);
|
|
31
|
+
const maxSeverity = deltas.length > 0
|
|
32
|
+
? deltas[0].severity
|
|
33
|
+
: 'COSMETIC';
|
|
34
|
+
const digestChanged = before.behavior.egressSchemaDigest !== after.behavior.egressSchemaDigest
|
|
35
|
+
|| before.behavior.systemRulesFingerprint !== after.behavior.systemRulesFingerprint;
|
|
36
|
+
return {
|
|
37
|
+
toolName: after.surface.name,
|
|
38
|
+
deltas,
|
|
39
|
+
maxSeverity,
|
|
40
|
+
digestChanged,
|
|
41
|
+
isBackwardsCompatible: maxSeverity !== 'BREAKING',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Diff tool surfaces but exclude actions (handled separately).
|
|
46
|
+
* @internal
|
|
47
|
+
*/
|
|
48
|
+
function diffSurface(before, after, out) {
|
|
49
|
+
if (before.surface.name !== after.surface.name) {
|
|
50
|
+
out.push({
|
|
51
|
+
category: 'surface',
|
|
52
|
+
field: 'name',
|
|
53
|
+
severity: 'BREAKING',
|
|
54
|
+
description: 'Tool name changed',
|
|
55
|
+
before: before.surface.name,
|
|
56
|
+
after: after.surface.name,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (before.surface.description !== after.surface.description) {
|
|
60
|
+
out.push({
|
|
61
|
+
category: 'surface',
|
|
62
|
+
field: 'description',
|
|
63
|
+
severity: 'COSMETIC',
|
|
64
|
+
description: 'Tool description changed',
|
|
65
|
+
before: before.surface.description ?? null,
|
|
66
|
+
after: after.surface.description ?? null,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (before.surface.inputSchemaDigest !== after.surface.inputSchemaDigest) {
|
|
70
|
+
out.push({
|
|
71
|
+
category: 'surface',
|
|
72
|
+
field: 'inputSchemaDigest',
|
|
73
|
+
severity: 'BREAKING',
|
|
74
|
+
description: 'Input schema changed — previously calibrated LLM arguments may fail',
|
|
75
|
+
before: before.surface.inputSchemaDigest,
|
|
76
|
+
after: after.surface.inputSchemaDigest,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// Tags
|
|
80
|
+
const removedTags = before.surface.tags.filter(t => !after.surface.tags.includes(t));
|
|
81
|
+
const addedTags = after.surface.tags.filter(t => !before.surface.tags.includes(t));
|
|
82
|
+
if (removedTags.length > 0 || addedTags.length > 0) {
|
|
83
|
+
out.push({
|
|
84
|
+
category: 'surface',
|
|
85
|
+
field: 'tags',
|
|
86
|
+
severity: removedTags.length > 0 ? 'SAFE' : 'COSMETIC',
|
|
87
|
+
description: `Tags changed: ${removedTags.length > 0 ? `removed [${removedTags.join(', ')}]` : ''} ${addedTags.length > 0 ? `added [${addedTags.join(', ')}]` : ''}`.trim(),
|
|
88
|
+
before: JSON.stringify(before.surface.tags),
|
|
89
|
+
after: JSON.stringify(after.surface.tags),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Diff action-level contracts. Detects added, removed, and modified actions.
|
|
95
|
+
* @internal
|
|
96
|
+
*/
|
|
97
|
+
function diffActions(before, after, out) {
|
|
98
|
+
const beforeKeys = new Set(Object.keys(before.surface.actions));
|
|
99
|
+
const afterKeys = new Set(Object.keys(after.surface.actions));
|
|
100
|
+
// Removed actions → BREAKING
|
|
101
|
+
for (const key of beforeKeys) {
|
|
102
|
+
if (!afterKeys.has(key)) {
|
|
103
|
+
out.push({
|
|
104
|
+
category: 'surface.action',
|
|
105
|
+
field: `actions.${key}`,
|
|
106
|
+
severity: 'BREAKING',
|
|
107
|
+
description: `Action "${key}" was removed`,
|
|
108
|
+
before: key,
|
|
109
|
+
after: null,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Added actions → SAFE
|
|
114
|
+
for (const key of afterKeys) {
|
|
115
|
+
if (!beforeKeys.has(key)) {
|
|
116
|
+
out.push({
|
|
117
|
+
category: 'surface.action',
|
|
118
|
+
field: `actions.${key}`,
|
|
119
|
+
severity: 'SAFE',
|
|
120
|
+
description: `Action "${key}" was added`,
|
|
121
|
+
before: null,
|
|
122
|
+
after: key,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Modified actions
|
|
127
|
+
for (const key of beforeKeys) {
|
|
128
|
+
if (afterKeys.has(key)) {
|
|
129
|
+
diffSingleAction(key, before.surface.actions[key], after.surface.actions[key], out);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Diff a single action's contract fields.
|
|
135
|
+
* @internal
|
|
136
|
+
*/
|
|
137
|
+
function diffSingleAction(actionKey, before, after, out) {
|
|
138
|
+
if (before.destructive !== after.destructive) {
|
|
139
|
+
out.push({
|
|
140
|
+
category: 'surface.action',
|
|
141
|
+
field: `actions.${actionKey}.destructive`,
|
|
142
|
+
severity: 'BREAKING',
|
|
143
|
+
description: `Action "${actionKey}" destructive flag changed: ${before.destructive} → ${after.destructive}`,
|
|
144
|
+
before: String(before.destructive),
|
|
145
|
+
after: String(after.destructive),
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
if (before.idempotent !== after.idempotent) {
|
|
149
|
+
out.push({
|
|
150
|
+
category: 'surface.action',
|
|
151
|
+
field: `actions.${actionKey}.idempotent`,
|
|
152
|
+
severity: 'RISKY',
|
|
153
|
+
description: `Action "${actionKey}" idempotent flag changed`,
|
|
154
|
+
before: String(before.idempotent),
|
|
155
|
+
after: String(after.idempotent),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
if (before.readOnly !== after.readOnly) {
|
|
159
|
+
out.push({
|
|
160
|
+
category: 'surface.action',
|
|
161
|
+
field: `actions.${actionKey}.readOnly`,
|
|
162
|
+
severity: 'BREAKING',
|
|
163
|
+
description: `Action "${actionKey}" readOnly flag changed: ${before.readOnly} → ${after.readOnly}`,
|
|
164
|
+
before: String(before.readOnly),
|
|
165
|
+
after: String(after.readOnly),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
// Required fields
|
|
169
|
+
const removedFields = before.requiredFields.filter(f => !after.requiredFields.includes(f));
|
|
170
|
+
const addedFields = after.requiredFields.filter(f => !before.requiredFields.includes(f));
|
|
171
|
+
if (removedFields.length > 0) {
|
|
172
|
+
out.push({
|
|
173
|
+
category: 'surface.action',
|
|
174
|
+
field: `actions.${actionKey}.requiredFields`,
|
|
175
|
+
severity: 'SAFE',
|
|
176
|
+
description: `Action "${actionKey}" no longer requires: [${removedFields.join(', ')}]`,
|
|
177
|
+
before: JSON.stringify(before.requiredFields),
|
|
178
|
+
after: JSON.stringify(after.requiredFields),
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
if (addedFields.length > 0) {
|
|
182
|
+
out.push({
|
|
183
|
+
category: 'surface.action',
|
|
184
|
+
field: `actions.${actionKey}.requiredFields`,
|
|
185
|
+
severity: 'BREAKING',
|
|
186
|
+
description: `Action "${actionKey}" now requires new fields: [${addedFields.join(', ')}]`,
|
|
187
|
+
before: JSON.stringify(before.requiredFields),
|
|
188
|
+
after: JSON.stringify(after.requiredFields),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
// Presenter change
|
|
192
|
+
if (before.presenterName !== after.presenterName) {
|
|
193
|
+
out.push({
|
|
194
|
+
category: 'surface.action',
|
|
195
|
+
field: `actions.${actionKey}.presenterName`,
|
|
196
|
+
severity: before.presenterName && !after.presenterName ? 'BREAKING' : 'RISKY',
|
|
197
|
+
description: `Action "${actionKey}" Presenter changed: ${before.presenterName ?? 'none'} → ${after.presenterName ?? 'none'}`,
|
|
198
|
+
before: before.presenterName ?? null,
|
|
199
|
+
after: after.presenterName ?? null,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
if (before.inputSchemaDigest !== after.inputSchemaDigest) {
|
|
203
|
+
out.push({
|
|
204
|
+
category: 'surface.action',
|
|
205
|
+
field: `actions.${actionKey}.inputSchemaDigest`,
|
|
206
|
+
severity: 'RISKY',
|
|
207
|
+
description: `Action "${actionKey}" input schema changed`,
|
|
208
|
+
before: before.inputSchemaDigest,
|
|
209
|
+
after: after.inputSchemaDigest,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Diff behavioral contracts.
|
|
215
|
+
* @internal
|
|
216
|
+
*/
|
|
217
|
+
function diffBehavior(before, after, out) {
|
|
218
|
+
// Egress schema
|
|
219
|
+
if (before.egressSchemaDigest !== after.egressSchemaDigest) {
|
|
220
|
+
out.push({
|
|
221
|
+
category: 'behavior.egress',
|
|
222
|
+
field: 'egressSchemaDigest',
|
|
223
|
+
severity: 'BREAKING',
|
|
224
|
+
description: 'Presenter egress schema changed — LLM response parsing may break',
|
|
225
|
+
before: before.egressSchemaDigest,
|
|
226
|
+
after: after.egressSchemaDigest,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
// System rules
|
|
230
|
+
if (before.systemRulesFingerprint !== after.systemRulesFingerprint) {
|
|
231
|
+
out.push({
|
|
232
|
+
category: 'behavior.rules',
|
|
233
|
+
field: 'systemRulesFingerprint',
|
|
234
|
+
severity: 'BREAKING',
|
|
235
|
+
description: 'System rules changed — LLM behavioral calibration invalidated',
|
|
236
|
+
before: before.systemRulesFingerprint,
|
|
237
|
+
after: after.systemRulesFingerprint,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
// Cognitive guardrails
|
|
241
|
+
if (before.cognitiveGuardrails.agentLimitMax !== after.cognitiveGuardrails.agentLimitMax) {
|
|
242
|
+
const severity = after.cognitiveGuardrails.agentLimitMax === null
|
|
243
|
+
? 'RISKY' // Removed limit → risk of context flooding
|
|
244
|
+
: 'SAFE';
|
|
245
|
+
out.push({
|
|
246
|
+
category: 'behavior.guardrails',
|
|
247
|
+
field: 'agentLimitMax',
|
|
248
|
+
severity,
|
|
249
|
+
description: `Agent limit changed: ${before.cognitiveGuardrails.agentLimitMax ?? 'unlimited'} → ${after.cognitiveGuardrails.agentLimitMax ?? 'unlimited'}`,
|
|
250
|
+
before: String(before.cognitiveGuardrails.agentLimitMax),
|
|
251
|
+
after: String(after.cognitiveGuardrails.agentLimitMax),
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
if (before.cognitiveGuardrails.egressMaxBytes !== after.cognitiveGuardrails.egressMaxBytes) {
|
|
255
|
+
const severity = after.cognitiveGuardrails.egressMaxBytes === null
|
|
256
|
+
? 'RISKY' // Removed cap → risk of payload inflation
|
|
257
|
+
: 'SAFE';
|
|
258
|
+
out.push({
|
|
259
|
+
category: 'behavior.guardrails',
|
|
260
|
+
field: 'egressMaxBytes',
|
|
261
|
+
severity,
|
|
262
|
+
description: `Egress max bytes changed: ${before.cognitiveGuardrails.egressMaxBytes ?? 'unlimited'} → ${after.cognitiveGuardrails.egressMaxBytes ?? 'unlimited'}`,
|
|
263
|
+
before: String(before.cognitiveGuardrails.egressMaxBytes),
|
|
264
|
+
after: String(after.cognitiveGuardrails.egressMaxBytes),
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
// Middleware chain
|
|
268
|
+
const beforeMw = before.middlewareChain.join(',');
|
|
269
|
+
const afterMw = after.middlewareChain.join(',');
|
|
270
|
+
if (beforeMw !== afterMw) {
|
|
271
|
+
out.push({
|
|
272
|
+
category: 'behavior.middleware',
|
|
273
|
+
field: 'middlewareChain',
|
|
274
|
+
severity: 'RISKY',
|
|
275
|
+
description: 'Middleware chain changed — execution semantics may differ',
|
|
276
|
+
before: beforeMw || null,
|
|
277
|
+
after: afterMw || null,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
// State sync
|
|
281
|
+
if (before.stateSyncFingerprint !== after.stateSyncFingerprint) {
|
|
282
|
+
out.push({
|
|
283
|
+
category: 'behavior.stateSync',
|
|
284
|
+
field: 'stateSyncFingerprint',
|
|
285
|
+
severity: 'RISKY',
|
|
286
|
+
description: 'State sync policy changed',
|
|
287
|
+
before: before.stateSyncFingerprint,
|
|
288
|
+
after: after.stateSyncFingerprint,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
// Affordance topology
|
|
292
|
+
const beforeAffordances = before.affordanceTopology.join(',');
|
|
293
|
+
const afterAffordances = after.affordanceTopology.join(',');
|
|
294
|
+
if (beforeAffordances !== afterAffordances) {
|
|
295
|
+
out.push({
|
|
296
|
+
category: 'behavior.affordances',
|
|
297
|
+
field: 'affordanceTopology',
|
|
298
|
+
severity: 'RISKY',
|
|
299
|
+
description: 'Affordance topology changed — suggested action navigation graph differs',
|
|
300
|
+
before: beforeAffordances || null,
|
|
301
|
+
after: afterAffordances || null,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
// Concurrency
|
|
305
|
+
if (before.concurrencyFingerprint !== after.concurrencyFingerprint) {
|
|
306
|
+
out.push({
|
|
307
|
+
category: 'behavior.stateSync',
|
|
308
|
+
field: 'concurrencyFingerprint',
|
|
309
|
+
severity: 'RISKY',
|
|
310
|
+
description: 'Concurrency configuration changed',
|
|
311
|
+
before: before.concurrencyFingerprint,
|
|
312
|
+
after: after.concurrencyFingerprint,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
// Embedded presenters
|
|
316
|
+
const beforePresenters = before.embeddedPresenters.join(',');
|
|
317
|
+
const afterPresenters = after.embeddedPresenters.join(',');
|
|
318
|
+
if (beforePresenters !== afterPresenters) {
|
|
319
|
+
out.push({
|
|
320
|
+
category: 'behavior.egress',
|
|
321
|
+
field: 'embeddedPresenters',
|
|
322
|
+
severity: 'RISKY',
|
|
323
|
+
description: 'Embedded Presenter set changed — response composition differs',
|
|
324
|
+
before: beforePresenters || null,
|
|
325
|
+
after: afterPresenters || null,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Diff token economics profiles.
|
|
331
|
+
* @internal
|
|
332
|
+
*/
|
|
333
|
+
function diffTokenEconomics(before, after, out) {
|
|
334
|
+
if (before.inflationRisk !== after.inflationRisk) {
|
|
335
|
+
const escalated = SEVERITY_ORDER[riskToSeverity(after.inflationRisk)]
|
|
336
|
+
> SEVERITY_ORDER[riskToSeverity(before.inflationRisk)];
|
|
337
|
+
out.push({
|
|
338
|
+
category: 'tokenEconomics',
|
|
339
|
+
field: 'inflationRisk',
|
|
340
|
+
severity: escalated ? 'BREAKING' : 'SAFE',
|
|
341
|
+
description: `Cognitive overload risk changed: ${before.inflationRisk} → ${after.inflationRisk}`,
|
|
342
|
+
before: before.inflationRisk,
|
|
343
|
+
after: after.inflationRisk,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
if (before.unboundedCollection !== after.unboundedCollection) {
|
|
347
|
+
out.push({
|
|
348
|
+
category: 'tokenEconomics',
|
|
349
|
+
field: 'unboundedCollection',
|
|
350
|
+
severity: after.unboundedCollection ? 'RISKY' : 'SAFE',
|
|
351
|
+
description: `Unbounded collection flag: ${before.unboundedCollection} → ${after.unboundedCollection}`,
|
|
352
|
+
before: String(before.unboundedCollection),
|
|
353
|
+
after: String(after.unboundedCollection),
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Map inflation risk to comparable severity.
|
|
359
|
+
* @internal
|
|
360
|
+
*/
|
|
361
|
+
function riskToSeverity(risk) {
|
|
362
|
+
switch (risk) {
|
|
363
|
+
case 'critical': return 'BREAKING';
|
|
364
|
+
case 'high': return 'RISKY';
|
|
365
|
+
case 'medium': return 'SAFE';
|
|
366
|
+
case 'low': return 'COSMETIC';
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Diff handler entitlements.
|
|
371
|
+
* @internal
|
|
372
|
+
*/
|
|
373
|
+
function diffEntitlements(before, after, out) {
|
|
374
|
+
const entitlementFlags = ['filesystem', 'network', 'subprocess', 'crypto', 'codeEvaluation'];
|
|
375
|
+
for (const flag of entitlementFlags) {
|
|
376
|
+
if (!before[flag] && after[flag]) {
|
|
377
|
+
out.push({
|
|
378
|
+
category: 'entitlements',
|
|
379
|
+
field: flag,
|
|
380
|
+
severity: 'BREAKING',
|
|
381
|
+
description: `Handler gained "${flag}" entitlement — blast radius expanded`,
|
|
382
|
+
before: 'false',
|
|
383
|
+
after: 'true',
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
else if (before[flag] && !after[flag]) {
|
|
387
|
+
out.push({
|
|
388
|
+
category: 'entitlements',
|
|
389
|
+
field: flag,
|
|
390
|
+
severity: 'SAFE',
|
|
391
|
+
description: `Handler lost "${flag}" entitlement — blast radius reduced`,
|
|
392
|
+
before: 'true',
|
|
393
|
+
after: 'false',
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
// ============================================================================
|
|
399
|
+
// Diff Formatting
|
|
400
|
+
// ============================================================================
|
|
401
|
+
/**
|
|
402
|
+
* Format a diff result as a human-readable report.
|
|
403
|
+
*
|
|
404
|
+
* Designed for both terminal output and injection into
|
|
405
|
+
* LLM correction prompts (Self-Healing Context).
|
|
406
|
+
*/
|
|
407
|
+
export function formatDiffReport(result) {
|
|
408
|
+
if (result.deltas.length === 0) {
|
|
409
|
+
return `[${result.toolName}] No contract changes detected.`;
|
|
410
|
+
}
|
|
411
|
+
const lines = [
|
|
412
|
+
`[${result.toolName}] Contract diff: ${result.deltas.length} change(s), max severity: ${result.maxSeverity}`,
|
|
413
|
+
'',
|
|
414
|
+
];
|
|
415
|
+
for (const delta of result.deltas) {
|
|
416
|
+
lines.push(` [${delta.severity}] ${delta.field}: ${delta.description}`);
|
|
417
|
+
lines.push(` ${formatArrow(delta)}`);
|
|
418
|
+
}
|
|
419
|
+
return lines.join('\n');
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Format deltas as XML for injection into LLM correction prompts.
|
|
423
|
+
* Compatible with ValidationErrorFormatter's XML format.
|
|
424
|
+
*/
|
|
425
|
+
export function formatDeltasAsXml(deltas) {
|
|
426
|
+
if (deltas.length === 0)
|
|
427
|
+
return '';
|
|
428
|
+
const lines = ['<contract_changes>'];
|
|
429
|
+
for (const delta of deltas) {
|
|
430
|
+
lines.push(` <change severity="${escapeXml(delta.severity)}" field="${escapeXml(delta.field)}">`);
|
|
431
|
+
lines.push(` <description>${escapeXml(delta.description)}</description>`);
|
|
432
|
+
if (delta.before !== null)
|
|
433
|
+
lines.push(` <before>${escapeXml(delta.before)}</before>`);
|
|
434
|
+
if (delta.after !== null)
|
|
435
|
+
lines.push(` <after>${escapeXml(delta.after)}</after>`);
|
|
436
|
+
lines.push(' </change>');
|
|
437
|
+
}
|
|
438
|
+
lines.push('</contract_changes>');
|
|
439
|
+
return lines.join('\n');
|
|
440
|
+
}
|
|
441
|
+
// ============================================================================
|
|
442
|
+
// Utility
|
|
443
|
+
// ============================================================================
|
|
444
|
+
function truncate(s, maxLen) {
|
|
445
|
+
return s.length > maxLen ? s.slice(0, maxLen - 3) + '...' : s;
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Format the before→after arrow for a contract delta.
|
|
449
|
+
* @internal
|
|
450
|
+
*/
|
|
451
|
+
function formatArrow(delta) {
|
|
452
|
+
if (delta.before !== null && delta.after !== null) {
|
|
453
|
+
return `${truncate(delta.before, 40)} → ${truncate(delta.after, 40)}`;
|
|
454
|
+
}
|
|
455
|
+
return delta.after !== null
|
|
456
|
+
? `(added) ${truncate(delta.after, 40)}`
|
|
457
|
+
: `(removed) ${truncate(delta.before, 40)}`;
|
|
458
|
+
}
|
|
459
|
+
function escapeXml(s) {
|
|
460
|
+
return s
|
|
461
|
+
.replace(/&/g, '&')
|
|
462
|
+
.replace(/</g, '<')
|
|
463
|
+
.replace(/>/g, '>')
|
|
464
|
+
.replace(/"/g, '"');
|
|
465
|
+
}
|
|
466
|
+
//# sourceMappingURL=ContractDiff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContractDiff.js","sourceRoot":"","sources":["../../src/introspection/ContractDiff.ts"],"names":[],"mappings":"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"}
|