@canonry/canonry 4.168.0 → 4.170.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 (27) hide show
  1. package/assets/assets/{AuditHistoryPanel-Dvz6QFtW.js → AuditHistoryPanel-BpIn6E7p.js} +1 -1
  2. package/assets/assets/{BacklinksPage-BHOtOIr5.js → BacklinksPage-BvOWgx1l.js} +1 -1
  3. package/assets/assets/{HistoryPage-Bc5Nx6dX.js → HistoryPage-BXaQyur8.js} +1 -1
  4. package/assets/assets/{MeasurementPropertyPage-D4FIFiWv.js → MeasurementPropertyPage-Buj708lc.js} +1 -1
  5. package/assets/assets/{ProjectPage-CT5ZD7_A.js → ProjectPage-BwC29w2_.js} +1 -1
  6. package/assets/assets/{RunRow-CB2oG45_.js → RunRow-C9hp5yEp.js} +1 -1
  7. package/assets/assets/{RunsPage-OLbocIOY.js → RunsPage-DmkRH1iu.js} +1 -1
  8. package/assets/assets/{SettingsPage-DVdPBrap.js → SettingsPage-BIyuj-gL.js} +1 -1
  9. package/assets/assets/{SiteHealthSection-B1bjMCqY.js → SiteHealthSection-ZlYR3JtG.js} +3 -3
  10. package/assets/assets/{TrafficPage-BUWXjHhw.js → TrafficPage-PxIetTWH.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-DwoFzTu7.js → TrafficSourceDetailPage-BhF_leby.js} +1 -1
  12. package/assets/assets/{extract-error-message-CNH2-nPH.js → extract-error-message-Dd2su-BK.js} +1 -1
  13. package/assets/assets/index-DyjfMyum.js +83 -0
  14. package/assets/assets/{react-sigma_core.esm.min-DLRh4X_G.js → react-sigma_core.esm.min-CsNemdas.js} +1 -1
  15. package/assets/index.html +1 -1
  16. package/dist/{chunk-C4UWZLQX.js → chunk-BMW3AURU.js} +567 -5
  17. package/dist/{chunk-CDACTPTY.js → chunk-CCZNCH7Y.js} +3641 -1154
  18. package/dist/{chunk-TP4KXU3E.js → chunk-HJ7W2LXI.js} +4081 -3069
  19. package/dist/{chunk-76JMZAFZ.js → chunk-HTUI6BSK.js} +2 -2
  20. package/dist/{chunk-R2SZWJDV.js → chunk-NMCLLN5X.js} +3376 -137
  21. package/dist/cli.js +5 -5
  22. package/dist/index.d.ts +132 -2
  23. package/dist/index.js +10 -4
  24. package/dist/{intelligence-service-KBSDKHED.js → intelligence-service-64IPZ4NU.js} +2 -2
  25. package/dist/mcp.js +3 -3
  26. package/package.json +10 -8
  27. package/assets/assets/index-DdXb59Rg.js +0 -83
