@canonry/canonry 7.77.1 → 7.78.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 +13 -2
  2. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +4 -2
  3. package/assets/assets/{AgentSetupPage-BZXWC3x6.js → AgentSetupPage-BGdvyQFL.js} +4 -4
  4. package/assets/assets/{AuditHistoryPanel-DcrUuwRu.js → AuditHistoryPanel-Bb5wq-Bk.js} +1 -1
  5. package/assets/assets/{BacklinksPage-BSpHJBiy.js → BacklinksPage-i1cfxTDj.js} +1 -1
  6. package/assets/assets/{HistoryPage-0a0CK9zF.js → HistoryPage-C2NRdNrn.js} +1 -1
  7. package/assets/assets/MeasurementPropertyPage-CwPuJMBy.js +4 -0
  8. package/assets/assets/ProjectPage-Bbnbg7c9.js +11 -0
  9. package/assets/assets/{RunsPage-D0vbz1Ho.js → RunsPage-CJHJ7kHk.js} +1 -1
  10. package/assets/assets/{SettingsPage-DjRm5cmn.js → SettingsPage-r8VrtFyJ.js} +1 -1
  11. package/assets/assets/SiteHealthSection-D1oSuo9O.js +2 -0
  12. package/assets/assets/ToneBadge-CUe-WrzN.js +60 -0
  13. package/assets/assets/{TrafficPage-Z8Z_z0k9.js → TrafficPage-DY2ykwH1.js} +1 -1
  14. package/assets/assets/TrafficSourceDetailPage-D3KHgRvF.js +1 -0
  15. package/assets/assets/{account-context-zaSxLBst.js → account-context-B50QqDEA.js} +1 -1
  16. package/assets/assets/{card-COqALGzB.js → card-BE2fqwVq.js} +1 -1
  17. package/assets/assets/{extract-error-message-DKve0SNr.js → extract-error-message-xuN_xeRJ.js} +1 -1
  18. package/assets/assets/{format-helpers-DKrHlaV7.js → format-helpers-CiC6gALY.js} +1 -1
  19. package/assets/assets/{index-CKZK95pI.css → index-CHHZDc6d.css} +1 -1
  20. package/assets/assets/{index-fzqtwr6m.js → index-Dfm8z5cG.js} +23 -23
  21. package/assets/assets/{query-client-COM9uzxL.js → query-client-C5GhDMY7.js} +1 -1
  22. package/assets/assets/react-query-CmHyfYFq.js +1 -0
  23. package/assets/assets/{react-sigma_core.esm.min-e91U3Myi.js → react-sigma_core.esm.min-Bjdtl0TQ.js} +1 -1
  24. package/assets/assets/{service-BgFTYqJA.js → service-B2i_ZzWP.js} +1 -1
  25. package/assets/index.html +8 -8
  26. package/dist/{ads-M6IAQDG7.js → ads-MIR5MCHL.js} +3 -3
  27. package/dist/{agent-X2T5X5K3.js → agent-IXRL5RBI.js} +7 -7
  28. package/dist/{agent-ask-55LQH4TI.js → agent-ask-K42H6H2T.js} +3 -3
  29. package/dist/{agent-conversations-O6WC2NPV.js → agent-conversations-2T3W4DHO.js} +3 -3
  30. package/dist/{agent-memory-6DWFMB4I.js → agent-memory-LJBNSTSP.js} +3 -3
  31. package/dist/{agent-providers-Q4YDVQX3.js → agent-providers-QR4LY3AP.js} +3 -3
  32. package/dist/{agent-transcript-SJKCP2AO.js → agent-transcript-JIHJWHV6.js} +3 -3
  33. package/dist/{analytics-4JOQMWH7.js → analytics-JRV7DBBU.js} +3 -3
  34. package/dist/{apply-EAKKKIZD.js → apply-ZFWDSAV4.js} +3 -3
  35. package/dist/{backfill-PASKIVGP.js → backfill-LU2AQIPY.js} +9 -9
  36. package/dist/{backlinks-TICPC323.js → backlinks-NAC2373F.js} +3 -3
  37. package/dist/{bing-MC7TSL4E.js → bing-L3LDBJOC.js} +3 -3
  38. package/dist/{bootstrap-X2BW64W7.js → bootstrap-I6DA4KWB.js} +10 -10
  39. package/dist/{cdp-TCJKITCR.js → cdp-4F74XLTH.js} +7 -7
  40. package/dist/{chunk-CCNPBUQ5.js → chunk-367K6XVX.js} +2 -2
  41. package/dist/{chunk-JPOIDGGF.js → chunk-3MGM3U6V.js} +1 -1
  42. package/dist/{chunk-2BDWXHYF.js → chunk-45RGH7XI.js} +3 -3
  43. package/dist/{chunk-RPJJOBKN.js → chunk-6ACWXQNZ.js} +3 -1
  44. package/dist/{chunk-B7JHQ3FW.js → chunk-6P6YBNKN.js} +7 -7
  45. package/dist/{chunk-YMOQSEO3.js → chunk-6PRFVLIK.js} +15 -4
  46. package/dist/{chunk-D5XPB7MM.js → chunk-6VBLPCCX.js} +1 -1
  47. package/dist/{chunk-5QR7D4RQ.js → chunk-7HB6QLX4.js} +1 -1
  48. package/dist/{chunk-7UVCZZQJ.js → chunk-AI44ZCMK.js} +1 -1
  49. package/dist/{chunk-X7UC755Q.js → chunk-C5WSQXP5.js} +26 -2
  50. package/dist/{chunk-CQMNWC5K.js → chunk-EFMZSYRD.js} +160 -26
  51. package/dist/{chunk-FXIZBJZ4.js → chunk-EHXNYXAS.js} +3 -3
  52. package/dist/{chunk-2WBT6TEJ.js → chunk-FCYGY4FT.js} +1 -1
  53. package/dist/{chunk-XYYWKCJQ.js → chunk-JERATA5R.js} +1 -1
  54. package/dist/{chunk-P3BWUKJL.js → chunk-JEUL5QZP.js} +4 -4
  55. package/dist/{chunk-PSNTEGNY.js → chunk-KZB6HLFT.js} +1 -1
  56. package/dist/{chunk-UGNNR7EO.js → chunk-L2KMR7CM.js} +2 -2
  57. package/dist/{chunk-H4ANN32B.js → chunk-L6F2HOQH.js} +8 -8
  58. package/dist/{chunk-GDKMVOZI.js → chunk-M3BUP6XD.js} +104 -13
  59. package/dist/{chunk-4QHTXT4A.js → chunk-MUYTDD35.js} +40 -4
  60. package/dist/{chunk-TESDUMVK.js → chunk-O4WBYEGV.js} +1 -1
  61. package/dist/{chunk-FCGYYZHL.js → chunk-PM2DB3HE.js} +164 -10
  62. package/dist/{chunk-TRW4XLQK.js → chunk-QXSOXDUR.js} +2 -2
  63. package/dist/{chunk-2SCPPWRW.js → chunk-RSVANBNW.js} +4 -4
  64. package/dist/{chunk-UB65XBH2.js → chunk-SAHH2FXO.js} +3 -3
  65. package/dist/{chunk-46KV7CZU.js → chunk-SOQVI7EZ.js} +2 -2
  66. package/dist/{chunk-Z2FY6AGZ.js → chunk-TZRYVW75.js} +2 -2
  67. package/dist/{chunk-C3UFOS7J.js → chunk-UH44UCRM.js} +2 -2
  68. package/dist/{chunk-TJYS2XCI.js → chunk-UQOC5ZQE.js} +4 -4
  69. package/dist/{chunk-2BRVGCVU.js → chunk-VLOCDWCS.js} +7 -1
  70. package/dist/{chunk-6EZQHF67.js → chunk-WCFANFR2.js} +371 -340
  71. package/dist/{chunk-ZXYCPRNY.js → chunk-WSWHLKKJ.js} +1 -1
  72. package/dist/{chunk-NDTU7FGL.js → chunk-WVCDUKJ2.js} +1 -1
  73. package/dist/{chunk-JZT3ZRD3.js → chunk-WXIL2EFM.js} +4 -4
  74. package/dist/{chunk-JSCO223C.js → chunk-ZHFE6J3A.js} +1 -1
  75. package/dist/{chunk-HD2VVIPD.js → chunk-ZUC7CJVD.js} +5 -5
  76. package/dist/{citations-IA3OCV53.js → citations-2XELMCCV.js} +3 -3
  77. package/dist/{cli-catalog-ZVFLJXID.js → cli-catalog-KC6JYHSW.js} +3 -3
  78. package/dist/{cli-commands-O7BYY3W5.js → cli-commands-WCOAB6XU.js} +7 -7
  79. package/dist/cli.js +13 -13
  80. package/dist/{competitor-4FVAZAQZ.js → competitor-IK4GYTZO.js} +3 -3
  81. package/dist/{content-OVBF6U7Z.js → content-SMQPJXPC.js} +3 -3
  82. package/dist/{dashboard-UGZSSIWK.js → dashboard-EE24ROVG.js} +6 -6
  83. package/dist/{demo-5CU3JDHC.js → demo-7XH2N65A.js} +1 -1
  84. package/dist/{demo-server-43QV3UKM.js → demo-server-CVB65UYW.js} +12 -12
  85. package/dist/{discover-R5BYAPOU.js → discover-3KHUCVE7.js} +3 -3
  86. package/dist/{discover-eval-3FA4BR2L.js → discover-eval-DOEP4ZQ7.js} +3 -3
  87. package/dist/{doctor-2Q5LVV2P.js → doctor-3T6RKSE7.js} +3 -3
  88. package/dist/{evidence-LMGRT5IO.js → evidence-4NFL5KM3.js} +3 -3
  89. package/dist/{export-cmd-LBLZ273Z.js → export-cmd-BQC6XLJ7.js} +3 -3
  90. package/dist/{ga-PBIWRU67.js → ga-HBRA4UUK.js} +3 -3
  91. package/dist/{gbp-NYG7SW6P.js → gbp-2WMBTDJV.js} +3 -3
  92. package/dist/{google-57XEYVOU.js → google-JFUE4BNJ.js} +4 -4
  93. package/dist/{google-marketing-XPE6CVQI.js → google-marketing-5ROIKBC7.js} +1 -1
  94. package/dist/{health-cmd-SJVYQZQL.js → health-cmd-7BMVCCG2.js} +3 -3
  95. package/dist/{history-5XYZNWGP.js → history-QA4ZXCVH.js} +3 -3
  96. package/dist/index.d.ts +216 -23
  97. package/dist/index.js +26 -26
  98. package/dist/{init-KXR6PJEQ.js → init-O4G2MDMC.js} +12 -12
  99. package/dist/{insights-L7OOH34I.js → insights-K4UX2PSI.js} +3 -3
  100. package/dist/intelligence-service-D7DS4UKT.js +16 -0
  101. package/dist/{journeys-VXBGDFBO.js → journeys-UWEWJXGT.js} +3 -3
  102. package/dist/{keys-YMB5HAAG.js → keys-CL5YYE7Q.js} +3 -3
  103. package/dist/{keyword-RZEMKH3K.js → keyword-IFCC5IZT.js} +3 -3
  104. package/dist/{logs-ONZWSYXS.js → logs-2A3HBUBK.js} +3 -3
  105. package/dist/{mcp-KK6EFHAZ.js → mcp-B6L7PKZ4.js} +4 -4
  106. package/dist/mcp.js +10 -10
  107. package/dist/{measurement-plan-LE7INWW6.js → measurement-plan-GYSO6CXX.js} +5 -5
  108. package/dist/{notify-T6T5LYRR.js → notify-XM23I2B3.js} +3 -3
  109. package/dist/{organic-evidence-P2GZ766W.js → organic-evidence-U7HZMXKP.js} +3 -3
  110. package/dist/{overview-P2AILIWJ.js → overview-TSAK5DQP.js} +4 -4
  111. package/dist/{project-7MHQSOJD.js → project-L7DLDEPI.js} +3 -3
  112. package/dist/{query-EUDMU6L7.js → query-FM5HDHO4.js} +3 -3
  113. package/dist/{research-4DASCVGY.js → research-7G5JU44N.js} +3 -3
  114. package/dist/{results-export-GKXHX55L.js → results-export-JJDGG6ZP.js} +3 -3
  115. package/dist/{run-6LJGMJ5S.js → run-ZVIQVG23.js} +4 -4
  116. package/dist/{schedule-D74P2BO5.js → schedule-TV7LWSYI.js} +3 -3
  117. package/dist/{search-W7AOYWRM.js → search-7KRZLZ6S.js} +3 -3
  118. package/dist/{serve-UNVCQSRC.js → serve-WSOG525W.js} +27 -27
  119. package/dist/{session-6NGNVCKP.js → session-OUGQSGVV.js} +14 -14
  120. package/dist/{settings-LGD64PFE.js → settings-AOXQJOHN.js} +3 -3
  121. package/dist/{skills-CYHWYN42.js → skills-DWXA55QA.js} +2 -2
  122. package/dist/{snapshot-PDYGSZZH.js → snapshot-B44CXKFU.js} +3 -3
  123. package/dist/{src-SXB3MOP3.js → src-IBGSUYEG.js} +2 -2
  124. package/dist/{status-UZ4SE7ZP.js → status-RNBSFZ6Q.js} +4 -4
  125. package/dist/{technical-aeo-BNH7NV44.js → technical-aeo-UAOKK5QH.js} +3 -3
  126. package/dist/{telemetry-UWDS7QNJ.js → telemetry-55PUOMA7.js} +4 -4
  127. package/dist/{tools-EDPBQCI2.js → tools-HRGP4FXN.js} +11 -11
  128. package/dist/{traffic-NI6ACQO4.js → traffic-M4OHG5JW.js} +5 -5
  129. package/dist/{users-XTZ65NLC.js → users-GU7MULRM.js} +3 -3
  130. package/dist/{visibility-stats-EPF6MHYQ.js → visibility-stats-4IDTDXDC.js} +3 -3
  131. package/dist/{wordpress-ZACJ3H5M.js → wordpress-CYXB4R5Y.js} +3 -3
  132. package/package.json +1 -1
  133. package/assets/assets/MeasurementPropertyPage-DbfTFN3F.js +0 -4
  134. package/assets/assets/ProjectPage-D0m-Xpp3.js +0 -9
  135. package/assets/assets/SiteHealthSection-BCdPVFEJ.js +0 -2
  136. package/assets/assets/ToneBadge-DSJSzqI6.js +0 -60
  137. package/assets/assets/TrafficSourceDetailPage-DJyDO527.js +0 -1
  138. package/assets/assets/react-query-BVRWpXWq.js +0 -1
  139. package/dist/intelligence-service-NXZYQJBH.js +0 -16
