@ainyc/canonry 4.57.0 → 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 (26) hide show
  1. package/assets/agent-workspace/skills/canonry/SKILL.md +7 -0
  2. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +44 -0
  3. package/assets/agent-workspace/skills/canonry/references/google-business-profile.md +219 -0
  4. package/assets/assets/{BacklinksPage-CmeFZ8UJ.js → BacklinksPage-D_mc7c-b.js} +1 -1
  5. package/assets/assets/{ChartPrimitives-D7C1Cp8w.js → ChartPrimitives-BViWneKX.js} +1 -1
  6. package/assets/assets/{ProjectPage-Y6uCyjGb.js → ProjectPage-_hpYJAN1.js} +1 -1
  7. package/assets/assets/{RunRow-BntNdrgM.js → RunRow-DK69_0iD.js} +1 -1
  8. package/assets/assets/{RunsPage-Btp6qn10.js → RunsPage-DRu1peAA.js} +1 -1
  9. package/assets/assets/{SettingsPage-DkyNiU2i.js → SettingsPage-BrednApH.js} +1 -1
  10. package/assets/assets/{TrafficPage-CBl4Mwdc.js → TrafficPage-oFA65ZZc.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-BZzuWCn-.js → TrafficSourceDetailPage-CUzzaYFC.js} +1 -1
  12. package/assets/assets/{extract-error-message-De8_qAzs.js → extract-error-message-Cv4MXGtB.js} +1 -1
  13. package/assets/assets/{index-XUKhruAg.js → index-BrCh3uvb.js} +90 -90
  14. package/assets/assets/{server-traffic-bn9LSZN9.js → server-traffic-rYE-NlE-.js} +1 -1
  15. package/assets/assets/{trash-2-B5clF2rU.js → trash-2-BgGGPjQf.js} +1 -1
  16. package/assets/index.html +1 -1
  17. package/dist/{chunk-4KWPOVIT.js → chunk-JW6TQFU7.js} +171 -1
  18. package/dist/{chunk-WFVUZVJD.js → chunk-LPPW7O26.js} +1421 -1190
  19. package/dist/{chunk-HL6JZUEW.js → chunk-NOQ4ZE3E.js} +2158 -624
  20. package/dist/{chunk-6X5TF73A.js → chunk-TFBPLY77.js} +414 -1
  21. package/dist/cli.js +610 -458
  22. package/dist/index.d.ts +2 -1
  23. package/dist/index.js +4 -4
  24. package/dist/{intelligence-service-NY3MAVPB.js → intelligence-service-V4SWVKEQ.js} +2 -2
  25. package/dist/mcp.js +10 -8
  26. package/package.json +8 -7
@@ -22,7 +22,7 @@ import {
22
22
  trafficConnectVercelRequestSchema,
23
23
  trafficConnectWordpressRequestSchema,
24
24
  trafficEventKindSchema
25
- } from "./chunk-WFVUZVJD.js";
25
+ } from "./chunk-LPPW7O26.js";
26
26
 
27
27
  // src/config.ts
28
28
  import fs from "fs";
@@ -2021,6 +2021,150 @@ var postApiV1ProjectsByNameGoogleIndexingRequest = (options) => {
2021
2021
  }
2022
2022
  });
2023
2023
  };
