@canonry/canonry 7.65.1 → 7.67.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 (138) hide show
  1. package/assets/agent-workspace/skills/aero/references/seo-analysis.md +15 -1
  2. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +2 -2
  3. package/assets/assets/{AgentSetupPage-BDLMjn1I.js → AgentSetupPage-ORsy3QEa.js} +3 -3
  4. package/assets/assets/{AuditHistoryPanel-qhIB8KRK.js → AuditHistoryPanel-vTHZDbfs.js} +1 -1
  5. package/assets/assets/{BacklinksPage-iWrZ0-Pp.js → BacklinksPage-FqADB5sO.js} +1 -1
  6. package/assets/assets/{HistoryPage-BP1_GGlT.js → HistoryPage-C4l5Toqa.js} +1 -1
  7. package/assets/assets/MeasurementPropertyPage-x8f7xanT.js +4 -0
  8. package/assets/assets/ProjectPage-CG9I2-B4.js +9 -0
  9. package/assets/assets/{RunsPage-Ddd2oE1Y.js → RunsPage-oyhhwAPq.js} +1 -1
  10. package/assets/assets/{SettingsPage-D_QdYWDO.js → SettingsPage-DJc4Di1M.js} +1 -1
  11. package/assets/assets/SiteHealthSection-BvqFg3rG.js +2 -0
  12. package/assets/assets/ToneBadge-CTWpeKu8.js +60 -0
  13. package/assets/assets/{TrafficPage-VnBUE1S6.js → TrafficPage-DAD0FFkL.js} +2 -2
  14. package/assets/assets/TrafficSourceDetailPage-BBEzbawh.js +1 -0
  15. package/assets/assets/{account-context-CWRd3KeS.js → account-context-DMHOefRt.js} +1 -1
  16. package/assets/assets/{card-Cb_fM36G.js → card-Brp6fFNG.js} +1 -1
  17. package/assets/assets/{extract-error-message-DSIAoHTR.js → extract-error-message-5QpQCsGb.js} +1 -1
  18. package/assets/assets/{format-helpers-CxNDa1oa.js → format-helpers-BFM0FRjT.js} +1 -1
  19. package/assets/assets/index-BBNs-RhI.js +60 -0
  20. package/assets/assets/{query-client-DLdAMlsX.js → query-client-BMTW-xss.js} +1 -1
  21. package/assets/assets/react-query-DGmY6hJa.js +1 -0
  22. package/assets/assets/{react-sigma_core.esm.min-DEG8vFYD.js → react-sigma_core.esm.min-C0VjhgDo.js} +1 -1
  23. package/assets/assets/service-DW9u_0aZ.js +1 -0
  24. package/assets/index.html +7 -7
  25. package/dist/{ads-D4WQOT5K.js → ads-BXGEL4WI.js} +3 -3
  26. package/dist/{agent-E3IYC7OJ.js → agent-LFX7GHWD.js} +7 -7
  27. package/dist/{agent-ask-ZSKRPB2Z.js → agent-ask-QJV225AT.js} +3 -3
  28. package/dist/{agent-conversations-YHPYPQE2.js → agent-conversations-2TZDIGA6.js} +3 -3
  29. package/dist/{agent-memory-6OWOOD5O.js → agent-memory-XCY3ZG5C.js} +3 -3
  30. package/dist/{agent-providers-7KZK37UO.js → agent-providers-VS6PH55Y.js} +3 -3
  31. package/dist/{agent-transcript-3O7GPML6.js → agent-transcript-BUUHOTZM.js} +3 -3
  32. package/dist/{analytics-P2LLIUYK.js → analytics-YWJWPUNF.js} +3 -3
  33. package/dist/{apply-VBNNJOCT.js → apply-BMCYFBEJ.js} +3 -3
  34. package/dist/{backfill-F5SSURCH.js → backfill-YBOKT5LT.js} +9 -9
  35. package/dist/{backlinks-4RE3TNNA.js → backlinks-QNNABB4N.js} +3 -3
  36. package/dist/{bing-V6UN7D44.js → bing-KEMXBABP.js} +3 -3
  37. package/dist/{bootstrap-SHTSPAI5.js → bootstrap-X2AADK4M.js} +10 -10
  38. package/dist/{cdp-GDL2VFI3.js → cdp-WVYUEV4U.js} +7 -7
  39. package/dist/{chunk-3QKKHU7D.js → chunk-2X7DFLMD.js} +8 -8
  40. package/dist/{chunk-2AROR73F.js → chunk-32BTTG5N.js} +5 -5
  41. package/dist/{chunk-BV6NXSAH.js → chunk-37R6GTU7.js} +21 -3
  42. package/dist/{chunk-HPUZMBS6.js → chunk-5DMESZDF.js} +2 -2
  43. package/dist/{chunk-XOMUSIM7.js → chunk-6DJN7HCK.js} +83 -11
  44. package/dist/{chunk-SRTX6XYR.js → chunk-AFRCTLUL.js} +370 -337
  45. package/dist/{chunk-Z2EENWM3.js → chunk-AVISYPUU.js} +877 -478
  46. package/dist/{chunk-HI2HCYLB.js → chunk-CBYKQRDH.js} +2 -2
  47. package/dist/{chunk-S4VCXCRQ.js → chunk-EKSXR7RJ.js} +1 -1
  48. package/dist/{chunk-66DPEVLJ.js → chunk-G6PZEDTH.js} +3 -3
  49. package/dist/{chunk-GZPGDAAF.js → chunk-GTPGYFZ4.js} +2 -2
  50. package/dist/{chunk-Q2WZAD5W.js → chunk-HX3WLTZU.js} +1 -1
  51. package/dist/{chunk-JSAYC36T.js → chunk-IEBMODUI.js} +193 -47
  52. package/dist/{chunk-2UFA3DYM.js → chunk-KJLICF53.js} +4 -4
  53. package/dist/{chunk-ZPRJCSSR.js → chunk-LU3M54IY.js} +1 -1
  54. package/dist/{chunk-HO5W6QC7.js → chunk-MD5PHJBX.js} +2 -1
  55. package/dist/{chunk-SL3Y7IOX.js → chunk-MLOGEXIO.js} +1 -1
  56. package/dist/{chunk-LTX3TJ3E.js → chunk-MOJ2XZXK.js} +1 -1
  57. package/dist/{chunk-IYB3EGSD.js → chunk-NHHZQWMI.js} +1 -1
  58. package/dist/{chunk-H6HIJAIU.js → chunk-P74TPIWZ.js} +2 -2
  59. package/dist/{chunk-M3OZL6PQ.js → chunk-RRS7U6HQ.js} +4 -4
  60. package/dist/{chunk-X4AHYJCE.js → chunk-UHLWNU6I.js} +5 -5
  61. package/dist/{chunk-C2PYKUD3.js → chunk-UNCOK6DA.js} +1 -1
  62. package/dist/{chunk-IJKKK7F4.js → chunk-UXTNDZKM.js} +1 -1
  63. package/dist/{chunk-GM5ZOWBK.js → chunk-VR4MYSEH.js} +4 -4
  64. package/dist/{chunk-ZWZOQNLD.js → chunk-WSYLDPYF.js} +1 -1
  65. package/dist/{chunk-AE6HJZBU.js → chunk-WZ4LUM26.js} +3 -3
  66. package/dist/{chunk-DQVJB6CZ.js → chunk-XEGYSZEV.js} +99 -9
  67. package/dist/{chunk-F7NZEUXP.js → chunk-XEPEMON2.js} +14 -2
  68. package/dist/{chunk-CRKOGLKJ.js → chunk-XIA6NWIF.js} +4 -4
  69. package/dist/{chunk-737TOG2F.js → chunk-XMIKSCAO.js} +1 -1
  70. package/dist/{chunk-2Y7RN5HG.js → chunk-Y54PMWBH.js} +3 -3
  71. package/dist/{chunk-QNRMYDK6.js → chunk-YP743QX5.js} +1 -1
  72. package/dist/{chunk-XMKXXWMO.js → chunk-ZGUR4AZM.js} +2 -2
  73. package/dist/{citations-GO4SPZYS.js → citations-ZSI5BOGD.js} +3 -3
  74. package/dist/{cli-catalog-6XYQY3PI.js → cli-catalog-J2HUCGJL.js} +3 -3
  75. package/dist/{cli-commands-2TZKVGK6.js → cli-commands-XFMVFREG.js} +7 -7
  76. package/dist/cli.js +13 -13
  77. package/dist/{competitor-JBTKRJ6Y.js → competitor-WJDN3DLP.js} +3 -3
  78. package/dist/{content-LKXXQ7X4.js → content-K52YV4BK.js} +3 -3
  79. package/dist/{dashboard-LUA7UX6B.js → dashboard-L6RKTP35.js} +6 -6
  80. package/dist/{demo-I7JDZJUW.js → demo-Y7XRD4X4.js} +1 -1
  81. package/dist/{demo-server-GNGGWERV.js → demo-server-QNQX5CNP.js} +73 -11
  82. package/dist/{discover-TODAYYJ2.js → discover-UO5M7HQZ.js} +3 -3
  83. package/dist/{discover-eval-FWQESEYB.js → discover-eval-DN4PS6VN.js} +3 -3
  84. package/dist/{doctor-AXNJT2UC.js → doctor-7UYUXG7J.js} +3 -3
  85. package/dist/{evidence-2XGEY4ZC.js → evidence-DGKN5SGQ.js} +3 -3
  86. package/dist/{export-cmd-7RMYBIBZ.js → export-cmd-QAQWWIRL.js} +3 -3
  87. package/dist/{ga-HZDIZGCO.js → ga-4LGTEA6J.js} +3 -3
  88. package/dist/{gbp-SMRBWJEL.js → gbp-XOLYZ4XC.js} +3 -3
  89. package/dist/{google-2CN345XS.js → google-CAQDCFA6.js} +4 -4
  90. package/dist/{google-marketing-W7T2VTVW.js → google-marketing-HU5I3XPP.js} +1 -1
  91. package/dist/{health-cmd-W7OWZ4ZI.js → health-cmd-3PEB3M45.js} +3 -3
  92. package/dist/{history-UVNCBHTE.js → history-UGUWYPOY.js} +3 -3
  93. package/dist/index.d.ts +342 -161
  94. package/dist/index.js +24 -24
  95. package/dist/{init-2IWS2R7G.js → init-DEW65BLN.js} +11 -11
  96. package/dist/{insights-PQ52G5LU.js → insights-ZC3R4ZYG.js} +3 -3
  97. package/dist/intelligence-service-XRJVXZYI.js +15 -0
  98. package/dist/{journeys-3PP5GYVJ.js → journeys-W6F4BCXF.js} +3 -3
  99. package/dist/{keys-CWZUX7IQ.js → keys-ME7VRF73.js} +3 -3
  100. package/dist/{keyword-5OMMULLY.js → keyword-R3PLGSO5.js} +3 -3
  101. package/dist/{logs-3FTE42E3.js → logs-UM7CWHYB.js} +3 -3
  102. package/dist/{mcp-FK5DTI7I.js → mcp-BUPP5HC6.js} +2 -2
  103. package/dist/mcp.js +9 -9
  104. package/dist/{measurement-plan-ICO2BQNT.js → measurement-plan-R4KZHJII.js} +5 -5
  105. package/dist/{notify-ML4PYD3L.js → notify-4C26D2MY.js} +3 -3
  106. package/dist/{organic-evidence-4U4H3DCR.js → organic-evidence-SLIISYHW.js} +3 -3
  107. package/dist/{overview-NF427VFO.js → overview-JJZZOYQU.js} +4 -4
  108. package/dist/{project-AAO65OF7.js → project-XJH2OECP.js} +3 -3
  109. package/dist/{query-7ZOUQNF5.js → query-ZWAIWIYB.js} +3 -3
  110. package/dist/{research-UQ7AF5N3.js → research-GTVWVZBI.js} +3 -3
  111. package/dist/{results-export-CZCLC4ZH.js → results-export-CPAWO5AV.js} +3 -3
  112. package/dist/{run-4XJZW52R.js → run-RI2BMD7U.js} +4 -4
  113. package/dist/{schedule-D3E5FDBE.js → schedule-HDDWULBX.js} +3 -3
  114. package/dist/{search-DYET2IL4.js → search-TT3Q2BBP.js} +3 -3
  115. package/dist/{serve-QWMTR3SN.js → serve-6JYPUU24.js} +25 -25
  116. package/dist/{session-7CW2V5EH.js → session-DDESFV3N.js} +12 -12
  117. package/dist/{settings-ZISHACFX.js → settings-4AYXYJVA.js} +3 -3
  118. package/dist/{skills-WU6IN3NL.js → skills-UFMLMMY5.js} +2 -2
  119. package/dist/{snapshot-KCKQDJ2W.js → snapshot-KLWQGZB6.js} +3 -3
  120. package/dist/{src-WIOU5G4V.js → src-6IHGEMT2.js} +6 -2
  121. package/dist/{status-CYZFVMYA.js → status-HRIUPGUM.js} +4 -4
  122. package/dist/{technical-aeo-P5CS22AR.js → technical-aeo-HKJQHMMS.js} +3 -3
  123. package/dist/{telemetry-LPK5F2WU.js → telemetry-IS6KZK32.js} +4 -4
  124. package/dist/{tools-E3B2GZ6Q.js → tools-ZNVQFEAX.js} +11 -11
  125. package/dist/{traffic-5KZYXXIQ.js → traffic-PFHFGN44.js} +5 -5
  126. package/dist/{users-2F346HIW.js → users-BSLUSU6W.js} +3 -3
  127. package/dist/{visibility-stats-ITA6DNF3.js → visibility-stats-MPRNHPZW.js} +3 -3
  128. package/dist/{wordpress-ZHCFT6V3.js → wordpress-U5XKHURL.js} +3 -3
  129. package/package.json +1 -1
  130. package/assets/assets/MeasurementPropertyPage-dxGJ1GF9.js +0 -4
  131. package/assets/assets/ProjectPage-W6oYA85b.js +0 -9
  132. package/assets/assets/SiteHealthSection-DT20rNw-.js +0 -2
  133. package/assets/assets/ToneBadge-CJ6ObMRe.js +0 -60
  134. package/assets/assets/TrafficSourceDetailPage-CdoL5Dt9.js +0 -1
  135. package/assets/assets/index-D6WlecSB.js +0 -60
  136. package/assets/assets/react-query-BktZZtSC.js +0 -1
  137. package/assets/assets/service-DKP-BIBy.js +0 -1
  138. package/dist/intelligence-service-IAUGKMDO.js +0 -15