package/dist/index.d.ts CHANGED
@@ -1297,6 +1297,8 @@ declare const seoCapabilitySchema: z.ZodEnum<{
1297
1297
  "domain-intelligence": "domain-intelligence";
1298
1298
  "ranked-keywords": "ranked-keywords";
1299
1299
  "market-rankings": "market-rankings";
1300
+ "competitor-discovery": "competitor-discovery";
1301
+ "keyword-gaps": "keyword-gaps";
1300
1302
  }>;
1301
1303
  type SeoCapability = z.infer<typeof seoCapabilitySchema>;
1302
1304
  declare const seoTargetSchema: z.ZodObject<{
@@ -1314,6 +1316,92 @@ declare const seoDeviceSchema: z.ZodEnum<{
1314
1316
  mobile: "mobile";
1315
1317
  }>;
1316
1318
  type SeoDevice = z.infer<typeof seoDeviceSchema>;
1319
+ /** A competing domain observed in the provider's organic search database for this target and locale. */
1320
+ declare const seoCompetitorSchema: z.ZodObject<{
1321
+ target: z.ZodObject<{
1322
+ kind: z.ZodEnum<{
1323
+ domain: "domain";
1324
+ host: "host";
1325
+ }>;
1326
+ value: z.ZodString;
1327
+ includeSubdomains: z.ZodBoolean;
1328
+ }, z.core.$strict>;
1329
+ domain: z.ZodString;
1330
+ sharedKeywords: z.ZodNullable<z.ZodNumber>;
1331
+ averagePosition: z.ZodNullable<z.ZodNumber>;
1332
+ organicKeywords: z.ZodNullable<z.ZodNumber>;
1333
+ estimatedOrganicTraffic: z.ZodNullable<z.ZodNumber>;
1334
+ provenance: z.ZodObject<{
1335
+ provider: z.ZodEnum<{
1336
+ dataforseo: "dataforseo";
1337
+ }>;
1338
+ dataset: z.ZodString;
1339
+ engine: z.ZodLiteral<"google">;
1340
+ locationCode: z.ZodNumber;
1341
+ languageCode: z.ZodString;
1342
+ device: z.ZodUnion<readonly [z.ZodLiteral<"unspecified">, z.ZodEnum<{
1343
+ desktop: "desktop";
1344
+ mobile: "mobile";
1345
+ }>]>;
1346
+ collectedAt: z.ZodString;
1347
+ sourceUpdatedAt: z.ZodNullable<z.ZodString>;
1348
+ }, z.core.$strict>;
1349
+ }, z.core.$strict>;
1350
+ type SeoCompetitor = z.infer<typeof seoCompetitorSchema>;
1351
+ declare const seoKeywordGapModeSchema: z.ZodEnum<{
1352
+ shared: "shared";
1353
+ missing: "missing";
1354
+ }>;
1355
+ type SeoKeywordGapMode = z.infer<typeof seoKeywordGapModeSchema>;
1356
+ /** Missing means absent from the provider's database result for this pair, never a fresh Google rank check. */
1357
+ declare const seoKeywordGapSchema: z.ZodObject<{
1358
+ target: z.ZodObject<{
1359
+ kind: z.ZodEnum<{
1360
+ domain: "domain";
1361
+ host: "host";
1362
+ }>;
1363
+ value: z.ZodString;
1364
+ includeSubdomains: z.ZodBoolean;
1365
+ }, z.core.$strict>;
1366
+ competitor: z.ZodObject<{
1367
+ kind: z.ZodEnum<{
1368
+ domain: "domain";
1369
+ host: "host";
1370
+ }>;
1371
+ value: z.ZodString;
1372
+ includeSubdomains: z.ZodBoolean;
1373
+ }, z.core.$strict>;
1374
+ keyword: z.ZodString;
1375
+ targetRankOrganic: z.ZodNullable<z.ZodNumber>;
1376
+ competitorRankOrganic: z.ZodNumber;
1377
+ targetUrl: z.ZodNullable<z.ZodString>;
1378
+ competitorUrl: z.ZodNullable<z.ZodString>;
1379
+ searchVolume: z.ZodNullable<z.ZodNumber>;
1380
+ keywordDifficulty: z.ZodNullable<z.ZodNumber>;
1381
+ cpcUsd: z.ZodNullable<z.ZodNumber>;
1382
+ kind: z.ZodEnum<{
1383
+ shared: "shared";
1384
+ missing: "missing";
1385
+ outranked: "outranked";
1386
+ }>;
1387
+ rankGap: z.ZodNullable<z.ZodNumber>;
1388
+ provenance: z.ZodObject<{
1389
+ provider: z.ZodEnum<{
1390
+ dataforseo: "dataforseo";
1391
+ }>;
1392
+ dataset: z.ZodString;
1393
+ engine: z.ZodLiteral<"google">;
1394
+ locationCode: z.ZodNumber;
1395
+ languageCode: z.ZodString;
1396
+ device: z.ZodUnion<readonly [z.ZodLiteral<"unspecified">, z.ZodEnum<{
1397
+ desktop: "desktop";
1398
+ mobile: "mobile";
1399
+ }>]>;
1400
+ collectedAt: z.ZodString;
1401
+ sourceUpdatedAt: z.ZodNullable<z.ZodString>;
1402
+ }, z.core.$strict>;
1403
+ }, z.core.$strict>;
1404
+ type SeoKeywordGap = z.infer<typeof seoKeywordGapSchema>;
1317
1405
  /** The market and tracked query one market-rankings search answers. */
1318
1406
  declare const seoMarketRankingContextSchema: z.ZodObject<{
1319
1407
  marketKey: z.ZodString;
@@ -1533,13 +1621,92 @@ declare const seoResultsSchema: z.ZodObject<{
1533
1621
  sourceUpdatedAt: z.ZodNullable<z.ZodString>;
1534
1622
  }, z.core.$strict>>;
1535
1623
  }, z.core.$strict>>;
1624
+ competitors: z.ZodArray<z.ZodObject<{
1625
+ target: z.ZodObject<{
1626
+ kind: z.ZodEnum<{
1627
+ domain: "domain";
1628
+ host: "host";
1629
+ }>;
1630
+ value: z.ZodString;
1631
+ includeSubdomains: z.ZodBoolean;
1632
+ }, z.core.$strict>;
1633
+ domain: z.ZodString;
1634
+ sharedKeywords: z.ZodNullable<z.ZodNumber>;
1635
+ averagePosition: z.ZodNullable<z.ZodNumber>;
1636
+ organicKeywords: z.ZodNullable<z.ZodNumber>;
1637
+ estimatedOrganicTraffic: z.ZodNullable<z.ZodNumber>;
1638
+ provenance: z.ZodObject<{
1639
+ provider: z.ZodEnum<{
1640
+ dataforseo: "dataforseo";
1641
+ }>;
1642
+ dataset: z.ZodString;
1643
+ engine: z.ZodLiteral<"google">;
1644
+ locationCode: z.ZodNumber;
1645
+ languageCode: z.ZodString;
1646
+ device: z.ZodUnion<readonly [z.ZodLiteral<"unspecified">, z.ZodEnum<{
1647
+ desktop: "desktop";
1648
+ mobile: "mobile";
1649
+ }>]>;
1650
+ collectedAt: z.ZodString;
1651
+ sourceUpdatedAt: z.ZodNullable<z.ZodString>;
1652
+ }, z.core.$strict>;
1653
+ }, z.core.$strict>>;
1654
+ keywordGaps: z.ZodArray<z.ZodObject<{
1655
+ target: z.ZodObject<{
1656
+ kind: z.ZodEnum<{
1657
+ domain: "domain";
1658
+ host: "host";
1659
+ }>;
1660
+ value: z.ZodString;
1661
+ includeSubdomains: z.ZodBoolean;
1662
+ }, z.core.$strict>;
1663
+ competitor: z.ZodObject<{
1664
+ kind: z.ZodEnum<{
1665
+ domain: "domain";
1666
+ host: "host";
1667
+ }>;
1668
+ value: z.ZodString;
1669
+ includeSubdomains: z.ZodBoolean;
1670
+ }, z.core.$strict>;
1671
+ keyword: z.ZodString;
1672
+ targetRankOrganic: z.ZodNullable<z.ZodNumber>;
1673
+ competitorRankOrganic: z.ZodNumber;
1674
+ targetUrl: z.ZodNullable<z.ZodString>;
1675
+ competitorUrl: z.ZodNullable<z.ZodString>;
1676
+ searchVolume: z.ZodNullable<z.ZodNumber>;
1677
+ keywordDifficulty: z.ZodNullable<z.ZodNumber>;
1678
+ cpcUsd: z.ZodNullable<z.ZodNumber>;
1679
+ kind: z.ZodEnum<{
1680
+ shared: "shared";
1681
+ missing: "missing";
1682
+ outranked: "outranked";
1683
+ }>;
1684
+ rankGap: z.ZodNullable<z.ZodNumber>;
1685
+ provenance: z.ZodObject<{
1686
+ provider: z.ZodEnum<{
1687
+ dataforseo: "dataforseo";
1688
+ }>;
1689
+ dataset: z.ZodString;
1690
+ engine: z.ZodLiteral<"google">;
1691
+ locationCode: z.ZodNumber;
1692
+ languageCode: z.ZodString;
1693
+ device: z.ZodUnion<readonly [z.ZodLiteral<"unspecified">, z.ZodEnum<{
1694
+ desktop: "desktop";
1695
+ mobile: "mobile";
1696
+ }>]>;
1697
+ collectedAt: z.ZodString;
1698
+ sourceUpdatedAt: z.ZodNullable<z.ZodString>;
1699
+ }, z.core.$strict>;
1700
+ }, z.core.$strict>>;
1536
1701
  }, z.core.$strict>;
