Files
memind/conversation-display.mjs
T
john 371900bae5
Memind CI / Test, build, and release guards (pull_request) Failing after 18s
feat(mindspace): add page quota grace write and local delivery guardrails.
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>
2026-07-30 10:44:26 +08:00

85 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 交付链接:生产域名与本地 dev127.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();
}