@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.
Files changed (131) hide show
  1. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +14 -0
  2. package/assets/agent-workspace/skills/canonry/references/server-side-traffic.md +13 -0
  3. package/assets/assets/{AgentSetupPage-Cr2ZU_4s.js → AgentSetupPage-vJPymut8.js} +1 -1
  4. package/assets/assets/{AuditHistoryPanel-Bb5wq-Bk.js → AuditHistoryPanel-BItu4Vzu.js} +1 -1
  5. package/assets/assets/{BacklinksPage-i1cfxTDj.js → BacklinksPage-BzYbNK-V.js} +1 -1
  6. package/assets/assets/{HistoryPage-C2NRdNrn.js → HistoryPage-B_llsE1v.js} +1 -1
  7. package/assets/assets/{MeasurementPropertyPage-ighxjOiq.js → MeasurementPropertyPage-CUoV6lhB.js} +1 -1
  8. package/assets/assets/{ProjectPage-DnAXCPle.js → ProjectPage-C6woOQUb.js} +1 -1
  9. package/assets/assets/{RunsPage-Ds5K3fOQ.js → RunsPage-D_2CO_AJ.js} +1 -1
  10. package/assets/assets/{SettingsPage-B8Jed-xH.js → SettingsPage-C-Ik_cYz.js} +1 -1
  11. package/assets/assets/{SiteHealthSection-cjNQasWj.js → SiteHealthSection-C-BOkaLy.js} +2 -2
  12. package/assets/assets/{ToneBadge-CUe-WrzN.js → ToneBadge-B8svjXgK.js} +3 -3
  13. package/assets/assets/{TrafficPage-BUid1rkh.js → TrafficPage-CZ8ylTak.js} +1 -1
  14. package/assets/assets/{TrafficSourceDetailPage-D3KHgRvF.js → TrafficSourceDetailPage-DFhPy-yp.js} +1 -1
  15. package/assets/assets/{account-context-B50QqDEA.js → account-context-BN8ksOuB.js} +1 -1
  16. package/assets/assets/{card-BE2fqwVq.js → card-BKhZmy5E.js} +1 -1
  17. package/assets/assets/{extract-error-message-xuN_xeRJ.js → extract-error-message-CJvSceYp.js} +1 -1
  18. package/assets/assets/{format-helpers-CiC6gALY.js → format-helpers-DN6eKZvA.js} +1 -1
  19. package/assets/assets/{index-BhoSVTom.js → index-D-lS_O3g.js} +4 -4
  20. package/assets/assets/{query-client-C5GhDMY7.js → query-client-X8eRXjbT.js} +1 -1
  21. package/assets/assets/{react-query-CmHyfYFq.js → react-query-DOLt-sL-.js} +1 -1
  22. package/assets/assets/{react-sigma_core.esm.min-SbOH7c6K.js → react-sigma_core.esm.min-DOMHedxL.js} +1 -1
  23. package/assets/assets/{service-B2i_ZzWP.js → service-BiQUl6ZL.js} +1 -1
  24. package/assets/index.html +7 -7
  25. package/dist/{ads-MNMND5VH.js → ads-XDPKJZD5.js} +3 -3
  26. package/dist/{agent-4KNDL3D3.js → agent-TLMUNKYG.js} +7 -7
  27. package/dist/{agent-ask-32RTOL2M.js → agent-ask-J3OIR65S.js} +3 -3
  28. package/dist/{agent-conversations-BXVWHUZC.js → agent-conversations-KLLYICAB.js} +3 -3
  29. package/dist/{agent-memory-7R7UVFS5.js → agent-memory-HVT2M2AW.js} +3 -3
  30. package/dist/{agent-providers-QGVLCCH4.js → agent-providers-QMS2NZTY.js} +3 -3
  31. package/dist/{agent-transcript-7Y6BJCIT.js → agent-transcript-V7UCK257.js} +3 -3
  32. package/dist/{analytics-YOGEHW6J.js → analytics-37Z5MGHQ.js} +3 -3
  33. package/dist/{apply-TB3MF3PH.js → apply-F3YZEJD4.js} +3 -3
  34. package/dist/{backfill-SRE52FDL.js → backfill-3YUPT5T2.js} +9 -9
  35. package/dist/{backlinks-6GTL324T.js → backlinks-GDTPG3SB.js} +3 -3
  36. package/dist/{bing-OMQACSDY.js → bing-H7D5KUQF.js} +3 -3
  37. package/dist/{bootstrap-ITVA7X45.js → bootstrap-JLC26QRM.js} +10 -10
  38. package/dist/{cdp-3WBLAWOL.js → cdp-WVMC4V4P.js} +7 -7
  39. package/dist/{chunk-2EWZ3DJ4.js → chunk-2ZRCLJQX.js} +3 -3
  40. package/dist/{chunk-KF7I7FBI.js → chunk-4EPCWJAM.js} +2 -2
  41. package/dist/{chunk-3QJWOF2B.js → chunk-6ST5JIUJ.js} +1 -1
  42. package/dist/{chunk-QOKK5PMO.js → chunk-6T7JZS67.js} +21 -21
  43. package/dist/{chunk-TZRYVW75.js → chunk-ATOAIF2W.js} +2 -2
  44. package/dist/{chunk-HRFPGXON.js → chunk-AX7BBB3S.js} +38 -1
  45. package/dist/{chunk-PM2DB3HE.js → chunk-BALMAZTD.js} +29 -0
  46. package/dist/{chunk-RPTOVEZT.js → chunk-CR6OF4SL.js} +3 -3
  47. package/dist/{chunk-WSWHLKKJ.js → chunk-EDV5YR2J.js} +1 -1
  48. package/dist/{chunk-PLLDJUG2.js → chunk-F3EJRABZ.js} +4 -4
  49. package/dist/{chunk-ZHFE6J3A.js → chunk-FFS6J325.js} +1 -1
  50. package/dist/{chunk-6OCQTAXU.js → chunk-FOQUCSNN.js} +8 -8
  51. package/dist/{chunk-BLZCNL3B.js → chunk-FQYMARCU.js} +3 -3
  52. package/dist/{chunk-O4WBYEGV.js → chunk-GK5H5QAH.js} +127 -4
  53. package/dist/{chunk-JERATA5R.js → chunk-GRS5UBVQ.js} +1 -1
  54. package/dist/{chunk-SWWZ733W.js → chunk-H5WAYPLS.js} +4 -4
  55. package/dist/{chunk-4GEEYY3N.js → chunk-HPCDCZJW.js} +2 -2
  56. package/dist/{chunk-KUMHO22S.js → chunk-IJGPHVZU.js} +1482 -1354
  57. package/dist/{chunk-7S6SQFFT.js → chunk-J5K7QM3U.js} +2 -2
  58. package/dist/{chunk-OIRHCT63.js → chunk-KRKOTKTY.js} +2 -2
  59. package/dist/{chunk-6ACWXQNZ.js → chunk-L6R6MSWW.js} +2 -1
  60. package/dist/{chunk-MUYTDD35.js → chunk-M6IABRSO.js} +18 -3
  61. package/dist/{chunk-72YPSNCG.js → chunk-OHXAS7LT.js} +2 -2
  62. package/dist/{chunk-R26CF4WT.js → chunk-PR2JM2FR.js} +2 -2
  63. package/dist/{chunk-ZMMS3FAR.js → chunk-Q6I2FSVG.js} +5 -5
  64. package/dist/{chunk-27MGZQ6Z.js → chunk-QVMUMIG4.js} +6 -6
  65. package/dist/{chunk-3MGM3U6V.js → chunk-SJYKKUH5.js} +1 -1
  66. package/dist/{chunk-45RGH7XI.js → chunk-SSTQINNT.js} +3 -3
  67. package/dist/{chunk-AI44ZCMK.js → chunk-TJA6Z5FV.js} +1 -1
  68. package/dist/{chunk-7HB6QLX4.js → chunk-TKOJAZ6S.js} +1 -1
  69. package/dist/{chunk-I7RTAHCL.js → chunk-VSWED7DX.js} +4 -4
  70. package/dist/{chunk-DEQC5XVD.js → chunk-WR2VQ5TF.js} +347 -335
  71. package/dist/{chunk-KZB6HLFT.js → chunk-YJ4EEYIP.js} +1 -1
  72. package/dist/{chunk-7OAXEMOF.js → chunk-YJ7FKGRE.js} +10 -2
  73. package/dist/{chunk-FCYGY4FT.js → chunk-Z6HMIMK2.js} +1 -1
  74. package/dist/{citations-PGG7JEIN.js → citations-LQEXT3QX.js} +3 -3
  75. package/dist/{cli-catalog-KC6JYHSW.js → cli-catalog-FQ3GU4I7.js} +3 -3
  76. package/dist/{cli-commands-BZLUMYKR.js → cli-commands-V5ITGQYI.js} +7 -7
  77. package/dist/cli.js +13 -13
  78. package/dist/{competitor-B3CZOKZU.js → competitor-LNBFBUHM.js} +3 -3
  79. package/dist/{content-Z4XJMZB4.js → content-SXOXACBG.js} +3 -3
  80. package/dist/{dashboard-43ST35IW.js → dashboard-VQ7ZJM3Z.js} +6 -6
  81. package/dist/{demo-COMFIESH.js → demo-MVF5RBLW.js} +1 -1
  82. package/dist/{demo-server-MRGL3SNP.js → demo-server-O4GV5RCH.js} +12 -12
  83. package/dist/{discover-OT3K7KQK.js → discover-62BQKXZE.js} +3 -3
  84. package/dist/{discover-eval-DN4J4KD5.js → discover-eval-6UYCPXIC.js} +3 -3
  85. package/dist/{doctor-UDF6OCSR.js → doctor-GAD732OH.js} +3 -3
  86. package/dist/{evidence-Z364UFOD.js → evidence-HMBZTISH.js} +3 -3
  87. package/dist/{export-cmd-K27XN4G5.js → export-cmd-H4QAPQLL.js} +3 -3
  88. package/dist/{ga-Q2CELDLG.js → ga-EIUF4YK5.js} +3 -3
  89. package/dist/{gbp-V2APGSIQ.js → gbp-IY55YRX3.js} +3 -3
  90. package/dist/{google-WFHYA3QT.js → google-7VNVJRG5.js} +4 -4
  91. package/dist/{google-marketing-5ROIKBC7.js → google-marketing-5VRNWIYL.js} +1 -1
  92. package/dist/{health-cmd-RGFAJ4YP.js → health-cmd-IYULMWYP.js} +3 -3
  93. package/dist/{history-RUSU66BZ.js → history-U47EQSVQ.js} +3 -3
  94. package/dist/index.d.ts +246 -69
  95. package/dist/index.js +25 -25
  96. package/dist/{init-YKLLVT7X.js → init-BB3AHJIC.js} +12 -12
  97. package/dist/{insights-4IFQLPS3.js → insights-TMOIYIN2.js} +3 -3
  98. package/dist/intelligence-service-PJYJZPJF.js +16 -0
  99. package/dist/{journeys-PTC2QY57.js → journeys-SBEEBTLZ.js} +3 -3
  100. package/dist/{keys-JASXI2SR.js → keys-B6WL56H5.js} +3 -3
  101. package/dist/{keyword-SK2HJXCJ.js → keyword-EVCBMO4R.js} +3 -3
  102. package/dist/{logs-AS5I5V2A.js → logs-NFHUPOV6.js} +3 -3
  103. package/dist/{mcp-BQSOYHEX.js → mcp-QJEEHLSF.js} +4 -4
  104. package/dist/mcp.js +9 -9
  105. package/dist/{measurement-plan-LZYYH3OD.js → measurement-plan-HZHP6HMF.js} +5 -5
  106. package/dist/{notify-JM6252F6.js → notify-FKSEZ2RI.js} +3 -3
  107. package/dist/{organic-evidence-L3Y6RZIH.js → organic-evidence-S5MUDRRT.js} +3 -3
  108. package/dist/{overview-VIF2GXYW.js → overview-3CIM4X6O.js} +4 -4
  109. package/dist/{project-FQEPFPRD.js → project-SFZVTTFG.js} +3 -3
  110. package/dist/{query-VKRESS6B.js → query-3CDC52ST.js} +3 -3
  111. package/dist/{research-6A6QWKN3.js → research-YXNYFECM.js} +3 -3
  112. package/dist/{results-export-VUB2ZD5B.js → results-export-INLGMMB2.js} +3 -3
  113. package/dist/{run-PG5GYZT7.js → run-BHF4QPOI.js} +4 -4
  114. package/dist/{schedule-EBGOLCQZ.js → schedule-QVYRWV6M.js} +3 -3
  115. package/dist/{search-NS4XPZRL.js → search-QXWAPV4H.js} +3 -3
  116. package/dist/{serve-VU3E7XTX.js → serve-Z23URYCX.js} +26 -26
  117. package/dist/{session-JKMEKQYL.js → session-DYXVMEHP.js} +13 -13
  118. package/dist/{settings-LNCAYCDF.js → settings-YMPACJEL.js} +3 -3
  119. package/dist/{skills-DWXA55QA.js → skills-ELKAS2QM.js} +2 -2
  120. package/dist/{snapshot-LX7OR7SO.js → snapshot-5AFQZZCJ.js} +3 -3
  121. package/dist/{src-QC2VNJWJ.js → src-6NEOIOJN.js} +4 -2
  122. package/dist/{status-DQ6FNWUT.js → status-NCP3TWKF.js} +4 -4
  123. package/dist/{technical-aeo-5GU2IY6W.js → technical-aeo-44AW2Q7L.js} +3 -3
  124. package/dist/{telemetry-QK2GPII3.js → telemetry-3SZE36LD.js} +4 -4
  125. package/dist/{tools-LGTWLH5Y.js → tools-YLGNUOH6.js} +11 -11
  126. package/dist/{traffic-2JFQKVAX.js → traffic-CHXA7CWW.js} +30 -7
  127. package/dist/{users-7OJ2RGV3.js → users-HGMPXPZT.js} +3 -3
  128. package/dist/{visibility-stats-VR25XMMY.js → visibility-stats-QZXKJI5B.js} +3 -3
  129. package/dist/{wordpress-JYXTF4PL.js → wordpress-C3FM3ZP6.js} +3 -3
  130. package/package.json +1 -1
  131. package/dist/intelligence-service-5STL6A45.js +0 -16
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  answerServiceAdapters,
3
3
  answerServiceDescriptors
