@ainyc/canonry 4.91.0 → 4.92.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 (24) hide show
  1. package/assets/agent-workspace/skills/aero/references/regression-playbook.md +1 -0
  2. package/assets/agent-workspace/skills/canonry/references/google-business-profile.md +1 -0
  3. package/assets/assets/{BacklinksPage-DHC1po5Q.js → BacklinksPage-D3JpcWtH.js} +1 -1
  4. package/assets/assets/{ChartPrimitives-Cu2xEVle.js → ChartPrimitives-DdwqEX5v.js} +1 -1
  5. package/assets/assets/{ProjectPage-DXYcaMVO.js → ProjectPage-BPLf4U3A.js} +1 -1
  6. package/assets/assets/{RunRow-BPqbBlXl.js → RunRow-c_2jd8iz.js} +1 -1
  7. package/assets/assets/{RunsPage-BJx3_Nel.js → RunsPage-D6eM_5tB.js} +1 -1
  8. package/assets/assets/{SettingsPage-CXTIHdsv.js → SettingsPage-DaMc8nxK.js} +1 -1
  9. package/assets/assets/{TrafficPage-iibCIBqX.js → TrafficPage-Dw16dcSc.js} +1 -1
  10. package/assets/assets/{TrafficSourceDetailPage-WU30E_59.js → TrafficSourceDetailPage-Dy9D80dz.js} +1 -1
  11. package/assets/assets/{arrow-left-Ds_f14R8.js → arrow-left-D8UaBG9a.js} +1 -1
  12. package/assets/assets/{extract-error-message-D250utEX.js → extract-error-message-CfxCIMNJ.js} +1 -1
  13. package/assets/assets/{index-qiysJOcG.js → index-BA-lh2pG.js} +4 -4
  14. package/assets/assets/{trash-2-CcVWAeec.js → trash-2-j1tX1-Kq.js} +1 -1
  15. package/assets/index.html +1 -1
  16. package/dist/{chunk-6RVUSM4Y.js → chunk-HW4GVIQD.js} +1 -1
  17. package/dist/{chunk-AFSVCKFI.js → chunk-IFUHXONX.js} +22 -3
  18. package/dist/{chunk-2SO5ZS4S.js → chunk-QYC2N23P.js} +4 -4
  19. package/dist/{chunk-WMBOHP7E.js → chunk-VJPVFCZW.js} +2 -0
  20. package/dist/cli.js +4 -4
  21. package/dist/index.js +4 -4
  22. package/dist/{intelligence-service-MHTYZ632.js → intelligence-service-24HCX4SJ.js} +2 -2
  23. package/dist/mcp.js +2 -2
  24. package/package.json +8 -8
@@ -1 +1 @@
1
- import{c}from"./index-qiysJOcG.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-BA-lh2pG.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-qiysJOcG.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-BA-lh2pG.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-ClRVR6aX.js">
@@ -23,7 +23,7 @@ import {
23
23
  trafficConnectVercelRequestSchema,
24
24
  trafficConnectWordpressRequestSchema,
25
25
  trafficEventKindSchema
26
- } from "./chunk-WMBOHP7E.js";
26
+ } from "./chunk-VJPVFCZW.js";
27
27
 
28
28
  // src/config.ts
29
29
  import fs from "fs";
@@ -258,7 +258,7 @@ import {
258
258
  wordpressSchemaDeployResultDtoSchema,
259
259
  wordpressSchemaStatusResultDtoSchema,
260
260
  wordpressStatusDtoSchema
261
- } from "./chunk-WMBOHP7E.js";
261
+ } from "./chunk-VJPVFCZW.js";
262
262
 
263
263
  // src/intelligence-service.ts
264
264
  import { eq as eq37, desc as desc18, asc as asc5, and as and27, ne as ne5, or as or5, inArray as inArray14, gte as gte7, lte as lte4 } from "drizzle-orm";
@@ -5269,6 +5269,18 @@ function analyzeGbp(signals) {
5269
5269
  });
5270
5270
  }
5271
5271
  }
