@vinkius-core/mcp-fusion 2.6.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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/client/FusionClient.d.ts +122 -1
- package/dist/client/FusionClient.d.ts.map +1 -1
- package/dist/client/FusionClient.js +173 -11
- package/dist/client/FusionClient.js.map +1 -1
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/core/StandardSchema.d.ts +178 -0
- package/dist/core/StandardSchema.d.ts.map +1 -0
- package/dist/core/StandardSchema.js +166 -0
- package/dist/core/StandardSchema.js.map +1 -0
- package/dist/core/createGroup.d.ts +140 -0
- package/dist/core/createGroup.d.ts.map +1 -0
- package/dist/core/createGroup.js +133 -0
- package/dist/core/createGroup.js.map +1 -0
- package/dist/core/execution/ExecutionPipeline.d.ts.map +1 -1
- package/dist/core/execution/ExecutionPipeline.js +6 -2
- package/dist/core/execution/ExecutionPipeline.js.map +1 -1
- package/dist/core/index.d.ts +7 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/initFusion.d.ts +201 -0
- package/dist/core/initFusion.d.ts.map +1 -0
- package/dist/core/initFusion.js +134 -0
- package/dist/core/initFusion.js.map +1 -0
- package/dist/core/response.d.ts +49 -2
- package/dist/core/response.d.ts.map +1 -1
- package/dist/core/response.js +27 -5
- package/dist/core/response.js.map +1 -1
- package/dist/index.d.ts +57 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -4
- 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 +146 -0
- package/dist/introspection/BehaviorDigest.js.map +1 -0
- package/dist/introspection/CapabilityLockfile.d.ts +259 -0
- package/dist/introspection/CapabilityLockfile.d.ts.map +1 -0
- package/dist/introspection/CapabilityLockfile.js +391 -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 +124 -0
- package/dist/introspection/EntitlementScanner.d.ts.map +1 -0
- package/dist/introspection/EntitlementScanner.js +244 -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 +159 -0
- package/dist/introspection/ToolContract.d.ts.map +1 -0
- package/dist/introspection/ToolContract.js +191 -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/presenter/ZodDescriptionExtractor.d.ts +54 -0
- package/dist/presenter/ZodDescriptionExtractor.d.ts.map +1 -0
- package/dist/presenter/ZodDescriptionExtractor.js +131 -0
- package/dist/presenter/ZodDescriptionExtractor.js.map +1 -0
- package/dist/presenter/definePresenter.d.ts +172 -0
- package/dist/presenter/definePresenter.d.ts.map +1 -0
- package/dist/presenter/definePresenter.js +96 -0
- package/dist/presenter/definePresenter.js.map +1 -0
- package/dist/presenter/index.d.ts +3 -0
- package/dist/presenter/index.d.ts.map +1 -1
- package/dist/presenter/index.js +4 -0
- package/dist/presenter/index.js.map +1 -1
- package/dist/server/DevServer.d.ts +96 -0
- package/dist/server/DevServer.d.ts.map +1 -0
- package/dist/server/DevServer.js +187 -0
- package/dist/server/DevServer.js.map +1 -0
- 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/dist/server/autoDiscover.d.ts +63 -0
- package/dist/server/autoDiscover.d.ts.map +1 -0
- package/dist/server/autoDiscover.js +157 -0
- package/dist/server/autoDiscover.js.map +1 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -0
- package/dist/server/index.js.map +1 -1
- package/dist/state-sync/PolicyValidator.d.ts +36 -0
- package/dist/state-sync/PolicyValidator.d.ts.map +1 -1
- package/dist/state-sync/PolicyValidator.js +35 -0
- package/dist/state-sync/PolicyValidator.js.map +1 -1
- package/dist/state-sync/ResponseDecorator.d.ts.map +1 -1
- package/dist/state-sync/ResponseDecorator.js +2 -1
- package/dist/state-sync/ResponseDecorator.js.map +1 -1
- package/dist/state-sync/StateSyncLayer.d.ts +5 -4
- package/dist/state-sync/StateSyncLayer.d.ts.map +1 -1
- package/dist/state-sync/StateSyncLayer.js +35 -4
- package/dist/state-sync/StateSyncLayer.js.map +1 -1
- package/dist/state-sync/index.d.ts +3 -1
- package/dist/state-sync/index.d.ts.map +1 -1
- package/dist/state-sync/index.js +1 -0
- package/dist/state-sync/index.js.map +1 -1
- package/dist/state-sync/types.d.ts +62 -0
- package/dist/state-sync/types.d.ts.map +1 -1
- package/package.json +45 -1
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* definePresenter() — Declarative Presenter Definition
|
|
3
|
+
*
|
|
4
|
+
* Zero-friction object-config API for creating Presenters.
|
|
5
|
+
* Replaces the fluent builder pattern with a single object literal
|
|
6
|
+
* that enables instant Ctrl+Space autocomplete and zero generic noise.
|
|
7
|
+
*
|
|
8
|
+
* The `schema` field drives type inference: the `ui`, `rules`, and
|
|
9
|
+
* `suggestActions` callbacks automatically receive the inferred type,
|
|
10
|
+
* so the developer never writes a generic parameter manually.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { definePresenter, ui } from '@vinkius-core/mcp-fusion';
|
|
15
|
+
* import { z } from 'zod';
|
|
16
|
+
*
|
|
17
|
+
* export const InvoicePresenter = definePresenter({
|
|
18
|
+
* name: 'Invoice',
|
|
19
|
+
* schema: z.object({
|
|
20
|
+
* id: z.string(),
|
|
21
|
+
* amount_cents: z.number().describe('CRITICAL: in CENTS. Divide by 100.'),
|
|
22
|
+
* status: z.enum(['paid', 'pending']),
|
|
23
|
+
* }),
|
|
24
|
+
* rules: ['CRITICAL: Divide amount_cents by 100 before displaying.'],
|
|
25
|
+
* ui: (inv) => [ui.echarts({ series: [{ type: 'gauge', data: [{ value: inv.amount_cents / 100 }] }] })],
|
|
26
|
+
* suggestActions: (inv) =>
|
|
27
|
+
* inv.status === 'pending'
|
|
28
|
+
* ? [{ tool: 'billing.pay', reason: 'Offer immediate payment' }]
|
|
29
|
+
* : [],
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @module
|
|
34
|
+
*/
|
|
35
|
+
import {} from 'zod';
|
|
36
|
+
import { Presenter } from './Presenter.js';
|
|
37
|
+
import {} from './ui.js';
|
|
38
|
+
import { extractZodDescriptions } from './ZodDescriptionExtractor.js';
|
|
39
|
+
/**
|
|
40
|
+
* Implementation
|
|
41
|
+
* @internal
|
|
42
|
+
*/
|
|
43
|
+
export function definePresenter(config) {
|
|
44
|
+
const presenter = new Presenter(config.name);
|
|
45
|
+
if (config.schema) {
|
|
46
|
+
presenter.schema(config.schema);
|
|
47
|
+
}
|
|
48
|
+
// ── Zod-Driven Prompts: auto-extract .describe() annotations ──
|
|
49
|
+
const autoRules = config.autoRules !== false; // default: true
|
|
50
|
+
const zodDescriptions = (autoRules && config.schema)
|
|
51
|
+
? extractZodDescriptions(config.schema)
|
|
52
|
+
: [];
|
|
53
|
+
if (config.rules) {
|
|
54
|
+
if (typeof config.rules === 'function') {
|
|
55
|
+
// Dynamic rules — wrap to prepend Zod descriptions
|
|
56
|
+
if (zodDescriptions.length > 0) {
|
|
57
|
+
const dynamicFn = config.rules;
|
|
58
|
+
presenter.systemRules((data, ctx) => [
|
|
59
|
+
...zodDescriptions,
|
|
60
|
+
...dynamicFn(data, ctx),
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
presenter.systemRules(config.rules);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Static rules — merge with Zod descriptions
|
|
69
|
+
const merged = [...zodDescriptions, ...config.rules];
|
|
70
|
+
presenter.systemRules(merged);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else if (zodDescriptions.length > 0) {
|
|
74
|
+
// No explicit rules — use Zod descriptions alone
|
|
75
|
+
presenter.systemRules(zodDescriptions);
|
|
76
|
+
}
|
|
77
|
+
if (config.ui) {
|
|
78
|
+
presenter.uiBlocks(config.ui);
|
|
79
|
+
}
|
|
80
|
+
if (config.collectionUi) {
|
|
81
|
+
presenter.collectionUiBlocks(config.collectionUi);
|
|
82
|
+
}
|
|
83
|
+
if (config.agentLimit) {
|
|
84
|
+
presenter.agentLimit(config.agentLimit.max, config.agentLimit.onTruncate);
|
|
85
|
+
}
|
|
86
|
+
if (config.suggestActions) {
|
|
87
|
+
presenter.suggestActions(config.suggestActions);
|
|
88
|
+
}
|
|
89
|
+
if (config.embeds) {
|
|
90
|
+
for (const embed of config.embeds) {
|
|
91
|
+
presenter.embed(embed.key, embed.presenter);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return presenter;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=definePresenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definePresenter.js","sourceRoot":"","sources":["../../src/presenter/definePresenter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAAgB,MAAM,KAAK,CAAC;AACnC,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAgB,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAyJtE;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAgC;IAC5D,MAAM,SAAS,GAAG,IAAI,SAAS,CAAU,MAAM,CAAC,IAAI,CAAC,CAAC;IAEtD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,iEAAiE;IACjE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,gBAAgB;IAC9D,MAAM,eAAe,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC;QAChD,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC;QACvC,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACrC,mDAAmD;YACnD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC/B,SAAS,CAAC,WAAW,CAAC,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE,CAAC;oBACpD,GAAG,eAAe;oBAClB,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC;iBAC1B,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,KAA4D,CAAC,CAAC;YAC/F,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,6CAA6C;YAC7C,MAAM,MAAM,GAAG,CAAC,GAAG,eAAe,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACrD,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;SAAM,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,iDAAiD;QACjD,SAAS,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACZ,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACtB,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACpB,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC"}
|
|
@@ -8,6 +8,9 @@ export type { ActionSuggestion } from './ResponseBuilder.js';
|
|
|
8
8
|
export { ui } from './ui.js';
|
|
9
9
|
export type { UiBlock } from './ui.js';
|
|
10
10
|
export { Presenter, createPresenter, isPresenter } from './Presenter.js';
|
|
11
|
+
export { definePresenter } from './definePresenter.js';
|
|
12
|
+
export type { PresenterConfig, AgentLimitDef, EmbedDef } from './definePresenter.js';
|
|
13
|
+
export { extractZodDescriptions } from './ZodDescriptionExtractor.js';
|
|
11
14
|
export { PresenterValidationError } from './PresenterValidationError.js';
|
|
12
15
|
export { postProcessResult, isToolResponse } from './PostProcessor.js';
|
|
13
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presenter/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACpF,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAGzE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presenter/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACpF,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGzE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAGtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAGzE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/presenter/index.js
CHANGED
|
@@ -9,6 +9,10 @@ export { ResponseBuilder, response, isResponseBuilder } from './ResponseBuilder.
|
|
|
9
9
|
export { ui } from './ui.js';
|
|
10
10
|
// ── Presenter ────────────────────────────────────────────
|
|
11
11
|
export { Presenter, createPresenter, isPresenter } from './Presenter.js';
|
|
12
|
+
// ── Declarative Presenter ────────────────────────────────
|
|
13
|
+
export { definePresenter } from './definePresenter.js';
|
|
14
|
+
// ── Zod Description Extraction ───────────────────────────
|
|
15
|
+
export { extractZodDescriptions } from './ZodDescriptionExtractor.js';
|
|
12
16
|
// ── Validation Error ─────────────────────────────────────
|
|
13
17
|
export { PresenterValidationError } from './PresenterValidationError.js';
|
|
14
18
|
// ── Post-Processing ──────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presenter/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,4DAA4D;AAC5D,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGpF,4DAA4D;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAG7B,4DAA4D;AAC5D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEzE,4DAA4D;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,4DAA4D;AAC5D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presenter/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,4DAA4D;AAC5D,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGpF,4DAA4D;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAG7B,4DAA4D;AAC5D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEzE,4DAA4D;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,4DAA4D;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,4DAA4D;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,4DAA4D;AAC5D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/** Duck-typed MCP server that supports notifications */
|
|
2
|
+
interface McpServerLike {
|
|
3
|
+
notification(notification: {
|
|
4
|
+
method: string;
|
|
5
|
+
}): Promise<void>;
|
|
6
|
+
sendNotification?(notification: {
|
|
7
|
+
method: string;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
/** Duck-typed ToolRegistry */
|
|
11
|
+
interface ToolRegistryLike {
|
|
12
|
+
register(builder: unknown): void;
|
|
13
|
+
getBuilders?(): unknown[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Configuration for the development server.
|
|
17
|
+
*/
|
|
18
|
+
export interface DevServerConfig {
|
|
19
|
+
/**
|
|
20
|
+
* Directory to watch for file changes.
|
|
21
|
+
* Relative paths are resolved from the current working directory.
|
|
22
|
+
*/
|
|
23
|
+
readonly dir: string;
|
|
24
|
+
/**
|
|
25
|
+
* File extension filter for watched files.
|
|
26
|
+
* @default ['.ts', '.js', '.mjs', '.mts']
|
|
27
|
+
*/
|
|
28
|
+
readonly extensions?: string[];
|
|
29
|
+
/**
|
|
30
|
+
* Debounce interval in milliseconds.
|
|
31
|
+
* Prevents rapid-fire reloads when editors save multiple files.
|
|
32
|
+
* @default 300
|
|
33
|
+
*/
|
|
34
|
+
readonly debounce?: number;
|
|
35
|
+
/**
|
|
36
|
+
* Setup callback invoked on every reload.
|
|
37
|
+
*
|
|
38
|
+
* Receives a fresh ToolRegistry. The callback should:
|
|
39
|
+
* 1. Import/define all tools
|
|
40
|
+
* 2. Register them on the registry
|
|
41
|
+
*
|
|
42
|
+
* This is called on initial startup and on every file change.
|
|
43
|
+
*/
|
|
44
|
+
readonly setup: (registry: ToolRegistryLike) => void | Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Optional callback when a reload occurs.
|
|
47
|
+
* Useful for logging or triggering downstream updates.
|
|
48
|
+
*/
|
|
49
|
+
readonly onReload?: (changedFile: string) => void;
|
|
50
|
+
/**
|
|
51
|
+
* Optional MCP server reference for sending tool list change notifications.
|
|
52
|
+
* When provided, the dev server sends `notifications/tools/list_changed`
|
|
53
|
+
* on every reload, so the LLM client picks up changes automatically.
|
|
54
|
+
*/
|
|
55
|
+
readonly server?: McpServerLike;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Interface for a running dev server instance.
|
|
59
|
+
*/
|
|
60
|
+
export interface DevServer {
|
|
61
|
+
/** Start watching and perform initial load */
|
|
62
|
+
start(): Promise<void>;
|
|
63
|
+
/** Stop the watcher and clean up */
|
|
64
|
+
stop(): void;
|
|
65
|
+
/** Force a manual reload (useful from CLI) */
|
|
66
|
+
reload(reason?: string): Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create an HMR-enabled MCP development server.
|
|
70
|
+
*
|
|
71
|
+
* Watches a directory for file changes and automatically reloads
|
|
72
|
+
* tools, then notifies the connected MCP client via the native
|
|
73
|
+
* `notifications/tools/list_changed` notification.
|
|
74
|
+
*
|
|
75
|
+
* @param config - Dev server configuration
|
|
76
|
+
* @returns A {@link DevServer} instance with start/stop/reload controls
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* import { createDevServer, autoDiscover, ToolRegistry } from '@vinkius-core/mcp-fusion';
|
|
81
|
+
*
|
|
82
|
+
* const devServer = createDevServer({
|
|
83
|
+
* dir: './src/tools',
|
|
84
|
+
* setup: async (registry) => {
|
|
85
|
+
* await autoDiscover(registry, './src/tools');
|
|
86
|
+
* },
|
|
87
|
+
* onReload: (file) => console.log(`[HMR] Reloaded: ${file}`),
|
|
88
|
+
* });
|
|
89
|
+
*
|
|
90
|
+
* await devServer.start();
|
|
91
|
+
* // File changes → auto-reload → LLM client gets notification
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export declare function createDevServer(config: DevServerConfig): DevServer;
|
|
95
|
+
export {};
|
|
96
|
+
//# sourceMappingURL=DevServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevServer.d.ts","sourceRoot":"","sources":["../../src/server/DevServer.ts"],"names":[],"mappings":"AAkDA,wDAAwD;AACxD,UAAU,aAAa;IACnB,YAAY,CAAC,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,gBAAgB,CAAC,CAAC,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED,8BAA8B;AAC9B,UAAU,gBAAgB;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAEjC,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAE/B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErE;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAElD;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,8CAA8C;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,oCAAoC;IACpC,IAAI,IAAI,IAAI,CAAC;IACb,8CAA8C;IAC9C,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAuCD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CA+FlE"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevServer — HMR-enabled MCP Development Server
|
|
3
|
+
*
|
|
4
|
+
* The "killer feature" for MCP DX: `npx mcp-fusion dev` starts a
|
|
5
|
+
* development server that watches for file changes and performs
|
|
6
|
+
* automatic Hot Module Replacement without requiring the LLM client
|
|
7
|
+
* (Claude Desktop, Cursor, etc.) to be restarted.
|
|
8
|
+
*
|
|
9
|
+
* ## How It Works
|
|
10
|
+
*
|
|
11
|
+
* 1. The dev server starts an MCP stdio server with your tools
|
|
12
|
+
* 2. When a `.ts`/`.js` file changes, the module cache is invalidated
|
|
13
|
+
* 3. Tools are re-registered from the updated modules
|
|
14
|
+
* 4. The MCP `notifications/tools/list_changed` notification is sent
|
|
15
|
+
* 5. The LLM client picks up the new tool definitions transparently
|
|
16
|
+
*
|
|
17
|
+
* ## Usage
|
|
18
|
+
*
|
|
19
|
+
* ```bash
|
|
20
|
+
* # Start dev server watching src/tools/ directory
|
|
21
|
+
* npx mcp-fusion dev --dir ./src/tools --entry ./src/server.ts
|
|
22
|
+
*
|
|
23
|
+
* # With specific file pattern
|
|
24
|
+
* npx mcp-fusion dev --dir ./src/tools --pattern "*.tool.ts"
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* // Using the programmatic API
|
|
30
|
+
* import { createDevServer } from '@vinkius-core/mcp-fusion/dev';
|
|
31
|
+
*
|
|
32
|
+
* const devServer = createDevServer({
|
|
33
|
+
* dir: './src/tools',
|
|
34
|
+
* setup: async (registry) => {
|
|
35
|
+
* // Your setup logic — called on every reload
|
|
36
|
+
* await autoDiscover(registry, './src/tools');
|
|
37
|
+
* },
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* await devServer.start();
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @module
|
|
44
|
+
*/
|
|
45
|
+
import { watch } from 'node:fs';
|
|
46
|
+
import { resolve, join, relative } from 'node:path';
|
|
47
|
+
import { pathToFileURL } from 'node:url';
|
|
48
|
+
// ── Module Cache Invalidation ────────────────────────────
|
|
49
|
+
/**
|
|
50
|
+
* Invalidate Node.js ESM module cache for a given file.
|
|
51
|
+
*
|
|
52
|
+
* ESM modules are cached by URL. We use an import timestamp trick
|
|
53
|
+
* to force re-evaluation on next import.
|
|
54
|
+
*
|
|
55
|
+
* For CJS, we clear `require.cache` if available.
|
|
56
|
+
*
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
function invalidateModule(filePath) {
|
|
60
|
+
const absolutePath = resolve(filePath);
|
|
61
|
+
// CJS cache invalidation (when running in CJS mode)
|
|
62
|
+
if (typeof require !== 'undefined' && require.cache) {
|
|
63
|
+
delete require.cache[absolutePath];
|
|
64
|
+
}
|
|
65
|
+
// ESM modules can't be uncached directly — the caller must
|
|
66
|
+
// re-import with a cache-busting query parameter.
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a cache-busting import URL for ESM modules.
|
|
70
|
+
* Appends a timestamp query to force the module to be re-evaluated.
|
|
71
|
+
* @internal
|
|
72
|
+
*/
|
|
73
|
+
function cacheBustUrl(filePath) {
|
|
74
|
+
const url = pathToFileURL(resolve(filePath));
|
|
75
|
+
url.searchParams.set('t', String(Date.now()));
|
|
76
|
+
return url.href;
|
|
77
|
+
}
|
|
78
|
+
// ── Dev Server Factory ───────────────────────────────────
|
|
79
|
+
/**
|
|
80
|
+
* Create an HMR-enabled MCP development server.
|
|
81
|
+
*
|
|
82
|
+
* Watches a directory for file changes and automatically reloads
|
|
83
|
+
* tools, then notifies the connected MCP client via the native
|
|
84
|
+
* `notifications/tools/list_changed` notification.
|
|
85
|
+
*
|
|
86
|
+
* @param config - Dev server configuration
|
|
87
|
+
* @returns A {@link DevServer} instance with start/stop/reload controls
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* import { createDevServer, autoDiscover, ToolRegistry } from '@vinkius-core/mcp-fusion';
|
|
92
|
+
*
|
|
93
|
+
* const devServer = createDevServer({
|
|
94
|
+
* dir: './src/tools',
|
|
95
|
+
* setup: async (registry) => {
|
|
96
|
+
* await autoDiscover(registry, './src/tools');
|
|
97
|
+
* },
|
|
98
|
+
* onReload: (file) => console.log(`[HMR] Reloaded: ${file}`),
|
|
99
|
+
* });
|
|
100
|
+
*
|
|
101
|
+
* await devServer.start();
|
|
102
|
+
* // File changes → auto-reload → LLM client gets notification
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export function createDevServer(config) {
|
|
106
|
+
const { dir, extensions = ['.ts', '.js', '.mjs', '.mts'], debounce = 300, setup, onReload, server, } = config;
|
|
107
|
+
const absoluteDir = resolve(dir);
|
|
108
|
+
let watcher;
|
|
109
|
+
let debounceTimer;
|
|
110
|
+
let reloadCount = 0;
|
|
111
|
+
/**
|
|
112
|
+
* Perform a full reload: clear caches, re-run setup, notify MCP client.
|
|
113
|
+
*/
|
|
114
|
+
async function performReload(changedFile) {
|
|
115
|
+
reloadCount++;
|
|
116
|
+
// Invalidate CJS cache for all watched files
|
|
117
|
+
invalidateModule(changedFile);
|
|
118
|
+
// Re-run the user's setup callback
|
|
119
|
+
// The user is responsible for creating a fresh registry or clearing it
|
|
120
|
+
try {
|
|
121
|
+
await setup({});
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
125
|
+
// eslint-disable-next-line no-console
|
|
126
|
+
console.error(`[mcp-fusion dev] Reload failed: ${message}`);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
// Notify MCP client about tool list changes
|
|
130
|
+
if (server) {
|
|
131
|
+
const notification = { method: 'notifications/tools/list_changed' };
|
|
132
|
+
try {
|
|
133
|
+
if (typeof server.sendNotification === 'function') {
|
|
134
|
+
await server.sendNotification(notification);
|
|
135
|
+
}
|
|
136
|
+
else if (typeof server.notification === 'function') {
|
|
137
|
+
await server.notification(notification);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Connection might not be established yet — ignore
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// User callback
|
|
145
|
+
onReload?.(changedFile);
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
async start() {
|
|
149
|
+
// Perform initial load
|
|
150
|
+
await performReload('(initial)');
|
|
151
|
+
// Start watching
|
|
152
|
+
const watchOptions = { recursive: true };
|
|
153
|
+
watcher = watch(absoluteDir, watchOptions, (_eventType, filename) => {
|
|
154
|
+
if (!filename)
|
|
155
|
+
return;
|
|
156
|
+
// Filter by extension
|
|
157
|
+
const ext = '.' + filename.split('.').pop();
|
|
158
|
+
if (!extensions.includes(ext))
|
|
159
|
+
return;
|
|
160
|
+
// Skip test/spec files
|
|
161
|
+
if (/\.(test|spec|d)\./.test(filename))
|
|
162
|
+
return;
|
|
163
|
+
// Debounce rapid changes
|
|
164
|
+
if (debounceTimer)
|
|
165
|
+
clearTimeout(debounceTimer);
|
|
166
|
+
debounceTimer = setTimeout(() => {
|
|
167
|
+
const fullPath = join(absoluteDir, filename);
|
|
168
|
+
void performReload(relative(process.cwd(), fullPath));
|
|
169
|
+
}, debounce);
|
|
170
|
+
});
|
|
171
|
+
// eslint-disable-next-line no-console
|
|
172
|
+
console.log(`[mcp-fusion dev] Watching ${relative(process.cwd(), absoluteDir)} for changes...`);
|
|
173
|
+
},
|
|
174
|
+
stop() {
|
|
175
|
+
if (debounceTimer)
|
|
176
|
+
clearTimeout(debounceTimer);
|
|
177
|
+
watcher?.close();
|
|
178
|
+
watcher = undefined;
|
|
179
|
+
// eslint-disable-next-line no-console
|
|
180
|
+
console.log(`[mcp-fusion dev] Stopped. ${reloadCount} reload(s) performed.`);
|
|
181
|
+
},
|
|
182
|
+
async reload(reason) {
|
|
183
|
+
await performReload(reason ?? '(manual)');
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=DevServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevServer.js","sourceRoot":"","sources":["../../src/server/DevServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,8 @@ import { type DebugObserverFn } from '../observability/DebugObserver.js';
|
|
|
6
6
|
import { type FusionTracer } from '../observability/Tracing.js';
|
|
7
7
|
import { type StateSyncConfig } from '../state-sync/types.js';
|
|
8
8
|
import { type IntrospectionConfig } from '../introspection/types.js';
|
|
9
|
+
import { type ZeroTrustConfig } from '../introspection/CryptoAttestation.js';
|
|
10
|
+
import { type SelfHealingConfig } from '../introspection/ContractAwareSelfHealing.js';
|
|
9
11
|
import { type ToolExposition } from '../exposition/types.js';
|
|
10
12
|
import { type PromptRegistry } from '../prompt/PromptRegistry.js';
|
|
11
13
|
/** Options for attaching to an MCP Server */
|
|
@@ -191,6 +193,45 @@ export interface AttachOptions<TContext> {
|
|
|
191
193
|
* @see {@link definePrompt} for creating prompts
|
|
192
194
|
*/
|
|
193
195
|
prompts?: PromptRegistry<TContext>;
|
|
196
|
+
/**
|
|
197
|
+
* Enable Zero-Trust runtime verification for behavioral contracts.
|
|
198
|
+
*
|
|
199
|
+
* When configured, the framework:
|
|
200
|
+
* 1. Materializes ToolContracts from all registered builders
|
|
201
|
+
* 2. Computes a server-level behavioral digest
|
|
202
|
+
* 3. Optionally verifies against a known-good digest (capability pinning)
|
|
203
|
+
* 4. Exposes the trust capability via MCP server metadata
|
|
204
|
+
*
|
|
205
|
+
* Zero overhead when omitted — no cryptographic operations run.
|
|
206
|
+
*
|
|
207
|
+
* @example
|
|
208
|
+
* ```typescript
|
|
209
|
+
* registry.attachToServer(server, {
|
|
210
|
+
* contextFactory: createContext,
|
|
211
|
+
* zeroTrust: {
|
|
212
|
+
* signer: 'hmac',
|
|
213
|
+
* secret: process.env.FUSION_SIGNING_SECRET,
|
|
214
|
+
* expectedDigest: process.env.FUSION_EXPECTED_DIGEST,
|
|
215
|
+
* failOnMismatch: process.env.NODE_ENV === 'production',
|
|
216
|
+
* },
|
|
217
|
+
* });
|
|
218
|
+
* ```
|
|
219
|
+
*
|
|
220
|
+
* @see {@link ZeroTrustConfig} for configuration options
|
|
221
|
+
*/
|
|
222
|
+
zeroTrust?: ZeroTrustConfig;
|
|
223
|
+
/**
|
|
224
|
+
* Enable contract-aware self-healing for validation errors.
|
|
225
|
+
*
|
|
226
|
+
* When configured, Zod validation errors are enriched with
|
|
227
|
+
* contract change context, helping the LLM self-correct
|
|
228
|
+
* when the tool's behavioral contract has changed.
|
|
229
|
+
*
|
|
230
|
+
* Zero overhead when omitted or when no contract deltas exist.
|
|
231
|
+
*
|
|
232
|
+
* @see {@link SelfHealingConfig} for configuration options
|
|
233
|
+
*/
|
|
234
|
+
selfHealing?: SelfHealingConfig;
|
|
194
235
|
}
|
|
195
236
|
/** Function to detach the registry from the server */
|
|
196
237
|
export type DetachFn = () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerAttachment.d.ts","sourceRoot":"","sources":["../../src/server/ServerAttachment.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,IAAI,IAAI,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,qCAAqC,CAAC;AAE5F,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,KAAK,cAAc,EAAqB,MAAM,6BAA6B,CAAC;AAkCrF,6CAA6C;AAC7C,MAAM,WAAW,aAAa,CAAC,QAAQ;IACnC,mDAAmD;IACnD,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACpE;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClE;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;IAExB;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAE9C;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAIpB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAIzB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ServerAttachment.d.ts","sourceRoot":"","sources":["../../src/server/ServerAttachment.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,10 @@ import { StateSyncLayer } from '../state-sync/StateSyncLayer.js';
|
|
|
20
20
|
import {} from '../state-sync/types.js';
|
|
21
21
|
import {} from '../introspection/types.js';
|
|
22
22
|
import { registerIntrospectionResource } from '../introspection/IntrospectionResource.js';
|
|
23
|
+
import { AttestationError } from '../introspection/CryptoAttestation.js';
|
|
24
|
+
import {} from '../introspection/ContractAwareSelfHealing.js';
|
|
25
|
+
import { compileContracts } from '../introspection/ToolContract.js';
|
|
26
|
+
import { computeServerDigest } from '../introspection/BehaviorDigest.js';
|
|
23
27
|
import {} from '../exposition/types.js';
|
|
24
28
|
import { compileExposition } from '../exposition/ExpositionCompiler.js';
|
|
25
29
|
import {} from '../prompt/PromptRegistry.js';
|
|
@@ -179,7 +183,7 @@ function createDetachFn(resolved, hasPrompts) {
|
|
|
179
183
|
*/
|
|
180
184
|
export function attachToServer(server, registry, options = {}) {
|
|
181
185
|
const resolved = resolveServer(server);
|
|
182
|
-
const { filter, contextFactory, debug, tracing, stateSync, introspection, serverName, toolExposition = 'flat', actionSeparator = '_', prompts, } = options;
|
|
186
|
+
const { filter, contextFactory, debug, tracing, stateSync, introspection, serverName, toolExposition = 'flat', actionSeparator = '_', prompts, zeroTrust, } = options;
|
|
183
187
|
// 1. Propagate observability to all registered builders
|
|
184
188
|
propagateObservability(registry, debug, tracing);
|
|
185
189
|
// 2. Create State Sync layer (zero overhead when not configured)
|
|
@@ -188,6 +192,26 @@ export function attachToServer(server, registry, options = {}) {
|
|
|
188
192
|
if (introspection?.enabled) {
|
|
189
193
|
registerIntrospectionResource(resolved, introspection, serverName ?? 'mcp-fusion-server', { values: () => registry.getBuilders() }, contextFactory);
|
|
190
194
|
}
|
|
195
|
+
// 3b. Zero-Trust: compile contracts, compute digest, verify attestation
|
|
196
|
+
// Zero overhead when not configured — no crypto operations run.
|
|
197
|
+
if (zeroTrust) {
|
|
198
|
+
const contracts = compileContracts(registry.getBuilders());
|
|
199
|
+
const serverDigest = computeServerDigest(contracts);
|
|
200
|
+
// Synchronous digest comparison (no signer needed for pinning)
|
|
201
|
+
if (zeroTrust.expectedDigest && serverDigest.digest !== zeroTrust.expectedDigest) {
|
|
202
|
+
if (zeroTrust.failOnMismatch ?? true) {
|
|
203
|
+
throw new AttestationError(`[MCP Fusion] Zero-Trust attestation failed: computed digest ${serverDigest.digest} does not match expected ${zeroTrust.expectedDigest}`, {
|
|
204
|
+
valid: false,
|
|
205
|
+
computedDigest: serverDigest.digest,
|
|
206
|
+
expectedDigest: zeroTrust.expectedDigest,
|
|
207
|
+
signature: null,
|
|
208
|
+
signerName: typeof zeroTrust.signer === 'string' ? zeroTrust.signer : zeroTrust.signer.name,
|
|
209
|
+
attestedAt: new Date().toISOString(),
|
|
210
|
+
error: `Digest mismatch: ${serverDigest.digest} !== ${zeroTrust.expectedDigest}`,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
191
215
|
// 4. Build handler context (shared state for all handler factories)
|
|
192
216
|
const hCtx = {
|
|
193
217
|
registry,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerAttachment.js","sourceRoot":"","sources":["../../src/server/ServerAttachment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACH,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACzB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAwB,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAqB,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAoB,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAyC,MAAM,qCAAqC,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAwB,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAqB,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAwB,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAA4B,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAC;AAC1F,OAAO,EAAuB,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAyC,MAAM,qCAAqC,CAAC;AAC/G,OAAO,EAA0C,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"ServerAttachment.js","sourceRoot":"","sources":["../../src/server/ServerAttachment.ts"],"names":[],"mappings":"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"}
|