@sonordev/site-kit 8.10.0 → 8.11.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.
Files changed (103) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/agent-manifest.json +1 -1
  3. package/dist/{AddressAutocomplete-LQS6GQ4R.js → AddressAutocomplete-SQDJJOEF.js} +1 -1
  4. package/dist/{AnalyticsProvider-JWS7BLFY.js → AnalyticsProvider-JDVLH5OV.js} +4 -4
  5. package/dist/{ArticleViewTracker-CDPVMUAO.js → ArticleViewTracker-L6TFJ35X.js} +1 -1
  6. package/dist/{BlocksPopup-C5PNJ7U6.js → BlocksPopup-5Q47LRN2.js} +3 -3
  7. package/dist/{ChatWidget-HEPOE3YC.js → ChatWidget-4ILVGTK6.js} +5 -5
  8. package/dist/{FileField-6R5LS5NU.js → FileField-TLS53TPW.js} +1 -1
  9. package/dist/{FormSpotlight-2BSE7PD2.js → FormSpotlight-JPLIRN3H.js} +1 -1
  10. package/dist/{FormStage-3G46OPPO.js → FormStage-UBP57NY7.js} +1 -1
  11. package/dist/{ManagedForm-LTXEU25N.js → ManagedForm-PFGM5X5H.js} +6 -6
  12. package/dist/{ManagedNewsletterForm-WE6P5DMV.js → ManagedNewsletterForm-GJU5KCGA.js} +8 -8
  13. package/dist/{SignalCore-IP7FE6SN.js → SignalCore-DGKCVQ74.js} +3 -3
  14. package/dist/{SiteChat-3FQYMHCP.js → SiteChat-EP25SEMP.js} +1 -1
  15. package/dist/{SiteDesignReporter-HGTX4FX2.js → SiteDesignReporter-NE6BQSVZ.js} +4 -4
  16. package/dist/{SitePopups-V7MCNSGE.js → SitePopups-XJLZPV4L.js} +4 -4
  17. package/dist/{SitemapSync-OAJ7SIET.js → SitemapSync-35EAR2YA.js} +2 -2
  18. package/dist/_client/booking-widget.js +3 -3
  19. package/dist/_client/reviewed-signal-experiment.js +1 -1
  20. package/dist/affiliates/index.js +1 -1
  21. package/dist/analytics/index.js +4 -4
  22. package/dist/api-AHFVE5HN.js +5 -0
  23. package/dist/articles/index.js +1 -1
  24. package/dist/articles/server-ui.js +3 -3
  25. package/dist/articles/server.js +2 -2
  26. package/dist/chat/index.js +6 -6
  27. package/dist/{chunk-TLKLHSRJ.js → chunk-2URLL3Z2.js} +1 -1
  28. package/dist/{chunk-RMPXSEEU.js → chunk-3LGE3LRC.js} +1 -1
  29. package/dist/{chunk-Z62W7Q3T.js → chunk-3VKJJNQU.js} +1 -1
  30. package/dist/{chunk-P7S45DD7.js → chunk-52MFDOBB.js} +1 -1
  31. package/dist/{chunk-RUV6DCKL.js → chunk-5LCY7QKK.js} +1 -1
  32. package/dist/{chunk-Z4XJOVQX.js → chunk-7OTHRX45.js} +1 -1
  33. package/dist/{chunk-HNVLINPI.js → chunk-BHJTT63Y.js} +1 -1
  34. package/dist/{chunk-Y7DZ2ND2.js → chunk-CCZHAC4K.js} +3 -3
  35. package/dist/{chunk-HLN7A4GL.js → chunk-CIZ7Z3NU.js} +1 -1
  36. package/dist/{chunk-D4R3FQED.js → chunk-CNQMSQYQ.js} +1 -1
  37. package/dist/{chunk-MKU5ZORB.js → chunk-DHGOFK5P.js} +1 -1
  38. package/dist/{chunk-MIKVCYGX.js → chunk-DHMBDPGA.js} +2 -2
  39. package/dist/{chunk-6CIO4X6P.js → chunk-FW63D6W3.js} +1 -1
  40. package/dist/{chunk-727353NY.js → chunk-GZYIJ3JI.js} +3 -3
  41. package/dist/{chunk-A66TIJWU.js → chunk-HWYJ3O7D.js} +1 -1
  42. package/dist/{chunk-J4R7MHV2.js → chunk-I5S2XA7H.js} +8 -8
  43. package/dist/{chunk-NWEIHCSE.js → chunk-IDLJEFVB.js} +1 -1
  44. package/dist/{chunk-OEHIXCYS.js → chunk-JXH56PY3.js} +2 -2
  45. package/dist/{chunk-XAPSYDVT.js → chunk-JYRBGL33.js} +1 -1
  46. package/dist/{chunk-OCNODBH4.js → chunk-KWHR7PNA.js} +1 -1
  47. package/dist/{chunk-75N2WALV.js → chunk-LY3Q6RU5.js} +1 -1
  48. package/dist/{chunk-YJ6PRJ7Y.js → chunk-N26GRGIP.js} +2 -2
  49. package/dist/{chunk-7PWXPN53.js → chunk-NAO63YOG.js} +1 -1
  50. package/dist/{chunk-DW5X4BC7.js → chunk-OPJZSLGK.js} +2 -2
  51. package/dist/{chunk-533ZSRJF.js → chunk-R53G2IKP.js} +1 -1
  52. package/dist/{chunk-ACZ5JNSL.js → chunk-UEF4AC76.js} +2 -2
  53. package/dist/{chunk-NBNDH2J6.js → chunk-UK4ANQUS.js} +1 -1
  54. package/dist/{chunk-3RBOES2C.js → chunk-VA5NLFSL.js} +1 -1
  55. package/dist/{chunk-NH7K252M.js → chunk-XHEUPCCU.js} +1 -1
  56. package/dist/{chunk-Q2OE32TH.js → chunk-XVB5V7D3.js} +2 -2
  57. package/dist/{chunk-UMF5OILQ.js → chunk-ZWTDI2JU.js} +1 -1
  58. package/dist/contracts/entries.d.ts +1 -1
  59. package/dist/contracts/property-interest.d.ts +100 -0
  60. package/dist/contracts/resonance.d.ts +1705 -358
  61. package/dist/contracts/sales-call-prep.d.ts +666 -0
  62. package/dist/contracts/signal-experiments.d.ts +0 -1
  63. package/dist/contracts/wire-uuid.d.ts +5 -0
  64. package/dist/{controls-KLG6VQLO.js → controls-YQ3MGZJG.js} +2 -2
  65. package/dist/fleet/index.js +3 -3
  66. package/dist/forms/index.js +8 -8
  67. package/dist/forms/server.js +2 -2
  68. package/dist/images/index.js +2 -2
  69. package/dist/index.js +1 -1
  70. package/dist/landing/server.js +5 -5
  71. package/dist/layout/client.js +6 -6
  72. package/dist/layout/index.js +7 -7
  73. package/dist/llms/index.js +4 -4
  74. package/dist/maps/index.js +3 -3
  75. package/dist/mcp/sonor.js +5 -5
  76. package/dist/resonance/ConsentPreferences.d.ts +8 -0
  77. package/dist/resonance/consent-adapter.d.ts +3 -0
  78. package/dist/resonance/first-party-consent.d.ts +22 -0
  79. package/dist/resonance/index.d.ts +1 -0
  80. package/dist/resonance/index.js +272 -2
  81. package/dist/revalidate/index.js +2 -2
  82. package/dist/runtime/index.js +1 -1
  83. package/dist/{runtime-core-EU2RZMOL.js → runtime-core-WSKES5UP.js} +523 -7
  84. package/dist/seo/client.js +2 -2
  85. package/dist/seo/index.js +2 -2
  86. package/dist/seo/llms.js +4 -4
  87. package/dist/seo/register-sitemap-cli.js +1 -1
  88. package/dist/seo/sitemap.js +2 -2
  89. package/dist/server/index.js +2 -2
  90. package/dist/shared/version.d.ts +1 -1
  91. package/dist/signal/index.js +2 -2
  92. package/dist/sitemap/index.js +2 -2
  93. package/dist/{sonor-fetch-runtime-SLPBNZY4.js → sonor-fetch-runtime-JDVDCTKI.js} +2 -2
  94. package/dist/sync/index.js +3 -3
  95. package/dist/website/images.js +2 -2
  96. package/dist/website/index.js +4 -4
  97. package/dist/website/landing/server.js +5 -5
  98. package/dist/website/popups.js +4 -4
  99. package/dist/{writeLLMsTxt-2CBYGKZO.js → writeLLMsTxt-SYLPYWUX.js} +1 -1
  100. package/package.json +1 -1
  101. package/src/resonance/README.md +16 -0
  102. package/dist/api-X6N6V2H3.js +0 -5
  103. /package/dist/{chunk-ORSQKTMN.js → chunk-ES52W5EE.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-Z4XJOVQX.js';
12
+ import { sonorFetch } from './chunk-7OTHRX45.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, /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i);
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, /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i);
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 providerReportingSelection = object2({ agentContactId: uuid2, channelIds: providerReportingChannelIds });
454
- var providerReportingGrant = refine2(object2({ purpose: literal2("provider_reporting_refresh"), orgId: uuid2, projectId: uuid2, agentContactId: uuid2, principalContactId: uuid2, channelIds: providerReportingChannelIds }), (v, p) => {
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 nativeAudienceRef = object2({ externalId: text2(160, /^[0-9]+(?![\s\S])/), revision: digest });
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
  }
@@ -1,8 +1,8 @@
1
1
  'use client';
2
- export { SitemapSync } from '../chunk-XAPSYDVT.js';
2
+ export { SitemapSync } from '../chunk-JYRBGL33.js';
3
3
  import '../chunk-YVKRYQRG.js';
4
4
  import '../chunk-7643MCD2.js';
5
5
  import '../chunk-64XODP7M.js';
6
- import '../chunk-Z4XJOVQX.js';
6
+ import '../chunk-7OTHRX45.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-XAPSYDVT.js';
5
+ export { SitemapSync } from '../chunk-JYRBGL33.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-Z4XJOVQX.js';
21
+ import '../chunk-7OTHRX45.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-HLN7A4GL.js';
1
+ export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-CIZ7Z3NU.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-RUV6DCKL.js';
4
+ export { LEGACY_PUBLICATION_PATH, SEO_REVALIDATION_MAX_BODY_BYTES, SEO_REVALIDATION_MAX_ITEMS, createLlmsRevalidateHandler, createSeoRevalidationHandler, parseSeoRevalidationPayload } from '../chunk-5LCY7QKK.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-ORSQKTMN.js';
7
+ export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-ES52W5EE.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-D4R3FQED.js';
19
+ import '../chunk-CNQMSQYQ.js';
20
20
  import '../chunk-W7OPEMGJ.js';
21
21
  import '../chunk-A4CC4ZG3.js';
22
22
  import '../chunk-PKBMQBKP.js';