@canonry/canonry 7.58.1 → 7.58.3

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 (55) hide show
  1. package/README.md +5 -0
  2. package/assets/agent-workspace/skills/aero/SKILL.md +9 -2
  3. package/assets/agent-workspace/skills/aero/references/reporting.md +4 -0
  4. package/assets/agent-workspace/skills/aero/references/seo-analysis.md +123 -0
  5. package/assets/assets/{AgentSetupPage-BSkstQJa.js → AgentSetupPage-CRvCLiCD.js} +2 -2
  6. package/assets/assets/{AuditHistoryPanel-DAY6GbzH.js → AuditHistoryPanel-DSUKF9GC.js} +1 -1
  7. package/assets/assets/{BacklinksPage-Ci9s8osY.js → BacklinksPage-DIZy0NkW.js} +1 -1
  8. package/assets/assets/{ChartPrimitives-BgY3tqbD.js → ChartPrimitives-CksxPvHn.js} +1 -1
  9. package/assets/assets/{Hint-BsfMSR5e.js → Hint-C0TmIzHX.js} +1 -1
  10. package/assets/assets/{HistoryPage-BM7PM3Ow.js → HistoryPage-B2Xtxu5L.js} +1 -1
  11. package/assets/assets/{InfoTooltip-COkeQYiP.js → InfoTooltip-DV3_9Qp1.js} +1 -1
  12. package/assets/assets/MeasurementPropertyPage-B3qnQtNg.js +4 -0
  13. package/assets/assets/{ProjectPage-Dnev2R09.js → ProjectPage-j9V9UFfY.js} +5 -5
  14. package/assets/assets/RunsPage-CvqCrsiH.js +1 -0
  15. package/assets/assets/SettingsPage-CX5Rzsm3.js +1 -0
  16. package/assets/assets/SiteHealthSection-CYKyJBaJ.js +2 -0
  17. package/assets/assets/{ToneBadge-Bk7cBexZ.js → ToneBadge-DYEbxp5S.js} +1 -1
  18. package/assets/assets/TrafficPage-DNC0DP-U.js +40 -0
  19. package/assets/assets/{TrafficSourceDetailPage-BVAVo-JO.js → TrafficSourceDetailPage-Dp7AYvRP.js} +1 -1
  20. package/assets/assets/{account-context-ChEngAKj.js → account-context-DHWaWJSr.js} +1 -1
  21. package/assets/assets/{card-qOcJFZhl.js → card-im88-x1b.js} +1 -1
  22. package/assets/assets/{extract-error-message-bWEYiDDO.js → extract-error-message-Bq8oNvfF.js} +1 -1
  23. package/assets/assets/{format-helpers-CvOZG1pt.js → format-helpers-DOEct2q8.js} +1 -1
  24. package/assets/assets/index-B662I7kR.css +1 -0
  25. package/assets/assets/index-CQwjYVPD.js +60 -0
  26. package/assets/assets/{query-client-nsJhXK9R.js → query-client-BN_-qp71.js} +1 -1
  27. package/assets/assets/{react-query-BKjNH2ek.js → react-query-P6OZ-MPl.js} +1 -1
  28. package/assets/assets/{react-sigma_core.esm.min-C8kc2J6I.js → react-sigma_core.esm.min-BNkIcXRz.js} +1 -1
  29. package/assets/assets/{service-DmVT5F26.js → service-CWdIU_mf.js} +1 -1
  30. package/assets/assets/{vendor-lucide-CPeGWK5C.js → vendor-lucide-4KkDquAu.js} +1 -1
  31. package/assets/assets/{vendor-markdown-Bdsu1JLE.js → vendor-markdown-9SSeLNHZ.js} +1 -1
  32. package/assets/assets/vendor-radix-BuErWiA2.js +41 -0
  33. package/assets/assets/{vendor-recharts-CFnqWvWF.js → vendor-recharts-qIim36Mt.js} +1 -1
  34. package/assets/assets/{vendor-tanstack-CXaF1vMI.js → vendor-tanstack-pEsPGDvT.js} +1 -1
  35. package/assets/index.html +15 -15
  36. package/dist/{chunk-SML23FNI.js → chunk-BDUHO7KK.js} +4 -4
  37. package/dist/{chunk-3O2F2LGB.js → chunk-JDRKZOUP.js} +1 -1
  38. package/dist/{chunk-VVJ22ZN5.js → chunk-SXGLLWS4.js} +1 -1
  39. package/dist/{cli-commands-QLHV4NXP.js → cli-commands-3HTHHRXT.js} +1 -1
  40. package/dist/cli.js +2 -2
  41. package/dist/{demo-UBMNDBRF.js → demo-TPOKI7ZM.js} +1 -1
  42. package/dist/{demo-server-F4M74FVL.js → demo-server-ZBNKYYM2.js} +42 -32
  43. package/dist/index.d.ts +63 -63
  44. package/dist/index.js +1 -1
  45. package/dist/{init-MAUH2G2K.js → init-4IKMMWAD.js} +1 -1
  46. package/dist/{serve-3GW2F3WS.js → serve-2AOLGG3F.js} +1 -1
  47. package/package.json +1 -1
  48. package/assets/assets/MeasurementPropertyPage-CHzsfcb5.js +0 -4
  49. package/assets/assets/RunsPage-uPCDTjPM.js +0 -1
  50. package/assets/assets/SettingsPage-rBvx_O4A.js +0 -1
  51. package/assets/assets/SiteHealthSection-oBg5h5Ge.js +0 -2
  52. package/assets/assets/TrafficPage-BJSxxkbT.js +0 -40
  53. package/assets/assets/index-BIfsFQb8.js +0 -56
  54. package/assets/assets/index-D67dZGOY.css +0 -1
  55. package/assets/assets/vendor-radix-3k2C0Ly9.js +0 -41
