@canonry/canonry 4.141.0 → 4.143.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/assets/agent-workspace/skills/canonry/references/canonry-cli.md +45 -5
  2. package/assets/assets/{AuditHistoryPanel-DlyLhzqq.js → AuditHistoryPanel--kNrRAQm.js} +1 -1
  3. package/assets/assets/{BacklinksPage-DNxtwQBF.js → BacklinksPage-CtW1w9lh.js} +1 -1
  4. package/assets/assets/{ChartPrimitives-BStLR_NC.js → ChartPrimitives-C-nMEqdu.js} +1 -1
  5. package/assets/assets/{HistoryPage-CIcCgoWK.js → HistoryPage-CAPJDSbc.js} +1 -1
  6. package/assets/assets/ProjectPage-79R3wJW6.js +9 -0
  7. package/assets/assets/{RunRow-C0mFtLlc.js → RunRow-aDzTzGSK.js} +1 -1
  8. package/assets/assets/{RunsPage-C-yo0yoj.js → RunsPage-Dy9oWMBK.js} +1 -1
  9. package/assets/assets/{SettingsPage-jg4MXOuo.js → SettingsPage-DTAs1BrZ.js} +1 -1
  10. package/assets/assets/{TrafficPage-CnYHIg8t.js → TrafficPage-B4ADqeKG.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-CEdyQT2P.js → TrafficSourceDetailPage-CFcoL_PR.js} +1 -1
  12. package/assets/assets/{arrow-left-DUv0imIl.js → arrow-left-DV9xcX1v.js} +1 -1
  13. package/assets/assets/{extract-error-message-CCOGDwlm.js → extract-error-message-DXtgw8Q8.js} +1 -1
  14. package/assets/assets/{index-BDo9nl4O.css → index-CYA3jd24.css} +1 -1
  15. package/assets/assets/index-H2iFFrr1.js +213 -0
  16. package/assets/assets/{trash-2-1Yg9W-vs.js → trash-2-DMV6uGU1.js} +1 -1
  17. package/assets/index.html +2 -2
  18. package/dist/{chunk-ZCFQGF3V.js → chunk-3G5B3IMZ.js} +319 -7
  19. package/dist/{chunk-OJOA425V.js → chunk-KUPTGRME.js} +4342 -3042
  20. package/dist/{chunk-HXXO2AF5.js → chunk-TJ6SDLXL.js} +4 -4
  21. package/dist/{chunk-2LUSZFB6.js → chunk-VN3CI6K6.js} +3339 -1226
  22. package/dist/cli.js +187 -65
  23. package/dist/index.js +4 -4
  24. package/dist/{intelligence-service-4HQIUC7U.js → intelligence-service-V6JYDYGF.js} +2 -2
  25. package/dist/mcp.js +2 -2
  26. package/package.json +9 -9
  27. package/assets/assets/ProjectPage-BSI3Qum9.js +0 -8
  28. package/assets/assets/index-D6EP4dQs.js +0 -213
@@ -1 +1 @@
1
- import{c as a}from"./index-D6EP4dQs.js";const t=[["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"}]],h=a("circle-question-mark",t);const e=[["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"}]],d=a("download",e);const o=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],p=a("external-link",o);const c=[["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"}]],s=a("trash-2",c);export{h as C,d as D,p as E,s as T};
1
+ import{c as a}from"./index-H2iFFrr1.js";const t=[["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"}]],h=a("circle-question-mark",t);const e=[["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"}]],d=a("download",e);const o=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],p=a("external-link",o);const c=[["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"}]],s=a("trash-2",c);export{h as C,d as D,p as E,s as T};
package/assets/index.html CHANGED
@@ -12,12 +12,12 @@
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-D6EP4dQs.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-H2iFFrr1.js"></script>
16
16
  <link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-Be8JdV5M.js">
17
17
  <link rel="modulepreload" crossorigin href="./assets/vendor-radix-CQ77EO2y.js">
18
18
  <link rel="modulepreload" crossorigin href="./assets/vendor-recharts-DSxTZhaH.js">
