@canonry/canonry 7.64.4 → 7.65.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 (139) hide show
  1. package/assets/agent-workspace/skills/aero/references/seo-analysis.md +2 -2
  2. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +2 -1
  3. package/assets/assets/{AgentSetupPage-DgcU4n6k.js → AgentSetupPage-DPHRo4OR.js} +3 -3
  4. package/assets/assets/{AuditHistoryPanel-IDTBP47p.js → AuditHistoryPanel-qhIB8KRK.js} +1 -1
  5. package/assets/assets/{BacklinksPage-tbfBeOWq.js → BacklinksPage-iWrZ0-Pp.js} +1 -1
  6. package/assets/assets/{HistoryPage-BT17i1bv.js → HistoryPage-BP1_GGlT.js} +1 -1
  7. package/assets/assets/MeasurementPropertyPage-DfPHZNGo.js +4 -0
  8. package/assets/assets/ProjectPage-D4n2oqPP.js +9 -0
  9. package/assets/assets/RunsPage-Cc98Px3T.js +1 -0
  10. package/assets/assets/{SettingsPage-DhXsS4mE.js → SettingsPage-CMyCE-H2.js} +1 -1
  11. package/assets/assets/SiteHealthSection-CGKKUtqQ.js +2 -0
  12. package/assets/assets/ToneBadge-CJ6ObMRe.js +60 -0
  13. package/assets/assets/{TrafficPage-2Ix0v2Sw.js → TrafficPage-DAef3d2A.js} +1 -1
  14. package/assets/assets/TrafficSourceDetailPage-CdoL5Dt9.js +1 -0
  15. package/assets/assets/{account-context-eRm8f3bl.js → account-context-CWRd3KeS.js} +1 -1
  16. package/assets/assets/{card-CWFz5ZQm.js → card-Cb_fM36G.js} +1 -1
  17. package/assets/assets/{extract-error-message-BdsLX91O.js → extract-error-message-DSIAoHTR.js} +1 -1
  18. package/assets/assets/{format-helpers-Dv7wus0N.js → format-helpers-CxNDa1oa.js} +1 -1
  19. package/assets/assets/{index-CipZo_Z_.js → index-DEXKV7TW.js} +22 -22
  20. package/assets/assets/{query-client-B4X4SMBT.js → query-client-DLdAMlsX.js} +1 -1
  21. package/assets/assets/react-query-BktZZtSC.js +1 -0
  22. package/assets/assets/{react-sigma_core.esm.min-_zOXWmWO.js → react-sigma_core.esm.min-DgK5sRqv.js} +1 -1
  23. package/assets/assets/service-Dv9FDyFY.js +1 -0
  24. package/assets/index.html +7 -7
  25. package/dist/{ads-JR7S3FK6.js → ads-D4WQOT5K.js} +3 -3
  26. package/dist/{agent-AMVJ3FUV.js → agent-E3IYC7OJ.js} +7 -7
  27. package/dist/{agent-ask-KZTQLKGM.js → agent-ask-ZSKRPB2Z.js} +3 -3
  28. package/dist/{agent-conversations-WJJ2K2ON.js → agent-conversations-YHPYPQE2.js} +3 -3
  29. package/dist/{agent-memory-TNWIXVZ5.js → agent-memory-6OWOOD5O.js} +3 -3
  30. package/dist/{agent-providers-KJVQSN3Q.js → agent-providers-7KZK37UO.js} +3 -3
  31. package/dist/{agent-transcript-PBYDJLYH.js → agent-transcript-3O7GPML6.js} +3 -3
  32. package/dist/{analytics-CBPNUDES.js → analytics-P2LLIUYK.js} +3 -3
  33. package/dist/{apply-ZX4OF5PG.js → apply-VBNNJOCT.js} +3 -3
  34. package/dist/{backfill-NEYUHVUQ.js → backfill-F5SSURCH.js} +9 -9
  35. package/dist/{backlinks-O4Q6WH53.js → backlinks-4RE3TNNA.js} +3 -3
  36. package/dist/{bing-SIZPWBYU.js → bing-V6UN7D44.js} +3 -3
  37. package/dist/{bootstrap-XF6DMDQI.js → bootstrap-SHTSPAI5.js} +10 -10
  38. package/dist/{cdp-DD7ARB62.js → cdp-GDL2VFI3.js} +7 -7
  39. package/dist/{chunk-MBNS5AND.js → chunk-2AROR73F.js} +6 -6
  40. package/dist/{chunk-MFNU4NRS.js → chunk-2Y7RN5HG.js} +3 -3
  41. package/dist/{chunk-QGDFDP3H.js → chunk-3QKKHU7D.js} +8 -8
  42. package/dist/{chunk-C3FQGQDS.js → chunk-66DPEVLJ.js} +3 -3
  43. package/dist/{chunk-PG6Q6MEF.js → chunk-6FN2OQKL.js} +340 -340
  44. package/dist/{chunk-UJ222WSC.js → chunk-737TOG2F.js} +1 -1
  45. package/dist/{chunk-Z4CVEVP6.js → chunk-AE6HJZBU.js} +3 -3
  46. package/dist/{chunk-QT7UBYG7.js → chunk-BV6NXSAH.js} +3 -3
  47. package/dist/{chunk-22XKOBJD.js → chunk-C2PYKUD3.js} +1 -1
  48. package/dist/{chunk-7A3CQCEV.js → chunk-CRKOGLKJ.js} +31 -5
  49. package/dist/{chunk-YVYID65D.js → chunk-DQVJB6CZ.js} +7 -1
  50. package/dist/{chunk-RR7ZDGC7.js → chunk-F7NZEUXP.js} +2 -2
  51. package/dist/{chunk-OMB3VLDQ.js → chunk-GM5ZOWBK.js} +4 -5
  52. package/dist/{chunk-VOWM62EC.js → chunk-GQXSZE2Z.js} +63 -21
  53. package/dist/{chunk-IJF7KNU6.js → chunk-GZPGDAAF.js} +2 -2
  54. package/dist/{chunk-CKRXLVWQ.js → chunk-H6HIJAIU.js} +2 -2
  55. package/dist/{chunk-NMDXZWFB.js → chunk-HI2HCYLB.js} +2 -2
  56. package/dist/{chunk-N7M7UVYT.js → chunk-HO5W6QC7.js} +1 -1
  57. package/dist/{chunk-DIS2JA7D.js → chunk-HPUZMBS6.js} +2 -2
  58. package/dist/{chunk-ZTO5KPQB.js → chunk-IJKKK7F4.js} +1 -1
  59. package/dist/{chunk-WODZX4Y6.js → chunk-IYB3EGSD.js} +1 -1
  60. package/dist/{chunk-T4EGKFOV.js → chunk-LTX3TJ3E.js} +1 -1
  61. package/dist/{chunk-73QOQIFZ.js → chunk-M3OZL6PQ.js} +4 -4
  62. package/dist/{chunk-NCIPNVD6.js → chunk-NDTU7FGL.js} +1 -1
  63. package/dist/{chunk-ZOP2F25H.js → chunk-O3INLME6.js} +4 -4
  64. package/dist/{chunk-OHOIEA3X.js → chunk-Q2WZAD5W.js} +1 -1
  65. package/dist/{chunk-PNZE3XLO.js → chunk-QNRMYDK6.js} +1 -1
  66. package/dist/{chunk-KJA7V3IT.js → chunk-S4VCXCRQ.js} +1 -1
  67. package/dist/{chunk-G33PG23U.js → chunk-SL3Y7IOX.js} +1 -1
  68. package/dist/{chunk-4E6E27C5.js → chunk-X4AHYJCE.js} +5 -5
  69. package/dist/{chunk-WACG4O26.js → chunk-XMKXXWMO.js} +2 -2
  70. package/dist/{chunk-NCUTFEU4.js → chunk-XOMUSIM7.js} +2 -2
  71. package/dist/{chunk-ATXHIX32.js → chunk-Z2EENWM3.js} +96 -30
  72. package/dist/{chunk-VL5LVBLE.js → chunk-ZPRJCSSR.js} +1 -1
  73. package/dist/{chunk-VMLCPTRZ.js → chunk-ZWZOQNLD.js} +1 -1
  74. package/dist/{citations-DQGMUJYX.js → citations-GO4SPZYS.js} +3 -3
  75. package/dist/{cli-catalog-G7USVSOC.js → cli-catalog-6XYQY3PI.js} +3 -3
  76. package/dist/{cli-commands-HGKM2B6J.js → cli-commands-AMURHC27.js} +7 -7
  77. package/dist/cli.js +13 -13
  78. package/dist/{competitor-CIKVJ4H4.js → competitor-JBTKRJ6Y.js} +3 -3
  79. package/dist/{content-DPWKB5SO.js → content-LKXXQ7X4.js} +3 -3
  80. package/dist/{dashboard-3QKO5423.js → dashboard-LUA7UX6B.js} +6 -6
  81. package/dist/{demo-3GNJPXGE.js → demo-I7JDZJUW.js} +1 -1
  82. package/dist/{demo-server-23QGNLCX.js → demo-server-GNGGWERV.js} +11 -11
  83. package/dist/{discover-3JGVGPMR.js → discover-TODAYYJ2.js} +3 -3
  84. package/dist/{discover-eval-HVU24KNC.js → discover-eval-FWQESEYB.js} +3 -3
  85. package/dist/{doctor-77VPDK2N.js → doctor-AXNJT2UC.js} +3 -3
  86. package/dist/{evidence-WSSOMBED.js → evidence-2XGEY4ZC.js} +3 -3
  87. package/dist/{export-cmd-CPO73FP7.js → export-cmd-7RMYBIBZ.js} +3 -3
  88. package/dist/{ga-QOIYDTEX.js → ga-HZDIZGCO.js} +3 -3
  89. package/dist/{gbp-JEPBXCS6.js → gbp-SMRBWJEL.js} +3 -3
  90. package/dist/{google-5BZYXAJH.js → google-2CN345XS.js} +4 -4
  91. package/dist/{google-marketing-Q36Q7YFU.js → google-marketing-W7T2VTVW.js} +1 -1
  92. package/dist/{health-cmd-5KSRFNNN.js → health-cmd-W7OWZ4ZI.js} +3 -3
  93. package/dist/{history-WE4K4QIA.js → history-UVNCBHTE.js} +3 -3
  94. package/dist/index.d.ts +21 -17
  95. package/dist/index.js +25 -25
  96. package/dist/{init-LIUMX2HQ.js → init-MDGOTK2L.js} +11 -11
  97. package/dist/{insights-K6PVVNZA.js → insights-PQ52G5LU.js} +3 -3
  98. package/dist/intelligence-service-IAUGKMDO.js +15 -0
  99. package/dist/{journeys-GD2QE2YK.js → journeys-3PP5GYVJ.js} +3 -3
  100. package/dist/{keys-SLJDSG7P.js → keys-CWZUX7IQ.js} +3 -3
  101. package/dist/{keyword-KDDWSW24.js → keyword-5OMMULLY.js} +3 -3
  102. package/dist/{logs-PMIEBMOW.js → logs-3FTE42E3.js} +3 -3
  103. package/dist/{mcp-E5YLJ4LN.js → mcp-FK5DTI7I.js} +2 -2
  104. package/dist/mcp.js +10 -10
  105. package/dist/{measurement-plan-QZDBAH5D.js → measurement-plan-ICO2BQNT.js} +5 -5
  106. package/dist/{notify-3QXR6PO2.js → notify-ML4PYD3L.js} +3 -3
  107. package/dist/{organic-evidence-UXEEKJPH.js → organic-evidence-4U4H3DCR.js} +3 -3
  108. package/dist/{overview-2Q4E75BW.js → overview-NF427VFO.js} +4 -4
  109. package/dist/{project-M7VFAIJ2.js → project-AAO65OF7.js} +3 -3
  110. package/dist/{query-WDQGPIKS.js → query-7ZOUQNF5.js} +3 -3
  111. package/dist/{research-U2GP2EQK.js → research-UQ7AF5N3.js} +3 -3
  112. package/dist/{results-export-SMNP3XZT.js → results-export-CZCLC4ZH.js} +3 -3
  113. package/dist/{run-CZXLPC3S.js → run-4XJZW52R.js} +4 -4
  114. package/dist/{schedule-DVIXJJFI.js → schedule-D3E5FDBE.js} +3 -3
  115. package/dist/{search-GFU2VPG4.js → search-DYET2IL4.js} +3 -3
  116. package/dist/{serve-XEQ7ZW4N.js → serve-R2CI3RWQ.js} +26 -26
  117. package/dist/{session-P5QHGJLK.js → session-7CW2V5EH.js} +13 -13
  118. package/dist/{settings-VYVGART2.js → settings-ZISHACFX.js} +3 -3
  119. package/dist/{skills-EWEPVEDD.js → skills-WU6IN3NL.js} +2 -2
  120. package/dist/{snapshot-L2DX6EBI.js → snapshot-KCKQDJ2W.js} +3 -3
  121. package/dist/{src-RBXPA4CW.js → src-WIOU5G4V.js} +2 -2
  122. package/dist/{status-ZJLUWVST.js → status-CYZFVMYA.js} +4 -4
  123. package/dist/{technical-aeo-7KRBPNV7.js → technical-aeo-P5CS22AR.js} +3 -3
  124. package/dist/{telemetry-ZROXU4SH.js → telemetry-LPK5F2WU.js} +4 -4
  125. package/dist/{tools-RGBSLMRZ.js → tools-E3B2GZ6Q.js} +11 -11
  126. package/dist/{traffic-J3SSIDXQ.js → traffic-5KZYXXIQ.js} +5 -5
  127. package/dist/{users-GGJSWVSI.js → users-2F346HIW.js} +3 -3
  128. package/dist/{visibility-stats-VZ5A7LMI.js → visibility-stats-ITA6DNF3.js} +3 -3
  129. package/dist/{wordpress-JYXIO3DJ.js → wordpress-ZHCFT6V3.js} +3 -3
  130. package/package.json +1 -1
  131. package/assets/assets/MeasurementPropertyPage-CNVW1nD0.js +0 -4
  132. package/assets/assets/ProjectPage-BOpHsl0H.js +0 -9
  133. package/assets/assets/RunsPage-DSbp_ueP.js +0 -1
  134. package/assets/assets/SiteHealthSection-DDnJ6MmG.js +0 -2
  135. package/assets/assets/ToneBadge-BQIKzc8y.js +0 -60
  136. package/assets/assets/TrafficSourceDetailPage-Cytn_uBJ.js +0 -1
  137. package/assets/assets/react-query-6xQVTyvM.js +0 -1
  138. package/assets/assets/service-D5-ENCES.js +0 -1
  139. package/dist/intelligence-service-FTCGYX6T.js +0 -15
