@canonry/canonry 4.145.0 → 4.147.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 (35) hide show
  1. package/assets/assets/{AuditHistoryPanel-CV9g5mLR.js → AuditHistoryPanel-DiQ0Ynw5.js} +1 -1
  2. package/assets/assets/{BacklinksPage-RTcYKA5I.js → BacklinksPage-DLUQuPE_.js} +1 -1
  3. package/assets/assets/{ChartPrimitives-BMR0Dqnf.js → ChartPrimitives-BoEy1qo7.js} +1 -1
  4. package/assets/assets/{HistoryPage-DAN9QO6x.js → HistoryPage-mYR2vk8n.js} +1 -1
  5. package/assets/assets/MeasurementPropertyPage-BocyGHJN.js +1 -0
  6. package/assets/assets/ProjectPage-Q5wQ7nSW.js +12 -0
  7. package/assets/assets/{RunRow-WDCIS9MJ.js → RunRow-Ct-A6H9e.js} +1 -1
  8. package/assets/assets/{RunsPage-D3Zxd6oc.js → RunsPage-CsDtq0Qw.js} +1 -1
  9. package/assets/assets/{SettingsPage-DcCFVeA7.js → SettingsPage-BXwFGc1P.js} +1 -1
  10. package/assets/assets/{TrafficPage-D0tPBu5O.js → TrafficPage-B2omyoI8.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-CtyEE9eJ.js → TrafficSourceDetailPage-CoEqc6OJ.js} +1 -1
  12. package/assets/assets/{arrow-left-hBxXIGS1.js → arrow-left-Dh0vsQxe.js} +1 -1
  13. package/assets/assets/{extract-error-message-DRu89RHb.js → extract-error-message-DvWJ0xRn.js} +1 -1
  14. package/assets/assets/index-CXe6S1ey.css +1 -0
  15. package/assets/assets/index-FE8JPHmT.js +213 -0
  16. package/assets/assets/{trash-2-DP0ukgbl.js → trash-2-D1_8ZseY.js} +1 -1
  17. package/assets/assets/v2-overview-adapter-owDeFdUc.js +1 -0
  18. package/assets/assets/{vendor-markdown-6dwjPOKK.js → vendor-markdown-CpDJch4G.js} +1 -1
  19. package/assets/assets/{vendor-radix-CQ77EO2y.js → vendor-radix-DnzzbllM.js} +1 -1
  20. package/assets/assets/{vendor-recharts-DSxTZhaH.js → vendor-recharts-33ACLxsD.js} +1 -1
  21. package/assets/assets/vendor-tanstack-BjS7iY3g.js +1 -0
  22. package/assets/index.html +6 -6
  23. package/dist/{chunk-MBLATP5L.js → chunk-4BL24FQA.js} +485 -8
  24. package/dist/{chunk-EFBTZ6ZT.js → chunk-BVOU4UJM.js} +3753 -3018
  25. package/dist/{chunk-GTBCGJNT.js → chunk-DRDNHYIF.js} +4397 -1501
  26. package/dist/{chunk-XNAJXSZ2.js → chunk-ZDYS24LW.js} +4 -4
  27. package/dist/cli.js +364 -4
  28. package/dist/index.js +4 -4
  29. package/dist/{intelligence-service-DVMEVHAG.js → intelligence-service-7CGZ537D.js} +2 -2
  30. package/dist/mcp.js +5 -5
  31. package/package.json +11 -10
  32. package/assets/assets/ProjectPage-aFV2nddp.js +0 -9
  33. package/assets/assets/index-ANFzZ3nU.css +0 -1
  34. package/assets/assets/index-DSOfEiTH.js +0 -213
  35. package/assets/assets/vendor-tanstack-Be8JdV5M.js +0 -1
