@canonry/canonry 4.117.2 → 4.123.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/README.md +9 -0
  2. package/assets/agent-workspace/skills/canonry/SKILL.md +3 -0
  3. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +161 -2
  4. package/assets/assets/AuditHistoryPanel-BVQMDIhQ.js +1 -0
  5. package/assets/assets/{BacklinksPage-CschVQxC.js → BacklinksPage-nrHT9VMG.js} +1 -1
  6. package/assets/assets/ChartPrimitives-_8qLsQzI.js +1 -0
  7. package/assets/assets/HistoryPage-DqsKKdyy.js +1 -0
  8. package/assets/assets/ProjectPage-GyKoQUv_.js +7 -0
  9. package/assets/assets/{RunRow-ggNGlwdN.js → RunRow-BRZZcSjQ.js} +1 -1
  10. package/assets/assets/RunsPage-24aI8DKF.js +1 -0
  11. package/assets/assets/{SettingsPage-Cy9SlBJX.js → SettingsPage-BaNeTG1i.js} +1 -1
  12. package/assets/assets/{TrafficPage-1S2PzSHB.js → TrafficPage-ByvcLSjv.js} +1 -1
  13. package/assets/assets/{TrafficSourceDetailPage-CqXCoaod.js → TrafficSourceDetailPage-B-siTXVg.js} +1 -1
  14. package/assets/assets/{arrow-left-kCK5M8Bp.js → arrow-left-CBh1cZNH.js} +1 -1
  15. package/assets/assets/{extract-error-message-C82LAW6q.js → extract-error-message-DJZCPudR.js} +1 -1
  16. package/assets/assets/index-jymsMBpZ.css +1 -0
  17. package/assets/assets/index-mzLganDP.js +210 -0
  18. package/assets/assets/{trash-2-8Pe4v1T0.js → trash-2-Bh-Yvkgc.js} +1 -1
  19. package/assets/assets/vendor-recharts-DSxTZhaH.js +36 -0
  20. package/assets/index.html +3 -3
  21. package/dist/{chunk-BMPIV35C.js → chunk-4AZ7VES6.js} +5726 -697
  22. package/dist/{chunk-4PMMEFME.js → chunk-HJIIJI7K.js} +816 -18
  23. package/dist/{chunk-F2SRZJMY.js → chunk-JYBNBK25.js} +627 -22
  24. package/dist/{chunk-EZME2J2G.js → chunk-MMFSI3OG.js} +3315 -2191
  25. package/dist/cli.js +861 -109
  26. package/dist/index.js +4 -4
  27. package/dist/{intelligence-service-GNOE4J35.js → intelligence-service-K35EN43I.js} +2 -2
  28. package/dist/mcp.js +4 -4
  29. package/package.json +12 -12
  30. package/assets/assets/ChartPrimitives-D4782Ifx.js +0 -1
  31. package/assets/assets/ProjectPage-BSGTpBUJ.js +0 -7
  32. package/assets/assets/RunsPage-Bfp0K6Ry.js +0 -1
  33. package/assets/assets/index-DrDNyUhv.css +0 -1
  34. package/assets/assets/index-i-t64RXw.js +0 -210
  35. package/assets/assets/vendor-recharts-C9EZkgbP.js +0 -36
@@ -3,6 +3,18 @@ import {
3
3
  AGENT_MEMORY_VALUE_MAX_BYTES,
4
4
  DISCOVERY_MAX_PROBES_CAP,
5
5
  DISCOVERY_PROBE_CONCURRENCY_CAP,
6
+ adsActivateTreeRequestSchema,
7
+ adsAdCreateRequestSchema,
8
+ adsAdGroupCreateRequestSchema,
9
+ adsAdGroupUpdateRequestSchema,
10
+ adsAdUpdateRequestSchema,
11
+ adsCampaignCreateRequestSchema,
12
+ adsCampaignUpdateRequestSchema,
13
+ adsGeoSearchQuerySchema,
14
+ adsImageUploadRequestSchema,
15
+ adsOperationReconcileRequestSchema,
16
+ adsPauseRequestSchema,
17
+ adsUnresolvedOperationListQuerySchema,
6
18
  backlinkSourceSchema,
7
19
  competitorBatchRequestSchema,
8
20
  discoveryBucketSchema,
@@ -25,7 +37,7 @@ import {
25
37
  trafficConnectVercelRequestSchema,
26
38
  trafficConnectWordpressRequestSchema,
27
39
  trafficEventKindSchema
28
- } from "./chunk-EZME2J2G.js";
40
+ } from "./chunk-MMFSI3OG.js";
29
41
 
30
42
  // src/config.ts
31
43
  import fs from "fs";
@@ -1506,6 +1518,18 @@ var getApiV1ProjectsByNameHistory = (options) => {
1506
1518
  ...options
1507
1519
  });
1508
1520
  };
