@canonry/canonry 5.14.0 → 5.15.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 (28) hide show
  1. package/assets/assets/{AuditHistoryPanel-DWDOPf8c.js → AuditHistoryPanel-BZJn-wvp.js} +1 -1
  2. package/assets/assets/{BacklinksPage-DGxq-iU6.js → BacklinksPage-DsQAKO31.js} +1 -1
  3. package/assets/assets/{HistoryPage-DR91m-gT.js → HistoryPage-DWn459Gu.js} +1 -1
  4. package/assets/assets/{MeasurementPropertyPage-a8poltfM.js → MeasurementPropertyPage-D6pUcBiT.js} +1 -1
  5. package/assets/assets/{ProjectPage-CCCJE7rA.js → ProjectPage-D-lDBpPV.js} +1 -1
  6. package/assets/assets/{RunRow-Xe63DyPK.js → RunRow-BJxx50Ar.js} +1 -1
  7. package/assets/assets/{RunsPage-DK119ZZw.js → RunsPage-DvoNDx6z.js} +1 -1
  8. package/assets/assets/{SettingsPage-G461foD-.js → SettingsPage-DXbhM5Lv.js} +1 -1
  9. package/assets/assets/{SiteHealthSection-CJnHkGM2.js → SiteHealthSection-4mMfc6Rb.js} +3 -3
  10. package/assets/assets/{TrafficPage-AsWgc7Ot.js → TrafficPage-EYSxLxkQ.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-D10yBQoD.js → TrafficSourceDetailPage-DY4sV_BX.js} +1 -1
  12. package/assets/assets/{extract-error-message-PP4HD_Dp.js → extract-error-message-BMpWRqf9.js} +1 -1
  13. package/assets/assets/{index-CCIeAE4J.js → index-KCAlcuMN.js} +22 -22
  14. package/assets/assets/{react-sigma_core.esm.min-CkyyYkKU.js → react-sigma_core.esm.min-CHepSGqZ.js} +1 -1
  15. package/assets/assets/{v2-overview-adapter-DW-In1hp.js → v2-overview-adapter-CpM-FjB_.js} +1 -1
  16. package/assets/index.html +1 -1
  17. package/dist/{chunk-RGMUT5KY.js → chunk-3YAPVVFN.js} +106 -39
  18. package/dist/{chunk-4LPV6ZZY.js → chunk-CDQDPUY4.js} +2 -2
  19. package/dist/{chunk-SOLFOKZF.js → chunk-JO5HHEJV.js} +2 -2
  20. package/dist/{chunk-45EGDRVF.js → chunk-L36TC6LB.js} +62 -7
  21. package/dist/{chunk-S6LJSUZO.js → chunk-SJ7ZOFL5.js} +74 -29
  22. package/dist/{chunk-2W6GCJ3O.js → chunk-ZGZSROSR.js} +1 -1
  23. package/dist/cli.js +7 -7
  24. package/dist/{demo-server-H4ZFIIIB.js → demo-server-QLQUVMKJ.js} +3 -3
  25. package/dist/index.js +5 -5
  26. package/dist/{intelligence-service-CJKOXPOP.js → intelligence-service-EAUKUVVM.js} +2 -2
  27. package/dist/mcp.js +3 -3
  28. package/package.json +11 -11
@@ -17,12 +17,12 @@ import {
17
17
  resolveOperatorApiKeyIds,
18
18
  runWithUsageTags,
19
19
  saveConfigPatch
20
- } from "./chunk-2W6GCJ3O.js";
20
+ } from "./chunk-ZGZSROSR.js";
21
21
  import {
22
22
  deleteSiteCrawlGraphLayout,
23
23
  persistSiteCrawlGraphLayout,
24
24
  prepareSiteCrawlGraphLayout
25
- } from "./chunk-4LPV6ZZY.js";
25
+ } from "./chunk-CDQDPUY4.js";
26
26
  import {
27
27
  PACKAGE_VERSION
28
28
  } from "./chunk-AOJU5LKX.js";
@@ -184,7 +184,7 @@ import {
184
184
  siteLivenessState,
185
185
  toAlertView,
186
186
  usageCounters
187
- } from "./chunk-RGMUT5KY.js";
187
+ } from "./chunk-3YAPVVFN.js";
188
188
  import {
189
189
  AGENT_MEMORY_VALUE_MAX_BYTES,
190
190
  AGENT_NONE,
@@ -345,7 +345,7 @@ import {
345
345
  visibilityReportRequestSchema,
346
346
  winnabilityClassLabel,
347
347
  withRetry
348
- } from "./chunk-45EGDRVF.js";
348
+ } from "./chunk-L36TC6LB.js";
349
349
 
