@yeaft/webchat-agent 0.0.159 → 0.0.161
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/crew.js +64 -7
- package/package.json +1 -1
package/crew.js
CHANGED
|
@@ -69,12 +69,12 @@ function expandRoles(roles) {
|
|
|
69
69
|
// reviewer/tester 跟随 developer 的 count
|
|
70
70
|
const count = isExpandable ? devCount : 1;
|
|
71
71
|
|
|
72
|
-
if (count <= 1
|
|
73
|
-
//
|
|
72
|
+
if (count <= 1) {
|
|
73
|
+
// 单实例:保持原名,expandable 角色也分配 groupIndex=1 以获得独立 worktree
|
|
74
74
|
expanded.push({
|
|
75
75
|
...role,
|
|
76
76
|
roleType: role.name,
|
|
77
|
-
groupIndex: 0
|
|
77
|
+
groupIndex: isExpandable ? 1 : 0
|
|
78
78
|
});
|
|
79
79
|
} else {
|
|
80
80
|
// 多实例展开
|
|
@@ -99,9 +99,9 @@ function expandRoles(roles) {
|
|
|
99
99
|
// =====================================================================
|
|
100
100
|
|
|
101
101
|
/**
|
|
102
|
-
*
|
|
102
|
+
* 为开发组创建 git worktree
|
|
103
103
|
* 每个 groupIndex 对应一个 worktree,同组的 dev/rev/test 共享
|
|
104
|
-
* count=1
|
|
104
|
+
* 所有 EXPANDABLE_ROLES(包括 count=1)都会获得独立 worktree
|
|
105
105
|
*
|
|
106
106
|
* @param {string} projectDir - 主项目目录
|
|
107
107
|
* @param {Array} roles - 展开后的角色列表
|
|
@@ -572,9 +572,9 @@ export async function createCrewSession(msg) {
|
|
|
572
572
|
// 初始化共享区
|
|
573
573
|
await initSharedDir(sharedDir, goal, roles, projectDir, sharedKnowledge);
|
|
574
574
|
|
|
575
|
-
// 初始化 git worktrees
|
|
575
|
+
// 初始化 git worktrees(所有 EXPANDABLE_ROLES 都会获得独立 worktree)
|
|
576
576
|
const worktreeMap = await initWorktrees(projectDir, roles);
|
|
577
|
-
// 回填 workDir:同组的 dev
|
|
577
|
+
// 回填 workDir:同组的 dev/rev/test 共享同一个 worktree
|
|
578
578
|
for (const role of roles) {
|
|
579
579
|
if (role.groupIndex > 0 && worktreeMap.has(role.groupIndex)) {
|
|
580
580
|
role.workDir = worktreeMap.get(role.groupIndex);
|
|
@@ -1814,6 +1814,9 @@ export async function handleCrewControl(msg) {
|
|
|
1814
1814
|
case 'stop_all':
|
|
1815
1815
|
await stopAll(session);
|
|
1816
1816
|
break;
|
|
1817
|
+
case 'clear':
|
|
1818
|
+
await clearSession(session);
|
|
1819
|
+
break;
|
|
1817
1820
|
default:
|
|
1818
1821
|
console.warn(`[Crew] Unknown control action: ${action}`);
|
|
1819
1822
|
}
|
|
@@ -2007,6 +2010,60 @@ async function stopAll(session) {
|
|
|
2007
2010
|
console.log(`[Crew] Session ${session.id} stopped`);
|
|
2008
2011
|
}
|
|
2009
2012
|
|
|
2013
|
+
/**
|
|
2014
|
+
* 清空 session:保留角色配置,重置所有对话
|
|
2015
|
+
* 每个角色创建全新的 Claude conversation
|
|
2016
|
+
*/
|
|
2017
|
+
async function clearSession(session) {
|
|
2018
|
+
// 1. Abort 所有运行中的 queries
|
|
2019
|
+
for (const [roleName, roleState] of session.roleStates) {
|
|
2020
|
+
if (roleState.abortController) {
|
|
2021
|
+
roleState.abortController.abort();
|
|
2022
|
+
}
|
|
2023
|
+
console.log(`[Crew] Clearing role: ${roleName}`);
|
|
2024
|
+
}
|
|
2025
|
+
session.roleStates.clear();
|
|
2026
|
+
|
|
2027
|
+
// 2. 删除所有角色的 savedSessionId(强制新建 conversation)
|
|
2028
|
+
for (const [roleName] of session.roles) {
|
|
2029
|
+
await clearRoleSessionId(session.sharedDir, roleName);
|
|
2030
|
+
}
|
|
2031
|
+
|
|
2032
|
+
// 3. 清空消息历史
|
|
2033
|
+
session.messageHistory = [];
|
|
2034
|
+
session.uiMessages = [];
|
|
2035
|
+
session.humanMessageQueue = [];
|
|
2036
|
+
session.waitingHumanContext = null;
|
|
2037
|
+
session.pendingRoutes = [];
|
|
2038
|
+
|
|
2039
|
+
// 4. 重置计数
|
|
2040
|
+
session.round = 0;
|
|
2041
|
+
|
|
2042
|
+
// 5. 清空磁盘上的 messages.json
|
|
2043
|
+
const messagesPath = join(session.sharedDir, 'messages.json');
|
|
2044
|
+
await fs.writeFile(messagesPath, '[]').catch(() => {});
|
|
2045
|
+
|
|
2046
|
+
// 6. 恢复运行状态
|
|
2047
|
+
session.status = 'running';
|
|
2048
|
+
|
|
2049
|
+
// 7. 通知前端
|
|
2050
|
+
sendCrewMessage({
|
|
2051
|
+
type: 'crew_session_cleared',
|
|
2052
|
+
sessionId: session.id
|
|
2053
|
+
});
|
|
2054
|
+
|
|
2055
|
+
sendCrewOutput(session, 'system', 'system', {
|
|
2056
|
+
type: 'assistant',
|
|
2057
|
+
message: { role: 'assistant', content: [{ type: 'text', text: '会话已清空,所有角色将使用全新对话' }] }
|
|
2058
|
+
});
|
|
2059
|
+
sendStatusUpdate(session);
|
|
2060
|
+
|
|
2061
|
+
// 8. 保存 meta
|
|
2062
|
+
await saveSessionMeta(session);
|
|
2063
|
+
|
|
2064
|
+
console.log(`[Crew] Session ${session.id} cleared`);
|
|
2065
|
+
}
|
|
2066
|
+
|
|
2010
2067
|
// =====================================================================
|
|
2011
2068
|
// Message Helpers
|
|
2012
2069
|
// =====================================================================
|