371900bae5
Memind CI / Test, build, and release guards (pull_request) Failing after 18s
Centralize page HTML quota checks with grace-write semantics across page services and workspace tools, keep localhost MindSpace links clickable in chat display, and expand Page Data/static-page skill plus local dev docs for quota, delivery URLs, and native Aider/OpenHands tooling. Co-authored-by: Cursor <cursoragent@cursor.com>
85 lines
2.9 KiB
JavaScript
85 lines
2.9 KiB
JavaScript
import { stripKnownChatSkillPrompt } from './chat-skills.mjs';
|
||
|
||
/**
|
||
* Strip agent-only prefixes from persisted user messages for UI display.
|
||
* Regression guard — see docs/regression-guards/mindspace-publish-and-chat-finish.md
|
||
*/
|
||
|
||
export const TASK_ROUTING_HINT_RE = /^【TKMind 路由提示】[\s\S]*?\n\n/;
|
||
export const MEMIND_TASK_ORCHESTRATION_RE = /^【Memind 任务编排】[\s\S]*?(?:用户任务:|用户任务:)\s*/u;
|
||
export const MINDSPACE_CONTEXT_RE = /^\[MindSpace 上下文\][\s\S]*?\n\n/;
|
||
export const IMAGE_TURN_SCOPE_SUFFIX_RE =
|
||
/\n*【本轮图片主题(硬性)】[\s\S]*$/u;
|
||
const USER_IDENTITY_BLOCK_RE = /^\[用户身份\][\s\S]*?\n\n/;
|
||
|
||
export function stripUserIdentityPrefix(text) {
|
||
return String(text ?? '').replace(USER_IDENTITY_BLOCK_RE, '').trimStart();
|
||
}
|
||
|
||
export function stripTaskRoutingHint(text) {
|
||
return String(text ?? '').replace(TASK_ROUTING_HINT_RE, '').trimStart();
|
||
}
|
||
|
||
export function stripMemindTaskOrchestrationPrefix(text) {
|
||
return String(text ?? '').replace(MEMIND_TASK_ORCHESTRATION_RE, '').trimStart();
|
||
}
|
||
|
||
export function stripMindSpaceContextPrefix(text) {
|
||
let next = String(text ?? '');
|
||
while (MINDSPACE_CONTEXT_RE.test(next)) {
|
||
next = next.replace(MINDSPACE_CONTEXT_RE, '').trimStart();
|
||
}
|
||
return next;
|
||
}
|
||
|
||
/** MindSpace 交付链接:生产域名与本地 dev(127.0.0.1 / localhost)都必须可点击,不可被架构脱敏替换。 */
|
||
export const MINDSPACE_DELIVERABLE_ORIGIN_RE =
|
||
'(?:127\\.0\\.0\\.1|localhost):\\d+|(?:m\\.)?[^/\\s]*tkmind\\.(?:cn|ai)';
|
||
|
||
const ASSISTANT_DELIVERABLE_RE = new RegExp(
|
||
[
|
||
'\\[[^\\]]+\\]\\(https?:\\/\\/[^)]+\\)',
|
||
`https?:\\/\\/${MINDSPACE_DELIVERABLE_ORIGIN_RE}\\/MindSpace\\/`,
|
||
].join('|'),
|
||
'i',
|
||
);
|
||
|
||
const INTERNAL_ASSISTANT_MARKERS = [
|
||
/data-mindspace-page-tag/i,
|
||
/mindspace-cover/i,
|
||
/\bload_skill\b/i,
|
||
/static-page-publish/i,
|
||
/\.agents\/skills/i,
|
||
/SKILL\.md/i,
|
||
/注意到技能/u,
|
||
/技能更新/u,
|
||
/页脚要用.*platform-brand/u,
|
||
];
|
||
|
||
/** Agent-only process narration that should not appear in the chat UI. */
|
||
export function isInternalAssistantProcessNarration(text) {
|
||
const trimmed = String(text ?? '').trim();
|
||
if (!trimmed) return false;
|
||
if (ASSISTANT_DELIVERABLE_RE.test(trimmed)) return false;
|
||
return INTERNAL_ASSISTANT_MARKERS.some((pattern) => pattern.test(trimmed));
|
||
}
|
||
|
||
export function deriveAssistantFacingText(text) {
|
||
const trimmed = String(text ?? '').trim();
|
||
if (!trimmed) return '';
|
||
if (isInternalAssistantProcessNarration(trimmed)) return '';
|
||
return trimmed;
|
||
}
|
||
|
||
/** Strip agent-only prefixes from persisted user message content for UI display. */
|
||
export function deriveUserFacingText(text) {
|
||
let next = String(text ?? '');
|
||
next = next.replace(IMAGE_TURN_SCOPE_SUFFIX_RE, '');
|
||
next = stripUserIdentityPrefix(next);
|
||
next = stripTaskRoutingHint(next);
|
||
next = stripMemindTaskOrchestrationPrefix(next);
|
||
next = stripMindSpaceContextPrefix(next);
|
||
next = stripKnownChatSkillPrompt(next);
|
||
return next.trim();
|
||
}
|