@@ -2,13 +2,13 @@ import {
2
2
  bucketCliCommandDuration,
3
3
  isTelemetryEnabled,
4
4
  trackEvent
5
- } from "./chunk-XMKXXWMO.js";
5
+ } from "./chunk-ZGUR4AZM.js";
6
6
  import {
7
7
  getConfigDir
8
- } from "./chunk-C2PYKUD3.js";
8
+ } from "./chunk-UNCOK6DA.js";
9
9
  import {
10
10
  currentOutcomeAttribution
11
- } from "./chunk-IJKKK7F4.js";
11
+ } from "./chunk-UXTNDZKM.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-DQVJB6CZ.js";
22
+ } from "./chunk-XEGYSZEV.js";
23
23
 
24
24
  // src/outcome-telemetry.ts
25
25
  import fs from "fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  pickProjectCitedDomain
3
- } from "./chunk-S4VCXCRQ.js";
3
+ } from "./chunk-EKSXR7RJ.js";
4
4
  import {
5
5
  GBP_INSIGHT_PROVIDER,
6
6
  PERSISTENT_GAP_THRESHOLD,
@@ -14,10 +14,10 @@ import {
14
14
  mergeGscQueryTotalsWithFallback,
15
15
  readGscQueryDailyRows,
16
16
  readLatestGscDataDate
17
- } from "./chunk-Z2EENWM3.js";
17
+ } from "./chunk-AVISYPUU.js";
18
18
  import {
19
19
  getRequestContext
20
- } from "./chunk-IJKKK7F4.js";
20
+ } from "./chunk-UXTNDZKM.js";
21
21
  import {
22
22
  competitors,
23
23
  gbpDailyMetrics,
@@ -35,7 +35,7 @@ import {
35
35
  queries,
36
36
  querySnapshots,
37
37
  runs
38
- } from "./chunk-XOMUSIM7.js";
38
+ } from "./chunk-6DJN7HCK.js";
39
39
  import {
40
40
  CitationStates,
41
41
  RunKinds,
@@ -45,7 +45,7 @@ import {
45
45
  effectiveDomains,
46
46
  redactLogString,
47
47
  redactLogValue
48
- } from "./chunk-DQVJB6CZ.js";
48
+ } from "./chunk-XEGYSZEV.js";
49
49
 
