@ainyc/canonry 4.56.1 → 4.59.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 (28) hide show
  1. package/README.md +1 -1
  2. package/assets/agent-workspace/skills/aero/references/orchestration.md +1 -1
  3. package/assets/agent-workspace/skills/canonry/SKILL.md +8 -1
  4. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +44 -0
  5. package/assets/agent-workspace/skills/canonry/references/google-business-profile.md +219 -0
  6. package/assets/assets/{BacklinksPage-CmeFZ8UJ.js → BacklinksPage-D_mc7c-b.js} +1 -1
  7. package/assets/assets/{ChartPrimitives-D7C1Cp8w.js → ChartPrimitives-BViWneKX.js} +1 -1
  8. package/assets/assets/{ProjectPage-Y6uCyjGb.js → ProjectPage-_hpYJAN1.js} +1 -1
  9. package/assets/assets/{RunRow-BntNdrgM.js → RunRow-DK69_0iD.js} +1 -1
  10. package/assets/assets/{RunsPage-Btp6qn10.js → RunsPage-DRu1peAA.js} +1 -1
  11. package/assets/assets/{SettingsPage-DkyNiU2i.js → SettingsPage-BrednApH.js} +1 -1
  12. package/assets/assets/{TrafficPage-CBl4Mwdc.js → TrafficPage-oFA65ZZc.js} +1 -1
  13. package/assets/assets/{TrafficSourceDetailPage-BZzuWCn-.js → TrafficSourceDetailPage-CUzzaYFC.js} +1 -1
  14. package/assets/assets/{extract-error-message-De8_qAzs.js → extract-error-message-Cv4MXGtB.js} +1 -1
  15. package/assets/assets/{index-XUKhruAg.js → index-BrCh3uvb.js} +90 -90
  16. package/assets/assets/{server-traffic-bn9LSZN9.js → server-traffic-rYE-NlE-.js} +1 -1
  17. package/assets/assets/{trash-2-B5clF2rU.js → trash-2-BgGGPjQf.js} +1 -1
  18. package/assets/index.html +1 -1
  19. package/dist/{chunk-4KWPOVIT.js → chunk-JW6TQFU7.js} +171 -1
  20. package/dist/{chunk-WFVUZVJD.js → chunk-LPPW7O26.js} +1421 -1190
  21. package/dist/{chunk-I2LAM5IM.js → chunk-NOQ4ZE3E.js} +2210 -615
  22. package/dist/{chunk-6X5TF73A.js → chunk-TFBPLY77.js} +414 -1
  23. package/dist/cli.js +610 -458
  24. package/dist/index.d.ts +2 -1
  25. package/dist/index.js +4 -4
  26. package/dist/{intelligence-service-NY3MAVPB.js → intelligence-service-V4SWVKEQ.js} +2 -2
  27. package/dist/mcp.js +10 -8
  28. package/package.json +11 -10
