@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.
Files changed (107) hide show
  1. package/README.md +677 -677
  2. package/dist/cli/constants.js +59 -59
  3. package/dist/cli/templates/config.js +26 -26
  4. package/dist/cli/templates/constants.d.ts +1 -1
  5. package/dist/cli/templates/constants.d.ts.map +1 -1
  6. package/dist/cli/templates/constants.js +1 -1
  7. package/dist/cli/templates/constants.js.map +1 -1
  8. package/dist/cli/templates/core.d.ts.map +1 -1
  9. package/dist/cli/templates/core.js +96 -169
  10. package/dist/cli/templates/core.js.map +1 -1
  11. package/dist/cli/templates/middleware.js +25 -25
  12. package/dist/cli/templates/readme.js +142 -142
  13. package/dist/cli/templates/testing.js +84 -84
  14. package/dist/cli/templates/tools.js +46 -46
  15. package/dist/cli/templates/vectors/database.js +69 -69
  16. package/dist/cli/templates/vectors/oauth.js +63 -63
  17. package/dist/cli/templates/vectors/openapi.js +97 -97
  18. package/dist/core/middleware/AuditTrail.d.ts +128 -0
  19. package/dist/core/middleware/AuditTrail.d.ts.map +1 -0
  20. package/dist/core/middleware/AuditTrail.js +94 -0
  21. package/dist/core/middleware/AuditTrail.js.map +1 -0
  22. package/dist/core/middleware/InputFirewall.d.ts +95 -0
  23. package/dist/core/middleware/InputFirewall.d.ts.map +1 -0
  24. package/dist/core/middleware/InputFirewall.js +104 -0
  25. package/dist/core/middleware/InputFirewall.js.map +1 -0
  26. package/dist/core/middleware/RateLimiter.d.ts +151 -0
  27. package/dist/core/middleware/RateLimiter.d.ts.map +1 -0
  28. package/dist/core/middleware/RateLimiter.js +121 -0
  29. package/dist/core/middleware/RateLimiter.js.map +1 -0
  30. package/dist/core/middleware/index.d.ts +6 -0
  31. package/dist/core/middleware/index.d.ts.map +1 -1
  32. package/dist/core/middleware/index.js +4 -0
  33. package/dist/core/middleware/index.js.map +1 -1
  34. package/dist/index.d.ts +28 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +15 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/introspection/SemanticProbe.js +49 -49
  39. package/dist/observability/TelemetryEvent.d.ts +61 -1
  40. package/dist/observability/TelemetryEvent.d.ts.map +1 -1
  41. package/dist/presenter/JudgeChain.d.ts +129 -0
  42. package/dist/presenter/JudgeChain.d.ts.map +1 -0
  43. package/dist/presenter/JudgeChain.js +215 -0
  44. package/dist/presenter/JudgeChain.js.map +1 -0
  45. package/dist/presenter/PostProcessor.d.ts.map +1 -1
  46. package/dist/presenter/PostProcessor.js +11 -66
  47. package/dist/presenter/PostProcessor.js.map +1 -1
  48. package/dist/presenter/Presenter.d.ts +175 -37
  49. package/dist/presenter/Presenter.d.ts.map +1 -1
  50. package/dist/presenter/Presenter.js +265 -154
  51. package/dist/presenter/Presenter.js.map +1 -1
  52. package/dist/presenter/PresenterPipeline.d.ts +147 -0
  53. package/dist/presenter/PresenterPipeline.d.ts.map +1 -0
  54. package/dist/presenter/PresenterPipeline.js +271 -0
  55. package/dist/presenter/PresenterPipeline.js.map +1 -0
  56. package/dist/presenter/PromptFirewall.d.ts +160 -0
  57. package/dist/presenter/PromptFirewall.d.ts.map +1 -0
  58. package/dist/presenter/PromptFirewall.js +228 -0
  59. package/dist/presenter/PromptFirewall.js.map +1 -0
  60. package/dist/presenter/ResponseBuilder.d.ts +13 -0
  61. package/dist/presenter/ResponseBuilder.d.ts.map +1 -1
  62. package/dist/presenter/ResponseBuilder.js +28 -1
  63. package/dist/presenter/ResponseBuilder.js.map +1 -1
  64. package/dist/presenter/TelemetryCollector.d.ts +48 -0
  65. package/dist/presenter/TelemetryCollector.d.ts.map +1 -0
  66. package/dist/presenter/TelemetryCollector.js +93 -0
  67. package/dist/presenter/TelemetryCollector.js.map +1 -0
  68. package/dist/presenter/definePresenter.d.ts +112 -0
  69. package/dist/presenter/definePresenter.d.ts.map +1 -1
  70. package/dist/presenter/definePresenter.js +110 -0
  71. package/dist/presenter/definePresenter.js.map +1 -1
  72. package/dist/presenter/index.d.ts +6 -2
  73. package/dist/presenter/index.d.ts.map +1 -1
  74. package/dist/presenter/index.js +5 -1
  75. package/dist/presenter/index.js.map +1 -1
  76. package/dist/presenter/ui.d.ts +31 -8
  77. package/dist/presenter/ui.d.ts.map +1 -1
  78. package/dist/presenter/ui.js +16 -16
  79. package/dist/presenter/ui.js.map +1 -1
  80. package/dist/prompt/FluentPromptBuilder.d.ts.map +1 -1
  81. package/dist/resource/ResourceBuilder.d.ts +129 -0
  82. package/dist/resource/ResourceBuilder.d.ts.map +1 -0
  83. package/dist/resource/ResourceBuilder.js +93 -0
  84. package/dist/resource/ResourceBuilder.js.map +1 -0
  85. package/dist/resource/ResourceRegistry.d.ts +147 -0
  86. package/dist/resource/ResourceRegistry.d.ts.map +1 -0
  87. package/dist/resource/ResourceRegistry.js +234 -0
  88. package/dist/resource/ResourceRegistry.js.map +1 -0
  89. package/dist/resource/SubscriptionManager.d.ts +67 -0
  90. package/dist/resource/SubscriptionManager.d.ts.map +1 -0
  91. package/dist/resource/SubscriptionManager.js +86 -0
  92. package/dist/resource/SubscriptionManager.js.map +1 -0
  93. package/dist/resource/index.d.ts +13 -0
  94. package/dist/resource/index.d.ts.map +1 -0
  95. package/dist/resource/index.js +13 -0
  96. package/dist/resource/index.js.map +1 -0
  97. package/dist/server/ServerAttachment.d.ts +26 -0
  98. package/dist/server/ServerAttachment.d.ts.map +1 -1
  99. package/dist/server/ServerAttachment.js +70 -2
  100. package/dist/server/ServerAttachment.js.map +1 -1
  101. package/dist/server/index.d.ts +1 -1
  102. package/dist/server/index.d.ts.map +1 -1
  103. package/dist/server/startServer.d.ts +22 -1
  104. package/dist/server/startServer.d.ts.map +1 -1
  105. package/dist/server/startServer.js +98 -5
  106. package/dist/server/startServer.js.map +1 -1
  107. 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 { applySelectFilter, extractZodKeys } from './SelectUtils.js';
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
- const isArray = Array.isArray(data);
571
- // Step 0: Cognitive Guardrails — truncate if needed
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
- // ── Private Decomposed Steps ─────────────────────────
734
+ // ── Async Make ───────────────────────────────────────
616
735
  /**
617
- * Apply PII redaction to wire-facing data.
618
- * Creates a deep clone to preserve original data for UI/rules.
619
- * @internal
620
- */
621
- _applyRedaction(data, isArray) {
622
- // Lazy recompilation: if redactPII was called before fast-redact loaded
623
- // (e.g., top-level Presenter declared before initVurb()), retry now.
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
- _validate(data, isArray) {
645
- if (!this._schema)
646
- return data;
647
- try {
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
- * Generate and attach UI blocks to the response builder.
662
- * Auto-detects single vs collection. Filters `null` blocks.
663
- * @internal
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
- _attachUiBlocks(builder, data, isArray, ctx) {
666
- if (isArray && this._collectionUiBlocks) {
667
- const blocks = this._collectionUiBlocks(data, ctx).filter(Boolean);
668
- if (blocks.length > 0)
669
- builder.uiBlocks(blocks);
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._itemUiBlocks) {
672
- const blocks = this._itemUiBlocks(data, ctx).filter(Boolean);
673
- if (blocks.length > 0)
674
- builder.uiBlocks(blocks);
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
- * Resolve and attach domain rules to the response builder.
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 resolved = this._rules(singleData, ctx)
689
- .filter((r) => r !== null);
690
- if (resolved.length > 0)
691
- builder.systemRules(resolved);
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
- else if (this._rules.length > 0) {
695
- // Static rules — pass directly
696
- builder.systemRules(this._rules);
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
- * Evaluate and attach action suggestions to the response.
701
- * Generates a `[SYSTEM HINT]` block with recommended next tools.
702
- * @internal
703
- */
704
- _attachSuggestions(builder, data, isArray, ctx) {
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
- * Process embedded child Presenters for nested relational data.
718
- * Merges child UI blocks and rules into the parent builder.
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
- _processEmbeds(builder, data, isArray, ctx) {
722
- if (this._embeds.length === 0)
723
- return;
724
- const singleData = isArray ? data[0] : data;
725
- if (singleData === undefined || typeof singleData !== 'object')
726
- return;
727
- for (const embed of this._embeds) {
728
- const nestedData = singleData[embed.key];
729
- if (nestedData === undefined || nestedData === null)
730
- continue;
731
- // Run the child Presenter and extract its blocks
732
- const childBuilder = embed.presenter.make(nestedData, ctx);
733
- const childResponse = childBuilder.build();
734
- // Skip the first block (data) — parent already has it
735
- // Merge remaining blocks (UI, rules, hints) into the parent
736
- for (let i = 1; i < childResponse.content.length; i++) {
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":"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"}
1
+ {"version":3,"file":"Presenter.js","sourceRoot":"","sources":["../../src/presenter/Presenter.ts"],"names":[],"mappings":"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"}