Files
memind/chat-skills.mjs
T
john 70492d9eba Add attachment text extraction, auto web news skill, and chat/voice UI updates.
Simplify asset upload temp paths, refresh deploy docs for Aliyun DNS topology, and ship MindSpace content-scan and auth improvements.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-20 15:08:10 +08:00

120 lines
4.1 KiB
JavaScript

// Keep browser-safe: do not import user-publish.mjs (uses node:fs/path/url).
const PUBLISH_SKILL_NAME = 'static-page-publish';
const WEB_INTENT_PATTERNS = [
/(?:今天|今日|最新|热点|热搜|新闻|头条|头条新闻|最新消息|发生了什么|最近发生)/u,
/(?:latest|breaking)\s+news/i,
/what(?:'s| is)?\s+happening/i,
];
const WEB_NEWS_INTENT_PATTERNS = [
/(?:今天|今日|最新|热点|热搜|新闻|头条|头条新闻|热榜|热议|舆情|突发)/u,
/(?:today|latest|breaking|trending)\s+(?:news|stories|headlines|topics)/i,
/(?:what(?:'s| is)?\s+the\s+latest|what(?:'s| is)?\s+trending)/i,
];
export const CHAT_SKILL_DEFINITIONS = [
{
id: 'web-search',
label: '查资料',
icon: 'web',
skillName: 'web',
requiresSkill: 'web',
prefillOnly: true,
promptKey: 'web',
},
{
id: 'code-search',
label: '搜代码',
icon: 'search',
skillName: 'search',
requiresSkill: 'search',
prefillOnly: true,
promptKey: 'search',
},
{
id: 'form-collect',
label: '表单收集',
icon: 'form',
skillName: 'form-builder',
requiresSkill: 'form-builder',
prefillOnly: true,
promptKey: 'form-builder',
},
{
id: 'table-view',
label: '数据表格',
icon: 'table',
skillName: 'table-viewer',
requiresSkill: 'table-viewer',
prefillOnly: true,
promptKey: 'table-viewer',
},
{
id: 'summarize',
label: '总结内容',
icon: 'summary',
prefillOnly: true,
promptKey: 'summarize',
},
{
id: 'analyze',
label: '深度分析',
icon: 'analyze',
prefillOnly: true,
promptKey: 'analyze',
},
{
id: 'generate-page',
label: '生成页面',
icon: 'page',
skillName: PUBLISH_SKILL_NAME,
requiresPublish: true,
promptKey: 'generate-page',
},
];
export function buildChatSkillPrompt(promptKey, skillName) {
switch (promptKey) {
case 'web':
return `请使用 ${skillName ?? 'web'} 技能:帮我搜索并查阅相关资料(优先官方文档),并给出中文摘要与来源链接。我的问题是:`;
case 'search':
return `请使用 ${skillName ?? 'search'} 技能:帮我在工作区中查找代码或文件。我要找的是:`;
case 'form-builder':
return `请使用 ${skillName ?? 'form-builder'} 技能:请用交互式表单收集以下场景所需的结构化字段(字段不超过 8 个):`;
case 'table-viewer':
return `请使用 ${skillName ?? 'table-viewer'} 技能:请把以下数据整理成可排序、可筛选的交互式表格:`;
case 'summarize':
return '请总结以下内容,提炼核心结论、重点信息和可执行建议(条理清晰、中文输出):';
case 'analyze':
return '请深入分析以下内容,给出结构化解读:背景、关键发现、风险或机会、以及建议下一步:';
case 'generate-page':
return `请使用 ${skillName ?? PUBLISH_SKILL_NAME} 技能:在我的专属 MindSpace 发布目录生成静态 HTML 页面,并给出可公网访问的完整链接。`;
default:
return '';
}
}
function buildWebNewsSkillPrompt(skillName) {
return `请使用 ${skillName ?? 'web'} 技能:先搜索今天/最新相关的新闻与热点,优先一手来源和权威媒体,整理 3-5 条最相关结果,按时间或热度排序;然后给出中文摘要、关键信息、事件背景和来源链接。我的问题是:`;
}
export function filterChatSkills(options, ctx) {
return options.filter((skill) => {
if (skill.requiresPublish && !ctx.canPublish) return false;
if (skill.requiresSkill && !ctx.grantedSkills?.includes(skill.requiresSkill)) return false;
return true;
});
}
export function buildAutoChatSkillPrefix(text, grantedSkills = []) {
const trimmed = String(text ?? '').trim();
if (!trimmed) return '';
if (!grantedSkills.includes('web')) return '';
if (WEB_NEWS_INTENT_PATTERNS.some((pattern) => pattern.test(trimmed))) {
return buildWebNewsSkillPrompt('web');
}
if (!WEB_INTENT_PATTERNS.some((pattern) => pattern.test(trimmed))) return '';
return buildChatSkillPrompt('web', 'web');
}