' +
'
切到该项目' +
'
保留当前项目' +
@@ -471,7 +540,7 @@ async function send() {
const d = await api('POST', '/api/sessions', { user_id: 'default', project: draftProject || null });
sid = d.session_id;
activeProject = draftProject || null;
- badge.textContent = '会话: ' + (d.name || '新会话');
+ sessionTitle.textContent = (d.name || '新会话');
try { localStorage.setItem('genesis_session', sid); } catch (e) { /* 忽略 */ }
await refreshSessions();
} catch (e) {
@@ -523,6 +592,20 @@ document.getElementById('ps-current').addEventListener('click', (e) => { e.stopP
document.getElementById('drawer-close').addEventListener('click', closeProjectDrawer);
document.getElementById('pf-save').addEventListener('click', saveDrawerProject);
document.getElementById('pf-delete').addEventListener('click', deleteDrawerProject);
+document.getElementById('tb-newproject').addEventListener('click', () => {
+ if (!guardDrawerDirty()) return;
+ openProjectDrawer(null);
+});
+document.getElementById('tb-upload').addEventListener('click', () => {
+ const panel = document.getElementById('upload-panel');
+ if (panel) panel.hidden = !panel.hidden;
+});
+document.getElementById('sm-rename').addEventListener('click', (ev) => {
+ ev.stopPropagation();
+ const t = sessMenuTarget;
+ closeSessMenu();
+ if (t) startRenameSession(t.el, { session_id: t.sid, name: t.name });
+});
// ---------- P0‑A:RAG 开关 + 状态徽标 + 开始影响调查 ----------
const ragEnabledEl = document.getElementById('rag-enabled');
@@ -555,7 +638,7 @@ async function refreshRagStats() {
const n = Number(stats.chunks) || 0;
ragStatsEl.textContent = n > 0
? 'RAG 已索引 ' + n + ' 片段'
- : 'RAG 0 片段(请上传既有系统 zip)';
+ : 'RAG 0 片段(请在项目配置中设置代码库目录)';
ragStatsEl.classList.toggle('ready', n > 0);
ragStatsEl.classList.toggle('zero', n === 0);
// 开关可用性:必须先有 RAG 索引才能用
@@ -563,7 +646,7 @@ async function refreshRagStats() {
if (n === 0) {
ragEnabledEl.checked = false;
writeRagFlag(false);
- ragEnabledEl.parentElement.title = '请先在上传区选择"既有系统 zip"并上传';
+ ragEnabledEl.parentElement.title = '请在项目配置中设置既有系统代码库目录';
} else {
ragEnabledEl.checked = readRagFlag();
ragEnabledEl.parentElement.title = ragEnabledEl.checked
@@ -607,9 +690,13 @@ impactBtnEl.addEventListener('click', async () => {
document.addEventListener('click', (e) => {
// 点击切换器外部关闭下拉
if (!document.getElementById('proj-switcher').contains(e.target)) toggleProjectSwitcher(false);
+ // 点击「⋯」菜单外部关闭
+ const sm = document.getElementById('sess-menu');
+ if (sm && !sm.hidden && !sm.contains(e.target)) closeSessMenu();
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') {
+ closeSessMenu();
if (psMenu.classList.contains('open')) toggleProjectSwitcher(false);
else if (drawerOpen) closeProjectDrawer();
if (lastTriggerEl) { lastTriggerEl.focus(); lastTriggerEl = null; }
@@ -675,7 +762,7 @@ document.getElementById('upload-btn').addEventListener('click', async () => {
// B5 / P1‑F:上传成功后同步 activeProject、刷新上传条与侧边栏状态
const rec = await api('GET', '/api/sessions/' + encodeURIComponent(sid));
activeProject = rec.project || null;
- badge.textContent = '会话: ' + (rec.name || '新会话');
+ sessionTitle.textContent = (rec.name || '新会话');
await refreshSessions();
updateUploadBar(); // P1‑F:上传成功后同步上传条(防状态滞后)
await refreshRagStats(); // P0‑A:上传 existing_system 后 RAG 索引已建
diff --git a/src/genesis/server/static/chat_state.js b/src/genesis/server/static/chat_state.js
index fccdba0..e01788b 100644
--- a/src/genesis/server/static/chat_state.js
+++ b/src/genesis/server/static/chat_state.js
@@ -53,12 +53,22 @@
return '请新建项目或者选择项目';
}
return '你好!我是 Genesis 概要设计书生成 Agent。'
- + '请先在上方📎上传
要件定义 xlsx'
+ + '请先在下方📎上传
要件定义 xlsx'
+ '(模板/规则/代码库已由项目「' + draftProject + '」提供),然后告诉我:'
+ '
· 「生成概要设计书」(自动解析→影响→生成→QA)'
+ '
· 「用中文生成」 / 「现在什么状态?」';
}
+ // 空态主标题(豆包式布局:新建会话居中显示)
+ function emptyHeadline() {
+ return '有什么可以帮到你的?';
+ }
+
+ // 空态建议卡 / 快捷入口提示词(点击填入输入框,不自动发送)
+ function quickPrompts() {
+ return ['生成概要设计书', '影响调查', '用中文生成', '现在什么状态?'];
+ }
+
return {
autoBindProject,
shouldHideUploadSelect,
@@ -66,5 +76,7 @@
computeDrawerSnapshot,
isDrawerDirty,
buildWelcome,
+ emptyHeadline,
+ quickPrompts,
};
});
diff --git a/tests/test_chat_state.js b/tests/test_chat_state.js
index a32fa9c..83e4c72 100644
--- a/tests/test_chat_state.js
+++ b/tests/test_chat_state.js
@@ -47,3 +47,13 @@ test('buildWelcome: 有项目时提示由项目提供模板/规则/代码库', (
assert.match(txt, /项目「A」/);
assert.match(txt, /要件定义/);
});
+
+test('emptyHeadline: 返回空态主标题', () => {
+ assert.match(S.emptyHeadline(), /有什么可以帮到你的/);
+});
+
+test('quickPrompts: 返回 4 条快捷提示且含影响调查', () => {
+ const p = S.quickPrompts();
+ assert.equal(p.length, 4);
+ assert.ok(p.includes('影响调查'));
+});