axon-code 2.4.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 (1975) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +261 -0
  3. package/README.zh-CN.md +261 -0
  4. package/dist/agents/context.d.ts +289 -0
  5. package/dist/agents/context.d.ts.map +1 -0
  6. package/dist/agents/context.js +944 -0
  7. package/dist/agents/context.js.map +1 -0
  8. package/dist/agents/explore.d.ts +190 -0
  9. package/dist/agents/explore.d.ts.map +1 -0
  10. package/dist/agents/explore.js +582 -0
  11. package/dist/agents/explore.js.map +1 -0
  12. package/dist/agents/guide.d.ts +117 -0
  13. package/dist/agents/guide.d.ts.map +1 -0
  14. package/dist/agents/guide.js +690 -0
  15. package/dist/agents/guide.js.map +1 -0
  16. package/dist/agents/index.d.ts +11 -0
  17. package/dist/agents/index.d.ts.map +1 -0
  18. package/dist/agents/index.js +17 -0
  19. package/dist/agents/index.js.map +1 -0
  20. package/dist/agents/monitor.d.ts +343 -0
  21. package/dist/agents/monitor.d.ts.map +1 -0
  22. package/dist/agents/monitor.js +963 -0
  23. package/dist/agents/monitor.js.map +1 -0
  24. package/dist/agents/parallel.d.ts +305 -0
  25. package/dist/agents/parallel.d.ts.map +1 -0
  26. package/dist/agents/parallel.js +717 -0
  27. package/dist/agents/parallel.js.map +1 -0
  28. package/dist/agents/plan.d.ts +236 -0
  29. package/dist/agents/plan.d.ts.map +1 -0
  30. package/dist/agents/plan.js +292 -0
  31. package/dist/agents/plan.js.map +1 -0
  32. package/dist/agents/resume.d.ts +209 -0
  33. package/dist/agents/resume.d.ts.map +1 -0
  34. package/dist/agents/resume.js +520 -0
  35. package/dist/agents/resume.js.map +1 -0
  36. package/dist/agents/statusline.d.ts +167 -0
  37. package/dist/agents/statusline.d.ts.map +1 -0
  38. package/dist/agents/statusline.js +546 -0
  39. package/dist/agents/statusline.js.map +1 -0
  40. package/dist/agents/teammate-context.d.ts +163 -0
  41. package/dist/agents/teammate-context.d.ts.map +1 -0
  42. package/dist/agents/teammate-context.js +272 -0
  43. package/dist/agents/teammate-context.js.map +1 -0
  44. package/dist/agents/tools.d.ts +30 -0
  45. package/dist/agents/tools.d.ts.map +1 -0
  46. package/dist/agents/tools.js +116 -0
  47. package/dist/agents/tools.js.map +1 -0
  48. package/dist/auth/index.d.ts +204 -0
  49. package/dist/auth/index.d.ts.map +1 -0
  50. package/dist/auth/index.js +1266 -0
  51. package/dist/auth/index.js.map +1 -0
  52. package/dist/auth/keychain.d.ts +74 -0
  53. package/dist/auth/keychain.d.ts.map +1 -0
  54. package/dist/auth/keychain.js +181 -0
  55. package/dist/auth/keychain.js.map +1 -0
  56. package/dist/auth/settings.d.ts +58 -0
  57. package/dist/auth/settings.d.ts.map +1 -0
  58. package/dist/auth/settings.js +260 -0
  59. package/dist/auth/settings.js.map +1 -0
  60. package/dist/background/index.d.ts +83 -0
  61. package/dist/background/index.d.ts.map +1 -0
  62. package/dist/background/index.js +106 -0
  63. package/dist/background/index.js.map +1 -0
  64. package/dist/background/persistence.d.ts +146 -0
  65. package/dist/background/persistence.d.ts.map +1 -0
  66. package/dist/background/persistence.js +347 -0
  67. package/dist/background/persistence.js.map +1 -0
  68. package/dist/background/shell-manager.d.ts +130 -0
  69. package/dist/background/shell-manager.d.ts.map +1 -0
  70. package/dist/background/shell-manager.js +401 -0
  71. package/dist/background/shell-manager.js.map +1 -0
  72. package/dist/background/task-queue.d.ts +96 -0
  73. package/dist/background/task-queue.d.ts.map +1 -0
  74. package/dist/background/task-queue.js +199 -0
  75. package/dist/background/task-queue.js.map +1 -0
  76. package/dist/background/timeout.d.ts +122 -0
  77. package/dist/background/timeout.d.ts.map +1 -0
  78. package/dist/background/timeout.js +247 -0
  79. package/dist/background/timeout.js.map +1 -0
  80. package/dist/blueprint/agent-decision-maker.d.ts +126 -0
  81. package/dist/blueprint/agent-decision-maker.d.ts.map +1 -0
  82. package/dist/blueprint/agent-decision-maker.js +433 -0
  83. package/dist/blueprint/agent-decision-maker.js.map +1 -0
  84. package/dist/blueprint/autonomous-worker.d.ts +182 -0
  85. package/dist/blueprint/autonomous-worker.d.ts.map +1 -0
  86. package/dist/blueprint/autonomous-worker.js +808 -0
  87. package/dist/blueprint/autonomous-worker.js.map +1 -0
  88. package/dist/blueprint/browser-test-tools.d.ts +277 -0
  89. package/dist/blueprint/browser-test-tools.d.ts.map +1 -0
  90. package/dist/blueprint/browser-test-tools.js +645 -0
  91. package/dist/blueprint/browser-test-tools.js.map +1 -0
  92. package/dist/blueprint/e2e-agent-registry.d.ts +27 -0
  93. package/dist/blueprint/e2e-agent-registry.d.ts.map +1 -0
  94. package/dist/blueprint/e2e-agent-registry.js +39 -0
  95. package/dist/blueprint/e2e-agent-registry.js.map +1 -0
  96. package/dist/blueprint/e2e-test-agent.d.ts +151 -0
  97. package/dist/blueprint/e2e-test-agent.d.ts.map +1 -0
  98. package/dist/blueprint/e2e-test-agent.js +612 -0
  99. package/dist/blueprint/e2e-test-agent.js.map +1 -0
  100. package/dist/blueprint/environment-checker.d.ts +113 -0
  101. package/dist/blueprint/environment-checker.d.ts.map +1 -0
  102. package/dist/blueprint/environment-checker.js +409 -0
  103. package/dist/blueprint/environment-checker.js.map +1 -0
  104. package/dist/blueprint/index.d.ts +26 -0
  105. package/dist/blueprint/index.d.ts.map +1 -0
  106. package/dist/blueprint/index.js +50 -0
  107. package/dist/blueprint/index.js.map +1 -0
  108. package/dist/blueprint/lead-agent.d.ts +97 -0
  109. package/dist/blueprint/lead-agent.d.ts.map +1 -0
  110. package/dist/blueprint/lead-agent.js +905 -0
  111. package/dist/blueprint/lead-agent.js.map +1 -0
  112. package/dist/blueprint/model-selector.d.ts +34 -0
  113. package/dist/blueprint/model-selector.d.ts.map +1 -0
  114. package/dist/blueprint/model-selector.js +83 -0
  115. package/dist/blueprint/model-selector.js.map +1 -0
  116. package/dist/blueprint/planner-session.d.ts +130 -0
  117. package/dist/blueprint/planner-session.d.ts.map +1 -0
  118. package/dist/blueprint/planner-session.js +479 -0
  119. package/dist/blueprint/planner-session.js.map +1 -0
  120. package/dist/blueprint/realtime-coordinator.d.ts +373 -0
  121. package/dist/blueprint/realtime-coordinator.d.ts.map +1 -0
  122. package/dist/blueprint/realtime-coordinator.js +1454 -0
  123. package/dist/blueprint/realtime-coordinator.js.map +1 -0
  124. package/dist/blueprint/smart-planner.d.ts +346 -0
  125. package/dist/blueprint/smart-planner.d.ts.map +1 -0
  126. package/dist/blueprint/smart-planner.js +2426 -0
  127. package/dist/blueprint/smart-planner.js.map +1 -0
  128. package/dist/blueprint/task-queue.d.ts +62 -0
  129. package/dist/blueprint/task-queue.d.ts.map +1 -0
  130. package/dist/blueprint/task-queue.js +185 -0
  131. package/dist/blueprint/task-queue.js.map +1 -0
  132. package/dist/blueprint/task-reviewer.d.ts +168 -0
  133. package/dist/blueprint/task-reviewer.d.ts.map +1 -0
  134. package/dist/blueprint/task-reviewer.js +570 -0
  135. package/dist/blueprint/task-reviewer.js.map +1 -0
  136. package/dist/blueprint/types.d.ts +1054 -0
  137. package/dist/blueprint/types.d.ts.map +1 -0
  138. package/dist/blueprint/types.js +49 -0
  139. package/dist/blueprint/types.js.map +1 -0
  140. package/dist/blueprint/verification-service.d.ts +134 -0
  141. package/dist/blueprint/verification-service.d.ts.map +1 -0
  142. package/dist/blueprint/verification-service.js +315 -0
  143. package/dist/blueprint/verification-service.js.map +1 -0
  144. package/dist/blueprint/visual-comparator.d.ts +112 -0
  145. package/dist/blueprint/visual-comparator.d.ts.map +1 -0
  146. package/dist/blueprint/visual-comparator.js +309 -0
  147. package/dist/blueprint/visual-comparator.js.map +1 -0
  148. package/dist/browser/controller.d.ts +188 -0
  149. package/dist/browser/controller.d.ts.map +1 -0
  150. package/dist/browser/controller.js +1256 -0
  151. package/dist/browser/controller.js.map +1 -0
  152. package/dist/browser/detect.d.ts +14 -0
  153. package/dist/browser/detect.d.ts.map +1 -0
  154. package/dist/browser/detect.js +93 -0
  155. package/dist/browser/detect.js.map +1 -0
  156. package/dist/browser/errors.d.ts +14 -0
  157. package/dist/browser/errors.d.ts.map +1 -0
  158. package/dist/browser/errors.js +45 -0
  159. package/dist/browser/errors.js.map +1 -0
  160. package/dist/browser/extension/background-utils.js +53 -0
  161. package/dist/browser/extension/background.js +895 -0
  162. package/dist/browser/extension/manifest.json +28 -0
  163. package/dist/browser/extension/options.html +214 -0
  164. package/dist/browser/extension/options.js +201 -0
  165. package/dist/browser/extension-relay-auth.d.ts +18 -0
  166. package/dist/browser/extension-relay-auth.d.ts.map +1 -0
  167. package/dist/browser/extension-relay-auth.js +53 -0
  168. package/dist/browser/extension-relay-auth.js.map +1 -0
  169. package/dist/browser/extension-relay.d.ts +39 -0
  170. package/dist/browser/extension-relay.d.ts.map +1 -0
  171. package/dist/browser/extension-relay.js +855 -0
  172. package/dist/browser/extension-relay.js.map +1 -0
  173. package/dist/browser/index.d.ts +11 -0
  174. package/dist/browser/index.d.ts.map +1 -0
  175. package/dist/browser/index.js +11 -0
  176. package/dist/browser/index.js.map +1 -0
  177. package/dist/browser/manager.d.ts +77 -0
  178. package/dist/browser/manager.d.ts.map +1 -0
  179. package/dist/browser/manager.js +911 -0
  180. package/dist/browser/manager.js.map +1 -0
  181. package/dist/browser/navigation-guard.d.ts +15 -0
  182. package/dist/browser/navigation-guard.d.ts.map +1 -0
  183. package/dist/browser/navigation-guard.js +163 -0
  184. package/dist/browser/navigation-guard.js.map +1 -0
  185. package/dist/browser/profiles.d.ts +49 -0
  186. package/dist/browser/profiles.d.ts.map +1 -0
  187. package/dist/browser/profiles.js +211 -0
  188. package/dist/browser/profiles.js.map +1 -0
  189. package/dist/browser/types.d.ts +96 -0
  190. package/dist/browser/types.d.ts.map +1 -0
  191. package/dist/browser/types.js +5 -0
  192. package/dist/browser/types.js.map +1 -0
  193. package/dist/checkpoint/index.d.ts +289 -0
  194. package/dist/checkpoint/index.d.ts.map +1 -0
  195. package/dist/checkpoint/index.js +1424 -0
  196. package/dist/checkpoint/index.js.map +1 -0
  197. package/dist/chrome/index.d.ts +31 -0
  198. package/dist/chrome/index.d.ts.map +1 -0
  199. package/dist/chrome/index.js +41 -0
  200. package/dist/chrome/index.js.map +1 -0
  201. package/dist/chrome-mcp/index.d.ts +84 -0
  202. package/dist/chrome-mcp/index.d.ts.map +1 -0
  203. package/dist/chrome-mcp/index.js +192 -0
  204. package/dist/chrome-mcp/index.js.map +1 -0
  205. package/dist/chrome-mcp/mcp-server.d.ts +115 -0
  206. package/dist/chrome-mcp/mcp-server.d.ts.map +1 -0
  207. package/dist/chrome-mcp/mcp-server.js +312 -0
  208. package/dist/chrome-mcp/mcp-server.js.map +1 -0
  209. package/dist/chrome-mcp/native-host.d.ts +65 -0
  210. package/dist/chrome-mcp/native-host.d.ts.map +1 -0
  211. package/dist/chrome-mcp/native-host.js +357 -0
  212. package/dist/chrome-mcp/native-host.js.map +1 -0
  213. package/dist/chrome-mcp/socket-client.d.ts +105 -0
  214. package/dist/chrome-mcp/socket-client.d.ts.map +1 -0
  215. package/dist/chrome-mcp/socket-client.js +325 -0
  216. package/dist/chrome-mcp/socket-client.js.map +1 -0
  217. package/dist/chrome-mcp/socket-server.d.ts +65 -0
  218. package/dist/chrome-mcp/socket-server.d.ts.map +1 -0
  219. package/dist/chrome-mcp/socket-server.js +354 -0
  220. package/dist/chrome-mcp/socket-server.js.map +1 -0
  221. package/dist/chrome-mcp/tools.d.ts +22 -0
  222. package/dist/chrome-mcp/tools.d.ts.map +1 -0
  223. package/dist/chrome-mcp/tools.js +372 -0
  224. package/dist/chrome-mcp/tools.js.map +1 -0
  225. package/dist/cli.d.ts +7 -0
  226. package/dist/cli.d.ts.map +1 -0
  227. package/dist/cli.js +3302 -0
  228. package/dist/cli.js.map +1 -0
  229. package/dist/codesign/index.d.ts +84 -0
  230. package/dist/codesign/index.d.ts.map +1 -0
  231. package/dist/codesign/index.js +289 -0
  232. package/dist/codesign/index.js.map +1 -0
  233. package/dist/commands/api.d.ts +8 -0
  234. package/dist/commands/api.d.ts.map +1 -0
  235. package/dist/commands/api.js +510 -0
  236. package/dist/commands/api.js.map +1 -0
  237. package/dist/commands/auth.d.ts +13 -0
  238. package/dist/commands/auth.d.ts.map +1 -0
  239. package/dist/commands/auth.js +713 -0
  240. package/dist/commands/auth.js.map +1 -0
  241. package/dist/commands/config-cmd.d.ts +12 -0
  242. package/dist/commands/config-cmd.d.ts.map +1 -0
  243. package/dist/commands/config-cmd.js +578 -0
  244. package/dist/commands/config-cmd.js.map +1 -0
  245. package/dist/commands/config.d.ts +22 -0
  246. package/dist/commands/config.d.ts.map +1 -0
  247. package/dist/commands/config.js +2457 -0
  248. package/dist/commands/config.js.map +1 -0
  249. package/dist/commands/development.d.ts +14 -0
  250. package/dist/commands/development.d.ts.map +1 -0
  251. package/dist/commands/development.js +905 -0
  252. package/dist/commands/development.js.map +1 -0
  253. package/dist/commands/general.d.ts +15 -0
  254. package/dist/commands/general.d.ts.map +1 -0
  255. package/dist/commands/general.js +620 -0
  256. package/dist/commands/general.js.map +1 -0
  257. package/dist/commands/index.d.ts +28 -0
  258. package/dist/commands/index.d.ts.map +1 -0
  259. package/dist/commands/index.js +70 -0
  260. package/dist/commands/index.js.map +1 -0
  261. package/dist/commands/registry.d.ts +16 -0
  262. package/dist/commands/registry.d.ts.map +1 -0
  263. package/dist/commands/registry.js +55 -0
  264. package/dist/commands/registry.js.map +1 -0
  265. package/dist/commands/session.d.ts +14 -0
  266. package/dist/commands/session.d.ts.map +1 -0
  267. package/dist/commands/session.js +1256 -0
  268. package/dist/commands/session.js.map +1 -0
  269. package/dist/commands/settings.d.ts +15 -0
  270. package/dist/commands/settings.d.ts.map +1 -0
  271. package/dist/commands/settings.js +439 -0
  272. package/dist/commands/settings.js.map +1 -0
  273. package/dist/commands/tools.d.ts +14 -0
  274. package/dist/commands/tools.d.ts.map +1 -0
  275. package/dist/commands/tools.js +1579 -0
  276. package/dist/commands/tools.js.map +1 -0
  277. package/dist/commands/types.d.ts +82 -0
  278. package/dist/commands/types.d.ts.map +1 -0
  279. package/dist/commands/types.js +5 -0
  280. package/dist/commands/types.js.map +1 -0
  281. package/dist/commands/utility.d.ts +19 -0
  282. package/dist/commands/utility.d.ts.map +1 -0
  283. package/dist/commands/utility.js +738 -0
  284. package/dist/commands/utility.js.map +1 -0
  285. package/dist/config/axon-md-parser.d.ts +167 -0
  286. package/dist/config/axon-md-parser.d.ts.map +1 -0
  287. package/dist/config/axon-md-parser.js +472 -0
  288. package/dist/config/axon-md-parser.js.map +1 -0
  289. package/dist/config/builtin-api.d.ts +2 -0
  290. package/dist/config/builtin-api.d.ts.map +1 -0
  291. package/dist/config/builtin-api.js +2 -0
  292. package/dist/config/builtin-api.js.map +1 -0
  293. package/dist/config/config-command.d.ts +81 -0
  294. package/dist/config/config-command.d.ts.map +1 -0
  295. package/dist/config/config-command.js +292 -0
  296. package/dist/config/config-command.js.map +1 -0
  297. package/dist/config/index.d.ts +1700 -0
  298. package/dist/config/index.d.ts.map +1 -0
  299. package/dist/config/index.js +1677 -0
  300. package/dist/config/index.js.map +1 -0
  301. package/dist/config/keybindings.d.ts +141 -0
  302. package/dist/config/keybindings.d.ts.map +1 -0
  303. package/dist/config/keybindings.js +708 -0
  304. package/dist/config/keybindings.js.map +1 -0
  305. package/dist/context/__tests__/enhanced.test.d.ts +5 -0
  306. package/dist/context/__tests__/enhanced.test.d.ts.map +1 -0
  307. package/dist/context/__tests__/enhanced.test.js +298 -0
  308. package/dist/context/__tests__/enhanced.test.js.map +1 -0
  309. package/dist/context/enhanced.d.ts +244 -0
  310. package/dist/context/enhanced.d.ts.map +1 -0
  311. package/dist/context/enhanced.js +527 -0
  312. package/dist/context/enhanced.js.map +1 -0
  313. package/dist/context/index.d.ts +249 -0
  314. package/dist/context/index.d.ts.map +1 -0
  315. package/dist/context/index.js +1043 -0
  316. package/dist/context/index.js.map +1 -0
  317. package/dist/context/intent-enricher.d.ts +38 -0
  318. package/dist/context/intent-enricher.d.ts.map +1 -0
  319. package/dist/context/intent-enricher.js +212 -0
  320. package/dist/context/intent-enricher.js.map +1 -0
  321. package/dist/context/link-detector.d.ts +20 -0
  322. package/dist/context/link-detector.d.ts.map +1 -0
  323. package/dist/context/link-detector.js +99 -0
  324. package/dist/context/link-detector.js.map +1 -0
  325. package/dist/context/session-memory.d.ts +206 -0
  326. package/dist/context/session-memory.d.ts.map +1 -0
  327. package/dist/context/session-memory.js +542 -0
  328. package/dist/context/session-memory.js.map +1 -0
  329. package/dist/context/summarizer.d.ts +27 -0
  330. package/dist/context/summarizer.d.ts.map +1 -0
  331. package/dist/context/summarizer.js +157 -0
  332. package/dist/context/summarizer.js.map +1 -0
  333. package/dist/context/window.d.ts +104 -0
  334. package/dist/context/window.d.ts.map +1 -0
  335. package/dist/context/window.js +140 -0
  336. package/dist/context/window.js.map +1 -0
  337. package/dist/core/backgroundTasks.d.ts +87 -0
  338. package/dist/core/backgroundTasks.d.ts.map +1 -0
  339. package/dist/core/backgroundTasks.js +229 -0
  340. package/dist/core/backgroundTasks.js.map +1 -0
  341. package/dist/core/cache-keepalive.d.ts +37 -0
  342. package/dist/core/cache-keepalive.d.ts.map +1 -0
  343. package/dist/core/cache-keepalive.js +130 -0
  344. package/dist/core/cache-keepalive.js.map +1 -0
  345. package/dist/core/client.cache.test.d.ts +13 -0
  346. package/dist/core/client.cache.test.d.ts.map +1 -0
  347. package/dist/core/client.cache.test.js +315 -0
  348. package/dist/core/client.cache.test.js.map +1 -0
  349. package/dist/core/client.d.ts +306 -0
  350. package/dist/core/client.d.ts.map +1 -0
  351. package/dist/core/client.js +1930 -0
  352. package/dist/core/client.js.map +1 -0
  353. package/dist/core/cwd-context.d.ts +53 -0
  354. package/dist/core/cwd-context.d.ts.map +1 -0
  355. package/dist/core/cwd-context.js +102 -0
  356. package/dist/core/cwd-context.js.map +1 -0
  357. package/dist/core/index.d.ts +9 -0
  358. package/dist/core/index.d.ts.map +1 -0
  359. package/dist/core/index.js +9 -0
  360. package/dist/core/index.js.map +1 -0
  361. package/dist/core/loop.d.ts +401 -0
  362. package/dist/core/loop.d.ts.map +1 -0
  363. package/dist/core/loop.js +3375 -0
  364. package/dist/core/loop.js.map +1 -0
  365. package/dist/core/retryLogic.d.ts +84 -0
  366. package/dist/core/retryLogic.d.ts.map +1 -0
  367. package/dist/core/retryLogic.js +157 -0
  368. package/dist/core/retryLogic.js.map +1 -0
  369. package/dist/core/session-context.d.ts +24 -0
  370. package/dist/core/session-context.d.ts.map +1 -0
  371. package/dist/core/session-context.js +35 -0
  372. package/dist/core/session-context.js.map +1 -0
  373. package/dist/core/session.d.ts +229 -0
  374. package/dist/core/session.d.ts.map +1 -0
  375. package/dist/core/session.js +729 -0
  376. package/dist/core/session.js.map +1 -0
  377. package/dist/core/validateToolResults.test.d.ts +6 -0
  378. package/dist/core/validateToolResults.test.d.ts.map +1 -0
  379. package/dist/core/validateToolResults.test.js +303 -0
  380. package/dist/core/validateToolResults.test.js.map +1 -0
  381. package/dist/daemon/alarm.d.ts +62 -0
  382. package/dist/daemon/alarm.d.ts.map +1 -0
  383. package/dist/daemon/alarm.js +145 -0
  384. package/dist/daemon/alarm.js.map +1 -0
  385. package/dist/daemon/config.d.ts +225 -0
  386. package/dist/daemon/config.d.ts.map +1 -0
  387. package/dist/daemon/config.js +104 -0
  388. package/dist/daemon/config.js.map +1 -0
  389. package/dist/daemon/executor.d.ts +52 -0
  390. package/dist/daemon/executor.d.ts.map +1 -0
  391. package/dist/daemon/executor.js +288 -0
  392. package/dist/daemon/executor.js.map +1 -0
  393. package/dist/daemon/index.d.ts +72 -0
  394. package/dist/daemon/index.d.ts.map +1 -0
  395. package/dist/daemon/index.js +394 -0
  396. package/dist/daemon/index.js.map +1 -0
  397. package/dist/daemon/locked.d.ts +15 -0
  398. package/dist/daemon/locked.d.ts.map +1 -0
  399. package/dist/daemon/locked.js +16 -0
  400. package/dist/daemon/locked.js.map +1 -0
  401. package/dist/daemon/notifier.d.ts +25 -0
  402. package/dist/daemon/notifier.d.ts.map +1 -0
  403. package/dist/daemon/notifier.js +87 -0
  404. package/dist/daemon/notifier.js.map +1 -0
  405. package/dist/daemon/run-log.d.ts +43 -0
  406. package/dist/daemon/run-log.d.ts.map +1 -0
  407. package/dist/daemon/run-log.js +126 -0
  408. package/dist/daemon/run-log.js.map +1 -0
  409. package/dist/daemon/scheduler.d.ts +85 -0
  410. package/dist/daemon/scheduler.d.ts.map +1 -0
  411. package/dist/daemon/scheduler.js +379 -0
  412. package/dist/daemon/scheduler.js.map +1 -0
  413. package/dist/daemon/store.d.ts +94 -0
  414. package/dist/daemon/store.d.ts.map +1 -0
  415. package/dist/daemon/store.js +121 -0
  416. package/dist/daemon/store.js.map +1 -0
  417. package/dist/daemon/time-parser.d.ts +15 -0
  418. package/dist/daemon/time-parser.d.ts.map +1 -0
  419. package/dist/daemon/time-parser.js +68 -0
  420. package/dist/daemon/time-parser.js.map +1 -0
  421. package/dist/daemon/watcher.d.ts +34 -0
  422. package/dist/daemon/watcher.d.ts.map +1 -0
  423. package/dist/daemon/watcher.js +105 -0
  424. package/dist/daemon/watcher.js.map +1 -0
  425. package/dist/database/drivers/mongo.d.ts +14 -0
  426. package/dist/database/drivers/mongo.d.ts.map +1 -0
  427. package/dist/database/drivers/mongo.js +112 -0
  428. package/dist/database/drivers/mongo.js.map +1 -0
  429. package/dist/database/drivers/mysql.d.ts +13 -0
  430. package/dist/database/drivers/mysql.d.ts.map +1 -0
  431. package/dist/database/drivers/mysql.js +76 -0
  432. package/dist/database/drivers/mysql.js.map +1 -0
  433. package/dist/database/drivers/postgres.d.ts +13 -0
  434. package/dist/database/drivers/postgres.d.ts.map +1 -0
  435. package/dist/database/drivers/postgres.js +79 -0
  436. package/dist/database/drivers/postgres.js.map +1 -0
  437. package/dist/database/drivers/redis.d.ts +13 -0
  438. package/dist/database/drivers/redis.d.ts.map +1 -0
  439. package/dist/database/drivers/redis.js +100 -0
  440. package/dist/database/drivers/redis.js.map +1 -0
  441. package/dist/database/drivers/sqlite.d.ts +13 -0
  442. package/dist/database/drivers/sqlite.d.ts.map +1 -0
  443. package/dist/database/drivers/sqlite.js +89 -0
  444. package/dist/database/drivers/sqlite.js.map +1 -0
  445. package/dist/database/index.d.ts +21 -0
  446. package/dist/database/index.d.ts.map +1 -0
  447. package/dist/database/index.js +97 -0
  448. package/dist/database/index.js.map +1 -0
  449. package/dist/database/types.d.ts +54 -0
  450. package/dist/database/types.d.ts.map +1 -0
  451. package/dist/database/types.js +2 -0
  452. package/dist/database/types.js.map +1 -0
  453. package/dist/debugger/dap-client.d.ts +32 -0
  454. package/dist/debugger/dap-client.d.ts.map +1 -0
  455. package/dist/debugger/dap-client.js +108 -0
  456. package/dist/debugger/dap-client.js.map +1 -0
  457. package/dist/debugger/index.d.ts +30 -0
  458. package/dist/debugger/index.d.ts.map +1 -0
  459. package/dist/debugger/index.js +574 -0
  460. package/dist/debugger/index.js.map +1 -0
  461. package/dist/debugger/types.d.ts +59 -0
  462. package/dist/debugger/types.d.ts.map +1 -0
  463. package/dist/debugger/types.js +2 -0
  464. package/dist/debugger/types.js.map +1 -0
  465. package/dist/diagnostics/index.d.ts +72 -0
  466. package/dist/diagnostics/index.d.ts.map +1 -0
  467. package/dist/diagnostics/index.js +1013 -0
  468. package/dist/diagnostics/index.js.map +1 -0
  469. package/dist/ear/index.d.ts +73 -0
  470. package/dist/ear/index.d.ts.map +1 -0
  471. package/dist/ear/index.js +114 -0
  472. package/dist/ear/index.js.map +1 -0
  473. package/dist/email-mcp/index.d.ts +12 -0
  474. package/dist/email-mcp/index.d.ts.map +1 -0
  475. package/dist/email-mcp/index.js +11 -0
  476. package/dist/email-mcp/index.js.map +1 -0
  477. package/dist/email-mcp/mcp-server.d.ts +18 -0
  478. package/dist/email-mcp/mcp-server.d.ts.map +1 -0
  479. package/dist/email-mcp/mcp-server.js +381 -0
  480. package/dist/email-mcp/mcp-server.js.map +1 -0
  481. package/dist/email-mcp/tools.d.ts +22 -0
  482. package/dist/email-mcp/tools.d.ts.map +1 -0
  483. package/dist/email-mcp/tools.js +251 -0
  484. package/dist/email-mcp/tools.js.map +1 -0
  485. package/dist/env/index.d.ts +27 -0
  486. package/dist/env/index.d.ts.map +1 -0
  487. package/dist/env/index.js +31 -0
  488. package/dist/env/index.js.map +1 -0
  489. package/dist/env/manager.d.ts +150 -0
  490. package/dist/env/manager.d.ts.map +1 -0
  491. package/dist/env/manager.js +290 -0
  492. package/dist/env/manager.js.map +1 -0
  493. package/dist/env/sensitive.d.ts +134 -0
  494. package/dist/env/sensitive.d.ts.map +1 -0
  495. package/dist/env/sensitive.js +255 -0
  496. package/dist/env/sensitive.js.map +1 -0
  497. package/dist/env/validator.d.ts +93 -0
  498. package/dist/env/validator.d.ts.map +1 -0
  499. package/dist/env/validator.js +122 -0
  500. package/dist/env/validator.js.map +1 -0
  501. package/dist/env/validators/builtin.d.ts +68 -0
  502. package/dist/env/validators/builtin.d.ts.map +1 -0
  503. package/dist/env/validators/builtin.js +294 -0
  504. package/dist/env/validators/builtin.js.map +1 -0
  505. package/dist/eye/camera.py +396 -0
  506. package/dist/eye/index.d.ts +70 -0
  507. package/dist/eye/index.d.ts.map +1 -0
  508. package/dist/eye/index.js +356 -0
  509. package/dist/eye/index.js.map +1 -0
  510. package/dist/fast-mode/index.d.ts +136 -0
  511. package/dist/fast-mode/index.d.ts.map +1 -0
  512. package/dist/fast-mode/index.js +390 -0
  513. package/dist/fast-mode/index.js.map +1 -0
  514. package/dist/fast-mode/provider.d.ts +10 -0
  515. package/dist/fast-mode/provider.d.ts.map +1 -0
  516. package/dist/fast-mode/provider.js +23 -0
  517. package/dist/fast-mode/provider.js.map +1 -0
  518. package/dist/feishu/bot.d.ts +71 -0
  519. package/dist/feishu/bot.d.ts.map +1 -0
  520. package/dist/feishu/bot.js +287 -0
  521. package/dist/feishu/bot.js.map +1 -0
  522. package/dist/feishu/config.d.ts +54 -0
  523. package/dist/feishu/config.d.ts.map +1 -0
  524. package/dist/feishu/config.js +100 -0
  525. package/dist/feishu/config.js.map +1 -0
  526. package/dist/feishu/index.d.ts +7 -0
  527. package/dist/feishu/index.d.ts.map +1 -0
  528. package/dist/feishu/index.js +5 -0
  529. package/dist/feishu/index.js.map +1 -0
  530. package/dist/feishu/message-handler.d.ts +42 -0
  531. package/dist/feishu/message-handler.d.ts.map +1 -0
  532. package/dist/feishu/message-handler.js +112 -0
  533. package/dist/feishu/message-handler.js.map +1 -0
  534. package/dist/feishu/session-manager.d.ts +57 -0
  535. package/dist/feishu/session-manager.d.ts.map +1 -0
  536. package/dist/feishu/session-manager.js +179 -0
  537. package/dist/feishu/session-manager.js.map +1 -0
  538. package/dist/feishu-cli.d.ts +34 -0
  539. package/dist/feishu-cli.d.ts.map +1 -0
  540. package/dist/feishu-cli.js +132 -0
  541. package/dist/feishu-cli.js.map +1 -0
  542. package/dist/git/analysis.d.ts +135 -0
  543. package/dist/git/analysis.d.ts.map +1 -0
  544. package/dist/git/analysis.js +259 -0
  545. package/dist/git/analysis.js.map +1 -0
  546. package/dist/git/core.d.ts +175 -0
  547. package/dist/git/core.d.ts.map +1 -0
  548. package/dist/git/core.js +349 -0
  549. package/dist/git/core.js.map +1 -0
  550. package/dist/git/ignore.d.ts +74 -0
  551. package/dist/git/ignore.d.ts.map +1 -0
  552. package/dist/git/ignore.js +257 -0
  553. package/dist/git/ignore.js.map +1 -0
  554. package/dist/git/index.d.ts +37 -0
  555. package/dist/git/index.d.ts.map +1 -0
  556. package/dist/git/index.js +48 -0
  557. package/dist/git/index.js.map +1 -0
  558. package/dist/git/operations.d.ts +96 -0
  559. package/dist/git/operations.d.ts.map +1 -0
  560. package/dist/git/operations.js +288 -0
  561. package/dist/git/operations.js.map +1 -0
  562. package/dist/git/safety.d.ts +107 -0
  563. package/dist/git/safety.d.ts.map +1 -0
  564. package/dist/git/safety.js +293 -0
  565. package/dist/git/safety.js.map +1 -0
  566. package/dist/github/index.d.ts +58 -0
  567. package/dist/github/index.d.ts.map +1 -0
  568. package/dist/github/index.js +246 -0
  569. package/dist/github/index.js.map +1 -0
  570. package/dist/goals/goal-daemon.d.ts +54 -0
  571. package/dist/goals/goal-daemon.d.ts.map +1 -0
  572. package/dist/goals/goal-daemon.js +171 -0
  573. package/dist/goals/goal-daemon.js.map +1 -0
  574. package/dist/goals/goal-evaluator.d.ts +28 -0
  575. package/dist/goals/goal-evaluator.d.ts.map +1 -0
  576. package/dist/goals/goal-evaluator.js +117 -0
  577. package/dist/goals/goal-evaluator.js.map +1 -0
  578. package/dist/goals/goal-planner.d.ts +21 -0
  579. package/dist/goals/goal-planner.d.ts.map +1 -0
  580. package/dist/goals/goal-planner.js +80 -0
  581. package/dist/goals/goal-planner.js.map +1 -0
  582. package/dist/goals/goal-store.d.ts +31 -0
  583. package/dist/goals/goal-store.d.ts.map +1 -0
  584. package/dist/goals/goal-store.js +238 -0
  585. package/dist/goals/goal-store.js.map +1 -0
  586. package/dist/goals/index.d.ts +15 -0
  587. package/dist/goals/index.d.ts.map +1 -0
  588. package/dist/goals/index.js +22 -0
  589. package/dist/goals/index.js.map +1 -0
  590. package/dist/goals/storage.d.ts +83 -0
  591. package/dist/goals/storage.d.ts.map +1 -0
  592. package/dist/goals/storage.js +235 -0
  593. package/dist/goals/storage.js.map +1 -0
  594. package/dist/goals/types.d.ts +138 -0
  595. package/dist/goals/types.d.ts.map +1 -0
  596. package/dist/goals/types.js +5 -0
  597. package/dist/goals/types.js.map +1 -0
  598. package/dist/hooks/blueprint-hooks.d.ts +52 -0
  599. package/dist/hooks/blueprint-hooks.d.ts.map +1 -0
  600. package/dist/hooks/blueprint-hooks.js +75 -0
  601. package/dist/hooks/blueprint-hooks.js.map +1 -0
  602. package/dist/hooks/index.d.ts +421 -0
  603. package/dist/hooks/index.d.ts.map +1 -0
  604. package/dist/hooks/index.js +1225 -0
  605. package/dist/hooks/index.js.map +1 -0
  606. package/dist/hooks/index.test.d.ts +33 -0
  607. package/dist/hooks/index.test.d.ts.map +1 -0
  608. package/dist/hooks/index.test.js +199 -0
  609. package/dist/hooks/index.test.js.map +1 -0
  610. package/dist/i18n/index.d.ts +25 -0
  611. package/dist/i18n/index.d.ts.map +1 -0
  612. package/dist/i18n/index.js +96 -0
  613. package/dist/i18n/index.js.map +1 -0
  614. package/dist/i18n/locales/en.d.ts +786 -0
  615. package/dist/i18n/locales/en.d.ts.map +1 -0
  616. package/dist/i18n/locales/en.js +865 -0
  617. package/dist/i18n/locales/en.js.map +1 -0
  618. package/dist/i18n/locales/zh.d.ts +7 -0
  619. package/dist/i18n/locales/zh.d.ts.map +1 -0
  620. package/dist/i18n/locales/zh.js +862 -0
  621. package/dist/i18n/locales/zh.js.map +1 -0
  622. package/dist/ide/index.d.ts +81 -0
  623. package/dist/ide/index.d.ts.map +1 -0
  624. package/dist/ide/index.js +371 -0
  625. package/dist/ide/index.js.map +1 -0
  626. package/dist/index.d.ts +39 -0
  627. package/dist/index.d.ts.map +1 -0
  628. package/dist/index.js +63 -0
  629. package/dist/index.js.map +1 -0
  630. package/dist/lifecycle/index.d.ts +120 -0
  631. package/dist/lifecycle/index.d.ts.map +1 -0
  632. package/dist/lifecycle/index.js +178 -0
  633. package/dist/lifecycle/index.js.map +1 -0
  634. package/dist/lsp/index.d.ts +12 -0
  635. package/dist/lsp/index.d.ts.map +1 -0
  636. package/dist/lsp/index.js +20 -0
  637. package/dist/lsp/index.js.map +1 -0
  638. package/dist/lsp/manager.d.ts +307 -0
  639. package/dist/lsp/manager.d.ts.map +1 -0
  640. package/dist/lsp/manager.js +1012 -0
  641. package/dist/lsp/manager.js.map +1 -0
  642. package/dist/map/index.d.ts +2 -0
  643. package/dist/map/index.d.ts.map +1 -0
  644. package/dist/map/index.js +2 -0
  645. package/dist/map/index.js.map +1 -0
  646. package/dist/map/types.d.ts +264 -0
  647. package/dist/map/types.d.ts.map +1 -0
  648. package/dist/map/types.js +6 -0
  649. package/dist/map/types.js.map +1 -0
  650. package/dist/mcp/adapter.d.ts +217 -0
  651. package/dist/mcp/adapter.d.ts.map +1 -0
  652. package/dist/mcp/adapter.js +527 -0
  653. package/dist/mcp/adapter.js.map +1 -0
  654. package/dist/mcp/auto-discovery.d.ts +303 -0
  655. package/dist/mcp/auto-discovery.d.ts.map +1 -0
  656. package/dist/mcp/auto-discovery.js +1009 -0
  657. package/dist/mcp/auto-discovery.js.map +1 -0
  658. package/dist/mcp/cancellation.d.ts +258 -0
  659. package/dist/mcp/cancellation.d.ts.map +1 -0
  660. package/dist/mcp/cancellation.js +478 -0
  661. package/dist/mcp/cancellation.js.map +1 -0
  662. package/dist/mcp/config.d.ts +521 -0
  663. package/dist/mcp/config.d.ts.map +1 -0
  664. package/dist/mcp/config.js +694 -0
  665. package/dist/mcp/config.js.map +1 -0
  666. package/dist/mcp/connection.d.ts +228 -0
  667. package/dist/mcp/connection.d.ts.map +1 -0
  668. package/dist/mcp/connection.js +707 -0
  669. package/dist/mcp/connection.js.map +1 -0
  670. package/dist/mcp/discovery.d.ts +128 -0
  671. package/dist/mcp/discovery.d.ts.map +1 -0
  672. package/dist/mcp/discovery.js +577 -0
  673. package/dist/mcp/discovery.js.map +1 -0
  674. package/dist/mcp/errors.d.ts +273 -0
  675. package/dist/mcp/errors.d.ts.map +1 -0
  676. package/dist/mcp/errors.js +566 -0
  677. package/dist/mcp/errors.js.map +1 -0
  678. package/dist/mcp/index.d.ts +10 -0
  679. package/dist/mcp/index.d.ts.map +1 -0
  680. package/dist/mcp/index.js +29 -0
  681. package/dist/mcp/index.js.map +1 -0
  682. package/dist/mcp/integration.d.ts +71 -0
  683. package/dist/mcp/integration.d.ts.map +1 -0
  684. package/dist/mcp/integration.js +198 -0
  685. package/dist/mcp/integration.js.map +1 -0
  686. package/dist/mcp/lifecycle.d.ts +261 -0
  687. package/dist/mcp/lifecycle.d.ts.map +1 -0
  688. package/dist/mcp/lifecycle.js +714 -0
  689. package/dist/mcp/lifecycle.js.map +1 -0
  690. package/dist/mcp/logging.d.ts +166 -0
  691. package/dist/mcp/logging.d.ts.map +1 -0
  692. package/dist/mcp/logging.js +346 -0
  693. package/dist/mcp/logging.js.map +1 -0
  694. package/dist/mcp/notifications.d.ts +221 -0
  695. package/dist/mcp/notifications.d.ts.map +1 -0
  696. package/dist/mcp/notifications.js +356 -0
  697. package/dist/mcp/notifications.js.map +1 -0
  698. package/dist/mcp/protocol.d.ts +516 -0
  699. package/dist/mcp/protocol.d.ts.map +1 -0
  700. package/dist/mcp/protocol.js +490 -0
  701. package/dist/mcp/protocol.js.map +1 -0
  702. package/dist/mcp/resources.d.ts +197 -0
  703. package/dist/mcp/resources.d.ts.map +1 -0
  704. package/dist/mcp/resources.js +432 -0
  705. package/dist/mcp/resources.js.map +1 -0
  706. package/dist/mcp/roots.d.ts +149 -0
  707. package/dist/mcp/roots.d.ts.map +1 -0
  708. package/dist/mcp/roots.js +368 -0
  709. package/dist/mcp/roots.js.map +1 -0
  710. package/dist/mcp/sampling.d.ts +170 -0
  711. package/dist/mcp/sampling.d.ts.map +1 -0
  712. package/dist/mcp/sampling.js +373 -0
  713. package/dist/mcp/sampling.js.map +1 -0
  714. package/dist/mcp/tools.d.ts +347 -0
  715. package/dist/mcp/tools.d.ts.map +1 -0
  716. package/dist/mcp/tools.js +773 -0
  717. package/dist/mcp/tools.js.map +1 -0
  718. package/dist/mcp/websocket-connection.d.ts +164 -0
  719. package/dist/mcp/websocket-connection.d.ts.map +1 -0
  720. package/dist/mcp/websocket-connection.js +503 -0
  721. package/dist/mcp/websocket-connection.js.map +1 -0
  722. package/dist/mcp-cli.d.ts +26 -0
  723. package/dist/mcp-cli.d.ts.map +1 -0
  724. package/dist/mcp-cli.js +366 -0
  725. package/dist/mcp-cli.js.map +1 -0
  726. package/dist/media/image.d.ts +91 -0
  727. package/dist/media/image.d.ts.map +1 -0
  728. package/dist/media/image.js +400 -0
  729. package/dist/media/image.js.map +1 -0
  730. package/dist/media/index.d.ts +66 -0
  731. package/dist/media/index.d.ts.map +1 -0
  732. package/dist/media/index.js +122 -0
  733. package/dist/media/index.js.map +1 -0
  734. package/dist/media/mime.d.ts +23 -0
  735. package/dist/media/mime.d.ts.map +1 -0
  736. package/dist/media/mime.js +110 -0
  737. package/dist/media/mime.js.map +1 -0
  738. package/dist/media/office.d.ts +93 -0
  739. package/dist/media/office.d.ts.map +1 -0
  740. package/dist/media/office.js +735 -0
  741. package/dist/media/office.js.map +1 -0
  742. package/dist/media/pdf.d.ts +132 -0
  743. package/dist/media/pdf.d.ts.map +1 -0
  744. package/dist/media/pdf.js +281 -0
  745. package/dist/media/pdf.js.map +1 -0
  746. package/dist/media/svg.d.ts +55 -0
  747. package/dist/media/svg.d.ts.map +1 -0
  748. package/dist/media/svg.js +217 -0
  749. package/dist/media/svg.js.map +1 -0
  750. package/dist/memory/embedding-cache.d.ts +40 -0
  751. package/dist/memory/embedding-cache.d.ts.map +1 -0
  752. package/dist/memory/embedding-cache.js +105 -0
  753. package/dist/memory/embedding-cache.js.map +1 -0
  754. package/dist/memory/embedding-provider.d.ts +36 -0
  755. package/dist/memory/embedding-provider.d.ts.map +1 -0
  756. package/dist/memory/embedding-provider.js +105 -0
  757. package/dist/memory/embedding-provider.js.map +1 -0
  758. package/dist/memory/hybrid-search.d.ts +58 -0
  759. package/dist/memory/hybrid-search.d.ts.map +1 -0
  760. package/dist/memory/hybrid-search.js +68 -0
  761. package/dist/memory/hybrid-search.js.map +1 -0
  762. package/dist/memory/index.d.ts +15 -0
  763. package/dist/memory/index.d.ts.map +1 -0
  764. package/dist/memory/index.js +12 -0
  765. package/dist/memory/index.js.map +1 -0
  766. package/dist/memory/long-term-store.d.ts +131 -0
  767. package/dist/memory/long-term-store.d.ts.map +1 -0
  768. package/dist/memory/long-term-store.js +701 -0
  769. package/dist/memory/long-term-store.js.map +1 -0
  770. package/dist/memory/memory-search.d.ts +134 -0
  771. package/dist/memory/memory-search.d.ts.map +1 -0
  772. package/dist/memory/memory-search.js +338 -0
  773. package/dist/memory/memory-search.js.map +1 -0
  774. package/dist/memory/memory-sync.d.ts +66 -0
  775. package/dist/memory/memory-sync.d.ts.map +1 -0
  776. package/dist/memory/memory-sync.js +429 -0
  777. package/dist/memory/memory-sync.js.map +1 -0
  778. package/dist/memory/mmr.d.ts +34 -0
  779. package/dist/memory/mmr.d.ts.map +1 -0
  780. package/dist/memory/mmr.js +101 -0
  781. package/dist/memory/mmr.js.map +1 -0
  782. package/dist/memory/notebook.d.ts +80 -0
  783. package/dist/memory/notebook.d.ts.map +1 -0
  784. package/dist/memory/notebook.js +320 -0
  785. package/dist/memory/notebook.js.map +1 -0
  786. package/dist/memory/query-expansion.d.ts +22 -0
  787. package/dist/memory/query-expansion.d.ts.map +1 -0
  788. package/dist/memory/query-expansion.js +60 -0
  789. package/dist/memory/query-expansion.js.map +1 -0
  790. package/dist/memory/types.d.ts +16 -0
  791. package/dist/memory/types.d.ts.map +1 -0
  792. package/dist/memory/types.js +5 -0
  793. package/dist/memory/types.js.map +1 -0
  794. package/dist/models/config.d.ts +85 -0
  795. package/dist/models/config.d.ts.map +1 -0
  796. package/dist/models/config.js +427 -0
  797. package/dist/models/config.js.map +1 -0
  798. package/dist/models/fallback.d.ts +80 -0
  799. package/dist/models/fallback.d.ts.map +1 -0
  800. package/dist/models/fallback.js +215 -0
  801. package/dist/models/fallback.js.map +1 -0
  802. package/dist/models/index.d.ts +12 -0
  803. package/dist/models/index.d.ts.map +1 -0
  804. package/dist/models/index.js +11 -0
  805. package/dist/models/index.js.map +1 -0
  806. package/dist/models/quota.d.ts +121 -0
  807. package/dist/models/quota.d.ts.map +1 -0
  808. package/dist/models/quota.js +397 -0
  809. package/dist/models/quota.js.map +1 -0
  810. package/dist/models/stats.d.ts +96 -0
  811. package/dist/models/stats.d.ts.map +1 -0
  812. package/dist/models/stats.js +224 -0
  813. package/dist/models/stats.js.map +1 -0
  814. package/dist/models/subagent-config.d.ts +119 -0
  815. package/dist/models/subagent-config.d.ts.map +1 -0
  816. package/dist/models/subagent-config.js +267 -0
  817. package/dist/models/subagent-config.js.map +1 -0
  818. package/dist/models/thinking.d.ts +102 -0
  819. package/dist/models/thinking.d.ts.map +1 -0
  820. package/dist/models/thinking.js +213 -0
  821. package/dist/models/thinking.js.map +1 -0
  822. package/dist/models/types.d.ts +250 -0
  823. package/dist/models/types.d.ts.map +1 -0
  824. package/dist/models/types.js +33 -0
  825. package/dist/models/types.js.map +1 -0
  826. package/dist/network/audit-log.d.ts +93 -0
  827. package/dist/network/audit-log.d.ts.map +1 -0
  828. package/dist/network/audit-log.js +319 -0
  829. package/dist/network/audit-log.js.map +1 -0
  830. package/dist/network/discovery.d.ts +91 -0
  831. package/dist/network/discovery.d.ts.map +1 -0
  832. package/dist/network/discovery.js +398 -0
  833. package/dist/network/discovery.js.map +1 -0
  834. package/dist/network/global-proxy.d.ts +19 -0
  835. package/dist/network/global-proxy.d.ts.map +1 -0
  836. package/dist/network/global-proxy.js +81 -0
  837. package/dist/network/global-proxy.js.map +1 -0
  838. package/dist/network/identity.d.ts +58 -0
  839. package/dist/network/identity.d.ts.map +1 -0
  840. package/dist/network/identity.js +267 -0
  841. package/dist/network/identity.js.map +1 -0
  842. package/dist/network/index.d.ts +153 -0
  843. package/dist/network/index.d.ts.map +1 -0
  844. package/dist/network/index.js +916 -0
  845. package/dist/network/index.js.map +1 -0
  846. package/dist/network/permission.d.ts +60 -0
  847. package/dist/network/permission.d.ts.map +1 -0
  848. package/dist/network/permission.js +124 -0
  849. package/dist/network/permission.js.map +1 -0
  850. package/dist/network/project-probe.d.ts +12 -0
  851. package/dist/network/project-probe.d.ts.map +1 -0
  852. package/dist/network/project-probe.js +74 -0
  853. package/dist/network/project-probe.js.map +1 -0
  854. package/dist/network/protocol.d.ts +59 -0
  855. package/dist/network/protocol.d.ts.map +1 -0
  856. package/dist/network/protocol.js +158 -0
  857. package/dist/network/protocol.js.map +1 -0
  858. package/dist/network/proxy.d.ts +93 -0
  859. package/dist/network/proxy.d.ts.map +1 -0
  860. package/dist/network/proxy.js +228 -0
  861. package/dist/network/proxy.js.map +1 -0
  862. package/dist/network/retry.d.ts +44 -0
  863. package/dist/network/retry.d.ts.map +1 -0
  864. package/dist/network/retry.js +110 -0
  865. package/dist/network/retry.js.map +1 -0
  866. package/dist/network/router.d.ts +36 -0
  867. package/dist/network/router.d.ts.map +1 -0
  868. package/dist/network/router.js +73 -0
  869. package/dist/network/router.js.map +1 -0
  870. package/dist/network/timeout.d.ts +59 -0
  871. package/dist/network/timeout.d.ts.map +1 -0
  872. package/dist/network/timeout.js +120 -0
  873. package/dist/network/timeout.js.map +1 -0
  874. package/dist/network/transport.d.ts +97 -0
  875. package/dist/network/transport.d.ts.map +1 -0
  876. package/dist/network/transport.js +397 -0
  877. package/dist/network/transport.js.map +1 -0
  878. package/dist/network/types.d.ts +282 -0
  879. package/dist/network/types.d.ts.map +1 -0
  880. package/dist/network/types.js +31 -0
  881. package/dist/network/types.js.map +1 -0
  882. package/dist/notifications/index.d.ts +161 -0
  883. package/dist/notifications/index.d.ts.map +1 -0
  884. package/dist/notifications/index.js +341 -0
  885. package/dist/notifications/index.js.map +1 -0
  886. package/dist/organization/index.d.ts +125 -0
  887. package/dist/organization/index.d.ts.map +1 -0
  888. package/dist/organization/index.js +237 -0
  889. package/dist/organization/index.js.map +1 -0
  890. package/dist/permissions/elevated-commands.d.ts +38 -0
  891. package/dist/permissions/elevated-commands.d.ts.map +1 -0
  892. package/dist/permissions/elevated-commands.js +256 -0
  893. package/dist/permissions/elevated-commands.js.map +1 -0
  894. package/dist/permissions/index.d.ts +120 -0
  895. package/dist/permissions/index.d.ts.map +1 -0
  896. package/dist/permissions/index.js +689 -0
  897. package/dist/permissions/index.js.map +1 -0
  898. package/dist/permissions/rule-parser.d.ts +396 -0
  899. package/dist/permissions/rule-parser.d.ts.map +1 -0
  900. package/dist/permissions/rule-parser.js +990 -0
  901. package/dist/permissions/rule-parser.js.map +1 -0
  902. package/dist/permissions/rule-parser.test.d.ts +15 -0
  903. package/dist/permissions/rule-parser.test.d.ts.map +1 -0
  904. package/dist/permissions/rule-parser.test.js +489 -0
  905. package/dist/permissions/rule-parser.test.js.map +1 -0
  906. package/dist/permissions/shell-security.d.ts +128 -0
  907. package/dist/permissions/shell-security.d.ts.map +1 -0
  908. package/dist/permissions/shell-security.js +669 -0
  909. package/dist/permissions/shell-security.js.map +1 -0
  910. package/dist/permissions/shell-security.test.d.ts +7 -0
  911. package/dist/permissions/shell-security.test.d.ts.map +1 -0
  912. package/dist/permissions/shell-security.test.js +286 -0
  913. package/dist/permissions/shell-security.test.js.map +1 -0
  914. package/dist/permissions/tools.d.ts +255 -0
  915. package/dist/permissions/tools.d.ts.map +1 -0
  916. package/dist/permissions/tools.js +733 -0
  917. package/dist/permissions/tools.js.map +1 -0
  918. package/dist/permissions/tools.test.d.ts +11 -0
  919. package/dist/permissions/tools.test.d.ts.map +1 -0
  920. package/dist/permissions/tools.test.js +530 -0
  921. package/dist/permissions/tools.test.js.map +1 -0
  922. package/dist/permissions/ui-integration.d.ts +69 -0
  923. package/dist/permissions/ui-integration.d.ts.map +1 -0
  924. package/dist/permissions/ui-integration.js +129 -0
  925. package/dist/permissions/ui-integration.js.map +1 -0
  926. package/dist/permissions/ui.d.ts +188 -0
  927. package/dist/permissions/ui.d.ts.map +1 -0
  928. package/dist/permissions/ui.js +590 -0
  929. package/dist/permissions/ui.js.map +1 -0
  930. package/dist/plan/comparison.d.ts +67 -0
  931. package/dist/plan/comparison.d.ts.map +1 -0
  932. package/dist/plan/comparison.js +451 -0
  933. package/dist/plan/comparison.js.map +1 -0
  934. package/dist/plan/index.d.ts +91 -0
  935. package/dist/plan/index.d.ts.map +1 -0
  936. package/dist/plan/index.js +151 -0
  937. package/dist/plan/index.js.map +1 -0
  938. package/dist/plan/persistence.d.ts +131 -0
  939. package/dist/plan/persistence.d.ts.map +1 -0
  940. package/dist/plan/persistence.js +781 -0
  941. package/dist/plan/persistence.js.map +1 -0
  942. package/dist/plan/types.d.ts +353 -0
  943. package/dist/plan/types.d.ts.map +1 -0
  944. package/dist/plan/types.js +6 -0
  945. package/dist/plan/types.js.map +1 -0
  946. package/dist/plugins/cli.d.ts +14 -0
  947. package/dist/plugins/cli.d.ts.map +1 -0
  948. package/dist/plugins/cli.js +1050 -0
  949. package/dist/plugins/cli.js.map +1 -0
  950. package/dist/plugins/index.d.ts +621 -0
  951. package/dist/plugins/index.d.ts.map +1 -0
  952. package/dist/plugins/index.js +1978 -0
  953. package/dist/plugins/index.js.map +1 -0
  954. package/dist/plugins/marketplace.d.ts +120 -0
  955. package/dist/plugins/marketplace.d.ts.map +1 -0
  956. package/dist/plugins/marketplace.js +630 -0
  957. package/dist/plugins/marketplace.js.map +1 -0
  958. package/dist/prompt/attachments.d.ts +94 -0
  959. package/dist/prompt/attachments.d.ts.map +1 -0
  960. package/dist/prompt/attachments.js +486 -0
  961. package/dist/prompt/attachments.js.map +1 -0
  962. package/dist/prompt/builder.d.ts +45 -0
  963. package/dist/prompt/builder.d.ts.map +1 -0
  964. package/dist/prompt/builder.js +298 -0
  965. package/dist/prompt/builder.js.map +1 -0
  966. package/dist/prompt/cache.d.ts +71 -0
  967. package/dist/prompt/cache.d.ts.map +1 -0
  968. package/dist/prompt/cache.js +150 -0
  969. package/dist/prompt/cache.js.map +1 -0
  970. package/dist/prompt/index.d.ts +10 -0
  971. package/dist/prompt/index.d.ts.map +1 -0
  972. package/dist/prompt/index.js +9 -0
  973. package/dist/prompt/index.js.map +1 -0
  974. package/dist/prompt/templates.d.ts +216 -0
  975. package/dist/prompt/templates.d.ts.map +1 -0
  976. package/dist/prompt/templates.js +670 -0
  977. package/dist/prompt/templates.js.map +1 -0
  978. package/dist/prompt/types.d.ts +234 -0
  979. package/dist/prompt/types.d.ts.map +1 -0
  980. package/dist/prompt/types.js +19 -0
  981. package/dist/prompt/types.js.map +1 -0
  982. package/dist/providers/cli.d.ts +14 -0
  983. package/dist/providers/cli.d.ts.map +1 -0
  984. package/dist/providers/cli.js +466 -0
  985. package/dist/providers/cli.js.map +1 -0
  986. package/dist/providers/index.d.ts +128 -0
  987. package/dist/providers/index.d.ts.map +1 -0
  988. package/dist/providers/index.js +662 -0
  989. package/dist/providers/index.js.map +1 -0
  990. package/dist/providers/vertex.d.ts +174 -0
  991. package/dist/providers/vertex.d.ts.map +1 -0
  992. package/dist/providers/vertex.js +499 -0
  993. package/dist/providers/vertex.js.map +1 -0
  994. package/dist/proxy/ollama-adapter.d.ts +41 -0
  995. package/dist/proxy/ollama-adapter.d.ts.map +1 -0
  996. package/dist/proxy/ollama-adapter.js +669 -0
  997. package/dist/proxy/ollama-adapter.js.map +1 -0
  998. package/dist/proxy/server.d.ts +63 -0
  999. package/dist/proxy/server.d.ts.map +1 -0
  1000. package/dist/proxy/server.js +1160 -0
  1001. package/dist/proxy/server.js.map +1 -0
  1002. package/dist/proxy-cli.d.ts +19 -0
  1003. package/dist/proxy-cli.d.ts.map +1 -0
  1004. package/dist/proxy-cli.js +308 -0
  1005. package/dist/proxy-cli.js.map +1 -0
  1006. package/dist/ratelimit/index.d.ts +252 -0
  1007. package/dist/ratelimit/index.d.ts.map +1 -0
  1008. package/dist/ratelimit/index.js +580 -0
  1009. package/dist/ratelimit/index.js.map +1 -0
  1010. package/dist/renderer/index.d.ts +75 -0
  1011. package/dist/renderer/index.d.ts.map +1 -0
  1012. package/dist/renderer/index.js +383 -0
  1013. package/dist/renderer/index.js.map +1 -0
  1014. package/dist/renderer/tree-render.d.ts +172 -0
  1015. package/dist/renderer/tree-render.d.ts.map +1 -0
  1016. package/dist/renderer/tree-render.js +397 -0
  1017. package/dist/renderer/tree-render.js.map +1 -0
  1018. package/dist/rewind/fileHistory.d.ts +140 -0
  1019. package/dist/rewind/fileHistory.d.ts.map +1 -0
  1020. package/dist/rewind/fileHistory.js +326 -0
  1021. package/dist/rewind/fileHistory.js.map +1 -0
  1022. package/dist/rewind/index.d.ts +8 -0
  1023. package/dist/rewind/index.d.ts.map +1 -0
  1024. package/dist/rewind/index.js +8 -0
  1025. package/dist/rewind/index.js.map +1 -0
  1026. package/dist/rewind/rewindManager.d.ts +98 -0
  1027. package/dist/rewind/rewindManager.d.ts.map +1 -0
  1028. package/dist/rewind/rewindManager.js +199 -0
  1029. package/dist/rewind/rewindManager.js.map +1 -0
  1030. package/dist/rules/index.d.ts +69 -0
  1031. package/dist/rules/index.d.ts.map +1 -0
  1032. package/dist/rules/index.js +410 -0
  1033. package/dist/rules/index.js.map +1 -0
  1034. package/dist/sandbox/bubblewrap.d.ts +157 -0
  1035. package/dist/sandbox/bubblewrap.d.ts.map +1 -0
  1036. package/dist/sandbox/bubblewrap.js +637 -0
  1037. package/dist/sandbox/bubblewrap.js.map +1 -0
  1038. package/dist/sandbox/config.d.ts +497 -0
  1039. package/dist/sandbox/config.d.ts.map +1 -0
  1040. package/dist/sandbox/config.js +696 -0
  1041. package/dist/sandbox/config.js.map +1 -0
  1042. package/dist/sandbox/docker.d.ts +104 -0
  1043. package/dist/sandbox/docker.d.ts.map +1 -0
  1044. package/dist/sandbox/docker.js +347 -0
  1045. package/dist/sandbox/docker.js.map +1 -0
  1046. package/dist/sandbox/executor.d.ts +68 -0
  1047. package/dist/sandbox/executor.d.ts.map +1 -0
  1048. package/dist/sandbox/executor.js +341 -0
  1049. package/dist/sandbox/executor.js.map +1 -0
  1050. package/dist/sandbox/filesystem.d.ts +146 -0
  1051. package/dist/sandbox/filesystem.d.ts.map +1 -0
  1052. package/dist/sandbox/filesystem.js +501 -0
  1053. package/dist/sandbox/filesystem.js.map +1 -0
  1054. package/dist/sandbox/index.d.ts +21 -0
  1055. package/dist/sandbox/index.d.ts.map +1 -0
  1056. package/dist/sandbox/index.js +21 -0
  1057. package/dist/sandbox/index.js.map +1 -0
  1058. package/dist/sandbox/network.d.ts +174 -0
  1059. package/dist/sandbox/network.d.ts.map +1 -0
  1060. package/dist/sandbox/network.js +487 -0
  1061. package/dist/sandbox/network.js.map +1 -0
  1062. package/dist/sandbox/resource-limits.d.ts +83 -0
  1063. package/dist/sandbox/resource-limits.d.ts.map +1 -0
  1064. package/dist/sandbox/resource-limits.js +305 -0
  1065. package/dist/sandbox/resource-limits.js.map +1 -0
  1066. package/dist/sandbox/seatbelt.d.ts +70 -0
  1067. package/dist/sandbox/seatbelt.d.ts.map +1 -0
  1068. package/dist/sandbox/seatbelt.js +256 -0
  1069. package/dist/sandbox/seatbelt.js.map +1 -0
  1070. package/dist/search/ripgrep.d.ts +82 -0
  1071. package/dist/search/ripgrep.d.ts.map +1 -0
  1072. package/dist/search/ripgrep.js +399 -0
  1073. package/dist/search/ripgrep.js.map +1 -0
  1074. package/dist/security/skill-scanner.d.ts +18 -0
  1075. package/dist/security/skill-scanner.d.ts.map +1 -0
  1076. package/dist/security/skill-scanner.js +115 -0
  1077. package/dist/security/skill-scanner.js.map +1 -0
  1078. package/dist/session/cleanup.d.ts +62 -0
  1079. package/dist/session/cleanup.d.ts.map +1 -0
  1080. package/dist/session/cleanup.js +218 -0
  1081. package/dist/session/cleanup.js.map +1 -0
  1082. package/dist/session/index.d.ts +584 -0
  1083. package/dist/session/index.d.ts.map +1 -0
  1084. package/dist/session/index.js +1910 -0
  1085. package/dist/session/index.js.map +1 -0
  1086. package/dist/session/list.d.ts +150 -0
  1087. package/dist/session/list.d.ts.map +1 -0
  1088. package/dist/session/list.js +807 -0
  1089. package/dist/session/list.js.map +1 -0
  1090. package/dist/session/resume.d.ts +103 -0
  1091. package/dist/session/resume.d.ts.map +1 -0
  1092. package/dist/session/resume.js +173 -0
  1093. package/dist/session/resume.js.map +1 -0
  1094. package/dist/skills/builtin/skill-hub/SKILL.md +51 -0
  1095. package/dist/skills/builtin/tool-discovery/SKILL.md +194 -0
  1096. package/dist/skills/hub.d.ts +54 -0
  1097. package/dist/skills/hub.d.ts.map +1 -0
  1098. package/dist/skills/hub.js +251 -0
  1099. package/dist/skills/hub.js.map +1 -0
  1100. package/dist/streaming/index.d.ts +115 -0
  1101. package/dist/streaming/index.d.ts.map +1 -0
  1102. package/dist/streaming/index.js +249 -0
  1103. package/dist/streaming/index.js.map +1 -0
  1104. package/dist/streaming/message-stream.d.ts +237 -0
  1105. package/dist/streaming/message-stream.d.ts.map +1 -0
  1106. package/dist/streaming/message-stream.js +480 -0
  1107. package/dist/streaming/message-stream.js.map +1 -0
  1108. package/dist/streaming/sse.d.ts +94 -0
  1109. package/dist/streaming/sse.d.ts.map +1 -0
  1110. package/dist/streaming/sse.js +314 -0
  1111. package/dist/streaming/sse.js.map +1 -0
  1112. package/dist/teams/index.d.ts +7 -0
  1113. package/dist/teams/index.d.ts.map +1 -0
  1114. package/dist/teams/index.js +7 -0
  1115. package/dist/teams/index.js.map +1 -0
  1116. package/dist/teams/storage.d.ts +94 -0
  1117. package/dist/teams/storage.d.ts.map +1 -0
  1118. package/dist/teams/storage.js +350 -0
  1119. package/dist/teams/storage.js.map +1 -0
  1120. package/dist/teams/tmux.d.ts +122 -0
  1121. package/dist/teams/tmux.d.ts.map +1 -0
  1122. package/dist/teams/tmux.js +419 -0
  1123. package/dist/teams/tmux.js.map +1 -0
  1124. package/dist/teams/types.d.ts +139 -0
  1125. package/dist/teams/types.d.ts.map +1 -0
  1126. package/dist/teams/types.js +8 -0
  1127. package/dist/teams/types.js.map +1 -0
  1128. package/dist/telemetry/index.d.ts +215 -0
  1129. package/dist/telemetry/index.d.ts.map +1 -0
  1130. package/dist/telemetry/index.js +776 -0
  1131. package/dist/telemetry/index.js.map +1 -0
  1132. package/dist/teleport/index.d.ts +43 -0
  1133. package/dist/teleport/index.d.ts.map +1 -0
  1134. package/dist/teleport/index.js +71 -0
  1135. package/dist/teleport/index.js.map +1 -0
  1136. package/dist/teleport/session.d.ts +78 -0
  1137. package/dist/teleport/session.d.ts.map +1 -0
  1138. package/dist/teleport/session.js +273 -0
  1139. package/dist/teleport/session.js.map +1 -0
  1140. package/dist/teleport/types.d.ts +93 -0
  1141. package/dist/teleport/types.d.ts.map +1 -0
  1142. package/dist/teleport/types.js +6 -0
  1143. package/dist/teleport/types.js.map +1 -0
  1144. package/dist/teleport/validation.d.ts +30 -0
  1145. package/dist/teleport/validation.d.ts.map +1 -0
  1146. package/dist/teleport/validation.js +124 -0
  1147. package/dist/teleport/validation.js.map +1 -0
  1148. package/dist/tools/agent-teams.d.ts +26 -0
  1149. package/dist/tools/agent-teams.d.ts.map +1 -0
  1150. package/dist/tools/agent-teams.js +171 -0
  1151. package/dist/tools/agent-teams.js.map +1 -0
  1152. package/dist/tools/agent.d.ts +223 -0
  1153. package/dist/tools/agent.d.ts.map +1 -0
  1154. package/dist/tools/agent.js +1540 -0
  1155. package/dist/tools/agent.js.map +1 -0
  1156. package/dist/tools/ask.d.ts +87 -0
  1157. package/dist/tools/ask.d.ts.map +1 -0
  1158. package/dist/tools/ask.js +572 -0
  1159. package/dist/tools/ask.js.map +1 -0
  1160. package/dist/tools/base.d.ts +89 -0
  1161. package/dist/tools/base.d.ts.map +1 -0
  1162. package/dist/tools/base.js +199 -0
  1163. package/dist/tools/base.js.map +1 -0
  1164. package/dist/tools/bash-history.d.ts +83 -0
  1165. package/dist/tools/bash-history.d.ts.map +1 -0
  1166. package/dist/tools/bash-history.js +245 -0
  1167. package/dist/tools/bash-history.js.map +1 -0
  1168. package/dist/tools/bash.d.ts +214 -0
  1169. package/dist/tools/bash.d.ts.map +1 -0
  1170. package/dist/tools/bash.js +1823 -0
  1171. package/dist/tools/bash.js.map +1 -0
  1172. package/dist/tools/blueprint.d.ts +91 -0
  1173. package/dist/tools/blueprint.d.ts.map +1 -0
  1174. package/dist/tools/blueprint.js +618 -0
  1175. package/dist/tools/blueprint.js.map +1 -0
  1176. package/dist/tools/browser.d.ts +28 -0
  1177. package/dist/tools/browser.d.ts.map +1 -0
  1178. package/dist/tools/browser.js +776 -0
  1179. package/dist/tools/browser.js.map +1 -0
  1180. package/dist/tools/create-tool.d.ts +63 -0
  1181. package/dist/tools/create-tool.d.ts.map +1 -0
  1182. package/dist/tools/create-tool.js +230 -0
  1183. package/dist/tools/create-tool.js.map +1 -0
  1184. package/dist/tools/database.d.ts +12 -0
  1185. package/dist/tools/database.d.ts.map +1 -0
  1186. package/dist/tools/database.js +223 -0
  1187. package/dist/tools/database.js.map +1 -0
  1188. package/dist/tools/dispatch-worker.d.ts +46 -0
  1189. package/dist/tools/dispatch-worker.d.ts.map +1 -0
  1190. package/dist/tools/dispatch-worker.js +276 -0
  1191. package/dist/tools/dispatch-worker.js.map +1 -0
  1192. package/dist/tools/ear.d.ts +25 -0
  1193. package/dist/tools/ear.d.ts.map +1 -0
  1194. package/dist/tools/ear.js +43 -0
  1195. package/dist/tools/ear.js.map +1 -0
  1196. package/dist/tools/eye.d.ts +29 -0
  1197. package/dist/tools/eye.d.ts.map +1 -0
  1198. package/dist/tools/eye.js +104 -0
  1199. package/dist/tools/eye.js.map +1 -0
  1200. package/dist/tools/file.d.ts +164 -0
  1201. package/dist/tools/file.d.ts.map +1 -0
  1202. package/dist/tools/file.js +1638 -0
  1203. package/dist/tools/file.js.map +1 -0
  1204. package/dist/tools/generate-blueprint.d.ts +62 -0
  1205. package/dist/tools/generate-blueprint.d.ts.map +1 -0
  1206. package/dist/tools/generate-blueprint.js +141 -0
  1207. package/dist/tools/generate-blueprint.js.map +1 -0
  1208. package/dist/tools/generate-design.d.ts +27 -0
  1209. package/dist/tools/generate-design.d.ts.map +1 -0
  1210. package/dist/tools/generate-design.js +66 -0
  1211. package/dist/tools/generate-design.js.map +1 -0
  1212. package/dist/tools/goal.d.ts +56 -0
  1213. package/dist/tools/goal.d.ts.map +1 -0
  1214. package/dist/tools/goal.js +298 -0
  1215. package/dist/tools/goal.js.map +1 -0
  1216. package/dist/tools/index.d.ts +53 -0
  1217. package/dist/tools/index.d.ts.map +1 -0
  1218. package/dist/tools/index.js +183 -0
  1219. package/dist/tools/index.js.map +1 -0
  1220. package/dist/tools/mcp-manage.d.ts +32 -0
  1221. package/dist/tools/mcp-manage.d.ts.map +1 -0
  1222. package/dist/tools/mcp-manage.js +61 -0
  1223. package/dist/tools/mcp-manage.js.map +1 -0
  1224. package/dist/tools/mcp.d.ts +311 -0
  1225. package/dist/tools/mcp.d.ts.map +1 -0
  1226. package/dist/tools/mcp.js +1696 -0
  1227. package/dist/tools/mcp.js.map +1 -0
  1228. package/dist/tools/memory-search.d.ts +26 -0
  1229. package/dist/tools/memory-search.d.ts.map +1 -0
  1230. package/dist/tools/memory-search.js +89 -0
  1231. package/dist/tools/memory-search.js.map +1 -0
  1232. package/dist/tools/network-agent.d.ts +55 -0
  1233. package/dist/tools/network-agent.d.ts.map +1 -0
  1234. package/dist/tools/network-agent.js +349 -0
  1235. package/dist/tools/network-agent.js.map +1 -0
  1236. package/dist/tools/notebook-write.d.ts +23 -0
  1237. package/dist/tools/notebook-write.d.ts.map +1 -0
  1238. package/dist/tools/notebook-write.js +86 -0
  1239. package/dist/tools/notebook-write.js.map +1 -0
  1240. package/dist/tools/notebook.d.ts +46 -0
  1241. package/dist/tools/notebook.d.ts.map +1 -0
  1242. package/dist/tools/notebook.js +335 -0
  1243. package/dist/tools/notebook.js.map +1 -0
  1244. package/dist/tools/output-persistence.d.ts +73 -0
  1245. package/dist/tools/output-persistence.d.ts.map +1 -0
  1246. package/dist/tools/output-persistence.js +258 -0
  1247. package/dist/tools/output-persistence.js.map +1 -0
  1248. package/dist/tools/planmode.d.ts +73 -0
  1249. package/dist/tools/planmode.d.ts.map +1 -0
  1250. package/dist/tools/planmode.js +464 -0
  1251. package/dist/tools/planmode.js.map +1 -0
  1252. package/dist/tools/sandbox.d.ts +192 -0
  1253. package/dist/tools/sandbox.d.ts.map +1 -0
  1254. package/dist/tools/sandbox.js +932 -0
  1255. package/dist/tools/sandbox.js.map +1 -0
  1256. package/dist/tools/schedule.d.ts +65 -0
  1257. package/dist/tools/schedule.d.ts.map +1 -0
  1258. package/dist/tools/schedule.js +537 -0
  1259. package/dist/tools/schedule.js.map +1 -0
  1260. package/dist/tools/search.d.ts +48 -0
  1261. package/dist/tools/search.d.ts.map +1 -0
  1262. package/dist/tools/search.js +568 -0
  1263. package/dist/tools/search.js.map +1 -0
  1264. package/dist/tools/self-evolve.d.ts +53 -0
  1265. package/dist/tools/self-evolve.d.ts.map +1 -0
  1266. package/dist/tools/self-evolve.js +241 -0
  1267. package/dist/tools/self-evolve.js.map +1 -0
  1268. package/dist/tools/skill.d.ts +182 -0
  1269. package/dist/tools/skill.d.ts.map +1 -0
  1270. package/dist/tools/skill.js +1274 -0
  1271. package/dist/tools/skill.js.map +1 -0
  1272. package/dist/tools/start-lead-agent.d.ts +103 -0
  1273. package/dist/tools/start-lead-agent.d.ts.map +1 -0
  1274. package/dist/tools/start-lead-agent.js +243 -0
  1275. package/dist/tools/start-lead-agent.js.map +1 -0
  1276. package/dist/tools/structured-output.d.ts +80 -0
  1277. package/dist/tools/structured-output.d.ts.map +1 -0
  1278. package/dist/tools/structured-output.js +113 -0
  1279. package/dist/tools/structured-output.js.map +1 -0
  1280. package/dist/tools/submit-e2e-result.d.ts +57 -0
  1281. package/dist/tools/submit-e2e-result.d.ts.map +1 -0
  1282. package/dist/tools/submit-e2e-result.js +161 -0
  1283. package/dist/tools/submit-e2e-result.js.map +1 -0
  1284. package/dist/tools/submit-review.d.ts +42 -0
  1285. package/dist/tools/submit-review.d.ts.map +1 -0
  1286. package/dist/tools/submit-review.js +122 -0
  1287. package/dist/tools/submit-review.js.map +1 -0
  1288. package/dist/tools/task-status.d.ts +33 -0
  1289. package/dist/tools/task-status.d.ts.map +1 -0
  1290. package/dist/tools/task-status.js +86 -0
  1291. package/dist/tools/task-status.js.map +1 -0
  1292. package/dist/tools/task-storage.d.ts +165 -0
  1293. package/dist/tools/task-storage.d.ts.map +1 -0
  1294. package/dist/tools/task-storage.js +354 -0
  1295. package/dist/tools/task-storage.js.map +1 -0
  1296. package/dist/tools/task-v2.d.ts +38 -0
  1297. package/dist/tools/task-v2.d.ts.map +1 -0
  1298. package/dist/tools/task-v2.js +472 -0
  1299. package/dist/tools/task-v2.js.map +1 -0
  1300. package/dist/tools/team.d.ts +51 -0
  1301. package/dist/tools/team.d.ts.map +1 -0
  1302. package/dist/tools/team.js +441 -0
  1303. package/dist/tools/team.js.map +1 -0
  1304. package/dist/tools/todo.d.ts +30 -0
  1305. package/dist/tools/todo.d.ts.map +1 -0
  1306. package/dist/tools/todo.js +204 -0
  1307. package/dist/tools/todo.js.map +1 -0
  1308. package/dist/tools/trigger-e2e-test.d.ts +62 -0
  1309. package/dist/tools/trigger-e2e-test.d.ts.map +1 -0
  1310. package/dist/tools/trigger-e2e-test.js +228 -0
  1311. package/dist/tools/trigger-e2e-test.js.map +1 -0
  1312. package/dist/tools/update-task-plan.d.ts +43 -0
  1313. package/dist/tools/update-task-plan.d.ts.map +1 -0
  1314. package/dist/tools/update-task-plan.js +214 -0
  1315. package/dist/tools/update-task-plan.js.map +1 -0
  1316. package/dist/tools/web.d.ts +78 -0
  1317. package/dist/tools/web.d.ts.map +1 -0
  1318. package/dist/tools/web.js +535 -0
  1319. package/dist/tools/web.js.map +1 -0
  1320. package/dist/trust/index.d.ts +165 -0
  1321. package/dist/trust/index.d.ts.map +1 -0
  1322. package/dist/trust/index.js +408 -0
  1323. package/dist/trust/index.js.map +1 -0
  1324. package/dist/types/config.d.ts +1259 -0
  1325. package/dist/types/config.d.ts.map +1 -0
  1326. package/dist/types/config.js +245 -0
  1327. package/dist/types/config.js.map +1 -0
  1328. package/dist/types/errors.d.ts +389 -0
  1329. package/dist/types/errors.d.ts.map +1 -0
  1330. package/dist/types/errors.js +670 -0
  1331. package/dist/types/errors.js.map +1 -0
  1332. package/dist/types/index.d.ts +30 -0
  1333. package/dist/types/index.d.ts.map +1 -0
  1334. package/dist/types/index.js +26 -0
  1335. package/dist/types/index.js.map +1 -0
  1336. package/dist/types/messages.d.ts +761 -0
  1337. package/dist/types/messages.d.ts.map +1 -0
  1338. package/dist/types/messages.js +10 -0
  1339. package/dist/types/messages.js.map +1 -0
  1340. package/dist/types/results.d.ts +583 -0
  1341. package/dist/types/results.d.ts.map +1 -0
  1342. package/dist/types/results.js +111 -0
  1343. package/dist/types/results.js.map +1 -0
  1344. package/dist/types/tools.d.ts +734 -0
  1345. package/dist/types/tools.d.ts.map +1 -0
  1346. package/dist/types/tools.js +9 -0
  1347. package/dist/types/tools.js.map +1 -0
  1348. package/dist/ui/App.d.ts +17 -0
  1349. package/dist/ui/App.d.ts.map +1 -0
  1350. package/dist/ui/App.js +977 -0
  1351. package/dist/ui/App.js.map +1 -0
  1352. package/dist/ui/ChromeSettings.d.ts +18 -0
  1353. package/dist/ui/ChromeSettings.d.ts.map +1 -0
  1354. package/dist/ui/ChromeSettings.js +224 -0
  1355. package/dist/ui/ChromeSettings.js.map +1 -0
  1356. package/dist/ui/LoginSelector.d.ts +29 -0
  1357. package/dist/ui/LoginSelector.d.ts.map +1 -0
  1358. package/dist/ui/LoginSelector.js +168 -0
  1359. package/dist/ui/LoginSelector.js.map +1 -0
  1360. package/dist/ui/McpSettings.d.ts +29 -0
  1361. package/dist/ui/McpSettings.d.ts.map +1 -0
  1362. package/dist/ui/McpSettings.js +689 -0
  1363. package/dist/ui/McpSettings.js.map +1 -0
  1364. package/dist/ui/PluginsDialog.d.ts +21 -0
  1365. package/dist/ui/PluginsDialog.d.ts.map +1 -0
  1366. package/dist/ui/PluginsDialog.js +923 -0
  1367. package/dist/ui/PluginsDialog.js.map +1 -0
  1368. package/dist/ui/autocomplete/bash-history.d.ts +58 -0
  1369. package/dist/ui/autocomplete/bash-history.d.ts.map +1 -0
  1370. package/dist/ui/autocomplete/bash-history.js +196 -0
  1371. package/dist/ui/autocomplete/bash-history.js.map +1 -0
  1372. package/dist/ui/autocomplete/commands.d.ts +25 -0
  1373. package/dist/ui/autocomplete/commands.d.ts.map +1 -0
  1374. package/dist/ui/autocomplete/commands.js +535 -0
  1375. package/dist/ui/autocomplete/commands.js.map +1 -0
  1376. package/dist/ui/autocomplete/example.d.ts +10 -0
  1377. package/dist/ui/autocomplete/example.d.ts.map +1 -0
  1378. package/dist/ui/autocomplete/example.js +118 -0
  1379. package/dist/ui/autocomplete/example.js.map +1 -0
  1380. package/dist/ui/autocomplete/files.d.ts +27 -0
  1381. package/dist/ui/autocomplete/files.d.ts.map +1 -0
  1382. package/dist/ui/autocomplete/files.js +127 -0
  1383. package/dist/ui/autocomplete/files.js.map +1 -0
  1384. package/dist/ui/autocomplete/index.d.ts +25 -0
  1385. package/dist/ui/autocomplete/index.d.ts.map +1 -0
  1386. package/dist/ui/autocomplete/index.js +85 -0
  1387. package/dist/ui/autocomplete/index.js.map +1 -0
  1388. package/dist/ui/autocomplete/mentions.d.ts +29 -0
  1389. package/dist/ui/autocomplete/mentions.d.ts.map +1 -0
  1390. package/dist/ui/autocomplete/mentions.js +170 -0
  1391. package/dist/ui/autocomplete/mentions.js.map +1 -0
  1392. package/dist/ui/autocomplete/types.d.ts +58 -0
  1393. package/dist/ui/autocomplete/types.d.ts.map +1 -0
  1394. package/dist/ui/autocomplete/types.js +110 -0
  1395. package/dist/ui/autocomplete/types.js.map +1 -0
  1396. package/dist/ui/components/AxonMdImportDialog.d.ts +79 -0
  1397. package/dist/ui/components/AxonMdImportDialog.d.ts.map +1 -0
  1398. package/dist/ui/components/AxonMdImportDialog.js +420 -0
  1399. package/dist/ui/components/AxonMdImportDialog.js.map +1 -0
  1400. package/dist/ui/components/BackgroundTasksPanel.d.ts +16 -0
  1401. package/dist/ui/components/BackgroundTasksPanel.d.ts.map +1 -0
  1402. package/dist/ui/components/BackgroundTasksPanel.js +90 -0
  1403. package/dist/ui/components/BackgroundTasksPanel.js.map +1 -0
  1404. package/dist/ui/components/BreathingLight.d.ts +68 -0
  1405. package/dist/ui/components/BreathingLight.d.ts.map +1 -0
  1406. package/dist/ui/components/BreathingLight.js +110 -0
  1407. package/dist/ui/components/BreathingLight.js.map +1 -0
  1408. package/dist/ui/components/DiffView.d.ts +21 -0
  1409. package/dist/ui/components/DiffView.d.ts.map +1 -0
  1410. package/dist/ui/components/DiffView.js +387 -0
  1411. package/dist/ui/components/DiffView.js.map +1 -0
  1412. package/dist/ui/components/Header.d.ts +38 -0
  1413. package/dist/ui/components/Header.d.ts.map +1 -0
  1414. package/dist/ui/components/Header.js +163 -0
  1415. package/dist/ui/components/Header.js.map +1 -0
  1416. package/dist/ui/components/HistorySearch.d.ts +18 -0
  1417. package/dist/ui/components/HistorySearch.d.ts.map +1 -0
  1418. package/dist/ui/components/HistorySearch.js +59 -0
  1419. package/dist/ui/components/HistorySearch.js.map +1 -0
  1420. package/dist/ui/components/HiveConsole.d.ts +45 -0
  1421. package/dist/ui/components/HiveConsole.d.ts.map +1 -0
  1422. package/dist/ui/components/HiveConsole.js +166 -0
  1423. package/dist/ui/components/HiveConsole.js.map +1 -0
  1424. package/dist/ui/components/HiveConsole.test.d.ts +8 -0
  1425. package/dist/ui/components/HiveConsole.test.d.ts.map +1 -0
  1426. package/dist/ui/components/HiveConsole.test.js +330 -0
  1427. package/dist/ui/components/HiveConsole.test.js.map +1 -0
  1428. package/dist/ui/components/Input.d.ts +25 -0
  1429. package/dist/ui/components/Input.d.ts.map +1 -0
  1430. package/dist/ui/components/Input.js +1097 -0
  1431. package/dist/ui/components/Input.js.map +1 -0
  1432. package/dist/ui/components/Message.d.ts +18 -0
  1433. package/dist/ui/components/Message.d.ts.map +1 -0
  1434. package/dist/ui/components/Message.js +212 -0
  1435. package/dist/ui/components/Message.js.map +1 -0
  1436. package/dist/ui/components/MessageSelector.d.ts +66 -0
  1437. package/dist/ui/components/MessageSelector.d.ts.map +1 -0
  1438. package/dist/ui/components/MessageSelector.js +272 -0
  1439. package/dist/ui/components/MessageSelector.js.map +1 -0
  1440. package/dist/ui/components/ModelSelector.d.ts +27 -0
  1441. package/dist/ui/components/ModelSelector.d.ts.map +1 -0
  1442. package/dist/ui/components/ModelSelector.js +135 -0
  1443. package/dist/ui/components/ModelSelector.js.map +1 -0
  1444. package/dist/ui/components/PermissionPrompt.d.ts +44 -0
  1445. package/dist/ui/components/PermissionPrompt.d.ts.map +1 -0
  1446. package/dist/ui/components/PermissionPrompt.js +416 -0
  1447. package/dist/ui/components/PermissionPrompt.js.map +1 -0
  1448. package/dist/ui/components/ProgressBar.d.ts +61 -0
  1449. package/dist/ui/components/ProgressBar.d.ts.map +1 -0
  1450. package/dist/ui/components/ProgressBar.js +174 -0
  1451. package/dist/ui/components/ProgressBar.js.map +1 -0
  1452. package/dist/ui/components/ResumeSession.d.ts +27 -0
  1453. package/dist/ui/components/ResumeSession.d.ts.map +1 -0
  1454. package/dist/ui/components/ResumeSession.js +330 -0
  1455. package/dist/ui/components/ResumeSession.js.map +1 -0
  1456. package/dist/ui/components/SelectInput.d.ts +22 -0
  1457. package/dist/ui/components/SelectInput.d.ts.map +1 -0
  1458. package/dist/ui/components/SelectInput.js +84 -0
  1459. package/dist/ui/components/SelectInput.js.map +1 -0
  1460. package/dist/ui/components/ShortcutHelp.d.ts +12 -0
  1461. package/dist/ui/components/ShortcutHelp.d.ts.map +1 -0
  1462. package/dist/ui/components/ShortcutHelp.js +55 -0
  1463. package/dist/ui/components/ShortcutHelp.js.map +1 -0
  1464. package/dist/ui/components/SkillsDialog.d.ts +12 -0
  1465. package/dist/ui/components/SkillsDialog.d.ts.map +1 -0
  1466. package/dist/ui/components/SkillsDialog.js +239 -0
  1467. package/dist/ui/components/SkillsDialog.js.map +1 -0
  1468. package/dist/ui/components/Spinner.d.ts +81 -0
  1469. package/dist/ui/components/Spinner.d.ts.map +1 -0
  1470. package/dist/ui/components/Spinner.js +165 -0
  1471. package/dist/ui/components/Spinner.js.map +1 -0
  1472. package/dist/ui/components/StatsPanel.d.ts +20 -0
  1473. package/dist/ui/components/StatsPanel.d.ts.map +1 -0
  1474. package/dist/ui/components/StatsPanel.js +584 -0
  1475. package/dist/ui/components/StatsPanel.js.map +1 -0
  1476. package/dist/ui/components/StatusBar.d.ts +43 -0
  1477. package/dist/ui/components/StatusBar.d.ts.map +1 -0
  1478. package/dist/ui/components/StatusBar.js +160 -0
  1479. package/dist/ui/components/StatusBar.js.map +1 -0
  1480. package/dist/ui/components/StatusBar.test.d.ts +10 -0
  1481. package/dist/ui/components/StatusBar.test.d.ts.map +1 -0
  1482. package/dist/ui/components/StatusBar.test.js +70 -0
  1483. package/dist/ui/components/StatusBar.test.js.map +1 -0
  1484. package/dist/ui/components/TodoList.d.ts +25 -0
  1485. package/dist/ui/components/TodoList.d.ts.map +1 -0
  1486. package/dist/ui/components/TodoList.js +146 -0
  1487. package/dist/ui/components/TodoList.js.map +1 -0
  1488. package/dist/ui/components/ToolCall.d.ts +19 -0
  1489. package/dist/ui/components/ToolCall.d.ts.map +1 -0
  1490. package/dist/ui/components/ToolCall.js +196 -0
  1491. package/dist/ui/components/ToolCall.js.map +1 -0
  1492. package/dist/ui/components/TrustDialog.d.ts +35 -0
  1493. package/dist/ui/components/TrustDialog.d.ts.map +1 -0
  1494. package/dist/ui/components/TrustDialog.js +163 -0
  1495. package/dist/ui/components/TrustDialog.js.map +1 -0
  1496. package/dist/ui/components/UpdateNotification.d.ts +11 -0
  1497. package/dist/ui/components/UpdateNotification.d.ts.map +1 -0
  1498. package/dist/ui/components/UpdateNotification.js +66 -0
  1499. package/dist/ui/components/UpdateNotification.js.map +1 -0
  1500. package/dist/ui/components/WelcomeScreen.d.ts +22 -0
  1501. package/dist/ui/components/WelcomeScreen.d.ts.map +1 -0
  1502. package/dist/ui/components/WelcomeScreen.js +156 -0
  1503. package/dist/ui/components/WelcomeScreen.js.map +1 -0
  1504. package/dist/ui/components/index.d.ts +35 -0
  1505. package/dist/ui/components/index.d.ts.map +1 -0
  1506. package/dist/ui/components/index.js +25 -0
  1507. package/dist/ui/components/index.js.map +1 -0
  1508. package/dist/ui/hooks/index.d.ts +12 -0
  1509. package/dist/ui/hooks/index.d.ts.map +1 -0
  1510. package/dist/ui/hooks/index.js +9 -0
  1511. package/dist/ui/hooks/index.js.map +1 -0
  1512. package/dist/ui/hooks/useAutoScroll.d.ts +22 -0
  1513. package/dist/ui/hooks/useAutoScroll.d.ts.map +1 -0
  1514. package/dist/ui/hooks/useAutoScroll.js +46 -0
  1515. package/dist/ui/hooks/useAutoScroll.js.map +1 -0
  1516. package/dist/ui/hooks/useAxonMdImport.d.ts +57 -0
  1517. package/dist/ui/hooks/useAxonMdImport.d.ts.map +1 -0
  1518. package/dist/ui/hooks/useAxonMdImport.js +248 -0
  1519. package/dist/ui/hooks/useAxonMdImport.js.map +1 -0
  1520. package/dist/ui/hooks/useGlobalKeybindings.d.ts +60 -0
  1521. package/dist/ui/hooks/useGlobalKeybindings.d.ts.map +1 -0
  1522. package/dist/ui/hooks/useGlobalKeybindings.js +460 -0
  1523. package/dist/ui/hooks/useGlobalKeybindings.js.map +1 -0
  1524. package/dist/ui/hooks/useRewind.d.ts +44 -0
  1525. package/dist/ui/hooks/useRewind.d.ts.map +1 -0
  1526. package/dist/ui/hooks/useRewind.js +67 -0
  1527. package/dist/ui/hooks/useRewind.js.map +1 -0
  1528. package/dist/ui/hooks/useTerminalSize.d.ts +32 -0
  1529. package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -0
  1530. package/dist/ui/hooks/useTerminalSize.js +70 -0
  1531. package/dist/ui/hooks/useTerminalSize.js.map +1 -0
  1532. package/dist/ui/index.d.ts +29 -0
  1533. package/dist/ui/index.d.ts.map +1 -0
  1534. package/dist/ui/index.js +42 -0
  1535. package/dist/ui/index.js.map +1 -0
  1536. package/dist/ui/ink-v2/dom-renderer.d.ts +58 -0
  1537. package/dist/ui/ink-v2/dom-renderer.d.ts.map +1 -0
  1538. package/dist/ui/ink-v2/dom-renderer.js +295 -0
  1539. package/dist/ui/ink-v2/dom-renderer.js.map +1 -0
  1540. package/dist/ui/ink-v2/frame.d.ts +25 -0
  1541. package/dist/ui/ink-v2/frame.d.ts.map +1 -0
  1542. package/dist/ui/ink-v2/frame.js +120 -0
  1543. package/dist/ui/ink-v2/frame.js.map +1 -0
  1544. package/dist/ui/ink-v2/index.d.ts +92 -0
  1545. package/dist/ui/ink-v2/index.d.ts.map +1 -0
  1546. package/dist/ui/ink-v2/index.js +185 -0
  1547. package/dist/ui/ink-v2/index.js.map +1 -0
  1548. package/dist/ui/ink-v2/output.d.ts +43 -0
  1549. package/dist/ui/ink-v2/output.d.ts.map +1 -0
  1550. package/dist/ui/ink-v2/output.js +154 -0
  1551. package/dist/ui/ink-v2/output.js.map +1 -0
  1552. package/dist/ui/ink-v2/renderer.d.ts +49 -0
  1553. package/dist/ui/ink-v2/renderer.d.ts.map +1 -0
  1554. package/dist/ui/ink-v2/renderer.js +411 -0
  1555. package/dist/ui/ink-v2/renderer.js.map +1 -0
  1556. package/dist/ui/ink-v2/screen.d.ts +65 -0
  1557. package/dist/ui/ink-v2/screen.d.ts.map +1 -0
  1558. package/dist/ui/ink-v2/screen.js +260 -0
  1559. package/dist/ui/ink-v2/screen.js.map +1 -0
  1560. package/dist/ui/ink-v2/style-pool.d.ts +28 -0
  1561. package/dist/ui/ink-v2/style-pool.d.ts.map +1 -0
  1562. package/dist/ui/ink-v2/style-pool.js +50 -0
  1563. package/dist/ui/ink-v2/style-pool.js.map +1 -0
  1564. package/dist/ui/ink-v2/types.d.ts +138 -0
  1565. package/dist/ui/ink-v2/types.d.ts.map +1 -0
  1566. package/dist/ui/ink-v2/types.js +11 -0
  1567. package/dist/ui/ink-v2/types.js.map +1 -0
  1568. package/dist/ui/markdown-renderer.d.ts +35 -0
  1569. package/dist/ui/markdown-renderer.d.ts.map +1 -0
  1570. package/dist/ui/markdown-renderer.js +369 -0
  1571. package/dist/ui/markdown-renderer.js.map +1 -0
  1572. package/dist/ui/spinner-verbs.d.ts +15 -0
  1573. package/dist/ui/spinner-verbs.d.ts.map +1 -0
  1574. package/dist/ui/spinner-verbs.js +75 -0
  1575. package/dist/ui/spinner-verbs.js.map +1 -0
  1576. package/dist/ui/utils/history-manager.d.ts +41 -0
  1577. package/dist/ui/utils/history-manager.d.ts.map +1 -0
  1578. package/dist/ui/utils/history-manager.js +109 -0
  1579. package/dist/ui/utils/history-manager.js.map +1 -0
  1580. package/dist/ui/utils/index.d.ts +9 -0
  1581. package/dist/ui/utils/index.d.ts.map +1 -0
  1582. package/dist/ui/utils/index.js +10 -0
  1583. package/dist/ui/utils/index.js.map +1 -0
  1584. package/dist/ui/utils/kitty-keyboard.d.ts +239 -0
  1585. package/dist/ui/utils/kitty-keyboard.d.ts.map +1 -0
  1586. package/dist/ui/utils/kitty-keyboard.js +341 -0
  1587. package/dist/ui/utils/kitty-keyboard.js.map +1 -0
  1588. package/dist/ui/utils/string-width.d.ts +36 -0
  1589. package/dist/ui/utils/string-width.d.ts.map +1 -0
  1590. package/dist/ui/utils/string-width.js +339 -0
  1591. package/dist/ui/utils/string-width.js.map +1 -0
  1592. package/dist/ui/utils/syntaxHighlight.d.ts +94 -0
  1593. package/dist/ui/utils/syntaxHighlight.d.ts.map +1 -0
  1594. package/dist/ui/utils/syntaxHighlight.js +415 -0
  1595. package/dist/ui/utils/syntaxHighlight.js.map +1 -0
  1596. package/dist/ui/utils/terminal.d.ts +145 -0
  1597. package/dist/ui/utils/terminal.d.ts.map +1 -0
  1598. package/dist/ui/utils/terminal.js +229 -0
  1599. package/dist/ui/utils/terminal.js.map +1 -0
  1600. package/dist/updater/index.d.ts +115 -0
  1601. package/dist/updater/index.d.ts.map +1 -0
  1602. package/dist/updater/index.js +546 -0
  1603. package/dist/updater/index.js.map +1 -0
  1604. package/dist/utils/AppError.d.ts +24 -0
  1605. package/dist/utils/AppError.d.ts.map +1 -0
  1606. package/dist/utils/AppError.js +33 -0
  1607. package/dist/utils/AppError.js.map +1 -0
  1608. package/dist/utils/AppError.test.d.ts +2 -0
  1609. package/dist/utils/AppError.test.d.ts.map +1 -0
  1610. package/dist/utils/AppError.test.js +257 -0
  1611. package/dist/utils/AppError.test.js.map +1 -0
  1612. package/dist/utils/attribution.d.ts +111 -0
  1613. package/dist/utils/attribution.d.ts.map +1 -0
  1614. package/dist/utils/attribution.js +219 -0
  1615. package/dist/utils/attribution.js.map +1 -0
  1616. package/dist/utils/editor.d.ts +19 -0
  1617. package/dist/utils/editor.d.ts.map +1 -0
  1618. package/dist/utils/editor.js +115 -0
  1619. package/dist/utils/editor.js.map +1 -0
  1620. package/dist/utils/env-check.d.ts +78 -0
  1621. package/dist/utils/env-check.d.ts.map +1 -0
  1622. package/dist/utils/env-check.js +114 -0
  1623. package/dist/utils/env-check.js.map +1 -0
  1624. package/dist/utils/error-watcher.d.ts +78 -0
  1625. package/dist/utils/error-watcher.d.ts.map +1 -0
  1626. package/dist/utils/error-watcher.js +355 -0
  1627. package/dist/utils/error-watcher.js.map +1 -0
  1628. package/dist/utils/git-helper.d.ts +55 -0
  1629. package/dist/utils/git-helper.d.ts.map +1 -0
  1630. package/dist/utils/git-helper.js +238 -0
  1631. package/dist/utils/git-helper.js.map +1 -0
  1632. package/dist/utils/index.d.ts +188 -0
  1633. package/dist/utils/index.d.ts.map +1 -0
  1634. package/dist/utils/index.js +472 -0
  1635. package/dist/utils/index.js.map +1 -0
  1636. package/dist/utils/logger.d.ts +117 -0
  1637. package/dist/utils/logger.d.ts.map +1 -0
  1638. package/dist/utils/logger.js +458 -0
  1639. package/dist/utils/logger.js.map +1 -0
  1640. package/dist/utils/package-manager.d.ts +134 -0
  1641. package/dist/utils/package-manager.d.ts.map +1 -0
  1642. package/dist/utils/package-manager.js +325 -0
  1643. package/dist/utils/package-manager.js.map +1 -0
  1644. package/dist/utils/platform.d.ts +283 -0
  1645. package/dist/utils/platform.d.ts.map +1 -0
  1646. package/dist/utils/platform.js +748 -0
  1647. package/dist/utils/platform.js.map +1 -0
  1648. package/dist/utils/pr-status.d.ts +50 -0
  1649. package/dist/utils/pr-status.d.ts.map +1 -0
  1650. package/dist/utils/pr-status.js +182 -0
  1651. package/dist/utils/pr-status.js.map +1 -0
  1652. package/dist/utils/retry.d.ts +86 -0
  1653. package/dist/utils/retry.d.ts.map +1 -0
  1654. package/dist/utils/retry.js +202 -0
  1655. package/dist/utils/retry.js.map +1 -0
  1656. package/dist/utils/temp-dir.d.ts +31 -0
  1657. package/dist/utils/temp-dir.d.ts.map +1 -0
  1658. package/dist/utils/temp-dir.js +141 -0
  1659. package/dist/utils/temp-dir.js.map +1 -0
  1660. package/dist/utils/terminal-setup.d.ts +31 -0
  1661. package/dist/utils/terminal-setup.d.ts.map +1 -0
  1662. package/dist/utils/terminal-setup.js +224 -0
  1663. package/dist/utils/terminal-setup.js.map +1 -0
  1664. package/dist/utils/terminal-tab.d.ts +15 -0
  1665. package/dist/utils/terminal-tab.d.ts.map +1 -0
  1666. package/dist/utils/terminal-tab.js +173 -0
  1667. package/dist/utils/terminal-tab.js.map +1 -0
  1668. package/dist/utils/token-estimate.d.ts +26 -0
  1669. package/dist/utils/token-estimate.d.ts.map +1 -0
  1670. package/dist/utils/token-estimate.js +62 -0
  1671. package/dist/utils/token-estimate.js.map +1 -0
  1672. package/dist/utils/truncated-buffer.d.ts +70 -0
  1673. package/dist/utils/truncated-buffer.d.ts.map +1 -0
  1674. package/dist/utils/truncated-buffer.js +124 -0
  1675. package/dist/utils/truncated-buffer.js.map +1 -0
  1676. package/dist/version.d.ts +30 -0
  1677. package/dist/version.d.ts.map +1 -0
  1678. package/dist/version.js +32 -0
  1679. package/dist/version.js.map +1 -0
  1680. package/dist/web/index.d.ts +7 -0
  1681. package/dist/web/index.d.ts.map +1 -0
  1682. package/dist/web/index.js +7 -0
  1683. package/dist/web/index.js.map +1 -0
  1684. package/dist/web/server/api-manager.d.ts +53 -0
  1685. package/dist/web/server/api-manager.d.ts.map +1 -0
  1686. package/dist/web/server/api-manager.js +271 -0
  1687. package/dist/web/server/api-manager.js.map +1 -0
  1688. package/dist/web/server/channels/adapters/discord.d.ts +41 -0
  1689. package/dist/web/server/channels/adapters/discord.d.ts.map +1 -0
  1690. package/dist/web/server/channels/adapters/discord.js +326 -0
  1691. package/dist/web/server/channels/adapters/discord.js.map +1 -0
  1692. package/dist/web/server/channels/adapters/feishu.d.ts +38 -0
  1693. package/dist/web/server/channels/adapters/feishu.d.ts.map +1 -0
  1694. package/dist/web/server/channels/adapters/feishu.js +442 -0
  1695. package/dist/web/server/channels/adapters/feishu.js.map +1 -0
  1696. package/dist/web/server/channels/adapters/slack-bot.d.ts +30 -0
  1697. package/dist/web/server/channels/adapters/slack-bot.d.ts.map +1 -0
  1698. package/dist/web/server/channels/adapters/slack-bot.js +226 -0
  1699. package/dist/web/server/channels/adapters/slack-bot.js.map +1 -0
  1700. package/dist/web/server/channels/adapters/telegram.d.ts +32 -0
  1701. package/dist/web/server/channels/adapters/telegram.d.ts.map +1 -0
  1702. package/dist/web/server/channels/adapters/telegram.js +261 -0
  1703. package/dist/web/server/channels/adapters/telegram.js.map +1 -0
  1704. package/dist/web/server/channels/adapters/whatsapp.d.ts +48 -0
  1705. package/dist/web/server/channels/adapters/whatsapp.d.ts.map +1 -0
  1706. package/dist/web/server/channels/adapters/whatsapp.js +316 -0
  1707. package/dist/web/server/channels/adapters/whatsapp.js.map +1 -0
  1708. package/dist/web/server/channels/bridge.d.ts +103 -0
  1709. package/dist/web/server/channels/bridge.d.ts.map +1 -0
  1710. package/dist/web/server/channels/bridge.js +728 -0
  1711. package/dist/web/server/channels/bridge.js.map +1 -0
  1712. package/dist/web/server/channels/index.d.ts +71 -0
  1713. package/dist/web/server/channels/index.d.ts.map +1 -0
  1714. package/dist/web/server/channels/index.js +307 -0
  1715. package/dist/web/server/channels/index.js.map +1 -0
  1716. package/dist/web/server/channels/types.d.ts +249 -0
  1717. package/dist/web/server/channels/types.d.ts.map +1 -0
  1718. package/dist/web/server/channels/types.js +8 -0
  1719. package/dist/web/server/channels/types.js.map +1 -0
  1720. package/dist/web/server/checkpoint-manager.d.ts +152 -0
  1721. package/dist/web/server/checkpoint-manager.d.ts.map +1 -0
  1722. package/dist/web/server/checkpoint-manager.js +359 -0
  1723. package/dist/web/server/checkpoint-manager.js.map +1 -0
  1724. package/dist/web/server/connectors/index.d.ts +115 -0
  1725. package/dist/web/server/connectors/index.d.ts.map +1 -0
  1726. package/dist/web/server/connectors/index.js +759 -0
  1727. package/dist/web/server/connectors/index.js.map +1 -0
  1728. package/dist/web/server/connectors/providers.d.ts +6 -0
  1729. package/dist/web/server/connectors/providers.d.ts.map +1 -0
  1730. package/dist/web/server/connectors/providers.js +238 -0
  1731. package/dist/web/server/connectors/providers.js.map +1 -0
  1732. package/dist/web/server/connectors/types.d.ts +79 -0
  1733. package/dist/web/server/connectors/types.d.ts.map +1 -0
  1734. package/dist/web/server/connectors/types.js +5 -0
  1735. package/dist/web/server/connectors/types.js.map +1 -0
  1736. package/dist/web/server/conversation.d.ts +593 -0
  1737. package/dist/web/server/conversation.d.ts.map +1 -0
  1738. package/dist/web/server/conversation.js +5170 -0
  1739. package/dist/web/server/conversation.js.map +1 -0
  1740. package/dist/web/server/database/swarm-logs.d.ts +150 -0
  1741. package/dist/web/server/database/swarm-logs.d.ts.map +1 -0
  1742. package/dist/web/server/database/swarm-logs.js +456 -0
  1743. package/dist/web/server/database/swarm-logs.js.map +1 -0
  1744. package/dist/web/server/doctor.d.ts +59 -0
  1745. package/dist/web/server/doctor.d.ts.map +1 -0
  1746. package/dist/web/server/doctor.js +666 -0
  1747. package/dist/web/server/doctor.js.map +1 -0
  1748. package/dist/web/server/evolve-state.d.ts +30 -0
  1749. package/dist/web/server/evolve-state.d.ts.map +1 -0
  1750. package/dist/web/server/evolve-state.js +54 -0
  1751. package/dist/web/server/evolve-state.js.map +1 -0
  1752. package/dist/web/server/git-manager.d.ts +373 -0
  1753. package/dist/web/server/git-manager.d.ts.map +1 -0
  1754. package/dist/web/server/git-manager.js +1556 -0
  1755. package/dist/web/server/git-manager.js.map +1 -0
  1756. package/dist/web/server/handlers/types.d.ts +95 -0
  1757. package/dist/web/server/handlers/types.d.ts.map +1 -0
  1758. package/dist/web/server/handlers/types.js +22 -0
  1759. package/dist/web/server/handlers/types.js.map +1 -0
  1760. package/dist/web/server/index.d.ts +41 -0
  1761. package/dist/web/server/index.d.ts.map +1 -0
  1762. package/dist/web/server/index.js +935 -0
  1763. package/dist/web/server/index.js.map +1 -0
  1764. package/dist/web/server/oauth-manager.d.ts +89 -0
  1765. package/dist/web/server/oauth-manager.d.ts.map +1 -0
  1766. package/dist/web/server/oauth-manager.js +361 -0
  1767. package/dist/web/server/oauth-manager.js.map +1 -0
  1768. package/dist/web/server/permission-handler.d.ts +170 -0
  1769. package/dist/web/server/permission-handler.d.ts.map +1 -0
  1770. package/dist/web/server/permission-handler.js +591 -0
  1771. package/dist/web/server/permission-handler.js.map +1 -0
  1772. package/dist/web/server/project-suggestions.d.ts +39 -0
  1773. package/dist/web/server/project-suggestions.d.ts.map +1 -0
  1774. package/dist/web/server/project-suggestions.js +365 -0
  1775. package/dist/web/server/project-suggestions.js.map +1 -0
  1776. package/dist/web/server/prompt-snippets.d.ts +92 -0
  1777. package/dist/web/server/prompt-snippets.d.ts.map +1 -0
  1778. package/dist/web/server/prompt-snippets.js +206 -0
  1779. package/dist/web/server/prompt-snippets.js.map +1 -0
  1780. package/dist/web/server/routes/__tests__/artifacts-api.test.d.ts +2 -0
  1781. package/dist/web/server/routes/__tests__/artifacts-api.test.d.ts.map +1 -0
  1782. package/dist/web/server/routes/__tests__/artifacts-api.test.js +572 -0
  1783. package/dist/web/server/routes/__tests__/artifacts-api.test.js.map +1 -0
  1784. package/dist/web/server/routes/agent-api.d.ts +7 -0
  1785. package/dist/web/server/routes/agent-api.d.ts.map +1 -0
  1786. package/dist/web/server/routes/agent-api.js +225 -0
  1787. package/dist/web/server/routes/agent-api.js.map +1 -0
  1788. package/dist/web/server/routes/ai-editor.d.ts +13 -0
  1789. package/dist/web/server/routes/ai-editor.d.ts.map +1 -0
  1790. package/dist/web/server/routes/ai-editor.js +2079 -0
  1791. package/dist/web/server/routes/ai-editor.js.map +1 -0
  1792. package/dist/web/server/routes/ai-hover.d.ts +10 -0
  1793. package/dist/web/server/routes/ai-hover.d.ts.map +1 -0
  1794. package/dist/web/server/routes/ai-hover.js +359 -0
  1795. package/dist/web/server/routes/ai-hover.js.map +1 -0
  1796. package/dist/web/server/routes/api.d.ts +7 -0
  1797. package/dist/web/server/routes/api.d.ts.map +1 -0
  1798. package/dist/web/server/routes/api.js +1200 -0
  1799. package/dist/web/server/routes/api.js.map +1 -0
  1800. package/dist/web/server/routes/artifacts-api.d.ts +15 -0
  1801. package/dist/web/server/routes/artifacts-api.d.ts.map +1 -0
  1802. package/dist/web/server/routes/artifacts-api.js +231 -0
  1803. package/dist/web/server/routes/artifacts-api.js.map +1 -0
  1804. package/dist/web/server/routes/auth.d.ts +7 -0
  1805. package/dist/web/server/routes/auth.d.ts.map +1 -0
  1806. package/dist/web/server/routes/auth.js +292 -0
  1807. package/dist/web/server/routes/auth.js.map +1 -0
  1808. package/dist/web/server/routes/autocomplete-api.d.ts +10 -0
  1809. package/dist/web/server/routes/autocomplete-api.d.ts.map +1 -0
  1810. package/dist/web/server/routes/autocomplete-api.js +302 -0
  1811. package/dist/web/server/routes/autocomplete-api.js.map +1 -0
  1812. package/dist/web/server/routes/axon-cloud.d.ts +7 -0
  1813. package/dist/web/server/routes/axon-cloud.d.ts.map +1 -0
  1814. package/dist/web/server/routes/axon-cloud.js +160 -0
  1815. package/dist/web/server/routes/axon-cloud.js.map +1 -0
  1816. package/dist/web/server/routes/blueprint-api.d.ts +459 -0
  1817. package/dist/web/server/routes/blueprint-api.d.ts.map +1 -0
  1818. package/dist/web/server/routes/blueprint-api.js +6057 -0
  1819. package/dist/web/server/routes/blueprint-api.js.map +1 -0
  1820. package/dist/web/server/routes/blueprint-requirement-api.d.ts +11 -0
  1821. package/dist/web/server/routes/blueprint-requirement-api.d.ts.map +1 -0
  1822. package/dist/web/server/routes/blueprint-requirement-api.js +91 -0
  1823. package/dist/web/server/routes/blueprint-requirement-api.js.map +1 -0
  1824. package/dist/web/server/routes/code-parser.d.ts +14 -0
  1825. package/dist/web/server/routes/code-parser.d.ts.map +1 -0
  1826. package/dist/web/server/routes/code-parser.js +191 -0
  1827. package/dist/web/server/routes/code-parser.js.map +1 -0
  1828. package/dist/web/server/routes/config-api.d.ts +14 -0
  1829. package/dist/web/server/routes/config-api.d.ts.map +1 -0
  1830. package/dist/web/server/routes/config-api.js +670 -0
  1831. package/dist/web/server/routes/config-api.js.map +1 -0
  1832. package/dist/web/server/routes/connectors-api.d.ts +7 -0
  1833. package/dist/web/server/routes/connectors-api.d.ts.map +1 -0
  1834. package/dist/web/server/routes/connectors-api.js +267 -0
  1835. package/dist/web/server/routes/connectors-api.js.map +1 -0
  1836. package/dist/web/server/routes/data-flow-analyzer.d.ts +60 -0
  1837. package/dist/web/server/routes/data-flow-analyzer.d.ts.map +1 -0
  1838. package/dist/web/server/routes/data-flow-analyzer.js +220 -0
  1839. package/dist/web/server/routes/data-flow-analyzer.js.map +1 -0
  1840. package/dist/web/server/routes/download-proxy.d.ts +16 -0
  1841. package/dist/web/server/routes/download-proxy.d.ts.map +1 -0
  1842. package/dist/web/server/routes/download-proxy.js +114 -0
  1843. package/dist/web/server/routes/download-proxy.js.map +1 -0
  1844. package/dist/web/server/routes/file-api.d.ts +18 -0
  1845. package/dist/web/server/routes/file-api.d.ts.map +1 -0
  1846. package/dist/web/server/routes/file-api.js +1514 -0
  1847. package/dist/web/server/routes/file-api.js.map +1 -0
  1848. package/dist/web/server/routes/lsp-analyzer.d.ts +76 -0
  1849. package/dist/web/server/routes/lsp-analyzer.d.ts.map +1 -0
  1850. package/dist/web/server/routes/lsp-analyzer.js +457 -0
  1851. package/dist/web/server/routes/lsp-analyzer.js.map +1 -0
  1852. package/dist/web/server/routes/lsp-api.d.ts +8 -0
  1853. package/dist/web/server/routes/lsp-api.d.ts.map +1 -0
  1854. package/dist/web/server/routes/lsp-api.js +283 -0
  1855. package/dist/web/server/routes/lsp-api.js.map +1 -0
  1856. package/dist/web/server/routes/mcp-cli-api.d.ts +19 -0
  1857. package/dist/web/server/routes/mcp-cli-api.d.ts.map +1 -0
  1858. package/dist/web/server/routes/mcp-cli-api.js +223 -0
  1859. package/dist/web/server/routes/mcp-cli-api.js.map +1 -0
  1860. package/dist/web/server/routes/network-api.d.ts +8 -0
  1861. package/dist/web/server/routes/network-api.d.ts.map +1 -0
  1862. package/dist/web/server/routes/network-api.js +367 -0
  1863. package/dist/web/server/routes/network-api.js.map +1 -0
  1864. package/dist/web/server/routes/notebook-api.d.ts +12 -0
  1865. package/dist/web/server/routes/notebook-api.d.ts.map +1 -0
  1866. package/dist/web/server/routes/notebook-api.js +164 -0
  1867. package/dist/web/server/routes/notebook-api.js.map +1 -0
  1868. package/dist/web/server/routes/port-forward.d.ts +20 -0
  1869. package/dist/web/server/routes/port-forward.d.ts.map +1 -0
  1870. package/dist/web/server/routes/port-forward.js +155 -0
  1871. package/dist/web/server/routes/port-forward.js.map +1 -0
  1872. package/dist/web/server/routes/project-map-generator.d.ts +126 -0
  1873. package/dist/web/server/routes/project-map-generator.d.ts.map +1 -0
  1874. package/dist/web/server/routes/project-map-generator.js +800 -0
  1875. package/dist/web/server/routes/project-map-generator.js.map +1 -0
  1876. package/dist/web/server/routes/schedule-api.d.ts +7 -0
  1877. package/dist/web/server/routes/schedule-api.d.ts.map +1 -0
  1878. package/dist/web/server/routes/schedule-api.js +324 -0
  1879. package/dist/web/server/routes/schedule-api.js.map +1 -0
  1880. package/dist/web/server/routes/symbol-classifier.d.ts +71 -0
  1881. package/dist/web/server/routes/symbol-classifier.d.ts.map +1 -0
  1882. package/dist/web/server/routes/symbol-classifier.js +190 -0
  1883. package/dist/web/server/routes/symbol-classifier.js.map +1 -0
  1884. package/dist/web/server/services/axon-cloud-service.d.ts +95 -0
  1885. package/dist/web/server/services/axon-cloud-service.d.ts.map +1 -0
  1886. package/dist/web/server/services/axon-cloud-service.js +210 -0
  1887. package/dist/web/server/services/axon-cloud-service.js.map +1 -0
  1888. package/dist/web/server/services/config-service.d.ts +436 -0
  1889. package/dist/web/server/services/config-service.d.ts.map +1 -0
  1890. package/dist/web/server/services/config-service.js +872 -0
  1891. package/dist/web/server/services/config-service.js.map +1 -0
  1892. package/dist/web/server/services/gemini-image-service.d.ts +80 -0
  1893. package/dist/web/server/services/gemini-image-service.d.ts.map +1 -0
  1894. package/dist/web/server/services/gemini-image-service.js +373 -0
  1895. package/dist/web/server/services/gemini-image-service.js.map +1 -0
  1896. package/dist/web/server/services/mode-presets.d.ts +40 -0
  1897. package/dist/web/server/services/mode-presets.d.ts.map +1 -0
  1898. package/dist/web/server/services/mode-presets.js +167 -0
  1899. package/dist/web/server/services/mode-presets.js.map +1 -0
  1900. package/dist/web/server/services/proxy-service.d.ts +59 -0
  1901. package/dist/web/server/services/proxy-service.d.ts.map +1 -0
  1902. package/dist/web/server/services/proxy-service.js +132 -0
  1903. package/dist/web/server/services/proxy-service.js.map +1 -0
  1904. package/dist/web/server/session-manager.d.ts +152 -0
  1905. package/dist/web/server/session-manager.d.ts.map +1 -0
  1906. package/dist/web/server/session-manager.js +421 -0
  1907. package/dist/web/server/session-manager.js.map +1 -0
  1908. package/dist/web/server/slash-commands.d.ts +46 -0
  1909. package/dist/web/server/slash-commands.d.ts.map +1 -0
  1910. package/dist/web/server/slash-commands.js +774 -0
  1911. package/dist/web/server/slash-commands.js.map +1 -0
  1912. package/dist/web/server/task-manager.d.ts +190 -0
  1913. package/dist/web/server/task-manager.d.ts.map +1 -0
  1914. package/dist/web/server/task-manager.js +596 -0
  1915. package/dist/web/server/task-manager.js.map +1 -0
  1916. package/dist/web/server/terminal-manager.d.ts +50 -0
  1917. package/dist/web/server/terminal-manager.d.ts.map +1 -0
  1918. package/dist/web/server/terminal-manager.js +274 -0
  1919. package/dist/web/server/terminal-manager.js.map +1 -0
  1920. package/dist/web/server/trpc/appRouter.d.ts +429 -0
  1921. package/dist/web/server/trpc/appRouter.d.ts.map +1 -0
  1922. package/dist/web/server/trpc/appRouter.js +18 -0
  1923. package/dist/web/server/trpc/appRouter.js.map +1 -0
  1924. package/dist/web/server/trpc/index.d.ts +29 -0
  1925. package/dist/web/server/trpc/index.d.ts.map +1 -0
  1926. package/dist/web/server/trpc/index.js +25 -0
  1927. package/dist/web/server/trpc/index.js.map +1 -0
  1928. package/dist/web/server/trpc/routers/blueprint.d.ts +162 -0
  1929. package/dist/web/server/trpc/routers/blueprint.d.ts.map +1 -0
  1930. package/dist/web/server/trpc/routers/blueprint.js +225 -0
  1931. package/dist/web/server/trpc/routers/blueprint.js.map +1 -0
  1932. package/dist/web/server/trpc/routers/coordinator.d.ts +247 -0
  1933. package/dist/web/server/trpc/routers/coordinator.d.ts.map +1 -0
  1934. package/dist/web/server/trpc/routers/coordinator.js +363 -0
  1935. package/dist/web/server/trpc/routers/coordinator.js.map +1 -0
  1936. package/dist/web/server/trpc/routers/execution.d.ts +106 -0
  1937. package/dist/web/server/trpc/routers/execution.d.ts.map +1 -0
  1938. package/dist/web/server/trpc/routers/execution.js +176 -0
  1939. package/dist/web/server/trpc/routers/execution.js.map +1 -0
  1940. package/dist/web/server/user-interaction.d.ts +61 -0
  1941. package/dist/web/server/user-interaction.d.ts.map +1 -0
  1942. package/dist/web/server/user-interaction.js +133 -0
  1943. package/dist/web/server/user-interaction.js.map +1 -0
  1944. package/dist/web/server/web-auth.d.ts +125 -0
  1945. package/dist/web/server/web-auth.d.ts.map +1 -0
  1946. package/dist/web/server/web-auth.js +364 -0
  1947. package/dist/web/server/web-auth.js.map +1 -0
  1948. package/dist/web/server/web-scheduler.d.ts +96 -0
  1949. package/dist/web/server/web-scheduler.d.ts.map +1 -0
  1950. package/dist/web/server/web-scheduler.js +762 -0
  1951. package/dist/web/server/web-scheduler.js.map +1 -0
  1952. package/dist/web/server/websocket-git-handlers.d.ts +107 -0
  1953. package/dist/web/server/websocket-git-handlers.d.ts.map +1 -0
  1954. package/dist/web/server/websocket-git-handlers.js +855 -0
  1955. package/dist/web/server/websocket-git-handlers.js.map +1 -0
  1956. package/dist/web/server/websocket.d.ts +18 -0
  1957. package/dist/web/server/websocket.d.ts.map +1 -0
  1958. package/dist/web/server/websocket.js +6158 -0
  1959. package/dist/web/server/websocket.js.map +1 -0
  1960. package/dist/web/shared/types.d.ts +4100 -0
  1961. package/dist/web/shared/types.d.ts.map +1 -0
  1962. package/dist/web/shared/types.js +123 -0
  1963. package/dist/web/shared/types.js.map +1 -0
  1964. package/dist/web-cli.d.ts +11 -0
  1965. package/dist/web-cli.d.ts.map +1 -0
  1966. package/dist/web-cli.js +196 -0
  1967. package/dist/web-cli.js.map +1 -0
  1968. package/dist/wizard/onboarding.d.ts +13 -0
  1969. package/dist/wizard/onboarding.d.ts.map +1 -0
  1970. package/dist/wizard/onboarding.js +196 -0
  1971. package/dist/wizard/onboarding.js.map +1 -0
  1972. package/electron/README.md +41 -0
  1973. package/electron/main.cjs +341 -0
  1974. package/package.json +236 -0
  1975. package/scripts/postinstall.js +110 -0