4
- } from "./chunk-WSWHLKKJ.js";
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-27MGZQ6Z.js";
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-I7RTAHCL.js";
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-KZB6HLFT.js";
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-7S6SQFFT.js";
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-PLLDJUG2.js";
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-FCYGY4FT.js";
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-4GEEYY3N.js";
99
+ } from "./chunk-HPCDCZJW.js";
100
100
  import {
101
101
  createCanonryMcpServer
102
- } from "./chunk-RPTOVEZT.js";
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-7OAXEMOF.js";
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-3QJWOF2B.js";
141
+ } from "./chunk-6ST5JIUJ.js";
142
142
  import {
143
143
  getBundledSkillSnapshots
144
- } from "./chunk-AI44ZCMK.js";
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-OIRHCT63.js";
151
+ } from "./chunk-KRKOTKTY.js";
152
152
  import {
153
153
  CanonryMcpToolNames,
154
154
  canonryMcpTools
155
- } from "./chunk-MUYTDD35.js";
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-ZMMS3FAR.js";
164
+ } from "./chunk-Q6I2FSVG.js";
165
165
  import {
166
166
  addLogListener,
167
167
  createFastifyLogger,
168
168
  createLogger
169
- } from "./chunk-TZRYVW75.js";
169
+ } from "./chunk-ATOAIF2W.js";
170
170
  import {
171
171
  computeCitedCompetitorDomains,
172
172
  determineCitationState
173
- } from "./chunk-JERATA5R.js";
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-KUMHO22S.js";
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-HRFPGXON.js";
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-PM2DB3HE.js";
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 ? "7d17991013508621d89f3b6ce69a1ea77ae372ad" : void 0;
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-3MGM3U6V.js";
3
+ } from "./chunk-SJYKKUH5.js";
4
4
  import {
5
5
  diagnosticIdentity,
6
6
  redactLogString,
7
7
  redactLogValue
8
- } from "./chunk-PM2DB3HE.js";
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-PM2DB3HE.js";
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-7OAXEMOF.js";
10
+ } from "./chunk-YJ7FKGRE.js";
11
11
  import {
12
12
  canonryMcpTools,
13
13
  mcpOutputSchema,
14
14
  toolOperationAccess
15
- } from "./chunk-MUYTDD35.js";
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-PM2DB3HE.js";
28
+ } from "./chunk-BALMAZTD.js";
29
29
 
