@vinkius-core/mcp-fusion 2.14.0 → 2.14.2
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.js +35 -35
- package/dist/cli/templates/config.js +26 -26
- package/dist/cli/templates/core.d.ts.map +1 -1
- package/dist/cli/templates/core.js +108 -111
- package/dist/cli/templates/core.js.map +1 -1
- package/dist/cli/templates/middleware.js +25 -25
- package/dist/cli/templates/readme.js +142 -142
- package/dist/cli/templates/testing.js +83 -83
- package/dist/cli/templates/tools.js +46 -46
- package/dist/cli/templates/vectors/database.js +69 -69
- package/dist/cli/templates/vectors/oauth.js +63 -63
- package/dist/cli/templates/vectors/openapi.js +97 -97
- package/dist/core/builder/ActionGroupBuilder.d.ts +6 -2
- package/dist/core/builder/ActionGroupBuilder.d.ts.map +1 -1
- package/dist/core/builder/ActionGroupBuilder.js +6 -2
- package/dist/core/builder/ActionGroupBuilder.js.map +1 -1
- package/dist/core/builder/FluentRouter.d.ts +6 -2
- package/dist/core/builder/FluentRouter.d.ts.map +1 -1
- package/dist/core/builder/FluentRouter.js +6 -2
- package/dist/core/builder/FluentRouter.js.map +1 -1
- package/dist/core/builder/FluentToolBuilder.d.ts +45 -9
- package/dist/core/builder/FluentToolBuilder.d.ts.map +1 -1
- package/dist/core/builder/FluentToolBuilder.js +54 -27
- package/dist/core/builder/FluentToolBuilder.js.map +1 -1
- package/dist/core/builder/GroupedToolBuilder.d.ts +32 -2
- package/dist/core/builder/GroupedToolBuilder.d.ts.map +1 -1
- package/dist/core/builder/GroupedToolBuilder.js +47 -2
- package/dist/core/builder/GroupedToolBuilder.js.map +1 -1
- package/dist/core/builder/defineTool.d.ts +5 -4
- package/dist/core/builder/defineTool.d.ts.map +1 -1
- package/dist/core/builder/defineTool.js +3 -2
- package/dist/core/builder/defineTool.js.map +1 -1
- package/dist/core/initFusion.d.ts +26 -1
- package/dist/core/initFusion.d.ts.map +1 -1
- package/dist/core/initFusion.js +5 -0
- package/dist/core/initFusion.js.map +1 -1
- package/dist/fsm/StateMachineGate.d.ts +264 -0
- package/dist/fsm/StateMachineGate.d.ts.map +1 -0
- package/dist/fsm/StateMachineGate.js +343 -0
- package/dist/fsm/StateMachineGate.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/introspection/SemanticProbe.js +49 -49
- package/dist/observability/TelemetryBus.d.ts +82 -0
- package/dist/observability/TelemetryBus.d.ts.map +1 -0
- package/dist/observability/TelemetryBus.js +335 -0
- package/dist/observability/TelemetryBus.js.map +1 -0
- package/dist/observability/TelemetryEvent.d.ts +171 -0
- package/dist/observability/TelemetryEvent.d.ts.map +1 -0
- package/dist/observability/TelemetryEvent.js +2 -0
- package/dist/observability/TelemetryEvent.js.map +1 -0
- package/dist/presenter/definePresenter.d.ts +2 -2
- package/dist/presenter/definePresenter.d.ts.map +1 -1
- package/dist/prompt/FluentPromptBuilder.d.ts.map +1 -1
- package/dist/server/ServerAttachment.d.ts +63 -0
- package/dist/server/ServerAttachment.d.ts.map +1 -1
- package/dist/server/ServerAttachment.js +149 -6
- package/dist/server/ServerAttachment.js.map +1 -1
- package/package.json +10 -3
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TelemetryBus — Shadow Socket IPC Server
|
|
3
|
+
*
|
|
4
|
+
* Fire-and-forget out-of-band telemetry transport. Creates a Named Pipe
|
|
5
|
+
* (Windows) or Unix Domain Socket (POSIX) that streams NDJSON events
|
|
6
|
+
* to connected `fusion top` / `davinci` TUI clients.
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* ┌─────────────────────────────────────────────────────┐
|
|
10
|
+
* │ MCP Server Process (owns the IPC server) │
|
|
11
|
+
* │ │
|
|
12
|
+
* │ createTelemetryBus() │
|
|
13
|
+
* │ │ │
|
|
14
|
+
* │ ▼ │
|
|
15
|
+
* │ net.createServer() → Named Pipe / Unix Socket │
|
|
16
|
+
* │ │ │
|
|
17
|
+
* │ ▼ │
|
|
18
|
+
* │ emit(event) → NDJSON → broadcast to all clients │
|
|
19
|
+
* │ │ │
|
|
20
|
+
* │ └─ If 0 clients → silent no-op (zero overhead) │
|
|
21
|
+
* └─────────────────────────────────────────────────────┘
|
|
22
|
+
*
|
|
23
|
+
* Security mitigations (Staff Engineer Gotchas):
|
|
24
|
+
* 1. chmod 0o600 on Unix sockets (prevents PII sniffing)
|
|
25
|
+
* 2. Ghost socket recovery (stale file → probe → unlink)
|
|
26
|
+
* 3. Backpressure: slow clients disconnected at 64KB buffer
|
|
27
|
+
* 4. Clean shutdown on process exit / SIGTERM
|
|
28
|
+
*
|
|
29
|
+
* @module
|
|
30
|
+
*/
|
|
31
|
+
import { createServer, connect } from 'node:net';
|
|
32
|
+
import { existsSync, unlinkSync, chmodSync, statSync } from 'node:fs';
|
|
33
|
+
import { platform } from 'node:os';
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Constants
|
|
36
|
+
// ============================================================================
|
|
37
|
+
/** Maximum write buffer per client before forced disconnect */
|
|
38
|
+
const MAX_CLIENT_BUFFER_BYTES = 65_536; // 64KB
|
|
39
|
+
/** Heartbeat interval in milliseconds */
|
|
40
|
+
const HEARTBEAT_INTERVAL_MS = 5_000;
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// Path Convention
|
|
43
|
+
// ============================================================================
|
|
44
|
+
/**
|
|
45
|
+
* Compute the IPC path for a given process ID.
|
|
46
|
+
*
|
|
47
|
+
* - Windows: `\\.\pipe\mcp-fusion-{pid}` (Named Pipe, auto-cleaned by OS)
|
|
48
|
+
* - POSIX: `/tmp/mcp-fusion-{pid}.sock` (Unix Domain Socket)
|
|
49
|
+
*
|
|
50
|
+
* @param pid - Process ID (defaults to `process.pid`)
|
|
51
|
+
* @returns The IPC path string
|
|
52
|
+
*/
|
|
53
|
+
export function getTelemetryPath(pid) {
|
|
54
|
+
const id = pid ?? process.pid;
|
|
55
|
+
if (platform() === 'win32') {
|
|
56
|
+
return `\\\\.\\pipe\\mcp-fusion-${id}`;
|
|
57
|
+
}
|
|
58
|
+
return `/tmp/mcp-fusion-${id}.sock`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Discover active telemetry sockets by scanning for `mcp-fusion-*.sock`.
|
|
62
|
+
* Returns an array of `{ pid, path }` for each discovered socket.
|
|
63
|
+
*
|
|
64
|
+
* On Windows, Named Pipes are not file-system entities, so we probe
|
|
65
|
+
* a list of candidate PIDs from the user.
|
|
66
|
+
*
|
|
67
|
+
* @param candidatePids - Optional list of PIDs to probe (Windows-only)
|
|
68
|
+
* @returns Array of discovered sockets with their PIDs
|
|
69
|
+
*/
|
|
70
|
+
export function discoverSockets(candidatePids) {
|
|
71
|
+
if (platform() === 'win32') {
|
|
72
|
+
// On Windows, Named Pipes don't live in the filesystem.
|
|
73
|
+
// We probe the candidate PIDs by attempting a connection.
|
|
74
|
+
const pids = candidatePids ?? [];
|
|
75
|
+
return pids
|
|
76
|
+
.map((pid) => ({ pid, path: getTelemetryPath(pid) }));
|
|
77
|
+
}
|
|
78
|
+
// On POSIX: scan /tmp for mcp-fusion-*.sock files
|
|
79
|
+
const results = [];
|
|
80
|
+
try {
|
|
81
|
+
const { readdirSync } = require('node:fs');
|
|
82
|
+
const files = readdirSync('/tmp');
|
|
83
|
+
for (const file of files) {
|
|
84
|
+
const match = file.match(/^mcp-fusion-(\d+)\.sock$/);
|
|
85
|
+
if (match) {
|
|
86
|
+
const pid = parseInt(match[1], 10);
|
|
87
|
+
const path = `/tmp/${file}`;
|
|
88
|
+
results.push({ pid, path });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// /tmp scan failed — return empty
|
|
94
|
+
}
|
|
95
|
+
return results;
|
|
96
|
+
}
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// Ghost Socket Recovery (Gotcha #2)
|
|
99
|
+
// ============================================================================
|
|
100
|
+
/**
|
|
101
|
+
* Check if a socket file is a "ghost" (stale, left by a crashed process).
|
|
102
|
+
*
|
|
103
|
+
* Attempts a dummy connection. If `ECONNREFUSED`, the socket is stale
|
|
104
|
+
* and safe to unlink. If the connection succeeds, it's alive — don't touch it.
|
|
105
|
+
*
|
|
106
|
+
* @param socketPath - Path to the Unix socket file
|
|
107
|
+
* @returns Promise that resolves to `true` if the ghost was cleaned up
|
|
108
|
+
* @internal
|
|
109
|
+
*/
|
|
110
|
+
function cleanGhostSocket(socketPath) {
|
|
111
|
+
return new Promise((resolve) => {
|
|
112
|
+
// On Windows, Named Pipes are auto-cleaned — skip
|
|
113
|
+
if (platform() === 'win32') {
|
|
114
|
+
resolve(false);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (!existsSync(socketPath)) {
|
|
118
|
+
resolve(false);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// Verify it's actually a socket file, not a regular file
|
|
122
|
+
try {
|
|
123
|
+
const stats = statSync(socketPath);
|
|
124
|
+
if (!stats.isSocket()) {
|
|
125
|
+
// Not a socket — don't touch it
|
|
126
|
+
resolve(false);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
resolve(false);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
// Probe with a dummy client connection
|
|
135
|
+
const probe = connect(socketPath);
|
|
136
|
+
const timeout = setTimeout(() => {
|
|
137
|
+
// Connection hanging — assume ghost, clean up
|
|
138
|
+
probe.destroy();
|
|
139
|
+
try {
|
|
140
|
+
unlinkSync(socketPath);
|
|
141
|
+
}
|
|
142
|
+
catch { /* ignore */ }
|
|
143
|
+
resolve(true);
|
|
144
|
+
}, 500);
|
|
145
|
+
probe.on('connect', () => {
|
|
146
|
+
// Socket is alive — another server is using it!
|
|
147
|
+
clearTimeout(timeout);
|
|
148
|
+
probe.destroy();
|
|
149
|
+
resolve(false);
|
|
150
|
+
});
|
|
151
|
+
probe.on('error', (err) => {
|
|
152
|
+
clearTimeout(timeout);
|
|
153
|
+
probe.destroy();
|
|
154
|
+
if (err.code === 'ECONNREFUSED') {
|
|
155
|
+
// Ghost socket — safe to remove
|
|
156
|
+
try {
|
|
157
|
+
unlinkSync(socketPath);
|
|
158
|
+
}
|
|
159
|
+
catch { /* ignore */ }
|
|
160
|
+
resolve(true);
|
|
161
|
+
}
|
|
162
|
+
resolve(false);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Create an out-of-band telemetry bus for MCP Fusion.
|
|
168
|
+
*
|
|
169
|
+
* The returned `emit` function is the {@link TelemetrySink} to pass
|
|
170
|
+
* to `AttachOptions.telemetry`. It broadcasts events as NDJSON
|
|
171
|
+
* to all connected TUI clients via IPC.
|
|
172
|
+
*
|
|
173
|
+
* When no clients are connected, `emit()` is a no-op — zero overhead.
|
|
174
|
+
*
|
|
175
|
+
* @param config - Optional configuration
|
|
176
|
+
* @returns A promise that resolves to the running bus instance
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* import { createTelemetryBus } from '@vinkius-core/mcp-fusion/observability';
|
|
181
|
+
*
|
|
182
|
+
* const bus = await createTelemetryBus();
|
|
183
|
+
*
|
|
184
|
+
* // Pass to server attachment
|
|
185
|
+
* registry.attachToServer(server, {
|
|
186
|
+
* contextFactory: createContext,
|
|
187
|
+
* telemetry: bus.emit,
|
|
188
|
+
* });
|
|
189
|
+
*
|
|
190
|
+
* // On shutdown
|
|
191
|
+
* await bus.close();
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
export async function createTelemetryBus(config) {
|
|
195
|
+
const socketPath = config?.path ?? getTelemetryPath();
|
|
196
|
+
const clients = new Set();
|
|
197
|
+
// ── Gotcha #2: Ghost Socket Recovery ──────────────────
|
|
198
|
+
await cleanGhostSocket(socketPath);
|
|
199
|
+
// ── Create IPC Server ─────────────────────────────────
|
|
200
|
+
const server = createServer((client) => {
|
|
201
|
+
clients.add(client);
|
|
202
|
+
// Send initial topology snapshot if available
|
|
203
|
+
if (config?.onConnect) {
|
|
204
|
+
const topology = config.onConnect();
|
|
205
|
+
if (topology) {
|
|
206
|
+
try {
|
|
207
|
+
client.write(JSON.stringify(topology) + '\n');
|
|
208
|
+
}
|
|
209
|
+
catch { /* swallow */ }
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
client.on('error', () => {
|
|
213
|
+
clients.delete(client);
|
|
214
|
+
});
|
|
215
|
+
client.on('close', () => {
|
|
216
|
+
clients.delete(client);
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
// ── Start Listening ───────────────────────────────────
|
|
220
|
+
await new Promise((resolve, reject) => {
|
|
221
|
+
server.on('error', (err) => {
|
|
222
|
+
if (err.code === 'EADDRINUSE') {
|
|
223
|
+
// Final fallback: force unlink and retry
|
|
224
|
+
try {
|
|
225
|
+
unlinkSync(socketPath);
|
|
226
|
+
}
|
|
227
|
+
catch { /* ignore */ }
|
|
228
|
+
server.listen(socketPath, () => resolve());
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
reject(err);
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
server.listen(socketPath, () => resolve());
|
|
235
|
+
});
|
|
236
|
+
// ── Gotcha #1: IPC Security (chmod 0o600) ─────────────
|
|
237
|
+
// Restrict socket to owner-only on POSIX to prevent PII sniffing
|
|
238
|
+
if (platform() !== 'win32') {
|
|
239
|
+
try {
|
|
240
|
+
chmodSync(socketPath, 0o600);
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// Non-fatal — log warning via stderr (never stdout!)
|
|
244
|
+
process.stderr.write('[mcp-fusion] Warning: Could not restrict socket permissions.\n');
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// ── Heartbeat Timer ───────────────────────────────────
|
|
248
|
+
const heartbeatTimer = setInterval(() => {
|
|
249
|
+
if (clients.size === 0)
|
|
250
|
+
return;
|
|
251
|
+
const mem = process.memoryUsage();
|
|
252
|
+
emit({
|
|
253
|
+
type: 'heartbeat',
|
|
254
|
+
heapUsedBytes: mem.heapUsed,
|
|
255
|
+
heapTotalBytes: mem.heapTotal,
|
|
256
|
+
rssBytes: mem.rss,
|
|
257
|
+
uptimeSeconds: Math.floor(process.uptime()),
|
|
258
|
+
timestamp: Date.now(),
|
|
259
|
+
});
|
|
260
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
261
|
+
// Don't let the heartbeat timer keep the process alive
|
|
262
|
+
heartbeatTimer.unref();
|
|
263
|
+
// ── Emit Function (Fire-and-Forget) ───────────────────
|
|
264
|
+
function emit(event) {
|
|
265
|
+
// Zero overhead when no clients
|
|
266
|
+
if (clients.size === 0)
|
|
267
|
+
return;
|
|
268
|
+
let line;
|
|
269
|
+
try {
|
|
270
|
+
line = JSON.stringify(event) + '\n';
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return; // Non-serializable event — silently drop
|
|
274
|
+
}
|
|
275
|
+
for (const client of clients) {
|
|
276
|
+
// ── Gotcha #3 (Backpressure) ──────────────────
|
|
277
|
+
// If the client's write buffer exceeds the limit,
|
|
278
|
+
// disconnect it to protect the server from memory bloat
|
|
279
|
+
if (client.writableLength > MAX_CLIENT_BUFFER_BYTES) {
|
|
280
|
+
client.destroy();
|
|
281
|
+
clients.delete(client);
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
try {
|
|
285
|
+
client.write(line);
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
// Write failed — client is dead, remove it
|
|
289
|
+
client.destroy();
|
|
290
|
+
clients.delete(client);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// ── Clean Shutdown ────────────────────────────────────
|
|
295
|
+
function cleanup() {
|
|
296
|
+
clearInterval(heartbeatTimer);
|
|
297
|
+
for (const client of clients) {
|
|
298
|
+
try {
|
|
299
|
+
client.destroy();
|
|
300
|
+
}
|
|
301
|
+
catch { /* ignore */ }
|
|
302
|
+
}
|
|
303
|
+
clients.clear();
|
|
304
|
+
try {
|
|
305
|
+
server.close();
|
|
306
|
+
}
|
|
307
|
+
catch { /* ignore */ }
|
|
308
|
+
// Remove socket file on POSIX
|
|
309
|
+
if (platform() !== 'win32') {
|
|
310
|
+
try {
|
|
311
|
+
unlinkSync(socketPath);
|
|
312
|
+
}
|
|
313
|
+
catch { /* ignore */ }
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Register cleanup on process exit signals
|
|
317
|
+
const exitHandler = () => { cleanup(); };
|
|
318
|
+
process.on('exit', exitHandler);
|
|
319
|
+
process.on('SIGINT', exitHandler);
|
|
320
|
+
process.on('SIGTERM', exitHandler);
|
|
321
|
+
// ── Close Method ──────────────────────────────────────
|
|
322
|
+
async function close() {
|
|
323
|
+
process.removeListener('exit', exitHandler);
|
|
324
|
+
process.removeListener('SIGINT', exitHandler);
|
|
325
|
+
process.removeListener('SIGTERM', exitHandler);
|
|
326
|
+
cleanup();
|
|
327
|
+
}
|
|
328
|
+
return {
|
|
329
|
+
emit,
|
|
330
|
+
path: socketPath,
|
|
331
|
+
clientCount: () => clients.size,
|
|
332
|
+
close,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=TelemetryBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryBus.js","sourceRoot":"","sources":["../../src/observability/TelemetryBus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TelemetryEvent — Enriched Out-of-Band Telemetry Types
|
|
3
|
+
*
|
|
4
|
+
* Extends the core {@link DebugEvent} discriminated union with
|
|
5
|
+
* domain-specific telemetry events for the Shadow Socket transport.
|
|
6
|
+
*
|
|
7
|
+
* These events are emitted over an IPC channel (Named Pipe on Windows,
|
|
8
|
+
* Unix Domain Socket on POSIX) and consumed by `fusion top`.
|
|
9
|
+
* They NEVER touch stdio — the MCP JSON-RPC channel is 100% safe.
|
|
10
|
+
*
|
|
11
|
+
* Design rules:
|
|
12
|
+
* - All events are JSON-serializable (no Date objects, no functions)
|
|
13
|
+
* - All events carry a `timestamp` (epoch ms) for chronological ordering
|
|
14
|
+
* - The `type` field is the discriminator for exhaustive `switch` handling
|
|
15
|
+
* - Events are fire-and-forget — dropping them must never affect the server
|
|
16
|
+
*
|
|
17
|
+
* @module
|
|
18
|
+
*/
|
|
19
|
+
import type { DebugEvent } from './DebugObserver.js';
|
|
20
|
+
/**
|
|
21
|
+
* Emitted after the DLP RedactEngine masks PII fields.
|
|
22
|
+
* Allows the TUI to display live redaction activity and field paths.
|
|
23
|
+
*/
|
|
24
|
+
export interface DlpRedactEvent {
|
|
25
|
+
readonly type: 'dlp.redact';
|
|
26
|
+
readonly tool: string;
|
|
27
|
+
readonly action: string;
|
|
28
|
+
/** Number of fields that were masked */
|
|
29
|
+
readonly fieldsRedacted: number;
|
|
30
|
+
/** The configured redaction paths that matched */
|
|
31
|
+
readonly paths: readonly string[];
|
|
32
|
+
readonly timestamp: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Emitted after the Presenter's Late Guillotine slices data.
|
|
36
|
+
* Shows the token-saving ratio — the visual ROI proof.
|
|
37
|
+
*/
|
|
38
|
+
export interface PresenterSliceEvent {
|
|
39
|
+
readonly type: 'presenter.slice';
|
|
40
|
+
readonly tool: string;
|
|
41
|
+
readonly action: string;
|
|
42
|
+
/** Size of the raw data from the handler (bytes) */
|
|
43
|
+
readonly rawBytes: number;
|
|
44
|
+
/** Size after Presenter filtering for the LLM wire (bytes) */
|
|
45
|
+
readonly wireBytes: number;
|
|
46
|
+
/** Number of raw rows/items before filtering */
|
|
47
|
+
readonly rowsRaw: number;
|
|
48
|
+
/** Number of rows/items after filtering */
|
|
49
|
+
readonly rowsWire: number;
|
|
50
|
+
readonly timestamp: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Emitted after the Presenter injects cognitive rules.
|
|
54
|
+
* Allows the TUI to display the JIT domain rules sent to the LLM.
|
|
55
|
+
*/
|
|
56
|
+
export interface PresenterRulesEvent {
|
|
57
|
+
readonly type: 'presenter.rules';
|
|
58
|
+
readonly tool: string;
|
|
59
|
+
readonly action: string;
|
|
60
|
+
/** The system rules injected into the response */
|
|
61
|
+
readonly rules: readonly string[];
|
|
62
|
+
readonly timestamp: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Emitted after a SandboxEngine execution completes.
|
|
66
|
+
* Shows V8 isolate metrics for the computation delegation.
|
|
67
|
+
*/
|
|
68
|
+
export interface SandboxExecEvent {
|
|
69
|
+
readonly type: 'sandbox.exec';
|
|
70
|
+
/** Execution time in milliseconds */
|
|
71
|
+
readonly executionMs: number;
|
|
72
|
+
/** Whether the execution succeeded */
|
|
73
|
+
readonly ok: boolean;
|
|
74
|
+
/** Error code if execution failed */
|
|
75
|
+
readonly errorCode?: string;
|
|
76
|
+
readonly timestamp: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Emitted after an FSM state transition.
|
|
80
|
+
* Shows the temporal anti-hallucination gate in action.
|
|
81
|
+
*/
|
|
82
|
+
export interface FsmTransitionEvent {
|
|
83
|
+
readonly type: 'fsm.transition';
|
|
84
|
+
readonly previousState: string;
|
|
85
|
+
readonly currentState: string;
|
|
86
|
+
/** The event that triggered the transition */
|
|
87
|
+
readonly event: string;
|
|
88
|
+
/** Number of tools visible in the new state */
|
|
89
|
+
readonly toolsVisible: number;
|
|
90
|
+
readonly timestamp: number;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Emitted once on TUI client connection.
|
|
94
|
+
* Provides the full server topology for immediate panel population.
|
|
95
|
+
*/
|
|
96
|
+
export interface TopologyEvent {
|
|
97
|
+
readonly type: 'topology';
|
|
98
|
+
readonly serverName: string;
|
|
99
|
+
readonly pid: number;
|
|
100
|
+
readonly tools: readonly TopologyTool[];
|
|
101
|
+
/** Current FSM state, if FSM is configured */
|
|
102
|
+
readonly fsmState?: string;
|
|
103
|
+
readonly timestamp: number;
|
|
104
|
+
}
|
|
105
|
+
/** Tool entry within a {@link TopologyEvent} */
|
|
106
|
+
export interface TopologyTool {
|
|
107
|
+
readonly name: string;
|
|
108
|
+
readonly actions: readonly string[];
|
|
109
|
+
/** Read-only or destructive annotation */
|
|
110
|
+
readonly readOnly?: boolean;
|
|
111
|
+
readonly destructive?: boolean;
|
|
112
|
+
/** Whether this tool runs in the V8 Sandbox */
|
|
113
|
+
readonly sandboxed?: boolean;
|
|
114
|
+
/** FSM states where this tool is visible */
|
|
115
|
+
readonly fsmStates?: readonly string[];
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Periodic heartbeat with process-level metrics.
|
|
119
|
+
* Emitted every 5 seconds to keep the TUI header bar alive.
|
|
120
|
+
*/
|
|
121
|
+
export interface HeartbeatEvent {
|
|
122
|
+
readonly type: 'heartbeat';
|
|
123
|
+
/** V8 heap used in bytes */
|
|
124
|
+
readonly heapUsedBytes: number;
|
|
125
|
+
/** V8 heap total in bytes */
|
|
126
|
+
readonly heapTotalBytes: number;
|
|
127
|
+
/** RSS in bytes */
|
|
128
|
+
readonly rssBytes: number;
|
|
129
|
+
/** Process uptime in seconds */
|
|
130
|
+
readonly uptimeSeconds: number;
|
|
131
|
+
readonly timestamp: number;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* All possible telemetry events that flow through the Shadow Socket.
|
|
135
|
+
*
|
|
136
|
+
* This is a superset of {@link DebugEvent} — the core pipeline events
|
|
137
|
+
* are included alongside the domain-specific telemetry.
|
|
138
|
+
*
|
|
139
|
+
* Use `switch (event.type)` for exhaustive handling:
|
|
140
|
+
* ```typescript
|
|
141
|
+
* function handle(event: TelemetryEvent) {
|
|
142
|
+
* switch (event.type) {
|
|
143
|
+
* case 'route': // DebugEvent
|
|
144
|
+
* case 'validate': // DebugEvent
|
|
145
|
+
* case 'execute': // DebugEvent
|
|
146
|
+
* case 'error': // DebugEvent
|
|
147
|
+
* case 'middleware': // DebugEvent
|
|
148
|
+
* case 'governance': // DebugEvent
|
|
149
|
+
* case 'dlp.redact': // DlpRedactEvent
|
|
150
|
+
* case 'presenter.slice': // PresenterSliceEvent
|
|
151
|
+
* case 'presenter.rules': // PresenterRulesEvent
|
|
152
|
+
* case 'sandbox.exec': // SandboxExecEvent
|
|
153
|
+
* case 'fsm.transition': // FsmTransitionEvent
|
|
154
|
+
* case 'topology': // TopologyEvent
|
|
155
|
+
* case 'heartbeat': // HeartbeatEvent
|
|
156
|
+
* }
|
|
157
|
+
* }
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
export type TelemetryEvent = DebugEvent | DlpRedactEvent | PresenterSliceEvent | PresenterRulesEvent | SandboxExecEvent | FsmTransitionEvent | TopologyEvent | HeartbeatEvent;
|
|
161
|
+
/**
|
|
162
|
+
* A function that accepts telemetry events for out-of-band delivery.
|
|
163
|
+
*
|
|
164
|
+
* The implementation is a fire-and-forget NDJSON writer to the IPC socket.
|
|
165
|
+
* If no TUI client is connected, the events are silently discarded.
|
|
166
|
+
*
|
|
167
|
+
* This type is passed to `AttachOptions.telemetry` and to individual
|
|
168
|
+
* subsystems (Presenter, RedactEngine, SandboxEngine) for event emission.
|
|
169
|
+
*/
|
|
170
|
+
export type TelemetrySink = (event: TelemetryEvent) => void;
|
|
171
|
+
//# sourceMappingURL=TelemetryEvent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryEvent.d.ts","sourceRoot":"","sources":["../../src/observability/TelemetryEvent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryEvent.js","sourceRoot":"","sources":["../../src/observability/TelemetryEvent.ts"],"names":[],"mappings":""}
|
|
@@ -62,7 +62,7 @@ export interface PresenterConfig<T> {
|
|
|
62
62
|
/** Human-readable domain name (for debugging and introspection) */
|
|
63
63
|
readonly name: string;
|
|
64
64
|
/** Zod schema for data validation and field filtering */
|
|
65
|
-
readonly schema?: ZodType<T>;
|
|
65
|
+
readonly schema?: ZodType<T, any, any>;
|
|
66
66
|
/**
|
|
67
67
|
* System rules that travel with the data.
|
|
68
68
|
*
|
|
@@ -178,7 +178,7 @@ export interface PresenterConfig<T> {
|
|
|
178
178
|
* @see {@link createPresenter} for the legacy fluent builder API
|
|
179
179
|
* @see {@link Presenter} for the full Presenter class documentation
|
|
180
180
|
*/
|
|
181
|
-
export declare function definePresenter<TSchema extends ZodType
|
|
181
|
+
export declare function definePresenter<TSchema extends ZodType<any, any, any>>(config: PresenterConfig<TSchema['_output']> & {
|
|
182
182
|
schema: TSchema;
|
|
183
183
|
}): Presenter<TSchema['_output']>;
|
|
184
184
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definePresenter.d.ts","sourceRoot":"","sources":["../../src/presenter/definePresenter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAKvC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,QAAQ,CAAC,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACrB,oEAAoE;IACpE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"definePresenter.d.ts","sourceRoot":"","sources":["../../src/presenter/definePresenter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAKvC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,QAAQ,CAAC,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACrB,oEAAoE;IACpE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAEvC;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAErF;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;IAE7D;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;IAE1E;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IAEpC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,gBAAgB,EAAE,CAAC;IAEzE;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAEtC;;;;;;;;;OASG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAE7B;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE;QACjB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;KAC3D,CAAC;CACL;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,eAAe,CAAC,OAAO,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAClE,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAClE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;AAEjC;;;;;GAKG;AACH,wBAAgB,eAAe,CAC3B,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,SAAS,CAAA;CAAE,GAC1D,SAAS,CAAC,OAAO,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FluentPromptBuilder.d.ts","sourceRoot":"","sources":["../../src/prompt/FluentPromptBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AACvD,OAAO,EACH,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,eAAe,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOrD;;;;;;;;;GASG;AACH,qBAAa,mBAAmB,CAAC,QAAQ,GAAG,IAAI,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC7G,YAAW,aAAa,CAAC,QAAQ,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAoC;IACnD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,KAAK,CAAC,CAA2C;IACzD,OAAO,CAAC,iBAAiB,CAAC,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,CAA0E;IAE3F,+EAA+E;IAC/E,OAAO,CAAC,SAAS,CAAsC;gBAE3C,IAAI,EAAE,MAAM;IAMxB;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM1B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMnC;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAMrD;;;;;OAKG;IACH,IAAI,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAM7B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,CAAC,SAAS,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1G,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAQpC;;;;;;;;OAQG;IACH,GAAG,CAAC,GAAG,GAAG,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI;IAM3C;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMzB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,QAAQ,GAAG,eAAe,EAAE,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAQ1F,mEAAmE;IACnE,OAAO,CAAC,MAAM;IAuBd,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM,GAAG,SAAS;IAIpC,OAAO,IAAI,MAAM,EAAE;IAInB,aAAa,IAAI,OAAO;IAIxB,mBAAmB,IAAI,MAAM,GAAG,SAAS;IAIzC,qBAAqB;;;;;
|
|
1
|
+
{"version":3,"file":"FluentPromptBuilder.d.ts","sourceRoot":"","sources":["../../src/prompt/FluentPromptBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AACvD,OAAO,EACH,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,eAAe,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOrD;;;;;;;;;GASG;AACH,qBAAa,mBAAmB,CAAC,QAAQ,GAAG,IAAI,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC7G,YAAW,aAAa,CAAC,QAAQ,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAoC;IACnD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,KAAK,CAAC,CAA2C;IACzD,OAAO,CAAC,iBAAiB,CAAC,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,CAA0E;IAE3F,+EAA+E;IAC/E,OAAO,CAAC,SAAS,CAAsC;gBAE3C,IAAI,EAAE,MAAM;IAMxB;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM1B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMnC;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAMrD;;;;;OAKG;IACH,IAAI,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAM7B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,CAAC,SAAS,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1G,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAQpC;;;;;;;;OAQG;IACH,GAAG,CAAC,GAAG,GAAG,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI;IAM3C;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMzB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,QAAQ,GAAG,eAAe,EAAE,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAQ1F,mEAAmE;IACnE,OAAO,CAAC,MAAM;IAuBd,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM,GAAG,SAAS;IAIpC,OAAO,IAAI,MAAM,EAAE;IAInB,aAAa,IAAI,OAAO;IAIxB,mBAAmB,IAAI,MAAM,GAAG,SAAS;IAIzC,qBAAqB;;;;;uBAQopK,CAAC;oBAA+B,CAAC;;;IAJ1sK,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;CAG9E"}
|
|
@@ -10,6 +10,7 @@ import { type ZeroTrustConfig } from '../introspection/CryptoAttestation.js';
|
|
|
10
10
|
import { type SelfHealingConfig } from '../introspection/ContractAwareSelfHealing.js';
|
|
11
11
|
import { type ToolExposition } from '../exposition/types.js';
|
|
12
12
|
import { type PromptRegistry } from '../prompt/PromptRegistry.js';
|
|
13
|
+
import { StateMachineGate, type FsmStateStore } from '../fsm/StateMachineGate.js';
|
|
13
14
|
/** Options for attaching to an MCP Server */
|
|
14
15
|
export interface AttachOptions<TContext> {
|
|
15
16
|
/** Only expose tools matching these tag filters */
|
|
@@ -232,6 +233,68 @@ export interface AttachOptions<TContext> {
|
|
|
232
233
|
* @see {@link SelfHealingConfig} for configuration options
|
|
233
234
|
*/
|
|
234
235
|
selfHealing?: SelfHealingConfig;
|
|
236
|
+
/**
|
|
237
|
+
* FSM gate for temporal anti-hallucination.
|
|
238
|
+
*
|
|
239
|
+
* When configured, tools bound to FSM states (via `.bindState()`)
|
|
240
|
+
* are dynamically filtered from `tools/list` based on the current
|
|
241
|
+
* workflow state. The LLM physically cannot call tools that don't
|
|
242
|
+
* exist in its reality.
|
|
243
|
+
*
|
|
244
|
+
* On successful tool execution, the FSM transitions automatically
|
|
245
|
+
* (if a transition event is bound), and `notifications/tools/list_changed`
|
|
246
|
+
* is emitted so the client re-fetches the tool list.
|
|
247
|
+
*
|
|
248
|
+
* Zero overhead when omitted — no FSM code runs.
|
|
249
|
+
*
|
|
250
|
+
* @example
|
|
251
|
+
* ```typescript
|
|
252
|
+
* const gate = new StateMachineGate({
|
|
253
|
+
* id: 'checkout',
|
|
254
|
+
* initial: 'empty',
|
|
255
|
+
* states: {
|
|
256
|
+
* empty: { on: { ADD_ITEM: 'has_items' } },
|
|
257
|
+
* has_items: { on: { CHECKOUT: 'payment' } },
|
|
258
|
+
* payment: { on: { PAY: 'confirmed' } },
|
|
259
|
+
* confirmed: { type: 'final' },
|
|
260
|
+
* },
|
|
261
|
+
* });
|
|
262
|
+
*
|
|
263
|
+
* registry.attachToServer(server, {
|
|
264
|
+
* contextFactory: createContext,
|
|
265
|
+
* fsm: gate,
|
|
266
|
+
* });
|
|
267
|
+
* ```
|
|
268
|
+
*
|
|
269
|
+
* @see {@link StateMachineGate} for the FSM engine
|
|
270
|
+
*/
|
|
271
|
+
fsm?: StateMachineGate;
|
|
272
|
+
/**
|
|
273
|
+
* External state store for FSM persistence in serverless/edge deployments.
|
|
274
|
+
*
|
|
275
|
+
* When MCP runs over Streamable HTTP (Vercel, Cloudflare Workers),
|
|
276
|
+
* there is no persistent process — FSM state must be externalized.
|
|
277
|
+
* The `sessionId` comes from the `Mcp-Session-Id` request header.
|
|
278
|
+
*
|
|
279
|
+
* Zero overhead when omitted — FSM state lives in-memory.
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
* ```typescript
|
|
283
|
+
* registry.attachToServer(server, {
|
|
284
|
+
* fsm: gate,
|
|
285
|
+
* fsmStore: {
|
|
286
|
+
* load: async (sessionId) => {
|
|
287
|
+
* const data = await redis.get(`fsm:${sessionId}`);
|
|
288
|
+
* return data ? JSON.parse(data) : undefined;
|
|
289
|
+
* },
|
|
290
|
+
* save: async (sessionId, snapshot) => {
|
|
291
|
+
* await redis.set(`fsm:${sessionId}`, JSON.stringify(snapshot), { EX: 3600 });
|
|
292
|
+
* },
|
|
293
|
+
* },
|
|
294
|
+
* });
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
fsmStore?: FsmStateStore;
|
|
235
298
|
}
|
|
236
299
|
/** Function to detach the registry from the server */
|
|
237
300
|
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,EAAmB,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,uCAAuC,CAAC;AAC/F,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AAGtF,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,KAAK,cAAc,EAAqB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"ServerAttachment.d.ts","sourceRoot":"","sources":["../../src/server/ServerAttachment.ts"],"names":[],"mappings":"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"}
|