@@ -107,6 +107,8 @@ import {
107
107
  GA_OVERVIEW_WINDOWS,
108
108
  GaOverviewPeriods,
109
109
  RunKinds,
110
+ RunStatuses,
111
+ RunTriggers,
110
112
  SiteCrawlFetchStates,
111
113
  SiteCrawlIndexabilityReasons,
112
114
  SiteCrawlIndexabilityStates,
@@ -3088,7 +3090,11 @@ function seedSearchLandingPages(db, input) {
3088
3090
  async function seedProjectSignals(db, project, now, variant) {
3089
3091
  const nowIso = now.toISOString();
3090
3092
  const prefix = `demo-signals-${project.id}`;
3091
- const syncRunId = `${prefix}-sync`;
3093
+ const gscRunId = `${prefix}-gsc-sync`;
3094
+ const bingRunId = `${prefix}-bing-inspect-sitemap`;
3095
+ const gaRunId = `${prefix}-ga-sync`;
3096
+ const gbpRunId = `${prefix}-gbp-sync`;
3097
+ const adsRunId = `${prefix}-ads-sync`;
3092
3098
  const crawlRunId = `${prefix}-crawl`;
3093
3099
  const root = `https://${project.domain}/`;
3094
3100
  const attemptId = `${prefix}-crawl-attempt`;
@@ -3096,9 +3102,13 @@ async function seedProjectSignals(db, project, now, variant) {
3096
3102
  const groupId = `${prefix}-ad-group`;
3097
3103
  const locationName = `locations/demo-${variant + 1}`;
3098
3104
  db.insert(runs).values([
3099
- { id: syncRunId, projectId: project.id, kind: "data-refresh", status: "completed", trigger: "manual", startedAt: nowIso, finishedAt: nowIso, createdAt: nowIso },
3100
- { id: crawlRunId, projectId: project.id, kind: "site-audit", status: "completed", trigger: "manual", startedAt: nowIso, finishedAt: nowIso, createdAt: nowIso }
3101
- ]).run();
3105
+ { id: gscRunId, kind: RunKinds["gsc-sync"] },
3106
+ { id: bingRunId, kind: RunKinds["bing-inspect-sitemap"] },
3107
+ { id: gaRunId, kind: RunKinds["ga-sync"] },
3108
+ { id: gbpRunId, kind: RunKinds["gbp-sync"] },
3109
+ { id: adsRunId, kind: RunKinds["ads-sync"] },
3110
+ { id: crawlRunId, kind: RunKinds["site-audit"] }
3111
+ ].map((run) => ({ ...run, projectId: project.id, status: RunStatuses.completed, trigger: RunTriggers.manual, startedAt: nowIso, finishedAt: nowIso, createdAt: nowIso }))).run();
3102
3112
  db.insert(googleConnections).values({ id: `${prefix}-gsc`, domain: project.domain, connectionType: "gsc", propertyId: `sc-domain:${project.domain}`, scopes: [], createdByProjectId: project.id, createdAt: nowIso, updatedAt: nowIso }).run();
3103
3113
  db.insert(bingConnections).values({ id: `${prefix}-bing`, domain: project.domain, siteUrl: root, createdByProjectId: project.id, createdAt: nowIso, updatedAt: nowIso }).run();
3104
3114
  const searchTerms = variant === 0 ? ["roof replacement costs", "emergency roof repair options"] : ["family resorts near the coast", "coastal resort amenities"];
@@ -3110,34 +3120,34 @@ async function seedProjectSignals(db, project, now, variant) {
3110
3120
  for (const [termIndex, query] of searchTerms.entries()) {
3111
3121
  const queryClicks = Math.max(3, Math.round(clicks / (termIndex + 2)));
3112
3122
  const queryImpressions = Math.round(impressions / (termIndex + 2));
3113
- db.insert(gscQueryDailyTotals).values({ id: `${prefix}-gsc-query-${i}-${termIndex}`, projectId: project.id, date, query, clicks: queryClicks, impressions: queryImpressions, position: (7.1 + termIndex + i * 0.03).toFixed(2), syncedAt: nowIso, syncRunId, createdAt: at(date) }).run();
3114
- db.insert(gscSearchData).values({ id: `${prefix}-gsc-page-${i}-${termIndex}`, projectId: project.id, syncRunId, date, query, page: termIndex === 0 ? root : `${root}services/`, country: "usa", device: "DESKTOP", clicks: queryClicks, impressions: queryImpressions, ctr: (queryClicks / queryImpressions).toFixed(4), position: (7.1 + termIndex).toFixed(2), createdAt: at(date) }).run();
3123
+ db.insert(gscQueryDailyTotals).values({ id: `${prefix}-gsc-query-${i}-${termIndex}`, projectId: project.id, date, query, clicks: queryClicks, impressions: queryImpressions, position: (7.1 + termIndex + i * 0.03).toFixed(2), syncedAt: nowIso, syncRunId: gscRunId, createdAt: at(date) }).run();
3124
+ db.insert(gscSearchData).values({ id: `${prefix}-gsc-page-${i}-${termIndex}`, projectId: project.id, syncRunId: gscRunId, date, query, page: termIndex === 0 ? root : `${root}services/`, country: "usa", device: "DESKTOP", clicks: queryClicks, impressions: queryImpressions, ctr: (queryClicks / queryImpressions).toFixed(4), position: (7.1 + termIndex).toFixed(2), createdAt: at(date) }).run();
3115
3125
  }
3116
- db.insert(gaTrafficSnapshots).values({ id: `${prefix}-ga-page-${date}`, projectId: project.id, date, landingPage: "/", landingPageNormalized: "/", sessions: 62 + i * 3, organicSessions: 39 + i * 2, directSessions: 14 + i, users: 48 + i * 2, syncedAt: nowIso, syncRunId }).run();
3117
- db.insert(gaAcquisitionDaily).values({ id: `${prefix}-ga-acquisition-${date}`, projectId: project.id, date, channelGroup: "Organic Search", source: "google", medium: "organic", hostName: project.domain, landingPage: "/", landingPageNormalized: "/", sessions: 39 + i * 2, syncedAt: nowIso, syncRunId, createdAt: at(date) }).run();
3118
- db.insert(gaLeadEventsDaily).values({ id: `${prefix}-ga-lead-${date}`, projectId: project.id, date, eventName: "generate_lead", channelGroup: "Organic Search", source: "google", medium: "organic", hostName: project.domain, landingPage: "/", landingPageNormalized: "/", attributionScope: "landing-page", eventCount: 3 + i % 4, syncedAt: nowIso, syncRunId, createdAt: at(date) }).run();
3119
- db.insert(bingCoverageSnapshots).values({ id: `${prefix}-bing-coverage-${date}`, projectId: project.id, syncRunId, date, indexed: 48 + i, notIndexed: 3, unknown: 2, createdAt: at(date) }).run();
3126
+ db.insert(gaTrafficSnapshots).values({ id: `${prefix}-ga-page-${date}`, projectId: project.id, date, landingPage: "/", landingPageNormalized: "/", sessions: 62 + i * 3, organicSessions: 39 + i * 2, directSessions: 14 + i, users: 48 + i * 2, syncedAt: nowIso, syncRunId: gaRunId }).run();
3127
+ db.insert(gaAcquisitionDaily).values({ id: `${prefix}-ga-acquisition-${date}`, projectId: project.id, date, channelGroup: "Organic Search", source: "google", medium: "organic", hostName: project.domain, landingPage: "/", landingPageNormalized: "/", sessions: 39 + i * 2, syncedAt: nowIso, syncRunId: gaRunId, createdAt: at(date) }).run();
3128
+ db.insert(gaLeadEventsDaily).values({ id: `${prefix}-ga-lead-${date}`, projectId: project.id, date, eventName: "generate_lead", channelGroup: "Organic Search", source: "google", medium: "organic", hostName: project.domain, landingPage: "/", landingPageNormalized: "/", attributionScope: "landing-page", eventCount: 3 + i % 4, syncedAt: nowIso, syncRunId: gaRunId, createdAt: at(date) }).run();
3129
+ db.insert(bingCoverageSnapshots).values({ id: `${prefix}-bing-coverage-${date}`, projectId: project.id, syncRunId: bingRunId, date, indexed: 48 + i, notIndexed: 3, unknown: 2, createdAt: at(date) }).run();
3120
3130
  }
3121
- seedGaReferrals(db, { projectId: project.id, prefix, syncRunId, nowIso, dates });
3122
- seedGaOverview(db, { projectId: project.id, prefix, syncRunId, now, variant });
3131
+ seedGaReferrals(db, { projectId: project.id, prefix, syncRunId: gaRunId, nowIso, dates });
3132
+ seedGaOverview(db, { projectId: project.id, prefix, syncRunId: gaRunId, now, variant });
3123
3133
  db.insert(gscDataWatermarks).values({ projectId: project.id, dataThroughDate: dates.at(-1), syncedThroughDate: dates.at(-1), updatedAt: nowIso }).run();
3124
- db.insert(gscCoverageSnapshots).values({ id: `${prefix}-gsc-coverage`, projectId: project.id, syncRunId, date: dates.at(-1), indexed: 1, notIndexed: 0, unknownPages: 0, verifiedByInspection: 1, derivedFromImpressions: 0, reasonBreakdown: {}, createdAt: nowIso }).run();
3125
- db.insert(gscUrlInspections).values({ id: `${prefix}-gsc-inspection`, projectId: project.id, syncRunId, url: `${root}services/`, indexingState: "INDEXING_ALLOWED", verdict: "PASS", coverageState: "Submitted and indexed", pageFetchState: "SUCCESSFUL", robotsTxtState: "ALLOWED", crawlTime: nowIso, lastCrawlResult: "SUCCESSFUL", isMobileFriendly: true, richResults: ["Sample FAQ"], referringUrls: [root], inspectedAt: nowIso, createdAt: nowIso }).run();
3134
+ db.insert(gscCoverageSnapshots).values({ id: `${prefix}-gsc-coverage`, projectId: project.id, syncRunId: gscRunId, date: dates.at(-1), indexed: 1, notIndexed: 0, unknownPages: 0, verifiedByInspection: 1, derivedFromImpressions: 0, reasonBreakdown: {}, createdAt: nowIso }).run();
3135
+ db.insert(gscUrlInspections).values({ id: `${prefix}-gsc-inspection`, projectId: project.id, syncRunId: gscRunId, url: `${root}services/`, indexingState: "INDEXING_ALLOWED", verdict: "PASS", coverageState: "Submitted and indexed", pageFetchState: "SUCCESSFUL", robotsTxtState: "ALLOWED", crawlTime: nowIso, lastCrawlResult: "SUCCESSFUL", isMobileFriendly: true, richResults: ["Sample FAQ"], referringUrls: [root], inspectedAt: nowIso, createdAt: nowIso }).run();
3126
3136
  db.insert(bingKeywordStats).values(searchTerms.map((query, i) => ({ id: `${prefix}-bing-keyword-${i}`, projectId: project.id, query, impressions: 310 - i * 70, clicks: 22 - i * 4, ctr: "0.071", averagePosition: String(6 + i), syncedAt: nowIso, createdAt: nowIso }))).run();
3127
- db.insert(bingUrlInspections).values({ id: `${prefix}-bing-inspection`, projectId: project.id, url: root, httpCode: 200, inIndex: true, lastCrawledDate: dates.at(-2), inIndexDate: dates.at(-8), inspectedAt: nowIso, syncRunId, createdAt: nowIso, documentSize: 24120, anchorCount: 18, discoveryDate: dates[0] }).run();
3137
+ db.insert(bingUrlInspections).values({ id: `${prefix}-bing-inspection`, projectId: project.id, url: root, httpCode: 200, inIndex: true, lastCrawledDate: dates.at(-2), inIndexDate: dates.at(-8), inspectedAt: nowIso, syncRunId: bingRunId, createdAt: nowIso, documentSize: 24120, anchorCount: 18, discoveryDate: dates[0] }).run();
3128
3138
  db.insert(gaMeasurementSyncStates).values({ projectId: project.id, acquisitionStatus: "ready", acquisitionSyncedAt: nowIso, leadStatus: "ready", leadSyncedAt: nowIso, leadAttributionScope: "landing-page", searchLandingStatus: "ready", searchLandingSyncedAt: nowIso, searchLandingAttemptedAt: nowIso, updatedAt: nowIso }).run();
3129
- seedSearchLandingPages(db, { projectId: project.id, prefix, syncRunId, nowIso, now, variant });
3130
- db.insert(gaTrafficSummaries).values({ id: `${prefix}-ga-summary`, projectId: project.id, periodStart: dates[0], periodEnd: dates.at(-1), totalSessions: 1610, totalOrganicSessions: 980, totalUsers: 1214, syncedAt: nowIso, syncRunId }).run();
3131
- db.insert(gaTrafficWindowSummaries).values({ id: `${prefix}-ga-window`, projectId: project.id, windowKey: "30d", periodStart: dates[0], periodEnd: dates.at(-1), totalSessions: 1610, totalOrganicSessions: 980, totalDirectSessions: 284, totalUsers: 1214, syncedAt: nowIso, syncRunId }).run();
3139
+ seedSearchLandingPages(db, { projectId: project.id, prefix, syncRunId: gaRunId, nowIso, now, variant });
3140
+ db.insert(gaTrafficSummaries).values({ id: `${prefix}-ga-summary`, projectId: project.id, periodStart: dates[0], periodEnd: dates.at(-1), totalSessions: 1610, totalOrganicSessions: 980, totalUsers: 1214, syncedAt: nowIso, syncRunId: gaRunId }).run();
3141
+ db.insert(gaTrafficWindowSummaries).values({ id: `${prefix}-ga-window`, projectId: project.id, windowKey: "30d", periodStart: dates[0], periodEnd: dates.at(-1), totalSessions: 1610, totalOrganicSessions: 980, totalDirectSessions: 284, totalUsers: 1214, syncedAt: nowIso, syncRunId: gaRunId }).run();
3132
3142
  const inventory = variant === 0 ? summitRoofingInventory() : harborResortsInventory();
3133
3143
  const crawl = await seedSiteCrawl(db, { project, prefix, root, crawlRunId, attemptId, nowIso, inventory });
3134
3144
  const brokenLinkSource = (crawl.findings.find((finding) => finding.sourceNodeKey?.startsWith("/guides/")) ?? crawl.findings.at(0))?.sourceUrl ?? root;
3135
- seedLocalAndCommercialSignals(db, { project, prefix, root, syncRunId, campaignId, groupId, locationName, nowIso, dates, variant });
3145
+ seedLocalAndCommercialSignals(db, { project, prefix, root, gbpRunId, adsRunId, campaignId, groupId, locationName, nowIso, dates, variant });
3136
3146
  if (variant === 1) {
3137
- db.insert(healthSnapshots).values({ id: `${prefix}-health`, projectId: project.id, runId: syncRunId, overallCitedRate: "0.61", overallMentionRate: "0.74", totalPairs: 42, citedPairs: 26, mentionedPairs: 31, providerBreakdown: { openai: { citedRate: 0.62, mentionRate: 0.76, cited: 13, mentioned: 16, total: 21 }, perplexity: { citedRate: 0.6, mentionRate: 0.71, cited: 13, mentioned: 15, total: 21 } }, createdAt: nowIso }).run();
3147
+ db.insert(healthSnapshots).values({ id: `${prefix}-health`, projectId: project.id, overallCitedRate: "0.61", overallMentionRate: "0.74", totalPairs: 42, citedPairs: 26, mentionedPairs: 31, providerBreakdown: { openai: { citedRate: 0.62, mentionRate: 0.76, cited: 13, mentioned: 16, total: 21 }, perplexity: { citedRate: 0.6, mentionRate: 0.71, cited: 13, mentioned: 15, total: 21 } }, createdAt: nowIso }).run();
3138
3148
  db.insert(insights).values([
3139
- { id: `${prefix}-insight-1`, projectId: project.id, runId: syncRunId, type: "opportunity", severity: "medium", title: "Expand service comparison guidance", query: searchTerms[0], provider: "openai", recommendation: { action: "Draft a comparison section", target: `${root}services/`, reason: "Sample insight for the public dashboard." }, cause: { cause: "Sample answer-history gap", details: "This is stored sample data." }, dismissed: false, createdAt: nowIso },
3140
- { id: `${prefix}-insight-2`, projectId: project.id, runId: syncRunId, type: "persistent-gap", severity: "low", title: "Review one internal link target", query: searchTerms[1], provider: "perplexity", recommendation: { action: "Repair the illustrative link", target: brokenLinkSource, reason: "Sample finding for the public dashboard." }, cause: { cause: "Sample crawl finding", details: "This is stored sample data." }, dismissed: false, createdAt: nowIso }
3149
+ { id: `${prefix}-insight-1`, projectId: project.id, type: "opportunity", severity: "medium", title: "Expand service comparison guidance", query: searchTerms[0], provider: "openai", recommendation: { action: "Draft a comparison section", target: `${root}services/`, reason: "Sample insight for the public dashboard." }, cause: { cause: "Sample answer-history gap", details: "This is stored sample data." }, dismissed: false, createdAt: nowIso },
3150
+ { id: `${prefix}-insight-2`, projectId: project.id, runId: crawlRunId, type: "persistent-gap", severity: "low", title: "Review one internal link target", query: searchTerms[1], provider: "perplexity", recommendation: { action: "Repair the illustrative link", target: brokenLinkSource, reason: "Sample finding for the public dashboard." }, cause: { cause: "Sample crawl finding", details: "This is stored sample data." }, dismissed: false, createdAt: nowIso }
3141
3151
  ]).run();
3142
3152
  }
3143
3153
  db.insert(auditLog).values([
@@ -3146,23 +3156,23 @@ async function seedProjectSignals(db, project, now, variant) {
3146
3156
  ]).run();
3147
3157
  }
3148
3158
  function seedLocalAndCommercialSignals(db, input) {
3149
- const { project, prefix, root, syncRunId, campaignId, groupId, locationName, nowIso, dates, variant } = input;
3159
+ const { project, prefix, root, gbpRunId, adsRunId, campaignId, groupId, locationName, nowIso, dates, variant } = input;
3150
3160
  const business = variant === 0 ? { category: "Roofing contractor", campaign: "Spring roof inspection campaign" } : { category: "Resort hotel", campaign: "Spring resort stays campaign" };
3151
3161
  db.insert(gbpLocations).values({ id: `${prefix}-gbp-location`, projectId: project.id, accountName: "accounts/demo-fixture", locationName, displayName: `${project.displayName} - Sample`, primaryCategoryDisplayName: business.category, storefrontAddress: "100 Example Avenue, Demo City", websiteUri: root, placeId: `demo-place-${project.id}`, mapsUri: `https://maps.example/${project.id}`, description: "Sample listing for the public, view-only Canonry dashboard.", selected: true, syncedAt: nowIso, createdAt: nowIso, updatedAt: nowIso }).run();
3152
3162
  db.insert(gbpDailyMetrics).values(dates.slice(-7).flatMap((date, i) => [
3153
- { id: `${prefix}-gbp-impressions-${date}`, projectId: project.id, locationName, date, metric: "BUSINESS_IMPRESSIONS_DESKTOP_MAPS", value: 44 + i * 2, syncRunId },
3154
- { id: `${prefix}-gbp-clicks-${date}`, projectId: project.id, locationName, date, metric: "WEBSITE_CLICKS", value: 7 + i % 3, syncRunId }
3163
+ { id: `${prefix}-gbp-impressions-${date}`, projectId: project.id, locationName, date, metric: "BUSINESS_IMPRESSIONS_DESKTOP_MAPS", value: 44 + i * 2, syncRunId: gbpRunId },
3164
+ { id: `${prefix}-gbp-clicks-${date}`, projectId: project.id, locationName, date, metric: "WEBSITE_CLICKS", value: 7 + i % 3, syncRunId: gbpRunId }
3155
3165
  ])).run();
3156
- db.insert(gbpKeywordImpressions).values({ id: `${prefix}-gbp-keyword`, projectId: project.id, locationName, periodStart: dates[0].slice(0, 7), periodEnd: dates.at(-1).slice(0, 7), keyword: "sample local service", valueCount: 148, valueThreshold: null, syncRunId }).run();
3157
- db.insert(gbpKeywordMonthly).values({ id: `${prefix}-gbp-monthly`, projectId: project.id, locationName, month: dates.at(-1).slice(0, 7), keyword: "sample local service", valueCount: 148, valueThreshold: null, syncRunId, syncedAt: nowIso }).run();
3158
- db.insert(gbpPlaceActions).values({ id: `${prefix}-gbp-action`, projectId: project.id, locationName, placeActionLinkName: `${locationName}/placeActionLinks/demo`, placeActionType: "APPOINTMENT", uri: `${root}contact/`, isPreferred: true, providerType: "MERCHANT", syncRunId }).run();
3166
+ db.insert(gbpKeywordImpressions).values({ id: `${prefix}-gbp-keyword`, projectId: project.id, locationName, periodStart: dates[0].slice(0, 7), periodEnd: dates.at(-1).slice(0, 7), keyword: "sample local service", valueCount: 148, valueThreshold: null, syncRunId: gbpRunId }).run();
3167
+ db.insert(gbpKeywordMonthly).values({ id: `${prefix}-gbp-monthly`, projectId: project.id, locationName, month: dates.at(-1).slice(0, 7), keyword: "sample local service", valueCount: 148, valueThreshold: null, syncRunId: gbpRunId, syncedAt: nowIso }).run();
3168
+ db.insert(gbpPlaceActions).values({ id: `${prefix}-gbp-action`, projectId: project.id, locationName, placeActionLinkName: `${locationName}/placeActionLinks/demo`, placeActionType: "APPOINTMENT", uri: `${root}contact/`, isPreferred: true, providerType: "MERCHANT", syncRunId: gbpRunId }).run();
3159
3169
  db.insert(backlinkSummaries).values({ id: `${prefix}-backlinks`, projectId: project.id, source: "commoncrawl", release: "DEMO-2026-09", targetDomain: project.domain, totalLinkingDomains: 3, totalHosts: 12, top10HostsShare: "0.42", queriedAt: nowIso, createdAt: nowIso }).run();
3160
3170
  db.insert(backlinkDomains).values(["partners.demo.example", "local-guides.demo.example", "trade-directory.demo.example"].map((linkingDomain, i) => ({ id: `${prefix}-backlink-domain-${i}`, projectId: project.id, source: "commoncrawl", release: "DEMO-2026-09", targetDomain: project.domain, linkingDomain, numHosts: 5 - i, createdAt: nowIso }))).run();
3161
3171
  db.insert(adsConnections).values({ id: `${prefix}-ads-connection`, projectId: project.id, adAccountId: `demo-account-${project.id}`, displayName: "Sample Ad Account", currencyCode: "USD", timezone: "UTC", status: "active", reviewStatus: "approved", integrityReviewStatus: "sample", integrityDecision: "synthetic", lastSyncedAt: nowIso, conversionTrackingConfigured: true, createdAt: nowIso, updatedAt: nowIso }).run();
3162
- db.insert(adsCampaigns).values({ id: campaignId, projectId: project.id, name: business.campaign, description: "Sample stored campaign for the public dashboard.", status: "ACTIVE", biddingType: "MAXIMIZE_CONVERSIONS", dailySpendLimitMicros: 45e6, conversionEventSettingIds: ["demo-conversion-setting"], targeting: { sampleData: true }, syncRunId, syncedAt: nowIso }).run();
3163
- db.insert(adsAdGroups).values({ id: groupId, projectId: project.id, campaignId, name: "Service comparison intent", description: "Sample stored ad group.", status: "ACTIVE", billingEventType: "CPC", maxBidMicros: 32e5, contextHints: ["sample service\nsample comparison"], syncRunId, syncedAt: nowIso }).run();
3164
- db.insert(adsAds).values({ id: `${prefix}-ad`, projectId: project.id, adGroupId: groupId, name: "Sample responsive ad", status: "ACTIVE", creative: { sampleData: true, headline: "Sample service guidance" }, reviewStatus: "APPROVED", syncRunId, syncedAt: nowIso }).run();
3165
- db.insert(adsInsightsDaily).values(dates.slice(-7).map((date, i) => ({ id: `${prefix}-ads-insight-${date}`, projectId: project.id, level: "campaign", entityId: campaignId, date, impressions: 340 + i * 20, clicks: 22 + i, spendMicros: 18e5 + i * 1e5, conversions: 2 + i % 3, syncRunId }))).run();
3172
+ db.insert(adsCampaigns).values({ id: campaignId, projectId: project.id, name: business.campaign, description: "Sample stored campaign for the public dashboard.", status: "ACTIVE", biddingType: "MAXIMIZE_CONVERSIONS", dailySpendLimitMicros: 45e6, conversionEventSettingIds: ["demo-conversion-setting"], targeting: { sampleData: true }, syncRunId: adsRunId, syncedAt: nowIso }).run();
3173
+ db.insert(adsAdGroups).values({ id: groupId, projectId: project.id, campaignId, name: "Service comparison intent", description: "Sample stored ad group.", status: "ACTIVE", billingEventType: "CPC", maxBidMicros: 32e5, contextHints: ["sample service\nsample comparison"], syncRunId: adsRunId, syncedAt: nowIso }).run();
3174
+ db.insert(adsAds).values({ id: `${prefix}-ad`, projectId: project.id, adGroupId: groupId, name: "Sample responsive ad", status: "ACTIVE", creative: { sampleData: true, headline: "Sample service guidance" }, reviewStatus: "APPROVED", syncRunId: adsRunId, syncedAt: nowIso }).run();
3175
+ db.insert(adsInsightsDaily).values(dates.slice(-7).map((date, i) => ({ id: `${prefix}-ads-insight-${date}`, projectId: project.id, level: "campaign", entityId: campaignId, date, impressions: 340 + i * 20, clicks: 22 + i, spendMicros: 18e5 + i * 1e5, conversions: 2 + i % 3, syncRunId: adsRunId }))).run();
3166
3176
  db.insert(conversionTrackingContracts).values({ id: `${prefix}-conversion`, projectId: project.id, name: "Sample lead", eventName: "generate_lead", googleAds: { customerId: "demo-customer", conversionActionId: "demo-action", conversionId: "AW-123456", conversionLabel: "demo-label", campaignIds: [campaignId], requireBiddableGoal: true, requirePrimaryAction: true }, gtm: { accountId: "demo-account", containerId: "demo-container", tagId: "demo-tag", triggerIds: ["demo-trigger"], variableIds: ["demo-value", "demo-currency"] }, runtime: { verificationRequired: true, requireTransactionId: true, requireValue: true, requireCurrency: true, productionHosts: [project.domain] }, createdAt: nowIso, updatedAt: nowIso }).run();
3167
3177
  }
3168
3178