30
30
  // src/mcp/server.ts
31
31
  import { randomUUID } from "crypto";
@@ -28,7 +28,7 @@ import {
28
28
  unknownUsageObservation,
29
29
  usdToMicros,
30
30
  withRetry
31
- } from "./chunk-PM2DB3HE.js";
31
+ } from "./chunk-BALMAZTD.js";
32
32
 
33
33
  // ../provider-answer-services/src/core/http.ts
34
34
  var MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
@@ -2,13 +2,13 @@ import {
2
2
  bucketCliCommandDuration,
3
3
  isTelemetryEnabled,
4
4
  trackEvent
5
- } from "./chunk-4GEEYY3N.js";
5
+ } from "./chunk-HPCDCZJW.js";
6
6
  import {
7
7
  getConfigDir
8
- } from "./chunk-3QJWOF2B.js";
8
+ } from "./chunk-6ST5JIUJ.js";
9
9
  import {
10
10
  currentOutcomeAttribution
11
- } from "./chunk-3MGM3U6V.js";
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-PM2DB3HE.js";
22
+ } from "./chunk-BALMAZTD.js";
23
23
 
24
24
  // src/outcome-telemetry.ts
25
25
  import fs from "fs";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-HGMYEDAQ.js";
5
5
  import {
6
6
  describeError
7
- } from "./chunk-PM2DB3HE.js";
7
+ } from "./chunk-BALMAZTD.js";
8
8
 
