@vinkius-core/mcp-fusion 2.9.0 → 2.12.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 +3 -0
- package/dist/cli/fusion.d.ts.map +1 -1
- package/dist/cli/fusion.js +125 -3
- package/dist/cli/fusion.js.map +1 -1
- package/dist/cli/templates/config.js +3 -3
- package/dist/cli/templates/config.js.map +1 -1
- package/dist/cli/templates/constants.d.ts +1 -1
- package/dist/cli/templates/constants.d.ts.map +1 -1
- package/dist/cli/templates/constants.js +1 -1
- package/dist/cli/templates/constants.js.map +1 -1
- package/dist/cli/templates/core.js +5 -5
- package/dist/cli/templates/middleware.d.ts +1 -1
- package/dist/cli/templates/middleware.d.ts.map +1 -1
- package/dist/cli/templates/middleware.js +16 -13
- package/dist/cli/templates/middleware.js.map +1 -1
- package/dist/cli/templates/readme.d.ts.map +1 -1
- package/dist/cli/templates/readme.js +14 -18
- package/dist/cli/templates/readme.js.map +1 -1
- package/dist/cli/templates/tools.d.ts +4 -0
- package/dist/cli/templates/tools.d.ts.map +1 -1
- package/dist/cli/templates/tools.js +26 -29
- package/dist/cli/templates/tools.js.map +1 -1
- package/dist/cli/templates/vectors/database.d.ts.map +1 -1
- package/dist/cli/templates/vectors/database.js +14 -19
- package/dist/cli/templates/vectors/database.js.map +1 -1
- package/dist/cli/templates/vectors/oauth.d.ts.map +1 -1
- package/dist/cli/templates/vectors/oauth.js +4 -5
- package/dist/cli/templates/vectors/oauth.js.map +1 -1
- package/dist/cli/templates/vectors/openapi.js +2 -2
- package/dist/cli/templates/vectors/workflow.js +1 -1
- package/dist/cli/templates/vectors/workflow.js.map +1 -1
- package/dist/client/FusionClient.d.ts +55 -0
- package/dist/client/FusionClient.d.ts.map +1 -1
- package/dist/client/FusionClient.js +30 -0
- package/dist/client/FusionClient.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/core/builder/ActionGroupBuilder.d.ts +86 -46
- package/dist/core/builder/ActionGroupBuilder.d.ts.map +1 -1
- package/dist/core/builder/ActionGroupBuilder.js +68 -26
- package/dist/core/builder/ActionGroupBuilder.js.map +1 -1
- package/dist/core/builder/ErrorBuilder.d.ts +59 -0
- package/dist/core/builder/ErrorBuilder.d.ts.map +1 -0
- package/dist/core/builder/ErrorBuilder.js +99 -0
- package/dist/core/builder/ErrorBuilder.js.map +1 -0
- package/dist/core/builder/FluentRouter.d.ts +91 -0
- package/dist/core/builder/FluentRouter.d.ts.map +1 -0
- package/dist/core/builder/FluentRouter.js +121 -0
- package/dist/core/builder/FluentRouter.js.map +1 -0
- package/dist/core/builder/FluentSchemaHelpers.d.ts +237 -0
- package/dist/core/builder/FluentSchemaHelpers.d.ts.map +1 -0
- package/dist/core/builder/FluentSchemaHelpers.js +227 -0
- package/dist/core/builder/FluentSchemaHelpers.js.map +1 -0
- package/dist/core/builder/FluentToolBuilder.d.ts +347 -0
- package/dist/core/builder/FluentToolBuilder.d.ts.map +1 -0
- package/dist/core/builder/FluentToolBuilder.js +525 -0
- package/dist/core/builder/FluentToolBuilder.js.map +1 -0
- package/dist/core/builder/GroupedToolBuilder.d.ts +91 -1
- package/dist/core/builder/GroupedToolBuilder.d.ts.map +1 -1
- package/dist/core/builder/GroupedToolBuilder.js +122 -4
- package/dist/core/builder/GroupedToolBuilder.js.map +1 -1
- package/dist/core/builder/ToolDefinitionCompiler.d.ts +1 -0
- package/dist/core/builder/ToolDefinitionCompiler.d.ts.map +1 -1
- package/dist/core/builder/ToolDefinitionCompiler.js +1 -1
- package/dist/core/builder/ToolDefinitionCompiler.js.map +1 -1
- package/dist/core/builder/index.d.ts +4 -0
- package/dist/core/builder/index.d.ts.map +1 -1
- package/dist/core/builder/index.js +7 -0
- package/dist/core/builder/index.js.map +1 -1
- package/dist/core/execution/EgressGuard.js +1 -1
- package/dist/core/execution/EgressGuard.js.map +1 -1
- package/dist/core/execution/ExecutionPipeline.d.ts +8 -2
- package/dist/core/execution/ExecutionPipeline.d.ts.map +1 -1
- package/dist/core/execution/ExecutionPipeline.js +18 -9
- package/dist/core/execution/ExecutionPipeline.js.map +1 -1
- package/dist/core/execution/PipelineHooks.d.ts +0 -6
- package/dist/core/execution/PipelineHooks.d.ts.map +1 -1
- package/dist/core/execution/PipelineHooks.js +7 -3
- package/dist/core/execution/PipelineHooks.js.map +1 -1
- package/dist/core/index.d.ts +5 -7
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/initFusion.d.ts +119 -87
- package/dist/core/initFusion.d.ts.map +1 -1
- package/dist/core/initFusion.js +56 -66
- package/dist/core/initFusion.js.map +1 -1
- package/dist/core/registry/ToolRegistry.d.ts +1 -1
- package/dist/core/registry/ToolRegistry.d.ts.map +1 -1
- package/dist/core/registry/ToolRegistry.js +1 -1
- package/dist/core/registry/ToolRegistry.js.map +1 -1
- package/dist/core/schema/SchemaGenerator.d.ts +1 -1
- package/dist/core/schema/SchemaGenerator.d.ts.map +1 -1
- package/dist/core/schema/SchemaGenerator.js +38 -1
- package/dist/core/schema/SchemaGenerator.js.map +1 -1
- package/dist/core/types.d.ts +19 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/exposition/ExpositionCompiler.d.ts.map +1 -1
- package/dist/exposition/ExpositionCompiler.js +25 -2
- package/dist/exposition/ExpositionCompiler.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/introspection/BehaviorDigest.d.ts +2 -2
- package/dist/introspection/BehaviorDigest.d.ts.map +1 -1
- package/dist/introspection/BehaviorDigest.js +38 -36
- package/dist/introspection/BehaviorDigest.js.map +1 -1
- package/dist/introspection/CapabilityLockfile.d.ts +2 -2
- package/dist/introspection/CapabilityLockfile.d.ts.map +1 -1
- package/dist/introspection/CapabilityLockfile.js +9 -9
- package/dist/introspection/CapabilityLockfile.js.map +1 -1
- package/dist/introspection/CryptoAttestation.d.ts.map +1 -1
- package/dist/introspection/CryptoAttestation.js +27 -36
- package/dist/introspection/CryptoAttestation.js.map +1 -1
- package/dist/introspection/ToolContract.d.ts +2 -2
- package/dist/introspection/ToolContract.d.ts.map +1 -1
- package/dist/introspection/ToolContract.js +9 -9
- package/dist/introspection/ToolContract.js.map +1 -1
- package/dist/introspection/canonicalize.d.ts +16 -1
- package/dist/introspection/canonicalize.d.ts.map +1 -1
- package/dist/introspection/canonicalize.js +24 -3
- package/dist/introspection/canonicalize.js.map +1 -1
- package/dist/presenter/PostProcessor.d.ts +4 -2
- package/dist/presenter/PostProcessor.d.ts.map +1 -1
- package/dist/presenter/PostProcessor.js +10 -10
- package/dist/presenter/PostProcessor.js.map +1 -1
- package/dist/presenter/Presenter.d.ts +112 -6
- package/dist/presenter/Presenter.d.ts.map +1 -1
- package/dist/presenter/Presenter.js +134 -40
- package/dist/presenter/Presenter.js.map +1 -1
- package/dist/presenter/SelectUtils.d.ts +78 -0
- package/dist/presenter/SelectUtils.d.ts.map +1 -0
- package/dist/presenter/SelectUtils.js +141 -0
- package/dist/presenter/SelectUtils.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 +6 -0
- package/dist/presenter/index.js.map +1 -1
- package/dist/presenter/suggest.d.ts +39 -0
- package/dist/presenter/suggest.d.ts.map +1 -0
- package/dist/presenter/suggest.js +41 -0
- package/dist/presenter/suggest.js.map +1 -0
- package/dist/presenter/typeHelpers.d.ts +147 -0
- package/dist/presenter/typeHelpers.d.ts.map +1 -0
- package/dist/presenter/typeHelpers.js +152 -0
- package/dist/presenter/typeHelpers.js.map +1 -0
- package/dist/prompt/FluentPromptBuilder.d.ts +155 -0
- package/dist/prompt/FluentPromptBuilder.d.ts.map +1 -0
- package/dist/prompt/FluentPromptBuilder.js +193 -0
- package/dist/prompt/FluentPromptBuilder.js.map +1 -0
- package/dist/prompt/index.d.ts +1 -0
- package/dist/prompt/index.d.ts.map +1 -1
- package/dist/prompt/index.js +1 -0
- package/dist/prompt/index.js.map +1 -1
- package/dist/server/DevServer.js +8 -8
- package/dist/server/DevServer.js.map +1 -1
- package/dist/server/ServerAttachment.d.ts +1 -1
- package/dist/server/ServerAttachment.d.ts.map +1 -1
- package/dist/server/ServerAttachment.js +57 -4
- package/dist/server/ServerAttachment.js.map +1 -1
- package/dist/state-sync/ResponseDecorator.d.ts +1 -1
- package/dist/state-sync/StateSyncBuilder.d.ts +75 -0
- package/dist/state-sync/StateSyncBuilder.d.ts.map +1 -0
- package/dist/state-sync/StateSyncBuilder.js +123 -0
- package/dist/state-sync/StateSyncBuilder.js.map +1 -0
- package/dist/state-sync/index.d.ts +1 -0
- 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/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Presenter.d.ts","sourceRoot":"","sources":["../../src/presenter/Presenter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Presenter.d.ts","sourceRoot":"","sources":["../../src/presenter/Presenter.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,10 +52,11 @@
|
|
|
52
52
|
*
|
|
53
53
|
* @module
|
|
54
54
|
*/
|
|
55
|
-
import { ZodError } from 'zod';
|
|
55
|
+
import { z, ZodType, ZodError } from 'zod';
|
|
56
56
|
import { ResponseBuilder } from './ResponseBuilder.js';
|
|
57
57
|
import {} from './ui.js';
|
|
58
58
|
import { PresenterValidationError } from './PresenterValidationError.js';
|
|
59
|
+
import { applySelectFilter, extractZodKeys } from './SelectUtils.js';
|
|
59
60
|
// ── Brand ────────────────────────────────────────────────
|
|
60
61
|
const PRESENTER_BRAND = 'FusionPresenter';
|
|
61
62
|
/**
|
|
@@ -118,32 +119,19 @@ export class Presenter {
|
|
|
118
119
|
`Configuration must be done before .make() is called.`);
|
|
119
120
|
}
|
|
120
121
|
}
|
|
121
|
-
//
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
*
|
|
125
|
-
* The schema acts as a **security contract**: only fields declared
|
|
126
|
-
* in the schema will reach the LLM. Sensitive data (passwords,
|
|
127
|
-
* tenant IDs, internal flags) is automatically stripped.
|
|
128
|
-
*
|
|
129
|
-
* @typeParam TSchema - Zod type with output type inference
|
|
130
|
-
* @param zodSchema - A Zod schema (z.object, z.array, etc.)
|
|
131
|
-
* @returns A narrowed Presenter with the schema's output type
|
|
132
|
-
*
|
|
133
|
-
* @example
|
|
134
|
-
* ```typescript
|
|
135
|
-
* createPresenter('Invoice')
|
|
136
|
-
* .schema(z.object({
|
|
137
|
-
* id: z.string(),
|
|
138
|
-
* amount_cents: z.number(),
|
|
139
|
-
* }))
|
|
140
|
-
* // Presenter<{ id: string; amount_cents: number }>
|
|
141
|
-
* ```
|
|
142
|
-
*/
|
|
143
|
-
schema(zodSchema) {
|
|
122
|
+
// Implementation — accepts both ZodType and plain object shapes
|
|
123
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
124
|
+
schema(schemaOrShape) {
|
|
144
125
|
this._assertNotSealed();
|
|
145
126
|
const narrowed = this;
|
|
146
|
-
|
|
127
|
+
// Detect if it's an already-constructed ZodType (has _def property)
|
|
128
|
+
if (schemaOrShape instanceof ZodType) {
|
|
129
|
+
narrowed._schema = schemaOrShape;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Plain object shape → wrap in z.object()
|
|
133
|
+
narrowed._schema = z.object(schemaOrShape);
|
|
134
|
+
}
|
|
147
135
|
return narrowed;
|
|
148
136
|
}
|
|
149
137
|
/**
|
|
@@ -274,6 +262,89 @@ export class Presenter {
|
|
|
274
262
|
this._suggestActions = fn;
|
|
275
263
|
return this;
|
|
276
264
|
}
|
|
265
|
+
// ── Fluent Aliases ───────────────────────────────────
|
|
266
|
+
/**
|
|
267
|
+
* Alias for `.suggestActions()` — fluent shorthand.
|
|
268
|
+
*
|
|
269
|
+
* Define HATEOAS-style action suggestions based on data state.
|
|
270
|
+
* Use with the `suggest()` helper for maximum fluency.
|
|
271
|
+
*
|
|
272
|
+
* @param fn - `(data, ctx?) => (ActionSuggestion | null)[]`
|
|
273
|
+
* @returns `this` for chaining
|
|
274
|
+
*
|
|
275
|
+
* @example
|
|
276
|
+
* ```typescript
|
|
277
|
+
* import { suggest } from '@vinkius-core/mcp-fusion';
|
|
278
|
+
*
|
|
279
|
+
* .suggest((inv) => [
|
|
280
|
+
* suggest('invoices.get', 'View details'),
|
|
281
|
+
* inv.status === 'overdue'
|
|
282
|
+
* ? suggest('billing.remind', 'Send reminder')
|
|
283
|
+
* : null,
|
|
284
|
+
* ])
|
|
285
|
+
* ```
|
|
286
|
+
*/
|
|
287
|
+
suggest(fn) {
|
|
288
|
+
return this.suggestActions(fn);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Alias for `.systemRules()` — fluent shorthand.
|
|
292
|
+
*
|
|
293
|
+
* @param rules - Static rules array or dynamic `(data, ctx?) => (string | null)[]`
|
|
294
|
+
* @returns `this` for chaining
|
|
295
|
+
*
|
|
296
|
+
* @example
|
|
297
|
+
* ```typescript
|
|
298
|
+
* .rules(['CRITICAL: amounts in CENTS.'])
|
|
299
|
+
* .rules((inv) => [
|
|
300
|
+
* inv.status === 'overdue' ? '⚠️ OVERDUE' : null,
|
|
301
|
+
* ])
|
|
302
|
+
* ```
|
|
303
|
+
*/
|
|
304
|
+
rules(rules) {
|
|
305
|
+
return this.systemRules(rules);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Alias for `.uiBlocks()` — fluent shorthand.
|
|
309
|
+
*
|
|
310
|
+
* @param fn - `(item, ctx?) => (UiBlock | null)[]`
|
|
311
|
+
* @returns `this` for chaining
|
|
312
|
+
*
|
|
313
|
+
* @example
|
|
314
|
+
* ```typescript
|
|
315
|
+
* .ui((inv) => [
|
|
316
|
+
* ui.echarts({ series: [{ type: 'gauge', data: [{ value: inv.amount / 100 }] }] }),
|
|
317
|
+
* ])
|
|
318
|
+
* ```
|
|
319
|
+
*/
|
|
320
|
+
ui(fn) {
|
|
321
|
+
return this.uiBlocks(fn);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Cognitive guardrail shorthand with auto-generated message.
|
|
325
|
+
*
|
|
326
|
+
* Truncates large collections and injects a smart summary block.
|
|
327
|
+
* For custom truncation messages, use `.agentLimit(max, onTruncate)` instead.
|
|
328
|
+
*
|
|
329
|
+
* @param max - Maximum items to keep in the data array
|
|
330
|
+
* @returns `this` for chaining
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* ```typescript
|
|
334
|
+
* // Auto-generated message:
|
|
335
|
+
* .limit(50)
|
|
336
|
+
* // → "⚠️ Dataset truncated. 50 shown, {omitted} hidden. Use filters to narrow results."
|
|
337
|
+
*
|
|
338
|
+
* // For custom message, use agentLimit():
|
|
339
|
+
* .agentLimit(50, (omitted) => ui.summary(`Custom: ${omitted} hidden`))
|
|
340
|
+
* ```
|
|
341
|
+
*/
|
|
342
|
+
limit(max) {
|
|
343
|
+
return this.agentLimit(max, (omitted) => ({
|
|
344
|
+
type: 'summary',
|
|
345
|
+
content: `📊 **Summary**: ⚠️ Dataset truncated. ${max} shown, ${omitted} hidden. Use filters to narrow results.`,
|
|
346
|
+
}));
|
|
347
|
+
}
|
|
277
348
|
/**
|
|
278
349
|
* Compose a child Presenter for a nested relation.
|
|
279
350
|
*
|
|
@@ -311,9 +382,7 @@ export class Presenter {
|
|
|
311
382
|
getSchemaKeys() {
|
|
312
383
|
if (!this._schema)
|
|
313
384
|
return [];
|
|
314
|
-
|
|
315
|
-
const shape = this._schema.shape;
|
|
316
|
-
return shape ? Object.keys(shape) : [];
|
|
385
|
+
return extractZodKeys(this._schema);
|
|
317
386
|
}
|
|
318
387
|
/**
|
|
319
388
|
* Get which UI block factory methods were configured.
|
|
@@ -348,7 +417,16 @@ export class Presenter {
|
|
|
348
417
|
/**
|
|
349
418
|
* Compose a {@link ResponseBuilder} from raw data.
|
|
350
419
|
*
|
|
351
|
-
* Orchestrates: truncate → validate → embed → render UI → attach rules
|
|
420
|
+
* Orchestrates: truncate → validate → embed → render UI → attach rules
|
|
421
|
+
* → suggest actions → **Late Guillotine** (`_select` filter).
|
|
422
|
+
*
|
|
423
|
+
* **Late Guillotine pattern**: UI blocks, system rules, and action
|
|
424
|
+
* suggestions are computed using the **full** validated data, ensuring
|
|
425
|
+
* charts and rules never see `undefined` for pruned fields. Only the
|
|
426
|
+
* wire-facing data block in the ResponseBuilder is filtered by `_select`
|
|
427
|
+
* — the UI consumes full data in RAM, the AI consumes pruned data on
|
|
428
|
+
* the wire.
|
|
429
|
+
*
|
|
352
430
|
* After the first call, the Presenter is sealed (immutable).
|
|
353
431
|
*
|
|
354
432
|
* **Auto-detection**: If `data` is an array, items are validated
|
|
@@ -357,18 +435,22 @@ export class Presenter {
|
|
|
357
435
|
*
|
|
358
436
|
* @param data - Raw data from the handler (object or array)
|
|
359
437
|
* @param ctx - Optional request context (for RBAC, locale, etc.)
|
|
438
|
+
* @param selectFields - Optional top-level field names to keep in the
|
|
439
|
+
* data block. When provided, only these keys survive in the JSON
|
|
440
|
+
* payload sent to the AI. Nested objects are kept whole (shallow).
|
|
360
441
|
* @returns A {@link ResponseBuilder} ready for chaining or `.build()`
|
|
361
442
|
* @throws If Zod validation fails
|
|
362
443
|
*
|
|
363
444
|
* @example
|
|
364
445
|
* ```typescript
|
|
365
|
-
* //
|
|
366
|
-
* // Manual:
|
|
446
|
+
* // Full data (default)
|
|
367
447
|
* return InvoicePresenter.make(rawInvoice).build();
|
|
368
|
-
*
|
|
448
|
+
*
|
|
449
|
+
* // With _select filtering — only 'status' reaches the AI
|
|
450
|
+
* return InvoicePresenter.make(rawInvoice, ctx, ['status']).build();
|
|
369
451
|
* ```
|
|
370
452
|
*/
|
|
371
|
-
make(data, ctx) {
|
|
453
|
+
make(data, ctx, selectFields) {
|
|
372
454
|
// Seal on first use — configuration is frozen from here
|
|
373
455
|
this._sealed = true;
|
|
374
456
|
const isArray = Array.isArray(data);
|
|
@@ -384,20 +466,32 @@ export class Presenter {
|
|
|
384
466
|
// Embeds access relational keys (e.g. `client`) that the parent schema
|
|
385
467
|
// may not include — so they must run on pre-validation data.
|
|
386
468
|
const rawForEmbeds = data;
|
|
387
|
-
// Step 2: Validate
|
|
469
|
+
// Step 2: Validate — produces the FULL validated data
|
|
388
470
|
const validated = this._validate(data, isArray);
|
|
389
|
-
|
|
390
|
-
//
|
|
471
|
+
// ── Late Guillotine ──────────────────────────────────
|
|
472
|
+
// Steps 3-6 use the FULL validated data so that UI blocks,
|
|
473
|
+
// system rules, and action suggestions never see undefined
|
|
474
|
+
// for pruned fields (e.g. a chart using 'revenue' won't break
|
|
475
|
+
// if the AI only selected 'status').
|
|
476
|
+
//
|
|
477
|
+
// The _select filter is applied ONLY to the wire-facing data
|
|
478
|
+
// block in the ResponseBuilder — the last step before serialization.
|
|
479
|
+
// Step 3: Determine wire-facing data (filtered or full)
|
|
480
|
+
const wireData = (selectFields && selectFields.length > 0)
|
|
481
|
+
? applySelectFilter(validated, selectFields, isArray)
|
|
482
|
+
: validated;
|
|
483
|
+
const builder = new ResponseBuilder(wireData);
|
|
484
|
+
// Step 3.5: Truncation warning (first UI block, before all others)
|
|
391
485
|
if (truncationBlock) {
|
|
392
486
|
builder.uiBlock(truncationBlock);
|
|
393
487
|
}
|
|
394
|
-
// Step
|
|
488
|
+
// Step 4: Merge embedded child Presenter blocks (using FULL data)
|
|
395
489
|
this._processEmbeds(builder, rawForEmbeds, isArray, ctx);
|
|
396
|
-
// Step
|
|
490
|
+
// Step 5: Attach UI blocks (using FULL validated data)
|
|
397
491
|
this._attachUiBlocks(builder, validated, isArray, ctx);
|
|
398
|
-
// Step
|
|
492
|
+
// Step 6: Attach rules (using FULL validated data)
|
|
399
493
|
this._attachRules(builder, validated, isArray, ctx);
|
|
400
|
-
// Step
|
|
494
|
+
// Step 7: Attach action suggestions (using FULL validated data)
|
|
401
495
|
this._attachSuggestions(builder, validated, isArray, ctx);
|
|
402
496
|
return builder;
|
|
403
497
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Presenter.js","sourceRoot":"","sources":["../../src/presenter/Presenter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"Presenter.js","sourceRoot":"","sources":["../../src/presenter/Presenter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SelectUtils — Zod Reflection & Shallow Field Filter
|
|
3
|
+
*
|
|
4
|
+
* Utilities for the `_select` context window optimization feature.
|
|
5
|
+
*
|
|
6
|
+
* - `extractZodKeys()`: Recursively unwraps Zod wrappers (Optional,
|
|
7
|
+
* Nullable, Default, Effects, Array) to reach the inner ZodObject
|
|
8
|
+
* and extract its top-level keys. Fails gracefully (returns [])
|
|
9
|
+
* for schemas without a discoverable shape.
|
|
10
|
+
*
|
|
11
|
+
* - `pickFields()`: Shallow (top-level only) field filter. Keeps
|
|
12
|
+
* only the keys requested by the AI's `_select` parameter.
|
|
13
|
+
* Nested objects are returned whole — no recursive GraphQL-style
|
|
14
|
+
* traversal. This resolves 95% of real-world overfetching.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
import { type ZodType } from 'zod';
|
|
20
|
+
/**
|
|
21
|
+
* Recursively unwrap a Zod schema to extract the top-level object keys.
|
|
22
|
+
*
|
|
23
|
+
* Peels through layers of modifiers (Optional → Nullable → Default →
|
|
24
|
+
* Effects → Array) until it finds a ZodObject, then returns
|
|
25
|
+
* `Object.keys(shape)`.
|
|
26
|
+
*
|
|
27
|
+
* Returns `[]` for schemas that don't resolve to an object shape
|
|
28
|
+
* (e.g. `z.string()`, `z.any()`, `z.record()`), which gracefully
|
|
29
|
+
* disables `_select` injection for that Presenter.
|
|
30
|
+
*
|
|
31
|
+
* @param schema - Any Zod schema (ZodType)
|
|
32
|
+
* @returns Array of top-level key names, or `[]` if not extractable
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* extractZodKeys(z.object({ id: z.string(), name: z.string() }))
|
|
37
|
+
* // → ['id', 'name']
|
|
38
|
+
*
|
|
39
|
+
* extractZodKeys(z.object({ id: z.string() }).optional().array())
|
|
40
|
+
* // → ['id']
|
|
41
|
+
*
|
|
42
|
+
* extractZodKeys(z.string())
|
|
43
|
+
* // → []
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function extractZodKeys(schema: ZodType): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Shallow (top-level only) field picker.
|
|
49
|
+
*
|
|
50
|
+
* Keeps only the keys present in `selectSet`. Nested objects are
|
|
51
|
+
* returned whole — no recursive path traversal. This is by design:
|
|
52
|
+
* the `_select` enum only lists root-level keys, matching 95% of
|
|
53
|
+
* real-world overfetching scenarios with O(1) complexity.
|
|
54
|
+
*
|
|
55
|
+
* @param data - The validated object to filter
|
|
56
|
+
* @param selectSet - Set of top-level keys to keep
|
|
57
|
+
* @returns A new object with only the selected keys
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* pickFields({ id: '1', status: 'paid', amount: 100 }, new Set(['status']))
|
|
62
|
+
* // → { status: 'paid' }
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function pickFields(data: Record<string, unknown>, selectSet: Set<string>): Record<string, unknown>;
|
|
66
|
+
/**
|
|
67
|
+
* Apply `_select` filtering to validated data.
|
|
68
|
+
*
|
|
69
|
+
* Handles both single objects and arrays. When `isArray` is true,
|
|
70
|
+
* each item in the array is filtered independently.
|
|
71
|
+
*
|
|
72
|
+
* @param data - Validated data (single object or array)
|
|
73
|
+
* @param selectFields - Array of top-level keys to keep
|
|
74
|
+
* @param isArray - Whether `data` is an array
|
|
75
|
+
* @returns The filtered data (same shape as input, fewer fields)
|
|
76
|
+
*/
|
|
77
|
+
export declare function applySelectFilter<T>(data: T | T[], selectFields: string[], isArray: boolean): T | T[];
|
|
78
|
+
//# sourceMappingURL=SelectUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectUtils.d.ts","sourceRoot":"","sources":["../../src/presenter/SelectUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAInC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAqDxD;AAID;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAC/B,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EACb,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,OAAO,GACjB,CAAC,GAAG,CAAC,EAAE,CAUT"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SelectUtils — Zod Reflection & Shallow Field Filter
|
|
3
|
+
*
|
|
4
|
+
* Utilities for the `_select` context window optimization feature.
|
|
5
|
+
*
|
|
6
|
+
* - `extractZodKeys()`: Recursively unwraps Zod wrappers (Optional,
|
|
7
|
+
* Nullable, Default, Effects, Array) to reach the inner ZodObject
|
|
8
|
+
* and extract its top-level keys. Fails gracefully (returns [])
|
|
9
|
+
* for schemas without a discoverable shape.
|
|
10
|
+
*
|
|
11
|
+
* - `pickFields()`: Shallow (top-level only) field filter. Keeps
|
|
12
|
+
* only the keys requested by the AI's `_select` parameter.
|
|
13
|
+
* Nested objects are returned whole — no recursive GraphQL-style
|
|
14
|
+
* traversal. This resolves 95% of real-world overfetching.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
import {} from 'zod';
|
|
20
|
+
// ── Zod Key Extraction ───────────────────────────────────
|
|
21
|
+
/**
|
|
22
|
+
* Recursively unwrap a Zod schema to extract the top-level object keys.
|
|
23
|
+
*
|
|
24
|
+
* Peels through layers of modifiers (Optional → Nullable → Default →
|
|
25
|
+
* Effects → Array) until it finds a ZodObject, then returns
|
|
26
|
+
* `Object.keys(shape)`.
|
|
27
|
+
*
|
|
28
|
+
* Returns `[]` for schemas that don't resolve to an object shape
|
|
29
|
+
* (e.g. `z.string()`, `z.any()`, `z.record()`), which gracefully
|
|
30
|
+
* disables `_select` injection for that Presenter.
|
|
31
|
+
*
|
|
32
|
+
* @param schema - Any Zod schema (ZodType)
|
|
33
|
+
* @returns Array of top-level key names, or `[]` if not extractable
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* extractZodKeys(z.object({ id: z.string(), name: z.string() }))
|
|
38
|
+
* // → ['id', 'name']
|
|
39
|
+
*
|
|
40
|
+
* extractZodKeys(z.object({ id: z.string() }).optional().array())
|
|
41
|
+
* // → ['id']
|
|
42
|
+
*
|
|
43
|
+
* extractZodKeys(z.string())
|
|
44
|
+
* // → []
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export function extractZodKeys(schema) {
|
|
48
|
+
let current = schema;
|
|
49
|
+
// Safety: iterate up to 20 layers to prevent infinite loops
|
|
50
|
+
// on pathological or circular Zod constructions.
|
|
51
|
+
for (let depth = 0; depth < 20; depth++) {
|
|
52
|
+
if (!current || typeof current !== 'object')
|
|
53
|
+
return [];
|
|
54
|
+
const def = current._def;
|
|
55
|
+
if (!def)
|
|
56
|
+
return [];
|
|
57
|
+
const typeName = def['typeName'];
|
|
58
|
+
switch (typeName) {
|
|
59
|
+
// ── Modifier Wrappers ─────────────────────────
|
|
60
|
+
case 'ZodOptional':
|
|
61
|
+
case 'ZodNullable':
|
|
62
|
+
case 'ZodDefault':
|
|
63
|
+
case 'ZodReadonly':
|
|
64
|
+
case 'ZodBranded':
|
|
65
|
+
case 'ZodCatch':
|
|
66
|
+
case 'ZodLazy':
|
|
67
|
+
current = def['innerType'];
|
|
68
|
+
continue;
|
|
69
|
+
// ── Effects (Refine, Transform, Preprocess) ───
|
|
70
|
+
case 'ZodEffects':
|
|
71
|
+
current = def['schema'];
|
|
72
|
+
continue;
|
|
73
|
+
// ── Array → extract element type ──────────────
|
|
74
|
+
case 'ZodArray':
|
|
75
|
+
current = def['type'];
|
|
76
|
+
continue;
|
|
77
|
+
// ── Pipeline → follow through ─────────────────
|
|
78
|
+
case 'ZodPipeline':
|
|
79
|
+
current = def['out'];
|
|
80
|
+
continue;
|
|
81
|
+
// ── Object → extract keys ─────────────────────
|
|
82
|
+
case 'ZodObject': {
|
|
83
|
+
const shape = current.shape;
|
|
84
|
+
return shape ? Object.keys(shape) : [];
|
|
85
|
+
}
|
|
86
|
+
// ── Terminal: cannot extract keys ─────────────
|
|
87
|
+
default:
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
// ── Field Filtering ──────────────────────────────────────
|
|
94
|
+
/**
|
|
95
|
+
* Shallow (top-level only) field picker.
|
|
96
|
+
*
|
|
97
|
+
* Keeps only the keys present in `selectSet`. Nested objects are
|
|
98
|
+
* returned whole — no recursive path traversal. This is by design:
|
|
99
|
+
* the `_select` enum only lists root-level keys, matching 95% of
|
|
100
|
+
* real-world overfetching scenarios with O(1) complexity.
|
|
101
|
+
*
|
|
102
|
+
* @param data - The validated object to filter
|
|
103
|
+
* @param selectSet - Set of top-level keys to keep
|
|
104
|
+
* @returns A new object with only the selected keys
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```typescript
|
|
108
|
+
* pickFields({ id: '1', status: 'paid', amount: 100 }, new Set(['status']))
|
|
109
|
+
* // → { status: 'paid' }
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export function pickFields(data, selectSet) {
|
|
113
|
+
const result = {};
|
|
114
|
+
for (const key of selectSet) {
|
|
115
|
+
// Defense-in-depth: only copy OWN properties, blocking
|
|
116
|
+
// prototype chain access (__proto__, constructor, etc.)
|
|
117
|
+
if (Object.hasOwn(data, key)) {
|
|
118
|
+
result[key] = data[key];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Apply `_select` filtering to validated data.
|
|
125
|
+
*
|
|
126
|
+
* Handles both single objects and arrays. When `isArray` is true,
|
|
127
|
+
* each item in the array is filtered independently.
|
|
128
|
+
*
|
|
129
|
+
* @param data - Validated data (single object or array)
|
|
130
|
+
* @param selectFields - Array of top-level keys to keep
|
|
131
|
+
* @param isArray - Whether `data` is an array
|
|
132
|
+
* @returns The filtered data (same shape as input, fewer fields)
|
|
133
|
+
*/
|
|
134
|
+
export function applySelectFilter(data, selectFields, isArray) {
|
|
135
|
+
const selectSet = new Set(selectFields);
|
|
136
|
+
if (isArray) {
|
|
137
|
+
return data.map(item => pickFields(item, selectSet));
|
|
138
|
+
}
|
|
139
|
+
return pickFields(data, selectSet);
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=SelectUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectUtils.js","sourceRoot":"","sources":["../../src/presenter/SelectUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAgB,MAAM,KAAK,CAAC;AAEnC,4DAA4D;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,cAAc,CAAC,MAAe;IAC1C,IAAI,OAAO,GAAY,MAAM,CAAC;IAE9B,4DAA4D;IAC5D,iDAAiD;IACjD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAEvD,MAAM,GAAG,GAAI,OAA8C,CAAC,IAAI,CAAC;QACjE,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QAEpB,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAuB,CAAC;QAEvD,QAAQ,QAAQ,EAAE,CAAC;YACf,iDAAiD;YACjD,KAAK,aAAa,CAAC;YACnB,KAAK,aAAa,CAAC;YACnB,KAAK,YAAY,CAAC;YAClB,KAAK,aAAa,CAAC;YACnB,KAAK,YAAY,CAAC;YAClB,KAAK,UAAU,CAAC;YAChB,KAAK,SAAS;gBACV,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC3B,SAAS;YAEb,iDAAiD;YACjD,KAAK,YAAY;gBACb,OAAO,GAAI,GAA+B,CAAC,QAAQ,CAAC,CAAC;gBACrD,SAAS;YAEb,iDAAiD;YACjD,KAAK,UAAU;gBACX,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;gBACtB,SAAS;YAEb,iDAAiD;YACjD,KAAK,aAAa;gBACd,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;gBACrB,SAAS;YAEb,iDAAiD;YACjD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACf,MAAM,KAAK,GAAI,OAA+C,CAAC,KAAK,CAAC;gBACrE,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,CAAC;YAED,iDAAiD;YACjD;gBACI,OAAO,EAAE,CAAC;QAClB,CAAC;IACL,CAAC;IAED,OAAO,EAAE,CAAC;AACd,CAAC;AAED,4DAA4D;AAE5D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,UAAU,CACtB,IAA6B,EAC7B,SAAsB;IAEtB,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC1B,uDAAuD;QACvD,wDAAwD;QACxD,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC7B,IAAa,EACb,YAAsB,EACtB,OAAgB;IAEhB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IAExC,IAAI,OAAO,EAAE,CAAC;QACV,OAAQ,IAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAC5B,UAAU,CAAC,IAA+B,EAAE,SAAS,CAAM,CAC9D,CAAC;IACN,CAAC;IAED,OAAO,UAAU,CAAC,IAA+B,EAAE,SAAS,CAAM,CAAC;AACvE,CAAC"}
|
|
@@ -12,5 +12,8 @@ export { definePresenter } from './definePresenter.js';
|
|
|
12
12
|
export type { PresenterConfig, AgentLimitDef, EmbedDef } from './definePresenter.js';
|
|
13
13
|
export { extractZodDescriptions } from './ZodDescriptionExtractor.js';
|
|
14
14
|
export { PresenterValidationError } from './PresenterValidationError.js';
|
|
15
|
+
export { t } from './typeHelpers.js';
|
|
16
|
+
export { suggest } from './suggest.js';
|
|
15
17
|
export { postProcessResult, isToolResponse } from './PostProcessor.js';
|
|
18
|
+
export { extractZodKeys, pickFields, applySelectFilter } from './SelectUtils.js';
|
|
16
19
|
//# 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,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"}
|
|
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,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAGrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGvE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/presenter/index.js
CHANGED
|
@@ -15,6 +15,12 @@ export { definePresenter } from './definePresenter.js';
|
|
|
15
15
|
export { extractZodDescriptions } from './ZodDescriptionExtractor.js';
|
|
16
16
|
// ── Validation Error ─────────────────────────────────────
|
|
17
17
|
export { PresenterValidationError } from './PresenterValidationError.js';
|
|
18
|
+
// ── Type Helpers (Fluent Schema Namespace) ───────────────
|
|
19
|
+
export { t } from './typeHelpers.js';
|
|
20
|
+
// ── Action Suggestion Helper ─────────────────────────────
|
|
21
|
+
export { suggest } from './suggest.js';
|
|
18
22
|
// ── Post-Processing ──────────────────────────────────────
|
|
19
23
|
export { postProcessResult, isToolResponse } from './PostProcessor.js';
|
|
24
|
+
// ── Select Reflection (Context Window Optimization) ──────
|
|
25
|
+
export { extractZodKeys, pickFields, applySelectFilter } from './SelectUtils.js';
|
|
20
26
|
//# sourceMappingURL=index.js.map
|
|
@@ -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,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"}
|
|
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,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAErC,4DAA4D;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,4DAA4D;AAC5D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEvE,4DAA4D;AAC5D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* suggest() — Fluent Action Suggestion Helper
|
|
3
|
+
*
|
|
4
|
+
* Replaces `{ tool: '...', reason: '...' }` config objects with a
|
|
5
|
+
* clean function call that reads like English.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { suggest } from '@vinkius-core/mcp-fusion';
|
|
10
|
+
*
|
|
11
|
+
* .suggest((invoice) => [
|
|
12
|
+
* suggest('invoices.get', 'View invoice details'),
|
|
13
|
+
* invoice.status === 'overdue'
|
|
14
|
+
* ? suggest('billing.remind', 'Send collection reminder')
|
|
15
|
+
* : null,
|
|
16
|
+
* ])
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
import { type ActionSuggestion } from './Presenter.js';
|
|
22
|
+
/**
|
|
23
|
+
* Create an action suggestion for HATEOAS-style agent guidance.
|
|
24
|
+
*
|
|
25
|
+
* Fluent alternative to `{ tool: '...', reason: '...' }` config objects.
|
|
26
|
+
* Reads like `suggest(what, why)` — zero ceremony.
|
|
27
|
+
*
|
|
28
|
+
* @param tool - Tool name to suggest (e.g. `'billing.pay'`)
|
|
29
|
+
* @param reason - Human-readable reason for the suggestion
|
|
30
|
+
* @returns An {@link ActionSuggestion} object
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* suggest('projects.archive', 'Archive this inactive project')
|
|
35
|
+
* // → { tool: 'projects.archive', reason: 'Archive this inactive project' }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function suggest(tool: string, reason: string): ActionSuggestion;
|
|
39
|
+
//# sourceMappingURL=suggest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/presenter/suggest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAEtE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* suggest() — Fluent Action Suggestion Helper
|
|
3
|
+
*
|
|
4
|
+
* Replaces `{ tool: '...', reason: '...' }` config objects with a
|
|
5
|
+
* clean function call that reads like English.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { suggest } from '@vinkius-core/mcp-fusion';
|
|
10
|
+
*
|
|
11
|
+
* .suggest((invoice) => [
|
|
12
|
+
* suggest('invoices.get', 'View invoice details'),
|
|
13
|
+
* invoice.status === 'overdue'
|
|
14
|
+
* ? suggest('billing.remind', 'Send collection reminder')
|
|
15
|
+
* : null,
|
|
16
|
+
* ])
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
import {} from './Presenter.js';
|
|
22
|
+
/**
|
|
23
|
+
* Create an action suggestion for HATEOAS-style agent guidance.
|
|
24
|
+
*
|
|
25
|
+
* Fluent alternative to `{ tool: '...', reason: '...' }` config objects.
|
|
26
|
+
* Reads like `suggest(what, why)` — zero ceremony.
|
|
27
|
+
*
|
|
28
|
+
* @param tool - Tool name to suggest (e.g. `'billing.pay'`)
|
|
29
|
+
* @param reason - Human-readable reason for the suggestion
|
|
30
|
+
* @returns An {@link ActionSuggestion} object
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* suggest('projects.archive', 'Archive this inactive project')
|
|
35
|
+
* // → { tool: 'projects.archive', reason: 'Archive this inactive project' }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export function suggest(tool, reason) {
|
|
39
|
+
return { tool, reason };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=suggest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/presenter/suggest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAyB,MAAM,gBAAgB,CAAC;AAEvD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,MAAc;IAChD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
|