@@ -28,7 +28,7 @@ import {
28
28
  unknownUsageObservation,
29
29
  usdToMicros,
30
30
  withRetry
31
- } from "./chunk-YVYID65D.js";
31
+ } from "./chunk-DQVJB6CZ.js";
32
32
 
33
33
  // ../provider-answer-services/src/core/http.ts
34
34
  var MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
@@ -3,7 +3,7 @@ import {
3
3
  resolveCliAccess,
4
4
  resolveCliAccessForInvocation,
5
5
  windowOptions
6
- } from "./chunk-N7M7UVYT.js";
6
+ } from "./chunk-HO5W6QC7.js";
7
7
  import {
8
8
  emitJsonl
9
9
  } from "./chunk-Z7IUAJOF.js";
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-HGMYEDAQ.js";
15
15
  import {
16
16
  OperationAccesses
17
- } from "./chunk-YVYID65D.js";
17
+ } from "./chunk-DQVJB6CZ.js";
18
18
 
19
19
  // src/cli-catalog.ts
20
20
  import { createRequire } from "module";
@@ -111,7 +111,7 @@ async function dispatchRegisteredCommand(args, fallbackFormat, specs) {
111
111
  const accessValue = accessFilterFromArgs(argsWithoutHelp);
112
112
  validateAccessFilter(accessValue);
113
113
  if (fallbackFormat !== "text") {
114
- const { printCliCatalog: printCliCatalog2 } = await import("./cli-catalog-G7USVSOC.js");
114
+ const { printCliCatalog: printCliCatalog2 } = await import("./cli-catalog-6XYQY3PI.js");
115
115
  const group2 = argsWithoutHelp.find((arg) => !arg.startsWith("--"));
116
116
  printCliCatalog2(specs, fallbackFormat, group2, accessValue);
117
117
  return true;
@@ -2,11 +2,11 @@ import {
2
2
  dedupeGscSitemapUrls,
3
3
  resolveDiscoveredGscSitemapUrls,
4
4
  submitGscSitemapBatches
5
- } from "./chunk-VMLCPTRZ.js";
5
+ } from "./chunk-ZWZOQNLD.js";
6
6
  import {
7
7
  measurementDraftOperationSchema,
8
8
  runMeasurementDraftAction
9
- } from "./chunk-VL5LVBLE.js";
9
+ } from "./chunk-ZPRJCSSR.js";
10
10
  import {
11
11
  CliError
12
12
  } from "./chunk-HGMYEDAQ.js";
