@ainyc/canonry 4.180.5 → 4.180.7
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.
- package/assets/assets/{AuditHistoryPanel-CdM_9qX1.js → AuditHistoryPanel-B1lmI7wm.js} +1 -1
- package/assets/assets/{BacklinksPage-DWWMPSPn.js → BacklinksPage-Bw61uQu8.js} +1 -1
- package/assets/assets/{HistoryPage-m7TtGFBQ.js → HistoryPage-D8z9-NkT.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-CYBfBtEz.js → MeasurementPropertyPage-CXX9GFj8.js} +1 -1
- package/assets/assets/{ProjectPage-CNPcNrIR.js → ProjectPage-BaN_rvoV.js} +6 -6
- package/assets/assets/{RunRow-O4u505Fc.js → RunRow-DXHy16T3.js} +1 -1
- package/assets/assets/{RunsPage-CCzFT4X0.js → RunsPage-D2aE620i.js} +1 -1
- package/assets/assets/{SettingsPage-DOmE3JbU.js → SettingsPage-BiiFqarS.js} +1 -1
- package/assets/assets/{SiteHealthSection-BZFVE2h9.js → SiteHealthSection-DCH2Ejtc.js} +3 -3
- package/assets/assets/TrafficPage-DFHWgvkU.js +1 -0
- package/assets/assets/{TrafficSourceDetailPage-Qd5Zpx_8.js → TrafficSourceDetailPage-DxjyRL8Y.js} +1 -1
- package/assets/assets/{extract-error-message-B0bdIDVc.js → extract-error-message-BdXUZQW9.js} +1 -1
- package/assets/assets/{index-BD8hYPvq.css → index-BuEq5Rhg.css} +1 -1
- package/assets/assets/{index-HmdbSL4h.js → index-CSictO9U.js} +10 -10
- package/assets/assets/{react-sigma_core.esm.min-DXCrX1Ie.js → react-sigma_core.esm.min-DAcOZae7.js} +1 -1
- package/assets/index.html +2 -2
- package/dist/{chunk-JJIESVNL.js → chunk-CWXPBQR5.js} +1 -1
- package/dist/{chunk-UESVOQRS.js → chunk-RXXZ5BU5.js} +23 -2
- package/dist/{chunk-6LSP7ODK.js → chunk-VZO6CLHY.js} +4 -4
- package/dist/{chunk-EC2O3LHD.js → chunk-WJFBNCVD.js} +115 -41
- package/dist/{chunk-DK23XZ6C.js → chunk-XYTSKRO3.js} +2 -2
- package/dist/cli.js +14 -20
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-NJUFIWAO.js → intelligence-service-MEPYXRBS.js} +2 -2
- package/dist/mcp.js +3 -3
- package/package.json +8 -8
- package/assets/assets/TrafficPage-DYxOEVbW.js +0 -1
package/assets/assets/{react-sigma_core.esm.min-DXCrX1Ie.js → react-sigma_core.esm.min-DAcOZae7.js}
RENAMED
|
@@ -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-
|
|
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-DCH2Ejtc.js";import"./index-CSictO9U.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-DG35TyhH.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,14 +12,14 @@
|
|
|
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-
|
|
15
|
+
<script type="module" crossorigin src="./assets/index-CSictO9U.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">
|
|
19
19
|
<link rel="modulepreload" crossorigin href="./assets/vendor-lucide-nYKv-BB7.js">
|
|
20
20
|
<link rel="modulepreload" crossorigin href="./assets/vendor-markdown-Bn7fRwrx.js">
|
|
21
21
|
<link rel="modulepreload" crossorigin href="./assets/vendor-yaml-GWJz5H2G.js">
|
|
22
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
22
|
+
<link rel="stylesheet" crossorigin href="./assets/index-BuEq5Rhg.css">
|
|
23
23
|
</head>
|
|
24
24
|
<body>
|
|
25
25
|
<div id="root"></div>
|
|
@@ -12370,7 +12370,12 @@ var ga4TrafficSummaryDtoSchema = z39.object({
|
|
|
12370
12370
|
/** Total social sessions (session-scoped, no cross-dimension dedup needed). */
|
|
12371
12371
|
socialSessions: z39.number(),
|
|
12372
12372
|
/** Total social users (session-scoped, no cross-dimension dedup needed). */
|
|
12373
|
-
|
|
12373
|
+
/**
|
|
12374
|
+
* @deprecated Never emitted. ga_social_referrals stores users as GA's
|
|
12375
|
+
* COUNT DISTINCT at (date, source, medium, channel group), so summing it
|
|
12376
|
+
* across the window counts a returning visitor once per day.
|
|
12377
|
+
*/
|
|
12378
|
+
socialUsers: z39.number().optional(),
|
|
12374
12379
|
/** Five disjoint buckets used for the channel breakdown. Known AI session-source matches are removed from their native GA4 bucket before shares are computed. */
|
|
12375
12380
|
channelBreakdown: ga4ChannelBreakdownDtoSchema,
|
|
12376
12381
|
/** Organic sessions as a percentage of total sessions (0–100, rounded). */
|
|
@@ -13706,7 +13711,13 @@ var gaTrafficSectionSchema = z47.object({
|
|
|
13706
13711
|
topLandingPages: z47.array(z47.object({
|
|
13707
13712
|
page: z47.string(),
|
|
13708
13713
|
sessions: z47.number(),
|
|
13709
|
-
|
|
13714
|
+
/**
|
|
13715
|
+
* @deprecated Never emitted. A per-landing-page user count cannot be
|
|
13716
|
+
* summed: GA evaluates users as a COUNT DISTINCT at the requested grain,
|
|
13717
|
+
* so a visitor is counted once per page and per day. Kept optional so
|
|
13718
|
+
* existing consumers keep parsing.
|
|
13719
|
+
*/
|
|
13720
|
+
users: z47.number().optional(),
|
|
13710
13721
|
organicSessions: z47.number()
|
|
13711
13722
|
})),
|
|
13712
13723
|
channelBreakdown: z47.array(z47.object({
|
|
@@ -13840,6 +13851,14 @@ var serverActivitySectionSchema = z47.object({
|
|
|
13840
13851
|
topCrawledPaths: z47.array(z47.object({
|
|
13841
13852
|
path: z47.string(),
|
|
13842
13853
|
verifiedHits: z47.number(),
|
|
13854
|
+
/**
|
|
13855
|
+
* Hits from a crawler that identified itself but whose source IP could not
|
|
13856
|
+
* be matched against the operator's published ranges. Additive, not an
|
|
13857
|
+
* alternative: some log sources carry no client IP at all (Vercel request
|
|
13858
|
+
* logs, for one), so for those projects every hit lands here and a
|
|
13859
|
+
* verified-only view reports zero against real crawl activity.
|
|
13860
|
+
*/
|
|
13861
|
+
unverifiedHits: z47.number().default(0),
|
|
13843
13862
|
/** How many distinct AI operators crawled this path in the window. */
|
|
13844
13863
|
distinctOperators: z47.number()
|
|
13845
13864
|
})),
|
|
@@ -13853,6 +13872,8 @@ var serverActivitySectionSchema = z47.object({
|
|
|
13853
13872
|
dailyTrend: z47.array(z47.object({
|
|
13854
13873
|
date: z47.string(),
|
|
13855
13874
|
verifiedCrawlerHits: z47.number(),
|
|
13875
|
+
/** See topCrawledPaths.unverifiedHits. Plotted alongside, never instead. */
|
|
13876
|
+
unverifiedCrawlerHits: z47.number().default(0),
|
|
13856
13877
|
userFetchHits: z47.number(),
|
|
13857
13878
|
referralArrivals: z47.number()
|
|
13858
13879
|
})),
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
loadConfig,
|
|
12
12
|
loadConfigRaw,
|
|
13
13
|
saveConfigPatch
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-CWXPBQR5.js";
|
|
15
15
|
import {
|
|
16
16
|
CC_CACHE_DIR,
|
|
17
17
|
DUCKDB_SPEC,
|
|
@@ -157,7 +157,7 @@ import {
|
|
|
157
157
|
siteCrawlSnapshots,
|
|
158
158
|
toAlertView,
|
|
159
159
|
usageCounters
|
|
160
|
-
} from "./chunk-
|
|
160
|
+
} from "./chunk-WJFBNCVD.js";
|
|
161
161
|
import {
|
|
162
162
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
163
163
|
AGENT_PROVIDER_IDS,
|
|
@@ -295,7 +295,7 @@ import {
|
|
|
295
295
|
validationError,
|
|
296
296
|
winnabilityClassLabel,
|
|
297
297
|
withRetry
|
|
298
|
-
} from "./chunk-
|
|
298
|
+
} from "./chunk-RXXZ5BU5.js";
|
|
299
299
|
|
|
300
300
|
// src/telemetry.ts
|
|
301
301
|
import crypto from "crypto";
|
|
@@ -11866,7 +11866,7 @@ function readStoredGroundingSources(rawResponse) {
|
|
|
11866
11866
|
return result;
|
|
11867
11867
|
}
|
|
11868
11868
|
async function backfillInsightsCommand(project, opts) {
|
|
11869
|
-
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-
|
|
11869
|
+
const { IntelligenceService: IntelligenceService2 } = await import("./intelligence-service-MEPYXRBS.js");
|
|
11870
11870
|
const config = loadConfig();
|
|
11871
11871
|
const db = createClient(config.database);
|
|
11872
11872
|
migrate(db);
|
|
@@ -643,7 +643,7 @@ import {
|
|
|
643
643
|
wordpressSchemaDeployResultDtoSchema,
|
|
644
644
|
wordpressSchemaStatusResultDtoSchema,
|
|
645
645
|
wordpressStatusDtoSchema
|
|
646
|
-
} from "./chunk-
|
|
646
|
+
} from "./chunk-RXXZ5BU5.js";
|
|
647
647
|
|
|
648
648
|
// src/intelligence-service.ts
|
|
649
649
|
import { eq as eq62, desc as desc27, asc as asc11, and as and51, ne as ne8, or as or14, inArray as inArray22, gte as gte15, lte as lte13, isNull as isNull9, sql as sql25, exists } from "drizzle-orm";
|
|
@@ -22762,8 +22762,9 @@ function loadOrchestratorInput(db, project, locationFilter = void 0, gscWindowDa
|
|
|
22762
22762
|
sitemapUrls: [],
|
|
22763
22763
|
wpPosts: []
|
|
22764
22764
|
});
|
|
22765
|
-
const
|
|
22766
|
-
const
|
|
22765
|
+
const gaWindow = resolveContentGaWindow(db, projectId, gscWindowDays);
|
|
22766
|
+
const gaTrafficByPage = buildGaTrafficByPage(db, projectId, gaWindow);
|
|
22767
|
+
const totalAiReferralSessions = sumAiReferralSessions(db, projectId, gaWindow);
|
|
22767
22768
|
const domainClasses = loadDomainClasses(db, projectId);
|
|
22768
22769
|
return {
|
|
22769
22770
|
projectId,
|
|
@@ -22890,24 +22891,42 @@ function listGa4LandingPagesForProject(db, projectId) {
|
|
|
22890
22891
|
const rows = db.selectDistinct({ landingPage: gaTrafficSnapshots.landingPage }).from(gaTrafficSnapshots).where(eq27(gaTrafficSnapshots.projectId, projectId)).all();
|
|
22891
22892
|
return rows.map((r) => r.landingPage);
|
|
22892
22893
|
}
|
|
22893
|
-
function buildGaTrafficByPage(db, projectId) {
|
|
22894
|
+
function buildGaTrafficByPage(db, projectId, window) {
|
|
22895
|
+
if (!window) return /* @__PURE__ */ new Map();
|
|
22894
22896
|
const rows = db.select({
|
|
22895
22897
|
landingPage: gaTrafficSnapshots.landingPage,
|
|
22896
|
-
|
|
22897
|
-
}).from(gaTrafficSnapshots).where(
|
|
22898
|
+
organicSessions: gaTrafficSnapshots.organicSessions
|
|
22899
|
+
}).from(gaTrafficSnapshots).where(and22(
|
|
22900
|
+
eq27(gaTrafficSnapshots.projectId, projectId),
|
|
22901
|
+
gte5(gaTrafficSnapshots.date, window.startDate),
|
|
22902
|
+
lte3(gaTrafficSnapshots.date, window.endDate)
|
|
22903
|
+
)).all();
|
|
22898
22904
|
const map = /* @__PURE__ */ new Map();
|
|
22899
22905
|
for (const row of rows) {
|
|
22900
22906
|
const path8 = extractPath2(row.landingPage);
|
|
22901
22907
|
if (!path8) continue;
|
|
22902
|
-
map.set(path8, (map.get(path8) ?? 0) + (row.
|
|
22908
|
+
map.set(path8, (map.get(path8) ?? 0) + (row.organicSessions ?? 0));
|
|
22903
22909
|
}
|
|
22904
22910
|
return map;
|
|
22905
22911
|
}
|
|
22906
|
-
function
|
|
22912
|
+
function resolveContentGaWindow(db, projectId, windowDays2) {
|
|
22913
|
+
const latest = db.select({ date: gaTrafficSnapshots.date }).from(gaTrafficSnapshots).where(eq27(gaTrafficSnapshots.projectId, projectId)).orderBy(desc10(gaTrafficSnapshots.date)).limit(1).get();
|
|
22914
|
+
if (!latest?.date) return null;
|
|
22915
|
+
const end = /* @__PURE__ */ new Date(`${latest.date}T00:00:00Z`);
|
|
22916
|
+
end.setUTCDate(end.getUTCDate() - (Math.max(1, windowDays2) - 1));
|
|
22917
|
+
return { startDate: end.toISOString().slice(0, 10), endDate: latest.date };
|
|
22918
|
+
}
|
|
22919
|
+
function sumAiReferralSessions(db, projectId, window) {
|
|
22920
|
+
if (!window) return 0;
|
|
22907
22921
|
const rows = db.select({ sessions: gaAiReferrals.sessions }).from(gaAiReferrals).where(
|
|
22908
22922
|
and22(
|
|
22909
22923
|
eq27(gaAiReferrals.projectId, projectId),
|
|
22910
|
-
eq27(gaAiReferrals.sourceDimension, "session")
|
|
22924
|
+
eq27(gaAiReferrals.sourceDimension, "session"),
|
|
22925
|
+
// Bounded for the same reason the per-page read is: this scales every
|
|
22926
|
+
// opportunity score, so a lifetime total quietly weights the ranking
|
|
22927
|
+
// toward whatever was true months ago.
|
|
22928
|
+
gte5(gaAiReferrals.date, window.startDate),
|
|
22929
|
+
lte3(gaAiReferrals.date, window.endDate)
|
|
22911
22930
|
)
|
|
22912
22931
|
).all();
|
|
22913
22932
|
return rows.reduce((acc, r) => acc + (r.sessions ?? 0), 0);
|
|
@@ -25056,7 +25075,6 @@ function renderGa(report) {
|
|
|
25056
25075
|
<tr>
|
|
25057
25076
|
<td class="page-cell">${formatLandingPageHtml(p.page)}</td>
|
|
25058
25077
|
<td class="numeric">${formatNumber(p.sessions)}</td>
|
|
25059
|
-
<td class="numeric">${formatNumber(p.users)}</td>
|
|
25060
25078
|
<td class="numeric">${formatNumber(p.organicSessions)}</td>
|
|
25061
25079
|
</tr>`).join("");
|
|
25062
25080
|
const channelBars = renderShareBars(
|
|
@@ -25078,7 +25096,7 @@ function renderGa(report) {
|
|
|
25078
25096
|
</div>
|
|
25079
25097
|
<div class="chart-card"><h3>Top landing pages</h3>
|
|
25080
25098
|
<table class="report-table">
|
|
25081
|
-
<thead><tr><th>Page</th><th class="numeric">Sessions</th><th class="numeric">
|
|
25099
|
+
<thead><tr><th>Page</th><th class="numeric">Sessions</th><th class="numeric">Organic</th></tr></thead>
|
|
25082
25100
|
<tbody>${pageRows}</tbody>
|
|
25083
25101
|
</table>
|
|
25084
25102
|
</div>
|
|
@@ -25269,7 +25287,8 @@ function renderServerActivity(report, audience) {
|
|
|
25269
25287
|
const pathRows = sa.topCrawledPaths.map((p) => `
|
|
25270
25288
|
<tr>
|
|
25271
25289
|
<td class="page-cell">${formatLandingPageHtml(p.path)}</td>
|
|
25272
|
-
<td class="numeric">${formatNumber(p.verifiedHits)}</td>
|
|
25290
|
+
<td class="numeric">${formatNumber(p.verifiedHits + (p.unverifiedHits ?? 0))}</td>
|
|
25291
|
+
<td class="numeric meta">${formatNumber(p.verifiedHits)}</td>
|
|
25273
25292
|
<td class="numeric">${p.distinctOperators}</td>
|
|
25274
25293
|
</tr>`).join("");
|
|
25275
25294
|
const referralProductRows = sa.referralProducts.map((p) => `
|
|
@@ -25324,7 +25343,7 @@ function renderServerActivity(report, audience) {
|
|
|
25324
25343
|
${pathRows ? `<div class="chart-card"><h3>Top crawled paths</h3>
|
|
25325
25344
|
<p class="meta">Pages AI bots fetched most often (verified only, last ${windowLabel}).</p>
|
|
25326
25345
|
<table class="report-table">
|
|
25327
|
-
<thead><tr><th>Path</th><th class="numeric">Verified
|
|
25346
|
+
<thead><tr><th>Path</th><th class="numeric">Hits</th><th class="numeric">Verified</th><th class="numeric">Distinct operators</th></tr></thead>
|
|
25328
25347
|
<tbody>${pathRows}</tbody>
|
|
25329
25348
|
</table>
|
|
25330
25349
|
</div>` : ""}
|
|
@@ -26026,11 +26045,9 @@ function buildGscSection(db, projectId, projectBrandNames, canonicalDomain, trac
|
|
|
26026
26045
|
).all();
|
|
26027
26046
|
const dailyTotals = readGscDailyTotals(db, projectId, startDate, maxDate);
|
|
26028
26047
|
if (rows.length === 0 && dailyTotals.length === 0) return null;
|
|
26029
|
-
let dimensionedClicks = 0;
|
|
26030
26048
|
const queryDayAgg = /* @__PURE__ */ new Map();
|
|
26031
26049
|
const dimensionedTrendAgg = /* @__PURE__ */ new Map();
|
|
26032
26050
|
for (const r of rows) {
|
|
26033
|
-
dimensionedClicks += r.clicks;
|
|
26034
26051
|
const dayKey = `${r.date} ${r.query}`;
|
|
26035
26052
|
const q = queryDayAgg.get(dayKey) ?? { date: r.date, query: r.query, clicks: 0, impressions: 0, weightedPositionSum: 0 };
|
|
26036
26053
|
q.clicks += r.clicks;
|
|
@@ -26089,11 +26106,12 @@ function buildGscSection(db, projectId, projectBrandNames, canonicalDomain, trac
|
|
|
26089
26106
|
bucket.impressions += agg.impressions;
|
|
26090
26107
|
categoryAgg.set(cat, bucket);
|
|
26091
26108
|
}
|
|
26109
|
+
const categoryTotalClicks = queryTotals.reduce((sum, q) => sum + q.clicks, 0);
|
|
26092
26110
|
const categoryBreakdown = [...categoryAgg.entries()].map(([category, agg]) => ({
|
|
26093
26111
|
category,
|
|
26094
26112
|
clicks: agg.clicks,
|
|
26095
26113
|
impressions: agg.impressions,
|
|
26096
|
-
sharePct:
|
|
26114
|
+
sharePct: categoryTotalClicks > 0 ? Math.round(agg.clicks / categoryTotalClicks * 100) : 0
|
|
26097
26115
|
})).sort((a, b) => b.clicks - a.clicks);
|
|
26098
26116
|
const periodStart = trend[0]?.date ?? "";
|
|
26099
26117
|
const periodEnd = trend.at(-1)?.date ?? "";
|
|
@@ -26154,7 +26172,6 @@ function buildGaSection(db, projectId, windowDays2) {
|
|
|
26154
26172
|
const topLandingPages = [...pageAgg.entries()].map(([page2, data]) => ({
|
|
26155
26173
|
page: page2,
|
|
26156
26174
|
sessions: data.sessions,
|
|
26157
|
-
users: data.users,
|
|
26158
26175
|
organicSessions: data.organic
|
|
26159
26176
|
})).sort((a, b) => b.sessions - a.sessions).slice(0, TOP_LANDING_PAGES_LIMIT);
|
|
26160
26177
|
const aiConditions = [
|
|
@@ -26215,8 +26232,13 @@ function buildGaSection(db, projectId, windowDays2) {
|
|
|
26215
26232
|
channelBreakdown
|
|
26216
26233
|
};
|
|
26217
26234
|
}
|
|
26218
|
-
function buildSocialReferrals(db, projectId) {
|
|
26219
|
-
const
|
|
26235
|
+
function buildSocialReferrals(db, projectId, windowDays2) {
|
|
26236
|
+
const window = resolveAiReferralWindow(db, projectId, windowDays2);
|
|
26237
|
+
const rows = db.select().from(gaSocialReferrals).where(and24(
|
|
26238
|
+
eq29(gaSocialReferrals.projectId, projectId),
|
|
26239
|
+
gte6(gaSocialReferrals.date, window.start),
|
|
26240
|
+
lte4(gaSocialReferrals.date, window.end)
|
|
26241
|
+
)).all();
|
|
26220
26242
|
if (rows.length === 0) return null;
|
|
26221
26243
|
let total = 0;
|
|
26222
26244
|
let organic = 0;
|
|
@@ -26427,7 +26449,6 @@ function buildServerActivity(db, projectId, windowDays2) {
|
|
|
26427
26449
|
}).from(crawlerEventsHourly).where(
|
|
26428
26450
|
and24(
|
|
26429
26451
|
eq29(crawlerEventsHourly.projectId, projectId),
|
|
26430
|
-
eq29(crawlerEventsHourly.verificationStatus, VerificationStatuses.verified),
|
|
26431
26452
|
gte6(crawlerEventsHourly.tsHour, priorStart),
|
|
26432
26453
|
lt6(crawlerEventsHourly.tsHour, headlineStart)
|
|
26433
26454
|
)
|
|
@@ -26482,25 +26503,26 @@ function buildServerActivity(db, projectId, windowDays2) {
|
|
|
26482
26503
|
unverifiedHits: v.unverified,
|
|
26483
26504
|
userFetchHits: v.userFetch,
|
|
26484
26505
|
referralArrivals: v.referrals,
|
|
26485
|
-
deltaPct: deltaPercent(v.verified, v.prior)
|
|
26506
|
+
deltaPct: deltaPercent(v.verified + v.unverified, v.prior)
|
|
26486
26507
|
})).sort(
|
|
26487
26508
|
(a, b) => b.verifiedHits - a.verifiedHits || b.userFetchHits - a.userFetchHits || b.unverifiedHits - a.unverifiedHits || b.referralArrivals - a.referralArrivals
|
|
26488
26509
|
);
|
|
26489
26510
|
const topPathsRows = db.select({
|
|
26490
26511
|
path: crawlerEventsHourly.pathNormalized,
|
|
26491
|
-
|
|
26512
|
+
verifiedHits: sql10`COALESCE(SUM(CASE WHEN ${crawlerEventsHourly.verificationStatus} = ${VerificationStatuses.verified} THEN ${crawlerEventsHourly.hits} ELSE 0 END), 0)`,
|
|
26513
|
+
unverifiedHits: sql10`COALESCE(SUM(CASE WHEN ${crawlerEventsHourly.verificationStatus} <> ${VerificationStatuses.verified} THEN ${crawlerEventsHourly.hits} ELSE 0 END), 0)`,
|
|
26492
26514
|
operators: sql10`COUNT(DISTINCT ${crawlerEventsHourly.operator})`
|
|
26493
26515
|
}).from(crawlerEventsHourly).where(
|
|
26494
26516
|
and24(
|
|
26495
26517
|
eq29(crawlerEventsHourly.projectId, projectId),
|
|
26496
|
-
eq29(crawlerEventsHourly.verificationStatus, VerificationStatuses.verified),
|
|
26497
26518
|
gte6(crawlerEventsHourly.tsHour, headlineStart),
|
|
26498
26519
|
lte4(crawlerEventsHourly.tsHour, headlineEnd)
|
|
26499
26520
|
)
|
|
26500
26521
|
).groupBy(crawlerEventsHourly.pathNormalized).orderBy(desc12(sql10`SUM(${crawlerEventsHourly.hits})`)).limit(SERVER_ACTIVITY_TOP_PATHS_LIMIT).all();
|
|
26501
26522
|
const topCrawledPaths = topPathsRows.map((r) => ({
|
|
26502
26523
|
path: r.path,
|
|
26503
|
-
verifiedHits: Number(r.
|
|
26524
|
+
verifiedHits: Number(r.verifiedHits),
|
|
26525
|
+
unverifiedHits: Number(r.unverifiedHits),
|
|
26504
26526
|
distinctOperators: Number(r.operators)
|
|
26505
26527
|
}));
|
|
26506
26528
|
const referralProductsRows = db.select({
|
|
@@ -26539,11 +26561,11 @@ function buildServerActivity(db, projectId, windowDays2) {
|
|
|
26539
26561
|
}));
|
|
26540
26562
|
const crawlerTrendRows = db.select({
|
|
26541
26563
|
date: sql10`SUBSTR(${crawlerEventsHourly.tsHour}, 1, 10)`,
|
|
26542
|
-
|
|
26564
|
+
verifiedHits: sql10`COALESCE(SUM(CASE WHEN ${crawlerEventsHourly.verificationStatus} = ${VerificationStatuses.verified} THEN ${crawlerEventsHourly.hits} ELSE 0 END), 0)`,
|
|
26565
|
+
unverifiedHits: sql10`COALESCE(SUM(CASE WHEN ${crawlerEventsHourly.verificationStatus} <> ${VerificationStatuses.verified} THEN ${crawlerEventsHourly.hits} ELSE 0 END), 0)`
|
|
26543
26566
|
}).from(crawlerEventsHourly).where(
|
|
26544
26567
|
and24(
|
|
26545
26568
|
eq29(crawlerEventsHourly.projectId, projectId),
|
|
26546
|
-
eq29(crawlerEventsHourly.verificationStatus, VerificationStatuses.verified),
|
|
26547
26569
|
gte6(crawlerEventsHourly.tsHour, trendStart),
|
|
26548
26570
|
lte4(crawlerEventsHourly.tsHour, headlineEnd)
|
|
26549
26571
|
)
|
|
@@ -26569,11 +26591,12 @@ function buildServerActivity(db, projectId, windowDays2) {
|
|
|
26569
26591
|
lte4(aiUserFetchEventsHourly.tsHour, headlineEnd)
|
|
26570
26592
|
)
|
|
26571
26593
|
).groupBy(sql10`SUBSTR(${aiUserFetchEventsHourly.tsHour}, 1, 10)`).all();
|
|
26572
|
-
const emptyTrendEntry = () => ({ verifiedCrawlerHits: 0, userFetchHits: 0, referralArrivals: 0 });
|
|
26594
|
+
const emptyTrendEntry = () => ({ verifiedCrawlerHits: 0, unverifiedCrawlerHits: 0, userFetchHits: 0, referralArrivals: 0 });
|
|
26573
26595
|
const dailyTrendMap = /* @__PURE__ */ new Map();
|
|
26574
26596
|
for (const r of crawlerTrendRows) {
|
|
26575
26597
|
const e = dailyTrendMap.get(r.date) ?? emptyTrendEntry();
|
|
26576
|
-
e.verifiedCrawlerHits += Number(r.
|
|
26598
|
+
e.verifiedCrawlerHits += Number(r.verifiedHits);
|
|
26599
|
+
e.unverifiedCrawlerHits += Number(r.unverifiedHits);
|
|
26577
26600
|
dailyTrendMap.set(r.date, e);
|
|
26578
26601
|
}
|
|
26579
26602
|
for (const r of userFetchTrendRows) {
|
|
@@ -27323,7 +27346,7 @@ function buildProjectReport(db, projectName, periodDays) {
|
|
|
27323
27346
|
periodDays
|
|
27324
27347
|
);
|
|
27325
27348
|
const gaSection = buildGaSection(db, project.id, periodDays);
|
|
27326
|
-
const socialSection = buildSocialReferrals(db, project.id);
|
|
27349
|
+
const socialSection = buildSocialReferrals(db, project.id, periodDays);
|
|
27327
27350
|
const aiReferralsSection = buildAiReferrals(db, project.id, periodDays);
|
|
27328
27351
|
const serverActivitySection = buildServerActivity(db, project.id, periodDays);
|
|
27329
27352
|
const indexingHealthSection = buildIndexingHealth(db, project.id);
|
|
@@ -50261,12 +50284,15 @@ async function ga4Routes(app, opts) {
|
|
|
50261
50284
|
source: gaSocialReferrals.source,
|
|
50262
50285
|
medium: gaSocialReferrals.medium,
|
|
50263
50286
|
channelGroup: gaSocialReferrals.channelGroup,
|
|
50264
|
-
|
|
50265
|
-
|
|
50287
|
+
// No `users`. ga_social_referrals is keyed
|
|
50288
|
+
// (project, date, source, medium, channel_group) and its users column
|
|
50289
|
+
// is GA's COUNT DISTINCT at that grain, so summing over the window's
|
|
50290
|
+
// dates counts a returning visitor once per day they returned. Same
|
|
50291
|
+
// conclusion the AI-referral surfaces reached in 4.135.0.
|
|
50292
|
+
sessions: sql18`SUM(${gaSocialReferrals.sessions})`
|
|
50266
50293
|
}).from(gaSocialReferrals).where(and38(...socialConditions)).groupBy(gaSocialReferrals.source, gaSocialReferrals.medium, gaSocialReferrals.channelGroup).orderBy(sql18`SUM(${gaSocialReferrals.sessions}) DESC`).all();
|
|
50267
50294
|
const socialTotals = app.db.select({
|
|
50268
|
-
sessions: sql18`SUM(${gaSocialReferrals.sessions})
|
|
50269
|
-
users: sql18`SUM(${gaSocialReferrals.users})`
|
|
50295
|
+
sessions: sql18`SUM(${gaSocialReferrals.sessions})`
|
|
50270
50296
|
}).from(gaSocialReferrals).where(and38(...socialConditions)).get();
|
|
50271
50297
|
const latestSync = app.db.select({ syncedAt: gaTrafficSummaries.syncedAt }).from(gaTrafficSummaries).where(eq46(gaTrafficSummaries.projectId, project.id)).orderBy(desc21(gaTrafficSummaries.syncedAt)).limit(1).get();
|
|
50272
50298
|
const total = summaryRow?.totalSessions ?? 0;
|
|
@@ -50330,11 +50356,9 @@ async function ga4Routes(app, opts) {
|
|
|
50330
50356
|
source: r.source,
|
|
50331
50357
|
medium: r.medium,
|
|
50332
50358
|
channelGroup: r.channelGroup,
|
|
50333
|
-
sessions: r.sessions ?? 0
|
|
50334
|
-
users: r.users ?? 0
|
|
50359
|
+
sessions: r.sessions ?? 0
|
|
50335
50360
|
})),
|
|
50336
50361
|
socialSessions,
|
|
50337
|
-
socialUsers: socialTotals?.users ?? 0,
|
|
50338
50362
|
channelBreakdown,
|
|
50339
50363
|
organicSharePct: total > 0 ? Math.round(totalOrganicSessions / total * 100) : 0,
|
|
50340
50364
|
aiSharePct: total > 0 ? Math.round(aiSummary.deduped.sessions / total * 100) : 0,
|
|
@@ -50385,8 +50409,11 @@ async function ga4Routes(app, opts) {
|
|
|
50385
50409
|
trafficClass: gaAiReferrals.trafficClass,
|
|
50386
50410
|
landingPage: sql18`COALESCE(${gaAiReferrals.landingPageNormalized}, ${gaAiReferrals.landingPage})`,
|
|
50387
50411
|
sourceDimension: gaAiReferrals.sourceDimension,
|
|
50388
|
-
|
|
50389
|
-
users
|
|
50412
|
+
// No `users`: ga-ai-referral-aggregation states the rule for this
|
|
50413
|
+
// table, that there is no grain at which the stored users column may be
|
|
50414
|
+
// added up. ga4AiReferralDtoSchema.users was deprecated for this in
|
|
50415
|
+
// 4.135.0; the history endpoint kept emitting one.
|
|
50416
|
+
sessions: sql18`SUM(${gaAiReferrals.sessions})`
|
|
50390
50417
|
}).from(gaAiReferrals).where(and38(...conditions)).groupBy(
|
|
50391
50418
|
gaAiReferrals.date,
|
|
50392
50419
|
gaAiReferrals.source,
|
|
@@ -79388,6 +79415,12 @@ function parseGbpInsightId(id) {
|
|
|
79388
79415
|
if (parts.length !== 4 || parts[1] !== "gbp") return null;
|
|
79389
79416
|
return { location: parts[2], slot: gbpInsightSlot(parts[3]) };
|
|
79390
79417
|
}
|
|
79418
|
+
var SEVERITY_GSC_WINDOW_DAYS = 30;
|
|
79419
|
+
function severityGscWindow(endDate) {
|
|
79420
|
+
const end = /* @__PURE__ */ new Date(`${endDate}T00:00:00Z`);
|
|
79421
|
+
end.setUTCDate(end.getUTCDate() - (SEVERITY_GSC_WINDOW_DAYS - 1));
|
|
79422
|
+
return { startDate: end.toISOString().slice(0, 10), endDate };
|
|
79423
|
+
}
|
|
79391
79424
|
var IntelligenceService = class {
|
|
79392
79425
|
constructor(db) {
|
|
79393
79426
|
this.db = db;
|
|
@@ -79867,6 +79900,42 @@ var IntelligenceService = class {
|
|
|
79867
79900
|
});
|
|
79868
79901
|
log.info("intelligence.persisted", { runId, insights: result.insights.length });
|
|
79869
79902
|
}
|
|
79903
|
+
/**
|
|
79904
|
+
* Per-(date, query) rows folded from the page-keyed table, for days the
|
|
79905
|
+
* accurate per-query table has not backfilled. Impressions here are a page
|
|
79906
|
+
* fanout sum and therefore an over-count; this exists only so an un-backfilled
|
|
79907
|
+
* day reads as "some demand" rather than "none".
|
|
79908
|
+
*/
|
|
79909
|
+
readGscPageSummedFallback(projectId, window) {
|
|
79910
|
+
const rows = this.db.select({
|
|
79911
|
+
date: gscSearchData.date,
|
|
79912
|
+
query: gscSearchData.query,
|
|
79913
|
+
clicks: gscSearchData.clicks,
|
|
79914
|
+
impressions: gscSearchData.impressions,
|
|
79915
|
+
position: gscSearchData.position
|
|
79916
|
+
}).from(gscSearchData).where(and51(
|
|
79917
|
+
eq62(gscSearchData.projectId, projectId),
|
|
79918
|
+
gte15(gscSearchData.date, window.startDate),
|
|
79919
|
+
lte13(gscSearchData.date, window.endDate)
|
|
79920
|
+
)).all();
|
|
79921
|
+
const byDay = /* @__PURE__ */ new Map();
|
|
79922
|
+
for (const r of rows) {
|
|
79923
|
+
if (!r.query) continue;
|
|
79924
|
+
const key = `${r.date}\0${r.query}`;
|
|
79925
|
+
const acc = byDay.get(key) ?? { date: r.date, query: r.query, clicks: 0, impressions: 0, weighted: 0 };
|
|
79926
|
+
acc.clicks += r.clicks;
|
|
79927
|
+
acc.impressions += r.impressions;
|
|
79928
|
+
acc.weighted += (Number(r.position) || 0) * r.impressions;
|
|
79929
|
+
byDay.set(key, acc);
|
|
79930
|
+
}
|
|
79931
|
+
return [...byDay.values()].map((a) => ({
|
|
79932
|
+
date: a.date,
|
|
79933
|
+
query: a.query,
|
|
79934
|
+
clicks: a.clicks,
|
|
79935
|
+
impressions: a.impressions,
|
|
79936
|
+
position: a.impressions > 0 ? a.weighted / a.impressions : 0
|
|
79937
|
+
}));
|
|
79938
|
+
}
|
|
79870
79939
|
/**
|
|
79871
79940
|
* Apply severity tiering to the insights of an AnalysisResult and return a
|
|
79872
79941
|
* new result. Wraps `applySeverityTiering` so callers (analyzeAndPersist,
|
|
@@ -79886,10 +79955,15 @@ var IntelligenceService = class {
|
|
|
79886
79955
|
applySeverityTiering(rawInsights, excludeRunId, projectId) {
|
|
79887
79956
|
const regressions = rawInsights.filter((i) => i.type === "regression");
|
|
79888
79957
|
if (regressions.length === 0) return rawInsights;
|
|
79889
|
-
const
|
|
79890
|
-
const
|
|
79958
|
+
const gscEnd = readLatestGscDataDate(this.db, projectId);
|
|
79959
|
+
const gscWindow = gscEnd ? severityGscWindow(gscEnd) : null;
|
|
79960
|
+
const gscTotals = gscWindow ? mergeGscQueryTotalsWithFallback(
|
|
79961
|
+
readGscQueryDailyRows(this.db, projectId, gscWindow.startDate, gscWindow.endDate),
|
|
79962
|
+
this.readGscPageSummedFallback(projectId, gscWindow)
|
|
79963
|
+
) : [];
|
|
79964
|
+
const gscConnected = gscEnd !== null;
|
|
79891
79965
|
const gscImpressionsByQuery = /* @__PURE__ */ new Map();
|
|
79892
|
-
for (const row of
|
|
79966
|
+
for (const row of gscTotals) {
|
|
79893
79967
|
const key = row.query.toLowerCase();
|
|
79894
79968
|
gscImpressionsByQuery.set(key, (gscImpressionsByQuery.get(key) ?? 0) + row.impressions);
|
|
79895
79969
|
}
|
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
installSkills,
|
|
6
6
|
loadConfigRaw,
|
|
7
7
|
saveConfigPatch
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-CWXPBQR5.js";
|
|
9
9
|
import {
|
|
10
10
|
SKILL_MANIFEST_FILENAME,
|
|
11
11
|
SkillsClients
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-RXXZ5BU5.js";
|
|
13
13
|
|
|
14
14
|
// src/skills-autosync.ts
|
|
15
15
|
import fs from "fs";
|