@ainyc/canonry 4.186.6 → 4.186.8
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-D1obTGKY.js → AuditHistoryPanel-9q5v4zHj.js} +1 -1
- package/assets/assets/{BacklinksPage-D_tj5Rbt.js → BacklinksPage-C2QVWfQf.js} +1 -1
- package/assets/assets/{HistoryPage-lL-CZziY.js → HistoryPage-oLCQA7-T.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-0voEYofK.js → MeasurementPropertyPage-DUYt5ceA.js} +1 -1
- package/assets/assets/ProjectPage-Dsao_AiN.js +9 -0
- package/assets/assets/{RunRow-DTeprTL3.js → RunRow-kaFXI_VP.js} +1 -1
- package/assets/assets/{RunsPage-DrAtN-Xn.js → RunsPage-CQizRJxf.js} +1 -1
- package/assets/assets/{SettingsPage-DCD1aTWP.js → SettingsPage-BHh4Y7Qg.js} +1 -1
- package/assets/assets/{SiteHealthSection-BX_ehKQW.js → SiteHealthSection-DjmPK0Tg.js} +3 -3
- package/assets/assets/{TrafficPage-PTKGMjZO.js → TrafficPage-B3N0r5gW.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-BouaEiZp.js → TrafficSourceDetailPage-C27GkPF4.js} +1 -1
- package/assets/assets/extract-error-message-DlmIEdy_.js +1 -0
- package/assets/assets/{index-AI2ypViE.js → index-DVa1lkiE.js} +20 -20
- package/assets/assets/{react-sigma_core.esm.min-CQ5k6lQz.js → react-sigma_core.esm.min-BBOzBU_n.js} +1 -1
- package/assets/index.html +1 -1
- package/dist/{chunk-V7LWMC2C.js → chunk-42P3CXIH.js} +4 -4
- package/dist/{chunk-PF5QRORD.js → chunk-7CG3QE4N.js} +1503 -1404
- package/dist/{chunk-GGEW65VE.js → chunk-7TYSFZEG.js} +2 -2
- package/dist/{chunk-PXGN7BY7.js → chunk-CFJHRXZ3.js} +2261 -2215
- package/dist/{chunk-KPNNUEM5.js → chunk-YYNL73BT.js} +18 -6
- package/dist/cli.js +28 -19
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-OVTSUKZS.js → intelligence-service-KBHLNDGO.js} +2 -2
- package/dist/mcp.js +3 -3
- package/package.json +7 -7
- package/assets/assets/ProjectPage-Bq-ncl6p.js +0 -9
- package/assets/assets/extract-error-message-DOUrsRz6.js +0 -1
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
loadConfig,
|
|
12
12
|
loadConfigRaw,
|
|
13
13
|
saveConfigPatch
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-42P3CXIH.js";
|
|
15
15
|
import {
|
|
16
16
|
CC_CACHE_DIR,
|
|
17
17
|
DUCKDB_SPEC,
|
|
@@ -158,7 +158,7 @@ import {
|
|
|
158
158
|
siteCrawlSnapshots,
|
|
159
159
|
toAlertView,
|
|
160
160
|
usageCounters
|
|
161
|
-
} from "./chunk-
|
|
161
|
+
} from "./chunk-7CG3QE4N.js";
|
|
162
162
|
import {
|
|
163
163
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
164
164
|
AGENT_PROVIDER_IDS,
|
|
@@ -299,7 +299,7 @@ import {
|
|
|
299
299
|
validationError,
|
|
300
300
|
winnabilityClassLabel,
|
|
301
301
|
withRetry
|
|
302
|
-
} from "./chunk-
|
|
302
|
+
} from "./chunk-CFJHRXZ3.js";
|
|
303
303
|
|
|
304
304
|
// src/telemetry.ts
|
|
305
305
|
import crypto from "crypto";
|
|
@@ -10778,6 +10778,16 @@ var log13 = createLogger("SiteAudit");
|
|
|
10778
10778
|
var SiteAuditCancelledError = class extends Error {
|
|
10779
10779
|
name = "SiteAuditCancelledError";
|
|
10780
10780
|
};
|
|
10781
|
+
var NON_PAGE_MEDIA_EXTENSIONS = /\.(?:jpe?g|png|gif|webp|avif|bmp|ico|tiff?|svg|mp4|webm|mov|avi|mp3|wav|ogg|woff2?|ttf|otf|eot)(?:$|\?)/i;
|
|
10782
|
+
var NON_PAGE_MEDIA_CONTENT_TYPE = /^(?:image|video|audio|font)\//i;
|
|
10783
|
+
function isNonPageMedia(page) {
|
|
10784
|
+
if (page.contentType && NON_PAGE_MEDIA_CONTENT_TYPE.test(page.contentType.trim())) return true;
|
|
10785
|
+
try {
|
|
10786
|
+
return NON_PAGE_MEDIA_EXTENSIONS.test(new URL(page.requestedUrl).pathname);
|
|
10787
|
+
} catch {
|
|
10788
|
+
return NON_PAGE_MEDIA_EXTENSIONS.test(page.requestedUrl);
|
|
10789
|
+
}
|
|
10790
|
+
}
|
|
10781
10791
|
function toHomepageUrl(canonicalDomain) {
|
|
10782
10792
|
const trimmed = canonicalDomain.trim().replace(/\/+$/, "");
|
|
10783
10793
|
return /^https?:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`;
|
|
@@ -11083,8 +11093,10 @@ async function executeSiteAudit(db, runId, projectId, opts = {}) {
|
|
|
11083
11093
|
};
|
|
11084
11094
|
const persistPages = (tx, pages, now) => {
|
|
11085
11095
|
const changedUrls = /* @__PURE__ */ new Set();
|
|
11086
|
-
for (const page of pages)
|
|
11087
|
-
|
|
11096
|
+
for (const page of pages) observedPages.set(page.key, page);
|
|
11097
|
+
const pageNodes = pages.filter((page) => !isNonPageMedia(page));
|
|
11098
|
+
for (const page of pageNodes) registerPageNode(page, changedUrls);
|
|
11099
|
+
for (const page of pageNodes) persistPage(tx, page, now);
|
|
11088
11100
|
bindReferences(tx, changedUrls, now);
|
|
11089
11101
|
};
|
|
11090
11102
|
const edgePlacementColumns = (edge) => ({
|
|
@@ -11909,7 +11921,7 @@ function readStoredGroundingSources(rawResponse) {
|
|
|
11909
11921
|
return result;
|
|
11910
11922
|
}
|
|
11911
11923
|
async function backfillInsightsCommand(project, opts) {
|
|
11912
|
-
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-
|
|
11924
|
+
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-KBHLNDGO.js");
|
|
11913
11925
|
const config = loadConfig();
|
|
11914
11926
|
const db = createClient(config.database);
|
|
11915
11927
|
migrate(db);
|
package/dist/cli.js
CHANGED
|
@@ -28,11 +28,11 @@ import {
|
|
|
28
28
|
trackCliCommandFinished,
|
|
29
29
|
trackEvent,
|
|
30
30
|
waitForServerRuntimeStartup
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-YYNL73BT.js";
|
|
32
32
|
import {
|
|
33
33
|
autoSyncSkills,
|
|
34
34
|
formatAutoSyncNotice
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-7TYSFZEG.js";
|
|
36
36
|
import {
|
|
37
37
|
CliError,
|
|
38
38
|
EXIT_SYSTEM_ERROR,
|
|
@@ -58,7 +58,7 @@ import {
|
|
|
58
58
|
saveConfigPatch,
|
|
59
59
|
systemError,
|
|
60
60
|
usageError
|
|
61
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-42P3CXIH.js";
|
|
62
62
|
import {
|
|
63
63
|
CLOUDFLARE_WORKER_BINDINGS,
|
|
64
64
|
CLOUDFLARE_WORKER_GENERATED_MARKER,
|
|
@@ -72,7 +72,7 @@ import {
|
|
|
72
72
|
projects,
|
|
73
73
|
queries,
|
|
74
74
|
renderReportHtml
|
|
75
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-7CG3QE4N.js";
|
|
76
76
|
import {
|
|
77
77
|
AdsDeliverySnapshotStatuses,
|
|
78
78
|
AdsHistoricalCampaignRollupStatuses,
|
|
@@ -141,9 +141,11 @@ import {
|
|
|
141
141
|
queryTrackingCommitRequestSchema,
|
|
142
142
|
queryTrackingPreviewRequestSchema,
|
|
143
143
|
resolveProviderInput,
|
|
144
|
+
shareOfVoiceLabel,
|
|
145
|
+
shareOfVoiceReason,
|
|
144
146
|
visibilityReportRequestSchema,
|
|
145
147
|
winnabilityClassSchema
|
|
146
|
-
} from "./chunk-
|
|
148
|
+
} from "./chunk-CFJHRXZ3.js";
|
|
147
149
|
|
|
148
150
|
// src/cli.ts
|
|
149
151
|
import { pathToFileURL } from "url";
|
|
@@ -7605,24 +7607,29 @@ function printCompetitorLandscape(data) {
|
|
|
7605
7607
|
console.log(
|
|
7606
7608
|
data.filters.queryClass === "all" ? "Share of voice is blank: branded and non-brand queries are pooled here. Add --query-class non-brand for a ratio." : `Counting ${data.filters.queryClass} queries only.`
|
|
7607
7609
|
);
|
|
7610
|
+
if (data.reason) console.log(shareOfVoiceReason(data.reason));
|
|
7608
7611
|
if (data.truncated) console.log("Top 100 observed competitors and top 100 other cited sources shown; pinned competitors are complete.");
|
|
7609
7612
|
console.log("");
|
|
7610
|
-
printLandscapeRows("Your brand", [data.project]);
|
|
7611
|
-
printLandscapeRows("Pinned competitors", data.pinned);
|
|
7612
|
-
printLandscapeRows("Observed competitors", data.observed);
|
|
7613
|
-
printLandscapeRows("Other cited sources", data.otherSources);
|
|
7613
|
+
printLandscapeRows("Your brand", [data.project], false, data, data.filters.queryClass);
|
|
7614
|
+
printLandscapeRows("Pinned competitors", data.pinned, false, data, data.filters.queryClass);
|
|
7615
|
+
printLandscapeRows("Observed competitors", data.observed, false, data, data.filters.queryClass);
|
|
7616
|
+
printLandscapeRows("Other cited sources", data.otherSources, false, data, data.filters.queryClass);
|
|
7614
7617
|
console.log("");
|
|
7615
7618
|
console.log(
|
|
7616
7619
|
`Evidence: ${data.evidence.answeredResults} answer-text result(s), ${data.evidence.sourceResults} source result(s); excluded: ${data.evidence.excludedProbeResults} probe, ${data.evidence.excludedNonCompletedResults} non-completed.`
|
|
7617
7620
|
);
|
|
7618
|
-
if (data.
|
|
7621
|
+
if (data.observedNames?.length) {
|
|
7622
|
+
console.log("Names observed in answers (not a comparison set):");
|
|
7623
|
+
for (const row of data.observedNames) console.log(` ${row.name} \xB7 ${row.answerCount} answers`);
|
|
7624
|
+
}
|
|
7625
|
+
if (data.modelComparison) printModelComparison(data.modelComparison, data.filters.queryClass);
|
|
7619
7626
|
}
|
|
7620
7627
|
function describeServedModels(evidence) {
|
|
7621
7628
|
if (evidence.status === "unknown") return "Unknown (not disclosed)";
|
|
7622
7629
|
if (evidence.status === "known") return evidence.model;
|
|
7623
7630
|
return [...evidence.models, ...evidence.includesUnknown ? ["Unknown (not disclosed)"] : []].join(", ");
|
|
7624
7631
|
}
|
|
7625
|
-
function printModelComparison(comparison) {
|
|
7632
|
+
function printModelComparison(comparison, queryClass) {
|
|
7626
7633
|
console.log("");
|
|
7627
7634
|
console.log(`Model comparison \xB7 requested-model basis \xB7 ${comparison.groups.length} of ${comparison.totalGroups} groups`);
|
|
7628
7635
|
console.log("Groups use stored observations. They do not form a matched-query or equal-weight comparison.");
|
|
@@ -7632,21 +7639,22 @@ function printModelComparison(comparison) {
|
|
|
7632
7639
|
console.log(`${group.provider} \xB7 requested model: ${group.model ?? "Unknown (not recorded)"}`);
|
|
7633
7640
|
console.log(`Served model evidence: ${describeServedModels(group.servedModels)}`);
|
|
7634
7641
|
console.log(`Samples: ${group.snapshotCount} snapshot(s), ${group.evidence.answeredResults} answer-text result(s), ${group.evidence.sourceResults} source result(s).`);
|
|
7635
|
-
|
|
7636
|
-
printLandscapeRows("
|
|
7637
|
-
printLandscapeRows("
|
|
7638
|
-
printLandscapeRows("
|
|
7642
|
+
if (group.reason) console.log(shareOfVoiceReason(group.reason));
|
|
7643
|
+
printLandscapeRows("Your brand", [group.project], true, group, queryClass);
|
|
7644
|
+
printLandscapeRows("Pinned competitors", group.pinned, true, group, queryClass);
|
|
7645
|
+
printLandscapeRows("Observed competitors", group.observed, true, group, queryClass);
|
|
7646
|
+
printLandscapeRows("Other cited sources", group.otherSources, true, group, queryClass);
|
|
7639
7647
|
if (group.truncated) console.log("Top 100 observed competitors and top 100 other sources shown. Pinned competitors are complete.");
|
|
7640
7648
|
}
|
|
7641
7649
|
}
|
|
7642
|
-
function printLandscapeRows(heading, rows, showSampleCount = false) {
|
|
7650
|
+
function printLandscapeRows(heading, rows, showSampleCount = false, context, queryClass = "all") {
|
|
7643
7651
|
console.log(`${heading}:`);
|
|
7644
7652
|
if (rows.length === 0) {
|
|
7645
7653
|
console.log(" \u2014");
|
|
7646
7654
|
return;
|
|
7647
7655
|
}
|
|
7648
7656
|
for (const row of rows) {
|
|
7649
|
-
const sov = row.shareOfVoice
|
|
7657
|
+
const sov = `${shareOfVoiceLabel(row.shareOfVoice, context)} \xB7 ${queryClass} queries`;
|
|
7650
7658
|
console.log(` ${row.domain} mention ${row.mentionCount} \xB7 citation ${row.citationCount} \xB7 SOV ${sov}${showSampleCount ? ` \xB7 answers ${row.answeredResults}` : ""}`);
|
|
7651
7659
|
}
|
|
7652
7660
|
}
|
|
@@ -16955,11 +16963,12 @@ function printVisibilityStats(data) {
|
|
|
16955
16963
|
const sov = data.shareOfVoice;
|
|
16956
16964
|
if (sov) {
|
|
16957
16965
|
console.log("");
|
|
16958
|
-
const pctStr = sov.percent !== null ? `${sov.percent}%` : sov.competitorCount === 0 ? "\u2014 (no competitors configured)" : sov.snapshotsWithAnswerText === 0 ? "\u2014 (no answer text in scope)" : "\u2014 (no brands mentioned in scope)";
|
|
16966
|
+
const pctStr = sov.availability !== void 0 ? shareOfVoiceLabel(sov.percent, sov) : sov.percent !== null ? `${sov.percent}%` : sov.competitorCount === 0 ? "\u2014 (no competitors configured)" : sov.snapshotsWithAnswerText === 0 ? "\u2014 (no answer text in scope)" : "\u2014 (no brands mentioned in scope)";
|
|
16959
16967
|
const scope = sov.queryClass === "pooled" ? "pooled queries \xB7 classification unavailable" : `${sov.queryClass} queries`;
|
|
16960
16968
|
console.log(
|
|
16961
|
-
`Share of voice (${scope}): ${pctStr} (you ${sov.projectMentions} vs competitors ${sov.competitorMentions} brand mentions across ${sov.snapshotsWithAnswerText} answers)`
|
|
16969
|
+
`Share of voice (${scope}${sov.measurementScope === "all-markets" ? " \xB7 all markets" : ""}): ${pctStr} (you ${sov.projectMentions} vs competitors ${sov.competitorMentions} brand mentions across ${sov.snapshotsWithAnswerText} answers)`
|
|
16962
16970
|
);
|
|
16971
|
+
if (sov.reason) console.log(` ${shareOfVoiceReason(sov.reason)}`);
|
|
16963
16972
|
if (sov.queryClass === "non-brand") {
|
|
16964
16973
|
console.log(" branded queries excluded on purpose \u2014 re-run with --query-class branded for brand recall");
|
|
16965
16974
|
}
|
package/dist/index.js
CHANGED
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
createGoogleMarketingCredentialStore,
|
|
4
4
|
createGoogleMarketingRuntime,
|
|
5
5
|
createServer
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-YYNL73BT.js";
|
|
7
7
|
import {
|
|
8
8
|
loadConfig
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-42P3CXIH.js";
|
|
10
|
+
import "./chunk-7CG3QE4N.js";
|
|
11
|
+
import "./chunk-CFJHRXZ3.js";
|
|
12
12
|
export {
|
|
13
13
|
GoogleMarketingRuntimeError,
|
|
14
14
|
createGoogleMarketingCredentialStore,
|
package/dist/mcp.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
autoSyncSkills
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7TYSFZEG.js";
|
|
4
4
|
import {
|
|
5
5
|
createApiClient,
|
|
6
6
|
createCanonryMcpServer
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-42P3CXIH.js";
|
|
8
8
|
import {
|
|
9
9
|
isReadOnlyKey
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-CFJHRXZ3.js";
|
|
11
11
|
|
|
12
12
|
// src/mcp/cli.ts
|
|
13
13
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ainyc/canonry",
|
|
3
|
-
"version": "4.186.
|
|
3
|
+
"version": "4.186.8",
|
|
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
|
"license": "FSL-1.1-ALv2",
|
|
@@ -71,31 +71,31 @@
|
|
|
71
71
|
"tsup": "^8.5.1",
|
|
72
72
|
"tsx": "^4.19.0",
|
|
73
73
|
"@ainyc/canonry-web": "0.0.0",
|
|
74
|
-
"@ainyc/canonry-api-routes": "0.0.0",
|
|
75
74
|
"@ainyc/canonry-api-client": "0.0.0",
|
|
75
|
+
"@ainyc/canonry-api-routes": "0.0.0",
|
|
76
76
|
"@ainyc/canonry-config": "0.0.0",
|
|
77
77
|
"@ainyc/canonry-contracts": "0.0.0",
|
|
78
78
|
"@ainyc/canonry-db": "0.0.0",
|
|
79
79
|
"@ainyc/canonry-integration-bing": "0.0.0",
|
|
80
80
|
"@ainyc/canonry-integration-cloud-run": "0.0.0",
|
|
81
|
-
"@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
|
|
82
81
|
"@ainyc/canonry-integration-cloudflare-worker": "0.0.0",
|
|
82
|
+
"@ainyc/canonry-integration-cloudflare-queue": "0.0.0",
|
|
83
83
|
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
84
84
|
"@ainyc/canonry-integration-google": "0.0.0",
|
|
85
85
|
"@ainyc/canonry-integration-google-ads": "0.0.0",
|
|
86
|
-
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
87
86
|
"@ainyc/canonry-integration-google-tag-manager": "0.0.0",
|
|
87
|
+
"@ainyc/canonry-integration-google-places": "0.0.0",
|
|
88
88
|
"@ainyc/canonry-integration-openai-ads": "0.0.0",
|
|
89
89
|
"@ainyc/canonry-integration-traffic": "0.0.0",
|
|
90
|
-
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
91
90
|
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
91
|
+
"@ainyc/canonry-integration-google-business-profile": "0.0.0",
|
|
92
92
|
"@ainyc/canonry-intelligence": "0.0.0",
|
|
93
|
+
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
93
94
|
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
94
95
|
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
95
96
|
"@ainyc/canonry-provider-local": "0.0.0",
|
|
96
97
|
"@ainyc/canonry-provider-openai": "0.0.0",
|
|
97
|
-
"@ainyc/canonry-provider-perplexity": "0.0.0"
|
|
98
|
-
"@ainyc/canonry-provider-cdp": "0.0.0"
|
|
98
|
+
"@ainyc/canonry-provider-perplexity": "0.0.0"
|
|
99
99
|
},
|
|
100
100
|
"scripts": {
|
|
101
101
|
"build": "pnpm run build:cli && pnpm run build:web",
|