@canonry/canonry 4.148.12 → 4.150.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 (27) hide show
  1. package/assets/assets/{AuditHistoryPanel-B382FYpJ.js → AuditHistoryPanel-DRZk9o6L.js} +1 -1
  2. package/assets/assets/{BacklinksPage-uO5NWBJo.js → BacklinksPage-Dqkq_a-l.js} +1 -1
  3. package/assets/assets/{ChartPrimitives-Ca6KRJrN.js → ChartPrimitives-CithLZJb.js} +1 -1
  4. package/assets/assets/{HistoryPage-DDxC66Rh.js → HistoryPage-BWoRO7wp.js} +1 -1
  5. package/assets/assets/{MeasurementPropertyPage-oWfYibAk.js → MeasurementPropertyPage-DUDpWj6i.js} +1 -1
  6. package/assets/assets/{ProjectPage-D9xsYkED.js → ProjectPage-IZcPVJDc.js} +9 -9
  7. package/assets/assets/{RunRow-BI6h4uOF.js → RunRow-DOZDMB1T.js} +1 -1
  8. package/assets/assets/{RunsPage-uKBpgmHl.js → RunsPage-BTEUz9dP.js} +1 -1
  9. package/assets/assets/{SettingsPage-BhLkW7Pm.js → SettingsPage-CtFaqFam.js} +1 -1
  10. package/assets/assets/{TrafficPage-BxElvCdW.js → TrafficPage-P-T5se9o.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-Fh4-7TUe.js → TrafficSourceDetailPage-DUjwNhWm.js} +1 -1
  12. package/assets/assets/{arrow-left-DF8Fd34I.js → arrow-left-DzZGGujh.js} +1 -1
  13. package/assets/assets/{extract-error-message-Dzq_DLpk.js → extract-error-message-Dftl6C6Y.js} +1 -1
  14. package/assets/assets/{index-D2xFeORc.js → index-BMymPeRH.js} +64 -64
  15. package/assets/assets/index-CC5bfdzz.css +1 -0
  16. package/assets/assets/{trash-2-BEYteUBN.js → trash-2-DHAtpDut.js} +1 -1
  17. package/assets/index.html +2 -2
  18. package/dist/{chunk-U2ETSHDL.js → chunk-6XY6MRPN.js} +4 -4
  19. package/dist/{chunk-R6UQYXLG.js → chunk-BUAVO37B.js} +23 -1
  20. package/dist/{chunk-HWK2JSV3.js → chunk-GJOACSPY.js} +52 -9
  21. package/dist/{chunk-B4JACCYB.js → chunk-TS3AHKZG.js} +2 -2
  22. package/dist/cli.js +4 -4
  23. package/dist/index.js +4 -4
  24. package/dist/{intelligence-service-M6QKJWT7.js → intelligence-service-CEEBCERV.js} +2 -2
  25. package/dist/mcp.js +2 -2
  26. package/package.json +6 -6
  27. package/assets/assets/index-D5NO3NEG.css +0 -1
