Files
memind/mindspace-index-policy.mjs
T
john 4e789663a1
Memind CI / Test, build, and release guards (push) Failing after 5m19s
feat(seo): index public online pages without confirmation
Drop the user_confirmed_at gate so public, online, unexpired pages can enter sitemap/llms and receive SEO/GEO tags. Defaults now enable all discovery switches; stored all-off config is still preserved until admin saves.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-13 15:51:48 +08:00

87 lines
2.6 KiB
JavaScript

const INDEXABLE_ACCESS_MODE = 'public';
export function normalizePublicationSnapshot(input = {}) {
if (!input || typeof input !== 'object') return null;
const accessMode = String(
input.accessMode ?? input.access_mode ?? '',
).trim();
if (!accessMode) return null;
const status = String(input.status ?? 'online').trim() || 'online';
const userConfirmedRaw =
input.userConfirmedAt ?? input.user_confirmed_at;
const userConfirmedAt =
userConfirmedRaw == null || userConfirmedRaw === ''
? null
: Number(userConfirmedRaw);
const expiresRaw = input.expiresAt ?? input.expires_at;
const expiresAt =
expiresRaw == null || expiresRaw === ''
? null
: Number(expiresRaw);
return {
id: String(input.id ?? input.publicationId ?? '').trim() || null,
pageId: String(input.pageId ?? input.page_id ?? '').trim() || null,
status,
accessMode,
userConfirmedAt:
Number.isFinite(userConfirmedAt) ? userConfirmedAt : null,
expiresAt: Number.isFinite(expiresAt) ? expiresAt : null,
publicUrl: String(input.publicUrl ?? input.public_url ?? '').trim() || null,
title: String(input.title ?? '').trim() || null,
summary: String(input.summary ?? '').trim() || null,
updatedAt:
Number(input.updatedAt ?? input.updated_at ?? input.publishedAt ?? input.published_at) ||
null,
};
}
export function isPublicationIndexable(publication, { now = Date.now() } = {}) {
const snapshot = normalizePublicationSnapshot(publication);
if (!snapshot) return false;
if (snapshot.status !== 'online') return false;
if (snapshot.accessMode !== INDEXABLE_ACCESS_MODE) return false;
if (snapshot.expiresAt != null && snapshot.expiresAt <= now) return false;
return true;
}
export function resolveIndexPolicy({
seoGeoConfig = null,
publication = null,
embed = false,
} = {}) {
if (embed) {
return {
mode: 'off',
injectNoindex: false,
reason: 'embed',
};
}
if (!seoGeoConfig?.enabled) {
return {
mode: 'off',
injectNoindex: false,
reason: 'disabled',
};
}
if (!isPublicationIndexable(publication)) {
return {
mode: 'noindex',
injectNoindex: true,
reason: publication ? 'not_indexable_publication' : 'missing_publication',
};
}
return {
mode: 'indexable',
injectNoindex: false,
reason: 'public_online',
seoEnabled: Boolean(seoGeoConfig.seo?.enabled),
geoEnabled: Boolean(seoGeoConfig.geo?.enabled),
canonicalEnabled: seoGeoConfig.seo?.canonical !== false,
jsonLdEnabled: seoGeoConfig.geo?.jsonLd !== false,
};
}
export const indexPolicyInternals = {
INDEXABLE_ACCESS_MODE,
};