@@ -0,0 +1,3375 @@
1
+ /**
2
+ * 主对话循环
3
+ * 处理用户输入、工具调用和响应
4
+ */
5
+ import { ClaudeClient, formatSystemPrompt } from './client.js';
6
+ import { Session, setCurrentSessionId } from './session.js';
7
+ import { toolRegistry } from '../tools/index.js';
8
+ import { runWithCwd, runGeneratorWithCwd } from './cwd-context.js';
9
+ import { runWithSessionId } from './session-context.js';
10
+ import { isToolSearchEnabled, MCPSearchTool, isThirdPartyApiEndpoint } from '../tools/mcp.js';
11
+ import { isDeferredTool, getDiscoveredToolsFromMessages, setBuiltinDeferredToolNames } from '../mcp/tools.js';
12
+ import { t } from '../i18n/index.js';
13
+ /**
14
+ * 创建默认的 ToolPermissionContext
15
+ */
16
+ export function createDefaultToolPermissionContext() {
17
+ return {
18
+ mode: 'default',
19
+ additionalWorkingDirectories: new Map(),
20
+ alwaysAllowRules: {
21
+ command: [],
22
+ file: [],
23
+ },
24
+ shouldAvoidPermissionPrompts: false,
25
+ };
26
+ }
27
+ import chalk from 'chalk';
28
+ import { systemPromptBuilder, } from '../prompt/index.js';
29
+ import { modelConfig } from '../models/index.js';
30
+ import { initAuth, getAuth, ensureOAuthApiKey } from '../auth/index.js';
31
+ import { runPermissionRequestHooks } from '../hooks/index.js';
32
+ import * as readline from 'readline';
33
+ import * as fs from 'fs';
34
+ import * as path from 'path';
35
+ import * as crypto from 'crypto';
36
+ import * as os from 'os';
37
+ import { persistLargeOutputSync } from '../tools/output-persistence.js';
38
+ import { setParentModelContext } from '../tools/agent.js';
39
+ import { configManager } from '../config/index.js';
40
+ import { accountUsageManager } from '../ratelimit/index.js';
41
+ import { initNotebookManager, getNotebookManager } from '../memory/notebook.js';
42
+ import { initMemorySearchManager, getMemorySearchManager } from '../memory/memory-search.js';
43
+ import { startCacheKeepalive } from './cache-keepalive.js';
44
+ import { estimateTokens } from '../utils/token-estimate.js';
45
+ import { loadActiveGoals } from '../goals/index.js';
46
+ import { isSessionMemoryEnabled as checkSessionMemoryEnabled, SESSION_MEMORY_TEMPLATE, isEmptyTemplate, readSessionMemory, waitForWrite as waitForSessionMemoryWrite, } from '../context/session-memory.js';
47
+ // ============================================================================
48
+ // 持久化输出常量
49
+ // ============================================================================
50
+ /** 持久化输出起始标签 */
51
+ const PERSISTED_OUTPUT_START = '<persisted-output>';
52
+ /** 持久化输出结束标签 */
53
+ const PERSISTED_OUTPUT_END = '</persisted-output>';
54
+ /** 最大输出行数限制 */
55
+ const MAX_OUTPUT_LINES = 2000;
56
+ /** 输出阈值(字符数),超过此值使用持久化标签 */
57
+ const OUTPUT_THRESHOLD = 400000; // 400KB
58
+ /** 预览大小(字节) */
59
+ const PREVIEW_SIZE = 2000; // 2KB
60
+ /**
61
+ * 写入调试日志
62
+ *
63
+ * @param entry 调试日志条目
64
+ */
65
+ function writeDebugLogEntry(entry) {
66
+ // 只有在 DEBUG 模式下才记录
67
+ if (!process.env.DEBUG && !process.env.AXON_DEBUG) {
68
+ return;
69
+ }
70
+ try {
71
+ const logDir = path.join(os.homedir(), '.axon', 'logs');
72
+ if (!fs.existsSync(logDir)) {
73
+ fs.mkdirSync(logDir, { recursive: true });
74
+ }
75
+ const logFile = path.join(logDir, 'debug.log');
76
+ const logLine = JSON.stringify({
77
+ ...entry,
78
+ timestamp: entry.timestamp || new Date().toISOString(),
79
+ }) + '\n';
80
+ fs.appendFileSync(logFile, logLine, 'utf-8');
81
+ }
82
+ catch {
83
+ // 静默忽略日志写入错误
84
+ }
85
+ }
86
+ /**
87
+ * 记录工具拒绝
88
+ */
89
+ function logToolDenied(toolName, reason, sessionId) {
90
+ writeDebugLogEntry({
91
+ timestamp: new Date().toISOString(),
92
+ type: 'tool_denied',
93
+ toolName,
94
+ reason,
95
+ sessionId,
96
+ });
97
+ if (process.env.DEBUG) {
98
+ console.log(chalk.yellow(`[Debug] Tool denied: ${toolName} - ${reason}`));
99
+ }
100
+ }
101
+ /**
102
+ * 记录工具执行失败
103
+ */
104
+ function logToolFailed(toolName, error, input, sessionId) {
105
+ writeDebugLogEntry({
106
+ timestamp: new Date().toISOString(),
107
+ type: 'tool_failed',
108
+ toolName,
109
+ error,
110
+ input,
111
+ sessionId,
112
+ });
113
+ if (process.env.DEBUG) {
114
+ console.log(chalk.red(`[Debug] Tool failed: ${toolName} - ${error}`));
115
+ }
116
+ }
117
+ /**
118
+ * 记录权限拒绝
119
+ */
120
+ function logPermissionDenied(toolName, reason, sessionId) {
121
+ writeDebugLogEntry({
122
+ timestamp: new Date().toISOString(),
123
+ type: 'permission_denied',
124
+ toolName,
125
+ reason,
126
+ sessionId,
127
+ });
128
+ if (process.env.DEBUG) {
129
+ console.log(chalk.yellow(`[Debug] Permission denied: ${toolName} - ${reason}`));
130
+ }
131
+ }
132
+ /**
133
+ * 可清理的工具白名单(官方策略)
134
+ * 只有这些工具的结果会被自动清理
135
+ * 其他工具(如 NotebookEdit、MultiEdit 等)不会被清理
136
+ */
137
+ const COMPACTABLE_TOOLS = new Set([
138
+ 'Read',
139
+ 'Bash',
140
+ 'Grep',
141
+ 'Glob',
142
+ 'WebSearch',
143
+ 'WebFetch',
144
+ 'Edit',
145
+ 'Write'
146
+ ]);
147
+ // ============================================================================
148
+ // Microcompact 常量(第一层清理机制)
149
+ // ============================================================================
150
+ /**
151
+ * 最小节省阈值(tokens)
152
+ * 只有当清理能节省超过此值的 tokens 时才执行清理
153
+ * 官方值:qy5 = 20000
154
+ */
155
+ const MIN_SAVINGS_THRESHOLD = 20000;
156
+ /**
157
+ * Microcompact 触发阈值(tokens)
158
+ * 当消息历史超过此值时,才考虑执行清理
159
+ * 官方值:Ny5 = 40000
160
+ */
161
+ const MICROCOMPACT_THRESHOLD = 40000;
162
+ /**
163
+ * 保留最近的工具结果数量
164
+ * 最近的 N 个可清理工具结果不会被清理
165
+ * 官方值:Ly5 = 3
166
+ */
167
+ const KEEP_RECENT_COUNT = 3;
168
+ /**
169
+ * 从响应头中提取速率限制信息
170
+ * 对齐官方 lrB 函数
171
+ *
172
+ * @param headers 响应头对象 (Response.headers)
173
+ * @returns 速率限制信息
174
+ */
175
+ function parseRateLimitHeaders(headers) {
176
+ const status = (headers.get('anthropic-ratelimit-unified-status') || 'allowed');
177
+ const resetStr = headers.get('anthropic-ratelimit-unified-reset');
178
+ const resetsAt = resetStr ? Number(resetStr) : undefined;
179
+ const fallbackAvailable = headers.get('anthropic-ratelimit-unified-fallback') === 'available';
180
+ const representativeClaim = headers.get('anthropic-ratelimit-unified-representative-claim');
181
+ const overageStatus = headers.get('anthropic-ratelimit-unified-overage-status');
182
+ // 检测是否使用超额
183
+ const isUsingOverage = status === 'rejected' && (overageStatus === 'allowed' || overageStatus === 'allowed_warning');
184
+ // 构建基础信息
185
+ const info = {
186
+ status,
187
+ resetsAt,
188
+ unifiedRateLimitFallbackAvailable: fallbackAvailable,
189
+ isUsingOverage,
190
+ };
191
+ // 添加限制类型
192
+ if (representativeClaim) {
193
+ info.rateLimitType = representativeClaim;
194
+ }
195
+ // 尝试从具体的 claim 头中获取使用率
196
+ // 官方支持的 claim 类型: 5h (five_hour), 7d (seven_day), overage
197
+ const claimTypes = ['5h', '7d', 'overage'];
198
+ for (const claim of claimTypes) {
199
+ const utilizationStr = headers.get(`anthropic-ratelimit-unified-${claim}-utilization`);
200
+ const thresholdStr = headers.get(`anthropic-ratelimit-unified-${claim}-surpassed-threshold`);
201
+ if (utilizationStr !== null) {
202
+ info.utilization = Number(utilizationStr);
203
+ if (thresholdStr !== null && info.status === 'allowed') {
204
+ info.status = 'allowed_warning';
205
+ }
206
+ break;
207
+ }
208
+ }
209
+ return info;
210
+ }
211
+ /**
212
+ * 更新账户使用率状态并显示警告
213
+ * 对齐官方 pG0 函数
214
+ *
215
+ * @param headers 响应头对象
216
+ * @param verbose 是否显示详细日志
217
+ */
218
+ function updateRateLimitStatus(headers, verbose) {
219
+ const info = parseRateLimitHeaders(headers);
220
+ // 更新 accountUsageManager 状态
221
+ if (info.utilization !== undefined && info.resetsAt !== undefined) {
222
+ // 计算 used 和 limit(根据使用率反推)
223
+ // 假设基础限额为 100(实际限额取决于订阅类型)
224
+ const baseLimit = 100;
225
+ const used = Math.round(info.utilization * baseLimit);
226
+ const resetDate = new Date(info.resetsAt * 1000);
227
+ accountUsageManager.updateUsage(used, baseLimit, resetDate);
228
+ if (verbose) {
229
+ console.log(chalk.gray(`[RateLimit] Status: ${info.status}, Utilization: ${Math.round(info.utilization * 100)}%`));
230
+ }
231
+ }
232
+ // 获取并显示警告消息
233
+ const warningMessage = accountUsageManager.getWarningMessage();
234
+ if (warningMessage) {
235
+ console.log(chalk.yellow(`\n[Rate Limit Warning] ${warningMessage}\n`));
236
+ }
237
+ }
238
+ // ============================================================================
239
+ // 工具结果处理辅助函数
240
+ // ============================================================================
241
+ /**
242
+ * 检查环境变量是否为真值
243
+ * 对齐官方 F0 函数实现
244
+ * 支持的真值:'1', 'true', 'yes', 'on'(不区分大小写)
245
+ * @param value 环境变量值
246
+ * @returns 是否为真值
247
+ */
248
+ function isEnvTrue(value) {
249
+ if (!value)
250
+ return false;
251
+ if (typeof value === 'boolean')
252
+ return value;
253
+ const normalized = value.toLowerCase().trim();
254
+ return ['1', 'true', 'yes', 'on'].includes(normalized);
255
+ }
256
+ /**
257
+ * 智能截断输出内容
258
+ * 优先在换行符处截断,以保持内容的可读性
259
+ * @param content 原始内容
260
+ * @param maxSize 最大字节数
261
+ * @returns 截断结果 { preview: 预览内容, hasMore: 是否有更多内容 }
262
+ */
263
+ function truncateOutput(content, maxSize) {
264
+ if (content.length <= maxSize) {
265
+ return { preview: content, hasMore: false };
266
+ }
267
+ // 找到最后一个换行符的位置
268
+ const lastNewline = content.slice(0, maxSize).lastIndexOf('\n');
269
+ // 如果换行符在前半部分(>50%),就在换行符处截断,否则直接截断
270
+ const cutoff = lastNewline > maxSize * 0.5 ? lastNewline : maxSize;
271
+ return {
272
+ preview: content.slice(0, cutoff),
273
+ hasMore: true,
274
+ };
275
+ }
276
+ /**
277
+ * 处理超大输出:保存到文件 + 返回头尾预览 + 提示用 offset/limit 读取
278
+ *
279
+ * 对齐官方实现(aO6 函数):
280
+ * - 超大 tool result 保存到 ~/.axon/tasks/ 文件
281
+ * - 返回文件路径和格式提示,模型可用 Read 工具的 offset/limit 分段读取
282
+ * - 不丢失信息,只是改变了访问方式
283
+ *
284
+ * @param content 输出内容
285
+ * @param toolName 工具名称(用于文件命名)
286
+ * @returns 处理后的内容
287
+ */
288
+ function wrapPersistedOutput(content, toolName = 'unknown') {
289
+ // 如果输出未超过阈值,直接返回
290
+ if (content.length <= OUTPUT_THRESHOLD) {
291
+ return content;
292
+ }
293
+ // 超大输出:保存到文件,返回路径 + 头尾预览
294
+ const result = persistLargeOutputSync(content, {
295
+ toolName,
296
+ maxLength: OUTPUT_THRESHOLD,
297
+ keepHeadTail: true,
298
+ headChars: 1500,
299
+ tailChars: 1500,
300
+ });
301
+ if (result.persisted && result.filePath) {
302
+ // 判断内容格式
303
+ let format = 'Plain text';
304
+ const trimmed = content.trimStart();
305
+ if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
306
+ format = trimmed.startsWith('[') ? 'JSON array' : 'JSON';
307
+ }
308
+ return `Error: result (${content.length} characters) exceeds maximum allowed size. Output has been saved to ${result.filePath}.\n` +
309
+ `Format: ${format}\n` +
310
+ `Use the Read tool with offset and limit parameters to read specific portions of the file.\n\n` +
311
+ `Preview (first 1500 + last 1500 characters):\n${result.content}`;
312
+ }
313
+ // 持久化失败时降级到标签包装
314
+ const { preview, hasMore } = truncateOutput(content, PREVIEW_SIZE);
315
+ let wrapped = `${PERSISTED_OUTPUT_START}\n`;
316
+ wrapped += `Preview (first ${PREVIEW_SIZE} bytes):\n`;
317
+ wrapped += preview;
318
+ if (hasMore) {
319
+ wrapped += '\n...\n';
320
+ }
321
+ else {
322
+ wrapped += '\n';
323
+ }
324
+ wrapped += PERSISTED_OUTPUT_END;
325
+ return wrapped;
326
+ }
327
+ /**
328
+ * 格式化工具结果
329
+ * 统一处理所有工具的输出,根据大小自动应用持久化
330
+ * @param toolName 工具名称(暂未使用,保留用于未来扩展)
331
+ * @param result 工具执行结果
332
+ * @returns 格式化后的内容
333
+ */
334
+ function formatToolResult(toolName, result) {
335
+ // 获取原始内容
336
+ let content;
337
+ if (!result.success) {
338
+ content = `Error: ${result.error}`;
339
+ }
340
+ else {
341
+ content = result.output || '';
342
+ }
343
+ // 统一应用持久化处理(根据大小自动决定)
344
+ content = wrapPersistedOutput(content, toolName);
345
+ return content;
346
+ }
347
+ /**
348
+ * 查找工具结果对应的工具名称
349
+ * 用于确定是否应该清理某个工具的结果
350
+ * @param messages 消息列表
351
+ * @param toolUseId 工具使用 ID
352
+ * @returns 工具名称,找不到则返回空字符串
353
+ */
354
+ function findToolNameForResult(messages, toolUseId) {
355
+ for (const msg of messages) {
356
+ if (msg.role === 'assistant' && Array.isArray(msg.content)) {
357
+ for (const block of msg.content) {
358
+ if (typeof block === 'object' &&
359
+ 'type' in block &&
360
+ block.type === 'tool_use' &&
361
+ 'id' in block &&
362
+ block.id === toolUseId &&
363
+ 'name' in block) {
364
+ return block.name;
365
+ }
366
+ }
367
+ }
368
+ }
369
+ return '';
370
+ }
371
+ // ============================================================================
372
+ // 孤立工具结果验证和修复(v2.1.7 修复)
373
+ // ============================================================================
374
+ /**
375
+ * 默认的孤立工具错误消息
376
+ * 对齐官方实现
377
+ */
378
+ const ORPHANED_TOOL_ERROR_MESSAGE = 'Tool execution was interrupted during streaming. The tool call did not complete successfully.';
379
+ /**
380
+ * 修复连续两条 assistant 消息导致的 tool_result 位置错误
381
+ *
382
+ * 当 messages[i] 是含 tool_use 的 assistant 消息,messages[i+1] 也是 assistant 消息时,
383
+ * API 要求的 tool_result(必须紧接在 tool_use 之后)就无法满足。
384
+ * 此函数将错位的 tool_result 移动到正确位置(插入在两条 assistant 消息之间),
385
+ * 并从原来的位置删除它们。
386
+ */
387
+ function fixConsecutiveAssistantMessages(messages) {
388
+ // 收集需要移动的 tool_result 信息:Map<消息索引, 需要从该消息移走的 tool_use_id 集合>
389
+ const idsToRemoveFromMsg = new Map();
390
+ // 收集需要插入的 tool_result 块:Map<assistant消息索引, 要插入在其后的 tool_result blocks>
391
+ const insertAfterIdx = new Map();
392
+ for (let i = 0; i < messages.length - 1; i++) {
393
+ const curr = messages[i];
394
+ const next = messages[i + 1];
395
+ if (curr.role !== 'assistant' ||
396
+ !Array.isArray(curr.content) ||
397
+ !curr.content.some((b) => b.type === 'tool_use') ||
398
+ next.role !== 'assistant') {
399
+ continue;
400
+ }
401
+ // 找出当前 assistant 消息中所有 tool_use 的 ID
402
+ const toolUseIds = curr.content
403
+ .filter((b) => b.type === 'tool_use' && b.id)
404
+ .map((b) => b.id);
405
+ // 在 i+2 及之后的消息中寻找这些 ID 的 tool_result
406
+ const collectedResults = [];
407
+ const foundIds = new Set();
408
+ for (let j = i + 2; j < messages.length; j++) {
409
+ const msg = messages[j];
410
+ if (msg.role !== 'user' || !Array.isArray(msg.content))
411
+ continue;
412
+ for (const block of msg.content) {
413
+ if (typeof block === 'object' &&
414
+ 'type' in block &&
415
+ block.type === 'tool_result' &&
416
+ 'tool_use_id' in block &&
417
+ toolUseIds.includes(block.tool_use_id) &&
418
+ !foundIds.has(block.tool_use_id)) {
419
+ collectedResults.push({ ...block });
420
+ foundIds.add(block.tool_use_id);
421
+ if (!idsToRemoveFromMsg.has(j))
422
+ idsToRemoveFromMsg.set(j, new Set());
423
+ idsToRemoveFromMsg.get(j).add(block.tool_use_id);
424
+ }
425
+ }
426
+ if (foundIds.size === toolUseIds.length)
427
+ break;
428
+ }
429
+ // 对找不到 tool_result 的 tool_use 补充 error 占位
430
+ for (const id of toolUseIds) {
431
+ if (!foundIds.has(id)) {
432
+ collectedResults.push({
433
+ type: 'tool_result',
434
+ tool_use_id: id,
435
+ content: `Error: ${ORPHANED_TOOL_ERROR_MESSAGE}`,
436
+ is_error: true,
437
+ });
438
+ }
439
+ }
440
+ if (collectedResults.length > 0) {
441
+ insertAfterIdx.set(i, collectedResults);
442
+ console.log(chalk.yellow(`[validateToolResults] Detected consecutive assistant messages, fixed ${collectedResults.length} tool_result position(s) (assistant[${i}] → assistant[${i + 1}])`));
443
+ }
444
+ }
445
+ if (insertAfterIdx.size === 0) {
446
+ return messages;
447
+ }
448
+ // 重建消息数组
449
+ const result = [];
450
+ for (let i = 0; i < messages.length; i++) {
451
+ let msg = messages[i];
452
+ // 从该消息中移除已被搬移的 tool_result 块
453
+ if (idsToRemoveFromMsg.has(i) && msg.role === 'user' && Array.isArray(msg.content)) {
454
+ const idsToRemove = idsToRemoveFromMsg.get(i);
455
+ const newContent = msg.content.filter((b) => !(b.type === 'tool_result' && idsToRemove.has(b.tool_use_id)));
456
+ if (newContent.length === 0) {
457
+ // 消息内容全部移走,跳过(不推入 result)
458
+ // 但仍需检查是否有插入操作(不太可能,但保险起见)
459
+ if (insertAfterIdx.has(i)) {
460
+ result.push({ role: 'user', content: insertAfterIdx.get(i) });
461
+ }
462
+ continue;
463
+ }
464
+ msg = { ...msg, content: newContent };
465
+ }
466
+ result.push(msg);
467
+ // 在当前 assistant 消息之后插入搬移来的 tool_result user 消息
468
+ if (insertAfterIdx.has(i)) {
469
+ result.push({ role: 'user', content: insertAfterIdx.get(i) });
470
+ }
471
+ }
472
+ return result;
473
+ }
474
+ /**
475
+ * 验证并修复孤立的 tool_result
476
+ *
477
+ * 问题场景:
478
+ * 当流式执行中断时(网络错误、用户中止、sibling tool 失败等),
479
+ * assistant 消息中可能已经有了 tool_use 块,但 user 消息中缺少对应的 tool_result。
480
+ * 这会导致 Anthropic API 报错,因为 API 要求每个 tool_use 都必须有对应的 tool_result。
481
+ *
482
+ * 此函数会:
483
+ * 1. 收集所有 assistant 消息中的 tool_use IDs
484
+ * 2. 收集所有 user 消息中的 tool_result IDs
485
+ * 3. 找出缺少 tool_result 的 tool_use(孤立的 tool_use)
486
+ * 4. 为每个孤立的 tool_use 创建一个 error tool_result
487
+ * 5. 将这些 error tool_result 追加到最后一个 user 消息中,或创建新的 user 消息
488
+ *
489
+ * 对齐 v2.1.7 的 "Fixed orphaned tool_result errors when sibling tools fail during streaming execution" 修复
490
+ *
491
+ * @param messages 消息列表
492
+ * @returns 修复后的消息列表
493
+ */
494
+ export function validateToolResults(messages) {
495
+ if (messages.length === 0) {
496
+ return messages;
497
+ }
498
+ // 步骤 0:修复连续两条 assistant 消息导致的 tool_result 位置错误
499
+ // 场景:messages[i]=assistant(tool_use), messages[i+1]=assistant(text), messages[i+2+]=user(tool_result)
500
+ // API 要求 tool_result 必须在 tool_use 的紧接下一条消息中,连续 assistant 消息会破坏此约束
501
+ messages = fixConsecutiveAssistantMessages(messages);
502
+ // 1. 收集所有 tool_use IDs(从 assistant 消息中)
503
+ const toolUseIds = new Set();
504
+ const toolUseNames = new Map(); // id -> name 映射
505
+ for (const msg of messages) {
506
+ if (msg.role === 'assistant' && Array.isArray(msg.content)) {
507
+ for (const block of msg.content) {
508
+ if (typeof block === 'object' &&
509
+ 'type' in block &&
510
+ block.type === 'tool_use' &&
511
+ 'id' in block &&
512
+ typeof block.id === 'string') {
513
+ toolUseIds.add(block.id);
514
+ if ('name' in block && typeof block.name === 'string') {
515
+ toolUseNames.set(block.id, block.name);
516
+ }
517
+ }
518
+ }
519
+ }
520
+ }
521
+ // 如果没有任何 tool_use,直接返回
522
+ if (toolUseIds.size === 0) {
523
+ return messages;
524
+ }
525
+ // 2. 收集所有 tool_result IDs(从 user 消息中),同时去重
526
+ // API 要求每个 tool_use_id 只能有一个 tool_result,重复会导致 400 错误:
527
+ // "each tool_use must have a single result. Found multiple tool_result blocks with id: ..."
528
+ const toolResultIds = new Set();
529
+ let duplicateCount = 0;
530
+ const result = messages.map(msg => {
531
+ if (msg.role !== 'user' || !Array.isArray(msg.content)) {
532
+ return msg;
533
+ }
534
+ let hasDuplicate = false;
535
+ const deduped = msg.content.filter((block) => {
536
+ if (typeof block === 'object' &&
537
+ 'type' in block &&
538
+ block.type === 'tool_result' &&
539
+ 'tool_use_id' in block &&
540
+ typeof block.tool_use_id === 'string') {
541
+ if (toolResultIds.has(block.tool_use_id)) {
542
+ // 重复的 tool_result,移除
543
+ hasDuplicate = true;
544
+ duplicateCount++;
545
+ return false;
546
+ }
547
+ toolResultIds.add(block.tool_use_id);
548
+ }
549
+ return true;
550
+ });
551
+ if (hasDuplicate) {
552
+ // 如果去重后消息内容为空,返回 null 标记稍后移除
553
+ if (deduped.length === 0) {
554
+ return null;
555
+ }
556
+ return { ...msg, content: deduped };
557
+ }
558
+ return msg;
559
+ }).filter((msg) => msg !== null);
560
+ if (duplicateCount > 0) {
561
+ console.log(chalk.yellow(`[validateToolResults] Removed ${duplicateCount} duplicate tool_result(s)`));
562
+ }
563
+ // 3. 找出孤立的 tool_use(有 tool_use 但没有对应的 tool_result)
564
+ const orphanedIds = new Set();
565
+ for (const id of toolUseIds) {
566
+ if (!toolResultIds.has(id)) {
567
+ orphanedIds.add(id);
568
+ }
569
+ }
570
+ // 如果没有孤立的 tool_use,直接返回
571
+ if (orphanedIds.size === 0) {
572
+ return result;
573
+ }
574
+ // 4. 逐个 assistant 消息就地修复:为其中的孤立 tool_use 在紧接着的 user 消息中补上 error tool_result
575
+ // API 要求每个 tool_use block 的 tool_result 必须在"紧接的下一条 user 消息"中,
576
+ // 不能统一放到消息列表末尾。
577
+ let fixedCount = 0;
578
+ // 从后往前遍历,因为 splice 插入会改变后续索引,从后往前不影响前面的索引
579
+ for (let i = result.length - 1; i >= 0; i--) {
580
+ const msg = result[i];
581
+ if (msg.role !== 'assistant' || !Array.isArray(msg.content)) {
582
+ continue;
583
+ }
584
+ // 收集此 assistant 消息中的孤立 tool_use ids
585
+ const orphansInThisMsg = [];
586
+ for (const block of msg.content) {
587
+ if (typeof block === 'object' &&
588
+ 'type' in block &&
589
+ block.type === 'tool_use' &&
590
+ 'id' in block &&
591
+ typeof block.id === 'string' &&
592
+ orphanedIds.has(block.id)) {
593
+ orphansInThisMsg.push(block.id);
594
+ }
595
+ }
596
+ if (orphansInThisMsg.length === 0) {
597
+ continue;
598
+ }
599
+ // 创建 error tool_result 块
600
+ const errorResults = orphansInThisMsg.map(id => ({
601
+ type: 'tool_result',
602
+ tool_use_id: id,
603
+ content: `Error: ${ORPHANED_TOOL_ERROR_MESSAGE} (Tool: ${toolUseNames.get(id) || 'unknown'})`,
604
+ is_error: true,
605
+ }));
606
+ // 检查紧接着的下一条消息是否是 user 消息
607
+ const nextIndex = i + 1;
608
+ if (nextIndex < result.length && result[nextIndex].role === 'user' && Array.isArray(result[nextIndex].content)) {
609
+ // 追加到现有 user 消息中
610
+ result[nextIndex] = {
611
+ ...result[nextIndex],
612
+ content: [...result[nextIndex].content, ...errorResults],
613
+ };
614
+ }
615
+ else {
616
+ // 在 assistant 消息之后插入新的 user 消息
617
+ result.splice(nextIndex, 0, {
618
+ role: 'user',
619
+ content: errorResults,
620
+ });
621
+ }
622
+ fixedCount += orphansInThisMsg.length;
623
+ }
624
+ // 输出调试信息
625
+ if (fixedCount > 0) {
626
+ console.log(chalk.yellow(`[validateToolResults] Fixed ${fixedCount} orphaned tool_use(s):`));
627
+ for (const id of orphanedIds) {
628
+ const toolName = toolUseNames.get(id) || 'unknown';
629
+ console.log(chalk.yellow(` - ${toolName} (${id})`));
630
+ }
631
+ }
632
+ return result;
633
+ }
634
+ /**
635
+ * 计算消息历史的总 token 数
636
+ * 遍历所有消息内容,累加 token 估算值
637
+ * @param messages 消息列表
638
+ * @returns 总 token 数(估算值)
639
+ */
640
+ function calculateTotalTokens(messages) {
641
+ let totalTokens = 0;
642
+ for (const msg of messages) {
643
+ if (!Array.isArray(msg.content)) {
644
+ // 字符串内容
645
+ if (typeof msg.content === 'string') {
646
+ totalTokens += estimateTokens(msg.content);
647
+ }
648
+ continue;
649
+ }
650
+ // 数组内容
651
+ for (const block of msg.content) {
652
+ if (typeof block === 'string') {
653
+ totalTokens += estimateTokens(block);
654
+ }
655
+ else if (typeof block === 'object' && 'type' in block) {
656
+ if (block.type === 'text' && 'text' in block && typeof block.text === 'string') {
657
+ totalTokens += estimateTokens(block.text);
658
+ }
659
+ else if (block.type === 'image') {
660
+ // 图片用固定常量,不能 JSON.stringify base64 数据(对齐官方 Nr4=2000)
661
+ totalTokens += 2000;
662
+ }
663
+ else if (block.type === 'document') {
664
+ // PDF 文档用固定常量,不能 JSON.stringify base64 数据(否则 1MB PDF 会估算出 ~340k tokens 直接触发 AutoCompact)
665
+ // Anthropic API 对 PDF document block 的实际 token 消耗约 2000-8000/页,这里用固定常量粗略估算
666
+ totalTokens += 4000;
667
+ }
668
+ else if (block.type === 'tool_result' && 'content' in block) {
669
+ if (typeof block.content === 'string') {
670
+ totalTokens += estimateTokens(block.content);
671
+ }
672
+ else if (Array.isArray(block.content)) {
673
+ // content 是数组(如 Browser screenshot 的 [TextBlock, ImageBlock])
674
+ // 逐个 block 处理,避免 JSON.stringify base64 导致 token 估算膨胀
675
+ for (const item of block.content) {
676
+ if (item.type === 'image') {
677
+ totalTokens += 2000;
678
+ }
679
+ else if (item.type === 'text' && typeof item.text === 'string') {
680
+ totalTokens += estimateTokens(item.text);
681
+ }
682
+ else {
683
+ totalTokens += estimateTokens(JSON.stringify(item));
684
+ }
685
+ }
686
+ }
687
+ }
688
+ else {
689
+ totalTokens += estimateTokens(JSON.stringify(block));
690
+ }
691
+ }
692
+ }
693
+ }
694
+ return totalTokens;
695
+ }
696
+ /**
697
+ * 获取模型的上下文窗口大小
698
+ * 对齐官方实现
699
+ * @param model 模型 ID
700
+ * @returns 上下文窗口大小(tokens)
701
+ */
702
+ export function getContextWindowSize(model) {
703
+ // 检查是否是 1M 模型(带 [1m] 标记)
704
+ if (model.includes('[1m]')) {
705
+ return 1000000;
706
+ }
707
+ // 默认 200K 上下文窗口
708
+ return 200000;
709
+ }
710
+ /**
711
+ * 获取模型的最大输出 tokens
712
+ * 对齐官方 kH0 函数
713
+ * @param model 模型 ID
714
+ * @returns 最大输出 tokens
715
+ */
716
+ export function getMaxOutputTokens(model) {
717
+ let defaultMax;
718
+ // 根据模型类型确定默认最大输出 tokens
719
+ if (model.includes('opus-4-5')) {
720
+ defaultMax = 64000;
721
+ }
722
+ else if (model.includes('opus-4')) {
723
+ defaultMax = 32000;
724
+ }
725
+ else if (model.includes('sonnet-4') || model.includes('haiku-4')) {
726
+ defaultMax = 64000;
727
+ }
728
+ else {
729
+ defaultMax = 32000;
730
+ }
731
+ // settings.json maxTokens 可以覆盖(但不能超过默认最大值)
732
+ try {
733
+ const configMax = configManager.get('maxTokens');
734
+ if (configMax && configMax > 0) {
735
+ return Math.min(configMax, defaultMax);
736
+ }
737
+ }
738
+ catch { }
739
+ return defaultMax;
740
+ }
741
+ /**
742
+ * 计算可用的输入 token 空间
743
+ * 对齐官方 EHA 函数(官方 N91: IG(A, iP()) - Math.min(zh8(A), _QY))
744
+ * _QY = 20000: 将 maxOutputTokens cap 在 20K,防止过度预留输出空间
745
+ * @param model 模型 ID
746
+ * @returns 可用的输入 tokens
747
+ */
748
+ export function calculateAvailableInput(model) {
749
+ return getContextWindowSize(model) - Math.min(getMaxOutputTokens(model), 20000);
750
+ }
751
+ /**
752
+ * 计算自动压缩阈值
753
+ * 对齐官方 zT2 函数
754
+ * @param model 模型 ID
755
+ * @returns 自动压缩阈值(tokens)
756
+ */
757
+ export function calculateAutoCompactThreshold(model) {
758
+ const availableInput = calculateAvailableInput(model);
759
+ // 压缩缓冲区:从 13k 提高到 40k
760
+ // 原因:Claude API 在大上下文(>130k tokens)时 SSE 流不稳定,容易中断
761
+ // 200k 模型:availableInput=180k, threshold=140k (有效输入的 78%, 总窗口的 70%)
762
+ const vH0 = 40000;
763
+ const threshold = availableInput - vH0;
764
+ // 环境变量可以覆盖百分比
765
+ const override = process.env.AXON_AUTOCOMPACT_PCT_OVERRIDE;
766
+ if (override) {
767
+ const pct = parseFloat(override);
768
+ if (!isNaN(pct) && pct > 0 && pct <= 100) {
769
+ return Math.min(Math.floor(availableInput * (pct / 100)), threshold);
770
+ }
771
+ }
772
+ return threshold;
773
+ }
774
+ /**
775
+ * 检查是否超过自动压缩阈值
776
+ * 对齐官方 Sy5 函数
777
+ * @param messages 消息列表
778
+ * @param model 模型 ID
779
+ * @returns 是否超过阈值
780
+ */
781
+ export function isAboveAutoCompactThreshold(messages, model) {
782
+ const totalTokens = calculateTotalTokens(messages);
783
+ const threshold = calculateAutoCompactThreshold(model);
784
+ return totalTokens >= threshold;
785
+ }
786
+ /**
787
+ * 综合判断是否应该自动压缩
788
+ * @param messages 消息列表
789
+ * @param model 模型 ID
790
+ * @returns 是否应该自动压缩
791
+ */
792
+ export function shouldAutoCompact(messages, model) {
793
+ // 1. 检查环境变量 - 如果禁用则直接返回
794
+ if (isEnvTrue(process.env.DISABLE_COMPACT)) {
795
+ return false;
796
+ }
797
+ // 2. 检查配置
798
+ // 注意:这里可以从 configManager 读取 autoCompactEnabled
799
+ // 但为了避免循环依赖,暂时跳过配置检查
800
+ // 未来可以通过依赖注入的方式传入配置
801
+ // 3. 检查是否超过阈值
802
+ return isAboveAutoCompactThreshold(messages, model);
803
+ }
804
+ /**
805
+ * 生成对话摘要的 prompt(对齐官方 aY0 函数)
806
+ * @param customInstructions 自定义指令(可选)
807
+ * @returns 摘要 prompt
808
+ */
809
+ export function generateSummaryPrompt(customInstructions) {
810
+ // 对齐官方 dDA 函数的完整摘要 prompt
811
+ let prompt = `Your task is to create a detailed summary of the conversation so far, paying close attention to the user's explicit requests and your previous actions.
812
+ This summary should be thorough in capturing technical details, code patterns, and architectural decisions that would be essential for continuing development work without losing context.
813
+
814
+ CRITICAL: If the conversation contains a previous summary (marked with <conversation-summary> tags or "Conversation Compacted" markers), you MUST incorporate ALL information from that previous summary into your new summary. Previous summaries contain essential context from earlier parts of the conversation that would otherwise be lost. Treat previous summary content with the same importance as direct conversation messages.
815
+
816
+ Before providing your final summary, wrap your analysis in <analysis> tags to organize your thoughts and ensure you've covered all necessary points. In your analysis process:
817
+
818
+ 1. Chronologically analyze each message and section of the conversation. For each section thoroughly identify:
819
+ - The user's explicit requests and intents
820
+ - Your approach to addressing the user's requests
821
+ - Key decisions, technical concepts and code patterns
822
+ - Specific details like:
823
+ - file names
824
+ - full code snippets
825
+ - function signatures
826
+ - file edits
827
+ - Errors that you ran into and how you fixed them
828
+ - Pay special attention to specific user feedback that you received, especially if the user told you to do something differently.
829
+ 2. Double-check for technical accuracy and completeness, addressing each required element thoroughly.
830
+
831
+ Your summary should include the following sections:
832
+
833
+ 1. Primary Request and Intent: Capture all of the user's explicit requests and intents in detail
834
+ 2. Key Technical Concepts: List all important technical concepts, technologies, and frameworks discussed.
835
+ 3. Files and Code Sections: Enumerate specific files and code sections examined, modified, or created. Pay special attention to the most recent messages and include full code snippets where applicable and include a summary of why this file read or edit is important.
836
+ 4. Errors and fixes: List all errors that you ran into, and how you fixed them. Pay special attention to specific user feedback that you received, especially if the user told you to do something differently.
837
+ 5. Problem Solving: Document problems solved and any ongoing troubleshooting efforts.
838
+ 6. All user messages: List ALL user messages that are not tool results. These are critical for understanding the users' feedback and changing intent.
839
+ 7. Pending Tasks: Outline any pending tasks that you have explicitly been asked to work on.
840
+ 8. Current Work: Describe in detail precisely what was being worked on immediately before this summary request, paying special attention to the most recent messages from both user and assistant. Include file names and code snippets where applicable.
841
+ 9. Optional Next Step: List the next step that you will take that is related to the most recent work you were doing. IMPORTANT: ensure that this step is DIRECTLY in line with the user's most recent explicit requests, and the task you were working on immediately before this summary request. If your last task was concluded, then only list next steps if they are explicitly in line with the users request. Do not start on tangential requests or really old requests that were already completed without confirming with the user first.
842
+ If there is a next step, include direct quotes from the most recent conversation showing exactly what task you were working on and where you left off. This should be verbatim to ensure there's no drift in task interpretation.
843
+ 10. Language: Write the summary in the same language as the majority of the conversation. If the conversation is primarily in Chinese, write the summary in Chinese (keep technical terms, file paths, and code in English). This avoids translation loss and preserves the original nuance of user requests and feedback.
844
+
845
+ IMPORTANT: Do NOT use any tools. You MUST respond with ONLY the <summary>...</summary> block as your text output.`;
846
+ if (customInstructions && customInstructions.trim() !== '') {
847
+ prompt += `\n\nAdditional Instructions:\n${customInstructions}`;
848
+ }
849
+ return prompt;
850
+ }
851
+ /**
852
+ * 创建压缩边界标记(对齐官方 LJ1 函数)
853
+ * @param trigger 触发方式 ('auto' 或 'manual')
854
+ * @param preTokens 压缩前的token数
855
+ * @returns 边界标记消息
856
+ */
857
+ function createCompactBoundaryMarker(trigger, preTokens) {
858
+ return {
859
+ role: 'user',
860
+ content: `--- Conversation Compacted (${trigger}) ---\nPrevious messages were summarized to save ${preTokens.toLocaleString()} tokens.`,
861
+ };
862
+ }
863
+ /**
864
+ * 格式化摘要消息(对齐官方 l71 函数)
865
+ * @param summary 摘要内容
866
+ * @param microcompact 是否为微压缩
867
+ * @returns 格式化后的摘要文本
868
+ */
869
+ function formatSummaryMessage(summary, microcompact) {
870
+ if (microcompact) {
871
+ // 微压缩模式:保留原始摘要
872
+ return summary;
873
+ }
874
+ // 正常模式:添加标记
875
+ return `<conversation-summary>\n${summary}\n</conversation-summary>`;
876
+ }
877
+ /**
878
+ * 清理摘要中的 XML 标签(对齐官方 oT9 函数)
879
+ * 将 <analysis>...</analysis> 和 <summary>...</summary> 转为纯文本格式
880
+ * @param summary 原始摘要文本
881
+ * @returns 清理后的摘要文本
882
+ */
883
+ export function cleanSummaryXmlTags(summary) {
884
+ let result = summary;
885
+ // 将 <analysis>...</analysis> 转为 "Analysis:\n{content}"
886
+ const analysisMatch = result.match(/<analysis>([\s\S]*?)<\/analysis>/);
887
+ if (analysisMatch) {
888
+ const content = analysisMatch[1] || '';
889
+ result = result.replace(/<analysis>[\s\S]*?<\/analysis>/, `Analysis:\n${content.trim()}`);
890
+ }
891
+ // 将 <summary>...</summary> 转为 "Summary:\n{content}"
892
+ const summaryMatch = result.match(/<summary>([\s\S]*?)<\/summary>/);
893
+ if (summaryMatch) {
894
+ const content = summaryMatch[1] || '';
895
+ result = result.replace(/<summary>[\s\S]*?<\/summary>/, `Summary:\n${content.trim()}`);
896
+ }
897
+ // 去除多余的连续空行
898
+ result = result.replace(/\n\n+/g, '\n\n');
899
+ return result.trim();
900
+ }
901
+ /**
902
+ * 格式化压缩摘要内容(对齐官方 Au1 函数)
903
+ * 将 AI 生成的摘要包装为标准格式的用户消息内容
904
+ * @param summaryText AI 生成的原始摘要
905
+ * @param isContinuation 是否为继续上次任务(添加 "Please continue..." 提示)
906
+ * @returns 格式化后的消息内容
907
+ */
908
+ export function formatCompactSummaryContent(summaryText, isContinuation) {
909
+ let content = `This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
910
+
911
+ ${cleanSummaryXmlTags(summaryText)}`;
912
+ if (isContinuation) {
913
+ content += `\nPlease continue the conversation from where we left it off without asking the user any further questions. Continue with the last task that you were asked to work on.`;
914
+ }
915
+ return content;
916
+ }
917
+ /**
918
+ * 获取最后一个压缩边界后的消息(对齐官方 QS 函数)
919
+ * @param messages 消息列表
920
+ * @returns 最后一个边界后的消息
921
+ */
922
+ function getMessagesSinceLastBoundary(messages) {
923
+ // 从后往前查找最后一个压缩边界标记
924
+ // 边界标记的特征:用户消息,内容包含 "Conversation Compacted"
925
+ for (let i = messages.length - 1; i >= 0; i--) {
926
+ const msg = messages[i];
927
+ if (msg &&
928
+ msg.role === 'user' &&
929
+ typeof msg.content === 'string' &&
930
+ msg.content.includes('Conversation Compacted')) {
931
+ // 返回边界标记之后的所有消息
932
+ return messages.slice(i);
933
+ }
934
+ }
935
+ // 如果没有找到边界标记,返回所有消息
936
+ return messages;
937
+ }
938
+ // ============================================================================
939
+ // Layer 3: TJ1 - Session Memory 压缩相关函数
940
+ // ============================================================================
941
+ /**
942
+ * 检查Session Memory功能是否启用(对齐官方 rF1 函数)
943
+ *
944
+ * 官方实现检查两个Feature Flags:
945
+ * - tengu_session_memory
946
+ * - tengu_sm_compact
947
+ *
948
+ * 官方使用远程 Feature Flag,我们直接写死为 true
949
+ *
950
+ * @returns 始终返回 true
951
+ */
952
+ async function isSessionMemoryEnabled() {
953
+ // 官方检查 ROA("tengu_session_memory") && ROA("tengu_sm_compact")
954
+ // 我们直接写死为 true,与官方功能保持一致
955
+ return checkSessionMemoryEnabled();
956
+ }
957
+ /**
958
+ * 获取Session Memory模板内容(对齐官方 vL0 函数)
959
+ *
960
+ * 官方使用内置模板 w97,包含 10 个结构化章节:
961
+ * - Session Title, Current State, Task specification
962
+ * - Files and Functions, Workflow, Errors & Corrections
963
+ * - Codebase and System Documentation, Learnings
964
+ * - Key results, Worklog
965
+ *
966
+ * @returns Session Memory模板内容
967
+ */
968
+ function getSessionMemoryTemplate() {
969
+ // 使用官方模板 w97
970
+ return SESSION_MEMORY_TEMPLATE;
971
+ }
972
+ /**
973
+ * 检查模板是否为空(对齐官方 Os2 函数)
974
+ * @param template 模板内容
975
+ * @returns 是否为空模板
976
+ */
977
+ async function isTemplateEmpty(template) {
978
+ // 使用新的 session-memory 模块的函数
979
+ return isEmptyTemplate(template);
980
+ }
981
+ /**
982
+ * 获取最后一次压缩的UUID(对齐官方 nj2 函数)
983
+ *
984
+ * 这个函数查找消息历史中最后一个Session Memory边界标记的UUID
985
+ * 用于实现增量压缩(只压缩新消息,不重复压缩已压缩的内容)
986
+ *
987
+ * @param session 会话对象,用于获取存储的压缩状态
988
+ * @returns 最后一次压缩的UUID,如果没有则返回null
989
+ */
990
+ function getLastCompactedUuid(session) {
991
+ // 从会话状态中获取最后一次压缩的边界标记 UUID
992
+ // 官方实现存储在会话状态中,用于支持增量压缩
993
+ if (session) {
994
+ return session.getLastCompactedUuid() || null;
995
+ }
996
+ return null;
997
+ }
998
+ /**
999
+ * 等待异步操作(对齐官方 Ws2 函数)
1000
+ * 等待 session memory 写入完成
1001
+ */
1002
+ async function waitForAsyncInit() {
1003
+ // 等待 session memory 写入完成
1004
+ await waitForSessionMemoryWrite();
1005
+ }
1006
+ /**
1007
+ * 创建Session Memory压缩结果(对齐官方 jy5 函数)
1008
+ *
1009
+ * 这个函数构建压缩后的消息列表,包括:
1010
+ * - boundaryMarker: 边界标记(标识压缩点)
1011
+ * - summaryMessages: 摘要消息(Session Memory内容)
1012
+ * - attachments: 附件(如果有agentId)
1013
+ * - hookResults: Hook执行结果(如果有)
1014
+ * - messagesToKeep: 需要保留的新消息
1015
+ *
1016
+ * @param messages 所有消息
1017
+ * @param template 压缩模板
1018
+ * @param messagesToKeep 需要保留的消息
1019
+ * @param agentId 代理ID(可选)
1020
+ * @returns 压缩结果
1021
+ */
1022
+ function createSessionMemoryCompactResult(messages, template, messagesToKeep, agentId) {
1023
+ // 1. 计算压缩前token数
1024
+ const preCompactTokenCount = calculateTotalTokens(messages);
1025
+ // 2. 创建边界标记(使用uuid字段标记这是Session Memory压缩)
1026
+ const boundaryUuid = `sm-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
1027
+ const boundaryMarker = {
1028
+ role: 'user',
1029
+ content: `--- Session Memory Compacted (auto) ---\nPrevious messages were compressed using Session Memory.`,
1030
+ uuid: boundaryUuid,
1031
+ };
1032
+ // 3. 创建摘要消息(对齐官方 Au1 函数格式)
1033
+ const summaryContent = formatCompactSummaryContent(template, true);
1034
+ const summaryMessage = {
1035
+ role: 'user',
1036
+ content: summaryContent,
1037
+ isCompactSummary: true,
1038
+ isVisibleInTranscriptOnly: true,
1039
+ };
1040
+ // 4. 创建附件(如果有agentId,添加agent上下文)
1041
+ const attachments = [];
1042
+ if (agentId) {
1043
+ // 添加agent上下文附件
1044
+ attachments.push({
1045
+ role: 'user',
1046
+ content: `Agent context: ${agentId}`,
1047
+ });
1048
+ }
1049
+ // v2.1.70: 提取原始消息中的图片,保留到压缩结果中以复用 prompt cache
1050
+ const preservedImages = extractImagesFromMessages(messages);
1051
+ if (preservedImages.length > 0) {
1052
+ attachments.push({
1053
+ role: 'user',
1054
+ content: preservedImages,
1055
+ });
1056
+ }
1057
+ // 5. Hook结果(暂时为空,未来可以扩展)
1058
+ const hookResults = [];
1059
+ // 6. 计算压缩后token数(边界标记 + 摘要)
1060
+ const postCompactTokenCount = calculateTotalTokens([summaryMessage]);
1061
+ return {
1062
+ boundaryMarker,
1063
+ summaryMessages: [summaryMessage],
1064
+ attachments,
1065
+ hookResults,
1066
+ messagesToKeep,
1067
+ preCompactTokenCount,
1068
+ postCompactTokenCount,
1069
+ };
1070
+ }
1071
+ /**
1072
+ * 尝试Session Memory压缩(第三层 - 对齐官方 TJ1 函数)
1073
+ *
1074
+ * 核心流程:
1075
+ * 1. 检查Feature Flag是否启用
1076
+ * 2. 找到最后一个压缩边界标记的UUID
1077
+ * 3. 只压缩边界后的新消息(增量压缩)
1078
+ * 4. 使用AI模型生成Session Memory
1079
+ * 5. 检查压缩后是否仍超过阈值
1080
+ *
1081
+ * @param messages 当前消息历史
1082
+ * @param agentId 代理ID(可选)
1083
+ * @param autoCompactThreshold 自动压缩阈值(可选)
1084
+ * @param session 会话对象(可选,用于获取压缩状态)
1085
+ * @returns 压缩结果
1086
+ */
1087
+ async function trySessionMemoryCompact(messages, agentId, autoCompactThreshold, session, projectPath, sessionId) {
1088
+ // 1. 检查Feature Flag是否启用
1089
+ if (!(await isSessionMemoryEnabled())) {
1090
+ return null;
1091
+ }
1092
+ // 2. 等待异步初始化
1093
+ await waitForAsyncInit();
1094
+ // 3. 获取最后一次压缩的UUID(从会话状态中读取)
1095
+ const lastCompactedUuid = getLastCompactedUuid(session);
1096
+ // 4. 获取Session Memory内容(优先使用实际内容,fallback到模板)
1097
+ let template = null;
1098
+ if (projectPath && sessionId) {
1099
+ const actualContent = readSessionMemory(projectPath, sessionId);
1100
+ if (actualContent && actualContent.trim()) {
1101
+ template = actualContent;
1102
+ console.log(chalk.blue('[TJ1] Using actual Session Memory content for compaction'));
1103
+ }
1104
+ }
1105
+ if (!template) {
1106
+ template = getSessionMemoryTemplate();
1107
+ if (template) {
1108
+ console.log(chalk.blue('[TJ1] Using Session Memory template (actual content not found)'));
1109
+ }
1110
+ }
1111
+ if (!template) {
1112
+ return null;
1113
+ }
1114
+ // 5. 检查模板是否为空
1115
+ if (await isTemplateEmpty(template)) {
1116
+ console.log(chalk.yellow('[TJ1] Session Memory template is empty, skipping compaction'));
1117
+ return null;
1118
+ }
1119
+ try {
1120
+ // 6. 确定需要压缩的消息范围(增量压缩)
1121
+ let messagesToCompress;
1122
+ if (lastCompactedUuid) {
1123
+ // 找到上次压缩边界的索引
1124
+ const lastBoundaryIndex = messages.findIndex((msg) => msg.uuid === lastCompactedUuid);
1125
+ if (lastBoundaryIndex === -1) {
1126
+ // 找不到边界标记,可能会话数据不一致
1127
+ messagesToCompress = [];
1128
+ console.log(chalk.yellow('[TJ1] Cannot find last compaction boundary, skipping compaction'));
1129
+ }
1130
+ else {
1131
+ // 只压缩边界之后的新消息
1132
+ messagesToCompress = messages.slice(lastBoundaryIndex + 1);
1133
+ }
1134
+ }
1135
+ else {
1136
+ // 首次压缩,压缩所有消息
1137
+ messagesToCompress = [];
1138
+ console.log(chalk.blue('[TJ1] Detected resumed session, will perform full compaction'));
1139
+ }
1140
+ // 7. 创建压缩结果(使用模板)
1141
+ const compactResult = createSessionMemoryCompactResult(messages, template, messagesToCompress, agentId);
1142
+ // 8. 构建最终消息列表
1143
+ const finalMessages = [
1144
+ compactResult.boundaryMarker,
1145
+ ...compactResult.summaryMessages,
1146
+ ...compactResult.attachments,
1147
+ ...compactResult.hookResults,
1148
+ ...compactResult.messagesToKeep,
1149
+ ];
1150
+ // 9. 计算最终token数
1151
+ const finalTokenCount = calculateTotalTokens(finalMessages);
1152
+ // 10. 检查压缩后是否仍超过阈值
1153
+ if (autoCompactThreshold !== undefined && finalTokenCount >= autoCompactThreshold) {
1154
+ console.log(chalk.yellow(`[TJ1] Post-compaction token count (${finalTokenCount.toLocaleString()}) still exceeds threshold (${autoCompactThreshold.toLocaleString()}), skipping compaction`));
1155
+ return null;
1156
+ }
1157
+ // 11. 返回压缩结果
1158
+ const savedTokens = compactResult.preCompactTokenCount - finalTokenCount;
1159
+ console.log(chalk.green('[TJ1] Session Memory compaction successful'));
1160
+ console.log(chalk.green(`[TJ1] Before compaction: ${compactResult.preCompactTokenCount.toLocaleString()} tokens`));
1161
+ console.log(chalk.green(`[TJ1] After compaction: ${finalTokenCount.toLocaleString()} tokens`));
1162
+ console.log(chalk.green(`[TJ1] Saved: ${savedTokens.toLocaleString()} tokens`));
1163
+ return {
1164
+ success: true,
1165
+ messages: finalMessages,
1166
+ savedTokens,
1167
+ preCompactTokenCount: compactResult.preCompactTokenCount,
1168
+ postCompactTokenCount: finalTokenCount,
1169
+ boundaryMarker: compactResult.boundaryMarker,
1170
+ summaryMessages: compactResult.summaryMessages,
1171
+ attachments: compactResult.attachments,
1172
+ hookResults: compactResult.hookResults,
1173
+ messagesToKeep: compactResult.messagesToKeep,
1174
+ };
1175
+ }
1176
+ catch (error) {
1177
+ // 捕获所有异常,返回null(对齐官方实现)
1178
+ console.log(chalk.yellow(`[TJ1] Session Memory compaction failed: ${error instanceof Error ? error.message : String(error)}`));
1179
+ return null;
1180
+ }
1181
+ }
1182
+ /**
1183
+ * v2.1.70: 从消息列表中提取所有图片 content blocks
1184
+ * 用于 compaction 后保留图片,以便 prompt cache 复用
1185
+ *
1186
+ * 提取来源:
1187
+ * 1. 用户消息中的 image blocks
1188
+ * 2. tool_result 中嵌套的 image blocks(如 Browser 截图)
1189
+ */
1190
+ export function extractImagesFromMessages(messages) {
1191
+ const images = [];
1192
+ for (const msg of messages) {
1193
+ if (!Array.isArray(msg.content))
1194
+ continue;
1195
+ for (const block of msg.content) {
1196
+ if (typeof block !== 'object' || !('type' in block))
1197
+ continue;
1198
+ if (block.type === 'image') {
1199
+ images.push(block);
1200
+ }
1201
+ else if (block.type === 'tool_result' && 'content' in block && Array.isArray(block.content)) {
1202
+ for (const item of block.content) {
1203
+ if (typeof item === 'object' && 'type' in item && item.type === 'image') {
1204
+ images.push(item);
1205
+ }
1206
+ }
1207
+ }
1208
+ }
1209
+ }
1210
+ return images;
1211
+ }
1212
+ /**
1213
+ * 尝试进行对话摘要压缩(第二层 - 对齐官方 NJ1 函数)
1214
+ *
1215
+ * 核心流程:
1216
+ * 1. 验证消息列表不为空
1217
+ * 2. 获取最后一个边界标记后的消息
1218
+ * 3. 生成摘要 prompt
1219
+ * 4. 调用 AI 模型生成摘要(使用 streaming API)
1220
+ * 5. 创建压缩边界标记
1221
+ * 6. 返回压缩结果
1222
+ *
1223
+ * @param messages 当前消息历史
1224
+ * @param client Claude客户端(用于调用AI生成摘要)
1225
+ * @param customInstructions 自定义摘要指令(可选)
1226
+ * @returns 压缩结果
1227
+ */
1228
+ async function tryConversationSummary(messages, client, customInstructions) {
1229
+ try {
1230
+ // 1. 验证输入
1231
+ if (messages.length === 0) {
1232
+ console.log(chalk.yellow('[NJ1] Message list is empty, skipping summary'));
1233
+ return null;
1234
+ }
1235
+ const preCompactTokenCount = calculateTotalTokens(messages);
1236
+ // 2. 获取最后一个边界标记后的消息(避免重复摘要)
1237
+ const messagesToSummarize = getMessagesSinceLastBoundary(messages);
1238
+ // 3. 生成摘要 prompt
1239
+ const summaryPrompt = generateSummaryPrompt(customInstructions);
1240
+ // 4. 创建摘要请求消息
1241
+ const summaryRequestMessage = {
1242
+ role: 'user',
1243
+ content: summaryPrompt,
1244
+ };
1245
+ // 5. 调用 AI 模型生成摘要
1246
+ // 注意:使用当前模型(Haiku模型成本低,但这里遵循官方使用 p3())
1247
+ console.log(chalk.blue('[NJ1] Generating conversation summary...'));
1248
+ const summaryMessages = [...messagesToSummarize, summaryRequestMessage];
1249
+ // 使用 client 的 sendMessage 方法生成摘要
1250
+ // 注意:这里简化实现,实际官方使用了streaming API
1251
+ let summaryText = '';
1252
+ try {
1253
+ // 调用 client 生成摘要(不使用工具)
1254
+ const response = await client.createMessage(summaryMessages, undefined, // 不需要工具
1255
+ 'You are a helpful AI assistant tasked with summarizing conversations.');
1256
+ // 提取文本响应
1257
+ if (Array.isArray(response.content)) {
1258
+ for (const block of response.content) {
1259
+ if (block.type === 'text') {
1260
+ summaryText += block.text;
1261
+ }
1262
+ }
1263
+ }
1264
+ if (!summaryText || summaryText.trim().length === 0) {
1265
+ console.log(chalk.yellow('[NJ1] AI returned empty summary, compaction failed'));
1266
+ return null;
1267
+ }
1268
+ // 检查是否是错误响应
1269
+ if (summaryText.startsWith('API Error') || summaryText.includes('Prompt is too long')) {
1270
+ console.log(chalk.yellow('[NJ1] AI returned invalid response, compaction failed'));
1271
+ return null;
1272
+ }
1273
+ }
1274
+ catch (error) {
1275
+ console.log(chalk.yellow(`[NJ1] Error generating summary: ${error instanceof Error ? error.message : String(error)}`));
1276
+ return null;
1277
+ }
1278
+ // 6. 创建压缩边界标记
1279
+ const boundaryMarker = createCompactBoundaryMarker('auto', preCompactTokenCount);
1280
+ // 7. 创建摘要消息(对齐官方 Au1 函数)
1281
+ const formattedContent = formatCompactSummaryContent(summaryText, false);
1282
+ const summaryMessage = {
1283
+ role: 'user',
1284
+ content: formattedContent,
1285
+ };
1286
+ // 8. 构建新的消息列表:[边界标记, 摘要消息]
1287
+ const compactedMessages = [boundaryMarker, summaryMessage];
1288
+ // v2.1.70: 提取原始消息中的图片,保留到压缩结果中以复用 prompt cache
1289
+ const preservedImages = extractImagesFromMessages(messagesToSummarize);
1290
+ if (preservedImages.length > 0) {
1291
+ compactedMessages.push({
1292
+ role: 'user',
1293
+ content: preservedImages,
1294
+ });
1295
+ console.log(chalk.blue(`[NJ1] Preserved ${preservedImages.length} image(s) for prompt cache reuse`));
1296
+ }
1297
+ // 9. 计算压缩后的token数
1298
+ const postCompactTokenCount = calculateTotalTokens(compactedMessages);
1299
+ const savedTokens = preCompactTokenCount - postCompactTokenCount;
1300
+ console.log(chalk.green(`[NJ1] Summary generated successfully`));
1301
+ console.log(chalk.green(`[NJ1] Before compaction: ${preCompactTokenCount.toLocaleString()} tokens`));
1302
+ console.log(chalk.green(`[NJ1] After compaction: ${postCompactTokenCount.toLocaleString()} tokens`));
1303
+ console.log(chalk.green(`[NJ1] Saved: ${savedTokens.toLocaleString()} tokens`));
1304
+ return {
1305
+ success: true,
1306
+ messages: compactedMessages,
1307
+ savedTokens,
1308
+ preCompactTokenCount,
1309
+ postCompactTokenCount,
1310
+ };
1311
+ }
1312
+ catch (error) {
1313
+ console.log(chalk.red(`[NJ1] Conversation summary compaction failed: ${error instanceof Error ? error.message : String(error)}`));
1314
+ return null;
1315
+ }
1316
+ }
1317
+ /**
1318
+ * 自动压缩协调器(对齐官方 CT2 函数)
1319
+ *
1320
+ * 完整实现:Vd (MicroCompact) + NJ1 (对话摘要) + TJ1 (Session Memory)
1321
+ *
1322
+ * 压缩优先级:
1323
+ * 1. 优先尝试 TJ1 (Session Memory 压缩) - 保留长期记忆的智能压缩方式
1324
+ * 2. 如果 TJ1 失败或未启用,使用 NJ1 (对话总结) - 传统的对话总结方式
1325
+ * 3. Vd (MicroCompact) 在所有层之前自动运行
1326
+ *
1327
+ * @param messages 消息列表
1328
+ * @param model 模型名称
1329
+ * @param client Claude客户端(用于NJ1生成摘要)
1330
+ * @param session 会话对象(可选,用于获取/存储压缩状态)
1331
+ * @returns 压缩结果 { wasCompacted: 是否压缩, messages: 处理后的消息列表, boundaryUuid?: 边界标记UUID }
1332
+ */
1333
+ async function autoCompact(messages, model, client, session, planMode) {
1334
+ // 1. 检查是否应该自动压缩
1335
+ if (!shouldAutoCompact(messages, model)) {
1336
+ return { wasCompacted: false, messages };
1337
+ }
1338
+ // 记录压缩决策
1339
+ const currentTokens = calculateTotalTokens(messages);
1340
+ const threshold = calculateAutoCompactThreshold(model);
1341
+ console.log(chalk.yellow('[AutoCompact] Compaction needed'));
1342
+ console.log(chalk.yellow(`[AutoCompact] Current tokens: ${currentTokens.toLocaleString()}`));
1343
+ console.log(chalk.yellow(`[AutoCompact] Compaction threshold: ${threshold.toLocaleString()}`));
1344
+ console.log(chalk.yellow(`[AutoCompact] Exceeded by: ${(currentTokens - threshold).toLocaleString()} tokens`));
1345
+ // 2. 优先尝试 TJ1 (Session Memory 压缩)
1346
+ const tj1Result = await trySessionMemoryCompact(messages, undefined, threshold, session, session?.cwd, session?.sessionId);
1347
+ if (tj1Result && tj1Result.success) {
1348
+ console.log(chalk.green(`[AutoCompact] Session Memory compaction successful, saved ${tj1Result.savedTokens.toLocaleString()} tokens`));
1349
+ console.log(chalk.green(`[AutoCompact] Compression ratio: ${tj1Result.preCompactTokenCount.toLocaleString()} → ${tj1Result.postCompactTokenCount.toLocaleString()} tokens (${Math.round(tj1Result.postCompactTokenCount / tj1Result.preCompactTokenCount * 100)}%)`));
1350
+ // v2.1.69: 压缩后恢复 plan mode 提醒
1351
+ if (planMode) {
1352
+ appendPlanModeReminder(tj1Result.messages);
1353
+ }
1354
+ // 获取边界标记的 UUID(用于增量压缩)
1355
+ const boundaryUuid = tj1Result.boundaryMarker?.uuid;
1356
+ return { wasCompacted: true, messages: tj1Result.messages, boundaryUuid };
1357
+ }
1358
+ // 3. 如果 TJ1 失败,使用 NJ1 (对话总结)
1359
+ const nj1Result = await tryConversationSummary(messages, client);
1360
+ if (nj1Result && nj1Result.success) {
1361
+ console.log(chalk.green(`[AutoCompact] Conversation summary successful, saved ${nj1Result.savedTokens.toLocaleString()} tokens`));
1362
+ console.log(chalk.green(`[AutoCompact] Compression ratio: ${nj1Result.preCompactTokenCount.toLocaleString()} → ${nj1Result.postCompactTokenCount.toLocaleString()} tokens (${Math.round(nj1Result.postCompactTokenCount / nj1Result.preCompactTokenCount * 100)}%)`));
1363
+ // v2.1.69: 压缩后恢复 plan mode 提醒
1364
+ if (planMode) {
1365
+ appendPlanModeReminder(nj1Result.messages);
1366
+ }
1367
+ return { wasCompacted: true, messages: nj1Result.messages };
1368
+ }
1369
+ // 4. 所有压缩策略都失败,返回未压缩
1370
+ console.log(chalk.yellow('[AutoCompact] All compaction strategies failed, skipping compaction'));
1371
+ console.log(chalk.yellow('[AutoCompact] Tip: You can disable this warning by setting DISABLE_COMPACT=1'));
1372
+ return { wasCompacted: false, messages };
1373
+ }
1374
+ /**
1375
+ * v2.1.69: 压缩后追加 plan mode 提醒消息
1376
+ * 确保 AI 在压缩后仍然知道自己处于 plan mode
1377
+ */
1378
+ function appendPlanModeReminder(messages) {
1379
+ messages.push({
1380
+ role: 'user',
1381
+ content: `<system-reminder>
1382
+ You are currently in plan mode. In plan mode, you should:
1383
+ 1. Only use read-only tools (Read, Glob, Grep, WebSearch, WebFetch)
1384
+ 2. Write your implementation plan to PLAN.md
1385
+ 3. Use ExitPlanMode when ready for user approval
1386
+ Do NOT make any code changes until the plan is approved.
1387
+ </system-reminder>`,
1388
+ });
1389
+ console.log(chalk.blue('[AutoCompact] Plan mode reminder restored after compaction'));
1390
+ }
1391
+ // ============================================================================
1392
+ // 软裁剪常量(借鉴 moltbot context-pruning)
1393
+ // ============================================================================
1394
+ /** 软裁剪触发阈值:tool result 超过此字符数时进行头尾截断 */
1395
+ const SOFT_TRIM_CHARS = 4000;
1396
+ /** 软裁剪保留头部字符数 */
1397
+ const SOFT_TRIM_HEAD = 1500;
1398
+ /** 软裁剪保留尾部字符数 */
1399
+ const SOFT_TRIM_TAIL = 1500;
1400
+ /**
1401
+ * 清理消息历史中的旧工具输出(两阶段裁剪)
1402
+ *
1403
+ * 借鉴 moltbot 的 context-pruning 和官方的 Vd 函数,实现两阶段清理:
1404
+ *
1405
+ * 阶段 1 - 软裁剪(新增):
1406
+ * 对旧的大 tool result(>4000 字符)保留头尾各 1500 字符,中间截掉。
1407
+ * 覆盖所有 COMPACTABLE_TOOLS 的输出,不限于有 <persisted-output> 标签的。
1408
+ *
1409
+ * 阶段 2 - 硬清理(原有):
1410
+ * 对有 <persisted-output> 标签或已保存到文件的超大结果,
1411
+ * 直接替换为 '[Old tool result content cleared]'。
1412
+ *
1413
+ * 两阶段共享的控制逻辑:
1414
+ * - 环境变量 DISABLE_MICROCOMPACT=1 完全禁用
1415
+ * - 总 token > MICROCOMPACT_THRESHOLD (40K) 才触发
1416
+ * - 节省 token > MIN_SAVINGS_THRESHOLD (20K) 才执行
1417
+ * - 最近 KEEP_RECENT_COUNT (3) 个结果不清理
1418
+ * - 只清理白名单工具(COMPACTABLE_TOOLS)
1419
+ *
1420
+ * @param messages 消息列表
1421
+ * @param keepRecent 保留最近的数量(默认 3)
1422
+ * @returns 清理后的消息列表
1423
+ */
1424
+ function cleanOldPersistedOutputs(messages, keepRecent = KEEP_RECENT_COUNT) {
1425
+ // 检查环境变量 - 如果禁用则直接返回
1426
+ if (isEnvTrue(process.env.DISABLE_MICROCOMPACT)) {
1427
+ return messages;
1428
+ }
1429
+ const cleanableResults = [];
1430
+ for (let i = 0; i < messages.length; i++) {
1431
+ const msg = messages[i];
1432
+ if (msg.role !== 'user' || !Array.isArray(msg.content))
1433
+ continue;
1434
+ for (let j = 0; j < msg.content.length; j++) {
1435
+ const block = msg.content[j];
1436
+ if (typeof block === 'object' &&
1437
+ 'type' in block &&
1438
+ block.type === 'tool_result' &&
1439
+ typeof block.content === 'string' &&
1440
+ 'tool_use_id' in block) {
1441
+ const content = block.content;
1442
+ const toolName = findToolNameForResult(messages, block.tool_use_id);
1443
+ if (COMPACTABLE_TOOLS.has(toolName) && content.length > SOFT_TRIM_CHARS) {
1444
+ cleanableResults.push({
1445
+ msgIndex: i,
1446
+ blockIndex: j,
1447
+ toolName,
1448
+ toolUseId: block.tool_use_id,
1449
+ contentLength: content.length,
1450
+ tokens: estimateTokens(content),
1451
+ hasPersisted: content.includes(PERSISTED_OUTPUT_START) || content.includes('Output has been saved to'),
1452
+ });
1453
+ }
1454
+ }
1455
+ }
1456
+ }
1457
+ // 如果没有足够的可清理输出,直接返回
1458
+ if (cleanableResults.length <= keepRecent) {
1459
+ return messages;
1460
+ }
1461
+ // 计算当前消息的总 token 数
1462
+ const totalTokens = calculateTotalTokens(messages);
1463
+ // 保留最近的 N 个,清理其余的
1464
+ const toClean = cleanableResults.slice(0, -keepRecent);
1465
+ const totalSavings = toClean.reduce((sum, item) => sum + item.tokens, 0);
1466
+ // 智能触发判断
1467
+ if (totalTokens <= MICROCOMPACT_THRESHOLD || totalSavings < MIN_SAVINGS_THRESHOLD) {
1468
+ return messages;
1469
+ }
1470
+ // 构建要清理的位置索引 Set
1471
+ const cleanTargets = new Map(); // key: "msgIndex:blockIndex"
1472
+ for (const item of toClean) {
1473
+ cleanTargets.set(`${item.msgIndex}:${item.blockIndex}`, item);
1474
+ }
1475
+ return messages.map((msg, msgIndex) => {
1476
+ if (msg.role !== 'user' || !Array.isArray(msg.content))
1477
+ return msg;
1478
+ let modified = false;
1479
+ const newContent = msg.content.map((block, blockIndex) => {
1480
+ const target = cleanTargets.get(`${msgIndex}:${blockIndex}`);
1481
+ if (!target)
1482
+ return block;
1483
+ if (typeof block === 'object' &&
1484
+ 'type' in block &&
1485
+ block.type === 'tool_result' &&
1486
+ typeof block.content === 'string') {
1487
+ const content = block.content;
1488
+ let newContentStr;
1489
+ if (target.hasPersisted) {
1490
+ // 阶段 2(硬清理):已保存到文件或有持久化标签的,直接清除
1491
+ newContentStr = '[Old tool result content cleared]';
1492
+ }
1493
+ else {
1494
+ // 阶段 1(软裁剪):保留头尾,截掉中间
1495
+ const head = content.substring(0, SOFT_TRIM_HEAD);
1496
+ const tail = content.substring(content.length - SOFT_TRIM_TAIL);
1497
+ const omitted = content.length - SOFT_TRIM_HEAD - SOFT_TRIM_TAIL;
1498
+ newContentStr = `${head}\n\n... [${omitted} characters trimmed from old tool result] ...\n\n${tail}`;
1499
+ }
1500
+ modified = true;
1501
+ return { ...block, content: newContentStr };
1502
+ }
1503
+ return block;
1504
+ });
1505
+ return modified ? { ...msg, content: newContent } : msg;
1506
+ });
1507
+ }
1508
+ export class ConversationLoop {
1509
+ client;
1510
+ session;
1511
+ options;
1512
+ tools;
1513
+ /** 所有工具(包含 deferred 的 MCP 工具),用于动态过滤 */
1514
+ allTools = [];
1515
+ /** 是否启用了工具搜索/延迟加载 */
1516
+ toolSearchEnabled = false;
1517
+ totalCostUSD = 0;
1518
+ promptBuilder;
1519
+ promptContext;
1520
+ // ESC 中断支持
1521
+ abortController = null;
1522
+ // v10.2: 软中断标志(插嘴用),区分 abort() 的硬中断和 softInterrupt() 的软中断
1523
+ _softInterrupted = false;
1524
+ // 工具循环检测 — 对标官方 maxTurns,增加重复调用模式检测
1525
+ toolCallHistory = [];
1526
+ static TOOL_LOOP_WARNING_THRESHOLD = 10; // 同参数重复调用 N 次触发警告
1527
+ static TOOL_LOOP_CIRCUIT_BREAKER = 20; // 全局熔断阈值
1528
+ /** 是否通过构造函数传入了认证信息(跳过 ensureAuthenticated) */
1529
+ hasExternalAuth = false;
1530
+ /**
1531
+ * 获取当前权限模式 - 官方 v2.1.2 响应式实现
1532
+ *
1533
+ * 重要:此方法是权限系统的唯一入口。
1534
+ * 优先从 getAppState() 回调获取实时的响应式状态,
1535
+ * 这样 UI 层通过 Shift+Tab 切换的权限模式能立即生效。
1536
+ *
1537
+ * 只有在未提供 getAppState 回调时(如 sub-agent 或测试场景),
1538
+ * 才会回退到 options.permissionMode 静态配置。
1539
+ */
1540
+ getCurrentPermissionMode() {
1541
+ // 优先使用响应式状态(来自 App.tsx 的 toolPermissionContext)
1542
+ if (this.options.getAppState) {
1543
+ const appState = this.options.getAppState();
1544
+ return appState.toolPermissionContext.mode;
1545
+ }
1546
+ // 回退到静态配置(仅用于 sub-agent 或测试场景)
1547
+ return this.options.permissionMode || 'default';
1548
+ }
1549
+ /**
1550
+ * 记录工具调用并检测循环模式
1551
+ * @returns 'ok' | 'warning' | 'circuit_break'
1552
+ */
1553
+ recordToolCall(toolName, toolInput) {
1554
+ // 简单 hash:工具名 + JSON 排序后的输入前 200 字符
1555
+ const inputStr = JSON.stringify(toolInput || {});
1556
+ const inputHash = inputStr.length > 200 ? inputStr.substring(0, 200) : inputStr;
1557
+ this.toolCallHistory.push({ name: toolName, inputHash });
1558
+ // 全局熔断:历史调用次数超过阈值
1559
+ if (this.toolCallHistory.length >= ConversationLoop.TOOL_LOOP_CIRCUIT_BREAKER) {
1560
+ return 'circuit_break';
1561
+ }
1562
+ // 同参数重复调用检测:连续 N 次相同工具+相同参数
1563
+ const key = `${toolName}:${inputHash}`;
1564
+ let consecutiveCount = 0;
1565
+ for (let i = this.toolCallHistory.length - 1; i >= 0; i--) {
1566
+ const entry = this.toolCallHistory[i];
1567
+ if (`${entry.name}:${entry.inputHash}` === key) {
1568
+ consecutiveCount++;
1569
+ }
1570
+ else {
1571
+ break;
1572
+ }
1573
+ }
1574
+ if (consecutiveCount >= ConversationLoop.TOOL_LOOP_WARNING_THRESHOLD) {
1575
+ return 'warning';
1576
+ }
1577
+ // Ping-pong 检测:交替调用两个工具(A-B-A-B 模式)
1578
+ const len = this.toolCallHistory.length;
1579
+ if (len >= 4) {
1580
+ const last4 = this.toolCallHistory.slice(-4);
1581
+ const a = `${last4[0].name}:${last4[0].inputHash}`;
1582
+ const b = `${last4[1].name}:${last4[1].inputHash}`;
1583
+ if (a !== b
1584
+ && `${last4[2].name}:${last4[2].inputHash}` === a
1585
+ && `${last4[3].name}:${last4[3].inputHash}` === b) {
1586
+ // 还需要检查更长的模式
1587
+ let pingPongCount = 2; // 已经有 2 轮
1588
+ for (let i = len - 5; i >= 0; i -= 2) {
1589
+ if (i - 1 >= 0
1590
+ && `${this.toolCallHistory[i].name}:${this.toolCallHistory[i].inputHash}` === b
1591
+ && `${this.toolCallHistory[i - 1].name}:${this.toolCallHistory[i - 1].inputHash}` === a) {
1592
+ pingPongCount++;
1593
+ }
1594
+ else {
1595
+ break;
1596
+ }
1597
+ }
1598
+ if (pingPongCount >= 5) {
1599
+ return 'warning';
1600
+ }
1601
+ }
1602
+ }
1603
+ return 'ok';
1604
+ }
1605
+ /**
1606
+ * 重置工具调用历史(用户新消息时调用)
1607
+ */
1608
+ resetToolCallHistory() {
1609
+ this.toolCallHistory = [];
1610
+ }
1611
+ /**
1612
+ * 处理权限请求(询问用户是否允许工具执行)
1613
+ * @param toolName 工具名称
1614
+ * @param toolInput 工具输入
1615
+ * @param message 权限请求消息
1616
+ * @returns 是否批准执行
1617
+ */
1618
+ async handlePermissionRequest(toolName, toolInput, message) {
1619
+ // 1. 检查会话级权限记忆
1620
+ if (this.session.isToolAlwaysAllowed(toolName)) {
1621
+ if (this.options.verbose) {
1622
+ console.log(chalk.green(`[Permission] Auto-allowed by session permission: ${toolName}`));
1623
+ }
1624
+ return true;
1625
+ }
1626
+ // 2. 触发 PermissionRequest Hooks
1627
+ const hookResult = await runPermissionRequestHooks(toolName, toolInput, this.session.sessionId);
1628
+ // 如果 hook 返回了决策,使用 hook 的决策
1629
+ if (hookResult.decision === 'allow') {
1630
+ if (this.options.verbose) {
1631
+ console.log(chalk.green(`[Permission] Allowed by hook: ${hookResult.message || 'No reason provided'}`));
1632
+ }
1633
+ return true;
1634
+ }
1635
+ else if (hookResult.decision === 'deny') {
1636
+ const reason = hookResult.message || 'No reason provided';
1637
+ if (this.options.verbose) {
1638
+ console.log(chalk.red(`[Permission] Denied by hook: ${reason}`));
1639
+ }
1640
+ // v2.1.27: 记录到调试日志
1641
+ logPermissionDenied(toolName, `Denied by hook: ${reason}`, this.session.sessionId);
1642
+ return false;
1643
+ }
1644
+ // 3. 检查权限模式 - 官方 v2.1.2 使用响应式状态
1645
+ const currentMode = this.getCurrentPermissionMode();
1646
+ if (currentMode === 'bypassPermissions' || this.options.dangerouslySkipPermissions) {
1647
+ if (this.options.verbose) {
1648
+ console.log(chalk.yellow('[Permission] Bypassed due to permission mode'));
1649
+ }
1650
+ return true;
1651
+ }
1652
+ if (currentMode === 'dontAsk') {
1653
+ // dontAsk 模式:自动拒绝需要询问的操作
1654
+ if (this.options.verbose) {
1655
+ console.log(chalk.red('[Permission] Auto-denied in dontAsk mode'));
1656
+ }
1657
+ // v2.1.27: 记录到调试日志
1658
+ logPermissionDenied(toolName, 'Auto-denied in dontAsk mode', this.session.sessionId);
1659
+ return false;
1660
+ }
1661
+ // 3.5 plan 模式 - 官方 v2.1.2 Shift+Tab 双击切换
1662
+ // Plan 模式下拒绝所有执行操作,只允许只读工具
1663
+ if (currentMode === 'plan') {
1664
+ const readOnlyTools = ['Read', 'Glob', 'Grep', 'WebSearch', 'WebFetch'];
1665
+ if (!readOnlyTools.includes(toolName)) {
1666
+ if (this.options.verbose) {
1667
+ console.log(chalk.yellow(`[Permission] Denied in plan mode (non-readonly tool): ${toolName}`));
1668
+ }
1669
+ // v2.1.27: 记录到调试日志
1670
+ logPermissionDenied(toolName, 'Denied in plan mode (non-readonly tool)', this.session.sessionId);
1671
+ return false;
1672
+ }
1673
+ // 只读工具在 plan 模式下允许执行
1674
+ return true;
1675
+ }
1676
+ // 3.6 acceptEdits 模式 - 官方 v2.1.2 Shift+Tab 单击切换
1677
+ // 自动接受文件编辑操作,其他操作仍需询问
1678
+ if (currentMode === 'acceptEdits') {
1679
+ const editTools = ['Edit', 'Write', 'MultiEdit', 'NotebookEdit'];
1680
+ if (editTools.includes(toolName)) {
1681
+ if (this.options.verbose) {
1682
+ console.log(chalk.green(`[Permission] Auto-accepted edit tool in acceptEdits mode: ${toolName}`));
1683
+ }
1684
+ return true;
1685
+ }
1686
+ // 非编辑工具继续走后面的询问流程
1687
+ }
1688
+ // 4. 显示权限请求对话框
1689
+ console.log(chalk.yellow('\n┌─────────────────────────────────────────┐'));
1690
+ console.log(chalk.yellow('│ Permission Request │'));
1691
+ console.log(chalk.yellow('├─────────────────────────────────────────┤'));
1692
+ console.log(chalk.yellow(`│ Tool: ${toolName.padEnd(33)}│`));
1693
+ if (message) {
1694
+ const displayMessage = message.length > 33 ? message.slice(0, 30) + '...' : message;
1695
+ console.log(chalk.yellow(`│ Reason: ${displayMessage.padEnd(31)}│`));
1696
+ }
1697
+ if (toolInput && typeof toolInput === 'object') {
1698
+ const inputStr = JSON.stringify(toolInput).slice(0, 30);
1699
+ console.log(chalk.yellow(`│ Input: ${inputStr.padEnd(32)}│`));
1700
+ }
1701
+ console.log(chalk.yellow('└─────────────────────────────────────────┘'));
1702
+ console.log('\nOptions:');
1703
+ console.log(' [y] Yes, allow once');
1704
+ console.log(' [n] No, deny');
1705
+ console.log(' [a] Always allow for this session');
1706
+ // 5. 等待用户输入
1707
+ const rl = readline.createInterface({
1708
+ input: process.stdin,
1709
+ output: process.stdout,
1710
+ });
1711
+ return new Promise((resolve) => {
1712
+ rl.question('\nYour choice [y/n/a]: ', (answer) => {
1713
+ rl.close();
1714
+ const choice = answer.trim().toLowerCase();
1715
+ switch (choice) {
1716
+ case 'y':
1717
+ console.log(chalk.green('✓ Permission granted for this request'));
1718
+ resolve(true);
1719
+ break;
1720
+ case 'a':
1721
+ console.log(chalk.green(`✓ Permission granted for all '${toolName}' requests in this session`));
1722
+ // 实现会话级权限记忆
1723
+ this.session.addAlwaysAllowedTool(toolName);
1724
+ resolve(true);
1725
+ break;
1726
+ case 'n':
1727
+ default:
1728
+ console.log(chalk.red('✗ Permission denied'));
1729
+ resolve(false);
1730
+ break;
1731
+ }
1732
+ });
1733
+ });
1734
+ }
1735
+ constructor(options = {}) {
1736
+ // 解析模型别名
1737
+ const resolvedModel = modelConfig.resolveAlias(options.model || 'sonnet');
1738
+ // 只有在没有明确指定 isSubAgent 的情况下才设置父模型上下文
1739
+ // Sub-agent 不应该覆盖全局的父模型上下文
1740
+ if (!options.isSubAgent) {
1741
+ setParentModelContext(resolvedModel);
1742
+ }
1743
+ // 构建 ClaudeClient 配置
1744
+ const clientConfig = {
1745
+ model: resolvedModel,
1746
+ maxTokens: options.maxTokens,
1747
+ fallbackModel: options.fallbackModel,
1748
+ thinking: options.thinking,
1749
+ debug: options.debug,
1750
+ timeout: 300000, // 5分钟 API 请求超时
1751
+ };
1752
+ // 如果外部传入了认证信息(如 WebUI 子 agent 复用主 agent 的认证),直接使用
1753
+ if (options.apiKey || options.authToken) {
1754
+ this.hasExternalAuth = true; // 标记为外部认证,跳过 ensureAuthenticated
1755
+ if (options.apiKey) {
1756
+ clientConfig.apiKey = options.apiKey;
1757
+ }
1758
+ if (options.authToken) {
1759
+ clientConfig.authToken = options.authToken;
1760
+ }
1761
+ if (options.baseUrl) {
1762
+ clientConfig.baseUrl = options.baseUrl;
1763
+ }
1764
+ }
1765
+ else {
1766
+ // 默认路径:从本地凭证文件/环境变量初始化认证
1767
+ initAuth();
1768
+ const auth = getAuth();
1769
+ // 根据认证类型设置凭据
1770
+ if (auth) {
1771
+ if (auth.type === 'api_key' && auth.apiKey) {
1772
+ clientConfig.apiKey = auth.apiKey;
1773
+ }
1774
+ else if (auth.type === 'oauth') {
1775
+ // 检查是否有 user:inference scope (Claude.ai 订阅用户)
1776
+ const scopes = auth.scopes || auth.scope || [];
1777
+ const hasInferenceScope = scopes.includes('user:inference');
1778
+ // 获取 OAuth token(可能是 authToken 或 accessToken)
1779
+ const oauthToken = auth.authToken || auth.accessToken;
1780
+ if (hasInferenceScope && oauthToken) {
1781
+ clientConfig.authToken = oauthToken;
1782
+ }
1783
+ else if (auth.oauthApiKey) {
1784
+ clientConfig.apiKey = auth.oauthApiKey;
1785
+ }
1786
+ }
1787
+ }
1788
+ }
1789
+ this.client = new ClaudeClient(clientConfig);
1790
+ this.session = new Session();
1791
+ this.options = options;
1792
+ this.promptBuilder = systemPromptBuilder;
1793
+ // v2.1.27: 设置全局会话 ID 以供工具使用(如 gh pr create 自动链接)
1794
+ setCurrentSessionId(this.session.sessionId);
1795
+ // 初始化提示词上下文
1796
+ // 关键修复:subAgent(Worker)必须有明确的 workingDir,禁止回退到 process.cwd()
1797
+ // 这避免了 Worker 在程序启动目录而非指定项目路径执行的 bug
1798
+ let effectiveWorkingDir;
1799
+ if (options.isSubAgent) {
1800
+ if (!options.workingDir) {
1801
+ throw new Error('SubAgent must specify workingDir, falling back to process start directory is not allowed');
1802
+ }
1803
+ effectiveWorkingDir = options.workingDir;
1804
+ }
1805
+ else {
1806
+ // 主 CLI 可以使用 process.cwd()
1807
+ effectiveWorkingDir = options.workingDir || process.cwd();
1808
+ }
1809
+ // 初始化 Agent 笔记本系统
1810
+ const notebookMgr = initNotebookManager(effectiveWorkingDir);
1811
+ const notebookSummary = notebookMgr.getNotebookSummaryForPrompt();
1812
+ // 初始化长期记忆搜索系统(异步,fire-and-forget)
1813
+ const projectHash = crypto.createHash('md5').update(effectiveWorkingDir).digest('hex').slice(0, 12);
1814
+ const embeddingConfig = configManager.get('embedding');
1815
+ initMemorySearchManager(effectiveWorkingDir, projectHash, embeddingConfig || undefined).catch(err => {
1816
+ console.warn('[MemorySearch] Initialization failed:', err);
1817
+ });
1818
+ // 加载活跃目标
1819
+ const activeGoals = loadActiveGoals(effectiveWorkingDir);
1820
+ this.promptContext = {
1821
+ workingDir: effectiveWorkingDir,
1822
+ model: resolvedModel,
1823
+ permissionMode: options.permissionMode,
1824
+ planMode: options.planMode,
1825
+ delegateMode: options.delegateMode,
1826
+ ideType: options.ideType,
1827
+ platform: process.platform,
1828
+ todayDate: new Date().toISOString().split('T')[0],
1829
+ isGitRepo: this.checkIsGitRepo(effectiveWorkingDir),
1830
+ debug: options.debug,
1831
+ // v2.1.0+: 语言配置 - 从 configManager 读取
1832
+ language: configManager.get('language'),
1833
+ // 是否使用官方订阅认证(有 oauthToken 或 oauthAccount 说明通过 Claude.ai 登录)
1834
+ isOfficialAuth: !!(configManager.get('oauthToken') || configManager.get('oauthAccount')),
1835
+ // Agent 笔记本内容
1836
+ notebookSummary: notebookSummary || undefined,
1837
+ // 活跃目标
1838
+ activeGoals: activeGoals.length > 0 ? activeGoals : undefined,
1839
+ };
1840
+ // 获取并过滤工具
1841
+ let tools = toolRegistry.getDefinitions();
1842
+ // 应用工具过滤
1843
+ if (options.allowedTools && options.allowedTools.length > 0) {
1844
+ const allowed = new Set(options.allowedTools.flatMap(t => t.split(',')).map(t => t.trim()));
1845
+ // 如果包含通配符 '*',允许所有工具
1846
+ if (!allowed.has('*')) {
1847
+ tools = tools.filter(t => allowed.has(t.name));
1848
+ }
1849
+ }
1850
+ if (options.disallowedTools && options.disallowedTools.length > 0) {
1851
+ const disallowed = new Set(options.disallowedTools.flatMap(t => t.split(',')).map(t => t.trim()));
1852
+ tools = tools.filter(t => !disallowed.has(t.name));
1853
+ }
1854
+ // v2.1.33: delegate_mode 工具限制
1855
+ // 在 delegate_mode 下,agent 只能使用团队协作相关的工具
1856
+ if (options.delegateMode) {
1857
+ const DELEGATE_MODE_TOOLS = new Set([
1858
+ 'Task', 'TaskOutput',
1859
+ 'TeamCreate', 'TeamDelete', 'SendMessage',
1860
+ 'TaskCreate', 'TaskGet', 'TaskUpdate', 'TaskList',
1861
+ 'Read', 'Glob', 'Grep', // 基础读取工具仍然可用
1862
+ ]);
1863
+ tools = tools.filter(t => DELEGATE_MODE_TOOLS.has(t.name));
1864
+ }
1865
+ // v2.1.30: 合并 SDK 提供的 MCP 工具
1866
+ if (options.mcpTools && options.mcpTools.length > 0) {
1867
+ const existingNames = new Set(tools.map(t => t.name));
1868
+ for (const mcpTool of options.mcpTools) {
1869
+ if (!existingNames.has(mcpTool.name)) {
1870
+ tools.push(mcpTool);
1871
+ }
1872
+ }
1873
+ }
1874
+ // 注入内置 deferred 工具列表(供 MCPSearchTool 搜索和 getDiscoveredToolsFromMessages 提取)
1875
+ const builtinDeferred = tools.filter(t => t.shouldDefer === true && !t.isMcp);
1876
+ MCPSearchTool.builtinDeferredTools = builtinDeferred;
1877
+ setBuiltinDeferredToolNames(new Set(builtinDeferred.map(t => t.name)));
1878
+ // v2.1.7+: MCP 工具搜索/延迟加载模式(对齐官方 v2.1.34)
1879
+ // 判断是否启用 tool search,但不在初始化时过滤工具
1880
+ // 工具过滤推迟到每次 API 请求前动态执行(filterToolsForRequest)
1881
+ this.toolSearchEnabled = isToolSearchEnabled(resolvedModel, tools);
1882
+ if (this.toolSearchEnabled) {
1883
+ // 如果启用了 tool search 但没有任何 deferred 工具,关闭它
1884
+ // 对齐官方:if(O && !Y.some(OG)) O = false
1885
+ if (!tools.some(isDeferredTool)) {
1886
+ this.toolSearchEnabled = false;
1887
+ }
1888
+ }
1889
+ if (this.toolSearchEnabled && (options.verbose || options.debug)) {
1890
+ console.log(chalk.blue('[MCP] Tool search enabled: MCP tools will be loaded on-demand via Mcp'));
1891
+ }
1892
+ // 保存所有工具(用于动态过滤)
1893
+ this.allTools = tools;
1894
+ // this.tools 在每次请求前由 filterToolsForRequest() 动态设置
1895
+ // 初始化时先做一次过滤
1896
+ this.tools = this.filterToolsForRequest([]);
1897
+ // v2.1.33: 将工具名称集合注入 promptContext,用于条件化提示词组装
1898
+ this.promptContext.toolNames = new Set(tools.map(t => t.name));
1899
+ // 标记是否有 Skill 工具可用,用于系统提示词中的条件化指引
1900
+ this.promptContext.hasSkills = this.promptContext.toolNames.has('Skill');
1901
+ // v2.1.33: 将 allowedSubagentTypes 传递给 TaskTool 实例
1902
+ // 当子 loop 通过 Task(agent_type) 语法限制了允许的子 agent 类型时
1903
+ // 在 TaskTool.execute() 中进行验证
1904
+ if (options.allowedSubagentTypes) {
1905
+ const taskTool = toolRegistry.get('Task');
1906
+ if (taskTool && 'setAllowedSubagentTypes' in taskTool) {
1907
+ taskTool.setAllowedSubagentTypes(options.allowedSubagentTypes);
1908
+ }
1909
+ }
1910
+ }
1911
+ /**
1912
+ * 重新初始化客户端(登录后调用)
1913
+ * 从当前认证状态重新创建 ClaudeClient
1914
+ */
1915
+ reinitializeClient() {
1916
+ // 重新初始化认证
1917
+ initAuth();
1918
+ const auth = getAuth();
1919
+ if (!auth) {
1920
+ console.warn('[Loop] No auth found after reinitialization');
1921
+ return false;
1922
+ }
1923
+ const resolvedModel = modelConfig.resolveAlias(this.options.model || 'sonnet');
1924
+ // 构建 ClaudeClient 配置
1925
+ const clientConfig = {
1926
+ model: resolvedModel,
1927
+ maxTokens: this.options.maxTokens,
1928
+ fallbackModel: this.options.fallbackModel,
1929
+ thinking: this.options.thinking,
1930
+ debug: this.options.debug,
1931
+ timeout: 300000, // 5分钟 API 请求超时
1932
+ };
1933
+ // 根据认证类型设置凭据
1934
+ if (auth.type === 'api_key' && auth.apiKey) {
1935
+ clientConfig.apiKey = auth.apiKey;
1936
+ }
1937
+ else if (auth.type === 'oauth') {
1938
+ // 检查是否有 user:inference scope (Claude.ai 订阅用户)
1939
+ const hasInferenceScope = auth.scope?.includes('user:inference');
1940
+ if (hasInferenceScope && auth.accessToken) {
1941
+ // Claude.ai 订阅用户可以直接使用 OAuth token
1942
+ clientConfig.authToken = auth.accessToken;
1943
+ }
1944
+ else if (auth.oauthApiKey) {
1945
+ // 使用创建的 OAuth API Key
1946
+ clientConfig.apiKey = auth.oauthApiKey;
1947
+ }
1948
+ else {
1949
+ console.warn('[Loop] OAuth auth without valid credentials');
1950
+ return false;
1951
+ }
1952
+ }
1953
+ // 重新创建客户端
1954
+ this.client = new ClaudeClient(clientConfig);
1955
+ console.log('[Loop] Client reinitialized with new credentials');
1956
+ return true;
1957
+ }
1958
+ /**
1959
+ * 动态过滤工具列表(对齐官方 v2.1.34)
1960
+ *
1961
+ * 每次 API 请求前调用,根据 toolSearchEnabled 和消息历史动态决定
1962
+ * 哪些工具的 schema 传给模型。
1963
+ *
1964
+ * 官方逻辑:
1965
+ * if (toolSearchEnabled) {
1966
+ * let discovered = abA(messages); // 扫描历史中已发现的工具
1967
+ * filteredTools = allTools.filter(t => {
1968
+ * if (!isDeferredTool(t)) return true; // 非 MCP 工具保留
1969
+ * if (t.name === "ToolSearch") return true; // ToolSearch 自身保留
1970
+ * return discovered.has(t.name); // 已发现的 MCP 工具保留
1971
+ * });
1972
+ * } else {
1973
+ * filteredTools = allTools.filter(t => t.name !== "ToolSearch");
1974
+ * }
1975
+ */
1976
+ filterToolsForRequest(messages) {
1977
+ if (!this.toolSearchEnabled) {
1978
+ // 不启用 tool search 时,移除 Mcp(ToolSearch)工具本身,其他全部保留
1979
+ return this.allTools.filter(t => t.name !== 'Mcp');
1980
+ }
1981
+ // 启用 tool search:从消息历史中找出已发现的 MCP 工具
1982
+ const discovered = getDiscoveredToolsFromMessages(messages);
1983
+ const filtered = this.allTools.filter(t => {
1984
+ // 非 deferred 工具(内置工具)始终保留
1985
+ if (!isDeferredTool(t))
1986
+ return true;
1987
+ // Mcp(ToolSearch)工具自身始终保留
1988
+ if (t.name === 'Mcp')
1989
+ return true;
1990
+ // 已被模型通过 ToolSearch 发现的 MCP 工具保留
1991
+ return discovered.has(t.name);
1992
+ });
1993
+ // Harness 效率度量:记录工具过滤效果
1994
+ const totalDeferred = this.allTools.filter(isDeferredTool).length;
1995
+ const loadedDeferred = filtered.length - filtered.filter(t => !isDeferredTool(t)).length - (filtered.some(t => t.name === 'Mcp') ? 1 : 0);
1996
+ if (process.env.DEBUG) {
1997
+ console.log(`[Harness] Tool filtering: ${filtered.length}/${this.allTools.length} tools sent (${totalDeferred - loadedDeferred} deferred tools saved, ${discovered.size} discovered)`);
1998
+ }
1999
+ return filtered;
2000
+ }
2001
+ /**
2002
+ * 确保认证已完成(处理 OAuth API Key 创建)
2003
+ * 在发送第一条消息前调用
2004
+ */
2005
+ async ensureAuthenticated() {
2006
+ // 如果通过构造函数传入了认证信息,直接返回 true,跳过 OAuth API Key 创建
2007
+ // 这避免了 TaskExecutor 等无需 API 调用的场景触发网络请求
2008
+ if (this.hasExternalAuth) {
2009
+ return true;
2010
+ }
2011
+ const auth = getAuth();
2012
+ if (!auth) {
2013
+ return false;
2014
+ }
2015
+ if (auth.type === 'api_key') {
2016
+ return !!auth.apiKey;
2017
+ }
2018
+ if (auth.type === 'oauth') {
2019
+ // 检查是否有 user:inference scope (Claude.ai 订阅用户)
2020
+ // 注意:AuthConfig 同时有 scope 和 scopes 两个字段,需要都检查
2021
+ const scopes = auth.scopes || auth.scope || [];
2022
+ const hasInferenceScope = scopes.includes('user:inference');
2023
+ if (hasInferenceScope) {
2024
+ // Claude.ai 订阅用户:尝试使用 authToken
2025
+ // 注意:Anthropic 服务器可能会限制非官方客户端使用 OAuth token
2026
+ if (auth.accessToken) {
2027
+ return true;
2028
+ }
2029
+ console.warn('[Auth] OAuth access token not found');
2030
+ return false;
2031
+ }
2032
+ // Console 用户需要创建 OAuth API Key
2033
+ const apiKey = await ensureOAuthApiKey();
2034
+ if (apiKey) {
2035
+ // 重新创建客户端使用新的 API Key
2036
+ const resolvedModel = modelConfig.resolveAlias(this.options.model || 'sonnet');
2037
+ this.client = new ClaudeClient({
2038
+ model: resolvedModel,
2039
+ maxTokens: this.options.maxTokens,
2040
+ fallbackModel: this.options.fallbackModel,
2041
+ thinking: this.options.thinking,
2042
+ debug: this.options.debug,
2043
+ timeout: 300000, // 5分钟 API 请求超时
2044
+ apiKey: apiKey,
2045
+ });
2046
+ return true;
2047
+ }
2048
+ return false;
2049
+ }
2050
+ return false;
2051
+ }
2052
+ /**
2053
+ * 预处理用户输入:提取 URL 并获取内容注入上下文
2054
+ * @param userInput 原始用户输入
2055
+ * @returns 处理后的用户输入(附加了链接内容)
2056
+ */
2057
+ async preprocessUserInput(userInput) {
2058
+ // 意图增强:模糊输入自动补充项目上下文
2059
+ let enrichedInput = userInput;
2060
+ try {
2061
+ const { enrichUserInput } = await import('../context/intent-enricher.js');
2062
+ enrichedInput = enrichUserInput(userInput, {
2063
+ cwd: this.promptContext.workingDir,
2064
+ isGitRepo: this.promptContext.isGitRepo,
2065
+ });
2066
+ }
2067
+ catch {
2068
+ // 增强失败不影响主流程
2069
+ }
2070
+ // 检查是否启用自动链接理解
2071
+ const config = configManager.get('autoLinkUnderstanding');
2072
+ if (!config) {
2073
+ return enrichedInput;
2074
+ }
2075
+ try {
2076
+ // 动态导入链接检测模块
2077
+ const { extractUrls } = await import('../context/link-detector.js');
2078
+ const urls = extractUrls(userInput);
2079
+ if (urls.length === 0) {
2080
+ return enrichedInput;
2081
+ }
2082
+ // 动态导入 WebFetch 工具
2083
+ const { WebFetchTool } = await import('../tools/web.js');
2084
+ const webFetchTool = new WebFetchTool();
2085
+ // 获取每个 URL 的内容(并行,带超时)
2086
+ const linkContexts = [];
2087
+ await Promise.all(urls.map(async (url) => {
2088
+ try {
2089
+ // 3秒超时
2090
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), 3000));
2091
+ const fetchPromise = webFetchTool.execute({ url, prompt: 'Extract the main content from this page' });
2092
+ const result = await Promise.race([fetchPromise, timeoutPromise]);
2093
+ if (result && !result.error && result.output) {
2094
+ // 截断内容到 2000 字符
2095
+ const content = result.output.substring(0, 2000);
2096
+ linkContexts.push(`\n\n<link-context url="${url}">\n${content}\n</link-context>`);
2097
+ }
2098
+ }
2099
+ catch {
2100
+ // 单个 URL 获取失败不影响其他
2101
+ }
2102
+ }));
2103
+ if (linkContexts.length > 0) {
2104
+ return enrichedInput + linkContexts.join('');
2105
+ }
2106
+ return enrichedInput;
2107
+ }
2108
+ catch {
2109
+ // 任何错误都不影响正常流程
2110
+ return enrichedInput;
2111
+ }
2112
+ }
2113
+ /**
2114
+ * 检查是否为 Git 仓库
2115
+ */
2116
+ checkIsGitRepo(dir) {
2117
+ try {
2118
+ // fs 和 path 已在文件顶部 ESM 导入
2119
+ let currentDir = dir;
2120
+ while (currentDir !== path.dirname(currentDir)) {
2121
+ if (fs.existsSync(path.join(currentDir, '.git'))) {
2122
+ return true;
2123
+ }
2124
+ currentDir = path.dirname(currentDir);
2125
+ }
2126
+ return false;
2127
+ }
2128
+ catch {
2129
+ return false;
2130
+ }
2131
+ }
2132
+ /**
2133
+ * 更新提示词上下文
2134
+ */
2135
+ updateContext(updates) {
2136
+ this.promptContext = { ...this.promptContext, ...updates };
2137
+ }
2138
+ // =========================================================================
2139
+ // 闹钟注入机制
2140
+ // =========================================================================
2141
+ /**
2142
+ * 检测并处理闹钟信号
2143
+ *
2144
+ * 在用户等待输入的空闲期调用。如果有待处理的闹钟信号,
2145
+ * 构造一条特殊的提醒消息注入对话流,让模型在完整上下文中
2146
+ * 自主决策如何执行任务。
2147
+ *
2148
+ * @returns 处理的闹钟数量
2149
+ */
2150
+ async checkAndInjectAlarms() {
2151
+ const { readAlarms, clearAlarm } = await import('../daemon/alarm.js');
2152
+ const { TaskStore } = await import('../daemon/store.js');
2153
+ const alarms = readAlarms();
2154
+ if (alarms.length === 0)
2155
+ return 0;
2156
+ const store = new TaskStore();
2157
+ for (const alarm of alarms) {
2158
+ // 构造提醒消息
2159
+ let reminderParts = [];
2160
+ reminderParts.push(`[⏰ 定时提醒] 你之前设了定时任务 "${alarm.taskName}",现在到时间了。`);
2161
+ reminderParts.push('');
2162
+ reminderParts.push(`**任务目标:** ${alarm.prompt}`);
2163
+ if (alarm.context) {
2164
+ reminderParts.push('');
2165
+ reminderParts.push(`**创建时的对话背景:** ${alarm.context}`);
2166
+ }
2167
+ if (alarm.executionMemory && alarm.executionMemory.length > 0) {
2168
+ reminderParts.push('');
2169
+ reminderParts.push('**历史执行记录:**');
2170
+ for (const mem of alarm.executionMemory) {
2171
+ reminderParts.push(`- ${mem}`);
2172
+ }
2173
+ }
2174
+ reminderParts.push('');
2175
+ reminderParts.push('请现在处理这个任务。你可以根据当前对话上下文和你的记忆,自主判断最佳的执行方式。');
2176
+ const reminderMessage = reminderParts.join('\n');
2177
+ // 清除闹钟信号(防止重复处理)
2178
+ clearAlarm(alarm.taskId);
2179
+ // 清除 scheduler 设置的 runningAtMs 标记
2180
+ store.updateTask(alarm.taskId, {
2181
+ runningAtMs: undefined,
2182
+ lastRunAt: Date.now(),
2183
+ });
2184
+ // 通过 processMessageStream 处理提醒消息
2185
+ // 这样模型在当前完整的对话上下文中执行任务
2186
+ console.log(chalk.yellow(`\n⏰ Alarm triggered: "${alarm.taskName}"`));
2187
+ try {
2188
+ for await (const event of this.processMessageStream(reminderMessage)) {
2189
+ if (event.type === 'text') {
2190
+ process.stdout.write(event.content || '');
2191
+ }
2192
+ else if (event.type === 'tool_start') {
2193
+ console.log(chalk.cyan(`\n[Using tool: ${event.toolName}]`));
2194
+ }
2195
+ else if (event.type === 'tool_end') {
2196
+ const preview = (event.toolResult || '').substring(0, 200);
2197
+ console.log(chalk.gray(`[Result: ${preview}${preview.length >= 200 ? '...' : ''}]`));
2198
+ }
2199
+ }
2200
+ console.log('\n');
2201
+ // 执行成功:更新任务状态,追加执行摘要
2202
+ const task = store.getTask(alarm.taskId);
2203
+ if (task) {
2204
+ // 从最后一条 assistant 消息中提取摘要
2205
+ const messages = this.session.getMessages();
2206
+ const lastAssistant = [...messages].reverse().find(m => m.role === 'assistant');
2207
+ let summary = '(executed in foreground session)';
2208
+ if (lastAssistant && typeof lastAssistant.content === 'string') {
2209
+ summary = lastAssistant.content.slice(0, 200);
2210
+ }
2211
+ const memory = [...(task.executionMemory || [])];
2212
+ memory.push(`[${new Date().toLocaleString()}] ${summary}`);
2213
+ // 最多保留 10 条
2214
+ while (memory.length > 10)
2215
+ memory.shift();
2216
+ store.updateTask(alarm.taskId, {
2217
+ lastRunStatus: 'success',
2218
+ runCount: (task.runCount || 0) + 1,
2219
+ consecutiveErrors: 0,
2220
+ executionMemory: memory,
2221
+ });
2222
+ }
2223
+ }
2224
+ catch (err) {
2225
+ const errMsg = err instanceof Error ? err.message : String(err);
2226
+ console.error(chalk.red(`Alarm task execution failed: ${errMsg}`));
2227
+ const task = store.getTask(alarm.taskId);
2228
+ if (task) {
2229
+ store.updateTask(alarm.taskId, {
2230
+ lastRunStatus: 'failed',
2231
+ lastRunError: errMsg,
2232
+ runCount: (task.runCount || 0) + 1,
2233
+ consecutiveErrors: (task.consecutiveErrors || 0) + 1,
2234
+ });
2235
+ }
2236
+ }
2237
+ }
2238
+ return alarms.length;
2239
+ }
2240
+ async processMessage(userInput) {
2241
+ // 使用工作目录 + 会话 ID 上下文包裹整个消息处理过程
2242
+ // 确保所有工具执行都在正确的上下文中
2243
+ const sessionId = this.session.sessionId || 'cli-default';
2244
+ return runWithSessionId(sessionId, () => {
2245
+ return runWithCwd(this.promptContext.workingDir, async () => {
2246
+ return this.processMessageInternal(userInput);
2247
+ });
2248
+ });
2249
+ }
2250
+ /**
2251
+ * 内部消息处理逻辑(在工作目录上下文中执行)
2252
+ */
2253
+ async processMessageInternal(userInput) {
2254
+ // 确保认证已完成(处理 OAuth API Key 创建)
2255
+ await this.ensureAuthenticated();
2256
+ // 用户新消息 → 重置工具循环检测历史
2257
+ this.resetToolCallHistory();
2258
+ // 自动链接理解:提取用户消息中的 URL 并获取内容
2259
+ const processedInput = await this.preprocessUserInput(userInput);
2260
+ // 添加用户消息
2261
+ this.session.addMessage({
2262
+ role: 'user',
2263
+ content: processedInput,
2264
+ });
2265
+ let turns = 0;
2266
+ const maxTurns = this.options.maxTurns || 50;
2267
+ let finalResponse = '';
2268
+ // 解析模型别名(在循环外部,避免重复解析)
2269
+ const resolvedModel = modelConfig.resolveAlias(this.options.model || 'sonnet');
2270
+ // autoRecall 已移除:信噪比太低,占 200-500 tokens 但回忆的碎片几乎没有参考价值。
2271
+ // 真正有用的记忆已在 Notebook 中,需要搜索时用户可主动调用 MemorySearch 工具。
2272
+ this.promptContext.memoryRecall = undefined;
2273
+ // 构建系统提示词
2274
+ let systemPrompt;
2275
+ let promptBlocks;
2276
+ if (this.options.systemPrompt) {
2277
+ // 如果提供了自定义系统提示词,直接使用
2278
+ systemPrompt = this.options.systemPrompt;
2279
+ }
2280
+ else {
2281
+ // 使用动态构建器生成
2282
+ try {
2283
+ const buildResult = await this.promptBuilder.build(this.promptContext);
2284
+ systemPrompt = buildResult.content;
2285
+ promptBlocks = buildResult.blocks;
2286
+ if (this.options.verbose || process.env.DEBUG) {
2287
+ console.log(chalk.gray(`[Harness] System prompt: ${buildResult.hashInfo.estimatedTokens} tokens, built in ${buildResult.buildTimeMs}ms`));
2288
+ }
2289
+ }
2290
+ catch (error) {
2291
+ console.warn('Failed to build system prompt, using default:', error);
2292
+ systemPrompt = this.getDefaultSystemPrompt();
2293
+ }
2294
+ }
2295
+ // Agent 笔记本:每轮刷新笔记本内容到 promptContext
2296
+ // 确保 agent 在对话中写入的笔记能在下一轮 system prompt 中体现
2297
+ try {
2298
+ const nbMgr = getNotebookManager();
2299
+ if (nbMgr) {
2300
+ const freshSummary = nbMgr.getNotebookSummaryForPrompt();
2301
+ if (freshSummary) {
2302
+ this.promptContext.notebookSummary = freshSummary;
2303
+ }
2304
+ }
2305
+ }
2306
+ catch {
2307
+ // 笔记本加载失败不影响主流程
2308
+ }
2309
+ while (turns < maxTurns) {
2310
+ turns++;
2311
+ // v2.1.34: 每个 turn 开始时重置工具调用历史
2312
+ // 修复 bug:agent 整个生命周期只有一条用户消息,toolCallHistory 永远不会重置,
2313
+ // 导致累积到 TOOL_LOOP_CIRCUIT_BREAKER(20) 后所有后续工具调用被熔断。
2314
+ // maxTurns 已经是防无限循环的主机制,circuit breaker 只需防止单个 turn 内的异常。
2315
+ this.resetToolCallHistory();
2316
+ // 在发送请求前清理旧的持久化输出(第一层 microcompact)
2317
+ // 使用智能触发机制(环境变量 + token 阈值 + 最小节省)
2318
+ let messages = this.session.getMessages();
2319
+ messages = cleanOldPersistedOutputs(messages);
2320
+ // v2.1.7 修复:验证并修复孤立的 tool_result
2321
+ // 确保每个 tool_use 都有对应的 tool_result
2322
+ messages = validateToolResults(messages);
2323
+ // 尝试自动压缩(第二+三层)
2324
+ const compactResult = await autoCompact(messages, resolvedModel, this.client, this.session, this.options.planMode);
2325
+ if (compactResult.wasCompacted) {
2326
+ messages = compactResult.messages;
2327
+ // 更新会话中的消息(压缩成功后替换整个消息列表)
2328
+ // 对齐官方实现:直接替换会话中的消息列表,确保后续请求使用压缩后的消息
2329
+ this.session.setMessages(messages);
2330
+ // 如果有边界标记 UUID,保存到会话状态(用于下次增量压缩)
2331
+ if (compactResult.boundaryUuid) {
2332
+ this.session.setLastCompactedUuid(compactResult.boundaryUuid);
2333
+ }
2334
+ }
2335
+ // v2.1.34: 每次请求前动态过滤工具列表
2336
+ // 根据消息历史中已发现的 MCP 工具决定传哪些工具 schema 给 API
2337
+ const filteredTools = this.filterToolsForRequest(messages);
2338
+ // 对齐官方 v2.1.70:注入 <available-deferred-tools> 列表到消息中(作为 meta user message 前置)
2339
+ // 官方将 deferred tools 列表注入到消息数组头部,而非系统提示词,避免打破 system prompt 缓存前缀
2340
+ if (this.toolSearchEnabled && !isThirdPartyApiEndpoint()) {
2341
+ const deferredToolsList = this.allTools
2342
+ .filter(isDeferredTool)
2343
+ .map(t => `- ${t.name}: ${t.searchHint || t.description.slice(0, 80)}`)
2344
+ .sort()
2345
+ .join('\n');
2346
+ if (deferredToolsList) {
2347
+ const deferredToolsMessage = {
2348
+ role: 'user',
2349
+ content: [{ type: 'text', text: `<available-deferred-tools>\n${deferredToolsList}\n</available-deferred-tools>` }],
2350
+ };
2351
+ messages = [deferredToolsMessage, ...messages];
2352
+ }
2353
+ }
2354
+ let response;
2355
+ try {
2356
+ response = await this.client.createMessage(messages, filteredTools, systemPrompt, {
2357
+ enableThinking: this.options.thinking?.enabled,
2358
+ thinkingBudget: this.options.thinking?.budgetTokens,
2359
+ promptBlocks,
2360
+ toolSearchEnabled: this.toolSearchEnabled,
2361
+ });
2362
+ }
2363
+ catch (apiError) {
2364
+ console.error(chalk.red(`[Loop] API call failed: ${apiError.message}`));
2365
+ if (this.options.debug || this.options.verbose) {
2366
+ console.error(chalk.red('[Loop] Full error:'), apiError);
2367
+ }
2368
+ throw apiError;
2369
+ }
2370
+ // 处理 Extended Thinking 结果
2371
+ if (response.thinking) {
2372
+ if (this.options.thinking?.showThinking || this.options.verbose) {
2373
+ console.log(chalk.gray('\n[Extended Thinking]'));
2374
+ console.log(chalk.gray(response.thinking.thinking));
2375
+ console.log(chalk.gray(`[Thinking tokens: ${response.thinking.thinkingTokens}, time: ${response.thinking.thinkingTimeMs}ms]`));
2376
+ }
2377
+ }
2378
+ // 处理响应内容
2379
+ const assistantContent = [];
2380
+ const toolResults = [];
2381
+ // 收集所有工具返回的 newMessages(对齐官网实现)
2382
+ const allNewMessages = [];
2383
+ // 分离非工具块和工具块
2384
+ const toolUseBlocks = [];
2385
+ for (const block of response.content) {
2386
+ if (block.type === 'text') {
2387
+ assistantContent.push(block);
2388
+ finalResponse += block.text || '';
2389
+ if (this.options.verbose) {
2390
+ process.stdout.write(block.text || '');
2391
+ }
2392
+ }
2393
+ else if (block.type === 'server_tool_use') {
2394
+ assistantContent.push(block);
2395
+ const serverToolBlock = block;
2396
+ if (this.options.verbose) {
2397
+ console.log(chalk.cyan(`\n[Server Tool: ${serverToolBlock.name}]`));
2398
+ console.log(chalk.gray('(executed by Anthropic servers)'));
2399
+ }
2400
+ }
2401
+ else if (block.type === 'web_search_tool_result') {
2402
+ assistantContent.push(block);
2403
+ const searchResultBlock = block;
2404
+ if (this.options.verbose) {
2405
+ console.log(chalk.cyan(`\n[Web Search Results]`));
2406
+ if (Array.isArray(searchResultBlock.content)) {
2407
+ const results = searchResultBlock.content;
2408
+ console.log(chalk.gray(`Found ${results.length} results`));
2409
+ for (const result of results.slice(0, 3)) {
2410
+ if (result.type === 'web_search_result') {
2411
+ console.log(chalk.gray(` - ${result.title}: ${result.url}`));
2412
+ }
2413
+ }
2414
+ }
2415
+ else if (searchResultBlock.content?.type === 'web_search_tool_result_error') {
2416
+ console.log(chalk.red(`Search error: ${searchResultBlock.content.error_code}`));
2417
+ }
2418
+ }
2419
+ }
2420
+ else if (block.type === 'tool_use') {
2421
+ assistantContent.push(block);
2422
+ toolUseBlocks.push(block);
2423
+ }
2424
+ }
2425
+ // 并行执行所有工具(对齐官方 KM5 函数:Promise.all(toolUseBlocks.map(...)))
2426
+ if (toolUseBlocks.length > 0) {
2427
+ // Cache Keepalive:工具执行期间保持 prompt cache 活跃
2428
+ const stopKeepalive = startCacheKeepalive({
2429
+ client: this.client.getAnthropicClient(),
2430
+ model: this.client.getModel(),
2431
+ formattedSystem: formatSystemPrompt(systemPrompt, this.client.getIsOAuth(), promptBlocks),
2432
+ debug: this.options.debug || this.options.verbose,
2433
+ });
2434
+ const execResults = await Promise.all(toolUseBlocks.map(async (block) => {
2435
+ const toolBlock = block;
2436
+ const toolName = toolBlock.name || '';
2437
+ const toolInput = toolBlock.input || {};
2438
+ const toolId = toolBlock.id || '';
2439
+ // 注入 _toolUseId 供 Bash 工具关联实时输出
2440
+ if (toolName === 'Bash' && toolId) {
2441
+ toolInput._toolUseId = toolId;
2442
+ }
2443
+ if (this.options.verbose) {
2444
+ console.log(chalk.cyan(`\n[Tool: ${toolName}]`));
2445
+ }
2446
+ try {
2447
+ const result = await toolRegistry.execute(toolName, toolInput, async (name, input, message) => {
2448
+ return await this.handlePermissionRequest(name, input, message);
2449
+ });
2450
+ if (this.options.verbose) {
2451
+ console.log(chalk.gray(result.output || result.error || ''));
2452
+ }
2453
+ return { toolName, toolInput, toolId, result, error: null };
2454
+ }
2455
+ catch (err) {
2456
+ return { toolName, toolInput, toolId, result: null, error: err };
2457
+ }
2458
+ }));
2459
+ stopKeepalive();
2460
+ // 按顺序处理结果
2461
+ for (const exec of execResults) {
2462
+ if (exec.error || !exec.result) {
2463
+ toolResults.push({
2464
+ type: 'tool_result',
2465
+ tool_use_id: exec.toolId,
2466
+ content: `Error: ${exec.error instanceof Error ? exec.error.message : String(exec.error)}`,
2467
+ });
2468
+ continue;
2469
+ }
2470
+ const result = exec.result;
2471
+ if (!result.success && result.error) {
2472
+ logToolFailed(exec.toolName, result.error, exec.toolInput, this.session.sessionId);
2473
+ }
2474
+ const formattedContent = formatToolResult(exec.toolName, result);
2475
+ if (result.images && result.images.length > 0) {
2476
+ toolResults.push({
2477
+ type: 'tool_result',
2478
+ tool_use_id: exec.toolId,
2479
+ content: [
2480
+ { type: 'text', text: formattedContent || 'Tool completed.' },
2481
+ ...result.images,
2482
+ ],
2483
+ });
2484
+ }
2485
+ else {
2486
+ toolResults.push({
2487
+ type: 'tool_result',
2488
+ tool_use_id: exec.toolId,
2489
+ content: formattedContent,
2490
+ });
2491
+ }
2492
+ if (result.newMessages && result.newMessages.length > 0) {
2493
+ allNewMessages.push(...result.newMessages);
2494
+ }
2495
+ // 工具循环检测
2496
+ const loopStatus = this.recordToolCall(exec.toolName, exec.toolInput);
2497
+ if (loopStatus === 'circuit_break') {
2498
+ console.error(`[ToolLoop] Circuit breaker triggered after ${ConversationLoop.TOOL_LOOP_CIRCUIT_BREAKER} tool calls in one turn`);
2499
+ toolResults.push({
2500
+ type: 'tool_result',
2501
+ tool_use_id: exec.toolId,
2502
+ content: `[CIRCUIT BREAKER] Too many tool calls (${ConversationLoop.TOOL_LOOP_CIRCUIT_BREAKER}) in a single user message. Stop calling tools and summarize what you have done so far.`,
2503
+ });
2504
+ break;
2505
+ }
2506
+ else if (loopStatus === 'warning') {
2507
+ console.error(`[ToolLoop] Repetitive tool call pattern detected for ${exec.toolName}`);
2508
+ }
2509
+ }
2510
+ }
2511
+ // v2.1.30: 修复 phantom "(no content)" 文本块
2512
+ // 当 assistant content 为空数组时,API 会返回 400 错误
2513
+ // 对应官方实现:空 content 时插入 {type:"text", text:"(no content)"} 占位
2514
+ let fixedAssistantContent = assistantContent;
2515
+ if (Array.isArray(assistantContent) && assistantContent.length === 0) {
2516
+ fixedAssistantContent = [{ type: 'text', text: '(no content)' }];
2517
+ }
2518
+ // 添加助手消息
2519
+ this.session.addMessage({
2520
+ role: 'assistant',
2521
+ content: fixedAssistantContent,
2522
+ });
2523
+ // 如果有工具调用,添加结果并继续
2524
+ if (toolResults.length > 0) {
2525
+ this.session.addMessage({
2526
+ role: 'user',
2527
+ content: toolResults,
2528
+ });
2529
+ // 添加 newMessages(对齐官网实现:skill 内容作为独立的 user 消息)
2530
+ // 官网 Ch4: metadata 消息无 isMeta,skill 内容消息 isMeta: true
2531
+ for (const newMsg of allNewMessages) {
2532
+ const msg = {
2533
+ role: newMsg.role,
2534
+ content: newMsg.content,
2535
+ };
2536
+ if ('isMeta' in newMsg && newMsg.isMeta) {
2537
+ msg.isMeta = true;
2538
+ }
2539
+ this.session.addMessage(msg);
2540
+ }
2541
+ }
2542
+ // 检查是否应该停止
2543
+ if (response.stopReason === 'end_turn' && toolResults.length === 0) {
2544
+ break;
2545
+ }
2546
+ // 更新使用统计
2547
+ const turnCost = modelConfig.calculateCost(resolvedModel, {
2548
+ inputTokens: response.usage.inputTokens,
2549
+ outputTokens: response.usage.outputTokens,
2550
+ cacheReadTokens: response.usage.cacheReadTokens,
2551
+ cacheCreationTokens: response.usage.cacheCreationTokens,
2552
+ thinkingTokens: response.usage.thinkingTokens,
2553
+ });
2554
+ this.session.updateUsage(resolvedModel, {
2555
+ inputTokens: response.usage.inputTokens,
2556
+ outputTokens: response.usage.outputTokens,
2557
+ cacheReadInputTokens: response.usage.cacheReadTokens || 0,
2558
+ cacheCreationInputTokens: response.usage.cacheCreationTokens || 0,
2559
+ webSearchRequests: 0,
2560
+ }, turnCost, 0, 0);
2561
+ if (process.env.DEBUG) {
2562
+ console.log(chalk.gray(`[Harness] Turn ${turns}: in=${response.usage.inputTokens} out=${response.usage.outputTokens} cache_read=${response.usage.cacheReadTokens || 0} cost=${turnCost.toFixed(4)} tools=${filteredTools.length}/${this.allTools.length}`));
2563
+ }
2564
+ }
2565
+ // maxTurns 耗尽但仍有工具调用 → 标记为截断
2566
+ if (turns >= maxTurns) {
2567
+ finalResponse += '\n\n[WARNING: max turns reached, task may be incomplete]';
2568
+ }
2569
+ // 自动保存会话
2570
+ this.autoSave();
2571
+ return finalResponse;
2572
+ }
2573
+ /**
2574
+ * 获取默认系统提示词
2575
+ */
2576
+ getDefaultSystemPrompt() {
2577
+ return `You are Claude, an AI assistant made by Anthropic. You are an expert software engineer.
2578
+
2579
+ You have access to tools to help complete tasks. Use them as needed.
2580
+
2581
+ Guidelines:
2582
+ - Be concise and direct
2583
+ - Use tools to gather information before answering
2584
+ - Prefer editing existing files over creating new ones
2585
+ - Always verify your work`;
2586
+ }
2587
+ // 自动保存会话
2588
+ autoSave() {
2589
+ // 子 agent 不持久化 session,避免会话文件污染主会话列表
2590
+ if (this.options.isSubAgent) {
2591
+ return;
2592
+ }
2593
+ try {
2594
+ this.session.save();
2595
+ }
2596
+ catch (err) {
2597
+ // 静默失败,不影响对话
2598
+ if (this.options.verbose) {
2599
+ console.error('Failed to auto-save session:', err);
2600
+ }
2601
+ }
2602
+ }
2603
+ /**
2604
+ * 流式处理用户消息
2605
+ * @param userInput 用户输入(文本或多模态内容数组)
2606
+ */
2607
+ async *processMessageStream(userInput) {
2608
+ // 使用工作目录上下文包裹整个流式处理过程
2609
+ // 注意:AsyncLocalStorage.run() 不能跨 generator 边界传播上下文
2610
+ // 使用 runGeneratorWithCwd 确保每次迭代都在正确的上下文中执行
2611
+ yield* runGeneratorWithCwd(this.promptContext.workingDir, this.processMessageStreamInternal(userInput));
2612
+ }
2613
+ /**
2614
+ * 内部流式消息处理逻辑(在工作目录上下文中执行)
2615
+ * @param userInput 用户输入(文本或多模态内容数组)
2616
+ */
2617
+ async *processMessageStreamInternal(userInput) {
2618
+ // 确保认证已完成(处理 OAuth API Key 创建)
2619
+ await this.ensureAuthenticated();
2620
+ // 用户新消息 → 重置工具循环检测历史
2621
+ this.resetToolCallHistory();
2622
+ // 创建新的 AbortController 用于此次请求
2623
+ this.abortController = new AbortController();
2624
+ // 自动链接理解:提取用户消息中的 URL 并获取内容(仅处理字符串输入)
2625
+ let processedInput = userInput;
2626
+ if (typeof userInput === 'string') {
2627
+ processedInput = await this.preprocessUserInput(userInput);
2628
+ }
2629
+ this.session.addMessage({
2630
+ role: 'user',
2631
+ content: processedInput,
2632
+ });
2633
+ let turns = 0;
2634
+ const maxTurns = this.options.maxTurns || 50;
2635
+ let streamRetryCount = 0; // v9.1: 流式错误连续重试计数
2636
+ const maxStreamRetries = 3; // v9.1: 最大流式错误重试次数
2637
+ let messageConsistencyHealed = false; // 消息一致性自愈标记(防止无限循环)
2638
+ // 解析模型别名(在循环外部,避免重复解析)
2639
+ const resolvedModel = modelConfig.resolveAlias(this.options.model || 'sonnet');
2640
+ while (turns < maxTurns) {
2641
+ // 官方 v2.1.2: 每个 turn 开始时更新 promptContext 中的权限模式
2642
+ // 使用响应式状态获取最新的权限模式
2643
+ const currentMode = this.getCurrentPermissionMode();
2644
+ this.promptContext.permissionMode = currentMode;
2645
+ // 每个 turn 重新构建系统提示词 - 支持运行时权限模式切换 (官方 v2.1.2 Shift+Tab)
2646
+ let systemPrompt;
2647
+ let promptBlocks;
2648
+ if (this.options.systemPrompt) {
2649
+ systemPrompt = this.options.systemPrompt;
2650
+ }
2651
+ else {
2652
+ try {
2653
+ const buildResult = await this.promptBuilder.build(this.promptContext);
2654
+ systemPrompt = buildResult.content;
2655
+ promptBlocks = buildResult.blocks;
2656
+ }
2657
+ catch {
2658
+ systemPrompt = this.getDefaultSystemPrompt();
2659
+ }
2660
+ }
2661
+ // 检查是否已被中断
2662
+ if (this.abortController?.signal.aborted) {
2663
+ yield { type: 'interrupted', content: 'Request interrupted by user' };
2664
+ break;
2665
+ }
2666
+ turns++;
2667
+ // v2.1.34: 每个 turn 开始时重置工具调用历史(同 processMessageInternal 的修复)
2668
+ this.resetToolCallHistory();
2669
+ // 在发送请求前清理旧的持久化输出(第一层 microcompact)
2670
+ // 使用智能触发机制(环境变量 + token 阈值 + 最小节省)
2671
+ let messages = this.session.getMessages();
2672
+ messages = cleanOldPersistedOutputs(messages);
2673
+ // v2.1.7 修复:验证并修复孤立的 tool_result
2674
+ // 确保每个 tool_use 都有对应的 tool_result
2675
+ messages = validateToolResults(messages);
2676
+ // 尝试自动压缩(第二+三层)
2677
+ const compactResult = await autoCompact(messages, resolvedModel, this.client, this.session, this.options.planMode);
2678
+ if (compactResult.wasCompacted) {
2679
+ messages = compactResult.messages;
2680
+ // 更新会话中的消息(压缩成功后替换整个消息列表)
2681
+ // 对齐官方实现:直接替换会话中的消息列表,确保后续请求使用压缩后的消息
2682
+ this.session.setMessages(messages);
2683
+ // 如果有边界标记 UUID,保存到会话状态(用于下次增量压缩)
2684
+ if (compactResult.boundaryUuid) {
2685
+ this.session.setLastCompactedUuid(compactResult.boundaryUuid);
2686
+ }
2687
+ }
2688
+ const assistantContent = [];
2689
+ const toolCalls = new Map();
2690
+ // 存储 web_search_tool_result(用于在 tool_end 中传递搜索结果摘要给 UI)
2691
+ const webSearchResults = new Map();
2692
+ let currentToolId = '';
2693
+ let streamStopReason = 'end_turn';
2694
+ // v2.1.34: 流式 API 也使用动态过滤
2695
+ const streamFilteredTools = this.filterToolsForRequest(messages);
2696
+ // 对齐官方 v2.1.70:注入 <available-deferred-tools> 列表到消息中(streaming 路径)
2697
+ if (this.toolSearchEnabled && !isThirdPartyApiEndpoint()) {
2698
+ const deferredToolsList = this.allTools
2699
+ .filter(isDeferredTool)
2700
+ .map(t => `- ${t.name}: ${t.searchHint || t.description.slice(0, 80)}`)
2701
+ .sort()
2702
+ .join('\n');
2703
+ if (deferredToolsList) {
2704
+ const deferredToolsMessage = {
2705
+ role: 'user',
2706
+ content: [{ type: 'text', text: `<available-deferred-tools>\n${deferredToolsList}\n</available-deferred-tools>` }],
2707
+ };
2708
+ messages = [deferredToolsMessage, ...messages];
2709
+ }
2710
+ }
2711
+ try {
2712
+ for await (const event of this.client.createMessageStream(messages, streamFilteredTools, systemPrompt, {
2713
+ enableThinking: this.options.thinking?.enabled,
2714
+ thinkingBudget: this.options.thinking?.budgetTokens,
2715
+ signal: this.abortController?.signal,
2716
+ promptBlocks,
2717
+ toolSearchEnabled: this.toolSearchEnabled,
2718
+ })) {
2719
+ // 检查是否已被中断
2720
+ if (this.abortController?.signal.aborted) {
2721
+ yield { type: 'interrupted', content: 'Request interrupted by user' };
2722
+ break;
2723
+ }
2724
+ if (event.type === 'text') {
2725
+ yield { type: 'text', content: event.text };
2726
+ assistantContent.push({ type: 'text', text: event.text });
2727
+ }
2728
+ else if (event.type === 'thinking') {
2729
+ // v2.1.33: Extended Thinking content
2730
+ // 将 thinking block 加入 assistantContent,确保中断时能正确保存
2731
+ // normalizeAssistantContent 会在需要时移除尾部孤立的 thinking block
2732
+ if (event.thinking) {
2733
+ assistantContent.push({ type: 'thinking', thinking: event.thinking });
2734
+ }
2735
+ if (this.options.thinking?.showThinking || this.options.verbose) {
2736
+ yield { type: 'text', content: `[Thinking: ${event.thinking}]` };
2737
+ }
2738
+ }
2739
+ else if (event.type === 'tool_use_start') {
2740
+ currentToolId = event.id || '';
2741
+ toolCalls.set(currentToolId, { name: event.name || '', input: '', isServerTool: false });
2742
+ // v3.6: 移除此处的 tool_start 事件,只在工具执行前发送(带完整参数)
2743
+ // 之前在这里发送空参数的 tool_start 会导致日志中出现两次事件
2744
+ }
2745
+ else if (event.type === 'server_tool_use_start') {
2746
+ // Server Tool (如 web_search) - 由 Anthropic 服务器执行
2747
+ // 不需要客户端执行,只记录
2748
+ currentToolId = event.id || '';
2749
+ const serverToolInput = event.input || '';
2750
+ toolCalls.set(currentToolId, { name: event.name || '', input: serverToolInput, isServerTool: true });
2751
+ // Server Tool 立即发送事件,传递 input(如 web_search 的 query)
2752
+ let parsedInput;
2753
+ try {
2754
+ parsedInput = JSON.parse(serverToolInput);
2755
+ }
2756
+ catch { /* ignore */ }
2757
+ yield { type: 'tool_start', toolName: `[Server] ${event.name}`, toolInput: parsedInput };
2758
+ }
2759
+ else if (event.type === 'tool_use_delta') {
2760
+ const tool = toolCalls.get(currentToolId);
2761
+ if (tool && !tool.isServerTool) {
2762
+ tool.input += event.input || '';
2763
+ }
2764
+ }
2765
+ else if (event.type === 'web_search_result') {
2766
+ // web_search_tool_result 从 finalMessage 中提取,收集搜索结果
2767
+ const resultBlock = event.data;
2768
+ if (resultBlock) {
2769
+ assistantContent.push(resultBlock);
2770
+ // 关联到对应的 server_tool_use(通过 tool_use_id)
2771
+ const toolUseId = resultBlock.tool_use_id;
2772
+ if (toolUseId) {
2773
+ webSearchResults.set(toolUseId, resultBlock);
2774
+ }
2775
+ }
2776
+ }
2777
+ else if (event.type === 'response_headers') {
2778
+ // v2.1.6: 处理响应头中的速率限制信息
2779
+ if (event.headers) {
2780
+ updateRateLimitStatus(event.headers, this.options.verbose);
2781
+ }
2782
+ }
2783
+ else if (event.type === 'stop') {
2784
+ // v4.3: 跟踪流式响应的 stopReason
2785
+ // 对齐官方实现:当 stopReason 为 max_tokens 时,响应被截断,循环应继续
2786
+ streamStopReason = event.stopReason || 'end_turn';
2787
+ }
2788
+ else if (event.type === 'error') {
2789
+ console.error(chalk.red(`[Loop] Stream error: ${event.error}`));
2790
+ // v9.2: 将 stream error event 抛出为异常,复用 catch 块的重试逻辑
2791
+ // 之前此处直接 break 会绕过重试机制,导致 LeadAgent 因暂时性网络错误直接死亡
2792
+ throw new Error(event.error);
2793
+ }
2794
+ }
2795
+ }
2796
+ catch (streamError) {
2797
+ // 检查是否是因为中断导致的错误
2798
+ if (this.abortController?.signal.aborted || streamError.name === 'AbortError') {
2799
+ // v10.2: 区分软中断和硬中断
2800
+ if (this._softInterrupted) {
2801
+ // 软中断(插嘴触发):保存已收集内容,重建 controller,continue 到下一轮 turn
2802
+ this._softInterrupted = false;
2803
+ if (assistantContent.length > 0) {
2804
+ const normalizedContent = this.normalizeAssistantContent(assistantContent);
2805
+ this.session.addMessage({
2806
+ role: 'assistant',
2807
+ content: normalizedContent,
2808
+ });
2809
+ }
2810
+ this.abortController = new AbortController();
2811
+ continue; // 不 break,继续下一轮 turn(新消息已在 Session 中)
2812
+ }
2813
+ // 硬中断(ESC / abort):终止整个 loop
2814
+ // 保存已收集的 assistant 内容(如果有)
2815
+ if (assistantContent.length > 0) {
2816
+ const normalizedContent = this.normalizeAssistantContent(assistantContent);
2817
+ this.session.addMessage({
2818
+ role: 'assistant',
2819
+ content: normalizedContent,
2820
+ });
2821
+ }
2822
+ yield { type: 'interrupted', content: 'Request interrupted by user' };
2823
+ break;
2824
+ }
2825
+ // v9.1: 判断是否为可重试的网络错误(暂时性故障)
2826
+ const errMsg = streamError.message || '';
2827
+ const errCode = streamError.code || streamError.type || '';
2828
+ // 消息一致性错误自愈:重复 tool_result 或缺少 tool_result 导致 API 400
2829
+ if (!messageConsistencyHealed &&
2830
+ (errMsg.includes('tool_use must have a single result') ||
2831
+ errMsg.includes('multiple `tool_result` blocks') ||
2832
+ errMsg.includes('without `tool_result` blocks') ||
2833
+ (errMsg.includes('invalid_request_error') && errMsg.includes('tool_result')))) {
2834
+ console.warn(chalk.yellow(`[Loop] Detected message consistency error, attempting self-healing: ${errMsg.substring(0, 100)}`));
2835
+ const healedMessages = validateToolResults(this.session.getMessages());
2836
+ this.session.setMessages(healedMessages);
2837
+ messageConsistencyHealed = true; // 只尝试一次
2838
+ continue;
2839
+ }
2840
+ const isRetryableStreamError = [
2841
+ 'ECONNRESET', 'ETIMEDOUT', 'ENOTFOUND', 'ECONNREFUSED',
2842
+ 'network error', 'fetch failed', 'Connection error', 'connection error',
2843
+ 'overloaded_error', 'rate_limit_error', 'api_error', 'timeout',
2844
+ 'Request timed out', 'timed out',
2845
+ ].some(e => errMsg.includes(e) || errCode.includes(e))
2846
+ || [429, 500, 502, 503, 504, 529].includes(streamError.status || streamError.statusCode || 0);
2847
+ if (isRetryableStreamError && streamRetryCount < maxStreamRetries) {
2848
+ streamRetryCount++;
2849
+ const delay = 1000 * Math.pow(2, streamRetryCount - 1); // 指数退避: 1s, 2s, 4s
2850
+ console.warn(chalk.yellow(`[Loop] Stream request failed (${errCode || errMsg.substring(0, 50)}), retrying after ${delay}ms (${streamRetryCount}/${maxStreamRetries})...`));
2851
+ await new Promise(r => setTimeout(r, delay));
2852
+ // 重新创建 AbortController(旧的可能已被污染)
2853
+ this.abortController = new AbortController();
2854
+ // 不增加 turns 计数,不 break,直接 continue 重试当前 turn
2855
+ continue;
2856
+ }
2857
+ console.error(chalk.red(`[Loop] Stream failed: ${streamError.message}`));
2858
+ if (this.options.debug) {
2859
+ console.error(chalk.red('[Loop] Full error:'), streamError);
2860
+ }
2861
+ yield { type: 'tool_end', toolError: streamError.message };
2862
+ break;
2863
+ }
2864
+ // v9.1: 流式请求成功完成(无异常),重置重试计数器
2865
+ streamRetryCount = 0;
2866
+ // 如果被中断,保存已收集的内容后跳出循环
2867
+ // 关键修复:中断时需要保存 assistantContent,否则恢复会话时无法显示
2868
+ if (this.abortController?.signal.aborted) {
2869
+ // 保存已收集的 assistant 内容(如果有)
2870
+ if (assistantContent.length > 0) {
2871
+ const normalizedContent = this.normalizeAssistantContent(assistantContent);
2872
+ this.session.addMessage({
2873
+ role: 'assistant',
2874
+ content: normalizedContent,
2875
+ });
2876
+ }
2877
+ break;
2878
+ }
2879
+ // 执行所有工具调用
2880
+ const toolResults = [];
2881
+ // 收集所有工具返回的 newMessages(对齐官网实现)
2882
+ const allNewMessages = [];
2883
+ // ========================================================================
2884
+ // 并行工具执行(对齐官方 KM5 函数:Promise.all(toolUseBlocks.map(...)))
2885
+ // 官方实现中所有 tool_use 块是并行执行的,而非串行
2886
+ // ========================================================================
2887
+ // 第一步:处理 Server Tool(同步,不需要执行)
2888
+ const clientToolCalls = [];
2889
+ for (const [id, tool] of toolCalls) {
2890
+ if (tool.isServerTool) {
2891
+ assistantContent.push({
2892
+ type: 'server_tool_use',
2893
+ id,
2894
+ name: tool.name,
2895
+ input: {},
2896
+ });
2897
+ let toolResult = '(executed by Anthropic servers)';
2898
+ const searchResult = webSearchResults.get(id);
2899
+ if (searchResult && tool.name === 'web_search') {
2900
+ if (Array.isArray(searchResult.content)) {
2901
+ const results = searchResult.content.filter((r) => r.type === 'web_search_result');
2902
+ toolResult = JSON.stringify({
2903
+ type: 'web_search_summary',
2904
+ searchCount: results.length,
2905
+ results: results.slice(0, 5).map((r) => ({
2906
+ title: r.title,
2907
+ url: r.url,
2908
+ })),
2909
+ });
2910
+ }
2911
+ else if (searchResult.content?.type === 'web_search_tool_result_error') {
2912
+ toolResult = `Search error: ${searchResult.content.error_code}`;
2913
+ }
2914
+ }
2915
+ yield {
2916
+ type: 'tool_end',
2917
+ toolName: `[Server] ${tool.name}`,
2918
+ toolInput: undefined,
2919
+ toolResult,
2920
+ toolError: undefined,
2921
+ };
2922
+ }
2923
+ else {
2924
+ clientToolCalls.push([id, tool]);
2925
+ }
2926
+ }
2927
+ // 第二步:为所有客户端工具发送 tool_start 事件
2928
+ const parsedInputs = new Map();
2929
+ for (const [id, tool] of clientToolCalls) {
2930
+ try {
2931
+ const input = JSON.parse(tool.input || '{}');
2932
+ parsedInputs.set(id, input);
2933
+ yield { type: 'tool_start', toolName: tool.name, toolInput: input };
2934
+ }
2935
+ catch (err) {
2936
+ parsedInputs.set(id, null);
2937
+ yield {
2938
+ type: 'tool_end',
2939
+ toolName: tool.name,
2940
+ toolInput: undefined,
2941
+ toolResult: undefined,
2942
+ toolError: `Parse error: ${err}`,
2943
+ };
2944
+ }
2945
+ }
2946
+ // 第三步:并行执行所有工具(核心修复)
2947
+ // Cache Keepalive:工具执行期间保持 prompt cache 活跃
2948
+ const stopKeepalive = startCacheKeepalive({
2949
+ client: this.client.getAnthropicClient(),
2950
+ model: this.client.getModel(),
2951
+ formattedSystem: formatSystemPrompt(systemPrompt, this.client.getIsOAuth(), promptBlocks),
2952
+ debug: this.options.debug || this.options.verbose,
2953
+ });
2954
+ const execPromises = [];
2955
+ for (const [id, tool] of clientToolCalls) {
2956
+ const input = parsedInputs.get(id);
2957
+ if (input === null) {
2958
+ // 解析失败,已经 yield 了 tool_end 错误事件
2959
+ continue;
2960
+ }
2961
+ // 注入 _toolUseId 供 Bash 工具关联实时输出
2962
+ if (tool.name === 'Bash' && id) {
2963
+ input._toolUseId = id;
2964
+ }
2965
+ const promise = (async () => {
2966
+ try {
2967
+ let result;
2968
+ if (tool.name === 'AskUserQuestion' && this.options.askUserHandler) {
2969
+ try {
2970
+ const handlerResult = await this.options.askUserHandler({
2971
+ questions: input.questions || [],
2972
+ });
2973
+ if (handlerResult.cancelled) {
2974
+ result = {
2975
+ success: false,
2976
+ error: t('loop.userCancelled'),
2977
+ };
2978
+ }
2979
+ else {
2980
+ const formattedAnswers = Object.entries(handlerResult.answers)
2981
+ .map(([header, answer]) => `"${header}"="${answer}"`)
2982
+ .join(', ');
2983
+ result = {
2984
+ success: true,
2985
+ output: `User has answered your questions: ${formattedAnswers}. You can now continue with the user's answers in mind.`,
2986
+ };
2987
+ }
2988
+ }
2989
+ catch (err) {
2990
+ result = {
2991
+ success: false,
2992
+ error: t('loop.handlerError', { error: err instanceof Error ? err.message : String(err) }),
2993
+ };
2994
+ }
2995
+ }
2996
+ else {
2997
+ result = await toolRegistry.execute(tool.name, input, async (name, toolInput, message) => {
2998
+ return await this.handlePermissionRequest(name, toolInput, message);
2999
+ });
3000
+ }
3001
+ return { id, toolName: tool.name, input, result, error: null };
3002
+ }
3003
+ catch (err) {
3004
+ return { id, toolName: tool.name, input, result: null, error: `Error: ${err}` };
3005
+ }
3006
+ })();
3007
+ execPromises.push(promise);
3008
+ }
3009
+ // 等待所有工具并行执行完成
3010
+ const execResults = await Promise.all(execPromises);
3011
+ stopKeepalive();
3012
+ // 第四步:按顺序处理结果(yield tool_end 事件、构建 toolResults)
3013
+ let circuitBroken = false;
3014
+ for (const exec of execResults) {
3015
+ if (exec.error || !exec.result) {
3016
+ yield {
3017
+ type: 'tool_end',
3018
+ toolName: exec.toolName,
3019
+ toolInput: exec.input,
3020
+ toolResult: undefined,
3021
+ toolError: exec.error || 'Unknown error',
3022
+ };
3023
+ continue;
3024
+ }
3025
+ const result = exec.result;
3026
+ yield {
3027
+ type: 'tool_end',
3028
+ toolName: exec.toolName,
3029
+ toolInput: exec.input,
3030
+ toolResult: result.success ? result.output : undefined,
3031
+ toolError: result.success ? undefined : result.error,
3032
+ };
3033
+ if (!result.success && result.error) {
3034
+ logToolFailed(exec.toolName, result.error, exec.input, this.session.sessionId);
3035
+ }
3036
+ assistantContent.push({
3037
+ type: 'tool_use',
3038
+ id: exec.id,
3039
+ name: exec.toolName,
3040
+ input: exec.input,
3041
+ });
3042
+ const formattedContent = formatToolResult(exec.toolName, result);
3043
+ if (result.images && result.images.length > 0) {
3044
+ toolResults.push({
3045
+ type: 'tool_result',
3046
+ tool_use_id: exec.id,
3047
+ content: [
3048
+ { type: 'text', text: formattedContent || 'Tool completed.' },
3049
+ ...result.images,
3050
+ ],
3051
+ });
3052
+ }
3053
+ else {
3054
+ toolResults.push({
3055
+ type: 'tool_result',
3056
+ tool_use_id: exec.id,
3057
+ content: formattedContent,
3058
+ });
3059
+ }
3060
+ if (result.newMessages && result.newMessages.length > 0) {
3061
+ allNewMessages.push(...result.newMessages);
3062
+ }
3063
+ // 工具循环检测
3064
+ const loopStatus = this.recordToolCall(exec.toolName, exec.input);
3065
+ if (loopStatus === 'circuit_break') {
3066
+ console.error(`[ToolLoop] Circuit breaker triggered after ${ConversationLoop.TOOL_LOOP_CIRCUIT_BREAKER} tool calls in one turn`);
3067
+ toolResults.push({
3068
+ type: 'tool_result',
3069
+ tool_use_id: exec.id,
3070
+ content: `[CIRCUIT BREAKER] Too many tool calls (${ConversationLoop.TOOL_LOOP_CIRCUIT_BREAKER}) in a single user message. Stop calling tools and summarize what you have done so far.`,
3071
+ });
3072
+ circuitBroken = true;
3073
+ break;
3074
+ }
3075
+ else if (loopStatus === 'warning') {
3076
+ console.error(`[ToolLoop] Repetitive tool call pattern detected for ${exec.toolName}`);
3077
+ }
3078
+ }
3079
+ // v2.1.33: 规范化 assistant 内容,修复 abort 时 whitespace+thinking block 导致的 API 错误
3080
+ // 对应官方 kQ1/rC4/_5z 函数:
3081
+ // 1. 过滤仅包含 whitespace 的 text block
3082
+ // 2. 移除尾部孤立的 thinking block
3083
+ // 3. 如果过滤后内容为空,添加一个空文本块避免 API 错误
3084
+ const normalizedContent = this.normalizeAssistantContent(assistantContent);
3085
+ this.session.addMessage({
3086
+ role: 'assistant',
3087
+ content: normalizedContent,
3088
+ });
3089
+ if (toolResults.length > 0) {
3090
+ this.session.addMessage({
3091
+ role: 'user',
3092
+ content: toolResults,
3093
+ });
3094
+ // 添加 newMessages(对齐官网实现:skill 内容作为独立的 user 消息)
3095
+ // 官网 Ch4: metadata 消息无 isMeta,skill 内容消息 isMeta: true
3096
+ for (const newMsg of allNewMessages) {
3097
+ const msg = {
3098
+ role: newMsg.role,
3099
+ content: newMsg.content,
3100
+ };
3101
+ if ('isMeta' in newMsg && newMsg.isMeta) {
3102
+ msg.isMeta = true;
3103
+ }
3104
+ this.session.addMessage(msg);
3105
+ }
3106
+ }
3107
+ else if (streamStopReason === 'max_tokens') {
3108
+ // v4.3: 响应被截断(max_tokens),追加提醒让模型继续
3109
+ // 对齐官方实现:当 LLM 返回数据不稳定/被截断时,不应该退出循环
3110
+ // 这修复了 issue #84 中描述的问题
3111
+ this.session.addMessage({
3112
+ role: 'user',
3113
+ content: '[system: Your response was truncated due to token limits. Please continue where you left off and complete the task using tools.]',
3114
+ });
3115
+ }
3116
+ else if (this.options.isSubAgent && turns === 1) {
3117
+ // v3.4: Worker 子任务模式下,第一轮没有工具调用时不直接退出
3118
+ // 模型可能只是在"思考"或"规划",追加提醒让它使用工具执行
3119
+ this.session.addMessage({
3120
+ role: 'user',
3121
+ content: '你必须使用工具来完成任务(如 Read、Write、Edit、Bash 等),不能只输出文本。请立即开始使用工具执行任务。',
3122
+ });
3123
+ }
3124
+ else {
3125
+ break;
3126
+ }
3127
+ }
3128
+ // 自动保存会话
3129
+ this.autoSave();
3130
+ // maxTurns 耗尽时标记截断,让调用方知道任务未完整完成
3131
+ if (turns >= maxTurns) {
3132
+ yield { type: 'done', content: '[max_turns_reached]' };
3133
+ }
3134
+ else {
3135
+ yield { type: 'done' };
3136
+ }
3137
+ }
3138
+ getSession() {
3139
+ return this.session;
3140
+ }
3141
+ setSession(session) {
3142
+ this.session = session;
3143
+ // v2.1.27: 设置全局会话 ID 以供工具使用(如 gh pr create 自动链接)
3144
+ setCurrentSessionId(session.sessionId);
3145
+ }
3146
+ /**
3147
+ * 设置模型
3148
+ * @param model 模型名称或别名
3149
+ */
3150
+ setModel(model) {
3151
+ const resolvedModel = modelConfig.resolveAlias(model);
3152
+ this.client.setModel(resolvedModel);
3153
+ this.options.model = model; // 保存原始别名
3154
+ }
3155
+ /**
3156
+ * 获取当前模型
3157
+ * @returns 当前模型 ID
3158
+ */
3159
+ getModel() {
3160
+ return this.client.getModel();
3161
+ }
3162
+ /**
3163
+ * 获取调试信息(探针功能)
3164
+ * 返回当前 ConversationLoop 的系统提示词、消息列表、工具列表和模型信息
3165
+ */
3166
+ getDebugInfo() {
3167
+ return {
3168
+ systemPrompt: this.options.systemPrompt || '(dynamically built)',
3169
+ messages: this.session.getMessages(),
3170
+ tools: this.tools.map(t => ({ name: t.name, description: t.description, inputSchema: t.inputSchema })),
3171
+ model: this.getModel(),
3172
+ messageCount: this.session.getMessages().length,
3173
+ };
3174
+ }
3175
+ /**
3176
+ * 中断当前正在进行的请求(硬中断)
3177
+ * ESC 键触发时调用此方法
3178
+ * 会终止整个 processMessageStream 循环
3179
+ */
3180
+ abort() {
3181
+ if (this.abortController) {
3182
+ this.abortController.abort();
3183
+ this.abortController = null;
3184
+ }
3185
+ }
3186
+ /**
3187
+ * v10.2: 软中断 — 中断当前 API 请求但不终止 Loop
3188
+ * 用于"插嘴"场景:用户注入消息后需要打断当前请求,
3189
+ * 让 Loop 在下一轮 turn 重新发起请求(此时新消息已在 Session 中)
3190
+ *
3191
+ * 与 abort() 的区别:
3192
+ * - abort(): 硬中断,终止整个 processMessageStream 循环(yield interrupted + break)
3193
+ * - softInterrupt(): 软中断,只中断当前请求,Loop 继续下一轮 turn(continue)
3194
+ */
3195
+ softInterrupt() {
3196
+ this._softInterrupted = true;
3197
+ if (this.abortController) {
3198
+ this.abortController.abort();
3199
+ // 不清空 abortController,catch 块会重建它
3200
+ }
3201
+ }
3202
+ /**
3203
+ * 获取当前的 AbortSignal(如果存在)
3204
+ * 用于检查是否正在处理请求
3205
+ */
3206
+ getAbortSignal() {
3207
+ return this.abortController?.signal || null;
3208
+ }
3209
+ /**
3210
+ * 检查当前请求是否已被中断
3211
+ */
3212
+ isAborted() {
3213
+ return this.abortController?.signal.aborted ?? false;
3214
+ }
3215
+ /**
3216
+ * 自动记忆:对话结束时自动提取值得记住的信息写入 Notebook
3217
+ *
3218
+ * 设计原理:
3219
+ * - Notebook 写入不能靠 Agent "自律",必须在代码层面强制执行
3220
+ * - 对话结束时(退出/SIGINT)调用一次轻量 API,提取本次对话收获
3221
+ * - 使用 haiku 模型降低成本,只提取结构化信息
3222
+ * - 静默失败,不影响退出流程
3223
+ */
3224
+ async autoMemorize() {
3225
+ try {
3226
+ const nbMgr = getNotebookManager();
3227
+ if (!nbMgr)
3228
+ return;
3229
+ const messages = this.session.getMessages();
3230
+ // 对话太短(少于4条消息 = 2轮对话),没什么可提取的
3231
+ if (messages.length < 4)
3232
+ return;
3233
+ // 读取当前笔记本内容
3234
+ const currentExperience = nbMgr.read('experience');
3235
+ const currentProject = nbMgr.read('project');
3236
+ // 构造提取 prompt
3237
+ const extractionPrompt = `你是一个记忆提取器。分析以下对话,提取值得跨会话记住的信息。
3238
+
3239
+ 当前 experience 笔记本内容:
3240
+ ${currentExperience || '(空)'}
3241
+
3242
+ 当前 project 笔记本内容:
3243
+ ${currentProject || '(空)'}
3244
+
3245
+ 规则:
3246
+ 1. 只提取真正有长期价值的信息,忽略一次性的技术细节
3247
+ 2. experience 笔记本记录:用户偏好、工作模式、个人信息、跨项目经验教训
3248
+ 3. project 笔记本记录:项目特有的陷阱、隐藏依赖、重要架构决策、踩过的坑
3249
+ 4. 如果没有新信息值得记录,返回 NO_UPDATE
3250
+ 5. 如果有更新,返回完整的笔记本内容(不是增量,是完整替换)
3251
+ 6. experience 不超过 4000 tokens,project 不超过 8000 tokens
3252
+ 7. 保留原有内容,只追加或修改有变化的部分
3253
+ 8. 特别关注用户纠正你的内容(如用户说"不对""错了""不是这样"等),这些纠正意味着你之前的理解有误,是最高优先级的记忆
3254
+ 9. 特别注意提取决策链——即"尝试了A方案→发现问题→最终选择B方案"这种过程。记录最终决策及其原因,而不是中间的探索过程
3255
+
3256
+ 输出格式(严格遵守):
3257
+ 如果无需更新:
3258
+ NO_UPDATE
3259
+
3260
+ 如果需要更新 experience:
3261
+ ===EXPERIENCE===
3262
+ (完整的 experience 笔记本内容)
3263
+ ===END_EXPERIENCE===
3264
+
3265
+ 如果需要更新 project:
3266
+ ===PROJECT===
3267
+ (完整的 project 笔记本内容)
3268
+ ===END_PROJECT===
3269
+
3270
+ 可以同时更新两个,也可以只更新一个。
3271
+ 8. 在笔记本末尾维护一行统计:"<!-- autoMemorize: 更新于 {YYYY-MM-DD}, 累计 N 次 -->",每次更新时 N+1`;
3272
+ // 将对话消息精简为文本摘要(只取用户和助手的文本内容,忽略工具调用细节)
3273
+ const conversationSummary = messages
3274
+ .filter((m) => m.role === 'user' || m.role === 'assistant')
3275
+ .map((m) => {
3276
+ const role = m.role === 'user' ? '用户' : '助手';
3277
+ if (typeof m.content === 'string') {
3278
+ return `${role}: ${m.content.substring(0, m.role === 'user' ? 1000 : 800)}`;
3279
+ }
3280
+ if (Array.isArray(m.content)) {
3281
+ const textBlocks = m.content
3282
+ .filter((b) => b.type === 'text' && b.text)
3283
+ .map((b) => b.text.substring(0, m.role === 'user' ? 1000 : 800));
3284
+ if (textBlocks.length > 0) {
3285
+ return `${role}: ${textBlocks.join(' ')}`;
3286
+ }
3287
+ }
3288
+ return null;
3289
+ })
3290
+ .filter(Boolean)
3291
+ .join('\n');
3292
+ // 如果对话内容太少,跳过
3293
+ if (conversationSummary.length < 100)
3294
+ return;
3295
+ // 使用轻量模型调用 API
3296
+ const response = await this.client.createMessage([
3297
+ { role: 'user', content: `${extractionPrompt}\n\n===对话内容===\n${conversationSummary.substring(0, 20000)}` },
3298
+ ], [], // 不需要工具
3299
+ '你是记忆提取器,只输出指定格式,不输出其他内容。');
3300
+ // 解析响应
3301
+ const responseText = response.content
3302
+ .filter((b) => b.type === 'text' && b.text)
3303
+ .map((b) => b.text)
3304
+ .join('');
3305
+ if (!responseText || responseText.includes('NO_UPDATE'))
3306
+ return;
3307
+ // 提取并写入 experience
3308
+ const expMatch = responseText.match(/===EXPERIENCE===\n([\s\S]*?)\n===END_EXPERIENCE===/);
3309
+ if (expMatch && expMatch[1].trim()) {
3310
+ const result = nbMgr.write('experience', expMatch[1].trim());
3311
+ if (result.success) {
3312
+ console.error(chalk.gray('[AutoMemory] experience notebook updated'));
3313
+ }
3314
+ }
3315
+ // 提取并写入 project
3316
+ const projMatch = responseText.match(/===PROJECT===\n([\s\S]*?)\n===END_PROJECT===/);
3317
+ if (projMatch && projMatch[1].trim()) {
3318
+ const result = nbMgr.write('project', projMatch[1].trim());
3319
+ if (result.success) {
3320
+ console.error(chalk.gray('[AutoMemory] project notebook updated'));
3321
+ }
3322
+ }
3323
+ // 标记长期记忆需要重新同步
3324
+ const memSearchMgr = getMemorySearchManager();
3325
+ if (memSearchMgr) {
3326
+ memSearchMgr.markDirty();
3327
+ }
3328
+ }
3329
+ catch (error) {
3330
+ // 非静默失败,记录错误信息
3331
+ console.error(chalk.gray('[AutoMemory] Memory extraction failed:', error instanceof Error ? error.message : String(error)));
3332
+ }
3333
+ }
3334
+ /**
3335
+ * v2.1.33: 规范化 assistant 消息内容
3336
+ *
3337
+ * 修复当 abort 中断流式响应时,whitespace 文本和 thinking block 组合
3338
+ * 绕过规范化导致无效 API 请求的问题。
3339
+ *
3340
+ * 对应官方 kQ1 函数逻辑:
3341
+ * 1. 过滤仅包含 whitespace 的 text block
3342
+ * 2. 移除尾部孤立的 thinking block(没有对应的 text/tool_use 跟随)
3343
+ * 3. 确保内容非空(至少有一个有效的 content block)
3344
+ */
3345
+ normalizeAssistantContent(content) {
3346
+ if (!content || content.length === 0) {
3347
+ return [{ type: 'text', text: '' }];
3348
+ }
3349
+ // Step 1: 过滤仅包含 whitespace 的 text block
3350
+ let filtered = content.filter((block) => {
3351
+ if (block.type === 'text') {
3352
+ // 保留非空 text block
3353
+ return block.text && block.text.trim().length > 0;
3354
+ }
3355
+ // 保留所有非 text block(tool_use, thinking 等)
3356
+ return true;
3357
+ });
3358
+ // Step 2: 移除尾部孤立的 thinking/redacted_thinking block
3359
+ while (filtered.length > 0) {
3360
+ const lastBlock = filtered[filtered.length - 1];
3361
+ if (lastBlock.type === 'thinking' || lastBlock.type === 'redacted_thinking') {
3362
+ filtered.pop();
3363
+ }
3364
+ else {
3365
+ break;
3366
+ }
3367
+ }
3368
+ // Step 3: 确保内容非空
3369
+ if (filtered.length === 0) {
3370
+ return [{ type: 'text', text: '' }];
3371
+ }
3372
+ return filtered;
3373
+ }
3374
+ }
3375
+ //# sourceMappingURL=loop.js.map