@gatanot/qualia_core 0.1.0

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.
Files changed (297) hide show
  1. package/dist/agent/background.d.ts +6 -0
  2. package/dist/agent/background.d.ts.map +1 -0
  3. package/dist/agent/background.js +58 -0
  4. package/dist/agent/background.js.map +1 -0
  5. package/dist/agent/context-builder.d.ts +23 -0
  6. package/dist/agent/context-builder.d.ts.map +1 -0
  7. package/dist/agent/context-builder.js +102 -0
  8. package/dist/agent/context-builder.js.map +1 -0
  9. package/dist/agent/diary.d.ts +4 -0
  10. package/dist/agent/diary.d.ts.map +1 -0
  11. package/dist/agent/diary.js +67 -0
  12. package/dist/agent/diary.js.map +1 -0
  13. package/dist/agent/index.d.ts +22 -0
  14. package/dist/agent/index.d.ts.map +1 -0
  15. package/dist/agent/index.js +20 -0
  16. package/dist/agent/index.js.map +1 -0
  17. package/dist/agent/logger.d.ts +23 -0
  18. package/dist/agent/logger.d.ts.map +1 -0
  19. package/dist/agent/logger.js +70 -0
  20. package/dist/agent/logger.js.map +1 -0
  21. package/dist/agent/logger.test.d.ts +2 -0
  22. package/dist/agent/logger.test.d.ts.map +1 -0
  23. package/dist/agent/logger.test.js +28 -0
  24. package/dist/agent/logger.test.js.map +1 -0
  25. package/dist/agent/loop.d.ts +52 -0
  26. package/dist/agent/loop.d.ts.map +1 -0
  27. package/dist/agent/loop.js +557 -0
  28. package/dist/agent/loop.js.map +1 -0
  29. package/dist/agent/message-sanitizer.d.ts +13 -0
  30. package/dist/agent/message-sanitizer.d.ts.map +1 -0
  31. package/dist/agent/message-sanitizer.js +138 -0
  32. package/dist/agent/message-sanitizer.js.map +1 -0
  33. package/dist/agent/message-sanitizer.test.d.ts +2 -0
  34. package/dist/agent/message-sanitizer.test.d.ts.map +1 -0
  35. package/dist/agent/message-sanitizer.test.js +110 -0
  36. package/dist/agent/message-sanitizer.test.js.map +1 -0
  37. package/dist/agent/prompts.d.ts +15 -0
  38. package/dist/agent/prompts.d.ts.map +1 -0
  39. package/dist/agent/prompts.js +34 -0
  40. package/dist/agent/prompts.js.map +1 -0
  41. package/dist/agent/summarize-worker.d.ts +6 -0
  42. package/dist/agent/summarize-worker.d.ts.map +1 -0
  43. package/dist/agent/summarize-worker.js +62 -0
  44. package/dist/agent/summarize-worker.js.map +1 -0
  45. package/dist/agent/summarizer.d.ts +10 -0
  46. package/dist/agent/summarizer.d.ts.map +1 -0
  47. package/dist/agent/summarizer.js +133 -0
  48. package/dist/agent/summarizer.js.map +1 -0
  49. package/dist/agent/types.d.ts +135 -0
  50. package/dist/agent/types.d.ts.map +1 -0
  51. package/dist/agent/types.js +21 -0
  52. package/dist/agent/types.js.map +1 -0
  53. package/dist/ai/base.d.ts +19 -0
  54. package/dist/ai/base.d.ts.map +1 -0
  55. package/dist/ai/base.js +2 -0
  56. package/dist/ai/base.js.map +1 -0
  57. package/dist/ai/deepseek.d.ts +15 -0
  58. package/dist/ai/deepseek.d.ts.map +1 -0
  59. package/dist/ai/deepseek.js +24 -0
  60. package/dist/ai/deepseek.js.map +1 -0
  61. package/dist/ai/factory.d.ts +4 -0
  62. package/dist/ai/factory.d.ts.map +1 -0
  63. package/dist/ai/factory.js +53 -0
  64. package/dist/ai/factory.js.map +1 -0
  65. package/dist/ai/index.d.ts +43 -0
  66. package/dist/ai/index.d.ts.map +1 -0
  67. package/dist/ai/index.js +36 -0
  68. package/dist/ai/index.js.map +1 -0
  69. package/dist/ai/models.d.ts +13 -0
  70. package/dist/ai/models.d.ts.map +1 -0
  71. package/dist/ai/models.js +67 -0
  72. package/dist/ai/models.js.map +1 -0
  73. package/dist/ai/ollama.d.ts +13 -0
  74. package/dist/ai/ollama.d.ts.map +1 -0
  75. package/dist/ai/ollama.js +32 -0
  76. package/dist/ai/ollama.js.map +1 -0
  77. package/dist/ai/openai.d.ts +46 -0
  78. package/dist/ai/openai.d.ts.map +1 -0
  79. package/dist/ai/openai.js +90 -0
  80. package/dist/ai/openai.js.map +1 -0
  81. package/dist/ai/types.d.ts +154 -0
  82. package/dist/ai/types.d.ts.map +1 -0
  83. package/dist/ai/types.js +2 -0
  84. package/dist/ai/types.js.map +1 -0
  85. package/dist/ai/utils.d.ts +47 -0
  86. package/dist/ai/utils.d.ts.map +1 -0
  87. package/dist/ai/utils.js +145 -0
  88. package/dist/ai/utils.js.map +1 -0
  89. package/dist/ai/xiaomi.d.ts +15 -0
  90. package/dist/ai/xiaomi.d.ts.map +1 -0
  91. package/dist/ai/xiaomi.js +23 -0
  92. package/dist/ai/xiaomi.js.map +1 -0
  93. package/dist/chat-confirm.d.ts +4 -0
  94. package/dist/chat-confirm.d.ts.map +1 -0
  95. package/dist/chat-confirm.js +2 -0
  96. package/dist/chat-confirm.js.map +1 -0
  97. package/dist/chat-steering.d.ts +6 -0
  98. package/dist/chat-steering.d.ts.map +1 -0
  99. package/dist/chat-steering.js +2 -0
  100. package/dist/chat-steering.js.map +1 -0
  101. package/dist/concurrency/background-worker.d.ts +16 -0
  102. package/dist/concurrency/background-worker.d.ts.map +1 -0
  103. package/dist/concurrency/background-worker.js +62 -0
  104. package/dist/concurrency/background-worker.js.map +1 -0
  105. package/dist/concurrency/background-worker.test.d.ts +2 -0
  106. package/dist/concurrency/background-worker.test.d.ts.map +1 -0
  107. package/dist/concurrency/background-worker.test.js +55 -0
  108. package/dist/concurrency/background-worker.test.js.map +1 -0
  109. package/dist/concurrency/file-mutex.d.ts +8 -0
  110. package/dist/concurrency/file-mutex.d.ts.map +1 -0
  111. package/dist/concurrency/file-mutex.js +41 -0
  112. package/dist/concurrency/file-mutex.js.map +1 -0
  113. package/dist/concurrency/file-mutex.test.d.ts +2 -0
  114. package/dist/concurrency/file-mutex.test.d.ts.map +1 -0
  115. package/dist/concurrency/file-mutex.test.js +50 -0
  116. package/dist/concurrency/file-mutex.test.js.map +1 -0
  117. package/dist/concurrency/index.d.ts +5 -0
  118. package/dist/concurrency/index.d.ts.map +1 -0
  119. package/dist/concurrency/index.js +4 -0
  120. package/dist/concurrency/index.js.map +1 -0
  121. package/dist/concurrency/session-lock.d.ts +8 -0
  122. package/dist/concurrency/session-lock.d.ts.map +1 -0
  123. package/dist/concurrency/session-lock.js +41 -0
  124. package/dist/concurrency/session-lock.js.map +1 -0
  125. package/dist/concurrency/session-lock.test.d.ts +2 -0
  126. package/dist/concurrency/session-lock.test.d.ts.map +1 -0
  127. package/dist/concurrency/session-lock.test.js +51 -0
  128. package/dist/concurrency/session-lock.test.js.map +1 -0
  129. package/dist/config/index.d.ts +12 -0
  130. package/dist/config/index.d.ts.map +1 -0
  131. package/dist/config/index.js +10 -0
  132. package/dist/config/index.js.map +1 -0
  133. package/dist/config/store.d.ts +17 -0
  134. package/dist/config/store.d.ts.map +1 -0
  135. package/dist/config/store.js +214 -0
  136. package/dist/config/store.js.map +1 -0
  137. package/dist/config/types.d.ts +44 -0
  138. package/dist/config/types.d.ts.map +1 -0
  139. package/dist/config/types.js +2 -0
  140. package/dist/config/types.js.map +1 -0
  141. package/dist/gateway/adapters/email.d.ts +23 -0
  142. package/dist/gateway/adapters/email.d.ts.map +1 -0
  143. package/dist/gateway/adapters/email.js +145 -0
  144. package/dist/gateway/adapters/email.js.map +1 -0
  145. package/dist/gateway/adapters/telegram-sessions.d.ts +4 -0
  146. package/dist/gateway/adapters/telegram-sessions.d.ts.map +1 -0
  147. package/dist/gateway/adapters/telegram-sessions.js +39 -0
  148. package/dist/gateway/adapters/telegram-sessions.js.map +1 -0
  149. package/dist/gateway/adapters/telegram.d.ts +22 -0
  150. package/dist/gateway/adapters/telegram.d.ts.map +1 -0
  151. package/dist/gateway/adapters/telegram.js +131 -0
  152. package/dist/gateway/adapters/telegram.js.map +1 -0
  153. package/dist/gateway/dispatcher.d.ts +19 -0
  154. package/dist/gateway/dispatcher.d.ts.map +1 -0
  155. package/dist/gateway/dispatcher.js +81 -0
  156. package/dist/gateway/dispatcher.js.map +1 -0
  157. package/dist/gateway/inbound-handler.d.ts +3 -0
  158. package/dist/gateway/inbound-handler.d.ts.map +1 -0
  159. package/dist/gateway/inbound-handler.js +95 -0
  160. package/dist/gateway/inbound-handler.js.map +1 -0
  161. package/dist/gateway/index.d.ts +9 -0
  162. package/dist/gateway/index.d.ts.map +1 -0
  163. package/dist/gateway/index.js +6 -0
  164. package/dist/gateway/index.js.map +1 -0
  165. package/dist/gateway/lifecycle.d.ts +3 -0
  166. package/dist/gateway/lifecycle.d.ts.map +1 -0
  167. package/dist/gateway/lifecycle.js +38 -0
  168. package/dist/gateway/lifecycle.js.map +1 -0
  169. package/dist/gateway/types.d.ts +32 -0
  170. package/dist/gateway/types.d.ts.map +1 -0
  171. package/dist/gateway/types.js +2 -0
  172. package/dist/gateway/types.js.map +1 -0
  173. package/dist/index.d.ts +23 -0
  174. package/dist/index.d.ts.map +1 -0
  175. package/dist/index.js +14 -0
  176. package/dist/index.js.map +1 -0
  177. package/dist/markdown.d.ts +2 -0
  178. package/dist/markdown.d.ts.map +1 -0
  179. package/dist/markdown.js +94 -0
  180. package/dist/markdown.js.map +1 -0
  181. package/dist/paths.d.ts +5 -0
  182. package/dist/paths.d.ts.map +1 -0
  183. package/dist/paths.js +17 -0
  184. package/dist/paths.js.map +1 -0
  185. package/dist/storage/index.d.ts +10 -0
  186. package/dist/storage/index.d.ts.map +1 -0
  187. package/dist/storage/index.js +18 -0
  188. package/dist/storage/index.js.map +1 -0
  189. package/dist/storage/memory.d.ts +39 -0
  190. package/dist/storage/memory.d.ts.map +1 -0
  191. package/dist/storage/memory.js +252 -0
  192. package/dist/storage/memory.js.map +1 -0
  193. package/dist/storage/sqlite.d.ts +44 -0
  194. package/dist/storage/sqlite.d.ts.map +1 -0
  195. package/dist/storage/sqlite.js +275 -0
  196. package/dist/storage/sqlite.js.map +1 -0
  197. package/dist/storage/types.d.ts +134 -0
  198. package/dist/storage/types.d.ts.map +1 -0
  199. package/dist/storage/types.js +2 -0
  200. package/dist/storage/types.js.map +1 -0
  201. package/dist/storage/utils.d.ts +2 -0
  202. package/dist/storage/utils.d.ts.map +1 -0
  203. package/dist/storage/utils.js +8 -0
  204. package/dist/storage/utils.js.map +1 -0
  205. package/dist/task/executor.d.ts +3 -0
  206. package/dist/task/executor.d.ts.map +1 -0
  207. package/dist/task/executor.js +80 -0
  208. package/dist/task/executor.js.map +1 -0
  209. package/dist/task/index.d.ts +5 -0
  210. package/dist/task/index.d.ts.map +1 -0
  211. package/dist/task/index.js +4 -0
  212. package/dist/task/index.js.map +1 -0
  213. package/dist/task/scheduler.d.ts +5 -0
  214. package/dist/task/scheduler.d.ts.map +1 -0
  215. package/dist/task/scheduler.js +47 -0
  216. package/dist/task/scheduler.js.map +1 -0
  217. package/dist/task/store.d.ts +14 -0
  218. package/dist/task/store.d.ts.map +1 -0
  219. package/dist/task/store.js +156 -0
  220. package/dist/task/store.js.map +1 -0
  221. package/dist/task/types.d.ts +13 -0
  222. package/dist/task/types.d.ts.map +1 -0
  223. package/dist/task/types.js +2 -0
  224. package/dist/task/types.js.map +1 -0
  225. package/dist/tool/env.d.ts +20 -0
  226. package/dist/tool/env.d.ts.map +1 -0
  227. package/dist/tool/env.js +26 -0
  228. package/dist/tool/env.js.map +1 -0
  229. package/dist/tool/env.test.d.ts +2 -0
  230. package/dist/tool/env.test.d.ts.map +1 -0
  231. package/dist/tool/env.test.js +42 -0
  232. package/dist/tool/env.test.js.map +1 -0
  233. package/dist/tool/index.d.ts +42 -0
  234. package/dist/tool/index.d.ts.map +1 -0
  235. package/dist/tool/index.js +53 -0
  236. package/dist/tool/index.js.map +1 -0
  237. package/dist/tool/registry.d.ts +43 -0
  238. package/dist/tool/registry.d.ts.map +1 -0
  239. package/dist/tool/registry.js +79 -0
  240. package/dist/tool/registry.js.map +1 -0
  241. package/dist/tool/safeguard.d.ts +21 -0
  242. package/dist/tool/safeguard.d.ts.map +1 -0
  243. package/dist/tool/safeguard.js +212 -0
  244. package/dist/tool/safeguard.js.map +1 -0
  245. package/dist/tool/tools/delete-file.d.ts +10 -0
  246. package/dist/tool/tools/delete-file.d.ts.map +1 -0
  247. package/dist/tool/tools/delete-file.js +52 -0
  248. package/dist/tool/tools/delete-file.js.map +1 -0
  249. package/dist/tool/tools/edit.d.ts +10 -0
  250. package/dist/tool/tools/edit.d.ts.map +1 -0
  251. package/dist/tool/tools/edit.js +159 -0
  252. package/dist/tool/tools/edit.js.map +1 -0
  253. package/dist/tool/tools/exec.d.ts +12 -0
  254. package/dist/tool/tools/exec.d.ts.map +1 -0
  255. package/dist/tool/tools/exec.js +170 -0
  256. package/dist/tool/tools/exec.js.map +1 -0
  257. package/dist/tool/tools/file-utils.d.ts +13 -0
  258. package/dist/tool/tools/file-utils.d.ts.map +1 -0
  259. package/dist/tool/tools/file-utils.js +65 -0
  260. package/dist/tool/tools/file-utils.js.map +1 -0
  261. package/dist/tool/tools/read-file.d.ts +10 -0
  262. package/dist/tool/tools/read-file.d.ts.map +1 -0
  263. package/dist/tool/tools/read-file.js +116 -0
  264. package/dist/tool/tools/read-file.js.map +1 -0
  265. package/dist/tool/tools/read-memory.d.ts +3 -0
  266. package/dist/tool/tools/read-memory.d.ts.map +1 -0
  267. package/dist/tool/tools/read-memory.js +58 -0
  268. package/dist/tool/tools/read-memory.js.map +1 -0
  269. package/dist/tool/tools/read-tasks.d.ts +3 -0
  270. package/dist/tool/tools/read-tasks.d.ts.map +1 -0
  271. package/dist/tool/tools/read-tasks.js +29 -0
  272. package/dist/tool/tools/read-tasks.js.map +1 -0
  273. package/dist/tool/tools/schedule-task.d.ts +3 -0
  274. package/dist/tool/tools/schedule-task.d.ts.map +1 -0
  275. package/dist/tool/tools/schedule-task.js +50 -0
  276. package/dist/tool/tools/schedule-task.js.map +1 -0
  277. package/dist/tool/tools/search-history.d.ts +4 -0
  278. package/dist/tool/tools/search-history.d.ts.map +1 -0
  279. package/dist/tool/tools/search-history.js +58 -0
  280. package/dist/tool/tools/search-history.js.map +1 -0
  281. package/dist/tool/tools/web-search.d.ts +3 -0
  282. package/dist/tool/tools/web-search.d.ts.map +1 -0
  283. package/dist/tool/tools/web-search.js +89 -0
  284. package/dist/tool/tools/web-search.js.map +1 -0
  285. package/dist/tool/tools/write-file.d.ts +11 -0
  286. package/dist/tool/tools/write-file.d.ts.map +1 -0
  287. package/dist/tool/tools/write-file.js +79 -0
  288. package/dist/tool/tools/write-file.js.map +1 -0
  289. package/dist/tool/tools/write-memory.d.ts +3 -0
  290. package/dist/tool/tools/write-memory.d.ts.map +1 -0
  291. package/dist/tool/tools/write-memory.js +99 -0
  292. package/dist/tool/tools/write-memory.js.map +1 -0
  293. package/dist/tool/types.d.ts +63 -0
  294. package/dist/tool/types.d.ts.map +1 -0
  295. package/dist/tool/types.js +33 -0
  296. package/dist/tool/types.js.map +1 -0
  297. package/package.json +53 -0
