@canonry/canonry 7.79.1 → 7.81.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/canonry/references/canonry-cli.md +14 -0
- package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +13 -0
- package/assets/assets/{AgentSetupPage-Cr2ZU_4s.js → AgentSetupPage-vJPymut8.js} +1 -1
- package/assets/assets/{AuditHistoryPanel-Bb5wq-Bk.js → AuditHistoryPanel-BItu4Vzu.js} +1 -1
- package/assets/assets/{BacklinksPage-i1cfxTDj.js → BacklinksPage-BzYbNK-V.js} +1 -1
- package/assets/assets/{HistoryPage-C2NRdNrn.js → HistoryPage-B_llsE1v.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-ighxjOiq.js → MeasurementPropertyPage-CUoV6lhB.js} +1 -1
- package/assets/assets/{ProjectPage-DnAXCPle.js → ProjectPage-C6woOQUb.js} +1 -1
- package/assets/assets/{RunsPage-Ds5K3fOQ.js → RunsPage-D_2CO_AJ.js} +1 -1
- package/assets/assets/{SettingsPage-B8Jed-xH.js → SettingsPage-C-Ik_cYz.js} +1 -1
- package/assets/assets/{SiteHealthSection-cjNQasWj.js → SiteHealthSection-C-BOkaLy.js} +2 -2
- package/assets/assets/{ToneBadge-CUe-WrzN.js → ToneBadge-B8svjXgK.js} +3 -3
- package/assets/assets/{TrafficPage-BUid1rkh.js → TrafficPage-CZ8ylTak.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-D3KHgRvF.js → TrafficSourceDetailPage-DFhPy-yp.js} +1 -1
- package/assets/assets/{account-context-B50QqDEA.js → account-context-BN8ksOuB.js} +1 -1
- package/assets/assets/{card-BE2fqwVq.js → card-BKhZmy5E.js} +1 -1
- package/assets/assets/{extract-error-message-xuN_xeRJ.js → extract-error-message-CJvSceYp.js} +1 -1
- package/assets/assets/{format-helpers-CiC6gALY.js → format-helpers-DN6eKZvA.js} +1 -1
- package/assets/assets/{index-BhoSVTom.js → index-D-lS_O3g.js} +4 -4
- package/assets/assets/{query-client-C5GhDMY7.js → query-client-X8eRXjbT.js} +1 -1
- package/assets/assets/{react-query-CmHyfYFq.js → react-query-DOLt-sL-.js} +1 -1
- package/assets/assets/{react-sigma_core.esm.min-SbOH7c6K.js → react-sigma_core.esm.min-DOMHedxL.js} +1 -1
- package/assets/assets/{service-B2i_ZzWP.js → service-BiQUl6ZL.js} +1 -1
- package/assets/index.html +7 -7
- package/dist/{ads-MNMND5VH.js → ads-XDPKJZD5.js} +3 -3
- package/dist/{agent-4KNDL3D3.js → agent-TLMUNKYG.js} +7 -7
- package/dist/{agent-ask-32RTOL2M.js → agent-ask-J3OIR65S.js} +3 -3
- package/dist/{agent-conversations-BXVWHUZC.js → agent-conversations-KLLYICAB.js} +3 -3
- package/dist/{agent-memory-7R7UVFS5.js → agent-memory-HVT2M2AW.js} +3 -3
- package/dist/{agent-providers-QGVLCCH4.js → agent-providers-QMS2NZTY.js} +3 -3
- package/dist/{agent-transcript-7Y6BJCIT.js → agent-transcript-V7UCK257.js} +3 -3
- package/dist/{analytics-YOGEHW6J.js → analytics-37Z5MGHQ.js} +3 -3
- package/dist/{apply-TB3MF3PH.js → apply-F3YZEJD4.js} +3 -3
- package/dist/{backfill-SRE52FDL.js → backfill-3YUPT5T2.js} +9 -9
- package/dist/{backlinks-6GTL324T.js → backlinks-GDTPG3SB.js} +3 -3
- package/dist/{bing-OMQACSDY.js → bing-H7D5KUQF.js} +3 -3
- package/dist/{bootstrap-ITVA7X45.js → bootstrap-JLC26QRM.js} +10 -10
- package/dist/{cdp-3WBLAWOL.js → cdp-WVMC4V4P.js} +7 -7
- package/dist/{chunk-2EWZ3DJ4.js → chunk-2ZRCLJQX.js} +3 -3
- package/dist/{chunk-KF7I7FBI.js → chunk-4EPCWJAM.js} +2 -2
- package/dist/{chunk-3QJWOF2B.js → chunk-6ST5JIUJ.js} +1 -1
- package/dist/{chunk-QOKK5PMO.js → chunk-6T7JZS67.js} +21 -21
- package/dist/{chunk-TZRYVW75.js → chunk-ATOAIF2W.js} +2 -2
- package/dist/{chunk-HRFPGXON.js → chunk-AX7BBB3S.js} +38 -1
- package/dist/{chunk-PM2DB3HE.js → chunk-BALMAZTD.js} +29 -0
- package/dist/{chunk-RPTOVEZT.js → chunk-CR6OF4SL.js} +3 -3
- package/dist/{chunk-WSWHLKKJ.js → chunk-EDV5YR2J.js} +1 -1
- package/dist/{chunk-PLLDJUG2.js → chunk-F3EJRABZ.js} +4 -4
- package/dist/{chunk-ZHFE6J3A.js → chunk-FFS6J325.js} +1 -1
- package/dist/{chunk-6OCQTAXU.js → chunk-FOQUCSNN.js} +8 -8
- package/dist/{chunk-BLZCNL3B.js → chunk-FQYMARCU.js} +3 -3
- package/dist/{chunk-O4WBYEGV.js → chunk-GK5H5QAH.js} +127 -4
- package/dist/{chunk-JERATA5R.js → chunk-GRS5UBVQ.js} +1 -1
- package/dist/{chunk-SWWZ733W.js → chunk-H5WAYPLS.js} +4 -4
- package/dist/{chunk-4GEEYY3N.js → chunk-HPCDCZJW.js} +2 -2
- package/dist/{chunk-KUMHO22S.js → chunk-IJGPHVZU.js} +1482 -1354
- package/dist/{chunk-7S6SQFFT.js → chunk-J5K7QM3U.js} +2 -2
- package/dist/{chunk-OIRHCT63.js → chunk-KRKOTKTY.js} +2 -2
- package/dist/{chunk-6ACWXQNZ.js → chunk-L6R6MSWW.js} +2 -1
- package/dist/{chunk-MUYTDD35.js → chunk-M6IABRSO.js} +18 -3
- package/dist/{chunk-72YPSNCG.js → chunk-OHXAS7LT.js} +2 -2
- package/dist/{chunk-R26CF4WT.js → chunk-PR2JM2FR.js} +2 -2
- package/dist/{chunk-ZMMS3FAR.js → chunk-Q6I2FSVG.js} +5 -5
- package/dist/{chunk-27MGZQ6Z.js → chunk-QVMUMIG4.js} +6 -6
- package/dist/{chunk-3MGM3U6V.js → chunk-SJYKKUH5.js} +1 -1
- package/dist/{chunk-45RGH7XI.js → chunk-SSTQINNT.js} +3 -3
- package/dist/{chunk-AI44ZCMK.js → chunk-TJA6Z5FV.js} +1 -1
- package/dist/{chunk-7HB6QLX4.js → chunk-TKOJAZ6S.js} +1 -1
- package/dist/{chunk-I7RTAHCL.js → chunk-VSWED7DX.js} +4 -4
- package/dist/{chunk-DEQC5XVD.js → chunk-WR2VQ5TF.js} +347 -335
- package/dist/{chunk-KZB6HLFT.js → chunk-YJ4EEYIP.js} +1 -1
- package/dist/{chunk-7OAXEMOF.js → chunk-YJ7FKGRE.js} +10 -2
- package/dist/{chunk-FCYGY4FT.js → chunk-Z6HMIMK2.js} +1 -1
- package/dist/{citations-PGG7JEIN.js → citations-LQEXT3QX.js} +3 -3
- package/dist/{cli-catalog-KC6JYHSW.js → cli-catalog-FQ3GU4I7.js} +3 -3
- package/dist/{cli-commands-BZLUMYKR.js → cli-commands-V5ITGQYI.js} +7 -7
- package/dist/cli.js +13 -13
- package/dist/{competitor-B3CZOKZU.js → competitor-LNBFBUHM.js} +3 -3
- package/dist/{content-Z4XJMZB4.js → content-SXOXACBG.js} +3 -3
- package/dist/{dashboard-43ST35IW.js → dashboard-VQ7ZJM3Z.js} +6 -6
- package/dist/{demo-COMFIESH.js → demo-MVF5RBLW.js} +1 -1
- package/dist/{demo-server-MRGL3SNP.js → demo-server-O4GV5RCH.js} +12 -12
- package/dist/{discover-OT3K7KQK.js → discover-62BQKXZE.js} +3 -3
- package/dist/{discover-eval-DN4J4KD5.js → discover-eval-6UYCPXIC.js} +3 -3
- package/dist/{doctor-UDF6OCSR.js → doctor-GAD732OH.js} +3 -3
- package/dist/{evidence-Z364UFOD.js → evidence-HMBZTISH.js} +3 -3
- package/dist/{export-cmd-K27XN4G5.js → export-cmd-H4QAPQLL.js} +3 -3
- package/dist/{ga-Q2CELDLG.js → ga-EIUF4YK5.js} +3 -3
- package/dist/{gbp-V2APGSIQ.js → gbp-IY55YRX3.js} +3 -3
- package/dist/{google-WFHYA3QT.js → google-7VNVJRG5.js} +4 -4
- package/dist/{google-marketing-5ROIKBC7.js → google-marketing-5VRNWIYL.js} +1 -1
- package/dist/{health-cmd-RGFAJ4YP.js → health-cmd-IYULMWYP.js} +3 -3
- package/dist/{history-RUSU66BZ.js → history-U47EQSVQ.js} +3 -3
- package/dist/index.d.ts +246 -69
- package/dist/index.js +25 -25
- package/dist/{init-YKLLVT7X.js → init-BB3AHJIC.js} +12 -12
- package/dist/{insights-4IFQLPS3.js → insights-TMOIYIN2.js} +3 -3
- package/dist/intelligence-service-PJYJZPJF.js +16 -0
- package/dist/{journeys-PTC2QY57.js → journeys-SBEEBTLZ.js} +3 -3
- package/dist/{keys-JASXI2SR.js → keys-B6WL56H5.js} +3 -3
- package/dist/{keyword-SK2HJXCJ.js → keyword-EVCBMO4R.js} +3 -3
- package/dist/{logs-AS5I5V2A.js → logs-NFHUPOV6.js} +3 -3
- package/dist/{mcp-BQSOYHEX.js → mcp-QJEEHLSF.js} +4 -4
- package/dist/mcp.js +9 -9
- package/dist/{measurement-plan-LZYYH3OD.js → measurement-plan-HZHP6HMF.js} +5 -5
- package/dist/{notify-JM6252F6.js → notify-FKSEZ2RI.js} +3 -3
- package/dist/{organic-evidence-L3Y6RZIH.js → organic-evidence-S5MUDRRT.js} +3 -3
- package/dist/{overview-VIF2GXYW.js → overview-3CIM4X6O.js} +4 -4
- package/dist/{project-FQEPFPRD.js → project-SFZVTTFG.js} +3 -3
- package/dist/{query-VKRESS6B.js → query-3CDC52ST.js} +3 -3
- package/dist/{research-6A6QWKN3.js → research-YXNYFECM.js} +3 -3
- package/dist/{results-export-VUB2ZD5B.js → results-export-INLGMMB2.js} +3 -3
- package/dist/{run-PG5GYZT7.js → run-BHF4QPOI.js} +4 -4
- package/dist/{schedule-EBGOLCQZ.js → schedule-QVYRWV6M.js} +3 -3
- package/dist/{search-NS4XPZRL.js → search-QXWAPV4H.js} +3 -3
- package/dist/{serve-VU3E7XTX.js → serve-Z23URYCX.js} +26 -26
- package/dist/{session-JKMEKQYL.js → session-DYXVMEHP.js} +13 -13
- package/dist/{settings-LNCAYCDF.js → settings-YMPACJEL.js} +3 -3
- package/dist/{skills-DWXA55QA.js → skills-ELKAS2QM.js} +2 -2
- package/dist/{snapshot-LX7OR7SO.js → snapshot-5AFQZZCJ.js} +3 -3
- package/dist/{src-QC2VNJWJ.js → src-6NEOIOJN.js} +4 -2
- package/dist/{status-DQ6FNWUT.js → status-NCP3TWKF.js} +4 -4
- package/dist/{technical-aeo-5GU2IY6W.js → technical-aeo-44AW2Q7L.js} +3 -3
- package/dist/{telemetry-QK2GPII3.js → telemetry-3SZE36LD.js} +4 -4
- package/dist/{tools-LGTWLH5Y.js → tools-YLGNUOH6.js} +11 -11
- package/dist/{traffic-2JFQKVAX.js → traffic-CHXA7CWW.js} +30 -7
- package/dist/{users-7OJ2RGV3.js → users-HGMPXPZT.js} +3 -3
- package/dist/{visibility-stats-VR25XMMY.js → visibility-stats-QZXKJI5B.js} +3 -3
- package/dist/{wordpress-JYXTF4PL.js → wordpress-C3FM3ZP6.js} +3 -3
- package/package.json +1 -1
- package/dist/intelligence-service-5STL6A45.js +0 -16
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
answerServiceAdapters,
|
|
3
3
|
answerServiceDescriptors
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-EDV5YR2J.js";
|
|
5
5
|
import {
|
|
6
6
|
AeroLlmUsageFeatures,
|
|
7
7
|
aeroTurnStatus,
|
|
@@ -27,14 +27,14 @@ import {
|
|
|
27
27
|
resolveConfiguredAgentProvider,
|
|
28
28
|
resolveSessionProviderAndModel,
|
|
29
29
|
setAeroSystemPrompt
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-QVMUMIG4.js";
|
|
31
31
|
import {
|
|
32
32
|
AeroToolProfiles,
|
|
33
33
|
AeroToolScopes,
|
|
34
34
|
buildAeroStateTools,
|
|
35
35
|
isAeroToolProfile,
|
|
36
36
|
truncateToolResult
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-VSWED7DX.js";
|
|
38
38
|
import {
|
|
39
39
|
getGoogleAuthConfig,
|
|
40
40
|
getGoogleConnection,
|
|
@@ -53,7 +53,7 @@ import {
|
|
|
53
53
|
removeCloudflareTrafficConnection,
|
|
54
54
|
removeCloudflareTrafficConnectionBySourceId,
|
|
55
55
|
upsertCloudflareTrafficConnection
|
|
56
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-YJ4EEYIP.js";
|
|
57
57
|
import {
|
|
58
58
|
claudeAdapter,
|
|
59
59
|
embedQueries,
|
|
@@ -64,7 +64,7 @@ import {
|
|
|
64
64
|
openaiAdapter,
|
|
65
65
|
openrouterAdapter,
|
|
66
66
|
perplexityAdapter
|
|
67
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-J5K7QM3U.js";
|
|
68
68
|
import {
|
|
69
69
|
classifyUsageSurface,
|
|
70
70
|
createApiUsageTelemetry,
|
|
@@ -76,7 +76,7 @@ import {
|
|
|
76
76
|
startOutcomeTimer,
|
|
77
77
|
trackFeatureCompleted,
|
|
78
78
|
trackInstallState
|
|
79
|
-
} from "./chunk-
|
|
79
|
+
} from "./chunk-F3EJRABZ.js";
|
|
80
80
|
import {
|
|
81
81
|
isLoopbackBindHost
|
|
82
82
|
} from "./chunk-TSENU4GG.js";
|
|
@@ -84,7 +84,7 @@ import {
|
|
|
84
84
|
isApiProviderRegistrable,
|
|
85
85
|
isCdpProviderRegistrable,
|
|
86
86
|
registeredProviderNames
|
|
87
|
-
} from "./chunk-
|
|
87
|
+
} from "./chunk-Z6HMIMK2.js";
|
|
88
88
|
import {
|
|
89
89
|
checkLatestVersionForServer,
|
|
90
90
|
getOrCreateAnonymousId,
|
|
@@ -96,17 +96,17 @@ import {
|
|
|
96
96
|
recordDashboardEvent,
|
|
97
97
|
setTelemetryPreference,
|
|
98
98
|
trackEvent
|
|
99
|
-
} from "./chunk-
|
|
99
|
+
} from "./chunk-HPCDCZJW.js";
|
|
100
100
|
import {
|
|
101
101
|
createCanonryMcpServer
|
|
102
|
-
} from "./chunk-
|
|
102
|
+
} from "./chunk-CR6OF4SL.js";
|
|
103
103
|
import {
|
|
104
104
|
CANONRY_MCP_TIERS,
|
|
105
105
|
CANONRY_MCP_TOOLKIT_NAMES
|
|
106
106
|
} from "./chunk-JI7FDO7I.js";
|
|
107
107
|
import {
|
|
108
108
|
ApiClient
|
|
109
|
-
} from "./chunk-
|
|
109
|
+
} from "./chunk-YJ7FKGRE.js";
|
|
110
110
|
import {
|
|
111
111
|
AGENT_PROVIDERS,
|
|
112
112
|
adapterSupportsBatch,
|
|
@@ -138,21 +138,21 @@ import {
|
|
|
138
138
|
saveConfigPatch,
|
|
139
139
|
sentimentInstallReadiness,
|
|
140
140
|
updateSharedProviderExecutionGate
|
|
141
|
-
} from "./chunk-
|
|
141
|
+
} from "./chunk-6ST5JIUJ.js";
|
|
142
142
|
import {
|
|
143
143
|
getBundledSkillSnapshots
|
|
144
|
-
} from "./chunk-
|
|
144
|
+
} from "./chunk-TJA6Z5FV.js";
|
|
145
145
|
import {
|
|
146
146
|
computeFactorAverages,
|
|
147
147
|
deleteSiteCrawlGraphLayout,
|
|
148
148
|
persistSiteCrawlGraphLayout,
|
|
149
149
|
prepareSiteCrawlGraphLayout,
|
|
150
150
|
recordedSharePct
|
|
151
|
-
} from "./chunk-
|
|
151
|
+
} from "./chunk-KRKOTKTY.js";
|
|
152
152
|
import {
|
|
153
153
|
CanonryMcpToolNames,
|
|
154
154
|
canonryMcpTools
|
|
155
|
-
} from "./chunk-
|
|
155
|
+
} from "./chunk-M6IABRSO.js";
|
|
156
156
|
import {
|
|
157
157
|
PACKAGE_VERSION
|
|
158
158
|
} from "./chunk-AOJU5LKX.js";
|
|
@@ -161,16 +161,16 @@ import {
|
|
|
161
161
|
} from "./chunk-HGMYEDAQ.js";
|
|
162
162
|
import {
|
|
163
163
|
IntelligenceService
|
|
164
|
-
} from "./chunk-
|
|
164
|
+
} from "./chunk-Q6I2FSVG.js";
|
|
165
165
|
import {
|
|
166
166
|
addLogListener,
|
|
167
167
|
createFastifyLogger,
|
|
168
168
|
createLogger
|
|
169
|
-
} from "./chunk-
|
|
169
|
+
} from "./chunk-ATOAIF2W.js";
|
|
170
170
|
import {
|
|
171
171
|
computeCitedCompetitorDomains,
|
|
172
172
|
determineCitationState
|
|
173
|
-
} from "./chunk-
|
|
173
|
+
} from "./chunk-GRS5UBVQ.js";
|
|
174
174
|
import {
|
|
175
175
|
BingApiError,
|
|
176
176
|
CC_CACHE_DIR,
|
|
@@ -291,7 +291,7 @@ import {
|
|
|
291
291
|
webhookResponseReason,
|
|
292
292
|
webhookTargetRefusalReason,
|
|
293
293
|
writeAuditLog
|
|
294
|
-
} from "./chunk-
|
|
294
|
+
} from "./chunk-IJGPHVZU.js";
|
|
295
295
|
import {
|
|
296
296
|
OperationalLogStore,
|
|
297
297
|
SentimentIdempotencyConflict,
|
|
@@ -377,7 +377,7 @@ import {
|
|
|
377
377
|
siteLivenessState,
|
|
378
378
|
trafficSources,
|
|
379
379
|
usageCounters
|
|
380
|
-
} from "./chunk-
|
|
380
|
+
} from "./chunk-AX7BBB3S.js";
|
|
381
381
|
import {
|
|
382
382
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
383
383
|
AI_ENGINE_DOMAINS,
|
|
@@ -633,7 +633,7 @@ import {
|
|
|
633
633
|
winnabilityClassLabel,
|
|
634
634
|
withRetry,
|
|
635
635
|
withSkippedProviders
|
|
636
|
-
} from "./chunk-
|
|
636
|
+
} from "./chunk-BALMAZTD.js";
|
|
637
637
|
|
|
638
638
|
// src/google-marketing-runtime.ts
|
|
639
639
|
import crypto2 from "crypto";
|
|
@@ -5937,7 +5937,7 @@ function nonBlank(value) {
|
|
|
5937
5937
|
return trimmed ? trimmed : void 0;
|
|
5938
5938
|
}
|
|
5939
5939
|
function resolveBuildCommit(env = process.env) {
|
|
5940
|
-
const embedded = true ? "
|
|
5940
|
+
const embedded = true ? "a4ed15d8219d2d213822af84a858373c4f56fa78" : void 0;
|
|
5941
5941
|
return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
|
|
5942
5942
|
}
|
|
5943
5943
|
function resolveInstanceIdentity(env = process.env) {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getRequestContext
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-SJYKKUH5.js";
|
|
4
4
|
import {
|
|
5
5
|
diagnosticIdentity,
|
|
6
6
|
redactLogString,
|
|
7
7
|
redactLogValue
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-BALMAZTD.js";
|
|
9
9
|
|
|
10
10
|
// ../api-routes/src/runtime-logger.ts
|
|
11
11
|
import { format } from "util";
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
templateLinkRatio,
|
|
21
21
|
templateLinkUbiquityAvailable,
|
|
22
22
|
validationError
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-BALMAZTD.js";
|
|
24
24
|
import {
|
|
25
25
|
__export
|
|
26
26
|
} from "./chunk-MLKGABMK.js";
|
|
@@ -174,6 +174,7 @@ __export(schema_exports, {
|
|
|
174
174
|
siteLivenessState: () => siteLivenessState,
|
|
175
175
|
trafficEventReceipts: () => trafficEventReceipts,
|
|
176
176
|
trafficSources: () => trafficSources,
|
|
177
|
+
unrecognizedAgentEventsHourly: () => unrecognizedAgentEventsHourly,
|
|
177
178
|
usageCounters: () => usageCounters,
|
|
178
179
|
userSessions: () => userSessions,
|
|
179
180
|
users: () => users
|
|
@@ -2553,6 +2554,21 @@ var aiUserFetchVerificationManifestsHourly = sqliteTable2("ai_user_fetch_verific
|
|
|
2553
2554
|
}).onDelete("cascade"),
|
|
2554
2555
|
index2("idx_ai_user_fetch_verification_manifests_project_ts").on(table.projectId, table.tsHour)
|
|
2555
2556
|
]);
|
|
2557
|
+
var unrecognizedAgentEventsHourly = sqliteTable2("unrecognized_agent_events_hourly", {
|
|
2558
|
+
projectId: text2("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
|
|
2559
|
+
sourceId: text2("source_id").notNull().references(() => trafficSources.id, { onDelete: "cascade" }),
|
|
2560
|
+
tsHour: text2("ts_hour").notNull(),
|
|
2561
|
+
agentName: text2("agent_name").notNull(),
|
|
2562
|
+
hits: integer2("hits").notNull().default(0),
|
|
2563
|
+
sampledUserAgent: text2("sampled_user_agent"),
|
|
2564
|
+
sampledPath: text2("sampled_path"),
|
|
2565
|
+
createdAt: text2("created_at").notNull(),
|
|
2566
|
+
updatedAt: text2("updated_at").notNull()
|
|
2567
|
+
}, (table) => [
|
|
2568
|
+
primaryKey2({ columns: [table.projectId, table.sourceId, table.tsHour, table.agentName] }),
|
|
2569
|
+
index2("idx_unrecognized_agent_hourly_project_ts").on(table.projectId, table.tsHour),
|
|
2570
|
+
index2("idx_unrecognized_agent_hourly_project_name").on(table.projectId, table.agentName)
|
|
2571
|
+
]);
|
|
2556
2572
|
var aiReferralEventsHourly = sqliteTable2("ai_referral_events_hourly", {
|
|
2557
2573
|
projectId: text2("project_id").notNull().references(() => projects.id, { onDelete: "cascade" }),
|
|
2558
2574
|
sourceId: text2("source_id").notNull().references(() => trafficSources.id, { onDelete: "cascade" }),
|
|
@@ -8370,6 +8386,26 @@ var MIGRATION_VERSIONS = [
|
|
|
8370
8386
|
statements: [
|
|
8371
8387
|
`UPDATE raw_event_samples SET event_type = 'ai_user_fetch' WHERE event_type = 'ai-user-fetch'`
|
|
8372
8388
|
]
|
|
8389
|
+
},
|
|
8390
|
+
{
|
|
8391
|
+
version: 201,
|
|
8392
|
+
name: "unrecognized-agent-events-hourly",
|
|
8393
|
+
statements: [
|
|
8394
|
+
`CREATE TABLE IF NOT EXISTS unrecognized_agent_events_hourly (
|
|
8395
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
8396
|
+
source_id TEXT NOT NULL REFERENCES traffic_sources(id) ON DELETE CASCADE,
|
|
8397
|
+
ts_hour TEXT NOT NULL,
|
|
8398
|
+
agent_name TEXT NOT NULL,
|
|
8399
|
+
hits INTEGER NOT NULL DEFAULT 0,
|
|
8400
|
+
sampled_user_agent TEXT,
|
|
8401
|
+
sampled_path TEXT,
|
|
8402
|
+
created_at TEXT NOT NULL,
|
|
8403
|
+
updated_at TEXT NOT NULL,
|
|
8404
|
+
PRIMARY KEY (project_id, source_id, ts_hour, agent_name)
|
|
8405
|
+
)`,
|
|
8406
|
+
`CREATE INDEX IF NOT EXISTS idx_unrecognized_agent_hourly_project_ts ON unrecognized_agent_events_hourly(project_id, ts_hour)`,
|
|
8407
|
+
`CREATE INDEX IF NOT EXISTS idx_unrecognized_agent_hourly_project_name ON unrecognized_agent_events_hourly(project_id, agent_name)`
|
|
8408
|
+
]
|
|
8373
8409
|
}
|
|
8374
8410
|
];
|
|
8375
8411
|
var AERO_LEDGER_REBUILDS = [
|
|
@@ -9875,6 +9911,7 @@ export {
|
|
|
9875
9911
|
crawlerVerificationManifestsHourly,
|
|
9876
9912
|
aiUserFetchEventsHourly,
|
|
9877
9913
|
aiUserFetchVerificationManifestsHourly,
|
|
9914
|
+
unrecognizedAgentEventsHourly,
|
|
9878
9915
|
aiReferralEventsHourly,
|
|
9879
9916
|
rawEventSamples,
|
|
9880
9917
|
RawEventSampleEventTypes,
|
|
@@ -13537,6 +13537,7 @@ var STORED_READ_OPERATIONS = /* @__PURE__ */ new Set([
|
|
|
13537
13537
|
"GET /api/v1/projects/{name}/ga/acquisition",
|
|
13538
13538
|
"GET /api/v1/projects/{name}/traffic/referral-assessment",
|
|
13539
13539
|
"GET /api/v1/projects/{name}/traffic/samples",
|
|
13540
|
+
"GET /api/v1/projects/{name}/traffic/unrecognized-agents",
|
|
13540
13541
|
"GET /api/v1/projects/{name}/journeys/summary",
|
|
13541
13542
|
"GET /api/v1/projects/{name}/journeys",
|
|
13542
13543
|
"GET /api/v1/projects/{name}/journeys/{visitorKey}",
|
|
@@ -19271,6 +19272,32 @@ var trafficSamplesQuerySchema = z57.object({
|
|
|
19271
19272
|
limit: z57.number().int().min(1).max(500).optional(),
|
|
19272
19273
|
offset: z57.number().int().nonnegative().optional()
|
|
19273
19274
|
}).strict();
|
|
19275
|
+
var trafficUnrecognizedAgentsQuerySchema = z57.object({
|
|
19276
|
+
sourceId: z57.string().min(1).optional(),
|
|
19277
|
+
since: z57.union([z57.iso.datetime({ offset: true }), z57.iso.date()], { error: "Expected an ISO timestamp or YYYY-MM-DD date" }).optional(),
|
|
19278
|
+
until: z57.union([z57.iso.datetime({ offset: true }), z57.iso.date()], { error: "Expected an ISO timestamp or YYYY-MM-DD date" }).optional(),
|
|
19279
|
+
limit: z57.number().int().min(1).max(500).optional()
|
|
19280
|
+
}).strict();
|
|
19281
|
+
var trafficUnrecognizedAgentSchema = z57.object({
|
|
19282
|
+
name: z57.string(),
|
|
19283
|
+
hits: z57.number().int().nonnegative(),
|
|
19284
|
+
/** Earliest stored hour with a hit for this name, in any window. */
|
|
19285
|
+
firstSeenAt: z57.string(),
|
|
19286
|
+
/** Latest hour with a hit in the window. */
|
|
19287
|
+
lastSeenAt: z57.string(),
|
|
19288
|
+
sampleUserAgent: z57.string().nullable(),
|
|
19289
|
+
samplePath: z57.string().nullable(),
|
|
19290
|
+
sourceIds: z57.array(z57.string())
|
|
19291
|
+
});
|
|
19292
|
+
var trafficUnrecognizedAgentsResponseSchema = z57.object({
|
|
19293
|
+
scope: z57.object({ project: z57.string(), sourceId: z57.string().nullable() }),
|
|
19294
|
+
windowStart: z57.string(),
|
|
19295
|
+
windowEnd: z57.string(),
|
|
19296
|
+
/** Every name with a hit in the window; `agents` holds the busiest `limit` of them. */
|
|
19297
|
+
totalAgents: z57.number().int().nonnegative(),
|
|
19298
|
+
totalHits: z57.number().int().nonnegative(),
|
|
19299
|
+
agents: z57.array(trafficUnrecognizedAgentSchema)
|
|
19300
|
+
});
|
|
19274
19301
|
var sampleUserFetchSchema = z57.object({
|
|
19275
19302
|
botId: z57.string().nullish(),
|
|
19276
19303
|
operator: z57.string().nullish(),
|
|
@@ -27622,6 +27649,8 @@ export {
|
|
|
27622
27649
|
trafficEventsResponseSchema,
|
|
27623
27650
|
TrafficSampleKinds,
|
|
27624
27651
|
trafficSamplesQuerySchema,
|
|
27652
|
+
trafficUnrecognizedAgentsQuerySchema,
|
|
27653
|
+
trafficUnrecognizedAgentsResponseSchema,
|
|
27625
27654
|
trafficSampleClassifierSchema,
|
|
27626
27655
|
trafficSamplesResponseSchema,
|
|
27627
27656
|
JOURNEY_LOOKBACK_DAYS,
|
|
@@ -7,12 +7,12 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
createApiClient,
|
|
9
9
|
runWithUsageTags
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-YJ7FKGRE.js";
|
|
11
11
|
import {
|
|
12
12
|
canonryMcpTools,
|
|
13
13
|
mcpOutputSchema,
|
|
14
14
|
toolOperationAccess
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-M6IABRSO.js";
|
|
16
16
|
import {
|
|
17
17
|
PACKAGE_VERSION
|
|
18
18
|
} from "./chunk-AOJU5LKX.js";
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
isReadOnlyKey,
|
|
26
26
|
restrictedWriteScopes,
|
|
27
27
|
upgradeCaveatFor
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-BALMAZTD.js";
|
|
29
29
|
|
|
30
30
|
// src/mcp/server.ts
|
|
31
31
|
import { randomUUID } from "crypto";
|
|
@@ -2,13 +2,13 @@ import {
|
|
|
2
2
|
bucketCliCommandDuration,
|
|
3
3
|
isTelemetryEnabled,
|
|
4
4
|
trackEvent
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-HPCDCZJW.js";
|
|
6
6
|
import {
|
|
7
7
|
getConfigDir
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-6ST5JIUJ.js";
|
|
9
9
|
import {
|
|
10
10
|
currentOutcomeAttribution
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-SJYKKUH5.js";
|
|
12
12
|
import {
|
|
13
13
|
AGENT_NONE,
|
|
14
14
|
OutcomeSurfaces,
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
integrationConnectionPropertiesSchema,
|
|
20
20
|
normalizeAgentSlug,
|
|
21
21
|
usageSurfaceSchema
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-BALMAZTD.js";
|
|
23
23
|
|
|
24
24
|
// src/outcome-telemetry.ts
|
|
25
25
|
import fs from "fs";
|
|
@@ -7,27 +7,27 @@ import {
|
|
|
7
7
|
reparseStoredResult4,
|
|
8
8
|
reparseStoredResult5,
|
|
9
9
|
resolveStoredApiResponse
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-J5K7QM3U.js";
|
|
11
11
|
import {
|
|
12
12
|
loadConfig
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-6ST5JIUJ.js";
|
|
14
14
|
import {
|
|
15
15
|
isMachineFormat
|
|
16
16
|
} from "./chunk-HGMYEDAQ.js";
|
|
17
17
|
import {
|
|
18
18
|
determineCitationState
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-GRS5UBVQ.js";
|
|
20
20
|
import {
|
|
21
21
|
backfillProjectAnswerMentions,
|
|
22
22
|
competitorIdentityColumns,
|
|
23
23
|
createRunCompetitorResolver,
|
|
24
24
|
readMarketCompetitorNames,
|
|
25
25
|
refreshSnapshotMentionIdentity
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-IJGPHVZU.js";
|
|
27
27
|
import {
|
|
28
28
|
classifyAiUserFetch,
|
|
29
29
|
classifyCrawler
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-GK5H5QAH.js";
|
|
31
31
|
import {
|
|
32
32
|
RawEventSampleEventTypes,
|
|
33
33
|
aiUserFetchEventsHourly,
|
|
@@ -43,7 +43,7 @@ import {
|
|
|
43
43
|
querySnapshots,
|
|
44
44
|
rawEventSamples,
|
|
45
45
|
runs
|
|
46
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-AX7BBB3S.js";
|
|
47
47
|
import {
|
|
48
48
|
ProviderNames,
|
|
49
49
|
RetrievalContracts,
|
|
@@ -59,7 +59,7 @@ import {
|
|
|
59
59
|
extractRecommendedCompetitors,
|
|
60
60
|
normalizeUrlPath,
|
|
61
61
|
openRouterRouteModel
|
|
62
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-BALMAZTD.js";
|
|
63
63
|
|
|
64
64
|
// src/commands/backfill.ts
|
|
65
65
|
import { setImmediate as yieldToEventLoop } from "timers/promises";
|
|
@@ -437,7 +437,7 @@ No DB writes performed. Re-run without --dry-run to apply.`);
|
|
|
437
437
|
}
|
|
438
438
|
}
|
|
439
439
|
async function backfillInsightsCommand(project, opts) {
|
|
440
|
-
const { IntelligenceService } = await import("./intelligence-service-
|
|
440
|
+
const { IntelligenceService } = await import("./intelligence-service-PJYJZPJF.js");
|
|
441
441
|
const config = loadConfig();
|
|
442
442
|
const db = createClient(config.database);
|
|
443
443
|
migrate(db);
|
|
@@ -2,18 +2,18 @@ import {
|
|
|
2
2
|
configExists,
|
|
3
3
|
loadConfigRaw,
|
|
4
4
|
saveConfigPatch
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-6ST5JIUJ.js";
|
|
6
6
|
import {
|
|
7
7
|
BUNDLED_SKILL_NAMES,
|
|
8
8
|
installSkills
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-TJA6Z5FV.js";
|
|
10
10
|
import {
|
|
11
11
|
PACKAGE_VERSION
|
|
12
12
|
} from "./chunk-AOJU5LKX.js";
|
|
13
13
|
import {
|
|
14
14
|
SKILL_MANIFEST_FILENAME,
|
|
15
15
|
SkillsClients
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-BALMAZTD.js";
|
|
17
17
|
|
|
18
18
|
// src/skills-autosync.ts
|
|
19
19
|
import fs from "fs";
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
classifyJourneyEntry,
|
|
9
9
|
hostMatchesDomain,
|
|
10
10
|
hostOf
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-BALMAZTD.js";
|
|
12
12
|
|
|
13
13
|
// ../integration-traffic/src/ip-ranges/amazonbot.json
|
|
14
14
|
var amazonbot_default = {
|
|
@@ -14829,8 +14829,84 @@ function sessionizeJourneyRequests(requests, state, options) {
|
|
|
14829
14829
|
return { visits: [...visits.values()], events, visitors, dropped, capped };
|
|
14830
14830
|
}
|
|
14831
14831
|
|
|
14832
|
+
// ../integration-traffic/src/unlisted-agents.ts
|
|
14833
|
+
var UNLISTED_AGENT_SKIPPED_EXTENSIONS = [
|
|
14834
|
+
"avif",
|
|
14835
|
+
"bmp",
|
|
14836
|
+
"css",
|
|
14837
|
+
"gif",
|
|
14838
|
+
"ico",
|
|
14839
|
+
"jpeg",
|
|
14840
|
+
"jpg",
|
|
14841
|
+
"js",
|
|
14842
|
+
"map",
|
|
14843
|
+
"mjs",
|
|
14844
|
+
"mp3",
|
|
14845
|
+
"mp4",
|
|
14846
|
+
"otf",
|
|
14847
|
+
"png",
|
|
14848
|
+
"svg",
|
|
14849
|
+
"ttf",
|
|
14850
|
+
"webm",
|
|
14851
|
+
"webmanifest",
|
|
14852
|
+
"webp",
|
|
14853
|
+
"woff",
|
|
14854
|
+
"woff2",
|
|
14855
|
+
"zip"
|
|
14856
|
+
];
|
|
14857
|
+
var GENERIC_HTTP_CLIENTS = [
|
|
14858
|
+
"curl",
|
|
14859
|
+
"wget",
|
|
14860
|
+
"python",
|
|
14861
|
+
"python-requests",
|
|
14862
|
+
"python-urllib",
|
|
14863
|
+
"python-httpx",
|
|
14864
|
+
"aiohttp",
|
|
14865
|
+
"httpx",
|
|
14866
|
+
"go-http-client",
|
|
14867
|
+
"okhttp",
|
|
14868
|
+
"java",
|
|
14869
|
+
"apache-httpclient",
|
|
14870
|
+
"axios",
|
|
14871
|
+
"node",
|
|
14872
|
+
"node-fetch",
|
|
14873
|
+
"undici",
|
|
14874
|
+
"got",
|
|
14875
|
+
"libwww-perl",
|
|
14876
|
+
"guzzlehttp",
|
|
14877
|
+
"ruby",
|
|
14878
|
+
"faraday",
|
|
14879
|
+
"php",
|
|
14880
|
+
"wordpress",
|
|
14881
|
+
"dalvik",
|
|
14882
|
+
"postmanruntime",
|
|
14883
|
+
"insomnia"
|
|
14884
|
+
];
|
|
14885
|
+
var BROWSER_SHAPED_AGENT_MARKERS = ["compatible;", "fetch", "agent", "headless", "+http"];
|
|
14886
|
+
var PRODUCT_NAME_END = /[/\s;(]/;
|
|
14887
|
+
var SKIPPED_PATH = new RegExp(`\\.(?:${UNLISTED_AGENT_SKIPPED_EXTENSIONS.join("|")})$`, "i");
|
|
14888
|
+
var COMPATIBLE_NAME = /compatible;\s*([a-z0-9][a-z0-9._-]*)/;
|
|
14889
|
+
var BOT_LIKE_NAME = /([a-z0-9][a-z0-9._-]*(?:bot|crawler|spider|fetcher|agent|-user))\//;
|
|
14890
|
+
var HEADLESS_NAME = /\b(headless[a-z]*)\//;
|
|
14891
|
+
var BROWSER_COMPATIBLE_NAMES = ["msie"];
|
|
14892
|
+
var MAX_AGENT_NAME_LENGTH = 64;
|
|
14893
|
+
function unrecognizedAgentName(request) {
|
|
14894
|
+
const method = (request.method ?? "GET").toUpperCase();
|
|
14895
|
+
if (method !== "GET" && method !== "HEAD") return null;
|
|
14896
|
+
if (request.path && SKIPPED_PATH.test(request.path.split("?")[0] ?? "")) return null;
|
|
14897
|
+
const ua = (request.userAgent ?? "").trim().toLowerCase();
|
|
14898
|
+
if (!ua) return null;
|
|
14899
|
+
const product = ua.split(PRODUCT_NAME_END)[0] ?? "";
|
|
14900
|
+
if (!product || GENERIC_HTTP_CLIENTS.includes(product)) return null;
|
|
14901
|
+
if (product !== "mozilla") return product.slice(0, MAX_AGENT_NAME_LENGTH);
|
|
14902
|
+
const name = COMPATIBLE_NAME.exec(ua)?.[1] ?? BOT_LIKE_NAME.exec(ua)?.[1] ?? HEADLESS_NAME.exec(ua)?.[1];
|
|
14903
|
+
if (!name || BROWSER_COMPATIBLE_NAMES.includes(name)) return null;
|
|
14904
|
+
return name.slice(0, MAX_AGENT_NAME_LENGTH);
|
|
14905
|
+
}
|
|
14906
|
+
|
|
14832
14907
|
// ../integration-traffic/src/rollup.ts
|
|
14833
14908
|
var DEFAULT_SAMPLE_LIMIT = 25;
|
|
14909
|
+
var MAX_UNRECOGNIZED_AGENT_NAMES = 200;
|
|
14834
14910
|
var DEFAULT_AI_REFERRAL_SESSION_WINDOW_MS = 6e4;
|
|
14835
14911
|
var UUID_SEGMENT2 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
14836
14912
|
var LONG_HEX_SEGMENT2 = /^[0-9a-f]{16,}$/i;
|
|
@@ -14945,6 +15021,7 @@ function buildTrafficProbeReport(events, options = {}) {
|
|
|
14945
15021
|
const crawlerBuckets = /* @__PURE__ */ new Map();
|
|
14946
15022
|
const aiUserFetchBuckets = /* @__PURE__ */ new Map();
|
|
14947
15023
|
const aiReferralBuckets = /* @__PURE__ */ new Map();
|
|
15024
|
+
const unrecognizedAgentBuckets = /* @__PURE__ */ new Map();
|
|
14948
15025
|
const aiReferralSessions = /* @__PURE__ */ new Map();
|
|
14949
15026
|
const topBots = /* @__PURE__ */ new Map();
|
|
14950
15027
|
const topCrawlerPaths = /* @__PURE__ */ new Map();
|
|
@@ -15052,7 +15129,21 @@ function buildTrafficProbeReport(events, options = {}) {
|
|
|
15052
15129
|
aiReferralSessions.set(key, existing ? mergeReferralSession(existing, session) : session);
|
|
15053
15130
|
}
|
|
15054
15131
|
}
|
|
15055
|
-
if (!crawler && !aiUserFetch && !aiReferral)
|
|
15132
|
+
if (!crawler && !aiUserFetch && !aiReferral) {
|
|
15133
|
+
unknownHits += 1;
|
|
15134
|
+
const agentName = unrecognizedAgentName(event);
|
|
15135
|
+
if (agentName) {
|
|
15136
|
+
const key = `${tsHour} ${agentName}`;
|
|
15137
|
+
const existing = unrecognizedAgentBuckets.get(key);
|
|
15138
|
+
if (existing) {
|
|
15139
|
+
existing.hits += 1;
|
|
15140
|
+
existing.sampledUserAgent = event.userAgent ?? existing.sampledUserAgent;
|
|
15141
|
+
existing.sampledPath = pathNormalized;
|
|
15142
|
+
} else {
|
|
15143
|
+
unrecognizedAgentBuckets.set(key, { tsHour, agentName, hits: 1, sampledUserAgent: event.userAgent ?? "", sampledPath: pathNormalized });
|
|
15144
|
+
}
|
|
15145
|
+
}
|
|
15146
|
+
}
|
|
15056
15147
|
samples.push({
|
|
15057
15148
|
eventId: event.eventId,
|
|
15058
15149
|
observedAt: event.observedAt,
|
|
@@ -15118,6 +15209,7 @@ function buildTrafficProbeReport(events, options = {}) {
|
|
|
15118
15209
|
crawlerEventsHourly: [...crawlerBuckets.values()].sort(sortCrawlerBuckets),
|
|
15119
15210
|
aiUserFetchEventsHourly: [...aiUserFetchBuckets.values()].sort(sortAiUserFetchBuckets),
|
|
15120
15211
|
aiReferralEventsHourly: [...aiReferralBuckets.values()].sort(sortReferralBuckets),
|
|
15212
|
+
unrecognizedAgentEventsHourly: busiestUnrecognizedAgents(unrecognizedAgentBuckets),
|
|
15121
15213
|
topBots: topEntries(topBots, 10),
|
|
15122
15214
|
topCrawlerPaths: topEntries(topCrawlerPaths, 10),
|
|
15123
15215
|
topAiUserFetchBots: topEntries(topAiUserFetchBots, 10),
|
|
@@ -15127,6 +15219,14 @@ function buildTrafficProbeReport(events, options = {}) {
|
|
|
15127
15219
|
samples
|
|
15128
15220
|
};
|
|
15129
15221
|
}
|
|
15222
|
+
function busiestUnrecognizedAgents(buckets) {
|
|
15223
|
+
const hitsByName = /* @__PURE__ */ new Map();
|
|
15224
|
+
for (const bucket of buckets.values()) hitsByName.set(bucket.agentName, (hitsByName.get(bucket.agentName) ?? 0) + bucket.hits);
|
|
15225
|
+
const kept = new Set(
|
|
15226
|
+
[...hitsByName.entries()].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])).slice(0, MAX_UNRECOGNIZED_AGENT_NAMES).map(([name]) => name)
|
|
15227
|
+
);
|
|
15228
|
+
return [...buckets.values()].filter((bucket) => kept.has(bucket.agentName)).sort((a, b) => a.tsHour.localeCompare(b.tsHour) || a.agentName.localeCompare(b.agentName));
|
|
15229
|
+
}
|
|
15130
15230
|
function incrementBucket(map, key, fields) {
|
|
15131
15231
|
const existing = map.get(key);
|
|
15132
15232
|
if (existing) existing.hits += 1;
|
|
@@ -15184,7 +15284,8 @@ var DEFAULT_BOT_LIST = {
|
|
|
15184
15284
|
uaKeywords: [
|
|
15185
15285
|
...DEFAULT_AI_CRAWLER_USER_AGENT_SUBSTRINGS,
|
|
15186
15286
|
// Preserve a small forward-looking machine-traffic net. The shared
|
|
15187
|
-
// classifier still drops unknown products after delivery.
|
|
15287
|
+
// classifier still drops unknown products after delivery. Agents whose
|
|
15288
|
+
// names carry none of these words are caught by `isUnlistedAgent`.
|
|
15188
15289
|
"bot",
|
|
15189
15290
|
"crawler",
|
|
15190
15291
|
"spider"
|
|
@@ -15203,6 +15304,27 @@ var DEFAULT_BOT_SCORE_MAX_FORWARD = 30;
|
|
|
15203
15304
|
var WORKER_COMPATIBILITY_DATE = "2026-05-01";
|
|
15204
15305
|
var CLOUDFLARE_PAGE_VIEWS_VERSION_SUFFIX = "+page-views";
|
|
15205
15306
|
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"];
|
|
15307
|
+
var UNLISTED_AGENT_FILTER = `
|
|
15308
|
+
const UNLISTED_AGENT_SKIPPED_PATTERN = new RegExp(${JSON.stringify(`\\.(?:${UNLISTED_AGENT_SKIPPED_EXTENSIONS.join("|")})$`)}, 'i')
|
|
15309
|
+
const PRODUCT_NAME_END = new RegExp(${JSON.stringify("[/\\s;(]")})
|
|
15310
|
+
const GENERIC_HTTP_CLIENTS = ${JSON.stringify(GENERIC_HTTP_CLIENTS)}
|
|
15311
|
+
const BROWSER_SHAPED_AGENT_MARKERS = ${JSON.stringify(BROWSER_SHAPED_AGENT_MARKERS)}
|
|
15312
|
+
|
|
15313
|
+
function isUnlistedAgent(request) {
|
|
15314
|
+
const method = request.method || 'GET'
|
|
15315
|
+
if (method !== 'GET' && method !== 'HEAD') return false
|
|
15316
|
+
const ua = lower(request.headers.get('user-agent') || '').trim()
|
|
15317
|
+
if (!ua) return false
|
|
15318
|
+
const product = ua.split(PRODUCT_NAME_END)[0]
|
|
15319
|
+
if (GENERIC_HTTP_CLIENTS.indexOf(product) !== -1) return false
|
|
15320
|
+
if (product === 'mozilla' && !BROWSER_SHAPED_AGENT_MARKERS.some((marker) => ua.indexOf(marker) !== -1)) return false
|
|
15321
|
+
try {
|
|
15322
|
+
return !UNLISTED_AGENT_SKIPPED_PATTERN.test(new URL(request.url).pathname)
|
|
15323
|
+
} catch (_) {
|
|
15324
|
+
return false
|
|
15325
|
+
}
|
|
15326
|
+
}
|
|
15327
|
+
`;
|
|
15206
15328
|
var PAGE_VIEW_FILTER = `
|
|
15207
15329
|
const PAGE_VIEW_ASSET_PATTERN = new RegExp(${JSON.stringify(`\\.(?:${PAGE_VIEW_ASSET_EXTENSIONS.join("|")})$`)}, 'i')
|
|
15208
15330
|
|
|
@@ -15419,10 +15541,11 @@ function botSignals(cf) {
|
|
|
15419
15541
|
if (typeof cf.botScore === 'number' && cf.botScore < BOT_SCORE_MAX_FORWARD) return true
|
|
15420
15542
|
return false
|
|
15421
15543
|
}
|
|
15422
|
-
${pageViewFilter}
|
|
15544
|
+
${UNLISTED_AGENT_FILTER}${pageViewFilter}
|
|
15423
15545
|
function shouldForward(request) {
|
|
15424
15546
|
const ua = request.headers.get('user-agent') || ''
|
|
15425
15547
|
if (uaMatches(ua)) return true
|
|
15548
|
+
if (isUnlistedAgent(request)) return true
|
|
15426
15549
|
if (urlUtmMatches(request.url)) return true
|
|
15427
15550
|
const referer = request.headers.get('referer') || ''
|
|
15428
15551
|
if (refererMatches(referer)) return true
|