@@ -173,7 +173,7 @@ import {
173
173
  trafficSeriesGranularitySchema,
174
174
  visibilityCompareSelectionSchema,
175
175
  visibilityReportRequestSchema
176
- } from "./chunk-YVYID65D.js";
176
+ } from "./chunk-DQVJB6CZ.js";
177
177
 
178
178
  // src/mcp/tool-registry.ts
179
179
  import { z as z2 } from "zod";
@@ -20,7 +20,7 @@ import {
20
20
  resolveProviderModel,
21
21
  schedulableRunKindSchema,
22
22
  sentimentEvaluatorProviderSchema
23
- } from "./chunk-YVYID65D.js";
23
+ } from "./chunk-DQVJB6CZ.js";
24
24
 
25
25
  // ../config/src/index.ts
26
26
  import { z as z4 } from "zod";
@@ -1,26 +1,29 @@
1
1
  import {
2
2
  runWithUsageTags
3
- } from "./chunk-RR7ZDGC7.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
4
  import {
5
5
  CanonryMcpToolNames,
6
6
  canonryMcpTools
7
- } from "./chunk-QT7UBYG7.js";
7
+ } from "./chunk-BV6NXSAH.js";
8
8
  import {
9
9
  CliError
10
10
  } from "./chunk-HGMYEDAQ.js";
