feat(analytics): retire Rybbit and add SEO/GEO discovery tracking

Document Umami as the sole analytics platform, remove Rybbit proxy and
tracker code, and classify public page traffic with discovery_channel for
adm SEO/GEO dashboards.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-08-12 01:34:05 +08:00
parent c58a23d155
commit c122bd5664
26 changed files with 466 additions and 449 deletions
+1 -24
View File
@@ -17,7 +17,6 @@ import {
resolveProductAnalyticsConfig,
sendMindSpaceAnalyticsEvent,
} from './mindspace-analytics.mjs';
import { resolveMindSpaceRybbitConfig } from './mindspace-rybbit.mjs';
import { startWorkspaceAssetSyncWatcher } from './mindspace-workspace-sync.mjs';
import { attachRequestId, sendData, sendError } from './api-response.mjs';
import { attachPortalAgentJobRoutes } from './server/portal-agent-job-routes.mjs';
@@ -330,7 +329,6 @@ let authPool = null;
let pageDataService = null;
let pageDataPublicService = null;
let mindSpaceAnalyticsConfig = resolveMindSpaceAnalyticsConfig();
let mindSpaceRybbitConfig = resolveMindSpaceRybbitConfig();
async function bootstrapUserAuth() {
try {
@@ -362,11 +360,6 @@ async function bootstrapUserAuth() {
mindSpaceAnalyticsConfig,
domainServices.mindSpaceAnalyticsConfig,
);
Object.assign(
mindSpaceRybbitConfig,
domainServices.mindSpaceRybbitConfig ??
mindSpaceRybbitConfig,
);
scheduleService = domainServices.scheduleService;
scheduledTaskService = domainServices.scheduledTaskService;
pageDataService = domainServices.pageDataService;
@@ -549,7 +542,6 @@ async function bootstrapUserAuth() {
systemDisclosurePolicyService,
sessionSnapshotService,
mindSpaceAnalyticsConfig,
mindSpaceRybbitConfig,
subscriptionService,
apiTarget: API_TARGET,
apiSecret: API_SECRET,
@@ -1420,7 +1412,6 @@ attachPortalSessionRoutes(api, {
mindSpacePublicFinish,
getMemoryV2: () => memoryV2,
getMindSpaceAnalyticsConfig: () => mindSpaceAnalyticsConfig,
getMindSpaceRybbitConfig: () => mindSpaceRybbitConfig,
ownsAgentSession,
unregisterAgentSessionForUser,
beginSessionPageDelivery,
@@ -1504,26 +1495,12 @@ app.use('/analytics', createProxyMiddleware({
secure: false,
pathRewrite: { [`^${mindSpaceAnalyticsConfig.hostPath}`]: '' },
}));
app.use('/rybbit', createProxyMiddleware({
target: 'https://rybbit.tkmind.cn',
router: () =>
mindSpaceRybbitConfig.rybbitUrl ||
process.env.MEMIND_RYBBIT_URL ||
process.env.RYBBIT_URL ||
'https://rybbit.tkmind.cn',
changeOrigin: true,
secure: true,
// Express strips the /rybbit mount. Rybbit serves trackers under /api/*.
pathRewrite: { '^/': '/api/' },
}));
const { serveUserPublishFile } =
createPortalWorkspacePublicationDelivery({
internalAgentSecret:
INTERNAL_AGENT_SECRET,
analyticsConfig:
mindSpaceAnalyticsConfig,
rybbitConfig:
mindSpaceRybbitConfig,
getAuthPool: () => authPool,
getUserAuth: () => userAuth,
getMindSpacePages: () => mindSpacePages,
@@ -1550,7 +1527,7 @@ const sendPublishedPage =
registerLongImageArtifact:
registerPublishedLongImageArtifactForConversation,
analyticsConfig: mindSpaceAnalyticsConfig,
rybbitConfig: mindSpaceRybbitConfig,
analyticsConfig: mindSpaceAnalyticsConfig,
getAuthPool: () => authPool,
getUserAuth: () => userAuth,
getMindSpacePages: () => mindSpacePages,