1537
1702
  type SeoResults = z.infer<typeof seoResultsSchema>;
1538
1703
  /** A market-rankings row as stored: rows saved before `searchStatus` existed are completed searches without it. */
1539
1704
  type StoredSeoMarketRanking = Omit<SeoMarketRanking, 'searchStatus'> & Partial<Pick<SeoMarketRanking, 'searchStatus'>>;
1540
- /** SEO results as a task stores them: tasks saved before market rankings existed have no `marketRankings`. */
1541
- type StoredSeoResults = Omit<SeoResults, 'marketRankings'> & {
1705
+ /** Stored tasks can predate market rankings, competitor discovery, or keyword-gap datasets. */
1706
+ type StoredSeoResults = Omit<SeoResults, 'marketRankings' | 'competitors' | 'keywordGaps'> & {
1542
1707
  marketRankings?: StoredSeoMarketRanking[];
1708
+ competitors?: SeoCompetitor[];
1709
+ keywordGaps?: SeoKeywordGap[];
1543
1710
  };
1544
1711
  /** One market and tracked query a market-rankings search answers, with the competitors its row reports. */
1545
1712
  interface SeoMarketRankingSearchMarket {
@@ -1569,6 +1736,11 @@ interface SeoAdapterRequest {
1569
1736
  tag: string;
1570
1737
  /** Market rankings only: `keywords` holds the one search text, searched at `locationCode`. */
1571
1738
  search?: SeoMarketRankingSearch;
1739
+ /** Keyword gaps only: one frozen target/competitor comparison and one disjoint database population. */
1740
+ comparison?: {
1741
+ competitor: SeoTarget;
1742
+ mode: SeoKeywordGapMode;
1743
+ };
1572
1744
  }
1573
1745
  interface SeoAdapterReceipt {
1574
1746
  remoteTaskId: string | null;
@@ -1648,7 +1820,7 @@ declare const seoProfiles: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1648
1820
  data: {
1649
1821
  name: string;
1650
1822
  connectionId: string;
1651
- capabilities: ("keyword-metrics" | "domain-intelligence" | "ranked-keywords" | "market-rankings")[];
1823
+ capabilities: ("keyword-metrics" | "domain-intelligence" | "ranked-keywords" | "market-rankings" | "competitor-discovery" | "keyword-gaps")[];
1652
1824
  targets: {
1653
1825
  kind: "domain" | "host";
1654
1826
  value: string;
@@ -1663,6 +1835,11 @@ declare const seoProfiles: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1663
1835
  key?: string | undefined;
1664
1836
  expectedPlanRevision?: number | undefined;
1665
1837
  };
1838
+ competitors?: {
1839
+ kind: "domain" | "host";
1840
+ value: string;
1841
+ includeSubdomains: boolean;
1842
+ }[] | undefined;
1666
1843
  rankings?: {
1667
1844
  locations: {
1668
1845
  key: string;
@@ -1688,7 +1865,7 @@ declare const seoProfiles: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1688
1865
  $type: {
1689
1866
  name: string;
1690
1867
  connectionId: string;
1691
- capabilities: ("keyword-metrics" | "domain-intelligence" | "ranked-keywords" | "market-rankings")[];
1868
+ capabilities: ("keyword-metrics" | "domain-intelligence" | "ranked-keywords" | "market-rankings" | "competitor-discovery" | "keyword-gaps")[];
1692
1869
  targets: {
1693
1870
  kind: "domain" | "host";
1694
1871
  value: string;
@@ -1703,6 +1880,11 @@ declare const seoProfiles: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1703
1880
  key?: string | undefined;
1704
1881
  expectedPlanRevision?: number | undefined;
1705
1882
  };
1883
+ competitors?: {
1884
+ kind: "domain" | "host";
1885
+ value: string;
1886
+ includeSubdomains: boolean;
1887
+ }[] | undefined;
1706
1888
  rankings?: {
1707
1889
  locations: {
1708
1890
  key: string;
@@ -1880,7 +2062,7 @@ declare const seoJobs: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1880
2062
  data: {
1881
2063
  name: string;
1882
2064
  connectionId: string;
1883
- capabilities: ("keyword-metrics" | "domain-intelligence" | "ranked-keywords" | "market-rankings")[];
2065
+ capabilities: ("keyword-metrics" | "domain-intelligence" | "ranked-keywords" | "market-rankings" | "competitor-discovery" | "keyword-gaps")[];
1884
2066
  targets: {
1885
2067
  kind: "domain" | "host";
1886
2068
  value: string;
@@ -1895,6 +2077,11 @@ declare const seoJobs: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1895
2077
  key?: string | undefined;
1896
2078
  expectedPlanRevision?: number | undefined;
1897
2079
  };
2080
+ competitors?: {
2081
+ kind: "domain" | "host";
2082
+ value: string;
2083
+ includeSubdomains: boolean;
2084
+ }[] | undefined;
1898
2085
  rankings?: {
1899
2086
  locations: {
1900
2087
  key: string;
@@ -1920,7 +2107,7 @@ declare const seoJobs: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1920
2107
  $type: {
1921
2108
  name: string;
1922
2109
  connectionId: string;
1923
- capabilities: ("keyword-metrics" | "domain-intelligence" | "ranked-keywords" | "market-rankings")[];
2110
+ capabilities: ("keyword-metrics" | "domain-intelligence" | "ranked-keywords" | "market-rankings" | "competitor-discovery" | "keyword-gaps")[];
1924
2111
  targets: {
1925
2112
  kind: "domain" | "host";
1926
2113
  value: string;
@@ -1935,6 +2122,11 @@ declare const seoJobs: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
1935
2122
  key?: string | undefined;
1936
2123
  expectedPlanRevision?: number | undefined;
1937
2124
  };
2125
+ competitors?: {
2126
+ kind: "domain" | "host";
2127
+ value: string;
2128
+ includeSubdomains: boolean;
2129
+ }[] | undefined;
1938
2130
  rankings?: {
1939
2131
  locations: {
1940
2132
  key: string;
@@ -9161,7 +9353,7 @@ declare const oauthTokens: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
9161
9353
  tableName: "oauth_tokens";
9162
9354
  dataType: "string";
9163
9355
  columnType: "SQLiteText";
9164
- data: "access" | "refresh";
9356
+ data: "refresh" | "access";
9165
9357
  driverParam: string;
9166
9358
  notNull: true;
9167
9359
  hasDefault: false;
@@ -9174,7 +9366,7 @@ declare const oauthTokens: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
9174
9366
  generated: undefined;
9175
9367
  }, {}, {
9176
9368
  length: number | undefined;
9177
- $type: "access" | "refresh";
9369
+ $type: "refresh" | "access";
9178
9370
  }>;
9179
9371
  grantId: drizzle_orm_sqlite_core.SQLiteColumn<{
9180
9372
  name: "grant_id";
@@ -17679,7 +17871,7 @@ declare const gaLeadEventsDaily: drizzle_orm_sqlite_core.SQLiteTableWithColumns<
17679
17871
  tableName: "ga_lead_events_daily";
17680
17872
  dataType: "string";
17681
17873
  columnType: "SQLiteText";
17682
- data: "landing-page" | "channel";
17874
+ data: "channel" | "landing-page";
17683
17875
  driverParam: string;
17684
17876
  notNull: true;
17685
17877
  hasDefault: false;
@@ -17692,7 +17884,7 @@ declare const gaLeadEventsDaily: drizzle_orm_sqlite_core.SQLiteTableWithColumns<
17692
17884
  generated: undefined;
17693
17885
  }, {}, {
17694
17886
  length: number | undefined;
17695
- $type: "landing-page" | "channel";
17887
+ $type: "channel" | "landing-page";
17696
17888
  }>;
17697
17889
  eventCount: drizzle_orm_sqlite_core.SQLiteColumn<{
17698
17890
  name: "event_count";
@@ -17915,7 +18107,7 @@ declare const gaMeasurementSyncStates: drizzle_orm_sqlite_core.SQLiteTableWithCo
17915
18107
  tableName: "ga_measurement_sync_state";
17916
18108
  dataType: "string";
17917
18109
  columnType: "SQLiteText";
17918
- data: "landing-page" | "channel";
18110
+ data: "channel" | "landing-page";
17919
18111
  driverParam: string;
17920
18112
  notNull: false;
17921
18113
  hasDefault: false;
@@ -17928,7 +18120,7 @@ declare const gaMeasurementSyncStates: drizzle_orm_sqlite_core.SQLiteTableWithCo
17928
18120
  generated: undefined;
17929
18121
  }, {}, {
17930
18122
  length: number | undefined;
17931
- $type: "landing-page" | "channel";
18123
+ $type: "channel" | "landing-page";
17932
18124
  }>;
17933
18125
  leadEventNames: drizzle_orm_sqlite_core.SQLiteColumn<{
17934
18126
  name: "lead_event_names";
@@ -29595,7 +29787,7 @@ declare const gbpReviews: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
29595
29787
  tableName: "gbp_reviews";
29596
29788
  dataType: "string";
29597
29789
  columnType: "SQLiteText";
29598
- data: "none" | "baseline" | "stale" | "skipped" | "pending" | "sent" | "suppressed";
29790
+ data: "none" | "baseline" | "stale" | "pending" | "sent" | "skipped" | "suppressed";
29599
29791
  driverParam: string;
29600
29792
  notNull: true;
29601
29793
  hasDefault: true;
@@ -29608,7 +29800,7 @@ declare const gbpReviews: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
29608
29800
  generated: undefined;
29609
29801
  }, {}, {
29610
29802
  length: number | undefined;
29611
- $type: "none" | "baseline" | "stale" | "skipped" | "pending" | "sent" | "suppressed";
29803
+ $type: "none" | "baseline" | "stale" | "pending" | "sent" | "skipped" | "suppressed";
29612
29804
  }>;
29613
29805
  alertStateAt: drizzle_orm_sqlite_core.SQLiteColumn<{
29614
29806
  name: "alert_state_at";
@@ -29905,7 +30097,7 @@ declare const gbpReviewRatings: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
29905
30097
  tableName: "gbp_review_ratings";
29906
30098
  dataType: "string";
29907
30099
  columnType: "SQLiteText";
29908
- data: "none" | "baseline" | "stale" | "skipped" | "pending" | "sent" | "suppressed";
30100
+ data: "none" | "baseline" | "stale" | "pending" | "sent" | "skipped" | "suppressed";
29909
30101
  driverParam: string;
29910
30102
  notNull: true;
29911
30103
  hasDefault: true;
@@ -29918,7 +30110,7 @@ declare const gbpReviewRatings: drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
29918
30110
  generated: undefined;
29919
30111
  }, {}, {
29920
30112
  length: number | undefined;
29921
- $type: "none" | "baseline" | "stale" | "skipped" | "pending" | "sent" | "suppressed";
30113
+ $type: "none" | "baseline" | "stale" | "pending" | "sent" | "skipped" | "suppressed";
29922
30114
  }>;
29923
30115
  alertStateAt: drizzle_orm_sqlite_core.SQLiteColumn<{
29924
30116
  name: "alert_state_at";
@@ -37967,13 +38159,14 @@ declare function loadConfig(configPath?: string): CanonryConfig;
37967
38159
  declare function createServer(opts: {
37968
38160
  config: CanonryConfig;
37969
38161
  /**
37970
- * The config.yaml `config` was loaded from; `canonry serve` passes the file
37971
- * `loadConfig()` read. Config changes the server makes (credentials,
37972
- * settings, the first-run dashboard password, refreshed tokens) are written
37973
- * there, and provider reloads read it. Leave it unset for a config built in
37974
- * memory: the server then keeps those changes in memory and never writes a
37975
- * config file, so a test or development server cannot overwrite the
37976
- * operator's config.yaml.
38162
+ * The config.yaml `config` was loaded from. Defaults to the file
38163
+ * `loadConfig()` read it from, so `createServer({ config: loadConfig() })`
38164
+ * keeps saving there; `canonry serve` also passes it explicitly. Config
38165
+ * changes the server makes (credentials, settings, the first-run dashboard
38166
+ * password, refreshed tokens) are written there, and provider reloads read
38167
+ * it. A config built in memory has no file: the server keeps those changes
38168
+ * in memory and never writes a config file, so a test or development server
38169
+ * cannot overwrite the operator's config.yaml.
37977
38170
  */
37978
38171
  configPath?: string;
37979
38172
  db: DatabaseClient;
package/dist/index.js CHANGED
@@ -3,39 +3,39 @@ import {
3
3
  createGoogleMarketingCredentialStore,
4
4
  createGoogleMarketingRuntime,
5
5
  createServer
6
- } from "./chunk-CQMNWC5K.js";
7
- import "./chunk-ZXYCPRNY.js";
8
- import "./chunk-B7JHQ3FW.js";
9
- import "./chunk-JZT3ZRD3.js";
6
+ } from "./chunk-EFMZSYRD.js";
7
+ import "./chunk-WSWHLKKJ.js";
8
+ import "./chunk-6P6YBNKN.js";
9
+ import "./chunk-WXIL2EFM.js";
10
10
  import "./chunk-ELCLGWUT.js";
11
11
  import "./chunk-XEBKF4N5.js";
12
- import "./chunk-PSNTEGNY.js";
13
- import "./chunk-C3UFOS7J.js";
14
- import "./chunk-TJYS2XCI.js";
12
+ import "./chunk-KZB6HLFT.js";
13
+ import "./chunk-UH44UCRM.js";
14
+ import "./chunk-UQOC5ZQE.js";
15
15
  import "./chunk-TSENU4GG.js";
16
- import "./chunk-2WBT6TEJ.js";
17
- import "./chunk-YMOQSEO3.js";
18
- import "./chunk-2SCPPWRW.js";
19
- import "./chunk-NDTU7FGL.js";
20
- import "./chunk-X7UC755Q.js";
16
+ import "./chunk-FCYGY4FT.js";
17
+ import "./chunk-6PRFVLIK.js";
18
+ import "./chunk-RSVANBNW.js";
19
+ import "./chunk-WVCDUKJ2.js";
20
+ import "./chunk-C5WSQXP5.js";
21
21
  import {
22
22
  loadConfig
23
- } from "./chunk-2BRVGCVU.js";
24
- import "./chunk-7UVCZZQJ.js";
25
- import "./chunk-46KV7CZU.js";
26
- import "./chunk-4QHTXT4A.js";
27
- import "./chunk-JSCO223C.js";
28
- import "./chunk-5QR7D4RQ.js";
23
+ } from "./chunk-VLOCDWCS.js";
24
+ import "./chunk-AI44ZCMK.js";
25
+ import "./chunk-SOQVI7EZ.js";
26
+ import "./chunk-MUYTDD35.js";
27
+ import "./chunk-ZHFE6J3A.js";
28
+ import "./chunk-7HB6QLX4.js";
29
29
  import "./chunk-AOJU5LKX.js";
30
30
  import "./chunk-HGMYEDAQ.js";
31
- import "./chunk-HD2VVIPD.js";
32
- import "./chunk-Z2FY6AGZ.js";
33
- import "./chunk-XYYWKCJQ.js";
34
- import "./chunk-GDKMVOZI.js";
35
- import "./chunk-TESDUMVK.js";
36
- import "./chunk-JPOIDGGF.js";
37
- import "./chunk-D5XPB7MM.js";
38
- import "./chunk-FCGYYZHL.js";
31
+ import "./chunk-ZUC7CJVD.js";
32
+ import "./chunk-TZRYVW75.js";
33
+ import "./chunk-JERATA5R.js";
34
+ import "./chunk-M3BUP6XD.js";
35
+ import "./chunk-O4WBYEGV.js";
36
+ import "./chunk-3MGM3U6V.js";
37
+ import "./chunk-6VBLPCCX.js";
38
+ import "./chunk-PM2DB3HE.js";
39
39
  import "./chunk-MLKGABMK.js";
40
40
  export {
41
41
  GoogleMarketingRuntimeError,
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  installMcp
3
- } from "./chunk-TRW4XLQK.js";
3
+ } from "./chunk-QXSOXDUR.js";
4
4
  import {
5
5
  trackCliConnection
6
- } from "./chunk-CCNPBUQ5.js";
6
+ } from "./chunk-367K6XVX.js";
7
7
  import {
8
8
  buildSetupState,
9
9
  queueServeHandoff
10
- } from "./chunk-P3BWUKJL.js";
10
+ } from "./chunk-JEUL5QZP.js";
11
11
  import "./chunk-VJWDBFSL.js";
12
- import "./chunk-TJYS2XCI.js";
13
- import "./chunk-2WBT6TEJ.js";
12
+ import "./chunk-UQOC5ZQE.js";
13
+ import "./chunk-FCYGY4FT.js";
14
14
  import {
15
15
  cliRuntimeContext,
16
16
  installAttribution,
@@ -18,8 +18,8 @@ import {
18
18
  recordInstallRef,
19
19
  showFirstRunNotice,
20
20
  trackEvent
21
- } from "./chunk-YMOQSEO3.js";
22
- import "./chunk-X7UC755Q.js";
21
+ } from "./chunk-6PRFVLIK.js";
22
+ import "./chunk-C5WSQXP5.js";
23
23
  import {
24
24
  configExists,
25
25
  getBootstrapEnv,
@@ -27,24 +27,24 @@ import {
27
27
  getConfigPath,
28
28
  saveConfig,
29
29
  withBootstrapProviderDefaults
30
- } from "./chunk-2BRVGCVU.js";
30
+ } from "./chunk-VLOCDWCS.js";
31
31
  import {
32
32
  installSkills
33
- } from "./chunk-7UVCZZQJ.js";
33
+ } from "./chunk-AI44ZCMK.js";
34
34
  import "./chunk-AOJU5LKX.js";
35
35
  import {
36
36
  CliError,
37
37
  isMachineFormat
38
38
  } from "./chunk-HGMYEDAQ.js";
39
- import "./chunk-JPOIDGGF.js";
39
+ import "./chunk-3MGM3U6V.js";
40
40
  import {
41
41
  apiKeys,
42
42
  createClient,
43
43
  migrate
44
- } from "./chunk-D5XPB7MM.js";
44
+ } from "./chunk-6VBLPCCX.js";
45
45
  import {
46
46
  describeError
47
- } from "./chunk-FCGYYZHL.js";
47
+ } from "./chunk-PM2DB3HE.js";
48
48
  import "./chunk-MLKGABMK.js";
49
49
 
50
50
  // src/commands/init.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-X7UC755Q.js";
4
- import "./chunk-2BRVGCVU.js";
3
+ } from "./chunk-C5WSQXP5.js";
4
+ import "./chunk-VLOCDWCS.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -9,7 +9,7 @@ import "./chunk-AOJU5LKX.js";
9
9
  import {
10
10
  isMachineFormat
11
11
  } from "./chunk-HGMYEDAQ.js";
12
- import "./chunk-FCGYYZHL.js";
12
+ import "./chunk-PM2DB3HE.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
 
15
15
  // src/commands/insights.ts
@@ -0,0 +1,16 @@
1
+ import {
2
+ HISTORY_WINDOW_RUNS,
3
+ IntelligenceService
4
+ } from "./chunk-ZUC7CJVD.js";
5
+ import "./chunk-TZRYVW75.js";
6
+ import "./chunk-JERATA5R.js";
7
+ import "./chunk-M3BUP6XD.js";
8
+ import "./chunk-O4WBYEGV.js";
9
+ import "./chunk-3MGM3U6V.js";
10
+ import "./chunk-6VBLPCCX.js";
11
+ import "./chunk-PM2DB3HE.js";
12
+ import "./chunk-MLKGABMK.js";
13
+ export {
14
+ HISTORY_WINDOW_RUNS,
15
+ IntelligenceService
16
+ };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-X7UC755Q.js";
4
- import "./chunk-2BRVGCVU.js";
3
+ } from "./chunk-C5WSQXP5.js";
4
+ import "./chunk-VLOCDWCS.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -17,7 +17,7 @@ import {
17
17
  journeyDetailQuerySchema,
18
18
  journeySummaryQuerySchema,
19
19
  journeysQuerySchema
20
- } from "./chunk-FCGYYZHL.js";
20
+ } from "./chunk-PM2DB3HE.js";
21
21
  import "./chunk-MLKGABMK.js";
22
22
 
23
23
  // src/commands/journeys.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-X7UC755Q.js";
4
- import "./chunk-2BRVGCVU.js";
3
+ } from "./chunk-C5WSQXP5.js";
4
+ import "./chunk-VLOCDWCS.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -13,7 +13,7 @@ import {
13
13
  import {
14
14
  READ_ONLY_SCOPE,
15
15
  formatIsoDate
16
- } from "./chunk-FCGYYZHL.js";
16
+ } from "./chunk-PM2DB3HE.js";
17
17
  import "./chunk-MLKGABMK.js";
18
18
 
19
19
  // src/commands/keys.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-X7UC755Q.js";
4
- import "./chunk-2BRVGCVU.js";
3
+ } from "./chunk-C5WSQXP5.js";
4
+ import "./chunk-VLOCDWCS.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -10,7 +10,7 @@ import {
10
10
  CliError,
11
11
  isMachineFormat
12
12
  } from "./chunk-HGMYEDAQ.js";
13
- import "./chunk-FCGYYZHL.js";
13
+ import "./chunk-PM2DB3HE.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // src/commands/keyword.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-X7UC755Q.js";
4
- import "./chunk-2BRVGCVU.js";
3
+ } from "./chunk-C5WSQXP5.js";
4
+ import "./chunk-VLOCDWCS.js";
5
5
  import "./chunk-AOJU5LKX.js";
6
6
  import {
7
7
  isMachineFormat,
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-HGMYEDAQ.js";
10
10
  import {
11
11
  logQuerySchema
12
- } from "./chunk-FCGYYZHL.js";
12
+ } from "./chunk-PM2DB3HE.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
 
15
15
  // src/commands/logs.ts
@@ -3,13 +3,13 @@ import {
3
3
  printMcpConfig,
4
4
  renderClientSnippet,
5
5
  showMcpProfile
6
- } from "./chunk-TRW4XLQK.js";
6
+ } from "./chunk-QXSOXDUR.js";
7
7
  import "./chunk-VJWDBFSL.js";
8
- import "./chunk-X7UC755Q.js";
9
- import "./chunk-2BRVGCVU.js";
8
+ import "./chunk-C5WSQXP5.js";
9
+ import "./chunk-VLOCDWCS.js";
10
10
  import "./chunk-AOJU5LKX.js";
11
11
  import "./chunk-HGMYEDAQ.js";
12
- import "./chunk-FCGYYZHL.js";
12
+ import "./chunk-PM2DB3HE.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
  export {
15
15
  installMcp,