@@ -1 +1 @@
1
- import{c as d,j as a,bI as S,bC as l,bJ as v,aj as m,l as t,bK as y,bD as i,bL as T,bM as h,bN as p,bO as b}from"./index-XUKhruAg.js";import{u as s,r as C,n as c,o as u}from"./vendor-tanstack-Dq7p98wZ.js";const g=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],B=d("refresh-cw",g);function P(e){switch(e){case i.connected:return"positive";case i.paused:return"caution";case i.error:return"negative";case i.archived:return"neutral"}}function w(e){const r={};return e.kind&&e.kind!=="all"&&(r.kind=e.kind),e.sourceId&&(r.sourceId=e.sourceId),e.sinceMinutes!==void 0&&(r.since=new Date(Date.now()-e.sinceMinutes*6e4).toISOString()),e.limit!==void 0&&(r.limit=String(e.limit)),r}function o(e){e.invalidateQueries({predicate:r=>{const n=r.queryKey[0];return typeof n?._id=="string"&&n._id.startsWith("getApiV1ProjectsByNameTraffic")}})}function k(e){return s({...S({client:t,path:{name:e??""}}),enabled:!!e,staleTime:a})}function F(e){return s({...b({client:t,path:{name:e??""}}),enabled:!!e,staleTime:a})}function V(e,r){return s({...l({client:t,path:{name:e??"",id:r??""}}),enabled:!!(e&&r),staleTime:a})}function A(e,r){const n=C.useMemo(()=>w(r),[r.kind,r.sourceId,r.sinceMinutes,r.limit]);return s({...v({client:t,path:{name:e??""},query:n}),enabled:!!e,staleTime:a})}function E(e){const r=c();return u({mutationFn:n=>{if(!e)throw new Error("Project is required to connect a Cloud Run source");return p(e,n)},onSuccess:()=>{e&&o(r)}})}function I(e){const r=c();return u({mutationFn:n=>{if(!e)throw new Error("Project is required to connect a WordPress source");return T(e,n)},onSuccess:()=>{e&&o(r)}})}function N(e){const r=c();return u({mutationFn:n=>{if(!e)throw new Error("Project is required to connect a Vercel source");return h(e,n)},onSuccess:()=>{e&&o(r)}})}function Q(e,r){const n=c();return u({mutationFn:f=>{if(!e||!r)throw new Error("Project and sourceId are required to sync");return y(e,r,f??void 0)},onSuccess:()=>{e&&(o(n),n.invalidateQueries({queryKey:m({client:t})}))}})}export{B as R,I as a,N as b,E as c,k as d,V as e,A as f,Q as g,P as t,F as u};
1
+ import{c as d,j as a,bI as S,bC as l,bJ as v,aj as m,l as t,bK as y,bD as i,bL as T,bM as h,bN as p,bO as b}from"./index-BrCh3uvb.js";import{u as s,r as C,n as c,o as u}from"./vendor-tanstack-Dq7p98wZ.js";const g=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],B=d("refresh-cw",g);function P(e){switch(e){case i.connected:return"positive";case i.paused:return"caution";case i.error:return"negative";case i.archived:return"neutral"}}function w(e){const r={};return e.kind&&e.kind!=="all"&&(r.kind=e.kind),e.sourceId&&(r.sourceId=e.sourceId),e.sinceMinutes!==void 0&&(r.since=new Date(Date.now()-e.sinceMinutes*6e4).toISOString()),e.limit!==void 0&&(r.limit=String(e.limit)),r}function o(e){e.invalidateQueries({predicate:r=>{const n=r.queryKey[0];return typeof n?._id=="string"&&n._id.startsWith("getApiV1ProjectsByNameTraffic")}})}function k(e){return s({...S({client:t,path:{name:e??""}}),enabled:!!e,staleTime:a})}function F(e){return s({...b({client:t,path:{name:e??""}}),enabled:!!e,staleTime:a})}function V(e,r){return s({...l({client:t,path:{name:e??"",id:r??""}}),enabled:!!(e&&r),staleTime:a})}function A(e,r){const n=C.useMemo(()=>w(r),[r.kind,r.sourceId,r.sinceMinutes,r.limit]);return s({...v({client:t,path:{name:e??""},query:n}),enabled:!!e,staleTime:a})}function E(e){const r=c();return u({mutationFn:n=>{if(!e)throw new Error("Project is required to connect a Cloud Run source");return p(e,n)},onSuccess:()=>{e&&o(r)}})}function I(e){const r=c();return u({mutationFn:n=>{if(!e)throw new Error("Project is required to connect a WordPress source");return T(e,n)},onSuccess:()=>{e&&o(r)}})}function N(e){const r=c();return u({mutationFn:n=>{if(!e)throw new Error("Project is required to connect a Vercel source");return h(e,n)},onSuccess:()=>{e&&o(r)}})}function Q(e,r){const n=c();return u({mutationFn:f=>{if(!e||!r)throw new Error("Project and sourceId are required to sync");return y(e,r,f??void 0)},onSuccess:()=>{e&&(o(n),n.invalidateQueries({queryKey:m({client:t})}))}})}export{B as R,I as a,N as b,E as c,k as d,V as e,A as f,Q as g,P as t,F as u};
@@ -1 +1 @@
1
- import{c}from"./index-XUKhruAg.js";const a=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],h=c("circle-check",a);const e=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],n=c("circle-question-mark",e);const o=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],s=c("download",o);const t=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],r=c("trash-2",t);export{h as C,s as D,r as T,n as a};
1
+ import{c}from"./index-BrCh3uvb.js";const a=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],h=c("circle-check",a);const e=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],n=c("circle-question-mark",e);const o=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],s=c("download",o);const t=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],r=c("trash-2",t);export{h as C,s as D,r as T,n as a};
package/assets/index.html CHANGED
@@ -12,7 +12,7 @@
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-XUKhruAg.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-BrCh3uvb.js"></script>
16
16
  <link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-Dq7p98wZ.js">
