@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.
Files changed (182) hide show
  1. package/README.md +18 -16
  2. package/assets/agent-workspace/AGENTS.md +13 -6
  3. package/assets/agent-workspace/skills/aero/SKILL.md +45 -26
  4. package/assets/agent-workspace/skills/aero/references/agent-operations.md +47 -12
  5. package/assets/agent-workspace/skills/aero/references/memory-patterns.md +1 -1
  6. package/assets/agent-workspace/skills/aero/references/orchestration.md +9 -9
  7. package/assets/agent-workspace/skills/aero/references/reporting.md +8 -4
  8. package/assets/agent-workspace/skills/aero/references/seo-analysis.md +2 -2
  9. package/assets/agent-workspace/skills/aero/references/site-health.md +34 -23
  10. package/assets/agent-workspace/skills/aero/soul.md +2 -2
  11. package/assets/agent-workspace/skills/canonry/SKILL.md +37 -7
  12. package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +14 -11
  13. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +122 -53
  14. package/assets/assets/AccessControls-DzO5Y8v9.js +2 -0
  15. package/assets/assets/AgentSetupPage-DWWovaCw.js +36 -0
  16. package/assets/assets/AuditHistoryPanel-BG-n1i8c.js +1 -0
  17. package/assets/assets/BacklinksPage-D6wdOMXt.js +1 -0
  18. package/assets/assets/ChartPrimitives-CtKdkn64.js +3 -0
  19. package/assets/assets/Hint-3TTi0MgX.js +1 -0
  20. package/assets/assets/{HistoryPage-DeN79d3c.js → HistoryPage-B_ReWHbL.js} +1 -1
  21. package/assets/assets/InfoTooltip-D29JcNMW.js +1 -0
  22. package/assets/assets/MeasurementPropertyPage-zdyLL-kl.js +4 -0
  23. package/assets/assets/ProjectPage-KZNKXR4w.js +15 -0
  24. package/assets/assets/RunsPage-DxN0xXQh.js +1 -0
  25. package/assets/assets/ServerTrafficSection-CvISj5pf.js +40 -0
  26. package/assets/assets/SettingsPage-CpRpBlMV.js +1 -0
  27. package/assets/assets/ToneBadge-DcwPruHr.js +60 -0
  28. package/assets/assets/TrafficPage-zk6zMZyz.js +1 -0
  29. package/assets/assets/TrafficSourceDetailPage-DJtsI06Z.js +1 -0
  30. package/assets/assets/{account-context-CdEHcI5S.js → account-context-CoJVqEXZ.js} +1 -1
  31. package/assets/assets/{agent-trust-copy-N6WacCSg.js → agent-trust-copy-BIXDMtBm.js} +1 -1
  32. package/assets/assets/{card-B1O0SunG.js → card-Dwmc7Srx.js} +1 -1
  33. package/assets/assets/index-fh1T5JQY.css +1 -0
  34. package/assets/assets/index-mqc2mWUR.js +42 -0
  35. package/assets/assets/query-client-Tg1fZu4i.js +1 -0
  36. package/assets/assets/react-query-BqcEEfEO.js +1 -0
  37. package/assets/assets/{react-sigma_core.esm.min-f4uuOgrw.js → react-sigma_core.esm.min-D1q0DR_j.js} +3 -3
  38. package/assets/assets/{server-traffic-CkSCFMnL.js → server-traffic-Djnh_9f0.js} +1 -1
  39. package/assets/assets/service-BQjBdN4O.js +1 -0
  40. package/assets/assets/use-tooltip-position-BOzm-6Wy.js +1 -0
  41. package/assets/assets/vendor-lucide-iE5MEh2-.js +1 -0
  42. package/assets/assets/{vendor-markdown-BDQ1GKGP.js → vendor-markdown-BBGbNklj.js} +1 -1
  43. package/assets/assets/{vendor-radix-BGYlvS2l.js → vendor-radix-DKCt5Z_h.js} +1 -1
  44. package/assets/assets/{vendor-recharts-DhEHcK3G.js → vendor-recharts-D3MLFU3q.js} +1 -1
  45. package/assets/assets/{vendor-tanstack-BNuZ37rE.js → vendor-tanstack-B90HW50P.js} +2 -2
  46. package/assets/index.html +16 -15
  47. package/dist/{ads-PQ4OP6OH.js → ads-FVPZ6R6Z.js} +3 -3
  48. package/dist/{agent-B6ZPL2HH.js → agent-2LPU2E5I.js} +7 -7
  49. package/dist/{agent-ask-ZUKNXRAX.js → agent-ask-5ODREK6D.js} +3 -3
  50. package/dist/{agent-conversations-DJ7WU7PL.js → agent-conversations-SNLOOJEM.js} +3 -3
  51. package/dist/{agent-journeys-LGUI3SQG.js → agent-journeys-XDXVL6PK.js} +3 -3
  52. package/dist/{agent-memory-PWZJ7G5Q.js → agent-memory-NKAI2S3U.js} +3 -3
  53. package/dist/{agent-providers-TEERDNJT.js → agent-providers-R5L7A72X.js} +3 -3
  54. package/dist/{agent-transcript-KDPOPK5Z.js → agent-transcript-C5WAGYVC.js} +3 -3
  55. package/dist/{analytics-NFW5RQRT.js → analytics-EJVOLIQL.js} +33 -13
  56. package/dist/{apply-EP4V4UF5.js → apply-I6JOM247.js} +3 -3
  57. package/dist/{backfill-6UTNNVFO.js → backfill-UVUR36IB.js} +10 -10
  58. package/dist/{backlinks-SG5GV5X5.js → backlinks-3VMVACWN.js} +3 -3
  59. package/dist/{bing-Q4W24JNC.js → bing-R5RL3PW2.js} +3 -3
  60. package/dist/{bootstrap-WEMERVNZ.js → bootstrap-GMMSDTNO.js} +12 -12
  61. package/dist/{cdp-3XKBJGHO.js → cdp-FJKUXHEY.js} +7 -7
  62. package/dist/{chunk-KK3Z34AN.js → chunk-2DV7F6XA.js} +91 -2
  63. package/dist/{chunk-MTW37GXF.js → chunk-2FWYWGIR.js} +2 -2
  64. package/dist/{chunk-Q5SNOMRB.js → chunk-56VVRWJM.js} +14 -5
  65. package/dist/{chunk-52M2JWCB.js → chunk-7BEGCVVB.js} +1 -1
  66. package/dist/{chunk-WZSDGC45.js → chunk-7BH53MOB.js} +27 -2
  67. package/dist/{chunk-IX5AC3QB.js → chunk-7J2RIIYU.js} +1450 -1067
  68. package/dist/{chunk-UXXZXXNG.js → chunk-7SNMIXEQ.js} +2 -2
  69. package/dist/{chunk-2XCYEBQV.js → chunk-AMGM55CP.js} +2 -2
  70. package/dist/{chunk-MSI4BGFN.js → chunk-AYKTVQF7.js} +13 -5
  71. package/dist/{chunk-3JWY65XO.js → chunk-BKDRT4VS.js} +7 -7
  72. package/dist/{chunk-FQ3L2TIX.js → chunk-COHSL6KW.js} +1 -1
  73. package/dist/{chunk-X3UXMHWC.js → chunk-DGDLLRS4.js} +1 -1
  74. package/dist/{chunk-YJITDEZR.js → chunk-DHIB7EIA.js} +4 -4
  75. package/dist/{chunk-BLW327AU.js → chunk-EE3QTCLS.js} +18 -6
  76. package/dist/{chunk-3GMBHGQ5.js → chunk-F46TBLXK.js} +204 -94
  77. package/dist/{chunk-RTH5JVC3.js → chunk-FBO25TA3.js} +1 -1
  78. package/dist/{chunk-2Q7JEC6N.js → chunk-FZ3MUTU3.js} +2 -2
  79. package/dist/{chunk-64R66MWZ.js → chunk-G6QN4VFS.js} +16 -10
  80. package/dist/{chunk-ISIJ2NS4.js → chunk-HBHLYWKE.js} +9 -6
  81. package/dist/{chunk-EJZ444VV.js → chunk-HL2LGRTI.js} +8 -6
  82. package/dist/chunk-J6536OL6.js +31 -0
  83. package/dist/{chunk-RLKI2QF7.js → chunk-KVRX7YIH.js} +20 -10
  84. package/dist/{chunk-3BA75QYU.js → chunk-LJO2BKWU.js} +1 -1
  85. package/dist/{chunk-CN6MVUY3.js → chunk-LNVFERI4.js} +1 -1
  86. package/dist/{chunk-ZADRESLB.js → chunk-NQYJHKML.js} +39 -7
  87. package/dist/{chunk-IAGC2MGP.js → chunk-O5UFAXUI.js} +646 -588
  88. package/dist/{chunk-RGFIRJ7F.js → chunk-O6APBEJE.js} +2 -2
  89. package/dist/{chunk-ZBTUISPG.js → chunk-O7S7OHLE.js} +9399 -8388
  90. package/dist/{chunk-ER5ZHAB2.js → chunk-QS5DWJDI.js} +2 -2
  91. package/dist/{chunk-QSL3FXE4.js → chunk-RBG2QXQM.js} +4 -4
  92. package/dist/{chunk-SAKH2RRF.js → chunk-SWZXHHAG.js} +16 -8
  93. package/dist/{chunk-VMGZBH5L.js → chunk-T7UDY7W3.js} +26 -11
  94. package/dist/{chunk-OL2L5ANJ.js → chunk-UGO2FO6V.js} +119 -55
  95. package/dist/{chunk-J6MYB3F4.js → chunk-VHULVUDL.js} +1 -1
  96. package/dist/{chunk-O22WSFWL.js → chunk-YGAQQSCL.js} +56339 -54966
  97. package/dist/{chunk-TNOYUE2L.js → chunk-YIIRS7V7.js} +98 -65
  98. package/dist/{chunk-64KB6YTG.js → chunk-YU2WX7RD.js} +3 -3
  99. package/dist/{citations-5OSQ3ZYU.js → citations-LOEQRDUB.js} +21 -10
  100. package/dist/{cli-catalog-T5OAVKGS.js → cli-catalog-5RXNUFBS.js} +3 -3
  101. package/dist/{cli-commands-VATCVJKW.js → cli-commands-HE2BQY3Y.js} +7 -7
  102. package/dist/cli.js +22 -17
  103. package/dist/{competitor-YIKTMTHY.js → competitor-PIX2BHJW.js} +3 -3
  104. package/dist/{content-DS2LKR7J.js → content-PJGW4WZF.js} +3 -3
  105. package/dist/{dashboard-HLVRRRI4.js → dashboard-7OKBD4MG.js} +6 -6
  106. package/dist/{demo-A5DTVJGK.js → demo-SCOFAWFM.js} +1 -1
  107. package/dist/{demo-server-P2JGAI6C.js → demo-server-SJPI6RSL.js} +38 -36
  108. package/dist/{discover-VNZDO2MU.js → discover-I3WL2QUN.js} +10 -8
  109. package/dist/{discover-eval-ON77LUEN.js → discover-eval-YRECOIP5.js} +3 -3
  110. package/dist/{doctor-7TNNTI7H.js → doctor-F4J6LILX.js} +3 -3
  111. package/dist/{evidence-E54CNGXS.js → evidence-MYQTCY4V.js} +25 -10
  112. package/dist/{export-cmd-XXZ6KLQQ.js → export-cmd-3SUFOJM6.js} +3 -3
  113. package/dist/{ga-ZQB4EJI3.js → ga-VA6FYK4L.js} +3 -3
  114. package/dist/{gbp-ZQL6NQEK.js → gbp-DI6ZVFHL.js} +3 -3
  115. package/dist/{google-7EIHQGSV.js → google-UVKWJCD2.js} +4 -4
  116. package/dist/{google-marketing-RSAO4PG7.js → google-marketing-S63HN733.js} +1 -1
  117. package/dist/{health-cmd-R7WPKGWX.js → health-cmd-DOZXGI46.js} +16 -9
  118. package/dist/{history-2CSWSVCY.js → history-UTJTUDYK.js} +3 -3
  119. package/dist/index.d.ts +204 -12
  120. package/dist/index.js +26 -26
  121. package/dist/{init-FXZRMXZ3.js → init-IVJSS33J.js} +19 -19
  122. package/dist/{insights-EJUL3W6D.js → insights-UHCVCZ76.js} +3 -3
  123. package/dist/intelligence-service-3EENJ5DS.js +16 -0
  124. package/dist/{journeys-YUMBANFH.js → journeys-XIT7WDM2.js} +3 -3
  125. package/dist/{keys-KLOTGT4H.js → keys-MQKW4JUI.js} +3 -3
  126. package/dist/{keyword-5NSJFEOI.js → keyword-EASMKYZ3.js} +3 -3
  127. package/dist/{logs-WW3RLCRG.js → logs-ZHZ6XM55.js} +3 -3
  128. package/dist/{mcp-NTBEIEVX.js → mcp-ECVT2YGU.js} +4 -4
  129. package/dist/mcp.js +10 -10
  130. package/dist/{measurement-plan-BLPAZEXS.js → measurement-plan-7FQKUOMR.js} +5 -5
  131. package/dist/{notify-KAGE6UEN.js → notify-TC7ARC6W.js} +3 -3
  132. package/dist/{organic-evidence-HTYRXRML.js → organic-evidence-M34MWJXE.js} +7 -4
  133. package/dist/overview-P6BRMXJN.js +314 -0
  134. package/dist/{project-NYUWICVC.js → project-WZ2YXFPJ.js} +4 -4
  135. package/dist/project-setup-WV6SPGIV.js +176 -0
  136. package/dist/{query-3CRRDOHD.js → query-WAFJKDHG.js} +3 -3
  137. package/dist/{research-ZULVD3TW.js → research-B5ZPQX7R.js} +3 -3
  138. package/dist/{results-export-STM7SQ4J.js → results-export-NIZV6R3K.js} +3 -3
  139. package/dist/{run-S4MFU4MK.js → run-ICLPZ7QT.js} +7 -4
  140. package/dist/{schedule-6W3Q2FUL.js → schedule-4C44LQ7R.js} +22 -3
  141. package/dist/{search-EKXXN7C4.js → search-UJM7KII3.js} +11 -4
  142. package/dist/{serve-TFBFPFAQ.js → serve-A6UIO6WP.js} +30 -29
  143. package/dist/{session-4B5V3AH6.js → session-RTE22GQT.js} +14 -14
  144. package/dist/settings-BOF5Z7ML.js +211 -0
  145. package/dist/{sitemaps-R7XFCH6E.js → sitemaps-BM7S76H2.js} +4 -4
  146. package/dist/{skills-44XYCTVD.js → skills-X5SR4HRO.js} +2 -2
  147. package/dist/{snapshot-ROAOJI4W.js → snapshot-KLKE37VY.js} +4 -4
  148. package/dist/{src-ZJRIKEDB.js → src-EKLG5A6O.js} +4 -2
  149. package/dist/{status-EN3A2TX5.js → status-OYG57DWU.js} +6 -5
  150. package/dist/{technical-aeo-ZV466F65.js → technical-aeo-KWVWOOTI.js} +23 -23
  151. package/dist/{telemetry-EZHPNZ2A.js → telemetry-KGE6FF3Y.js} +4 -4
  152. package/dist/{tools-IH4M7AAG.js → tools-4R33AZQ3.js} +11 -11
  153. package/dist/{traffic-VFLXWB3Z.js → traffic-SVMOKCSS.js} +7 -11
  154. package/dist/{trends-ZXJIX3Z3.js → trends-RGAKGX3L.js} +4 -4
  155. package/dist/{users-J2BYEWOE.js → users-47WKA2TO.js} +3 -3
  156. package/dist/{visibility-stats-AJ7NY2BP.js → visibility-stats-DTGQJPNV.js} +9 -5
  157. package/dist/{wordpress-U6MS35VE.js → wordpress-2CNUX4UE.js} +3 -3
  158. package/package.json +2 -2
  159. package/assets/assets/AgentSetupPage-h1kJhy9q.js +0 -18
  160. package/assets/assets/AuditHistoryPanel-CNUApNiJ.js +0 -1
  161. package/assets/assets/BacklinksPage-CpKmlAek.js +0 -1
  162. package/assets/assets/ChartPrimitives-CvK6CQrj.js +0 -1
  163. package/assets/assets/Hint-c4a4W87X.js +0 -1
  164. package/assets/assets/InfoTooltip-Drnst4ML.js +0 -1
  165. package/assets/assets/MeasurementPropertyPage-CcHnYn81.js +0 -4
  166. package/assets/assets/ProjectPage-Tmuqmust.js +0 -11
  167. package/assets/assets/RunsPage-BD4k3MjX.js +0 -1
  168. package/assets/assets/SettingsPage-BHy30JP5.js +0 -1
  169. package/assets/assets/SiteHealthSection-SYdtuGjq.js +0 -2
  170. package/assets/assets/ToneBadge-Cii5KNtg.js +0 -60
  171. package/assets/assets/TrafficPage-DuxtRqnc.js +0 -40
  172. package/assets/assets/TrafficSourceDetailPage-DiX1bB02.js +0 -1
  173. package/assets/assets/format-helpers-V8Pyc7cR.js +0 -3
  174. package/assets/assets/index-BAxHW-1G.css +0 -1
  175. package/assets/assets/index-BTz-B9hV.js +0 -60
  176. package/assets/assets/query-client-C1ycmW1c.js +0 -1
  177. package/assets/assets/react-query-DI7VfOND.js +0 -1
  178. package/assets/assets/service-DSgXWhNq.js +0 -1
  179. package/assets/assets/vendor-lucide-DuOM7wVi.js +0 -1
  180. package/dist/intelligence-service-TKK7O3Z5.js +0 -16
  181. package/dist/overview-GSJ4GP2T.js +0 -213
  182. package/dist/settings-VRTDPFR3.js +0 -119
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-OL2L5ANJ.js";
4
- import "./chunk-BLW327AU.js";
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-ZBTUISPG.js";
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 site-health issue-pages.");
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 technical audit yet for "${project}". Run \`canonry technical-aeo run ${project}\` to generate one.`
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(`Technical AEO: ${score.aggregateScore}/100${delta}`);
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 technical-aeo run ${project}\` first.`);
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 audits yet for "${project}". Run \`canonry technical-aeo run ${project}\` first.`);
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
- `Site Health progress: ${progress.phase} (${progress.status})`,
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 technical-aeo run ${project}\` first.`);
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 Site Health crawl for "${project}". Run \`canonry technical-aeo run ${project}\` first.`);
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(`Site Health subgraph details are unavailable for crawl ${res.runId ?? "-"}.`);
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
- `Site Health subgraph: ${focus} (${res.hops} hop${res.hops === 1 ? "" : "s"})`,
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 Site Health crawl for "${project}". Run \`canonry technical-aeo run ${project}\` first.`);
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(`Site Health path details are unavailable for crawl ${res.runId ?? "-"}.`);
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(`Site Health changes unavailable: ${res.reason.replaceAll("-", " ")}.`);
286
+ console.log(`Agent Readiness changes unavailable: ${res.reason.replaceAll("-", " ")}.`);
287
287
  return;
