@canonry/canonry 7.77.2 → 7.78.2
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/references/seo-analysis.md +13 -2
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +4 -2
- package/assets/assets/{AgentSetupPage-BZXWC3x6.js → AgentSetupPage-BGdvyQFL.js} +4 -4
- package/assets/assets/{AuditHistoryPanel-DcrUuwRu.js → AuditHistoryPanel-Bb5wq-Bk.js} +1 -1
- package/assets/assets/{BacklinksPage-BSpHJBiy.js → BacklinksPage-i1cfxTDj.js} +1 -1
- package/assets/assets/{HistoryPage-0a0CK9zF.js → HistoryPage-C2NRdNrn.js} +1 -1
- package/assets/assets/MeasurementPropertyPage-CwPuJMBy.js +4 -0
- package/assets/assets/ProjectPage-Bbnbg7c9.js +11 -0
- package/assets/assets/{RunsPage-D0vbz1Ho.js → RunsPage-CJHJ7kHk.js} +1 -1
- package/assets/assets/{SettingsPage-DjRm5cmn.js → SettingsPage-r8VrtFyJ.js} +1 -1
- package/assets/assets/SiteHealthSection-D1oSuo9O.js +2 -0
- package/assets/assets/ToneBadge-CUe-WrzN.js +60 -0
- package/assets/assets/{TrafficPage-Z8Z_z0k9.js → TrafficPage-DY2ykwH1.js} +1 -1
- package/assets/assets/TrafficSourceDetailPage-D3KHgRvF.js +1 -0
- package/assets/assets/{account-context-zaSxLBst.js → account-context-B50QqDEA.js} +1 -1
- package/assets/assets/{card-COqALGzB.js → card-BE2fqwVq.js} +1 -1
- package/assets/assets/{extract-error-message-DKve0SNr.js → extract-error-message-xuN_xeRJ.js} +1 -1
- package/assets/assets/{format-helpers-DKrHlaV7.js → format-helpers-CiC6gALY.js} +1 -1
- package/assets/assets/{index-CKZK95pI.css → index-CHHZDc6d.css} +1 -1
- package/assets/assets/{index-fzqtwr6m.js → index-Dfm8z5cG.js} +23 -23
- package/assets/assets/{query-client-COM9uzxL.js → query-client-C5GhDMY7.js} +1 -1
- package/assets/assets/react-query-CmHyfYFq.js +1 -0
- package/assets/assets/{react-sigma_core.esm.min-e91U3Myi.js → react-sigma_core.esm.min-Bjdtl0TQ.js} +1 -1
- package/assets/assets/{service-BgFTYqJA.js → service-B2i_ZzWP.js} +1 -1
- package/assets/index.html +8 -8
- package/dist/{ads-5K5IQDCD.js → ads-MNMND5VH.js} +3 -3
- package/dist/{agent-Q4PKMBEJ.js → agent-4KNDL3D3.js} +7 -7
- package/dist/{agent-ask-JEPVVW2J.js → agent-ask-32RTOL2M.js} +3 -3
- package/dist/{agent-conversations-EHE7QEBC.js → agent-conversations-BXVWHUZC.js} +3 -3
- package/dist/{agent-memory-AB72YQET.js → agent-memory-7R7UVFS5.js} +3 -3
- package/dist/{agent-providers-NQ7HJYAQ.js → agent-providers-QGVLCCH4.js} +3 -3
- package/dist/{agent-transcript-PRTWIQ2A.js → agent-transcript-7Y6BJCIT.js} +3 -3
- package/dist/{analytics-IY3J4VZE.js → analytics-YOGEHW6J.js} +3 -3
- package/dist/{apply-HNOG674K.js → apply-TB3MF3PH.js} +3 -3
- package/dist/{backfill-TO7TPPO6.js → backfill-IRVLT6VT.js} +9 -9
- package/dist/{backlinks-3NY5GNT4.js → backlinks-6GTL324T.js} +3 -3
- package/dist/{bing-Z7W7U2CT.js → bing-OMQACSDY.js} +3 -3
- package/dist/{bootstrap-DXXS3LRH.js → bootstrap-WZ6YDQIG.js} +10 -10
- package/dist/{cdp-CKPRS6VE.js → cdp-3WBLAWOL.js} +7 -7
- package/dist/{chunk-G26YB6JK.js → chunk-2EWZ3DJ4.js} +3 -3
- package/dist/{chunk-JPOIDGGF.js → chunk-3MGM3U6V.js} +1 -1
- package/dist/{chunk-7JC4Z6FQ.js → chunk-3QJWOF2B.js} +4 -3
- package/dist/{chunk-2BDWXHYF.js → chunk-45RGH7XI.js} +3 -3
- package/dist/{chunk-6KPBYCPE.js → chunk-4GEEYY3N.js} +2 -2
- package/dist/{chunk-C3UFOS7J.js → chunk-5NBXPO4G.js} +2 -2
- package/dist/{chunk-RPJJOBKN.js → chunk-6ACWXQNZ.js} +3 -1
- package/dist/{chunk-4XVXP6VR.js → chunk-72YPSNCG.js} +2 -2
- package/dist/{chunk-5QR7D4RQ.js → chunk-7HB6QLX4.js} +1 -1
- package/dist/{chunk-EM2HAM2U.js → chunk-7HE4LAJY.js} +8 -8
- package/dist/{chunk-JRVKW4OO.js → chunk-7OAXEMOF.js} +26 -2
- package/dist/{chunk-7UVCZZQJ.js → chunk-AI44ZCMK.js} +1 -1
- package/dist/{chunk-LKEFPJQ2.js → chunk-BKOG3GEI.js} +4 -4
- package/dist/{chunk-CMS4YM5M.js → chunk-BLZCNL3B.js} +3 -3
- package/dist/{chunk-HD2VVIPD.js → chunk-BTMLE3EN.js} +5 -5
- package/dist/{chunk-CHTKK43G.js → chunk-COUM462G.js} +152 -24
- package/dist/{chunk-2WBT6TEJ.js → chunk-FCYGY4FT.js} +1 -1
- package/dist/{chunk-JMCURBZG.js → chunk-GEHRGKQT.js} +4 -4
- package/dist/{chunk-ORZBHCZR.js → chunk-IYMTQHPD.js} +4 -4
- package/dist/{chunk-XYYWKCJQ.js → chunk-JERATA5R.js} +1 -1
- package/dist/{chunk-AAUMUHUI.js → chunk-KF7I7FBI.js} +2 -2
- package/dist/{chunk-PSNTEGNY.js → chunk-KZB6HLFT.js} +1 -1
- package/dist/{chunk-46KV7CZU.js → chunk-LBNUTWPK.js} +2 -2
- package/dist/{chunk-4QHTXT4A.js → chunk-MUYTDD35.js} +40 -4
- package/dist/{chunk-TESDUMVK.js → chunk-O4WBYEGV.js} +1 -1
- package/dist/{chunk-5LKK2MCJ.js → chunk-OES6PSQK.js} +7 -7
- package/dist/{chunk-D5XPB7MM.js → chunk-PH4AESRE.js} +3 -1
- package/dist/{chunk-JEXBP7CR.js → chunk-PLLDJUG2.js} +4 -4
- package/dist/{chunk-FCGYYZHL.js → chunk-PM2DB3HE.js} +164 -10
- package/dist/{chunk-GDKMVOZI.js → chunk-PRCBHOVR.js} +146 -19
- package/dist/{chunk-JZ4UFSVR.js → chunk-R26CF4WT.js} +2 -2
- package/dist/{chunk-Z2FY6AGZ.js → chunk-TZRYVW75.js} +2 -2
- package/dist/{chunk-WFFZAQRG.js → chunk-UHCOJCT3.js} +371 -340
- package/dist/{chunk-ZXYCPRNY.js → chunk-WSWHLKKJ.js} +1 -1
- package/dist/{chunk-NDTU7FGL.js → chunk-WVCDUKJ2.js} +1 -1
- package/dist/{chunk-JSCO223C.js → chunk-ZHFE6J3A.js} +1 -1
- package/dist/{citations-4AV6HLUZ.js → citations-PGG7JEIN.js} +3 -3
- package/dist/{cli-catalog-ZVFLJXID.js → cli-catalog-KC6JYHSW.js} +3 -3
- package/dist/{cli-commands-NJDUBQ3R.js → cli-commands-NGXSLPIA.js} +7 -7
- package/dist/cli.js +13 -13
- package/dist/{competitor-SG4N37UD.js → competitor-B3CZOKZU.js} +3 -3
- package/dist/{content-EDLZAPUV.js → content-Z4XJMZB4.js} +3 -3
- package/dist/{dashboard-5ZFVJPHX.js → dashboard-6MMYA2GG.js} +6 -6
- package/dist/{demo-5CU3JDHC.js → demo-3R2SHQPO.js} +1 -1
- package/dist/{demo-server-43QV3UKM.js → demo-server-ISJOEJN5.js} +12 -12
- package/dist/{discover-7X2WMNFV.js → discover-OT3K7KQK.js} +3 -3
- package/dist/{discover-eval-ECOPSJJ4.js → discover-eval-DN4J4KD5.js} +3 -3
- package/dist/{doctor-NMFBKNYR.js → doctor-UDF6OCSR.js} +3 -3
- package/dist/{evidence-C52ZPRYB.js → evidence-Z364UFOD.js} +3 -3
- package/dist/{export-cmd-2WSEETUC.js → export-cmd-K27XN4G5.js} +3 -3
- package/dist/{ga-YG4O2FT5.js → ga-Q2CELDLG.js} +3 -3
- package/dist/{gbp-BDGV6F74.js → gbp-V2APGSIQ.js} +3 -3
- package/dist/{google-P2AX6CUF.js → google-WFHYA3QT.js} +4 -4
- package/dist/{google-marketing-XPE6CVQI.js → google-marketing-5ROIKBC7.js} +1 -1
- package/dist/{health-cmd-MIQT2JNL.js → health-cmd-RGFAJ4YP.js} +3 -3
- package/dist/{history-3XDDJDAV.js → history-RUSU66BZ.js} +3 -3
- package/dist/index.d.ts +208 -13
- package/dist/index.js +26 -26
- package/dist/{init-GT3QM7FC.js → init-SMBVJSP6.js} +12 -12
- package/dist/{insights-ZJUDCBBP.js → insights-4IFQLPS3.js} +3 -3
- package/dist/intelligence-service-MPNONLCW.js +16 -0
- package/dist/{journeys-L2CXQXRP.js → journeys-PTC2QY57.js} +3 -3
- package/dist/{keys-ODRGIQS7.js → keys-JASXI2SR.js} +3 -3
- package/dist/{keyword-LE3CAXO2.js → keyword-SK2HJXCJ.js} +3 -3
- package/dist/{logs-OXK43XN2.js → logs-AS5I5V2A.js} +3 -3
- package/dist/{mcp-6OTPCDGW.js → mcp-BQSOYHEX.js} +4 -4
- package/dist/mcp.js +10 -10
- package/dist/{measurement-plan-NXRCDUYL.js → measurement-plan-LZYYH3OD.js} +5 -5
- package/dist/{notify-VNNJTNC6.js → notify-JM6252F6.js} +3 -3
- package/dist/{organic-evidence-LYDB7IID.js → organic-evidence-L3Y6RZIH.js} +3 -3
- package/dist/{overview-2GPPQ6JP.js → overview-VIF2GXYW.js} +4 -4
- package/dist/{project-CQJPXC66.js → project-FQEPFPRD.js} +3 -3
- package/dist/{query-PPE4EHMY.js → query-VKRESS6B.js} +3 -3
- package/dist/{research-GDYZKQY2.js → research-6A6QWKN3.js} +3 -3
- package/dist/{results-export-OAJHDEIQ.js → results-export-VUB2ZD5B.js} +3 -3
- package/dist/{run-XDPDQS44.js → run-PG5GYZT7.js} +4 -4
- package/dist/{schedule-C6SYV54I.js → schedule-EBGOLCQZ.js} +3 -3
- package/dist/{search-DONTDHQK.js → search-NS4XPZRL.js} +3 -3
- package/dist/{serve-PJXATOSY.js → serve-J7WR3J6I.js} +27 -27
- package/dist/{session-PMZV27GX.js → session-FBHHWILQ.js} +14 -14
- package/dist/{settings-PMATG7GG.js → settings-LNCAYCDF.js} +3 -3
- package/dist/{skills-CYHWYN42.js → skills-DWXA55QA.js} +2 -2
- package/dist/{snapshot-E4GHH6DD.js → snapshot-LX7OR7SO.js} +3 -3
- package/dist/{src-SXB3MOP3.js → src-AQ5MHQGQ.js} +2 -2
- package/dist/{status-MEGXEEW6.js → status-DQ6FNWUT.js} +4 -4
- package/dist/{technical-aeo-GE6KOFKT.js → technical-aeo-5GU2IY6W.js} +3 -3
- package/dist/{telemetry-Y63F4XFX.js → telemetry-QK2GPII3.js} +4 -4
- package/dist/{tools-V546ALG7.js → tools-3ACR2D2V.js} +11 -11
- package/dist/{traffic-5ELSKXBM.js → traffic-2JFQKVAX.js} +5 -5
- package/dist/{users-7YK7XYWY.js → users-7OJ2RGV3.js} +3 -3
- package/dist/{visibility-stats-GYPUKXVS.js → visibility-stats-VR25XMMY.js} +3 -3
- package/dist/{wordpress-WUGJT5NN.js → wordpress-JYXTF4PL.js} +3 -3
- package/package.json +1 -1
- package/assets/assets/MeasurementPropertyPage-DbfTFN3F.js +0 -4
- package/assets/assets/ProjectPage-D0m-Xpp3.js +0 -9
- package/assets/assets/SiteHealthSection-BCdPVFEJ.js +0 -2
- package/assets/assets/ToneBadge-DSJSzqI6.js +0 -60
- package/assets/assets/TrafficSourceDetailPage-DJyDO527.js +0 -1
- package/assets/assets/react-query-BVRWpXWq.js +0 -1
- package/dist/intelligence-service-NXZYQJBH.js +0 -16
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
answerServiceAdapters,
|
|
3
3
|
answerServiceDescriptors
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-WSWHLKKJ.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-OES6PSQK.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-IYMTQHPD.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-KZB6HLFT.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-5NBXPO4G.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-PLLDJUG2.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-FCYGY4FT.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-4GEEYY3N.js";
|
|
100
100
|
import {
|
|
101
101
|
createCanonryMcpServer
|
|
102
|
-
} from "./chunk-
|
|
102
|
+
} from "./chunk-BKOG3GEI.js";
|
|
103
103
|
import {
|
|
104
104
|
CANONRY_MCP_TIERS,
|
|
105
105
|
CANONRY_MCP_TOOLKIT_NAMES
|
|
106
|
-
} from "./chunk-
|
|
106
|
+
} from "./chunk-WVCDUKJ2.js";
|
|
107
107
|
import {
|
|
108
108
|
ApiClient
|
|
109
|
-
} from "./chunk-
|
|
109
|
+
} from "./chunk-7OAXEMOF.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-3QJWOF2B.js";
|
|
142
142
|
import {
|
|
143
143
|
getBundledSkillSnapshots
|
|
144
|
-
} from "./chunk-
|
|
144
|
+
} from "./chunk-AI44ZCMK.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-LBNUTWPK.js";
|
|
152
152
|
import {
|
|
153
153
|
CanonryMcpToolNames,
|
|
154
154
|
canonryMcpTools
|
|
155
|
-
} from "./chunk-
|
|
155
|
+
} from "./chunk-MUYTDD35.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-BTMLE3EN.js";
|
|
165
165
|
import {
|
|
166
166
|
addLogListener,
|
|
167
167
|
createFastifyLogger,
|
|
168
168
|
createLogger
|
|
169
|
-
} from "./chunk-
|
|
169
|
+
} from "./chunk-TZRYVW75.js";
|
|
170
170
|
import {
|
|
171
171
|
computeCitedCompetitorDomains,
|
|
172
172
|
determineCitationState
|
|
173
|
-
} from "./chunk-
|
|
173
|
+
} from "./chunk-JERATA5R.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-PRCBHOVR.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-PH4AESRE.js";
|
|
381
381
|
import {
|
|
382
382
|
AGENT_MEMORY_VALUE_MAX_BYTES,
|
|
383
383
|
AI_ENGINE_DOMAINS,
|
|
@@ -457,6 +457,7 @@ import {
|
|
|
457
457
|
SentimentOutcomes,
|
|
458
458
|
SeoAdapterOutcomes,
|
|
459
459
|
SeoCapabilities,
|
|
460
|
+
SeoKeywordGapModes,
|
|
460
461
|
SeoMarketRankingSearchStatuses,
|
|
461
462
|
SeoProviders,
|
|
462
463
|
SeoRunStatuses,
|
|
@@ -576,6 +577,7 @@ import {
|
|
|
576
577
|
normalizeIdTokens,
|
|
577
578
|
normalizeMeasurementExecutionQueryText,
|
|
578
579
|
normalizeProjectDomain,
|
|
580
|
+
normalizeQueryText,
|
|
579
581
|
normalizeServedModel,
|
|
580
582
|
normalizeSiteAuditRunRequest,
|
|
581
583
|
normalizeUrlPath,
|
|
@@ -606,6 +608,8 @@ import {
|
|
|
606
608
|
sentimentEvaluatorProvider,
|
|
607
609
|
sentimentSelectionSchema,
|
|
608
610
|
seoDeviceSchema,
|
|
611
|
+
seoKeywordGapComparison,
|
|
612
|
+
seoKeywordGapModeSchema,
|
|
609
613
|
seoProfileInputSchema,
|
|
610
614
|
seoRankingSettingsSchema,
|
|
611
615
|
serializeForInlineScript,
|
|
@@ -629,7 +633,7 @@ import {
|
|
|
629
633
|
winnabilityClassLabel,
|
|
630
634
|
withRetry,
|
|
631
635
|
withSkippedProviders
|
|
632
|
-
} from "./chunk-
|
|
636
|
+
} from "./chunk-PM2DB3HE.js";
|
|
633
637
|
|
|
634
638
|
// src/google-marketing-runtime.ts
|
|
635
639
|
import crypto2 from "crypto";
|
|
@@ -3459,8 +3463,27 @@ var resultSchema = z2.object({
|
|
|
3459
3463
|
location_code: z2.number().int(),
|
|
3460
3464
|
language_code: z2.string(),
|
|
3461
3465
|
target: z2.string().optional(),
|
|
3466
|
+
target1: z2.string().optional(),
|
|
3467
|
+
target2: z2.string().optional(),
|
|
3462
3468
|
items: z2.array(z2.unknown()).nullable()
|
|
3463
3469
|
});
|
|
3470
|
+
var competitorItemSchema = z2.object({
|
|
3471
|
+
domain: z2.string(),
|
|
3472
|
+
intersections: count,
|
|
3473
|
+
avg_position: amount,
|
|
3474
|
+
full_domain_metrics: z2.object({ organic: z2.object({ count, etv: amount }).nullish() }).nullish()
|
|
3475
|
+
});
|
|
3476
|
+
var comparisonSerpSchema = z2.object({
|
|
3477
|
+
type: z2.literal("organic"),
|
|
3478
|
+
domain: z2.string(),
|
|
3479
|
+
url: z2.string().nullish(),
|
|
3480
|
+
rank_group: z2.number().int().positive()
|
|
3481
|
+
});
|
|
3482
|
+
var gapItemSchema = z2.object({
|
|
3483
|
+
keyword_data: keywordDataSchema,
|
|
3484
|
+
first_domain_serp_element: comparisonSerpSchema,
|
|
3485
|
+
second_domain_serp_element: comparisonSerpSchema.nullish()
|
|
3486
|
+
});
|
|
3464
3487
|
var serpResultSchema = z2.object({
|
|
3465
3488
|
keyword: z2.string(),
|
|
3466
3489
|
location_code: z2.number().int(),
|
|
@@ -3570,11 +3593,75 @@ function normalizeDataForSeoResults(rawResults, request, collectedAt, options =
|
|
|
3570
3593
|
throw new Error("SEO provider returned a different market.");
|
|
3571
3594
|
}
|
|
3572
3595
|
const providerTarget = request.target?.kind === SeoTargetKinds.host ? registrableDomain(request.target.value) : request.target?.value.toLowerCase();
|
|
3573
|
-
if (request.
|
|
3596
|
+
if (request.capability === SeoCapabilities["keyword-gaps"]) {
|
|
3597
|
+
if (result.target1?.toLowerCase() !== request.comparison?.competitor.value.toLowerCase() || result.target2?.toLowerCase() !== providerTarget) {
|
|
3598
|
+
throw new Error("SEO provider returned a different comparison pair.");
|
|
3599
|
+
}
|
|
3600
|
+
} else if (request.target && result.target?.toLowerCase() !== providerTarget) {
|
|
3574
3601
|
throw new Error("SEO provider returned a different target.");
|
|
3575
3602
|
}
|
|
3576
3603
|
const items = result.items ?? [];
|
|
3577
3604
|
switch (request.capability) {
|
|
3605
|
+
case SeoCapabilities["competitor-discovery"]: {
|
|
3606
|
+
if (!request.target) throw new Error("SEO target is required.");
|
|
3607
|
+
const seen = /* @__PURE__ */ new Set();
|
|
3608
|
+
for (const rawItem of items) {
|
|
3609
|
+
const item = competitorItemSchema.parse(rawItem);
|
|
3610
|
+
const domain = normalizeHostname(item.domain);
|
|
3611
|
+
if (!domain || !registrableDomain(domain)) throw new Error("SEO provider returned an invalid competitor domain.");
|
|
3612
|
+
if (registrableDomain(domain) === request.target.value.toLowerCase() || seen.has(domain)) continue;
|
|
3613
|
+
seen.add(domain);
|
|
3614
|
+
output.competitors.push({
|
|
3615
|
+
target: request.target,
|
|
3616
|
+
domain,
|
|
3617
|
+
sharedKeywords: item.intersections ?? null,
|
|
3618
|
+
averagePosition: item.avg_position ?? null,
|
|
3619
|
+
organicKeywords: item.full_domain_metrics?.organic?.count ?? null,
|
|
3620
|
+
estimatedOrganicTraffic: item.full_domain_metrics?.organic?.etv ?? null,
|
|
3621
|
+
// The endpoint does not return its weekly dataset timestamp.
|
|
3622
|
+
provenance: provenance(request, collectedAt, null)
|
|
3623
|
+
});
|
|
3624
|
+
}
|
|
3625
|
+
break;
|
|
3626
|
+
}
|
|
3627
|
+
case SeoCapabilities["keyword-gaps"]: {
|
|
3628
|
+
if (!request.target || !request.comparison) throw new Error("SEO comparison is required.");
|
|
3629
|
+
const { competitor, mode } = request.comparison;
|
|
3630
|
+
const seen = /* @__PURE__ */ new Set();
|
|
3631
|
+
for (const rawItem of items) {
|
|
3632
|
+
const item = gapItemSchema.parse(rawItem);
|
|
3633
|
+
const rival = item.first_domain_serp_element;
|
|
3634
|
+
const own = item.second_domain_serp_element;
|
|
3635
|
+
const rivalHost = normalizeHostname(rival.domain);
|
|
3636
|
+
const ownHost = own ? normalizeHostname(own.domain) : null;
|
|
3637
|
+
if (!rivalHost || !hostBelongsTo(rivalHost, competitor) || own && (!ownHost || !hostBelongsTo(ownHost, request.target))) {
|
|
3638
|
+
throw new Error("SEO provider returned rankings outside the comparison pair.");
|
|
3639
|
+
}
|
|
3640
|
+
if (mode === SeoKeywordGapModes.shared && !own || mode === SeoKeywordGapModes.missing && own) {
|
|
3641
|
+
throw new Error("SEO provider returned a different comparison population.");
|
|
3642
|
+
}
|
|
3643
|
+
const key = normalizeQueryText(item.keyword_data.keyword);
|
|
3644
|
+
if (seen.has(key)) continue;
|
|
3645
|
+
seen.add(key);
|
|
3646
|
+
const metric = keywordMetrics(item.keyword_data, request, collectedAt);
|
|
3647
|
+
const targetRankOrganic = own?.rank_group ?? null;
|
|
3648
|
+
output.keywordGaps.push({
|
|
3649
|
+
target: request.target,
|
|
3650
|
+
competitor,
|
|
3651
|
+
keyword: metric.keyword,
|
|
3652
|
+
targetRankOrganic,
|
|
3653
|
+
competitorRankOrganic: rival.rank_group,
|
|
3654
|
+
targetUrl: own?.url ?? null,
|
|
3655
|
+
competitorUrl: rival.url ?? null,
|
|
3656
|
+
searchVolume: metric.searchVolume,
|
|
3657
|
+
keywordDifficulty: metric.keywordDifficulty,
|
|
3658
|
+
cpcUsd: metric.cpcUsd,
|
|
3659
|
+
...seoKeywordGapComparison(targetRankOrganic, rival.rank_group),
|
|
3660
|
+
provenance: provenance(request, collectedAt, item.keyword_data.serp_info?.last_updated_time ?? null)
|
|
3661
|
+
});
|
|
3662
|
+
}
|
|
3663
|
+
break;
|
|
3664
|
+
}
|
|
3578
3665
|
case SeoCapabilities["keyword-metrics"]: {
|
|
3579
3666
|
const requested = new Map(request.keywords.map((keyword) => [keyword.toLowerCase(), keyword]));
|
|
3580
3667
|
for (const rawItem of items) {
|
|
@@ -3643,7 +3730,9 @@ var ENDPOINTS = {
|
|
|
3643
3730
|
[SeoCapabilities["keyword-metrics"]]: "dataforseo_labs/google/keyword_overview/live",
|
|
3644
3731
|
[SeoCapabilities["domain-intelligence"]]: "dataforseo_labs/google/domain_rank_overview/live",
|
|
3645
3732
|
[SeoCapabilities["ranked-keywords"]]: "dataforseo_labs/google/ranked_keywords/live",
|
|
3646
|
-
[SeoCapabilities["market-rankings"]]: "serp/google/organic/live/advanced"
|
|
3733
|
+
[SeoCapabilities["market-rankings"]]: "serp/google/organic/live/advanced",
|
|
3734
|
+
[SeoCapabilities["competitor-discovery"]]: "dataforseo_labs/google/competitors_domain/live",
|
|
3735
|
+
[SeoCapabilities["keyword-gaps"]]: "dataforseo_labs/google/domain_intersection/live"
|
|
3647
3736
|
};
|
|
3648
3737
|
var MAX_SEARCH_TEXT_LENGTH = 700;
|
|
3649
3738
|
var SURCHARGED_OPERATORS = [
|
|
@@ -3734,6 +3823,40 @@ function taskPayload(request) {
|
|
|
3734
3823
|
const host = targetHost(target);
|
|
3735
3824
|
const domain = registrableDomain(host);
|
|
3736
3825
|
switch (request.capability) {
|
|
3826
|
+
case SeoCapabilities["competitor-discovery"]:
|
|
3827
|
+
if (target.kind !== SeoTargetKinds.domain) throw validationError("Competitor discovery requires a whole-domain scope.");
|
|
3828
|
+
return {
|
|
3829
|
+
...common,
|
|
3830
|
+
target: host,
|
|
3831
|
+
limit: request.limit,
|
|
3832
|
+
offset: 0,
|
|
3833
|
+
item_types: ["organic"],
|
|
3834
|
+
include_clickstream_data: false,
|
|
3835
|
+
ignore_synonyms: false,
|
|
3836
|
+
exclude_domains: [host],
|
|
3837
|
+
order_by: ["intersections,desc"]
|
|
3838
|
+
};
|
|
3839
|
+
case SeoCapabilities["keyword-gaps"]: {
|
|
3840
|
+
const comparison = request.comparison;
|
|
3841
|
+
if (target.kind !== SeoTargetKinds.domain || !comparison || comparison.competitor.kind !== SeoTargetKinds.domain) {
|
|
3842
|
+
throw validationError("Keyword gaps require a whole-domain target and comparison domain.");
|
|
3843
|
+
}
|
|
3844
|
+
if (!seoKeywordGapModeSchema.safeParse(comparison.mode).success) throw validationError("Choose shared or missing searches for keyword gaps.");
|
|
3845
|
+
const competitor = targetHost(comparison.competitor);
|
|
3846
|
+
if (competitor === host) throw validationError("Choose a comparison domain different from the target.");
|
|
3847
|
+
return {
|
|
3848
|
+
...common,
|
|
3849
|
+
target1: competitor,
|
|
3850
|
+
target2: host,
|
|
3851
|
+
intersections: comparison.mode === SeoKeywordGapModes.shared,
|
|
3852
|
+
limit: request.limit,
|
|
3853
|
+
offset: 0,
|
|
3854
|
+
item_types: ["organic"],
|
|
3855
|
+
include_serp_info: true,
|
|
3856
|
+
include_clickstream_data: false,
|
|
3857
|
+
order_by: ["keyword_data.keyword_info.search_volume,desc"]
|
|
3858
|
+
};
|
|
3859
|
+
}
|
|
3737
3860
|
case SeoCapabilities["domain-intelligence"]:
|
|
3738
3861
|
if (target.kind !== SeoTargetKinds.domain) throw validationError("Domain intelligence requires a whole-domain scope.");
|
|
3739
3862
|
return { ...common, target: host, limit: 1, ignore_synonyms: false };
|
|
@@ -3768,6 +3891,8 @@ function appendResults(target, source) {
|
|
|
3768
3891
|
target.domainIntelligence.push(...source.domainIntelligence);
|
|
3769
3892
|
target.rankedKeywords.push(...source.rankedKeywords);
|
|
3770
3893
|
target.marketRankings.push(...source.marketRankings);
|
|
3894
|
+
target.competitors.push(...source.competitors);
|
|
3895
|
+
target.keywordGaps.push(...source.keywordGaps);
|
|
3771
3896
|
}
|
|
3772
3897
|
function createDataForSeoAdapter(credentials) {
|
|
3773
3898
|
const auth = { login: credentials.login.trim(), password: credentials.password };
|
|
@@ -5812,7 +5937,7 @@ function nonBlank(value) {
|
|
|
5812
5937
|
return trimmed ? trimmed : void 0;
|
|
5813
5938
|
}
|
|
5814
5939
|
function resolveBuildCommit(env = process.env) {
|
|
5815
|
-
const embedded = true ? "
|
|
5940
|
+
const embedded = true ? "3e41f6b61554e34c70c1fdc85a111f880cc15215" : void 0;
|
|
5816
5941
|
return nonBlank(embedded) ?? nonBlank(env.CANONRY_COMMIT);
|
|
5817
5942
|
}
|
|
5818
5943
|
function resolveInstanceIdentity(env = process.env) {
|
|
@@ -21703,11 +21828,14 @@ async function createServer(opts) {
|
|
|
21703
21828
|
if (publicOrigin) {
|
|
21704
21829
|
const dashboardAssets = path5.join(assetsDir, "assets");
|
|
21705
21830
|
const gateFont = fs5.existsSync(dashboardAssets) ? fs5.readdirSync(dashboardAssets).find((name) => /^geist-latin-wght-normal-[\w-]+\.woff2$/.test(name)) : void 0;
|
|
21831
|
+
const gateway = opts.config.mcpGateway;
|
|
21832
|
+
const gatewayClient = gateway?.clientId && URL.canParse(gateway.url) ? { id: gateway.clientId, origin: new URL(gateway.url).origin } : void 0;
|
|
21706
21833
|
registerOAuthRoutes(app, {
|
|
21707
21834
|
db: opts.db,
|
|
21708
21835
|
issuer: publicOrigin,
|
|
21709
21836
|
authorizationPath,
|
|
21710
21837
|
...gateFont ? { fontUrl: `${basePath ?? "/"}assets/${gateFont}` } : {},
|
|
21838
|
+
...gatewayClient ? { gatewayClient } : {},
|
|
21711
21839
|
resourcePaths: mcpTransportPaths().map(
|
|
21712
21840
|
(suffix) => `${basePath ?? "/"}api/v1${suffix}`.replace("//", "/")
|
|
21713
21841
|
),
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
registeredProviderNames
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-FCYGY4FT.js";
|
|
4
4
|
import {
|
|
5
5
|
configExists,
|
|
6
6
|
loadConfigRaw
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-3QJWOF2B.js";
|
|
8
8
|
|
|
9
9
|
// src/setup-state.ts
|
|
10
10
|
import fs from "fs";
|
|
@@ -28,7 +28,7 @@ async function buildSetupState() {
|
|
|
28
28
|
}
|
|
29
29
|
if (dbPath && fs.existsSync(dbPath)) {
|
|
30
30
|
try {
|
|
31
|
-
const { createClient, projects, queries: queriesTable } = await import("./src-
|
|
31
|
+
const { createClient, projects, queries: queriesTable } = await import("./src-AQ5MHQGQ.js");
|
|
32
32
|
const db = createClient(dbPath);
|
|
33
33
|
project_count = db.select({ id: projects.id }).from(projects).all().length;
|
|
34
34
|
const firstQuery = db.select({ id: queriesTable.id }).from(queriesTable).limit(1).all();
|
|
@@ -47,7 +47,7 @@ function queueServeHandoff() {
|
|
|
47
47
|
async function runPendingServeHandoff(format) {
|
|
48
48
|
if (!pendingServeHandoff) return;
|
|
49
49
|
pendingServeHandoff = false;
|
|
50
|
-
const { serveCommand } = await import("./serve-
|
|
50
|
+
const { serveCommand } = await import("./serve-J7WR3J6I.js");
|
|
51
51
|
await serveCommand(format);
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runWithUsageTags
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7OAXEMOF.js";
|
|
4
4
|
import {
|
|
5
5
|
CanonryMcpToolNames,
|
|
6
6
|
canonryMcpTools
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-MUYTDD35.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-PRCBHOVR.js";
|
|
14
14
|
import {
|
|
15
15
|
DEFAULT_COMPETITOR_AUTO_ALIAS_MODE,
|
|
16
16
|
MeasurementPortfolioLists,
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
seoDatasetWithoutVendor,
|
|
24
24
|
seoProviderSchema,
|
|
25
25
|
truncateUtf16
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-PM2DB3HE.js";
|
|
27
27
|
|
|
28
28
|
// src/agent/tools.ts
|
|
29
29
|
import { Type as Type2 } from "@earendil-works/pi-ai";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
trackIntegrationConnection
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-PLLDJUG2.js";
|
|
4
4
|
import {
|
|
5
5
|
cliRuntimeContext
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-4GEEYY3N.js";
|
|
7
7
|
|
|
8
8
|
// src/cli-connection-telemetry.ts
|
|
9
9
|
function trackCliConnection(properties) {
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
siteCrawlGraphNodes,
|
|
6
6
|
siteCrawlPages,
|
|
7
7
|
siteCrawlSnapshots
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-PH4AESRE.js";
|
|
9
9
|
import {
|
|
10
10
|
SITE_CRAWL_GRAPH_MAX_EDGES,
|
|
11
11
|
SITE_CRAWL_GRAPH_MAX_NODES,
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
factorStatusFromDistribution,
|
|
16
16
|
factorStatusFromScore,
|
|
17
17
|
roundPreservingTotal
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-PM2DB3HE.js";
|
|
19
19
|
|
|
20
20
|
// src/site-audit-factors.ts
|
|
21
21
|
function recordedSharePct(factor) {
|
|
@@ -2,11 +2,11 @@ import {
|
|
|
2
2
|
dedupeGscSitemapUrls,
|
|
3
3
|
resolveDiscoveredGscSitemapUrls,
|
|
4
4
|
submitGscSitemapBatches
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-ZHFE6J3A.js";
|
|
6
6
|
import {
|
|
7
7
|
measurementDraftOperationSchema,
|
|
8
8
|
runMeasurementDraftAction
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-7HB6QLX4.js";
|
|
10
10
|
import {
|
|
11
11
|
CliError
|
|
12
12
|
} from "./chunk-HGMYEDAQ.js";
|
|
@@ -138,9 +138,13 @@ import {
|
|
|
138
138
|
sentimentSettingsUpdateSchema,
|
|
139
139
|
sentimentSummaryIncludeSchema,
|
|
140
140
|
sentimentSummaryReadSchema,
|
|
141
|
+
seoCompetitorListSchema,
|
|
142
|
+
seoCompetitorQuerySchema,
|
|
141
143
|
seoContextSchema,
|
|
142
144
|
seoDomainIntelligenceListSchema,
|
|
143
145
|
seoEvidenceQuerySchema,
|
|
146
|
+
seoKeywordGapListSchema,
|
|
147
|
+
seoKeywordGapQuerySchema,
|
|
144
148
|
seoKeywordMetricsListSchema,
|
|
145
149
|
seoMarketRankingListSchema,
|
|
146
150
|
seoMarketRankingQuerySchema,
|
|
@@ -178,7 +182,7 @@ import {
|
|
|
178
182
|
trafficSeriesGranularitySchema,
|
|
179
183
|
visibilityCompareSelectionSchema,
|
|
180
184
|
visibilityReportRequestSchema
|
|
181
|
-
} from "./chunk-
|
|
185
|
+
} from "./chunk-PM2DB3HE.js";
|
|
182
186
|
|
|
183
187
|
// src/mcp/tool-registry.ts
|
|
184
188
|
import { z as z2 } from "zod";
|
|
@@ -1131,6 +1135,8 @@ var sentimentPreviewInputSchema = sentimentBackfillSelectionSchema.safeExtend({
|
|
|
1131
1135
|
var sentimentBackfillInputSchema = sentimentBackfillRequestSchema.extend({ project: projectNameSchema });
|
|
1132
1136
|
var seoIdInputSchema = projectInputSchema.extend({ id: z2.string().min(1) });
|
|
1133
1137
|
var seoEvidenceInputSchema = seoEvidenceQuerySchema.extend({ project: projectNameSchema });
|
|
1138
|
+
var seoCompetitorInputSchema = seoCompetitorQuerySchema.extend({ project: projectNameSchema });
|
|
1139
|
+
var seoKeywordGapInputSchema = seoKeywordGapQuerySchema.extend({ project: projectNameSchema });
|
|
1134
1140
|
var seoMarketRankingInputSchema = seoMarketRankingQuerySchema.extend({ project: projectNameSchema });
|
|
1135
1141
|
var seoMarketRankingSummaryInputSchema = seoMarketRankingSummaryQuerySchema.extend({ project: projectNameSchema });
|
|
1136
1142
|
var rawCanonryMcpTools = [
|
|
@@ -1344,10 +1350,40 @@ var rawCanonryMcpTools = [
|
|
|
1344
1350
|
return client.getSeoRankedKeywords(project, query);
|
|
1345
1351
|
}
|
|
1346
1352
|
}),
|
|
1353
|
+
defineTool({
|
|
1354
|
+
name: "canonry_seo_competitors",
|
|
1355
|
+
title: "SEO organic competitors",
|
|
1356
|
+
description: "Read saved whole-domain organic competitor discovery only. No provider calls or automatic competitor pins. Preserve target, location, language, source date and runId while paging. Shared-search counts and traffic are provider database estimates; saved rows are bounded by the profile limit. Optional sort orders all saved rows before paging; a leading minus descends, missing values stay last, and omission preserves source order. Preserve sort while paging.",
|
|
1357
|
+
access: "read",
|
|
1358
|
+
tier: "seo",
|
|
1359
|
+
inputSchema: seoCompetitorInputSchema,
|
|
1360
|
+
outputSchema: seoCompetitorListSchema,
|
|
1361
|
+
annotations: readAnnotations(),
|
|
1362
|
+
openApiOperations: ["GET /api/v1/projects/{name}/seo/competitors"],
|
|
1363
|
+
handler: (client, input) => {
|
|
1364
|
+
const { project, ...query } = input;
|
|
1365
|
+
return client.getSeoCompetitors(project, query);
|
|
1366
|
+
}
|
|
1367
|
+
}),
|
|
1368
|
+
defineTool({
|
|
1369
|
+
name: "canonry_seo_keyword_gaps",
|
|
1370
|
+
title: "SEO keyword gaps",
|
|
1371
|
+
description: "Read saved whole-domain organic search comparisons only. No provider calls. kind=shared includes all searches where both domains rank, including outranked; missing means the source database has a rival rank and no target rank; outranked means the rival ranks higher. rankGap is target rank minus rival rank and null without both. Preserve exact targets, locale, source date and runId while paging. Results are a bounded source sample, not all possible opportunities. Optional sort orders all filtered rows before paging; a leading minus descends, missing values stay last, and omission preserves source order. Preserve sort while paging.",
|
|
1372
|
+
access: "read",
|
|
1373
|
+
tier: "seo",
|
|
1374
|
+
inputSchema: seoKeywordGapInputSchema,
|
|
1375
|
+
outputSchema: seoKeywordGapListSchema,
|
|
1376
|
+
annotations: readAnnotations(),
|
|
1377
|
+
openApiOperations: ["GET /api/v1/projects/{name}/seo/keyword-gaps"],
|
|
1378
|
+
handler: (client, input) => {
|
|
1379
|
+
const { project, ...query } = input;
|
|
1380
|
+
return client.getSeoKeywordGaps(project, query);
|
|
1381
|
+
}
|
|
1382
|
+
}),
|
|
1347
1383
|
defineTool({
|
|
1348
1384
|
name: "canonry_seo_market_rankings",
|
|
1349
1385
|
title: "SEO market rankings",
|
|
1350
|
-
description: "Read stored SEO data only. No provider calls. The site's Google position for each tracked non-brand query in each market, searched from that market's location; these are the same tracked queries AI visibility measures, and searchText is the exact text searched. searchStatus says how each search ended: a null rank in a completed or partial row means not in the checked results (depth, lower when only part of the results came back); a failed or cancelled row has no rank because the search returned nothing. outcome says where each row landed (page-1, ranks-11-20, ranks-21-plus, not-ranked, partly-checked for a partial search without the site, failed, cancelled) and rivalAhead whether a tracked competitor ranks above the site. Filter with marketKey, regionKey, outcome (needs-work = off page 1 with a result) and q; sort=rank puts the closest to page 1 first. Keep runId fixed while paging.",
|
|
1386
|
+
description: "Read stored SEO data only. No provider calls. The site's Google position for each tracked non-brand query in each market, searched from that market's location; these are the same tracked queries AI visibility measures, and searchText is the exact text searched. searchStatus says how each search ended: a null rank in a completed or partial row means not in the checked results (depth, lower when only part of the results came back); a failed or cancelled row has no rank because the search returned nothing. outcome says where each row landed (page-1, ranks-11-20, ranks-21-plus, not-ranked, partly-checked for a partial search without the site, failed, cancelled) and rivalAhead whether a tracked competitor ranks above the site. topCompetitor is the best tracked rival; rankGap is target rank minus rival rank and null without both. Filter with marketKey, regionKey, outcome (needs-work = off page 1 with a result) and q; sort=rank puts the closest to page 1 first. Keep runId fixed while paging.",
|
|
1351
1387
|
access: "read",
|
|
1352
1388
|
tier: "seo",
|
|
1353
1389
|
inputSchema: seoMarketRankingInputSchema,
|
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
isStoredPageReadTool,
|
|
6
6
|
isStoredReadTool,
|
|
7
7
|
truncateToolResult
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-IYMTQHPD.js";
|
|
9
9
|
import {
|
|
10
10
|
CANONRY_MCP_TOOLKITS
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-WVCDUKJ2.js";
|
|
12
12
|
import {
|
|
13
13
|
AGENT_REASONING_LEVELS,
|
|
14
14
|
aeroStreamFn,
|
|
@@ -22,18 +22,18 @@ import {
|
|
|
22
22
|
resolveApiKeyFor,
|
|
23
23
|
resolveModelForProvider,
|
|
24
24
|
validateAgentProviderRegistry
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-3QJWOF2B.js";
|
|
26
26
|
import {
|
|
27
27
|
CanonryMcpToolNames,
|
|
28
28
|
canonryMcpTools
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-MUYTDD35.js";
|
|
30
30
|
import {
|
|
31
31
|
createLogger
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-TZRYVW75.js";
|
|
33
33
|
import {
|
|
34
34
|
agentToolEvents,
|
|
35
35
|
llmUsageEvents
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-PH4AESRE.js";
|
|
37
37
|
import {
|
|
38
38
|
MeasurementPortfolioLists,
|
|
39
39
|
SeoCapabilities,
|
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
describeError,
|
|
43
43
|
validationError,
|
|
44
44
|
visibilityReportRequestSchema
|
|
45
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-PM2DB3HE.js";
|
|
46
46
|
|
|
47
47
|
// src/agent/session.ts
|
|
48
48
|
import fs3 from "fs";
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
templateLinkRatio,
|
|
21
21
|
templateLinkUbiquityAvailable,
|
|
22
22
|
validationError
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-PM2DB3HE.js";
|
|
24
24
|
import {
|
|
25
25
|
__export
|
|
26
26
|
} from "./chunk-MLKGABMK.js";
|
|
@@ -919,6 +919,8 @@ var oauthClients = sqliteTable2("oauth_clients", {
|
|
|
919
919
|
* chose its own display name — so that name is a claim, not a fact, and the
|
|
920
920
|
* consent page must say so. A client calling itself "Canonry Dashboard"
|
|
921
921
|
* otherwise reads as first-party on the one screen where trust is decided.
|
|
922
|
+
* The one exception is the shared MCP gateway's client once the operator
|
|
923
|
+
* names it in config (`mcpGateway.clientId`); its row stays `dynamic`.
|
|
922
924
|
*/
|
|
923
925
|
registration: text2("registration").$type().notNull().default("operator"),
|
|
924
926
|
createdAt: text2("created_at").notNull(),
|
|
@@ -2,13 +2,13 @@ import {
|
|
|
2
2
|
bucketCliCommandDuration,
|
|
3
3
|
isTelemetryEnabled,
|
|
4
4
|
trackEvent
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-4GEEYY3N.js";
|
|
6
6
|
import {
|
|
7
7
|
getConfigDir
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-3QJWOF2B.js";
|
|
9
9
|
import {
|
|
10
10
|
currentOutcomeAttribution
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-3MGM3U6V.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-PM2DB3HE.js";
|
|
23
23
|
|
|
24
24
|
// src/outcome-telemetry.ts
|
|
25
25
|
import fs from "fs";
|