@canonry/canonry 5.14.0 → 5.16.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 (29) hide show
  1. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +2 -0
  2. package/assets/assets/{AuditHistoryPanel-DWDOPf8c.js → AuditHistoryPanel-CnoGPJ5Y.js} +1 -1
  3. package/assets/assets/{BacklinksPage-DGxq-iU6.js → BacklinksPage-DYe2CYfD.js} +1 -1
  4. package/assets/assets/{HistoryPage-DR91m-gT.js → HistoryPage-CO-dzLAo.js} +1 -1
  5. package/assets/assets/{MeasurementPropertyPage-a8poltfM.js → MeasurementPropertyPage-smsZFdd6.js} +1 -1
  6. package/assets/assets/{ProjectPage-CCCJE7rA.js → ProjectPage-jL3jB2TR.js} +1 -1
  7. package/assets/assets/{RunRow-Xe63DyPK.js → RunRow-CzcaoK_3.js} +1 -1
  8. package/assets/assets/{RunsPage-DK119ZZw.js → RunsPage-DQWPHDoq.js} +1 -1
  9. package/assets/assets/{SettingsPage-G461foD-.js → SettingsPage-DMtQLrWP.js} +1 -1
  10. package/assets/assets/{SiteHealthSection-CJnHkGM2.js → SiteHealthSection-2ljW02xK.js} +3 -3
  11. package/assets/assets/{TrafficPage-AsWgc7Ot.js → TrafficPage-NFu0LEdk.js} +1 -1
  12. package/assets/assets/{TrafficSourceDetailPage-D10yBQoD.js → TrafficSourceDetailPage-DbBIzmbL.js} +1 -1
  13. package/assets/assets/{extract-error-message-PP4HD_Dp.js → extract-error-message-pMGpUsIh.js} +1 -1
  14. package/assets/assets/{index-CCIeAE4J.js → index-D9NReRHX.js} +22 -22
  15. package/assets/assets/{react-sigma_core.esm.min-CkyyYkKU.js → react-sigma_core.esm.min-CadBie52.js} +1 -1
  16. package/assets/assets/{v2-overview-adapter-DW-In1hp.js → v2-overview-adapter-Oe8hHMAO.js} +1 -1
  17. package/assets/index.html +1 -1
  18. package/dist/{chunk-RGMUT5KY.js → chunk-3YAPVVFN.js} +106 -39
  19. package/dist/{chunk-4LPV6ZZY.js → chunk-CDQDPUY4.js} +2 -2
  20. package/dist/{chunk-SOLFOKZF.js → chunk-JO5HHEJV.js} +2 -2
  21. package/dist/{chunk-45EGDRVF.js → chunk-L36TC6LB.js} +62 -7
  22. package/dist/{chunk-S6LJSUZO.js → chunk-XDFMFZRN.js} +115 -40
  23. package/dist/{chunk-2W6GCJ3O.js → chunk-ZGZSROSR.js} +1 -1
  24. package/dist/cli.js +7 -7
  25. package/dist/{demo-server-H4ZFIIIB.js → demo-server-QLQUVMKJ.js} +3 -3
  26. package/dist/index.js +5 -5
  27. package/dist/{intelligence-service-CJKOXPOP.js → intelligence-service-EAUKUVVM.js} +2 -2
  28. package/dist/mcp.js +3 -3
  29. package/package.json +13 -13
@@ -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 ? "fbd3ec65759728dfb2dc5382f1435574eb8690e0" : 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);
@@ -14438,8 +14473,33 @@ var AERO_EXCLUDED_MCP_TOOLS = /* @__PURE__ */ new Set([
14438
14473
  CanonryMcpToolNames.canonry_agent_conversations_delete,
14439
14474
  CanonryMcpToolNames.canonry_results_clear
14440
14475
  ]);
