@vegamo/loom 0.1.7 → 0.1.9
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/README.md +17 -0
- package/dist/agents/core/agent.d.ts.map +1 -1
- package/dist/agents/core/agent.js +67 -3
- package/dist/agents/core/agent.js.map +1 -1
- package/dist/agents/core/prompt.d.ts.map +1 -1
- package/dist/agents/core/prompt.js +5 -2
- package/dist/agents/core/prompt.js.map +1 -1
- package/dist/agents/core/types.d.ts +1 -1
- package/dist/agents/core/types.d.ts.map +1 -1
- package/dist/agents/memory/memory.d.ts +5 -0
- package/dist/agents/memory/memory.d.ts.map +1 -1
- package/dist/agents/memory/memory.js +7 -0
- package/dist/agents/memory/memory.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -2
- package/dist/index.js.map +1 -1
- package/dist/llm/client.d.ts.map +1 -1
- package/dist/llm/client.js +16 -1
- package/dist/llm/client.js.map +1 -1
- package/dist/shared/update.d.ts +9 -0
- package/dist/shared/update.d.ts.map +1 -0
- package/dist/shared/update.js +231 -0
- package/dist/shared/update.js.map +1 -0
- package/dist/shared/version.d.ts +1 -0
- package/dist/shared/version.d.ts.map +1 -1
- package/dist/shared/version.js +26 -10
- package/dist/shared/version.js.map +1 -1
- package/dist/tui/app.js +2 -2
- package/dist/tui/app.js.map +1 -1
- package/dist/tui/components/Chat.js +1 -1
- package/dist/tui/components/Chat.js.map +1 -1
- package/dist/tui/components/StatusBar.d.ts +1 -1
- package/dist/tui/components/StatusBar.d.ts.map +1 -1
- package/dist/tui/components/StatusBar.js +29 -1
- package/dist/tui/components/StatusBar.js.map +1 -1
- package/dist/tui/hooks/useAgent.d.ts +10 -1
- package/dist/tui/hooks/useAgent.d.ts.map +1 -1
- package/dist/tui/hooks/useAgent.js +85 -49
- package/dist/tui/hooks/useAgent.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,23 +4,39 @@
|
|
|
4
4
|
* 封装 Agent 的交互逻辑,供 TUI 组件使用
|
|
5
5
|
*
|
|
6
6
|
* 能力:
|
|
7
|
-
* - Streaming 逐字输出 (content_delta
|
|
7
|
+
* - Streaming 逐字输出 (content_delta 实时追加到当前 assistant 消息)
|
|
8
8
|
* - Tool 调用进度可见
|
|
9
9
|
* - 错误自动恢复
|
|
10
10
|
* - 请求取消
|
|
11
|
+
*
|
|
12
|
+
* 关键不变量:
|
|
13
|
+
* - 我们用 currentAssistantIdRef 追踪"当前正在 streaming 的 assistant 消息"
|
|
14
|
+
* 而不是依赖"消息列表的最后一条". 工具调用会在两轮 LLM 调用之间插入
|
|
15
|
+
* tool_activity 消息, 让最后一条不再是 assistant — 此时如果按 last 索引
|
|
16
|
+
* 去 append/finalize 会静默丢弃 iteration 2+ 的内容.
|
|
11
17
|
*/
|
|
12
18
|
import { useState, useCallback, useRef } from 'react';
|
|
13
19
|
import { Agent } from '../../agents/core/agent.js';
|
|
20
|
+
let messageIdCounter = 0;
|
|
21
|
+
export function nextMessageId() {
|
|
22
|
+
messageIdCounter += 1;
|
|
23
|
+
return `msg-${Date.now()}-${messageIdCounter}`;
|
|
24
|
+
}
|
|
14
25
|
export function useAgent(config) {
|
|
15
26
|
const agentRef = useRef(null);
|
|
27
|
+
// 当前正在被 streaming 内容追加的 assistant 消息 id.
|
|
28
|
+
// tool_activity 插入后列表 last 不再是 assistant, 必须用 id 定位.
|
|
29
|
+
const currentAssistantIdRef = useRef(null);
|
|
16
30
|
const [messages, setMessages] = useState([]);
|
|
17
31
|
const [state, setState] = useState('idle');
|
|
18
32
|
const [toolProgress, setToolProgress] = useState(null);
|
|
19
|
-
//
|
|
33
|
+
// 添加消息 — 返回新消息的 id (调用方可保存以便后续按 id 更新)
|
|
20
34
|
const addMessage = useCallback((type, content, extra) => {
|
|
35
|
+
const id = extra?.id ?? nextMessageId();
|
|
21
36
|
setMessages((prev) => [
|
|
22
37
|
...prev,
|
|
23
38
|
{
|
|
39
|
+
id,
|
|
24
40
|
type,
|
|
25
41
|
content,
|
|
26
42
|
toolName: extra?.toolName,
|
|
@@ -28,29 +44,27 @@ export function useAgent(config) {
|
|
|
28
44
|
timestamp: new Date(),
|
|
29
45
|
},
|
|
30
46
|
]);
|
|
47
|
+
return id;
|
|
31
48
|
}, []);
|
|
32
|
-
//
|
|
33
|
-
const
|
|
49
|
+
// 按 id 追加内容到指定 assistant 消息 (streaming)
|
|
50
|
+
const appendToAssistant = useCallback((id, delta) => {
|
|
34
51
|
setMessages((prev) => {
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
52
|
+
const idx = prev.findIndex((m) => m.id === id);
|
|
53
|
+
if (idx < 0)
|
|
37
54
|
return prev;
|
|
38
55
|
const updated = [...prev];
|
|
39
|
-
updated[
|
|
40
|
-
...updated[lastIdx],
|
|
41
|
-
content: updated[lastIdx].content + delta,
|
|
42
|
-
};
|
|
56
|
+
updated[idx] = { ...updated[idx], content: updated[idx].content + delta };
|
|
43
57
|
return updated;
|
|
44
58
|
});
|
|
45
59
|
}, []);
|
|
46
|
-
//
|
|
47
|
-
const
|
|
60
|
+
// 按 id 标记 assistant 消息 streaming 结束 (停止显示光标)
|
|
61
|
+
const finalizeAssistant = useCallback((id) => {
|
|
48
62
|
setMessages((prev) => {
|
|
49
|
-
const
|
|
50
|
-
if (
|
|
63
|
+
const idx = prev.findIndex((m) => m.id === id);
|
|
64
|
+
if (idx < 0)
|
|
51
65
|
return prev;
|
|
52
66
|
const updated = [...prev];
|
|
53
|
-
updated[
|
|
67
|
+
updated[idx] = { ...updated[idx], streaming: false };
|
|
54
68
|
return updated;
|
|
55
69
|
});
|
|
56
70
|
}, []);
|
|
@@ -68,9 +82,18 @@ export function useAgent(config) {
|
|
|
68
82
|
}
|
|
69
83
|
break;
|
|
70
84
|
case 'content_delta':
|
|
71
|
-
// Streaming 文本增量 → 追加到当前 assistant 消息
|
|
72
|
-
if (event.delta) {
|
|
73
|
-
|
|
85
|
+
// Streaming 文本增量 → 追加到当前 streaming 中的 assistant 消息
|
|
86
|
+
if (event.delta && currentAssistantIdRef.current) {
|
|
87
|
+
appendToAssistant(currentAssistantIdRef.current, event.delta);
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
case 'tool_preparing':
|
|
91
|
+
// LLM 在 streaming 工具调用名 — 让用户看见"在干活", 不是卡死
|
|
92
|
+
if (event.tool) {
|
|
93
|
+
setToolProgress({
|
|
94
|
+
name: event.tool.name,
|
|
95
|
+
message: `Preparing ${event.tool.name}...`,
|
|
96
|
+
});
|
|
74
97
|
}
|
|
75
98
|
break;
|
|
76
99
|
case 'tool_start':
|
|
@@ -93,7 +116,9 @@ export function useAgent(config) {
|
|
|
93
116
|
setToolProgress(null);
|
|
94
117
|
break;
|
|
95
118
|
case 'reply_done':
|
|
96
|
-
|
|
119
|
+
if (currentAssistantIdRef.current) {
|
|
120
|
+
finalizeAssistant(currentAssistantIdRef.current);
|
|
121
|
+
}
|
|
97
122
|
break;
|
|
98
123
|
case 'error':
|
|
99
124
|
if (event.error) {
|
|
@@ -101,7 +126,7 @@ export function useAgent(config) {
|
|
|
101
126
|
}
|
|
102
127
|
break;
|
|
103
128
|
}
|
|
104
|
-
}, [
|
|
129
|
+
}, [appendToAssistant, finalizeAssistant, addMessage]);
|
|
105
130
|
// 懒初始化 Agent
|
|
106
131
|
const getAgent = useCallback(() => {
|
|
107
132
|
if (!agentRef.current) {
|
|
@@ -117,32 +142,30 @@ export function useAgent(config) {
|
|
|
117
142
|
const agent = getAgent();
|
|
118
143
|
// 添加用户消息
|
|
119
144
|
addMessage('user', input);
|
|
120
|
-
// 预创建一条空的 assistant
|
|
121
|
-
|
|
145
|
+
// 预创建一条空的 assistant 消息, 记下 id —
|
|
146
|
+
// 之后所有 content_delta / reply_done 都按这个 id 找回它,
|
|
147
|
+
// 不会被中途插入的 tool_activity 消息打乱.
|
|
148
|
+
const assistantId = nextMessageId();
|
|
149
|
+
currentAssistantIdRef.current = assistantId;
|
|
150
|
+
addMessage('assistant', '', { streaming: true, id: assistantId });
|
|
122
151
|
try {
|
|
123
152
|
const reply = await agent.chat(input);
|
|
124
|
-
//
|
|
125
|
-
// 非 streaming
|
|
153
|
+
// 收尾:
|
|
154
|
+
// - 非 streaming 模式: content 没被 content_delta 填过, 用 reply.content 填
|
|
155
|
+
// - streaming 模式: content 已经填过了, 只需确保 streaming: false
|
|
126
156
|
setMessages((prev) => {
|
|
127
|
-
const
|
|
128
|
-
if (
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
...updated[lastIdx],
|
|
135
|
-
content: reply.content,
|
|
136
|
-
streaming: false,
|
|
137
|
-
};
|
|
138
|
-
return updated;
|
|
139
|
-
}
|
|
140
|
-
// 标记 streaming 结束
|
|
141
|
-
const updated = [...prev];
|
|
142
|
-
updated[lastIdx] = { ...updated[lastIdx], streaming: false };
|
|
143
|
-
return updated;
|
|
157
|
+
const idx = prev.findIndex((m) => m.id === assistantId);
|
|
158
|
+
if (idx < 0)
|
|
159
|
+
return prev;
|
|
160
|
+
const msg = prev[idx];
|
|
161
|
+
const updated = [...prev];
|
|
162
|
+
if (!msg.content && reply.content) {
|
|
163
|
+
updated[idx] = { ...msg, content: reply.content, streaming: false };
|
|
144
164
|
}
|
|
145
|
-
|
|
165
|
+
else {
|
|
166
|
+
updated[idx] = { ...msg, streaming: false };
|
|
167
|
+
}
|
|
168
|
+
return updated;
|
|
146
169
|
});
|
|
147
170
|
// 如果生成了 schema 文件,追加提示
|
|
148
171
|
if (reply.schemasGenerated.length > 0) {
|
|
@@ -151,25 +174,38 @@ export function useAgent(config) {
|
|
|
151
174
|
}
|
|
152
175
|
catch (err) {
|
|
153
176
|
const errorMsg = err instanceof Error ? err.message : 'Unknown error occurred';
|
|
154
|
-
// 如果预创建的 assistant
|
|
177
|
+
// 如果预创建的 assistant 消息还是空的, 移除它
|
|
155
178
|
setMessages((prev) => {
|
|
156
|
-
const
|
|
157
|
-
if (
|
|
158
|
-
prev
|
|
159
|
-
|
|
160
|
-
|
|
179
|
+
const idx = prev.findIndex((m) => m.id === assistantId);
|
|
180
|
+
if (idx >= 0 && !prev[idx].content) {
|
|
181
|
+
return prev.filter((_, i) => i !== idx);
|
|
182
|
+
}
|
|
183
|
+
// 还是要把 streaming 关掉, 不然光标永远转
|
|
184
|
+
if (idx >= 0) {
|
|
185
|
+
const updated = [...prev];
|
|
186
|
+
updated[idx] = { ...prev[idx], streaming: false };
|
|
187
|
+
return updated;
|
|
161
188
|
}
|
|
162
189
|
return prev;
|
|
163
190
|
});
|
|
164
191
|
addMessage('error', errorMsg);
|
|
165
192
|
setState('error');
|
|
166
193
|
}
|
|
194
|
+
finally {
|
|
195
|
+
currentAssistantIdRef.current = null;
|
|
196
|
+
}
|
|
167
197
|
}, [getAgent, addMessage]);
|
|
168
198
|
const abort = useCallback(() => {
|
|
169
199
|
agentRef.current?.abort();
|
|
170
|
-
|
|
200
|
+
// abort 时确保 streaming 光标停掉, 不然 spinner 永远转
|
|
201
|
+
if (currentAssistantIdRef.current) {
|
|
202
|
+
finalizeAssistant(currentAssistantIdRef.current);
|
|
203
|
+
currentAssistantIdRef.current = null;
|
|
204
|
+
}
|
|
205
|
+
}, [finalizeAssistant]);
|
|
171
206
|
const reset = useCallback(() => {
|
|
172
207
|
agentRef.current?.reset();
|
|
208
|
+
currentAssistantIdRef.current = null;
|
|
173
209
|
setMessages([]);
|
|
174
210
|
setState('idle');
|
|
175
211
|
setToolProgress(null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAgent.js","sourceRoot":"","sources":["../../../src/tui/hooks/useAgent.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"useAgent.js","sourceRoot":"","sources":["../../../src/tui/hooks/useAgent.ts"],"names":[],"mappings":"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"}
|