@@ -0,0 +1,557 @@
1
+ import { sleep } from '../ai/index.js';
2
+ import { PendingConfirmation } from '../tool/index.js';
3
+ import { ToolContext } from '../tool/index.js';
4
+ import { AgentState } from './types.js';
5
+ import { pendingSteering } from '../chat-steering.js';
6
+ import { sanitizeMessages } from './message-sanitizer.js';
7
+ function extractTextContent(content) {
8
+ if (typeof content === 'string')
9
+ return content;
10
+ return content
11
+ .filter((p) => p.type === 'text' && 'text' in p)
12
+ .map((p) => p.text)
13
+ .join('\n');
14
+ }
15
+ const MAX_LLM_RETRIES = 5;
16
+ const RETRY_BASE_DELAY = 1000;
17
+ const CONTEXT_WINDOW_DEFAULT = 1_048_576;
18
+ const CONTINUE_THRESHOLD = 20_000;
19
+ const MAX_TOOL_ITERATIONS = 50;
20
+ const COMPRESSION_THRESHOLD_DEFAULT = 256_000;
21
+ function buildSummaryContent(messages, initialSystem) {
22
+ const relevant = messages
23
+ .filter((m) => m.role !== 'system')
24
+ .filter((m) => m.role !== 'tool');
25
+ let header = '';
26
+ if (initialSystem) {
27
+ const short = initialSystem.slice(0, 200);
28
+ header = `原始系统提示词摘要: ${short}\n\n`;
29
+ }
30
+ const lines = [];
31
+ for (const m of relevant) {
32
+ const role = m.role === 'user' ? '用户' : 'AI';
33
+ const text = extractTextContent(m.content);
34
+ lines.push(`[${role}] ${text.slice(0, 2000)}`);
35
+ }
36
+ return header + lines.join('\n');
37
+ }
38
+ export class AgentLoop {
39
+ provider;
40
+ storage;
41
+ registry;
42
+ onConfirm;
43
+ signal;
44
+ hooks;
45
+ // ── FSM state ──
46
+ state = AgentState.INIT;
47
+ // ── Session context ──
48
+ effectiveSessionId = '';
49
+ contextWindow = CONTEXT_WINDOW_DEFAULT;
50
+ buildResult;
51
+ userMsg;
52
+ messages = [];
53
+ tools = [];
54
+ totalUsage;
55
+ // ── Per-iteration state ──
56
+ iteration = 0;
57
+ fullContent = '';
58
+ fullReasoning = '';
59
+ collectedToolCalls = new Map();
60
+ chunkUsage;
61
+ // ── Retry state ──
62
+ attempt = 0;
63
+ // ── Tool execution state ──
64
+ resolvedToolCalls = [];
65
+ toolIndex = 0;
66
+ toolResultMsgs = [];
67
+ // ── Pending confirmation ──
68
+ currentToolCall;
69
+ currentArgs = {};
70
+ pendingConfirmation;
71
+ // ── Tool context ──
72
+ toolContext;
73
+ // ── Compression ──
74
+ compressionMode;
75
+ compressionThreshold;
76
+ constructor(provider, storage, registry, onConfirm, signal, hooks = {}, compressionMode = 'auto', compressionThreshold = COMPRESSION_THRESHOLD_DEFAULT) {
77
+ this.provider = provider;
78
+ this.storage = storage;
79
+ this.registry = registry;
80
+ this.onConfirm = onConfirm;
81
+ this.signal = signal;
82
+ this.hooks = hooks;
83
+ this.toolContext = new ToolContext(process.cwd());
84
+ this.compressionMode = compressionMode;
85
+ this.compressionThreshold = compressionThreshold;
86
+ }
87
+ async *run(sessionId, userMessage, buildResult, userMessageId) {
88
+ this.effectiveSessionId = sessionId;
89
+ this.contextWindow = buildResult.contextWindow || CONTEXT_WINDOW_DEFAULT;
90
+ this.buildResult = buildResult;
91
+ this.messages = [...buildResult.messages];
92
+ this.tools = this.registry.getDefinitions();
93
+ this.totalUsage = undefined;
94
+ this.iteration = 0;
95
+ this.state = AgentState.INIT;
96
+ const session = await this.storage.getSession(sessionId);
97
+ if (session?.workspace) {
98
+ this.toolContext = new ToolContext(session.workspace);
99
+ }
100
+ pendingSteering.delete(sessionId);
101
+ try {
102
+ while (true) {
103
+ if (this.state === AgentState.DONE || this.state === AgentState.ERROR)
104
+ break;
105
+ switch (this.state) {
106
+ case AgentState.INIT:
107
+ yield* this.doInit(userMessage, userMessageId);
108
+ break;
109
+ case AgentState.PRE_LLM:
110
+ yield* this.doPreLlm();
111
+ break;
112
+ case AgentState.LLM_STREAMING:
113
+ yield* this.doLlmStreaming();
114
+ break;
115
+ case AgentState.POST_LLM:
116
+ yield* this.doPostLlm();
117
+ break;
118
+ case AgentState.LLM_RETRY_WAIT:
119
+ yield* this.doLlmRetryWait();
120
+ break;
121
+ case AgentState.PRE_TOOL:
122
+ yield* this.doPreTool();
123
+ break;
124
+ case AgentState.TOOL_EXECUTING:
125
+ yield* this.doToolExecuting();
126
+ break;
127
+ case AgentState.AWAIT_CONFIRM:
128
+ yield* this.doAwaitConfirm();
129
+ break;
130
+ case AgentState.POST_TOOL:
131
+ yield* this.doPostTool();
132
+ break;
133
+ case AgentState.PERSIST_TURN:
134
+ yield* this.doPersistTurn();
135
+ break;
136
+ case AgentState.DONE:
137
+ case AgentState.ERROR:
138
+ break;
139
+ }
140
+ }
141
+ }
142
+ catch (error) {
143
+ yield { type: 'error', message: error.message || '未知错误' };
144
+ }
145
+ }
146
+ async *doInit(userMessage, userMessageId) {
147
+ this.userMsg = await this.storage.addMessage(this.effectiveSessionId, {
148
+ id: userMessageId,
149
+ session_id: this.effectiveSessionId,
150
+ role: 'user',
151
+ content: userMessage
152
+ });
153
+ this.state = AgentState.PRE_LLM;
154
+ }
155
+ async *doPreLlm() {
156
+ if (this.signal?.aborted) {
157
+ this.state = AgentState.DONE;
158
+ return;
159
+ }
160
+ if (this.iteration >= MAX_TOOL_ITERATIONS) {
161
+ yield { type: 'error', message: `达到最大工具调用次数限制(${MAX_TOOL_ITERATIONS}次),请简化任务后重试` };
162
+ this.state = AgentState.ERROR;
163
+ return;
164
+ }
165
+ this.fullContent = '';
166
+ this.fullReasoning = '';
167
+ this.collectedToolCalls.clear();
168
+ this.chunkUsage = undefined;
169
+ this.attempt = 0;
170
+ yield* this.consumeSteering();
171
+ const modified = await this.hooks.beforeLlmCall?.(this.messages);
172
+ if (modified)
173
+ this.messages = modified;
174
+ this.state = AgentState.LLM_STREAMING;
175
+ }
176
+ async *consumeSteering() {
177
+ const steering = pendingSteering.get(this.effectiveSessionId);
178
+ if (!steering || steering.length === 0)
179
+ return;
180
+ const drained = steering.splice(0);
181
+ for (const s of drained) {
182
+ await this.storage.addMessage(this.effectiveSessionId, {
183
+ session_id: this.effectiveSessionId,
184
+ role: 'user',
185
+ content: s.text
186
+ });
187
+ this.messages.push({ role: 'user', content: s.text });
188
+ yield { type: 'steering_consumed', messageId: s.messageId };
189
+ }
190
+ }
191
+ async *doLlmStreaming() {
192
+ try {
193
+ const apiMessages = sanitizeMessages(this.messages);
194
+ const stream = this.provider.chatStream({
195
+ messages: apiMessages,
196
+ tools: this.tools.length > 0 ? this.tools : undefined
197
+ });
198
+ for await (const chunk of stream) {
199
+ if (chunk.reasoning_content) {
200
+ this.fullReasoning += chunk.reasoning_content;
201
+ yield { type: 'reasoning', text: chunk.reasoning_content };
202
+ }
203
+ if (chunk.content) {
204
+ this.fullContent += chunk.content;
205
+ yield { type: 'content', text: chunk.content };
206
+ }
207
+ if (chunk.tool_calls) {
208
+ for (const tc of chunk.tool_calls) {
209
+ const existing = this.collectedToolCalls.get(tc.index);
210
+ if (existing) {
211
+ if (tc.function?.arguments) {
212
+ existing.function.arguments += tc.function.arguments;
213
+ }
214
+ }
215
+ else if (tc.id) {
216
+ const newTc = {
217
+ id: tc.id,
218
+ type: 'function',
219
+ function: {
220
+ name: tc.function?.name || '',
221
+ arguments: tc.function?.arguments || ''
222
+ }
223
+ };
224
+ this.collectedToolCalls.set(tc.index, newTc);
225
+ }
226
+ }
227
+ }
228
+ if (chunk.usage)
229
+ this.chunkUsage = chunk.usage;
230
+ }
231
+ this.state = AgentState.POST_LLM;
232
+ }
233
+ catch (llmError) {
234
+ this.fullContent = '';
235
+ this.collectedToolCalls.clear();
236
+ this.chunkUsage = undefined;
237
+ if (this.attempt >= MAX_LLM_RETRIES) {
238
+ const errorMessage = `[连接失败] ${llmError.message || '多次重试后仍无法连接'}`;
239
+ await this.storage.addMessage(this.effectiveSessionId, {
240
+ session_id: this.effectiveSessionId,
241
+ role: 'assistant',
242
+ content: errorMessage
243
+ });
244
+ yield {
245
+ type: 'retry_exhausted',
246
+ message: llmError.message || '连接失败',
247
+ partialContent: true
248
+ };
249
+ this.state = AgentState.ERROR;
250
+ return;
251
+ }
252
+ this.state = AgentState.LLM_RETRY_WAIT;
253
+ }
254
+ }
255
+ async *doLlmRetryWait() {
256
+ await this.hooks.onLlmRetry?.(this.attempt + 1, MAX_LLM_RETRIES, new Error('LLM call failed'));
257
+ yield { type: 'retrying', attempt: this.attempt + 1, maxRetries: MAX_LLM_RETRIES };
258
+ await sleep(RETRY_BASE_DELAY * Math.pow(2, this.attempt));
259
+ this.attempt++;
260
+ this.state = AgentState.LLM_STREAMING;
261
+ }
262
+ async *doPostLlm() {
263
+ if (this.chunkUsage) {
264
+ const cu = this.chunkUsage;
265
+ this.totalUsage = this.totalUsage
266
+ ? {
267
+ prompt_tokens: (this.totalUsage.prompt_tokens || 0) + (cu.prompt_tokens || 0),
268
+ completion_tokens: (this.totalUsage.completion_tokens || 0) + (cu.completion_tokens || 0),
269
+ total_tokens: (this.totalUsage.total_tokens || 0) + (cu.total_tokens || 0)
270
+ }
271
+ : { ...cu };
272
+ }
273
+ await this.hooks.afterLlmCall?.(this.totalUsage);
274
+ this.resolvedToolCalls = Array.from(this.collectedToolCalls.values());
275
+ if (this.resolvedToolCalls.length === 0) {
276
+ await this.storage.addMessage(this.effectiveSessionId, {
277
+ session_id: this.effectiveSessionId,
278
+ role: 'assistant',
279
+ content: this.fullContent,
280
+ reasoning_content: this.fullReasoning || undefined,
281
+ usage: this.totalUsage
282
+ });
283
+ if (this.totalUsage) {
284
+ await this.storage.updateTokenCount(this.effectiveSessionId, this.totalUsage.total_tokens);
285
+ }
286
+ yield* this.tryForkIfWindowLow();
287
+ yield { type: 'done', messageId: crypto.randomUUID(), usage: this.totalUsage, contextWindow: this.contextWindow };
288
+ this.state = AgentState.DONE;
289
+ return;
290
+ }
291
+ this.messages.push({
292
+ role: 'assistant',
293
+ content: this.fullContent || '',
294
+ tool_calls: this.resolvedToolCalls,
295
+ reasoning_content: this.fullReasoning || undefined
296
+ });
297
+ yield* this.tryForkIfWindowLow();
298
+ this.toolResultMsgs = [];
299
+ this.toolIndex = 0;
300
+ this.state = AgentState.PRE_TOOL;
301
+ }
302
+ async *doPreTool() {
303
+ if (this.signal?.aborted) {
304
+ this.state = AgentState.DONE;
305
+ return;
306
+ }
307
+ if (this.toolIndex >= this.resolvedToolCalls.length) {
308
+ this.state = AgentState.PERSIST_TURN;
309
+ return;
310
+ }
311
+ this.currentToolCall = this.resolvedToolCalls[this.toolIndex];
312
+ this.currentArgs = {};
313
+ try {
314
+ this.currentArgs = JSON.parse(this.currentToolCall.function.arguments);
315
+ }
316
+ catch { /* empty */ }
317
+ const modifiedArgs = await this.hooks.beforeToolExecution?.(this.currentToolCall.function.name, this.currentArgs);
318
+ if (modifiedArgs)
319
+ this.currentArgs = modifiedArgs;
320
+ yield { type: 'tool_call', name: this.currentToolCall.function.name, args: this.currentArgs };
321
+ this.state = AgentState.TOOL_EXECUTING;
322
+ }
323
+ async *doToolExecuting() {
324
+ const tc = this.currentToolCall;
325
+ const name = tc.function.name;
326
+ const updateQueue = [];
327
+ let toolDone = false;
328
+ let toolResult;
329
+ let toolError;
330
+ let wakeUp = null;
331
+ this.toolContext.onUpdate = (chunk) => {
332
+ if (!toolDone) {
333
+ updateQueue.push(chunk);
334
+ wakeUp?.();
335
+ }
336
+ };
337
+ const execPromise = this.registry.execute(name, this.currentArgs, this.toolContext)
338
+ .then((r) => { toolResult = r; })
339
+ .catch((e) => { toolError = e; })
340
+ .finally(() => {
341
+ this.toolContext.onUpdate = undefined;
342
+ toolDone = true;
343
+ wakeUp?.();
344
+ });
345
+ while (!toolDone) {
346
+ if (updateQueue.length > 0) {
347
+ while (updateQueue.length > 0) {
348
+ const chunk = updateQueue.shift();
349
+ yield { type: 'tool_execution_update', name, text: chunk };
350
+ }
351
+ }
352
+ else {
353
+ await new Promise((resolve) => { wakeUp = resolve; });
354
+ }
355
+ }
356
+ if (toolError) {
357
+ if (toolError instanceof PendingConfirmation) {
358
+ this.pendingConfirmation = toolError;
359
+ this.state = AgentState.AWAIT_CONFIRM;
360
+ return;
361
+ }
362
+ const errMsg = toolError.message;
363
+ yield { type: 'tool_result', name, success: false, output: errMsg };
364
+ this.toolResultMsgs.push({ role: 'tool', content: `工具执行异常: ${errMsg}`, tool_call_id: tc.id, name });
365
+ this.messages.push({ role: 'tool', content: `工具执行异常: ${errMsg}`, tool_call_id: tc.id, name });
366
+ this.state = AgentState.POST_TOOL;
367
+ return;
368
+ }
369
+ const result = toolResult;
370
+ yield { type: 'tool_result', name, success: result.success, output: result.output };
371
+ const content = result.output || result.error || '';
372
+ this.toolResultMsgs.push({ role: 'tool', content, tool_call_id: tc.id, name });
373
+ this.messages.push({ role: 'tool', content, tool_call_id: tc.id, name });
374
+ await this.hooks.afterToolExecution?.(name, { success: result.success, output: result.output });
375
+ this.state = AgentState.POST_TOOL;
376
+ }
377
+ async *doAwaitConfirm() {
378
+ const error = this.pendingConfirmation;
379
+ const tc = this.currentToolCall;
380
+ const confirmId = crypto.randomUUID();
381
+ await this.hooks.onConfirmRequired?.(error, confirmId);
382
+ yield { type: 'confirm_required', confirmId, confirmation: error };
383
+ let abortCleanup;
384
+ const approved = await Promise.race([
385
+ this.onConfirm(error, confirmId),
386
+ new Promise((resolve) => {
387
+ if (this.signal) {
388
+ const onAbort = () => resolve(false);
389
+ this.signal.addEventListener('abort', onAbort, { once: true });
390
+ abortCleanup = () => this.signal?.removeEventListener('abort', onAbort);
391
+ }
392
+ })
393
+ ]);
394
+ abortCleanup?.();
395
+ if (approved) {
396
+ try {
397
+ const retryResult = await this.registry.execute(error.toolName, { ...error.args, __confirmed: true }, this.toolContext);
398
+ yield { type: 'tool_result', name: error.toolName, success: retryResult.success, output: retryResult.output };
399
+ const content = retryResult.output || retryResult.error || '';
400
+ this.toolResultMsgs.push({ role: 'tool', content, tool_call_id: tc.id, name: error.toolName });
401
+ this.messages.push({ role: 'tool', content, tool_call_id: tc.id, name: error.toolName });
402
+ }
403
+ catch (retryError) {
404
+ const errMsg = retryError.message;
405
+ yield { type: 'tool_result', name: error.toolName, success: false, output: errMsg };
406
+ this.toolResultMsgs.push({ role: 'tool', content: `执行失败: ${errMsg}`, tool_call_id: tc.id, name: error.toolName });
407
+ this.messages.push({ role: 'tool', content: `执行失败: ${errMsg}`, tool_call_id: tc.id, name: error.toolName });
408
+ }
409
+ }
410
+ else {
411
+ const cancelMsg = '用户取消了此操作';
412
+ yield { type: 'tool_result', name: error.toolName, success: false, output: cancelMsg };
413
+ this.toolResultMsgs.push({ role: 'tool', content: cancelMsg, tool_call_id: tc.id, name: error.toolName });
414
+ this.messages.push({ role: 'tool', content: cancelMsg, tool_call_id: tc.id, name: error.toolName });
415
+ }
416
+ this.pendingConfirmation = undefined;
417
+ this.state = AgentState.POST_TOOL;
418
+ }
419
+ async *doPostTool() {
420
+ this.toolIndex++;
421
+ this.state = AgentState.PRE_TOOL;
422
+ }
423
+ async *doPersistTurn() {
424
+ await this.hooks.afterTurn?.(this.iteration);
425
+ await this.storage.addMessage(this.effectiveSessionId, {
426
+ session_id: this.effectiveSessionId,
427
+ role: 'assistant',
428
+ content: this.fullContent || '',
429
+ reasoning_content: this.fullReasoning || undefined,
430
+ tool_calls: this.resolvedToolCalls,
431
+ usage: this.totalUsage
432
+ });
433
+ if (this.totalUsage) {
434
+ await this.storage.updateTokenCount(this.effectiveSessionId, this.totalUsage.total_tokens);
435
+ }
436
+ for (const t of this.toolResultMsgs) {
437
+ await this.storage.addMessage(this.effectiveSessionId, {
438
+ session_id: this.effectiveSessionId,
439
+ role: 'tool',
440
+ content: t.content,
441
+ tool_call_id: t.tool_call_id,
442
+ name: t.name
443
+ });
444
+ }
445
+ if (this.signal?.aborted) {
446
+ this.state = AgentState.DONE;
447
+ return;
448
+ }
449
+ this.iteration++;
450
+ this.state = AgentState.PRE_LLM;
451
+ }
452
+ async *tryForkIfWindowLow() {
453
+ const tokensUsed = this.totalUsage?.total_tokens || 0;
454
+ if (tokensUsed <= 0)
455
+ return;
456
+ const shouldFork = this.compressionMode === 'custom'
457
+ ? tokensUsed > this.compressionThreshold
458
+ : this.contextWindow - tokensUsed < CONTINUE_THRESHOLD;
459
+ if (shouldFork) {
460
+ const newId = await this.createContinuation(this.effectiveSessionId, this.userMsg, this.messages, typeof this.buildResult.messages[0]?.content === 'string' ? this.buildResult.messages[0]?.content : undefined);
461
+ if (newId) {
462
+ yield { type: 'forked', newSessionId: newId };
463
+ }
464
+ }
465
+ }
466
+ extractPriorCompression(messages) {
467
+ const systemMsg = messages.find((m) => m.role === 'system');
468
+ if (!systemMsg)
469
+ return undefined;
470
+ const content = extractTextContent(systemMsg.content);
471
+ const marker = '[此对话延续自';
472
+ const idx = content.indexOf(marker);
473
+ if (idx === -1)
474
+ return undefined;
475
+ return content.slice(idx);
476
+ }
477
+ async createContinuation(sessionId, userMsg, allMessages, systemPrompt) {
478
+ try {
479
+ const parentSession = await this.storage.getSession(sessionId);
480
+ if (!parentSession)
481
+ return null;
482
+ const rawContent = buildSummaryContent(allMessages, systemPrompt);
483
+ let compression = '';
484
+ const priorCompression = this.extractPriorCompression(allMessages);
485
+ try {
486
+ let prompt = `The following is a conversation history that needs compression due to context length. Extract the **key information needed to continue the current task**, output in Chinese using the format below:
487
+
488
+ ## 目标
489
+ - Core task the user wants to accomplish (1 sentence)
490
+
491
+ ## 进度
492
+ - 已完成: <completed items>
493
+ - 进行中: <in progress>
494
+ - 阻塞: <blocked items, omit if none>
495
+
496
+ ## 关键决策
497
+ - <key technical decisions, tool choices, approaches taken>
498
+
499
+ ## 用户偏好与约束
500
+ - <user habits, preferences, explicit constraints>
501
+
502
+ ## 关键上下文
503
+ - <file paths, key parameters, environment info>
504
+
505
+ ## 下一步
506
+ - <next steps, ordered by priority>
507
+
508
+ Conversation:
509
+ ${rawContent}`;
510
+ if (priorCompression) {
511
+ prompt += `\n\nBelow is an existing compression summary. Update it by preserving ALL existing information and adding new developments:\n${priorCompression}`;
512
+ }
513
+ const res = await this.provider.chat({
514
+ messages: [{ role: 'user', content: prompt }],
515
+ max_tokens: 2000,
516
+ temperature: 0.3
517
+ });
518
+ compression = res.content || '';
519
+ }
520
+ catch {
521
+ compression = rawContent.slice(0, 2000);
522
+ }
523
+ if (!compression)
524
+ return null;
525
+ const newTitle = `[延续] ${parentSession.title}`;
526
+ const newSession = await this.storage.createSession(newTitle, parentSession.memory_snapshot, parentSession.workspace);
527
+ await this.storage.addMessage(newSession.id, {
528
+ session_id: newSession.id,
529
+ role: 'system',
530
+ content: `[此对话延续自会话「${parentSession.title || sessionId}」,以下为上下文压缩]\n\n${compression}`
531
+ });
532
+ await this.storage.addMessage(newSession.id, {
533
+ session_id: newSession.id,
534
+ role: 'user',
535
+ content: userMsg.content
536
+ });
537
+ const recentMessages = await this.storage.getMessagesSinceSeq(sessionId, userMsg.seq);
538
+ for (const msg of recentMessages) {
539
+ await this.storage.addMessage(newSession.id, {
540
+ session_id: newSession.id,
541
+ role: msg.role,
542
+ content: msg.content,
543
+ reasoning_content: msg.reasoning_content,
544
+ tool_calls: msg.tool_calls,
545
+ tool_call_id: msg.tool_call_id,
546
+ name: msg.name,
547
+ usage: msg.usage
548
+ });
549
+ }
550
+ return newSession.id;
551
+ }
552
+ catch {
553
+ return null;
554
+ }
555
+ }
556
+ }
557
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Message } from '../ai/index.js';
2
+ /**
3
+ * 消息清洗管道
4
+ *
5
+ * 1. 移除空消息(无内容且无 tool_calls)
6
+ * 2. 清除 Unicode surrogate(\uD800-\uDFFF)
7
+ * 3. 修复角色交替(合并连续 user/assistant)
8
+ * 4. 移除孤儿 tool 结果(无匹配 tool_call_id)
9
+ *
10
+ * 返回新的 Message 数组,不修改原数组。
11
+ */
12
+ export declare function sanitizeMessages(messages: Message[]): Message[];
13
+ //# sourceMappingURL=message-sanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-sanitizer.d.ts","sourceRoot":"","sources":["../../src/agent/message-sanitizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,gBAAgB,CAAC;AA0G3D;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CA6B/D"}