@@ -26,8 +26,12 @@ import {
26
26
  gscPerformanceOrderBySchema,
27
27
  keywordBatchRequestSchema,
28
28
  keywordGenerateRequestSchema,
29
+ measurementChangesQuerySchema,
30
+ measurementDataQualityQuerySchema,
29
31
  measurementDiscoveryRequestSchema,
30
32
  measurementDraftApplyAssignmentsRequestSchema,
33
+ measurementDraftApplyGroupMembershipRequestSchema,
34
+ measurementDraftApplyPairedAssignmentsRequestSchema,
31
35
  measurementDraftApplySitemapSelectionRequestSchema,
32
36
  measurementDraftClassifyAssignmentsRequestSchema,
33
37
  measurementDraftClearAssignmentsRequestSchema,
@@ -36,12 +40,15 @@ import {
36
40
  measurementDraftExcludeTargetRequestSchema,
37
41
  measurementDraftImportSitemapRequestSchema,
38
42
  measurementDraftMergeTargetsRequestSchema,
43
+ measurementDraftPreviewAssignmentsRequestSchema,
44
+ measurementDraftPreviewGroupMembershipRequestSchema,
39
45
  measurementDraftPublishRequestSchema,
40
46
  measurementDraftRebindTargetRequestSchema,
41
47
  measurementDraftRemoveAssignmentRequestSchema,
42
48
  measurementDraftRemoveCompetitorRequestSchema,
43
49
  measurementDraftRemoveGroupRequestSchema,
44
50
  measurementDraftRenameTargetRequestSchema,
51
+ measurementDraftReplaceAssignmentsRequestSchema,
45
52
  measurementDraftUpsertCompetitorRequestSchema,
46
53
  measurementDraftUpsertGroupRequestSchema,
47
54
  measurementDraftUpsertTargetRequestSchema,
@@ -49,9 +56,14 @@ import {
49
56
  measurementPlanAuthoringSchema,
50
57
  measurementPlanDeactivateRequestSchema,
51
58
  measurementPlanPublishRequestSchema,
59
+ measurementPortfolioSummaryQuerySchema,
60
+ measurementPropertyCompetitorsQuerySchema,
61
+ measurementPropertyEvidenceQuerySchema,
62
+ measurementPropertyQuestionsQuerySchema,
52
63
  measurementQuerySetUpsertRequestSchema,
53
64
  measurementQueryTemplateApplyRequestSchema,
54
65
  measurementQueryTemplateUpsertRequestSchema,
66
+ measurementQuestionResultQuerySchema,
55
67
  notificationCreateRequestSchema,
56
68
  notificationEventSchema,
57
69
  organicEvidencePeriodSchema,
@@ -69,7 +81,7 @@ import {
69
81
  trafficConnectWordpressRequestSchema,
70
82
  trafficEventKindSchema,
71
83
  trafficSeriesGranularitySchema
72
- } from "./chunk-EFBTZ6ZT.js";
84
+ } from "./chunk-BVOU4UJM.js";
73
85
 
74
86
  // src/config.ts
75
87
  import fs from "fs";
@@ -296,6 +308,15 @@ function isEndpointMissing(err) {
296
308
  const status = err.details?.httpStatus;
297
309
  return status === 404 || status === 405;
298
310
  }
311
+ function systemError(message, options) {
312
+ return new CliError({
313
+ code: "CLI_SYSTEM_ERROR",
314
+ message,
315
+ displayMessage: options?.displayMessage,
316
+ details: options?.details,
317
+ exitCode: EXIT_SYSTEM_ERROR
318
+ });
319
+ }
299
320
  function printCliError(err, format) {
300
321
  if (isMachineFormat(format)) {
301
322
  const envelope = err instanceof CliError ? { error: { code: err.code, message: err.message, ...err.details ? { details: err.details } : {} } } : { error: { code: "CLI_ERROR", message: err instanceof Error ? err.message : "An unexpected error occurred" } };
@@ -1498,6 +1519,54 @@ var postApiV1ProjectsByNameMeasurementPlanDraftActionsApplyAssignments = (option
1498
1519
  }
1499
1520
  });
1500
1521
  };
1522
+ var postApiV1ProjectsByNameMeasurementPlanDraftActionsPreviewAssignments = (options) => {
1523
+ return (options.client ?? client).post({
1524
+ security: [
1525
+ {
1526
+ scheme: "bearer",
1527
+ type: "http"
1528
+ }
1529
+ ],
1530
+ url: "/api/v1/projects/{name}/measurement-plan/draft/actions/preview-assignments",
1531
+ ...options,
1532
+ headers: {
1533
+ "Content-Type": "application/json",
1534
+ ...options.headers
1535
+ }
1536
+ });
1537
+ };
1538
+ var postApiV1ProjectsByNameMeasurementPlanDraftActionsReplaceAssignments = (options) => {
1539
+ return (options.client ?? client).post({
1540
+ security: [
1541
+ {
1542
+ scheme: "bearer",
1543
+ type: "http"
1544
+ }
1545
+ ],
1546
+ url: "/api/v1/projects/{name}/measurement-plan/draft/actions/replace-assignments",
1547
+ ...options,
1548
+ headers: {
1549
+ "Content-Type": "application/json",
1550
+ ...options.headers
1551
+ }
1552
+ });
1553
+ };
1554
+ var postApiV1ProjectsByNameMeasurementPlanDraftActionsApplyPairedAssignments = (options) => {
1555
+ return (options.client ?? client).post({
1556
+ security: [
1557
+ {
1558
+ scheme: "bearer",
1559
+ type: "http"
1560
+ }
1561
+ ],
1562
+ url: "/api/v1/projects/{name}/measurement-plan/draft/actions/apply-paired-assignments",
1563
+ ...options,
1564
+ headers: {
1565
+ "Content-Type": "application/json",
1566
+ ...options.headers
1567
+ }
1568
+ });
1569
+ };
1501
1570
  var postApiV1ProjectsByNameMeasurementPlanDraftActionsRemoveAssignment = (options) => {
1502
1571
  return (options.client ?? client).post({
1503
1572
  security: [
@@ -1578,6 +1647,38 @@ var postApiV1ProjectsByNameMeasurementPlanDraftActionsRemoveGroup = (options) =>
1578
1647
  }
1579
1648
  });
1580
1649
  };
1650
+ var postApiV1ProjectsByNameMeasurementPlanDraftActionsPreviewGroupMembership = (options) => {
1651
+ return (options.client ?? client).post({
1652
+ security: [
1653
+ {
1654
+ scheme: "bearer",
1655
+ type: "http"
1656
+ }
1657
+ ],
1658
+ url: "/api/v1/projects/{name}/measurement-plan/draft/actions/preview-group-membership",
1659
+ ...options,
1660
+ headers: {
1661
+ "Content-Type": "application/json",
1662
+ ...options.headers
1663
+ }
1664
+ });
1665
+ };
1666
+ var postApiV1ProjectsByNameMeasurementPlanDraftActionsApplyGroupMembership = (options) => {
1667
+ return (options.client ?? client).post({
1668
+ security: [
1669
+ {
1670
+ scheme: "bearer",
1671
+ type: "http"
1672
+ }
1673
+ ],
1674
+ url: "/api/v1/projects/{name}/measurement-plan/draft/actions/apply-group-membership",
1675
+ ...options,
1676
+ headers: {
1677
+ "Content-Type": "application/json",
1678
+ ...options.headers
1679
+ }
1680
+ });
1681
+ };
1581
1682
  var postApiV1ProjectsByNameMeasurementPlanDraftActionsUpsertCompetitor = (options) => {
1582
1683
  return (options.client ?? client).post({
1583
1684
  security: [
@@ -1690,6 +1791,90 @@ var getApiV1ProjectsByNameMeasurementOverview = (options) => {
1690
1791
  ...options
1691
1792
  });
1692
1793
  };
1794
+ var getApiV1ProjectsByNameMeasurementPropertyEvidence = (options) => {
1795
+ return (options.client ?? client).get({
1796
+ security: [
1797
+ {
1798
+ scheme: "bearer",
1799
+ type: "http"
1800
+ }
1801
+ ],
1802
+ url: "/api/v1/projects/{name}/measurement-property-evidence",
1803
+ ...options
1804
+ });
1805
+ };
1806
+ var getApiV1ProjectsByNameMeasurementPortfolioSummary = (options) => {
1807
+ return (options.client ?? client).get({
1808
+ security: [
1809
+ {
1810
+ scheme: "bearer",
1811
+ type: "http"
1812
+ }
1813
+ ],
1814
+ url: "/api/v1/projects/{name}/measurement-portfolio-summary",
1815
+ ...options
1816
+ });
1817
+ };
1818
+ var getApiV1ProjectsByNameMeasurementPropertyQuestions = (options) => {
1819
+ return (options.client ?? client).get({
1820
+ security: [
1821
+ {
1822
+ scheme: "bearer",
1823
+ type: "http"
1824
+ }
1825
+ ],
1826
+ url: "/api/v1/projects/{name}/measurement-property-questions",
1827
+ ...options
1828
+ });
1829
+ };
1830
+ var getApiV1ProjectsByNameMeasurementQuestionResult = (options) => {
1831
+ return (options.client ?? client).get({
1832
+ security: [
1833
+ {
1834
+ scheme: "bearer",
1835
+ type: "http"
1836
+ }
1837
+ ],
1838
+ url: "/api/v1/projects/{name}/measurement-question-result",
1839
+ ...options
1840
+ });
1841
+ };
1842
+ var getApiV1ProjectsByNameMeasurementPropertyCompetitors = (options) => {
1843
+ return (options.client ?? client).get({
1844
+ security: [
1845
+ {
1846
+ scheme: "bearer",
1847
+ type: "http"
1848
+ }
1849
+ ],
1850
+ url: "/api/v1/projects/{name}/measurement-property-competitors",
1851
+ ...options
1852
+ });
1853
+ };
1854
+ var getApiV1ProjectsByNameMeasurementChanges = (options) => {
1855
+ return (options.client ?? client).get({
1856
+ security: [
1857
+ {
1858
+ scheme: "bearer",
1859
+ type: "http"
1860
+ }
1861
+ ],
1862
+ url: "/api/v1/projects/{name}/measurement-changes",
1863
+ ...options
1864
+ });
1865
+ };
1866
+ var getApiV1ProjectsByNameMeasurementDataQuality = (options) => {
1867
+ return (options.client ?? client).get({
1868
+ security: [
1869
+ {
1870
+ scheme: "bearer",
1871
+ type: "http"
1872
+ }
1873
+ ],
1874
+ url: "/api/v1/projects/{name}/measurement-data-quality",
1875
+ ...options
1876
+ });
1877
+ };
1693
1878
  var getApiV1ProjectsByNameMeasurementQuerySets = (options) => {
1694
1879
  return (options.client ?? client).get({
1695
1880
  security: [
@@ -5320,12 +5505,12 @@ var ApiClient = class {
5320
5505
  })
5321
5506
  );
5322
5507
  }
5323
- async getMeasurementReport(project, revision) {
5508
+ async getMeasurementReport(project, revision, runId) {
5324
5509
  return this.invoke(
5325
5510
  () => getApiV1ProjectsByNameMeasurementReport({
5326
5511
  client: this.heyClient,
5327
5512
  path: { name: project },
5328
- query: { revision }
5513
+ query: { revision, runId }
5329
5514
  })
5330
5515
  );
5331
5516
  }
@@ -5344,6 +5529,69 @@ var ApiClient = class {
5344
5529
  })
5345
5530
  );
5346
5531
  }
5532
+ async getMeasurementPropertyEvidence(project, query) {
5533
+ return this.invoke(
5534
+ () => getApiV1ProjectsByNameMeasurementPropertyEvidence({
5535
+ client: this.heyClient,
5536
+ path: { name: project },
5537
+ query
5538
+ })
5539
+ );
5540
+ }
5541
+ async getMeasurementPortfolioSummary(project, query) {
5542
+ return this.invoke(
5543
+ () => getApiV1ProjectsByNameMeasurementPortfolioSummary({
5544
+ client: this.heyClient,
5545
+ path: { name: project },
5546
+ query
5547
+ })
5548
+ );
5549
+ }
5550
+ async getMeasurementPropertyQuestions(project, query) {
5551
+ return this.invoke(
5552
+ () => getApiV1ProjectsByNameMeasurementPropertyQuestions({
5553
+ client: this.heyClient,
5554
+ path: { name: project },
5555
+ query
5556
+ })
5557
+ );
5558
+ }
5559
+ async getMeasurementQuestionResult(project, query) {
5560
+ return this.invoke(
5561
+ () => getApiV1ProjectsByNameMeasurementQuestionResult({
5562
+ client: this.heyClient,
5563
+ path: { name: project },
5564
+ query
5565
+ })
5566
+ );
5567
+ }
5568
+ async getMeasurementPropertyCompetitors(project, query) {
5569
+ return this.invoke(
5570
+ () => getApiV1ProjectsByNameMeasurementPropertyCompetitors({
5571
+ client: this.heyClient,
5572
+ path: { name: project },
5573
+ query
5574
+ })
5575
+ );
5576
+ }
5577
+ async getMeasurementChanges(project, query) {
5578
+ return this.invoke(
5579
+ () => getApiV1ProjectsByNameMeasurementChanges({
5580
+ client: this.heyClient,
5581
+ path: { name: project },
5582
+ query
5583
+ })
5584
+ );
5585
+ }
5586
+ async getMeasurementDataQuality(project, query) {
5587
+ return this.invoke(
5588
+ () => getApiV1ProjectsByNameMeasurementDataQuality({
5589
+ client: this.heyClient,
5590
+ path: { name: project },
5591
+ query
5592
+ })
5593
+ );
5594
+ }
5347
5595
  async getMeasurementPlanDraft(project) {
5348
5596
  return this.invoke(
5349
5597
  () => getApiV1ProjectsByNameMeasurementPlanDraft({ client: this.heyClient, path: { name: project } })
@@ -5467,6 +5715,35 @@ var ApiClient = class {
5467
5715
  })
5468
5716
  );
5469
5717
  }
5718
+ async previewMeasurementDraftAssignments(project, request) {
5719
+ return this.invoke(
5720
+ () => postApiV1ProjectsByNameMeasurementPlanDraftActionsPreviewAssignments({
5721
+ client: this.heyClient,
5722
+ path: { name: project },
5723
+ body: request
5724
+ })
5725
+ );
5726
+ }
5727
+ async replaceMeasurementDraftAssignments(project, request, idempotencyKey, etag) {
5728
+ return this.invoke(
5729
+ () => postApiV1ProjectsByNameMeasurementPlanDraftActionsReplaceAssignments({
5730
+ client: this.heyClient,
5731
+ path: { name: project },
5732
+ body: request,
5733
+ headers: this.measurementDraftMutationHeaders(idempotencyKey, etag)
5734
+ })
5735
+ );
5736
+ }
5737
+ async applyPairedMeasurementDraftAssignments(project, request, idempotencyKey, etag) {
5738
+ return this.invoke(
5739
+ () => postApiV1ProjectsByNameMeasurementPlanDraftActionsApplyPairedAssignments({
5740
+ client: this.heyClient,
5741
+ path: { name: project },
5742
+ body: request,
5743
+ headers: this.measurementDraftMutationHeaders(idempotencyKey, etag)
5744
+ })
5745
+ );
5746
+ }
5470
5747
  async removeMeasurementDraftAssignment(project, request, idempotencyKey, etag) {
5471
5748
  return this.invoke(
5472
5749
  () => postApiV1ProjectsByNameMeasurementPlanDraftActionsRemoveAssignment({
@@ -5517,6 +5794,25 @@ var ApiClient = class {
5517
5794
  })
5518
5795
  );
5519
5796
  }
5797
+ async previewMeasurementDraftGroupMembership(project, request) {
5798
+ return this.invoke(
5799
+ () => postApiV1ProjectsByNameMeasurementPlanDraftActionsPreviewGroupMembership({
5800
+ client: this.heyClient,
5801
+ path: { name: project },
5802
+ body: request
5803
+ })
5804
+ );
5805
+ }
5806
+ async applyMeasurementDraftGroupMembership(project, request, idempotencyKey, etag) {
5807
+ return this.invoke(
5808
+ () => postApiV1ProjectsByNameMeasurementPlanDraftActionsApplyGroupMembership({
5809
+ client: this.heyClient,
5810
+ path: { name: project },
5811
+ body: request,
5812
+ headers: this.measurementDraftMutationHeaders(idempotencyKey, etag)
5813
+ })
5814
+ );
5815
+ }
5520
5816
  async upsertMeasurementDraftCompetitor(project, request, idempotencyKey, etag) {
5521
5817
  return this.invoke(
5522
5818
  () => postApiV1ProjectsByNameMeasurementPlanDraftActionsUpsertCompetitor({
@@ -7209,6 +7505,9 @@ var runTriggerInputSchema = z2.object({
7209
7505
  request: runTriggerRequestSchema.optional()
7210
7506
  });
7211
7507
  var measurementPlanVersionInputSchema = z2.object({ project: projectNameSchema, revision: z2.number().int().positive() });
7508
+ var measurementReportInputSchema = measurementPlanVersionInputSchema.extend({
7509
+ runId: runIdSchema.optional().describe("Exact eligible full measurement run to reconstruct. Omit for the latest run in the revision.")
7510
+ });
7212
7511
  var measurementPlanPreviewInputSchema = z2.object({ project: projectNameSchema, plan: measurementPlanAuthoringSchema });
7213
7512
  var measurementPlanPublishInputSchema = measurementPlanPublishRequestSchema.extend({ project: projectNameSchema });
7214
7513
  var measurementPlanRetireInputSchema = z2.object({ project: projectNameSchema, stableKey: z2.string().min(1) });
@@ -7217,7 +7516,60 @@ var idempotencyKeyInputSchema = z2.string().trim().min(1).describe("A fresh requ
7217
7516
  var measurementDraftEtagInputSchema = z2.string().trim().min(1).optional().describe(
7218
7517
  "Current draft ETag from canonry_measurement_draft_get. The API requires it for draft edits, publish, and discard; omit it only to receive the API\u2019s actionable 428 response."
7219
7518
  );
7220
- var measurementOverviewInputSchema = measurementOverviewQuerySchema.extend({ project: projectNameSchema });
7519
+ var measurementOverviewInputSchema = z2.object({
7520
+ project: projectNameSchema,
7521
+ scope: measurementOverviewQuerySchema.shape.scope.describe("Read all Properties, one reporting group, or one Property."),
7522
+ groupKey: measurementOverviewQuerySchema.shape.groupKey.describe("Group stable key. Required only for group scope."),
7523
+ targetKey: measurementOverviewQuerySchema.shape.targetKey.describe("Property stable key. Required only for property scope."),
7524
+ queryClass: measurementOverviewQuerySchema.shape.queryClass,
7525
+ provider: measurementOverviewQuerySchema.shape.provider,
7526
+ location: measurementOverviewQuerySchema.shape.location,
7527
+ from: measurementOverviewQuerySchema.shape.from,
7528
+ to: measurementOverviewQuerySchema.shape.to,
7529
+ runId: measurementOverviewQuerySchema.shape.runId,
7530
+ search: measurementOverviewQuerySchema.shape.search,
7531
+ sort: measurementOverviewQuerySchema.shape.sort,
7532
+ cursor: measurementOverviewQuerySchema.shape.cursor,
7533
+ limit: measurementOverviewQuerySchema.shape.limit
7534
+ }).strict().superRefine((input, context) => {
7535
+ if (input.scope === "group" && !input.groupKey) {
7536
+ context.addIssue({ code: "custom", path: ["groupKey"], message: "Group scope requires groupKey." });
7537
+ }
7538
+ if (input.scope === "property" && !input.targetKey) {
7539
+ context.addIssue({ code: "custom", path: ["targetKey"], message: "Property scope requires targetKey." });
7540
+ }
7541
+ if (input.scope !== "group" && input.groupKey) {
7542
+ context.addIssue({ code: "custom", path: ["groupKey"], message: `${input.scope} scope does not accept groupKey.` });
7543
+ }
7544
+ if (input.scope !== "property" && input.targetKey) {
7545
+ context.addIssue({ code: "custom", path: ["targetKey"], message: `${input.scope} scope does not accept targetKey.` });
7546
+ }
7547
+ });
7548
+ var measurementPropertyEvidenceInputSchema = measurementPropertyEvidenceQuerySchema.extend({
7549
+ project: projectNameSchema,
7550
+ targetKey: measurementPropertyEvidenceQuerySchema.shape.targetKey.describe("Property stable key. Required \u2014 this read is scoped to exactly one Property."),
7551
+ shape: measurementPropertyEvidenceQuerySchema.shape.shape.describe(
7552
+ "What one row is. Omit for sources (one row per cited URL). answers gives one row per measured answer with its cited URLs nested, including the answers that cited nothing."
7553
+ )
7554
+ }).strict();
7555
+ var measurementPortfolioSummaryInputSchema = measurementPortfolioSummaryQuerySchema.extend({
7556
+ project: projectNameSchema
7557
+ }).strict();
7558
+ var measurementPropertyQuestionsInputSchema = measurementPropertyQuestionsQuerySchema.extend({
7559
+ project: projectNameSchema
7560
+ }).strict();
7561
+ var measurementQuestionResultInputSchema = measurementQuestionResultQuerySchema.extend({
7562
+ project: projectNameSchema
7563
+ }).strict();
7564
+ var measurementPropertyCompetitorsInputSchema = measurementPropertyCompetitorsQuerySchema.extend({
7565
+ project: projectNameSchema
7566
+ }).strict();
7567
+ var measurementChangesInputSchema = measurementChangesQuerySchema.extend({
7568
+ project: projectNameSchema
7569
+ }).strict();
7570
+ var measurementDataQualityInputSchema = measurementDataQualityQuerySchema.extend({
7571
+ project: projectNameSchema
7572
+ }).strict();
7221
7573
  var measurementDraftCollectionInputSchema = measurementDraftCollectionQuerySchema.extend({ project: projectNameSchema });
7222
7574
  var measurementQuerySetInputSchema = z2.object({
7223
7575
  project: projectNameSchema,
@@ -7263,11 +7615,22 @@ var measurementDraftOperationSchema = z2.discriminatedUnion("action", [
7263
7615
  measurementDraftMutationOperationSchema("exclude-target", measurementDraftExcludeTargetRequestSchema),
7264
7616
  measurementDraftMutationOperationSchema("rebind-target", measurementDraftRebindTargetRequestSchema),
7265
7617
  measurementDraftMutationOperationSchema("apply-assignments", measurementDraftApplyAssignmentsRequestSchema),
7618
+ z2.object({
7619
+ action: z2.literal("preview-assignments"),
7620
+ request: measurementDraftPreviewAssignmentsRequestSchema
7621
+ }).strict().describe("Read-semantic assignment impact preview."),
7622
+ measurementDraftMutationOperationSchema("replace-assignments", measurementDraftReplaceAssignmentsRequestSchema),
7623
+ measurementDraftMutationOperationSchema("apply-paired-assignments", measurementDraftApplyPairedAssignmentsRequestSchema),
7266
7624
  measurementDraftMutationOperationSchema("remove-assignment", measurementDraftRemoveAssignmentRequestSchema),
7267
7625
  measurementDraftMutationOperationSchema("clear-assignments", measurementDraftClearAssignmentsRequestSchema),
7268
7626
  measurementDraftMutationOperationSchema("classify-assignments", measurementDraftClassifyAssignmentsRequestSchema),
7269
7627
  measurementDraftMutationOperationSchema("upsert-group", measurementDraftUpsertGroupRequestSchema),
7270
7628
  measurementDraftMutationOperationSchema("remove-group", measurementDraftRemoveGroupRequestSchema),
7629
+ z2.object({
7630
+ action: z2.literal("preview-group-membership"),
7631
+ request: measurementDraftPreviewGroupMembershipRequestSchema
7632
+ }).strict().describe("Read-semantic CSV group-membership preview."),
7633
+ measurementDraftMutationOperationSchema("apply-group-membership", measurementDraftApplyGroupMembershipRequestSchema),
7271
7634
  measurementDraftMutationOperationSchema("upsert-competitor", measurementDraftUpsertCompetitorRequestSchema),
7272
7635
  measurementDraftMutationOperationSchema("remove-competitor", measurementDraftRemoveCompetitorRequestSchema),
7273
7636
  z2.object({ action: z2.literal("compile-preview") }).strict().describe("Operation for compile-preview."),
@@ -7293,11 +7656,16 @@ var measurementDraftActionOpenApiOperations = [
7293
7656
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/exclude-target",
7294
7657
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/rebind-target",
7295
7658
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/apply-assignments",
7659
+ "POST /api/v1/projects/{name}/measurement-plan/draft/actions/preview-assignments",
7660
+ "POST /api/v1/projects/{name}/measurement-plan/draft/actions/replace-assignments",
7661
+ "POST /api/v1/projects/{name}/measurement-plan/draft/actions/apply-paired-assignments",
7296
7662
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/remove-assignment",
7297
7663
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/clear-assignments",
7298
7664
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/classify-assignments",
7299
7665
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/upsert-group",
7300
7666
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/remove-group",
7667
+ "POST /api/v1/projects/{name}/measurement-plan/draft/actions/preview-group-membership",
7668
+ "POST /api/v1/projects/{name}/measurement-plan/draft/actions/apply-group-membership",
7301
7669
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/upsert-competitor",
7302
7670
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/remove-competitor",
7303
7671
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/compile-preview",
@@ -7326,6 +7694,12 @@ function runMeasurementDraftAction(client2, input) {
7326
7694
  return client2.rebindMeasurementDraftTarget(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7327
7695
  case "apply-assignments":
7328
7696
  return client2.applyMeasurementDraftAssignments(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7697
+ case "preview-assignments":
7698
+ return client2.previewMeasurementDraftAssignments(project, actionInput.request);
7699
+ case "replace-assignments":
7700
+ return client2.replaceMeasurementDraftAssignments(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7701
+ case "apply-paired-assignments":
7702
+ return client2.applyPairedMeasurementDraftAssignments(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7329
7703
  case "remove-assignment":
7330
7704
  return client2.removeMeasurementDraftAssignment(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7331
7705
  case "clear-assignments":
@@ -7336,6 +7710,10 @@ function runMeasurementDraftAction(client2, input) {
7336
7710
  return client2.upsertMeasurementDraftGroup(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7337
7711
  case "remove-group":
7338
7712
  return client2.removeMeasurementDraftGroup(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7713
+ case "preview-group-membership":
7714
+ return client2.previewMeasurementDraftGroupMembership(project, actionInput.request);
7715
+ case "apply-group-membership":
7716
+ return client2.applyMeasurementDraftGroupMembership(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7339
7717
  case "upsert-competitor":
7340
7718
  return client2.upsertMeasurementDraftCompetitor(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7341
7719
  case "remove-competitor":
@@ -9020,7 +9398,7 @@ var canonryMcpTools = [
9020
9398
  defineTool({
9021
9399
  name: "canonry_measurement_overview",
9022
9400
  title: "Get Advanced Measurement overview",
9023
- description: "Return stored, revision-pinned Advanced Measurement metrics and a bounded page of Target rows for one scope. It ranks one run snapshot only and never infers a trend or compares across revisions. Choose label-asc (default), label-desc, citationCoverage-asc/desc, or mentionCoverage-asc/desc. For a coverage sort, unavailable rows form the first bucket in either direction; available rows then follow the requested numeric direction. The cursor is sort-aware, pins pagination to the active revision, displayed run, evidence snapshot, and filters even if a newer run completes, and must be reused unchanged with the same sort and filters. Legacy label cursors work only when sort is omitted, while any explicit sort needs a new sort-bound cursor. It never starts provider work or incurs provider cost; page size is at most 100, and it refuses invalid scope keys, cursor combinations, appended evidence, or a run pinned to another revision.",
9401
+ description: "Return stored, revision-pinned Advanced Measurement metrics and a bounded page of Property rows for all Properties, one reporting group, or one Property. Filter by query class, provider, location, date window, run, or Property search; search filters rows without changing metric denominators. It ranks one run snapshot only and never infers a trend or compares across revisions. Choose label-asc (default), label-desc, citationCoverage-asc/desc, or mentionCoverage-asc/desc. For a coverage sort, unavailable rows form the first bucket in either direction; available rows then follow the requested numeric direction. The cursor is sort-aware, pins pagination to the active revision, displayed run, evidence snapshot, and filters even if a newer run completes, and must be reused unchanged with the same sort and filters. Legacy label cursors work only when sort is omitted, while any explicit sort needs a new sort-bound cursor. It never starts provider work or incurs provider cost; page size is at most 100, and it refuses invalid scope keys, cursor combinations, appended evidence, or a run pinned to another revision.",
9024
9402
  access: "read",
9025
9403
  tier: "setup",
9026
9404
  inputSchema: measurementOverviewInputSchema,
@@ -9031,6 +9409,104 @@ var canonryMcpTools = [
9031
9409
  return client2.getMeasurementOverview(project, query);
9032
9410
  }
9033
9411
  }),
9412
+ defineTool({
9413
+ name: "canonry_measurement_property_evidence",
9414
+ title: "Page one Property's measurement evidence",
9415
+ description: "Return the stored evidence rows for exactly one Property out of one revision-pinned run, optionally narrowed to a question class, provider, or location. shape chooses what a row is: sources (the default) returns one row per cited URL under evidence; answers returns one row per measured answer under answers, with the cited URLs nested inside and both signals on the row (mentioned, cited). Use shape=answers to explain a GAP \u2014 an answer that mentioned the Property without linking it, or that named nobody at all, has no URL to hang a source row on and does not appear in the default shape, so counting source rows understates what was measured. mentioned is null, never false, when the answer text was never captured: that is a missing signal, not a measured no. Exactly one of evidence or answers is returned and the other is absent rather than empty. A cursor is bound to the shape that issued it and is refused on the other. Prefer this over canonry_measurement_report when you want one Property: the report reconstructs every group and every Target for a revision and does not paginate. Run selection matches canonry_measurement_overview \u2014 the most recent completed run pinned to the active revision unless runId names another, and a run pinned to a different revision is refused rather than joined. The cursor also pins the active revision, displayed run, evidence snapshot, and filters; reuse it unchanged. Not available for a schema v1 revision, which records no question class to scope by. It never starts provider work; page size is at most 100. An empty page under measurement.state = not_measured means the Property has not been measured at all, which is NOT a measured result of zero.",
9416
+ access: "read",
9417
+ tier: "setup",
9418
+ inputSchema: measurementPropertyEvidenceInputSchema,
9419
+ annotations: readAnnotations(),
9420
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-property-evidence"],
9421
+ handler: (client2, input) => {
9422
+ const { project, ...query } = input;
9423
+ return client2.getMeasurementPropertyEvidence(project, query);
9424
+ }
9425
+ }),
9426
+ defineTool({
9427
+ name: "canonry_measurement_portfolio_summary",
9428
+ title: "Summarize measured Properties",
9429
+ description: "Start here to rank the weakest measured Properties and their stored replacement names. Reads stored data only; it never starts provider work.",
9430
+ access: "read",
9431
+ tier: "monitoring",
9432
+ inputSchema: measurementPortfolioSummaryInputSchema,
9433
+ annotations: readAnnotations(),
9434
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-portfolio-summary"],
9435
+ handler: (client2, input) => {
9436
+ const { project, ...query } = input;
9437
+ return client2.getMeasurementPortfolioSummary(project, query);
9438
+ }
9439
+ }),
9440
+ defineTool({
9441
+ name: "canonry_measurement_property_questions",
9442
+ title: "List a Property\u2019s stored questions",
9443
+ description: "After identifying a Property, list its stored question outcomes and use a returned resultId with canonry_measurement_question_result. Reads stored data only; it never starts provider work.",
9444
+ access: "read",
9445
+ tier: "monitoring",
9446
+ inputSchema: measurementPropertyQuestionsInputSchema,
9447
+ annotations: readAnnotations(),
9448
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-property-questions"],
9449
+ handler: (client2, input) => {
9450
+ const { project, ...query } = input;
9451
+ return client2.getMeasurementPropertyQuestions(project, query);
9452
+ }
9453
+ }),
9454
+ defineTool({
9455
+ name: "canonry_measurement_question_result",
9456
+ title: "Get a stored question result",
9457
+ description: "After listing a Property\u2019s questions, expand one returned resultId into its stored answer and attribution sources. Reads stored data only; it never starts provider work.",
9458
+ access: "read",
9459
+ tier: "monitoring",
9460
+ inputSchema: measurementQuestionResultInputSchema,
9461
+ annotations: readAnnotations(),
9462
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-question-result"],
9463
+ handler: (client2, input) => {
9464
+ const { project, ...query } = input;
9465
+ return client2.getMeasurementQuestionResult(project, query);
9466
+ }
9467
+ }),
9468
+ defineTool({
9469
+ name: "canonry_measurement_property_competitors",
9470
+ title: "List a Property\u2019s stored replacements",
9471
+ description: "After reviewing a Property\u2019s question outcomes, find repeated stored replacement names for its misses. Reads stored data only; it never starts provider work.",
9472
+ access: "read",
9473
+ tier: "monitoring",
9474
+ inputSchema: measurementPropertyCompetitorsInputSchema,
9475
+ annotations: readAnnotations(),
9476
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-property-competitors"],
9477
+ handler: (client2, input) => {
9478
+ const { project, ...query } = input;
9479
+ return client2.getMeasurementPropertyCompetitors(project, query);
9480
+ }
9481
+ }),
9482
+ defineTool({
9483
+ name: "canonry_measurement_changes",
9484
+ title: "Compare stored measurement changes",
9485
+ description: "After reviewing the current summary, compare stored runs only when their execution identity is compatible. Reads stored data only; it never starts provider work.",
9486
+ access: "read",
9487
+ tier: "monitoring",
9488
+ inputSchema: measurementChangesInputSchema,
9489
+ annotations: readAnnotations(),
9490
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-changes"],
9491
+ handler: (client2, input) => {
9492
+ const { project, ...query } = input;
9493
+ return client2.getMeasurementChanges(project, query);
9494
+ }
9495
+ }),
9496
+ defineTool({
9497
+ name: "canonry_measurement_data_quality",
9498
+ title: "Inspect stored measurement data quality",
9499
+ description: "Before acting on a measurement, inspect its stored completeness, capture, retrieval, and comparability context. Reads stored data only; it never starts provider work.",
9500
+ access: "read",
9501
+ tier: "monitoring",
9502
+ inputSchema: measurementDataQualityInputSchema,
9503
+ annotations: readAnnotations(),
9504
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-data-quality"],
9505
+ handler: (client2, input) => {
9506
+ const { project, ...query } = input;
9507
+ return client2.getMeasurementDataQuality(project, query);
9508
+ }
9509
+ }),
9034
9510
  defineTool({
9035
9511
  name: "canonry_measurement_draft_get",
9036
9512
  title: "Get Advanced Measurement draft",
@@ -9204,13 +9680,13 @@ var canonryMcpTools = [
9204
9680
  defineTool({
9205
9681
  name: "canonry_measurement_report",
9206
9682
  title: "Get measurement report",
9207
- description: "Get a revision-pinned Target and group measurement report from stored runs. Never starts live provider work.",
9683
+ description: "Get a revision-pinned Target and group measurement report from stored runs. Optionally pin the evidence to an exact eligible full run. Never starts live provider work.",
9208
9684
  access: "read",
9209
9685
  tier: "setup",
9210
- inputSchema: measurementPlanVersionInputSchema,
9686
+ inputSchema: measurementReportInputSchema,
9211
9687
  annotations: readAnnotations(),
9212
9688
  openApiOperations: ["GET /api/v1/projects/{name}/measurement-report"],
9213
- handler: (client2, input) => client2.getMeasurementReport(input.project, input.revision)
9689
+ handler: (client2, input) => client2.getMeasurementReport(input.project, input.revision, input.runId)
9214
9690
  }),
9215
9691
  defineTool({
9216
9692
  name: "canonry_run_trigger",
@@ -9909,6 +10385,7 @@ export {
9909
10385
  CliError,
9910
10386
  usageError,
9911
10387
  isEndpointMissing,
10388
+ systemError,
9912
10389
  printCliError,
9913
10390
  createApiClient,
9914
10391
  ApiClient,