50
50
  // src/intelligence-service.ts
51
51
  import { eq, desc, asc, and, ne, or, inArray, gte, lte, isNull, sql, exists } from "drizzle-orm";
@@ -20,7 +20,7 @@ import {
20
20
  resolveProviderModel,
21
21
  schedulableRunKindSchema,
22
22
  sentimentEvaluatorProviderSchema
23
- } from "./chunk-DQVJB6CZ.js";
23
+ } from "./chunk-XEGYSZEV.js";
24
24
 
25
25
  // ../config/src/index.ts
26
26
  import { z as z4 } from "zod";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  USAGE_TELEMETRY_HEADERS,
3
3
  redactLogString
4
- } from "./chunk-DQVJB6CZ.js";
4
+ } from "./chunk-XEGYSZEV.js";
5
5
 
6
6
  // ../api-routes/src/request-context.ts
7
7
  import { AsyncLocalStorage } from "async_hooks";
@@ -6,12 +6,12 @@ import {
6
6
  import {
7
7
  createApiClient,
8
8
  runWithUsageTags
9
- } from "./chunk-F7NZEUXP.js";
9
+ } from "./chunk-XEPEMON2.js";
10
10
  import {
11
11
  canonryMcpTools,
12
12
  mcpOutputSchema,
13
13
  toolOperationAccess
14
- } from "./chunk-BV6NXSAH.js";
14
+ } from "./chunk-37R6GTU7.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-DQVJB6CZ.js";
27
+ } from "./chunk-XEGYSZEV.js";
28
28
 