14476
+ var AERO_MANAGED_SWEEP_MCP_TOOLS = /* @__PURE__ */ new Set([
14477
+ CanonryMcpToolNames.canonry_run_trigger,
14478
+ CanonryMcpToolNames.canonry_run_fill,
14479
+ CanonryMcpToolNames.canonry_schedule_set,
14480
+ CanonryMcpToolNames.canonry_schedule_delete,
14481
+ CanonryMcpToolNames.canonry_apply_config
14482
+ ]);
14483
+ var MANAGED_SWEEP_CANCEL_REFUSAL = "This install manages answer-visibility sweeps, so Aero cannot cancel one. Ask the operator to cancel it.";
14484
+ function refuseManagedSweepCancel(tool, ctx) {
14485
+ const cancel = tool.execute;
14486
+ return {
14487
+ ...tool,
14488
+ execute: async (toolCallId, params, ...rest) => {
14489
+ const runId = params.runId;
14490
+ if (typeof runId === "string") {
14491
+ const run = await ctx.client.getRun(runId);
14492
+ if (run.kind === RunKinds["answer-visibility"]) throw new Error(MANAGED_SWEEP_CANCEL_REFUSAL);
14493
+ }
14494
+ return cancel(toolCallId, params, ...rest);
14495
+ }
14496
+ };
14497
+ }
14441
14498
  function buildMcpAgentTools(registry, ctx, opts = {}) {
14442
- return registry.filter((tool) => !AERO_EXCLUDED_MCP_TOOLS.has(tool.name)).filter((tool) => opts.includeNames ? opts.includeNames.has(tool.name) : true).filter((tool) => opts.readOnly ? tool.access === "read" : true).map((tool) => mcpToAgentTool(tool, ctx));
14499
+ return registry.filter((tool) => !AERO_EXCLUDED_MCP_TOOLS.has(tool.name)).filter((tool) => opts.includeNames ? opts.includeNames.has(tool.name) : true).filter((tool) => opts.readOnly ? tool.access === "read" : true).filter((tool) => opts.managedSweeps ? !AERO_MANAGED_SWEEP_MCP_TOOLS.has(tool.name) : true).map((tool) => {
14500
+ const agentTool = mcpToAgentTool(tool, ctx);
14501
+ return opts.managedSweeps && tool.name === CanonryMcpToolNames.canonry_run_cancel ? refuseManagedSweepCancel(agentTool, ctx) : agentTool;
14502
+ });
14443
14503
  }
14444
14504
 
14445
14505
  // src/agent/tools.ts
@@ -14697,26 +14757,28 @@ function buildAdsOperatorContextTool(ctx) {
14697
14757
  }
14698
14758
  };
14699
14759
  }