288
288
  }
289
289
  if (res.state === "incompatible") {
290
- console.log(`Site Health changes unavailable: snapshots use incompatible ${res.mismatchedVersions.join(", ")} versions.`);
290
+ console.log(`Agent Readiness changes unavailable: snapshots use incompatible ${res.mismatchedVersions.join(", ")} versions.`);
291
291
  return;
292
292
  }
293
293
  const lines = [
294
- `Site Health changes: ${res.fromRunId} \u2192 ${res.toRunId}`,
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 Site Health crawl for "${project}". Run \`canonry technical-aeo run ${project}\` first.`);
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
- `Site audit started (run ${runId}, status ${status}). Use \`canonry runs get ${runId}\` to check status, or pass --wait.`
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("Auditing");
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(`Site audit ${final} (run ${runId}).`);
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-2XCYEBQV.js";
4
+ } from "./chunk-AMGM55CP.js";
5
5
  import {
6
6
  createApiClient
7
- } from "./chunk-OL2L5ANJ.js";
7
+ } from "./chunk-UGO2FO6V.js";
8
8
  import {
9
9
  configExists,
10
10
  getConfigPath
11
- } from "./chunk-BLW327AU.js";
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-ZBTUISPG.js";
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-Q5SNOMRB.js";
15
- import "./chunk-OL2L5ANJ.js";
16
- import "./chunk-BLW327AU.js";
17
- import "./chunk-3GMBHGQ5.js";
18
- import "./chunk-X3UXMHWC.js";
19
- import "./chunk-52M2JWCB.js";
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-O22WSFWL.js";
23
- import "./chunk-CN6MVUY3.js";
24
- import "./chunk-3BA75QYU.js";
25
- import "./chunk-KK3Z34AN.js";
26
- import "./chunk-ZBTUISPG.js";
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-J6MYB3F4.js";
3
+ } from "./chunk-VHULVUDL.js";
4
4
  import {
5
5
  createApiClient
6
- } from "./chunk-OL2L5ANJ.js";
6
+ } from "./chunk-UGO2FO6V.js";
7
7
  import {
8
8
  loadConfigRaw
9
- } from "./chunk-BLW327AU.js";
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-CN6MVUY3.js";
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-ZBTUISPG.js";
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
- let redacted = message;
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-OL2L5ANJ.js";
4
- import "./chunk-BLW327AU.js";
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-ZBTUISPG.js";
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": "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-OL2L5ANJ.js";
4
- import "./chunk-BLW327AU.js";
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-ZBTUISPG.js";
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-OL2L5ANJ.js";
4
- import "./chunk-BLW327AU.js";
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-ZBTUISPG.js";
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
- return `${c.cited}/${c.total}`;
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/total snapshots \xB7 Mentioned = mentioned/checked (checked excludes "not checked")');
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-OL2L5ANJ.js";
4
- import "./chunk-BLW327AU.js";
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-ZBTUISPG.js";
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.98.0",
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.0.0",
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};