feat(mindspace): add SEO/GEO delivery, page template catalog, and admin hooks
Memind CI / Test, build, and release guards (push) Has been cancelled
Memind CI / Test, build, and release guards (push) Has been cancelled
Enable optional SEO/GEO injection and discovery routes for confirmed public pages while keeping private pages noindex. Add premium page template skills, portal catalog API, template shop UI, and Baidu push gated by memind_adm config. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -8,6 +8,10 @@ import {
|
||||
extractAiderDevelopmentTask,
|
||||
isPageDataIntent,
|
||||
} from './chat-skills.mjs';
|
||||
import {
|
||||
buildPageTemplateMandatoryInstruction,
|
||||
isPageTemplateSkill,
|
||||
} from './page-template-enforcement.mjs';
|
||||
import { createSessionAccess } from './session-broker.mjs';
|
||||
import {
|
||||
extractRunFromStreamEvent,
|
||||
@@ -100,6 +104,44 @@ function rewriteAiderPageDataInstruction(userMessage, taskText) {
|
||||
return { ...userMessage, content };
|
||||
}
|
||||
|
||||
export function enforcePageTemplateRuntime(userMessage, { h5Root = process.cwd() } = {}) {
|
||||
const skillName = selectedChatSkill(userMessage);
|
||||
if (!isPageTemplateSkill(skillName)) {
|
||||
return { userMessage, pageTemplateSkill: null };
|
||||
}
|
||||
const message = userMessage && typeof userMessage === 'object' && !Array.isArray(userMessage)
|
||||
? { ...userMessage }
|
||||
: { value: userMessage };
|
||||
const metadata = message.metadata && typeof message.metadata === 'object' && !Array.isArray(message.metadata)
|
||||
? { ...message.metadata }
|
||||
: {};
|
||||
const runMetadata = metadata.memindRun && typeof metadata.memindRun === 'object' && !Array.isArray(metadata.memindRun)
|
||||
? { ...metadata.memindRun }
|
||||
: {};
|
||||
metadata.memindRun = {
|
||||
...runMetadata,
|
||||
selectedChatSkill: skillName,
|
||||
pageTemplateSkill: skillName,
|
||||
pageTemplateStrict: true,
|
||||
};
|
||||
const mandatory = buildPageTemplateMandatoryInstruction(skillName, h5Root);
|
||||
const content = Array.isArray(message.content)
|
||||
? message.content.map((item) => {
|
||||
if (item?.type !== 'text') return item;
|
||||
const text = String(item.text ?? '').trim();
|
||||
if (!text || text.startsWith('【强制页面模板:')) return item;
|
||||
return {
|
||||
...item,
|
||||
text: `${mandatory}\n\n${text}`,
|
||||
};
|
||||
})
|
||||
: message.content;
|
||||
return {
|
||||
userMessage: { ...message, metadata, content },
|
||||
pageTemplateSkill: skillName,
|
||||
};
|
||||
}
|
||||
|
||||
export function enforceSelectedSkillRuntime(userMessage, {
|
||||
rawToolMode = 'chat',
|
||||
taskType = null,
|
||||
@@ -145,6 +187,7 @@ export function createPostAgentRunsHandler({
|
||||
codeRunPolicyService = null,
|
||||
goalRunService = null,
|
||||
chatIntentRouter = null,
|
||||
templateCatalogService = null,
|
||||
env = process.env,
|
||||
codeRunsEnabled = envFlag(process.env.MEMIND_AGENT_CODE_RUNS_ENABLED),
|
||||
codeRunUserIds = parseUserIdSet(process.env.MEMIND_AGENT_CODE_RUNS_USER_IDS),
|
||||
@@ -196,6 +239,13 @@ export function createPostAgentRunsHandler({
|
||||
response.status(400).json({ message: '缺少 user_message' });
|
||||
return;
|
||||
}
|
||||
const pageTemplateRuntime = enforcePageTemplateRuntime(userMessage, { h5Root: process.cwd() });
|
||||
userMessage = pageTemplateRuntime.userMessage;
|
||||
if (pageTemplateRuntime.pageTemplateSkill && templateCatalogService?.recordTemplateUsage) {
|
||||
void templateCatalogService
|
||||
.recordTemplateUsage(request.currentUser.id, pageTemplateRuntime.pageTemplateSkill)
|
||||
.catch(() => {});
|
||||
}
|
||||
const selectedSkillRuntime = enforceSelectedSkillRuntime(userMessage, {
|
||||
rawToolMode,
|
||||
taskType,
|
||||
|
||||
Reference in New Issue
Block a user