14700
- function buildReadTools(ctx) {
14701
- return buildMcpAgentTools(canonryMcpTools, ctx, { readOnly: true });
14760
+ function buildReadTools(ctx, opts = {}) {
14761
+ return buildMcpAgentTools(canonryMcpTools, ctx, { readOnly: true, managedSweeps: opts.managedSweeps });
14702
14762
  }
14703
- function buildAllTools(ctx) {
14704
- return buildMcpAgentTools(canonryMcpTools, ctx);
14763
+ function buildAllTools(ctx, opts = {}) {
14764
+ return buildMcpAgentTools(canonryMcpTools, ctx, { managedSweeps: opts.managedSweeps });
14705
14765
  }
14706
14766
  function buildAdsOperatorTools(ctx, opts = {}) {
14707
14767
  const mcpTools = buildMcpAgentTools(canonryMcpTools, ctx, {
14708
14768
  readOnly: opts.scope === AeroToolScopes.readOnly,
14709
- includeNames: AERO_ADS_OPERATOR_MCP_TOOL_NAMES
14769
+ includeNames: AERO_ADS_OPERATOR_MCP_TOOL_NAMES,
14770
+ managedSweeps: opts.managedSweeps
14710
14771
  });
14711
14772
  return [buildAdsOperatorContextTool(ctx), ...mcpTools];
14712
14773
  }
14713
14774
  function buildAeroStateTools(ctx, opts = {}) {
14714
14775
  const scope = opts.scope ?? AeroToolScopes.all;
14715
14776
  const profile = opts.profile ?? AeroToolProfiles.default;
14777
+ const managedSweeps = opts.managedSweeps;
14716
14778
  if (profile === AeroToolProfiles.adsOperator) {
14717
- return buildAdsOperatorTools(ctx, { scope });
14779
+ return buildAdsOperatorTools(ctx, { scope, managedSweeps });
14718
14780
  }
14719
- return scope === AeroToolScopes.readOnly ? buildReadTools(ctx) : buildAllTools(ctx);
14781
+ return scope === AeroToolScopes.readOnly ? buildReadTools(ctx, { managedSweeps }) : buildAllTools(ctx, { managedSweeps });
14720
14782
  }
14721
14783
 
14722
14784
  // src/agent/llm-usage.ts
@@ -15151,7 +15213,7 @@ function createAeroSession(opts) {
15151
15213
  client: opts.client,
15152
15214
  projectName: opts.projectName
15153
15215
  };
15154
- const stateTools = buildAeroStateTools(toolCtx, { scope: toolScope, profile: toolProfile });
15216
+ const stateTools = buildAeroStateTools(toolCtx, { scope: toolScope, profile: toolProfile, managedSweeps: opts.managedSweeps });
15155
15217
  const defaultTools = [...stateTools, ...buildSkillDocTools(), ...toolProfile === AeroToolProfiles.default ? [buildAeroViewTool({ ...toolCtx, basePath: opts.config.basePath })] : []];
15156
15218
  const tools = opts.tools ?? defaultTools;
15157
15219
  const toolUsageHooks = opts.db ? createAeroToolUsageHooks({
@@ -15645,6 +15707,7 @@ var SessionRegistry = class {
15645
15707
  initialMessages: persistedMessages,
15646
15708
  toolScope: preferences?.toolScope,
15647
15709
  toolProfile: preferences?.toolProfile,
15710
+ managedSweeps: this.opts.managedSweeps,
15648
15711
  db: this.opts.db,
15649
15712
  projectId,
15650
15713
  agentSessionId: row.id
@@ -15673,6 +15736,7 @@ var SessionRegistry = class {
15673
15736
  systemPromptOverride: this.buildHydratedSystemPrompt(projectId, systemPrompt),
15674
15737
  toolScope: preferences?.toolScope,
15675
15738
  toolProfile: preferences?.toolProfile,
15739
+ managedSweeps: this.opts.managedSweeps,
15676
15740
  db: this.opts.db,
15677
15741
  projectId,
15678
15742
  agentSessionId: sessionId
@@ -15865,7 +15929,7 @@ ${lines.join("\n")}
15865
15929
  const projectId = this.projectIds.get(projectName) ?? this.resolveProjectId(projectName);
15866
15930
  this.projectIds.set(projectName, projectId);
15867
15931
  const toolCtx = { client: this.opts.client, projectName };
15868
- const stateTools = buildAeroStateTools(toolCtx, want);
15932
+ const stateTools = buildAeroStateTools(toolCtx, { ...want, managedSweeps: this.opts.managedSweeps });
15869
15933
  agent.state.tools = [...stateTools, ...buildSkillDocTools()];
15870
15934
  this.scopes.set(projectName, want.scope);
15871
15935
  this.profiles.set(projectName, want.profile);
@@ -18214,7 +18278,8 @@ async function createServer(opts) {
18214
18278
  db: opts.db,
18215
18279
  client: aeroClient,
18216
18280
  config: opts.config,
18217
- proactive: agentProactive
18281
+ proactive: agentProactive,
18282
+ managedSweeps: dashboardManagedRunKinds.includes(SchedulableRunKinds["answer-visibility"])
18218
18283
  }) : void 0;
18219
18284
  const runCoordinator = new RunCoordinator(
18220
18285
  opts.db,
@@ -18485,7 +18550,8 @@ async function createServer(opts) {
18485
18550
  lifetimeSpendLimitMicros: entity.budget?.lifetime_spend_limit_micros ?? null,
18486
18551
  locationIds: entity.targeting?.locations?.include?.map((location) => location.id) ?? [],
18487
18552
  biddingType: entity.bidding_type,
18488
- conversionEventSettingIds: entity.conversion_event_setting_ids
18553
+ conversionEventSettingIds: entity.conversion_event_setting_ids,
18554
+ landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(entity.landing_page_configuration)
18489
18555
  });
18490
18556
  const adsAdGroupEntityResult = (entity, campaignId) => ({
18491
18557
  ...adsEntityResult(entity),
@@ -18493,12 +18559,15 @@ async function createServer(opts) {
18493
18559
  campaignId: campaignId ?? null,
18494
18560
  contextHints: entity.context_hints,
18495
18561
  maxBidMicros: entity.bidding_config?.max_bid_micros ?? null,
18496
- billingEventType: entity.bidding_config?.billing_event_type ?? null
18562
+ billingEventType: entity.bidding_config?.billing_event_type ?? null,
18563
+ landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(entity.landing_page_configuration)
18497
18564
  });
18498
18565
  const adsAdEntityResult = (entity, adGroupId) => ({
18499
18566
  ...adsEntityResult(entity),
18500
- adGroupId: adGroupId ?? null
18567
+ adGroupId: adGroupId ?? null,
18568
+ landingPageQueryStringTemplate: parseLandingPageQueryStringTemplate(entity.landing_page_configuration)
18501
18569
  });
18570
+ const landingPageConfigurationUpdate = (template) => template === void 0 ? void 0 : template === null ? null : { query_string_template: template };
18502
18571
  const adsOperator = {
18503
18572
  uploadImage: async (apiKey, imageUrl) => {
18504
18573
  const result2 = await uploadImageFromUrl(apiKey, imageUrl);
@@ -18515,7 +18584,8 @@ async function createServer(opts) {
18515
18584
  budget: { lifetime_spend_limit_micros: input.lifetimeSpendLimitMicros },
18516
18585
  bidding_type: input.biddingType,
18517
18586
  conversion_event_setting_ids: input.conversionEventSettingIds,
18518
- targeting: { locations: { include: input.locationIds.map((id) => ({ id })) } }
18587
+ targeting: { locations: { include: input.locationIds.map((id) => ({ id })) } },
18588
+ landing_page_configuration: input.landingPageQueryStringTemplate === void 0 ? void 0 : { query_string_template: input.landingPageQueryStringTemplate }
18519
18589
  })),
18520
18590
  updateCampaign: async (apiKey, id, input) => adsCampaignEntityResult(await updateCampaign(apiKey, id, {
18521
18591
  name: input.name,
@@ -18523,7 +18593,8 @@ async function createServer(opts) {
18523
18593
  start_time: input.startTime,
18524
18594
  end_time: input.endTime,
18525
18595
  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 })) } }
18596
+ targeting: input.locationIds === void 0 ? void 0 : { locations: { include: input.locationIds.map((locationId) => ({ id: locationId })) } },
18597
+ landing_page_configuration: landingPageConfigurationUpdate(input.landingPageQueryStringTemplate)
18527
18598
  })),
18528
18599
  activateCampaign: async (apiKey, id) => adsCampaignEntityResult(await activateCampaign(apiKey, id)),
18529
18600
  pauseCampaign: async (apiKey, id) => adsCampaignEntityResult(await pauseCampaign(apiKey, id)),
@@ -18539,7 +18610,8 @@ async function createServer(opts) {
18539
18610
  bidding_config: {
18540
18611
  billing_event_type: input.billingEventType,
18541
18612
  max_bid_micros: input.maxBidMicros
18542
- }
18613
+ },
18614
+ landing_page_configuration: input.landingPageQueryStringTemplate === void 0 ? void 0 : { query_string_template: input.landingPageQueryStringTemplate }
18543
18615
  })),
