@yeaft/webchat-agent 0.1.606 → 0.1.608
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/package.json +1 -1
- package/unify/conversation/persist.js +6 -0
- package/unify/engine.js +8 -2
- package/unify/prompts.js +0 -2
- package/unify/stop-hooks.js +7 -0
- package/unify/web-bridge.js +7 -3
package/package.json
CHANGED
|
@@ -64,6 +64,11 @@ function serializeMessage(msg) {
|
|
|
64
64
|
// their original thread id in `sourceThreadId` so the UI can still
|
|
65
65
|
// render a small "#source" pill next to each bubble.
|
|
66
66
|
if (msg.sourceThreadId) fm.push(`sourceThreadId: ${msg.sourceThreadId}`);
|
|
67
|
+
// Bug 6: persist groupId so history replay can stamp messages with the
|
|
68
|
+
// group they originated in. Without this, every replayed message lands
|
|
69
|
+
// in the default group and switching back to the originating group
|
|
70
|
+
// shows an empty pane.
|
|
71
|
+
if (msg.groupId) fm.push(`groupId: ${msg.groupId}`);
|
|
67
72
|
|
|
68
73
|
// Token estimate
|
|
69
74
|
const content = msg.content || '';
|
|
@@ -134,6 +139,7 @@ export function parseMessage(raw) {
|
|
|
134
139
|
case 'tokens_est': msg.tokens_est = parseInt(value, 10); break;
|
|
135
140
|
case 'threadId': msg.threadId = value; break;
|
|
136
141
|
case 'sourceThreadId': msg.sourceThreadId = value; break;
|
|
142
|
+
case 'groupId': msg.groupId = value; break;
|
|
137
143
|
// toolCalls are multi-line YAML — handled separately below
|
|
138
144
|
}
|
|
139
145
|
}
|
package/unify/engine.js
CHANGED
|
@@ -476,7 +476,7 @@ export class Engine {
|
|
|
476
476
|
* @param {string} assistantContent
|
|
477
477
|
* @param {object[]} [toolCalls]
|
|
478
478
|
*/
|
|
479
|
-
#persistMessages(userContent, assistantContent, toolCalls) {
|
|
479
|
+
#persistMessages(userContent, assistantContent, toolCalls, groupId) {
|
|
480
480
|
if (!this.#conversationStore) return;
|
|
481
481
|
if (this.#config._readOnly) return;
|
|
482
482
|
|
|
@@ -497,6 +497,8 @@ export class Engine {
|
|
|
497
497
|
role: 'user',
|
|
498
498
|
content: userContent,
|
|
499
499
|
threadId,
|
|
500
|
+
// Bug 6: stamp groupId so history replay can route by group.
|
|
501
|
+
...(groupId ? { groupId } : {}),
|
|
500
502
|
});
|
|
501
503
|
|
|
502
504
|
// Persist assistant message
|
|
@@ -505,6 +507,7 @@ export class Engine {
|
|
|
505
507
|
content: assistantContent,
|
|
506
508
|
model: this.#config.model,
|
|
507
509
|
threadId,
|
|
510
|
+
...(groupId ? { groupId } : {}),
|
|
508
511
|
};
|
|
509
512
|
if (toolCalls && toolCalls.length > 0) {
|
|
510
513
|
assistantMsg.toolCalls = toolCalls;
|
|
@@ -1172,6 +1175,9 @@ export class Engine {
|
|
|
1172
1175
|
primaryModel: this.#config.model,
|
|
1173
1176
|
messages: conversationMessages,
|
|
1174
1177
|
trace: this.#trace,
|
|
1178
|
+
// Bug 6: tag persisted messages with the originating group so
|
|
1179
|
+
// history replay can re-stamp them on reload.
|
|
1180
|
+
groupId,
|
|
1175
1181
|
});
|
|
1176
1182
|
|
|
1177
1183
|
if (hookResult.consolidated) {
|
|
@@ -1182,7 +1188,7 @@ export class Engine {
|
|
|
1182
1188
|
}
|
|
1183
1189
|
} else {
|
|
1184
1190
|
// Legacy path (no yeaftDir → use old behavior)
|
|
1185
|
-
this.#persistMessages(prompt, fullResponseText, assistantMsg.toolCalls);
|
|
1191
|
+
this.#persistMessages(prompt, fullResponseText, assistantMsg.toolCalls, groupId);
|
|
1186
1192
|
|
|
1187
1193
|
const consolidated = await this.#maybeConsolidate();
|
|
1188
1194
|
if (consolidated && consolidated.archivedCount > 0) {
|
package/unify/prompts.js
CHANGED
|
@@ -207,7 +207,6 @@ const PROMPTS = {
|
|
|
207
207
|
userProfileHeader: '## user_profile',
|
|
208
208
|
coreMemoryHeader: '## core_memory',
|
|
209
209
|
coreMemoryMeta: 'To open the original message behind any entry above, call `memory_trace`.',
|
|
210
|
-
vpPersonaHeader: '## active_persona',
|
|
211
210
|
vpPersonaIntro: (name, role) =>
|
|
212
211
|
`You ARE **${name}**${role ? ` (${role})` : ''}. Speak in the first person as ${name}; do not refer to yourself as "Yeaft" or as a generic AI assistant. The text below is your identity, expertise, and decision style.`,
|
|
213
212
|
},
|
|
@@ -228,7 +227,6 @@ const PROMPTS = {
|
|
|
228
227
|
userProfileHeader: '## user_profile',
|
|
229
228
|
coreMemoryHeader: '## core_memory',
|
|
230
229
|
coreMemoryMeta: '如需原始 message,调 `memory_trace`。',
|
|
231
|
-
vpPersonaHeader: '## active_persona',
|
|
232
230
|
vpPersonaIntro: (name, role) =>
|
|
233
231
|
`你就是 **${name}**${role ? `(${role})` : ''}。请以 ${name} 的第一人称发言;不要自称 "Yeaft" 或泛指的 AI 助手。下面的文字是你的身份、专业方向与判断风格。`,
|
|
234
232
|
},
|
package/unify/stop-hooks.js
CHANGED
|
@@ -47,6 +47,10 @@ export async function runStopHooks(context) {
|
|
|
47
47
|
messages = [],
|
|
48
48
|
taskId,
|
|
49
49
|
trace,
|
|
50
|
+
// Bug 6: groupId/threadId stamped on every persisted message so
|
|
51
|
+
// history replay can route messages back into the originating group.
|
|
52
|
+
groupId,
|
|
53
|
+
threadId,
|
|
50
54
|
} = context;
|
|
51
55
|
|
|
52
56
|
// Model name for persisted messages: use primaryModel if provided, else config.model
|
|
@@ -110,6 +114,9 @@ export async function runStopHooks(context) {
|
|
|
110
114
|
record.toolCalls = msg.toolCalls;
|
|
111
115
|
}
|
|
112
116
|
if (msg.isError) record.isError = true;
|
|
117
|
+
// Bug 6: stamp groupId / threadId so replay can re-route by group.
|
|
118
|
+
if (groupId) record.groupId = groupId;
|
|
119
|
+
if (threadId) record.threadId = threadId;
|
|
113
120
|
conversationStore.append(record);
|
|
114
121
|
result.messagesPersisted++;
|
|
115
122
|
}
|
package/unify/web-bridge.js
CHANGED
|
@@ -2238,13 +2238,17 @@ export async function handleUnifyLoadHistory(msg) {
|
|
|
2238
2238
|
// Send each message through standard claude_output rendering pipeline
|
|
2239
2239
|
for (const m of messages) {
|
|
2240
2240
|
if (m.role === 'user') {
|
|
2241
|
-
|
|
2241
|
+
// Bug 6: forward groupId per message so the frontend re-stamps
|
|
2242
|
+
// replayed messages into their originating group instead of the
|
|
2243
|
+
// user's current filter (which would otherwise hide them when
|
|
2244
|
+
// switching groups).
|
|
2245
|
+
sendUnifyOutput({ type: 'user', message: { content: m.content } }, m.groupId || null);
|
|
2242
2246
|
} else if (m.role === 'assistant') {
|
|
2243
2247
|
sendUnifyOutput({
|
|
2244
2248
|
type: 'assistant',
|
|
2245
2249
|
message: { content: [{ type: 'text', text: m.content }] },
|
|
2246
|
-
});
|
|
2247
|
-
sendUnifyOutput({ type: 'result', result_text: '' });
|
|
2250
|
+
}, m.groupId || null);
|
|
2251
|
+
sendUnifyOutput({ type: 'result', result_text: '' }, m.groupId || null);
|
|
2248
2252
|
}
|
|
2249
2253
|
}
|
|
2250
2254
|
|