@sonordev/contracts 2.18.0 → 2.20.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/funnels.d.ts CHANGED
@@ -152,6 +152,27 @@ export interface PublishedFunnelPage {
152
152
  tracking: {
153
153
  campaignSlug: string;
154
154
  };
155
+ /** Optional reviewed content only. Requires a compatible installed renderer;
156
+ * older strict page parsers reject this field. No assignment/publication grant. */
157
+ experimentContent?: FunnelExperimentContentManifest;
158
+ }
159
+ export interface FunnelExperimentContentManifest {
160
+ schemaVersion: 1;
161
+ kind: 'funnel_experiment_content_v1';
162
+ experimentId: string;
163
+ experimentRevision: number;
164
+ goalRevision: string;
165
+ controlVariantKey: string;
166
+ /** contentDigest covers effective FULL content, including the fixed base offer.
167
+ * Native funnelHash owns canonical hashing; this parser checks digest shape only. */
168
+ variants: Array<{
169
+ variantKey: string;
170
+ content: {
171
+ headline: string;
172
+ body: FunnelBodyBlock[];
173
+ };
174
+ contentDigest: string;
175
+ }>;
155
176
  }
156
177
  export interface FunnelOperationReceipt {
157
178
  operationId: string;
@@ -276,6 +297,24 @@ export declare const FUNNEL_DEFINITION_JSON_SCHEMA: {
276
297
  readonly oneOf?: readonly Shape[];
277
298
  readonly $schema: 'http://json-schema.org/draft-07/schema#';
278
299
  };
300
+ export declare const FUNNEL_EXPERIMENT_CONTENT_JSON_SCHEMA: {
301
+ readonly type?: 'object' | 'array' | 'string' | 'integer' | 'boolean' | 'null';
302
+ readonly properties?: Record<string, Shape>;
303
+ readonly required?: readonly string[];
304
+ readonly additionalProperties?: false;
305
+ readonly items?: Shape;
306
+ readonly minItems?: number;
307
+ readonly maxItems?: number;
308
+ readonly minLength?: number;
309
+ readonly maxLength?: number;
310
+ readonly pattern?: string;
311
+ readonly minimum?: number;
312
+ readonly maximum?: number;
313
+ readonly enum?: readonly unknown[];
314
+ readonly const?: unknown;
315
+ readonly oneOf?: readonly Shape[];
316
+ readonly $schema: 'http://json-schema.org/draft-07/schema#';
317
+ };
279
318
  export declare const PUBLISHED_FUNNEL_PAGE_JSON_SCHEMA: {
280
319
  readonly type?: 'object' | 'array' | 'string' | 'integer' | 'boolean' | 'null';
281
320
  readonly properties?: Record<string, Shape>;
@@ -306,6 +345,13 @@ export declare function isSafeFunnelPublicUrl(value: string): boolean;
306
345
  export declare function managedFunnelPath(value: string): string;
307
346
  export declare function parseFunnelDefinition(value: unknown): FunnelDefinition;
308
347
  export declare function parsePublishedFunnelPage(value: unknown): PublishedFunnelPage;
348
+ /** Shape/content checks only. Native owners verify the complete original Signal
349
+ * variant set and hash each effective FULL content with existing funnelHash. */
350
+ export declare function parseFunnelExperimentContent(value: unknown): FunnelExperimentContentManifest;
351
+ /** One effective-content composition for native hashing and existing rendering.
352
+ * Offer and all page identity/form/brand/tracking fields stay on the base page;
353
+ * a client-provided digest or key grants no native permission. */
354
+ export declare function resolveFunnelExperimentContent(value: unknown, variantKey: string): PublishedFunnelPage['content'];
309
355
  export declare function parseFunnelLaunchArgs(value: unknown): FunnelLaunchArgs;
310
356
  export declare function parseFunnelLifecycleArgs(value: unknown, operation?: 'pause' | 'resume' | 'rollback'): FunnelLifecycleArgs;
311
357
  /** Apply presentation-only overrides to an already resolved canonical brand. Null means inherit. */
package/dist/funnels.js CHANGED
@@ -82,6 +82,7 @@ var integer = (minimum, maximum = Number.MAX_SAFE_INTEGER) => ({ type: "integer"
82
82
  var nullable = (shape) => ({ oneOf: [shape, { type: "null" }] });
83
83
  var isoDate = { type: "string", pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$" };
84
84
  var uuid = { type: "string", pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" };
85
+ var fingerprint = { type: "string", pattern: "^[a-f0-9]{64}$" };
85
86
  var slug = { ...string(80), pattern: "^[a-z0-9]+(?:-[a-z0-9]+)*$" };
86
87
  var fieldSlug = { ...string(80), pattern: "^[a-zA-Z0-9_-]+$" };
87
88
  var path = { ...string(512), pattern: "^/(?!/)[a-zA-Z0-9/_-]*$" };
@@ -99,6 +100,16 @@ var override = object({
99
100
  }, []);
100
101
  var bodyBlock = { oneOf: [object({ type: literal("paragraph"), text: string(2e3) }), object({ type: literal("bullets"), items: array(string(500), 8, 1) })] };
101
102
  var body = array(bodyBlock, 12);
103
+ var publishedContentFields = { headline: string(160), body };
104
+ var experimentContentShape = object({
105
+ schemaVersion: literal(1),
106
+ kind: literal("funnel_experiment_content_v1"),
107
+ experimentId: uuid,
108
+ experimentRevision: integer(1),
109
+ goalRevision: { ...string(128), pattern: "^[a-zA-Z0-9._:-]+$" },
110
+ controlVariantKey: string(80),
111
+ variants: array(object({ variantKey: string(80), content: object(publishedContentFields), contentDigest: fingerprint }), 50, 2)
112
+ });
102
113
  var publicBrand = object({ displayName: string(120), tagline: string(300, 0), fullLogoUrl: nullable(string(2048)), squareLogoUrl: nullable(string(2048)), colors, typography, scheme: enumeration("light", "dark") });
103
114
  var step = { oneOf: [
104
115
  object({ id: uuid, type: literal("wait"), durationSeconds: integer(60, 2592e3) }),
@@ -178,11 +189,13 @@ var publishedShape = object({
178
189
  revision: integer(1),
179
190
  site,
180
191
  path,
181
- content: object({ headline: string(160), body, offer: object({ label: string(120), href: string(2048) }) }, ["headline", "body"]),
192
+ content: object({ ...publishedContentFields, offer: object({ label: string(120), href: string(2048) }) }, ["headline", "body"]),
182
193
  brand: publicBrand,
183
194
  conversion: object({ formSlug: fieldSlug }),
184
- tracking: object({ campaignSlug: slug })
185
- });
195
+ tracking: object({ campaignSlug: slug }),
196
+ experimentContent: experimentContentShape
197
+ }, ["schemaVersion", "id", "versionId", "revision", "site", "path", "content", "brand", "conversion", "tracking"]);
198
+ var FUNNEL_EXPERIMENT_CONTENT_JSON_SCHEMA = { $schema: "http://json-schema.org/draft-07/schema#", ...experimentContentShape };
186
199
  var PUBLISHED_FUNNEL_PAGE_JSON_SCHEMA = { $schema: "http://json-schema.org/draft-07/schema#", ...publishedShape };
187
200
  var FUNNEL_LAUNCH_JSON_SCHEMA = object({ expectedRevision: integer(1), previewId: uuid, idempotencyKey: string(200), confirm: literal(true) });
188
201
  var FUNNEL_LIFECYCLE_JSON_SCHEMA = object({ expectedActiveVersionId: uuid, idempotencyKey: string(200), confirm: literal(true) });
@@ -285,8 +298,24 @@ function parsePublishedFunnelPage(value) {
285
298
  checkFonts(result.brand, "page.brand");
286
299
  checkBody(result.content.body, "page.content.body");
287
300
  if (result.content.offer && !isSafeFunnelPublicUrl(result.content.offer.href)) fail("page.content.offer.href", "unsafe public URL");
301
+ if (result.experimentContent) result.experimentContent = parseFunnelExperimentContent(result.experimentContent);
288
302
  return result;
289
303
  }
304
+ function parseFunnelExperimentContent(value) {
305
+ check(value, experimentContentShape, "experimentContent");
306
+ const result = JSON.parse(JSON.stringify(value));
307
+ const keys = result.variants.map((v) => v.variantKey);
308
+ if (new Set(keys).size !== keys.length) fail("experimentContent.variants", "variant keys must be unique");
309
+ if (!keys.includes(result.controlVariantKey)) fail("experimentContent.controlVariantKey", "must identify an existing reviewed variant");
310
+ result.variants.forEach((variant, i) => checkBody(variant.content.body, `experimentContent.variants[${i}].content.body`));
311
+ return result;
312
+ }
313
+ function resolveFunnelExperimentContent(value, variantKey) {
314
+ const page = parsePublishedFunnelPage(value);
315
+ const variant = page.experimentContent?.variants.find((v) => v.variantKey === variantKey);
316
+ if (!variant) fail("page.experimentContent.variants", "an existing reviewed variant is required");
317
+ return { ...page.content, headline: variant.content.headline, body: variant.content.body };
318
+ }
290
319
  function parseFunnelLaunchArgs(value) {
291
320
  check(value, FUNNEL_LAUNCH_JSON_SCHEMA, "launch");
292
321
  return JSON.parse(JSON.stringify(value));
@@ -351,7 +380,6 @@ function parseFunnelRetryArgs(value) {
351
380
  check(value, FUNNEL_RETRY_JSON_SCHEMA, "retry");
352
381
  return JSON.parse(JSON.stringify(value));
353
382
  }
354
- var fingerprint = { type: "string", pattern: "^[a-f0-9]{64}$" };
355
383
  var issue = object({ code: { ...string(80), pattern: "^[A-Z][A-Z0-9_]*$" }, path: string(300), message: string(500), fixRef: object({ section: string(80), field: string(80), resourceId: uuid }, ["section"]) }, ["code", "path", "message"]);
356
384
  var FUNNEL_READINESS_JSON_SCHEMA = object({ definitionRevision: integer(1), brandFingerprint: fingerprint, resourceFingerprint: fingerprint, ready: { type: "boolean" }, blockers: array(issue, 50), warnings: array(issue, 50), capabilities: object({ managedPage: { type: "boolean" } }) });
357
385
  function parseFunnelReadiness(value) {
@@ -567,6 +595,7 @@ exports.FUNNEL_DETAIL_JSON_SCHEMA = FUNNEL_DETAIL_JSON_SCHEMA;
567
595
  exports.FUNNEL_DRAFT_DEFINITION_JSON_SCHEMA = FUNNEL_DRAFT_DEFINITION_JSON_SCHEMA;
568
596
  exports.FUNNEL_DRAFT_JSON_SCHEMAS = FUNNEL_DRAFT_JSON_SCHEMAS;
569
597
  exports.FUNNEL_ENROLLMENT_JSON_SCHEMA = FUNNEL_ENROLLMENT_JSON_SCHEMA;
598
+ exports.FUNNEL_EXPERIMENT_CONTENT_JSON_SCHEMA = FUNNEL_EXPERIMENT_CONTENT_JSON_SCHEMA;
570
599
  exports.FUNNEL_LAUNCH_EVIDENCE_JSON_SCHEMA = FUNNEL_LAUNCH_EVIDENCE_JSON_SCHEMA;
571
600
  exports.FUNNEL_LAUNCH_JSON_SCHEMA = FUNNEL_LAUNCH_JSON_SCHEMA;
572
601
  exports.FUNNEL_LIFECYCLE_JSON_SCHEMA = FUNNEL_LIFECYCLE_JSON_SCHEMA;
@@ -600,6 +629,7 @@ exports.parseFunnelDetail = parseFunnelDetail;
600
629
  exports.parseFunnelDraftArgs = parseFunnelDraftArgs;
601
630
  exports.parseFunnelDraftDefinition = parseFunnelDraftDefinition;
602
631
  exports.parseFunnelEnrollmentSummary = parseFunnelEnrollmentSummary;
632
+ exports.parseFunnelExperimentContent = parseFunnelExperimentContent;
603
633
  exports.parseFunnelLaunchArgs = parseFunnelLaunchArgs;
604
634
  exports.parseFunnelLaunchEvidence = parseFunnelLaunchEvidence;
605
635
  exports.parseFunnelLifecycleArgs = parseFunnelLifecycleArgs;
@@ -615,3 +645,4 @@ exports.parseFunnelSummary = parseFunnelSummary;
615
645
  exports.parseFunnelTimeline = parseFunnelTimeline;
616
646
  exports.parseFunnelUpdateArgs = parseFunnelUpdateArgs;
617
647
  exports.parsePublishedFunnelPage = parsePublishedFunnelPage;
648
+ exports.resolveFunnelExperimentContent = resolveFunnelExperimentContent;
package/dist/funnels.mjs CHANGED
@@ -80,6 +80,7 @@ var integer = (minimum, maximum = Number.MAX_SAFE_INTEGER) => ({ type: "integer"
80
80
  var nullable = (shape) => ({ oneOf: [shape, { type: "null" }] });
81
81
  var isoDate = { type: "string", pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$" };
82
82
  var uuid = { type: "string", pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" };
83
+ var fingerprint = { type: "string", pattern: "^[a-f0-9]{64}$" };
83
84
  var slug = { ...string(80), pattern: "^[a-z0-9]+(?:-[a-z0-9]+)*$" };
84
85
  var fieldSlug = { ...string(80), pattern: "^[a-zA-Z0-9_-]+$" };
85
86
  var path = { ...string(512), pattern: "^/(?!/)[a-zA-Z0-9/_-]*$" };
@@ -97,6 +98,16 @@ var override = object({
97
98
  }, []);
98
99
  var bodyBlock = { oneOf: [object({ type: literal("paragraph"), text: string(2e3) }), object({ type: literal("bullets"), items: array(string(500), 8, 1) })] };
99
100
  var body = array(bodyBlock, 12);
101
+ var publishedContentFields = { headline: string(160), body };
102
+ var experimentContentShape = object({
103
+ schemaVersion: literal(1),
104
+ kind: literal("funnel_experiment_content_v1"),
105
+ experimentId: uuid,
106
+ experimentRevision: integer(1),
107
+ goalRevision: { ...string(128), pattern: "^[a-zA-Z0-9._:-]+$" },
108
+ controlVariantKey: string(80),
109
+ variants: array(object({ variantKey: string(80), content: object(publishedContentFields), contentDigest: fingerprint }), 50, 2)
110
+ });
100
111
  var publicBrand = object({ displayName: string(120), tagline: string(300, 0), fullLogoUrl: nullable(string(2048)), squareLogoUrl: nullable(string(2048)), colors, typography, scheme: enumeration("light", "dark") });
101
112
  var step = { oneOf: [
102
113
  object({ id: uuid, type: literal("wait"), durationSeconds: integer(60, 2592e3) }),
@@ -176,11 +187,13 @@ var publishedShape = object({
176
187
  revision: integer(1),
177
188
  site,
178
189
  path,
179
- content: object({ headline: string(160), body, offer: object({ label: string(120), href: string(2048) }) }, ["headline", "body"]),
190
+ content: object({ ...publishedContentFields, offer: object({ label: string(120), href: string(2048) }) }, ["headline", "body"]),
180
191
  brand: publicBrand,
181
192
  conversion: object({ formSlug: fieldSlug }),
182
- tracking: object({ campaignSlug: slug })
183
- });
193
+ tracking: object({ campaignSlug: slug }),
194
+ experimentContent: experimentContentShape
195
+ }, ["schemaVersion", "id", "versionId", "revision", "site", "path", "content", "brand", "conversion", "tracking"]);
196
+ var FUNNEL_EXPERIMENT_CONTENT_JSON_SCHEMA = { $schema: "http://json-schema.org/draft-07/schema#", ...experimentContentShape };
184
197
  var PUBLISHED_FUNNEL_PAGE_JSON_SCHEMA = { $schema: "http://json-schema.org/draft-07/schema#", ...publishedShape };
185
198
  var FUNNEL_LAUNCH_JSON_SCHEMA = object({ expectedRevision: integer(1), previewId: uuid, idempotencyKey: string(200), confirm: literal(true) });
186
199
  var FUNNEL_LIFECYCLE_JSON_SCHEMA = object({ expectedActiveVersionId: uuid, idempotencyKey: string(200), confirm: literal(true) });
@@ -283,8 +296,24 @@ function parsePublishedFunnelPage(value) {
283
296
  checkFonts(result.brand, "page.brand");
284
297
  checkBody(result.content.body, "page.content.body");
285
298
  if (result.content.offer && !isSafeFunnelPublicUrl(result.content.offer.href)) fail("page.content.offer.href", "unsafe public URL");
299
+ if (result.experimentContent) result.experimentContent = parseFunnelExperimentContent(result.experimentContent);
286
300
  return result;
287
301
  }
302
+ function parseFunnelExperimentContent(value) {
303
+ check(value, experimentContentShape, "experimentContent");
304
+ const result = JSON.parse(JSON.stringify(value));
305
+ const keys = result.variants.map((v) => v.variantKey);
306
+ if (new Set(keys).size !== keys.length) fail("experimentContent.variants", "variant keys must be unique");
307
+ if (!keys.includes(result.controlVariantKey)) fail("experimentContent.controlVariantKey", "must identify an existing reviewed variant");
308
+ result.variants.forEach((variant, i) => checkBody(variant.content.body, `experimentContent.variants[${i}].content.body`));
309
+ return result;
310
+ }
311
+ function resolveFunnelExperimentContent(value, variantKey) {
312
+ const page = parsePublishedFunnelPage(value);
313
+ const variant = page.experimentContent?.variants.find((v) => v.variantKey === variantKey);
314
+ if (!variant) fail("page.experimentContent.variants", "an existing reviewed variant is required");
315
+ return { ...page.content, headline: variant.content.headline, body: variant.content.body };
316
+ }
288
317
  function parseFunnelLaunchArgs(value) {
289
318
  check(value, FUNNEL_LAUNCH_JSON_SCHEMA, "launch");
290
319
  return JSON.parse(JSON.stringify(value));
@@ -349,7 +378,6 @@ function parseFunnelRetryArgs(value) {
349
378
  check(value, FUNNEL_RETRY_JSON_SCHEMA, "retry");
350
379
  return JSON.parse(JSON.stringify(value));
351
380
  }
352
- var fingerprint = { type: "string", pattern: "^[a-f0-9]{64}$" };
353
381
  var issue = object({ code: { ...string(80), pattern: "^[A-Z][A-Z0-9_]*$" }, path: string(300), message: string(500), fixRef: object({ section: string(80), field: string(80), resourceId: uuid }, ["section"]) }, ["code", "path", "message"]);
354
382
  var FUNNEL_READINESS_JSON_SCHEMA = object({ definitionRevision: integer(1), brandFingerprint: fingerprint, resourceFingerprint: fingerprint, ready: { type: "boolean" }, blockers: array(issue, 50), warnings: array(issue, 50), capabilities: object({ managedPage: { type: "boolean" } }) });
355
383
  function parseFunnelReadiness(value) {
@@ -557,4 +585,4 @@ function parseFunnelPublishedVersionDetail(value) {
557
585
  }
558
586
  for (const schema of [FUNNEL_LAUNCH_EVIDENCE_JSON_SCHEMA, FUNNEL_ROLLBACK_EVIDENCE_JSON_SCHEMA, FUNNEL_VERSION_JSON_SCHEMA, FUNNEL_VERSION_DETAIL_JSON_SCHEMA]) freezeSchema(schema);
559
587
 
560
- export { FUNNEL_BRAND_SNAPSHOT_JSON_SCHEMA, FUNNEL_CATALOG_JSON_SCHEMA, FUNNEL_CREATE_JSON_SCHEMA, FUNNEL_DEFINITION_JSON_SCHEMA, FUNNEL_DETAIL_JSON_SCHEMA, FUNNEL_DRAFT_DEFINITION_JSON_SCHEMA, FUNNEL_DRAFT_JSON_SCHEMAS, FUNNEL_ENROLLMENT_JSON_SCHEMA, FUNNEL_LAUNCH_EVIDENCE_JSON_SCHEMA, FUNNEL_LAUNCH_JSON_SCHEMA, FUNNEL_LIFECYCLE_JSON_SCHEMA, FUNNEL_OPERATION_RECEIPT_JSON_SCHEMA, FUNNEL_PREVIEW_JSON_SCHEMA, FUNNEL_READINESS_JSON_SCHEMA, FUNNEL_RETRY_JSON_SCHEMA, FUNNEL_REVISION_JSON_SCHEMA, FUNNEL_ROLLBACK_EVIDENCE_JSON_SCHEMA, FUNNEL_ROLLBACK_JSON_SCHEMA, FUNNEL_SCHEMA_VERSION, FUNNEL_SUMMARY_JSON_SCHEMA, FUNNEL_TEMPLATES, FUNNEL_TIMELINE_JSON_SCHEMA, FUNNEL_UPDATE_JSON_SCHEMA, FUNNEL_VERSION_DETAIL_JSON_SCHEMA, FUNNEL_VERSION_JSON_SCHEMA, FunnelValidationError, MANAGED_FUNNEL_PATH_PREFIX, PUBLISHED_FUNNEL_PAGE_JSON_SCHEMA, applyFunnelBrandOverride, createFunnelDraft, isSafeFunnelPublicUrl, managedFunnelPath, normalizeCampaignSlug, parseFunnelBrandSnapshot, parseFunnelCatalog, parseFunnelCreateArgs, parseFunnelDefinition, parseFunnelDetail, parseFunnelDraftArgs, parseFunnelDraftDefinition, parseFunnelEnrollmentSummary, parseFunnelLaunchArgs, parseFunnelLaunchEvidence, parseFunnelLifecycleArgs, parseFunnelOperationReceipt, parseFunnelPreview, parseFunnelPublishedVersion, parseFunnelPublishedVersionDetail, parseFunnelReadiness, parseFunnelRetryArgs, parseFunnelRevisionArgs, parseFunnelRollbackEvidence, parseFunnelSummary, parseFunnelTimeline, parseFunnelUpdateArgs, parsePublishedFunnelPage };
588
+ export { FUNNEL_BRAND_SNAPSHOT_JSON_SCHEMA, FUNNEL_CATALOG_JSON_SCHEMA, FUNNEL_CREATE_JSON_SCHEMA, FUNNEL_DEFINITION_JSON_SCHEMA, FUNNEL_DETAIL_JSON_SCHEMA, FUNNEL_DRAFT_DEFINITION_JSON_SCHEMA, FUNNEL_DRAFT_JSON_SCHEMAS, FUNNEL_ENROLLMENT_JSON_SCHEMA, FUNNEL_EXPERIMENT_CONTENT_JSON_SCHEMA, FUNNEL_LAUNCH_EVIDENCE_JSON_SCHEMA, FUNNEL_LAUNCH_JSON_SCHEMA, FUNNEL_LIFECYCLE_JSON_SCHEMA, FUNNEL_OPERATION_RECEIPT_JSON_SCHEMA, FUNNEL_PREVIEW_JSON_SCHEMA, FUNNEL_READINESS_JSON_SCHEMA, FUNNEL_RETRY_JSON_SCHEMA, FUNNEL_REVISION_JSON_SCHEMA, FUNNEL_ROLLBACK_EVIDENCE_JSON_SCHEMA, FUNNEL_ROLLBACK_JSON_SCHEMA, FUNNEL_SCHEMA_VERSION, FUNNEL_SUMMARY_JSON_SCHEMA, FUNNEL_TEMPLATES, FUNNEL_TIMELINE_JSON_SCHEMA, FUNNEL_UPDATE_JSON_SCHEMA, FUNNEL_VERSION_DETAIL_JSON_SCHEMA, FUNNEL_VERSION_JSON_SCHEMA, FunnelValidationError, MANAGED_FUNNEL_PATH_PREFIX, PUBLISHED_FUNNEL_PAGE_JSON_SCHEMA, applyFunnelBrandOverride, createFunnelDraft, isSafeFunnelPublicUrl, managedFunnelPath, normalizeCampaignSlug, parseFunnelBrandSnapshot, parseFunnelCatalog, parseFunnelCreateArgs, parseFunnelDefinition, parseFunnelDetail, parseFunnelDraftArgs, parseFunnelDraftDefinition, parseFunnelEnrollmentSummary, parseFunnelExperimentContent, parseFunnelLaunchArgs, parseFunnelLaunchEvidence, parseFunnelLifecycleArgs, parseFunnelOperationReceipt, parseFunnelPreview, parseFunnelPublishedVersion, parseFunnelPublishedVersionDetail, parseFunnelReadiness, parseFunnelRetryArgs, parseFunnelRevisionArgs, parseFunnelRollbackEvidence, parseFunnelSummary, parseFunnelTimeline, parseFunnelUpdateArgs, parsePublishedFunnelPage, resolveFunnelExperimentContent };
@@ -0,0 +1,4 @@
1
+ /** Single source of truth for inert Resonance wire literals; safe in browser entry graphs. */
2
+ export declare const RESONANCE_ATTRIBUTION_MODEL: 'first_party_last_touch_marker_v1';
3
+ export declare const RESONANCE_SOURCE_MARKER_PARAMETER: 'sonor_source';
4
+ export declare const RESONANCE_SUBJECT_HEADER: 'X-Sonor-Resonance-Subject';
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ // src/contracts/resonance-constants.ts
4
+ var RESONANCE_ATTRIBUTION_MODEL = "first_party_last_touch_marker_v1";
5
+ var RESONANCE_SOURCE_MARKER_PARAMETER = "sonor_source";
6
+ var RESONANCE_SUBJECT_HEADER = "X-Sonor-Resonance-Subject";
7
+
8
+ exports.RESONANCE_ATTRIBUTION_MODEL = RESONANCE_ATTRIBUTION_MODEL;
9
+ exports.RESONANCE_SOURCE_MARKER_PARAMETER = RESONANCE_SOURCE_MARKER_PARAMETER;
10
+ exports.RESONANCE_SUBJECT_HEADER = RESONANCE_SUBJECT_HEADER;
@@ -0,0 +1,6 @@
1
+ // src/contracts/resonance-constants.ts
2
+ var RESONANCE_ATTRIBUTION_MODEL = "first_party_last_touch_marker_v1";
3
+ var RESONANCE_SOURCE_MARKER_PARAMETER = "sonor_source";
4
+ var RESONANCE_SUBJECT_HEADER = "X-Sonor-Resonance-Subject";
5
+
6
+ export { RESONANCE_ATTRIBUTION_MODEL, RESONANCE_SOURCE_MARKER_PARAMETER, RESONANCE_SUBJECT_HEADER };