@yeaft/webchat-agent 0.0.227 → 0.0.229
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/conversation.js +1 -3
- package/crew-i18n.js +2 -14
- package/crew.js +11 -58
- package/package.json +1 -1
package/conversation.js
CHANGED
|
@@ -60,7 +60,6 @@ export async function sendConversationList() {
|
|
|
60
60
|
userId: session.userId,
|
|
61
61
|
username: session.username,
|
|
62
62
|
type: 'crew',
|
|
63
|
-
goal: session.goal
|
|
64
63
|
});
|
|
65
64
|
}
|
|
66
65
|
// 追加索引中已停止的 crew sessions(不重复)
|
|
@@ -75,8 +74,7 @@ export async function sendConversationList() {
|
|
|
75
74
|
processing: false,
|
|
76
75
|
userId: entry.userId,
|
|
77
76
|
username: entry.username,
|
|
78
|
-
type: 'crew'
|
|
79
|
-
status: entry.status
|
|
77
|
+
type: 'crew'
|
|
80
78
|
});
|
|
81
79
|
}
|
|
82
80
|
}
|
package/crew-i18n.js
CHANGED
|
@@ -9,7 +9,7 @@ const messages = {
|
|
|
9
9
|
'zh-CN': {
|
|
10
10
|
// buildRoleSystemPrompt
|
|
11
11
|
teamCollab: '# 团队协作',
|
|
12
|
-
teamCollabIntro: (
|
|
12
|
+
teamCollabIntro: () => '你正在一个 AI 团队中工作。等待用户提出任务或问题。',
|
|
13
13
|
teamMembers: '团队成员:',
|
|
14
14
|
decisionMakerTag: '决策者',
|
|
15
15
|
|
|
@@ -113,12 +113,6 @@ ${isDevTeam ? '3' : '2'}. **任务完成** - 所有任务已完成,给出完
|
|
|
113
113
|
reviewCode: '请审查代码变更',
|
|
114
114
|
testFeature: '请测试功能',
|
|
115
115
|
|
|
116
|
-
// buildInitialTask
|
|
117
|
-
projectStart: '项目启动!',
|
|
118
|
-
goalLabel: '目标',
|
|
119
|
-
firstRoleInstruction: '你是第一个开始工作的角色。请分析目标,开始你的工作。\n完成后,通过 ROUTE 块将结果传递给下一个合适的角色。',
|
|
120
|
-
availableRoles: '团队中可用的角色:',
|
|
121
|
-
|
|
122
116
|
// writeSharedClaudeMd
|
|
123
117
|
projectGoal: '# 项目目标',
|
|
124
118
|
projectCodePath: '# 项目代码路径',
|
|
@@ -188,7 +182,7 @@ ${isDevTeam ? '3' : '2'}. **任务完成** - 所有任务已完成,给出完
|
|
|
188
182
|
'en': {
|
|
189
183
|
// buildRoleSystemPrompt
|
|
190
184
|
teamCollab: '# Team Collaboration',
|
|
191
|
-
teamCollabIntro: (
|
|
185
|
+
teamCollabIntro: () => 'You are working in an AI team. Waiting for the user to assign tasks or questions.',
|
|
192
186
|
teamMembers: 'Team members:',
|
|
193
187
|
decisionMakerTag: 'Decision Maker',
|
|
194
188
|
|
|
@@ -292,12 +286,6 @@ After development is complete, send two ROUTE blocks simultaneously to ${revName
|
|
|
292
286
|
reviewCode: 'Please review code changes',
|
|
293
287
|
testFeature: 'Please test the feature',
|
|
294
288
|
|
|
295
|
-
// buildInitialTask
|
|
296
|
-
projectStart: 'Project started!',
|
|
297
|
-
goalLabel: 'Goal',
|
|
298
|
-
firstRoleInstruction: 'You are the first role to start working. Analyze the goal and begin your work.\nWhen done, pass the result to the next appropriate role via a ROUTE block.',
|
|
299
|
-
availableRoles: 'Available roles in the team:',
|
|
300
|
-
|
|
301
289
|
// writeSharedClaudeMd
|
|
302
290
|
projectGoal: '# Project Goal',
|
|
303
291
|
projectCodePath: '# Project Code Path',
|
package/crew.js
CHANGED
|
@@ -254,7 +254,6 @@ function sessionToIndexEntry(session) {
|
|
|
254
254
|
projectDir: session.projectDir,
|
|
255
255
|
sharedDir: session.sharedDir,
|
|
256
256
|
status: session.status,
|
|
257
|
-
goal: session.goal,
|
|
258
257
|
name: session.name || '',
|
|
259
258
|
userId: session.userId,
|
|
260
259
|
username: session.username,
|
|
@@ -312,9 +311,7 @@ async function saveSessionMeta(session) {
|
|
|
312
311
|
sessionId: session.id,
|
|
313
312
|
projectDir: session.projectDir,
|
|
314
313
|
sharedDir: session.sharedDir,
|
|
315
|
-
goal: session.goal,
|
|
316
314
|
name: session.name || '',
|
|
317
|
-
sharedKnowledge: session.sharedKnowledge || '',
|
|
318
315
|
status: session.status,
|
|
319
316
|
roles: Array.from(session.roles.values()).map(r => ({
|
|
320
317
|
name: r.name, displayName: r.displayName, icon: r.icon,
|
|
@@ -322,7 +319,6 @@ async function saveSessionMeta(session) {
|
|
|
322
319
|
groupIndex: r.groupIndex, roleType: r.roleType, model: r.model
|
|
323
320
|
})),
|
|
324
321
|
decisionMaker: session.decisionMaker,
|
|
325
|
-
maxRounds: session.maxRounds,
|
|
326
322
|
round: session.round,
|
|
327
323
|
createdAt: session.createdAt,
|
|
328
324
|
updatedAt: Date.now(),
|
|
@@ -652,16 +648,13 @@ export async function resumeCrewSession(msg) {
|
|
|
652
648
|
sessionId,
|
|
653
649
|
projectDir: session.projectDir,
|
|
654
650
|
sharedDir: session.sharedDir,
|
|
655
|
-
goal: session.goal,
|
|
656
651
|
name: session.name || '',
|
|
657
|
-
sharedKnowledge: session.sharedKnowledge || '',
|
|
658
652
|
roles: roles.map(r => ({
|
|
659
653
|
name: r.name, displayName: r.displayName, icon: r.icon,
|
|
660
654
|
description: r.description, isDecisionMaker: r.isDecisionMaker || false,
|
|
661
655
|
groupIndex: r.groupIndex, roleType: r.roleType, model: r.model
|
|
662
656
|
})),
|
|
663
657
|
decisionMaker: session.decisionMaker,
|
|
664
|
-
maxRounds: session.maxRounds,
|
|
665
658
|
userId: session.userId,
|
|
666
659
|
username: session.username,
|
|
667
660
|
uiMessages: cleanedMessages,
|
|
@@ -693,15 +686,12 @@ export async function resumeCrewSession(msg) {
|
|
|
693
686
|
id: sessionId,
|
|
694
687
|
projectDir: meta.projectDir,
|
|
695
688
|
sharedDir: meta.sharedDir || indexEntry.sharedDir,
|
|
696
|
-
goal: meta.goal,
|
|
697
689
|
name: meta.name || '',
|
|
698
|
-
sharedKnowledge: meta.sharedKnowledge || '',
|
|
699
690
|
roles: new Map(roles.map(r => [r.name, r])),
|
|
700
691
|
roleStates: new Map(),
|
|
701
692
|
decisionMaker,
|
|
702
693
|
status: 'waiting_human',
|
|
703
694
|
round: meta.round || 0,
|
|
704
|
-
maxRounds: meta.maxRounds || 20,
|
|
705
695
|
costUsd: meta.costUsd || 0,
|
|
706
696
|
totalInputTokens: meta.totalInputTokens || 0,
|
|
707
697
|
totalOutputTokens: meta.totalOutputTokens || 0,
|
|
@@ -731,16 +721,13 @@ export async function resumeCrewSession(msg) {
|
|
|
731
721
|
sessionId,
|
|
732
722
|
projectDir: session.projectDir,
|
|
733
723
|
sharedDir: session.sharedDir,
|
|
734
|
-
goal: session.goal,
|
|
735
724
|
name: session.name || '',
|
|
736
|
-
sharedKnowledge: session.sharedKnowledge || '',
|
|
737
725
|
roles: roles.map(r => ({
|
|
738
726
|
name: r.name, displayName: r.displayName, icon: r.icon,
|
|
739
727
|
description: r.description, isDecisionMaker: r.isDecisionMaker || false,
|
|
740
728
|
groupIndex: r.groupIndex, roleType: r.roleType, model: r.model
|
|
741
729
|
})),
|
|
742
730
|
decisionMaker,
|
|
743
|
-
maxRounds: session.maxRounds,
|
|
744
731
|
userId: session.userId,
|
|
745
732
|
username: session.username,
|
|
746
733
|
uiMessages: session.uiMessages,
|
|
@@ -798,11 +785,8 @@ export async function createCrewSession(msg) {
|
|
|
798
785
|
sessionId,
|
|
799
786
|
projectDir,
|
|
800
787
|
sharedDir: sharedDirRel,
|
|
801
|
-
goal,
|
|
802
788
|
name,
|
|
803
|
-
sharedKnowledge,
|
|
804
789
|
roles: rawRoles = [], // [{ name, displayName, icon, description, claudeMd, model, budget, isDecisionMaker, count }]
|
|
805
|
-
maxRounds = 20,
|
|
806
790
|
teamType = 'dev',
|
|
807
791
|
language = 'zh-CN',
|
|
808
792
|
userId,
|
|
@@ -833,15 +817,12 @@ export async function createCrewSession(msg) {
|
|
|
833
817
|
id: sessionId,
|
|
834
818
|
projectDir,
|
|
835
819
|
sharedDir,
|
|
836
|
-
goal,
|
|
837
820
|
name: name || '',
|
|
838
|
-
sharedKnowledge: sharedKnowledge || '',
|
|
839
821
|
roles: new Map(roles.map(r => [r.name, r])),
|
|
840
822
|
roleStates: new Map(),
|
|
841
823
|
decisionMaker,
|
|
842
824
|
status: 'initializing', // ← 新增初始化状态
|
|
843
825
|
round: 0,
|
|
844
|
-
maxRounds,
|
|
845
826
|
costUsd: 0,
|
|
846
827
|
totalInputTokens: 0,
|
|
847
828
|
totalOutputTokens: 0,
|
|
@@ -869,9 +850,7 @@ export async function createCrewSession(msg) {
|
|
|
869
850
|
sessionId,
|
|
870
851
|
projectDir,
|
|
871
852
|
sharedDir,
|
|
872
|
-
goal,
|
|
873
853
|
name: name || '',
|
|
874
|
-
sharedKnowledge: sharedKnowledge || '',
|
|
875
854
|
roles: roles.map(r => ({
|
|
876
855
|
name: r.name,
|
|
877
856
|
displayName: r.displayName,
|
|
@@ -883,7 +862,6 @@ export async function createCrewSession(msg) {
|
|
|
883
862
|
groupIndex: r.groupIndex
|
|
884
863
|
})),
|
|
885
864
|
decisionMaker,
|
|
886
|
-
maxRounds,
|
|
887
865
|
userId,
|
|
888
866
|
username
|
|
889
867
|
});
|
|
@@ -895,7 +873,7 @@ export async function createCrewSession(msg) {
|
|
|
895
873
|
// 初始化共享区(角色目录 + CLAUDE.md)
|
|
896
874
|
session.initProgress = 'roles';
|
|
897
875
|
sendStatusUpdate(session);
|
|
898
|
-
await initSharedDir(sharedDir,
|
|
876
|
+
await initSharedDir(sharedDir, roles, projectDir, language);
|
|
899
877
|
|
|
900
878
|
// 初始化 git worktrees
|
|
901
879
|
const groupIndices = [...new Set(roles.filter(r => r.groupIndex > 0).map(r => r.groupIndex))];
|
|
@@ -923,15 +901,6 @@ export async function createCrewSession(msg) {
|
|
|
923
901
|
}
|
|
924
902
|
session.initProgress = null;
|
|
925
903
|
sendStatusUpdate(session);
|
|
926
|
-
|
|
927
|
-
// 如果有目标且状态为 running,自动启动第一个角色
|
|
928
|
-
if (goal && roles.length > 0 && session.status === 'running') {
|
|
929
|
-
const firstRole = roles.find(r => r.name === 'pm') || roles[0];
|
|
930
|
-
if (firstRole) {
|
|
931
|
-
const initialPrompt = buildInitialTask(goal, firstRole, roles, language);
|
|
932
|
-
await dispatchToRole(session, firstRole.name, initialPrompt, 'system');
|
|
933
|
-
}
|
|
934
|
-
}
|
|
935
904
|
} catch (e) {
|
|
936
905
|
console.error('[Crew] Session initialization failed:', e);
|
|
937
906
|
if (session.status === 'initializing') {
|
|
@@ -1087,18 +1056,16 @@ export async function removeRoleFromSession(msg) {
|
|
|
1087
1056
|
}
|
|
1088
1057
|
|
|
1089
1058
|
/**
|
|
1090
|
-
* 更新 crew session 的 name
|
|
1059
|
+
* 更新 crew session 的 name
|
|
1091
1060
|
*/
|
|
1092
1061
|
export async function handleUpdateCrewSession(msg) {
|
|
1093
|
-
const { sessionId, name
|
|
1062
|
+
const { sessionId, name } = msg;
|
|
1094
1063
|
const session = crewSessions.get(sessionId);
|
|
1095
1064
|
if (!session) {
|
|
1096
1065
|
console.warn(`[Crew] Session not found for update: ${sessionId}`);
|
|
1097
1066
|
return;
|
|
1098
1067
|
}
|
|
1099
1068
|
if (name !== undefined) session.name = name;
|
|
1100
|
-
if (sharedKnowledge !== undefined) session.sharedKnowledge = sharedKnowledge;
|
|
1101
|
-
await updateSharedClaudeMd(session);
|
|
1102
1069
|
await saveSessionMeta(session);
|
|
1103
1070
|
await upsertCrewIndex(session);
|
|
1104
1071
|
}
|
|
@@ -1118,7 +1085,7 @@ export async function handleUpdateCrewSession(msg) {
|
|
|
1118
1085
|
* └── {roleName}/
|
|
1119
1086
|
* └── CLAUDE.md ← 角色定义 + 个人记忆
|
|
1120
1087
|
*/
|
|
1121
|
-
async function initSharedDir(sharedDir,
|
|
1088
|
+
async function initSharedDir(sharedDir, roles, projectDir, language = 'zh-CN') {
|
|
1122
1089
|
await fs.mkdir(sharedDir, { recursive: true });
|
|
1123
1090
|
await fs.mkdir(join(sharedDir, 'context'), { recursive: true });
|
|
1124
1091
|
await fs.mkdir(join(sharedDir, 'sessions'), { recursive: true });
|
|
@@ -1130,7 +1097,7 @@ async function initSharedDir(sharedDir, goal, roles, projectDir, sharedKnowledge
|
|
|
1130
1097
|
}
|
|
1131
1098
|
|
|
1132
1099
|
// 生成 .crew/CLAUDE.md(共享级)
|
|
1133
|
-
await writeSharedClaudeMd(sharedDir,
|
|
1100
|
+
await writeSharedClaudeMd(sharedDir, roles, projectDir, language);
|
|
1134
1101
|
}
|
|
1135
1102
|
|
|
1136
1103
|
/**
|
|
@@ -1154,14 +1121,10 @@ async function initRoleDir(sharedDir, role, language = 'zh-CN') {
|
|
|
1154
1121
|
* 写入 .crew/CLAUDE.md — 共享级(所有角色自动继承)
|
|
1155
1122
|
* 记忆直接写在 CLAUDE.md 中,Claude Code 会自动加载
|
|
1156
1123
|
*/
|
|
1157
|
-
async function writeSharedClaudeMd(sharedDir,
|
|
1124
|
+
async function writeSharedClaudeMd(sharedDir, roles, projectDir, language = 'zh-CN') {
|
|
1158
1125
|
const m = getMessages(language);
|
|
1159
|
-
const sharedMemoryContent = sharedKnowledge
|
|
1160
|
-
? `${m.sharedMemoryTitle}\n${sharedKnowledge}\n`
|
|
1161
|
-
: `${m.sharedMemoryTitle}\n${m.sharedMemoryDefault}\n`;
|
|
1162
1126
|
|
|
1163
1127
|
const claudeMd = `${m.projectGoal}
|
|
1164
|
-
${goal}
|
|
1165
1128
|
|
|
1166
1129
|
${m.projectCodePath}
|
|
1167
1130
|
${projectDir}
|
|
@@ -1181,7 +1144,9 @@ ${m.worktreeRulesContent}
|
|
|
1181
1144
|
|
|
1182
1145
|
${m.featureRecordShared}
|
|
1183
1146
|
|
|
1184
|
-
${
|
|
1147
|
+
${m.sharedMemoryTitle}
|
|
1148
|
+
${m.sharedMemoryDefault}
|
|
1149
|
+
`;
|
|
1185
1150
|
|
|
1186
1151
|
await fs.writeFile(join(sharedDir, 'CLAUDE.md'), claudeMd);
|
|
1187
1152
|
}
|
|
@@ -1220,7 +1185,7 @@ ${m.personalMemoryDefault}
|
|
|
1220
1185
|
*/
|
|
1221
1186
|
async function updateSharedClaudeMd(session) {
|
|
1222
1187
|
const roles = Array.from(session.roles.values());
|
|
1223
|
-
await writeSharedClaudeMd(session.sharedDir,
|
|
1188
|
+
await writeSharedClaudeMd(session.sharedDir, roles, session.projectDir, session.language || 'zh-CN');
|
|
1224
1189
|
}
|
|
1225
1190
|
|
|
1226
1191
|
// =====================================================================
|
|
@@ -1584,7 +1549,7 @@ function buildRoleSystemPrompt(role, session) {
|
|
|
1584
1549
|
const m = getMessages(session.language || 'zh-CN');
|
|
1585
1550
|
|
|
1586
1551
|
let prompt = `${m.teamCollab}
|
|
1587
|
-
${m.teamCollabIntro(
|
|
1552
|
+
${m.teamCollabIntro()}
|
|
1588
1553
|
|
|
1589
1554
|
${m.teamMembers}
|
|
1590
1555
|
${allRoles.map(r => `- ${roleLabel(r)}: ${r.description}${r.isDecisionMaker ? ` (${m.decisionMakerTag})` : ''}`).join('\n')}`;
|
|
@@ -1726,17 +1691,6 @@ Always respond in 中文. Use 中文 for all explanations, comments, and communi
|
|
|
1726
1691
|
|
|
1727
1692
|
return prompt;
|
|
1728
1693
|
}
|
|
1729
|
-
function buildInitialTask(goal, firstRole, allRoles, language = 'zh-CN') {
|
|
1730
|
-
const m = getMessages(language);
|
|
1731
|
-
return `${m.projectStart}
|
|
1732
|
-
|
|
1733
|
-
${m.goalLabel}: ${goal}
|
|
1734
|
-
|
|
1735
|
-
${m.firstRoleInstruction}
|
|
1736
|
-
|
|
1737
|
-
${m.availableRoles}
|
|
1738
|
-
${allRoles.map(r => `- ${r.name}: ${roleLabel(r)} - ${r.description}`).join('\n')}`;
|
|
1739
|
-
}
|
|
1740
1694
|
|
|
1741
1695
|
// =====================================================================
|
|
1742
1696
|
// Role Output Processing
|
|
@@ -3117,7 +3071,6 @@ function sendStatusUpdate(session) {
|
|
|
3117
3071
|
status: session.status,
|
|
3118
3072
|
currentRole,
|
|
3119
3073
|
round: session.round,
|
|
3120
|
-
maxRounds: session.maxRounds,
|
|
3121
3074
|
costUsd: session.costUsd,
|
|
3122
3075
|
totalInputTokens: session.totalInputTokens,
|
|
3123
3076
|
totalOutputTokens: session.totalOutputTokens,
|