@canonry/canonry 7.98.0 → 7.100.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 +18 -16
- package/assets/agent-workspace/AGENTS.md +13 -6
- package/assets/agent-workspace/skills/aero/SKILL.md +45 -26
- package/assets/agent-workspace/skills/aero/references/agent-operations.md +47 -12
- package/assets/agent-workspace/skills/aero/references/memory-patterns.md +1 -1
- package/assets/agent-workspace/skills/aero/references/orchestration.md +9 -9
- package/assets/agent-workspace/skills/aero/references/reporting.md +8 -4
- package/assets/agent-workspace/skills/aero/references/seo-analysis.md +2 -2
- package/assets/agent-workspace/skills/aero/references/site-health.md +34 -23
- package/assets/agent-workspace/skills/aero/soul.md +2 -2
- package/assets/agent-workspace/skills/canonry/SKILL.md +37 -7
- package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +14 -11
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +122 -53
- package/assets/assets/AccessControls-DzO5Y8v9.js +2 -0
- package/assets/assets/AgentSetupPage-DWWovaCw.js +36 -0
- package/assets/assets/AuditHistoryPanel-BG-n1i8c.js +1 -0
- package/assets/assets/BacklinksPage-D6wdOMXt.js +1 -0
- package/assets/assets/ChartPrimitives-CtKdkn64.js +3 -0
- package/assets/assets/Hint-3TTi0MgX.js +1 -0
- package/assets/assets/{HistoryPage-DeN79d3c.js → HistoryPage-B_ReWHbL.js} +1 -1
- package/assets/assets/InfoTooltip-D29JcNMW.js +1 -0
- package/assets/assets/MeasurementPropertyPage-zdyLL-kl.js +4 -0
- package/assets/assets/ProjectPage-KZNKXR4w.js +15 -0
- package/assets/assets/RunsPage-DxN0xXQh.js +1 -0
- package/assets/assets/ServerTrafficSection-CvISj5pf.js +40 -0
- package/assets/assets/SettingsPage-CpRpBlMV.js +1 -0
- package/assets/assets/ToneBadge-DcwPruHr.js +60 -0
- package/assets/assets/TrafficPage-zk6zMZyz.js +1 -0
- package/assets/assets/TrafficSourceDetailPage-DJtsI06Z.js +1 -0
- package/assets/assets/{account-context-CdEHcI5S.js → account-context-CoJVqEXZ.js} +1 -1
- package/assets/assets/{agent-trust-copy-N6WacCSg.js → agent-trust-copy-BIXDMtBm.js} +1 -1
- package/assets/assets/{card-B1O0SunG.js → card-Dwmc7Srx.js} +1 -1
- package/assets/assets/index-fh1T5JQY.css +1 -0
- package/assets/assets/index-mqc2mWUR.js +42 -0
- package/assets/assets/query-client-Tg1fZu4i.js +1 -0
- package/assets/assets/react-query-BqcEEfEO.js +1 -0
- package/assets/assets/{react-sigma_core.esm.min-f4uuOgrw.js → react-sigma_core.esm.min-D1q0DR_j.js} +3 -3
- package/assets/assets/{server-traffic-CkSCFMnL.js → server-traffic-Djnh_9f0.js} +1 -1
- package/assets/assets/service-BQjBdN4O.js +1 -0
- package/assets/assets/use-tooltip-position-BOzm-6Wy.js +1 -0
- package/assets/assets/vendor-lucide-iE5MEh2-.js +1 -0
- package/assets/assets/{vendor-markdown-BDQ1GKGP.js → vendor-markdown-BBGbNklj.js} +1 -1
- package/assets/assets/{vendor-radix-BGYlvS2l.js → vendor-radix-DKCt5Z_h.js} +1 -1
- package/assets/assets/{vendor-recharts-DhEHcK3G.js → vendor-recharts-D3MLFU3q.js} +1 -1
- package/assets/assets/{vendor-tanstack-BNuZ37rE.js → vendor-tanstack-B90HW50P.js} +2 -2
- package/assets/index.html +16 -15
- package/dist/{ads-PQ4OP6OH.js → ads-FVPZ6R6Z.js} +3 -3
- package/dist/{agent-B6ZPL2HH.js → agent-2LPU2E5I.js} +7 -7
- package/dist/{agent-ask-ZUKNXRAX.js → agent-ask-5ODREK6D.js} +3 -3
- package/dist/{agent-conversations-DJ7WU7PL.js → agent-conversations-SNLOOJEM.js} +3 -3
- package/dist/{agent-journeys-LGUI3SQG.js → agent-journeys-XDXVL6PK.js} +3 -3
- package/dist/{agent-memory-PWZJ7G5Q.js → agent-memory-NKAI2S3U.js} +3 -3
- package/dist/{agent-providers-TEERDNJT.js → agent-providers-R5L7A72X.js} +3 -3
- package/dist/{agent-transcript-KDPOPK5Z.js → agent-transcript-C5WAGYVC.js} +3 -3
- package/dist/{analytics-NFW5RQRT.js → analytics-EJVOLIQL.js} +33 -13
- package/dist/{apply-EP4V4UF5.js → apply-I6JOM247.js} +3 -3
- package/dist/{backfill-6UTNNVFO.js → backfill-UVUR36IB.js} +10 -10
- package/dist/{backlinks-SG5GV5X5.js → backlinks-3VMVACWN.js} +3 -3
- package/dist/{bing-Q4W24JNC.js → bing-R5RL3PW2.js} +3 -3
- package/dist/{bootstrap-WEMERVNZ.js → bootstrap-GMMSDTNO.js} +12 -12
- package/dist/{cdp-3XKBJGHO.js → cdp-FJKUXHEY.js} +7 -7
- package/dist/{chunk-KK3Z34AN.js → chunk-2DV7F6XA.js} +91 -2
- package/dist/{chunk-MTW37GXF.js → chunk-2FWYWGIR.js} +2 -2
- package/dist/{chunk-Q5SNOMRB.js → chunk-56VVRWJM.js} +14 -5
- package/dist/{chunk-52M2JWCB.js → chunk-7BEGCVVB.js} +1 -1
- package/dist/{chunk-WZSDGC45.js → chunk-7BH53MOB.js} +27 -2
- package/dist/{chunk-IX5AC3QB.js → chunk-7J2RIIYU.js} +1450 -1067
- package/dist/{chunk-UXXZXXNG.js → chunk-7SNMIXEQ.js} +2 -2
- package/dist/{chunk-2XCYEBQV.js → chunk-AMGM55CP.js} +2 -2
- package/dist/{chunk-MSI4BGFN.js → chunk-AYKTVQF7.js} +13 -5
- package/dist/{chunk-3JWY65XO.js → chunk-BKDRT4VS.js} +7 -7
- package/dist/{chunk-FQ3L2TIX.js → chunk-COHSL6KW.js} +1 -1
- package/dist/{chunk-X3UXMHWC.js → chunk-DGDLLRS4.js} +1 -1
- package/dist/{chunk-YJITDEZR.js → chunk-DHIB7EIA.js} +4 -4
- package/dist/{chunk-BLW327AU.js → chunk-EE3QTCLS.js} +18 -6
- package/dist/{chunk-3GMBHGQ5.js → chunk-F46TBLXK.js} +204 -94
- package/dist/{chunk-RTH5JVC3.js → chunk-FBO25TA3.js} +1 -1
- package/dist/{chunk-2Q7JEC6N.js → chunk-FZ3MUTU3.js} +2 -2
- package/dist/{chunk-64R66MWZ.js → chunk-G6QN4VFS.js} +16 -10
- package/dist/{chunk-ISIJ2NS4.js → chunk-HBHLYWKE.js} +9 -6
- package/dist/{chunk-EJZ444VV.js → chunk-HL2LGRTI.js} +8 -6
- package/dist/chunk-J6536OL6.js +31 -0
- package/dist/{chunk-RLKI2QF7.js → chunk-KVRX7YIH.js} +20 -10
- package/dist/{chunk-3BA75QYU.js → chunk-LJO2BKWU.js} +1 -1
- package/dist/{chunk-CN6MVUY3.js → chunk-LNVFERI4.js} +1 -1
- package/dist/{chunk-ZADRESLB.js → chunk-NQYJHKML.js} +39 -7
- package/dist/{chunk-IAGC2MGP.js → chunk-O5UFAXUI.js} +646 -588
- package/dist/{chunk-RGFIRJ7F.js → chunk-O6APBEJE.js} +2 -2
- package/dist/{chunk-ZBTUISPG.js → chunk-O7S7OHLE.js} +9399 -8388
- package/dist/{chunk-ER5ZHAB2.js → chunk-QS5DWJDI.js} +2 -2
- package/dist/{chunk-QSL3FXE4.js → chunk-RBG2QXQM.js} +4 -4
- package/dist/{chunk-SAKH2RRF.js → chunk-SWZXHHAG.js} +16 -8
- package/dist/{chunk-VMGZBH5L.js → chunk-T7UDY7W3.js} +26 -11
- package/dist/{chunk-OL2L5ANJ.js → chunk-UGO2FO6V.js} +119 -55
- package/dist/{chunk-J6MYB3F4.js → chunk-VHULVUDL.js} +1 -1
- package/dist/{chunk-O22WSFWL.js → chunk-YGAQQSCL.js} +56339 -54966
- package/dist/{chunk-TNOYUE2L.js → chunk-YIIRS7V7.js} +98 -65
- package/dist/{chunk-64KB6YTG.js → chunk-YU2WX7RD.js} +3 -3
- package/dist/{citations-5OSQ3ZYU.js → citations-LOEQRDUB.js} +21 -10
- package/dist/{cli-catalog-T5OAVKGS.js → cli-catalog-5RXNUFBS.js} +3 -3
- package/dist/{cli-commands-VATCVJKW.js → cli-commands-HE2BQY3Y.js} +7 -7
- package/dist/cli.js +22 -17
- package/dist/{competitor-YIKTMTHY.js → competitor-PIX2BHJW.js} +3 -3
- package/dist/{content-DS2LKR7J.js → content-PJGW4WZF.js} +3 -3
- package/dist/{dashboard-HLVRRRI4.js → dashboard-7OKBD4MG.js} +6 -6
- package/dist/{demo-A5DTVJGK.js → demo-SCOFAWFM.js} +1 -1
- package/dist/{demo-server-P2JGAI6C.js → demo-server-SJPI6RSL.js} +38 -36
- package/dist/{discover-VNZDO2MU.js → discover-I3WL2QUN.js} +10 -8
- package/dist/{discover-eval-ON77LUEN.js → discover-eval-YRECOIP5.js} +3 -3
- package/dist/{doctor-7TNNTI7H.js → doctor-F4J6LILX.js} +3 -3
- package/dist/{evidence-E54CNGXS.js → evidence-MYQTCY4V.js} +25 -10
- package/dist/{export-cmd-XXZ6KLQQ.js → export-cmd-3SUFOJM6.js} +3 -3
- package/dist/{ga-ZQB4EJI3.js → ga-VA6FYK4L.js} +3 -3
- package/dist/{gbp-ZQL6NQEK.js → gbp-DI6ZVFHL.js} +3 -3
- package/dist/{google-7EIHQGSV.js → google-UVKWJCD2.js} +4 -4
- package/dist/{google-marketing-RSAO4PG7.js → google-marketing-S63HN733.js} +1 -1
- package/dist/{health-cmd-R7WPKGWX.js → health-cmd-DOZXGI46.js} +16 -9
- package/dist/{history-2CSWSVCY.js → history-UTJTUDYK.js} +3 -3
- package/dist/index.d.ts +204 -12
- package/dist/index.js +26 -26
- package/dist/{init-FXZRMXZ3.js → init-IVJSS33J.js} +19 -19
- package/dist/{insights-EJUL3W6D.js → insights-UHCVCZ76.js} +3 -3
- package/dist/intelligence-service-3EENJ5DS.js +16 -0
- package/dist/{journeys-YUMBANFH.js → journeys-XIT7WDM2.js} +3 -3
- package/dist/{keys-KLOTGT4H.js → keys-MQKW4JUI.js} +3 -3
- package/dist/{keyword-5NSJFEOI.js → keyword-EASMKYZ3.js} +3 -3
- package/dist/{logs-WW3RLCRG.js → logs-ZHZ6XM55.js} +3 -3
- package/dist/{mcp-NTBEIEVX.js → mcp-ECVT2YGU.js} +4 -4
- package/dist/mcp.js +10 -10
- package/dist/{measurement-plan-BLPAZEXS.js → measurement-plan-7FQKUOMR.js} +5 -5
- package/dist/{notify-KAGE6UEN.js → notify-TC7ARC6W.js} +3 -3
- package/dist/{organic-evidence-HTYRXRML.js → organic-evidence-M34MWJXE.js} +7 -4
- package/dist/overview-P6BRMXJN.js +314 -0
- package/dist/{project-NYUWICVC.js → project-WZ2YXFPJ.js} +4 -4
- package/dist/project-setup-WV6SPGIV.js +176 -0
- package/dist/{query-3CRRDOHD.js → query-WAFJKDHG.js} +3 -3
- package/dist/{research-ZULVD3TW.js → research-B5ZPQX7R.js} +3 -3
- package/dist/{results-export-STM7SQ4J.js → results-export-NIZV6R3K.js} +3 -3
- package/dist/{run-S4MFU4MK.js → run-ICLPZ7QT.js} +7 -4
- package/dist/{schedule-6W3Q2FUL.js → schedule-4C44LQ7R.js} +22 -3
- package/dist/{search-EKXXN7C4.js → search-UJM7KII3.js} +11 -4
- package/dist/{serve-TFBFPFAQ.js → serve-A6UIO6WP.js} +30 -29
- package/dist/{session-4B5V3AH6.js → session-RTE22GQT.js} +14 -14
- package/dist/settings-BOF5Z7ML.js +211 -0
- package/dist/{sitemaps-R7XFCH6E.js → sitemaps-BM7S76H2.js} +4 -4
- package/dist/{skills-44XYCTVD.js → skills-X5SR4HRO.js} +2 -2
- package/dist/{snapshot-ROAOJI4W.js → snapshot-KLKE37VY.js} +4 -4
- package/dist/{src-ZJRIKEDB.js → src-EKLG5A6O.js} +4 -2
- package/dist/{status-EN3A2TX5.js → status-OYG57DWU.js} +6 -5
- package/dist/{technical-aeo-ZV466F65.js → technical-aeo-KWVWOOTI.js} +23 -23
- package/dist/{telemetry-EZHPNZ2A.js → telemetry-KGE6FF3Y.js} +4 -4
- package/dist/{tools-IH4M7AAG.js → tools-4R33AZQ3.js} +11 -11
- package/dist/{traffic-VFLXWB3Z.js → traffic-SVMOKCSS.js} +7 -11
- package/dist/{trends-ZXJIX3Z3.js → trends-RGAKGX3L.js} +4 -4
- package/dist/{users-J2BYEWOE.js → users-47WKA2TO.js} +3 -3
- package/dist/{visibility-stats-AJ7NY2BP.js → visibility-stats-DTGQJPNV.js} +9 -5
- package/dist/{wordpress-U6MS35VE.js → wordpress-2CNUX4UE.js} +3 -3
- package/package.json +2 -2
- package/assets/assets/AgentSetupPage-h1kJhy9q.js +0 -18
- package/assets/assets/AuditHistoryPanel-CNUApNiJ.js +0 -1
- package/assets/assets/BacklinksPage-CpKmlAek.js +0 -1
- package/assets/assets/ChartPrimitives-CvK6CQrj.js +0 -1
- package/assets/assets/Hint-c4a4W87X.js +0 -1
- package/assets/assets/InfoTooltip-Drnst4ML.js +0 -1
- package/assets/assets/MeasurementPropertyPage-CcHnYn81.js +0 -4
- package/assets/assets/ProjectPage-Tmuqmust.js +0 -11
- package/assets/assets/RunsPage-BD4k3MjX.js +0 -1
- package/assets/assets/SettingsPage-BHy30JP5.js +0 -1
- package/assets/assets/SiteHealthSection-SYdtuGjq.js +0 -2
- package/assets/assets/ToneBadge-Cii5KNtg.js +0 -60
- package/assets/assets/TrafficPage-DuxtRqnc.js +0 -40
- package/assets/assets/TrafficSourceDetailPage-DiX1bB02.js +0 -1
- package/assets/assets/format-helpers-V8Pyc7cR.js +0 -3
- package/assets/assets/index-BAxHW-1G.css +0 -1
- package/assets/assets/index-BTz-B9hV.js +0 -60
- package/assets/assets/query-client-C1ycmW1c.js +0 -1
- package/assets/assets/react-query-DI7VfOND.js +0 -1
- package/assets/assets/service-DSgXWhNq.js +0 -1
- package/assets/assets/vendor-lucide-DuOM7wVi.js +0 -1
- package/dist/intelligence-service-TKK7O3Z5.js +0 -16
- package/dist/overview-GSJ4GP2T.js +0 -213
- package/dist/settings-VRTDPFR3.js +0 -119
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createApiClient
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-UGO2FO6V.js";
|
|
4
|
+
import "./chunk-EE3QTCLS.js";
|
|
5
5
|
import {
|
|
6
6
|
emitJsonl
|
|
7
7
|
} from "./chunk-Z7IUAJOF.js";
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
RatioUnits,
|
|
14
14
|
SiteAuditIssueRecommendationScopes,
|
|
15
15
|
formatPercent
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-O7S7OHLE.js";
|
|
17
17
|
import "./chunk-MLKGABMK.js";
|
|
18
18
|
|
|
19
19
|
// src/commands/technical-aeo.ts
|
|
@@ -39,7 +39,7 @@ async function technicalAeoIssues(project, opts) {
|
|
|
39
39
|
lines.push("", `[${issue.disposition}${severity}] ${issue.code} \xB7 ${issue.affectedPages} page(s)`, issue.message);
|
|
40
40
|
lines.push(`Issue: ${issue.id}${issue.stableIdentity ? "" : " (identity is specific to this scan)"}`);
|
|
41
41
|
for (const example of issue.examples) lines.push(` ${example.url}`);
|
|
42
|
-
if (issue.examplesTruncated) lines.push("More affected pages are available with
|
|
42
|
+
if (issue.examplesTruncated) lines.push("More affected pages are available with canonry agent-readiness issue-pages.");
|
|
43
43
|
if (issue.messageTruncated) lines.push("The saved message is shortened; inspect the affected pages for context.");
|
|
44
44
|
}
|
|
45
45
|
if (res.nextCursor) lines.push("", `Next cursor: ${res.nextCursor}`);
|
|
@@ -89,13 +89,13 @@ async function technicalAeoScore(project, opts) {
|
|
|
89
89
|
}
|
|
90
90
|
if (!score.hasData) {
|
|
91
91
|
console.log(
|
|
92
|
-
`No
|
|
92
|
+
`No Agent Readiness audit scan yet for "${project}". Run \`canonry agent-readiness run ${project}\` to start one.`
|
|
93
93
|
);
|
|
94
94
|
return;
|
|
95
95
|
}
|
|
96
96
|
const lines = [];
|
|
97
97
|
const delta = score.deltaScore == null ? "" : ` (${score.deltaScore >= 0 ? "+" : ""}${score.deltaScore} vs prev)`;
|
|
98
|
-
lines.push(`
|
|
98
|
+
lines.push(`Agent Readiness: ${score.aggregateScore}/100${delta}`);
|
|
99
99
|
lines.push(
|
|
100
100
|
`Audited ${score.pagesAudited} page(s) \xB7 ${score.pagesSkipped} skipped \xB7 ${score.pagesErrored} errored \xB7 sitemap ${score.sitemapUrl}`
|
|
101
101
|
);
|
|
@@ -129,7 +129,7 @@ async function technicalAeoPages(project, opts) {
|
|
|
129
129
|
return;
|
|
130
130
|
}
|
|
131
131
|
if (res.pages.length === 0) {
|
|
132
|
-
console.log(`No audited pages for "${project}". Run \`canonry
|
|
132
|
+
console.log(`No audited pages for "${project}". Run \`canonry agent-readiness run ${project}\` first.`);
|
|
133
133
|
return;
|
|
134
134
|
}
|
|
135
135
|
const lines = [];
|
|
@@ -154,7 +154,7 @@ async function technicalAeoTrend(project, opts) {
|
|
|
154
154
|
return;
|
|
155
155
|
}
|
|
156
156
|
if (res.points.length === 0) {
|
|
157
|
-
console.log(`No
|
|
157
|
+
console.log(`No Agent Readiness audit scans yet for "${project}". Run \`canonry agent-readiness run ${project}\` first.`);
|
|
158
158
|
return;
|
|
159
159
|
}
|
|
160
160
|
const lines = [];
|
|
@@ -171,7 +171,7 @@ async function technicalAeoProgress(project, opts) {
|
|
|
171
171
|
return;
|
|
172
172
|
}
|
|
173
173
|
const lines = [
|
|
174
|
-
`
|
|
174
|
+
`Agent Readiness audit scan progress: ${progress.phase} (${progress.status})`,
|
|
175
175
|
`Run: ${progress.runId}`
|
|
176
176
|
];
|
|
177
177
|
if (progress.attempt) {
|
|
@@ -198,14 +198,14 @@ async function technicalAeoCrawl(project, opts) {
|
|
|
198
198
|
console.log([`No persisted site crawl for "${project}" on ${opts.date}.`, ...availableScanDateLines(crawl.availableScanDates)].join("\n"));
|
|
199
199
|
return;
|
|
200
200
|
}
|
|
201
|
-
console.log(`No persisted site crawl for "${project}". Run \`canonry
|
|
201
|
+
console.log(`No persisted site crawl for "${project}". Run \`canonry agent-readiness run ${project}\` first.`);
|
|
202
202
|
return;
|
|
203
203
|
}
|
|
204
204
|
const lines = [
|
|
205
205
|
`Site crawl: ${crawl.complete ? "complete" : "partial"} (${crawl.runStatus ?? "unknown"})`,
|
|
206
206
|
`Root: ${crawl.rootUrl ?? "-"}`,
|
|
207
207
|
`Pages: ${crawl.counts.pagesFetched} fetched \xB7 ${crawl.counts.pagesDiscovered} discovered \xB7 ${crawl.counts.pagesEligible} eligible`,
|
|
208
|
-
`Links: ${crawl.counts.edges} internal/external observations \xB7 ${crawl.counts.findings} findings`,
|
|
208
|
+
`Links: ${crawl.counts.edges} internal/external observations${crawl.counts.internalLinks != null ? ` \xB7 ${crawl.counts.internalLinks} internal links on the site map` : ""} \xB7 ${crawl.counts.findings} findings`,
|
|
209
209
|
`Dead links: ${formatDeadLinkState(crawl.deadLinks)}`
|
|
210
210
|
];
|
|
211
211
|
lines.push(...inventorySummaryLines(crawl.inventorySummary));
|
|
@@ -219,17 +219,17 @@ async function technicalAeoSubgraph(project, opts) {
|
|
|
219
219
|
return;
|
|
220
220
|
}
|
|
221
221
|
if (!res.hasCrawlData) {
|
|
222
|
-
console.log(`No persisted
|
|
222
|
+
console.log(`No persisted Agent Readiness crawl for "${project}". Run \`canonry agent-readiness run ${project}\` first.`);
|
|
223
223
|
return;
|
|
224
224
|
}
|
|
225
225
|
if (res.state !== "ready") {
|
|
226
|
-
console.log(`
|
|
226
|
+
console.log(`Agent Readiness subgraph details are unavailable for crawl ${res.runId ?? "-"}.`);
|
|
227
227
|
return;
|
|
228
228
|
}
|
|
229
229
|
const focus = res.focusUrl ?? res.focusNodeKey ?? "crawl root";
|
|
230
230
|
const totalQualifier = res.countAccuracy === "lower-bound" ? "at least " : "";
|
|
231
231
|
const lines = [
|
|
232
|
-
`
|
|
232
|
+
`Agent Readiness subgraph: ${focus} (${res.hops} hop${res.hops === 1 ? "" : "s"})`,
|
|
233
233
|
`${res.nodes.length} of ${totalQualifier}${res.totalNodes} node(s) \xB7 ${res.edges.length} of ${totalQualifier}${res.totalEdges} edge(s)`,
|
|
234
234
|
`Crawl: ${res.complete ? "complete" : `partial (${res.termination ?? "incomplete"})`}`
|
|
235
235
|
];
|
|
@@ -245,11 +245,11 @@ async function technicalAeoPath(project, opts) {
|
|
|
245
245
|
return;
|
|
246
246
|
}
|
|
247
247
|
if (res.state === "no-crawl") {
|
|
248
|
-
console.log(`No persisted
|
|
248
|
+
console.log(`No persisted Agent Readiness crawl for "${project}". Run \`canonry agent-readiness run ${project}\` first.`);
|
|
249
249
|
return;
|
|
250
250
|
}
|
|
251
251
|
if (res.state === "details-unavailable") {
|
|
252
|
-
console.log(`
|
|
252
|
+
console.log(`Agent Readiness path details are unavailable for crawl ${res.runId ?? "-"}.`);
|
|
253
253
|
return;
|
|
254
254
|
}
|
|
255
255
|
if (res.state === "unreachable") {
|
|
@@ -283,15 +283,15 @@ async function technicalAeoChanges(project, opts) {
|
|
|
283
283
|
return;
|
|
284
284
|
}
|
|
285
285
|
if (res.state === "unavailable") {
|
|
286
|
-
console.log(`
|
|
286
|
+
console.log(`Agent Readiness changes unavailable: ${res.reason.replaceAll("-", " ")}.`);
|
|
287
287
|
return;
|
|
288
288
|
}
|
|
289
289
|
if (res.state === "incompatible") {
|
|
290
|
-
console.log(`
|
|
290
|
+
console.log(`Agent Readiness changes unavailable: snapshots use incompatible ${res.mismatchedVersions.join(", ")} versions.`);
|
|
291
291
|
return;
|
|
292
292
|
}
|
|
293
293
|
const lines = [
|
|
294
|
-
`
|
|
294
|
+
`Agent Readiness changes: ${res.fromRunId} \u2192 ${res.toRunId}`,
|
|
295
295
|
`Filters: ${res.filters.scope} \xB7 ${res.filters.change}`
|
|
296
296
|
];
|
|
297
297
|
if (res.summaryState === "exact" && res.summary !== null && res.total !== null) {
|
|
@@ -391,7 +391,7 @@ async function technicalAeoPageAudit(project, opts) {
|
|
|
391
391
|
return;
|
|
392
392
|
}
|
|
393
393
|
if (res.state === "no-crawl") {
|
|
394
|
-
console.log(`No persisted
|
|
394
|
+
console.log(`No persisted Agent Readiness crawl for "${project}". Run \`canonry agent-readiness run ${project}\` first.`);
|
|
395
395
|
return;
|
|
396
396
|
}
|
|
397
397
|
const provenance = [`Run: ${res.runId} \xB7 ${res.complete ? "complete" : "partial"}`];
|
|
@@ -586,14 +586,14 @@ async function technicalAeoRun(project, opts) {
|
|
|
586
586
|
return;
|
|
587
587
|
}
|
|
588
588
|
console.log(
|
|
589
|
-
`
|
|
589
|
+
`Agent Readiness audit scan started (run ${runId}, status ${status}). Use \`canonry agent-readiness progress ${project} --run-id ${runId}\` to check status, or pass --wait.`
|
|
590
590
|
);
|
|
591
591
|
return;
|
|
592
592
|
}
|
|
593
593
|
const terminal = /* @__PURE__ */ new Set(["completed", "partial", "failed", "cancelled"]);
|
|
594
594
|
const start = Date.now();
|
|
595
595
|
const timeoutMs = 15 * 60 * 1e3;
|
|
596
|
-
if (!isMachineFormat(opts.format)) process.stderr.write("
|
|
596
|
+
if (!isMachineFormat(opts.format)) process.stderr.write("Scanning");
|
|
597
597
|
let final = status;
|
|
598
598
|
while (!terminal.has(final) && Date.now() - start < timeoutMs) {
|
|
599
599
|
await new Promise((r) => setTimeout(r, 2e3));
|
|
@@ -606,7 +606,7 @@ async function technicalAeoRun(project, opts) {
|
|
|
606
606
|
console.log(JSON.stringify({ runId, status: final }, null, 2));
|
|
607
607
|
return;
|
|
608
608
|
}
|
|
609
|
-
console.log(`
|
|
609
|
+
console.log(`Agent Readiness audit scan ${final} (run ${runId}).`);
|
|
610
610
|
}
|
|
611
611
|
export {
|
|
612
612
|
technicalAeoChanges,
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getTelemetryStatus,
|
|
3
3
|
setTelemetryPreference
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-AMGM55CP.js";
|
|
5
5
|
import {
|
|
6
6
|
createApiClient
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-UGO2FO6V.js";
|
|
8
8
|
import {
|
|
9
9
|
configExists,
|
|
10
10
|
getConfigPath
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-EE3QTCLS.js";
|
|
12
12
|
import "./chunk-AOJU5LKX.js";
|
|
13
13
|
import {
|
|
14
14
|
CliError,
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
} from "./chunk-HGMYEDAQ.js";
|
|
18
18
|
import {
|
|
19
19
|
normalizeTelemetryStatus
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-O7S7OHLE.js";
|
|
21
21
|
import "./chunk-MLKGABMK.js";
|
|
22
22
|
|
|
23
23
|
// src/commands/telemetry.ts
|
|
@@ -11,19 +11,19 @@ import {
|
|
|
11
11
|
buildAllTools,
|
|
12
12
|
buildReadTools,
|
|
13
13
|
isAeroToolProfile
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
14
|
+
} from "./chunk-56VVRWJM.js";
|
|
15
|
+
import "./chunk-UGO2FO6V.js";
|
|
16
|
+
import "./chunk-EE3QTCLS.js";
|
|
17
|
+
import "./chunk-F46TBLXK.js";
|
|
18
|
+
import "./chunk-DGDLLRS4.js";
|
|
19
|
+
import "./chunk-7BEGCVVB.js";
|
|
20
20
|
import "./chunk-AOJU5LKX.js";
|
|
21
21
|
import "./chunk-HGMYEDAQ.js";
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-YGAQQSCL.js";
|
|
23
|
+
import "./chunk-LNVFERI4.js";
|
|
24
|
+
import "./chunk-LJO2BKWU.js";
|
|
25
|
+
import "./chunk-2DV7F6XA.js";
|
|
26
|
+
import "./chunk-O7S7OHLE.js";
|
|
27
27
|
import "./chunk-MLKGABMK.js";
|
|
28
28
|
export {
|
|
29
29
|
AERO_ADS_OPERATOR_CONTEXT_TOOL_NAME,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getCloudflareTrafficConnectionBySourceId
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VHULVUDL.js";
|
|
4
4
|
import {
|
|
5
5
|
createApiClient
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-UGO2FO6V.js";
|
|
7
7
|
import {
|
|
8
8
|
loadConfigRaw
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-EE3QTCLS.js";
|
|
10
10
|
import {
|
|
11
11
|
emitJsonl
|
|
12
12
|
} from "./chunk-Z7IUAJOF.js";
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
DEFAULT_BOT_LIST,
|
|
24
24
|
generateWorkerScript,
|
|
25
25
|
generateWranglerToml
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-LNVFERI4.js";
|
|
27
27
|
import {
|
|
28
28
|
RunStatuses,
|
|
29
29
|
TRAFFIC_EVENT_KIND_FILTER_HINT,
|
|
@@ -33,11 +33,12 @@ import {
|
|
|
33
33
|
formatValidationIssues,
|
|
34
34
|
parseTrafficAnalyticsPeriod,
|
|
35
35
|
parseTrafficEventKindFilter,
|
|
36
|
+
redactKnownSecrets,
|
|
36
37
|
referralAssessmentQuerySchema,
|
|
37
38
|
trafficSamplesQuerySchema,
|
|
38
39
|
trafficSeriesGranularitySchema,
|
|
39
40
|
trafficUnrecognizedAgentsQuerySchema
|
|
40
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-O7S7OHLE.js";
|
|
41
42
|
import "./chunk-MLKGABMK.js";
|
|
42
43
|
|
|
43
44
|
// src/commands/traffic.ts
|
|
@@ -214,12 +215,7 @@ function assertCloudflareArtifactsDoNotContainSecrets(contents, secrets) {
|
|
|
214
215
|
}
|
|
215
216
|
}
|
|
216
217
|
function redactCloudflareSecrets(message, secrets) {
|
|
217
|
-
|
|
218
|
-
const secretValues = "apiToken" in secrets ? [secrets.apiToken] : [secrets.bearerToken, secrets.hmacSecret];
|
|
219
|
-
for (const secret of secretValues) {
|
|
220
|
-
if (secret) redacted = redacted.replaceAll(secret, "[REDACTED]");
|
|
221
|
-
}
|
|
222
|
-
return redacted;
|
|
218
|
+
return redactKnownSecrets(message, "apiToken" in secrets ? [secrets.apiToken] : [secrets.bearerToken, secrets.hmacSecret]);
|
|
223
219
|
}
|
|
224
220
|
async function runWrangler(command, args, opts) {
|
|
225
221
|
await new Promise((resolve, reject) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createApiClient
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-UGO2FO6V.js";
|
|
4
|
+
import "./chunk-EE3QTCLS.js";
|
|
5
5
|
import "./chunk-AOJU5LKX.js";
|
|
6
6
|
import {
|
|
7
7
|
isMachineFormat
|
|
@@ -11,13 +11,13 @@ import {
|
|
|
11
11
|
TrendUnits,
|
|
12
12
|
formatPercent,
|
|
13
13
|
formatSignedPointDelta
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-O7S7OHLE.js";
|
|
15
15
|
import "./chunk-MLKGABMK.js";
|
|
16
16
|
|
|
17
17
|
// src/commands/trends.ts
|
|
18
18
|
var SURFACE_TITLES = {
|
|
19
19
|
"index-coverage": "Index coverage",
|
|
20
|
-
"site-health": "
|
|
20
|
+
"site-health": "Agent Readiness",
|
|
21
21
|
backlinks: "Backlinks"
|
|
22
22
|
};
|
|
23
23
|
function formatReading(figure, value) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createApiClient
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-UGO2FO6V.js";
|
|
4
|
+
import "./chunk-EE3QTCLS.js";
|
|
5
5
|
import {
|
|
6
6
|
emitJsonl
|
|
7
7
|
} from "./chunk-Z7IUAJOF.js";
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
USER_PASSWORD_MIN_LENGTH,
|
|
15
15
|
UserRoles,
|
|
16
16
|
formatIsoDate
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-O7S7OHLE.js";
|
|
18
18
|
import "./chunk-MLKGABMK.js";
|
|
19
19
|
|
|
20
20
|
// src/cli-prompt.ts
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
citedBase
|
|
3
|
+
} from "./chunk-J6536OL6.js";
|
|
1
4
|
import {
|
|
2
5
|
createApiClient
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-UGO2FO6V.js";
|
|
7
|
+
import "./chunk-EE3QTCLS.js";
|
|
5
8
|
import {
|
|
6
9
|
emitJsonl
|
|
7
10
|
} from "./chunk-Z7IUAJOF.js";
|
|
@@ -14,7 +17,7 @@ import {
|
|
|
14
17
|
isVisibilityCompareClassMetric,
|
|
15
18
|
shareOfVoiceLabel,
|
|
16
19
|
shareOfVoiceReason
|
|
17
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-O7S7OHLE.js";
|
|
18
21
|
import "./chunk-MLKGABMK.js";
|
|
19
22
|
|
|
20
23
|
// src/commands/visibility-stats.ts
|
|
@@ -143,7 +146,8 @@ function printVisibilityCompare(data) {
|
|
|
143
146
|
}
|
|
144
147
|
}
|
|
145
148
|
function citedCell(c) {
|
|
146
|
-
|
|
149
|
+
const measured = citedBase(c.total, c.citationNotMeasured);
|
|
150
|
+
return measured === 0 && c.total > 0 ? "n/m" : `${c.cited}/${measured}`;
|
|
147
151
|
}
|
|
148
152
|
function mentionedCell(c) {
|
|
149
153
|
return `${c.mentioned}/${c.checked}`;
|
|
@@ -156,7 +160,7 @@ function printVisibilityStats(data) {
|
|
|
156
160
|
if (w.until !== null) windowParts.push(`until ${w.until}`);
|
|
157
161
|
console.log("Visibility stats (cited = source list, mentioned = answer text)");
|
|
158
162
|
console.log(`Window: ${windowParts.join(" \xB7 ")}`);
|
|
159
|
-
console.log('Cited = cited/
|
|
163
|
+
console.log('Cited = cited/measured snapshots (n/m: the engine returns no sources) \xB7 Mentioned = mentioned/checked (checked excludes "not checked")');
|
|
160
164
|
console.log("");
|
|
161
165
|
if (data.queries.length === 0) {
|
|
162
166
|
console.log("No answer-visibility snapshots in this window \u2014 run a sweep first (canonry run <project>).");
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createApiClient
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-UGO2FO6V.js";
|
|
4
|
+
import "./chunk-EE3QTCLS.js";
|
|
5
5
|
import "./chunk-AOJU5LKX.js";
|
|
6
6
|
import {
|
|
7
7
|
CliError,
|
|
8
8
|
isMachineFormat
|
|
9
9
|
} from "./chunk-HGMYEDAQ.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-O7S7OHLE.js";
|
|
11
11
|
import "./chunk-MLKGABMK.js";
|
|
12
12
|
|
|
13
13
|
// src/commands/wordpress.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@canonry/canonry",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.100.0",
|
|
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": [
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"@anthropic-ai/sdk": "^0.137.0",
|
|
60
|
-
"@canonry/agent-readiness": "8.
|
|
60
|
+
"@canonry/agent-readiness": "8.1.0",
|
|
61
61
|
"@earendil-works/pi-agent-core": "1.3.0",
|
|
62
62
|
"@earendil-works/pi-ai": "1.3.0",
|
|
63
63
|
"@fastify/rate-limit": "^11.2.1",
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{H as t,Q as n,W as r,lt as i}from"./vendor-lucide-DuOM7wVi.js";import{r as a}from"./vendor-markdown-BDQ1GKGP.js";import{Jr as o,Qt as s,Tt as c,Xr as l,Yr as u,Zt as d,ct as f,kn as p,r as m,t as h,wt as g}from"./ToneBadge-Cii5KNtg.js";import{r as _}from"./account-context-CdEHcI5S.js";import{t as v}from"./async-handler-Bj3TnIRw.js";import{et as y,it as b}from"./index-BTz-B9hV.js";var x=e(i(),1),S=a(),C=`https://github.com/Canonry/canonry/blob/main/docs/mcp.md`,w=`https://github.com/Canonry/canonry/blob/main/docs/plugins.md`,T=`https://help.openai.com/en/articles/12584461-connecting-custom-mcp-servers-in-chatgpt`,E=`https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp`,D=`codex plugin marketplace add Canonry/canonry
|
|
2
|
-
codex plugin add canonry-remote@canonry`,O={[u[`public-url-required`]]:`Configure this instance’s public URL before connecting a hosted client.`,[u[`https-required`]]:`Configure an HTTPS public URL for this instance.`,[u[`public-host-required`]]:`Use a public HTTPS address that your client can reach. Localhost and private-network addresses do not work for hosted connectors.`,[u[`public-path-mismatch`]]:`Make the publicUrl path match basePath, and preserve that prefix when the proxy forwards requests for hosted OAuth.`,[u[`oauth-unavailable`]]:`The sign-in routes are unavailable. Check this instance’s OAuth configuration.`,[u[`account-required`]]:`Create a named Canonry account on this instance’s server with canonry user create. A shared dashboard password does not provide an OAuth account.`,[u[`transport-unavailable`]]:`Restore the instance’s HTTP MCP service before connecting a hosted client.`},k={codex:{label:`Codex`,command:`codex plugin marketplace add Canonry/canonry
|
|
3
|
-
codex plugin add canonry@canonry`},claude:{label:`Claude Code`,command:`claude plugin marketplace add Canonry/canonry
|
|
4
|
-
claude plugin install canonry@canonry`},other:{label:`Other MCP clients`,command:`canonry-mcp`}};function A({label:e,value:t,showText:i=!1,secondary:a=!1,action:o=`agent_setup.copy`}){let s=(0,x.useId)(),[c,l]=(0,x.useState)(!1),[u,d]=(0,x.useState)(!1);async function f(){try{await navigator.clipboard.writeText(t),p(o),l(!0),d(!1)}catch{l(!1),d(!0)}}return(0,S.jsxs)(`div`,{className:`min-w-0 space-y-3`,children:[i?(0,S.jsx)(`pre`,{className:`overflow-x-auto material-base p-3 text-copy-14 text-heading`,children:(0,S.jsx)(`code`,{children:t})}):null,(0,S.jsxs)(m,{type:`button`,className:`pointer-coarse:min-h-11`,variant:a?`outline`:`default`,onClick:v(f),children:[c?(0,S.jsx)(n,{className:`size-4`,"aria-hidden":`true`}):(0,S.jsx)(r,{className:`size-4`,"aria-hidden":`true`}),e]}),c?(0,S.jsx)(`p`,{role:`status`,className:`text-copy-14 text-secondary`,children:`Copied.`}):null,!i||u?(0,S.jsxs)(`details`,{open:u||void 0,className:`text-label-14 text-secondary`,children:[(0,S.jsx)(`summary`,{className:`min-h-11 w-fit cursor-pointer py-3`,children:u?`Copy unavailable. Select the text below.`:`Preview text`}),(0,S.jsxs)(`label`,{htmlFor:s,className:`sr-only`,children:[e,` text`]}),(0,S.jsx)(`textarea`,{id:s,readOnly:!0,rows:u&&i?3:8,value:t,className:`mt-2 w-full rounded-md border border-default bg-bg p-3 text-copy-14 text-heading`})]}):null]})}function j(){return g()||c()?(0,S.jsxs)(`div`,{className:`page-container`,children:[(0,S.jsx)(`h1`,{className:`page-title`,children:`Agent setup`}),(0,S.jsx)(`p`,{className:`mt-3 text-copy-14 text-secondary`,children:`Open Agent setup in your own Canonry instance to connect your agent.`}),s()?(0,S.jsx)(`a`,{className:`mt-4 inline-block text-label-14 underline`,href:C,target:`_blank`,rel:`noopener noreferrer`,children:`Read the connection guide`}):null]}):(0,S.jsx)(M,{})}function M(){let e=b(),{isAdmin:n}=_(),r=d(),i=s(),a=y(!e,e?.health),c=a.data?.apiStatus,u=c?.state===`ok`?c.mcp:void 0,p=u?.status===l.available&&u.hosted?.status===o.ready?u.hosted:void 0,m=u?.hosted?.status===o.unavailable?u.hosted.reason:void 0,g=`${window.location.origin}${f()}`,v=`This server has not confirmed a public URL and OAuth sign-in. Ask your administrator to check the connection configuration or update Canonry.`;a.isPending?v=`Checking the instance’s hosted connection settings.`:m?v=n&&r?O[m]:`Ask your Canonry administrator to finish hosted connection setup for this instance.`:c?.state===`error`?v=`The instance’s connection settings could not be checked. Try again after the service is available.`:u?.status===l[`not-supported`]&&(v=`This deployment does not provide hosted MCP connections. Ask your administrator for a supported connection.`);let x=p?`Help me connect this existing Canonry instance to ChatGPT or Claude Desktop using its remote MCP URL: ${p.url}
|
|
5
|
-
|
|
6
|
-
Use the client's remote MCP connection flow with OAuth sign-in. For Claude, set the OAuth client option to Register automatically; Claude's published identity is not supported here, and on Team or Enterprise plans an Owner adds custom connectors. Have me sign in to Canonry in the browser and review the requested access before approving it. Keep passwords, API keys, browser sessions, and other credentials out of chat. Do not install software, run local commands, create another instance, or broaden access.
|
|
7
|
-
|
|
8
|
-
ChatGPT guide: ${T}
|
|
9
|
-
Claude guide: ${E}
|
|
10
|
-
|
|
11
|
-
After authorization, enable the connection in this conversation. Call canonry_help with intent "status", follow its available tool guidance, and list accessible projects using stored reads only. Confirm the target instance and report whether the read succeeded; an empty list can still mean success. Do not run scans, sweeps, research, live provider checks, or other writes.`:void 0;return(0,S.jsxs)(`div`,{className:`page-container`,children:[(0,S.jsx)(`div`,{className:`page-header`,children:(0,S.jsxs)(`div`,{className:`page-header-left`,children:[(0,S.jsx)(`h1`,{className:`page-title`,children:`Agent setup`}),(0,S.jsx)(`p`,{className:`page-subtitle`,children:r?`Connect ChatGPT, Claude Desktop, or another agent to this instance.`:`Connect ChatGPT or Claude Desktop to this instance.`})]})}),(0,S.jsxs)(`div`,{className:`max-w-3xl`,children:[(0,S.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3 border-b border-default pb-5`,children:[(0,S.jsxs)(`div`,{className:`min-w-0`,children:[(0,S.jsx)(`p`,{className:`text-copy-14-strong text-heading`,children:`Your Canonry instance`}),(0,S.jsx)(`p`,{className:`mt-1 break-all text-copy-14 text-secondary`,children:g})]}),(0,S.jsx)(h,{tone:p?`positive`:m||c?.state===`error`?`caution`:`neutral`,children:p?`Hosted setup configured`:a.isPending?`Checking hosted setup`:m?`Hosted setup needs attention`:`Hosted setup not confirmed`})]}),p&&x?p.plugin?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(N,{plugin:p.plugin}),(0,S.jsxs)(`details`,{className:`border-t border-default py-3 text-label-14`,children:[(0,S.jsx)(`summary`,{className:`min-h-11 w-fit cursor-pointer py-3 text-label-14-strong text-heading`,children:`Connect directly (Claude and other MCP clients)`}),(0,S.jsx)(P,{url:p.url,setupPrompt:x})]})]}):(0,S.jsx)(P,{url:p.url,setupPrompt:x}):(0,S.jsxs)(`section`,{className:`py-6`,"aria-labelledby":`agent-requirements-title`,children:[(0,S.jsx)(`h2`,{id:`agent-requirements-title`,className:`text-heading-20 text-heading`,children:`Before you connect a hosted client`}),(0,S.jsx)(`p`,{className:`mt-2 max-w-prose text-copy-14 text-secondary`,children:v}),i?(0,S.jsxs)(`a`,{href:C,target:`_blank`,rel:`noopener noreferrer`,className:`mt-3 inline-flex min-h-11 items-center gap-2 text-label-14 underline`,children:[`Read the connection guide `,(0,S.jsx)(t,{className:`size-3.5`,"aria-hidden":`true`})]}):null]}),r?(0,S.jsx)(I,{instanceUrl:g,showResourceLinks:i}):null]})]})}function N({plugin:e}){return(0,S.jsxs)(`section`,{className:`py-6`,"aria-labelledby":`agent-plugin-title`,children:[(0,S.jsx)(`h2`,{id:`agent-plugin-title`,className:`text-heading-20 text-heading`,children:`Use the Canonry plugin`}),(0,S.jsx)(`p`,{className:`mt-2 max-w-prose text-copy-14 text-secondary`,children:`For the ChatGPT desktop app and Codex. The plugin opens this workspace with your Canonry sign-in and reads stored results only.`}),(0,S.jsxs)(`ol`,{className:`mt-5 space-y-6`,children:[(0,S.jsxs)(`li`,{className:`space-y-3`,children:[(0,S.jsx)(`h3`,{className:`text-label-14-strong text-heading`,children:`1. Install the plugin`}),(0,S.jsx)(`p`,{className:`max-w-prose text-copy-14 text-secondary`,children:`Add the Canonry marketplace, then install Canonry. In Codex, run:`}),(0,S.jsx)(A,{label:`Copy plugin install commands`,value:D,showText:!0,secondary:!0})]}),(0,S.jsxs)(`li`,{className:`space-y-3`,children:[(0,S.jsx)(`h3`,{className:`text-label-14-strong text-heading`,children:`2. Enter this workspace`}),(0,S.jsx)(`p`,{className:`max-w-prose text-copy-14 text-secondary`,children:`When Canonry asks which workspace to open, enter:`}),(0,S.jsx)(A,{label:`Copy workspace`,value:e.workspace,showText:!0,secondary:!0},e.workspace)]}),(0,S.jsxs)(`li`,{className:`space-y-2`,children:[(0,S.jsx)(`h3`,{className:`text-label-14-strong text-heading`,children:`3. Sign in and approve access`}),(0,S.jsx)(`p`,{className:`max-w-prose text-copy-14 text-secondary`,children:`Sign in with your Canonry account for this workspace and approve read access. The plugin cannot start sweeps or change settings.`})]})]})]})}function P({url:e,setupPrompt:t}){return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`section`,{className:`py-6`,"aria-labelledby":`agent-connect-title`,children:[(0,S.jsx)(`h2`,{id:`agent-connect-title`,className:`text-heading-20 text-heading`,children:`1. Add Canonry to your client`}),(0,S.jsx)(`p`,{className:`mt-2 mb-4 max-w-prose text-copy-14 text-secondary`,children:`Add this URL to your client’s remote connector settings. No local installation is needed.`}),(0,S.jsx)(A,{label:`Copy MCP URL`,value:e,showText:!0},e),(0,S.jsxs)(`div`,{className:`mt-4 flex flex-wrap gap-x-5 gap-y-2 text-label-14 text-secondary`,children:[(0,S.jsx)(`a`,{href:T,target:`_blank`,rel:`noopener noreferrer`,className:`underline`,children:`ChatGPT setup guide`}),(0,S.jsx)(`a`,{href:E,target:`_blank`,rel:`noopener noreferrer`,className:`underline`,children:`Claude Desktop setup guide`})]}),(0,S.jsx)(`p`,{className:`mt-2 max-w-prose text-copy-14 text-secondary`,children:`Choose OAuth. In Claude, set the OAuth client to “Register automatically”. On Claude Team and Enterprise plans, an Owner adds the connector first.`}),(0,S.jsx)(`div`,{className:`mt-4`,children:(0,S.jsx)(A,{label:`Copy setup prompt`,value:t,secondary:!0},t)})]}),(0,S.jsxs)(`section`,{className:`border-t border-default py-6`,"aria-labelledby":`agent-authorize-title`,children:[(0,S.jsx)(`h2`,{id:`agent-authorize-title`,className:`text-heading-20 text-heading`,children:`2. Sign in and approve access`}),(0,S.jsx)(`p`,{className:`mt-2 max-w-prose text-copy-14 text-secondary`,children:`Sign in with your Canonry account and review the requested access. After approving it, return to your client and enable the connection for your conversation.`})]}),(0,S.jsxs)(`section`,{className:`border-t border-default py-6`,"aria-labelledby":`agent-verify-title`,children:[(0,S.jsx)(`h2`,{id:`agent-verify-title`,className:`text-heading-20 text-heading`,children:`3. Verify the connection`}),(0,S.jsx)(`p`,{className:`mt-2 mb-4 max-w-prose text-copy-14 text-secondary`,children:`Server configuration is ready. Use this prompt to confirm your agent can read your projects without starting work or using provider quota.`}),(0,S.jsx)(F,{target:e})]})]})}function F({target:e,local:t=!1}){let n=`Verify my existing Canonry connection targets ${e}. Call canonry_help with intent "status", follow its available tool guidance, then list accessible projects using stored reads only. Report the instance, connection method, and whether the project read succeeded. An empty project list can still be a successful connection. If the target cannot be confirmed, stop and explain. Do not install anything, change configuration, create projects, run scans, sweeps, research, or live provider checks.`;return(0,S.jsx)(A,{label:t?`Copy local verification prompt`:`Copy verification prompt`,value:n,secondary:!0,action:`agent_setup.verify_copy`},e)}function I({instanceUrl:e,showResourceLinks:n}){let[r,i]=(0,x.useState)(`codex`),a=`Connect my local agent to this existing Canonry instance: ${e}
|
|
12
|
-
|
|
13
|
-
Use an installed Canonry runtime whose private configuration already points to this exact instance. A local plugin or canonry-mcp process does not inherit the browser connection, and shell environment changes do not retarget an already-connected tool. Check the saved API URL before using it.
|
|
14
|
-
|
|
15
|
-
${n?`Official connection guide: ${C}
|
|
16
|
-
Optional plugin guide for Codex or Claude Code: ${w}
|
|
17
|
-
|
|
18
|
-
`:``}Preserve existing client connections, credentials, and access. Do not create another Canonry instance, bootstrap a config, or create projects. Keep secrets and configuration contents out of chat. Ask before changing client configuration or installing software. Reload the client if needed, then verify with stored reads only. Do not run scans, sweeps, research, live provider checks, or other writes.`;return(0,S.jsxs)(`details`,{className:`border-t border-default py-3 text-label-14`,children:[(0,S.jsx)(`summary`,{className:`min-h-11 w-fit cursor-pointer py-3 text-label-14-strong text-heading`,children:`Local plugins and other MCP clients`}),(0,S.jsxs)(`div`,{className:`space-y-4 py-4`,children:[(0,S.jsx)(`p`,{className:`max-w-prose text-copy-14 text-secondary`,children:`For an agent running on your computer, use a Canonry runtime whose private configuration already points to this instance. The plugin does not inherit your browser connection.`}),(0,S.jsx)(A,{label:`Copy local setup prompt`,value:a,secondary:!0}),(0,S.jsx)(`label`,{className:`block text-label-14-strong text-heading`,htmlFor:`agent-client`,children:`Your client`}),(0,S.jsx)(`select`,{id:`agent-client`,className:`h-11 max-w-full rounded-md border border-default bg-bg px-3 text-label-14 text-heading`,value:r,onChange:e=>{let t=e.target.value;(t===`codex`||t===`claude`||t===`other`)&&i(t)},children:Object.entries(k).map(([e,t])=>(0,S.jsx)(`option`,{value:e,children:t.label},e))}),(0,S.jsx)(A,{label:r===`other`?`Copy MCP command`:`Copy install commands`,value:k[r].command,showText:!0,secondary:!0},r),(0,S.jsxs)(`p`,{className:`text-copy-14 text-secondary`,children:[r===`other`?`Add this executable as a stdio MCP server in your client.`:`Reload your client after installing the plugin.`,` Keep one Canonry connection per instance.`]}),n?(0,S.jsxs)(`a`,{href:w,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex min-h-11 items-center gap-2 underline`,children:[`Runtime and plugin instructions `,(0,S.jsx)(t,{className:`size-3.5`,"aria-hidden":`true`})]}):null,(0,S.jsx)(F,{target:e,local:!0})]})]})}export{j as AgentSetupPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{lt as t}from"./vendor-lucide-DuOM7wVi.js";import{r as n}from"./vendor-markdown-BDQ1GKGP.js";import{b as r}from"./vendor-tanstack-BNuZ37rE.js";import{mt as i,r as a,t as o}from"./ToneBadge-Cii5KNtg.js";import{fn as s,i as c,nt as l}from"./react-query-DI7VfOND.js";import{t as u}from"./card-B1O0SunG.js";var d=e(t(),1),f=n(),p=100;function m(e){if(e===`all`)return;let t=Number.parseInt(e,10);return new Date(Date.now()-t*24*60*60*1e3).toISOString()}function h(e){let t=e.userAgent?.toLowerCase()??``;return t.includes(`canonry-mcp`)?`MCP`:t.includes(`canonry-cli`)?`CLI`:t.includes(`mozilla/`)?`Dashboard`:e.actor===`scheduler`?`Scheduler`:e.actor===`agent`?`Agent`:e.actor===`mcp`?`MCP`:e.actor===`cli`?`CLI`:e.actor}function g(e){return/delete|remove|revoke|disconnect|failed|refused/.test(e)?`negative`:/create|add|connect|completed/.test(e)?`positive`:/update|replace|sync|apply/.test(e)?`caution`:`neutral`}function _(e){return[e.action,e.actor,e.entityType,e.entityId,e.actorSession,e.userAgent,e.diff==null?``:JSON.stringify(e.diff)].filter(Boolean).join(` `).toLowerCase()}function v({projectName:e}){let[t,n]=(0,d.useState)(0),[v,y]=(0,d.useState)(`90d`),[b,x]=(0,d.useState)(``),[S,C]=(0,d.useState)(``),w=(0,d.useMemo)(()=>m(v),[v]),T={limit:p,offset:t*p,since:w,actor:b||void 0},E=r({...l({client:i,path:{name:e??``},query:T}),enabled:!!e}),D=r({...c({client:i,query:T}),enabled:!e}),O=r({...s({client:i}),enabled:!e}),k=e?E:D,A=k.data??[],j=(0,d.useMemo)(()=>new Map((O.data??[]).map(e=>[e.id,e.displayName||e.name])),[O.data]),M=S.trim().toLowerCase(),N=(0,d.useMemo)(()=>M?A.filter(e=>_(e).includes(M)):A,[A,M]),P=e=>{n(0),e()};return k.isLoading?(0,f.jsx)(`p`,{className:`supporting-copy mt-6`,role:`status`,children:`Loading change history…`}):(0,f.jsxs)(`section`,{className:`mt-6`,"aria-labelledby":`change-history-heading`,children:[(0,f.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,f.jsxs)(`div`,{children:[(0,f.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Audit trail`}),(0,f.jsx)(`h2`,{id:`change-history-heading`,children:`Change history`}),(0,f.jsx)(`p`,{className:`supporting-copy mt-1 max-w-2xl`,children:`Configuration and operator actions. Execution outcomes remain in Runs.`})]}),(0,f.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>void k.refetch(),disabled:k.isFetching,children:k.isFetching?`Refreshing…`:`Refresh`})]}),(0,f.jsxs)(`div`,{className:`mt-4 grid gap-2 sm:grid-cols-3`,children:[(0,f.jsx)(`input`,{type:`search`,"aria-label":`Search change history`,value:S,onChange:e=>C(e.target.value),placeholder:`Search actions, entities, or details`,className:`min-h-11 rounded-md border border-base bg-bg px-3 text-label-14 text-strong placeholder-mono-400 focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-600`}),(0,f.jsxs)(`select`,{"aria-label":`Filter change history by actor`,value:b,onChange:e=>P(()=>x(e.target.value)),className:`min-h-11 rounded-md border border-base bg-bg px-3 text-label-14 text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-600`,children:[(0,f.jsx)(`option`,{value:``,children:`All actors`}),(0,f.jsx)(`option`,{value:`api`,children:`API and dashboard`}),(0,f.jsx)(`option`,{value:`cli`,children:`CLI`}),(0,f.jsx)(`option`,{value:`scheduler`,children:`Scheduler`}),(0,f.jsx)(`option`,{value:`agent`,children:`Agent`}),(0,f.jsx)(`option`,{value:`mcp`,children:`MCP`})]}),(0,f.jsxs)(`select`,{"aria-label":`Filter change history by date range`,value:v,onChange:e=>P(()=>y(e.target.value)),className:`min-h-11 rounded-md border border-base bg-bg px-3 text-label-14 text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-600`,children:[(0,f.jsx)(`option`,{value:`30d`,children:`Last 30 days`}),(0,f.jsx)(`option`,{value:`90d`,children:`Last 90 days`}),(0,f.jsx)(`option`,{value:`365d`,children:`Last year`}),(0,f.jsx)(`option`,{value:`all`,children:`All retained history`})]})]}),k.isError?(0,f.jsxs)(u,{className:`surface-card empty-card mt-4`,children:[(0,f.jsx)(`h3`,{children:`Change history unavailable`}),(0,f.jsx)(`p`,{children:k.error instanceof Error?k.error.message:`Could not load the audit trail.`})]}):N.length===0?(0,f.jsxs)(u,{className:`surface-card empty-card mt-4`,children:[(0,f.jsx)(`h3`,{children:`No changes match these filters`}),(0,f.jsx)(`p`,{children:`Widen the date range or clear the actor and search filters.`})]}):(0,f.jsx)(`div`,{className:`evidence-table-wrap mt-4`,children:(0,f.jsxs)(`table`,{className:`evidence-table`,children:[(0,f.jsx)(`thead`,{children:(0,f.jsxs)(`tr`,{children:[(0,f.jsx)(`th`,{children:`When`}),e?null:(0,f.jsx)(`th`,{children:`Scope`}),(0,f.jsx)(`th`,{children:`Action`}),(0,f.jsx)(`th`,{children:`Entity`}),(0,f.jsx)(`th`,{children:`Origin`}),(0,f.jsx)(`th`,{children:`Details`})]})}),(0,f.jsx)(`tbody`,{children:N.map(t=>(0,f.jsxs)(`tr`,{children:[(0,f.jsx)(`td`,{className:`whitespace-nowrap tabular-nums text-muted`,children:new Date(t.createdAt).toLocaleString()}),e?null:(0,f.jsx)(`td`,{className:`text-secondary`,children:t.projectId?j.get(t.projectId)??`Deleted project · ${t.projectId}`:`Instance settings`}),(0,f.jsx)(`td`,{children:(0,f.jsx)(o,{tone:g(t.action),children:t.action})}),(0,f.jsxs)(`td`,{children:[(0,f.jsx)(`span`,{className:`text-strong`,children:t.entityType}),t.entityId?(0,f.jsx)(`span`,{className:`mt-0.5 block max-w-48 truncate text-label-12-mono text-faint`,title:t.entityId,children:t.entityId}):null]}),(0,f.jsxs)(`td`,{children:[(0,f.jsx)(`span`,{className:`text-secondary`,children:h(t)}),t.actorSession?(0,f.jsxs)(`span`,{className:`mt-0.5 block max-w-40 truncate text-label-12-mono text-faint`,title:t.actorSession,children:[`Session `,t.actorSession]}):null]}),(0,f.jsx)(`td`,{children:t.diff==null?(0,f.jsx)(`span`,{className:`text-faint`,children:`No field diff`}):(0,f.jsxs)(`details`,{children:[(0,f.jsx)(`summary`,{className:`min-h-11 cursor-pointer py-3 text-label-14 text-secondary hover:text-strong`,children:`View diff`}),(0,f.jsx)(`pre`,{className:`max-h-72 max-w-xl overflow-auto whitespace-pre-wrap break-words rounded-md bg-bg-elevated p-3 text-copy-13 text-secondary`,children:JSON.stringify(t.diff,null,2)})]})})]},t.id))})]})}),!k.isError&&(t>0||A.length===p)?(0,f.jsxs)(`div`,{className:`mt-4 flex items-center justify-between gap-3`,children:[(0,f.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,disabled:t===0,onClick:()=>n(e=>Math.max(0,e-1)),children:`Previous`}),(0,f.jsxs)(`span`,{className:`text-label-12 tabular-nums text-muted`,children:[`Page `,t+1]}),(0,f.jsx)(a,{type:`button`,variant:`outline`,size:`sm`,disabled:A.length<p,onClick:()=>n(e=>e+1),children:`Next`})]}):null]})}export{v as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{H as t,U as n,c as r,lt as i,s as a,w as o}from"./vendor-lucide-DuOM7wVi.js";import{r as s}from"./vendor-markdown-BDQ1GKGP.js";import{H as c,L as l,R as u,U as d,a as f,dn as p,jt as m,q as h,r as g,t as _,vt as v,wt as y}from"./ToneBadge-Cii5KNtg.js";import{t as b}from"./async-handler-Bj3TnIRw.js";import{t as x}from"./card-B1O0SunG.js";import{t as S}from"./Hint-c4a4W87X.js";var C=e(i(),1),w=s(),T=`https://commoncrawl.org/web-graphs`;function E(e){return e==null?`—`:e>=0xe8d4a51000?`${(e/0xe8d4a51000).toFixed(1)} TB`:e>=1e9?`${(e/1e9).toFixed(1)} GB`:e>=1e6?`${(e/1e6).toFixed(1)} MB`:e>=1e3?`${(e/1e3).toFixed(1)} KB`:`${e} B`}function D(e){if(!e)return`—`;let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/6e4);if(n<1)return`just now`;if(n<60)return`${n}m ago`;let r=Math.floor(n/60);return r<24?`${r}h ago`:`${Math.floor(r/24)}d ago`}function O(e){switch(e){case`ready`:return`positive`;case`failed`:return`negative`;case`downloading`:case`querying`:case`queued`:return`caution`}}function k(){let[e,i]=(0,C.useState)(null),[s,k]=(0,C.useState)(null),[A,j]=(0,C.useState)([]),[M,N]=(0,C.useState)([]),[P,F]=(0,C.useState)(null),[I,L]=(0,C.useState)(!0),[R,z]=(0,C.useState)(!1),[B,V]=(0,C.useState)(!1),[H,U]=(0,C.useState)(``),[W,G]=(0,C.useState)(!1),[K,q]=(0,C.useState)(null),[J,Y]=(0,C.useState)(null),X=(0,C.useCallback)(async()=>{L(!0),q(null);try{let[e,t,n,r,a]=await Promise.all([l(),d().catch(()=>null),h().catch(()=>[]),u().catch(()=>[]),c().catch(()=>null)]);i(e),k(t),j(n),N(r),F(a)}catch(e){q(e instanceof Error?e.message:`Failed to load backlinks status`)}finally{L(!1)}},[]);(0,C.useEffect)(()=>{X()},[X]);async function Z(){z(!0),q(null),Y(null);try{let e=await v();Y(e.alreadyPresent?`DuckDB already installed (${e.version}).`:`Installed DuckDB ${e.version}.`),await X()}catch(e){q(e instanceof Error?e.message:`Failed to install DuckDB`)}finally{z(!1)}}async function Q(){let e=H.trim()||void 0;V(!0),q(null),Y(null);try{let t=await p(e);Y(e?`Queued sync for ${t.release}. Download + query runs in the background.`:`Queued sync for auto-discovered release ${t.release}. Download + query runs in the background.`),U(``),G(!1),await X()}catch(e){e instanceof f&&e.code===`MISSING_DEPENDENCY`?q(`DuckDB is not installed. Install it first.`):q(e instanceof Error?e.message:`Failed to trigger sync`)}finally{V(!1)}}async function $(e){q(null),Y(null);try{await m(e),Y(`Pruned cached release ${e}.`),await X()}catch(e){q(e instanceof Error?e.message:`Failed to prune release`)}}let ee=s?.status===`ready`&&M.every(e=>e.release!==s.release);return(0,w.jsxs)(`div`,{className:`page-container`,children:[(0,w.jsx)(`div`,{className:`page-header`,children:(0,w.jsxs)(`div`,{className:`page-header-left`,children:[(0,w.jsx)(`h1`,{className:`page-title`,children:`Backlink data`}),(0,w.jsx)(`p`,{className:`page-subtitle`,children:`Manage the shared backlink source and review its latest data.`})]})}),K&&(0,w.jsx)(x,{className:`surface-card p-4 mb-4 bg-negative-soft`,children:(0,w.jsx)(`p`,{className:`text-copy-14 text-negative`,children:K})}),J&&(0,w.jsx)(x,{className:`surface-card p-4 mb-4 bg-positive-soft`,children:(0,w.jsx)(`p`,{className:`text-copy-14 text-positive`,children:J})}),(0,w.jsxs)(`section`,{className:`page-section-divider`,children:[(0,w.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Readiness`}),(0,w.jsx)(`h2`,{children:`Backlink source`})]}),e?.duckdbInstalled?(0,w.jsx)(_,{tone:`positive`,children:`Installed`}):(0,w.jsx)(_,{tone:`caution`,children:`Not installed`})]}),(0,w.jsx)(x,{className:`surface-card p-4`,children:I?(0,w.jsx)(`p`,{className:`text-copy-14 text-muted`,children:`Checking…`}):e?.duckdbInstalled?(0,w.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`Ready to sync a Common Crawl release.`}):(0,w.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,w.jsx)(`p`,{className:`text-copy-14 text-secondary`,children:`Install the local query engine to enable release syncs.`}),!y()&&(0,w.jsxs)(g,{type:`button`,size:`sm`,disabled:R,onClick:b(Z),children:[(0,w.jsx)(n,{className:`h-4 w-4 mr-1.5`,"aria-hidden":!0}),R?`Installing…`:`Install DuckDB`]})]})})]}),(0,w.jsxs)(`section`,{className:`page-section-divider`,children:[(0,w.jsxs)(`div`,{className:`section-head section-head-inline`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`Latest sync`}),(0,w.jsxs)(`h2`,{className:`flex items-center gap-2`,children:[`Release sync`,(0,w.jsx)(S,{label:`What is a release sync?`,children:`A release sync downloads one Common Crawl dump (~16 GB) and extracts backlinks for every project in this workspace in one pass. This is the heavy job — subsequent per-project re-runs skip the download and just re-query the cached files.`})]})]}),s&&(0,w.jsx)(_,{tone:O(s.status),children:s.status})]}),(0,w.jsxs)(x,{className:`surface-card p-5`,children:[s?(0,w.jsxs)(`div`,{className:`space-y-2 text-label-14`,children:[(0,w.jsxs)(`p`,{className:`text-strong`,children:[`Release `,(0,w.jsx)(`code`,{className:`text-neutral`,children:s.release})]}),s.phaseDetail&&(0,w.jsx)(`p`,{className:`text-secondary`,children:s.phaseDetail}),(0,w.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-4 gap-4 text-label-12 text-muted pt-2`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`text-faint normal-case text-label-12`,children:`Projects`}),(0,w.jsx)(`p`,{className:`text-neutral mt-0.5`,children:s.projectsProcessed??`—`})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsxs)(`p`,{className:`text-faint normal-case text-label-12 flex items-center gap-1`,children:[`Rows`,(0,w.jsx)(S,{label:`What are rows?`,children:`Total number of (project, referring domain) pairs persisted in SQLite from this sync, across every project in the workspace.`})]}),(0,w.jsx)(`p`,{className:`text-neutral mt-0.5`,children:s.domainsDiscovered??`—`})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`text-faint normal-case text-label-12`,children:`Started`}),(0,w.jsx)(`p`,{className:`text-neutral mt-0.5`,children:D(s.downloadStartedAt??s.createdAt)})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`text-faint normal-case text-label-12`,children:`Finished`}),(0,w.jsx)(`p`,{className:`text-neutral mt-0.5`,children:D(s.queryFinishedAt)})]})]}),s.error&&(0,w.jsx)(`p`,{className:`text-copy-14 text-negative-400 pt-2`,children:s.error})]}):(0,w.jsx)(`p`,{className:`text-copy-14 text-muted`,children:`No release sync has run in this workspace yet.`}),ee&&(0,w.jsx)(`div`,{className:`mt-4 rounded border border-caution-800/60 bg-caution-950/20 p-3`,children:(0,w.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,w.jsx)(a,{className:`h-4 w-4 text-caution-400 shrink-0 mt-0.5`,"aria-hidden":!0}),(0,w.jsxs)(`div`,{className:`text-label-14 text-neutral`,children:[(0,w.jsx)(`p`,{className:`text-copy-14-strong text-caution-200`,children:`Cached files for this release are missing.`}),(0,w.jsx)(`p`,{className:`mt-1 text-secondary`,children:`Sync this release again, or sync the newest release, before refreshing individual projects.`})]})]})}),(0,w.jsxs)(`div`,{className:`mt-4 material-base p-3`,children:[(0,w.jsxs)(`div`,{className:`flex items-start justify-between gap-3 mb-3`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`text-label-12 normal-case text-muted`,children:`Auto-detected release`}),P?(0,w.jsxs)(`p`,{className:`text-copy-14 text-strong mt-0.5`,children:[(0,w.jsx)(`code`,{className:`text-heading`,children:P.release}),(0,w.jsxs)(`span`,{className:`ml-2 text-label-12 text-muted`,children:[`Vertex `,E(P.vertexBytes),`, edges `,E(P.edgesBytes)]})]}):(0,w.jsx)(`p`,{className:`text-copy-14 text-muted mt-0.5`,children:I?`Checking Common Crawl…`:`Could not find a release. Choose one below.`}),(0,w.jsxs)(`a`,{href:T,target:`_blank`,rel:`noopener noreferrer`,className:`mt-1 inline-flex items-center gap-1 text-label-12 text-secondary hover:text-strong focus:text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500 rounded`,children:[`Browse all Common Crawl web-graph releases`,(0,w.jsx)(t,{className:`h-3 w-3`,"aria-hidden":!0})]})]}),!y()&&(0,w.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[(0,w.jsxs)(g,{type:`button`,size:`sm`,disabled:B||!e?.duckdbInstalled||!P&&!H.trim(),onClick:b(Q),children:[(0,w.jsx)(o,{className:`h-4 w-4 mr-1.5`,"aria-hidden":!0}),B?`Queuing…`:`Run sync`]}),(0,w.jsxs)(S,{label:`What does Run sync do?`,children:[(0,w.jsxs)(`span`,{className:`block`,children:[`Downloads the auto-detected (or chosen) Common Crawl release (~16 GB) to`,` `,(0,w.jsx)(`code`,{className:`text-neutral`,children:`~/.canonry/cache/commoncrawl/`}),`, then runs a single DuckDB query that extracts referring domains for every project in this workspace.`]}),(0,w.jsxs)(`span`,{className:`mt-2 block text-secondary`,children:[`First time for a release: `,(0,w.jsx)(`span`,{className:`text-strong`,children:`~10–20 min download + ~5 min query`}),`. Re-running the same release later: `,(0,w.jsx)(`span`,{className:`text-strong`,children:`skips download, just re-queries`}),` (~5 min).`]})]})]})]}),y()?null:W?(0,w.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,w.jsx)(`input`,{type:`text`,className:`flex-1 min-w-[240px] rounded border border-strong bg-transparent px-2.5 py-1.5 text-label-14 text-strong placeholder-mono-400 focus:border-mono-500 focus:outline-none`,placeholder:`cc-main-2026-jan-feb-mar`,value:H,onChange:e=>U(e.target.value),disabled:B,autoFocus:!0}),(0,w.jsx)(`button`,{type:`button`,className:`text-button-14 text-secondary hover:text-neutral focus:text-neutral focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500 rounded`,onClick:()=>{U(``),G(!1)},disabled:B,children:`Cancel`})]}):(0,w.jsx)(`button`,{type:`button`,className:`text-button-14 text-secondary hover:text-neutral focus:text-neutral focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500 rounded`,onClick:()=>G(!0),disabled:B,children:`Use a different release →`})]}),!e?.duckdbInstalled&&(0,w.jsx)(`p`,{className:`text-copy-14 text-secondary mt-2`,children:`Install DuckDB first to enable sync.`})]})]}),(0,w.jsxs)(`details`,{className:`page-section-divider group`,children:[(0,w.jsx)(`summary`,{className:`cursor-pointer text-label-14-strong text-secondary hover:text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500 rounded`,children:`Technical details and cache`}),(0,w.jsxs)(`div`,{className:`mt-4`,children:[(0,w.jsx)(`p`,{className:`text-copy-14 text-secondary mb-3`,children:`Cached releases support project re-extracts. Pruning a release does not remove saved backlink results.`}),(0,w.jsx)(x,{className:`surface-card overflow-hidden`,children:(0,w.jsxs)(`table`,{className:`w-full text-label-14`,children:[(0,w.jsx)(`thead`,{children:(0,w.jsxs)(`tr`,{className:`border-b border-base text-left text-label-12 normal-case text-faint`,children:[(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Release`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Sync status`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-right text-label-12-strong`,children:`Size`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Last used`}),!y()&&(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong sr-only`,children:`Actions`})]})}),(0,w.jsxs)(`tbody`,{children:[M.map(e=>(0,w.jsxs)(`tr`,{className:`border-b border-mono-900 last:border-0`,children:[(0,w.jsx)(`td`,{className:`px-4 py-2 text-strong`,children:(0,w.jsx)(`code`,{children:e.release})}),(0,w.jsx)(`td`,{className:`px-4 py-2`,children:e.syncStatus?(0,w.jsx)(_,{tone:O(e.syncStatus),children:e.syncStatus}):(0,w.jsx)(`span`,{className:`text-faint`,children:`—`})}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-right text-secondary tabular-nums`,children:E(e.bytes)}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-secondary`,children:D(e.lastUsedAt)}),!y()&&(0,w.jsx)(`td`,{className:`px-4 py-2 text-right`,children:(0,w.jsxs)(`div`,{className:`inline-flex items-center gap-1`,children:[(0,w.jsxs)(g,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{$(e.release)},children:[(0,w.jsx)(r,{className:`h-4 w-4 mr-1.5`,"aria-hidden":!0}),`Prune`]}),(0,w.jsx)(S,{label:`What does Prune do?`,placement:`top`,children:`Deletes the ~16 GB cache for this release from disk. Backlink results already in SQLite remain untouched. To re-run extracts against this release, you’d have to sync it again (another ~16 GB download).`})]})})]},e.release)),M.length===0&&(0,w.jsx)(`tr`,{children:(0,w.jsx)(`td`,{className:`px-4 py-4 text-label-14 text-muted`,colSpan:y()?4:5,children:`No cached releases on this machine. If you ran a sync from a different machine (or deleted the cache), the backlink data is still in the database — but you’ll need to re-sync a release to run new extracts.`})})]})]})}),(0,w.jsx)(`p`,{className:`mt-3 text-copy-13 text-muted`,children:`Common Crawl files are stored locally. DuckDB reads them; Canonry stores results in its normal database.`})]})]}),A.length>1&&(0,w.jsxs)(`section`,{className:`page-section-divider`,children:[(0,w.jsx)(`div`,{className:`section-head section-head-inline`,children:(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`eyebrow eyebrow-soft`,children:`History`}),(0,w.jsx)(`h2`,{children:`Past release syncs`})]})}),(0,w.jsx)(x,{className:`surface-card overflow-hidden`,children:(0,w.jsxs)(`table`,{className:`w-full text-label-14`,children:[(0,w.jsx)(`thead`,{children:(0,w.jsxs)(`tr`,{className:`border-b border-base text-left text-label-12 normal-case text-faint`,children:[(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Release`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Status`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-right text-label-12-strong`,children:`Projects`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-right text-label-12-strong`,children:`Rows`}),(0,w.jsx)(`th`,{className:`px-4 py-2 text-label-12-strong`,children:`Finished`})]})}),(0,w.jsx)(`tbody`,{children:A.map(e=>(0,w.jsxs)(`tr`,{className:`border-b border-mono-900 last:border-0`,children:[(0,w.jsx)(`td`,{className:`px-4 py-2 text-strong`,children:(0,w.jsx)(`code`,{children:e.release})}),(0,w.jsx)(`td`,{className:`px-4 py-2`,children:(0,w.jsx)(_,{tone:O(e.status),children:e.status})}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-right text-secondary tabular-nums`,children:e.projectsProcessed??`—`}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-right text-secondary tabular-nums`,children:e.domainsDiscovered??`—`}),(0,w.jsx)(`td`,{className:`px-4 py-2 text-secondary`,children:D(e.queryFinishedAt??e.updatedAt)})]},e.id))})]})})]})]})}export{k as BacklinksPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./vendor-markdown-BDQ1GKGP.js";import{c as t,f as n,i as r,m as i,r as a,s as o,t as s,u as c}from"./vendor-recharts-DhEHcK3G.js";var l=e(),u={contentStyle:{backgroundColor:`var(--chart-tooltip-bg, #0a0a0a)`,border:`none`,borderRadius:`var(--radius-material-tooltip)`,boxShadow:`var(--shadow-material-tooltip)`,fontSize:13,lineHeight:`18px`,fontWeight:400},labelStyle:{color:`var(--chart-tooltip-label, #ededed)`},itemStyle:{color:`var(--chart-tooltip-item, #a1a1a1)`}},d={fill:`var(--chart-neutral-text-dim, #a1a1a1)`,fontSize:12},f=`var(--chart-grid, #2e2e2e)`,p=`var(--chart-axis, #2e2e2e)`,m=[`var(--chart-series-1, #34d399)`,`var(--chart-series-2, #60a5fa)`,`var(--chart-series-3, #f472b6)`,`var(--chart-series-4, #facc15)`,`var(--chart-series-5, #a78bfa)`,`var(--chart-series-6, #fb923c)`,`var(--chart-series-7, #22d3ee)`,`var(--chart-series-8, #f87171)`],h={gemini:`#60a5fa`,openai:`#34d399`,claude:`#fb923c`,perplexity:`#22d3ee`,muse:`#818cf8`,local:`#a78bfa`};function g(e,t=0){return h[e]??m[t%m.length]}var _={text:`var(--chart-neutral-text, #a1a1a1)`,textDim:`var(--chart-neutral-text-dim, #a1a1a1)`,textFaint:`var(--chart-neutral-text-faint, #7d7d7d)`,surface:`var(--chart-neutral-surface, #2e2e2e)`,trackSubtle:`var(--chart-neutral-track-subtle, rgb(255 255 255 / 0.04))`,gridLine:`var(--chart-neutral-grid-line, rgb(255 255 255 / 0.06))`},v={positive:`var(--chart-tone-positive, #34d399)`,positiveDeep:`var(--chart-tone-positive-deep, #10b981)`,caution:`var(--chart-tone-caution, #fbbf24)`,negative:`var(--chart-tone-negative, #fb7185)`,neutral:`var(--chart-tone-neutral, #a1a1a1)`};function y(e){return e}function b(e){let t=/^(\d{4})-(\d{2})-(\d{2})/.exec(e);return t?{year:Number(t[1]),month:Number(t[2]),day:Number(t[3])}:null}function x(e){let t=String(e),n=b(t);return n?new Date(Date.UTC(n.year,n.month-1,n.day)).toLocaleDateString(void 0,{timeZone:`UTC`,month:`short`,day:`numeric`,year:`numeric`}):t}function S(e){let t=b(String(e));return t?`${t.month}/${t.day}`:String(e)}function C(e){let t=b(String(e));return t?new Date(Date.UTC(t.year,t.month-1,t.day)).toLocaleDateString(void 0,{timeZone:`UTC`,month:`short`,day:`numeric`}):String(e)}function w(e){return new Date(e).toLocaleDateString(void 0,{month:`short`,day:`numeric`,year:`numeric`})}function T(e){return new Date(e).toLocaleDateString(void 0,{month:`short`,day:`numeric`})}function E(e){return new Date(e).getFullYear()}function D(e){let t=new Date(e);return`${t.getMonth()+1}/${t.getDate()}`}function O({data:e,xKey:m,series:h,height:g=260,xTickFormatter:v,labelFormatter:y,onSelectX:b,selectedX:x,accessibilityLayer:S=!0,ariaLabel:C}){let w=[...new Set(h.map(e=>e.axisId))],T=new Map(h.map(e=>[e.label,e.formatValue])),E=e.map((t,n)=>{let r={...t};for(let t of h){if(!t.trend)continue;let i=t.trend.startIndex??0,a=t.trend.endIndex??e.length-1;n<i||n>a?r[`${t.dataKey}__trend`]=null:r[`${t.dataKey}__trend`]=a<=i?t.trend.start:t.trend.start+(t.trend.end-t.trend.start)*(n-i)/(a-i)}return r});return(0,l.jsx)(i,{width:`100%`,height:g,children:(0,l.jsxs)(s,{data:E,accessibilityLayer:S,"aria-label":C,margin:{top:8,right:8,bottom:4,left:0},onClick:b?e=>{e?.activeLabel!==void 0&&b(String(e.activeLabel))}:void 0,style:b?{cursor:`pointer`}:void 0,children:[(0,l.jsx)(t,{stroke:f,strokeDasharray:`3 3`,vertical:!1}),x!=null&&(0,l.jsx)(c,{x,yAxisId:w[0],stroke:_.text,strokeDasharray:`2 3`,strokeWidth:1}),(0,l.jsx)(r,{dataKey:m,tick:d,stroke:p,tickFormatter:v,minTickGap:24}),w.map((e,t)=>{let n=h.find(t=>t.axisId===e);return(0,l.jsx)(a,{yAxisId:e,orientation:t===1?`right`:`left`,hide:t>1,reversed:n.inverted??!1,domain:n.inverted?[1,`auto`]:[0,`auto`],tick:d,stroke:p,width:48,tickFormatter:n.formatValue},e)}),(0,l.jsx)(n,{...u,labelFormatter:e=>{let t=typeof e==`string`||typeof e==`number`?String(e):``;return y?y(t):t},formatter:(e,t)=>{let n=String(t??``);return typeof e==`number`?[T.get(n)?.(e)??e.toLocaleString(),n]:[String(e??``),n]}}),h.filter(e=>e.trend).map(e=>(0,l.jsx)(o,{yAxisId:e.axisId,dataKey:`${e.dataKey}__trend`,name:`${e.label} trend`,stroke:e.color,strokeWidth:1.5,strokeDasharray:`5 4`,strokeOpacity:.55,dot:!1,activeDot:!1,isAnimationActive:!1,legendType:`none`,tooltipType:`none`},`${e.dataKey}-trend`)),h.map(e=>(0,l.jsx)(o,{yAxisId:e.axisId,dataKey:e.dataKey,name:e.label,stroke:e.color,strokeWidth:2,dot:!1,activeDot:{r:3},connectNulls:e.connectNulls??!1,isAnimationActive:!1},e.dataKey))]})})}export{g as _,m as a,O as c,S as d,w as f,E as g,y as h,_ as i,x as l,D as m,d as n,v as o,T as p,f as r,u as s,p as t,C as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{lt as t,q as n}from"./vendor-lucide-DuOM7wVi.js";import{r}from"./vendor-markdown-BDQ1GKGP.js";var i=e(t(),1),a=r();function o({children:e,label:t=`More info`,placement:r=`top`,className:o}){let s=(0,i.useId)(),[c,l]=(0,i.useState)(!1);return(0,a.jsxs)(`span`,{className:`relative inline-flex ${o??``}`,children:[(0,a.jsx)(`button`,{type:`button`,"aria-label":t,"aria-describedby":c?s:void 0,className:`inline-flex h-4 w-4 items-center justify-center rounded-full text-muted hover:text-strong focus:text-strong focus:outline-none focus-visible:ring-1 focus-visible:ring-mono-500`,onMouseEnter:()=>l(!0),onMouseLeave:()=>l(!1),onFocus:()=>l(!0),onBlur:()=>l(!1),children:(0,a.jsx)(n,{className:`h-3.5 w-3.5`,"aria-hidden":!0})}),c&&(0,a.jsx)(`span`,{id:s,role:`tooltip`,className:`material-tooltip absolute z-50 w-64 px-3 py-2 text-copy-13 text-secondary ${r===`top`?`bottom-full mb-2`:`top-full mt-2`} left-1/2 -translate-x-1/2 whitespace-normal`,children:e})]})}export{o as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{lt as t,s as n}from"./vendor-lucide-DuOM7wVi.js";import{u as r}from"./vendor-radix-BGYlvS2l.js";import{r as i}from"./vendor-markdown-BDQ1GKGP.js";var a=e(t(),1),o=e(r(),1),s=i();function c({text:e,placement:t=`top`,tone:r=`info`,label:i}){let[c,l]=(0,a.useState)(null),u=(0,a.useRef)(null),d=(0,a.useRef)(null),f=(0,a.useRef)(!1),p=(0,a.useCallback)(()=>{if(!u.current)return;let e=u.current.getBoundingClientRect(),n=e.left+e.width/2,r=Math.min(224,window.innerWidth-16)/2;l({top:t===`bottom`?e.bottom:e.top,left:t===`bottom`?Math.max(r+8,Math.min(n,window.innerWidth-r-8)):n})},[t]);(0,a.useLayoutEffect)(()=>{if(t!==`bottom`||!c||!d.current)return;let e=d.current.getBoundingClientRect().bottom-window.innerHeight+8;if(e<=0)return;let n=Math.max(0,c.top-e);n!==c.top&&l({...c,top:n})},[t,c]);let m=(0,a.useCallback)(()=>l(null),[]),h=(0,a.useCallback)(()=>{c===null?p():m()},[c,p,m]);return(0,s.jsxs)(`span`,{className:`info-tooltip-wrapper`,onMouseEnter:p,onMouseLeave:m,children:[(0,s.jsxs)(`button`,{ref:u,type:`button`,className:`info-tooltip-trigger${i?` info-tooltip-trigger-labeled`:``}${r===`caution`?` info-tooltip-trigger-caution`:``}`,"aria-label":e,"aria-expanded":c!==null,onFocus:p,onBlur:m,onPointerDown:()=>{f.current=c!==null&&u.current?.ownerDocument.activeElement===u.current},onClick:e=>{e.detail===0?h():f.current?m():p()},onKeyDown:e=>{e.key===`Escape`&&m()},children:[r===`caution`?(0,s.jsx)(n,{className:`info-tooltip-icon`,"aria-hidden":`true`}):(0,s.jsxs)(`svg`,{className:`info-tooltip-icon`,viewBox:`0 0 16 16`,fill:`none`,"aria-hidden":`true`,children:[(0,s.jsx)(`circle`,{cx:`8`,cy:`8`,r:`7`,stroke:`currentColor`,strokeWidth:`1.5`}),(0,s.jsx)(`path`,{d:`M8 7v4M8 5.5v0`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`})]}),i?(0,s.jsx)(`span`,{"aria-hidden":`true`,children:i}):null]}),c!==null&&(0,o.createPortal)((0,s.jsx)(`span`,{ref:d,"aria-hidden":`true`,className:`material-tooltip px-3 py-2 text-copy-13 text-secondary`,style:{position:`fixed`,top:c.top,left:c.left,transform:t===`bottom`?`translateX(-50%) translateY(8px)`:`translateX(-50%) translateY(calc(-100% - 8px))`,zIndex:9999,pointerEvents:`none`,width:t===`bottom`?`min(14rem, calc(100vw - 1rem))`:`14rem`},children:e}),u.current?.closest(`.app-shell-embed`)??document.body)]})}export{c as t};
|