@canonry/canonry 7.17.2 → 7.18.1
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/agent-workspace/skills/aero/references/portfolio-analysis.md +8 -6
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +1 -1
- package/assets/assets/{AuditHistoryPanel-Dga03Niw.js → AuditHistoryPanel-RAYlf3B4.js} +1 -1
- package/assets/assets/{BacklinksPage-CfodWuIt.js → BacklinksPage-BT3j4tQK.js} +1 -1
- package/assets/assets/{HistoryPage-BN_vTU5L.js → HistoryPage-BHV_3wbQ.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-CjiyzOmE.js → MeasurementPropertyPage-9UFPKw-i.js} +1 -1
- package/assets/assets/ProjectPage-C1_-qiHw.js +8 -0
- package/assets/assets/{RunsPage-Ca_ziCGC.js → RunsPage-Cx5yMuzN.js} +1 -1
- package/assets/assets/{SettingsPage-SO1xl0d3.js → SettingsPage-DrZ-eswp.js} +1 -1
- package/assets/assets/{SiteHealthSection-C9JgRzzs.js → SiteHealthSection-XOUI_75e.js} +3 -3
- package/assets/assets/{TrafficPage-DrcbXNQB.js → TrafficPage-DciX-fl5.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-HDZGKgyd.js → TrafficSourceDetailPage-D1_lnRoS.js} +1 -1
- package/assets/assets/{extract-error-message-D48vwe7I.js → extract-error-message-Cw5pcZtv.js} +1 -1
- package/assets/assets/{index-BaBHBReI.js → index-DIA9jvMi.js} +21 -21
- package/assets/assets/{react-sigma_core.esm.min-DVHs4npB.js → react-sigma_core.esm.min-Cc8jHlvQ.js} +1 -1
- package/assets/assets/{v2-overview-adapter-CTEXuiRt.js → v2-overview-adapter-Ca5F20Kr.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-YJS4OE6I.js → chunk-COQOQYRZ.js} +136 -37
- package/dist/{chunk-QAIJH74T.js → chunk-EAAM47H6.js} +24 -9
- package/dist/{chunk-P2XY5YX7.js → chunk-JMC7CEJB.js} +4 -4
- package/dist/{chunk-4EDH2ORA.js → chunk-JUOFNJLV.js} +3 -3
- package/dist/{chunk-3LPQ4JV5.js → chunk-PRL6UQ7L.js} +8 -7
- package/dist/{chunk-NPNU6UHD.js → chunk-U7D7LNVJ.js} +2 -2
- package/dist/{chunk-MIRAKDRW.js → chunk-X2S7D3MN.js} +17 -3
- package/dist/cli.js +26 -16
- package/dist/{demo-server-54SLPSJF.js → demo-server-XWRIXME5.js} +4 -4
- package/dist/index.js +6 -6
- package/dist/{intelligence-service-62CEP6M2.js → intelligence-service-332S7D7Y.js} +2 -2
- package/dist/mcp.js +4 -4
- package/package.json +14 -14
- package/assets/assets/ProjectPage-AxclA3YC.js +0 -8
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
GA_SEARCH_LANDING_MAX_LIMIT,
|
|
7
7
|
GOOGLE_MARKETING_STORED_SNAPSHOT_PAGE_MAX,
|
|
8
8
|
LATEST_RUN_ID,
|
|
9
|
+
MEASUREMENT_DEFAULT_QUERY_CLASS,
|
|
9
10
|
PROVIDER_ACCOUNT_FAILURE_STREAK,
|
|
10
11
|
PROVIDER_ACCOUNT_RETRY_HOURS,
|
|
11
12
|
RESEARCH_RUN_SCOPE,
|
|
@@ -141,7 +142,7 @@ import {
|
|
|
141
142
|
trafficSeriesGranularitySchema,
|
|
142
143
|
visibilityCompareSelectionSchema,
|
|
143
144
|
visibilityReportRequestSchema
|
|
144
|
-
} from "./chunk-
|
|
145
|
+
} from "./chunk-X2S7D3MN.js";
|
|
145
146
|
|
|
146
147
|
// src/cli-error.ts
|
|
147
148
|
function isMachineFormat(format) {
|
|
@@ -390,7 +391,8 @@ var runTriggerInputSchema = z3.object({
|
|
|
390
391
|
});
|
|
391
392
|
var measurementPlanVersionInputSchema = z3.object({ project: projectNameSchema, revision: z3.number().int().positive() });
|
|
392
393
|
var measurementReportInputSchema = measurementPlanVersionInputSchema.extend({
|
|
393
|
-
runId: runIdSchema.optional().describe("Exact eligible full measurement run to reconstruct. Omit for the latest run in the revision.")
|
|
394
|
+
runId: runIdSchema.optional().describe("Exact eligible full measurement run to reconstruct. Omit for the latest run in the revision."),
|
|
395
|
+
queryClass: measurementQueryClassFilterSchema.optional().describe("Omit for non-brand on a schema v2 revision; read branded as a separate call. all pools both classes. A schema v1 revision records no class: omit it there.")
|
|
394
396
|
});
|
|
395
397
|
var measurementPlanPreviewInputSchema = z3.object({ project: projectNameSchema, plan: measurementPlanAuthoringSchema });
|
|
396
398
|
var measurementPlanPublishInputSchema = measurementPlanPublishRequestSchema.extend({ project: projectNameSchema });
|
|
@@ -399,10 +401,11 @@ var measurementDiscoveryInputSchema = measurementDiscoveryRequestSchema.extend({
|
|
|
399
401
|
var idempotencyKeyInputSchema = z3.string().trim().min(1).describe("A fresh request key. Reuse it only when retrying the identical request.");
|
|
400
402
|
var measurementOverviewInputSchema = z3.object({
|
|
401
403
|
project: projectNameSchema,
|
|
402
|
-
scope: measurementOverviewQuerySchema.shape.scope.describe("Read all Properties, one
|
|
404
|
+
scope: measurementOverviewQuerySchema.shape.scope.describe("Read all Properties, one group (every query of its Properties), one market (only the market's own queries, as the dashboard's market view), or one Property. A group and a market can share a name and still differ; for a market, use market scope."),
|
|
403
405
|
groupKey: measurementOverviewQuerySchema.shape.groupKey.describe("Group stable key. Required only for group scope."),
|
|
406
|
+
marketKey: measurementOverviewQuerySchema.shape.marketKey.describe("Market stable key. Required only for market scope."),
|
|
404
407
|
targetKey: measurementOverviewQuerySchema.shape.targetKey.describe("Property stable key. Required only for property scope."),
|
|
405
|
-
queryClass: measurementOverviewQuerySchema.shape.queryClass.describe("
|
|
408
|
+
queryClass: measurementOverviewQuerySchema.shape.queryClass.describe("Omit for non-brand, the acquisition signal. Read branded (brand recall) as a separate call. all pools both classes into one rate, so never report it as one class."),
|
|
406
409
|
provider: measurementOverviewQuerySchema.shape.provider,
|
|
407
410
|
location: measurementOverviewQuerySchema.shape.location,
|
|
408
411
|
from: measurementOverviewQuerySchema.shape.from,
|
|
@@ -420,14 +423,20 @@ var measurementOverviewInputSchema = z3.object({
|
|
|
420
423
|
if (input.scope === "property" && !input.targetKey) {
|
|
421
424
|
context.addIssue({ code: "custom", path: ["targetKey"], message: "Property scope requires targetKey." });
|
|
422
425
|
}
|
|
426
|
+
if (input.scope === "market" && !input.marketKey) {
|
|
427
|
+
context.addIssue({ code: "custom", path: ["marketKey"], message: "Market scope requires marketKey." });
|
|
428
|
+
}
|
|
423
429
|
if (input.scope !== "group" && input.groupKey) {
|
|
424
430
|
context.addIssue({ code: "custom", path: ["groupKey"], message: `${input.scope} scope does not accept groupKey.` });
|
|
425
431
|
}
|
|
432
|
+
if (input.scope !== "market" && input.marketKey) {
|
|
433
|
+
context.addIssue({ code: "custom", path: ["marketKey"], message: `${input.scope} scope does not accept marketKey.` });
|
|
434
|
+
}
|
|
426
435
|
if (input.scope !== "property" && input.targetKey) {
|
|
427
436
|
context.addIssue({ code: "custom", path: ["targetKey"], message: `${input.scope} scope does not accept targetKey.` });
|
|
428
437
|
}
|
|
429
438
|
});
|
|
430
|
-
var AGENT_DEFAULT_QUERY_CLASS =
|
|
439
|
+
var AGENT_DEFAULT_QUERY_CLASS = MEASUREMENT_DEFAULT_QUERY_CLASS;
|
|
431
440
|
var propertyQueryClassInputSchema = measurementQueryClassFilterSchema.optional().describe("Omit for non-brand. branded reads brand recall; all pools both classes, so name the class you report.");
|
|
432
441
|
function agentQueryClass(queryClass) {
|
|
433
442
|
return queryClass ?? AGENT_DEFAULT_QUERY_CLASS;
|
|
@@ -2911,7 +2920,7 @@ var canonryMcpTools = [
|
|
|
2911
2920
|
defineTool({
|
|
2912
2921
|
name: "canonry_measurement_overview",
|
|
2913
2922
|
title: "Get Advanced Measurement overview",
|
|
2914
|
-
description: "Compact pages are byte-bounded whole rows by default; use nextCursor with unchanged filters. For best/worst Property mention rankings, prefer canonry_measurement_portfolio_summary and its mentionRanking. An unavailable aggregate does not invalidate available Property metrics. Return stored, revision-pinned Advanced Measurement metrics and a bounded page of Property rows for all Properties, one
|
|
2923
|
+
description: "Compact pages are byte-bounded whole rows by default; use nextCursor with unchanged filters. For best/worst Property mention rankings, prefer canonry_measurement_portfolio_summary and its mentionRanking. An unavailable aggregate does not invalidate available Property metrics. Return stored, revision-pinned Advanced Measurement metrics and a bounded page of Property rows for all Properties, one group, one market, or one Property. Defaults to non-brand queries: read branded as a separate call, state the returned queryClass, and never report queryClass all (both classes pooled) as one class. A group is every query of its Properties; a market is only its own queries, the dashboard's market population. Use market scope for a market's figures, and quote the returned scope kind and label: a group figure is never a market's figure. Filter by query class, provider, location, date window, run, or Property search; search filters rows without changing metric denominators. On a schema-v2 plan each Property row carries its metro (and otherMetros when it is in several). It ranks one run snapshot only and never infers a trend or compares across revisions. Choose label-asc (default), label-desc, citationCoverage-asc/desc, or mentionCoverage-asc/desc. For a coverage sort, unavailable rows form the first bucket in either direction; available rows then follow the requested numeric direction. The cursor is sort-aware, pins pagination to the active revision, displayed run, evidence snapshot, and filters even if a newer run completes, and must be reused unchanged with the same sort and filters. Legacy label cursors work only when sort is omitted, while any explicit sort needs a new sort-bound cursor. It never starts provider work or incurs provider cost; page size is at most 100, and it refuses invalid scope keys, cursor combinations, appended evidence, or a run pinned to another revision.",
|
|
2915
2924
|
access: "read",
|
|
2916
2925
|
tier: "setup",
|
|
2917
2926
|
inputSchema: measurementOverviewInputSchema,
|
|
@@ -2919,7 +2928,11 @@ var canonryMcpTools = [
|
|
|
2919
2928
|
openApiOperations: ["GET /api/v1/projects/{name}/measurement-overview"],
|
|
2920
2929
|
handler: (client, input) => {
|
|
2921
2930
|
const { project, ...query } = input;
|
|
2922
|
-
return client.getMeasurementOverview(project, {
|
|
2931
|
+
return client.getMeasurementOverview(project, {
|
|
2932
|
+
...query,
|
|
2933
|
+
queryClass: agentQueryClass(query.queryClass),
|
|
2934
|
+
compact: query.compact ?? true
|
|
2935
|
+
});
|
|
2923
2936
|
}
|
|
2924
2937
|
}),
|
|
2925
2938
|
defineTool({
|
|
@@ -3193,13 +3206,15 @@ var canonryMcpTools = [
|
|
|
3193
3206
|
defineTool({
|
|
3194
3207
|
name: "canonry_measurement_report",
|
|
3195
3208
|
title: "Get measurement report",
|
|
3196
|
-
description: "Get a revision-pinned Target and group measurement report from stored runs. Optionally pin the evidence to an exact eligible full run. Never starts live provider work.",
|
|
3209
|
+
description: "Get a revision-pinned Target and group measurement report from stored runs. Optionally pin the evidence to an exact eligible full run. On a schema v2 revision every rate is taken over non-brand queries unless queryClass names another class, and the response echoes queryClass; read branded as a separate call, and treat all as pooled. A schema v1 revision records no class and echoes queryClass null. Never starts live provider work.",
|
|
3197
3210
|
access: "read",
|
|
3198
3211
|
tier: "setup",
|
|
3199
3212
|
inputSchema: measurementReportInputSchema,
|
|
3200
3213
|
annotations: readAnnotations(),
|
|
3201
3214
|
openApiOperations: ["GET /api/v1/projects/{name}/measurement-report"],
|
|
3202
|
-
|
|
3215
|
+
// The class is sent only when named: the server serves non-brand on a v2
|
|
3216
|
+
// revision and every answer on a v1 revision, which refuses a named class.
|
|
3217
|
+
handler: (client, input) => client.getMeasurementReport(input.project, input.revision, input.runId, input.queryClass)
|
|
3203
3218
|
}),
|
|
3204
3219
|
defineTool({
|
|
3205
3220
|
name: "canonry_run_trigger",
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
PACKAGE_VERSION,
|
|
6
6
|
canonryMcpTools,
|
|
7
7
|
isMachineFormat
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-EAAM47H6.js";
|
|
9
9
|
import {
|
|
10
10
|
AGENT_PROVIDER_IDS,
|
|
11
11
|
CANONRY_NPM_PACKAGE_URL,
|
|
@@ -50,7 +50,7 @@ import {
|
|
|
50
50
|
skillsClientSchema,
|
|
51
51
|
upgradeCaveatFor,
|
|
52
52
|
upgradeCommandFor
|
|
53
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-X2S7D3MN.js";
|
|
54
54
|
|
|
55
55
|
// src/config.ts
|
|
56
56
|
import fs from "fs";
|
|
@@ -7027,12 +7027,12 @@ var ApiClient = class {
|
|
|
7027
7027
|
})
|
|
7028
7028
|
);
|
|
7029
7029
|
}
|
|
7030
|
-
async getMeasurementReport(project, revision, runId) {
|
|
7030
|
+
async getMeasurementReport(project, revision, runId, queryClass) {
|
|
7031
7031
|
return this.invoke(
|
|
7032
7032
|
() => getApiV1ProjectsByNameMeasurementReport({
|
|
7033
7033
|
client: this.heyClient,
|
|
7034
7034
|
path: { name: project },
|
|
7035
|
-
query: { revision, runId }
|
|
7035
|
+
query: { revision, runId, ...queryClass === void 0 ? {} : { queryClass } }
|
|
7036
7036
|
})
|
|
7037
7037
|
);
|
|
7038
7038
|
}
|
|
@@ -4,14 +4,14 @@ import {
|
|
|
4
4
|
installSkills,
|
|
5
5
|
loadConfigRaw,
|
|
6
6
|
saveConfigPatch
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-JMC7CEJB.js";
|
|
8
8
|
import {
|
|
9
9
|
PACKAGE_VERSION
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-EAAM47H6.js";
|
|
11
11
|
import {
|
|
12
12
|
SKILL_MANIFEST_FILENAME,
|
|
13
13
|
SkillsClients
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-X2S7D3MN.js";
|
|
15
15
|
|
|
16
16
|
// src/skills-autosync.ts
|
|
17
17
|
import fs from "fs";
|
|
@@ -20,20 +20,20 @@ import {
|
|
|
20
20
|
saveConfig,
|
|
21
21
|
saveConfigPatch,
|
|
22
22
|
sentimentInstallReadiness
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-JMC7CEJB.js";
|
|
24
24
|
import {
|
|
25
25
|
computeFactorAverages,
|
|
26
26
|
deleteSiteCrawlGraphLayout,
|
|
27
27
|
persistSiteCrawlGraphLayout,
|
|
28
28
|
prepareSiteCrawlGraphLayout,
|
|
29
29
|
recordedSharePct
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-U7D7LNVJ.js";
|
|
31
31
|
import {
|
|
32
32
|
CanonryMcpToolNames,
|
|
33
33
|
CliError,
|
|
34
34
|
PACKAGE_VERSION,
|
|
35
35
|
canonryMcpTools
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-EAAM47H6.js";
|
|
37
37
|
import {
|
|
38
38
|
CC_CACHE_DIR,
|
|
39
39
|
DUCKDB_SPEC,
|
|
@@ -223,7 +223,7 @@ import {
|
|
|
223
223
|
toAlertView,
|
|
224
224
|
usageCounters,
|
|
225
225
|
writeAuditLog
|
|
226
|
-
} from "./chunk-
|
|
226
|
+
} from "./chunk-COQOQYRZ.js";
|
|
227
227
|
import {
|
|
228
228
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
229
229
|
AGENT_NONE,
|
|
@@ -439,7 +439,7 @@ import {
|
|
|
439
439
|
winnabilityClassLabel,
|
|
440
440
|
withRetry,
|
|
441
441
|
withSkippedProviders
|
|
442
|
-
} from "./chunk-
|
|
442
|
+
} from "./chunk-X2S7D3MN.js";
|
|
443
443
|
|
|
444
444
|
// src/runtime-context.ts
|
|
445
445
|
function cliRuntimeContext(env = process.env, stdio = process) {
|
|
@@ -8049,7 +8049,7 @@ function nonBlank(value) {
|
|
|
8049
8049
|
return trimmed ? trimmed : void 0;
|
|
8050
8050
|
}
|
|
8051
8051
|
function resolveBuildCommit(env = process.env) {
|
|
8052
|
-
const embedded = true ? "
|
|
8052
|
+
const embedded = true ? "a903138511e467c8395b479a32ffd27d03f01fa9" : void 0;
|
|
8053
8053
|
return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
|
|
8054
8054
|
}
|
|
8055
8055
|
function resolveInstanceIdentity(env = process.env) {
|
|
@@ -18780,7 +18780,8 @@ var ADVANCED_TOOLS = [
|
|
|
18780
18780
|
var LEGACY_TOOLS = ["canonry_measurement_overview", "canonry_measurement_plan_get", "canonry_run_completeness"];
|
|
18781
18781
|
var SIMPLE_TOOLS = ["canonry_visibility_report"];
|
|
18782
18782
|
var ADVANCED_ROUTES = [
|
|
18783
|
-
|
|
18783
|
+
'Weakest or strongest Properties: canonry_measurement_portfolio_summary (mentionRanking for both ends). Compact results carry detailsOmitted; use Property evidence reads for omitted names and cited domains. The default cursor enumerates weakest Properties only; set list=strongest-mentions or list=weakest-mentions to enumerate the chosen ranking. Follow nextCursor with unchanged list and filters; pageList names that selection. Use groupKey, or page canonry_measurement_overview with queryClass "non-brand", for all Property rows.',
|
|
18784
|
+
`Rates for one Property, group or market: canonry_measurement_overview with queryClass "non-brand". Branded is a separate call (queryClass "branded"), reported as its own figure; never quote queryClass "all", which pools both. For a market, use scope "market" with its marketKey (a kind market id in canonry_visibility_report scopeOptions): it counts only that market's queries, as the dashboard does. Scope "group" counts every query of its Properties, so never quote a group figure under a market's name; quote the returned scope kind and label.`,
|
|
18784
18785
|
"Which metros have the biggest gaps: the compact summary's weakestMarkets, whose rates cover full top-level metros. Set list=markets and follow nextCursor with unchanged list and filters for every market; tiedAtWeakest describes only the zero-signal Property cohort, never full metro rates.",
|
|
18785
18786
|
"One Property: canonry_measurement_property_evidence and canonry_measurement_property_competitors (names written instead of it, and citedDomains, its own cited sources). Portfolio lists such as weakestAnswerSources pool many Properties.",
|
|
18786
18787
|
'Which names answers give instead across the portfolio: canonry_competitor_landscape with queryClass and runId "latest", answers=not-mentioned. This selects answers naming none of their targeted Properties; preserve populationSize, answerCount and unknownMentionAnswers. Per-Property named-instead lists are samples of weak Properties.',
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
siteCrawlGraphNodes,
|
|
6
6
|
siteCrawlPages,
|
|
7
7
|
siteCrawlSnapshots
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-COQOQYRZ.js";
|
|
9
9
|
import {
|
|
10
10
|
SITE_CRAWL_GRAPH_MAX_EDGES,
|
|
11
11
|
SITE_CRAWL_GRAPH_MAX_NODES,
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
factorStatusFromDistribution,
|
|
16
16
|
factorStatusFromScore,
|
|
17
17
|
roundPreservingTotal
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-X2S7D3MN.js";
|
|
19
19
|
|
|
20
20
|
// src/site-audit-factors.ts
|
|
21
21
|
function recordedSharePct(factor) {
|
|
@@ -3720,8 +3720,9 @@ var measurementCountMetricValueSchema = z6.discriminatedUnion("state", [
|
|
|
3720
3720
|
reason: measurementMetricUnavailableReasonSchema
|
|
3721
3721
|
}).strict()
|
|
3722
3722
|
]);
|
|
3723
|
-
var measurementOverviewScopeKindSchema = z6.enum(["all", "group", "property"]);
|
|
3723
|
+
var measurementOverviewScopeKindSchema = z6.enum(["all", "group", "market", "property"]);
|
|
3724
3724
|
var measurementQueryClassFilterSchema = queryClassFilterSchema;
|
|
3725
|
+
var MEASUREMENT_DEFAULT_QUERY_CLASS = "non-brand";
|
|
3725
3726
|
var measurementOverviewSortSchema = z6.enum([
|
|
3726
3727
|
"label-asc",
|
|
3727
3728
|
"label-desc",
|
|
@@ -3742,7 +3743,10 @@ var measurementNextActionKindSchema = z6.enum([
|
|
|
3742
3743
|
var measurementOverviewQuerySchema = z6.object({
|
|
3743
3744
|
scope: measurementOverviewScopeKindSchema,
|
|
3744
3745
|
groupKey: measurementV2StableKeySchema.optional(),
|
|
3746
|
+
/** Required for market scope: a frozen reporting scope's stable key. */
|
|
3747
|
+
marketKey: measurementV2StableKeySchema.optional(),
|
|
3745
3748
|
targetKey: measurementV2StableKeySchema.optional(),
|
|
3749
|
+
/** Omit for non-brand. `all` pools branded and non-brand into one rate. */
|
|
3746
3750
|
queryClass: measurementQueryClassFilterSchema.optional(),
|
|
3747
3751
|
provider: providerNameSchema.optional(),
|
|
3748
3752
|
location: z6.string().trim().min(1).optional(),
|
|
@@ -11454,6 +11458,13 @@ var measurementReportRunSchema = z26.object({
|
|
|
11454
11458
|
}).strict();
|
|
11455
11459
|
var measurementReportResponseSchema = z26.object({
|
|
11456
11460
|
revision: z26.number().int().positive(),
|
|
11461
|
+
/**
|
|
11462
|
+
* The query class every group, Target and evidence row below is taken over:
|
|
11463
|
+
* non-brand unless the request named another, and `all` pools branded with
|
|
11464
|
+
* non-brand. Null for a schema v1 revision, which records no class. Absent on
|
|
11465
|
+
* servers that predate it.
|
|
11466
|
+
*/
|
|
11467
|
+
queryClass: measurementQueryClassFilterSchema.nullable().optional(),
|
|
11457
11468
|
run: measurementReportRunSchema.nullable(),
|
|
11458
11469
|
groups: z26.array(measurementGroupReportSchema),
|
|
11459
11470
|
targets: z26.array(measurementTargetReportSchema),
|
|
@@ -12047,12 +12058,14 @@ var measurementPropertyCompetitorsResponseSchema = z28.object({
|
|
|
12047
12058
|
var measurementChangesSortSchema = z28.enum(["magnitude", "label"]);
|
|
12048
12059
|
var MEASUREMENT_CHANGES_DEFAULT_SORT = "magnitude";
|
|
12049
12060
|
var MEASUREMENT_CHANGES_NOISE_ANSWERS = 2;
|
|
12061
|
+
var measurementChangesScopeKindSchema = z28.enum(["all", "group", "property"]);
|
|
12050
12062
|
var measurementChangesQuerySchema = z28.object({
|
|
12051
12063
|
runId: measurementDemoFilterQueryShape.runId,
|
|
12052
|
-
scope:
|
|
12064
|
+
scope: measurementChangesScopeKindSchema.default("all"),
|
|
12053
12065
|
groupKey: measurementV2StableKeySchema.optional(),
|
|
12054
12066
|
targetKey: measurementV2StableKeySchema.optional(),
|
|
12055
|
-
|
|
12067
|
+
/** Defaults to non-brand. `all` pools both classes and adds `metricsByClass`. */
|
|
12068
|
+
queryClass: measurementQueryClassFilterSchema.default(MEASUREMENT_DEFAULT_QUERY_CLASS),
|
|
12056
12069
|
provider: measurementDemoFilterQueryShape.provider,
|
|
12057
12070
|
location: measurementDemoFilterQueryShape.location,
|
|
12058
12071
|
limit: z28.number().int().positive().max(50).optional(),
|
|
@@ -22670,6 +22683,7 @@ export {
|
|
|
22670
22683
|
MEASUREMENT_PAGE_DEFAULT_LIMIT,
|
|
22671
22684
|
MEASUREMENT_PAGE_MAX_LIMIT,
|
|
22672
22685
|
measurementQueryClassFilterSchema,
|
|
22686
|
+
MEASUREMENT_DEFAULT_QUERY_CLASS,
|
|
22673
22687
|
measurementOverviewSortSchema,
|
|
22674
22688
|
MEASUREMENT_OVERVIEW_DEFAULT_SORT,
|
|
22675
22689
|
measurementOverviewQuerySchema,
|
package/dist/cli.js
CHANGED
|
@@ -34,11 +34,11 @@ import {
|
|
|
34
34
|
trackCliCommandFinished,
|
|
35
35
|
trackEvent,
|
|
36
36
|
waitForServerRuntimeStartup
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-PRL6UQ7L.js";
|
|
38
38
|
import {
|
|
39
39
|
autoSyncSkills,
|
|
40
40
|
formatAutoSyncNotice
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-JUOFNJLV.js";
|
|
42
42
|
import {
|
|
43
43
|
configExists,
|
|
44
44
|
createApiClient,
|
|
@@ -55,13 +55,13 @@ import {
|
|
|
55
55
|
saveConfig,
|
|
56
56
|
saveConfigPatch,
|
|
57
57
|
shouldPrintServeSkillsNudge
|
|
58
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-JMC7CEJB.js";
|
|
59
59
|
import {
|
|
60
60
|
DEFAULT_DEMO_TRUSTED_PROXIES,
|
|
61
61
|
trustedProxiesProblem,
|
|
62
62
|
trustedProxyProblem
|
|
63
63
|
} from "./chunk-RB2F4D3Z.js";
|
|
64
|
-
import "./chunk-
|
|
64
|
+
import "./chunk-U7D7LNVJ.js";
|
|
65
65
|
import {
|
|
66
66
|
CliError,
|
|
67
67
|
EXIT_SYSTEM_ERROR,
|
|
@@ -73,7 +73,7 @@ import {
|
|
|
73
73
|
runMeasurementDraftAction,
|
|
74
74
|
systemError,
|
|
75
75
|
usageError
|
|
76
|
-
} from "./chunk-
|
|
76
|
+
} from "./chunk-EAAM47H6.js";
|
|
77
77
|
import {
|
|
78
78
|
CLOUDFLARE_WORKER_BINDINGS,
|
|
79
79
|
CLOUDFLARE_WORKER_GENERATED_MARKER,
|
|
@@ -105,7 +105,7 @@ import {
|
|
|
105
105
|
rawEventSamples,
|
|
106
106
|
readMarketCompetitorNames,
|
|
107
107
|
runs
|
|
108
|
-
} from "./chunk-
|
|
108
|
+
} from "./chunk-COQOQYRZ.js";
|
|
109
109
|
import {
|
|
110
110
|
AdsDeliverySnapshotStatuses,
|
|
111
111
|
AdsHistoricalCampaignRollupStatuses,
|
|
@@ -238,7 +238,7 @@ import {
|
|
|
238
238
|
visibilityCompareSelectionSchema,
|
|
239
239
|
visibilityReportRequestSchema,
|
|
240
240
|
winnabilityClassSchema
|
|
241
|
-
} from "./chunk-
|
|
241
|
+
} from "./chunk-X2S7D3MN.js";
|
|
242
242
|
|
|
243
243
|
// src/cli.ts
|
|
244
244
|
import { pathToFileURL } from "url";
|
|
@@ -788,7 +788,7 @@ function parseDemoTrustedProxies(values) {
|
|
|
788
788
|
async function demoCommand(options) {
|
|
789
789
|
const { host, port } = parseDemoListenOptions(options);
|
|
790
790
|
const trustProxy = parseDemoTrustedProxies(options.trustProxy);
|
|
791
|
-
const { createDemoServer } = await import("./demo-server-
|
|
791
|
+
const { createDemoServer } = await import("./demo-server-XWRIXME5.js");
|
|
792
792
|
const app = await createDemoServer({ trustProxy });
|
|
793
793
|
let stopping = false;
|
|
794
794
|
const stop = () => {
|
|
@@ -1202,7 +1202,7 @@ No DB writes performed. Re-run without --dry-run to apply.`);
|
|
|
1202
1202
|
}
|
|
1203
1203
|
}
|
|
1204
1204
|
async function backfillInsightsCommand(project2, opts) {
|
|
1205
|
-
const { IntelligenceService } = await import("./intelligence-service-
|
|
1205
|
+
const { IntelligenceService } = await import("./intelligence-service-332S7D7Y.js");
|
|
1206
1206
|
const config = loadConfig();
|
|
1207
1207
|
const db = createClient(config.database);
|
|
1208
1208
|
migrate(db);
|
|
@@ -12247,8 +12247,18 @@ async function discoverMeasurementTargets(project2, sitemapUrl, ruleSource, maxU
|
|
|
12247
12247
|
});
|
|
12248
12248
|
console.log(JSON.stringify(await createApiClient().discoverMeasurementTargets(project2, request), null, 2));
|
|
12249
12249
|
}
|
|
12250
|
-
async function showMeasurementReport(project2, revision) {
|
|
12251
|
-
console.log(JSON.stringify(await createApiClient().getMeasurementReport(project2, revision), null, 2));
|
|
12250
|
+
async function showMeasurementReport(project2, revision, queryClass) {
|
|
12251
|
+
console.log(JSON.stringify(await createApiClient().getMeasurementReport(project2, revision, void 0, queryClass), null, 2));
|
|
12252
|
+
}
|
|
12253
|
+
function queryClassText(queryClass) {
|
|
12254
|
+
switch (queryClass) {
|
|
12255
|
+
case "non-brand":
|
|
12256
|
+
return "non-brand queries";
|
|
12257
|
+
case "branded":
|
|
12258
|
+
return "branded queries";
|
|
12259
|
+
case "all":
|
|
12260
|
+
return "branded and non-brand queries pooled";
|
|
12261
|
+
}
|
|
12252
12262
|
}
|
|
12253
12263
|
var METRIC_REASONS = {
|
|
12254
12264
|
plan_v1: "not measured (setup update required)",
|
|
@@ -12290,7 +12300,7 @@ async function showMeasurementProperty(project2, opts) {
|
|
|
12290
12300
|
function printMeasurementProperty(response) {
|
|
12291
12301
|
const row = response.properties.items.at(0);
|
|
12292
12302
|
const lines = [];
|
|
12293
|
-
lines.push(`${response.scope.label} \
|
|
12303
|
+
lines.push(`${response.scope.label} \xB7 ${queryClassText(response.queryClass)}`);
|
|
12294
12304
|
lines.push(`Measurement: ${response.measurement.state}${response.measurement.displayedRunId ? ` \xB7 run ${response.measurement.displayedRunId}` : ""}`);
|
|
12295
12305
|
lines.push("");
|
|
12296
12306
|
const mention = row ? row.mentionCoverage : response.metrics.mentionCoverage;
|
|
@@ -21945,8 +21955,8 @@ Usage: ${usage}`);
|
|
|
21945
21955
|
},
|
|
21946
21956
|
{
|
|
21947
21957
|
path: ["measurement-plan", "report"],
|
|
21948
|
-
usage: "canonry measurement-plan report <project> --revision N [--format json]",
|
|
21949
|
-
options: { revision: stringOption() },
|
|
21958
|
+
usage: "canonry measurement-plan report <project> --revision N [--query-class non-brand|branded|all] [--format json] (schema v2 revision: default non-brand, all pools both classes; schema v1 revision: reads every answer, refuses non-brand and branded)",
|
|
21959
|
+
options: { revision: stringOption(), "query-class": stringOption() },
|
|
21950
21960
|
run: (input) => {
|
|
21951
21961
|
const project2 = requireProject(input, "measurement-plan.report", "canonry measurement-plan report <project> --revision N");
|
|
21952
21962
|
const value = getString(input.values, "revision");
|
|
@@ -21954,12 +21964,12 @@ Usage: ${usage}`);
|
|
|
21954
21964
|
if (revision === void 0 || !Number.isInteger(revision) || revision <= 0) {
|
|
21955
21965
|
throw usageError("--revision must be a positive integer");
|
|
21956
21966
|
}
|
|
21957
|
-
return showMeasurementReport(project2, revision);
|
|
21967
|
+
return showMeasurementReport(project2, revision, queryClassOption(input));
|
|
21958
21968
|
}
|
|
21959
21969
|
},
|
|
21960
21970
|
{
|
|
21961
21971
|
path: ["measurement-plan", "property"],
|
|
21962
|
-
usage: "canonry measurement-plan property <project> --target-key <key> [--query-class
|
|
21972
|
+
usage: "canonry measurement-plan property <project> --target-key <key> [--query-class non-brand|branded|all] [--provider <p>] [--location <l>] [--run-id <id>] [--format json] (default non-brand; all pools both classes)",
|
|
21963
21973
|
options: PROPERTY_SCOPE_OPTIONS,
|
|
21964
21974
|
run: (input) => {
|
|
21965
21975
|
const usage = "canonry measurement-plan property <project> --target-key <key>";
|
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
computeFactorAverages,
|
|
6
6
|
layoutSiteCrawlGraphInput,
|
|
7
7
|
persistSiteCrawlGraphLayout
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-U7D7LNVJ.js";
|
|
9
9
|
import {
|
|
10
10
|
PACKAGE_VERSION,
|
|
11
11
|
canonryMcpTools
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-EAAM47H6.js";
|
|
13
13
|
import {
|
|
14
14
|
HISTORY_WINDOW_RUNS,
|
|
15
15
|
IntelligenceService,
|
|
@@ -85,7 +85,7 @@ import {
|
|
|
85
85
|
siteCrawlPages,
|
|
86
86
|
siteCrawlSnapshots,
|
|
87
87
|
trafficSources
|
|
88
|
-
} from "./chunk-
|
|
88
|
+
} from "./chunk-COQOQYRZ.js";
|
|
89
89
|
import {
|
|
90
90
|
RunKinds,
|
|
91
91
|
SiteCrawlFetchStates,
|
|
@@ -115,7 +115,7 @@ import {
|
|
|
115
115
|
roundPreservingTotal,
|
|
116
116
|
siteAuditPageFactorSchema,
|
|
117
117
|
wilsonInterval
|
|
118
|
-
} from "./chunk-
|
|
118
|
+
} from "./chunk-X2S7D3MN.js";
|
|
119
119
|
|
|
120
120
|
// src/demo-server.ts
|
|
121
121
|
import { dirname, join as join2 } from "path";
|
package/dist/index.js
CHANGED
|
@@ -3,14 +3,14 @@ import {
|
|
|
3
3
|
createGoogleMarketingCredentialStore,
|
|
4
4
|
createGoogleMarketingRuntime,
|
|
5
5
|
createServer
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-PRL6UQ7L.js";
|
|
7
7
|
import {
|
|
8
8
|
loadConfig
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-JMC7CEJB.js";
|
|
10
|
+
import "./chunk-U7D7LNVJ.js";
|
|
11
|
+
import "./chunk-EAAM47H6.js";
|
|
12
|
+
import "./chunk-COQOQYRZ.js";
|
|
13
|
+
import "./chunk-X2S7D3MN.js";
|
|
14
14
|
export {
|
|
15
15
|
GoogleMarketingRuntimeError,
|
|
16
16
|
createGoogleMarketingCredentialStore,
|
package/dist/mcp.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
autoSyncSkills
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JUOFNJLV.js";
|
|
4
4
|
import {
|
|
5
5
|
createApiClient,
|
|
6
6
|
createCanonryMcpServer
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-JMC7CEJB.js";
|
|
8
|
+
import "./chunk-EAAM47H6.js";
|
|
9
9
|
import {
|
|
10
10
|
isReadOnlyKey,
|
|
11
11
|
updateCheckEnvOptOut
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-X2S7D3MN.js";
|
|
13
13
|
|
|
14
14
|
// src/mcp/cli.ts
|
|
15
15
|
import { randomUUID } from "crypto";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@canonry/canonry",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.18.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Self-hosted AI visibility (AEO) platform: track how ChatGPT, Claude, Gemini, and Perplexity cite your domain, join it with Search Console, GA4, server-side traffic, and paid media, and fix what you find through agent tools (CLI, REST, MCP). Local SQLite.",
|
|
6
6
|
"keywords": [
|
|
@@ -85,34 +85,34 @@
|
|
|
85
85
|
"@types/node-cron": "^3.0.11",
|
|
86
86
|
"tsup": "^8.5.1",
|
|
87
87
|
"tsx": "^4.19.0",
|
|
88
|
+
"@ainyc/canonry-web": "0.0.0",
|
|
88
89
|
"@ainyc/canonry-api-routes": "0.0.0",
|
|
89
|
-
"@ainyc/canonry-
|
|
90
|
+
"@ainyc/canonry-api-client": "0.0.0",
|
|
90
91
|
"@ainyc/canonry-config": "0.0.0",
|
|
92
|
+
"@ainyc/canonry-contracts": "0.0.0",
|
|
91
93
|
"@ainyc/canonry-db": "0.0.0",
|
|
92
|
-
"@ainyc/canonry-web": "0.0.0",
|
|
93
|
-
"@ainyc/canonry-api-client": "0.0.0",
|
|
94
|
-
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
95
94
|
"@ainyc/canonry-integration-bing": "0.0.0",
|
|
96
95
|
"@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
|
|
96
|
+
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
97
97
|
"@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
|
|
98
98
|
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
99
|
-
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
100
|
-
"@ainyc/canonry-integration-google-ads": "0.0.0",
|
|
101
99
|
"@ainyc/canonry-integration-google": "0.0.0",
|
|
102
|
-
"@ainyc/canonry-integration-google-
|
|
100
|
+
"@ainyc/canonry-integration-google-ads": "0.0.0",
|
|
101
|
+
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
102
|
+
"@ainyc/canonry-integration-openai-ads": "0.0.0",
|
|
103
103
|
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
104
|
+
"@ainyc/canonry-integration-google-tag-manager": "0.0.0",
|
|
104
105
|
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
105
|
-
"@ainyc/canonry-integration-openai-ads": "0.0.0",
|
|
106
106
|
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
107
|
-
"@ainyc/canonry-intelligence": "0.0.0",
|
|
108
107
|
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
109
|
-
"@ainyc/canonry-provider-local": "0.0.0",
|
|
110
108
|
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
109
|
+
"@ainyc/canonry-intelligence": "0.0.0",
|
|
111
110
|
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
112
|
-
"@ainyc/canonry-provider-
|
|
111
|
+
"@ainyc/canonry-provider-local": "0.0.0",
|
|
113
112
|
"@ainyc/canonry-provider-openai": "0.0.0",
|
|
114
|
-
"@ainyc/canonry-provider-
|
|
115
|
-
"@ainyc/canonry-integration-typesafe": "0.0.0"
|
|
113
|
+
"@ainyc/canonry-provider-muse": "0.0.0",
|
|
114
|
+
"@ainyc/canonry-integration-typesafe": "0.0.0",
|
|
115
|
+
"@ainyc/canonry-provider-perplexity": "0.0.0"
|
|
116
116
|
},
|
|
117
117
|
"scripts": {
|
|
118
118
|
"build": "pnpm run build:cli && pnpm run build:web",
|