@ainyc/canonry 3.2.1 → 3.2.2
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/index-B8epngdo.js +302 -0
- package/assets/assets/index-CQGbgHZY.css +1 -0
- package/assets/index.html +2 -2
- package/dist/{chunk-QJPPK4WW.js → chunk-QA5HRDRS.js} +98 -23
- package/dist/{chunk-TUXS2Y6C.js → chunk-TBFRAJU2.js} +13 -4
- package/dist/cli.js +12 -6
- package/dist/index.js +2 -2
- package/dist/mcp.js +1 -1
- package/package.json +8 -8
- package/assets/assets/index-D6R1HCPk.js +0 -302
- package/assets/assets/index-DZm9xxNs.css +0 -1
|
@@ -62,7 +62,7 @@ import {
|
|
|
62
62
|
visibilityStateFromAnswerMentioned,
|
|
63
63
|
windowCutoff,
|
|
64
64
|
wordpressEnvSchema
|
|
65
|
-
} from "./chunk-
|
|
65
|
+
} from "./chunk-TBFRAJU2.js";
|
|
66
66
|
import {
|
|
67
67
|
IntelligenceService,
|
|
68
68
|
agentMemory,
|
|
@@ -11033,7 +11033,7 @@ async function wordpressRoutes(app, opts) {
|
|
|
11033
11033
|
|
|
11034
11034
|
// ../api-routes/src/backlinks.ts
|
|
11035
11035
|
import crypto18 from "crypto";
|
|
11036
|
-
import { and as
|
|
11036
|
+
import { and as and10, asc as asc2, desc as desc10, eq as eq21, sql as sql6 } from "drizzle-orm";
|
|
11037
11037
|
|
|
11038
11038
|
// ../integration-commoncrawl/src/constants.ts
|
|
11039
11039
|
import os2 from "os";
|
|
@@ -11429,6 +11429,35 @@ function pruneCachedRelease(release, opts = {}) {
|
|
|
11429
11429
|
fs5.rmSync(dir, { recursive: true, force: true });
|
|
11430
11430
|
}
|
|
11431
11431
|
|
|
11432
|
+
// ../api-routes/src/backlinks-filter.ts
|
|
11433
|
+
import { and as and9, ne, notLike } from "drizzle-orm";
|
|
11434
|
+
var BACKLINK_FILTER_PATTERNS = [
|
|
11435
|
+
"*.google.com",
|
|
11436
|
+
"*.googleusercontent.com",
|
|
11437
|
+
"*.translate.goog",
|
|
11438
|
+
"*.bing.com",
|
|
11439
|
+
"*.yandex.com",
|
|
11440
|
+
"*.yandex.ru",
|
|
11441
|
+
"*.baidu.com",
|
|
11442
|
+
"*.duckduckgo.com",
|
|
11443
|
+
"*.archive.org"
|
|
11444
|
+
];
|
|
11445
|
+
function backlinkCrawlerExclusionClause() {
|
|
11446
|
+
const conditions = [];
|
|
11447
|
+
for (const pattern of BACKLINK_FILTER_PATTERNS) {
|
|
11448
|
+
if (pattern.startsWith("*.")) {
|
|
11449
|
+
const suffix = pattern.slice(2);
|
|
11450
|
+
conditions.push(ne(backlinkDomains.linkingDomain, suffix));
|
|
11451
|
+
conditions.push(notLike(backlinkDomains.linkingDomain, `%.${suffix}`));
|
|
11452
|
+
} else {
|
|
11453
|
+
conditions.push(ne(backlinkDomains.linkingDomain, pattern));
|
|
11454
|
+
}
|
|
11455
|
+
}
|
|
11456
|
+
const combined = and9(...conditions);
|
|
11457
|
+
if (!combined) throw new Error("BACKLINK_FILTER_PATTERNS is unexpectedly empty");
|
|
11458
|
+
return combined;
|
|
11459
|
+
}
|
|
11460
|
+
|
|
11432
11461
|
// ../api-routes/src/backlinks.ts
|
|
11433
11462
|
var BACKLINKS_UNSUPPORTED_MESSAGE = "Backlinks sync and install are only available from a local canonry install. Run `canonry backlinks install` locally to use this feature.";
|
|
11434
11463
|
var NON_TERMINAL_SYNC_STATUSES = /* @__PURE__ */ new Set([
|
|
@@ -11485,9 +11514,47 @@ function mapRunRow(row) {
|
|
|
11485
11514
|
};
|
|
11486
11515
|
}
|
|
11487
11516
|
function latestSummaryForProject(db, projectId, release) {
|
|
11488
|
-
const condition = release ?
|
|
11517
|
+
const condition = release ? and10(eq21(backlinkSummaries.projectId, projectId), eq21(backlinkSummaries.release, release)) : eq21(backlinkSummaries.projectId, projectId);
|
|
11489
11518
|
return db.select().from(backlinkSummaries).where(condition).orderBy(desc10(backlinkSummaries.queriedAt)).limit(1).get();
|
|
11490
11519
|
}
|
|
11520
|
+
function parseExcludeCrawlers(value) {
|
|
11521
|
+
if (!value) return false;
|
|
11522
|
+
const lower = value.toLowerCase();
|
|
11523
|
+
return lower === "1" || lower === "true" || lower === "yes";
|
|
11524
|
+
}
|
|
11525
|
+
function computeFilteredSummary(db, base) {
|
|
11526
|
+
const baseDomainCondition = and10(
|
|
11527
|
+
eq21(backlinkDomains.projectId, base.projectId),
|
|
11528
|
+
eq21(backlinkDomains.release, base.release)
|
|
11529
|
+
);
|
|
11530
|
+
const filteredCondition = and10(baseDomainCondition, backlinkCrawlerExclusionClause());
|
|
11531
|
+
const unfilteredAgg = db.select({
|
|
11532
|
+
count: sql6`count(*)`,
|
|
11533
|
+
total: sql6`coalesce(sum(${backlinkDomains.numHosts}), 0)`
|
|
11534
|
+
}).from(backlinkDomains).where(baseDomainCondition).get();
|
|
11535
|
+
const filteredAgg = db.select({
|
|
11536
|
+
count: sql6`count(*)`,
|
|
11537
|
+
total: sql6`coalesce(sum(${backlinkDomains.numHosts}), 0)`
|
|
11538
|
+
}).from(backlinkDomains).where(filteredCondition).get();
|
|
11539
|
+
const top10Rows = db.select({ numHosts: backlinkDomains.numHosts }).from(backlinkDomains).where(filteredCondition).orderBy(desc10(backlinkDomains.numHosts)).limit(10).all();
|
|
11540
|
+
const totalLinkingDomains = Number(filteredAgg?.count ?? 0);
|
|
11541
|
+
const totalHosts = Number(filteredAgg?.total ?? 0);
|
|
11542
|
+
const unfilteredLinkingDomains = Number(unfilteredAgg?.count ?? 0);
|
|
11543
|
+
const unfilteredHosts = Number(unfilteredAgg?.total ?? 0);
|
|
11544
|
+
const top10Sum = top10Rows.reduce((sum, r) => sum + r.numHosts, 0);
|
|
11545
|
+
const top10Share = totalHosts > 0 ? top10Sum / totalHosts : 0;
|
|
11546
|
+
return {
|
|
11547
|
+
projectId: base.projectId,
|
|
11548
|
+
release: base.release,
|
|
11549
|
+
targetDomain: base.targetDomain,
|
|
11550
|
+
totalLinkingDomains,
|
|
11551
|
+
totalHosts,
|
|
11552
|
+
top10HostsShare: top10Share.toFixed(6),
|
|
11553
|
+
queriedAt: base.queriedAt,
|
|
11554
|
+
excludedLinkingDomains: Math.max(0, unfilteredLinkingDomains - totalLinkingDomains),
|
|
11555
|
+
excludedHosts: Math.max(0, unfilteredHosts - totalHosts)
|
|
11556
|
+
};
|
|
11557
|
+
}
|
|
11491
11558
|
async function backlinksRoutes(app, opts) {
|
|
11492
11559
|
app.get("/backlinks/status", async (_request, reply) => {
|
|
11493
11560
|
if (!opts.getBacklinksStatus) {
|
|
@@ -11620,7 +11687,9 @@ async function backlinksRoutes(app, opts) {
|
|
|
11620
11687
|
async (request, reply) => {
|
|
11621
11688
|
const project = resolveProject(app.db, request.params.name);
|
|
11622
11689
|
const row = latestSummaryForProject(app.db, project.id, request.query.release);
|
|
11623
|
-
return reply.send(
|
|
11690
|
+
if (!row) return reply.send(null);
|
|
11691
|
+
const excludeCrawlers = parseExcludeCrawlers(request.query.excludeCrawlers);
|
|
11692
|
+
return reply.send(excludeCrawlers ? computeFilteredSummary(app.db, row) : mapSummaryRow(row));
|
|
11624
11693
|
}
|
|
11625
11694
|
);
|
|
11626
11695
|
app.get("/projects/:name/backlinks/domains", async (request, reply) => {
|
|
@@ -11633,17 +11702,23 @@ async function backlinksRoutes(app, opts) {
|
|
|
11633
11702
|
}
|
|
11634
11703
|
const limit = Math.min(Math.max(parseInt(request.query.limit ?? "50", 10) || 50, 1), 500);
|
|
11635
11704
|
const offset = Math.max(parseInt(request.query.offset ?? "0", 10) || 0, 0);
|
|
11636
|
-
const
|
|
11705
|
+
const excludeCrawlers = parseExcludeCrawlers(request.query.excludeCrawlers);
|
|
11706
|
+
const baseDomainCondition = and10(
|
|
11637
11707
|
eq21(backlinkDomains.projectId, project.id),
|
|
11638
11708
|
eq21(backlinkDomains.release, targetRelease)
|
|
11639
11709
|
);
|
|
11710
|
+
const domainCondition = excludeCrawlers ? and10(baseDomainCondition, backlinkCrawlerExclusionClause()) : baseDomainCondition;
|
|
11640
11711
|
const totalRow = app.db.select({ count: sql6`count(*)` }).from(backlinkDomains).where(domainCondition).get();
|
|
11641
11712
|
const rows = app.db.select({
|
|
11642
11713
|
linkingDomain: backlinkDomains.linkingDomain,
|
|
11643
11714
|
numHosts: backlinkDomains.numHosts
|
|
11644
11715
|
}).from(backlinkDomains).where(domainCondition).orderBy(desc10(backlinkDomains.numHosts)).limit(limit).offset(offset).all();
|
|
11716
|
+
let summary = null;
|
|
11717
|
+
if (summaryRow) {
|
|
11718
|
+
summary = excludeCrawlers ? computeFilteredSummary(app.db, summaryRow) : mapSummaryRow(summaryRow);
|
|
11719
|
+
}
|
|
11645
11720
|
const response = {
|
|
11646
|
-
summary
|
|
11721
|
+
summary,
|
|
11647
11722
|
total: Number(totalRow?.count ?? 0),
|
|
11648
11723
|
rows
|
|
11649
11724
|
};
|
|
@@ -14997,7 +15072,7 @@ import crypto19 from "crypto";
|
|
|
14997
15072
|
import fs7 from "fs";
|
|
14998
15073
|
import path9 from "path";
|
|
14999
15074
|
import os4 from "os";
|
|
15000
|
-
import { and as
|
|
15075
|
+
import { and as and11, eq as eq22, inArray as inArray5, sql as sql7 } from "drizzle-orm";
|
|
15001
15076
|
|
|
15002
15077
|
// src/citation-utils.ts
|
|
15003
15078
|
function domainMatches(domain, canonicalDomain) {
|
|
@@ -15281,7 +15356,7 @@ var JobRunner = class {
|
|
|
15281
15356
|
throw new Error(`Run ${runId} is not executable from status '${existingRun.status}'`);
|
|
15282
15357
|
}
|
|
15283
15358
|
if (existingRun.status === "queued") {
|
|
15284
|
-
this.db.update(runs).set({ status: "running", startedAt: now }).where(
|
|
15359
|
+
this.db.update(runs).set({ status: "running", startedAt: now }).where(and11(eq22(runs.id, runId), eq22(runs.status, "queued"))).run();
|
|
15285
15360
|
}
|
|
15286
15361
|
this.throwIfRunCancelled(runId);
|
|
15287
15362
|
const project = this.db.select().from(projects).where(eq22(projects.id, projectId)).get();
|
|
@@ -15584,7 +15659,7 @@ function getCurrentUsageDay() {
|
|
|
15584
15659
|
|
|
15585
15660
|
// src/gsc-sync.ts
|
|
15586
15661
|
import crypto20 from "crypto";
|
|
15587
|
-
import { eq as eq23, and as
|
|
15662
|
+
import { eq as eq23, and as and12, sql as sql8 } from "drizzle-orm";
|
|
15588
15663
|
var log2 = createLogger("GscSync");
|
|
15589
15664
|
function formatDate2(d) {
|
|
15590
15665
|
return d.toISOString().split("T")[0];
|
|
@@ -15636,7 +15711,7 @@ async function executeGscSync(db, runId, projectId, opts) {
|
|
|
15636
15711
|
});
|
|
15637
15712
|
log2.info("fetch.complete", { runId, projectId, rowCount: rows.length });
|
|
15638
15713
|
db.delete(gscSearchData).where(
|
|
15639
|
-
|
|
15714
|
+
and12(
|
|
15640
15715
|
eq23(gscSearchData.projectId, projectId),
|
|
15641
15716
|
sql8`${gscSearchData.date} >= ${startDate}`,
|
|
15642
15717
|
sql8`${gscSearchData.date} <= ${endDate}`
|
|
@@ -15725,7 +15800,7 @@ async function executeGscSync(db, runId, projectId, opts) {
|
|
|
15725
15800
|
}
|
|
15726
15801
|
}
|
|
15727
15802
|
const snapshotDate = formatDate2(/* @__PURE__ */ new Date());
|
|
15728
|
-
db.delete(gscCoverageSnapshots).where(
|
|
15803
|
+
db.delete(gscCoverageSnapshots).where(and12(eq23(gscCoverageSnapshots.projectId, projectId), eq23(gscCoverageSnapshots.date, snapshotDate))).run();
|
|
15729
15804
|
db.insert(gscCoverageSnapshots).values({
|
|
15730
15805
|
id: crypto20.randomUUID(),
|
|
15731
15806
|
projectId,
|
|
@@ -15748,7 +15823,7 @@ async function executeGscSync(db, runId, projectId, opts) {
|
|
|
15748
15823
|
|
|
15749
15824
|
// src/gsc-inspect-sitemap.ts
|
|
15750
15825
|
import crypto21 from "crypto";
|
|
15751
|
-
import { eq as eq24, and as
|
|
15826
|
+
import { eq as eq24, and as and13 } from "drizzle-orm";
|
|
15752
15827
|
|
|
15753
15828
|
// src/sitemap-parser.ts
|
|
15754
15829
|
var log3 = createLogger("SitemapParser");
|
|
@@ -15964,7 +16039,7 @@ async function executeInspectSitemap(db, runId, projectId, opts) {
|
|
|
15964
16039
|
}
|
|
15965
16040
|
}
|
|
15966
16041
|
const snapshotDate = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
15967
|
-
db.delete(gscCoverageSnapshots).where(
|
|
16042
|
+
db.delete(gscCoverageSnapshots).where(and13(eq24(gscCoverageSnapshots.projectId, projectId), eq24(gscCoverageSnapshots.date, snapshotDate))).run();
|
|
15968
16043
|
db.insert(gscCoverageSnapshots).values({
|
|
15969
16044
|
id: crypto21.randomUUID(),
|
|
15970
16045
|
projectId,
|
|
@@ -16175,7 +16250,7 @@ async function executeBingInspectSitemap(db, runId, projectId, opts) {
|
|
|
16175
16250
|
// src/commoncrawl-sync.ts
|
|
16176
16251
|
import crypto23 from "crypto";
|
|
16177
16252
|
import path10 from "path";
|
|
16178
|
-
import { and as
|
|
16253
|
+
import { and as and14, eq as eq26, sql as sql9 } from "drizzle-orm";
|
|
16179
16254
|
var log6 = createLogger("CommonCrawlSync");
|
|
16180
16255
|
var INSERT_CHUNK_SIZE = 1e4;
|
|
16181
16256
|
function defaultDeps() {
|
|
@@ -16366,7 +16441,7 @@ function computeSummary(rows) {
|
|
|
16366
16441
|
// src/backlink-extract.ts
|
|
16367
16442
|
import crypto24 from "crypto";
|
|
16368
16443
|
import fs8 from "fs";
|
|
16369
|
-
import { and as
|
|
16444
|
+
import { and as and15, desc as desc12, eq as eq27 } from "drizzle-orm";
|
|
16370
16445
|
var log7 = createLogger("BacklinkExtract");
|
|
16371
16446
|
function defaultDeps2() {
|
|
16372
16447
|
return {
|
|
@@ -16412,7 +16487,7 @@ async function executeBacklinkExtract(db, runId, projectId, opts = {}) {
|
|
|
16412
16487
|
const targetDomain = project.canonicalDomain;
|
|
16413
16488
|
db.transaction((tx) => {
|
|
16414
16489
|
tx.delete(backlinkDomains).where(
|
|
16415
|
-
|
|
16490
|
+
and15(eq27(backlinkDomains.projectId, projectId), eq27(backlinkDomains.release, release))
|
|
16416
16491
|
).run();
|
|
16417
16492
|
if (rows.length > 0) {
|
|
16418
16493
|
const values = rows.map((r) => ({
|
|
@@ -16668,7 +16743,7 @@ var Scheduler = class {
|
|
|
16668
16743
|
};
|
|
16669
16744
|
|
|
16670
16745
|
// src/notifier.ts
|
|
16671
|
-
import { eq as eq29, desc as desc13, and as
|
|
16746
|
+
import { eq as eq29, desc as desc13, and as and16, or as or3 } from "drizzle-orm";
|
|
16672
16747
|
import crypto25 from "crypto";
|
|
16673
16748
|
var log9 = createLogger("Notifier");
|
|
16674
16749
|
var Notifier = class {
|
|
@@ -16774,7 +16849,7 @@ var Notifier = class {
|
|
|
16774
16849
|
}
|
|
16775
16850
|
computeTransitions(runId, projectId) {
|
|
16776
16851
|
const recentRuns = this.db.select().from(runs).where(
|
|
16777
|
-
|
|
16852
|
+
and16(
|
|
16778
16853
|
eq29(runs.projectId, projectId),
|
|
16779
16854
|
or3(eq29(runs.status, "completed"), eq29(runs.status, "partial"))
|
|
16780
16855
|
)
|
|
@@ -17260,7 +17335,7 @@ function resolveSessionProviderAndModel(config, opts) {
|
|
|
17260
17335
|
|
|
17261
17336
|
// src/agent/memory-store.ts
|
|
17262
17337
|
import crypto26 from "crypto";
|
|
17263
|
-
import { and as
|
|
17338
|
+
import { and as and17, desc as desc14, eq as eq30, like as like2, sql as sql10 } from "drizzle-orm";
|
|
17264
17339
|
var COMPACTION_KEY_PREFIX = "compaction:";
|
|
17265
17340
|
var COMPACTION_NOTES_PER_SESSION = 3;
|
|
17266
17341
|
function rowToDto(row) {
|
|
@@ -17305,12 +17380,12 @@ function upsertMemoryEntry(db, args) {
|
|
|
17305
17380
|
updatedAt: now
|
|
17306
17381
|
}
|
|
17307
17382
|
}).run();
|
|
17308
|
-
const row = db.select().from(agentMemory).where(
|
|
17383
|
+
const row = db.select().from(agentMemory).where(and17(eq30(agentMemory.projectId, args.projectId), eq30(agentMemory.key, args.key))).get();
|
|
17309
17384
|
if (!row) throw new Error("memory upsert produced no row");
|
|
17310
17385
|
return rowToDto(row);
|
|
17311
17386
|
}
|
|
17312
17387
|
function deleteMemoryEntry(db, projectId, key) {
|
|
17313
|
-
const result = db.delete(agentMemory).where(
|
|
17388
|
+
const result = db.delete(agentMemory).where(and17(eq30(agentMemory.projectId, projectId), eq30(agentMemory.key, key))).run();
|
|
17314
17389
|
const changes = result.changes ?? 0;
|
|
17315
17390
|
return changes > 0;
|
|
17316
17391
|
}
|
|
@@ -17339,7 +17414,7 @@ function writeCompactionNote(db, args) {
|
|
|
17339
17414
|
}).run();
|
|
17340
17415
|
const sessionPrefix = `${COMPACTION_KEY_PREFIX}${args.sessionId}:`;
|
|
17341
17416
|
const existing = tx.select({ id: agentMemory.id, updatedAt: agentMemory.updatedAt }).from(agentMemory).where(
|
|
17342
|
-
|
|
17417
|
+
and17(
|
|
17343
17418
|
eq30(agentMemory.projectId, args.projectId),
|
|
17344
17419
|
like2(agentMemory.key, `${sessionPrefix}%`)
|
|
17345
17420
|
)
|
|
@@ -17348,7 +17423,7 @@ function writeCompactionNote(db, args) {
|
|
|
17348
17423
|
if (stale.length > 0) {
|
|
17349
17424
|
tx.delete(agentMemory).where(sql10`${agentMemory.id} IN (${sql10.join(stale.map((s) => sql10`${s}`), sql10`, `)})`).run();
|
|
17350
17425
|
}
|
|
17351
|
-
const row = tx.select().from(agentMemory).where(
|
|
17426
|
+
const row = tx.select().from(agentMemory).where(and17(eq30(agentMemory.projectId, args.projectId), eq30(agentMemory.key, key))).get();
|
|
17352
17427
|
if (row) inserted = rowToDto(row);
|
|
17353
17428
|
});
|
|
17354
17429
|
if (!inserted) throw new Error("compaction note write produced no row");
|
|
@@ -1577,7 +1577,12 @@ var backlinkSummaryDtoSchema = z14.object({
|
|
|
1577
1577
|
totalLinkingDomains: z14.number().int(),
|
|
1578
1578
|
totalHosts: z14.number().int(),
|
|
1579
1579
|
top10HostsShare: z14.string(),
|
|
1580
|
-
queriedAt: z14.string()
|
|
1580
|
+
queriedAt: z14.string(),
|
|
1581
|
+
// Populated when the response is filtered (e.g. ?excludeCrawlers=1).
|
|
1582
|
+
// Counts the rows omitted from totalLinkingDomains/totalHosts so callers
|
|
1583
|
+
// can show "N hidden" hints without re-deriving them.
|
|
1584
|
+
excludedLinkingDomains: z14.number().int().optional(),
|
|
1585
|
+
excludedHosts: z14.number().int().optional()
|
|
1581
1586
|
});
|
|
1582
1587
|
var backlinkListResponseSchema = z14.object({
|
|
1583
1588
|
summary: backlinkSummaryDtoSchema.nullable(),
|
|
@@ -2650,15 +2655,19 @@ var ApiClient = class {
|
|
|
2650
2655
|
async backlinksExtract(project, release) {
|
|
2651
2656
|
return this.request("POST", `/projects/${encodeURIComponent(project)}/backlinks/extract`, release ? { release } : {});
|
|
2652
2657
|
}
|
|
2653
|
-
async backlinksSummary(project,
|
|
2654
|
-
const qs =
|
|
2655
|
-
|
|
2658
|
+
async backlinksSummary(project, opts = {}) {
|
|
2659
|
+
const qs = new URLSearchParams();
|
|
2660
|
+
if (opts.release) qs.set("release", opts.release);
|
|
2661
|
+
if (opts.excludeCrawlers) qs.set("excludeCrawlers", "1");
|
|
2662
|
+
const suffix = qs.toString() ? `?${qs.toString()}` : "";
|
|
2663
|
+
return this.request("GET", `/projects/${encodeURIComponent(project)}/backlinks/summary${suffix}`);
|
|
2656
2664
|
}
|
|
2657
2665
|
async backlinksDomains(project, opts = {}) {
|
|
2658
2666
|
const qs = new URLSearchParams();
|
|
2659
2667
|
if (opts.limit !== void 0) qs.set("limit", String(opts.limit));
|
|
2660
2668
|
if (opts.offset !== void 0) qs.set("offset", String(opts.offset));
|
|
2661
2669
|
if (opts.release) qs.set("release", opts.release);
|
|
2670
|
+
if (opts.excludeCrawlers) qs.set("excludeCrawlers", "1");
|
|
2662
2671
|
const suffix = qs.toString() ? `?${qs.toString()}` : "";
|
|
2663
2672
|
return this.request("GET", `/projects/${encodeURIComponent(project)}/backlinks/domains${suffix}`);
|
|
2664
2673
|
}
|
package/dist/cli.js
CHANGED
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
setGoogleAuthConfig,
|
|
18
18
|
showFirstRunNotice,
|
|
19
19
|
trackEvent
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-QA5HRDRS.js";
|
|
21
21
|
import {
|
|
22
22
|
CcReleaseSyncStatuses,
|
|
23
23
|
CheckScopes,
|
|
@@ -45,7 +45,7 @@ import {
|
|
|
45
45
|
saveConfig,
|
|
46
46
|
saveConfigPatch,
|
|
47
47
|
usageError
|
|
48
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-TBFRAJU2.js";
|
|
49
49
|
import {
|
|
50
50
|
apiKeys,
|
|
51
51
|
competitors,
|
|
@@ -728,6 +728,9 @@ function formatSummaryAndDomains(project, response) {
|
|
|
728
728
|
lines.push(`Linking domains: ${s.totalLinkingDomains}`);
|
|
729
729
|
lines.push(`Total hosts: ${s.totalHosts}`);
|
|
730
730
|
lines.push(`Top-10 share: ${s.top10HostsShare}`);
|
|
731
|
+
if (s.excludedLinkingDomains !== void 0 && s.excludedLinkingDomains > 0) {
|
|
732
|
+
lines.push(`Excluded: ${s.excludedLinkingDomains} crawler/proxy domains (${s.excludedHosts ?? 0} hosts)`);
|
|
733
|
+
}
|
|
731
734
|
if (response.rows.length > 0) {
|
|
732
735
|
lines.push("");
|
|
733
736
|
lines.push(`Top ${response.rows.length} linking domains (of ${response.total}):`);
|
|
@@ -861,7 +864,8 @@ async function backlinksList(opts) {
|
|
|
861
864
|
const client = getClient();
|
|
862
865
|
const response = await client.backlinksDomains(opts.project, {
|
|
863
866
|
limit: opts.limit ?? 50,
|
|
864
|
-
release: opts.release
|
|
867
|
+
release: opts.release,
|
|
868
|
+
excludeCrawlers: opts.excludeCrawlers
|
|
865
869
|
});
|
|
866
870
|
if (opts.format === "json") {
|
|
867
871
|
printJson(response);
|
|
@@ -943,16 +947,17 @@ var BACKLINKS_CLI_COMMANDS = [
|
|
|
943
947
|
},
|
|
944
948
|
{
|
|
945
949
|
path: ["backlinks", "list"],
|
|
946
|
-
usage: "canonry backlinks list <project> [--limit <n>] [--release <id>] [--format json]",
|
|
950
|
+
usage: "canonry backlinks list <project> [--limit <n>] [--release <id>] [--exclude-crawlers] [--format json]",
|
|
947
951
|
options: {
|
|
948
952
|
limit: stringOption(),
|
|
949
|
-
release: stringOption()
|
|
953
|
+
release: stringOption(),
|
|
954
|
+
"exclude-crawlers": { type: "boolean" }
|
|
950
955
|
},
|
|
951
956
|
run: async (input) => {
|
|
952
957
|
const project = requireProject(
|
|
953
958
|
input,
|
|
954
959
|
"backlinks list",
|
|
955
|
-
"canonry backlinks list <project> [--limit <n>] [--release <id>]"
|
|
960
|
+
"canonry backlinks list <project> [--limit <n>] [--release <id>] [--exclude-crawlers]"
|
|
956
961
|
);
|
|
957
962
|
const limit = parseIntegerOption(input, "limit", {
|
|
958
963
|
message: "--limit must be an integer",
|
|
@@ -963,6 +968,7 @@ var BACKLINKS_CLI_COMMANDS = [
|
|
|
963
968
|
project,
|
|
964
969
|
limit,
|
|
965
970
|
release: getString(input.values, "release"),
|
|
971
|
+
excludeCrawlers: getBoolean(input.values, "exclude-crawlers"),
|
|
966
972
|
format: input.format
|
|
967
973
|
});
|
|
968
974
|
}
|
package/dist/index.js
CHANGED
package/dist/mcp.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ainyc/canonry",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.2",
|
|
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",
|
|
@@ -59,21 +59,21 @@
|
|
|
59
59
|
"@types/node-cron": "^3.0.11",
|
|
60
60
|
"tsup": "^8.5.1",
|
|
61
61
|
"tsx": "^4.19.0",
|
|
62
|
-
"@ainyc/canonry-config": "0.0.0",
|
|
63
62
|
"@ainyc/canonry-api-routes": "0.0.0",
|
|
64
63
|
"@ainyc/canonry-db": "0.0.0",
|
|
64
|
+
"@ainyc/canonry-config": "0.0.0",
|
|
65
65
|
"@ainyc/canonry-intelligence": "0.0.0",
|
|
66
|
-
"@ainyc/canonry-integration-google": "0.0.0",
|
|
67
|
-
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
68
66
|
"@ainyc/canonry-contracts": "0.0.0",
|
|
69
|
-
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
70
|
-
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
71
67
|
"@ainyc/canonry-integration-bing": "0.0.0",
|
|
68
|
+
"@ainyc/canonry-integration-commoncrawl": "0.0.0",
|
|
69
|
+
"@ainyc/canonry-integration-google": "0.0.0",
|
|
70
|
+
"@ainyc/canonry-integration-wordpress": "0.0.0",
|
|
72
71
|
"@ainyc/canonry-provider-claude": "0.0.0",
|
|
73
72
|
"@ainyc/canonry-provider-gemini": "0.0.0",
|
|
74
73
|
"@ainyc/canonry-provider-local": "0.0.0",
|
|
75
|
-
"@ainyc/canonry-provider-
|
|
76
|
-
"@ainyc/canonry-provider-
|
|
74
|
+
"@ainyc/canonry-provider-openai": "0.0.0",
|
|
75
|
+
"@ainyc/canonry-provider-cdp": "0.0.0",
|
|
76
|
+
"@ainyc/canonry-provider-perplexity": "0.0.0"
|
|
77
77
|
},
|
|
78
78
|
"scripts": {
|
|
79
79
|
"build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",
|