17
17
  <link rel="modulepreload" crossorigin href="./assets/vendor-radix-B57xfQbP.js">
18
18
  <link rel="modulepreload" crossorigin href="./assets/vendor-recharts-DWvKDyBF.js">
@@ -12,7 +12,7 @@ import {
12
12
  effectiveDomains,
13
13
  normalizeProjectDomain,
14
14
  registrableDomain
15
- } from "./chunk-WFVUZVJD.js";
15
+ } from "./chunk-LPPW7O26.js";
16
16
 
17
17
  // src/intelligence-service.ts
18
18
  import { eq, desc, asc, and, ne, or, inArray } from "drizzle-orm";
@@ -50,6 +50,11 @@ __export(schema_exports, {
50
50
  gaTrafficSnapshots: () => gaTrafficSnapshots,
51
51
  gaTrafficSummaries: () => gaTrafficSummaries,
52
52
  gaTrafficWindowSummaries: () => gaTrafficWindowSummaries,
53
+ gbpDailyMetrics: () => gbpDailyMetrics,
54
+ gbpKeywordImpressions: () => gbpKeywordImpressions,
55
+ gbpLocations: () => gbpLocations,
56
+ gbpLodgingSnapshots: () => gbpLodgingSnapshots,
57
+ gbpPlaceActions: () => gbpPlaceActions,
53
58
  googleConnections: () => googleConnections,
54
59
  gscCoverageSnapshots: () => gscCoverageSnapshots,
55
60
  gscSearchData: () => gscSearchData,
@@ -809,6 +814,81 @@ var migrationsTable = sqliteTable("_migrations", {
809
814
  name: text("name").notNull(),
810
815
  appliedAt: text("applied_at").notNull()
811
816
  });
817
+ var gbpLocations = sqliteTable("gbp_locations", {
818
+ id: text("id").primaryKey(),
819
+ projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
820
+ accountName: text("account_name").notNull(),
821
+ locationName: text("location_name").notNull(),
822
+ displayName: text("display_name").notNull(),
823
+ primaryCategoryDisplayName: text("primary_category_display_name"),
824
+ storefrontAddress: text("storefront_address"),
825
+ websiteUri: text("website_uri"),
826
+ selected: integer("selected", { mode: "boolean" }).notNull().default(true),
827
+ syncedAt: text("synced_at"),
828
+ createdAt: text("created_at").notNull(),
829
+ updatedAt: text("updated_at").notNull()
830
+ }, (table) => [
831
+ index("idx_gbp_locations_project").on(table.projectId),
832
+ uniqueIndex("uniq_gbp_locations_project_location").on(table.projectId, table.locationName)
833
+ ]);
834
+ var gbpDailyMetrics = sqliteTable("gbp_daily_metrics", {
835
+ id: text("id").primaryKey(),
836
+ projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
837
+ locationName: text("location_name").notNull(),
838
+ date: text("date").notNull(),
839
+ // YYYY-MM-DD
840
+ metric: text("metric").notNull(),
841
+ // BUSINESS_IMPRESSIONS_DESKTOP_MAPS, WEBSITE_CLICKS, …
842
+ value: integer("value").notNull(),
843
+ syncRunId: text("sync_run_id").references(() => runs.id, { onDelete: "set null" })
844
+ }, (table) => [
845
+ index("idx_gbp_daily_metrics_loc").on(table.projectId, table.locationName, table.date),
846
+ uniqueIndex("uniq_gbp_daily_metrics").on(table.projectId, table.locationName, table.date, table.metric)
847
+ ]);
848
+ var gbpKeywordImpressions = sqliteTable("gbp_keyword_impressions", {
849
+ id: text("id").primaryKey(),
850
+ projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
851
+ locationName: text("location_name").notNull(),
852
+ periodStart: text("period_start").notNull(),
853
+ // YYYY-MM, inclusive
854
+ periodEnd: text("period_end").notNull(),
855
+ // YYYY-MM, inclusive
856
+ keyword: text("keyword").notNull(),
857
+ valueCount: integer("value_count"),
858
+ // exact impressions, or null when thresholded
859
+ valueThreshold: integer("value_threshold"),
860
+ // privacy floor, or null when exact
861
+ syncRunId: text("sync_run_id").references(() => runs.id, { onDelete: "set null" })
862
+ }, (table) => [
863
+ index("idx_gbp_keyword_impr_loc").on(table.projectId, table.locationName, table.periodEnd),
864
+ uniqueIndex("uniq_gbp_keyword_impr").on(table.projectId, table.locationName, table.periodEnd, table.keyword)
865
+ ]);
866
+ var gbpPlaceActions = sqliteTable("gbp_place_actions", {
867
+ id: text("id").primaryKey(),
868
+ projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
869
+ locationName: text("location_name").notNull(),
870
+ placeActionLinkName: text("place_action_link_name").notNull(),
871
+ placeActionType: text("place_action_type").notNull(),
872
+ uri: text("uri"),
873
+ isPreferred: integer("is_preferred", { mode: "boolean" }).notNull().default(false),
874
+ providerType: text("provider_type"),
875
+ syncRunId: text("sync_run_id").references(() => runs.id, { onDelete: "set null" })
876
+ }, (table) => [
877
+ index("idx_gbp_place_actions_loc").on(table.projectId, table.locationName),
878
+ uniqueIndex("uniq_gbp_place_actions").on(table.projectId, table.placeActionLinkName)
879
+ ]);
880
+ var gbpLodgingSnapshots = sqliteTable("gbp_lodging_snapshots", {
881
+ id: text("id").primaryKey(),
882
+ projectId: text("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
883
+ locationName: text("location_name").notNull(),
884
+ contentHash: text("content_hash").notNull(),
885
+ attributes: text("attributes", { mode: "json" }).$type().notNull().default({}),
886
+ populatedGroupCount: integer("populated_group_count").notNull().default(0),
887
+ syncedAt: text("synced_at").notNull(),
888
+ syncRunId: text("sync_run_id").references(() => runs.id, { onDelete: "set null" })
889
+ }, (table) => [
890
+ index("idx_gbp_lodging_loc").on(table.projectId, table.locationName, table.syncedAt)
891
+ ]);
812
892
 
813
893
  // ../db/src/client.ts
814
894
  function createClient(databasePath) {
@@ -2236,6 +2316,91 @@ var MIGRATION_VERSIONS = [
2236
2316
  ));
2237
2317
  }
2238
2318
  }
2319
+ },
2320
+ {
2321
+ version: 67,
2322
+ name: "gbp-locations",
2323
+ statements: [
2324
+ // Google Business Profile integration (Phase 1) — gbp_locations table
2325
+ // holds per-project discovered locations and their selection state.
2326
+ `CREATE TABLE IF NOT EXISTS gbp_locations (
2327
+ id TEXT PRIMARY KEY,
2328
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
2329
+ account_name TEXT NOT NULL,
2330
+ location_name TEXT NOT NULL,
2331
+ display_name TEXT NOT NULL,
2332
+ primary_category_display_name TEXT,
2333
+ storefront_address TEXT,
2334
+ website_uri TEXT,
2335
+ selected INTEGER NOT NULL DEFAULT 1,
2336
+ synced_at TEXT,
2337
+ created_at TEXT NOT NULL,
2338
+ updated_at TEXT NOT NULL
2339
+ )`,
2340
+ `CREATE INDEX IF NOT EXISTS idx_gbp_locations_project ON gbp_locations(project_id)`,
2341
+ `CREATE UNIQUE INDEX IF NOT EXISTS uniq_gbp_locations_project_location ON gbp_locations(project_id, location_name)`
2342
+ ]
2343
+ },
2344
+ {
2345
+ version: 68,
2346
+ name: "gbp-performance",
2347
+ statements: [
2348
+ // GBP Phase 2 — daily performance metrics + monthly keyword impressions.
2349
+ `CREATE TABLE IF NOT EXISTS gbp_daily_metrics (
2350
+ id TEXT PRIMARY KEY,
2351
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
2352
+ location_name TEXT NOT NULL,
2353
+ date TEXT NOT NULL,
2354
+ metric TEXT NOT NULL,
2355
+ value INTEGER NOT NULL,
2356
+ sync_run_id TEXT REFERENCES runs(id) ON DELETE SET NULL
2357
+ )`,
2358
+ `CREATE INDEX IF NOT EXISTS idx_gbp_daily_metrics_loc ON gbp_daily_metrics(project_id, location_name, date)`,
2359
+ `CREATE UNIQUE INDEX IF NOT EXISTS uniq_gbp_daily_metrics ON gbp_daily_metrics(project_id, location_name, date, metric)`,
2360
+ `CREATE TABLE IF NOT EXISTS gbp_keyword_impressions (
2361
+ id TEXT PRIMARY KEY,
2362
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
2363
+ location_name TEXT NOT NULL,
2364
+ period_start TEXT NOT NULL,
2365
+ period_end TEXT NOT NULL,
2366
+ keyword TEXT NOT NULL,
2367
+ value_count INTEGER,
2368
+ value_threshold INTEGER,
2369
+ sync_run_id TEXT REFERENCES runs(id) ON DELETE SET NULL
2370
+ )`,
2371
+ `CREATE INDEX IF NOT EXISTS idx_gbp_keyword_impr_loc ON gbp_keyword_impressions(project_id, location_name, period_end)`,
2372
+ `CREATE UNIQUE INDEX IF NOT EXISTS uniq_gbp_keyword_impr ON gbp_keyword_impressions(project_id, location_name, period_end, keyword)`
2373
+ ]
2374
+ },
2375
+ {
2376
+ version: 69,
2377
+ name: "gbp-place-actions-and-lodging",
2378
+ statements: [
2379
+ `CREATE TABLE IF NOT EXISTS gbp_place_actions (
2380
+ id TEXT PRIMARY KEY,
2381
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
2382
+ location_name TEXT NOT NULL,
2383
+ place_action_link_name TEXT NOT NULL,
2384
+ place_action_type TEXT NOT NULL,
2385
+ uri TEXT,
2386
+ is_preferred INTEGER NOT NULL DEFAULT 0,
2387
+ provider_type TEXT,
2388
+ sync_run_id TEXT REFERENCES runs(id) ON DELETE SET NULL
2389
+ )`,
2390
+ `CREATE INDEX IF NOT EXISTS idx_gbp_place_actions_loc ON gbp_place_actions(project_id, location_name)`,
2391
+ `CREATE UNIQUE INDEX IF NOT EXISTS uniq_gbp_place_actions ON gbp_place_actions(project_id, place_action_link_name)`,
2392
+ `CREATE TABLE IF NOT EXISTS gbp_lodging_snapshots (
2393
+ id TEXT PRIMARY KEY,
2394
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
2395
+ location_name TEXT NOT NULL,
2396
+ content_hash TEXT NOT NULL,
2397
+ attributes TEXT NOT NULL DEFAULT '{}',
2398
+ populated_group_count INTEGER NOT NULL DEFAULT 0,
2399
+ synced_at TEXT NOT NULL,
2400
+ sync_run_id TEXT REFERENCES runs(id) ON DELETE SET NULL
2401
+ )`,
2402
+ `CREATE INDEX IF NOT EXISTS idx_gbp_lodging_loc ON gbp_lodging_snapshots(project_id, location_name, synced_at)`
2403
+ ]
2239
2404
  }
2240
2405
  ];
2241
2406
  function isDuplicateColumnError(err) {
@@ -4796,6 +4961,11 @@ export {
4796
4961
  discoveryProbes,
4797
4962
  contentTargetDismissals,
4798
4963
  recommendationExplanations,
4964
+ gbpLocations,
4965
+ gbpDailyMetrics,
4966
+ gbpKeywordImpressions,
4967
+ gbpPlaceActions,
4968
+ gbpLodgingSnapshots,
4799
4969
  createClient,
4800
4970
  parseJsonColumn,
4801
4971
  extractLegacyCredentials,