19
19
  <link rel="modulepreload" crossorigin href="./assets/vendor-markdown-6dwjPOKK.js">
20
- <link rel="stylesheet" crossorigin href="./assets/index-BDo9nl4O.css">
20
+ <link rel="stylesheet" crossorigin href="./assets/index-CYA3jd24.css">
21
21
  </head>
22
22
  <body>
23
23
  <div id="root"></div>
@@ -26,6 +26,9 @@ import {
26
26
  gscPerformanceOrderBySchema,
27
27
  keywordBatchRequestSchema,
28
28
  keywordGenerateRequestSchema,
29
+ measurementDiscoveryRequestSchema,
30
+ measurementPlanAuthoringSchema,
31
+ measurementPlanPublishRequestSchema,
29
32
  notificationCreateRequestSchema,
30
33
  notificationEventSchema,
31
34
  organicEvidencePeriodSchema,
@@ -43,7 +46,7 @@ import {
43
46
  trafficConnectWordpressRequestSchema,
44
47
  trafficEventKindSchema,
45
48
  trafficSeriesGranularitySchema
46
- } from "./chunk-OJOA425V.js";
49
+ } from "./chunk-KUPTGRME.js";
47
50
 
48
51
  // src/config.ts
49
52
  import fs from "fs";
@@ -1144,6 +1147,130 @@ var putApiV1ProjectsByName = (options) => {
1144
1147
  }
1145
1148
  });
1146
1149
  };