29
29
  // src/mcp/server.ts
30
30
  import { randomUUID } from "crypto";
@@ -258,7 +258,7 @@ var OPERATIONS_GUIDE = {
258
258
  "canonry_seo_sync",
259
259
  "canonry_seo_run_cancel"
260
260
  ],
261
- "guidance": "Read saved SEO evidence first. Preserve profile, exact domain or host, market, language, plan revision, dataset and collection date. SEO traffic and keyword metrics are third-party estimates, separate from Search Console observations and AI citation and mention coverage. Refresh requires explicit approval for the profile and work, a fresh refresh intent and an idempotency key. Hosted financial controls are internal; no credential or billing information belongs in the response."
261
+ "guidance": "Read saved SEO evidence first. Preserve profile, exact domain or host, market, language, plan revision, dataset and collection date. Market rankings (canonry_seo_market_rankings) are the site's Google position for its tracked queries by market, the same queries AI visibility measures. SEO traffic and keyword metrics are third-party estimates, separate from Search Console observations and AI citation and mention coverage. Refresh requires explicit approval for the profile and work, a fresh refresh intent and an idempotency key. Hosted financial controls are internal; no credential or billing information belongs in the response."
262
262
  },
263
263
  "operations": {
264
264
  "keywords": [
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-HGMYEDAQ.js";
5
5
  import {
6
6
  describeError
7
- } from "./chunk-DQVJB6CZ.js";
7
+ } from "./chunk-XEGYSZEV.js";
8
8
 
9
9
  // src/gsc-sitemap-submission.ts
10
10
  function dedupeGscSitemapUrls(urls) {
@@ -3,7 +3,7 @@ import {
3
3
  resolveCliAccess,
4
4
  resolveCliAccessForInvocation,
5
5
  windowOptions
6
- } from "./chunk-HO5W6QC7.js";
6
+ } from "./chunk-MD5PHJBX.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-DQVJB6CZ.js";
17
+ } from "./chunk-XEGYSZEV.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-6XYQY3PI.js");
114
+ const { printCliCatalog: printCliCatalog2 } = await import("./cli-catalog-J2HUCGJL.js");
115
115
  const group2 = argsWithoutHelp.find((arg) => !arg.startsWith("--"));
116
116
  printCliCatalog2(specs, fallbackFormat, group2, accessValue);
117
117
  return true;