11
11
  import {
12
12
  buildOpenApiDocument
13
- } from "./chunk-ATXHIX32.js";
13
+ } from "./chunk-Z2EENWM3.js";
14
14
  import {
15
15
  DEFAULT_COMPETITOR_AUTO_ALIAS_MODE,
16
16
  MeasurementPortfolioLists,
17
17
  RATIO_UNIT_META_KEY,
18
18
  RunKinds,
19
+ SchedulableRunKinds,
19
20
  describeError,
20
21
  formatPercent,
21
22
  ratioUnitSchema,
23
+ seoDatasetWithoutVendor,
24
+ seoProviderSchema,
22
25
  truncateUtf16
23
- } from "./chunk-YVYID65D.js";
26
+ } from "./chunk-DQVJB6CZ.js";
24
27
 
25
28
  // src/agent/tools.ts
26
29
  import { Type as Type2 } from "@earendil-works/pi-ai";
@@ -145,6 +148,16 @@ function serializeResult(value) {
145
148
  function isRecord2(value) {
146
149
  return !!value && typeof value === "object" && !Array.isArray(value);
147
150
  }
151
+ function withoutSeoVendor(value) {
152
+ if (Array.isArray(value)) return value.map(withoutSeoVendor);
153
+ if (!isRecord2(value)) return value;
154
+ const kept = {};
155
+ for (const [key, item] of Object.entries(value)) {
156
+ if (key === "provider" && seoProviderSchema.safeParse(item).success) continue;
157
+ kept[key] = key === "dataset" && typeof item === "string" ? seoDatasetWithoutVendor(item) : withoutSeoVendor(item);
158
+ }
159
+ return kept;
160
+ }
148
161
  function keptSummary(counts, cursors = {}) {
149
162
  const summary = { droppedKeys: [], keptItems: {} };
150
163
  for (const [path, { kept, total }] of counts) {
@@ -743,7 +756,7 @@ function mcpToAgentTool(tool, ctx) {
743
756
  const execute = async (_toolCallId, params) => {
744
757
  const handlerInput = hadProject ? { ...params, project: ctx.projectName } : params;
745
758
  const result = await runWithUsageTags(ctx.client, { mcpTool: tool.name, mcpCall: randomUUID() }, () => tool.handler(ctx.client, handlerInput));
746
- return textResult(result, responseSchemas);
759
+ return textResult(tool.tier === "seo" ? withoutSeoVendor(result) : result, responseSchemas);
747
760
  };
748
761
  const adapted = {
749
762
  name: tool.name,
@@ -802,6 +815,18 @@ function refuseManagedSweepCancel(tool, ctx) {
802
815
  }
803
816
  };
804
817
  }
818
+ var SEO_SCHEDULE_REFUSAL = "Aero cannot schedule paid SEO refreshes. Ask the operator to set the seo-sync schedule.";
819
+ function refuseSeoScheduleWrite(tool) {
820
+ const write = tool.execute;
821
+ return {
822
+ ...tool,
823
+ execute: async (toolCallId, params, ...rest) => {
824
+ const schedule = isRecord2(params) && isRecord2(params.schedule) ? params.schedule : {};
825
+ if (schedule.kind === SchedulableRunKinds["seo-sync"] && schedule.enabled !== false) throw new Error(SEO_SCHEDULE_REFUSAL);
826
+ return write(toolCallId, params, ...rest);
827
+ }
828
+ };
829
+ }
805
830
  var COMPETITOR_AUTO_ALIAS_MODE_REFUSAL = "Aero cannot change a project's competitorAutoAliases mode. Omit competitorAutoAliases to keep the stored mode, or ask the operator to change it.";
806
831
  var COMPETITOR_AUTO_ALIAS_MODE_WRITES = /* @__PURE__ */ new Set([
807
832
  CanonryMcpToolNames.canonry_project_upsert,
@@ -863,6 +888,7 @@ function buildMcpAgentTools(registry, ctx, opts = {}) {
863
888
  const agentTool = mcpToAgentTool(tool, ctx);
864
889
  if (COMPETITOR_AUTO_ALIAS_MODE_WRITES.has(tool.name)) return refuseCompetitorAutoAliasModeChange(agentTool, ctx);
865
890
  if (tool.name === "canonry_competitors_add") return refuseCompetitorBulkAddAcknowledgement(agentTool);
891
+ if (tool.name === CanonryMcpToolNames.canonry_schedule_set) return refuseSeoScheduleWrite(agentTool);
866
892
  return opts.managedSweeps && tool.name === CanonryMcpToolNames.canonry_run_cancel ? refuseManagedSweepCancel(agentTool, ctx) : agentTool;
867
893
  });
868
894
  }
@@ -21218,6 +21218,10 @@ var seoCapabilitySchema = z66.enum(["keyword-metrics", "domain-intelligence", "r
21218
21218
  var SeoCapabilities = seoCapabilitySchema.enum;
21219
21219
  var seoProviderSchema = z66.enum(["dataforseo"]);
21220
21220
  var SeoProviders = seoProviderSchema.enum;
21221
+ var SEO_PROVIDER_SEGMENT = new RegExp(`^(?:${seoProviderSchema.options.join("|")})(?:[-_].*)?$`, "i");
21222
+ function seoDatasetWithoutVendor(dataset) {
21223
+ return dataset.split("/").filter((segment) => !SEO_PROVIDER_SEGMENT.test(segment)).join("/");
21224
+ }
21221
21225
  var seoTargetKindSchema = z66.enum(["domain", "host"]);
21222
21226
  var SeoTargetKinds = seoTargetKindSchema.enum;
21223
21227
  var seoScopeKindSchema = z66.enum(["project", "group", "market", "property"]);
@@ -21514,7 +21518,7 @@ import { z as z69 } from "zod";
21514
21518
 
21515
21519
  // ../contracts/src/schedule.ts
21516
21520
  import { z as z68 } from "zod";
21517
- var schedulableRunKindSchema = z68.enum(["answer-visibility", "traffic-sync", "gbp-sync", "data-refresh", "backlinks-sync", "site-audit", "ads-sync", "doctor"]);
21521
+ var schedulableRunKindSchema = z68.enum(["answer-visibility", "traffic-sync", "gbp-sync", "data-refresh", "backlinks-sync", "site-audit", "ads-sync", "doctor", "seo-sync"]);
21518
21522
  var SchedulableRunKinds = schedulableRunKindSchema.enum;
21519
21523
  var calendarRecurrenceSchema = z68.object({
21520
21524
  everyDays: z68.number().int().min(1).max(3650),
@@ -27281,7 +27285,9 @@ export {
27281
27285
  uncheckedSourcesLabel,
27282
27286
  rateOverChecked,
27283
27287
  SeoCapabilities,
27288
+ seoProviderSchema,
27284
27289
  SeoProviders,
27290
+ seoDatasetWithoutVendor,
27285
27291
  SeoTargetKinds,
27286
27292
  SeoScopeKinds,
27287
27293
  SeoRunStatuses,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  loadConfig
3
- } from "./chunk-22XKOBJD.js";
3
+ } from "./chunk-C2PYKUD3.js";
4
4
  import {
5
5
  PACKAGE_VERSION
6
6
  } from "./chunk-AOJU5LKX.js";
@@ -36,7 +36,7 @@ import {
36
36
  sentimentSettingsReadSchema,
37
37
  sentimentSummaryReadSchema,
38
38
  upgradeCommandFor
39
- } from "./chunk-YVYID65D.js";
39
+ } from "./chunk-DQVJB6CZ.js";
40
40
 
41
41
  // ../api-client-generated/src/generated/core/bodySerializer.gen.ts
42
42
  var jsonBodySerializer = {
@@ -2,16 +2,16 @@ import {
2
2
  CANONRY_MCP_TOOLKITS,
3
3
  CANONRY_MCP_TOOLKIT_NAMES,
4
4
  isCanonryMcpToolkitName
5
- } from "./chunk-NCIPNVD6.js";
5
+ } from "./chunk-NDTU7FGL.js";
6
6
  import {
7
7
  createApiClient,
8
8
  runWithUsageTags
9
- } from "./chunk-RR7ZDGC7.js";
9
+ } from "./chunk-F7NZEUXP.js";
10
10
  import {
11
11
  canonryMcpTools,
12
12
  mcpOutputSchema,
13
13
  toolOperationAccess
14
- } from "./chunk-QT7UBYG7.js";
14
+ } from "./chunk-BV6NXSAH.js";
15
15
  import {
16
16
  PACKAGE_VERSION
17
17
  } from "./chunk-AOJU5LKX.js";
@@ -24,7 +24,7 @@ import {
24
24
  isReadOnlyKey,
25
25
  restrictedWriteScopes,
26
26
  upgradeCaveatFor
27
- } from "./chunk-YVYID65D.js";
27
+ } from "./chunk-DQVJB6CZ.js";
28
28
 
29
29
  // src/mcp/server.ts
30
30
  import { randomUUID } from "crypto";
@@ -243,7 +243,6 @@ var OPERATIONS_GUIDE = {
243
243
  "seo": {
244
244
  "keywords": [
245
245
  "seo",
246
- "dataforseo",
247
246
  "rankings",
248
247
  "ranked",
249
248
  "keywords"
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  answerServiceAdapters,
3
3
  answerServiceDescriptors
4
- } from "./chunk-UJ222WSC.js";
4
+ } from "./chunk-737TOG2F.js";
5
5
  import {
6
6
  AeroLlmUsageFeatures,
7
7
  aeroTurnStatus,
@@ -27,14 +27,14 @@ import {
27
27
  resolveConfiguredAgentProvider,
28
28
  resolveSessionProviderAndModel,
29
29
  setAeroSystemPrompt
30
- } from "./chunk-MBNS5AND.js";
30
+ } from "./chunk-2AROR73F.js";
31
31
  import {
32
32
  AeroToolProfiles,
33
33
  AeroToolScopes,
34
34
  buildAeroStateTools,
35
35
  isAeroToolProfile,
36
36
  truncateToolResult
37
- } from "./chunk-7A3CQCEV.js";
37
+ } from "./chunk-CRKOGLKJ.js";
38
38
  import {
39
39
  getGoogleAuthConfig,
40
40
  getGoogleConnection,
@@ -53,7 +53,7 @@ import {
53
53
  removeCloudflareTrafficConnection,
54
54
  removeCloudflareTrafficConnectionBySourceId,
55
55
  upsertCloudflareTrafficConnection
56
- } from "./chunk-PNZE3XLO.js";
56
+ } from "./chunk-QNRMYDK6.js";
57
57
  import {
58
58
  claudeAdapter,
59
59
  embedQueries,
@@ -64,7 +64,7 @@ import {
64
64
  openaiAdapter,
65
65
  openrouterAdapter,
66
66
  perplexityAdapter
67
- } from "./chunk-DIS2JA7D.js";
67
+ } from "./chunk-HPUZMBS6.js";
68
68
  import {
69
69
  classifyUsageSurface,
70
70
  createApiUsageTelemetry,
@@ -76,7 +76,7 @@ import {
76
76
  startOutcomeTimer,
77
77
  trackFeatureCompleted,
78
78
  trackInstallState
79
- } from "./chunk-73QOQIFZ.js";
79
+ } from "./chunk-M3OZL6PQ.js";
80
80
  import {
81
81
  isLoopbackBindHost
82
82
  } from "./chunk-TSENU4GG.js";
@@ -84,7 +84,7 @@ import {
84
84
  isApiProviderRegistrable,
85
85
  isCdpProviderRegistrable,
86
86
  registeredProviderNames
87
- } from "./chunk-WODZX4Y6.js";
87
+ } from "./chunk-IYB3EGSD.js";
88
88
  import {
89
89
  checkLatestVersionForServer,
90
90
  getOrCreateAnonymousId,
@@ -95,17 +95,17 @@ import {
95
95
  recordDashboardEvent,
96
96
  setTelemetryPreference,
97
97
  trackEvent
98
- } from "./chunk-WACG4O26.js";
98
+ } from "./chunk-XMKXXWMO.js";
99
99
  import {
100
100
  createCanonryMcpServer
101
- } from "./chunk-OMB3VLDQ.js";
101
+ } from "./chunk-GM5ZOWBK.js";
102
102
  import {
103
103
  CANONRY_MCP_TIERS,
104
104
  CANONRY_MCP_TOOLKIT_NAMES
105
- } from "./chunk-NCIPNVD6.js";
105
+ } from "./chunk-NDTU7FGL.js";
106
106
  import {
107
107
  ApiClient
108
- } from "./chunk-RR7ZDGC7.js";
108
+ } from "./chunk-F7NZEUXP.js";
109
109
  import {
110
110
  AGENT_PROVIDERS,
111
111
  adapterSupportsBatch,
@@ -136,21 +136,21 @@ import {
136
136
  saveConfigPatch,
137
137
  sentimentInstallReadiness,
138
138
  updateSharedProviderExecutionGate
139
- } from "./chunk-22XKOBJD.js";
139
+ } from "./chunk-C2PYKUD3.js";
140
140
  import {
141
141
  getBundledSkillSnapshots
142
- } from "./chunk-G33PG23U.js";
142
+ } from "./chunk-SL3Y7IOX.js";
143
143
  import {
144
144
  computeFactorAverages,
145
145
  deleteSiteCrawlGraphLayout,
146
146
  persistSiteCrawlGraphLayout,
147
147
  prepareSiteCrawlGraphLayout,
148
148
  recordedSharePct
149
- } from "./chunk-CKRXLVWQ.js";
149
+ } from "./chunk-H6HIJAIU.js";
150
150
  import {
151
151
  CanonryMcpToolNames,
152
152
  canonryMcpTools
153
- } from "./chunk-QT7UBYG7.js";
153
+ } from "./chunk-BV6NXSAH.js";
154
154
  import {
155
155
  PACKAGE_VERSION
156
156
  } from "./chunk-AOJU5LKX.js";
