@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/CHANGELOG.md +34 -0
- package/README.md +454 -1
- package/dist/broadcast-layouts.d.ts +8 -0
- package/dist/broadcast-layouts.js +4 -0
- package/dist/broadcast-layouts.mjs +3 -1
- package/dist/funnels.d.ts +46 -0
- package/dist/funnels.js +35 -4
- package/dist/funnels.mjs +33 -5
- package/dist/resonance-constants.d.ts +4 -0
- package/dist/resonance-constants.js +10 -0
- package/dist/resonance-constants.mjs +6 -0
- package/dist/resonance.d.ts +6962 -0
- package/dist/resonance.js +1809 -0
- package/dist/resonance.mjs +1650 -0
- package/dist/signal-experiments.d.ts +219 -0
- package/dist/signal-experiments.js +270 -0
- package/dist/signal-experiments.mjs +260 -0
- package/dist/wire-schema.d.ts +36 -0
- package/docs.json +21 -0
- package/package.json +19 -3
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({
|
|
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({
|
|
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 };
|