5272
+ if (loc.descriptionMissing) {
5273
+ drafts.push({
5274
+ ...base,
5275
+ type: "gbp-description-missing",
5276
+ severity: "low",
5277
+ title: `${loc.displayName}: no business description set`,
5278
+ recommendation: {
5279
+ action: "Add a business description (up to 750 characters) in the Google Business Profile.",
5280
+ reason: "The owner description is the cheapest owner-controlled prose an AI answer engine can lift to describe the business, and it seeds the entity attributes (specialties, service area, differentiators) models draw on. It reads straight from the GBP API, so an empty one is a real, easily-closed gap."
5281
+ }
5282
+ });
5283
+ }
5272
5284
  if (loc.placeActionCount > 0 && !loc.hasDirectMerchantCta) {
5273
5285
  drafts.push({
5274
5286
  ...base,
@@ -19774,11 +19786,15 @@ var GBP_LOCATIONS_DEFAULT_READ_MASK = [
19774
19786
  "title",
19775
19787
  "storefrontAddress",
19776
19788
  "websiteUri",
19777
- "categories.primaryCategory.displayName",
19789
+ // Request `categories` WHOLE, not a nested sub-path. The Business Information
19790
+ // locations.list readMask rejects a nested path into the REPEATED
19791
+ // `additionalCategories` array ("Invalid field mask provided", HTTP 400 —
19792
+ // verified against the live API), so we ask for the full `categories` object
19793
+ // (it carries primaryCategory + additionalCategories displayNames + serviceTypes).
19794
+ "categories",
19778
19795
  // Owner-authored profile content — the entity-anchor and qualifier signals AI
19779
19796
  // answer engines weight most. All ride the same Business Information v1
19780
19797
  // Location resource canonry already reads (no new auth / API enablement).
19781
- "categories.additionalCategories.displayName",
19782
19798
  "profile.description",
19783
19799
  "serviceArea",
19784
19800
  "regularHours",
@@ -34467,6 +34483,8 @@ var IntelligenceService = class {
34467
34483
  const metricRows = this.db.select({ metric: gbpDailyMetrics.metric, date: gbpDailyMetrics.date, value: gbpDailyMetrics.value }).from(gbpDailyMetrics).where(and27(eq37(gbpDailyMetrics.projectId, projectId), eq37(gbpDailyMetrics.locationName, locationName))).all();
34468
34484
  const placeActionRows = this.db.select({ placeActionType: gbpPlaceActions.placeActionType, providerType: gbpPlaceActions.providerType }).from(gbpPlaceActions).where(and27(eq37(gbpPlaceActions.projectId, projectId), eq37(gbpPlaceActions.locationName, locationName))).all();
34469
34485
  const lodgingRow = this.db.select({ populatedGroupCount: gbpLodgingSnapshots.populatedGroupCount }).from(gbpLodgingSnapshots).where(and27(eq37(gbpLodgingSnapshots.projectId, projectId), eq37(gbpLodgingSnapshots.locationName, locationName))).orderBy(desc18(gbpLodgingSnapshots.syncedAt)).limit(1).get();
34486
+ const ownerRow = this.db.select({ description: gbpLocations.description }).from(gbpLocations).where(and27(eq37(gbpLocations.projectId, projectId), eq37(gbpLocations.locationName, locationName))).get();
34487
+ const descriptionMissing = !(ownerRow?.description ?? "").trim();
34470
34488
  const placeRow = this.db.select({ attributes: gbpPlaceDetails.attributes }).from(gbpPlaceDetails).where(and27(eq37(gbpPlaceDetails.projectId, projectId), eq37(gbpPlaceDetails.locationName, locationName))).orderBy(desc18(gbpPlaceDetails.syncedAt)).limit(1).get();
34471
34489
  const placesAmenities = placeRow ? extractPlaceAmenities(placeRow.attributes) : [];
34472
34490
  const summary = buildGbpSummary({
@@ -34491,6 +34509,7 @@ var IntelligenceService = class {
34491
34509
  metricDeltaPct: summary.performance.deltaPct,
34492
34510
  lodgingCapable: summary.lodging.lodgingLocationCount > 0,
34493
34511
  lodgingEmpty: summary.lodging.emptyLodgingCount > 0,
34512
+ descriptionMissing,
34494
34513
  placesAmenities,
34495
34514
  placeActionCount: summary.placeActions.total,
34496
34515
  hasDirectMerchantCta: summary.placeActions.hasDirectMerchantCta,
@@ -9,7 +9,7 @@ import {
9
9
  loadConfig,
10
10
  loadConfigRaw,
11
11
  saveConfigPatch
12
- } from "./chunk-6RVUSM4Y.js";
12
+ } from "./chunk-HW4GVIQD.js";
13
13
  import {
14
14
  CC_CACHE_DIR,
15
15
  DUCKDB_SPEC,
@@ -104,7 +104,7 @@ import {
104
104
  siteAuditPages,
105
105
  siteAuditSnapshots,
106
106
  usageCounters
107
- } from "./chunk-AFSVCKFI.js";
107
+ } from "./chunk-IFUHXONX.js";
108
108
  import {
109
109
  AGENT_MEMORY_VALUE_MAX_BYTES,
110
110
  AGENT_PROVIDER_IDS,
@@ -164,7 +164,7 @@ import {
164
164
  validationError,
165
165
  winnabilityClassLabel,
166
166
  withRetry
167
- } from "./chunk-WMBOHP7E.js";
167
+ } from "./chunk-VJPVFCZW.js";
168
168
 
169
169
  // src/telemetry.ts
170
170
  import crypto from "crypto";
@@ -6323,7 +6323,7 @@ function readStoredGroundingSources(rawResponse) {
6323
6323
  return result;
6324
6324
  }
6325
6325
  async function backfillInsightsCommand(project, opts) {
6326
- const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-MHTYZ632.js");
6326
+ const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-24HCX4SJ.js");
6327
6327
  const config = loadConfig();
6328
6328
  const db = createClient(config.database);
6329
6329
  migrate(db);
@@ -3249,6 +3249,7 @@ var projectOverviewInsightSchema = z24.object({
3249
3249
  "gbp-lodging-gap",
3250
3250
  "gbp-listing-discrepancy",
3251
3251
  "gbp-cta-gap",
3252
+ "gbp-description-missing",
3252
3253
  "gbp-metric-drop",
3253
3254
  "gbp-keyword-drop"
3254
3255
  ]),
@@ -3407,6 +3408,7 @@ var projectSearchInsightHitSchema = z24.object({
3407
3408
  "gbp-lodging-gap",
3408
3409
  "gbp-listing-discrepancy",
3409
3410
  "gbp-cta-gap",
3411
+ "gbp-description-missing",
3410
3412
  "gbp-metric-drop",
3411
3413
  "gbp-keyword-drop"
3412
3414
  ]),
package/dist/cli.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  setTelemetrySource,
28
28
  showFirstRunNotice,
29
29
  trackEvent
30
- } from "./chunk-2SO5ZS4S.js";
30
+ } from "./chunk-QYC2N23P.js";
31
31
  import {
32
32
  CliError,
33
33
  EXIT_SYSTEM_ERROR,
@@ -44,7 +44,7 @@ import {
44
44
  saveConfig,
45
45
  saveConfigPatch,
46
46
  usageError
47
- } from "./chunk-6RVUSM4Y.js";
47
+ } from "./chunk-HW4GVIQD.js";
48
48
  import {
49
49
  apiKeys,
50
50
  createClient,
@@ -52,7 +52,7 @@ import {
52
52
  projects,
53
53
  queries,
54
54
  renderReportHtml
55
- } from "./chunk-AFSVCKFI.js";
55
+ } from "./chunk-IFUHXONX.js";
56
56
  import {
57
57
  BacklinkSources,
58
58
  CcReleaseSyncStatuses,
@@ -77,7 +77,7 @@ import {
77
77
  providerQuotaPolicySchema,
78
78
  resolveProviderInput,
79
79
  winnabilityClassSchema
80
- } from "./chunk-WMBOHP7E.js";
80
+ } from "./chunk-VJPVFCZW.js";
81
81
 
82
82
  // src/cli.ts
83
83
  import { pathToFileURL } from "url";
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createServer
3
- } from "./chunk-2SO5ZS4S.js";
3
+ } from "./chunk-QYC2N23P.js";
4
4
  import {
5
5
  loadConfig
6
- } from "./chunk-6RVUSM4Y.js";
7
- import "./chunk-AFSVCKFI.js";
8
- import "./chunk-WMBOHP7E.js";
6
+ } from "./chunk-HW4GVIQD.js";
7
+ import "./chunk-IFUHXONX.js";
8
+ import "./chunk-VJPVFCZW.js";
9
9
  export {
10
10
  createServer,
11
11
  loadConfig
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntelligenceService
3
- } from "./chunk-AFSVCKFI.js";
4
- import "./chunk-WMBOHP7E.js";
3
+ } from "./chunk-IFUHXONX.js";
4
+ import "./chunk-VJPVFCZW.js";
5
5
  export {
6
6
  IntelligenceService
7
7
  };
package/dist/mcp.js CHANGED
@@ -3,10 +3,10 @@ import {
3
3
  PACKAGE_VERSION,
4
4
  canonryMcpTools,
5
5
  createApiClient
6
- } from "./chunk-6RVUSM4Y.js";
6
+ } from "./chunk-HW4GVIQD.js";
7
7
  import {
8
8
  isReadOnlyKey
9
- } from "./chunk-WMBOHP7E.js";
9
+ } from "./chunk-VJPVFCZW.js";
10
10
 