18544
18616
  updateAdGroup: async (apiKey, id, input) => {
18545
18617
  let biddingConfig;
@@ -18556,7 +18628,8 @@ async function createServer(opts) {
18556
18628
  name: input.name,
18557
18629
  description: input.description,
18558
18630
  context_hints: input.contextHints,
18559
- bidding_config: biddingConfig
18631
+ bidding_config: biddingConfig,
18632
+ landing_page_configuration: landingPageConfigurationUpdate(input.landingPageQueryStringTemplate)
18560
18633
  }));
18561
18634
  },
18562
18635
  activateAdGroup: async (apiKey, id) => adsAdGroupEntityResult(await activateAdGroup(apiKey, id)),
@@ -18574,7 +18647,8 @@ async function createServer(opts) {
18574
18647
  body: input.creative.body,
18575
18648
  target_url: input.creative.targetUrl,
18576
18649
  file_id: input.creative.fileId
18577
- }
18650
+ },
18651
+ landing_page_configuration: input.landingPageQueryStringTemplate === void 0 ? void 0 : { query_string_template: input.landingPageQueryStringTemplate }
18578
18652
  })),
18579
18653
  updateAd: async (apiKey, id, input) => adsAdEntityResult(await updateAd(apiKey, id, {
18580
18654
  name: input.name,
@@ -18584,7 +18658,8 @@ async function createServer(opts) {
18584
18658
  body: input.creative.body,
18585
18659
  target_url: input.creative.targetUrl,
18586
18660
  file_id: input.creative.fileId
18587
- } : void 0
18661
+ } : void 0,
18662
+ landing_page_configuration: landingPageConfigurationUpdate(input.landingPageQueryStringTemplate)
18588
18663
  })),
