@ainyc/canonry 2.2.3 → 2.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/assets/index.html CHANGED
@@ -12,8 +12,8 @@
12
12
  <link rel="icon" type="image/png" sizes="32x32" href="./favicon-32.png" />
13
13
  <link rel="apple-touch-icon" href="./apple-touch-icon.png" />
14
14
  <title>Canonry</title>
15
- <script type="module" crossorigin src="./assets/index-Bmnz-wvT.js"></script>
16
- <link rel="stylesheet" crossorigin href="./assets/index-yF1fs-OW.css">
15
+ <script type="module" crossorigin src="./assets/index-Nrl3ecFY.js"></script>
16
+ <link rel="stylesheet" crossorigin href="./assets/index-CAewPdsZ.css">
17
17
  </head>
18
18
  <body>
19
19
  <div id="root"></div>
@@ -20,10 +20,13 @@ __export(schema_exports, {
20
20
  agentSessions: () => agentSessions,
21
21
  apiKeys: () => apiKeys,
22
22
  auditLog: () => auditLog,
23
+ backlinkDomains: () => backlinkDomains,
24
+ backlinkSummaries: () => backlinkSummaries,
23
25
  bingConnections: () => bingConnections,
24
26
  bingCoverageSnapshots: () => bingCoverageSnapshots,
25
27
  bingKeywordStats: () => bingKeywordStats,
26
28
  bingUrlInspections: () => bingUrlInspections,
29
+ ccReleaseSyncs: () => ccReleaseSyncs,
27
30
  competitors: () => competitors,
28
31
  gaAiReferrals: () => gaAiReferrals,
29
32
  gaConnections: () => gaConnections,
@@ -58,6 +61,7 @@ var projects = sqliteTable("projects", {
58
61
  providers: text("providers").notNull().default("[]"),
59
62
  locations: text("locations").notNull().default("[]"),
60
63
  defaultLocation: text("default_location"),
64
+ autoExtractBacklinks: integer("auto_extract_backlinks").notNull().default(0),
61
65
  configSource: text("config_source").notNull().default("cli"),
62
66
  configRevision: integer("config_revision").notNull().default(1),
63
67
  createdAt: text("created_at").notNull(),
@@ -426,6 +430,60 @@ var agentSessions = sqliteTable("agent_sessions", {
426
430
  index("idx_agent_sessions_project").on(table.projectId),
427
431
  index("idx_agent_sessions_updated").on(table.updatedAt)
428
432
  ]);
433
+ var ccReleaseSyncs = sqliteTable("cc_release_syncs", {
434
+ id: text("id").primaryKey(),
435
+ release: text("release").notNull().unique(),
436
+ status: text("status").notNull(),
437
+ phaseDetail: text("phase_detail"),
438
+ vertexPath: text("vertex_path"),
439
+ edgesPath: text("edges_path"),
440
+ vertexSha256: text("vertex_sha256"),
441
+ edgesSha256: text("edges_sha256"),
442
+ vertexBytes: integer("vertex_bytes"),
443
+ edgesBytes: integer("edges_bytes"),
444
+ projectsProcessed: integer("projects_processed"),
445
+ domainsDiscovered: integer("domains_discovered"),
446
+ downloadStartedAt: text("download_started_at"),
447
+ downloadFinishedAt: text("download_finished_at"),
448
+ queryStartedAt: text("query_started_at"),
449
+ queryFinishedAt: text("query_finished_at"),
450
+ error: text("error"),
451
+ createdAt: text("created_at").notNull(),
452
+ updatedAt: text("updated_at").notNull()
453
+ }, (table) => [
454
+ index("idx_cc_release_syncs_status").on(table.status)
455
+ ]);
456
+ var backlinkDomains = sqliteTable("backlink_domains", {
457
+ id: text("id").primaryKey(),
458
+ projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
459
+ releaseSyncId: text("release_sync_id").notNull().references(() => ccReleaseSyncs.id, { onDelete: "cascade" }),
460
+ release: text("release").notNull(),
461
+ targetDomain: text("target_domain").notNull(),
462
+ linkingDomain: text("linking_domain").notNull(),
463
+ numHosts: integer("num_hosts").notNull(),
464
+ createdAt: text("created_at").notNull()
465
+ }, (table) => [
466
+ index("idx_backlink_domains_project").on(table.projectId),
467
+ index("idx_backlink_domains_release_sync").on(table.releaseSyncId),
468
+ index("idx_backlink_domains_project_release").on(table.projectId, table.release),
469
+ index("idx_backlink_domains_hosts").on(table.numHosts),
470
+ uniqueIndex("idx_backlink_domains_unique").on(table.projectId, table.release, table.linkingDomain)
471
+ ]);
472
+ var backlinkSummaries = sqliteTable("backlink_summaries", {
473
+ id: text("id").primaryKey(),
474
+ projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
475
+ releaseSyncId: text("release_sync_id").notNull().references(() => ccReleaseSyncs.id, { onDelete: "cascade" }),
476
+ release: text("release").notNull(),
477
+ targetDomain: text("target_domain").notNull(),
478
+ totalLinkingDomains: integer("total_linking_domains").notNull(),
479
+ totalHosts: integer("total_hosts").notNull(),
480
+ top10HostsShare: text("top_10_hosts_share").notNull(),
481
+ queriedAt: text("queried_at").notNull(),
482
+ createdAt: text("created_at").notNull()
483
+ }, (table) => [
484
+ uniqueIndex("idx_backlink_summaries_project_release").on(table.projectId, table.release),
485
+ index("idx_backlink_summaries_project").on(table.projectId)
486
+ ]);
429
487
  var agentMemory = sqliteTable("agent_memory", {
430
488
  id: text("id").primaryKey(),
431
489
  projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
@@ -921,7 +979,64 @@ var MIGRATIONS = [
921
979
  `CREATE UNIQUE INDEX IF NOT EXISTS uniq_agent_memory_project_key
922
980
  ON agent_memory(project_id, key)`,
923
981
  `CREATE INDEX IF NOT EXISTS idx_agent_memory_project_updated
924
- ON agent_memory(project_id, updated_at)`
982
+ ON agent_memory(project_id, updated_at)`,
983
+ // v41: Common Crawl backlinks — workspace-level release syncs plus per-project
984
+ // backlink_domains and backlink_summaries populated in one DuckDB pass.
985
+ `CREATE TABLE IF NOT EXISTS cc_release_syncs (
986
+ id TEXT PRIMARY KEY,
987
+ release TEXT NOT NULL UNIQUE,
988
+ status TEXT NOT NULL,
989
+ phase_detail TEXT,
990
+ vertex_path TEXT,
991
+ edges_path TEXT,
992
+ vertex_sha256 TEXT,
993
+ edges_sha256 TEXT,
994
+ vertex_bytes INTEGER,
995
+ edges_bytes INTEGER,
996
+ projects_processed INTEGER,
997
+ domains_discovered INTEGER,
998
+ download_started_at TEXT,
999
+ download_finished_at TEXT,
1000
+ query_started_at TEXT,
1001
+ query_finished_at TEXT,
1002
+ error TEXT,
1003
+ created_at TEXT NOT NULL,
1004
+ updated_at TEXT NOT NULL
1005
+ )`,
1006
+ `CREATE INDEX IF NOT EXISTS idx_cc_release_syncs_status ON cc_release_syncs(status)`,
1007
+ `CREATE TABLE IF NOT EXISTS backlink_domains (
1008
+ id TEXT PRIMARY KEY,
1009
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
1010
+ release_sync_id TEXT NOT NULL REFERENCES cc_release_syncs(id) ON DELETE CASCADE,
1011
+ release TEXT NOT NULL,
1012
+ target_domain TEXT NOT NULL,
1013
+ linking_domain TEXT NOT NULL,
1014
+ num_hosts INTEGER NOT NULL,
1015
+ created_at TEXT NOT NULL
1016
+ )`,
1017
+ `CREATE INDEX IF NOT EXISTS idx_backlink_domains_project ON backlink_domains(project_id)`,
1018
+ `CREATE INDEX IF NOT EXISTS idx_backlink_domains_release_sync ON backlink_domains(release_sync_id)`,
1019
+ `CREATE INDEX IF NOT EXISTS idx_backlink_domains_project_release ON backlink_domains(project_id, release)`,
1020
+ `CREATE INDEX IF NOT EXISTS idx_backlink_domains_hosts ON backlink_domains(num_hosts)`,
1021
+ `CREATE UNIQUE INDEX IF NOT EXISTS idx_backlink_domains_unique ON backlink_domains(project_id, release, linking_domain)`,
1022
+ `CREATE TABLE IF NOT EXISTS backlink_summaries (
1023
+ id TEXT PRIMARY KEY,
1024
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
1025
+ release_sync_id TEXT NOT NULL REFERENCES cc_release_syncs(id) ON DELETE CASCADE,
1026
+ release TEXT NOT NULL,
1027
+ target_domain TEXT NOT NULL,
1028
+ total_linking_domains INTEGER NOT NULL,
1029
+ total_hosts INTEGER NOT NULL,
1030
+ top_10_hosts_share TEXT NOT NULL,
1031
+ queried_at TEXT NOT NULL,
1032
+ created_at TEXT NOT NULL
1033
+ )`,
1034
+ `CREATE UNIQUE INDEX IF NOT EXISTS idx_backlink_summaries_project_release ON backlink_summaries(project_id, release)`,
1035
+ `CREATE INDEX IF NOT EXISTS idx_backlink_summaries_project ON backlink_summaries(project_id)`,
1036
+ // v42: Per-project auto-extract toggle — when a release sync transitions
1037
+ // to ready, projects with this flag get a backlink-extract run enqueued.
1038
+ // Stored as INTEGER (0/1) to match SQLite boolean convention.
1039
+ `ALTER TABLE projects ADD COLUMN auto_extract_backlinks INTEGER NOT NULL DEFAULT 0`
925
1040
  ];
926
1041
  function isDuplicateColumnError(err) {
927
1042
  if (!(err instanceof Error)) return false;
@@ -1452,6 +1567,9 @@ export {
1452
1567
  insights,
1453
1568
  healthSnapshots,
1454
1569
  agentSessions,
1570
+ ccReleaseSyncs,
1571
+ backlinkDomains,
1572
+ backlinkSummaries,
1455
1573
  agentMemory,
1456
1574
  createClient,
1457
1575
  parseJsonColumn,