@@ -13365,6 +13365,7 @@ var STORED_READ_OPERATIONS = /* @__PURE__ */ new Set([
13365
13365
  "GET /api/v1/projects/{name}/seo/keyword-metrics",
13366
13366
  "GET /api/v1/projects/{name}/seo/domain-intelligence",
13367
13367
  "GET /api/v1/projects/{name}/seo/ranked-keywords",
13368
+ "GET /api/v1/projects/{name}/seo/market-rankings",
13368
13369
  "GET /api/v1/projects/{name}/gbp/local-post-attempt",
13369
13370
  "GET /api/v1/openapi.json",
13370
13371
  "GET /api/v1/screenshots/{snapshotId}",
@@ -21214,7 +21215,7 @@ function uncheckedSourcesLabel(value) {
21214
21215
 
21215
21216
  // ../contracts/src/seo.ts
21216
21217
  import { z as z66 } from "zod";
21217
- var seoCapabilitySchema = z66.enum(["keyword-metrics", "domain-intelligence", "ranked-keywords"]);
21218
+ var seoCapabilitySchema = z66.enum(["keyword-metrics", "domain-intelligence", "ranked-keywords", "market-rankings"]);
21218
21219
  var SeoCapabilities = seoCapabilitySchema.enum;
21219
21220
  var seoProviderSchema = z66.enum(["dataforseo"]);
21220
21221
  var SeoProviders = seoProviderSchema.enum;
@@ -21240,16 +21241,36 @@ var seoScopeSelectionSchema = z66.object({
21240
21241
  key: z66.string().min(1).max(200).optional(),
21241
21242
  expectedPlanRevision: z66.number().int().nonnegative().optional()
21242
21243
  }).strict();
21244
+ var seoDeviceSchema = z66.enum(["desktop", "mobile"]);
21245
+ var SeoDevices = seoDeviceSchema.enum;
21246
+ var seoSearchTextSchema = z66.enum(["query", "query-without-market-region"]);
21247
+ var SeoSearchTexts = seoSearchTextSchema.enum;
21248
+ var seoMarketLocationSchema = z66.object({
21249
+ key: z66.string().trim().min(1).max(200),
21250
+ locationCode: z66.number().int().positive(),
21251
+ /** The provider's name for the location, shown beside results. */
21252
+ label: z66.string().trim().min(1).max(200)
21253
+ }).strict();
21254
+ var SEO_MARKET_RANKING_MAX_SEARCHES = 1e3;
21255
+ var SEO_PROJECT_MARKET_KEY = "project";
21256
+ var seoRankingSettingsSchema = z66.object({
21257
+ locations: z66.array(seoMarketLocationSchema).max(500),
21258
+ /** How many organic results to check per search, in steps of 10. A target past this reads as not ranked. */
21259
+ depth: z66.number().int().min(10).max(100).multipleOf(10),
21260
+ device: seoDeviceSchema,
21261
+ searchText: seoSearchTextSchema
21262
+ }).strict();
21243
21263
  var seoProfileInputSchema = z66.object({
21244
21264
  name: z66.string().trim().min(1).max(120),
21245
21265
  connectionId: z66.string().min(1).max(100),
21246
- capabilities: z66.array(seoCapabilitySchema).min(1).max(3),
21266
+ capabilities: z66.array(seoCapabilitySchema).min(1).max(4),
21247
21267
  targets: z66.array(seoTargetSchema).max(20),
21248
21268
  keywords: z66.array(z66.string().trim().min(1).max(80).regex(/^\S+(?:\s+\S+){0,9}$/, "Use at most 10 words per keyword.")).max(700),
21249
21269
  locationCode: z66.number().int().positive(),
21250
21270
  languageCode: z66.string().min(2).max(10),
21251
21271
  limit: z66.number().int().min(1).max(1e3),
21252
- scope: seoScopeSelectionSchema
21272
+ scope: seoScopeSelectionSchema,
21273
+ rankings: seoRankingSettingsSchema.optional()
21253
21274
  }).strict();
21254
21275
  var seoProfileSchema = seoProfileInputSchema.extend({
21255
21276
  id: z66.string(),
@@ -21311,7 +21332,7 @@ var seoProvenanceSchema = z66.object({
21311
21332
  engine: z66.literal("google"),
21312
21333
  locationCode: z66.number().int().positive(),
21313
21334
  languageCode: z66.string(),
21314
- device: z66.literal("unspecified"),
21335
+ device: z66.union([z66.literal("unspecified"), seoDeviceSchema]),
21315
21336
  collectedAt: z66.string(),
21316
21337
  sourceUpdatedAt: z66.string().nullable()
21317
21338
  }).strict();
@@ -21355,13 +21376,57 @@ var seoRankedKeywordSchema = z66.object({
21355
21376
  serpFeatures: z66.array(z66.string()),
21356
21377
  provenance: seoProvenanceSchema
21357
21378
  }).strict();
21379
+ var seoMarketRankingContextSchema = z66.object({
21380
+ marketKey: z66.string(),
21381
+ marketLabel: z66.string(),
21382
+ /** The market's top-level group (a metro, say), or null when it has none. */
21383
+ regionKey: z66.string().nullable(),
21384
+ regionLabel: z66.string().nullable(),
21385
+ queryId: z66.string().nullable(),
21386
+ queryText: z66.string(),
21387
+ queryClass: queryClassSchema
21388
+ }).strict();
21389
+ var seoMarketRankingSearchStatusSchema = z66.enum(["completed", "partial", "failed", "cancelled"]);
21390
+ var SeoMarketRankingSearchStatuses = seoMarketRankingSearchStatusSchema.enum;
21391
+ var seoMarketRankingSchema = seoMarketRankingContextSchema.extend({
21392
+ /** The exact text searched on Google for `queryText` (see `seoSearchTextSchema`). */
21393
+ searchText: z66.string(),
21394
+ locationLabel: z66.string(),
21395
+ target: seoTargetSchema,
21396
+ searchStatus: seoMarketRankingSearchStatusSchema,
21397
+ rankOrganic: z66.number().int().positive().nullable(),
21398
+ rankAbsolute: z66.number().int().positive().nullable(),
21399
+ url: z66.string().nullable(),
21400
+ /** Organic results the search checked: the requested depth, less when partial, 0 when it failed or never ran. */
21401
+ depth: z66.number().int().nonnegative(),
21402
+ /** Tracked competitors found in the same results, by their best organic position. */
21403
+ competitors: z66.array(z66.object({ domain: z66.string(), rankOrganic: z66.number().int().positive() }).strict()),
21404
+ /** Where the results came from; null when the search returned none. */
21405
+ provenance: seoProvenanceSchema.nullable()
21406
+ }).strict();
21358
21407
  var seoResultsSchema = z66.object({
21359
21408
  keywordMetrics: z66.array(seoKeywordMetricsSchema),
21360
21409
  domainIntelligence: z66.array(seoDomainIntelligenceSchema),
21361
- rankedKeywords: z66.array(seoRankedKeywordSchema)
21410
+ rankedKeywords: z66.array(seoRankedKeywordSchema),
21411
+ marketRankings: z66.array(seoMarketRankingSchema)
21362
21412
  }).strict();
21363
21413
  function emptySeoResults() {
21364
- return { keywordMetrics: [], domainIntelligence: [], rankedKeywords: [] };
21414
+ return { keywordMetrics: [], domainIntelligence: [], rankedKeywords: [], marketRankings: [] };
21415
+ }
21416
+ function marketRegionName(marketLabel) {
21417
+ const comma = marketLabel.lastIndexOf(",");
21418
+ if (comma < 0) return null;
21419
+ const region = marketLabel.slice(comma + 1).trim();
21420
+ return region || null;
21421
+ }
21422
+ function seoSearchTextForQuery(queryText, marketLabel, rule) {
21423
+ const text = queryText.replace(/\s+/g, " ").trim();
21424
+ if (rule === SeoSearchTexts.query || marketLabel === null) return text;
21425
+ const region = marketRegionName(marketLabel.replace(/\s+/g, " "));
21426
+ if (!region) return text;
21427
+ const suffix = `, ${region}`;
21428
+ if (text.length <= suffix.length || text.slice(-suffix.length).toLowerCase() !== suffix.toLowerCase()) return text;
21429
+ return text.slice(0, -suffix.length).trim();
21365
21430
  }
21366
21431
  var seoRunSchema = z66.object({
21367
21432
  id: z66.string(),
@@ -21388,12 +21453,18 @@ var seoTaskSchema = z66.object({
21388
21453
  target: seoTargetSchema.nullable(),
21389
21454
  status: seoRunStatusSchema,
21390
21455
  error: z66.string().nullable(),
21391
- remoteTaskId: z66.string().nullable()
21456
+ remoteTaskId: z66.string().nullable(),
21457
+ /** Market rankings: the text searched on Google and where from, so a failed search can be named. Null for other datasets. */
21458
+ searchText: z66.string().nullable(),
21459
+ locationLabel: z66.string().nullable(),
21460
+ /** A second attempt at a search whose first attempt hit a search-engine error. It replaces that attempt, which is not listed. */
21461
+ retried: z66.boolean()
21392
21462
  }).strict();
21393
21463
  var seoResultCountsSchema = z66.object({
21394
21464
  keywordMetrics: z66.number().int().nonnegative(),
21395
21465
  domainIntelligence: z66.number().int().nonnegative(),
21396
- rankedKeywords: z66.number().int().nonnegative()
21466
+ rankedKeywords: z66.number().int().nonnegative(),
21467
+ marketRankings: z66.number().int().nonnegative()
21397
21468
  }).strict();
21398
21469
  var seoRunDetailSchema = seoRunSchema.extend({
21399
21470
  tasks: z66.array(seoTaskSchema),
@@ -21417,6 +21488,11 @@ var seoPageShape = {
21417
21488
  var seoKeywordMetricsListSchema = z66.object({ ...seoPageShape, items: z66.array(seoKeywordMetricsSchema) }).strict();
21418
21489
  var seoDomainIntelligenceListSchema = z66.object({ ...seoPageShape, items: z66.array(seoDomainIntelligenceSchema) }).strict();
21419
21490
  var seoRankedKeywordListSchema = z66.object({ ...seoPageShape, items: z66.array(seoRankedKeywordSchema) }).strict();
21491
+ var seoMarketRankingQuerySchema = seoEvidenceQuerySchema.extend({
21492
+ marketKey: z66.string().min(1).max(200).optional(),
21493
+ regionKey: z66.string().min(1).max(200).optional()
21494
+ }).strict();
21495
+ var seoMarketRankingListSchema = z66.object({ ...seoPageShape, items: z66.array(seoMarketRankingSchema) }).strict();
21420
21496
  var seoOverviewSchema = z66.object({
21421
21497
  status: seoStatusSchema,
21422
21498
  profiles: z66.array(seoProfileSchema),
@@ -21432,7 +21508,8 @@ var seoOverviewSchema = z66.object({
21432
21508
  }).strict().nullable(),
21433
21509
  keywordMetricsCount: z66.number().int().nonnegative(),
21434
21510
  domainIntelligenceCount: z66.number().int().nonnegative(),
21435
- rankedKeywordCount: z66.number().int().nonnegative()
21511
+ rankedKeywordCount: z66.number().int().nonnegative(),
21512
+ marketRankingCount: z66.number().int().nonnegative()
21436
21513
  }).strict();
21437
21514
  var seoMicrosSchema = z66.number().int().min(0).max(Number.MAX_SAFE_INTEGER);
21438
21515
  var seoOperatorTaskSchema = z66.object({
@@ -21545,6 +21622,10 @@ var scheduleDtoSchema = z68.object({
21545
21622
  updatedAt: z68.string()
21546
21623
  });
21547
21624
  var scheduleExpectedUpdatedAtSchema = z68.string().datetime();
21625
+ function scheduleEnabledAt(previous, enabled, now) {
21626
+ if (!enabled) return null;
21627
+ return previous?.enabled ? previous.enabledAt : now;
21628
+ }
21548
21629
  function nextScheduleUpdatedAt(previous, nowMs = Date.now()) {
21549
21630
  const previousMs = previous === void 0 ? Number.NaN : Date.parse(previous);
21550
21631
  return new Date(Number.isFinite(previousMs) ? Math.max(nowMs, previousMs + 1) : nowMs).toISOString();
@@ -26108,6 +26189,7 @@ export {
26108
26189
  calendarRecurrenceSchema,
26109
26190
  scheduleDtoSchema,
26110
26191
  scheduleExpectedUpdatedAtSchema,
26192
+ scheduleEnabledAt,
26111
26193
  nextScheduleUpdatedAt,
26112
26194
  scheduleUpsertRequestSchema,
26113
26195
  buildRedactedNotificationUrl,
@@ -27292,6 +27374,10 @@ export {
27292
27374
  SeoScopeKinds,
27293
27375
  SeoRunStatuses,
27294
27376
  SeoAvailability,
27377
+ seoDeviceSchema,
27378
+ SEO_MARKET_RANKING_MAX_SEARCHES,
27379
+ SEO_PROJECT_MARKET_KEY,
27380
+ seoRankingSettingsSchema,
27295
27381
  seoProfileInputSchema,
27296
27382
  seoProfileSchema,
27297
27383
  seoProfileListSchema,
@@ -27300,7 +27386,9 @@ export {
27300
27386
  seoRefreshIntentInputSchema,
27301
27387
  seoQuoteSchema,
27302
27388
  seoSyncInputSchema,
27389
+ SeoMarketRankingSearchStatuses,
27303
27390
  emptySeoResults,
27391
+ seoSearchTextForQuery,
27304
27392
  seoRunSchema,
27305
27393
  seoRunDetailSchema,
27306
27394
  seoRunListSchema,
@@ -27308,6 +27396,8 @@ export {
27308
27396
  seoKeywordMetricsListSchema,
27309
27397
  seoDomainIntelligenceListSchema,
27310
27398
  seoRankedKeywordListSchema,
27399
+ seoMarketRankingQuerySchema,
27400
+ seoMarketRankingListSchema,
27311
27401
  seoOverviewSchema,
27312
27402
  seoOperatorTaskSchema,
27313
27403
  seoReconcileInputSchema,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  loadConfig
3
- } from "./chunk-C2PYKUD3.js";
3
+ } from "./chunk-UNCOK6DA.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-DQVJB6CZ.js";
39
+ } from "./chunk-XEGYSZEV.js";
40
40
 
41
41
  // ../api-client-generated/src/generated/core/bodySerializer.gen.ts
42
42
  var jsonBodySerializer = {
@@ -900,6 +900,11 @@ var getApiV1ProjectsByNameSeoRankedKeywords = (options) => (options.client ?? cl
900
900
  url: "/api/v1/projects/{name}/seo/ranked-keywords",
901
901
  ...options
902
902
  });
903
+ var getApiV1ProjectsByNameSeoMarketRankings = (options) => (options.client ?? client).get({
904
+ security: [{ scheme: "bearer", type: "http" }],
905
+ url: "/api/v1/projects/{name}/seo/market-rankings",
906
+ ...options
907
+ });
903
908
  var postApiV1ProjectsByNameSeoRefreshIntents = (options) => (options.client ?? client).post({
904
909
  security: [{ scheme: "bearer", type: "http" }],
905
910
  url: "/api/v1/projects/{name}/seo/refresh-intents",
@@ -6188,6 +6193,13 @@ var ApiClient = class {
6188
6193
  query
6189
6194
  }));
6190
6195
  }
6196
+ async getSeoMarketRankings(project, query) {
6197
+ return this.invoke(() => getApiV1ProjectsByNameSeoMarketRankings({
6198
+ client: this.heyClient,
6199
+ path: { name: project },
6200
+ query
6201
+ }));
6202
+ }
6191
6203
  async getResearchRun(project, runId) {
6192
6204
  return this.invoke(
6193
6205
  () => getApiV1ProjectsByNameResearchRunsByRunId({
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  runWithUsageTags
3
- } from "./chunk-F7NZEUXP.js";
3
+ } from "./chunk-XEPEMON2.js";
4
4
  import {
5
5
  CanonryMcpToolNames,
6
6
  canonryMcpTools
7
- } from "./chunk-BV6NXSAH.js";
7
+ } from "./chunk-37R6GTU7.js";
8
8
  import {
9
9
  CliError
10
10
  } from "./chunk-HGMYEDAQ.js";
11
11
  import {
12
12
  buildOpenApiDocument
13
- } from "./chunk-Z2EENWM3.js";
13
+ } from "./chunk-AVISYPUU.js";
14
14
  import {
15
15
  DEFAULT_COMPETITOR_AUTO_ALIAS_MODE,
16
16
  MeasurementPortfolioLists,
@@ -23,7 +23,7 @@ import {
23
23
  seoDatasetWithoutVendor,
24
24
  seoProviderSchema,
25
25
  truncateUtf16
26
- } from "./chunk-DQVJB6CZ.js";
26
+ } from "./chunk-XEGYSZEV.js";
27
27
 
28
28
  // src/agent/tools.ts
29
29
  import { Type as Type2 } from "@earendil-works/pi-ai";
@@ -28,7 +28,7 @@ import {
28
28
  unknownUsageObservation,
29
29
  usdToMicros,
30
30
  withRetry
31
- } from "./chunk-DQVJB6CZ.js";
31
+ } from "./chunk-XEGYSZEV.js";
32
32
 
33
33
  // ../provider-answer-services/src/core/http.ts
34
34
  var MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
@@ -2,18 +2,18 @@ import {
2
2
  configExists,
3
3
  loadConfigRaw,
4
4
  saveConfigPatch
5
- } from "./chunk-C2PYKUD3.js";
5
+ } from "./chunk-UNCOK6DA.js";
6
6
  import {
7
7
  BUNDLED_SKILL_NAMES,
8
8
  installSkills
9
- } from "./chunk-SL3Y7IOX.js";
9
+ } from "./chunk-MLOGEXIO.js";
10
10
  import {
11
11
  PACKAGE_VERSION
12
12
  } from "./chunk-AOJU5LKX.js";
13
13
  import {
14
14
  SKILL_MANIFEST_FILENAME,
15
15
  SkillsClients
16
- } from "./chunk-DQVJB6CZ.js";
16
+ } from "./chunk-XEGYSZEV.js";
17
17
 
18
18
  // src/skills-autosync.ts
19
19
  import fs from "fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cloudflareQueueNameSchema
3
- } from "./chunk-DQVJB6CZ.js";
3
+ } from "./chunk-XEGYSZEV.js";
4
4
 
5
5
  // src/cloudflare-traffic-config.ts
6
6
  function unsupportedDeliveryMode(deliveryMode) {
@@ -5,7 +5,7 @@ import {
5
5
  loadConfig,
6
6
  loadConfigRaw,
7
7
  saveConfigPatch
8
- } from "./chunk-C2PYKUD3.js";
8
+ } from "./chunk-UNCOK6DA.js";
9
9
  import {
10
10
  CANONRY_NPM_PACKAGE_URL,
11
11
  compareSemver,
@@ -18,7 +18,7 @@ import {
18
18
  updateCheckEnvOptOut,
19
19
  upgradeCaveatFor,
20
20
  upgradeCommandFor
21
- } from "./chunk-DQVJB6CZ.js";
21
+ } from "./chunk-XEGYSZEV.js";
22
22
 
23
23
  // src/runtime-context.ts
24
24
  function cliRuntimeContext(env = process.env, stdio = process) {
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-F7NZEUXP.js";
4
- import "./chunk-C2PYKUD3.js";
3
+ } from "./chunk-XEPEMON2.js";
4
+ import "./chunk-UNCOK6DA.js";
5
5
  import "./chunk-AOJU5LKX.js";
6
6
  import "./chunk-HGMYEDAQ.js";
7
- import "./chunk-DQVJB6CZ.js";
7
+ import "./chunk-XEGYSZEV.js";
8
8
  import "./chunk-MLKGABMK.js";
9
9
 
10
10
  // src/commands/citations.ts
@@ -3,11 +3,11 @@ import {
3
3
  buildCliCatalog,
4
4
  printCliCatalog,
5
5
  renderTopLevelHelp
6
- } from "./chunk-AE6HJZBU.js";
7
- import "./chunk-HO5W6QC7.js";
6
+ } from "./chunk-WZ4LUM26.js";
7
+ import "./chunk-MD5PHJBX.js";
8
8
  import "./chunk-Z7IUAJOF.js";
9
9
  import "./chunk-HGMYEDAQ.js";
10
- import "./chunk-DQVJB6CZ.js";
10
+ import "./chunk-XEGYSZEV.js";
11
11
  import "./chunk-MLKGABMK.js";
12
12
  export {
13
13
  CLI_ROOT_SUMMARIES,
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  REGISTERED_CLI_COMMANDS
3
- } from "./chunk-SRTX6XYR.js";
3
+ } from "./chunk-AFRCTLUL.js";
4
4
  import "./chunk-6GO5VVAC.js";
5
- import "./chunk-66DPEVLJ.js";
5
+ import "./chunk-G6PZEDTH.js";
6
6
  import "./chunk-VJWDBFSL.js";
7
7
  import "./chunk-TSENU4GG.js";
8
- import "./chunk-F7NZEUXP.js";
9
- import "./chunk-C2PYKUD3.js";
10
- import "./chunk-HO5W6QC7.js";
8
+ import "./chunk-XEPEMON2.js";
9
+ import "./chunk-UNCOK6DA.js";
10
+ import "./chunk-MD5PHJBX.js";
11
11
  import "./chunk-Z7IUAJOF.js";
12
- import "./chunk-ZPRJCSSR.js";
12
+ import "./chunk-LU3M54IY.js";
13
13
  import "./chunk-AOJU5LKX.js";
14
14
  import "./chunk-HGMYEDAQ.js";
15
- import "./chunk-DQVJB6CZ.js";
15
+ import "./chunk-XEGYSZEV.js";
16
16
  import "./chunk-MLKGABMK.js";
17
17
  export {
18
18
  REGISTERED_CLI_COMMANDS
package/dist/cli.js CHANGED
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node --import tsx
2
2
  import {
3
3
  REGISTERED_CLI_COMMANDS
4
- } from "./chunk-SRTX6XYR.js";
4
+ } from "./chunk-AFRCTLUL.js";
5
5
  import {
6
6
  buildSetupState,
7
7
  runPendingServeHandoff
8
- } from "./chunk-2UFA3DYM.js";
8
+ } from "./chunk-KJLICF53.js";
9
9
  import "./chunk-6GO5VVAC.js";
10
- import "./chunk-66DPEVLJ.js";
10
+ import "./chunk-G6PZEDTH.js";
11
11
  import "./chunk-VJWDBFSL.js";
12
12
  import "./chunk-TSENU4GG.js";
13
- import "./chunk-IYB3EGSD.js";
13
+ import "./chunk-NHHZQWMI.js";
14
14
  import {
15
15
  checkLatestVersionForCli,
16
16
  cliRuntimeContext,
@@ -24,24 +24,24 @@ import {
24
24
  showFirstRunNotice,
25
25
  trackCliCommandFinished,
26
26
  trackEvent
27
- } from "./chunk-XMKXXWMO.js";
27
+ } from "./chunk-ZGUR4AZM.js";
28
28
  import {
29
29
  autoSyncSkills,
30
30
  formatAutoSyncNotice
31
- } from "./chunk-2Y7RN5HG.js";
32
- import "./chunk-F7NZEUXP.js";
33
- import "./chunk-C2PYKUD3.js";
31
+ } from "./chunk-Y54PMWBH.js";
32
+ import "./chunk-XEPEMON2.js";
33
+ import "./chunk-UNCOK6DA.js";
34
34
  import {
35
35
  accessFilterFromArgs,
36
36
  dispatchRegisteredCommand,
37
37
  printCliCatalog
38
- } from "./chunk-AE6HJZBU.js";
38
+ } from "./chunk-WZ4LUM26.js";
39
39
  import {
40
40
  resolveCliAccess
41
- } from "./chunk-HO5W6QC7.js";
41
+ } from "./chunk-MD5PHJBX.js";
42
42
  import "./chunk-Z7IUAJOF.js";
43
- import "./chunk-SL3Y7IOX.js";
44
- import "./chunk-ZPRJCSSR.js";
43
+ import "./chunk-MLOGEXIO.js";
44
+ import "./chunk-LU3M54IY.js";
45
45
  import "./chunk-AOJU5LKX.js";
46
46
  import {
47
47
  CliError,
@@ -52,7 +52,7 @@ import {
52
52
  } from "./chunk-HGMYEDAQ.js";
53
53
  import {
54
54
  OperationAccesses
55
- } from "./chunk-DQVJB6CZ.js";
55
+ } from "./chunk-XEGYSZEV.js";
56
56
  import "./chunk-MLKGABMK.js";
57
57
 
58
58
  // src/cli.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-F7NZEUXP.js";
4
- import "./chunk-C2PYKUD3.js";
3
+ } from "./chunk-XEPEMON2.js";
4
+ import "./chunk-UNCOK6DA.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -21,7 +21,7 @@ import {
21
21
  normalizeCompetitorDomain,
22
22
  shareOfVoiceLabel,
23
23
  shareOfVoiceReason
24
- } from "./chunk-DQVJB6CZ.js";
24
+ } from "./chunk-XEGYSZEV.js";
25
25
  import "./chunk-MLKGABMK.js";
26
26
 
27
27
  // src/commands/competitor.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-F7NZEUXP.js";
4
- import "./chunk-C2PYKUD3.js";
3
+ } from "./chunk-XEPEMON2.js";
4
+ import "./chunk-UNCOK6DA.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  contentTargetDismissRequestSchema,
16
16
  formatPercent
17
- } from "./chunk-DQVJB6CZ.js";
17
+ } from "./chunk-XEGYSZEV.js";
18
18
  import "./chunk-MLKGABMK.js";
19
19
 
20
20
  // src/commands/content.ts