import { buildCurrentTimeAgentPrefix } from '../../user-memory-profile.mjs'; import { isPageDataDevIntent, isPageDataIntent, } from '../../chat-skills.mjs'; import { buildWechatPageImageInstruction } from '../image-generation-policy.mjs'; /** * Service-account-only page generation prompt. Does not use H5 buildAutoChatSkillPrefix. */ export function buildPageGenerateAgentPrompt(intent, { wantsDocx = false, imagePolicy = null } = {}) { const topic = String(intent?.agentText ?? intent?.displayText ?? '').trim(); const pageDataTask = isPageDataIntent(topic) || isPageDataDevIntent(topic); const scheduleTimezone = process.env.H5_DEFAULT_TIMEZONE || 'Asia/Shanghai'; const docxBlock = wantsDocx ? [ '【Word 下载】用户要求页面内可下载 Word/docx。', '先 `load_skill` → `docx-generate` 生成 `public/*.docx`,再写 HTML 并链接同目录文档。', '', ].join('\n') : ''; const imageBlock = buildWechatPageImageInstruction(imagePolicy, { sourceMessageId: intent?.msgId, }); const coverExample = imageBlock ? '<本轮 generate_image 返回的 asset.htmlSrc>' : 'assets/hero.jpg'; const pageDataBlock = pageDataTask ? [ '【Page Data 强制要求】这不是静态展示页。', '先 `load_skill` → `page-data-collect`,再按技能执行:private_data_execute 建表 → private_data_register_dataset → 写 HTML → private_data_bind_workspace_page。', '修复任务必须核对真实表、dataset、policy 与 bind;缺失时必须补齐,禁止只改 HTML。', 'HTML 必须使用 /assets/page-data-client.js 与服务端 authenticate/listRows/insertRow;禁止硬编码口令、本地存储和自建 API。', '只有 Page Data 提交/读取交付验收通过后才能发送链接。', '', ].join('\n') : ''; return [ '【微信服务号 · 页面生成任务】', '这是服务号专用页面生成,不是普通聊天。必须按步骤完成,未完成前禁止告诉用户“已生成/已发布”。', '', docxBlock, imageBlock, pageDataBlock, '步骤(必须全部完成):', pageDataTask ? '1. 完成 page-data-collect 数据能力后,再调用 `load_skill`,参数 name=`static-page-publish`,补齐视觉与发布要求。' : '1. 必须先调用 `load_skill`,参数 name=`static-page-publish`。', '2. 阅读技能说明后,用 sandbox-fs 的 `write_file` 或 `edit_file` 写入 `public/*.html`。', '3. 禁止 shell/cat/heredoc/cp 写 HTML(不会出现在公网 MindSpace)。', '4. 写完后确认目标文件已落盘,且内容是用户要的完整页面(不是占位 stub)。', '5. 在 `
` 写入微信分享卡片所需元数据(必须):', ' - ``', ` - \`\``, imageBlock ? ' tag/accent/subtitle 必须与页面主题一致;cover 必须引用本轮新生成资产,不得省略、复用旧图或填写占位路径。' : ' tag/accent/subtitle 必须与页面主题一致;有 hero 图时 cover 指向同目录 raster 图(jpg/png)。', '6. 交付前运行 `npm run check:mindspace-cover`(或 node scripts/check-mindspace-cover.mjs --userTKMind · 智趣
`(必须;禁止省略、不要用邮箱/tkmind.ai,也不要把该行 opacity 设太低导致看不见)。', '8. 回复里只给一个正式域名的唯一正确链接;没有落盘或缺少上述元数据就不要发链接。', '9. 禁止编造用户未提供的产品指标、客户数量、SLA、认证、案例、排名或承诺;没有可靠依据时使用定性描述,不得杜撰数字。', '', buildCurrentTimeAgentPrefix({ timezone: scheduleTimezone }), `用户需求:${topic}`, ] .filter(Boolean) .join('\n'); } export function buildPagePublishFailureText({ missingSharePreview = false, missingPlatformBrand = false, missingFreshThumbnail = false, } = {}) { if (missingFreshThumbnail) { return [ '这次页面内容已生成,但没有完成服务号要求的本轮新缩略图,所以我先不发页面链接。', '页面内容已经保留。请稍后回复“重试上次页面”,无需重新描述完整需求。', ].join('\n'); } if (missingPlatformBrand) { return [ '这次页面已落盘,但缺少页脚平台品牌标记(data-mindspace-page-tag="platform-brand"),所以我先不发链接。', '请直接重发一次完整页面需求,我会重新按 static-page-publish 技能生成带 TKMind · 智趣 品牌页脚的页面。', ].join('\n'); } if (missingSharePreview) { return [ '这次页面已落盘,但缺少微信分享卡片所需的预览元数据(mindspace-cover 与摘要),所以我先不发链接。', '请直接重发一次完整页面需求,我会重新按 static-page-publish 技能生成带预览图的页面。', ].join('\n'); } return [ '这次页面没有按服务号页面技能真正生成成功,所以我先不发占位链接。', '请直接重发一次完整页面需求,我会重新按 static-page-publish 技能链路生成。', ].join('\n'); }