@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.
- package/assets/assets/{AuditHistoryPanel-B382FYpJ.js → AuditHistoryPanel-DRZk9o6L.js} +1 -1
- package/assets/assets/{BacklinksPage-uO5NWBJo.js → BacklinksPage-Dqkq_a-l.js} +1 -1
- package/assets/assets/{ChartPrimitives-Ca6KRJrN.js → ChartPrimitives-CithLZJb.js} +1 -1
- package/assets/assets/{HistoryPage-DDxC66Rh.js → HistoryPage-BWoRO7wp.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-oWfYibAk.js → MeasurementPropertyPage-DUDpWj6i.js} +1 -1
- package/assets/assets/{ProjectPage-D9xsYkED.js → ProjectPage-IZcPVJDc.js} +9 -9
- package/assets/assets/{RunRow-BI6h4uOF.js → RunRow-DOZDMB1T.js} +1 -1
- package/assets/assets/{RunsPage-uKBpgmHl.js → RunsPage-BTEUz9dP.js} +1 -1
- package/assets/assets/{SettingsPage-BhLkW7Pm.js → SettingsPage-CtFaqFam.js} +1 -1
- package/assets/assets/{TrafficPage-BxElvCdW.js → TrafficPage-P-T5se9o.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-Fh4-7TUe.js → TrafficSourceDetailPage-DUjwNhWm.js} +1 -1
- package/assets/assets/{arrow-left-DF8Fd34I.js → arrow-left-DzZGGujh.js} +1 -1
- package/assets/assets/{extract-error-message-Dzq_DLpk.js → extract-error-message-Dftl6C6Y.js} +1 -1
- package/assets/assets/{index-D2xFeORc.js → index-BMymPeRH.js} +64 -64
- package/assets/assets/index-CC5bfdzz.css +1 -0
- package/assets/assets/{trash-2-BEYteUBN.js → trash-2-DHAtpDut.js} +1 -1
- package/assets/index.html +2 -2
- package/dist/{chunk-U2ETSHDL.js → chunk-6XY6MRPN.js} +4 -4
- package/dist/{chunk-R6UQYXLG.js → chunk-BUAVO37B.js} +23 -1
- package/dist/{chunk-HWK2JSV3.js → chunk-GJOACSPY.js} +52 -9
- package/dist/{chunk-B4JACCYB.js → chunk-TS3AHKZG.js} +2 -2
- package/dist/cli.js +4 -4
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-M6QKJWT7.js → intelligence-service-CEEBCERV.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +6 -6
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
3
|
+
} from "./chunk-6XY6MRPN.js";
|
|
4
4
|
import {
|
|
5
5
|
loadConfig
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-TS3AHKZG.js";
|
|
7
|
+
import "./chunk-GJOACSPY.js";
|
|
8
|
+
import "./chunk-BUAVO37B.js";
|
|
9
9
|
export {
|
|
10
10
|
createServer,
|
|
11
11
|
loadConfig
|
package/dist/mcp.js
CHANGED
|
@@ -3,10 +3,10 @@ import {
|
|
|
3
3
|
PACKAGE_VERSION,
|
|
4
4
|
canonryMcpTools,
|
|
5
5
|
createApiClient
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-TS3AHKZG.js";
|
|
7
7
|
import {
|
|
8
8
|
isReadOnlyKey
|
|
9
|
-
} from "./chunk-
|
|
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.
|
|
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-
|
|
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-
|
|
88
|
+
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
89
89
|
"@ainyc/canonry-provider-perplexity": "0.0.0"
|
|
90
90
|
},
|
|
91
91
|
"scripts": {
|