@@ -162,11 +162,11 @@ import {
162
162
  addLogListener,
163
163
  createFastifyLogger,
164
164
  createLogger
165
- } from "./chunk-4E6E27C5.js";
165
+ } from "./chunk-X4AHYJCE.js";
166
166
  import {
167
167
  computeCitedCompetitorDomains,
168
168
  determineCitationState
169
- } from "./chunk-KJA7V3IT.js";
169
+ } from "./chunk-S4VCXCRQ.js";
170
170
  import {
171
171
  BingApiError,
172
172
  CC_CACHE_DIR,
@@ -278,6 +278,7 @@ import {
278
278
  sentimentClassifierInput,
279
279
  sentimentHash,
280
280
  serializeUserSessionCookie,
281
+ startScheduledSeoRefreshes,
281
282
  stripIpv6Brackets,
282
283
  syncRunClaimKey,
283
284
  toAlertView,
@@ -285,7 +286,7 @@ import {
285
286
  webhookResponseReason,
286
287
  webhookTargetRefusalReason,
287
288
  writeAuditLog
288
- } from "./chunk-ATXHIX32.js";
289
+ } from "./chunk-Z2EENWM3.js";
289
290
  import {
290
291
  OperationalLogStore,
291
292
  SentimentIdempotencyConflict,
@@ -371,7 +372,7 @@ import {
371
372
  siteLivenessState,
372
373
  trafficSources,
373
374
  usageCounters
374
- } from "./chunk-NCUTFEU4.js";
375
+ } from "./chunk-XOMUSIM7.js";
375
376
  import {
376
377
  AGENT_MEMORY_VALUE_MAX_BYTES,
377
378
  AI_ENGINE_DOMAINS,
@@ -617,7 +618,7 @@ import {
617
618
  winnabilityClassLabel,
618
619
  withRetry,
619
620
  withSkippedProviders
620
- } from "./chunk-YVYID65D.js";
621
+ } from "./chunk-DQVJB6CZ.js";
621
622
 
622
623
  // src/google-marketing-runtime.ts
623
624
  import crypto2 from "crypto";
@@ -5658,7 +5659,7 @@ function nonBlank(value) {
5658
5659
  return trimmed ? trimmed : void 0;
5659
5660
  }
5660
5661
  function resolveBuildCommit(env = process.env) {
5661
- const embedded = true ? "71e50cd654bc70374b8e8db96b43a7b7edc7da0d" : void 0;
5662
+ const embedded = true ? "d690131dbffb56d442cbb05eb5b318e6f7e9f499" : void 0;
5662
5663
  return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
5663
5664
  }
5664
5665
  function resolveInstanceIdentity(env = process.env) {
@@ -13423,6 +13424,29 @@ var Scheduler = class {
13423
13424
  this.callbacks.onAdsSyncRequested(runId2, projectId);
13424
13425
  return SLOT_FIRED;
13425
13426
  }
13427
+ if (kind === SchedulableRunKinds["seo-sync"]) {
13428
+ if (!this.callbacks.onSeoSyncRequested) {
13429
+ log17.warn("seo-sync.no-callback", { scheduleId, projectId, msg: "host did not register onSeoSyncRequested" });
13430
+ return slotFailed(OutcomeReasonCodes.UNSUPPORTED);
13431
+ }
13432
+ const activeSeoRun = this.db.select({ id: runs.id }).from(runs).where(and17(
13433
+ eq20(runs.projectId, projectId),
13434
+ eq20(runs.kind, RunKinds["seo-sync"]),
13435
+ inArray10(runs.status, [RunStatuses.queued, RunStatuses.running])
13436
+ )).get();
13437
+ if (activeSeoRun) {
13438
+ log17.info("seo-sync.skipped-active", { projectName: project.name, activeRunId: activeSeoRun.id });
13439
+ this.updateScheduleTiming(currentSchedule.id, { nextRunAt });
13440
+ return slotSkipped(OutcomeReasonCodes.OPERATION_IN_PROGRESS);
13441
+ }
13442
+ this.updateScheduleTiming(currentSchedule.id, {
13443
+ lastRunAt: now,
13444
+ nextRunAt
13445
+ });
13446
+ log17.info("seo-sync.triggered", { projectName: project.name });
13447
+ this.callbacks.onSeoSyncRequested({ scheduleId, projectId, occurrence: now.slice(0, 16) });
13448
+ return SLOT_FIRED;
13449
+ }
13426
13450
  if (kind === SchedulableRunKinds["data-refresh"]) {
13427
13451
  if (!this.callbacks.onDataRefreshRequested) {
13428
13452
  log17.warn("data-refresh.no-callback", { scheduleId, projectId, msg: "host did not register onDataRefreshRequested" });
@@ -19776,6 +19800,24 @@ async function createServer(opts) {
19776
19800
  },
19777
19801
  onSiteAuditRequested: (runId, projectId, auditOpts) => {
19778
19802
  runSiteAudit(runId, projectId, auditOpts);
19803
+ },
19804
+ onSeoSyncRequested: ({ scheduleId, projectId, occurrence }) => {
19805
+ try {
19806
+ const outcomes = startScheduledSeoRefreshes(
19807
+ opts.db,
19808
+ { getSeoRuntime: seoRuntime.getRuntime, onSeoRunRequested: () => seoRuntime.wake() },
19809
+ { scheduleId, projectId, occurrence }
19810
+ );
19811
+ for (const outcome of outcomes) {
19812
+ if (outcome.status === "skipped") {
19813
+ app.log.warn({ projectId, profileId: outcome.profileId, runId: outcome.runId, reason: outcome.reason, detail: outcome.detail }, "Scheduled SEO refresh did not start");
19814
+ } else {
19815
+ app.log.info({ projectId, profileId: outcome.profileId, runId: outcome.runId, status: outcome.status }, "Scheduled SEO refresh admitted");
19816
+ }
19817
+ }
19818
+ } catch (err) {
19819
+ app.log.error({ projectId, err: describeError(err) }, "Scheduled SEO refresh failed");
19820
+ }
19779
19821
  }
19780
19822
  }, { spreadMs: opts.scheduleSpreadMs ?? SCHEDULE_SPREAD_MS });
19781
19823
  const providerSummary = providerSummaries(registry, opts.config);
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  trackIntegrationConnection
3
- } from "./chunk-73QOQIFZ.js";
3
+ } from "./chunk-M3OZL6PQ.js";
4
4
  import {
5
5
  cliRuntimeContext
6
- } from "./chunk-WACG4O26.js";
6
+ } from "./chunk-XMKXXWMO.js";
7
7
 