11
11
  // src/mcp/cli.ts
12
12
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ainyc/canonry",
3
- "version": "4.91.0",
3
+ "version": "4.92.0",
4
4
  "type": "module",
5
5
  "description": "Agent-first open-source AEO operating platform - track how answer engines cite your domain",
6
6
  "license": "FSL-1.1-ALv2",
@@ -62,27 +62,27 @@
62
62
  "@types/node-cron": "^3.0.11",
63
63
  "tsup": "^8.5.1",
64
64
  "tsx": "^4.19.0",
65
- "@ainyc/canonry-api-routes": "0.0.0",
66
65
  "@ainyc/canonry-api-client": "0.0.0",
66
+ "@ainyc/canonry-api-routes": "0.0.0",
67
67
  "@ainyc/canonry-contracts": "0.0.0",
68
68
  "@ainyc/canonry-integration-bing": "0.0.0",
69
- "@ainyc/canonry-db": "0.0.0",
70
69
  "@ainyc/canonry-config": "0.0.0",
71
70
  "@ainyc/canonry-integration-openai-ads": "0.0.0",
71
+ "@ainyc/canonry-db": "0.0.0",
72
72
  "@ainyc/canonry-integration-cloud-run": "0.0.0",
73
- "@ainyc/canonry-integration-google-places": "0.0.0",
74
73
  "@ainyc/canonry-integration-commoncrawl": "0.0.0",