1521
+ var getApiV1History = (options) => {
1522
+ return (options?.client ?? client).get({
1523
+ security: [
1524
+ {
1525
+ scheme: "bearer",
1526
+ type: "http"
1527
+ }
1528
+ ],
1529
+ url: "/api/v1/history",
1530
+ ...options
1531
+ });
1532
+ };
1509
1533
  var getApiV1ProjectsByNameSnapshots = (options) => {
1510
1534
  return (options.client ?? client).get({
1511
1535
  security: [
@@ -2310,7 +2334,79 @@ var getApiV1ProjectsByNameAdsStatus = (options) => {
2310
2334
  ...options
2311
2335
  });
2312
2336
  };
2313
- var postApiV1ProjectsByNameAdsSync = (options) => {
2337
+ var getApiV1ProjectsByNameAdsAccount = (options) => {
2338
+ return (options.client ?? client).get({
2339
+ security: [
2340
+ {
2341
+ scheme: "bearer",
2342
+ type: "http"
2343
+ }
2344
+ ],
2345
+ url: "/api/v1/projects/{name}/ads/account",
2346
+ ...options
2347
+ });
2348
+ };
2349
+ var getApiV1ProjectsByNameAdsGeoSearch = (options) => {
2350
+ return (options.client ?? client).get({
2351
+ security: [
2352
+ {
2353
+ scheme: "bearer",
2354
+ type: "http"
2355
+ }
2356
+ ],
2357
+ url: "/api/v1/projects/{name}/ads/geo/search",
2358
+ ...options
2359
+ });
2360
+ };
2361
+ var getApiV1ProjectsByNameAdsConversionsPixels = (options) => {
2362
+ return (options.client ?? client).get({
2363
+ security: [
2364
+ {
2365
+ scheme: "bearer",
2366
+ type: "http"
2367
+ }
2368
+ ],
2369
+ url: "/api/v1/projects/{name}/ads/conversions/pixels",
2370
+ ...options
2371
+ });
2372
+ };
2373
+ var getApiV1ProjectsByNameAdsConversionsEventSettings = (options) => {
2374
+ return (options.client ?? client).get({
2375
+ security: [
2376
+ {
2377
+ scheme: "bearer",
2378
+ type: "http"
2379
+ }
2380
+ ],
2381
+ url: "/api/v1/projects/{name}/ads/conversions/event-settings",
2382
+ ...options
2383
+ });
2384
+ };
2385
+ var getApiV1ProjectsByNameAdsOperations = (options) => {
2386
+ return (options.client ?? client).get({
2387
+ security: [
2388
+ {
2389
+ scheme: "bearer",
2390
+ type: "http"
2391
+ }
2392
+ ],
2393
+ url: "/api/v1/projects/{name}/ads/operations",
2394
+ ...options
2395
+ });
2396
+ };
2397
+ var getApiV1ProjectsByNameAdsOperationsByOperationKey = (options) => {
2398
+ return (options.client ?? client).get({
2399
+ security: [
2400
+ {
2401
+ scheme: "bearer",
2402
+ type: "http"
2403
+ }
2404
+ ],
2405
+ url: "/api/v1/projects/{name}/ads/operations/{operationKey}",
2406
+ ...options
2407
+ });
2408
+ };
2409
+ var postApiV1ProjectsByNameAdsOperationsByOperationKeyReconcile = (options) => {
2314
2410
  return (options.client ?? client).post({
2315
2411
  security: [
2316
2412
  {
@@ -2318,19 +2414,247 @@ var postApiV1ProjectsByNameAdsSync = (options) => {
2318
2414
  type: "http"
2319
2415
  }
2320
2416
  ],
2321
- url: "/api/v1/projects/{name}/ads/sync",
2417
+ url: "/api/v1/projects/{name}/ads/operations/{operationKey}/reconcile",
2418
+ ...options
2419
+ });
2420
+ };
2421
+ var postApiV1ProjectsByNameAdsOperationsByOperationKeyResumeActivation = (options) => {
2422
+ return (options.client ?? client).post({
2423
+ security: [
2424
+ {
2425
+ scheme: "bearer",
2426
+ type: "http"
2427
+ }
2428
+ ],
2429
+ url: "/api/v1/projects/{name}/ads/operations/{operationKey}/resume-activation",
2430
+ ...options
2431
+ });
2432
+ };
2433
+ var postApiV1ProjectsByNameAdsActivationGrants = (options) => {
2434
+ return (options.client ?? client).post({
2435
+ security: [
2436
+ {
2437
+ scheme: "bearer",
2438
+ type: "http"
2439
+ }
2440
+ ],
2441
+ url: "/api/v1/projects/{name}/ads/activation-grants",
2442
+ ...options,
2443
+ headers: {
2444
+ "Content-Type": "application/json",
2445
+ ...options.headers
2446
+ }
2447
+ });
2448
+ };
2449
+ var postApiV1ProjectsByNameAdsActivationGrantsByGrantIdRevoke = (options) => {
2450
+ return (options.client ?? client).post({
2451
+ security: [
2452
+ {
2453
+ scheme: "bearer",
2454
+ type: "http"
2455
+ }
2456
+ ],
2457
+ url: "/api/v1/projects/{name}/ads/activation-grants/{grantId}/revoke",
2458
+ ...options
2459
+ });
2460
+ };
2461
+ var postApiV1ProjectsByNameAdsCampaignsByIdActivateTree = (options) => {
2462
+ return (options.client ?? client).post({
2463
+ security: [
2464
+ {
2465
+ scheme: "bearer",
2466
+ type: "http"
2467
+ }
2468
+ ],
2469
+ url: "/api/v1/projects/{name}/ads/campaigns/{id}/activate-tree",
2470
+ ...options,
2471
+ headers: {
2472
+ "Content-Type": "application/json",
2473
+ ...options.headers
2474
+ }
2475
+ });
2476
+ };
2477
+ var postApiV1ProjectsByNameAdsFiles = (options) => {
2478
+ return (options.client ?? client).post({
2479
+ security: [
2480
+ {
2481
+ scheme: "bearer",
2482
+ type: "http"
2483
+ }
2484
+ ],
2485
+ url: "/api/v1/projects/{name}/ads/files",
2486
+ ...options,
2487
+ headers: {
2488
+ "Content-Type": "application/json",
2489
+ ...options.headers
2490
+ }
2491
+ });
2492
+ };
2493
+ var getApiV1ProjectsByNameAdsCampaigns = (options) => {
2494
+ return (options.client ?? client).get({
2495
+ security: [
2496
+ {
2497
+ scheme: "bearer",
2498
+ type: "http"
2499
+ }
2500
+ ],
2501
+ url: "/api/v1/projects/{name}/ads/campaigns",
2322
2502
  ...options
2323
2503
  });
2324
2504
  };
2325
- var getApiV1ProjectsByNameAdsCampaigns = (options) => {
2326
- return (options.client ?? client).get({
2505
+ var postApiV1ProjectsByNameAdsCampaigns = (options) => {
2506
+ return (options.client ?? client).post({
2507
+ security: [
2508
+ {
2509
+ scheme: "bearer",
2510
+ type: "http"
2511
+ }
2512
+ ],
2513
+ url: "/api/v1/projects/{name}/ads/campaigns",
2514
+ ...options,
2515
+ headers: {
2516
+ "Content-Type": "application/json",
2517
+ ...options.headers
2518
+ }
2519
+ });
2520
+ };
2521
+ var postApiV1ProjectsByNameAdsAdGroups = (options) => {
2522
+ return (options.client ?? client).post({
2523
+ security: [
2524
+ {
2525
+ scheme: "bearer",
2526
+ type: "http"
2527
+ }
2528
+ ],
2529
+ url: "/api/v1/projects/{name}/ads/ad-groups",
2530
+ ...options,
2531
+ headers: {
2532
+ "Content-Type": "application/json",
2533
+ ...options.headers
2534
+ }
2535
+ });
2536
+ };
2537
+ var postApiV1ProjectsByNameAdsAds = (options) => {
2538
+ return (options.client ?? client).post({
2539
+ security: [
2540
+ {
2541
+ scheme: "bearer",
2542
+ type: "http"
2543
+ }
2544
+ ],
2545
+ url: "/api/v1/projects/{name}/ads/ads",
2546
+ ...options,
2547
+ headers: {
2548
+ "Content-Type": "application/json",
2549
+ ...options.headers
2550
+ }
2551
+ });
2552
+ };
2553
+ var postApiV1ProjectsByNameAdsCampaignsById = (options) => {
2554
+ return (options.client ?? client).post({
2555
+ security: [
2556
+ {
2557
+ scheme: "bearer",
2558
+ type: "http"
2559
+ }
2560
+ ],
2561
+ url: "/api/v1/projects/{name}/ads/campaigns/{id}",
2562
+ ...options,
2563
+ headers: {
2564
+ "Content-Type": "application/json",
2565
+ ...options.headers
2566
+ }
2567
+ });
2568
+ };
2569
+ var postApiV1ProjectsByNameAdsAdGroupsById = (options) => {
2570
+ return (options.client ?? client).post({
2571
+ security: [
2572
+ {
2573
+ scheme: "bearer",
2574
+ type: "http"
2575
+ }
2576
+ ],
2577
+ url: "/api/v1/projects/{name}/ads/ad-groups/{id}",
2578
+ ...options,
2579
+ headers: {
2580
+ "Content-Type": "application/json",
2581
+ ...options.headers
2582
+ }
2583
+ });
2584
+ };
2585
+ var postApiV1ProjectsByNameAdsAdsById = (options) => {
2586
+ return (options.client ?? client).post({
2587
+ security: [
2588
+ {
2589
+ scheme: "bearer",
2590
+ type: "http"
2591
+ }
2592
+ ],
2593
+ url: "/api/v1/projects/{name}/ads/ads/{id}",
2594
+ ...options,
2595
+ headers: {
2596
+ "Content-Type": "application/json",
2597
+ ...options.headers
2598
+ }
2599
+ });
2600
+ };
2601
+ var postApiV1ProjectsByNameAdsCampaignsByIdPause = (options) => {
2602
+ return (options.client ?? client).post({
2603
+ security: [
2604
+ {
2605
+ scheme: "bearer",
2606
+ type: "http"
2607
+ }
2608
+ ],
2609
+ url: "/api/v1/projects/{name}/ads/campaigns/{id}/pause",
2610
+ ...options,
2611
+ headers: {
2612
+ "Content-Type": "application/json",
2613
+ ...options.headers
2614
+ }
2615
+ });
2616
+ };
2617
+ var postApiV1ProjectsByNameAdsAdGroupsByIdPause = (options) => {
2618
+ return (options.client ?? client).post({
2619
+ security: [
2620
+ {
2621
+ scheme: "bearer",
2622
+ type: "http"
2623
+ }
2624
+ ],
2625
+ url: "/api/v1/projects/{name}/ads/ad-groups/{id}/pause",
2626
+ ...options,
2627
+ headers: {
2628
+ "Content-Type": "application/json",
2629
+ ...options.headers
2630
+ }
2631
+ });
2632
+ };
2633
+ var postApiV1ProjectsByNameAdsAdsByIdPause = (options) => {
2634
+ return (options.client ?? client).post({
2635
+ security: [
2636
+ {
2637
+ scheme: "bearer",
2638
+ type: "http"
2639
+ }
2640
+ ],
2641
+ url: "/api/v1/projects/{name}/ads/ads/{id}/pause",
2642
+ ...options,
2643
+ headers: {
2644
+ "Content-Type": "application/json",
2645
+ ...options.headers
2646
+ }
2647
+ });
2648
+ };
2649
+ var postApiV1ProjectsByNameAdsSync = (options) => {
2650
+ return (options.client ?? client).post({
2327
2651
  security: [
2328
2652
  {
2329
2653
  scheme: "bearer",
2330
2654
  type: "http"
2331
2655
  }
2332
2656
  ],
2333
- url: "/api/v1/projects/{name}/ads/campaigns",
2657
+ url: "/api/v1/projects/{name}/ads/sync",
2334
2658
  ...options
2335
2659
  });
2336
2660
  };
@@ -4124,14 +4448,19 @@ var ApiClient = class {
4124
4448
  async cancelRun(id) {
4125
4449
  return this.invoke(() => postApiV1RunsByIdCancel({ client: this.heyClient, path: { id } }));
4126
4450
  }
4127
- async getTimeline(project, location) {
4451
+ async getTimeline(project, location, limit) {
4452
+ return this.invoke(
4453
+ () => getApiV1ProjectsByNameTimeline({ client: this.heyClient, path: { name: project }, query: { location, limit } })
4454
+ );
4455
+ }
4456
+ async getHistory(project, opts) {
4128
4457
  return this.invoke(
4129
- () => getApiV1ProjectsByNameTimeline({ client: this.heyClient, path: { name: project }, query: { location } })
4458
+ () => getApiV1ProjectsByNameHistory({ client: this.heyClient, path: { name: project }, query: opts })
4130
4459
  );
4131
4460
  }
4132
- async getHistory(project) {
4461
+ async getGlobalHistory(opts) {
4133
4462
  return this.invoke(
4134
- () => getApiV1ProjectsByNameHistory({ client: this.heyClient, path: { name: project } })
4463
+ () => getApiV1History({ client: this.heyClient, query: opts })
4135
4464
  );
4136
4465
  }
4137
4466
  async getSnapshots(project, opts) {
@@ -4407,6 +4736,26 @@ var ApiClient = class {
4407
4736
  () => getApiV1ProjectsByNameAdsStatus({ client: this.heyClient, path: { name: project } })
4408
4737
  );
4409
4738
  }
4739
+ async getAdsAccount(project) {
4740
+ return this.invoke(
4741
+ () => getApiV1ProjectsByNameAdsAccount({ client: this.heyClient, path: { name: project } })
4742
+ );
4743
+ }
4744
+ async searchAdsGeo(project, query) {
4745
+ return this.invoke(
4746
+ () => getApiV1ProjectsByNameAdsGeoSearch({ client: this.heyClient, path: { name: project }, query })
4747
+ );
4748
+ }
4749
+ async getAdsConversionPixels(project) {
4750
+ return this.invoke(
4751
+ () => getApiV1ProjectsByNameAdsConversionsPixels({ client: this.heyClient, path: { name: project } })
4752
+ );
4753
+ }
4754
+ async getAdsConversionEventSettings(project) {
4755
+ return this.invoke(
4756
+ () => getApiV1ProjectsByNameAdsConversionsEventSettings({ client: this.heyClient, path: { name: project } })
4757
+ );
4758
+ }
4410
4759
  async triggerAdsSync(project) {
4411
4760
  return this.invoke(
4412
4761
  () => postApiV1ProjectsByNameAdsSync({ client: this.heyClient, path: { name: project } })
@@ -4427,6 +4776,143 @@ var ApiClient = class {
4427
4776
  () => getApiV1ProjectsByNameAdsSummary({ client: this.heyClient, path: { name: project } })
4428
4777
  );
4429
4778
  }
4779
+ async getAdsOperation(project, operationKey) {
4780
+ return this.invoke(
4781
+ () => getApiV1ProjectsByNameAdsOperationsByOperationKey({
4782
+ client: this.heyClient,
4783
+ path: { name: project, operationKey }
4784
+ })
4785
+ );
4786
+ }
4787
+ async getUnresolvedAdsOperations(project, query) {
4788
+ return this.invoke(
4789
+ () => getApiV1ProjectsByNameAdsOperations({
4790
+ client: this.heyClient,
4791
+ path: { name: project },
4792
+ query: query ? {
4793
+ state: query.state?.join(","),
4794
+ limit: query.limit,
4795
+ cursor: query.cursor
4796
+ } : void 0
4797
+ })
4798
+ );
4799
+ }
4800
+ async reconcileAdsOperation(project, operationKey) {
4801
+ return this.invoke(
4802
+ () => postApiV1ProjectsByNameAdsOperationsByOperationKeyReconcile({
4803
+ client: this.heyClient,
4804
+ path: { name: project, operationKey }
4805
+ })
4806
+ );
4807
+ }
4808
+ async resumeAdsActivation(project, operationKey) {
4809
+ return this.invoke(
4810
+ () => postApiV1ProjectsByNameAdsOperationsByOperationKeyResumeActivation({
4811
+ client: this.heyClient,
4812
+ path: { name: project, operationKey }
4813
+ })
4814
+ );
4815
+ }
4816
+ async createAdsActivationGrant(project, body) {
4817
+ return this.invoke(
4818
+ () => postApiV1ProjectsByNameAdsActivationGrants({
4819
+ client: this.heyClient,
4820
+ path: { name: project },
4821
+ body
4822
+ })
4823
+ );
4824
+ }
4825
+ async revokeAdsActivationGrant(project, grantId) {
4826
+ return this.invoke(
4827
+ () => postApiV1ProjectsByNameAdsActivationGrantsByGrantIdRevoke({
4828
+ client: this.heyClient,
4829
+ path: { name: project, grantId }
4830
+ })
4831
+ );
4832
+ }
4833
+ async uploadAdsImage(project, body) {
4834
+ return this.invoke(
4835
+ () => postApiV1ProjectsByNameAdsFiles({ client: this.heyClient, path: { name: project }, body })
4836
+ );
4837
+ }
4838
+ async createAdsCampaign(project, body) {
4839
+ return this.invoke(
4840
+ () => postApiV1ProjectsByNameAdsCampaigns({ client: this.heyClient, path: { name: project }, body })
4841
+ );
4842
+ }
4843
+ async updateAdsCampaign(project, campaignId, body) {
4844
+ return this.invoke(
4845
+ () => postApiV1ProjectsByNameAdsCampaignsById({
4846
+ client: this.heyClient,
4847
+ path: { name: project, id: campaignId },
4848
+ body
4849
+ })
4850
+ );
4851
+ }
4852
+ async pauseAdsCampaign(project, campaignId, body) {
4853
+ return this.invoke(
4854
+ () => postApiV1ProjectsByNameAdsCampaignsByIdPause({
4855
+ client: this.heyClient,
4856
+ path: { name: project, id: campaignId },
4857
+ body
4858
+ })
4859
+ );
4860
+ }
4861
+ async activateAdsCampaignTree(project, campaignId, body) {
4862
+ return this.invoke(
4863
+ () => postApiV1ProjectsByNameAdsCampaignsByIdActivateTree({
4864
+ client: this.heyClient,
4865
+ path: { name: project, id: campaignId },
4866
+ body
4867
+ })
4868
+ );
4869
+ }
4870
+ async createAdsAdGroup(project, body) {
4871
+ return this.invoke(
4872
+ () => postApiV1ProjectsByNameAdsAdGroups({ client: this.heyClient, path: { name: project }, body })
4873
+ );
4874
+ }
4875
+ async updateAdsAdGroup(project, adGroupId, body) {
4876
+ return this.invoke(
4877
+ () => postApiV1ProjectsByNameAdsAdGroupsById({
4878
+ client: this.heyClient,
4879
+ path: { name: project, id: adGroupId },
4880
+ body
4881
+ })
4882
+ );
4883
+ }
4884
+ async pauseAdsAdGroup(project, adGroupId, body) {
4885
+ return this.invoke(
4886
+ () => postApiV1ProjectsByNameAdsAdGroupsByIdPause({
4887
+ client: this.heyClient,
4888
+ path: { name: project, id: adGroupId },
4889
+ body
4890
+ })
4891
+ );
4892
+ }
4893
+ async createAdsAd(project, body) {
4894
+ return this.invoke(
4895
+ () => postApiV1ProjectsByNameAdsAds({ client: this.heyClient, path: { name: project }, body })
4896
+ );
4897
+ }
4898
+ async updateAdsAd(project, adId, body) {
4899
+ return this.invoke(
4900
+ () => postApiV1ProjectsByNameAdsAdsById({
4901
+ client: this.heyClient,
4902
+ path: { name: project, id: adId },
4903
+ body
4904
+ })
4905
+ );
4906
+ }
4907
+ async pauseAdsAd(project, adId, body) {
4908
+ return this.invoke(
4909
+ () => postApiV1ProjectsByNameAdsAdsByIdPause({
4910
+ client: this.heyClient,
4911
+ path: { name: project, id: adId },
4912
+ body
4913
+ })
4914
+ );
4915
+ }
4430
4916
  async listGbpMetrics(project, opts) {
4431
4917
  return this.invoke(
4432
4918
  () => getApiV1ProjectsByNameGbpMetrics({
@@ -4912,9 +5398,9 @@ var ApiClient = class {
4912
5398
  );
4913
5399
  }
4914
5400
  // ── Technical AEO (site-audit) ──────────────────────────────────────────
4915
- async getTechnicalAeoScore(project) {
5401
+ async getTechnicalAeoScore(project, opts) {
4916
5402
  return this.invoke(
4917
- () => getApiV1ProjectsByNameTechnicalAeo({ client: this.heyClient, path: { name: project } })
5403
+ () => getApiV1ProjectsByNameTechnicalAeo({ client: this.heyClient, path: { name: project }, query: { runId: opts?.runId } })
4918
5404
  );
4919
5405
  }
4920
5406
  async getTechnicalAeoPages(project, opts) {
@@ -4923,6 +5409,7 @@ var ApiClient = class {
4923
5409
  client: this.heyClient,
4924
5410
  path: { name: project },
4925
5411
  query: {
5412
+ runId: opts?.runId,
4926
5413
  status: opts?.status,
4927
5414
  sort: opts?.sort,
4928
5415
  limit: opts?.limit !== void 0 ? String(opts.limit) : void 0,
@@ -5420,8 +5907,19 @@ var runGetInputSchema = z2.object({
5420
5907
  });
5421
5908
  var timelineInputSchema = z2.object({
5422
5909
  project: projectNameSchema,
5423
- location: z2.string().optional().describe("Location label. Use an empty string for locationless results.")
5910
+ location: z2.string().optional().describe("Location label. Use an empty string for locationless results."),
5911
+ limit: z2.number().int().positive().max(100).optional().describe("Restrict history to the most recent N project runs.")
5424
5912
  });
5913
+ var historyFilterShape = {
5914
+ limit: z2.number().int().positive().max(500).optional(),
5915
+ offset: z2.number().int().nonnegative().optional(),
5916
+ since: z2.string().optional().describe("ISO 8601 lower bound."),
5917
+ action: z2.string().optional().describe("Exact audit action filter."),
5918
+ actor: z2.string().optional().describe("Exact actor filter."),
5919
+ entityType: z2.string().optional().describe("Exact entity type filter.")
5920
+ };
5921
+ var projectHistoryInputSchema = z2.object({ project: projectNameSchema, ...historyFilterShape });
5922
+ var globalHistoryInputSchema = z2.object(historyFilterShape);
5425
5923
  var snapshotsListInputSchema = z2.object({
5426
5924
  project: projectNameSchema,
5427
5925
  limit: z2.number().int().positive().max(500).optional(),
@@ -5525,6 +6023,72 @@ var adsInsightsInputSchema = z2.object({
5525
6023
  from: z2.string().optional(),
5526
6024
  to: z2.string().optional()
5527
6025
  });
6026
+ var adsGeoSearchInputSchema = adsGeoSearchQuerySchema.extend({
6027
+ project: projectNameSchema
6028
+ });
6029
+ var adsOperationInputSchema = z2.object({
6030
+ project: projectNameSchema,
6031
+ operationKey: z2.string().min(8).max(128)
6032
+ });
6033
+ var adsOperationResumeActivationInputSchema = adsOperationInputSchema.strict();
6034
+ var adsUnresolvedOperationsInputSchema = adsUnresolvedOperationListQuerySchema.extend({
6035
+ project: projectNameSchema
6036
+ });
6037
+ var adsOperationReconcileInputSchema = adsOperationReconcileRequestSchema.extend({
6038
+ project: projectNameSchema,
6039
+ operationKey: z2.string().min(8).max(128)
6040
+ });
6041
+ var adsImageUploadInputSchema = z2.object({
6042
+ project: projectNameSchema,
6043
+ request: adsImageUploadRequestSchema
6044
+ });
6045
+ var adsCampaignCreateInputSchema = z2.object({
6046
+ project: projectNameSchema,
6047
+ request: adsCampaignCreateRequestSchema
6048
+ });
6049
+ var adsCampaignUpdateInputSchema = z2.object({
6050
+ project: projectNameSchema,
6051
+ campaignId: z2.string().min(1),
6052
+ request: adsCampaignUpdateRequestSchema
6053
+ });
6054
+ var adsCampaignActivateTreeInputSchema = z2.object({
6055
+ project: projectNameSchema,
6056
+ campaignId: z2.string().min(1),
6057
+ request: adsActivateTreeRequestSchema
6058
+ });
6059
+ var adsCampaignPauseInputSchema = z2.object({
6060
+ project: projectNameSchema,
6061
+ campaignId: z2.string().min(1),
6062
+ request: adsPauseRequestSchema
6063
+ });
6064
+ var adsAdGroupCreateInputSchema = z2.object({
6065
+ project: projectNameSchema,
6066
+ request: adsAdGroupCreateRequestSchema
6067
+ });
6068
+ var adsAdGroupUpdateInputSchema = z2.object({
6069
+ project: projectNameSchema,
6070
+ adGroupId: z2.string().min(1),
6071
+ request: adsAdGroupUpdateRequestSchema
6072
+ });
6073
+ var adsAdGroupPauseInputSchema = z2.object({
6074
+ project: projectNameSchema,
6075
+ adGroupId: z2.string().min(1),
6076
+ request: adsPauseRequestSchema
6077
+ });
6078
+ var adsAdCreateInputSchema = z2.object({
6079
+ project: projectNameSchema,
6080
+ request: adsAdCreateRequestSchema
6081
+ });
6082
+ var adsAdUpdateInputSchema = z2.object({
6083
+ project: projectNameSchema,
6084
+ adId: z2.string().min(1),
6085
+ request: adsAdUpdateRequestSchema
6086
+ });
6087
+ var adsAdPauseInputSchema = z2.object({
6088
+ project: projectNameSchema,
6089
+ adId: z2.string().min(1),
6090
+ request: adsPauseRequestSchema
6091
+ });
5528
6092
  var keywordsInputSchema = z2.object({
5529
6093
  project: projectNameSchema,
5530
6094
  request: keywordBatchRequestSchema
@@ -5672,10 +6236,12 @@ var discoveryPromoteInputSchema = z2.object({
5672
6236
  }).optional()
5673
6237
  });
5674
6238
  var technicalAeoScoreInputSchema = z2.object({
5675
- project: projectNameSchema
6239
+ project: projectNameSchema,
6240
+ runId: runIdSchema.optional().describe("Historical site-audit run ID. Omit for the latest audit.")
5676
6241
  });
5677
6242
  var technicalAeoPagesInputSchema = z2.object({
5678
6243
  project: projectNameSchema,
6244
+ runId: runIdSchema.optional().describe("Historical site-audit run ID. Omit for the latest audit."),
5679
6245
  status: z2.enum(["success", "error"]).optional().describe("Filter to successfully-audited or errored pages."),
5680
6246
  sort: z2.enum(["score-asc", "score-desc", "url"]).optional().describe("Sort order. Defaults to score-asc (worst pages first)."),
5681
6247
  limit: z2.number().int().positive().max(500).optional(),
@@ -5834,10 +6400,28 @@ var canonryMcpTools = [
5834
6400
  description: "Get audit history for a Canonry project.",
5835
6401
  access: "read",
5836
6402
  tier: "monitoring",
5837
- inputSchema: projectInputSchema,
6403
+ inputSchema: projectHistoryInputSchema,
5838
6404
  annotations: readAnnotations(),
5839
6405
  openApiOperations: ["GET /api/v1/projects/{name}/history"],
5840
- handler: (client2, input) => client2.getHistory(input.project)
6406
+ handler: (client2, input) => client2.getHistory(input.project, {
6407
+ limit: input.limit,
6408
+ offset: input.offset,
6409
+ since: input.since,
6410
+ action: input.action,
6411
+ actor: input.actor,
6412
+ entityType: input.entityType
6413
+ })
6414
+ }),
6415
+ defineTool({
6416
+ name: "canonry_history_global",
6417
+ title: "Get instance history",
6418
+ description: "Get the instance-wide audit trail, including retained entries whose project was deleted. Full-instance keys only; project-scoped keys remain limited to their project.",
6419
+ access: "read",
6420
+ tier: "monitoring",
6421
+ inputSchema: globalHistoryInputSchema,
6422
+ annotations: readAnnotations(),
6423
+ openApiOperations: ["GET /api/v1/history"],
6424
+ handler: (client2, input) => client2.getGlobalHistory(input)
5841
6425
  }),
5842
6426
  defineTool({
5843
6427
  name: "canonry_runs_list",
@@ -5881,7 +6465,7 @@ var canonryMcpTools = [
5881
6465
  inputSchema: timelineInputSchema,
5882
6466
  annotations: readAnnotations(),
5883
6467
  openApiOperations: ["GET /api/v1/projects/{name}/timeline"],
5884
- handler: (client2, input) => client2.getTimeline(input.project, input.location)
6468
+ handler: (client2, input) => client2.getTimeline(input.project, input.location, input.limit)
5885
6469
  }),
5886
6470
  defineTool({
5887
6471
  name: "canonry_snapshots_list",
@@ -6994,7 +7578,7 @@ var canonryMcpTools = [
6994
7578
  inputSchema: technicalAeoScoreInputSchema,
6995
7579
  annotations: readAnnotations(),
6996
7580
  openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo"],
6997
- handler: (client2, input) => client2.getTechnicalAeoScore(input.project)
7581
+ handler: (client2, input) => client2.getTechnicalAeoScore(input.project, { runId: input.runId })
6998
7582
  }),
6999
7583
  defineTool({
7000
7584
  name: "canonry_technical_aeo_pages",
@@ -7006,6 +7590,7 @@ var canonryMcpTools = [
7006
7590
  annotations: readAnnotations(),
7007
7591
  openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/pages"],
7008
7592
  handler: (client2, input) => client2.getTechnicalAeoPages(input.project, {
7593
+ runId: input.runId,
7009
7594
  status: input.status,
7010
7595
  sort: input.sort,
7011
7596
  limit: input.limit,
@@ -7049,6 +7634,50 @@ var canonryMcpTools = [
7049
7634
  openApiOperations: ["GET /api/v1/projects/{name}/ads/status"],
7050
7635
  handler: (client2, input) => client2.getAdsStatus(input.project)
7051
7636
  }),
7637
+ defineTool({
7638
+ name: "canonry_ads_account",
7639
+ title: "Read the live OpenAI ads account",
7640
+ description: "Read live OpenAI Ads account metadata, currency, timezone, status, and account-integrity review state. Use before planning or launch to confirm the connected advertiser account is the intended one and is eligible to serve.",
7641
+ access: "read",
7642
+ tier: "ads",
7643
+ inputSchema: projectInputSchema,
7644
+ annotations: readAnnotations(true),
7645
+ openApiOperations: ["GET /api/v1/projects/{name}/ads/account"],
7646
+ handler: (client2, input) => client2.getAdsAccount(input.project)
7647
+ }),
7648
+ defineTool({
7649
+ name: "canonry_ads_geo_search",
7650
+ title: "Search OpenAI ads locations",
7651
+ description: "Search the live OpenAI Ads geo catalog by place name. Returns provider location IDs and canonical labels; use those IDs in campaign locationIds instead of inventing or guessing targeting identifiers.",
7652
+ access: "read",
7653
+ tier: "ads",
7654
+ inputSchema: adsGeoSearchInputSchema,
7655
+ annotations: readAnnotations(true),
7656
+ openApiOperations: ["GET /api/v1/projects/{name}/ads/geo/search"],
7657
+ handler: (client2, input) => client2.searchAdsGeo(input.project, { q: input.q, limit: input.limit })
7658
+ }),
7659
+ defineTool({
7660
+ name: "canonry_ads_conversion_pixels",
7661
+ title: "List OpenAI ads conversion pixels",
7662
+ description: "List conversion pixels from the live OpenAI ad account. Use with conversion event settings to verify that measurable conversion infrastructure exists before recommending activation or budget changes.",
7663
+ access: "read",
7664
+ tier: "ads",
7665
+ inputSchema: projectInputSchema,
7666
+ annotations: readAnnotations(true),
7667
+ openApiOperations: ["GET /api/v1/projects/{name}/ads/conversions/pixels"],
7668
+ handler: (client2, input) => client2.getAdsConversionPixels(input.project)
7669
+ }),
7670
+ defineTool({
7671
+ name: "canonry_ads_conversion_event_settings",
7672
+ title: "List OpenAI ads conversion event settings",
7673
+ description: "List live OpenAI Ads conversion event settings, attribution windows, and attached pixel or CAPI sources. Use to select and verify the conversion goal before launch.",
7674
+ access: "read",
7675
+ tier: "ads",
7676
+ inputSchema: projectInputSchema,
7677
+ annotations: readAnnotations(true),
7678
+ openApiOperations: ["GET /api/v1/projects/{name}/ads/conversions/event-settings"],
7679
+ handler: (client2, input) => client2.getAdsConversionEventSettings(input.project)
7680
+ }),
7052
7681
  defineTool({
7053
7682
  name: "canonry_ads_campaigns",
7054
7683
  title: "List synced ad campaigns",
@@ -7082,6 +7711,175 @@ var canonryMcpTools = [
7082
7711
  openApiOperations: ["GET /api/v1/projects/{name}/ads/summary"],
7083
7712
  handler: (client2, input) => client2.getAdsSummary(input.project)
7084
7713
  }),
7714
+ defineTool({
7715
+ name: "canonry_ads_operations_unresolved",
7716
+ title: "List unresolved ads mutation receipts",
7717
+ description: "List pending, unknown, or actively reconciling OpenAI Ads mutation receipts that need recovery. Pass nextCursor back as cursor to advance past permanent rows. Use this before new lifecycle work so an ambiguous earlier outcome is settled instead of retried under another key. Route campaign_tree_activate receipts to canonry_ads_operation_resume_activation; use generic reconciliation only for other supported receipt kinds.",
7718
+ access: "read",
7719
+ tier: "ads",
7720
+ inputSchema: adsUnresolvedOperationsInputSchema,
7721
+ annotations: readAnnotations(),
7722
+ openApiOperations: ["GET /api/v1/projects/{name}/ads/operations"],
7723
+ handler: (client2, input) => client2.getUnresolvedAdsOperations(input.project, {
7724
+ state: input.state,
7725
+ limit: input.limit,
7726
+ cursor: input.cursor
7727
+ })
7728
+ }),
7729
+ defineTool({
7730
+ name: "canonry_ads_operation_get",
7731
+ title: "Get an ads mutation receipt",
7732
+ description: "Read the durable receipt for an OpenAI Ads mutation by its caller-supplied operation key. Never retry a pending or unknown receipt with a new key because the upstream request may already have succeeded. Resume campaign_tree_activate receipts through canonry_ads_operation_resume_activation; send other supported receipt kinds to generic reconciliation.",
7733
+ access: "read",
7734
+ tier: "ads",
7735
+ inputSchema: adsOperationInputSchema,
7736
+ annotations: readAnnotations(),
7737
+ openApiOperations: ["GET /api/v1/projects/{name}/ads/operations/{operationKey}"],
7738
+ handler: (client2, input) => client2.getAdsOperation(input.project, input.operationKey)
7739
+ }),
7740
+ defineTool({
7741
+ name: "canonry_ads_operation_reconcile",
7742
+ title: "Reconcile an ads mutation receipt",
7743
+ description: "Verify a checkpointed provider entity against the receipt-bound OpenAI ad account without retrying the original mutation. Uncheckpointed creates remain unresolved because mutable-field matching cannot prove provenance. This generic tool rejects campaign_tree_activate receipts; use canonry_ads_operation_resume_activation for those.",
7744
+ access: "write",
7745
+ tier: "ads",
7746
+ inputSchema: adsOperationReconcileInputSchema,
7747
+ annotations: writeAnnotations({ idempotentHint: true, openWorldHint: true }),
7748
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/operations/{operationKey}/reconcile"],
7749
+ handler: (client2, input) => client2.reconcileAdsOperation(input.project, input.operationKey)
7750
+ }),
7751
+ defineTool({
7752
+ name: "canonry_ads_operation_resume_activation",
7753
+ title: "Resume an ads activation receipt",
7754
+ description: "Resume recovery for an existing campaign_tree_activate receipt using its durable approval grant and ordered step ledger. The request is bodyless, requires ads.activate on the exact executor key already bound to the grant, and cannot replace the operation, grant, manifest, campaign, or account. Canonry inspects provider state and never blindly resends an ambiguous activation mutation.",
7755
+ access: "write",
7756
+ tier: "ads",
7757
+ inputSchema: adsOperationResumeActivationInputSchema,
7758
+ annotations: writeAnnotations({ idempotentHint: true, destructiveHint: true, openWorldHint: true }),
7759
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/operations/{operationKey}/resume-activation"],
7760
+ handler: (client2, input) => client2.resumeAdsActivation(input.project, input.operationKey)
7761
+ }),
7762
+ defineTool({
7763
+ name: "canonry_ads_image_upload",
7764
+ title: "Upload an ads image from URL",
7765
+ description: "Upload a public HTTPS image URL to the connected OpenAI ad account. The operation key makes a repeated identical request replay its receipt without another upstream upload. Save the returned file entityId for chat-card creation.",
7766
+ access: "write",
7767
+ tier: "ads",
7768
+ inputSchema: adsImageUploadInputSchema,
7769
+ annotations: writeAnnotations({ idempotentHint: true, openWorldHint: true }),
7770
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/files"],
7771
+ handler: (client2, input) => client2.uploadAdsImage(input.project, input.request)
7772
+ }),
7773
+ defineTool({
7774
+ name: "canonry_ads_campaign_create",
7775
+ title: "Create a paused ads campaign",
7776
+ description: "Create an OpenAI Ads campaign PAUSED with an explicit lifetime spend limit and location allowlist. Set biddingType=clicks with one or more provider-issued conversionEventSettingIds for conversion-optimized delivery; omit both for legacy impressions bidding. The server ignores any status concept and always sends paused. Inspect the receipt, then create matching paused ad groups and ads. A human must separately approve the exact tree before this operator can activate it.",
7777
+ access: "write",
7778
+ tier: "ads",
7779
+ inputSchema: adsCampaignCreateInputSchema,
7780
+ annotations: writeAnnotations({ idempotentHint: true, openWorldHint: true }),
7781
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/campaigns"],
7782
+ handler: (client2, input) => client2.createAdsCampaign(input.project, input.request)
7783
+ }),
7784
+ defineTool({
7785
+ name: "canonry_ads_campaign_update",
7786
+ title: "Update an ads campaign",
7787
+ description: "Update a PAUSED campaign copy, dates, lifetime spend limit, or locations without changing status. Active campaigns fail closed: pause first, sync, and use the refreshed upstreamUpdatedAt. A human must approve the exact updated tree before this operator can reactivate it. Uses a durable operation key.",
7788
+ access: "write",
7789
+ tier: "ads",
7790
+ inputSchema: adsCampaignUpdateInputSchema,
7791
+ annotations: writeAnnotations({ idempotentHint: true, destructiveHint: true, openWorldHint: true }),
7792
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/campaigns/{id}"],
7793
+ handler: (client2, input) => client2.updateAdsCampaign(input.project, input.campaignId, input.request)
7794
+ }),
7795
+ defineTool({
7796
+ name: "canonry_ads_campaign_activate_tree",
7797
+ title: "Activate an approved ads campaign tree",
7798
+ description: "Execute one short-lived human approval grant for the exact paused campaign, ad groups, and reviewed ads named by its manifest. The grant is bound to this executor key and manifest hash. Canonry checkpoints every step, activates ads before parents, verifies active state, and rolls back parent-first on failure. This tool cannot create or widen an approval.",
7799
+ access: "write",
7800
+ tier: "ads",
7801
+ inputSchema: adsCampaignActivateTreeInputSchema,
7802
+ annotations: writeAnnotations({ idempotentHint: true, destructiveHint: true, openWorldHint: true }),
7803
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/campaigns/{id}/activate-tree"],
7804
+ handler: (client2, input) => client2.activateAdsCampaignTree(input.project, input.campaignId, input.request)
7805
+ }),
7806
+ defineTool({
7807
+ name: "canonry_ads_campaign_pause",
7808
+ title: "Pause an ads campaign",
7809
+ description: "Pause a campaign immediately. Use this first when spend, conversion tracking, landing-page behavior, or policy status is unsafe. The operation is idempotent through its durable operation key.",
7810
+ access: "write",
7811
+ tier: "ads",
7812
+ inputSchema: adsCampaignPauseInputSchema,
7813
+ annotations: writeAnnotations({ idempotentHint: true, openWorldHint: true }),
7814
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/campaigns/{id}/pause"],
7815
+ handler: (client2, input) => client2.pauseAdsCampaign(input.project, input.campaignId, input.request)
7816
+ }),
7817
+ defineTool({
7818
+ name: "canonry_ads_ad_group_create",
7819
+ title: "Create a paused ads ad group",
7820
+ description: "Create a PAUSED ad group under a reviewed campaign. Context hints describe when the audit offer is useful. Set billingEventType=click under a clicks campaign; omit it for the legacy impression mode. Canonry reads the live parent and rejects a billing/bidding mismatch before mutation.",
7821
+ access: "write",
7822
+ tier: "ads",
7823
+ inputSchema: adsAdGroupCreateInputSchema,
7824
+ annotations: writeAnnotations({ idempotentHint: true, openWorldHint: true }),
7825
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/ad-groups"],
7826
+ handler: (client2, input) => client2.createAdsAdGroup(input.project, input.request)
7827
+ }),
7828
+ defineTool({
7829
+ name: "canonry_ads_ad_group_update",
7830
+ title: "Update an ads ad group",
7831
+ description: "Update a PAUSED ad group name, description, context hints, or max bid without changing its billing event or status. Active ad groups fail closed: pause first, sync, and use the refreshed upstreamUpdatedAt. A human must reactivate after review. Uses a durable operation key.",
7832
+ access: "write",
7833
+ tier: "ads",
7834
+ inputSchema: adsAdGroupUpdateInputSchema,
7835
+ annotations: writeAnnotations({ idempotentHint: true, destructiveHint: true, openWorldHint: true }),
7836
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/ad-groups/{id}"],
7837
+ handler: (client2, input) => client2.updateAdsAdGroup(input.project, input.adGroupId, input.request)
7838
+ }),
7839
+ defineTool({
7840
+ name: "canonry_ads_ad_group_pause",
7841
+ title: "Pause an ads ad group",
7842
+ description: "Pause an ad group through a durable idempotent operation receipt.",
7843
+ access: "write",
7844
+ tier: "ads",
7845
+ inputSchema: adsAdGroupPauseInputSchema,
7846
+ annotations: writeAnnotations({ idempotentHint: true, openWorldHint: true }),
7847
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/ad-groups/{id}/pause"],
7848
+ handler: (client2, input) => client2.pauseAdsAdGroup(input.project, input.adGroupId, input.request)
7849
+ }),
7850
+ defineTool({
7851
+ name: "canonry_ads_ad_create",
7852
+ title: "Create a paused chat-card ad",
7853
+ description: "Create a PAUSED ChatGPT chat-card ad using a previously uploaded file entityId and an HTTPS destination. Title is 3-50 characters and body is at most 100. Activation is deliberately human-only for the beta.",
7854
+ access: "write",
7855
+ tier: "ads",
7856
+ inputSchema: adsAdCreateInputSchema,
7857
+ annotations: writeAnnotations({ idempotentHint: true, openWorldHint: true }),
7858
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/ads"],
7859
+ handler: (client2, input) => client2.createAdsAd(input.project, input.request)
7860
+ }),
7861
+ defineTool({
7862
+ name: "canonry_ads_ad_update",
7863
+ title: "Update a chat-card ad",
7864
+ description: "Update a PAUSED ad name or full chat-card creative without changing status. Active ads fail closed: pause first, sync, and use the refreshed upstreamUpdatedAt. A human must reactivate after review. Uses a durable operation key.",
7865
+ access: "write",
7866
+ tier: "ads",
7867
+ inputSchema: adsAdUpdateInputSchema,
7868
+ annotations: writeAnnotations({ idempotentHint: true, destructiveHint: true, openWorldHint: true }),
7869
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/ads/{id}"],
7870
+ handler: (client2, input) => client2.updateAdsAd(input.project, input.adId, input.request)
7871
+ }),
7872
+ defineTool({
7873
+ name: "canonry_ads_ad_pause",
7874
+ title: "Pause a chat-card ad",
7875
+ description: "Pause an individual ad through a durable idempotent operation receipt.",
7876
+ access: "write",
7877
+ tier: "ads",
7878
+ inputSchema: adsAdPauseInputSchema,
7879
+ annotations: writeAnnotations({ idempotentHint: true, openWorldHint: true }),
7880
+ openApiOperations: ["POST /api/v1/projects/{name}/ads/ads/{id}/pause"],
7881
+ handler: (client2, input) => client2.pauseAdsAd(input.project, input.adId, input.request)
7882
+ }),
7085
7883
  defineTool({
7086
7884
  name: "canonry_ads_sync",
7087
7885
  title: "Trigger ads sync",