8
8
  // src/cli-connection-telemetry.ts
9
9
  function trackCliConnection(properties) {
@@ -5,7 +5,7 @@ import {
5
5
  siteCrawlGraphNodes,
6
6
  siteCrawlPages,
7
7
  siteCrawlSnapshots
8
- } from "./chunk-NCUTFEU4.js";
8
+ } from "./chunk-XOMUSIM7.js";
9
9
  import {
10
10
  SITE_CRAWL_GRAPH_MAX_EDGES,
11
11
  SITE_CRAWL_GRAPH_MAX_NODES,
@@ -15,7 +15,7 @@ import {
15
15
  factorStatusFromDistribution,
16
16
  factorStatusFromScore,
17
17
  roundPreservingTotal
18
- } from "./chunk-YVYID65D.js";
18
+ } from "./chunk-DQVJB6CZ.js";
19
19
 
20
20
  // src/site-audit-factors.ts
21
21
  function recordedSharePct(factor) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-RR7ZDGC7.js";
3
+ } from "./chunk-F7NZEUXP.js";
4
4
  import {
5
5
  emitJsonl
6
6
  } from "./chunk-Z7IUAJOF.js";
@@ -19,7 +19,7 @@ import {
19
19
  formatMicros,
20
20
  formatRunErrorOneLine,
21
21
  resolveProviderInput
22
- } from "./chunk-YVYID65D.js";
22
+ } from "./chunk-DQVJB6CZ.js";
23
23
 