1150
+ var postApiV1ProjectsByNameMeasurementDiscovery = (options) => {
1151
+ return (options.client ?? client).post({
1152
+ security: [
1153
+ {
1154
+ scheme: "bearer",
1155
+ type: "http"
1156
+ }
1157
+ ],
1158
+ url: "/api/v1/projects/{name}/measurement-discovery",
1159
+ ...options,
1160
+ headers: {
1161
+ "Content-Type": "application/json",
1162
+ ...options.headers
1163
+ }
1164
+ });
1165
+ };
1166
+ var getApiV1ProjectsByNameMeasurementPlan = (options) => {
1167
+ return (options.client ?? client).get({
1168
+ security: [
1169
+ {
1170
+ scheme: "bearer",
1171
+ type: "http"
1172
+ }
1173
+ ],
1174
+ url: "/api/v1/projects/{name}/measurement-plan",
1175
+ ...options
1176
+ });
1177
+ };
1178
+ var putApiV1ProjectsByNameMeasurementPlan = (options) => {
1179
+ return (options.client ?? client).put({
1180
+ security: [
1181
+ {
1182
+ scheme: "bearer",
1183
+ type: "http"
1184
+ }
1185
+ ],
1186
+ url: "/api/v1/projects/{name}/measurement-plan",
1187
+ ...options,
1188
+ headers: {
1189
+ "Content-Type": "application/json",
1190
+ ...options.headers
1191
+ }
1192
+ });
1193
+ };
1194
+ var postApiV1ProjectsByNameMeasurementPlanCompilePreview = (options) => {
1195
+ return (options.client ?? client).post({
1196
+ security: [
1197
+ {
1198
+ scheme: "bearer",
1199
+ type: "http"
1200
+ }
1201
+ ],
1202
+ url: "/api/v1/projects/{name}/measurement-plan/compile-preview",
1203
+ ...options,
1204
+ headers: {
1205
+ "Content-Type": "application/json",
1206
+ ...options.headers
1207
+ }
1208
+ });
1209
+ };
1210
+ var postApiV1ProjectsByNameMeasurementPlanDiffPreview = (options) => {
1211
+ return (options.client ?? client).post({
1212
+ security: [
1213
+ {
1214
+ scheme: "bearer",
1215
+ type: "http"
1216
+ }
1217
+ ],
1218
+ url: "/api/v1/projects/{name}/measurement-plan/diff-preview",
1219
+ ...options,
1220
+ headers: {
1221
+ "Content-Type": "application/json",
1222
+ ...options.headers
1223
+ }
1224
+ });
1225
+ };
1226
+ var getApiV1ProjectsByNameMeasurementPlanVersions = (options) => {
1227
+ return (options.client ?? client).get({
1228
+ security: [
1229
+ {
1230
+ scheme: "bearer",
1231
+ type: "http"
1232
+ }
1233
+ ],
1234
+ url: "/api/v1/projects/{name}/measurement-plan/versions",
1235
+ ...options
1236
+ });
1237
+ };
1238
+ var postApiV1ProjectsByNameMeasurementPlanSegmentsByStableKeyRetire = (options) => {
1239
+ return (options.client ?? client).post({
1240
+ security: [
1241
+ {
1242
+ scheme: "bearer",
1243
+ type: "http"
1244
+ }
1245
+ ],
1246
+ url: "/api/v1/projects/{name}/measurement-plan/segments/{stableKey}/retire",
1247
+ ...options
1248
+ });
1249
+ };
1250
+ var getApiV1ProjectsByNameMeasurementPlanVersionsByRevision = (options) => {
1251
+ return (options.client ?? client).get({
1252
+ security: [
1253
+ {
1254
+ scheme: "bearer",
1255
+ type: "http"
1256
+ }
1257
+ ],
1258
+ url: "/api/v1/projects/{name}/measurement-plan/versions/{revision}",
1259
+ ...options
1260
+ });
1261
+ };
1262
+ var getApiV1ProjectsByNameMeasurementReport = (options) => {
1263
+ return (options.client ?? client).get({
1264
+ security: [
1265
+ {
1266
+ scheme: "bearer",
1267
+ type: "http"
1268
+ }
1269
+ ],
1270
+ url: "/api/v1/projects/{name}/measurement-report",
1271
+ ...options
1272
+ });
1273
+ };
1147
1274
  var getApiV1Projects = (options) => {
1148
1275
  return (options?.client ?? client).get({
1149
1276
  security: [
@@ -4558,6 +4685,77 @@ var ApiClient = class {
4558
4685
  })
4559
4686
  );
4560
4687
  }
4688
+ async getMeasurementPlan(project) {
4689
+ return this.invoke(
4690
+ () => getApiV1ProjectsByNameMeasurementPlan({ client: this.heyClient, path: { name: project } })
4691
+ );
4692
+ }
4693
+ async listMeasurementPlanVersions(project) {
4694
+ return this.invoke(
4695
+ () => getApiV1ProjectsByNameMeasurementPlanVersions({ client: this.heyClient, path: { name: project } })
4696
+ );
4697
+ }
4698
+ async getMeasurementPlanVersion(project, revision) {
4699
+ return this.invoke(
4700
+ () => getApiV1ProjectsByNameMeasurementPlanVersionsByRevision({
4701
+ client: this.heyClient,
4702
+ path: { name: project, revision }
4703
+ })
4704
+ );
4705
+ }
4706
+ async compileMeasurementPlanPreview(project, plan) {
4707
+ return this.invoke(
4708
+ () => postApiV1ProjectsByNameMeasurementPlanCompilePreview({
4709
+ client: this.heyClient,
4710
+ path: { name: project },
4711
+ body: plan
4712
+ })
4713
+ );
4714
+ }
4715
+ async diffMeasurementPlanPreview(project, plan) {
4716
+ return this.invoke(
4717
+ () => postApiV1ProjectsByNameMeasurementPlanDiffPreview({
4718
+ client: this.heyClient,
4719
+ path: { name: project },
4720
+ body: plan
4721
+ })
4722
+ );
4723
+ }
4724
+ async publishMeasurementPlan(project, request) {
4725
+ return this.invoke(
4726
+ () => putApiV1ProjectsByNameMeasurementPlan({
4727
+ client: this.heyClient,
4728
+ path: { name: project },
4729
+ body: request
4730
+ })
4731
+ );
4732
+ }
4733
+ async retireMeasurementPlanSegment(project, stableKey) {
4734
+ return this.invoke(
4735
+ () => postApiV1ProjectsByNameMeasurementPlanSegmentsByStableKeyRetire({
4736
+ client: this.heyClient,
4737
+ path: { name: project, stableKey }
4738
+ })
4739
+ );
4740
+ }
4741
+ async discoverMeasurementTargets(project, request) {
4742
+ return this.invoke(
4743
+ () => postApiV1ProjectsByNameMeasurementDiscovery({
4744
+ client: this.heyClient,
4745
+ path: { name: project },
4746
+ body: request
4747
+ })
4748
+ );
4749
+ }
4750
+ async getMeasurementReport(project, revision) {
4751
+ return this.invoke(
4752
+ () => getApiV1ProjectsByNameMeasurementReport({
4753
+ client: this.heyClient,
4754
+ path: { name: project },
4755
+ query: { revision }
4756
+ })
4757
+ );
4758
+ }
4561
4759
  async listRuns(project, limit, kind) {
4562
4760
  return this.invoke(
4563
4761
  () => getApiV1ProjectsByNameRuns({
@@ -6110,6 +6308,11 @@ var runTriggerInputSchema = z2.object({
6110
6308
  project: projectNameSchema,
6111
6309
  request: runTriggerRequestSchema.optional()
6112
6310
  });
6311
+ var measurementPlanVersionInputSchema = z2.object({ project: projectNameSchema, revision: z2.number().int().positive() });
6312
+ var measurementPlanPreviewInputSchema = z2.object({ project: projectNameSchema, plan: measurementPlanAuthoringSchema });
6313
+ var measurementPlanPublishInputSchema = measurementPlanPublishRequestSchema.extend({ project: projectNameSchema });
6314
+ var measurementPlanRetireInputSchema = z2.object({ project: projectNameSchema, stableKey: z2.string().min(1) });
6315
+ var measurementDiscoveryInputSchema = measurementDiscoveryRequestSchema.extend({ project: projectNameSchema });
6113
6316
  var runsListInputSchema = z2.object({
6114
6317
  project: projectNameSchema,
6115
6318
  limit: z2.number().int().positive().max(500).optional()
@@ -6277,8 +6480,11 @@ async function submitGscSitemapsFromMcp(client2, input) {
6277
6480
  }
6278
6481
  var gaWindowInputSchema = z2.object({
6279
6482
  project: projectNameSchema,
6280
- window: analyticsWindowSchema.optional()
6483
+ window: analyticsWindowSchema.optional(),
6484
+ startDate: z2.string().optional(),
6485
+ endDate: z2.string().optional()
6281
6486
  });
6487
+ var GA_RANGE_PARAMS = ["window", "startDate", "endDate"];
6282
6488
  var gaTrafficInputSchema = gaWindowInputSchema.extend({
6283
6489
  limit: z2.number().int().positive().max(500).optional()
6284
6490
  });
@@ -7235,7 +7441,7 @@ var canonryMcpTools = [
7235
7441
  inputSchema: gaTrafficInputSchema,
7236
7442
  annotations: readAnnotations(),
7237
7443
  openApiOperations: ["GET /api/v1/projects/{name}/ga/traffic"],
7238
- handler: (client2, input) => client2.gaTraffic(input.project, compactStringParams(input, ["limit", "window"]))
7444
+ handler: (client2, input) => client2.gaTraffic(input.project, compactStringParams(input, ["limit", ...GA_RANGE_PARAMS]))
7239
7445
  }),
7240
7446
  defineTool({
7241
7447
  name: "canonry_ga_coverage",
@@ -7257,7 +7463,7 @@ var canonryMcpTools = [
7257
7463
  inputSchema: gaWindowInputSchema,
7258
7464
  annotations: readAnnotations(),
7259
7465
  openApiOperations: ["GET /api/v1/projects/{name}/ga/ai-referral-history"],
7260
- handler: (client2, input) => client2.gaAiReferralHistory(input.project, compactStringParams(input, ["window"]))
7466
+ handler: (client2, input) => client2.gaAiReferralHistory(input.project, compactStringParams(input, GA_RANGE_PARAMS))
7261
7467
  }),
7262
7468
  defineTool({
7263
7469
  name: "canonry_ga_ai_referral_daily",
@@ -7268,7 +7474,7 @@ var canonryMcpTools = [
7268
7474
  inputSchema: gaWindowInputSchema,
7269
7475
  annotations: readAnnotations(),
7270
7476
  openApiOperations: ["GET /api/v1/projects/{name}/ga/ai-referral-daily"],
7271
- handler: (client2, input) => client2.gaAiReferralDaily(input.project, compactStringParams(input, ["window"]))
7477
+ handler: (client2, input) => client2.gaAiReferralDaily(input.project, compactStringParams(input, GA_RANGE_PARAMS))
7272
7478
  }),
7273
7479
  defineTool({
7274
7480
  name: "canonry_ga_social_referral_history",
@@ -7279,7 +7485,7 @@ var canonryMcpTools = [
7279
7485
  inputSchema: gaWindowInputSchema,
7280
7486
  annotations: readAnnotations(),
7281
7487
  openApiOperations: ["GET /api/v1/projects/{name}/ga/social-referral-history"],
7282
- handler: (client2, input) => client2.gaSocialReferralHistory(input.project, compactStringParams(input, ["window"]))
7488
+ handler: (client2, input) => client2.gaSocialReferralHistory(input.project, compactStringParams(input, GA_RANGE_PARAMS))
7283
7489
  }),
7284
7490
  defineTool({
7285
7491
  name: "canonry_ga_social_referral_trend",
@@ -7312,7 +7518,7 @@ var canonryMcpTools = [
7312
7518
  inputSchema: gaWindowInputSchema,
7313
7519
  annotations: readAnnotations(),
7314
7520
  openApiOperations: ["GET /api/v1/projects/{name}/ga/session-history"],
7315
- handler: (client2, input) => client2.gaSessionHistory(input.project, compactStringParams(input, ["window"]))
7521
+ handler: (client2, input) => client2.gaSessionHistory(input.project, compactStringParams(input, GA_RANGE_PARAMS))
7316
7522
  }),
7317
7523
  // ----- Google Business Profile (Phase 1: auth + discovery) -----
7318
7524
  defineTool({
@@ -7668,6 +7874,112 @@ var canonryMcpTools = [
7668
7874
  await client2.putKeywords(input.project, uniqueStrings(input.request.keywords));
7669
7875
  }
7670
7876
  }),
7877
+ defineTool({
7878
+ name: "canonry_measurement_discovery",
7879
+ title: "Discover measurement Targets",
7880
+ description: "Fetch a public sitemap under bounded network policy and deterministically classify project-owned URLs into Target proposals, aliases, shared paths, unmatched paths, and exclusions. Does not publish a plan.",
7881
+ access: "write",
7882
+ tier: "setup",
7883
+ inputSchema: measurementDiscoveryInputSchema,
7884
+ annotations: writeAnnotations({ idempotentHint: false, openWorldHint: true }),
7885
+ openApiOperations: ["POST /api/v1/projects/{name}/measurement-discovery"],
7886
+ handler: (client2, input) => client2.discoverMeasurementTargets(input.project, {
7887
+ sitemapUrl: input.sitemapUrl,
7888
+ rule: input.rule,
7889
+ ...input.maxUrls === void 0 ? {} : { maxUrls: input.maxUrls }
7890
+ })
7891
+ }),
7892
+ defineTool({
7893
+ name: "canonry_measurement_plan_get",
7894
+ title: "Get measurement plan",
7895
+ description: "Get the active measurement plan for a project.",
7896
+ access: "read",
7897
+ tier: "setup",
7898
+ inputSchema: projectInputSchema,
7899
+ annotations: readAnnotations(),
7900
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-plan"],
7901
+ handler: (client2, input) => client2.getMeasurementPlan(input.project)
7902
+ }),
7903
+ defineTool({
7904
+ name: "canonry_measurement_plan_versions",
7905
+ title: "List measurement plan versions",
7906
+ description: "List immutable measurement-plan revisions.",
7907
+ access: "read",
7908
+ tier: "setup",
7909
+ inputSchema: projectInputSchema,
7910
+ annotations: readAnnotations(),
7911
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-plan/versions"],
7912
+ handler: (client2, input) => client2.listMeasurementPlanVersions(input.project)
7913
+ }),
7914
+ defineTool({
7915
+ name: "canonry_measurement_plan_version_get",
7916
+ title: "Get measurement plan revision",
7917
+ description: "Get one immutable measurement-plan revision.",
7918
+ access: "read",
7919
+ tier: "setup",
7920
+ inputSchema: measurementPlanVersionInputSchema,
7921
+ annotations: readAnnotations(),
7922
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-plan/versions/{revision}"],
7923
+ handler: (client2, input) => client2.getMeasurementPlanVersion(input.project, input.revision)
7924
+ }),
7925
+ defineTool({
7926
+ name: "canonry_measurement_plan_compile_preview",
7927
+ title: "Compile measurement plan",
7928
+ description: "Validate and compile a Target/group plan without publishing it.",
7929
+ access: "write",
7930
+ tier: "setup",
7931
+ inputSchema: measurementPlanPreviewInputSchema,
7932
+ annotations: writeAnnotations({ idempotentHint: true }),
7933
+ openApiOperations: ["POST /api/v1/projects/{name}/measurement-plan/compile-preview"],
7934
+ handler: (client2, input) => client2.compileMeasurementPlanPreview(input.project, input.plan)
7935
+ }),
7936
+ defineTool({
7937
+ name: "canonry_measurement_plan_diff_preview",
7938
+ title: "Preview measurement plan changes",
7939
+ description: "Compare a compiled Target/group plan with the active immutable revision without publishing it.",
7940
+ access: "write",
7941
+ tier: "setup",
7942
+ inputSchema: measurementPlanPreviewInputSchema,
7943
+ annotations: writeAnnotations({ idempotentHint: true }),
7944
+ openApiOperations: ["POST /api/v1/projects/{name}/measurement-plan/diff-preview"],
7945
+ handler: (client2, input) => client2.diffMeasurementPlanPreview(input.project, input.plan)
7946
+ }),
7947
+ defineTool({
7948
+ name: "canonry_measurement_plan_publish",
7949
+ title: "Publish measurement plan",
7950
+ description: "Publish only when the active revision still matches the revision you reviewed. Use null only when you reviewed a planless project.",
7951
+ access: "write",
7952
+ tier: "setup",
7953
+ inputSchema: measurementPlanPublishInputSchema,
7954
+ annotations: writeAnnotations({ idempotentHint: true }),
7955
+ openApiOperations: ["PUT /api/v1/projects/{name}/measurement-plan"],
7956
+ handler: (client2, input) => client2.publishMeasurementPlan(input.project, {
7957
+ expectedActiveRevision: input.expectedActiveRevision,
7958
+ plan: input.plan
7959
+ })
7960
+ }),
7961
+ defineTool({
7962
+ name: "canonry_measurement_plan_segment_retire",
7963
+ title: "Retire measurement segment",
7964
+ description: "Permanently retire an inactive Target or group stable key. Publish a revision without it first; there is no unretire.",
7965
+ access: "write",
7966
+ tier: "setup",
7967
+ inputSchema: measurementPlanRetireInputSchema,
7968
+ annotations: writeAnnotations({ idempotentHint: true, destructiveHint: true }),
7969
+ openApiOperations: ["POST /api/v1/projects/{name}/measurement-plan/segments/{stableKey}/retire"],
7970
+ handler: (client2, input) => client2.retireMeasurementPlanSegment(input.project, input.stableKey)
7971
+ }),
7972
+ defineTool({
7973
+ name: "canonry_measurement_report",
7974
+ title: "Get measurement report",
7975
+ description: "Get a revision-pinned Target and group measurement report from stored runs. Never starts live provider work.",
7976
+ access: "read",
7977
+ tier: "setup",
7978
+ inputSchema: measurementPlanVersionInputSchema,
7979
+ annotations: readAnnotations(),
7980
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-report"],
7981
+ handler: (client2, input) => client2.getMeasurementReport(input.project, input.revision)
7982
+ }),
7671
7983
  defineTool({
7672
7984
  name: "canonry_run_trigger",
7673
7985
  title: "Trigger run",