@canonry/canonry 5.22.0 → 5.29.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/README.md +2 -1
- package/assets/agent-workspace/skills/aero/SKILL.md +37 -3
- package/assets/agent-workspace/skills/aero/references/portfolio-analysis.md +26 -12
- package/assets/agent-workspace/skills/aero/references/reporting.md +1 -0
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +100 -5
- package/assets/agent-workspace/skills/canonry/references/google-business-profile.md +30 -6
- package/assets/agent-workspace/skills/canonry/references/indexing.md +1 -0
- package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +30 -0
- package/assets/assets/{AuditHistoryPanel-teTDC-4-.js → AuditHistoryPanel-ru-RI1SR.js} +1 -1
- package/assets/assets/{BacklinksPage-Bqm7bido.js → BacklinksPage-BbVWtfAh.js} +1 -1
- package/assets/assets/ChartPrimitives-B5okB5g-.js +1 -0
- package/assets/assets/{HistoryPage-IcqwPBmt.js → HistoryPage-CxIxsxIv.js} +1 -1
- package/assets/assets/MeasurementPropertyPage-Oju3oAP3.js +1 -0
- package/assets/assets/ProjectPage-ZsQo28yM.js +8 -0
- package/assets/assets/{RunRow-S_SCHr0o.js → RunRow-D73cbxey.js} +1 -1
- package/assets/assets/{RunsPage-DFiif626.js → RunsPage-D9hOl6k6.js} +1 -1
- package/assets/assets/{SettingsPage-CitZ6FAS.js → SettingsPage-By5cJJaC.js} +1 -1
- package/assets/assets/SiteHealthSection-Gfyispq_.js +4 -0
- package/assets/assets/{TrafficPage-lY8na5Pg.js → TrafficPage-8khxNXDL.js} +2 -2
- package/assets/assets/{TrafficSourceDetailPage-BTykoVGT.js → TrafficSourceDetailPage-FDe4jKLH.js} +1 -1
- package/assets/assets/{extract-error-message-r0Gpc7mv.js → extract-error-message-Co1hxrsc.js} +1 -1
- package/assets/assets/index-DKScDg92.js +86 -0
- package/assets/assets/index-DfhmHULl.css +1 -0
- package/assets/assets/{react-sigma_core.esm.min-DDrDxbO1.js → react-sigma_core.esm.min-DxAxqyeI.js} +1 -1
- package/assets/assets/{v2-overview-adapter-OsQiglXU.js → v2-overview-adapter-DNbOwIJq.js} +1 -1
- package/assets/index.html +2 -2
- package/dist/{chunk-XFHXKLNT.js → chunk-7BW7BAD5.js} +3727 -1282
- package/dist/{chunk-S5OSY3PI.js → chunk-DCGELKRW.js} +7126 -6001
- package/dist/{chunk-DDL2XSNM.js → chunk-J6BJIOIN.js} +130 -37
- package/dist/{chunk-P5VXVFQW.js → chunk-KGYHEYHX.js} +6992 -5409
- package/dist/{chunk-3LCR6WU6.js → chunk-THMIDWMS.js} +57 -3
- package/dist/{chunk-GLLY2GEV.js → chunk-VPIOF2PB.js} +172 -7
- package/dist/{chunk-YTSXQUJ3.js → chunk-WPQB4UYX.js} +3 -3
- package/dist/cli.js +561 -158
- package/dist/{demo-server-HULNEORN.js → demo-server-EU6B4KNK.js} +24 -32
- package/dist/index.d.ts +9 -1
- package/dist/index.js +6 -6
- package/dist/{intelligence-service-CXNBKRHV.js → intelligence-service-FVUNBN66.js} +2 -2
- package/dist/mcp.js +4 -4
- package/package.json +12 -11
- package/assets/assets/ChartPrimitives-BQC2VH0O.js +0 -1
- package/assets/assets/MeasurementPropertyPage-BLpptT3_.js +0 -1
- package/assets/assets/ProjectPage-nn2Y9H-m.js +0 -8
- package/assets/assets/SiteHealthSection-C2dsyNGY.js +0 -4
- package/assets/assets/index-DwlO8KfE.js +0 -86
- package/assets/assets/index-EJC8PSbh.css +0 -1
|
@@ -5,12 +5,64 @@ import {
|
|
|
5
5
|
siteCrawlGraphNodes,
|
|
6
6
|
siteCrawlPages,
|
|
7
7
|
siteCrawlSnapshots
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-KGYHEYHX.js";
|
|
9
9
|
import {
|
|
10
10
|
SITE_CRAWL_GRAPH_MAX_EDGES,
|
|
11
11
|
SITE_CRAWL_GRAPH_MAX_NODES,
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
SiteAuditFactorStatuses,
|
|
13
|
+
TEMPLATE_LINK_RATIO_THRESHOLD,
|
|
14
|
+
factorStatusFromScore,
|
|
15
|
+
roundPreservingTotal
|
|
16
|
+
} from "./chunk-DCGELKRW.js";
|
|
17
|
+
|
|
18
|
+
// src/site-audit-factors.ts
|
|
19
|
+
function recordedSharePct(factor) {
|
|
20
|
+
return typeof factor.sharePct === "number" && Number.isFinite(factor.sharePct) ? factor.sharePct : null;
|
|
21
|
+
}
|
|
22
|
+
function computeFactorAverages(pages) {
|
|
23
|
+
const byId = /* @__PURE__ */ new Map();
|
|
24
|
+
let auditedPages = 0;
|
|
25
|
+
let everyShareRecorded = true;
|
|
26
|
+
for (const page of pages) {
|
|
27
|
+
if (!page.audit) continue;
|
|
28
|
+
auditedPages++;
|
|
29
|
+
for (const factor of page.audit.factors) {
|
|
30
|
+
const current = byId.get(factor.id) ?? { name: factor.name, weight: factor.weight, scores: [], pass: 0, partial: 0, fail: 0, shareTotal: 0 };
|
|
31
|
+
byId.set(factor.id, current);
|
|
32
|
+
current.scores.push(factor.score);
|
|
33
|
+
switch (factorStatusFromScore(factor.score)) {
|
|
34
|
+
case SiteAuditFactorStatuses.pass:
|
|
35
|
+
current.pass++;
|
|
36
|
+
break;
|
|
37
|
+
case SiteAuditFactorStatuses.partial:
|
|
38
|
+
current.partial++;
|
|
39
|
+
break;
|
|
40
|
+
case SiteAuditFactorStatuses.fail:
|
|
41
|
+
current.fail++;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
const share = recordedSharePct(factor);
|
|
45
|
+
if (share === null) everyShareRecorded = false;
|
|
46
|
+
else current.shareTotal += share;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const rollups = [...byId.entries()].map(([id, value]) => ({ id, ...value })).sort((a, b) => b.weight - a.weight || a.name.localeCompare(b.name));
|
|
50
|
+
const shares = everyShareRecorded && auditedPages > 0 ? roundPreservingTotal(rollups.map((rollup) => rollup.shareTotal / auditedPages), 1) : null;
|
|
51
|
+
return rollups.map((rollup, index) => {
|
|
52
|
+
const avgScore = Math.round(rollup.scores.reduce((sum, score) => sum + score, 0) / rollup.scores.length);
|
|
53
|
+
return {
|
|
54
|
+
id: rollup.id,
|
|
55
|
+
name: rollup.name,
|
|
56
|
+
weight: rollup.weight,
|
|
57
|
+
sharePct: shares?.[index] ?? null,
|
|
58
|
+
avgScore,
|
|
59
|
+
status: factorStatusFromScore(avgScore),
|
|
60
|
+
pagesPassing: rollup.pass,
|
|
61
|
+
pagesPartial: rollup.partial,
|
|
62
|
+
pagesFailing: rollup.fail
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
}
|
|
14
66
|
|
|
15
67
|
// src/site-crawl-graph-layout.ts
|
|
16
68
|
import crypto from "crypto";
|
|
@@ -645,6 +697,8 @@ function deleteSiteCrawlGraphLayout(db, scope) {
|
|
|
645
697
|
}
|
|
646
698
|
|
|
647
699
|
export {
|
|
700
|
+
recordedSharePct,
|
|
701
|
+
computeFactorAverages,
|
|
648
702
|
layoutSiteCrawlGraphInput,
|
|
649
703
|
prepareSiteCrawlGraphLayout,
|
|
650
704
|
persistSiteCrawlGraphLayout,
|
|
@@ -5,12 +5,14 @@ import {
|
|
|
5
5
|
PACKAGE_VERSION,
|
|
6
6
|
canonryMcpTools,
|
|
7
7
|
isMachineFormat
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-J6BJIOIN.js";
|
|
9
9
|
import {
|
|
10
10
|
AGENT_PROVIDER_IDS,
|
|
11
11
|
CANONRY_NPM_PACKAGE_URL,
|
|
12
12
|
CodingAgents,
|
|
13
13
|
DEFAULT_VIEWER_RESEARCH_DAILY_RUN_LIMIT,
|
|
14
|
+
OPERATIONAL_LOG_FIELDS_HEADER,
|
|
15
|
+
OPERATIONAL_LOG_OPT_IN_CONTEXT_FIELDS,
|
|
14
16
|
RESEARCH_RUN_SCOPE,
|
|
15
17
|
SKILL_MANIFEST_FILENAME,
|
|
16
18
|
SkillsClients,
|
|
@@ -30,6 +32,9 @@ import {
|
|
|
30
32
|
isStrictSemver,
|
|
31
33
|
normalizeAgentSlug,
|
|
32
34
|
normalizeTelemetryStatus,
|
|
35
|
+
operationalLogListReadSchema,
|
|
36
|
+
providerBatchConfigSchema,
|
|
37
|
+
providerPricingSchema,
|
|
33
38
|
providerQuotaPolicySchema,
|
|
34
39
|
resolveProviderModel,
|
|
35
40
|
restrictedWriteScopes,
|
|
@@ -37,7 +42,7 @@ import {
|
|
|
37
42
|
skillsClientSchema,
|
|
38
43
|
upgradeCaveatFor,
|
|
39
44
|
upgradeCommandFor
|
|
40
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-DCGELKRW.js";
|
|
41
46
|
|
|
42
47
|
// src/config.ts
|
|
43
48
|
import fs from "fs";
|
|
@@ -99,6 +104,13 @@ var envSchema = z.object({
|
|
|
99
104
|
PERPLEXITY_MAX_CONCURRENCY: z.coerce.number().int().positive().default(2),
|
|
100
105
|
PERPLEXITY_MAX_REQUESTS_PER_MINUTE: z.coerce.number().int().positive().default(10),
|
|
101
106
|
PERPLEXITY_MAX_REQUESTS_PER_DAY: z.coerce.number().int().positive().default(1e3),
|
|
107
|
+
// Meta Muse
|
|
108
|
+
MUSE_API_KEY: z.string().optional(),
|
|
109
|
+
MUSE_MODEL: z.string().optional(),
|
|
110
|
+
MUSE_BASE_URL: z.string().optional(),
|
|
111
|
+
MUSE_MAX_CONCURRENCY: z.coerce.number().int().positive().default(2),
|
|
112
|
+
MUSE_MAX_REQUESTS_PER_MINUTE: z.coerce.number().int().positive().default(10),
|
|
113
|
+
MUSE_MAX_REQUESTS_PER_DAY: z.coerce.number().int().positive().default(1e3),
|
|
102
114
|
// Secret for HMAC-signing Google OAuth state parameters. Required for
|
|
103
115
|
// cloud deployments that mount googleRoutes; the plugin refuses to register
|
|
104
116
|
// without it (see packages/api-routes/src/google.ts).
|
|
@@ -123,6 +135,9 @@ var bootstrapEnvSchema = z.object({
|
|
|
123
135
|
ANTHROPIC_MODEL: z.string().optional(),
|
|
124
136
|
PERPLEXITY_API_KEY: z.string().optional(),
|
|
125
137
|
PERPLEXITY_MODEL: z.string().optional(),
|
|
138
|
+
MUSE_API_KEY: z.string().optional(),
|
|
139
|
+
MUSE_MODEL: z.string().optional(),
|
|
140
|
+
MUSE_BASE_URL: z.string().optional(),
|
|
126
141
|
LOCAL_BASE_URL: z.string().optional(),
|
|
127
142
|
LOCAL_API_KEY: z.string().optional(),
|
|
128
143
|
LOCAL_MODEL: z.string().optional(),
|
|
@@ -182,6 +197,19 @@ function getBootstrapEnv(source, overrides) {
|
|
|
182
197
|
})
|
|
183
198
|
};
|
|
184
199
|
}
|
|
200
|
+
const museKey = parsed.MUSE_API_KEY?.trim();
|
|
201
|
+
if (museKey) {
|
|
202
|
+
providers.muse = {
|
|
203
|
+
apiKey: museKey,
|
|
204
|
+
model: parsed.MUSE_MODEL?.trim() || "muse-spark-1.3",
|
|
205
|
+
baseUrl: parsed.MUSE_BASE_URL?.trim() || void 0,
|
|
206
|
+
quota: providerQuotaPolicySchema.parse({
|
|
207
|
+
maxConcurrency: 2,
|
|
208
|
+
maxRequestsPerMinute: 10,
|
|
209
|
+
maxRequestsPerDay: 500
|
|
210
|
+
})
|
|
211
|
+
};
|
|
212
|
+
}
|
|
185
213
|
if (parsed.LOCAL_BASE_URL) {
|
|
186
214
|
providers.local = {
|
|
187
215
|
baseUrl: parsed.LOCAL_BASE_URL,
|
|
@@ -204,6 +232,63 @@ function getBootstrapEnv(source, overrides) {
|
|
|
204
232
|
};
|
|
205
233
|
}
|
|
206
234
|
|
|
235
|
+
// src/provider-batch-config.ts
|
|
236
|
+
function issuesText(issues) {
|
|
237
|
+
return issues.map((issue) => issue.path.length ? `${issue.path.join(".")}: ${issue.message}` : issue.message).join("; ");
|
|
238
|
+
}
|
|
239
|
+
function normalizeProviderBatchSettings(providers, configPath) {
|
|
240
|
+
for (const [name, entry] of Object.entries(providers ?? {})) {
|
|
241
|
+
if (!entry) continue;
|
|
242
|
+
if (entry.batch !== void 0) {
|
|
243
|
+
const parsed = providerBatchConfigSchema.safeParse(entry.batch);
|
|
244
|
+
if (!parsed.success) {
|
|
245
|
+
throw new CliError({
|
|
246
|
+
code: "CONFIG_INVALID",
|
|
247
|
+
message: `Invalid config at ${configPath}: providers.${name}.batch is invalid (${issuesText(parsed.error.issues)}). Allowed keys: enabled (true/false), maxRequestsPerBatch (positive integer), deadlineHours (positive number).`
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
entry.batch = parsed.data;
|
|
251
|
+
}
|
|
252
|
+
if (entry.pricing !== void 0) {
|
|
253
|
+
const parsed = providerPricingSchema.safeParse(entry.pricing);
|
|
254
|
+
if (!parsed.success) {
|
|
255
|
+
throw new CliError({
|
|
256
|
+
code: "CONFIG_INVALID",
|
|
257
|
+
message: `Invalid config at ${configPath}: providers.${name}.pricing is invalid (${issuesText(parsed.error.issues)}). Prices are USD: inputPerMTok / cachedInputPerMTok / cacheWritePerMTok / outputPerMTok per million tokens, searchPer1k per 1,000 searches.`
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
entry.pricing = parsed.data;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
function providerConfigFromEntry(name, entry, quotaPolicy) {
|
|
265
|
+
return {
|
|
266
|
+
provider: name,
|
|
267
|
+
apiKey: entry.apiKey,
|
|
268
|
+
baseUrl: entry.baseUrl,
|
|
269
|
+
model: entry.model,
|
|
270
|
+
quotaPolicy,
|
|
271
|
+
vertexProject: entry.vertexProject,
|
|
272
|
+
vertexRegion: entry.vertexRegion,
|
|
273
|
+
vertexCredentials: entry.vertexCredentials,
|
|
274
|
+
...entry.batch ? { batch: entry.batch } : {},
|
|
275
|
+
...entry.pricing ? { pricing: entry.pricing } : {}
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
function adapterSupportsBatch(adapter) {
|
|
279
|
+
return adapter.batch !== void 0 && adapter.buildTrackedQueryRequest !== void 0 && adapter.parseTrackedQueryResponse !== void 0;
|
|
280
|
+
}
|
|
281
|
+
function batchEligibleProviderNames(registry) {
|
|
282
|
+
return registry.getAll().filter((provider) => provider.config.batch?.enabled === true && adapterSupportsBatch(provider.adapter)).map((provider) => provider.adapter.name).sort();
|
|
283
|
+
}
|
|
284
|
+
function providersWithUnsupportedBatch(providers, adapterFor) {
|
|
285
|
+
return Object.entries(providers ?? {}).filter(([name, entry]) => {
|
|
286
|
+
if (entry?.batch?.enabled !== true) return false;
|
|
287
|
+
const adapter = adapterFor(name);
|
|
288
|
+
return adapter !== void 0 && !adapterSupportsBatch(adapter);
|
|
289
|
+
}).map(([name]) => name).sort();
|
|
290
|
+
}
|
|
291
|
+
|
|
207
292
|
// src/config.ts
|
|
208
293
|
function normalizeGoogleConfig(config) {
|
|
209
294
|
if (!config.google) return;
|
|
@@ -343,6 +428,7 @@ Do not use "canonry init --force" for recovery. It replaces credentials without
|
|
|
343
428
|
}
|
|
344
429
|
};
|
|
345
430
|
}
|
|
431
|
+
normalizeProviderBatchSettings(parsed.providers, configPath);
|
|
346
432
|
normalizeGoogleConfig(parsed);
|
|
347
433
|
normalizeGoogleMarketingConfig(parsed);
|
|
348
434
|
normalizeWordpressConfig(parsed);
|
|
@@ -3655,6 +3741,18 @@ var getApiV1ProjectsByNameGoogleGscTopPages = (options) => {
|
|
|
3655
3741
|
...options
|
|
3656
3742
|
});
|
|
3657
3743
|
};
|
|
3744
|
+
var getApiV1ProjectsByNameGoogleGscQueryTotals = (options) => {
|
|
3745
|
+
return (options.client ?? client).get({
|
|
3746
|
+
security: [
|
|
3747
|
+
{
|
|
3748
|
+
scheme: "bearer",
|
|
3749
|
+
type: "http"
|
|
3750
|
+
}
|
|
3751
|
+
],
|
|
3752
|
+
url: "/api/v1/projects/{name}/google/gsc/query-totals",
|
|
3753
|
+
...options
|
|
3754
|
+
});
|
|
3755
|
+
};
|
|
3658
3756
|
var postApiV1ProjectsByNameGoogleGscInspect = (options) => {
|
|
3659
3757
|
return (options.client ?? client).post({
|
|
3660
3758
|
security: [
|
|
@@ -3931,6 +4029,18 @@ var getApiV1ProjectsByNameGbpPlaces = (options) => {
|
|
|
3931
4029
|
...options
|
|
3932
4030
|
});
|
|
3933
4031
|
};
|
|
4032
|
+
var getApiV1ProjectsByNameGbpReviews = (options) => {
|
|
4033
|
+
return (options.client ?? client).get({
|
|
4034
|
+
security: [
|
|
4035
|
+
{
|
|
4036
|
+
scheme: "bearer",
|
|
4037
|
+
type: "http"
|
|
4038
|
+
}
|
|
4039
|
+
],
|
|
4040
|
+
url: "/api/v1/projects/{name}/gbp/reviews",
|
|
4041
|
+
...options
|
|
4042
|
+
});
|
|
4043
|
+
};
|
|
3934
4044
|
var getApiV1ProjectsByNameGbpSummary = (options) => {
|
|
3935
4045
|
return (options.client ?? client).get({
|
|
3936
4046
|
security: [
|
|
@@ -5515,6 +5625,18 @@ var getApiV1ProjectsByNameTrafficSourcesById = (options) => {
|
|
|
5515
5625
|
...options
|
|
5516
5626
|
});
|
|
5517
5627
|
};
|
|
5628
|
+
var getApiV1ProjectsByNameTrafficReferralAssessment = (options) => {
|
|
5629
|
+
return (options.client ?? client).get({
|
|
5630
|
+
security: [
|
|
5631
|
+
{
|
|
5632
|
+
scheme: "bearer",
|
|
5633
|
+
type: "http"
|
|
5634
|
+
}
|
|
5635
|
+
],
|
|
5636
|
+
url: "/api/v1/projects/{name}/traffic/referral-assessment",
|
|
5637
|
+
...options
|
|
5638
|
+
});
|
|
5639
|
+
};
|
|
5518
5640
|
var getApiV1ProjectsByNameTrafficEvents = (options) => {
|
|
5519
5641
|
return (options.client ?? client).get({
|
|
5520
5642
|
security: [
|
|
@@ -7157,8 +7279,18 @@ var ApiClient = class {
|
|
|
7157
7279
|
async getTelemetry() {
|
|
7158
7280
|
return normalizeTelemetryStatus(await this.invoke(() => getApiV1Telemetry({ client: this.heyClient })));
|
|
7159
7281
|
}
|
|
7282
|
+
/**
|
|
7283
|
+
* Asks for every opt-in context field this build can read (older servers
|
|
7284
|
+
* ignore the header), then reads the page with the tolerant schema, so a
|
|
7285
|
+
* field added by a newer server is dropped rather than rejecting the page.
|
|
7286
|
+
*/
|
|
7160
7287
|
async listOperationalLogs(query = {}) {
|
|
7161
|
-
|
|
7288
|
+
const page = await this.invoke(() => getApiV1OperationsLogs({
|
|
7289
|
+
client: this.heyClient,
|
|
7290
|
+
query,
|
|
7291
|
+
headers: { [OPERATIONAL_LOG_FIELDS_HEADER]: OPERATIONAL_LOG_OPT_IN_CONTEXT_FIELDS.join(",") }
|
|
7292
|
+
}));
|
|
7293
|
+
return operationalLogListReadSchema.parse(page);
|
|
7162
7294
|
}
|
|
7163
7295
|
async updateTelemetry(enabled) {
|
|
7164
7296
|
return normalizeTelemetryStatus(await this.invoke(() => putApiV1Telemetry({ client: this.heyClient, body: { enabled } })));
|
|
@@ -7830,6 +7962,19 @@ var ApiClient = class {
|
|
|
7830
7962
|
})
|
|
7831
7963
|
);
|
|
7832
7964
|
}
|
|
7965
|
+
async listGbpReviews(project, opts) {
|
|
7966
|
+
const query = {};
|
|
7967
|
+
if (opts?.locationName) query.locationName = opts.locationName;
|
|
7968
|
+
if (opts?.negative !== void 0) query.negative = String(opts.negative);
|
|
7969
|
+
if (opts?.limit !== void 0) query.limit = String(opts.limit);
|
|
7970
|
+
return this.invoke(
|
|
7971
|
+
() => getApiV1ProjectsByNameGbpReviews({
|
|
7972
|
+
client: this.heyClient,
|
|
7973
|
+
path: { name: project },
|
|
7974
|
+
query: Object.keys(query).length > 0 ? query : void 0
|
|
7975
|
+
})
|
|
7976
|
+
);
|
|
7977
|
+
}
|
|
7833
7978
|
async getGbpSummary(project, opts) {
|
|
7834
7979
|
return this.invoke(
|
|
7835
7980
|
() => getApiV1ProjectsByNameGbpSummary({
|
|
@@ -7876,6 +8021,15 @@ var ApiClient = class {
|
|
|
7876
8021
|
})
|
|
7877
8022
|
);
|
|
7878
8023
|
}
|
|
8024
|
+
async gscQueryTotals(project, params) {
|
|
8025
|
+
return this.invoke(
|
|
8026
|
+
() => getApiV1ProjectsByNameGoogleGscQueryTotals({
|
|
8027
|
+
client: this.heyClient,
|
|
8028
|
+
path: { name: project },
|
|
8029
|
+
query: params
|
|
8030
|
+
})
|
|
8031
|
+
);
|
|
8032
|
+
}
|
|
7879
8033
|
async gscInspect(project, url) {
|
|
7880
8034
|
return this.invoke(
|
|
7881
8035
|
() => postApiV1ProjectsByNameGoogleGscInspect({
|
|
@@ -8250,6 +8404,13 @@ var ApiClient = class {
|
|
|
8250
8404
|
})
|
|
8251
8405
|
);
|
|
8252
8406
|
}
|
|
8407
|
+
async trafficReferralAssessment(project, query) {
|
|
8408
|
+
return this.invoke(() => getApiV1ProjectsByNameTrafficReferralAssessment({
|
|
8409
|
+
client: this.heyClient,
|
|
8410
|
+
path: { name: project },
|
|
8411
|
+
query
|
|
8412
|
+
}));
|
|
8413
|
+
}
|
|
8253
8414
|
async trafficListEvents(project, params) {
|
|
8254
8415
|
return this.invoke(
|
|
8255
8416
|
() => getApiV1ProjectsByNameTrafficEvents({
|
|
@@ -9141,7 +9302,7 @@ var CANONRY_MCP_TOOLKITS = [
|
|
|
9141
9302
|
{
|
|
9142
9303
|
name: "gsc",
|
|
9143
9304
|
title: "Google Search Console",
|
|
9144
|
-
description: "Read GSC performance, inspections, coverage, sitemaps, and deindexed URLs.",
|
|
9305
|
+
description: "Read GSC performance, per-query totals, inspections, coverage, sitemaps, and deindexed URLs.",
|
|
9145
9306
|
whenToLoad: "Load when you need indexing, coverage, or sitemap data from Google Search Console."
|
|
9146
9307
|
},
|
|
9147
9308
|
{
|
|
@@ -9153,7 +9314,7 @@ var CANONRY_MCP_TOOLKITS = [
|
|
|
9153
9314
|
{
|
|
9154
9315
|
name: "gbp",
|
|
9155
9316
|
title: "Google Business Profile",
|
|
9156
|
-
description: "Local AEO signals: discover GBP locations under a connected account and toggle which ones sync
|
|
9317
|
+
description: "Local AEO signals: discover GBP locations under a connected account and toggle which ones sync, then read daily performance metrics, search keywords, booking links, hotel and owner-set attributes, the public Places listing, and reviews with their alert state.",
|
|
9157
9318
|
whenToLoad: "Load when the project tracks local search visibility or has connected Google Business Profile."
|
|
9158
9319
|
},
|
|
9159
9320
|
{
|
|
@@ -9183,8 +9344,8 @@ var CANONRY_MCP_TOOLKITS = [
|
|
|
9183
9344
|
{
|
|
9184
9345
|
name: "traffic",
|
|
9185
9346
|
title: "Server-side traffic ingestion",
|
|
9186
|
-
description: "
|
|
9187
|
-
whenToLoad: "Load when you need server-log evidence of crawler hits or AI-referral sessions (e.g. confirming GPTBot or ChatGPT-User on a page), or when wiring up / syncing a
|
|
9347
|
+
description: "Read crawler / AI-referral hourly rollups straight from server logs (no GA dependency), assess AI-referral bursts from stored evidence (raw counts, candidate bursts, a separate adjusted estimate, coverage limits), connect Cloud Run / WordPress / Vercel sources, trigger syncs, and backfill Cloud Run / Vercel windows.",
|
|
9348
|
+
whenToLoad: "Load when you need server-log evidence of crawler hits or AI-referral sessions (e.g. confirming GPTBot or ChatGPT-User on a page), when reviewing candidate AI-referral bursts before quoting server-side AI referral totals, or when wiring up / syncing a traffic source."
|
|
9188
9349
|
},
|
|
9189
9350
|
{
|
|
9190
9351
|
name: "agent",
|
|
@@ -9985,6 +10146,10 @@ export {
|
|
|
9985
10146
|
dashboardManagedRunKindsSchema,
|
|
9986
10147
|
resolveOperatorApiKeyIds,
|
|
9987
10148
|
getBootstrapEnv,
|
|
10149
|
+
providerConfigFromEntry,
|
|
10150
|
+
adapterSupportsBatch,
|
|
10151
|
+
batchEligibleProviderNames,
|
|
10152
|
+
providersWithUnsupportedBatch,
|
|
9988
10153
|
getConfigDir,
|
|
9989
10154
|
getConfigPath,
|
|
9990
10155
|
loadConfig,
|
|
@@ -4,14 +4,14 @@ import {
|
|
|
4
4
|
installSkills,
|
|
5
5
|
loadConfigRaw,
|
|
6
6
|
saveConfigPatch
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-VPIOF2PB.js";
|
|
8
8
|
import {
|
|
9
9
|
PACKAGE_VERSION
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-J6BJIOIN.js";
|
|
11
11
|
import {
|
|
12
12
|
SKILL_MANIFEST_FILENAME,
|
|
13
13
|
SkillsClients
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-DCGELKRW.js";
|
|
15
15
|
|
|
16
16
|
// src/skills-autosync.ts
|
|
17
17
|
import fs from "fs";
|