24
24
  // src/commands/run.ts
25
25
  function getClient() {
@@ -5,7 +5,7 @@ import {
5
5
  AppError,
6
6
  parseWindowIn,
7
7
  resolveDateRange
8
- } from "./chunk-YVYID65D.js";
8
+ } from "./chunk-DQVJB6CZ.js";
9
9
 
10
10
  // src/cli-access.ts
11
11
  var CLI_ACCESS_BY_ID = Object.freeze({
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  parseJsonColumn
3
- } from "./chunk-NCUTFEU4.js";
3
+ } from "./chunk-XOMUSIM7.js";
4
4
  import {
5
5
  AI_ENGINE_DOMAINS,
6
6
  AI_ENGINE_SELF_DOMAINS,
@@ -26,7 +26,7 @@ import {
26
26
  retryAfterDelayMs,
27
27
  usageCount,
28
28
  withRetry
29
- } from "./chunk-YVYID65D.js";
29
+ } from "./chunk-DQVJB6CZ.js";
30
30
 
31
31
  // ../provider-openai/src/normalize.ts
32
32
  import OpenAI from "openai";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  USAGE_TELEMETRY_HEADERS,
3
3
  redactLogString
4
- } from "./chunk-YVYID65D.js";
4
+ } from "./chunk-DQVJB6CZ.js";
5
5
 
