import { THEME_CSS, escapeHtml, escapeAttr } from "../render/layout"; import { projectSettingsTabsHTML } from "./projectUpstreams"; import type { ProjectRow } from "../store"; export function buildProjectAiPage( project: ProjectRow, dispatchOff: boolean, globalDispatchOff: boolean, processingCount: number, wakeLoginsRaw = "", concurrencyLimit = "", communityWake = false, ): { html: string } { const aiBase = `/${encodeURIComponent(project.owner)}/${encodeURIComponent(project.name)}/settings/ai`; const dispatchAction = `/${encodeURIComponent(project.owner)}/${encodeURIComponent(project.name)}/settings/dispatch`; const haltAllAction = `${aiBase}/halt-all`; const dispatchCard = (() => { const disabled = globalDispatchOff; const hint = disabled ? `
⚠️ 全局自动接单已关闭。项目级开关在此状态下无效——需先开启全局。
` : `
关闭后,本项目新建 issue 不会自动派给 AI(评论仍可显式召唤)。不影响已在运行的会话。
`; return `

🔔 自动接单

${hint}
${dispatchOff ? "🔕 不接单" : "🔔 接单中"}
`; })(); const communityCard = `

🌍 社区模式

开启后,issue 的作者可自动唤醒自己的 issue(提交后续评论即派单),受每日配额限制;其他人的评论仍走白名单。白名单成员在别人的 issue 下回复时,该 issue 作者会被自动加入白名单。
${communityWake ? "🌍 社区模式开启" : "⭕ 关闭(仅白名单)"}
`; const wakeList = wakeLoginsRaw.split(/[\s,]+/).map((s) => s.trim()).filter(Boolean); const wakeCard = `

👥 唤醒白名单

默认只有平台成员能唤醒 AI。把外部 GitHub 用户加进来(逗号或换行分隔),他们在本项目的新 issue / 评论就会自动触发 AI 处理。bot 账号(如 github-actions[bot])永远无效;全局与项目接单开关仍是总闸。issue 评论区对外部用户也有「+白名单」一键按钮。清空内容保存即删除白名单。
`; const concurrencyCard = `

⚡ 项目并发上限

限制本项目同时运行的 AI 会话数量(例如 10 = 最多 10 个并行)。超出部分自动排队,有空位再跑。留空或 0 = 不限制(只受 daemon 全局并发约束)。对所有 daemon 生效。
`; const haltCard = (() => { const hint = processingCount > 0 ? `当前有 ${processingCount} 个 AI 会话正在运行。点击下方按钮将全部停止(向 daemon 发送 halt 信号)。` : `当前没有正在运行的 AI 会话。`; return `

⏹️ 停止所有运行中AI

${hint} 不影响自动接单状态。
${processingCount > 0 ? `${processingCount} 个会话运行中` : "空闲"}
`; })(); const html = ` ${escapeHtml(project.owner + "/" + project.name)} · AI 设置
${projectSettingsTabsHTML(project.owner, project.name, "ai")}

🤖 AI 设置

两个独立控制:🔔 自动接单控制是否自动派新单(不影响运行中);⏹️ 停止杀死当前所有运行中AI会话(不影响接单状态)。模型选择请去 ⚙️ 模型 标签页。

${dispatchCard} ${wakeCard} ${communityCard} ${concurrencyCard} ${haltCard}

更多配置(规划中)

后续版本将在此标签页增加:Nudge 间隔、Observer 开关等。
`; return { html }; }