18589
18664
  activateAd: async (apiKey, id) => adsAdEntityResult(await activateAd(apiKey, id)),
18590
18665
  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-XDFMFZRN.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-XDFMFZRN.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.16.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": [
@@ -86,32 +86,32 @@
86
86
  "@types/node-cron": "^3.0.11",
87
87
  "tsup": "^8.5.1",
88
88
  "tsx": "^4.19.0",
89
- "@ainyc/canonry-web": "0.0.0",
90
89
  "@ainyc/canonry-api-client": "0.0.0",
91
- "@ainyc/canonry-api-routes": "0.0.0",
90
+ "@ainyc/canonry-web": "0.0.0",
92
91
  "@ainyc/canonry-config": "0.0.0",
92
+ "@ainyc/canonry-api-routes": "0.0.0",
93
93
  "@ainyc/canonry-contracts": "0.0.0",
94
94
  "@ainyc/canonry-db": "0.0.0",
95
95
  "@ainyc/canonry-integration-bing": "0.0.0",
96
96
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
97
- "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
98
97
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
99
98
  "@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
100
- "@ainyc/canonry-integration-google-ads": "0.0.0",
101
- "@ainyc/canonry-integration-google-business-profile": "0.0.0",
99
+ "@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
102
100
  "@ainyc/canonry-integration-google": "0.0.0",
103
- "@ainyc/canonry-integration-google-places": "0.0.0",
104
- "@ainyc/canonry-integration-traffic": "0.0.0",
101
+ "@ainyc/canonry-integration-google-business-profile": "0.0.0",
102
+ "@ainyc/canonry-integration-google-ads": "0.0.0",
105
103
  "@ainyc/canonry-integration-google-tag-manager": "0.0.0",
104
+ "@ainyc/canonry-integration-openai-ads": "0.0.0",
105
+ "@ainyc/canonry-integration-traffic": "0.0.0",
106
+ "@ainyc/canonry-integration-wordpress": "0.0.0",
106
107
  "@ainyc/canonry-intelligence": "0.0.0",
108
+ "@ainyc/canonry-integration-google-places": "0.0.0",
107
109
  "@ainyc/canonry-provider-cdp": "0.0.0",
108
- "@ainyc/canonry-integration-wordpress": "0.0.0",
109
- "@ainyc/canonry-provider-claude": "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",