2024
+ var postApiV1ProjectsByNameGbpLocationsDiscover = (options) => {
2025
+ return (options.client ?? client).post({
2026
+ security: [
2027
+ {
2028
+ scheme: "bearer",
2029
+ type: "http"
2030
+ }
2031
+ ],
2032
+ url: "/api/v1/projects/{name}/gbp/locations/discover",
2033
+ ...options,
2034
+ headers: {
2035
+ "Content-Type": "application/json",
2036
+ ...options.headers
2037
+ }
2038
+ });
2039
+ };
2040
+ var getApiV1ProjectsByNameGbpAccounts = (options) => {
2041
+ return (options.client ?? client).get({
2042
+ security: [
2043
+ {
2044
+ scheme: "bearer",
2045
+ type: "http"
2046
+ }
2047
+ ],
2048
+ url: "/api/v1/projects/{name}/gbp/accounts",
2049
+ ...options
2050
+ });
2051
+ };
2052
+ var getApiV1ProjectsByNameGbpLocations = (options) => {
2053
+ return (options.client ?? client).get({
2054
+ security: [
2055
+ {
2056
+ scheme: "bearer",
2057
+ type: "http"
2058
+ }
2059
+ ],
2060
+ url: "/api/v1/projects/{name}/gbp/locations",
2061
+ ...options
2062
+ });
2063
+ };
2064
+ var putApiV1ProjectsByNameGbpLocationsByLocationNameSelection = (options) => {
2065
+ return (options.client ?? client).put({
2066
+ security: [
2067
+ {
2068
+ scheme: "bearer",
2069
+ type: "http"
2070
+ }
2071
+ ],
2072
+ url: "/api/v1/projects/{name}/gbp/locations/{locationName}/selection",
2073
+ ...options,
2074
+ headers: {
2075
+ "Content-Type": "application/json",
2076
+ ...options.headers
2077
+ }
2078
+ });
2079
+ };
2080
+ var deleteApiV1ProjectsByNameGbpConnection = (options) => {
2081
+ return (options.client ?? client).delete({
2082
+ security: [
2083
+ {
2084
+ scheme: "bearer",
2085
+ type: "http"
2086
+ }
2087
+ ],
2088
+ url: "/api/v1/projects/{name}/gbp/connection",
2089
+ ...options
2090
+ });
2091
+ };
2092
+ var postApiV1ProjectsByNameGbpSync = (options) => {
2093
+ return (options.client ?? client).post({
2094
+ security: [
2095
+ {
2096
+ scheme: "bearer",
2097
+ type: "http"
2098
+ }
2099
+ ],
2100
+ url: "/api/v1/projects/{name}/gbp/sync",
2101
+ ...options,
2102
+ headers: {
2103
+ "Content-Type": "application/json",
2104
+ ...options.headers
2105
+ }
2106
+ });
2107
+ };
2108
+ var getApiV1ProjectsByNameGbpMetrics = (options) => {
2109
+ return (options.client ?? client).get({
2110
+ security: [
2111
+ {
2112
+ scheme: "bearer",
2113
+ type: "http"
2114
+ }
2115
+ ],
2116
+ url: "/api/v1/projects/{name}/gbp/metrics",
2117
+ ...options
2118
+ });
2119
+ };
2120
+ var getApiV1ProjectsByNameGbpKeywords = (options) => {
2121
+ return (options.client ?? client).get({
2122
+ security: [
2123
+ {
2124
+ scheme: "bearer",
2125
+ type: "http"
2126
+ }
2127
+ ],
2128
+ url: "/api/v1/projects/{name}/gbp/keywords",
2129
+ ...options
2130
+ });
2131
+ };
2132
+ var getApiV1ProjectsByNameGbpPlaceActions = (options) => {
2133
+ return (options.client ?? client).get({
2134
+ security: [
2135
+ {
2136
+ scheme: "bearer",
2137
+ type: "http"
2138
+ }
2139
+ ],
2140
+ url: "/api/v1/projects/{name}/gbp/place-actions",
2141
+ ...options
2142
+ });
2143
+ };
2144
+ var getApiV1ProjectsByNameGbpLodging = (options) => {
2145
+ return (options.client ?? client).get({
2146
+ security: [
2147
+ {
2148
+ scheme: "bearer",
2149
+ type: "http"
2150
+ }
2151
+ ],
2152
+ url: "/api/v1/projects/{name}/gbp/lodging",
2153
+ ...options
2154
+ });
2155
+ };
2156
+ var getApiV1ProjectsByNameGbpSummary = (options) => {
2157
+ return (options.client ?? client).get({
2158
+ security: [
2159
+ {
2160
+ scheme: "bearer",
2161
+ type: "http"
2162
+ }
2163
+ ],
2164
+ url: "/api/v1/projects/{name}/gbp/summary",
2165
+ ...options
2166
+ });
2167
+ };
2024
2168
  var postApiV1ProjectsByNameBingConnect = (options) => {
2025
2169
  return (options.client ?? client).post({
2026
2170
  security: [
@@ -3800,6 +3944,105 @@ var ApiClient = class {
3800
3944
  })
3801
3945
  );
3802
3946
  }
3947
+ // Google Business Profile (Phase 1: auth + discovery)
3948
+ async listGbpAccounts(project) {
3949
+ return this.invoke(
3950
+ () => getApiV1ProjectsByNameGbpAccounts({
3951
+ client: this.heyClient,
3952
+ path: { name: project }
3953
+ })
3954
+ );
3955
+ }
3956
+ async discoverGbpLocations(project, body) {
3957
+ return this.invoke(
3958
+ () => postApiV1ProjectsByNameGbpLocationsDiscover({
3959
+ client: this.heyClient,
3960
+ path: { name: project },
3961
+ body: body ?? {}
3962
+ })
3963
+ );
3964
+ }
3965
+ async listGbpLocations(project, opts) {
3966
+ return this.invoke(
3967
+ () => getApiV1ProjectsByNameGbpLocations({
3968
+ client: this.heyClient,
3969
+ path: { name: project },
3970
+ query: opts?.selected === void 0 ? void 0 : { selected: String(opts.selected) }
3971
+ })
3972
+ );
3973
+ }
3974
+ async setGbpLocationSelection(project, locationName, selected) {
3975
+ return this.invoke(
3976
+ () => putApiV1ProjectsByNameGbpLocationsByLocationNameSelection({
3977
+ client: this.heyClient,
3978
+ path: { name: project, locationName },
3979
+ body: { selected }
3980
+ })
3981
+ );
3982
+ }
3983
+ async disconnectGbp(project) {
3984
+ await this.invoke(
3985
+ () => deleteApiV1ProjectsByNameGbpConnection({
3986
+ client: this.heyClient,
3987
+ path: { name: project }
3988
+ })
3989
+ );
3990
+ }
3991
+ async triggerGbpSync(project, body) {
3992
+ return this.invoke(
3993
+ () => postApiV1ProjectsByNameGbpSync({
3994
+ client: this.heyClient,
3995
+ path: { name: project },
3996
+ body: body ?? {}
3997
+ })
3998
+ );
3999
+ }
4000
+ async listGbpMetrics(project, opts) {
4001
+ return this.invoke(
4002
+ () => getApiV1ProjectsByNameGbpMetrics({
4003
+ client: this.heyClient,
4004
+ path: { name: project },
4005
+ query: opts && (opts.locationName || opts.metric) ? opts : void 0
4006
+ })
4007
+ );
4008
+ }
4009
+ async listGbpKeywords(project, opts) {
4010
+ return this.invoke(
4011
+ () => getApiV1ProjectsByNameGbpKeywords({
4012
+ client: this.heyClient,
4013
+ path: { name: project },
4014
+ query: opts?.locationName ? { locationName: opts.locationName } : void 0
4015
+ })
4016
+ );
4017
+ }
4018
+ async listGbpPlaceActions(project, opts) {
4019
+ return this.invoke(
4020
+ () => getApiV1ProjectsByNameGbpPlaceActions({
4021
+ client: this.heyClient,
4022
+ path: { name: project },
4023
+ query: opts?.locationName ? { locationName: opts.locationName } : void 0
4024
+ })
4025
+ );
4026
+ }
4027
+ async listGbpLodging(project, opts) {
4028
+ return this.invoke(
4029
+ () => getApiV1ProjectsByNameGbpLodging({
4030
+ client: this.heyClient,
4031
+ path: { name: project },
4032
+ query: opts?.locationName ? { locationName: opts.locationName } : void 0
4033
+ })
4034
+ );
4035
+ }
4036
+ async getGbpSummary(project, opts) {
4037
+ return this.invoke(
4038
+ () => getApiV1ProjectsByNameGbpSummary({
4039
+ client: this.heyClient,
4040
+ path: { name: project },
4041
+ query: opts?.locationName ? { locationName: opts.locationName } : void 0
4042
+ })
4043
+ );
4044
+ }
4045
+ // GSC data
3803
4046
  async gscSync(project, body) {
3804
4047
  return this.invoke(
3805
4048
  () => postApiV1ProjectsByNameGoogleGscSync({
@@ -4524,6 +4767,11 @@ var ApiClient = class {
4524
4767
  }
4525
4768
  };
4526
4769
 
4770
+ // src/package-version.ts
4771
+ import { createRequire } from "module";
4772
+ var _require = createRequire(import.meta.url);
4773
+ var PACKAGE_VERSION = _require("../package.json").version;
4774
+
4527
4775
  // src/mcp/tool-registry.ts
4528
4776
  import { z as z2 } from "zod";
4529
4777
 
@@ -4663,6 +4911,39 @@ var queryGenerateInputSchema = z2.object({
4663
4911
  project: projectNameSchema,
4664
4912
  request: queryGenerateRequestSchema
4665
4913
  });
4914
+ var gbpListLocationsInputSchema = z2.object({
4915
+ project: projectNameSchema,
4916
+ selected: z2.boolean().optional()
4917
+ });
4918
+ var gbpDiscoverInputSchema = z2.object({
4919
+ project: projectNameSchema,
4920
+ selectAllNew: z2.boolean().optional().default(true),
4921
+ accountName: z2.string().regex(/^accounts\//, 'accountName must be a Google resource name like "accounts/12345"').optional(),
4922
+ switchAccount: z2.boolean().optional().default(false)
4923
+ });
4924
+ var gbpLocationSelectionInputSchema = z2.object({
4925
+ project: projectNameSchema,
4926
+ locationName: z2.string().min(1).regex(/^locations\//, 'locationName must be a Google resource name like "locations/12345"'),
4927
+ selected: z2.boolean()
4928
+ });
4929
+ var gbpSyncInputSchema = z2.object({
4930
+ project: projectNameSchema,
4931
+ locationNames: z2.array(z2.string()).optional(),
4932
+ daysOfMetrics: z2.number().int().positive().max(540).optional(),
4933
+ monthsOfKeywords: z2.number().int().positive().max(18).optional()
4934
+ });
4935
+ var gbpMetricsInputSchema = z2.object({
4936
+ project: projectNameSchema,
4937
+ locationName: z2.string().optional(),
4938
+ metric: z2.string().optional()
4939
+ });
4940
+ var gbpLocationScopedInputSchema = z2.object({
4941
+ project: projectNameSchema,
4942
+ locationName: z2.string().optional()
4943
+ });
4944
+ var gbpAccountsInputSchema = z2.object({
4945
+ project: projectNameSchema
4946
+ });
4666
4947
  var keywordsInputSchema = z2.object({
4667
4948
  project: projectNameSchema,
4668
4949
  request: keywordBatchRequestSchema
@@ -5318,6 +5599,137 @@ var canonryMcpTools = [
5318
5599
  openApiOperations: ["GET /api/v1/projects/{name}/ga/session-history"],
5319
5600
  handler: (client2, input) => client2.gaSessionHistory(input.project, compactStringParams(input, ["window"]))
5320
5601
  }),
5602
+ // ----- Google Business Profile (Phase 1: auth + discovery) -----
5603
+ defineTool({
5604
+ name: "canonry_gbp_accounts",
5605
+ title: "List Google Business Profile accounts",
5606
+ description: "List the Google Business Profile accounts the connected OAuth user can access. Use this to pick which account a project should track via canonry_gbp_locations_discover (accountName).",
5607
+ access: "read",
5608
+ tier: "gbp",
5609
+ inputSchema: gbpAccountsInputSchema,
5610
+ annotations: readAnnotations(),
5611
+ openApiOperations: ["GET /api/v1/projects/{name}/gbp/accounts"],
5612
+ handler: (client2, input) => client2.listGbpAccounts(input.project)
5613
+ }),
5614
+ defineTool({
5615
+ name: "canonry_gbp_locations",
5616
+ title: "List Google Business Profile locations",
5617
+ description: "List discovered Google Business Profile locations for a Canonry project, including their selection state.",
5618
+ access: "read",
5619
+ tier: "gbp",
5620
+ inputSchema: gbpListLocationsInputSchema,
5621
+ annotations: readAnnotations(),
5622
+ openApiOperations: ["GET /api/v1/projects/{name}/gbp/locations"],
5623
+ handler: (client2, input) => client2.listGbpLocations(input.project, input.selected === void 0 ? void 0 : { selected: input.selected })
5624
+ }),
5625
+ defineTool({
5626
+ name: "canonry_gbp_locations_discover",
5627
+ title: "Discover Google Business Profile locations",
5628
+ description: 'Re-discover Google Business Profile locations from Google and upsert them. New locations get the default selection state from `selectAllNew`; existing locations keep their selection. Pass `accountName` ("accounts/{n}", from canonry_gbp_accounts) to target a specific account; switching a project to a DIFFERENT account is destructive and requires `switchAccount: true`.',
5629
+ access: "write",
5630
+ tier: "gbp",
5631
+ inputSchema: gbpDiscoverInputSchema,
5632
+ annotations: writeAnnotations({ idempotentHint: true }),
5633
+ openApiOperations: ["POST /api/v1/projects/{name}/gbp/locations/discover"],
5634
+ handler: (client2, input) => client2.discoverGbpLocations(input.project, {
5635
+ selectAllNew: input.selectAllNew,
5636
+ accountName: input.accountName,
5637
+ switchAccount: input.switchAccount
5638
+ })
5639
+ }),
5640
+ defineTool({
5641
+ name: "canonry_gbp_location_select",
5642
+ title: "Toggle GBP location selection",
5643
+ description: "Mark a Google Business Profile location as selected or deselected for sync.",
5644
+ access: "write",
5645
+ tier: "gbp",
5646
+ inputSchema: gbpLocationSelectionInputSchema,
5647
+ annotations: writeAnnotations({ idempotentHint: true }),
5648
+ openApiOperations: ["PUT /api/v1/projects/{name}/gbp/locations/{locationName}/selection"],
5649
+ handler: (client2, input) => client2.setGbpLocationSelection(input.project, input.locationName, input.selected)
5650
+ }),
5651
+ defineTool({
5652
+ name: "canonry_gbp_disconnect",
5653
+ title: "Disconnect Google Business Profile",
5654
+ description: "Remove the Google Business Profile OAuth connection and all discovered locations for a project.",
5655
+ access: "write",
5656
+ tier: "gbp",
5657
+ inputSchema: projectInputSchema,
5658
+ annotations: writeAnnotations({ idempotentHint: true, destructiveHint: true }),
5659
+ openApiOperations: ["DELETE /api/v1/projects/{name}/gbp/connection"],
5660
+ handler: (client2, input) => client2.disconnectGbp(input.project)
5661
+ }),
5662
+ // ----- Google Business Profile (Phase 2: performance sync) -----
5663
+ defineTool({
5664
+ name: "canonry_gbp_sync",
5665
+ title: "Sync Google Business Profile performance",
5666
+ description: "Trigger a GBP performance sync (daily metrics + monthly keyword impressions) for the project's selected locations. Returns the run id; poll canonry_run_get for status.",
5667
+ access: "write",
5668
+ tier: "gbp",
5669
+ inputSchema: gbpSyncInputSchema,
5670
+ annotations: writeAnnotations({ idempotentHint: true }),
5671
+ openApiOperations: ["POST /api/v1/projects/{name}/gbp/sync"],
5672
+ handler: (client2, input) => client2.triggerGbpSync(input.project, {
5673
+ locationNames: input.locationNames,
5674
+ daysOfMetrics: input.daysOfMetrics,
5675
+ monthsOfKeywords: input.monthsOfKeywords
5676
+ })
5677
+ }),
5678
+ defineTool({
5679
+ name: "canonry_gbp_metrics",
5680
+ title: "Get GBP daily metrics",
5681
+ description: "List stored Google Business Profile daily performance metrics (impressions, direction requests, website/call clicks) for a project.",
5682
+ access: "read",
5683
+ tier: "gbp",
5684
+ inputSchema: gbpMetricsInputSchema,
5685
+ annotations: readAnnotations(),
5686
+ openApiOperations: ["GET /api/v1/projects/{name}/gbp/metrics"],
5687
+ handler: (client2, input) => client2.listGbpMetrics(input.project, compactStringParams(input, ["locationName", "metric"]))
5688
+ }),
5689
+ defineTool({
5690
+ name: "canonry_gbp_keywords",
5691
+ title: "Get GBP keyword impressions",
5692
+ description: "List stored Google Business Profile monthly search-keyword impressions for a project. Includes a thresholdedPct (share privacy-redacted by Google).",
5693
+ access: "read",
5694
+ tier: "gbp",
5695
+ inputSchema: gbpLocationScopedInputSchema,
5696
+ annotations: readAnnotations(),
5697
+ openApiOperations: ["GET /api/v1/projects/{name}/gbp/keywords"],
5698
+ handler: (client2, input) => client2.listGbpKeywords(input.project, compactStringParams(input, ["locationName"]))
5699
+ }),
5700
+ defineTool({
5701
+ name: "canonry_gbp_place_actions",
5702
+ title: "Get GBP place actions",
5703
+ description: "List stored Google Business Profile place action links (booking / reservation / order CTAs) for a project.",
5704
+ access: "read",
5705
+ tier: "gbp",
5706
+ inputSchema: gbpLocationScopedInputSchema,
5707
+ annotations: readAnnotations(),
5708
+ openApiOperations: ["GET /api/v1/projects/{name}/gbp/place-actions"],
5709
+ handler: (client2, input) => client2.listGbpPlaceActions(input.project, compactStringParams(input, ["locationName"]))
5710
+ }),
5711
+ defineTool({
5712
+ name: "canonry_gbp_lodging",
5713
+ title: "Get GBP lodging attributes",
5714
+ description: "List the latest Google Business Profile lodging snapshot per location (hotel structured attributes). populatedGroupCount=0 means an empty profile \u2014 an AEO gap.",
5715
+ access: "read",
5716
+ tier: "gbp",
5717
+ inputSchema: gbpLocationScopedInputSchema,
5718
+ annotations: readAnnotations(),
5719
+ openApiOperations: ["GET /api/v1/projects/{name}/gbp/lodging"],
5720
+ handler: (client2, input) => client2.listGbpLodging(input.project, compactStringParams(input, ["locationName"]))
5721
+ }),
5722
+ defineTool({
5723
+ name: "canonry_gbp_summary",
5724
+ title: "Get GBP local-AEO summary",
5725
+ description: "Composite Google Business Profile summary for a project: performance totals + 7d deltas, keyword thresholded %, place-action CTA presence, and lodging coverage. All derived numbers computed server-side.",
5726
+ access: "read",
5727
+ tier: "gbp",
5728
+ inputSchema: gbpLocationScopedInputSchema,
5729
+ annotations: readAnnotations(),
5730
+ openApiOperations: ["GET /api/v1/projects/{name}/gbp/summary"],
5731
+ handler: (client2, input) => client2.getGbpSummary(input.project, compactStringParams(input, ["locationName"]))
5732
+ }),
5321
5733
  defineTool({
5322
5734
  name: "canonry_traffic_sources_list",
5323
5735
  title: "List traffic sources",
@@ -5820,5 +6232,6 @@ export {
5820
6232
  printCliError,
5821
6233
  createApiClient,
5822
6234
  ApiClient,
6235
+ PACKAGE_VERSION,
5823
6236
  canonryMcpTools
5824
6237
  };