@vinkius-core/mcp-fusion 1.9.0 → 1.10.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/CHANGELOG.md +24 -0
- package/dist/prompt/HydrationSandbox.d.ts +55 -0
- package/dist/prompt/HydrationSandbox.d.ts.map +1 -0
- package/dist/prompt/HydrationSandbox.js +122 -0
- package/dist/prompt/HydrationSandbox.js.map +1 -0
- package/dist/prompt/PromptRegistry.d.ts +20 -0
- package/dist/prompt/PromptRegistry.d.ts.map +1 -1
- package/dist/prompt/PromptRegistry.js +30 -1
- package/dist/prompt/PromptRegistry.js.map +1 -1
- package/dist/prompt/definePrompt.d.ts +4 -0
- package/dist/prompt/definePrompt.d.ts.map +1 -1
- package/dist/prompt/definePrompt.js +6 -0
- package/dist/prompt/definePrompt.js.map +1 -1
- package/dist/prompt/types.d.ts +31 -0
- package/dist/prompt/types.d.ts.map +1 -1
- package/llms.txt +25 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,30 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.10.0] - 2026-02-23
|
|
9
|
+
|
|
10
|
+
### Hydration Timeout Sandbox — Graceful Degradation for Prompt Hydration
|
|
11
|
+
|
|
12
|
+
**MCP Fusion** now protects prompt handlers from slow/failing external data sources via the **Hydration Timeout Sandbox**. When a handler fetches data from Jira, Stripe, databases, or any external source and the call hangs, the framework enforces a strict deadline, unblocks the UI immediately, and returns a structured SYSTEM ALERT.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- **`HydrationSandbox` module** (`src/prompt/HydrationSandbox.ts`): Core timeout mechanism using `Promise.race`. Wraps handler execution with a strict deadline and catches both timeouts and handler errors, converting them to graceful `<hydration_alert>` XML-structured messages.
|
|
17
|
+
- **`hydrationTimeout` config** on `definePrompt()`: Per-prompt deadline in milliseconds. Example: `definePrompt('briefing', { hydrationTimeout: 3000, handler: ... })`.
|
|
18
|
+
- **`setDefaultHydrationTimeout(ms)`** on `PromptRegistry`: Global safety net for ALL prompts. Individual prompt timeouts override the registry default.
|
|
19
|
+
- **Three-scenario coverage**: Handler completes → normal result. Handler exceeds deadline → TIMEOUT alert. Handler throws → ERROR alert. The UI ALWAYS unblocks.
|
|
20
|
+
- **Timer cleanup**: `clearTimeout` via `finally` block — no resource leaks, no dangling timers keeping Node.js alive.
|
|
21
|
+
- **Zero overhead**: When no timeout is configured, no timer is created, no `Promise.race` wrapping — the handler runs directly.
|
|
22
|
+
- **Interceptor composition**: Prompt Interceptors still execute after a timeout, ensuring compliance headers and tenant context are always injected.
|
|
23
|
+
- **`getHydrationTimeout()`** on `PromptBuilder` interface: Read the configured timeout for introspection and testing.
|
|
24
|
+
- **17 new tests**: Unit tests covering timeout, early completion, error-as-degradation, timer cleanup, non-Error throws, plus integration tests for per-prompt config, registry defaults, override precedence, backward compatibility, and interceptor composition after timeout.
|
|
25
|
+
|
|
26
|
+
### Design Influences
|
|
27
|
+
|
|
28
|
+
- Go's `context.WithDeadline` (structured cancellation)
|
|
29
|
+
- gRPC deadline propagation (strict, per-RPC)
|
|
30
|
+
- Resilience4j TimeLimiter (JVM circuit breaker pattern)
|
|
31
|
+
|
|
8
32
|
## [1.9.0] - 2026-02-23
|
|
9
33
|
|
|
10
34
|
### Intent Mutex (Anti-Race Condition)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HydrationSandbox — Structured Deadline for Prompt Server-Side Hydration
|
|
3
|
+
*
|
|
4
|
+
* When a user invokes `/morning_briefing`, the prompt handler performs
|
|
5
|
+
* server-side hydration: fetching Jira tickets, Stripe invoices, database
|
|
6
|
+
* queries. If any external source hangs (15s Jira timeout, API 500),
|
|
7
|
+
* the user stares at a frozen UI.
|
|
8
|
+
*
|
|
9
|
+
* This sandbox wraps the handler in a strict `Promise.race` deadline:
|
|
10
|
+
*
|
|
11
|
+
* ┌─────────────────────────────────────────────────┐
|
|
12
|
+
* │ Promise.race([ │
|
|
13
|
+
* │ handler(ctx, args), ← the real work │
|
|
14
|
+
* │ deadlinePromise(3s), ← the safety net │
|
|
15
|
+
* │ ]) │
|
|
16
|
+
* │ │
|
|
17
|
+
* │ Winner: │
|
|
18
|
+
* │ handler → return result (happy path) │
|
|
19
|
+
* │ deadline → return SYSTEM ALERT (graceful) │
|
|
20
|
+
* │ handler throws → return ERROR ALERT (catch) │
|
|
21
|
+
* └─────────────────────────────────────────────────┘
|
|
22
|
+
*
|
|
23
|
+
* Three guarantees:
|
|
24
|
+
* 1. The UI unblocks within `deadlineMs` — always.
|
|
25
|
+
* 2. Handler errors become graceful alerts, not -32603 crashes.
|
|
26
|
+
* 3. Timers are cleaned via `finally` — no resource leaks.
|
|
27
|
+
*
|
|
28
|
+
* Design influenced by:
|
|
29
|
+
* - Go's `context.WithDeadline` (structured cancellation)
|
|
30
|
+
* - gRPC deadline propagation (strict, per-call)
|
|
31
|
+
* - Resilience4j's TimeLimiter (JVM circuit breaker pattern)
|
|
32
|
+
*
|
|
33
|
+
* @module
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
import { type PromptResult } from './types.js';
|
|
37
|
+
/**
|
|
38
|
+
* Execute a prompt hydration function within a strict deadline.
|
|
39
|
+
*
|
|
40
|
+
* Uses `Promise.race` between the handler and a timeout promise.
|
|
41
|
+
* Three scenarios:
|
|
42
|
+
*
|
|
43
|
+
* 1. **Handler wins** (completes before deadline) → returns result
|
|
44
|
+
* 2. **Deadline wins** (handler too slow) → returns TIMEOUT alert
|
|
45
|
+
* 3. **Handler throws** (API error, crash) → returns ERROR alert
|
|
46
|
+
*
|
|
47
|
+
* In ALL cases, the caller receives a valid `PromptResult`.
|
|
48
|
+
* The UI never freezes. The user never sees `-32603`.
|
|
49
|
+
*
|
|
50
|
+
* @param fn - The prompt hydration function to execute
|
|
51
|
+
* @param deadlineMs - Maximum time in milliseconds (must be > 0)
|
|
52
|
+
* @returns Always returns a valid PromptResult
|
|
53
|
+
*/
|
|
54
|
+
export declare function runWithHydrationDeadline(fn: () => Promise<PromptResult>, deadlineMs: number): Promise<PromptResult>;
|
|
55
|
+
//# sourceMappingURL=HydrationSandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HydrationSandbox.d.ts","sourceRoot":"","sources":["../../src/prompt/HydrationSandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAmE/C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,wBAAwB,CAC1C,EAAE,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,EAC/B,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC,CAwBvB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HydrationSandbox — Structured Deadline for Prompt Server-Side Hydration
|
|
3
|
+
*
|
|
4
|
+
* When a user invokes `/morning_briefing`, the prompt handler performs
|
|
5
|
+
* server-side hydration: fetching Jira tickets, Stripe invoices, database
|
|
6
|
+
* queries. If any external source hangs (15s Jira timeout, API 500),
|
|
7
|
+
* the user stares at a frozen UI.
|
|
8
|
+
*
|
|
9
|
+
* This sandbox wraps the handler in a strict `Promise.race` deadline:
|
|
10
|
+
*
|
|
11
|
+
* ┌─────────────────────────────────────────────────┐
|
|
12
|
+
* │ Promise.race([ │
|
|
13
|
+
* │ handler(ctx, args), ← the real work │
|
|
14
|
+
* │ deadlinePromise(3s), ← the safety net │
|
|
15
|
+
* │ ]) │
|
|
16
|
+
* │ │
|
|
17
|
+
* │ Winner: │
|
|
18
|
+
* │ handler → return result (happy path) │
|
|
19
|
+
* │ deadline → return SYSTEM ALERT (graceful) │
|
|
20
|
+
* │ handler throws → return ERROR ALERT (catch) │
|
|
21
|
+
* └─────────────────────────────────────────────────┘
|
|
22
|
+
*
|
|
23
|
+
* Three guarantees:
|
|
24
|
+
* 1. The UI unblocks within `deadlineMs` — always.
|
|
25
|
+
* 2. Handler errors become graceful alerts, not -32603 crashes.
|
|
26
|
+
* 3. Timers are cleaned via `finally` — no resource leaks.
|
|
27
|
+
*
|
|
28
|
+
* Design influenced by:
|
|
29
|
+
* - Go's `context.WithDeadline` (structured cancellation)
|
|
30
|
+
* - gRPC deadline propagation (strict, per-call)
|
|
31
|
+
* - Resilience4j's TimeLimiter (JVM circuit breaker pattern)
|
|
32
|
+
*
|
|
33
|
+
* @module
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
import {} from './types.js';
|
|
37
|
+
// ── Alert Formatters ─────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* Build an XML-structured SYSTEM ALERT for the LLM.
|
|
40
|
+
*
|
|
41
|
+
* Uses XML semantic boundaries so the LLM can parse the
|
|
42
|
+
* alert deterministically — same pattern as our self-healing
|
|
43
|
+
* tool errors (`<tool_error>`, `<validation_error>`).
|
|
44
|
+
*/
|
|
45
|
+
function formatHydrationAlert(status, deadlineMs, errorMessage) {
|
|
46
|
+
const parts = ['<hydration_alert>'];
|
|
47
|
+
parts.push(` <status>${status}</status>`);
|
|
48
|
+
parts.push(` <deadline_ms>${deadlineMs}</deadline_ms>`);
|
|
49
|
+
if (status === 'TIMEOUT') {
|
|
50
|
+
parts.push(` <message>Prompt hydration did not complete within ${(deadlineMs / 1000).toFixed(1)}s. ` +
|
|
51
|
+
`External data sources (APIs, databases) did not respond within the deadline.</message>`);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
parts.push(` <message>Prompt hydration failed: ${errorMessage ?? 'Unknown error'}.</message>`);
|
|
55
|
+
}
|
|
56
|
+
parts.push(' <guidance>Proceed with the conversation using available context. ' +
|
|
57
|
+
'The user\'s request is still valid — answer with your general knowledge ' +
|
|
58
|
+
'and inform the user that live data could not be fetched at this time. ' +
|
|
59
|
+
'Do NOT retry the same prompt automatically.</guidance>');
|
|
60
|
+
parts.push('</hydration_alert>');
|
|
61
|
+
return parts.join('\n');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Wrap a hydration alert as a valid `PromptResult`.
|
|
65
|
+
*
|
|
66
|
+
* Returns a single `user` message with the XML alert.
|
|
67
|
+
* MCP `PromptMessage` only supports `user`|`assistant` roles.
|
|
68
|
+
*/
|
|
69
|
+
function alertAsPromptResult(status, deadlineMs, errorMessage) {
|
|
70
|
+
return {
|
|
71
|
+
messages: [{
|
|
72
|
+
role: 'user',
|
|
73
|
+
content: {
|
|
74
|
+
type: 'text',
|
|
75
|
+
text: formatHydrationAlert(status, deadlineMs, errorMessage),
|
|
76
|
+
},
|
|
77
|
+
}],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// ── Sandbox Execution ────────────────────────────────────
|
|
81
|
+
/**
|
|
82
|
+
* Execute a prompt hydration function within a strict deadline.
|
|
83
|
+
*
|
|
84
|
+
* Uses `Promise.race` between the handler and a timeout promise.
|
|
85
|
+
* Three scenarios:
|
|
86
|
+
*
|
|
87
|
+
* 1. **Handler wins** (completes before deadline) → returns result
|
|
88
|
+
* 2. **Deadline wins** (handler too slow) → returns TIMEOUT alert
|
|
89
|
+
* 3. **Handler throws** (API error, crash) → returns ERROR alert
|
|
90
|
+
*
|
|
91
|
+
* In ALL cases, the caller receives a valid `PromptResult`.
|
|
92
|
+
* The UI never freezes. The user never sees `-32603`.
|
|
93
|
+
*
|
|
94
|
+
* @param fn - The prompt hydration function to execute
|
|
95
|
+
* @param deadlineMs - Maximum time in milliseconds (must be > 0)
|
|
96
|
+
* @returns Always returns a valid PromptResult
|
|
97
|
+
*/
|
|
98
|
+
export async function runWithHydrationDeadline(fn, deadlineMs) {
|
|
99
|
+
let timer;
|
|
100
|
+
// Deadline promise: resolves with TIMEOUT alert after deadline
|
|
101
|
+
const deadlinePromise = new Promise((resolve) => {
|
|
102
|
+
timer = setTimeout(() => {
|
|
103
|
+
resolve(alertAsPromptResult('TIMEOUT', deadlineMs));
|
|
104
|
+
}, deadlineMs);
|
|
105
|
+
});
|
|
106
|
+
// Handler promise: wraps fn() to catch errors → ERROR alert
|
|
107
|
+
const handlerPromise = fn().catch((err) => {
|
|
108
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
109
|
+
return alertAsPromptResult('ERROR', deadlineMs, message);
|
|
110
|
+
});
|
|
111
|
+
try {
|
|
112
|
+
// First to finish wins. UI unblocks immediately.
|
|
113
|
+
return await Promise.race([handlerPromise, deadlinePromise]);
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
// Always clean up the timer — prevents resource leaks
|
|
117
|
+
// and keeps Node.js from staying alive unnecessarily.
|
|
118
|
+
if (timer !== undefined)
|
|
119
|
+
clearTimeout(timer);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=HydrationSandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HydrationSandbox.js","sourceRoot":"","sources":["../../src/prompt/HydrationSandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAqB,MAAM,YAAY,CAAC;AAE/C,4DAA4D;AAE5D;;;;;;GAMG;AACH,SAAS,oBAAoB,CACzB,MAA2B,EAC3B,UAAkB,EAClB,YAAqB;IAErB,MAAM,KAAK,GAAa,CAAC,mBAAmB,CAAC,CAAC;IAE9C,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,WAAW,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,kBAAkB,UAAU,gBAAgB,CAAC,CAAC;IAEzD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CACN,uDAAuD,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;YAC1F,wFAAwF,CAC3F,CAAC;IACN,CAAC;SAAM,CAAC;QACJ,KAAK,CAAC,IAAI,CACN,uCAAuC,YAAY,IAAI,eAAe,aAAa,CACtF,CAAC;IACN,CAAC;IAED,KAAK,CAAC,IAAI,CACN,qEAAqE;QACrE,0EAA0E;QAC1E,wEAAwE;QACxE,wDAAwD,CAC3D,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CACxB,MAA2B,EAC3B,UAAkB,EAClB,YAAqB;IAErB,OAAO;QACH,QAAQ,EAAE,CAAC;gBACP,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACL,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC;iBAC/D;aACJ,CAAC;KACL,CAAC;AACN,CAAC;AAED,4DAA4D;AAE5D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC1C,EAA+B,EAC/B,UAAkB;IAElB,IAAI,KAAgD,CAAC;IAErD,+DAA+D;IAC/D,MAAM,eAAe,GAAG,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,EAAE;QAC1D,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACpB,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACxD,CAAC,EAAE,UAAU,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,4DAA4D;IAC5D,MAAM,cAAc,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAgB,EAAE;QACpD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACD,iDAAiD;QACjD,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;IACjE,CAAC;YAAS,CAAC;QACP,sDAAsD;QACtD,sDAAsD;QACtD,IAAI,KAAK,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;AACL,CAAC"}
|
|
@@ -63,6 +63,26 @@ export declare class PromptRegistry<TContext = void> {
|
|
|
63
63
|
private readonly _interceptors;
|
|
64
64
|
private _notificationSink?;
|
|
65
65
|
private _notifyDebounceTimer;
|
|
66
|
+
private _defaultHydrationTimeout;
|
|
67
|
+
/**
|
|
68
|
+
* Set a global hydration timeout for ALL prompts in this registry.
|
|
69
|
+
*
|
|
70
|
+
* Individual prompts can override with their own `hydrationTimeout`.
|
|
71
|
+
* If neither is set, no timeout is applied (backward compatible).
|
|
72
|
+
*
|
|
73
|
+
* **Enterprise use case**: The platform team sets a 5s global deadline.
|
|
74
|
+
* Critical prompts like `morning_briefing` set their own 3s deadline.
|
|
75
|
+
* Simple prompts (no external I/O) inherit the 5s safety net.
|
|
76
|
+
*
|
|
77
|
+
* @param ms - Maximum hydration time in milliseconds (must be > 0)
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* const promptRegistry = new PromptRegistry<AppContext>();
|
|
82
|
+
* promptRegistry.setDefaultHydrationTimeout(5000); // 5s global safety net
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
setDefaultHydrationTimeout(ms: number): void;
|
|
66
86
|
/**
|
|
67
87
|
* Register a single prompt builder.
|
|
68
88
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptRegistry.d.ts","sourceRoot":"","sources":["../../src/prompt/PromptRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EACH,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EAG3B,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"PromptRegistry.d.ts","sourceRoot":"","sources":["../../src/prompt/PromptRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EACH,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EAG3B,MAAM,YAAY,CAAC;AAKpB,iDAAiD;AACjD,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC,CAAC;CACN;AAED,mDAAmD;AACnD,MAAM,WAAW,YAAY;IACzB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAID;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC;AAkBhD,qBAAa,cAAc,CAAC,QAAQ,GAAG,IAAI;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8C;IACxE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IACrE,OAAO,CAAC,iBAAiB,CAAC,CAAyB;IACnD,OAAO,CAAC,oBAAoB,CAA4C;IACxE,OAAO,CAAC,wBAAwB,CAAqB;IAErD;;;;;;;;;;;;;;;;;OAiBG;IACH,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI5C;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,IAAI;IAShD;;OAEG;IACH,WAAW,CAAC,GAAG,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI;IAMzD;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,cAAc,CAAC,WAAW,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI;IAIhE;;;;OAIG;IACH,aAAa,IAAI,YAAY,EAAE;IAQ/B;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,EAAE;IAkChD;;;;;;;;;;OAUG;IACG,QAAQ,CACV,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,YAAY,CAAC;IAoFxB;;;;;;;OAOG;IACH,mBAAmB,CAAC,IAAI,EAAE,sBAAsB,GAAG,IAAI;IAIvD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,aAAa,IAAI,IAAI;IAerB,2DAA2D;IAC3D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAE1B,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAEb,oCAAoC;IACpC,IAAI,IAAI,IAAI,MAAM,CAAgC;CACrD"}
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
* @module
|
|
35
35
|
*/
|
|
36
36
|
import {} from './types.js';
|
|
37
|
+
import { runWithHydrationDeadline } from './HydrationSandbox.js';
|
|
37
38
|
// ── MX Helpers ───────────────────────────────────────────
|
|
38
39
|
/**
|
|
39
40
|
* Format key-value data into an XML semantic block.
|
|
@@ -52,6 +53,28 @@ export class PromptRegistry {
|
|
|
52
53
|
_interceptors = [];
|
|
53
54
|
_notificationSink;
|
|
54
55
|
_notifyDebounceTimer;
|
|
56
|
+
_defaultHydrationTimeout;
|
|
57
|
+
/**
|
|
58
|
+
* Set a global hydration timeout for ALL prompts in this registry.
|
|
59
|
+
*
|
|
60
|
+
* Individual prompts can override with their own `hydrationTimeout`.
|
|
61
|
+
* If neither is set, no timeout is applied (backward compatible).
|
|
62
|
+
*
|
|
63
|
+
* **Enterprise use case**: The platform team sets a 5s global deadline.
|
|
64
|
+
* Critical prompts like `morning_briefing` set their own 3s deadline.
|
|
65
|
+
* Simple prompts (no external I/O) inherit the 5s safety net.
|
|
66
|
+
*
|
|
67
|
+
* @param ms - Maximum hydration time in milliseconds (must be > 0)
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const promptRegistry = new PromptRegistry<AppContext>();
|
|
72
|
+
* promptRegistry.setDefaultHydrationTimeout(5000); // 5s global safety net
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
setDefaultHydrationTimeout(ms) {
|
|
76
|
+
this._defaultHydrationTimeout = ms;
|
|
77
|
+
}
|
|
55
78
|
/**
|
|
56
79
|
* Register a single prompt builder.
|
|
57
80
|
*
|
|
@@ -174,7 +197,13 @@ export class PromptRegistry {
|
|
|
174
197
|
}],
|
|
175
198
|
};
|
|
176
199
|
}
|
|
177
|
-
|
|
200
|
+
// ── Hydration Deadline ───────────────────────────
|
|
201
|
+
// Per-prompt timeout overrides registry default.
|
|
202
|
+
// Zero overhead when no timeout configured.
|
|
203
|
+
const effectiveTimeout = builder.getHydrationTimeout() ?? this._defaultHydrationTimeout;
|
|
204
|
+
const result = effectiveTimeout && effectiveTimeout > 0
|
|
205
|
+
? await runWithHydrationDeadline(() => builder.execute(ctx, args), effectiveTimeout)
|
|
206
|
+
: await builder.execute(ctx, args);
|
|
178
207
|
// ── Prompt Interceptors ──────────────────────────
|
|
179
208
|
// Zero overhead when no interceptors registered.
|
|
180
209
|
if (this._interceptors.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromptRegistry.js","sourceRoot":"","sources":["../../src/prompt/PromptRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAMN,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"PromptRegistry.js","sourceRoot":"","sources":["../../src/prompt/PromptRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,7 @@ export declare class PromptBuilderImpl<TContext = void> implements PromptBuilder
|
|
|
26
26
|
private readonly _middlewares;
|
|
27
27
|
private readonly _schema;
|
|
28
28
|
private readonly _handler;
|
|
29
|
+
private readonly _hydrationTimeout;
|
|
29
30
|
constructor(name: string, config: {
|
|
30
31
|
title?: string;
|
|
31
32
|
description?: string;
|
|
@@ -37,11 +38,13 @@ export declare class PromptBuilderImpl<TContext = void> implements PromptBuilder
|
|
|
37
38
|
middleware?: MiddlewareFn<TContext>[];
|
|
38
39
|
schema?: ZodObject<ZodRawShape>;
|
|
39
40
|
handler: (ctx: TContext & LoopbackContext, args: Record<string, unknown>) => Promise<PromptResult>;
|
|
41
|
+
hydrationTimeout?: number;
|
|
40
42
|
});
|
|
41
43
|
getName(): string;
|
|
42
44
|
getDescription(): string | undefined;
|
|
43
45
|
getTags(): string[];
|
|
44
46
|
hasMiddleware(): boolean;
|
|
47
|
+
getHydrationTimeout(): number | undefined;
|
|
45
48
|
buildPromptDefinition(): {
|
|
46
49
|
name: string;
|
|
47
50
|
title?: string;
|
|
@@ -67,6 +70,7 @@ interface PromptConfigBase<TContext> {
|
|
|
67
70
|
};
|
|
68
71
|
tags?: string[];
|
|
69
72
|
middleware?: MiddlewareFn<TContext>[];
|
|
73
|
+
hydrationTimeout?: number;
|
|
70
74
|
}
|
|
71
75
|
/**
|
|
72
76
|
* Overload 1: Zod schema — full type inference via `z.infer<>`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definePrompt.d.ts","sourceRoot":"","sources":["../../src/prompt/definePrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AACvD,OAAO,EACH,KAAK,aAAa,EAClB,KAAK,YAAY,EAEjB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,eAAe,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAqCrD,qBAAa,iBAAiB,CAAC,QAAQ,GAAG,IAAI,CAAE,YAAW,aAAa,CAAC,QAAQ,CAAC;IAC9E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgD;IACvE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoC;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4F;
|
|
1
|
+
{"version":3,"file":"definePrompt.d.ts","sourceRoot":"","sources":["../../src/prompt/definePrompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,7 @@ export class PromptBuilderImpl {
|
|
|
54
54
|
_middlewares;
|
|
55
55
|
_schema;
|
|
56
56
|
_handler;
|
|
57
|
+
_hydrationTimeout;
|
|
57
58
|
constructor(name, config) {
|
|
58
59
|
this._name = name;
|
|
59
60
|
this._title = config.title;
|
|
@@ -63,6 +64,7 @@ export class PromptBuilderImpl {
|
|
|
63
64
|
this._middlewares = config.middleware ?? [];
|
|
64
65
|
this._schema = config.schema;
|
|
65
66
|
this._handler = config.handler;
|
|
67
|
+
this._hydrationTimeout = config.hydrationTimeout;
|
|
66
68
|
}
|
|
67
69
|
getName() {
|
|
68
70
|
return this._name;
|
|
@@ -76,6 +78,9 @@ export class PromptBuilderImpl {
|
|
|
76
78
|
hasMiddleware() {
|
|
77
79
|
return this._middlewares.length > 0;
|
|
78
80
|
}
|
|
81
|
+
getHydrationTimeout() {
|
|
82
|
+
return this._hydrationTimeout;
|
|
83
|
+
}
|
|
79
84
|
buildPromptDefinition() {
|
|
80
85
|
const def = { name: this._name };
|
|
81
86
|
if (this._title) {
|
|
@@ -118,6 +123,7 @@ export function definePrompt(name, config) {
|
|
|
118
123
|
middleware: config.middleware,
|
|
119
124
|
schema,
|
|
120
125
|
handler: config.handler,
|
|
126
|
+
hydrationTimeout: config.hydrationTimeout,
|
|
121
127
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
122
128
|
});
|
|
123
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definePrompt.js","sourceRoot":"","sources":["../../src/prompt/definePrompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAoC,MAAM,KAAK,CAAC;AACvD,OAAO,EAON,MAAM,YAAY,CAAC;AACpB,OAAO,EAAqB,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAkB,MAAM,qCAAqC,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE5D;;;;;GAKG;AACH,SAAS,mBAAmB,CACxB,MAA8B;IAE9B,MAAM,IAAI,GAAsE,EAAE,CAAC;IAEnF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,8DAA8D;QAC9D,MAAM,GAAG,GAAI,KAAa,CAAC,IAAI,CAAC;QAChC,MAAM,UAAU,GAAG,GAAG,EAAE,QAAQ,KAAK,aAAa,IAAI,GAAG,EAAE,QAAQ,KAAK,YAAY,CAAC;QACrF,MAAM,WAAW,GAAI,KAAkC,CAAC,WAAW,IAAI,GAAG,EAAE,WAAW,CAAC;QAExF,MAAM,OAAO,GAA+D;YACxE,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,CAAC,UAAU;SACxB,CAAC;QACF,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,4DAA4D;AAE5D,MAAM,OAAO,iBAAiB;IACT,KAAK,CAAS;IACd,MAAM,CAAqB;IAC3B,YAAY,CAAqB;IACjC,MAAM,CAAgD;IACtD,KAAK,CAAW;IAChB,YAAY,CAAoC;IAChD,OAAO,CAAqC;IAC5C,QAAQ,CAA4F;
|
|
1
|
+
{"version":3,"file":"definePrompt.js","sourceRoot":"","sources":["../../src/prompt/definePrompt.ts"],"names":[],"mappings":"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"}
|
package/dist/prompt/types.d.ts
CHANGED
|
@@ -347,6 +347,16 @@ export interface PromptBuilder<TContext = void> {
|
|
|
347
347
|
* @returns The hydrated prompt result with messages
|
|
348
348
|
*/
|
|
349
349
|
execute(ctx: TContext, args: Record<string, string>): Promise<PromptResult>;
|
|
350
|
+
/**
|
|
351
|
+
* Get the configured hydration timeout (in milliseconds).
|
|
352
|
+
*
|
|
353
|
+
* When set, the handler is wrapped in a strict deadline.
|
|
354
|
+
* If the handler doesn't complete within this time, a
|
|
355
|
+
* SYSTEM ALERT is returned instead of freezing the UI.
|
|
356
|
+
*
|
|
357
|
+
* @returns Timeout in ms, or `undefined` if no deadline is configured
|
|
358
|
+
*/
|
|
359
|
+
getHydrationTimeout(): number | undefined;
|
|
350
360
|
}
|
|
351
361
|
/**
|
|
352
362
|
* Configuration for `definePrompt()`.
|
|
@@ -379,6 +389,27 @@ export interface PromptConfig<TContext, TArgs extends Record<string, unknown> =
|
|
|
379
389
|
tags?: string[];
|
|
380
390
|
/** Middleware chain (same signature as tool middleware) */
|
|
381
391
|
middleware?: MiddlewareFn<TContext>[];
|
|
392
|
+
/**
|
|
393
|
+
* Maximum hydration time in milliseconds.
|
|
394
|
+
*
|
|
395
|
+
* When set, the handler is wrapped in a strict deadline. If external
|
|
396
|
+
* data sources (APIs, databases) don't respond within this time,
|
|
397
|
+
* the framework cuts the Promise and returns a graceful SYSTEM ALERT.
|
|
398
|
+
* The UI unblocks immediately — the user never sees a frozen screen.
|
|
399
|
+
*
|
|
400
|
+
* @example
|
|
401
|
+
* ```typescript
|
|
402
|
+
* definePrompt('morning_briefing', {
|
|
403
|
+
* hydrationTimeout: 3000, // 3 seconds strict
|
|
404
|
+
* handler: async (ctx, args) => {
|
|
405
|
+
* // If Jira takes 15s, the framework cuts at 3s
|
|
406
|
+
* const tickets = await ctx.invokeTool('jira.get_assigned');
|
|
407
|
+
* return { messages: [...] };
|
|
408
|
+
* },
|
|
409
|
+
* });
|
|
410
|
+
* ```
|
|
411
|
+
*/
|
|
412
|
+
hydrationTimeout?: number;
|
|
382
413
|
/**
|
|
383
414
|
* The hydration handler.
|
|
384
415
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prompt/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prompt/types.ts"],"names":[],"mappings":"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"}
|
package/llms.txt
CHANGED
|
@@ -411,6 +411,29 @@ const SummarizePrompt = definePrompt<AppContext>('summarize', {
|
|
|
411
411
|
});
|
|
412
412
|
```
|
|
413
413
|
|
|
414
|
+
## Hydration Timeout Sandbox
|
|
415
|
+
|
|
416
|
+
Prompt handlers fetch data from external sources (APIs, databases). If any source hangs, the UI freezes. The Hydration Timeout Sandbox wraps the handler in a strict `Promise.race` deadline. Three guarantees: (1) handler completes → normal result, (2) handler exceeds deadline → `<hydration_alert><status>TIMEOUT</status>` alert, (3) handler throws → `<hydration_alert><status>ERROR</status>` alert. The UI ALWAYS unblocks.
|
|
417
|
+
|
|
418
|
+
```typescript
|
|
419
|
+
// Per-prompt deadline
|
|
420
|
+
const Briefing = definePrompt<AppContext>('morning_briefing', {
|
|
421
|
+
hydrationTimeout: 3000, // 3 seconds strict
|
|
422
|
+
handler: async (ctx, args) => {
|
|
423
|
+
// If Jira takes 15s, framework cuts at 3s → returns SYSTEM ALERT
|
|
424
|
+
const tickets = await ctx.invokeTool('jira.get_assigned');
|
|
425
|
+
return { messages: [PromptMessage.user(tickets.text)] };
|
|
426
|
+
},
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
// Registry-level default (global safety net)
|
|
430
|
+
const prompts = new PromptRegistry<AppContext>();
|
|
431
|
+
prompts.setDefaultHydrationTimeout(5000); // 5s for all prompts
|
|
432
|
+
prompts.register(Briefing); // overrides with 3s
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
Zero overhead when no timeout configured. Timer cleanup via `finally` — no resource leaks. Interceptors still run after timeout.
|
|
436
|
+
|
|
414
437
|
## MVA-Driven Prompts — fromView()
|
|
415
438
|
|
|
416
439
|
Bridge your Presenter layer into Prompts with zero duplication. `PromptMessage.fromView()` decomposes a `ResponseBuilder` into XML-tagged prompt messages (`<domain_rules>`, `<dataset>`, `<visual_context>`, `<system_guidance>`) optimized for frontier LLMs. Domain rules, UI blocks, and action suggestions from the Presenter are automatically extracted — single source of truth.
|
|
@@ -502,7 +525,7 @@ const AuditPrompt = definePrompt<AppContext>('audit', {
|
|
|
502
525
|
- `PromptMessage.audio(role, data, mimeType)` → PromptMessagePayload
|
|
503
526
|
- `PromptMessage.resource(role, uri, options?)` → PromptMessagePayload
|
|
504
527
|
- `PromptMessage.fromView(builder)` → PromptMessagePayload[] — decomposes ResponseBuilder into XML-tagged messages (<domain_rules>, <dataset>, <visual_context>, <system_guidance>)
|
|
505
|
-
- `PromptRegistry<TContext>` — .register(), .registerAll(), .getAllPrompts(), .getPrompts(filter), .routeGet(), .notifyChanged(), .has(), .clear(), .size
|
|
528
|
+
- `PromptRegistry<TContext>` — .register(), .registerAll(), .getAllPrompts(), .getPrompts(filter), .routeGet(), .setDefaultHydrationTimeout(), .notifyChanged(), .has(), .clear(), .size
|
|
506
529
|
|
|
507
530
|
### Result Monad
|
|
508
531
|
- `succeed<T>(value)` → Success<T>
|
|
@@ -549,7 +572,7 @@ const AuditPrompt = definePrompt<AppContext>('audit', {
|
|
|
549
572
|
- `PromptMessagePayload` — { role: 'user' | 'assistant', content: PromptContentBlock }
|
|
550
573
|
- `PromptContentBlock` — PromptTextContent | PromptImageContent | PromptAudioContent | PromptResourceContent
|
|
551
574
|
- `PromptBuilder<TContext>` — DIP interface: .name, .getDefinition(), .handleGet(), .tags
|
|
552
|
-
- `PromptConfig<TContext>` — { title?, description?, args?, tags?, middleware?, handler }
|
|
575
|
+
- `PromptConfig<TContext>` — { title?, description?, args?, tags?, middleware?, hydrationTimeout?, handler }
|
|
553
576
|
|
|
554
577
|
### Domain Models
|
|
555
578
|
- `BaseModel` — abstract base (name, title, description, meta, icons)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vinkius-core/mcp-fusion",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"description": "MVA (Model-View-Agent) framework for the Model Context Protocol. Structured perception packages with Presenters, cognitive guardrails, self-healing errors, action consolidation, and tRPC-style type safety — so AI agents perceive and act on your data deterministically.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|