350
350
  // src/runtime-context.ts
351
351
  function cliRuntimeContext(env = process.env, stdio = process) {
@@ -6491,7 +6491,7 @@ function nonBlank(value) {
6491
6491
  return trimmed ? trimmed : void 0;
6492
6492
  }
6493
6493
  function resolveBuildCommit(env = process.env) {
6494
- const embedded = true ? "f4648ef75d44ebb5a3396cf05739a56a4aa2b7ee" : void 0;
6494
+ const embedded = true ? "979d2ea6821a78ddc2d2df35600c4b208e4ecff7" : void 0;
6495
6495
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
6496
6496
  }
6497
6497
  function resolveInstanceIdentity(env = process.env) {
@@ -6966,8 +6966,9 @@ var JobRunner = class {
6966
6966
  }
6967
6967
  log2.info("run.dispatch", { runId, providerCount: activeProviders.length, providers: activeProviders.map((p) => p.adapter.name) });
6968
6968
  const projectCompetitors = this.db.select().from(competitors).where(eq2(competitors.projectId, projectId)).all();
6969
- const runCompetitors = createRunCompetitorResolver(this.db, projectCompetitors.map((c) => c.domain))(existingRun.measurementPlanVersionId);
6970
- const competitorDomains = runCompetitors.domains;
6969
+ const competitorDomains = projectCompetitors.map((c) => c.domain);
6970
+ const resolveCompetitors = createRunCompetitorResolver(this.db, competitorDomains);
6971
+ const competitorsFor = (executionId) => resolveCompetitors(existingRun.measurementPlanVersionId, executionId);
6971
6972
  const allDomains = effectiveDomains({
6972
6973
  canonicalDomain: project.canonicalDomain,
6973
6974
  ownedDomains: project.ownedDomains
@@ -7170,8 +7171,7 @@ var JobRunner = class {
7170
7171
  const slotContext = {
7171
7172
  runId,
7172
7173
  allDomains,
7173
- competitorDomains,
7174
- competitorAliases: runCompetitors.aliases,
7174
+ competitorsFor,
7175
7175
  allBrandNames,
7176
7176
  executionGates,
7177
7177
  providerDispatchCounts,
@@ -7429,8 +7429,8 @@ var JobRunner = class {
7429
7429
  else providerErrors.set(provider, `No ${provider} provider is configured on this instance, so its missing answers did not run.`);
7430
7430
  }
7431
7431
  const projectCompetitors = this.db.select().from(competitors).where(eq2(competitors.projectId, projectId)).all();
7432
- const runCompetitors = createRunCompetitorResolver(this.db, projectCompetitors.map((c) => c.domain))(run.measurementPlanVersionId);
7433
- const competitorDomains = runCompetitors.domains;
7432
+ const resolveCompetitors = createRunCompetitorResolver(this.db, projectCompetitors.map((c) => c.domain));
7433
+ const competitorsFor = (executionId) => resolveCompetitors(run.measurementPlanVersionId, executionId);
7434
7434
  const allDomains = effectiveDomains({ canonicalDomain: project.canonicalDomain, ownedDomains: project.ownedDomains });
7435
7435
  const allBrandNames = effectiveBrandNames({ displayName: project.displayName, aliases: project.aliases });
7436
7436
  const todayPeriod = getCurrentUsageDay();
@@ -7484,8 +7484,7 @@ var JobRunner = class {
7484
7484
  const ctx = {
7485
7485
  runId,
7486
7486
  allDomains,
7487
- competitorDomains,
7488
- competitorAliases: runCompetitors.aliases,
7487
+ competitorsFor,
7489
7488
  allBrandNames,
7490
7489
  executionGates,
7491
7490
  providerDispatchCounts,
@@ -7585,6 +7584,7 @@ var JobRunner = class {
7585
7584
  async executePlanSlot(ctx, registeredProvider, unit) {
7586
7585
  const { adapter, config: providerConfig } = registeredProvider;
7587
7586
  const providerName = adapter.name;
7587
+ const { domains: competitorDomains, aliases: competitorAliases } = ctx.competitorsFor(unit.executionId);
7588
7588
  const gate = ctx.executionGates.get(providerName);
7589
7589
  if (!gate) {
7590
7590
  throw new Error(`Missing execution gate for provider ${providerName}`);
@@ -7602,7 +7602,7 @@ var JobRunner = class {
7602
7602
  {
7603
7603
  query: unit.queryText,
7604
7604
  canonicalDomains: ctx.allDomains,
7605
- competitorDomains: ctx.competitorDomains,
7605
+ competitorDomains,
7606
7606
  location: requestedContext ?? void 0
7607
7607
  },
7608
7608
  config
@@ -7639,14 +7639,14 @@ var JobRunner = class {
7639
7639
  ctx.allBrandNames,
7640
7640
  ctx.allDomains
7641
7641
  );
7642
- const overlap = computeCompetitorOverlap(normalized, ctx.competitorDomains, ctx.competitorAliases);
7642
+ const overlap = computeCompetitorOverlap(normalized, competitorDomains, competitorAliases);
7643
7643
  const extractedCompetitors = extractRecommendedCompetitors(
7644
7644
  normalized.answerText,
7645
7645
  ctx.allDomains,
7646
7646
  normalized.citedDomains,
7647
- ctx.competitorDomains,
7647
+ competitorDomains,
7648
7648
  ctx.allBrandNames,
7649
- ctx.competitorAliases
7649
+ competitorAliases
7650
7650
  );
7651
7651
  const snapshotId = crypto6.randomUUID();
7652
7652
  let screenshotRelPath = null;
@@ -8607,6 +8607,30 @@ function validateChatCardCreative(value) {
8607
8607
  validateId(value.file_id, "Ad creative file id");
8608
8608
  validateHttpUrl(value.target_url, "Ad creative target URL");
8609
8609
  }
8610
+ var MAX_QUERY_STRING_TEMPLATE_LENGTH = 1e3;
8611
+ function validateLandingPageConfiguration(value, label) {
8612
+ if (value === void 0 || value === null) return;
8613
+ validateRequestObject(value, `${label} landing_page_configuration`);
8614
+ const template = value.query_string_template;
8615
+ if (template === null) return;
8616
+ if (typeof template !== "string" || template.trim().length === 0 || template.length > MAX_QUERY_STRING_TEMPLATE_LENGTH) {
8617
+ throw new OpenAiAdsApiError(
8618
+ `${label} query_string_template must be 1-${MAX_QUERY_STRING_TEMPLATE_LENGTH} characters`,
8619
+ 400
8620
+ );
8621
+ }
8622
+ if (/\s/.test(template) || template.startsWith("?") || template.startsWith("&")) {
8623
+ throw new OpenAiAdsApiError(
8624
+ `${label} query_string_template must be a bare query string without whitespace or a leading ? or &`,
8625
+ 400
8626
+ );
8627
+ }
8628
+ }
8629
+ function parseLandingPageQueryStringTemplate(value) {
8630
+ if (!isRecord(value)) return null;
8631
+ const template = value.query_string_template;
8632
+ return typeof template === "string" && template.trim().length > 0 ? template : null;
8633
+ }
8610
8634
  function validateCreateCampaignRequest(request) {
8611
8635
  validateRequestObject(request, "Campaign create request");
8612
8636
  validateEntityName(request.name, "Campaign name");
@@ -8616,6 +8640,7 @@ function validateCreateCampaignRequest(request) {
8616
8640
  validateCampaignTimestamp(request.end_time, "Campaign end_time");
8617
8641
  validateCampaignBidding(request);
8618
8642
  validateCampaignTargeting(request.targeting);
8643
+ validateLandingPageConfiguration(request.landing_page_configuration, "Campaign create request");
8619
8644
  }
8620
8645
  function validateUpdateCampaignRequest(request) {
8621
8646
  validatePublicUpdateRequest(request, "Campaign update request");
@@ -8624,6 +8649,7 @@ function validateUpdateCampaignRequest(request) {
8624
8649
  validateCampaignTimestamp(request.start_time, "Campaign start_time");
8625
8650
  validateCampaignTimestamp(request.end_time, "Campaign end_time");
8626
8651
  validateCampaignTargeting(request.targeting);
8652
+ validateLandingPageConfiguration(request.landing_page_configuration, "Campaign update request");
8627
8653
  }
8628
8654
  function validateCreateAdGroupRequest(request) {
8629
8655
  validateRequestObject(request, "Ad group create request");
@@ -8632,12 +8658,14 @@ function validateCreateAdGroupRequest(request) {
8632
8658
  validatePausedCreateStatus(request.status, "Ad group create request");
8633
8659
  validateContextHints(request.context_hints);
8634
8660
  validateBiddingConfig(request.bidding_config);
8661
+ validateLandingPageConfiguration(request.landing_page_configuration, "Ad group create request");
8635
8662
  }
8636
8663
  function validateUpdateAdGroupRequest(request) {
8637
8664
  validatePublicUpdateRequest(request, "Ad group update request");
8638
8665
  if (request.name !== void 0) validateEntityName(request.name, "Ad group name");
8639
8666
  validateContextHints(request.context_hints);
8640
8667
  if (request.bidding_config !== void 0) validateBiddingConfig(request.bidding_config);
8668
+ validateLandingPageConfiguration(request.landing_page_configuration, "Ad group update request");
8641
8669
  }
8642
8670
  function validateCreateAdRequest(request) {
8643
8671
  validateRequestObject(request, "Ad create request");
@@ -8645,11 +8673,13 @@ function validateCreateAdRequest(request) {
8645
8673
  validateEntityName(request.name, "Ad name");
8646
8674
  validatePausedCreateStatus(request.status, "Ad create request");
8647
8675
  validateChatCardCreative(request.creative);
8676
+ validateLandingPageConfiguration(request.landing_page_configuration, "Ad create request");
8648
8677
  }
8649
8678
  function validateUpdateAdRequest(request) {
8650
8679
  validatePublicUpdateRequest(request, "Ad update request");
8651
8680
  if (request.name !== void 0) validateEntityName(request.name, "Ad name");
8652
8681
  if (request.creative !== void 0) validateChatCardCreative(request.creative);
8682
+ validateLandingPageConfiguration(request.landing_page_configuration, "Ad update request");
8653
8683
  }
8654
8684
  function adsClientLog(level, action, ctx) {
8655
8685
  const entry = {
@@ -9094,6 +9124,7 @@ async function executeAdsSync(db, runId, projectId, opts) {
9094
9124
  lifetimeSpendLimitMicros: campaign.budget?.lifetime_spend_limit_micros ?? null,
9095
9125
  conversionEventSettingIds: campaign.conversion_event_setting_ids ?? [],
9096
9126
  targeting: campaign.targeting,
9127
+ landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(campaign.landing_page_configuration),
9097
9128
  upstreamCreatedAt: campaign.created_at,
9098
9129
  upstreamUpdatedAt: campaign.updated_at,
9099
9130
  syncRunId: runId,
@@ -9110,6 +9141,7 @@ async function executeAdsSync(db, runId, projectId, opts) {
9110
9141
  billingEventType: group.bidding_config?.billing_event_type ?? null,
9111
9142
  maxBidMicros: group.bidding_config?.max_bid_micros ?? null,
9112
9143
  contextHints: group.context_hints,
9144
+ landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(group.landing_page_configuration),
9113
9145
  upstreamCreatedAt: group.created_at,
9114
9146
  upstreamUpdatedAt: group.updated_at,
9115
9147
  syncRunId: runId,
@@ -9124,6 +9156,7 @@ async function executeAdsSync(db, runId, projectId, opts) {
9124
9156
  status: ad.status,
9125
9157
  creative: ad.creative,
9126
9158
  reviewStatus: ad.review_status ?? ad.review?.status ?? null,
9159
+ landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(ad.landing_page_configuration),
9127
9160
  upstreamCreatedAt: ad.created_at,
9128
9161
  upstreamUpdatedAt: ad.updated_at,
9129
9162
  syncRunId: runId,
@@ -11603,6 +11636,7 @@ async function backfillAnswerVisibilityCommand(opts) {
11603
11636
  const snapshotRows = db.select({
11604
11637
  id: querySnapshots.id,
11605
11638
  runId: querySnapshots.runId,
11639
+ executionId: querySnapshots.measurementExecutionId,
11606
11640
  provider: querySnapshots.provider,
11607
11641
  citationState: querySnapshots.citationState,
11608
11642
  answerMentioned: querySnapshots.answerMentioned,
@@ -11643,7 +11677,7 @@ async function backfillAnswerVisibilityCommand(opts) {
11643
11677
  };
11644
11678
  const nextCitationState = determineCitationState(normalized, projectDomains);
11645
11679
  const nextCitedDomains = reparsedResult.citedDomains;
11646
- const runCompetitors = competitorsForRun(planVersionByRun.get(snapshot.runId));
11680
+ const runCompetitors = competitorsForRun(planVersionByRun.get(snapshot.runId), snapshot.executionId);
11647
11681
  const nextCompetitorOverlap = computeCompetitorOverlap(normalized, runCompetitors.domains, runCompetitors.aliases);
11648
11682
  const nextRecommendedCompetitors = extractRecommendedCompetitors(
11649
11683
  normalized.answerText,
@@ -11902,6 +11936,7 @@ function backfillProjectAnswerMentions(db, projectId, opts) {
11902
11936
  const snapshotRows = db.select({
11903
11937
  id: querySnapshots.id,
11904
11938
  runId: querySnapshots.runId,
11939
+ executionId: querySnapshots.measurementExecutionId,
11905
11940
  provider: querySnapshots.provider,
11906
11941
  answerMentioned: querySnapshots.answerMentioned,
11907
11942
  answerText: querySnapshots.answerText,
@@ -11927,7 +11962,7 @@ function backfillProjectAnswerMentions(db, projectId, opts) {
11927
11962
  retrievalStatus: "unknown",
11928
11963
  searchQueries: []
11929
11964
  };
11930
- const runCompetitors = competitorsForRun(planVersionByRun.get(snapshot.runId));
11965
+ const runCompetitors = competitorsForRun(planVersionByRun.get(snapshot.runId), snapshot.executionId);
11931
11966
  const nextCompetitorOverlap = computeCompetitorOverlap(normalized, runCompetitors.domains, runCompetitors.aliases);
11932
11967
  const nextRecommendedCompetitors = extractRecommendedCompetitors(
11933
11968
  answerText,
@@ -12032,7 +12067,7 @@ function readStoredGroundingSources(rawResponse) {
12032
12067
  return result2;
12033
12068
  }
12034
12069
  async function backfillInsightsCommand(project, opts) {
12035
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-CJKOXPOP.js");
12070
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-EAUKUVVM.js");
12036
12071
  const config = loadConfig();
12037
12072
  const db = createClient(config.database);
12038
12073
  migrate(db);
@@ -18485,7 +18520,8 @@ async function createServer(opts) {
18485
18520
  lifetimeSpendLimitMicros: entity.budget?.lifetime_spend_limit_micros ?? null,
18486
18521
  locationIds: entity.targeting?.locations?.include?.map((location) => location.id) ?? [],
18487
18522
  biddingType: entity.bidding_type,
18488
- conversionEventSettingIds: entity.conversion_event_setting_ids
18523
+ conversionEventSettingIds: entity.conversion_event_setting_ids,
18524
+ landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(entity.landing_page_configuration)
18489
18525
  });
18490
18526
  const adsAdGroupEntityResult = (entity, campaignId) => ({
18491
18527
  ...adsEntityResult(entity),
@@ -18493,12 +18529,15 @@ async function createServer(opts) {
18493
18529
  campaignId: campaignId ?? null,
18494
18530
  contextHints: entity.context_hints,
18495
18531
  maxBidMicros: entity.bidding_config?.max_bid_micros ?? null,
18496
- billingEventType: entity.bidding_config?.billing_event_type ?? null
18532
+ billingEventType: entity.bidding_config?.billing_event_type ?? null,
18533
+ landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(entity.landing_page_configuration)
18497
18534
  });
18498
18535
  const adsAdEntityResult = (entity, adGroupId) => ({
18499
18536
  ...adsEntityResult(entity),
18500
- adGroupId: adGroupId ?? null
18537
+ adGroupId: adGroupId ?? null,
18538
+ landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(entity.landing_page_configuration)
18501
18539
  });
18540
+ const landingPageConfigurationUpdate = (template) => template === void 0 ? void 0 : template === null ? null : { query_string_template: template };
18502
18541
  const adsOperator = {
18503
18542
  uploadImage: async (apiKey, imageUrl) => {
18504
18543
  const result2 = await uploadImageFromUrl(apiKey, imageUrl);
@@ -18515,7 +18554,8 @@ async function createServer(opts) {
18515
18554
  budget: { lifetime_spend_limit_micros: input.lifetimeSpendLimitMicros },
18516
18555
  bidding_type: input.biddingType,
18517
18556
  conversion_event_setting_ids: input.conversionEventSettingIds,
18518
- targeting: { locations: { include: input.locationIds.map((id) => ({ id })) } }
18557
+ targeting: { locations: { include: input.locationIds.map((id) => ({ id })) } },
18558
+ landing_page_configuration: input.landingPageQueryStringTemplate === void 0 ? void 0 : { query_string_template: input.landingPageQueryStringTemplate }
18519
18559
  })),
18520
18560
  updateCampaign: async (apiKey, id, input) => adsCampaignEntityResult(await updateCampaign(apiKey, id, {
18521
18561
  name: input.name,
@@ -18523,7 +18563,8 @@ async function createServer(opts) {
18523
18563
  start_time: input.startTime,
18524
18564
  end_time: input.endTime,
18525
18565
  budget: input.lifetimeSpendLimitMicros === void 0 ? void 0 : { lifetime_spend_limit_micros: input.lifetimeSpendLimitMicros },
18526
- targeting: input.locationIds === void 0 ? void 0 : { locations: { include: input.locationIds.map((locationId) => ({ id: locationId })) } }
18566
+ targeting: input.locationIds === void 0 ? void 0 : { locations: { include: input.locationIds.map((locationId) => ({ id: locationId })) } },
18567
+ landing_page_configuration: landingPageConfigurationUpdate(input.landingPageQueryStringTemplate)
18527
18568
  })),
18528
18569
  activateCampaign: async (apiKey, id) => adsCampaignEntityResult(await activateCampaign(apiKey, id)),
18529
18570
  pauseCampaign: async (apiKey, id) => adsCampaignEntityResult(await pauseCampaign(apiKey, id)),
@@ -18539,7 +18580,8 @@ async function createServer(opts) {
18539
18580
  bidding_config: {
18540
18581
  billing_event_type: input.billingEventType,
18541
18582
  max_bid_micros: input.maxBidMicros
18542
- }
18583
+ },
18584
+ landing_page_configuration: input.landingPageQueryStringTemplate === void 0 ? void 0 : { query_string_template: input.landingPageQueryStringTemplate }
18543
18585
  })),
18544
18586
  updateAdGroup: async (apiKey, id, input) => {
18545
18587
  let biddingConfig;
@@ -18556,7 +18598,8 @@ async function createServer(opts) {
18556
18598
  name: input.name,
18557
18599
  description: input.description,
18558
18600
  context_hints: input.contextHints,
18559
- bidding_config: biddingConfig
18601
+ bidding_config: biddingConfig,
18602
+ landing_page_configuration: landingPageConfigurationUpdate(input.landingPageQueryStringTemplate)
18560
18603
  }));
18561
18604
  },
18562
18605
  activateAdGroup: async (apiKey, id) => adsAdGroupEntityResult(await activateAdGroup(apiKey, id)),
@@ -18574,7 +18617,8 @@ async function createServer(opts) {
18574
18617
  body: input.creative.body,
18575
18618
  target_url: input.creative.targetUrl,
18576
18619
  file_id: input.creative.fileId
18577
- }
18620
+ },
18621
+ landing_page_configuration: input.landingPageQueryStringTemplate === void 0 ? void 0 : { query_string_template: input.landingPageQueryStringTemplate }
18578
18622
  })),
18579
18623
  updateAd: async (apiKey, id, input) => adsAdEntityResult(await updateAd(apiKey, id, {
18580
18624
  name: input.name,
@@ -18584,7 +18628,8 @@ async function createServer(opts) {
18584
18628
  body: input.creative.body,
18585
18629
  target_url: input.creative.targetUrl,
18586
18630
  file_id: input.creative.fileId
18587
- } : void 0
18631
+ } : void 0,
18632
+ landing_page_configuration: landingPageConfigurationUpdate(input.landingPageQueryStringTemplate)
18588
18633
  })),
18589
18634
  activateAd: async (apiKey, id) => adsAdEntityResult(await activateAd(apiKey, id)),
18590
18635
  pauseAd: async (apiKey, id) => adsAdEntityResult(await pauseAd(apiKey, id)),
@@ -133,7 +133,7 @@ import {
133
133
  upgradeCaveatFor,
134
134
  upgradeCommandFor,
135
135
  visibilityReportRequestSchema
136
- } from "./chunk-45EGDRVF.js";
136
+ } from "./chunk-L36TC6LB.js";
137
137
 
138
138
  // src/cli-error.ts
139
139
  function isMachineFormat(format) {
package/dist/cli.js CHANGED
@@ -35,11 +35,11 @@ import {
35
35
  trackCliCommandFinished,
36
36
  trackEvent,
37
37
  waitForServerRuntimeStartup
38
- } from "./chunk-S6LJSUZO.js";
38
+ } from "./chunk-SJ7ZOFL5.js";
39
39
  import {
40
40
  autoSyncSkills,
41
41
  formatAutoSyncNotice
42
- } from "./chunk-SOLFOKZF.js";
42
+ } from "./chunk-JO5HHEJV.js";
43
43
  import {
44
44
  CliError,
45
45
  EXIT_SYSTEM_ERROR,
@@ -66,13 +66,13 @@ import {
66
66
  shouldPrintServeSkillsNudge,
67
67
  systemError,
68
68
  usageError
69
- } from "./chunk-2W6GCJ3O.js";
69
+ } from "./chunk-ZGZSROSR.js";
70
70
  import {
71
71
  DEFAULT_DEMO_TRUSTED_PROXIES,
72
72
  trustedProxiesProblem,
73
73
  trustedProxyProblem
74
74
  } from "./chunk-RB2F4D3Z.js";
75
- import "./chunk-4LPV6ZZY.js";
75
+ import "./chunk-CDQDPUY4.js";
76
76
  import "./chunk-AOJU5LKX.js";
77
77
  import {
78
78
  CLOUDFLARE_WORKER_BINDINGS,
@@ -88,7 +88,7 @@ import {
88
88
  queries,
89
89
  renderReportHtml,
90
90
  runs
91
- } from "./chunk-RGMUT5KY.js";
91
+ } from "./chunk-3YAPVVFN.js";
92
92
  import {
93
93
  AdsDeliverySnapshotStatuses,
94
94
  AdsHistoricalCampaignRollupStatuses,
@@ -173,7 +173,7 @@ import {
173
173
  snapshotProviderModeSchema,
174
174
  visibilityReportRequestSchema,
175
175
  winnabilityClassSchema
176
- } from "./chunk-45EGDRVF.js";
176
+ } from "./chunk-L36TC6LB.js";
177
177
 
178
178
  // src/cli.ts
179
179
  import { pathToFileURL } from "url";
@@ -438,7 +438,7 @@ function parseDemoTrustedProxies(values) {
438
438
  async function demoCommand(options) {
439
439
  const { host, port } = parseDemoListenOptions(options);
440
440
  const trustProxy = parseDemoTrustedProxies(options.trustProxy);
441
- const { createDemoServer } = await import("./demo-server-H4ZFIIIB.js");
441
+ const { createDemoServer } = await import("./demo-server-QLQUVMKJ.js");
442
442
  const app = await createDemoServer({ trustProxy });
443
443
  let stopping = false;
444
444
  const stop = () => {
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  layoutSiteCrawlGraphInput,
6
6
  persistSiteCrawlGraphLayout
7
- } from "./chunk-4LPV6ZZY.js";
7
+ } from "./chunk-CDQDPUY4.js";
8
8
  import {
9
9
  PACKAGE_VERSION
10
10
  } from "./chunk-AOJU5LKX.js";
@@ -83,7 +83,7 @@ import {
83
83
  siteCrawlPages,
84
84
  siteCrawlSnapshots,
85
85
  trafficSources
86
- } from "./chunk-RGMUT5KY.js";
86
+ } from "./chunk-3YAPVVFN.js";
87
87
  import {
88
88
  RunKinds,
89
89
  SiteCrawlFetchStates,
@@ -104,7 +104,7 @@ import {
104
104
  measurementPlanV2Schema,
105
105
  placementLinkDecision,
106
106
  siteAuditPageFactorSchema
107
- } from "./chunk-45EGDRVF.js";
107
+ } from "./chunk-L36TC6LB.js";
108
108
 
109
109
  // src/demo-server.ts
110
110
  import { dirname, join as join2 } from "path";
package/dist/index.js CHANGED
@@ -3,14 +3,14 @@ import {
3
3
  createGoogleMarketingCredentialStore,
4
4
  createGoogleMarketingRuntime,
5
5
  createServer
6
- } from "./chunk-S6LJSUZO.js";
6
+ } from "./chunk-SJ7ZOFL5.js";
7
7
  import {
8
8
  loadConfig
9
- } from "./chunk-2W6GCJ3O.js";
10
- import "./chunk-4LPV6ZZY.js";
9
+ } from "./chunk-ZGZSROSR.js";
10
+ import "./chunk-CDQDPUY4.js";
11
11
  import "./chunk-AOJU5LKX.js";
12
- import "./chunk-RGMUT5KY.js";
13
- import "./chunk-45EGDRVF.js";
12
+ import "./chunk-3YAPVVFN.js";
13
+ import "./chunk-L36TC6LB.js";
14
14
  export {
15
15
  GoogleMarketingRuntimeError,
16
16
  createGoogleMarketingCredentialStore,
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  HISTORY_WINDOW_RUNS,
3
3
  IntelligenceService
4
- } from "./chunk-RGMUT5KY.js";
5
- import "./chunk-45EGDRVF.js";
4
+ } from "./chunk-3YAPVVFN.js";
5
+ import "./chunk-L36TC6LB.js";
6
6
  export {
7
7
  HISTORY_WINDOW_RUNS,
8
8
  IntelligenceService
package/dist/mcp.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  autoSyncSkills
3
- } from "./chunk-SOLFOKZF.js";
3
+ } from "./chunk-JO5HHEJV.js";
4
4
  import {
5
5
  createApiClient,
6
6
  createCanonryMcpServer
7
- } from "./chunk-2W6GCJ3O.js";
7
+ } from "./chunk-ZGZSROSR.js";
8
8
  import "./chunk-AOJU5LKX.js";
9
9
  import {
10
10
  isReadOnlyKey,
11
11
  updateCheckEnvOptOut
12
- } from "./chunk-45EGDRVF.js";
12
+ } from "./chunk-L36TC6LB.js";
13
13
 
14
14
  // src/mcp/cli.ts
15
15
  import { randomUUID } from "crypto";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canonry/canonry",
3
- "version": "5.14.0",
3
+ "version": "5.15.0",
4
4
  "type": "module",
5
5
  "description": "Self-hosted AI visibility (AEO) platform: track how ChatGPT, Claude, Gemini, and Perplexity cite your domain, join it with Search Console, GA4, server-side traffic, and paid media, and fix what you find through agent tools (CLI, REST, MCP). Local SQLite.",
6
6
  "keywords": [
@@ -89,29 +89,29 @@
89
89
  "@ainyc/canonry-web": "0.0.0",
90
90
  "@ainyc/canonry-api-client": "0.0.0",
91
91
  "@ainyc/canonry-api-routes": "0.0.0",
92
- "@ainyc/canonry-config": "0.0.0",
93
- "@ainyc/canonry-contracts": "0.0.0",
94
92
  "@ainyc/canonry-db": "0.0.0",
93
+ "@ainyc/canonry-contracts": "0.0.0",
94
+ "@ainyc/canonry-config": "0.0.0",
95
95
  "@ainyc/canonry-integration-bing": "0.0.0",
96
96
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
97
97
  "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
98
- "@ainyc/canonry-integration-commoncrawl": "0.0.0",
99
98
  "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
99
+ "@ainyc/canonry-integration-google": "0.0.0",
100
100
  "@ainyc/canonry-integration-google-ads": "0.0.0",
101
+ "@ainyc/canonry-integration-commoncrawl": "0.0.0",
101
102
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
102
- "@ainyc/canonry-integration-google": "0.0.0",
103
103
  "@ainyc/canonry-integration-google-places": "0.0.0",
104
- "@ainyc/canonry-integration-traffic": "0.0.0",
105
104
  "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
105
+ "@ainyc/canonry-integration-openai-ads": "0.0.0",
106
106
  "@ainyc/canonry-intelligence": "0.0.0",
107
- "@ainyc/canonry-provider-cdp": "0.0.0",
108
107
  "@ainyc/canonry-integration-wordpress": "0.0.0",
109
- "@ainyc/canonry-provider-claude": "0.0.0",
108
+ "@ainyc/canonry-provider-cdp": "0.0.0",
109
+ "@ainyc/canonry-integration-traffic": "0.0.0",
110
110
  "@ainyc/canonry-provider-gemini": "0.0.0",
111
111
  "@ainyc/canonry-provider-local": "0.0.0",
112
- "@ainyc/canonry-provider-perplexity": "0.0.0",
113
- "@ainyc/canonry-integration-openai-ads": "0.0.0",
114
- "@ainyc/canonry-provider-openai": "0.0.0"
112
+ "@ainyc/canonry-provider-claude": "0.0.0",
113
+ "@ainyc/canonry-provider-openai": "0.0.0",
114
+ "@ainyc/canonry-provider-perplexity": "0.0.0"
115
115
  },
116
116
  "scripts": {
117
117
  "build": "pnpm run build:cli && pnpm run build:web",