75
74
  "@ainyc/canonry-integration-google": "0.0.0",
75
+ "@ainyc/canonry-integration-google-places": "0.0.0",
76
76
  "@ainyc/canonry-integration-traffic": "0.0.0",
77
77
  "@ainyc/canonry-integration-google-business-profile": "0.0.0",
78
78
  "@ainyc/canonry-intelligence": "0.0.0",
79
79
  "@ainyc/canonry-provider-cdp": "0.0.0",
80
+ "@ainyc/canonry-integration-wordpress": "0.0.0",
80
81
  "@ainyc/canonry-provider-claude": "0.0.0",
81
- "@ainyc/canonry-provider-gemini": "0.0.0",
82
- "@ainyc/canonry-provider-openai": "0.0.0",
83
82
  "@ainyc/canonry-provider-local": "0.0.0",
84
- "@ainyc/canonry-provider-perplexity": "0.0.0",
85
- "@ainyc/canonry-integration-wordpress": "0.0.0"
83
+ "@ainyc/canonry-provider-openai": "0.0.0",
84
+ "@ainyc/canonry-provider-gemini": "0.0.0",
85
+ "@ainyc/canonry-provider-perplexity": "0.0.0"
86
86
  },
87
87
  "scripts": {
88
88
  "build": "tsx scripts/copy-agent-assets.ts && tsup && tsx build-web.ts",