9
9
  // src/gsc-sitemap-submission.ts
10
10
  function dedupeGscSitemapUrls(urls) {
@@ -7,27 +7,27 @@ import {
7
7
  reparseStoredResult4,
8
8
  reparseStoredResult5,
9
9
  resolveStoredApiResponse
10
- } from "./chunk-7S6SQFFT.js";
10
+ } from "./chunk-J5K7QM3U.js";
11
11
  import {
12
12
  loadConfig
13
- } from "./chunk-3QJWOF2B.js";
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-JERATA5R.js";
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-KUMHO22S.js";
26
+ } from "./chunk-IJGPHVZU.js";
27
27
  import {
28
28
  classifyAiUserFetch,
29
29
  classifyCrawler
30
- } from "./chunk-O4WBYEGV.js";
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-HRFPGXON.js";
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-PM2DB3HE.js";
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-5STL6A45.js");
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-3QJWOF2B.js";
5
+ } from "./chunk-6ST5JIUJ.js";
6
6
  import {
7
7
  BUNDLED_SKILL_NAMES,
8
8
  installSkills
9
- } from "./chunk-AI44ZCMK.js";
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-PM2DB3HE.js";
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-PM2DB3HE.js";
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) unknownHits += 1;
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
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  hostMatchesDomain
3
- } from "./chunk-PM2DB3HE.js";
3
+ } from "./chunk-BALMAZTD.js";
4
4
 
5
5
  // src/citation-utils.ts
6
6
  function pickProjectCitedDomain(citedDomains, projectDomains) {