@sentientui/core 0.25.0 → 0.27.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/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{A as T,B as U,a as t,b as u,c as v,d as w,e as x,f as y,g as z,h as A,i as B,j as C,k as D,l as E,m as F,n as G,o as H,p as I,q as J,r as K,s as L,t as M,u as N,v as O,w as P,x as Q,y as R,z as S}from"./chunk-RL5B6M4G.mjs";import{b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i,k as j,l as k,m as l,n as m,o as n,p as o,r as p,s as q,t as r,u as s}from"./chunk-2NVSFI4V.mjs";import"./chunk-TMCGHANO.mjs";export{f as AGENT_INTENTS,A as BLOCK_ALIGNS,F as BLOCK_EMPHASES,I as BLOCK_FITS,z as BLOCK_GAPS,J as BLOCK_GRID_COLUMNS,K as BLOCK_HEADING_LEVELS,B as BLOCK_JUSTIFIES,H as BLOCK_RATIOS,C as BLOCK_SIZES,G as BLOCK_TEXT_ALIGNS,E as BLOCK_TONES,D as BLOCK_WEIGHTS,l as CLICK_ID_KEYS,a as LEGACY_SESSION_COOKIE_NAME,y as LOCAL_MODE_BANNER,O as MAX_BLOCK_ARMS,N as MAX_BLOCK_CHILDREN,M as MAX_BLOCK_DEPTH,L as MAX_BLOCK_NODES,P as MAX_BLOCK_TEXT_LEN,x as PROD_KEYLESS_ERROR,t as SNAPSHOT_STORAGE_KEY_PREFIX,R as _registerConsentUpgradeInit,g as agentIntent,c as agentUaList,s as armOfResult,Q as attachMicroSignalDetectors,q as baselineResultFor,r as baselineSlots,h as classifiedAgents,o as deriveSessionSegment,i as detectDeviceClass,n as detectTimeOfDay,j as detectTrafficSource,m as extractTrackedParams,T as grantConsent,U as init,S as isDoNotTrackEnabled,e as matchedAgentToken,u as readSnapshot,k as referrerDomainFromReferer,w as renderPrePaintScript,b as sessionCookieName,p as toWireSlot,d as uaTokenMatch,v as writeSnapshot};
1
+ import{A as T,B as U,C as V,D as W,E as X,F as Y,G as Z,a as t,b as u,c as v,d as w,e as x,f as y,g as z,h as A,i as B,j as C,k as D,l as E,m as F,n as G,o as H,p as I,q as J,r as K,s as L,t as M,u as N,v as O,w as P,x as Q,y as R,z as S}from"./chunk-TRBPPGFT.mjs";import{b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i,k as j,l as k,m as l,n as m,o as n,p as o,r as p,s as q,t as r,u as s}from"./chunk-2NVSFI4V.mjs";import"./chunk-TMCGHANO.mjs";export{f as AGENT_INTENTS,A as BLOCK_ALIGNS,F as BLOCK_EMPHASES,I as BLOCK_FITS,z as BLOCK_GAPS,J as BLOCK_GRID_COLUMNS,K as BLOCK_HEADING_LEVELS,B as BLOCK_JUSTIFIES,H as BLOCK_RATIOS,C as BLOCK_SIZES,G as BLOCK_TEXT_ALIGNS,E as BLOCK_TONES,D as BLOCK_WEIGHTS,l as CLICK_ID_KEYS,L as FORM_FIELD_KINDS,M as FORM_INPUT_TYPES,a as LEGACY_SESSION_COOKIE_NAME,y as LOCAL_MODE_BANNER,S as MAX_BLOCK_ARMS,R as MAX_BLOCK_CHILDREN,Q as MAX_BLOCK_DEPTH,P as MAX_BLOCK_NODES,T as MAX_BLOCK_TEXT_LEN,N as MAX_FORM_FIELDS,O as MAX_FORM_SELECT_OPTIONS,x as PROD_KEYLESS_ERROR,t as SNAPSHOT_STORAGE_KEY_PREFIX,W as _registerConsentUpgradeInit,g as agentIntent,c as agentUaList,s as armOfResult,V as attachMicroSignalDetectors,q as baselineResultFor,r as baselineSlots,h as classifiedAgents,U as containsFormBlock,o as deriveSessionSegment,i as detectDeviceClass,n as detectTimeOfDay,j as detectTrafficSource,m as extractTrackedParams,Y as grantConsent,Z as init,X as isDoNotTrackEnabled,e as matchedAgentToken,u as readSnapshot,k as referrerDomainFromReferer,w as renderPrePaintScript,b as sessionCookieName,p as toWireSlot,d as uaTokenMatch,v as writeSnapshot};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,378 @@
1
+ import { SlotResult, SlotDecl } from '@sentientui/policy';
2
+
3
+ /**
4
+ * Composition Blocks (spec: 2026-08-20-nocode-composition-variants-design.md §4).
5
+ *
6
+ * A bounded, TYPED component tree — never HTML — that a registry arm may carry
7
+ * (`published_config.arms[].blocks`). The vocabulary is the whitelist: every
8
+ * prop value is an enumerated token, validated server-side before publish
9
+ * (apps/api/src/domain/composition-blocks.ts) and rendered client-side through
10
+ * document.createElement + property assignment only. No innerHTML/outerHTML/
11
+ * insertAdjacentHTML exists anywhere on this path — the security property is
12
+ * preserved by never accepting HTML, not by sanitizing it, which is why there
13
+ * is no sanitizer to keep honest.
14
+ *
15
+ * Token lists live here (not in the API domain like SlotOps' mirrors) because
16
+ * three parties must agree byte-for-byte: the server validator, the snippet
17
+ * renderer, and eventually the React renderer (§11) — a drifted copy would let
18
+ * a published arm fail to render, which the fail-safe turns into an invisibly
19
+ * missing section, not an error.
20
+ */
21
+ declare const BLOCK_GAPS: readonly ["none", "sm", "md", "lg"];
22
+ declare const BLOCK_ALIGNS: readonly ["start", "center", "end", "stretch"];
23
+ declare const BLOCK_JUSTIFIES: readonly ["start", "center", "end", "between"];
24
+ declare const BLOCK_SIZES: readonly ["sm", "md", "lg"];
25
+ declare const BLOCK_WEIGHTS: readonly ["normal", "medium", "bold"];
26
+ declare const BLOCK_TONES: readonly ["default", "muted", "accent"];
27
+ declare const BLOCK_EMPHASES: readonly ["primary", "secondary", "ghost"];
28
+ declare const BLOCK_TEXT_ALIGNS: readonly ["left", "center", "right"];
29
+ declare const BLOCK_RATIOS: readonly ["auto", "square", "landscape", "wide"];
30
+ declare const BLOCK_FITS: readonly ["cover", "contain"];
31
+ declare const BLOCK_GRID_COLUMNS: readonly [2, 3, 4];
32
+ declare const BLOCK_HEADING_LEVELS: readonly [2, 3, 4];
33
+ type BlockGap = (typeof BLOCK_GAPS)[number];
34
+ type BlockAlign = (typeof BLOCK_ALIGNS)[number];
35
+ type BlockJustify = (typeof BLOCK_JUSTIFIES)[number];
36
+ type BlockSize = (typeof BLOCK_SIZES)[number];
37
+ type BlockWeight = (typeof BLOCK_WEIGHTS)[number];
38
+ type BlockTone = (typeof BLOCK_TONES)[number];
39
+ type BlockEmphasis = (typeof BLOCK_EMPHASES)[number];
40
+ type BlockTextAlign = (typeof BLOCK_TEXT_ALIGNS)[number];
41
+ type BlockRatio = (typeof BLOCK_RATIOS)[number];
42
+ type BlockFit = (typeof BLOCK_FITS)[number];
43
+ /** Flex row/column container. */
44
+ type StackBlock = {
45
+ type: 'stack';
46
+ direction: 'row' | 'column';
47
+ children: BlockNode[];
48
+ gap?: BlockGap;
49
+ align?: BlockAlign;
50
+ justify?: BlockJustify;
51
+ wrap?: boolean;
52
+ };
53
+ /** 2–4 equal-column grid container. */
54
+ type GridBlock = {
55
+ type: 'grid';
56
+ columns: (typeof BLOCK_GRID_COLUMNS)[number];
57
+ children: BlockNode[];
58
+ gap?: BlockGap;
59
+ align?: BlockAlign;
60
+ };
61
+ /** Paragraph / label. */
62
+ type TextBlock = {
63
+ type: 'text';
64
+ value: string;
65
+ size?: BlockSize;
66
+ weight?: BlockWeight;
67
+ tone?: BlockTone;
68
+ align?: BlockTextAlign;
69
+ };
70
+ /** h2–h4 — never h1 (the page owns its h1). */
71
+ type HeadingBlock = {
72
+ type: 'heading';
73
+ value: string;
74
+ level: (typeof BLOCK_HEADING_LEVELS)[number];
75
+ size?: BlockSize;
76
+ align?: BlockTextAlign;
77
+ };
78
+ /** Link styled as a button. `tag` feeds agent legibility (agentDataByVariant). */
79
+ type ButtonBlock = {
80
+ type: 'button';
81
+ label: string;
82
+ href: string;
83
+ emphasis?: BlockEmphasis;
84
+ size?: BlockSize;
85
+ tag?: string;
86
+ };
87
+ /** Inline text link. */
88
+ type LinkBlock = {
89
+ type: 'link';
90
+ label: string;
91
+ href: string;
92
+ tag?: string;
93
+ };
94
+ /** Image. `alt` is required; empty only with an explicit `decorative: true`. */
95
+ type ImageBlock = {
96
+ type: 'image';
97
+ src: string;
98
+ alt: string;
99
+ decorative?: boolean;
100
+ ratio?: BlockRatio;
101
+ fit?: BlockFit;
102
+ };
103
+ /** Eyebrow / pill. */
104
+ type BadgeBlock = {
105
+ type: 'badge';
106
+ value: string;
107
+ tone?: BlockTone;
108
+ };
109
+ /** Vertical rhythm. */
110
+ type SpacerBlock = {
111
+ type: 'spacer';
112
+ size: BlockSize;
113
+ };
114
+ declare const FORM_FIELD_KINDS: readonly ["input", "textarea", "select"];
115
+ declare const FORM_INPUT_TYPES: readonly ["text", "email", "number", "tel"];
116
+ declare const MAX_FORM_FIELDS = 5;
117
+ declare const MAX_FORM_SELECT_OPTIONS = 8;
118
+ /** One field of a form block. Fields are props, not child blocks, so an input
119
+ * can never appear outside a form — the constraint is structural, no
120
+ * validator has to chase it. */
121
+ type FormField = {
122
+ kind: (typeof FORM_FIELD_KINDS)[number];
123
+ /** Slug key for the values object handed to onFormSubmit. */
124
+ name: string;
125
+ /** Visible label — required, a11y is not optional. */
126
+ label: string;
127
+ /** input fields only. Never password/file/hidden — the closed list is the guarantee. */
128
+ inputType?: (typeof FORM_INPUT_TYPES)[number];
129
+ required?: boolean;
130
+ placeholder?: string;
131
+ /** select fields only: 2–MAX_FORM_SELECT_OPTIONS plain-text options. */
132
+ options?: string[];
133
+ };
134
+ /** Lead/contact form. Submit fires `submitGoal` (a project goal) and hands the
135
+ * values to the developer's onFormSubmit — field values never reach Sentient.
136
+ * At most one form per tree; a form is a leaf (no children). */
137
+ type FormBlock = {
138
+ type: 'form';
139
+ submitGoal: string;
140
+ submitLabel: string;
141
+ fields: FormField[];
142
+ emphasis?: BlockEmphasis;
143
+ };
144
+ type BlockNode = StackBlock | GridBlock | TextBlock | HeadingBlock | ButtonBlock | LinkBlock | ImageBlock | BadgeBlock | SpacerBlock | FormBlock;
145
+ /** The derived site palette (spec §4 "Colour and type: derived, not chosen").
146
+ * Sampled by the on-site editor from the live page's own buttons — computed
147
+ * styles, so values are plain colors (rgb/hex), never var()/url() — validated
148
+ * server-side, stored per project, and served with the decision so injected
149
+ * blocks render in the merchant's own primary color and corner radius.
150
+ * Absent → the renderer's neutral inherit-first defaults. */
151
+ type SitePalette = {
152
+ primaryBg: string;
153
+ primaryText: string;
154
+ radius: string;
155
+ };
156
+ declare const MAX_BLOCK_NODES = 64;
157
+ declare const MAX_BLOCK_DEPTH = 5;
158
+ declare const MAX_BLOCK_CHILDREN = 12;
159
+ declare const MAX_BLOCK_ARMS = 4;
160
+ declare const MAX_BLOCK_TEXT_LEN = 500;
161
+ /** True when the tree contains a form node at any depth. Surfaces that cannot
162
+ * render forms (snippet today, React without an onFormSubmit handler) must
163
+ * refuse the WHOLE tree — skipping just the form node would render a section
164
+ * minus its call-to-action, which looks live while converting nothing. */
165
+ declare function containsFormBlock(node: unknown): boolean;
166
+
167
+ /**
168
+ * Slot declaration helpers shared by the browser client (decide) and the
169
+ * server preload path. Pure wrappers over @sentientui/policy.
170
+ */
171
+
172
+ /** SDK-facing slot declaration. `dims` accepts readonly arrays (`as const`). */
173
+ type SlotDeclInput = {
174
+ id: string;
175
+ arms?: string[];
176
+ dims?: Record<string, readonly string[]>;
177
+ baseline?: string | Record<string, string>;
178
+ };
179
+
180
+ /**
181
+ * Whitelists the wire fields of a slot declaration. Anything an SDK layer
182
+ * attached (goal configs, refs, …) is stripped so it never reaches the zod
183
+ * schema on the API. Also normalizes readonly arrays to mutable ones.
184
+ */
185
+ declare function toWireSlot(d: SlotDeclInput): SlotDecl;
186
+ /** The declared (or default first-declared) baseline result for a slot. */
187
+ declare function baselineResultFor(d: SlotDeclInput): SlotResult;
188
+ /** Baseline results for a whole declaration list, keyed by slot id. */
189
+ declare function baselineSlots(decls: SlotDeclInput[]): Record<string, SlotResult>;
190
+ /**
191
+ * Canonical arm string of a slot result: dims results encode as sorted
192
+ * `dim=value` pairs joined with '|'; arms results are the arm id verbatim.
193
+ */
194
+ declare function armOfResult(result: SlotResult): string;
195
+
196
+ /**
197
+ * Decision snapshot: the SPA / return-visit pre-paint source. Written after
198
+ * every successful decide; read by the inline pre-paint script (before any
199
+ * framework code runs) and by init() to seed slot/persona state.
200
+ */
201
+
202
+ declare const SNAPSHOT_STORAGE_KEY_PREFIX = "_snt_snap:";
203
+ /** Versioned compound locator: resolve id → dataAttr → selector, then verify
204
+ * against fingerprint. Lets a slot survive DOM/markup drift. */
205
+ type CompoundLocator = {
206
+ v?: number;
207
+ id?: string;
208
+ dataAttr?: {
209
+ name: string;
210
+ value: string;
211
+ };
212
+ selector?: string;
213
+ urlMatch?: string;
214
+ fingerprint?: {
215
+ tag?: string;
216
+ text?: string;
217
+ };
218
+ semanticId?: string;
219
+ };
220
+ /** Bounded, declarative operations a registry arm may apply to its element.
221
+ * The style set is a fixed whitelist (validated server-side); no arbitrary CSS,
222
+ * HTML, or JS ever. `text` is applied via textContent; https-only URLs.
223
+ * moveBefore/moveAfter (exactly one) reposition the element relative to a
224
+ * uniquely-resolving sibling anchor — post-decide only, never pre-paint. */
225
+ type SlotOps = {
226
+ text?: string;
227
+ style?: Record<string, string>;
228
+ hidden?: boolean;
229
+ href?: string;
230
+ imageSrc?: string;
231
+ imageAlt?: string;
232
+ moveBefore?: CompoundLocator;
233
+ moveAfter?: CompoundLocator;
234
+ };
235
+ /** Registry-mode apply info per slot: where to apply and what to set. Stored so
236
+ * a returning visitor's pre-paint can reapply it. `target` is the Phase-2 bare
237
+ * selector; `locator` (Phase 3) is the compound locator, preferred when present. */
238
+ type SlotConfigEntry = {
239
+ kind: 'tokens' | 'arms';
240
+ target?: string;
241
+ locator?: CompoundLocator;
242
+ content?: string;
243
+ ops?: SlotOps;
244
+ /** Composition Blocks per arm — ALL arms, not just the served one, because
245
+ * Option-B rendering pre-paints every arm hidden and reveals the served one
246
+ * (spec §6). Holdout sessions receive the baseline arm's tree only, so the
247
+ * control group's DOM stays meaningful. Absent for non-composition slots. */
248
+ blocks?: Record<string, BlockNode>;
249
+ };
250
+ type DecisionSnapshot = {
251
+ v: 1;
252
+ persona: string;
253
+ band: 'low' | 'medium' | 'high';
254
+ slots: Record<string, SlotResult>;
255
+ layoutOrder: string[] | null;
256
+ savedAt: number;
257
+ slotConfig?: Record<string, SlotConfigEntry>;
258
+ /** Derived site palette for Composition Block rendering — cached so the
259
+ * pre-paint render already looks native (a palette that pops in post-decide
260
+ * would be its own flash). */
261
+ palette?: SitePalette;
262
+ };
263
+ /** Returns null on missing, corrupt, or wrong-version data — never throws. */
264
+ declare function readSnapshot(apiKey: string): DecisionSnapshot | null;
265
+ /** Best-effort persist — storage failures are swallowed. */
266
+ declare function writeSnapshot(apiKey: string, snap: DecisionSnapshot): void;
267
+ /**
268
+ * Inline pre-paint script (Rung 1a): reads the snapshot and sets
269
+ * `data-sentient-persona` / `data-sentient-confidence` on <html> before
270
+ * first paint. Single-writer: it never overwrites attributes already set.
271
+ *
272
+ * Safety properties (pinned by tests):
273
+ * - apiKey goes through JSON.stringify, then '<' is escaped to <, so a
274
+ * hostile key can neither break the JS string nor terminate the <script>.
275
+ * - Built by string concatenation and contains no backticks, so the output
276
+ * survives being embedded in template-literal-based renderers.
277
+ */
278
+ declare function renderPrePaintScript(apiKey: string): string;
279
+
280
+ /** Session metadata helpers (browser + Node). No DOM APIs. */
281
+ /**
282
+ * Known AI-agent / crawler user-agent tokens. Matched case-insensitively as
283
+ * substrings. This is maintained data — bot lists move monthly. Used both to
284
+ * flag automation on sessions (agentic browsers that leak a token) and by the
285
+ * server middleware / agent-feed route to identify crawler HTTP reads.
286
+ */
287
+ declare const agentUaList: readonly string[];
288
+ /** True when the user-agent contains a known AI-agent / crawler token. */
289
+ declare function uaTokenMatch(userAgent: string): boolean;
290
+ /** The first known agent token found in the user-agent, or null. */
291
+ declare function matchedAgentToken(userAgent: string): string | null;
292
+ /**
293
+ * Purpose category for an agent fetch, inferred from its published user-agent:
294
+ * - `user` — a person asked an assistant to read the page, live (…-User UAs)
295
+ * - `search` — indexing for an AI answer engine (…-SearchBot / SearchBot)
296
+ * - `training` — model-training crawl (GPTBot, ClaudeBot, CCBot, …)
297
+ * - `other` — not clearly AI, or an unknown/new token
298
+ */
299
+ type AgentIntent = 'user' | 'search' | 'training' | 'other';
300
+ /** Intent per agent token. Maintained beside `agentUaList` — when you add or
301
+ * rename a token above, set its intent here (a unit test enforces coverage). */
302
+ declare const AGENT_INTENTS: Record<string, AgentIntent>;
303
+ /** Intent for a matched bot token (case-insensitive); `other` for null/unknown. */
304
+ declare function agentIntent(botName: string | null): AgentIntent;
305
+ /** `agentUaList` grouped by intent — the "which crawlers do you classify?" reference. */
306
+ declare function classifiedAgents(): Record<AgentIntent, string[]>;
307
+ declare function detectDeviceClass(userAgent: string): string;
308
+ declare function detectTrafficSource(referrer: string, appOrigin?: string): string;
309
+ declare function referrerDomainFromReferer(referrer: string): string | null;
310
+ /**
311
+ * Ad-platform click-ID query params worth keeping. An ALLOWLIST, unlike the
312
+ * `utm_` prefix match: unknown query keys here are unbounded-cardinality junk
313
+ * (session tokens, cache busters) that would bloat the sessions table, so only
314
+ * the IDs the major ad platforms actually append survive.
315
+ *
316
+ * gclid / gbraid / wbraid — Google Ads auto-tagging (search, YouTube, Display;
317
+ * gbraid/wbraid are the iOS-14 privacy variants)
318
+ * fbclid — Meta (Facebook + Instagram). Appended to EVERY outbound Meta
319
+ * click, paid and organic alike — it identifies the platform, never spend.
320
+ * ttclid — TikTok Ads
321
+ * msclkid — Microsoft Ads (Bing)
322
+ * twclid — X/Twitter Ads
323
+ * li_fat_id — LinkedIn Ads
324
+ */
325
+ declare const CLICK_ID_KEYS: readonly string[];
326
+ /**
327
+ * Splits a URL query into the attribution params the session upsert carries:
328
+ * every `utm_`-prefixed key, plus allowlisted ad click IDs (CLICK_ID_KEYS).
329
+ * Accepts a raw search string ("?a=b" or "a=b"), a URLSearchParams, or a
330
+ * Next.js `searchParams` object (whose values may be string arrays — the
331
+ * first occurrence wins, matching URLSearchParams iteration order).
332
+ * Node-safe: no DOM APIs.
333
+ */
334
+ declare function extractTrackedParams(search: string | URLSearchParams | Record<string, string | string[] | undefined>): {
335
+ utmParams: Record<string, string>;
336
+ clickIds: Record<string, string>;
337
+ };
338
+ declare function detectTimeOfDay(d: Date): string;
339
+ type SessionUpsertPayload = {
340
+ sessionId: string;
341
+ ephemeral: boolean;
342
+ utmParams: Record<string, string>;
343
+ /** Allowlisted ad-platform click IDs from the landing URL (CLICK_ID_KEYS). */
344
+ clickIds: Record<string, string>;
345
+ deviceClass: string;
346
+ trafficSource: string;
347
+ referrerDomain: string | null;
348
+ timeOfDay: string;
349
+ dayOfWeek: string;
350
+ /**
351
+ * True when this session is likely driven by automation — either
352
+ * `navigator.webdriver` was set, or the user-agent carried a known agent
353
+ * token. Probabilistic: a flag for metrics + bandit exclusion, never a gate.
354
+ */
355
+ automation: boolean;
356
+ };
357
+ /** Bandit segment key: `<device_class>:<traffic_source>`. */
358
+ declare function deriveSessionSegment(opts?: {
359
+ userAgent?: string;
360
+ referer?: string;
361
+ appOrigin?: string;
362
+ }): string;
363
+ /**
364
+ * Builds a session upsert body aligned with the browser SDK so SSR assign uses
365
+ * the same segment key (`device:source`) as the client after hydration.
366
+ */
367
+ declare function buildSessionUpsertPayload(sessionId: string, opts?: {
368
+ userAgent?: string;
369
+ referer?: string;
370
+ appOrigin?: string;
371
+ utmParams?: Record<string, string>;
372
+ clickIds?: Record<string, string>;
373
+ now?: Date;
374
+ /** `navigator.webdriver` value from the browser, when available. */
375
+ webdriver?: boolean;
376
+ }): SessionUpsertPayload;
377
+
378
+ export { type TextBlock as $, AGENT_INTENTS as A, BLOCK_ALIGNS as B, CLICK_ID_KEYS as C, type DecisionSnapshot as D, FORM_INPUT_TYPES as E, FORM_FIELD_KINDS as F, type FormBlock as G, type FormField as H, type GridBlock as I, type HeadingBlock as J, type ImageBlock as K, type LinkBlock as L, MAX_BLOCK_ARMS as M, MAX_BLOCK_CHILDREN as N, MAX_BLOCK_DEPTH as O, MAX_BLOCK_NODES as P, MAX_BLOCK_TEXT_LEN as Q, MAX_FORM_FIELDS as R, MAX_FORM_SELECT_OPTIONS as S, SNAPSHOT_STORAGE_KEY_PREFIX as T, type SessionUpsertPayload as U, type SitePalette as V, type SlotConfigEntry as W, type SlotDeclInput as X, type SlotOps as Y, type SpacerBlock as Z, type StackBlock as _, type AgentIntent as a, agentIntent as a0, agentUaList as a1, armOfResult as a2, baselineResultFor as a3, baselineSlots as a4, buildSessionUpsertPayload as a5, classifiedAgents as a6, containsFormBlock as a7, deriveSessionSegment as a8, detectDeviceClass as a9, detectTimeOfDay as aa, detectTrafficSource as ab, extractTrackedParams as ac, matchedAgentToken as ad, readSnapshot as ae, referrerDomainFromReferer as af, renderPrePaintScript as ag, toWireSlot as ah, uaTokenMatch as ai, writeSnapshot as aj, BLOCK_EMPHASES as b, BLOCK_FITS as c, BLOCK_GAPS as d, BLOCK_GRID_COLUMNS as e, BLOCK_HEADING_LEVELS as f, BLOCK_JUSTIFIES as g, BLOCK_RATIOS as h, BLOCK_SIZES as i, BLOCK_TEXT_ALIGNS as j, BLOCK_TONES as k, BLOCK_WEIGHTS as l, type BadgeBlock as m, type BlockAlign as n, type BlockEmphasis as o, type BlockFit as p, type BlockGap as q, type BlockJustify as r, type BlockNode as s, type BlockRatio as t, type BlockSize as u, type BlockTextAlign as v, type BlockTone as w, type BlockWeight as x, type ButtonBlock as y, type CompoundLocator as z };