@@ -61,6 +61,7 @@ import {
61
61
  MEASUREMENT_PAGE_MAX_LIMIT,
62
62
  MEASUREMENT_PLAN_V2_SCHEMA_VERSION,
63
63
  MIN_DOMAIN_BRAND_KEY_LENGTH,
64
+ MIN_TREND_POINTS,
64
65
  MODEL_ATTRIBUTION_EVENT_LIMIT,
65
66
  MeasurementEvidenceShapes,
66
67
  MeasurementPlanValidationError,
@@ -290,6 +291,7 @@ import {
290
291
  isBrowserProvider,
291
292
  isReadOnlyKey,
292
293
  isRetryableHttpError,
294
+ isTrendBaseline,
293
295
  isVertexGroundingRedirect,
294
296
  isoDateDaysBeforeInTimeZone,
295
297
  keywordDtoSchema,
@@ -519,7 +521,7 @@ import {
519
521
  wordpressSchemaDeployResultDtoSchema,
520
522
  wordpressSchemaStatusResultDtoSchema,
521
523
  wordpressStatusDtoSchema
522
- } from "./chunk-R6UQYXLG.js";
524
+ } from "./chunk-BUAVO37B.js";
523
525
 
524
526
  // src/intelligence-service.ts
525
527
  import { eq as eq57, desc as desc26, asc as asc11, and as and45, ne as ne7, or as or11, inArray as inArray19, gte as gte13, lte as lte10 } from "drizzle-orm";
@@ -6326,12 +6328,6 @@ function categorizeQueryByIntent(query, brandTokens) {
6326
6328
  return "other";
6327
6329
  }
6328
6330
 
6329
- // ../intelligence/src/trend-stability.ts
6330
- var MIN_TREND_POINTS = 4;
6331
- function isTrendBaseline(points) {
6332
- return points.length < MIN_TREND_POINTS;
6333
- }
6334
-
6335
6331
  // ../intelligence/src/citation-scorecard.ts
6336
6332
  function buildCitationScorecard(snapshots, queryLookup) {
6337
6333
  if (snapshots.length === 0) {
@@ -16687,6 +16683,8 @@ function filteredOverviewWithDb(db, active, plan, run, filters, targetKeys) {
16687
16683
  const usageEdges = materialized.input.usageEdges.filter((edge) => filters.queryClass === "all" || materialized.edgeQueryClass.get(edge.id) === filters.queryClass);
16688
16684
  return {
16689
16685
  materialized,
16686
+ expectedSlots,
16687
+ usageEdges,
16690
16688
  overview: buildMeasurementOverview({
16691
16689
  ...materialized.input,
16692
16690
  expectedSlots,
@@ -16812,6 +16810,39 @@ function targetKeysForRun(plan, run, requested, requireEntireScope) {
16812
16810
  }
16813
16811
  return selected;
16814
16812
  }
16813
+ function marketRollup(plan, run, materialized, expectedSlots, usageEdges, scopedToOneGroup) {
16814
+ if (scopedToOneGroup) return [];
16815
+ return plan.groups.map((group) => {
16816
+ const targetKeys = targetKeysForRun(plan, run, group.targetKeys, false);
16817
+ const overview = buildMeasurementOverview({
16818
+ ...materialized.input,
16819
+ expectedSlots,
16820
+ usageEdges,
16821
+ scopeTargetIds: targetKeys
16822
+ });
16823
+ return {
16824
+ groupKey: group.stableKey,
16825
+ label: group.label,
16826
+ propertyCount: targetKeys.length,
16827
+ propertiesMentioned: countMetric2(overview.propertiesMentioned),
16828
+ mentionCoverage: coverageMetric2(overview.mentionCoverage),
16829
+ citationCoverage: coverageMetric2(overview.citationCoverage)
16830
+ };
16831
+ }).sort(compareWeakestMarket);
16832
+ }
16833
+ function compareWeakestMarket(a, b) {
16834
+ const aUnavailable = a.mentionCoverage.state === "unavailable" || a.citationCoverage.state === "unavailable";
16835
+ const bUnavailable = b.mentionCoverage.state === "unavailable" || b.citationCoverage.state === "unavailable";
16836
+ if (aUnavailable !== bUnavailable) return aUnavailable ? 1 : -1;
16837
+ if (aUnavailable || bUnavailable) return compareText13(a.label, b.label) || compareText13(a.groupKey, b.groupKey);
16838
+ if (a.mentionCoverage.state === "available" && b.mentionCoverage.state === "available" && a.mentionCoverage.value !== b.mentionCoverage.value) {
16839
+ return a.mentionCoverage.value - b.mentionCoverage.value;
16840
+ }
16841
+ if (a.citationCoverage.state === "available" && b.citationCoverage.state === "available" && a.citationCoverage.value !== b.citationCoverage.value) {
16842
+ return a.citationCoverage.value - b.citationCoverage.value;
16843
+ }
16844
+ return compareText13(a.label, b.label) || compareText13(a.groupKey, b.groupKey);
16845
+ }
16815
16846
  function portfolioResponse(db, active, plan, query) {
16816
16847
  const group = query.groupKey === void 0 ? void 0 : requireGroup2(plan, query.groupKey);
16817
16848
  const run = selectMeasurementQuestionRun(db, active.version.projectId, active, query.runId);
@@ -16845,11 +16876,22 @@ function portfolioResponse(db, active, plan, query) {
16845
16876
  citationCoverage: unavailable3("no_completed_run")
16846
16877
  },
16847
16878
  weakestProperties: rows2.slice(0, limit2),
16879
+ // Sorted through the same comparator as the measured branch. Plan order
16880
+ // is `stableKey`, so emitting it raw put markets in an order the schema
16881
+ // documents as worst-first and that changes the moment a run lands.
16882
+ markets: group !== void 0 ? [] : plan.groups.map((g) => ({
16883
+ groupKey: g.stableKey,
16884
+ label: g.label,
16885
+ propertyCount: g.targetKeys.length,
16886
+ propertiesMentioned: unavailable3("no_completed_run"),
16887
+ mentionCoverage: unavailable3("no_completed_run"),
16888
+ citationCoverage: unavailable3("no_completed_run")
16889
+ })).sort(compareWeakestMarket),
16848
16890
  totalProperties: rows2.length,
16849
16891
  truncated: rows2.length > limit2
16850
16892
  });
16851
16893
  }
16852
- const { materialized, overview } = filteredOverviewWithDb(db, active, plan, run, filters, targetKeys);
16894
+ const { materialized, overview, expectedSlots: filteredSlots, usageEdges: filteredEdges } = filteredOverviewWithDb(db, active, plan, run, filters, targetKeys);
16853
16895
  const measured = new Map(overview.properties.map((row) => [row.targetId, row]));
16854
16896
  const rows = targets.map((target) => {
16855
16897
  const row = measured.get(target.stableKey);
@@ -16879,6 +16921,7 @@ function portfolioResponse(db, active, plan, query) {
16879
16921
  citationCoverage: coverageMetric2(overview.citationCoverage)
16880
16922
  },
16881
16923
  weakestProperties: rows.slice(0, limit),
16924
+ markets: marketRollup(plan, run, materialized, filteredSlots, filteredEdges, group !== void 0),
16882
16925
  totalProperties: rows.length,
16883
16926
  truncated: rows.length > limit
16884
16927
  });
@@ -27671,7 +27714,7 @@ var routeCatalog = [
27671
27714
  method: "get",
27672
27715
  path: "/api/v1/projects/{name}/measurement-portfolio-summary",
27673
27716
  summary: "Get the weakest measured Properties",
27674
- description: "Returns a compact, revision-pinned portfolio ranking from stored results. It defaults to Non-brand questions, ranks measured mention coverage before citation coverage, and keeps unavailable rows separate from measured weakness. Replacement names come only from stored answer extraction. It never starts provider work.",
27717
+ description: "Returns a compact, revision-pinned portfolio ranking from stored results, plus a worst-first roll-up of every named market. It defaults to Non-brand questions, ranks measured mention coverage before citation coverage, and keeps unavailable rows separate from measured weakness. Every market is scoped to the displayed run, so a market row matches that market read with groupKey; markets may share Properties and never sum to the portfolio totals. The markets array is empty when the request already narrowed to one group. Replacement names come only from stored answer extraction. It never starts provider work.",
27675
27718
  tags: ["measurement-plans"],
27676
27719
  parameters: [
27677
27720
  nameParameter,
@@ -81,7 +81,7 @@ import {
81
81
  trafficConnectWordpressRequestSchema,
82
82
  trafficEventKindSchema,
83
83
  trafficSeriesGranularitySchema
84
- } from "./chunk-R6UQYXLG.js";
84
+ } from "./chunk-BUAVO37B.js";
85
85
 
86
86
  // src/config.ts
87
87
  import fs from "fs";
@@ -9431,7 +9431,7 @@ var canonryMcpTools = [
9431
9431
  defineTool({
9432
9432
  name: "canonry_measurement_portfolio_summary",
9433
9433
  title: "Summarize measured Properties",
9434
- description: "Start here to rank the weakest measured Properties and their stored replacement names. Reads stored data only; it never starts provider work.",
9434
+ description: "Start here to rank the weakest measured Properties and their stored replacement names, and to compare every named market worst-first. Each market is scoped to the displayed run; markets may share Properties, so they never sum to the portfolio totals. Reads stored data only; it never starts provider work.",
9435
9435
  access: "read",
9436
9436
  tier: "monitoring",
9437
9437
  inputSchema: measurementPortfolioSummaryInputSchema,
package/dist/cli.js CHANGED
@@ -30,7 +30,7 @@ import {
30
30
  showFirstRunNotice,
31
31
  trackCliCommandFinished,
32
32
  trackEvent
33
- } from "./chunk-U2ETSHDL.js";
33
+ } from "./chunk-6XY6MRPN.js";
34
34
  import {
35
35
  CliError,
36
36
  EXIT_SYSTEM_ERROR,
@@ -50,7 +50,7 @@ import {
50
50
  saveConfigPatch,
51
51
  systemError,
52
52
  usageError
53
- } from "./chunk-B4JACCYB.js";
53
+ } from "./chunk-TS3AHKZG.js";
54
54
  import {
55
55
  apiKeys,
56
56
  createClient,
@@ -58,7 +58,7 @@ import {
58
58
  projects,
59
59
  queries,
60
60
  renderReportHtml
61
- } from "./chunk-HWK2JSV3.js";
61
+ } from "./chunk-GJOACSPY.js";
62
62
  import {
63
63
  AdsDeliverySnapshotStatuses,
64
64
  AdsHistoricalCampaignRollupStatuses,
@@ -122,7 +122,7 @@ import {
122
122
  providerQuotaPolicySchema,
123
123
  resolveProviderInput,
124
124
  winnabilityClassSchema
125
- } from "./chunk-R6UQYXLG.js";
125
+ } from "./chunk-BUAVO37B.js";
126
126
 
127
127
  // src/cli.ts
128
128
  import { pathToFileURL } from "url";
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-U2ETSHDL.js";
3
+ } from "./chunk-6XY6MRPN.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-B4JACCYB.js";
7
- import "./chunk-HWK2JSV3.js";
8
- import "./chunk-R6UQYXLG.js";
6
+ } from "./chunk-TS3AHKZG.js";
7
+ import "./chunk-GJOACSPY.js";
8
+ import "./chunk-BUAVO37B.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-HWK2JSV3.js";
4
- import "./chunk-R6UQYXLG.js";
3
+ } from "./chunk-GJOACSPY.js";
4
+ import "./chunk-BUAVO37B.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -3,10 +3,10 @@ import {
3
3
  PACKAGE_VERSION,
4
4
  canonryMcpTools,
5
5
  createApiClient
6
- } from "./chunk-B4JACCYB.js";
6
+ } from "./chunk-TS3AHKZG.js";
7
7
  import {
8
8
  isReadOnlyKey
9
- } from "./chunk-R6UQYXLG.js";
9
+ } from "./chunk-BUAVO37B.js";
10
10
 
11
11
  // src/mcp/cli.ts
12
12
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canonry/canonry",
3
- "version": "4.148.12",
3
+ "version": "4.150.0",
4
4
  "type": "module",
5
5
  "description": "Agent-first open-source AEO operating platform - track how answer engines cite your domain",
6
6
  "license": "FSL-1.1-ALv2",
@@ -74,18 +74,18 @@
74
74
  "@ainyc/canonry-integration-bing": "0.0.0",
75
75
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
76
76
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
77
+ "@ainyc/canonry-integration-commoncrawl": "0.0.0",
77
78
  "@ainyc/canonry-integration-google": "0.0.0",
78
- "@ainyc/canonry-integration-google-places": "0.0.0",
79
79
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
80
80
  "@ainyc/canonry-integration-traffic": "0.0.0",
81
- "@ainyc/canonry-integration-commoncrawl": "0.0.0",
81
+ "@ainyc/canonry-integration-google-places": "0.0.0",
82
82
  "@ainyc/canonry-integration-wordpress": "0.0.0",
83
- "@ainyc/canonry-provider-claude": "0.0.0",
84
83
  "@ainyc/canonry-intelligence": "0.0.0",
84
+ "@ainyc/canonry-provider-claude": "0.0.0",
85
+ "@ainyc/canonry-provider-local": "0.0.0",
85
86
  "@ainyc/canonry-provider-cdp": "0.0.0",
86
- "@ainyc/canonry-provider-gemini": "0.0.0",
87
87
  "@ainyc/canonry-provider-openai": "0.0.0",
88
- "@ainyc/canonry-provider-local": "0.0.0",
88
+ "@ainyc/canonry-provider-gemini": "0.0.0",
89
89
  "@ainyc/canonry-provider-perplexity": "0.0.0"
90
90
  },
91
91
  "scripts": {