@@ -1,4 +1,4 @@
1
- import{g as Bt,t as S,r as C}from"./vendor-tanstack-Dock0eH1.js";import{e as Ht,G as Wt}from"./SiteHealthSection-B1bjMCqY.js";import"./index-DdXb59Rg.js";import"./vendor-radix-4UOaVWza.js";import"./vendor-recharts-D8rt5lKn.js";import"./vendor-lucide-nYKv-BB7.js";import"./vendor-markdown-Bn7fRwrx.js";import"./vendor-yaml-GWJz5H2G.js";import"./ChartPrimitives-BoYe2M-i.js";function Vt(r,n){if(typeof r!="object"||!r)return r;var i=r[Symbol.toPrimitive];if(i!==void 0){var e=i.call(r,n);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(r)}function ae(r){var n=Vt(r,"string");return typeof n=="symbol"?n:n+""}function A(r,n){if(!(r instanceof n))throw new TypeError("Cannot call a class as a function")}function He(r,n){for(var i=0;i<n.length;i++){var e=n[i];e.enumerable=e.enumerable||!1,e.configurable=!0,"value"in e&&(e.writable=!0),Object.defineProperty(r,ae(e.key),e)}}function L(r,n,i){return n&&He(r.prototype,n),i&&He(r,i),Object.defineProperty(r,"prototype",{writable:!1}),r}function Q(r){return Q=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},Q(r)}function yt(){try{var r=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(yt=function(){return!!r})()}function jt(r){if(r===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return r}function Zt(r,n){if(n&&(typeof n=="object"||typeof n=="function"))return n;if(n!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return jt(r)}function I(r,n,i){return n=Q(n),Zt(r,yt()?Reflect.construct(n,i||[],Q(r).constructor):n.apply(r,i))}function xe(r,n){return xe=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(i,e){return i.__proto__=e,i},xe(r,n)}function G(r,n){if(typeof n!="function"&&n!==null)throw new TypeError("Super expression must either be null or a function");r.prototype=Object.create(n&&n.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),Object.defineProperty(r,"prototype",{writable:!1}),n&&xe(r,n)}function qt(r){if(Array.isArray(r))return r}function Yt(r,n){var i=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(i!=null){var e,t,a,o,s=[],l=!0,h=!1;try{if(a=(i=i.call(r)).next,n===0){if(Object(i)!==i)return;l=!1}else for(;!(l=(e=a.call(i)).done)&&(s.push(e.value),s.length!==n);l=!0);}catch(u){h=!0,t=u}finally{try{if(!l&&i.return!=null&&(o=i.return(),Object(o)!==o))return}finally{if(h)throw t}}return s}}function Se(r,n){(n==null||n>r.length)&&(n=r.length);for(var i=0,e=Array(n);i<n;i++)e[i]=r[i];return e}function Tt(r,n){if(r){if(typeof r=="string")return Se(r,n);var i={}.toString.call(r).slice(8,-1);return i==="Object"&&r.constructor&&(i=r.constructor.name),i==="Map"||i==="Set"?Array.from(r):i==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Se(r,n):void 0}}function Xt(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
1
+ import{g as Bt,t as S,r as C}from"./vendor-tanstack-Dock0eH1.js";import{e as Ht,G as Wt}from"./SiteHealthSection-ZlYR3JtG.js";import"./index-DyjfMyum.js";import"./vendor-radix-4UOaVWza.js";import"./vendor-recharts-D8rt5lKn.js";import"./vendor-lucide-nYKv-BB7.js";import"./vendor-markdown-Bn7fRwrx.js";import"./vendor-yaml-GWJz5H2G.js";import"./ChartPrimitives-BoYe2M-i.js";function Vt(r,n){if(typeof r!="object"||!r)return r;var i=r[Symbol.toPrimitive];if(i!==void 0){var e=i.call(r,n);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(r)}function ae(r){var n=Vt(r,"string");return typeof n=="symbol"?n:n+""}function A(r,n){if(!(r instanceof n))throw new TypeError("Cannot call a class as a function")}function He(r,n){for(var i=0;i<n.length;i++){var e=n[i];e.enumerable=e.enumerable||!1,e.configurable=!0,"value"in e&&(e.writable=!0),Object.defineProperty(r,ae(e.key),e)}}function L(r,n,i){return n&&He(r.prototype,n),i&&He(r,i),Object.defineProperty(r,"prototype",{writable:!1}),r}function Q(r){return Q=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},Q(r)}function yt(){try{var r=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(yt=function(){return!!r})()}function jt(r){if(r===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return r}function Zt(r,n){if(n&&(typeof n=="object"||typeof n=="function"))return n;if(n!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return jt(r)}function I(r,n,i){return n=Q(n),Zt(r,yt()?Reflect.construct(n,i||[],Q(r).constructor):n.apply(r,i))}function xe(r,n){return xe=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(i,e){return i.__proto__=e,i},xe(r,n)}function G(r,n){if(typeof n!="function"&&n!==null)throw new TypeError("Super expression must either be null or a function");r.prototype=Object.create(n&&n.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),Object.defineProperty(r,"prototype",{writable:!1}),n&&xe(r,n)}function qt(r){if(Array.isArray(r))return r}function Yt(r,n){var i=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(i!=null){var e,t,a,o,s=[],l=!0,h=!1;try{if(a=(i=i.call(r)).next,n===0){if(Object(i)!==i)return;l=!1}else for(;!(l=(e=a.call(i)).done)&&(s.push(e.value),s.length!==n);l=!0);}catch(u){h=!0,t=u}finally{try{if(!l&&i.return!=null&&(o=i.return(),Object(o)!==o))return}finally{if(h)throw t}}return s}}function Se(r,n){(n==null||n>r.length)&&(n=r.length);for(var i=0,e=Array(n);i<n;i++)e[i]=r[i];return e}function Tt(r,n){if(r){if(typeof r=="string")return Se(r,n);var i={}.toString.call(r).slice(8,-1);return i==="Object"&&r.constructor&&(i=r.constructor.name),i==="Map"||i==="Set"?Array.from(r):i==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?Se(r,n):void 0}}function Xt(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
2
2
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function ee(r,n){return qt(r)||Yt(r,n)||Tt(r,n)||Xt()}var pe={black:"#000000",silver:"#C0C0C0",gray:"#808080",grey:"#808080",white:"#FFFFFF",maroon:"#800000",red:"#FF0000",purple:"#800080",fuchsia:"#FF00FF",green:"#008000",lime:"#00FF00",olive:"#808000",yellow:"#FFFF00",navy:"#000080",blue:"#0000FF",teal:"#008080",aqua:"#00FFFF",darkblue:"#00008B",mediumblue:"#0000CD",darkgreen:"#006400",darkcyan:"#008B8B",deepskyblue:"#00BFFF",darkturquoise:"#00CED1",mediumspringgreen:"#00FA9A",springgreen:"#00FF7F",cyan:"#00FFFF",midnightblue:"#191970",dodgerblue:"#1E90FF",lightseagreen:"#20B2AA",forestgreen:"#228B22",seagreen:"#2E8B57",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",limegreen:"#32CD32",mediumseagreen:"#3CB371",turquoise:"#40E0D0",royalblue:"#4169E1",steelblue:"#4682B4",darkslateblue:"#483D8B",mediumturquoise:"#48D1CC",indigo:"#4B0082",darkolivegreen:"#556B2F",cadetblue:"#5F9EA0",cornflowerblue:"#6495ED",rebeccapurple:"#663399",mediumaquamarine:"#66CDAA",dimgray:"#696969",dimgrey:"#696969",slateblue:"#6A5ACD",olivedrab:"#6B8E23",slategray:"#708090",slategrey:"#708090",lightslategray:"#778899",lightslategrey:"#778899",mediumslateblue:"#7B68EE",lawngreen:"#7CFC00",chartreuse:"#7FFF00",aquamarine:"#7FFFD4",skyblue:"#87CEEB",lightskyblue:"#87CEFA",blueviolet:"#8A2BE2",darkred:"#8B0000",darkmagenta:"#8B008B",saddlebrown:"#8B4513",darkseagreen:"#8FBC8F",lightgreen:"#90EE90",mediumpurple:"#9370DB",darkviolet:"#9400D3",palegreen:"#98FB98",darkorchid:"#9932CC",yellowgreen:"#9ACD32",sienna:"#A0522D",brown:"#A52A2A",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",lightblue:"#ADD8E6",greenyellow:"#ADFF2F",paleturquoise:"#AFEEEE",lightsteelblue:"#B0C4DE",powderblue:"#B0E0E6",firebrick:"#B22222",darkgoldenrod:"#B8860B",mediumorchid:"#BA55D3",rosybrown:"#BC8F8F",darkkhaki:"#BDB76B",mediumvioletred:"#C71585",indianred:"#CD5C5C",peru:"#CD853F",chocolate:"#D2691E",tan:"#D2B48C",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",thistle:"#D8BFD8",orchid:"#DA70D6",goldenrod:"#DAA520",palevioletred:"#DB7093",crimson:"#DC143C",gainsboro:"#DCDCDC",plum:"#DDA0DD",burlywood:"#DEB887",lightcyan:"#E0FFFF",lavender:"#E6E6FA",darksalmon:"#E9967A",violet:"#EE82EE",palegoldenrod:"#EEE8AA",lightcoral:"#F08080",khaki:"#F0E68C",aliceblue:"#F0F8FF",honeydew:"#F0FFF0",azure:"#F0FFFF",sandybrown:"#F4A460",wheat:"#F5DEB3",beige:"#F5F5DC",whitesmoke:"#F5F5F5",mintcream:"#F5FFFA",ghostwhite:"#F8F8FF",salmon:"#FA8072",antiquewhite:"#FAEBD7",linen:"#FAF0E6",lightgoldenrodyellow:"#FAFAD2",oldlace:"#FDF5E6",magenta:"#FF00FF",deeppink:"#FF1493",orangered:"#FF4500",tomato:"#FF6347",hotpink:"#FF69B4",coral:"#FF7F50",darkorange:"#FF8C00",lightsalmon:"#FFA07A",orange:"#FFA500",lightpink:"#FFB6C1",pink:"#FFC0CB",gold:"#FFD700",peachpuff:"#FFDAB9",navajowhite:"#FFDEAD",moccasin:"#FFE4B5",bisque:"#FFE4C4",mistyrose:"#FFE4E1",blanchedalmond:"#FFEBCD",papayawhip:"#FFEFD5",lavenderblush:"#FFF0F5",seashell:"#FFF5EE",cornsilk:"#FFF8DC",lemonchiffon:"#FFFACD",floralwhite:"#FFFAF0",snow:"#FFFAFA",lightyellow:"#FFFFE0",ivory:"#FFFFF0"},Ct=new Int8Array(4),be=new Int32Array(Ct.buffer,0,1),$t=new Float32Array(Ct.buffer,0,1),Kt=/^\s*rgba?\s*\(/,Jt=/^\s*rgba?\s*\(\s*([0-9]*)\s*,\s*([0-9]*)\s*,\s*([0-9]*)(?:\s*,\s*(.*)?)?\)\s*$/;function Qt(r){var n=0,i=0,e=0,t=1;if(r[0]==="#")r.length===4?(n=parseInt(r.charAt(1)+r.charAt(1),16),i=parseInt(r.charAt(2)+r.charAt(2),16),e=parseInt(r.charAt(3)+r.charAt(3),16)):(n=parseInt(r.charAt(1)+r.charAt(2),16),i=parseInt(r.charAt(3)+r.charAt(4),16),e=parseInt(r.charAt(5)+r.charAt(6),16)),r.length===9&&(t=parseInt(r.charAt(7)+r.charAt(8),16)/255);else if(Kt.test(r)){var a=r.match(Jt);a&&(n=+a[1],i=+a[2],e=+a[3],a[4]&&(t=+a[4]))}return{r:n,g:i,b:e,a:t}}var J={};for(var le in pe)J[le]=oe(pe[le]),J[pe[le]]=J[le];function Rt(r,n,i,e,t){return be[0]=e<<24|i<<16|n<<8|r,be[0]=be[0]&4278190079,$t[0]}function oe(r){if(r=r.toLowerCase(),typeof J[r]<"u")return J[r];var n=Qt(r),i=n.r,e=n.g,t=n.b,a=n.a;a=a*255|0;var o=Rt(i,e,t,a);return J[r]=o,o}var Ee={};function _t(r){if(typeof Ee[r]<"u")return Ee[r];var n=(r&16711680)>>>16,i=(r&65280)>>>8,e=r&255,t=255,a=Rt(n,i,e,t);return Ee[r]=a,a}function We(r,n,i,e){return i+(n<<8)+(r<<16)}function Ve(r,n,i,e,t,a){var o=Math.floor(i/a*t),s=Math.floor(r.drawingBufferHeight/a-e/a*t),l=new Uint8Array(4);r.bindFramebuffer(r.FRAMEBUFFER,n),r.readPixels(o,s,1,1,r.RGBA,r.UNSIGNED_BYTE,l);var h=ee(l,4),u=h[0],d=h[1],f=h[2],g=h[3];return[u,d,f,g]}function c(r,n,i){return(n=ae(n))in r?Object.defineProperty(r,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):r[n]=i,r}function je(r,n){var i=Object.keys(r);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(r);n&&(e=e.filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable})),i.push.apply(i,e)}return i}function b(r){for(var n=1;n<arguments.length;n++){var i=arguments[n]!=null?arguments[n]:{};n%2?je(Object(i),!0).forEach(function(e){c(r,e,i[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(i)):je(Object(i)).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(i,e))})}return r}function ei(r,n){for(;!{}.hasOwnProperty.call(r,n)&&(r=Q(r))!==null;);return r}function Ae(){return Ae=typeof Reflect<"u"&&Reflect.get?Reflect.get.bind():function(r,n,i){var e=ei(r,n);if(e){var t=Object.getOwnPropertyDescriptor(e,n);return t.get?t.get.call(arguments.length<3?r:i):t.value}},Ae.apply(null,arguments)}function wt(r,n,i,e){var t=Ae(Q(r.prototype),n,i);return typeof t=="function"?function(a){return t.apply(i,a)}:t}function ti(r){return r.normalized?1:r.size}function ye(r){var n=0;return r.forEach(function(i){return n+=ti(i)}),n}function xt(r,n,i){var e=r==="VERTEX"?n.VERTEX_SHADER:n.FRAGMENT_SHADER,t=n.createShader(e);if(t===null)throw new Error("loadShader: error while creating the shader");n.shaderSource(t,i),n.compileShader(t);var a=n.getShaderParameter(t,n.COMPILE_STATUS);if(!a){var o=n.getShaderInfoLog(t);throw n.deleteShader(t),new Error(`loadShader: error while compiling the shader:
3
3
  `.concat(o,`
4
4
  `).concat(i))}return t}function ii(r,n){return xt("VERTEX",r,n)}function ri(r,n){return xt("FRAGMENT",r,n)}function ni(r,n){var i=r.createProgram();if(i===null)throw new Error("loadProgram: error while creating the program.");var e,t;for(e=0,t=n.length;e<t;e++)r.attachShader(i,n[e]);r.linkProgram(i);var a=r.getProgramParameter(i,r.LINK_STATUS);if(!a){var o=r.getProgramInfoLog(i);throw r.deleteProgram(i),new Error("loadProgram: error while linking the program: ".concat(o))}return i}function Ze(r){var n=r.gl,i=r.buffer,e=r.program,t=r.vertexShader,a=r.fragmentShader;n.deleteShader(t),n.deleteShader(a),n.deleteProgram(e),n.deleteBuffer(i)}var qe=`#define PICKING_MODE
package/assets/index.html CHANGED
@@ -12,7 +12,7 @@
12
12
  <link rel="icon" type="image/png" sizes="32x32" href="./favicon-32.png" />
13
13
  <link rel="apple-touch-icon" href="./apple-touch-icon.png" />
14
14
  <title>Canonry</title>
15
- <script type="module" crossorigin src="./assets/index-DdXb59Rg.js"></script>
15
+ <script type="module" crossorigin src="./assets/index-DyjfMyum.js"></script>
16
16
  <link rel="modulepreload" crossorigin href="./assets/vendor-tanstack-Dock0eH1.js">
17
17
  <link rel="modulepreload" crossorigin href="./assets/vendor-radix-4UOaVWza.js">
18
18
  <link rel="modulepreload" crossorigin href="./assets/vendor-recharts-D8rt5lKn.js">
@@ -88,12 +88,13 @@ import {
88
88
  trafficConnectWordpressRequestSchema,
89
89
  trafficEventKindSchema,
90
90
  trafficSeriesGranularitySchema
91
- } from "./chunk-TP4KXU3E.js";
91
+ } from "./chunk-HJ7W2LXI.js";
92
92
 
93
93
  // src/config.ts
94
94
  import fs from "fs";
95
95
  import path from "path";
96
96
  import os from "os";
97
+ import crypto from "crypto";
97
98
  import { parse, stringify } from "yaml";
98
99
  function normalizeGoogleConfig(config) {
99
100
  if (!config.google) return;
@@ -105,6 +106,24 @@ function normalizeGoogleConfig(config) {
105
106
  scopes: connection.scopes ?? []
106
107
  }));
107
108
  }
109
+ function normalizeGoogleMarketingConfig(config) {
110
+ if (config.googleAds) {
111
+ config.googleAds.connections = (config.googleAds.connections ?? []).map((connection) => ({
112
+ ...connection,
113
+ refreshToken: connection.refreshToken ?? null,
114
+ tokenExpiresAt: connection.tokenExpiresAt ?? null,
115
+ scopes: connection.scopes ?? []
116
+ }));
117
+ }
118
+ if (config.gtm) {
119
+ config.gtm.connections = (config.gtm.connections ?? []).map((connection) => ({
120
+ ...connection,
121
+ refreshToken: connection.refreshToken ?? null,
122
+ tokenExpiresAt: connection.tokenExpiresAt ?? null,
123
+ scopes: connection.scopes ?? []
124
+ }));
125
+ }
126
+ }
108
127
  function normalizeWordpressConfig(config) {
109
128
  if (!config.wordpress) return;
110
129
  config.wordpress.connections = (config.wordpress.connections ?? []).map((connection) => ({
@@ -166,6 +185,7 @@ Do not write config.yaml by hand; use "canonry init", "canonry settings", or "ca
166
185
  };
167
186
  }
168
187
  normalizeGoogleConfig(parsed);
188
+ normalizeGoogleMarketingConfig(parsed);
169
189
  normalizeWordpressConfig(parsed);
170
190
  normalizeCloudflareTrafficConfig(parsed);
171
191
  const portOverride = process.env.CANONRY_PORT?.trim();
@@ -228,6 +248,35 @@ function loadConfigRaw() {
228
248
  return null;
229
249
  }
230
250
  }
251
+ function writeConfigAtomically(configPath, contents) {
252
+ const directory = path.dirname(configPath);
253
+ const temporaryPath = path.join(
254
+ directory,
255
+ `.${path.basename(configPath)}.${process.pid}.${crypto.randomUUID()}.tmp`
256
+ );
257
+ let descriptor;
258
+ try {
259
+ descriptor = fs.openSync(temporaryPath, "wx", 384);
260
+ fs.fchmodSync(descriptor, 384);
261
+ fs.writeFileSync(descriptor, contents, { encoding: "utf-8" });
262
+ fs.fsyncSync(descriptor);
263
+ fs.closeSync(descriptor);
264
+ descriptor = void 0;
265
+ fs.renameSync(temporaryPath, configPath);
266
+ } catch (error) {
267
+ if (descriptor !== void 0) {
268
+ try {
269
+ fs.closeSync(descriptor);
270
+ } catch {
271
+ }
272
+ }
273
+ try {
274
+ fs.unlinkSync(temporaryPath);
275
+ } catch {
276
+ }
277
+ throw error;
278
+ }
279
+ }
231
280
  function saveConfig(config) {
232
281
  const configDir = getConfigDir();
233
282
  if (!fs.existsSync(configDir)) {
@@ -254,7 +303,7 @@ function saveConfig(config) {
254
303
  }
255
304
  }
256
305
  const yaml = stringify(merged);
257
- fs.writeFileSync(configPath, yaml, { encoding: "utf-8", mode: 384 });
306
+ writeConfigAtomically(configPath, yaml);
258
307
  }
259
308
  function saveConfigPatch(patch) {
260
309
  const configDir = getConfigDir();
@@ -284,7 +333,7 @@ function saveConfigPatch(patch) {
284
333
  }
285
334
  }
286
335
  const yaml = stringify(merged);
287
- fs.writeFileSync(configPath, yaml, { encoding: "utf-8", mode: 384 });
336
+ writeConfigAtomically(configPath, yaml);
288
337
  }
289
338
  function configExists() {
290
339
  return fs.existsSync(getConfigPath());
@@ -2839,6 +2888,318 @@ var getApiV1ProjectsByNameRunsByRunIdBrowserDiff = (options) => {
2839
2888
  ...options
2840
2889
  });
2841
2890
  };
2891
+ var getApiV1ProjectsByNameGoogleAdsStatus = (options) => {
2892
+ return (options.client ?? client).get({
2893
+ security: [
2894
+ {
2895
+ scheme: "bearer",
2896
+ type: "http"
2897
+ }
2898
+ ],
2899
+ url: "/api/v1/projects/{name}/google-ads/status",
2900
+ ...options
2901
+ });
2902
+ };
2903
+ var postApiV1ProjectsByNameGoogleAdsOauthConnect = (options) => {
2904
+ return (options.client ?? client).post({
2905
+ security: [
2906
+ {
2907
+ scheme: "bearer",
2908
+ type: "http"
2909
+ }
2910
+ ],
2911
+ url: "/api/v1/projects/{name}/google-ads/oauth/connect",
2912
+ ...options,
2913
+ headers: {
2914
+ "Content-Type": "application/json",
2915
+ ...options.headers
2916
+ }
2917
+ });
2918
+ };
2919
+ var getApiV1ProjectsByNameGoogleAdsCustomers = (options) => {
2920
+ return (options.client ?? client).get({
2921
+ security: [
2922
+ {
2923
+ scheme: "bearer",
2924
+ type: "http"
2925
+ }
2926
+ ],
2927
+ url: "/api/v1/projects/{name}/google-ads/customers",
2928
+ ...options
2929
+ });
2930
+ };
2931
+ var putApiV1ProjectsByNameGoogleAdsSelection = (options) => {
2932
+ return (options.client ?? client).put({
2933
+ security: [
2934
+ {
2935
+ scheme: "bearer",
2936
+ type: "http"
2937
+ }
2938
+ ],
2939
+ url: "/api/v1/projects/{name}/google-ads/selection",
2940
+ ...options,
2941
+ headers: {
2942
+ "Content-Type": "application/json",
2943
+ ...options.headers
2944
+ }
2945
+ });
2946
+ };
2947
+ var postApiV1ProjectsByNameGoogleAdsSync = (options) => {
2948
+ return (options.client ?? client).post({
2949
+ security: [
2950
+ {
2951
+ scheme: "bearer",
2952
+ type: "http"
2953
+ }
2954
+ ],
2955
+ url: "/api/v1/projects/{name}/google-ads/sync",
2956
+ ...options
2957
+ });
2958
+ };
2959
+ var getApiV1ProjectsByNameGoogleAdsSnapshots = (options) => {
2960
+ return (options.client ?? client).get({
2961
+ security: [
2962
+ {
2963
+ scheme: "bearer",
2964
+ type: "http"
2965
+ }
2966
+ ],
2967
+ url: "/api/v1/projects/{name}/google-ads/snapshots",
2968
+ ...options
2969
+ });
2970
+ };
2971
+ var getApiV1ProjectsByNameGoogleAdsSnapshotsBySnapshotId = (options) => {
2972
+ return (options.client ?? client).get({
2973
+ security: [
2974
+ {
2975
+ scheme: "bearer",
2976
+ type: "http"
2977
+ }
2978
+ ],
2979
+ url: "/api/v1/projects/{name}/google-ads/snapshots/{snapshotId}",
2980
+ ...options
2981
+ });
2982
+ };
2983
+ var deleteApiV1ProjectsByNameGoogleAdsConnection = (options) => {
2984
+ return (options.client ?? client).delete({
2985
+ security: [
2986
+ {
2987
+ scheme: "bearer",
2988
+ type: "http"
2989
+ }
2990
+ ],
2991
+ url: "/api/v1/projects/{name}/google-ads/connection",
2992
+ ...options
2993
+ });
2994
+ };
2995
+ var getApiV1ProjectsByNameGtmStatus = (options) => {
2996
+ return (options.client ?? client).get({
2997
+ security: [
2998
+ {
2999
+ scheme: "bearer",
3000
+ type: "http"
3001
+ }
3002
+ ],
3003
+ url: "/api/v1/projects/{name}/gtm/status",
3004
+ ...options
3005
+ });
3006
+ };
3007
+ var postApiV1ProjectsByNameGtmOauthConnect = (options) => {
3008
+ return (options.client ?? client).post({
3009
+ security: [
3010
+ {
3011
+ scheme: "bearer",
3012
+ type: "http"
3013
+ }
3014
+ ],
3015
+ url: "/api/v1/projects/{name}/gtm/oauth/connect",
3016
+ ...options,
3017
+ headers: {
3018
+ "Content-Type": "application/json",
3019
+ ...options.headers
3020
+ }
3021
+ });
3022
+ };
3023
+ var getApiV1ProjectsByNameGtmAccounts = (options) => {
3024
+ return (options.client ?? client).get({
3025
+ security: [
3026
+ {
3027
+ scheme: "bearer",
3028
+ type: "http"
3029
+ }
3030
+ ],
3031
+ url: "/api/v1/projects/{name}/gtm/accounts",
3032
+ ...options
3033
+ });
3034
+ };
3035
+ var getApiV1ProjectsByNameGtmAccountsByAccountIdContainers = (options) => {
3036
+ return (options.client ?? client).get({
3037
+ security: [
3038
+ {
3039
+ scheme: "bearer",
3040
+ type: "http"
3041
+ }
3042
+ ],
3043
+ url: "/api/v1/projects/{name}/gtm/accounts/{accountId}/containers",
3044
+ ...options
3045
+ });
3046
+ };
3047
+ var getApiV1ProjectsByNameGtmAccountsByAccountIdContainersByContainerIdWorkspaces = (options) => {
3048
+ return (options.client ?? client).get({
3049
+ security: [
3050
+ {
3051
+ scheme: "bearer",
3052
+ type: "http"
3053
+ }
3054
+ ],
3055
+ url: "/api/v1/projects/{name}/gtm/accounts/{accountId}/containers/{containerId}/workspaces",
3056
+ ...options
3057
+ });
3058
+ };
3059
+ var putApiV1ProjectsByNameGtmSelection = (options) => {
3060
+ return (options.client ?? client).put({
3061
+ security: [
3062
+ {
3063
+ scheme: "bearer",
3064
+ type: "http"
3065
+ }
3066
+ ],
3067
+ url: "/api/v1/projects/{name}/gtm/selection",
3068
+ ...options,
3069
+ headers: {
3070
+ "Content-Type": "application/json",
3071
+ ...options.headers
3072
+ }
3073
+ });
3074
+ };
3075
+ var postApiV1ProjectsByNameGtmSync = (options) => {
3076
+ return (options.client ?? client).post({
3077
+ security: [
3078
+ {
3079
+ scheme: "bearer",
3080
+ type: "http"
3081
+ }
3082
+ ],
3083
+ url: "/api/v1/projects/{name}/gtm/sync",
3084
+ ...options
3085
+ });
3086
+ };
3087
+ var getApiV1ProjectsByNameGtmSnapshots = (options) => {
3088
+ return (options.client ?? client).get({
3089
+ security: [
3090
+ {
3091
+ scheme: "bearer",
3092
+ type: "http"
3093
+ }
3094
+ ],
3095
+ url: "/api/v1/projects/{name}/gtm/snapshots",
3096
+ ...options
3097
+ });
3098
+ };
3099
+ var getApiV1ProjectsByNameGtmSnapshotsBySnapshotId = (options) => {
3100
+ return (options.client ?? client).get({
3101
+ security: [
3102
+ {
3103
+ scheme: "bearer",
3104
+ type: "http"
3105
+ }
3106
+ ],
3107
+ url: "/api/v1/projects/{name}/gtm/snapshots/{snapshotId}",
3108
+ ...options
3109
+ });
3110
+ };
3111
+ var deleteApiV1ProjectsByNameGtmConnection = (options) => {
3112
+ return (options.client ?? client).delete({
3113
+ security: [
3114
+ {
3115
+ scheme: "bearer",
3116
+ type: "http"
3117
+ }
3118
+ ],
3119
+ url: "/api/v1/projects/{name}/gtm/connection",
3120
+ ...options
3121
+ });
3122
+ };
3123
+ var getApiV1ProjectsByNameConversionTrackingContracts = (options) => {
3124
+ return (options.client ?? client).get({
3125
+ security: [
3126
+ {
3127
+ scheme: "bearer",
3128
+ type: "http"
3129
+ }
3130
+ ],
3131
+ url: "/api/v1/projects/{name}/conversion-tracking/contracts",
3132
+ ...options
3133
+ });
3134
+ };
3135
+ var postApiV1ProjectsByNameConversionTrackingContracts = (options) => {
3136
+ return (options.client ?? client).post({
3137
+ security: [
3138
+ {
3139
+ scheme: "bearer",
3140
+ type: "http"
3141
+ }
3142
+ ],
3143
+ url: "/api/v1/projects/{name}/conversion-tracking/contracts",
3144
+ ...options,
3145
+ headers: {
3146
+ "Content-Type": "application/json",
3147
+ ...options.headers
3148
+ }
3149
+ });
3150
+ };
3151
+ var deleteApiV1ProjectsByNameConversionTrackingContractsByContractId = (options) => {
3152
+ return (options.client ?? client).delete({
3153
+ security: [
3154
+ {
3155
+ scheme: "bearer",
3156
+ type: "http"
3157
+ }
3158
+ ],
3159
+ url: "/api/v1/projects/{name}/conversion-tracking/contracts/{contractId}",
3160
+ ...options
3161
+ });
3162
+ };
3163
+ var getApiV1ProjectsByNameConversionTrackingContractsByContractId = (options) => {
3164
+ return (options.client ?? client).get({
3165
+ security: [
3166
+ {
3167
+ scheme: "bearer",
3168
+ type: "http"
3169
+ }
3170
+ ],
3171
+ url: "/api/v1/projects/{name}/conversion-tracking/contracts/{contractId}",
3172
+ ...options
3173
+ });
3174
+ };
3175
+ var putApiV1ProjectsByNameConversionTrackingContractsByContractId = (options) => {
3176
+ return (options.client ?? client).put({
3177
+ security: [
3178
+ {
3179
+ scheme: "bearer",
3180
+ type: "http"
3181
+ }
3182
+ ],
3183
+ url: "/api/v1/projects/{name}/conversion-tracking/contracts/{contractId}",
3184
+ ...options,
3185
+ headers: {
3186
+ "Content-Type": "application/json",
3187
+ ...options.headers
3188
+ }
3189
+ });
3190
+ };
3191
+ var getApiV1ProjectsByNameConversionTrackingContractsByContractIdIntegrity = (options) => {
3192
+ return (options.client ?? client).get({
3193
+ security: [
3194
+ {
3195
+ scheme: "bearer",
3196
+ type: "http"
3197
+ }
3198
+ ],
3199
+ url: "/api/v1/projects/{name}/conversion-tracking/contracts/{contractId}/integrity",
3200
+ ...options
3201
+ });
3202
+ };
2842
3203
  var getApiV1ProjectsByNameGoogleConnections = (options) => {
2843
3204
  return (options.client ?? client).get({
2844
3205
  security: [
@@ -6381,6 +6742,207 @@ var ApiClient = class {
6381
6742
  })
6382
6743
  );
6383
6744
  }
6745
+ // ── Google Marketing: Google Ads + Google Tag Manager ──────────────────
6746
+ async connectGoogleAds(project, request) {
6747
+ return this.invoke(
6748
+ () => postApiV1ProjectsByNameGoogleAdsOauthConnect({
6749
+ client: this.heyClient,
6750
+ path: { name: project },
6751
+ body: request
6752
+ })
6753
+ );
6754
+ }
6755
+ async connectGtm(project, request) {
6756
+ return this.invoke(
6757
+ () => postApiV1ProjectsByNameGtmOauthConnect({
6758
+ client: this.heyClient,
6759
+ path: { name: project },
6760
+ body: request
6761
+ })
6762
+ );
6763
+ }
6764
+ async disconnectGoogleAds(project) {
6765
+ return this.invoke(
6766
+ () => deleteApiV1ProjectsByNameGoogleAdsConnection({
6767
+ client: this.heyClient,
6768
+ path: { name: project }
6769
+ })
6770
+ );
6771
+ }
6772
+ async disconnectGtm(project) {
6773
+ return this.invoke(
6774
+ () => deleteApiV1ProjectsByNameGtmConnection({
6775
+ client: this.heyClient,
6776
+ path: { name: project }
6777
+ })
6778
+ );
6779
+ }
6780
+ async getGoogleAdsStatus(project) {
6781
+ return this.invoke(
6782
+ () => getApiV1ProjectsByNameGoogleAdsStatus({
6783
+ client: this.heyClient,
6784
+ path: { name: project }
6785
+ })
6786
+ );
6787
+ }
6788
+ async listGoogleAdsCustomers(project) {
6789
+ return this.invoke(
6790
+ () => getApiV1ProjectsByNameGoogleAdsCustomers({
6791
+ client: this.heyClient,
6792
+ path: { name: project }
6793
+ })
6794
+ );
6795
+ }
6796
+ async setGoogleAdsSelection(project, request) {
6797
+ return this.invoke(
6798
+ () => putApiV1ProjectsByNameGoogleAdsSelection({
6799
+ client: this.heyClient,
6800
+ path: { name: project },
6801
+ body: request
6802
+ })
6803
+ );
6804
+ }
6805
+ async triggerGoogleAdsSync(project) {
6806
+ return this.invoke(
6807
+ () => postApiV1ProjectsByNameGoogleAdsSync({
6808
+ client: this.heyClient,
6809
+ path: { name: project }
6810
+ })
6811
+ );
6812
+ }
6813
+ async listGoogleAdsSnapshots(project, query) {
6814
+ return this.invoke(
6815
+ () => getApiV1ProjectsByNameGoogleAdsSnapshots({
6816
+ client: this.heyClient,
6817
+ path: { name: project },
6818
+ query
6819
+ })
6820
+ );
6821
+ }
6822
+ async getGoogleAdsSnapshot(project, snapshotId) {
6823
+ return this.invoke(
6824
+ () => getApiV1ProjectsByNameGoogleAdsSnapshotsBySnapshotId({
6825
+ client: this.heyClient,
6826
+ path: { name: project, snapshotId }
6827
+ })
6828
+ );
6829
+ }
6830
+ async getGtmStatus(project) {
6831
+ return this.invoke(
6832
+ () => getApiV1ProjectsByNameGtmStatus({
6833
+ client: this.heyClient,
6834
+ path: { name: project }
6835
+ })
6836
+ );
6837
+ }
6838
+ async listGtmAccounts(project) {
6839
+ return this.invoke(
6840
+ () => getApiV1ProjectsByNameGtmAccounts({
6841
+ client: this.heyClient,
6842
+ path: { name: project }
6843
+ })
6844
+ );
6845
+ }
6846
+ async listGtmContainers(project, accountId) {
6847
+ return this.invoke(
6848
+ () => getApiV1ProjectsByNameGtmAccountsByAccountIdContainers({
6849
+ client: this.heyClient,
6850
+ path: { name: project, accountId }
6851
+ })
6852
+ );
6853
+ }
6854
+ async listGtmWorkspaces(project, accountId, containerId) {
6855
+ return this.invoke(
6856
+ () => getApiV1ProjectsByNameGtmAccountsByAccountIdContainersByContainerIdWorkspaces({
6857
+ client: this.heyClient,
6858
+ path: { name: project, accountId, containerId }
6859
+ })
6860
+ );
6861
+ }
6862
+ async setGtmSelection(project, request) {
6863
+ return this.invoke(
6864
+ () => putApiV1ProjectsByNameGtmSelection({
6865
+ client: this.heyClient,
6866
+ path: { name: project },
6867
+ body: request
6868
+ })
6869
+ );
6870
+ }
6871
+ async triggerGtmSync(project) {
6872
+ return this.invoke(
6873
+ () => postApiV1ProjectsByNameGtmSync({
6874
+ client: this.heyClient,
6875
+ path: { name: project }
6876
+ })
6877
+ );
6878
+ }
6879
+ async listGtmSnapshots(project, query) {
6880
+ return this.invoke(
6881
+ () => getApiV1ProjectsByNameGtmSnapshots({
6882
+ client: this.heyClient,
6883
+ path: { name: project },
6884
+ query
6885
+ })
6886
+ );
6887
+ }
6888
+ async getGtmSnapshot(project, snapshotId) {
6889
+ return this.invoke(
6890
+ () => getApiV1ProjectsByNameGtmSnapshotsBySnapshotId({
6891
+ client: this.heyClient,
6892
+ path: { name: project, snapshotId }
6893
+ })
6894
+ );
6895
+ }
6896
+ async listConversionTrackingContracts(project) {
6897
+ return this.invoke(
6898
+ () => getApiV1ProjectsByNameConversionTrackingContracts({
6899
+ client: this.heyClient,
6900
+ path: { name: project }
6901
+ })
6902
+ );
6903
+ }
6904
+ async getConversionTrackingContract(project, contractId) {
6905
+ return this.invoke(
6906
+ () => getApiV1ProjectsByNameConversionTrackingContractsByContractId({
6907
+ client: this.heyClient,
6908
+ path: { name: project, contractId }
6909
+ })
6910
+ );
6911
+ }
6912
+ async createConversionTrackingContract(project, request) {
6913
+ return this.invoke(
6914
+ () => postApiV1ProjectsByNameConversionTrackingContracts({
6915
+ client: this.heyClient,
6916
+ path: { name: project },
6917
+ body: request
6918
+ })
6919
+ );
6920
+ }
6921
+ async updateConversionTrackingContract(project, contractId, request) {
6922
+ return this.invoke(
6923
+ () => putApiV1ProjectsByNameConversionTrackingContractsByContractId({
6924
+ client: this.heyClient,
6925
+ path: { name: project, contractId },
6926
+ body: request
6927
+ })
6928
+ );
6929
+ }
6930
+ async deleteConversionTrackingContract(project, contractId) {
6931
+ await this.invoke(
6932
+ () => deleteApiV1ProjectsByNameConversionTrackingContractsByContractId({
6933
+ client: this.heyClient,
6934
+ path: { name: project, contractId }
6935
+ })
6936
+ );
6937
+ }
6938
+ async getConversionTrackingIntegrity(project, contractId) {
6939
+ return this.invoke(
6940
+ () => getApiV1ProjectsByNameConversionTrackingContractsByContractIdIntegrity({
6941
+ client: this.heyClient,
6942
+ path: { name: project, contractId }
6943
+ })
6944
+ );
6945
+ }
6384
6946
  // Google Business Profile (Phase 1: auth + discovery)
6385
6947
  async listGbpAccounts(project) {
6386
6948
  return this.invoke(
@@ -7816,7 +8378,7 @@ var _require = createRequire(import.meta.url);
7816
8378
  var PACKAGE_VERSION = _require("../package.json").version;
7817
8379
 
7818
8380
  // src/commands/skills.ts
7819
- import crypto from "crypto";
8381
+ import crypto2 from "crypto";
7820
8382
  import fs2 from "fs";
7821
8383
  import os2 from "os";
7822
8384
  import path2 from "path";
@@ -7871,7 +8433,7 @@ function walkRelative(dir, prefix = "") {
7871
8433
  return out.sort();
7872
8434
  }
7873
8435
  function sha256File(filePath) {
7874
- return crypto.createHash("sha256").update(fs2.readFileSync(filePath)).digest("hex");
8436
+ return crypto2.createHash("sha256").update(fs2.readFileSync(filePath)).digest("hex");
7875
8437
  }
7876
8438
  function readSkillManifest(skillDir) {
7877
8439
  try {