6
6
  // ../api-routes/src/request-context.ts
7
7
  import { AsyncLocalStorage } from "async_hooks";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  API_PROVIDER_NAMES,
3
3
  ProviderNames
4
- } from "./chunk-YVYID65D.js";
4
+ } from "./chunk-DQVJB6CZ.js";
5
5
 
6
6
  // src/provider-registration.ts
7
7
  function isApiProviderRegistrable(name, entry) {
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-HGMYEDAQ.js";
9
9
  import {
10
10
  describeError
11
- } from "./chunk-YVYID65D.js";
11
+ } from "./chunk-DQVJB6CZ.js";
12
12
 
13
13
  // src/commands/mcp.ts
14
14
  import fs from "fs";
@@ -2,13 +2,13 @@ import {
2
2
  bucketCliCommandDuration,
3
3
  isTelemetryEnabled,
4
4
  trackEvent
5
- } from "./chunk-WACG4O26.js";
5
+ } from "./chunk-XMKXXWMO.js";
6
6
  import {
7
7
  getConfigDir
8
- } from "./chunk-22XKOBJD.js";
8
+ } from "./chunk-C2PYKUD3.js";
9
9
  import {
10
10
  currentOutcomeAttribution
11
- } from "./chunk-ZTO5KPQB.js";
11
+ } from "./chunk-IJKKK7F4.js";
12
12
  import {
13
13
  AGENT_NONE,
14
14
  OutcomeSurfaces,
@@ -19,7 +19,7 @@ import {
19
19
  integrationConnectionPropertiesSchema,
20
20
  normalizeAgentSlug,
21
21
  usageSurfaceSchema
22
- } from "./chunk-YVYID65D.js";
22
+ } from "./chunk-DQVJB6CZ.js";
23
23
 
24
24
  // src/outcome-telemetry.ts
25
25
  import fs from "fs";
@@ -38,7 +38,7 @@ var CANONRY_MCP_TOOLKITS = [
38
38
  {
39
39
  name: "seo",
40
40
  title: "SEO data",
41
- description: "Provider-neutral keyword metrics, ranked keywords, domain intelligence, saved profiles and explicit refreshes. DataForSEO is the first adapter.",
41
+ description: "Keyword metrics, ranked keywords, domain intelligence, saved profiles and explicit refreshes from the host's SEO source, named by its connection label.",
42
42
  whenToLoad: "Load to inspect saved organic-search estimates, manage exact SEO profiles or explicitly refresh evidence. Search Console observations and AI citation and mention coverage remain separate."
43
43
  },
44
44
  {
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  registeredProviderNames
3
- } from "./chunk-WODZX4Y6.js";
3
+ } from "./chunk-IYB3EGSD.js";
4
4
  import {
5
5
  configExists,
6
6
  loadConfigRaw
7
- } from "./chunk-22XKOBJD.js";
7
+ } from "./chunk-C2PYKUD3.js";
8
8
 
9
9
  // src/setup-state.ts
10
10
  import fs from "fs";
@@ -28,7 +28,7 @@ async function buildSetupState() {
28
28
  }
29
29
  if (dbPath && fs.existsSync(dbPath)) {
30
30
  try {
31
- const { createClient, projects, queries: queriesTable } = await import("./src-RBXPA4CW.js");
31
+ const { createClient, projects, queries: queriesTable } = await import("./src-WIOU5G4V.js");
32
32
  const db = createClient(dbPath);
33
33
  project_count = db.select({ id: projects.id }).from(projects).all().length;
34
34
  const firstQuery = db.select({ id: queriesTable.id }).from(queriesTable).limit(1).all();
@@ -47,7 +47,7 @@ function queueServeHandoff() {
47
47
  async function runPendingServeHandoff(format) {
48
48
  if (!pendingServeHandoff) return;
49
49
  pendingServeHandoff = false;
50
- const { serveCommand } = await import("./serve-XEQ7ZW4N.js");
50
+ const { serveCommand } = await import("./serve-R2CI3RWQ.js");
51
51
  await serveCommand(format);
52
52
  }
53
53
 
@@ -8,7 +8,7 @@ import {
8
8
  classifyJourneyEntry,
9
9
  hostMatchesDomain,
10
10
  hostOf
11
- } from "./chunk-YVYID65D.js";
11
+ } from "./chunk-DQVJB6CZ.js";
12
12
 
13
13
  // ../integration-traffic/src/ip-ranges/amazonbot.json
14
14
  var amazonbot_default = {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cloudflareQueueNameSchema
3
- } from "./chunk-YVYID65D.js";
3
+ } from "./chunk-DQVJB6CZ.js";
4
4
 
5
5
  // src/cloudflare-traffic-config.ts
6
6
  function unsupportedDeliveryMode(deliveryMode) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  hostMatchesDomain
3
- } from "./chunk-YVYID65D.js";
3
+ } from "./chunk-DQVJB6CZ.js";
4
4
 
5
5
  // src/citation-utils.ts
6
6
  function pickProjectCitedDomain(citedDomains, projectDomains) {