@sonordev/site-kit 8.10.0 → 8.12.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 +8 -0
- package/agent-manifest.json +1 -1
- package/dist/{AddressAutocomplete-LQS6GQ4R.js → AddressAutocomplete-6DQ3IP5C.js} +1 -1
- package/dist/{AnalyticsProvider-JWS7BLFY.js → AnalyticsProvider-RC2RG4YW.js} +4 -4
- package/dist/{ArticleViewTracker-CDPVMUAO.js → ArticleViewTracker-FNCRH3SB.js} +1 -1
- package/dist/{BlocksPopup-C5PNJ7U6.js → BlocksPopup-AJCDT5WM.js} +3 -3
- package/dist/{ChatWidget-HEPOE3YC.js → ChatWidget-CM5OGMJQ.js} +5 -5
- package/dist/{FileField-6R5LS5NU.js → FileField-QWS5ASLB.js} +1 -1
- package/dist/{FormSpotlight-2BSE7PD2.js → FormSpotlight-7Y6B2YZM.js} +1 -1
- package/dist/{FormStage-3G46OPPO.js → FormStage-T3N27SID.js} +1 -1
- package/dist/{ManagedForm-LTXEU25N.js → ManagedForm-WUULZELM.js} +6 -6
- package/dist/{ManagedNewsletterForm-WE6P5DMV.js → ManagedNewsletterForm-GGA3JOOI.js} +8 -8
- package/dist/{SignalCore-IP7FE6SN.js → SignalCore-ZMKDW44U.js} +3 -3
- package/dist/{SiteChat-3FQYMHCP.js → SiteChat-PM4RIZR4.js} +1 -1
- package/dist/{SiteDesignReporter-HGTX4FX2.js → SiteDesignReporter-SALYTWV2.js} +4 -4
- package/dist/{SitePopups-V7MCNSGE.js → SitePopups-VDSDWZHD.js} +4 -4
- package/dist/{SitemapSync-OAJ7SIET.js → SitemapSync-6UDJHS2F.js} +2 -2
- package/dist/_client/booking-widget.js +3 -3
- package/dist/_client/reviewed-signal-experiment.js +1 -1
- package/dist/affiliates/index.js +1 -1
- package/dist/analytics/index.js +4 -4
- package/dist/api-4AAR6BZO.js +5 -0
- package/dist/articles/index.js +1 -1
- package/dist/articles/server-ui.js +3 -3
- package/dist/articles/server.js +2 -2
- package/dist/chat/index.js +6 -6
- package/dist/{chunk-YJ6PRJ7Y.js → chunk-27264MSX.js} +2 -2
- package/dist/{chunk-D4R3FQED.js → chunk-2MJYGVKB.js} +1 -1
- package/dist/{chunk-MKU5ZORB.js → chunk-2QAG7ALW.js} +1 -1
- package/dist/{chunk-NH7K252M.js → chunk-5UAX6PHO.js} +1 -1
- package/dist/{chunk-NBNDH2J6.js → chunk-675DTMSR.js} +1 -1
- package/dist/{chunk-RMPXSEEU.js → chunk-7PW7N7P4.js} +1 -1
- package/dist/{chunk-TLKLHSRJ.js → chunk-C55LIDVW.js} +1 -1
- package/dist/{chunk-NWEIHCSE.js → chunk-CNCAQEUJ.js} +1 -1
- package/dist/{chunk-ACZ5JNSL.js → chunk-DFCLELM2.js} +2 -2
- package/dist/{chunk-HNVLINPI.js → chunk-DICLVB5P.js} +1 -1
- package/dist/{chunk-HLN7A4GL.js → chunk-DUIGCLQM.js} +1 -1
- package/dist/{chunk-Q2OE32TH.js → chunk-GHW37LVB.js} +2 -2
- package/dist/{chunk-727353NY.js → chunk-H4KPWR7P.js} +3 -3
- package/dist/{chunk-Z4XJOVQX.js → chunk-M2ZGSI6K.js} +1 -1
- package/dist/{chunk-J4R7MHV2.js → chunk-M34VOQ5J.js} +8 -8
- package/dist/{chunk-OCNODBH4.js → chunk-M3VJAE24.js} +1 -1
- package/dist/{chunk-P7S45DD7.js → chunk-NX4FETUK.js} +1 -1
- package/dist/{chunk-OEHIXCYS.js → chunk-O3CAXGY5.js} +2 -2
- package/dist/{chunk-RUV6DCKL.js → chunk-T2Z7KEIH.js} +1 -1
- package/dist/{chunk-DW5X4BC7.js → chunk-TPB5PTWW.js} +2 -2
- package/dist/{chunk-75N2WALV.js → chunk-TXB4ULAM.js} +1 -1
- package/dist/{chunk-6CIO4X6P.js → chunk-UFHEND2H.js} +1 -1
- package/dist/{chunk-7PWXPN53.js → chunk-UTVFF7VT.js} +1 -1
- package/dist/{chunk-MIKVCYGX.js → chunk-VF2X5T4H.js} +2 -2
- package/dist/{chunk-533ZSRJF.js → chunk-VZSIIKLR.js} +1 -1
- package/dist/{chunk-XAPSYDVT.js → chunk-WX4XX3BZ.js} +1 -1
- package/dist/{chunk-Y7DZ2ND2.js → chunk-Y4MQTSYY.js} +3 -3
- package/dist/{chunk-3RBOES2C.js → chunk-YOPBFEDG.js} +1 -1
- package/dist/{chunk-UMF5OILQ.js → chunk-YPTUKSF7.js} +1 -1
- package/dist/{chunk-Z62W7Q3T.js → chunk-YYV3YHUX.js} +1 -1
- package/dist/{chunk-A66TIJWU.js → chunk-Z42KXUTK.js} +1 -1
- package/dist/contracts/entries.d.ts +1 -1
- package/dist/contracts/property-interest.d.ts +100 -0
- package/dist/contracts/resonance.d.ts +1705 -358
- package/dist/contracts/sales-call-prep.d.ts +666 -0
- package/dist/contracts/signal-experiments.d.ts +0 -1
- package/dist/contracts/wire-uuid.d.ts +5 -0
- package/dist/{controls-KLG6VQLO.js → controls-GLVRT5EM.js} +2 -2
- package/dist/fleet/index.js +3 -3
- package/dist/forms/index.js +8 -8
- package/dist/forms/server.js +2 -2
- package/dist/images/index.js +2 -2
- package/dist/index.js +1 -1
- package/dist/landing/server.js +5 -5
- package/dist/layout/client.js +6 -6
- package/dist/layout/index.js +7 -7
- package/dist/llms/index.js +4 -4
- package/dist/maps/index.js +3 -3
- package/dist/mcp/sonor.js +5 -5
- package/dist/resonance/ConsentPreferences.d.ts +12 -0
- package/dist/resonance/consent-adapter.d.ts +3 -0
- package/dist/resonance/consent-preferences-styles.d.ts +2 -0
- package/dist/resonance/first-party-consent.d.ts +22 -0
- package/dist/resonance/index.d.ts +1 -0
- package/dist/resonance/index.js +366 -2
- package/dist/revalidate/index.js +2 -2
- package/dist/runtime/index.js +1 -1
- package/dist/{runtime-core-EU2RZMOL.js → runtime-core-4WL4V4QE.js} +523 -7
- package/dist/seo/client.js +2 -2
- package/dist/seo/index.js +2 -2
- package/dist/seo/llms.js +4 -4
- package/dist/seo/register-sitemap-cli.js +1 -1
- package/dist/seo/sitemap.js +2 -2
- package/dist/server/index.js +2 -2
- package/dist/shared/version.d.ts +1 -1
- package/dist/signal/index.js +2 -2
- package/dist/sitemap/index.js +2 -2
- package/dist/{sonor-fetch-runtime-SLPBNZY4.js → sonor-fetch-runtime-QO4DR7GR.js} +2 -2
- package/dist/sync/index.js +3 -3
- package/dist/website/images.js +2 -2
- package/dist/website/index.js +4 -4
- package/dist/website/landing/server.js +5 -5
- package/dist/website/popups.js +4 -4
- package/dist/{writeLLMsTxt-2CBYGKZO.js → writeLLMsTxt-EKWOSHXU.js} +1 -1
- package/package.json +1 -1
- package/src/resonance/README.md +49 -0
- package/dist/api-X6N6V2H3.js +0 -5
- /package/dist/{chunk-ORSQKTMN.js → chunk-2YSX4ZUC.js} +0 -0
|
@@ -9,13 +9,16 @@ import { isNormalizedSiteHost } from './chunk-NZOJHERI.js';
|
|
|
9
9
|
import { advertisingPurposesPermitted, experimentMeasurementPermitted } from './chunk-KMNHNCVG.js';
|
|
10
10
|
import { resolveAnalyticsTarget, isFramed, isPrivatePreview, isLocalHostname } from './chunk-7643MCD2.js';
|
|
11
11
|
import './chunk-64XODP7M.js';
|
|
12
|
-
import { sonorFetch } from './chunk-
|
|
12
|
+
import { sonorFetch } from './chunk-M2ZGSI6K.js';
|
|
13
13
|
import './chunk-W7OPEMGJ.js';
|
|
14
14
|
import './chunk-A4CC4ZG3.js';
|
|
15
15
|
import './chunk-MOACHHOJ.js';
|
|
16
16
|
import { measurementPolicySnapshot, subscribeMeasurementPolicy, unknownChoices, MEASUREMENT_PURPOSES } from './chunk-FRY6PBT6.js';
|
|
17
17
|
import './chunk-PKBMQBKP.js';
|
|
18
18
|
|
|
19
|
+
// src/contracts/wire-uuid.ts
|
|
20
|
+
var UUID_V1_TO_V8_PATTERN = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/;
|
|
21
|
+
|
|
19
22
|
// src/contracts/wire-schema.ts
|
|
20
23
|
function createWireSchema(fail3, isValidationError) {
|
|
21
24
|
const own = (v, k) => Object.prototype.hasOwnProperty.call(v, k);
|
|
@@ -95,7 +98,7 @@ var parseSignalExperimentCreate = (v) => create.read(v, "experimentCreate");
|
|
|
95
98
|
var parseSignalExperimentUpdate = (v) => update.read(v, "experimentUpdate");
|
|
96
99
|
var SIGNAL_EXPERIMENT_CREATE_JSON_SCHEMA = create.schema;
|
|
97
100
|
var SIGNAL_EXPERIMENT_UPDATE_JSON_SCHEMA = update.schema;
|
|
98
|
-
var measurementUuid = text(36,
|
|
101
|
+
var measurementUuid = text(36, UUID_V1_TO_V8_PATTERN);
|
|
99
102
|
var measurementRevision = text(128, /^[a-zA-Z0-9._:-]+$/);
|
|
100
103
|
var measurementInstant = refine(text(30, /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/), (v, p) => {
|
|
101
104
|
if (!Number.isFinite(Date.parse(v)) || new Date(v).toISOString().replace(".000Z", "Z") !== v.replace(".000Z", "Z")) fail(p, "invalid UTC instant");
|
|
@@ -235,7 +238,7 @@ var fail2 = (path2, reason) => {
|
|
|
235
238
|
throw new ResonanceValidationError(path2, reason);
|
|
236
239
|
};
|
|
237
240
|
var { field: field2, text: text2, choice: choice2, literal: literal2, integer: integer2, bool, optional: optional2, nullable: nullable2, list: list2, object: object2, union: union2, refine: refine2 } = createWireSchema(fail2, (error) => error instanceof ResonanceValidationError);
|
|
238
|
-
var uuid2 = text2(36,
|
|
241
|
+
var uuid2 = text2(36, UUID_V1_TO_V8_PATTERN);
|
|
239
242
|
var digest = text2(64, /^[a-f0-9]{64}$/);
|
|
240
243
|
var revision = text2(128, /^[a-zA-Z0-9._:-]+$/);
|
|
241
244
|
var instant = refine2(text2(30, /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/), (v, p) => {
|
|
@@ -450,9 +453,16 @@ var websiteVisitFeed = object2({ profile: literal2(RESONANCE_WEBSITE_VISIT_PROFI
|
|
|
450
453
|
}), 100, 1) });
|
|
451
454
|
websiteVisitFeed.schema;
|
|
452
455
|
var providerReportingChannelIds = refine2(uniqueList(uuid2, 100, 1), (ids, p) => unique(ids.map((id) => id.toLowerCase()), p));
|
|
453
|
-
var
|
|
454
|
-
var
|
|
456
|
+
var RESONANCE_META_QUERY_ATTRIBUTION_WINDOWS = ["1d_click", "7d_click", "1d_view"];
|
|
457
|
+
var metaReportingQuery = object2({ channelId: uuid2, attributionWindow: choice2(...RESONANCE_META_QUERY_ATTRIBUTION_WINDOWS), actionReportTime: literal2("conversion"), basis: literal2("explicit_query") });
|
|
458
|
+
var providerReportingMetaQueries = refine2(list2(metaReportingQuery, 100, 1), (queries, p) => unique(queries.map((query) => query.channelId.toLowerCase()), p));
|
|
459
|
+
function checkReportingQuerySubset(v, p) {
|
|
460
|
+
if (v.metaQueries?.some((query) => !v.channelIds.some((id) => id.toLowerCase() === query.channelId.toLowerCase()))) fail2(p + ".metaQueries", "query channel must be selected");
|
|
461
|
+
}
|
|
462
|
+
var providerReportingSelection = refine2(object2({ agentContactId: uuid2, channelIds: providerReportingChannelIds, metaQueries: optional2(providerReportingMetaQueries) }), checkReportingQuerySubset);
|
|
463
|
+
var providerReportingGrant = refine2(object2({ purpose: literal2("provider_reporting_refresh"), orgId: uuid2, projectId: uuid2, agentContactId: uuid2, principalContactId: uuid2, channelIds: providerReportingChannelIds, metaQueries: optional2(providerReportingMetaQueries) }), (v, p) => {
|
|
455
464
|
if (v.agentContactId.toLowerCase() === v.principalContactId.toLowerCase()) fail2(p + ".principalContactId", "agent and human principal must remain distinct");
|
|
465
|
+
checkReportingQuerySubset(v, p);
|
|
456
466
|
});
|
|
457
467
|
providerReportingSelection.schema;
|
|
458
468
|
providerReportingGrant.schema;
|
|
@@ -617,6 +627,188 @@ function canonical(value) {
|
|
|
617
627
|
if (Array.isArray(value)) return "[" + value.map(canonical).join(",") + "]";
|
|
618
628
|
return "{" + Object.keys(value).sort().map((k) => JSON.stringify(k) + ":" + canonical(value[k])).join(",") + "}";
|
|
619
629
|
}
|
|
630
|
+
var positioningTarget = union2(
|
|
631
|
+
object2({ kind: literal2("broadcast"), channelId: uuid2 }),
|
|
632
|
+
object2({ kind: literal2("meta"), channelId: uuid2, creativeId: uuid2 }),
|
|
633
|
+
object2({ kind: literal2("google_search"), channelId: uuid2, adGroupKey: text2(80), adKey: text2(80) })
|
|
634
|
+
);
|
|
635
|
+
var positioningRequest = object2({
|
|
636
|
+
schemaVersion: literal2(1),
|
|
637
|
+
expectedRevision: integer2(1),
|
|
638
|
+
site,
|
|
639
|
+
destination: optional2(object2({ kind: choice2("existing_page", "funnel"), id: uuid2 })),
|
|
640
|
+
offerId: optional2(uuid2),
|
|
641
|
+
target: positioningTarget
|
|
642
|
+
});
|
|
643
|
+
var positioningWitnessFields = {
|
|
644
|
+
id: operationKey,
|
|
645
|
+
kind: choice2("page", "funnel", "offer", "brain", "buyer", "proof"),
|
|
646
|
+
sourceId: text2(160),
|
|
647
|
+
revision,
|
|
648
|
+
observedAt: instant,
|
|
649
|
+
expiresAt: instant,
|
|
650
|
+
permission: choice2("private", "public"),
|
|
651
|
+
certainty: choice2("verified", "reported", "conflicting")
|
|
652
|
+
};
|
|
653
|
+
var positioningWitness = refine2(object2(positioningWitnessFields), checkPositioningWitness);
|
|
654
|
+
var positioningText = (max) => refine2(text2(max), (value, at) => {
|
|
655
|
+
if (!value.trim() || /[\x00-\x08\x0b-\x1f\x7f]/.test(value)) fail2(at, "requires nonblank text without control characters");
|
|
656
|
+
});
|
|
657
|
+
var positioningEvidence = refine2(object2({ ...positioningWitnessFields, text: positioningText(1600) }), checkPositioningWitness);
|
|
658
|
+
function checkPositioningWitness(value, at) {
|
|
659
|
+
if (Date.parse(value.observedAt) >= Date.parse(value.expiresAt)) fail2(at, "requires a positive witness lifetime");
|
|
660
|
+
}
|
|
661
|
+
var positioningScopeFields = { schemaVersion: literal2(1), projectId: uuid2, campaignId: uuid2, request: positioningRequest, observedAt: instant, expiresAt: instant };
|
|
662
|
+
function checkPositioningWindow(value, at) {
|
|
663
|
+
if (Date.parse(value.observedAt) >= Date.parse(value.expiresAt)) fail2(at, "requires a positive review lifetime");
|
|
664
|
+
unique(value.evidence.map((item) => item.id), at + ".evidence");
|
|
665
|
+
if (value.evidence.some((item) => Date.parse(item.observedAt) > Date.parse(value.observedAt))) fail2(at + ".evidence", "witness observation postdates the preview");
|
|
666
|
+
}
|
|
667
|
+
var positioningContext = refine2(object2({
|
|
668
|
+
...positioningScopeFields,
|
|
669
|
+
orgId: uuid2,
|
|
670
|
+
evidence: list2(positioningEvidence, 32)
|
|
671
|
+
}), (value, at) => {
|
|
672
|
+
checkPositioningWindow(value, at);
|
|
673
|
+
if (value.evidence.reduce((total, witness) => total + witness.text.length, 0) > 16e3) {
|
|
674
|
+
fail2(at + ".evidence", "exceeds the combined source text budget");
|
|
675
|
+
}
|
|
676
|
+
});
|
|
677
|
+
var positioningEvidenceIds = uniqueList(operationKey, 8);
|
|
678
|
+
var positioningSupportedText = object2({ text: positioningText(320), evidenceIds: positioningEvidenceIds });
|
|
679
|
+
var positioningAlternative = refine2(object2({
|
|
680
|
+
text: positioningText(320),
|
|
681
|
+
kind: choice2("status_quo", "alternative"),
|
|
682
|
+
basis: choice2("evidence", "hypothesis"),
|
|
683
|
+
evidenceIds: positioningEvidenceIds
|
|
684
|
+
}), (value, at) => {
|
|
685
|
+
if (value.basis === "evidence" !== value.evidenceIds.length > 0) fail2(at, "requires evidence references exactly for evidenced alternatives");
|
|
686
|
+
});
|
|
687
|
+
var positioningClaim = object2({
|
|
688
|
+
attribute: positioningText(320),
|
|
689
|
+
value: positioningText(320),
|
|
690
|
+
evidenceIds: uniqueList(operationKey, 8, 1),
|
|
691
|
+
publicProofIds: positioningEvidenceIds
|
|
692
|
+
});
|
|
693
|
+
var positioningClaimIndexes = list2(integer2(0, 7), 8, 1);
|
|
694
|
+
var positioningCopy = union2(
|
|
695
|
+
object2({ kind: literal2("broadcast"), caption: positioningText(2200), claimIndexes: positioningClaimIndexes }),
|
|
696
|
+
object2({
|
|
697
|
+
kind: literal2("meta"),
|
|
698
|
+
primaryText: positioningText(2200),
|
|
699
|
+
headline: positioningText(160),
|
|
700
|
+
body: positioningText(1e4),
|
|
701
|
+
claimIndexes: positioningClaimIndexes
|
|
702
|
+
}),
|
|
703
|
+
object2({
|
|
704
|
+
kind: literal2("google_search"),
|
|
705
|
+
headlines: uniqueList(positioningText(30), 15, 3),
|
|
706
|
+
descriptions: uniqueList(positioningText(90), 4, 2),
|
|
707
|
+
claimIndexes: positioningClaimIndexes
|
|
708
|
+
})
|
|
709
|
+
);
|
|
710
|
+
var positioningReasonCodes = choice2(
|
|
711
|
+
"destination_missing",
|
|
712
|
+
"destination_unverified",
|
|
713
|
+
"offer_unverified",
|
|
714
|
+
"offer_conflicting",
|
|
715
|
+
"brain_unavailable",
|
|
716
|
+
"buyer_evidence_sparse",
|
|
717
|
+
"public_proof_unavailable",
|
|
718
|
+
"fit_not_established",
|
|
719
|
+
"status_quo_sufficient",
|
|
720
|
+
"channel_mismatch",
|
|
721
|
+
"source_stale",
|
|
722
|
+
"evidence_conflicting",
|
|
723
|
+
"generation_unavailable"
|
|
724
|
+
);
|
|
725
|
+
var RESONANCE_POSITIONING_METHOD_VERSION = "positioning_v1";
|
|
726
|
+
var positioningResult = refine2(object2({
|
|
727
|
+
methodVersion: literal2(RESONANCE_POSITIONING_METHOD_VERSION),
|
|
728
|
+
state: choice2("ready", "provisional", "no_fit"),
|
|
729
|
+
reasonCodes: uniqueList(positioningReasonCodes, 12),
|
|
730
|
+
alternatives: list2(positioningAlternative, 8),
|
|
731
|
+
claims: list2(positioningClaim, 8),
|
|
732
|
+
bestFit: list2(positioningSupportedText, 8),
|
|
733
|
+
category: nullable2(object2({ text: positioningText(160), style: choice2("existing_category", "focused_subcategory", "new_category"), evidenceIds: positioningEvidenceIds })),
|
|
734
|
+
timelyContext: nullable2(positioningSupportedText),
|
|
735
|
+
unknowns: list2(positioningText(320), 8),
|
|
736
|
+
questions: list2(positioningText(320), 8),
|
|
737
|
+
copy: nullable2(positioningCopy)
|
|
738
|
+
}), (value, at) => {
|
|
739
|
+
if (value.state !== "ready") {
|
|
740
|
+
if (value.copy || !value.reasonCodes.length) fail2(at, "requires a reason and no draft copy when held");
|
|
741
|
+
return;
|
|
742
|
+
}
|
|
743
|
+
const { copy, claims, category, bestFit, alternatives } = value;
|
|
744
|
+
if (!copy || value.reasonCodes.length || !claims.length || !category || !bestFit.length || !alternatives.length) {
|
|
745
|
+
return fail2(at, "requires a supported ready brief and channel draft");
|
|
746
|
+
}
|
|
747
|
+
unique(copy.claimIndexes.map(String), at + ".copy.claimIndexes");
|
|
748
|
+
if (copy.claimIndexes.some((index) => index >= claims.length)) fail2(at + ".copy.claimIndexes", "requires an existing claim index");
|
|
749
|
+
});
|
|
750
|
+
function checkPositioningEvidence(result, context, at) {
|
|
751
|
+
const evidence = new Map(context.evidence.map((witness) => [witness.id, witness]));
|
|
752
|
+
const current = (witness) => witness.certainty === "verified" && Date.parse(witness.expiresAt) >= Date.parse(context.expiresAt);
|
|
753
|
+
const cited = [
|
|
754
|
+
...result.alternatives,
|
|
755
|
+
...result.claims,
|
|
756
|
+
...result.bestFit,
|
|
757
|
+
...result.category ? [result.category] : [],
|
|
758
|
+
...result.timelyContext ? [result.timelyContext] : []
|
|
759
|
+
];
|
|
760
|
+
if (cited.some((item) => item.evidenceIds.some((id) => !evidence.has(id)))) fail2(at, "references unknown evidence");
|
|
761
|
+
for (const claim of result.claims) {
|
|
762
|
+
for (const id of claim.publicProofIds) {
|
|
763
|
+
const witness = evidence.get(id);
|
|
764
|
+
if (!witness || witness.permission !== "public" || !current(witness)) fail2(at, "public proof requires a current permitted witness");
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
if (result.timelyContext && (!result.timelyContext.evidenceIds.length || result.timelyContext.evidenceIds.some((id) => {
|
|
768
|
+
const witness = evidence.get(id);
|
|
769
|
+
return !witness || !current(witness);
|
|
770
|
+
}))) fail2(at, "timely context requires current verified evidence");
|
|
771
|
+
if (!result.copy) return;
|
|
772
|
+
if (result.copy.kind !== context.request.target.kind) fail2(at, "copy target differs from the request");
|
|
773
|
+
const { destination: selected, offerId } = context.request;
|
|
774
|
+
const owns = (kind, id) => {
|
|
775
|
+
const witnesses = context.evidence.filter((w) => w.kind === kind && (!id || w.sourceId.toLowerCase() === id.toLowerCase()));
|
|
776
|
+
return witnesses.some(current) && !witnesses.some((w) => w.certainty === "conflicting");
|
|
777
|
+
};
|
|
778
|
+
if (!selected || !owns(selected.kind === "existing_page" ? "page" : "funnel", selected.id) || !owns("brain") || offerId && !owns("offer", offerId)) {
|
|
779
|
+
fail2(at, "ready copy requires current destination, Brain and selected offer witnesses");
|
|
780
|
+
}
|
|
781
|
+
for (const index of result.copy.claimIndexes) {
|
|
782
|
+
const claim = result.claims[index];
|
|
783
|
+
if (![...claim.evidenceIds, ...claim.publicProofIds].every((id) => {
|
|
784
|
+
const witness = evidence.get(id);
|
|
785
|
+
return witness && witness.permission === "public" && current(witness);
|
|
786
|
+
})) fail2(at, "selected copy requires current verified public claim evidence");
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
var positioningApplicationToken = text2(32e3, /^[a-zA-Z0-9._-]+$/);
|
|
790
|
+
var positioningPreview = refine2(object2({
|
|
791
|
+
...positioningScopeFields,
|
|
792
|
+
evidence: list2(positioningWitness, 32),
|
|
793
|
+
result: positioningResult,
|
|
794
|
+
applicationToken: nullable2(positioningApplicationToken)
|
|
795
|
+
}), (value, at) => {
|
|
796
|
+
checkPositioningWindow(value, at);
|
|
797
|
+
checkPositioningEvidence(value.result, value, at + ".result");
|
|
798
|
+
if (value.result.state === "ready" !== (value.applicationToken !== null)) fail2(at, "requires an application token exactly for ready copy");
|
|
799
|
+
});
|
|
800
|
+
var positioningApplyRequest = object2({ applicationToken: positioningApplicationToken });
|
|
801
|
+
positioningRequest.schema;
|
|
802
|
+
positioningContext.schema;
|
|
803
|
+
positioningResult.schema;
|
|
804
|
+
positioningPreview.schema;
|
|
805
|
+
positioningApplyRequest.schema;
|
|
806
|
+
var positioningConsistencyAssessment = object2({
|
|
807
|
+
state: choice2("compatible", "conflicting", "unknown"),
|
|
808
|
+
evidenceDigest: digest,
|
|
809
|
+
coveredSourceIds: uniqueList(operationKey, 32)
|
|
810
|
+
});
|
|
811
|
+
positioningConsistencyAssessment.schema;
|
|
620
812
|
var prepareCommand = object2({ expectedRevision: integer2(1), idempotencyKey: operationKey });
|
|
621
813
|
var commandPreparation = object2({ command: nullable2(command), covered: bool, approvalRequirement: nullable2(choice2("existing_mandate", "current_owner")), reasonCodes: list2(text2(200), 100) });
|
|
622
814
|
prepareCommand.schema;
|
|
@@ -981,7 +1173,256 @@ measurementSave.schema;
|
|
|
981
1173
|
measurementCurrent.schema;
|
|
982
1174
|
measurementSnapshot.schema;
|
|
983
1175
|
measurementSaveResponse.schema;
|
|
984
|
-
var
|
|
1176
|
+
var nativeAudienceId = text2(160, /^[0-9]+(?![\s\S])/);
|
|
1177
|
+
var RESONANCE_META_DATASET_NAME_MAX_LENGTH = 160;
|
|
1178
|
+
var metaDatasetName = refine2(text2(RESONANCE_META_DATASET_NAME_MAX_LENGTH), (value, at) => {
|
|
1179
|
+
if (!value.trim() || value !== value.trim() || /[\x00-\x1f\x7f]/.test(value)) fail2(at, "requires a trimmed dataset name without control characters");
|
|
1180
|
+
});
|
|
1181
|
+
var metaDatasetExistingSelection = object2({ kind: literal2("existing"), externalId: nativeAudienceId });
|
|
1182
|
+
var metaDatasetSetupSelection = union2(
|
|
1183
|
+
metaDatasetExistingSelection,
|
|
1184
|
+
object2({ kind: literal2("create_if_none"), name: metaDatasetName })
|
|
1185
|
+
);
|
|
1186
|
+
var metaDatasetSetupPrepareFields = {
|
|
1187
|
+
schemaVersion: literal2(1),
|
|
1188
|
+
site,
|
|
1189
|
+
accountBindingId: uuid2,
|
|
1190
|
+
expectedDraftRevision: integer2(1),
|
|
1191
|
+
idempotencyKey: operationKey,
|
|
1192
|
+
selection: metaDatasetSetupSelection
|
|
1193
|
+
};
|
|
1194
|
+
var metaDatasetSetupPrepare = object2(metaDatasetSetupPrepareFields);
|
|
1195
|
+
metaDatasetSetupPrepare.schema;
|
|
1196
|
+
var metaDatasetSelectionRequest = object2({ ...metaDatasetSetupPrepareFields, selection: metaDatasetExistingSelection });
|
|
1197
|
+
var metaDatasetSelectionWitness = object2({ externalId: nativeAudienceId, resourceRevision: revision, observedAt: instant });
|
|
1198
|
+
metaDatasetSelectionRequest.schema;
|
|
1199
|
+
metaDatasetSelectionWitness.schema;
|
|
1200
|
+
var metaSetupOwnerFields = {
|
|
1201
|
+
orgId: uuid2,
|
|
1202
|
+
projectId: uuid2,
|
|
1203
|
+
campaignId: uuid2,
|
|
1204
|
+
connectionId: uuid2,
|
|
1205
|
+
accountBindingRevision: integer2(1),
|
|
1206
|
+
connectionRevision: revision,
|
|
1207
|
+
capabilityRevision: revision,
|
|
1208
|
+
expectedKillRevision: integer2(0),
|
|
1209
|
+
externalAccountId: nativeAudienceId,
|
|
1210
|
+
businessId: nativeAudienceId
|
|
1211
|
+
};
|
|
1212
|
+
var metaDatasetSetupIntent = object2({ ...metaDatasetSetupPrepareFields, ...metaSetupOwnerFields });
|
|
1213
|
+
var metaDatasetSetupReview = object2({ intent: metaDatasetSetupIntent, requestDigest: digest });
|
|
1214
|
+
metaDatasetSetupReview.schema;
|
|
1215
|
+
var metaDatasetSetupFirstOutcome = object2({
|
|
1216
|
+
admission: choice2("accepted", "rejected", "unknown"),
|
|
1217
|
+
externalId: nullable2(nativeAudienceId),
|
|
1218
|
+
providerRequestId: nullable2(text2(200)),
|
|
1219
|
+
providerRequestDigest: digest
|
|
1220
|
+
});
|
|
1221
|
+
var metaSetupVerificationFields = {
|
|
1222
|
+
externalId: nativeAudienceId,
|
|
1223
|
+
externalAccountId: nativeAudienceId,
|
|
1224
|
+
businessId: nativeAudienceId,
|
|
1225
|
+
resourceRevision: revision,
|
|
1226
|
+
observedAt: instant
|
|
1227
|
+
};
|
|
1228
|
+
var metaDatasetSetupVerification = object2(metaSetupVerificationFields);
|
|
1229
|
+
var metaSetupReceiptFields = {
|
|
1230
|
+
schemaVersion: literal2(1),
|
|
1231
|
+
operationId: uuid2,
|
|
1232
|
+
projectId: uuid2,
|
|
1233
|
+
campaignId: uuid2,
|
|
1234
|
+
site,
|
|
1235
|
+
accountBindingId: uuid2,
|
|
1236
|
+
requestDigest: digest,
|
|
1237
|
+
status: choice2("pending", "selected", "created_unverified", "verified", "rejected", "uncertain", "cancelled"),
|
|
1238
|
+
firstOutcome: nullable2(metaDatasetSetupFirstOutcome),
|
|
1239
|
+
reasonCodes: uniqueList(text2(80, /^[a-z][a-z0-9_]*$/), 30)
|
|
1240
|
+
};
|
|
1241
|
+
function checkMetaSetupReceipt(value, at, resource2) {
|
|
1242
|
+
const { status, firstOutcome, currentVerification } = value;
|
|
1243
|
+
if (firstOutcome && firstOutcome.admission === "accepted" !== (firstOutcome.externalId !== null)) {
|
|
1244
|
+
fail2(at + ".firstOutcome", "requires the original provider ID exactly when creation was accepted");
|
|
1245
|
+
}
|
|
1246
|
+
switch (status) {
|
|
1247
|
+
case "pending":
|
|
1248
|
+
case "cancelled":
|
|
1249
|
+
if (firstOutcome || currentVerification) fail2(at, "cannot carry a creation outcome or verification");
|
|
1250
|
+
break;
|
|
1251
|
+
case "selected":
|
|
1252
|
+
if (firstOutcome || !currentVerification) fail2(at, "requires verified existing selection without a creation outcome");
|
|
1253
|
+
break;
|
|
1254
|
+
case "created_unverified":
|
|
1255
|
+
if (firstOutcome?.admission !== "accepted" || currentVerification) fail2(at, "requires accepted creation and no verified readback");
|
|
1256
|
+
break;
|
|
1257
|
+
case "verified":
|
|
1258
|
+
if (firstOutcome?.admission !== "accepted" || !currentVerification || firstOutcome.externalId !== currentVerification.externalId) {
|
|
1259
|
+
fail2(at, `requires verified readback of the exact created ${resource2}`);
|
|
1260
|
+
}
|
|
1261
|
+
break;
|
|
1262
|
+
case "rejected":
|
|
1263
|
+
if (firstOutcome?.admission !== "rejected") fail2(at, "requires the original rejection");
|
|
1264
|
+
break;
|
|
1265
|
+
case "uncertain":
|
|
1266
|
+
if (firstOutcome?.admission !== "unknown" || currentVerification) fail2(at, `requires an unknown outcome without an attributable ${resource2}`);
|
|
1267
|
+
break;
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
var metaSetupReceiptState = object2({ ...metaSetupReceiptFields, currentVerification: nullable2(metaDatasetSetupVerification) });
|
|
1271
|
+
var metaDatasetSetupReceipt = refine2(metaSetupReceiptState, (value, at) => checkMetaSetupReceipt(value, at, "dataset"));
|
|
1272
|
+
metaDatasetSetupReceipt.schema;
|
|
1273
|
+
var metaAudienceSetupResource = object2({ externalId: nativeAudienceId, resourceRevision: revision });
|
|
1274
|
+
var metaAudienceSetupSelection = union2(
|
|
1275
|
+
object2({ kind: literal2("existing"), externalId: nativeAudienceId, resourceRevision: revision }),
|
|
1276
|
+
object2({ kind: literal2("create_if_none") })
|
|
1277
|
+
);
|
|
1278
|
+
var websiteVisitSetupChoice = union2(
|
|
1279
|
+
object2({ kind: literal2("off") }),
|
|
1280
|
+
object2({ kind: literal2("enable"), expiresAt: instant })
|
|
1281
|
+
);
|
|
1282
|
+
var metaAudienceSetupPrepareFields = {
|
|
1283
|
+
schemaVersion: literal2(1),
|
|
1284
|
+
site,
|
|
1285
|
+
accountBindingId: uuid2,
|
|
1286
|
+
expectedDraftRevision: integer2(1),
|
|
1287
|
+
idempotencyKey: operationKey,
|
|
1288
|
+
dataset: metaAudienceSetupResource,
|
|
1289
|
+
audienceRule: measurementRuleRef,
|
|
1290
|
+
selection: metaAudienceSetupSelection,
|
|
1291
|
+
feed: websiteVisitSetupChoice
|
|
1292
|
+
};
|
|
1293
|
+
var metaAudienceSetupPrepare = object2(metaAudienceSetupPrepareFields);
|
|
1294
|
+
metaAudienceSetupPrepare.schema;
|
|
1295
|
+
var metaAudienceSetupIntent = refine2(object2({
|
|
1296
|
+
...metaAudienceSetupPrepareFields,
|
|
1297
|
+
...metaSetupOwnerFields,
|
|
1298
|
+
audienceRuleRef: audience,
|
|
1299
|
+
resourceRuleRef: measurementRuleRef,
|
|
1300
|
+
excludedResourceRuleRefs: list2(measurementRuleRef, 50),
|
|
1301
|
+
measurementConfigRef,
|
|
1302
|
+
matchingProfileRef,
|
|
1303
|
+
audienceSpecDigest: digest,
|
|
1304
|
+
name: friendlyName,
|
|
1305
|
+
expiresAt: instant
|
|
1306
|
+
}), (value, at) => {
|
|
1307
|
+
const { audienceRule, audienceRuleRef, resourceRuleRef, excludedResourceRuleRefs, measurementConfigRef: measurementConfigRef2 } = value;
|
|
1308
|
+
if (audienceRuleRef.projectId !== value.projectId || audienceRuleRef.site !== value.site || audienceRuleRef.id !== audienceRule.id || audienceRuleRef.revision !== audienceRule.revision || audienceRuleRef.policyRevision !== measurementConfigRef2.policyRevision) fail2(at + ".audienceRuleRef", "requires the exact scoped audience and policy revision");
|
|
1309
|
+
const excludedIds = excludedResourceRuleRefs.map((ref) => ref.id);
|
|
1310
|
+
unique(excludedIds, at + ".excludedResourceRuleRefs");
|
|
1311
|
+
if (excludedIds.includes(resourceRuleRef.id) || canonical([...audienceRuleRef.exclusionRuleIds].sort()) !== canonical(excludedIds.sort())) {
|
|
1312
|
+
fail2(at + ".excludedResourceRuleRefs", "requires the exact exclusions disjoint from the positive rule");
|
|
1313
|
+
}
|
|
1314
|
+
checkAudienceBand(audienceRuleRef, "meta_ads", at + ".audienceRuleRef");
|
|
1315
|
+
});
|
|
1316
|
+
var metaAudienceSetupReview = object2({ intent: metaAudienceSetupIntent, requestDigest: digest });
|
|
1317
|
+
metaAudienceSetupReview.schema;
|
|
1318
|
+
var META_WEBSITE_AUDIENCE_MAX_RETENTION_DAYS = 180;
|
|
1319
|
+
var metaAudienceSetupVerification = object2({
|
|
1320
|
+
...metaSetupVerificationFields,
|
|
1321
|
+
datasetExternalId: nativeAudienceId,
|
|
1322
|
+
datasetResourceRevision: revision,
|
|
1323
|
+
audienceSpecDigest: digest,
|
|
1324
|
+
retentionDays: integer2(1, META_WEBSITE_AUDIENCE_MAX_RETENTION_DAYS)
|
|
1325
|
+
});
|
|
1326
|
+
var metaAudienceSetupReceipt = refine2(object2({
|
|
1327
|
+
...metaSetupReceiptFields,
|
|
1328
|
+
currentVerification: nullable2(metaAudienceSetupVerification)
|
|
1329
|
+
}), (value, at) => checkMetaSetupReceipt(value, at, "audience"));
|
|
1330
|
+
metaAudienceSetupReceipt.schema;
|
|
1331
|
+
var websiteVisitSetupGrantProof = refine2(object2({
|
|
1332
|
+
schemaVersion: literal2(1),
|
|
1333
|
+
grantOperationId: uuid2,
|
|
1334
|
+
audienceOperationId: uuid2,
|
|
1335
|
+
approvalActionId: uuid2,
|
|
1336
|
+
requestDigest: digest,
|
|
1337
|
+
audienceReceiptDigest: digest,
|
|
1338
|
+
generation: integer2(1),
|
|
1339
|
+
activatedAt: instant,
|
|
1340
|
+
expiresAt: instant,
|
|
1341
|
+
projectId: uuid2,
|
|
1342
|
+
campaignId: uuid2,
|
|
1343
|
+
site,
|
|
1344
|
+
accountBindingId: uuid2,
|
|
1345
|
+
audience: metaAudienceSetupVerification
|
|
1346
|
+
}), (value, at) => {
|
|
1347
|
+
if (value.grantOperationId.toLowerCase() === value.audienceOperationId.toLowerCase()) fail2(at + ".grantOperationId", "requires a distinct native grant operation");
|
|
1348
|
+
if (Date.parse(value.audience.observedAt) > Date.parse(value.activatedAt) || Date.parse(value.activatedAt) >= Date.parse(value.expiresAt)) fail2(at, "requires verification by activation and a nonempty grant window");
|
|
1349
|
+
});
|
|
1350
|
+
var websiteVisitSetupGrantStatus = refine2(object2({
|
|
1351
|
+
proof: websiteVisitSetupGrantProof,
|
|
1352
|
+
status: choice2("active", "revoked", "expired", "invalidated"),
|
|
1353
|
+
checkedAt: instant,
|
|
1354
|
+
revokedAt: nullable2(instant),
|
|
1355
|
+
reasonCodes: metaSetupReceiptFields.reasonCodes
|
|
1356
|
+
}), (value, at) => {
|
|
1357
|
+
const checked = Date.parse(value.checkedAt), activated = Date.parse(value.proof.activatedAt), expires = Date.parse(value.proof.expiresAt);
|
|
1358
|
+
if (checked < activated) fail2(at + ".checkedAt", "cannot predate activation");
|
|
1359
|
+
if (value.status === "revoked") {
|
|
1360
|
+
if (!value.revokedAt || Date.parse(value.revokedAt) < activated || Date.parse(value.revokedAt) > checked) {
|
|
1361
|
+
fail2(at + ".revokedAt", "requires the recorded revocation between activation and observation");
|
|
1362
|
+
}
|
|
1363
|
+
} else if (value.revokedAt) fail2(at + ".revokedAt", "requires revoked status");
|
|
1364
|
+
if (value.status === "active" && checked >= expires || value.status === "expired" && checked < expires) {
|
|
1365
|
+
fail2(at + ".status", "must agree with the original expiry");
|
|
1366
|
+
}
|
|
1367
|
+
});
|
|
1368
|
+
websiteVisitSetupGrantProof.schema;
|
|
1369
|
+
websiteVisitSetupGrantStatus.schema;
|
|
1370
|
+
var metaAudienceSetupStatusFields = { receipt: metaAudienceSetupReceipt, grant: nullable2(websiteVisitSetupGrantStatus) };
|
|
1371
|
+
function checkMetaAudienceSetupStatus({ receipt: receipt2, grant }, at) {
|
|
1372
|
+
if (!grant) return;
|
|
1373
|
+
const { proof } = grant;
|
|
1374
|
+
if (receipt2.status !== "selected" && receipt2.status !== "verified" || !receipt2.currentVerification || canonical(receipt2.currentVerification) !== canonical(proof.audience)) {
|
|
1375
|
+
fail2(at + ".grant", "requires the same verified audience witness as the setup receipt");
|
|
1376
|
+
}
|
|
1377
|
+
if (proof.audienceOperationId !== receipt2.operationId || proof.requestDigest !== receipt2.requestDigest || proof.projectId !== receipt2.projectId || proof.campaignId !== receipt2.campaignId || proof.site !== receipt2.site || proof.accountBindingId !== receipt2.accountBindingId) {
|
|
1378
|
+
fail2(at + ".grant", "requires the grant linked to this exact setup operation");
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
var metaAudienceSetupStatusShape = object2(metaAudienceSetupStatusFields);
|
|
1382
|
+
var metaAudienceSetupStatus = refine2(metaAudienceSetupStatusShape, checkMetaAudienceSetupStatus);
|
|
1383
|
+
metaAudienceSetupStatus.schema;
|
|
1384
|
+
var metaAudienceSetupListItem = refine2(object2({ ledgerActionId: uuid2, ...metaAudienceSetupStatusFields }), (item, at) => {
|
|
1385
|
+
checkMetaAudienceSetupStatus(item, at);
|
|
1386
|
+
if (item.grant && item.grant.proof.approvalActionId.toLowerCase() !== item.ledgerActionId.toLowerCase()) {
|
|
1387
|
+
fail2(at + ".ledgerActionId", "requires the original approval linked to this grant");
|
|
1388
|
+
}
|
|
1389
|
+
});
|
|
1390
|
+
var metaAudienceSetupList = refine2(object2({
|
|
1391
|
+
items: list2(metaAudienceSetupListItem, 25),
|
|
1392
|
+
nextCursor: nullable2(uuid2)
|
|
1393
|
+
}), ({ items }, at) => {
|
|
1394
|
+
unique(items.map((item) => item.receipt.operationId.toLowerCase()), at + ".items");
|
|
1395
|
+
});
|
|
1396
|
+
metaAudienceSetupList.schema;
|
|
1397
|
+
refine2(object2({
|
|
1398
|
+
proof: websiteVisitSetupGrantProof,
|
|
1399
|
+
intent: metaAudienceSetupIntent
|
|
1400
|
+
}), (value, at) => {
|
|
1401
|
+
const { proof, intent } = value;
|
|
1402
|
+
const { audience: witness } = proof;
|
|
1403
|
+
if (intent.feed.kind !== "enable" || Date.parse(intent.feed.expiresAt) !== Date.parse(proof.expiresAt) || Date.parse(proof.activatedAt) >= Date.parse(intent.expiresAt)) fail2(at, "requires the explicit original opt-in and an unexpired setup approval");
|
|
1404
|
+
if (proof.projectId !== intent.projectId || proof.campaignId !== intent.campaignId || proof.site !== intent.site || proof.accountBindingId !== intent.accountBindingId || witness.externalAccountId !== intent.externalAccountId || witness.businessId !== intent.businessId || witness.datasetExternalId !== intent.dataset.externalId || witness.datasetResourceRevision !== intent.dataset.resourceRevision || witness.audienceSpecDigest !== intent.audienceSpecDigest || witness.retentionDays !== intent.audienceRuleRef.retentionDays) {
|
|
1405
|
+
fail2(at, "requires the exact original scope and verified destination");
|
|
1406
|
+
}
|
|
1407
|
+
if (intent.selection.kind === "existing" && (witness.externalId !== intent.selection.externalId || witness.resourceRevision !== intent.selection.resourceRevision)) {
|
|
1408
|
+
fail2(at, "requires verification of the exact existing audience");
|
|
1409
|
+
}
|
|
1410
|
+
});
|
|
1411
|
+
var websiteVisitSetupOrigin = object2({ kind: literal2("setup"), grantOperationId: uuid2, generation: integer2(1) });
|
|
1412
|
+
var websiteVisitSetupAcceptedVisitFields = { acceptedVisits: integer2(0), checkedAt: instant };
|
|
1413
|
+
var websiteVisitSetupGrantAcceptedVisits = object2({ grantOperationId: uuid2, ...websiteVisitSetupAcceptedVisitFields });
|
|
1414
|
+
websiteVisitSetupGrantAcceptedVisits.schema;
|
|
1415
|
+
var websiteVisitSetupDeliveryCommand = object2({
|
|
1416
|
+
schemaVersion: literal2(1),
|
|
1417
|
+
operation: literal2("deliver_website_visit"),
|
|
1418
|
+
campaignId: uuid2,
|
|
1419
|
+
occurrenceId: uuid2,
|
|
1420
|
+
idempotencyKey: operationKey,
|
|
1421
|
+
setupOrigin: websiteVisitSetupOrigin
|
|
1422
|
+
});
|
|
1423
|
+
websiteVisitSetupDeliveryCommand.schema;
|
|
1424
|
+
object2({ activatedAt: instant, expiresAt: instant, now: instant });
|
|
1425
|
+
var nativeAudienceRef = object2({ externalId: nativeAudienceId, revision: digest });
|
|
985
1426
|
var metaSave = refine2(object2({
|
|
986
1427
|
schemaVersion: literal2(1),
|
|
987
1428
|
expectedCampaignRevision: integer2(1),
|
|
@@ -1063,6 +1504,80 @@ var metaView = refine2(union2(
|
|
|
1063
1504
|
if (v.projectId !== s.projectId || v.campaignId !== s.campaignId || v.channelId !== s.channelId || v.configurationRevision !== s.configurationRevision) fail2(p, "snapshot identity or configuration CAS mismatch");
|
|
1064
1505
|
if (v.readyForReview !== metaReviewable(s, v)) fail2(p + ".readyForReview", "must reflect current review prerequisites only");
|
|
1065
1506
|
});
|
|
1507
|
+
var RESONANCE_META_AUDIENCE_VERDICTS = ["ready", "too_small", "blocked", "unknown"];
|
|
1508
|
+
var RESONANCE_META_AUDIENCE_REASONS = [
|
|
1509
|
+
"meta_audience_status_unreadable",
|
|
1510
|
+
"meta_audience_status_unrecognized",
|
|
1511
|
+
"meta_audience_integrity_flagged",
|
|
1512
|
+
"meta_audience_account_inactive",
|
|
1513
|
+
"meta_audience_pixel_problem",
|
|
1514
|
+
"meta_audience_error",
|
|
1515
|
+
"meta_audience_out_of_date",
|
|
1516
|
+
"meta_audience_too_small",
|
|
1517
|
+
"meta_audience_not_usable",
|
|
1518
|
+
"meta_audience_prefill_failed",
|
|
1519
|
+
"meta_audience_filling",
|
|
1520
|
+
"meta_audience_category_unknown",
|
|
1521
|
+
"meta_url_audience_unverified",
|
|
1522
|
+
"meta_core_setup_suspected",
|
|
1523
|
+
"meta_audience_fill_mismatch",
|
|
1524
|
+
"meta_core_setup_attestation_missing",
|
|
1525
|
+
"meta_flight_too_short_after_wait",
|
|
1526
|
+
"meta_terms_nondiscrimination_pending",
|
|
1527
|
+
"meta_terms_custom_audience_unconfirmed",
|
|
1528
|
+
"meta_terms_business_tools_pending",
|
|
1529
|
+
"meta_special_category_age_must_be_provider_managed",
|
|
1530
|
+
"meta_special_category_genders_not_allowed",
|
|
1531
|
+
"meta_audience_name_sensitive"
|
|
1532
|
+
];
|
|
1533
|
+
var metaReadinessPage = object2({ resourceRuleRef: measurementRuleRef, path: observedPagePath, label: nullable2(friendlyName) });
|
|
1534
|
+
var metaAudienceSize = refine2(object2({ lower: integer2(0), upper: integer2(0) }), (v, p) => {
|
|
1535
|
+
if (v.upper < v.lower) fail2(p, "size bounds must be ordered");
|
|
1536
|
+
});
|
|
1537
|
+
var metaAudienceReadinessFields = {
|
|
1538
|
+
verdict: choice2(...RESONANCE_META_AUDIENCE_VERDICTS),
|
|
1539
|
+
reasonCodes: uniqueList(choice2(...RESONANCE_META_AUDIENCE_REASONS), 50),
|
|
1540
|
+
size: nullable2(metaAudienceSize)
|
|
1541
|
+
};
|
|
1542
|
+
var metaAudienceSetupReadiness = refine2(object2({
|
|
1543
|
+
status: metaAudienceSetupStatus,
|
|
1544
|
+
delivery: nullable2(object2(websiteVisitSetupAcceptedVisitFields)),
|
|
1545
|
+
providerAudience: nullable2(object2({ externalId: nativeAudienceId, observedAt: instant, readiness: object2(metaAudienceReadinessFields) }))
|
|
1546
|
+
}), ({ status, delivery, providerAudience }, at) => {
|
|
1547
|
+
if (delivery && (!status.grant || Date.parse(delivery.checkedAt) < Date.parse(status.grant.proof.activatedAt))) {
|
|
1548
|
+
fail2(at + ".delivery", "requires the grant and an observation at or after activation");
|
|
1549
|
+
}
|
|
1550
|
+
if (providerAudience && (status.receipt.status !== "selected" && status.receipt.status !== "verified" || status.receipt.currentVerification?.externalId !== providerAudience.externalId)) {
|
|
1551
|
+
fail2(at + ".providerAudience", "requires observation of the exact verified audience");
|
|
1552
|
+
}
|
|
1553
|
+
});
|
|
1554
|
+
metaAudienceSetupReadiness.schema;
|
|
1555
|
+
var metaReadinessCheck = union2(
|
|
1556
|
+
object2({ state: literal2("not_checked"), reasonCode: choice2("configuration_unavailable", "native_mapping_unavailable") }),
|
|
1557
|
+
object2({ state: literal2("observed"), mappingSource: choice2("selected_external_audience", "current_materialized_audience"), ...metaAudienceReadinessFields, observedAt: instant, expiresAt: nullable2(instant), sizeObservedAt: literal2(null), sizeExpiresAt: literal2(null) })
|
|
1558
|
+
);
|
|
1559
|
+
var metaReadinessAudience = object2({ audienceRuleRef: audience, name: friendlyName, includedPage: metaReadinessPage, excludedPages: list2(metaReadinessPage, 50), nativeAudienceId: nullable2(nativeAudienceId), check: metaReadinessCheck });
|
|
1560
|
+
var metaRetargetingReadiness = refine2(object2({ schemaVersion: literal2(1), projectId: uuid2, campaignId: uuid2, channelId: uuid2, site, campaignRevision: integer2(1), accountBindingId: uuid2, configuration: metaView, audiences: list2(metaReadinessAudience, 50) }), (v, p) => {
|
|
1561
|
+
const sameId = (a, b) => a.toLowerCase() === b.toLowerCase();
|
|
1562
|
+
const config = v.configuration;
|
|
1563
|
+
if (!sameId(config.projectId, v.projectId) || !sameId(config.campaignId, v.campaignId) || !sameId(config.channelId, v.channelId)) fail2(p + ".configuration", "configuration scope mismatch");
|
|
1564
|
+
if (config.kind === "configured" && (config.currentCampaignRevision !== v.campaignRevision || config.snapshot.site !== v.site || !sameId(config.snapshot.account.id, v.accountBindingId))) fail2(p + ".configuration", "current configuration revision, site or account mismatch");
|
|
1565
|
+
unique(v.audiences.map((row) => row.audienceRuleRef.id.toLowerCase()), p + ".audiences");
|
|
1566
|
+
for (const row of v.audiences) {
|
|
1567
|
+
if (!sameId(row.audienceRuleRef.projectId, v.projectId) || row.audienceRuleRef.site !== v.site) fail2(p + ".audiences", "audience scope mismatch");
|
|
1568
|
+
const excluded = row.excludedPages.map((page2) => page2.resourceRuleRef.id.toLowerCase());
|
|
1569
|
+
unique(excluded, p + ".audiences.excludedPages");
|
|
1570
|
+
const expected = row.audienceRuleRef.exclusionRuleIds.map((id) => id.toLowerCase());
|
|
1571
|
+
unique(expected, p + ".audiences.audienceRuleRef.exclusionRuleIds");
|
|
1572
|
+
if (excluded.includes(row.includedPage.resourceRuleRef.id.toLowerCase()) || excluded.length !== expected.length || expected.some((id) => !excluded.includes(id))) fail2(p + ".audiences.excludedPages", "exclusion rule scope mismatch");
|
|
1573
|
+
if (row.check.state === "observed" && (row.nativeAudienceId === null || config.kind !== "configured")) fail2(p + ".audiences.check", "observed check requires configured scope and actual native audience identity");
|
|
1574
|
+
if (config.kind === "configured" && config.currentDefinitionDigest === config.snapshot.reviewedDefinitionDigest) {
|
|
1575
|
+
const original = config.snapshot.audiences.find((a) => sameId(a.audienceRuleRef.id, row.audienceRuleRef.id));
|
|
1576
|
+
if (!original || canonical(original.audienceRuleRef) !== canonical(row.audienceRuleRef) || canonical(original.resourceRuleRef) !== canonical(row.includedPage.resourceRuleRef) || original.excludedResourceRuleRefs.length !== row.excludedPages.length || original.excludedResourceRuleRefs.some((ref) => !row.excludedPages.some((page2) => canonical(page2.resourceRuleRef) === canonical(ref)))) fail2(p + ".audiences", "original audience and page rule versions must match");
|
|
1577
|
+
}
|
|
1578
|
+
}
|
|
1579
|
+
});
|
|
1580
|
+
metaRetargetingReadiness.schema;
|
|
1066
1581
|
var metaSaveResponse = object2({ schemaVersion: literal2(1), snapshot: metaSnapshot, replayed: bool });
|
|
1067
1582
|
metaSave.schema;
|
|
1068
1583
|
metaSnapshot.schema;
|
|
@@ -1100,7 +1615,6 @@ var observationsPage = object2({ items: list2(publicObservationMetric, 500), nex
|
|
|
1100
1615
|
publicObservationMetric.schema;
|
|
1101
1616
|
observationSupport.schema;
|
|
1102
1617
|
observationsPage.schema;
|
|
1103
|
-
var META_WEBSITE_AUDIENCE_MAX_RETENTION_DAYS = 180;
|
|
1104
1618
|
var META_AUDIENCE_RULE_LIMIT = 10;
|
|
1105
1619
|
var usesPropertyModel = (c) => c.channelGroup !== void 0 || c.audienceRuleRefs.some((ref) => ref.minDaysSinceVisit !== void 0);
|
|
1106
1620
|
function checkAudienceBand(ref, provider = "meta_ads", at = "audienceRuleRef") {
|
|
@@ -1336,6 +1850,8 @@ var ResonanceController = class {
|
|
|
1336
1850
|
site: this.options.site,
|
|
1337
1851
|
configRevision: this.config?.configRevision ?? null,
|
|
1338
1852
|
policyRevision: this.config?.policyRevision ?? null,
|
|
1853
|
+
configEnabled: this.config?.enabled ?? false,
|
|
1854
|
+
configExpiresAt: this.config?.expiresAt ?? null,
|
|
1339
1855
|
requiredPurposes: this.config?.consentPolicy.requiredPurposes ?? this.adapter?.requiredPurposes ?? []
|
|
1340
1856
|
};
|
|
1341
1857
|
}
|
package/dist/seo/client.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
export { SitemapSync } from '../chunk-
|
|
2
|
+
export { SitemapSync } from '../chunk-WX4XX3BZ.js';
|
|
3
3
|
import '../chunk-YVKRYQRG.js';
|
|
4
4
|
import '../chunk-7643MCD2.js';
|
|
5
5
|
import '../chunk-64XODP7M.js';
|
|
6
|
-
import '../chunk-
|
|
6
|
+
import '../chunk-M2ZGSI6K.js';
|
|
7
7
|
import '../chunk-W7OPEMGJ.js';
|
|
8
8
|
import '../chunk-PKBMQBKP.js';
|
package/dist/seo/index.js
CHANGED
|
@@ -2,7 +2,7 @@ export { ManagedNoScripts, ManagedScripts } from '../chunk-MVLMXC44.js';
|
|
|
2
2
|
import { pickManagedLlmSchemaForJsonLd } from '../chunk-XAZC2TUD.js';
|
|
3
3
|
import { withoutSchemaPlaceholders } from '../chunk-VWWITFWM.js';
|
|
4
4
|
import { safeJsonLd } from '../chunk-4KZ6W3ZH.js';
|
|
5
|
-
export { SitemapSync } from '../chunk-
|
|
5
|
+
export { SitemapSync } from '../chunk-WX4XX3BZ.js';
|
|
6
6
|
import { getManagedMetadata, mergeAlternates } from '../chunk-3W3MN6Z7.js';
|
|
7
7
|
export { generateSitemap, getABVariant, getManagedMetadata, getManagedMetadataWithAB, getRedirect, getRobotsDirective, isIndexable } from '../chunk-3W3MN6Z7.js';
|
|
8
8
|
import { getSchemaMarkups, getSEOPageData, getEntityEnhancedSchema, getFAQData, getInternalLinks, pruneSchemaTypes } from '../chunk-STIVFCWM.js';
|
|
@@ -18,7 +18,7 @@ import '../chunk-DIKNRN34.js';
|
|
|
18
18
|
import '../chunk-FESKKJAS.js';
|
|
19
19
|
import '../chunk-7643MCD2.js';
|
|
20
20
|
import '../chunk-64XODP7M.js';
|
|
21
|
-
import '../chunk-
|
|
21
|
+
import '../chunk-M2ZGSI6K.js';
|
|
22
22
|
import '../chunk-W7OPEMGJ.js';
|
|
23
23
|
import '../chunk-A4CC4ZG3.js';
|
|
24
24
|
import '../chunk-PKBMQBKP.js';
|
package/dist/seo/llms.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-
|
|
1
|
+
export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-DUIGCLQM.js';
|
|
2
2
|
export { buildAiDiscoveryHeaders, wantsLlmsDiscoveryLink } from '../chunk-MTDVV5P3.js';
|
|
3
3
|
export { AI_RETRIEVAL_CRAWLERS, AI_TRAINING_CRAWLERS, buildAiCrawlerRules, createRobotsTxtHandler } from '../chunk-QLTDFUJ7.js';
|
|
4
|
-
export { LEGACY_PUBLICATION_PATH, SEO_REVALIDATION_MAX_BODY_BYTES, SEO_REVALIDATION_MAX_ITEMS, createLlmsRevalidateHandler, createSeoRevalidationHandler, parseSeoRevalidationPayload } from '../chunk-
|
|
4
|
+
export { LEGACY_PUBLICATION_PATH, SEO_REVALIDATION_MAX_BODY_BYTES, SEO_REVALIDATION_MAX_ITEMS, createLlmsRevalidateHandler, createSeoRevalidationHandler, parseSeoRevalidationPayload } from '../chunk-T2Z7KEIH.js';
|
|
5
5
|
export { AEOBlock, AEOCitedContent, AEOClaim, AEOComparison, AEODefinition, AEOEntity, AEOProvenanceList, AEOStep, AEOSteps, AEOSummary, DEFAULT_SPEAKABLE_SELECTORS, SpeakableSchema, createSpeakableSchema, getSpeakableSelectorsForPage } from '../chunk-PSAG45YF.js';
|
|
6
6
|
import '../chunk-XTRZGXB2.js';
|
|
7
|
-
export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-
|
|
7
|
+
export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-2YSX4ZUC.js';
|
|
8
8
|
export { getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices } from '../chunk-EK7P62DT.js';
|
|
9
9
|
import '../chunk-7DYMM6SS.js';
|
|
10
10
|
import '../chunk-IBHBEUZV.js';
|
|
@@ -16,7 +16,7 @@ import '../chunk-ISRBSTB7.js';
|
|
|
16
16
|
import '../chunk-MJP63SSS.js';
|
|
17
17
|
import '../chunk-YVKRYQRG.js';
|
|
18
18
|
import '../chunk-FESKKJAS.js';
|
|
19
|
-
import '../chunk-
|
|
19
|
+
import '../chunk-2MJYGVKB.js';
|
|
20
20
|
import '../chunk-W7OPEMGJ.js';
|
|
21
21
|
import '../chunk-A4CC4ZG3.js';
|
|
22
22
|
import '../chunk-PKBMQBKP.js';
|