@vurb/core 3.2.3 → 3.3.4
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/README.md +677 -677
- package/dist/cli/constants.js +59 -59
- package/dist/cli/templates/config.js +26 -26
- 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.d.ts.map +1 -1
- package/dist/cli/templates/core.js +96 -169
- 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 +84 -84
- 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/middleware/AuditTrail.d.ts +128 -0
- package/dist/core/middleware/AuditTrail.d.ts.map +1 -0
- package/dist/core/middleware/AuditTrail.js +94 -0
- package/dist/core/middleware/AuditTrail.js.map +1 -0
- package/dist/core/middleware/InputFirewall.d.ts +95 -0
- package/dist/core/middleware/InputFirewall.d.ts.map +1 -0
- package/dist/core/middleware/InputFirewall.js +104 -0
- package/dist/core/middleware/InputFirewall.js.map +1 -0
- package/dist/core/middleware/RateLimiter.d.ts +151 -0
- package/dist/core/middleware/RateLimiter.d.ts.map +1 -0
- package/dist/core/middleware/RateLimiter.js +121 -0
- package/dist/core/middleware/RateLimiter.js.map +1 -0
- package/dist/core/middleware/index.d.ts +6 -0
- package/dist/core/middleware/index.d.ts.map +1 -1
- package/dist/core/middleware/index.js +4 -0
- package/dist/core/middleware/index.js.map +1 -1
- package/dist/index.d.ts +28 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/introspection/SemanticProbe.js +49 -49
- package/dist/observability/TelemetryEvent.d.ts +61 -1
- package/dist/observability/TelemetryEvent.d.ts.map +1 -1
- package/dist/presenter/JudgeChain.d.ts +129 -0
- package/dist/presenter/JudgeChain.d.ts.map +1 -0
- package/dist/presenter/JudgeChain.js +215 -0
- package/dist/presenter/JudgeChain.js.map +1 -0
- package/dist/presenter/PostProcessor.d.ts.map +1 -1
- package/dist/presenter/PostProcessor.js +11 -66
- package/dist/presenter/PostProcessor.js.map +1 -1
- package/dist/presenter/Presenter.d.ts +175 -37
- package/dist/presenter/Presenter.d.ts.map +1 -1
- package/dist/presenter/Presenter.js +265 -154
- package/dist/presenter/Presenter.js.map +1 -1
- package/dist/presenter/PresenterPipeline.d.ts +147 -0
- package/dist/presenter/PresenterPipeline.d.ts.map +1 -0
- package/dist/presenter/PresenterPipeline.js +271 -0
- package/dist/presenter/PresenterPipeline.js.map +1 -0
- package/dist/presenter/PromptFirewall.d.ts +160 -0
- package/dist/presenter/PromptFirewall.d.ts.map +1 -0
- package/dist/presenter/PromptFirewall.js +228 -0
- package/dist/presenter/PromptFirewall.js.map +1 -0
- package/dist/presenter/ResponseBuilder.d.ts +13 -0
- package/dist/presenter/ResponseBuilder.d.ts.map +1 -1
- package/dist/presenter/ResponseBuilder.js +28 -1
- package/dist/presenter/ResponseBuilder.js.map +1 -1
- package/dist/presenter/TelemetryCollector.d.ts +48 -0
- package/dist/presenter/TelemetryCollector.d.ts.map +1 -0
- package/dist/presenter/TelemetryCollector.js +93 -0
- package/dist/presenter/TelemetryCollector.js.map +1 -0
- package/dist/presenter/definePresenter.d.ts +112 -0
- package/dist/presenter/definePresenter.d.ts.map +1 -1
- package/dist/presenter/definePresenter.js +110 -0
- package/dist/presenter/definePresenter.js.map +1 -1
- package/dist/presenter/index.d.ts +6 -2
- package/dist/presenter/index.d.ts.map +1 -1
- package/dist/presenter/index.js +5 -1
- package/dist/presenter/index.js.map +1 -1
- package/dist/presenter/ui.d.ts +31 -8
- package/dist/presenter/ui.d.ts.map +1 -1
- package/dist/presenter/ui.js +16 -16
- package/dist/presenter/ui.js.map +1 -1
- package/dist/prompt/FluentPromptBuilder.d.ts.map +1 -1
- package/dist/resource/ResourceBuilder.d.ts +129 -0
- package/dist/resource/ResourceBuilder.d.ts.map +1 -0
- package/dist/resource/ResourceBuilder.js +93 -0
- package/dist/resource/ResourceBuilder.js.map +1 -0
- package/dist/resource/ResourceRegistry.d.ts +147 -0
- package/dist/resource/ResourceRegistry.d.ts.map +1 -0
- package/dist/resource/ResourceRegistry.js +234 -0
- package/dist/resource/ResourceRegistry.js.map +1 -0
- package/dist/resource/SubscriptionManager.d.ts +67 -0
- package/dist/resource/SubscriptionManager.d.ts.map +1 -0
- package/dist/resource/SubscriptionManager.js +86 -0
- package/dist/resource/SubscriptionManager.js.map +1 -0
- package/dist/resource/index.d.ts +13 -0
- package/dist/resource/index.d.ts.map +1 -0
- package/dist/resource/index.js +13 -0
- package/dist/resource/index.js.map +1 -0
- package/dist/server/ServerAttachment.d.ts +26 -0
- package/dist/server/ServerAttachment.d.ts.map +1 -1
- package/dist/server/ServerAttachment.js +70 -2
- package/dist/server/ServerAttachment.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/startServer.d.ts +22 -1
- package/dist/server/startServer.d.ts.map +1 -1
- package/dist/server/startServer.js +98 -5
- package/dist/server/startServer.js.map +1 -1
- package/package.json +1 -1
|
@@ -56,9 +56,11 @@ 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 {
|
|
59
|
+
import { extractZodKeys } from './SelectUtils.js';
|
|
60
60
|
import { defaultSerializer } from '../core/serialization/JsonSerializer.js';
|
|
61
61
|
import { compileRedactor } from './RedactEngine.js';
|
|
62
|
+
import { executePipeline, stepValidate, } from './PresenterPipeline.js';
|
|
63
|
+
import { evaluateRules } from './PromptFirewall.js';
|
|
62
64
|
// ── Brand ────────────────────────────────────────────────
|
|
63
65
|
const PRESENTER_BRAND = 'VurbPresenter';
|
|
64
66
|
/**
|
|
@@ -102,13 +104,20 @@ export class Presenter {
|
|
|
102
104
|
_itemUiBlocks;
|
|
103
105
|
_collectionUiBlocks;
|
|
104
106
|
_suggestActions;
|
|
107
|
+
_collectionSuggestActions;
|
|
105
108
|
_agentLimit;
|
|
106
109
|
_embeds = [];
|
|
107
110
|
_sealed = false;
|
|
111
|
+
_collectionRules = [];
|
|
108
112
|
_compiledStringify;
|
|
109
113
|
_compiledRedactor;
|
|
110
114
|
_redactConfig;
|
|
111
115
|
_redactPaths = [];
|
|
116
|
+
_asyncItemUiBlocks;
|
|
117
|
+
_asyncCollectionUiBlocks;
|
|
118
|
+
_asyncRules;
|
|
119
|
+
_asyncSuggestActions;
|
|
120
|
+
_promptFirewall;
|
|
112
121
|
/** @internal Use {@link createPresenter} factory instead */
|
|
113
122
|
constructor(name) {
|
|
114
123
|
this.name = name;
|
|
@@ -271,6 +280,36 @@ export class Presenter {
|
|
|
271
280
|
this._suggestActions = fn;
|
|
272
281
|
return this;
|
|
273
282
|
}
|
|
283
|
+
/**
|
|
284
|
+
* Define HATEOAS-style action suggestions for **collections**.
|
|
285
|
+
*
|
|
286
|
+
* Unlike `.suggestActions()`, this callback receives the **entire array**
|
|
287
|
+
* of validated items, enabling aggregate-level suggestions like batch
|
|
288
|
+
* operations, bulk approvals, or summary insights.
|
|
289
|
+
*
|
|
290
|
+
* When both `.suggestActions()` and `.collectionSuggestActions()` are set,
|
|
291
|
+
* only collectionSuggestActions is used for arrays.
|
|
292
|
+
*
|
|
293
|
+
* @param fn - `(items[], ctx?) => (ActionSuggestion | null)[]`
|
|
294
|
+
* @returns `this` for chaining
|
|
295
|
+
*
|
|
296
|
+
* @example
|
|
297
|
+
* ```typescript
|
|
298
|
+
* .collectionSuggestActions((invoices) => [
|
|
299
|
+
* invoices.some(i => i.status === 'overdue')
|
|
300
|
+
* ? { tool: 'billing.batch_remind', reason: 'Send batch reminders' }
|
|
301
|
+
* : null,
|
|
302
|
+
* invoices.length > 100
|
|
303
|
+
* ? { tool: 'billing.export', reason: 'Export results for offline review' }
|
|
304
|
+
* : null,
|
|
305
|
+
* ])
|
|
306
|
+
* ```
|
|
307
|
+
*/
|
|
308
|
+
collectionSuggestActions(fn) {
|
|
309
|
+
this._assertNotSealed();
|
|
310
|
+
this._collectionSuggestActions = fn;
|
|
311
|
+
return this;
|
|
312
|
+
}
|
|
274
313
|
// ── Fluent Aliases ───────────────────────────────────
|
|
275
314
|
/**
|
|
276
315
|
* Alias for `.suggestActions()` — fluent shorthand.
|
|
@@ -296,6 +335,15 @@ export class Presenter {
|
|
|
296
335
|
suggest(fn) {
|
|
297
336
|
return this.suggestActions(fn);
|
|
298
337
|
}
|
|
338
|
+
/**
|
|
339
|
+
* Alias for `.collectionSuggestActions()` — fluent shorthand.
|
|
340
|
+
*
|
|
341
|
+
* @param fn - `(items[], ctx?) => (ActionSuggestion | null)[]`
|
|
342
|
+
* @returns `this` for chaining
|
|
343
|
+
*/
|
|
344
|
+
collectionSuggest(fn) {
|
|
345
|
+
return this.collectionSuggestActions(fn);
|
|
346
|
+
}
|
|
299
347
|
/**
|
|
300
348
|
* Alias for `.systemRules()` — fluent shorthand.
|
|
301
349
|
*
|
|
@@ -313,6 +361,33 @@ export class Presenter {
|
|
|
313
361
|
rules(rules) {
|
|
314
362
|
return this.systemRules(rules);
|
|
315
363
|
}
|
|
364
|
+
/**
|
|
365
|
+
* Set collection-level system rules.
|
|
366
|
+
*
|
|
367
|
+
* Unlike `.systemRules()`, these rules are evaluated with the **entire
|
|
368
|
+
* array** of validated items. Use for aggregate context (totals, counts,
|
|
369
|
+
* mixed-status warnings) that cannot be derived from a single item.
|
|
370
|
+
*
|
|
371
|
+
* Both per-item and collection rules are merged in the response.
|
|
372
|
+
*
|
|
373
|
+
* @param rules - Static rules array, or dynamic `(items[], ctx?) => (string | null)[]`
|
|
374
|
+
* @returns `this` for chaining
|
|
375
|
+
*
|
|
376
|
+
* @example
|
|
377
|
+
* ```typescript
|
|
378
|
+
* .collectionRules((invoices, ctx) => [
|
|
379
|
+
* `Total: ${invoices.length} invoices found.`,
|
|
380
|
+
* invoices.some(i => i.status === 'overdue')
|
|
381
|
+
* ? '⚠️ Some invoices are OVERDUE. Highlight them.'
|
|
382
|
+
* : null,
|
|
383
|
+
* ])
|
|
384
|
+
* ```
|
|
385
|
+
*/
|
|
386
|
+
collectionRules(rules) {
|
|
387
|
+
this._assertNotSealed();
|
|
388
|
+
this._collectionRules = rules;
|
|
389
|
+
return this;
|
|
390
|
+
}
|
|
316
391
|
/**
|
|
317
392
|
* Alias for `.uiBlocks()` — fluent shorthand.
|
|
318
393
|
*
|
|
@@ -527,6 +602,86 @@ export class Presenter {
|
|
|
527
602
|
return [];
|
|
528
603
|
return this._rules;
|
|
529
604
|
}
|
|
605
|
+
// ── Async Configuration ──────────────────────────────
|
|
606
|
+
/**
|
|
607
|
+
* Register an **async** UI block callback for single items.
|
|
608
|
+
*
|
|
609
|
+
* Use when UI generation requires I/O (database, API, file system).
|
|
610
|
+
* Must be consumed via `makeAsync()` — `make()` ignores async callbacks.
|
|
611
|
+
*
|
|
612
|
+
* @param fn - Async function receiving validated data + optional context
|
|
613
|
+
* @returns `this` for chaining
|
|
614
|
+
*
|
|
615
|
+
* @example
|
|
616
|
+
* ```typescript
|
|
617
|
+
* createPresenter('Invoice')
|
|
618
|
+
* .asyncUiBlocks(async (inv, ctx) => {
|
|
619
|
+
* const history = await ctx.db.payments.history(inv.id);
|
|
620
|
+
* return [ui.echarts(buildTimeline(history))];
|
|
621
|
+
* });
|
|
622
|
+
* ```
|
|
623
|
+
*/
|
|
624
|
+
asyncUiBlocks(fn) {
|
|
625
|
+
this._asyncItemUiBlocks = fn;
|
|
626
|
+
return this;
|
|
627
|
+
}
|
|
628
|
+
/**
|
|
629
|
+
* Register an **async** UI block callback for collections.
|
|
630
|
+
*
|
|
631
|
+
* @param fn - Async function receiving the full validated array + optional context
|
|
632
|
+
* @returns `this` for chaining
|
|
633
|
+
*/
|
|
634
|
+
asyncCollectionUiBlocks(fn) {
|
|
635
|
+
this._asyncCollectionUiBlocks = fn;
|
|
636
|
+
return this;
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* Register **async** system rules generation.
|
|
640
|
+
*
|
|
641
|
+
* @param fn - Async function receiving validated data + optional context
|
|
642
|
+
* @returns `this` for chaining
|
|
643
|
+
*/
|
|
644
|
+
asyncRules(fn) {
|
|
645
|
+
this._asyncRules = fn;
|
|
646
|
+
return this;
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* Register **async** action suggestions generation.
|
|
650
|
+
*
|
|
651
|
+
* @param fn - Async function receiving validated data + optional context
|
|
652
|
+
* @returns `this` for chaining
|
|
653
|
+
*/
|
|
654
|
+
asyncSuggestActions(fn) {
|
|
655
|
+
this._asyncSuggestActions = fn;
|
|
656
|
+
return this;
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* Enable LLM-as-Judge evaluation of dynamic system rules.
|
|
660
|
+
*
|
|
661
|
+
* The PromptFirewall evaluates all resolved rules (sync + async)
|
|
662
|
+
* through a judge chain before they reach the LLM. This prevents
|
|
663
|
+
* prompt injection via tainted data interpolated in `.systemRules()`.
|
|
664
|
+
*
|
|
665
|
+
* **Important:** Presenters with a firewall MUST use `makeAsync()`.
|
|
666
|
+
* Calling `make()` will throw an error.
|
|
667
|
+
*
|
|
668
|
+
* @param config - Firewall configuration (adapter or chain)
|
|
669
|
+
* @returns `this` for chaining
|
|
670
|
+
*
|
|
671
|
+
* @example
|
|
672
|
+
* ```typescript
|
|
673
|
+
* createPresenter('Invoice')
|
|
674
|
+
* .systemRules((inv) => [`Status: ${inv.description}`])
|
|
675
|
+
* .promptFirewall({
|
|
676
|
+
* adapter: { name: 'gpt-4o-mini', evaluate: (p) => openai.chat(p) },
|
|
677
|
+
* });
|
|
678
|
+
* ```
|
|
679
|
+
*/
|
|
680
|
+
promptFirewall(config) {
|
|
681
|
+
this._assertNotSealed();
|
|
682
|
+
this._promptFirewall = config;
|
|
683
|
+
return this;
|
|
684
|
+
}
|
|
530
685
|
// ── Execution ────────────────────────────────────────
|
|
531
686
|
/**
|
|
532
687
|
* Compose a {@link ResponseBuilder} from raw data.
|
|
@@ -565,178 +720,134 @@ export class Presenter {
|
|
|
565
720
|
* ```
|
|
566
721
|
*/
|
|
567
722
|
make(data, ctx, selectFields) {
|
|
723
|
+
// Guard: PromptFirewall requires makeAsync()
|
|
724
|
+
if (this._promptFirewall) {
|
|
725
|
+
throw new Error(`Presenter "${this.name}" has a PromptFirewall configured. ` +
|
|
726
|
+
`Use makeAsync() instead of make(). The firewall requires async ` +
|
|
727
|
+
`evaluation to filter system rules through the LLM judge.`);
|
|
728
|
+
}
|
|
568
729
|
// Seal on first use — configuration is frozen from here
|
|
569
730
|
this._sealed = true;
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
let truncationBlock;
|
|
573
|
-
if (isArray && this._agentLimit && data.length > this._agentLimit.max) {
|
|
574
|
-
const fullLength = data.length;
|
|
575
|
-
const omitted = fullLength - this._agentLimit.max;
|
|
576
|
-
data = data.slice(0, this._agentLimit.max);
|
|
577
|
-
truncationBlock = this._agentLimit.onTruncate(omitted);
|
|
578
|
-
}
|
|
579
|
-
// Step 1: Process embedded child Presenters (on RAW data, before validation)
|
|
580
|
-
// Embeds access relational keys (e.g. `client`) that the parent schema
|
|
581
|
-
// may not include — so they must run on pre-validation data.
|
|
582
|
-
const rawForEmbeds = data;
|
|
583
|
-
// Step 2: Validate — produces the FULL validated data
|
|
584
|
-
const validated = this._validate(data, isArray);
|
|
585
|
-
// ── Late Guillotine ──────────────────────────────────
|
|
586
|
-
// Steps 3-6 use the FULL validated data so that UI blocks,
|
|
587
|
-
// system rules, and action suggestions never see undefined
|
|
588
|
-
// for pruned fields (e.g. a chart using 'revenue' won't break
|
|
589
|
-
// if the AI only selected 'status').
|
|
590
|
-
//
|
|
591
|
-
// The _select filter is applied ONLY to the wire-facing data
|
|
592
|
-
// block in the ResponseBuilder — the last step before serialization.
|
|
593
|
-
// Step 3: Determine wire-facing data (filtered or full)
|
|
594
|
-
const wireData = (selectFields && selectFields.length > 0)
|
|
595
|
-
? applySelectFilter(validated, selectFields, isArray)
|
|
596
|
-
: validated;
|
|
597
|
-
// Step 3.1: DLP Redaction — mask PII on the wire-facing data
|
|
598
|
-
// Uses structuredClone so UI blocks/rules still see full data.
|
|
599
|
-
const safeWireData = this._applyRedaction(wireData, isArray);
|
|
600
|
-
const builder = new ResponseBuilder(safeWireData, this._compiledStringify);
|
|
601
|
-
// Step 3.5: Truncation warning (first UI block, before all others)
|
|
602
|
-
if (truncationBlock) {
|
|
603
|
-
builder.uiBlock(truncationBlock);
|
|
604
|
-
}
|
|
605
|
-
// Step 4: Merge embedded child Presenter blocks (using FULL data)
|
|
606
|
-
this._processEmbeds(builder, rawForEmbeds, isArray, ctx);
|
|
607
|
-
// Step 5: Attach UI blocks (using FULL validated data)
|
|
608
|
-
this._attachUiBlocks(builder, validated, isArray, ctx);
|
|
609
|
-
// Step 6: Attach rules (using FULL validated data)
|
|
610
|
-
this._attachRules(builder, validated, isArray, ctx);
|
|
611
|
-
// Step 7: Attach action suggestions (using FULL validated data)
|
|
612
|
-
this._attachSuggestions(builder, validated, isArray, ctx);
|
|
613
|
-
return builder;
|
|
731
|
+
// Delegate entirely to the decomposed pipeline
|
|
732
|
+
return executePipeline(data, this._toSnapshot(), ctx, selectFields);
|
|
614
733
|
}
|
|
615
|
-
// ──
|
|
734
|
+
// ── Async Make ───────────────────────────────────────
|
|
616
735
|
/**
|
|
617
|
-
*
|
|
618
|
-
*
|
|
619
|
-
*
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
if (!this._compiledRedactor && this._redactConfig) {
|
|
625
|
-
this._compiledRedactor = compileRedactor(this._redactConfig);
|
|
626
|
-
if (!this._compiledRedactor) {
|
|
627
|
-
console.warn(`[vurb] Presenter "${this.name}": PII redaction configured but fast-redact is not available. ` +
|
|
628
|
-
`Data will pass through WITHOUT redaction. Ensure initVurb() completes before .make() is called, ` +
|
|
629
|
-
`or install fast-redact as a dependency.`);
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
if (!this._compiledRedactor)
|
|
633
|
-
return data;
|
|
634
|
-
if (isArray) {
|
|
635
|
-
return data.map(item => this._compiledRedactor(item));
|
|
636
|
-
}
|
|
637
|
-
return this._compiledRedactor(data);
|
|
638
|
-
}
|
|
639
|
-
/**
|
|
640
|
-
* Validate data through the Zod schema (if configured).
|
|
641
|
-
* For arrays, each item is validated independently.
|
|
642
|
-
* @internal
|
|
736
|
+
* Check if this Presenter has any async callbacks configured.
|
|
737
|
+
*
|
|
738
|
+
* Used by the pipeline to decide between sync `make()` and async
|
|
739
|
+
* `makeAsync()`. When no async callbacks are set, `makeAsync()` is
|
|
740
|
+
* equivalent to `Promise.resolve(make())`, so the sync path is preferred.
|
|
741
|
+
*
|
|
742
|
+
* @returns `true` if any async callback is configured
|
|
643
743
|
*/
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
if (isArray) {
|
|
649
|
-
return data.map(item => this._schema.parse(item));
|
|
650
|
-
}
|
|
651
|
-
return this._schema.parse(data);
|
|
652
|
-
}
|
|
653
|
-
catch (err) {
|
|
654
|
-
if (err instanceof ZodError) {
|
|
655
|
-
throw new PresenterValidationError(this.name, err);
|
|
656
|
-
}
|
|
657
|
-
throw err;
|
|
658
|
-
}
|
|
744
|
+
hasAsyncCallbacks() {
|
|
745
|
+
return !!(this._asyncItemUiBlocks || this._asyncCollectionUiBlocks
|
|
746
|
+
|| this._asyncRules || this._asyncSuggestActions
|
|
747
|
+
|| this._promptFirewall);
|
|
659
748
|
}
|
|
660
749
|
/**
|
|
661
|
-
*
|
|
662
|
-
*
|
|
663
|
-
*
|
|
750
|
+
* Async version of `make()` — enriches the response with async callbacks.
|
|
751
|
+
*
|
|
752
|
+
* Runs all sync steps first (via `make()`), then awaits async callbacks
|
|
753
|
+
* and appends their results to the builder. The sync `make()` method
|
|
754
|
+
* remains unchanged (zero breaking changes).
|
|
755
|
+
*
|
|
756
|
+
* @param data - Raw data from the handler (object or array)
|
|
757
|
+
* @param ctx - Optional request context
|
|
758
|
+
* @param selectFields - Optional top-level field names for context window optimization
|
|
759
|
+
* @returns A Promise resolving to a {@link ResponseBuilder}
|
|
760
|
+
*
|
|
761
|
+
* @example
|
|
762
|
+
* ```typescript
|
|
763
|
+
* const presenter = createPresenter('Invoice')
|
|
764
|
+
* .schema(invoiceSchema)
|
|
765
|
+
* .asyncUiBlocks(async (inv, ctx) => {
|
|
766
|
+
* const history = await ctx.db.payments.history(inv.id);
|
|
767
|
+
* return [ui.echarts(buildTimeline(history))];
|
|
768
|
+
* });
|
|
769
|
+
*
|
|
770
|
+
* // In handler:
|
|
771
|
+
* const builder = await presenter.makeAsync(data, ctx);
|
|
772
|
+
* return builder.build();
|
|
773
|
+
* ```
|
|
664
774
|
*/
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
775
|
+
async makeAsync(data, ctx, selectFields) {
|
|
776
|
+
// Step 1: Run all sync steps (via pipeline)
|
|
777
|
+
// Bypass the make() guard for firewall-enabled presenters
|
|
778
|
+
this._sealed = true;
|
|
779
|
+
const builder = executePipeline(data, this._toSnapshot(), ctx, selectFields);
|
|
780
|
+
// Step 2: Async enrichment — append after sync blocks
|
|
781
|
+
const isArray = Array.isArray(data);
|
|
782
|
+
// Re-validate to get the validated data for async callbacks
|
|
783
|
+
const validated = stepValidate(data, isArray, this._toSnapshot());
|
|
784
|
+
// Async UI blocks
|
|
785
|
+
if (isArray && this._asyncCollectionUiBlocks) {
|
|
786
|
+
const blocks = await this._asyncCollectionUiBlocks(validated, ctx);
|
|
787
|
+
const filtered = blocks.filter(Boolean);
|
|
788
|
+
if (filtered.length > 0)
|
|
789
|
+
builder.uiBlocks(filtered);
|
|
670
790
|
}
|
|
671
|
-
else if (!isArray && this.
|
|
672
|
-
const blocks = this.
|
|
673
|
-
|
|
674
|
-
|
|
791
|
+
else if (!isArray && this._asyncItemUiBlocks) {
|
|
792
|
+
const blocks = await this._asyncItemUiBlocks(validated, ctx);
|
|
793
|
+
const filtered = blocks.filter(Boolean);
|
|
794
|
+
if (filtered.length > 0)
|
|
795
|
+
builder.uiBlocks(filtered);
|
|
675
796
|
}
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
* Supports both static arrays and dynamic context-aware functions.
|
|
680
|
-
* Filters `null` rules automatically.
|
|
681
|
-
* @internal
|
|
682
|
-
*/
|
|
683
|
-
_attachRules(builder, data, isArray, ctx) {
|
|
684
|
-
if (typeof this._rules === 'function') {
|
|
685
|
-
// Dynamic rules — resolve with data and context
|
|
686
|
-
const singleData = isArray ? data[0] : data;
|
|
797
|
+
// Async rules
|
|
798
|
+
if (this._asyncRules) {
|
|
799
|
+
const singleData = isArray ? validated[0] : validated;
|
|
687
800
|
if (singleData !== undefined) {
|
|
688
|
-
const
|
|
689
|
-
|
|
690
|
-
if (
|
|
691
|
-
builder.systemRules(
|
|
801
|
+
const rules = await this._asyncRules(singleData, ctx);
|
|
802
|
+
const filtered = rules.filter((r) => r !== null);
|
|
803
|
+
if (filtered.length > 0)
|
|
804
|
+
builder.systemRules(filtered);
|
|
692
805
|
}
|
|
693
806
|
}
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
807
|
+
// Async suggestions
|
|
808
|
+
if (this._asyncSuggestActions) {
|
|
809
|
+
const singleData = isArray ? validated[0] : validated;
|
|
810
|
+
if (singleData !== undefined) {
|
|
811
|
+
const suggestions = await this._asyncSuggestActions(singleData, ctx);
|
|
812
|
+
const filtered = suggestions.filter((s) => s !== null);
|
|
813
|
+
if (filtered.length > 0)
|
|
814
|
+
builder.systemHint(filtered);
|
|
815
|
+
}
|
|
697
816
|
}
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
if (!this._suggestActions)
|
|
706
|
-
return;
|
|
707
|
-
// For collections, evaluate suggestions on the first item (or skip)
|
|
708
|
-
const singleData = isArray ? data[0] : data;
|
|
709
|
-
if (singleData === undefined)
|
|
710
|
-
return;
|
|
711
|
-
const suggestions = this._suggestActions(singleData, ctx);
|
|
712
|
-
if (suggestions.length > 0) {
|
|
713
|
-
builder.systemHint(suggestions);
|
|
817
|
+
// Step 3: PromptFirewall — filter ALL accumulated rules via LLM judge
|
|
818
|
+
if (this._promptFirewall) {
|
|
819
|
+
const currentRules = builder.getRules();
|
|
820
|
+
if (currentRules.length > 0) {
|
|
821
|
+
const verdict = await evaluateRules(currentRules, this._promptFirewall);
|
|
822
|
+
builder.replaceRules(verdict.allowed);
|
|
823
|
+
}
|
|
714
824
|
}
|
|
825
|
+
return builder;
|
|
715
826
|
}
|
|
827
|
+
// ── Pipeline Snapshot ─────────────────────────────────
|
|
716
828
|
/**
|
|
717
|
-
*
|
|
718
|
-
*
|
|
829
|
+
* Create a read-only snapshot of the Presenter's configuration
|
|
830
|
+
* for use by the decomposed pipeline steps.
|
|
831
|
+
*
|
|
832
|
+
* @returns A {@link PresenterSnapshot} capturing the current config
|
|
719
833
|
* @internal
|
|
720
834
|
*/
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
builder.rawBlock(childResponse.content[i].text);
|
|
738
|
-
}
|
|
739
|
-
}
|
|
835
|
+
_toSnapshot() {
|
|
836
|
+
return {
|
|
837
|
+
name: this.name,
|
|
838
|
+
schema: this._schema,
|
|
839
|
+
rules: this._rules,
|
|
840
|
+
collectionRules: this._collectionRules,
|
|
841
|
+
itemUiBlocks: this._itemUiBlocks,
|
|
842
|
+
collectionUiBlocks: this._collectionUiBlocks,
|
|
843
|
+
suggestActions: this._suggestActions,
|
|
844
|
+
collectionSuggestActions: this._collectionSuggestActions,
|
|
845
|
+
agentLimit: this._agentLimit,
|
|
846
|
+
embeds: this._embeds,
|
|
847
|
+
redactConfig: this._redactConfig,
|
|
848
|
+
compiledRedactor: this._compiledRedactor,
|
|
849
|
+
compiledStringify: this._compiledStringify,
|
|
850
|
+
};
|
|
740
851
|
}
|
|
741
852
|
}
|
|
742
853
|
// ── Factory ──────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Presenter.js","sourceRoot":"","sources":["../../src/presenter/Presenter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,OAAO,EAAE,CAAC,EAAE,OAAO,EAAoB,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAgB,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Presenter.js","sourceRoot":"","sources":["../../src/presenter/Presenter.ts"],"names":[],"mappings":"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"}
|