@canonry/canonry 7.58.5 → 7.60.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.
- package/assets/agent-workspace/skills/aero/SKILL.md +2 -1
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +48 -4
- package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +34 -0
- package/assets/assets/{AgentSetupPage-CoD9a386.js → AgentSetupPage-xAe2RSTQ.js} +1 -1
- package/assets/assets/{AuditHistoryPanel-DSUKF9GC.js → AuditHistoryPanel-DRGMxc1o.js} +1 -1
- package/assets/assets/{BacklinksPage-DIZy0NkW.js → BacklinksPage-OS6r_MtQ.js} +1 -1
- package/assets/assets/{HistoryPage-B2Xtxu5L.js → HistoryPage-RDxUN7rD.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-BZmvjMiS.js → MeasurementPropertyPage-BVAmJBKa.js} +1 -1
- package/assets/assets/{ProjectPage-DMIoYBCF.js → ProjectPage-BWY9eFFx.js} +1 -1
- package/assets/assets/{RunsPage-DtvesLu2.js → RunsPage-Fb7IM6iV.js} +1 -1
- package/assets/assets/{SettingsPage-BjE3d5Ae.js → SettingsPage-Dz_agQCf.js} +1 -1
- package/assets/assets/{SiteHealthSection-D6RLbM2o.js → SiteHealthSection-TXp2Cszl.js} +2 -2
- package/assets/assets/ToneBadge-DZzQvXs_.js +60 -0
- package/assets/assets/{TrafficPage-CHZlfMgd.js → TrafficPage-BKfgooKl.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-Dp7AYvRP.js → TrafficSourceDetailPage-C1HM_4Mh.js} +1 -1
- package/assets/assets/{account-context-DHWaWJSr.js → account-context-sj3dKq-a.js} +1 -1
- package/assets/assets/{card-im88-x1b.js → card-DKV0mNmm.js} +1 -1
- package/assets/assets/{extract-error-message-Bq8oNvfF.js → extract-error-message-Tfdo6vAJ.js} +1 -1
- package/assets/assets/{format-helpers-DOEct2q8.js → format-helpers-BagbvnfZ.js} +1 -1
- package/assets/assets/{index-CgAMnZFS.js → index-7G0DHKIO.js} +4 -4
- package/assets/assets/{query-client-BN_-qp71.js → query-client-7P_Wczfa.js} +1 -1
- package/assets/assets/{react-query-P6OZ-MPl.js → react-query-agN8P-yg.js} +1 -1
- package/assets/assets/{react-sigma_core.esm.min-TGwpCHs4.js → react-sigma_core.esm.min-CHz1PIYq.js} +1 -1
- package/assets/assets/{service-CUJkePNp.js → service-CAV4dMit.js} +1 -1
- package/assets/index.html +7 -7
- package/dist/{ads-BMBXQB67.js → ads-A42JBQ5Q.js} +3 -3
- package/dist/{agent-S6CU36RL.js → agent-ZKKHPMOB.js} +7 -7
- package/dist/{agent-ask-XG7WQBX6.js → agent-ask-SMV76QZM.js} +3 -3
- package/dist/{agent-conversations-C4QBZAPC.js → agent-conversations-O5QA3MHR.js} +3 -3
- package/dist/{agent-memory-I7UJ7MKH.js → agent-memory-ZRJQ6SZU.js} +3 -3
- package/dist/{agent-providers-YHRIYJDT.js → agent-providers-EOXIPRXN.js} +3 -3
- package/dist/{agent-transcript-2WICUOEW.js → agent-transcript-4TB2VI5E.js} +3 -3
- package/dist/{analytics-Y5AGSYWD.js → analytics-KSHS32RJ.js} +3 -3
- package/dist/{apply-DLVLMU3O.js → apply-4ZZMONED.js} +3 -3
- package/dist/{backfill-SINDWLD3.js → backfill-DJIIN5ZR.js} +9 -9
- package/dist/{backlinks-TEZTPNZ5.js → backlinks-XIAPORR5.js} +3 -3
- package/dist/{bing-IIA5HLND.js → bing-QDZXI334.js} +3 -3
- package/dist/{bootstrap-AKGA3BJI.js → bootstrap-7RAGKHJZ.js} +10 -10
- package/dist/{cdp-WWOFWFYU.js → cdp-3OX3WGWN.js} +7 -7
- package/dist/{chunk-4P7NK7XM.js → chunk-2IBFY7KQ.js} +2 -2
- package/dist/{chunk-SCS7R2ND.js → chunk-3JV3PWNA.js} +128 -1
- package/dist/{chunk-QEJBAPDP.js → chunk-4IV4FO3O.js} +2616 -2055
- package/dist/{chunk-27SGL3DF.js → chunk-66C7YITH.js} +1 -1
- package/dist/{chunk-TH3NNUJW.js → chunk-7HZ7KRHT.js} +5 -1
- package/dist/{chunk-O6TF6TPM.js → chunk-7KEIZ5OO.js} +8 -8
- package/dist/{chunk-YJPQBJZO.js → chunk-7XSGAPN5.js} +48 -3
- package/dist/{chunk-NWYNTYPD.js → chunk-ADY24WBX.js} +4 -4
- package/dist/{chunk-N2HCXIQ3.js → chunk-D7ZU5LMK.js} +1 -1
- package/dist/{chunk-BP5OKJIC.js → chunk-DUYENNUI.js} +2 -2
- package/dist/{chunk-52NCZIAC.js → chunk-FCPIOH6P.js} +1 -1
- package/dist/{chunk-CYVQW32W.js → chunk-FKQPVB5B.js} +21 -20
- package/dist/{chunk-IFVTHGXG.js → chunk-G7VJEPDZ.js} +2 -2
- package/dist/{chunk-U65LWABS.js → chunk-GLFE3Q3C.js} +7 -3
- package/dist/{chunk-QSPLYPVA.js → chunk-HGBIJIVM.js} +1 -1
- package/dist/{chunk-WLIGKWVB.js → chunk-HV5MGQYI.js} +3 -3
- package/dist/{chunk-4UGM5YV4.js → chunk-I32IFAB3.js} +3 -3
- package/dist/{chunk-G34BVUMF.js → chunk-IDPAYZHR.js} +1 -1
- package/dist/{chunk-Y7NX6EIK.js → chunk-JDL4QAPT.js} +2666 -2407
- package/dist/{chunk-5D4RL23M.js → chunk-L7WQTD3D.js} +5 -5
- package/dist/{chunk-6IBLGQVZ.js → chunk-NQTUPEBQ.js} +1 -1
- package/dist/{chunk-Q4J3XSWE.js → chunk-O7KIDW4H.js} +347 -10
- package/dist/{chunk-A5F5E4DL.js → chunk-OA6N3BI7.js} +4 -4
- package/dist/{chunk-3U7LL3JM.js → chunk-QCSNNKFI.js} +1 -1
- package/dist/{chunk-TVANRUBO.js → chunk-QEG7BSLH.js} +8 -1
- package/dist/{chunk-AP7YSOFC.js → chunk-QRC6SDPF.js} +417 -331
- package/dist/{chunk-65YQFVJM.js → chunk-RLXNZRHD.js} +5 -5
- package/dist/{chunk-F6W7FCS2.js → chunk-SJNF5GN2.js} +26 -2
- package/dist/{chunk-JGRUCEL4.js → chunk-TLNHDCJF.js} +2 -2
- package/dist/{chunk-L7TKNHEX.js → chunk-UHE4RLFW.js} +1 -1
- package/dist/{chunk-YDSY5YJE.js → chunk-XJF7LMGU.js} +4 -4
- package/dist/{chunk-ZYL3LCDZ.js → chunk-Z63ZR6AD.js} +1 -1
- package/dist/{chunk-KWXARGCT.js → chunk-Z7WG6F7Q.js} +3 -3
- package/dist/{chunk-4TM4NXQR.js → chunk-ZK5WIVGA.js} +2 -2
- package/dist/{citations-4LVBHTDX.js → citations-L3HFNQVU.js} +3 -3
- package/dist/{cli-catalog-PJYR3JHX.js → cli-catalog-DJPRREDK.js} +3 -3
- package/dist/{cli-commands-ZPW3OST3.js → cli-commands-4KG4X76Z.js} +7 -7
- package/dist/cli.js +14 -14
- package/dist/{competitor-T7UXAW4F.js → competitor-Q5LZ26U5.js} +3 -3
- package/dist/{content-DFYYGGPI.js → content-WRVFNQSO.js} +3 -3
- package/dist/{dashboard-VT3GQRW4.js → dashboard-GBP2T2AG.js} +6 -6
- package/dist/{demo-ZBNVULOO.js → demo-JMLMPLJ6.js} +1 -1
- package/dist/{demo-server-QUW4TDJL.js → demo-server-AOVPBGZ7.js} +11 -11
- package/dist/{discover-QTC5OBQG.js → discover-SKUNZE4Y.js} +3 -3
- package/dist/{discover-eval-QQZGUPR6.js → discover-eval-57BEDSQN.js} +3 -3
- package/dist/{doctor-VHFDL5MH.js → doctor-DMLJGH6G.js} +3 -3
- package/dist/{evidence-4PRFOC2I.js → evidence-J4XF4W7O.js} +3 -3
- package/dist/{export-cmd-BQE7BPKZ.js → export-cmd-3JXT2YAP.js} +3 -3
- package/dist/{ga-ULY5XDBK.js → ga-KHILAPMC.js} +3 -3
- package/dist/{gbp-4WHNZAFY.js → gbp-PHOFQZNT.js} +3 -3
- package/dist/{google-O4IVWLSG.js → google-QOLM2NBI.js} +4 -4
- package/dist/{google-marketing-DCQDTDDG.js → google-marketing-N37WUWNL.js} +1 -1
- package/dist/{health-cmd-I2JTACS7.js → health-cmd-2FUEPUJZ.js} +3 -3
- package/dist/{history-LUPHO3P3.js → history-MOSRCLAD.js} +3 -3
- package/dist/index.d.ts +818 -64
- package/dist/index.js +24 -24
- package/dist/{init-C2DLDK6T.js → init-V6ER2PJV.js} +11 -11
- package/dist/{insights-GC2W45U4.js → insights-F3MT66IV.js} +3 -3
- package/dist/intelligence-service-S5DI74LD.js +15 -0
- package/dist/journeys-DNS3EZNK.js +122 -0
- package/dist/{keys-DXQBSOBI.js → keys-NPOLKCWZ.js} +3 -3
- package/dist/{keyword-2DCR2QCJ.js → keyword-AXEPIJQ7.js} +3 -3
- package/dist/{logs-H45QFIEB.js → logs-ECEDVUTX.js} +3 -3
- package/dist/{mcp-NXXP6M3C.js → mcp-HUIRIY74.js} +2 -2
- package/dist/mcp.js +9 -9
- package/dist/{measurement-plan-IG4JUKKW.js → measurement-plan-5Y2IHH43.js} +5 -5
- package/dist/{notify-BLLWXMBB.js → notify-PIFCJ7WM.js} +3 -3
- package/dist/{organic-evidence-73K7W7SB.js → organic-evidence-S2IE5XV6.js} +3 -3
- package/dist/{overview-4TAULPUG.js → overview-TZT7C4U4.js} +4 -4
- package/dist/{project-ANX4JTWS.js → project-HIY673Y5.js} +3 -3
- package/dist/{query-U3MFTLGR.js → query-FUJIMFJQ.js} +3 -3
- package/dist/{research-3YZ6QI67.js → research-ECGEXWID.js} +3 -3
- package/dist/{results-export-72OVLKSC.js → results-export-7DRGFNUX.js} +3 -3
- package/dist/{run-SI6IL4FC.js → run-4JEDD5VT.js} +4 -4
- package/dist/{schedule-FYEHU2VH.js → schedule-NRHQXHTW.js} +3 -3
- package/dist/{search-MXDT3DQE.js → search-M7PNZZZL.js} +3 -3
- package/dist/{serve-ME2KJ6BG.js → serve-RXLQEALQ.js} +56 -27
- package/dist/{session-R3PRJ3RB.js → session-MCSZQR5V.js} +12 -12
- package/dist/{settings-ZGS26QOP.js → settings-JXOYI7VV.js} +3 -3
- package/dist/{skills-ZMMCKKSA.js → skills-SRUXD2PV.js} +2 -2
- package/dist/{snapshot-5AGGUQKE.js → snapshot-7N4BEGGM.js} +3 -3
- package/dist/{src-AIM5FPLZ.js → src-ZAAE3NIM.js} +8 -2
- package/dist/{status-HVQI4E5X.js → status-5OYYSMAY.js} +4 -4
- package/dist/{technical-aeo-S4OFCURE.js → technical-aeo-464OUUWT.js} +3 -3
- package/dist/{telemetry-SPSC5MUN.js → telemetry-BZFNXACR.js} +4 -4
- package/dist/{tools-VZVQ2CTU.js → tools-YVWC3NTG.js} +11 -11
- package/dist/{traffic-5AXVN37M.js → traffic-WXJHRB7H.js} +13 -8
- package/dist/{users-WFKSUCGV.js → users-U2UNKGDY.js} +3 -3
- package/dist/{visibility-stats-5S26GC27.js → visibility-stats-AHGME46N.js} +3 -3
- package/dist/{wordpress-IUPZC7II.js → wordpress-FUVFZKH2.js} +3 -3
- package/package.json +1 -1
- package/assets/assets/ToneBadge-DYEbxp5S.js +0 -60
- package/dist/intelligence-service-R5BRSQKI.js +0 -15
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
isStoredPageReadTool,
|
|
6
6
|
isStoredReadTool,
|
|
7
7
|
truncateToolResult
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-OA6N3BI7.js";
|
|
9
9
|
import {
|
|
10
10
|
CANONRY_MCP_TOOLKITS
|
|
11
11
|
} from "./chunk-NCIPNVD6.js";
|
|
@@ -22,15 +22,15 @@ import {
|
|
|
22
22
|
resolveApiKeyFor,
|
|
23
23
|
resolveModelForProvider,
|
|
24
24
|
validateAgentProviderRegistry
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-QEG7BSLH.js";
|
|
26
26
|
import {
|
|
27
27
|
CanonryMcpToolNames,
|
|
28
28
|
canonryMcpTools
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-7XSGAPN5.js";
|
|
30
30
|
import {
|
|
31
31
|
agentToolEvents,
|
|
32
32
|
llmUsageEvents
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-3JV3PWNA.js";
|
|
34
34
|
import {
|
|
35
35
|
MeasurementPortfolioLists,
|
|
36
36
|
agentTurnLimitsSchema,
|
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
describeError,
|
|
39
39
|
validationError,
|
|
40
40
|
visibilityReportRequestSchema
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-JDL4QAPT.js";
|
|
42
42
|
|
|
43
43
|
// src/agent/session.ts
|
|
44
44
|
import fs3 from "fs";
|
|
@@ -5,9 +5,10 @@ import {
|
|
|
5
5
|
TrafficEvidenceKinds,
|
|
6
6
|
TrafficSourceTypes,
|
|
7
7
|
classifyAiReferralTrafficClass,
|
|
8
|
+
classifyJourneyEntry,
|
|
8
9
|
hostMatchesDomain,
|
|
9
10
|
hostOf
|
|
10
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-JDL4QAPT.js";
|
|
11
12
|
|
|
12
13
|
// ../integration-traffic/src/ip-ranges/amazonbot.json
|
|
13
14
|
var amazonbot_default = {
|
|
@@ -14506,14 +14507,321 @@ function classifyAiReferral(event) {
|
|
|
14506
14507
|
return null;
|
|
14507
14508
|
}
|
|
14508
14509
|
|
|
14510
|
+
// ../integration-traffic/src/journey.ts
|
|
14511
|
+
var ASSET_EXTENSION_PATTERN = /\.(?:avif|bmp|css|gif|ico|jpe?g|js|map|mjs|mp3|mp4|otf|png|svg|ttf|txt|webm|webmanifest|webp|woff2?|xml)$/i;
|
|
14512
|
+
var ASSET_PATH_PREFIXES = ["/_next/static/", "/_nuxt/", "/_ipx/", "/_vercel/", "/assets/", "/build/", "/dist/", "/fonts/", "/images/", "/img/", "/static/", "/wp-content/", "/wp-includes/", "/cdn-cgi/"];
|
|
14513
|
+
var DATA_PATH_PATTERN = /\.json$|^\/api\/|^\/wp-json\/|^\/graphql/i;
|
|
14514
|
+
var NON_BROWSER_PATTERN = /bot|crawl|spider|slurp|scrape|curl\/|wget|python|java\/|go-http|okhttp|axios|node-fetch|headless|phantom|lighthouse|pingdom|uptime|monitor|preview|facebookexternalhit|whatsapp|telegram|discord|slack/i;
|
|
14515
|
+
var KEPT_QUERY_PARAMETERS = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"];
|
|
14516
|
+
var AD_CLICK_ID_PARAMETERS = ["gclid", "gbraid", "wbraid", "dclid", "msclkid", "ttclid", "li_fat_id"];
|
|
14517
|
+
var NETWORK_CLICK_ID_PARAMETERS = { fbclid: "Facebook", twclid: "X" };
|
|
14518
|
+
var STEP_REFERER_HOSTS = [
|
|
14519
|
+
"accounts.google.com",
|
|
14520
|
+
"accounts.youtube.com",
|
|
14521
|
+
"pay.google.com",
|
|
14522
|
+
"appleid.apple.com",
|
|
14523
|
+
"login.microsoftonline.com",
|
|
14524
|
+
"login.live.com",
|
|
14525
|
+
"login.microsoft.com",
|
|
14526
|
+
"github.com/login",
|
|
14527
|
+
"checkout.stripe.com",
|
|
14528
|
+
"js.stripe.com",
|
|
14529
|
+
"hooks.stripe.com",
|
|
14530
|
+
"pay.stripe.com",
|
|
14531
|
+
"connect.stripe.com",
|
|
14532
|
+
"paypal.com",
|
|
14533
|
+
"pay.amazon.com",
|
|
14534
|
+
"checkout.shopify.com",
|
|
14535
|
+
"shop.app",
|
|
14536
|
+
"klarna.com",
|
|
14537
|
+
"afterpay.com",
|
|
14538
|
+
"squareup.com",
|
|
14539
|
+
"checkout.square.site",
|
|
14540
|
+
"adyen.com",
|
|
14541
|
+
"braintreegateway.com",
|
|
14542
|
+
"auth0.com",
|
|
14543
|
+
"okta.com",
|
|
14544
|
+
"onelogin.com",
|
|
14545
|
+
"amazoncognito.com",
|
|
14546
|
+
"clerk.accounts.dev"
|
|
14547
|
+
];
|
|
14548
|
+
var MAX_PATH_LENGTH = 512;
|
|
14549
|
+
var UUID_SEGMENT = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
14550
|
+
var LONG_HEX_SEGMENT = /^[0-9a-f]{16,}$/i;
|
|
14551
|
+
var TOKEN_CHARSET = /^[\w-]+$/;
|
|
14552
|
+
var JWT_SEGMENT = /^eyJ[\w-]+\.[\w-]+/;
|
|
14553
|
+
function baseHost(host) {
|
|
14554
|
+
const h = host?.trim().toLowerCase().replace(/:\d+$/, "").replace(/^www\./, "").replace(/\.$/, "");
|
|
14555
|
+
return h || null;
|
|
14556
|
+
}
|
|
14557
|
+
function domainOf(value) {
|
|
14558
|
+
const v = value.trim().toLowerCase();
|
|
14559
|
+
if (!v) return null;
|
|
14560
|
+
try {
|
|
14561
|
+
return baseHost(new URL(v.includes("://") ? v : `https://${v}`).hostname);
|
|
14562
|
+
} catch {
|
|
14563
|
+
return null;
|
|
14564
|
+
}
|
|
14565
|
+
}
|
|
14566
|
+
function refererUrlOf(referer) {
|
|
14567
|
+
if (!referer) return null;
|
|
14568
|
+
try {
|
|
14569
|
+
return new URL(referer);
|
|
14570
|
+
} catch {
|
|
14571
|
+
return null;
|
|
14572
|
+
}
|
|
14573
|
+
}
|
|
14574
|
+
function hostOfEvent(event) {
|
|
14575
|
+
if (event.host) return event.host;
|
|
14576
|
+
if (!event.requestUrl) return null;
|
|
14577
|
+
try {
|
|
14578
|
+
return new URL(event.requestUrl).hostname || null;
|
|
14579
|
+
} catch {
|
|
14580
|
+
return null;
|
|
14581
|
+
}
|
|
14582
|
+
}
|
|
14583
|
+
var onDomain = (host, domain) => host === domain || host.endsWith(`.${domain}`);
|
|
14584
|
+
function isStepRefererHost(host, path) {
|
|
14585
|
+
return STEP_REFERER_HOSTS.some((entry) => {
|
|
14586
|
+
const slash = entry.indexOf("/");
|
|
14587
|
+
if (slash < 0) return onDomain(host, entry);
|
|
14588
|
+
return host === entry.slice(0, slash) && path.startsWith(entry.slice(slash));
|
|
14589
|
+
});
|
|
14590
|
+
}
|
|
14591
|
+
function isAssetPath(path) {
|
|
14592
|
+
return ASSET_PATH_PREFIXES.some((prefix) => path.startsWith(prefix)) || ASSET_EXTENSION_PATTERN.test(path);
|
|
14593
|
+
}
|
|
14594
|
+
function looksSecret(segment) {
|
|
14595
|
+
if (UUID_SEGMENT.test(segment) || LONG_HEX_SEGMENT.test(segment) || JWT_SEGMENT.test(segment)) return true;
|
|
14596
|
+
if (segment.length < 20 || !TOKEN_CHARSET.test(segment)) return false;
|
|
14597
|
+
const digits = segment.replace(/\D/g, "").length;
|
|
14598
|
+
const letters = segment.replace(/[^a-z]/gi, "").length;
|
|
14599
|
+
const mixedCase = /[a-z]/.test(segment) && /[A-Z]/.test(segment);
|
|
14600
|
+
return digits >= 3 && letters >= 3 && (mixedCase || !/[-_]/.test(segment));
|
|
14601
|
+
}
|
|
14602
|
+
function maskJourneyPath(path) {
|
|
14603
|
+
return (path || "/").split("/").map((raw) => {
|
|
14604
|
+
const segment = raw.split(";")[0];
|
|
14605
|
+
if (!segment) return segment;
|
|
14606
|
+
if (/@|%40/.test(segment)) return ":email";
|
|
14607
|
+
return looksSecret(segment) ? ":token" : segment;
|
|
14608
|
+
}).join("/") || "/";
|
|
14609
|
+
}
|
|
14610
|
+
function isLikelyBrowser(userAgent) {
|
|
14611
|
+
const ua = userAgent?.trim();
|
|
14612
|
+
return Boolean(ua) && /^Mozilla\//.test(ua) && !NON_BROWSER_PATTERN.test(ua);
|
|
14613
|
+
}
|
|
14614
|
+
function extractJourneyRequests(events, options = {}) {
|
|
14615
|
+
const siteDomains = (options.siteDomains ?? []).map(domainOf).filter((d) => Boolean(d));
|
|
14616
|
+
const out = [];
|
|
14617
|
+
for (const event of events) {
|
|
14618
|
+
const method = event.method?.toUpperCase() ?? null;
|
|
14619
|
+
if (method === "HEAD" || method === "OPTIONS") continue;
|
|
14620
|
+
const observedMs = Date.parse(event.observedAt);
|
|
14621
|
+
if (!Number.isFinite(observedMs)) continue;
|
|
14622
|
+
const rawPath = event.path.split("?")[0] || "/";
|
|
14623
|
+
if (isAssetPath(rawPath)) continue;
|
|
14624
|
+
if (!isLikelyBrowser(event.userAgent)) continue;
|
|
14625
|
+
if (isSelfTraffic(event) || classifyCrawler(event) || classifyAiUserFetch(event)) continue;
|
|
14626
|
+
const params = new URLSearchParams(event.queryString ?? "");
|
|
14627
|
+
const kept = KEPT_QUERY_PARAMETERS.flatMap((name) => {
|
|
14628
|
+
const value = params.get(name);
|
|
14629
|
+
return value ? [`${name}=${encodeURIComponent(value)}`] : [];
|
|
14630
|
+
});
|
|
14631
|
+
const maskedPath = maskJourneyPath(rawPath);
|
|
14632
|
+
const path = (kept.length ? `${maskedPath}?${kept.join("&")}` : maskedPath).slice(0, MAX_PATH_LENGTH);
|
|
14633
|
+
const refererUrl = refererUrlOf(event.referer);
|
|
14634
|
+
const refererHost = refererUrl?.hostname || null;
|
|
14635
|
+
const refererBase = baseHost(refererHost);
|
|
14636
|
+
const siteHost = baseHost(hostOfEvent(event));
|
|
14637
|
+
const sameSite = Boolean(refererBase && (siteHost && (onDomain(refererBase, siteHost) || onDomain(siteHost, refererBase)) || siteDomains.some((domain) => onDomain(refererBase, domain))));
|
|
14638
|
+
const stepReferer = sameSite || Boolean(refererBase && isStepRefererHost(refererBase, refererUrl?.pathname ?? "/"));
|
|
14639
|
+
const ai = classifyAiReferral(event);
|
|
14640
|
+
const networkClickId = Object.keys(NETWORK_CLICK_ID_PARAMETERS).find((name) => params.has(name));
|
|
14641
|
+
out.push({
|
|
14642
|
+
eventId: event.eventId,
|
|
14643
|
+
observedAt: new Date(observedMs).toISOString(),
|
|
14644
|
+
method,
|
|
14645
|
+
path,
|
|
14646
|
+
status: event.status,
|
|
14647
|
+
kind: DATA_PATH_PATTERN.test(rawPath) ? "data" : "page",
|
|
14648
|
+
remoteIp: event.remoteIp?.trim() || null,
|
|
14649
|
+
userAgent: event.userAgent.trim(),
|
|
14650
|
+
stepReferer,
|
|
14651
|
+
aiEvidence: ai?.evidenceType ?? null,
|
|
14652
|
+
signal: {
|
|
14653
|
+
aiProduct: ai?.product ?? null,
|
|
14654
|
+
aiDomain: ai?.sourceDomain ?? null,
|
|
14655
|
+
aiPaid: ai?.trafficClass === "paid",
|
|
14656
|
+
refererHost: stepReferer ? null : refererHost,
|
|
14657
|
+
utmSource: params.get("utm_source"),
|
|
14658
|
+
utmMedium: params.get("utm_medium"),
|
|
14659
|
+
adClickId: AD_CLICK_ID_PARAMETERS.some((name) => params.has(name)),
|
|
14660
|
+
clickNetwork: networkClickId ? NETWORK_CLICK_ID_PARAMETERS[networkClickId] : null
|
|
14661
|
+
}
|
|
14662
|
+
});
|
|
14663
|
+
}
|
|
14664
|
+
return out;
|
|
14665
|
+
}
|
|
14666
|
+
function hasEntryEvidence(request) {
|
|
14667
|
+
if (request.stepReferer) return false;
|
|
14668
|
+
const s = request.signal;
|
|
14669
|
+
return Boolean(s.aiProduct || s.refererHost || s.utmSource || s.utmMedium || s.adClickId || s.clickNetwork);
|
|
14670
|
+
}
|
|
14671
|
+
function entryKey(entry) {
|
|
14672
|
+
return `${entry.entryClass}:${entry.entryName ?? entry.entryHost ?? ""}`;
|
|
14673
|
+
}
|
|
14674
|
+
var ms = (iso) => Date.parse(iso);
|
|
14675
|
+
var DIRECT_ENTRY = { entryClass: "direct", entryName: null, entryHost: null, paid: false };
|
|
14676
|
+
var laterOf = (a, b) => a !== null && a > b ? a : b;
|
|
14677
|
+
function placeRequest(visits, t, outsideEntry, idleMs) {
|
|
14678
|
+
let current;
|
|
14679
|
+
let next;
|
|
14680
|
+
for (const v of visits) {
|
|
14681
|
+
const start = ms(v.startedAt);
|
|
14682
|
+
if (start <= t) {
|
|
14683
|
+
if (t <= ms(v.endedAt) + idleMs && (!current || v.startedAt > current.startedAt)) current = v;
|
|
14684
|
+
} else if (start - t <= idleMs && (!next || v.startedAt < next.startedAt)) {
|
|
14685
|
+
next = v;
|
|
14686
|
+
}
|
|
14687
|
+
}
|
|
14688
|
+
if (current && (outsideEntry === null || outsideEntry === entryKey(current.entry))) return { visit: current, head: false, current };
|
|
14689
|
+
if (next && (next.entry.entryClass === "direct" || outsideEntry === entryKey(next.entry))) return { visit: next, head: true, current };
|
|
14690
|
+
return { visit: void 0, head: false, current };
|
|
14691
|
+
}
|
|
14692
|
+
function insertSorted(values, value) {
|
|
14693
|
+
let i = values.length;
|
|
14694
|
+
while (i > 0 && values[i - 1] > value) i -= 1;
|
|
14695
|
+
if (values[i - 1] !== value) values.splice(i, 0, value);
|
|
14696
|
+
}
|
|
14697
|
+
function sessionizeJourneyRequests(requests, state, options) {
|
|
14698
|
+
const byVisitor = /* @__PURE__ */ new Map();
|
|
14699
|
+
for (const request of requests) {
|
|
14700
|
+
const list = byVisitor.get(request.visitorKey);
|
|
14701
|
+
if (list) list.push(request);
|
|
14702
|
+
else byVisitor.set(request.visitorKey, [request]);
|
|
14703
|
+
}
|
|
14704
|
+
const visits = /* @__PURE__ */ new Map();
|
|
14705
|
+
const events = [];
|
|
14706
|
+
const visitors = [];
|
|
14707
|
+
let dropped = 0;
|
|
14708
|
+
let capped = 0;
|
|
14709
|
+
for (const [visitorKey, list] of byVisitor) {
|
|
14710
|
+
list.sort((a, b) => a.observedAt < b.observedAt ? -1 : a.observedAt > b.observedAt ? 1 : 0);
|
|
14711
|
+
const prior = state.get(visitorKey);
|
|
14712
|
+
const isWeakAi = (r) => Boolean(r.signal.aiProduct) && r.stepReferer;
|
|
14713
|
+
const isStrongAi = (r) => Boolean(r.signal.aiProduct) && !r.stepReferer;
|
|
14714
|
+
const aiTimes = [...new Set([
|
|
14715
|
+
prior?.firstAiAt,
|
|
14716
|
+
prior?.lastAiAt,
|
|
14717
|
+
...prior?.aiTimes ?? [],
|
|
14718
|
+
...list.filter(isStrongAi).map((r) => r.observedAt)
|
|
14719
|
+
].filter((t) => Boolean(t)))].sort();
|
|
14720
|
+
if (aiTimes.length === 0 && !list.some(isWeakAi)) {
|
|
14721
|
+
dropped += list.length;
|
|
14722
|
+
continue;
|
|
14723
|
+
}
|
|
14724
|
+
const engineAt = /* @__PURE__ */ new Map();
|
|
14725
|
+
const known = (prior?.visits ?? []).map((v) => ({ ...v, visitorKey, landingPath: "", isNew: false, headChanged: false }));
|
|
14726
|
+
const requestsByDay = new Map(Object.entries(prior?.requestsByDay ?? {}));
|
|
14727
|
+
let keptAny = false;
|
|
14728
|
+
const cappedDays = /* @__PURE__ */ new Set();
|
|
14729
|
+
let lastSeenAt = null;
|
|
14730
|
+
let userAgent = list[0].userAgent;
|
|
14731
|
+
let aiIndex = -1;
|
|
14732
|
+
for (const request of list) {
|
|
14733
|
+
const t = ms(request.observedAt);
|
|
14734
|
+
while (aiIndex + 1 < aiTimes.length && aiTimes[aiIndex + 1] <= request.observedAt) aiIndex += 1;
|
|
14735
|
+
const withinLookback = aiIndex >= 0 && t - ms(aiTimes[aiIndex]) <= options.lookbackMs;
|
|
14736
|
+
let aiTouch = isStrongAi(request);
|
|
14737
|
+
if (isWeakAi(request) && !withinLookback) {
|
|
14738
|
+
aiTouch = true;
|
|
14739
|
+
insertSorted(aiTimes, request.observedAt);
|
|
14740
|
+
aiIndex = aiTimes.indexOf(request.observedAt);
|
|
14741
|
+
}
|
|
14742
|
+
if (aiTouch && request.signal.aiProduct && !engineAt.has(request.observedAt)) engineAt.set(request.observedAt, request.signal.aiProduct);
|
|
14743
|
+
const entry = aiTouch ? classifyJourneyEntry(request.signal) : request.stepReferer ? DIRECT_ENTRY : classifyJourneyEntry({ ...request.signal, aiProduct: null, aiDomain: null, aiPaid: false });
|
|
14744
|
+
const outside = aiTouch || hasEntryEvidence(request);
|
|
14745
|
+
const placement = placeRequest(known, t, outside ? entryKey(entry) : null, options.idleMs);
|
|
14746
|
+
const continues = placement.visit !== void 0 && !placement.head;
|
|
14747
|
+
const kept = aiTouch || withinLookback || continues;
|
|
14748
|
+
const opensVisit = placement.visit === void 0;
|
|
14749
|
+
if (!kept || opensVisit && request.kind === "data" && !outside) {
|
|
14750
|
+
dropped += 1;
|
|
14751
|
+
continue;
|
|
14752
|
+
}
|
|
14753
|
+
const day = request.observedAt.slice(0, 10);
|
|
14754
|
+
const stored = requestsByDay.get(day) ?? 0;
|
|
14755
|
+
if (stored >= options.maxRequestsPerDay && !aiTouch) {
|
|
14756
|
+
cappedDays.add(day);
|
|
14757
|
+
capped += 1;
|
|
14758
|
+
continue;
|
|
14759
|
+
}
|
|
14760
|
+
requestsByDay.set(day, stored + 1);
|
|
14761
|
+
let target;
|
|
14762
|
+
if (placement.visit) {
|
|
14763
|
+
target = placement.visit;
|
|
14764
|
+
if (placement.head) {
|
|
14765
|
+
target.startedAt = request.observedAt;
|
|
14766
|
+
target.landingPath = request.path;
|
|
14767
|
+
if (outside) target.entry = entry;
|
|
14768
|
+
target.headChanged = !target.isNew;
|
|
14769
|
+
}
|
|
14770
|
+
if (request.observedAt > target.endedAt) target.endedAt = request.observedAt;
|
|
14771
|
+
target.requestCount += 1;
|
|
14772
|
+
if (request.kind === "page") target.pageCount += 1;
|
|
14773
|
+
} else {
|
|
14774
|
+
target = {
|
|
14775
|
+
id: options.newId(),
|
|
14776
|
+
visitorKey,
|
|
14777
|
+
startedAt: request.observedAt,
|
|
14778
|
+
endedAt: request.observedAt,
|
|
14779
|
+
entry,
|
|
14780
|
+
requestCount: 1,
|
|
14781
|
+
pageCount: request.kind === "page" ? 1 : 0,
|
|
14782
|
+
landingPath: request.path,
|
|
14783
|
+
isNew: true,
|
|
14784
|
+
headChanged: false
|
|
14785
|
+
};
|
|
14786
|
+
const inside = placement.current;
|
|
14787
|
+
if (outside && inside && request.observedAt < inside.endedAt) {
|
|
14788
|
+
target.splitFrom = { visitId: inside.id, after: request.observedAt };
|
|
14789
|
+
target.endedAt = inside.endedAt;
|
|
14790
|
+
inside.endedAt = request.observedAt;
|
|
14791
|
+
visits.set(inside.id, inside);
|
|
14792
|
+
}
|
|
14793
|
+
known.push(target);
|
|
14794
|
+
}
|
|
14795
|
+
visits.set(target.id, target);
|
|
14796
|
+
events.push({ visitId: target.id, visitorKey, request, aiTouch });
|
|
14797
|
+
keptAny = true;
|
|
14798
|
+
lastSeenAt = laterOf(lastSeenAt, request.observedAt);
|
|
14799
|
+
userAgent = request.userAgent;
|
|
14800
|
+
}
|
|
14801
|
+
if ((keptAny || cappedDays.size > 0) && aiTimes.length > 0) {
|
|
14802
|
+
const firstAiAt = aiTimes[0];
|
|
14803
|
+
visitors.push({
|
|
14804
|
+
visitorKey,
|
|
14805
|
+
firstAiAt,
|
|
14806
|
+
firstAiEngine: (prior?.firstAiAt === firstAiAt ? prior?.firstAiEngine : null) ?? engineAt.get(firstAiAt) ?? prior?.firstAiEngine ?? "AI",
|
|
14807
|
+
lastAiAt: aiTimes[aiTimes.length - 1],
|
|
14808
|
+
userAgent,
|
|
14809
|
+
lastSeenAt: lastSeenAt ?? prior?.lastAiAt ?? firstAiAt,
|
|
14810
|
+
cappedDays: [...cappedDays].sort()
|
|
14811
|
+
});
|
|
14812
|
+
}
|
|
14813
|
+
}
|
|
14814
|
+
return { visits: [...visits.values()], events, visitors, dropped, capped };
|
|
14815
|
+
}
|
|
14816
|
+
|
|
14509
14817
|
// ../integration-traffic/src/rollup.ts
|
|
14510
14818
|
var DEFAULT_SAMPLE_LIMIT = 25;
|
|
14511
14819
|
var DEFAULT_AI_REFERRAL_SESSION_WINDOW_MS = 6e4;
|
|
14512
|
-
var
|
|
14513
|
-
var
|
|
14820
|
+
var UUID_SEGMENT2 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
14821
|
+
var LONG_HEX_SEGMENT2 = /^[0-9a-f]{16,}$/i;
|
|
14514
14822
|
var NUMERIC_SEGMENT = /^\d+$/;
|
|
14515
|
-
var
|
|
14516
|
-
var
|
|
14823
|
+
var ASSET_EXTENSION_PATTERN2 = /\.(?:avif|bmp|css|gif|ico|jpe?g|js|json|map|mjs|mp4|otf|png|svg|webm|webmanifest|woff2?|xml)$/i;
|
|
14824
|
+
var ASSET_PATH_PREFIXES2 = [
|
|
14517
14825
|
"/_next/static/",
|
|
14518
14826
|
"/assets/",
|
|
14519
14827
|
"/build/",
|
|
@@ -14528,7 +14836,7 @@ function normalizeTrafficPathPattern(path) {
|
|
|
14528
14836
|
const pathOnly = cleanPath.split("?")[0] || "/";
|
|
14529
14837
|
const segments = pathOnly.split("/").map((segment) => {
|
|
14530
14838
|
if (!segment) return segment;
|
|
14531
|
-
if (
|
|
14839
|
+
if (UUID_SEGMENT2.test(segment) || LONG_HEX_SEGMENT2.test(segment) || NUMERIC_SEGMENT.test(segment)) {
|
|
14532
14840
|
return ":id";
|
|
14533
14841
|
}
|
|
14534
14842
|
return segment;
|
|
@@ -14571,7 +14879,7 @@ function resolveAiReferralLandingPath(event, evidenceType) {
|
|
|
14571
14879
|
}
|
|
14572
14880
|
function isLikelySubresourcePath(path) {
|
|
14573
14881
|
const cleanPath = path.split("?")[0] || "/";
|
|
14574
|
-
return
|
|
14882
|
+
return ASSET_PATH_PREFIXES2.some((prefix) => cleanPath.startsWith(prefix)) || ASSET_EXTENSION_PATTERN2.test(cleanPath);
|
|
14575
14883
|
}
|
|
14576
14884
|
function actorKey(event) {
|
|
14577
14885
|
const remoteIp = event.remoteIp?.trim();
|
|
@@ -14878,6 +15186,29 @@ var DEFAULT_BOT_LIST = {
|
|
|
14878
15186
|
};
|
|
14879
15187
|
var DEFAULT_BOT_SCORE_MAX_FORWARD = 30;
|
|
14880
15188
|
var WORKER_COMPATIBILITY_DATE = "2026-05-01";
|
|
15189
|
+
var CLOUDFLARE_PAGE_VIEWS_VERSION_SUFFIX = "+page-views";
|
|
15190
|
+
var PAGE_VIEW_ASSET_EXTENSIONS = ["avif", "bmp", "css", "gif", "ico", "jpeg", "jpg", "js", "map", "mjs", "mp3", "mp4", "otf", "pdf", "png", "svg", "ttf", "txt", "webm", "webmanifest", "webp", "woff", "woff2", "xml", "zip"];
|
|
15191
|
+
var PAGE_VIEW_FILTER = `
|
|
15192
|
+
const PAGE_VIEW_ASSET_PATTERN = new RegExp(${JSON.stringify(`\\.(?:${PAGE_VIEW_ASSET_EXTENSIONS.join("|")})$`)}, 'i')
|
|
15193
|
+
|
|
15194
|
+
function isPageView(request) {
|
|
15195
|
+
const method = request.method || 'GET'
|
|
15196
|
+
if (method !== 'GET' && method !== 'POST') return false
|
|
15197
|
+
const purpose = lower(request.headers.get('sec-purpose') || request.headers.get('purpose') || '')
|
|
15198
|
+
if (purpose.indexOf('prefetch') !== -1 || purpose.indexOf('prerender') !== -1) return false
|
|
15199
|
+
const ua = request.headers.get('user-agent') || ''
|
|
15200
|
+
if (ua.indexOf('Mozilla/') !== 0) return false
|
|
15201
|
+
const dest = lower(request.headers.get('sec-fetch-dest') || '')
|
|
15202
|
+
if (dest) return dest === 'document'
|
|
15203
|
+
if (method !== 'GET') return false
|
|
15204
|
+
if (lower(request.headers.get('accept') || '').indexOf('text/html') === -1) return false
|
|
15205
|
+
try {
|
|
15206
|
+
return !PAGE_VIEW_ASSET_PATTERN.test(new URL(request.url).pathname)
|
|
15207
|
+
} catch (_) {
|
|
15208
|
+
return false
|
|
15209
|
+
}
|
|
15210
|
+
}
|
|
15211
|
+
`;
|
|
14881
15212
|
function jsString(value) {
|
|
14882
15213
|
return JSON.stringify(value);
|
|
14883
15214
|
}
|
|
@@ -14886,6 +15217,9 @@ function jsArray(values) {
|
|
|
14886
15217
|
}
|
|
14887
15218
|
function generateWorkerScript(opts) {
|
|
14888
15219
|
const botScoreMax = opts.botScoreMaxForward ?? DEFAULT_BOT_SCORE_MAX_FORWARD;
|
|
15220
|
+
const pageViewHeader = opts.forwardPageViews ? "\n// page views: forwarded" : "";
|
|
15221
|
+
const pageViewFilter = opts.forwardPageViews ? PAGE_VIEW_FILTER : "";
|
|
15222
|
+
const pageViewCheck = opts.forwardPageViews ? "\n if (isPageView(request)) return true" : "";
|
|
14889
15223
|
const canonicalJsonFunction = canonicalizeCloudflareJson.toString();
|
|
14890
15224
|
const directPushDelivery = opts.deliveryMode === "direct-push" ? `
|
|
14891
15225
|
function toHex(buffer) {
|
|
@@ -14995,7 +15329,7 @@ async function deliverViaQueue(env, batch) {
|
|
|
14995
15329
|
return `${CLOUDFLARE_WORKER_GENERATED_MARKER}
|
|
14996
15330
|
// worker version: ${opts.workerVersion}
|
|
14997
15331
|
// bot-list version: ${opts.botList.version}
|
|
14998
|
-
// delivery mode: ${opts.deliveryMode}
|
|
15332
|
+
// delivery mode: ${opts.deliveryMode}${pageViewHeader}
|
|
14999
15333
|
|
|
15000
15334
|
const UA_KEYWORDS = ${jsArray(opts.botList.uaKeywords)}
|
|
15001
15335
|
const REFERER_DOMAINS = ${jsArray(opts.botList.refererDomains)}
|
|
@@ -15070,14 +15404,14 @@ function botSignals(cf) {
|
|
|
15070
15404
|
if (typeof cf.botScore === 'number' && cf.botScore < BOT_SCORE_MAX_FORWARD) return true
|
|
15071
15405
|
return false
|
|
15072
15406
|
}
|
|
15073
|
-
|
|
15407
|
+
${pageViewFilter}
|
|
15074
15408
|
function shouldForward(request) {
|
|
15075
15409
|
const ua = request.headers.get('user-agent') || ''
|
|
15076
15410
|
if (uaMatches(ua)) return true
|
|
15077
15411
|
if (urlUtmMatches(request.url)) return true
|
|
15078
15412
|
const referer = request.headers.get('referer') || ''
|
|
15079
15413
|
if (refererMatches(referer)) return true
|
|
15080
|
-
if (urlUtmMatches(referer)) return true
|
|
15414
|
+
if (urlUtmMatches(referer)) return true${pageViewCheck}
|
|
15081
15415
|
return botSignals(request.cf)
|
|
15082
15416
|
}
|
|
15083
15417
|
|
|
@@ -15364,12 +15698,15 @@ export {
|
|
|
15364
15698
|
isSelfTraffic,
|
|
15365
15699
|
classifyCrawler,
|
|
15366
15700
|
classifyAiUserFetch,
|
|
15701
|
+
extractJourneyRequests,
|
|
15702
|
+
sessionizeJourneyRequests,
|
|
15367
15703
|
buildTrafficProbeReport,
|
|
15368
15704
|
normalizeCloudflareWorkerEvent,
|
|
15369
15705
|
CLOUDFLARE_WORKER_BINDINGS,
|
|
15370
15706
|
CLOUDFLARE_WORKER_GENERATED_MARKER,
|
|
15371
15707
|
CLOUDFLARE_WRANGLER_GENERATED_MARKER,
|
|
15372
15708
|
DEFAULT_BOT_LIST,
|
|
15709
|
+
CLOUDFLARE_PAGE_VIEWS_VERSION_SUFFIX,
|
|
15373
15710
|
generateWorkerScript,
|
|
15374
15711
|
generateWranglerToml,
|
|
15375
15712
|
verifyRequestSignature
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runWithUsageTags
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-SJNF5GN2.js";
|
|
4
4
|
import {
|
|
5
5
|
CanonryMcpToolNames,
|
|
6
6
|
canonryMcpTools
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7XSGAPN5.js";
|
|
8
8
|
import {
|
|
9
9
|
CliError
|
|
10
10
|
} from "./chunk-HGMYEDAQ.js";
|
|
11
11
|
import {
|
|
12
12
|
buildOpenApiDocument
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-4IV4FO3O.js";
|
|
14
14
|
import {
|
|
15
15
|
DEFAULT_COMPETITOR_AUTO_ALIAS_MODE,
|
|
16
16
|
MeasurementPortfolioLists,
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
formatPercent,
|
|
21
21
|
ratioUnitSchema,
|
|
22
22
|
truncateUtf16
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-JDL4QAPT.js";
|
|
24
24
|
|
|
25
25
|
// src/agent/tools.ts
|
|
26
26
|
import { Type as Type2 } from "@earendil-works/pi-ai";
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
resolveProviderModel,
|
|
21
21
|
schedulableRunKindSchema,
|
|
22
22
|
sentimentEvaluatorProviderSchema
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-JDL4QAPT.js";
|
|
24
24
|
|
|
25
25
|
// ../config/src/index.ts
|
|
26
26
|
import { z as z4 } from "zod";
|
|
@@ -960,6 +960,13 @@ Do not use "canonry init --force" for recovery. It replaces credentials without
|
|
|
960
960
|
message: `Invalid config at ${configPath}: agent.model must be a non-empty string or left blank.`
|
|
961
961
|
});
|
|
962
962
|
}
|
|
963
|
+
const journeySecret = parsed.journeys?.visitorKeySecret;
|
|
964
|
+
if (journeySecret !== void 0 && journeySecret !== null && (typeof journeySecret !== "string" || journeySecret.trim().length > 0 && journeySecret.trim().length < 32)) {
|
|
965
|
+
throw new CliError({
|
|
966
|
+
code: "CONFIG_INVALID",
|
|
967
|
+
message: `Invalid config at ${configPath}: journeys.visitorKeySecret must be a string of at least 32 characters, or left blank to generate one.`
|
|
968
|
+
});
|
|
969
|
+
}
|
|
963
970
|
if (!agentAllowViewersSchema.safeParse(parsed.agent?.allowViewers).success) {
|
|
964
971
|
throw new CliError({
|
|
965
972
|
code: "CONFIG_INVALID",
|