attocode 0.2.4 → 0.2.5

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 (577) hide show
  1. package/CHANGELOG.md +56 -1
  2. package/dist/src/adapters.d.ts +2 -1
  3. package/dist/src/adapters.d.ts.map +1 -1
  4. package/dist/src/adapters.js +60 -2
  5. package/dist/src/adapters.js.map +1 -1
  6. package/dist/src/agent/agent-builder.d.ts +117 -0
  7. package/dist/src/agent/agent-builder.d.ts.map +1 -0
  8. package/dist/src/agent/agent-builder.js +204 -0
  9. package/dist/src/agent/agent-builder.js.map +1 -0
  10. package/dist/src/agent/feature-initializer.d.ts +80 -0
  11. package/dist/src/agent/feature-initializer.d.ts.map +1 -0
  12. package/dist/src/agent/feature-initializer.js +677 -0
  13. package/dist/src/agent/feature-initializer.js.map +1 -0
  14. package/dist/src/agent/index.d.ts +13 -0
  15. package/dist/src/agent/index.d.ts.map +1 -0
  16. package/dist/src/agent/index.js +13 -0
  17. package/dist/src/agent/index.js.map +1 -0
  18. package/dist/src/agent/message-builder.d.ts +50 -0
  19. package/dist/src/agent/message-builder.d.ts.map +1 -0
  20. package/dist/src/agent/message-builder.js +173 -0
  21. package/dist/src/agent/message-builder.js.map +1 -0
  22. package/dist/src/agent/session-api.d.ts +94 -0
  23. package/dist/src/agent/session-api.d.ts.map +1 -0
  24. package/dist/src/agent/session-api.js +262 -0
  25. package/dist/src/agent/session-api.js.map +1 -0
  26. package/dist/src/agent-tools/lsp-file-tools.d.ts +1 -1
  27. package/dist/src/agent-tools/lsp-file-tools.d.ts.map +1 -1
  28. package/dist/src/agent.d.ts +14 -115
  29. package/dist/src/agent.d.ts.map +1 -1
  30. package/dist/src/agent.js +36 -1177
  31. package/dist/src/agent.js.map +1 -1
  32. package/dist/src/cli.js +1 -1
  33. package/dist/src/cli.js.map +1 -1
  34. package/dist/src/commands/handler.d.ts.map +1 -1
  35. package/dist/src/commands/handler.js +8 -7
  36. package/dist/src/commands/handler.js.map +1 -1
  37. package/dist/src/commands/init.js +1 -1
  38. package/dist/src/commands/init.js.map +1 -1
  39. package/dist/src/config/schema.d.ts +6 -6
  40. package/dist/src/core/execution-loop.d.ts.map +1 -1
  41. package/dist/src/core/execution-loop.js +155 -16
  42. package/dist/src/core/execution-loop.js.map +1 -1
  43. package/dist/src/core/response-handler.d.ts.map +1 -1
  44. package/dist/src/core/response-handler.js +3 -2
  45. package/dist/src/core/response-handler.js.map +1 -1
  46. package/dist/src/core/subagent-spawner.d.ts.map +1 -1
  47. package/dist/src/core/subagent-spawner.js +13 -6
  48. package/dist/src/core/subagent-spawner.js.map +1 -1
  49. package/dist/src/core/tool-executor.d.ts.map +1 -1
  50. package/dist/src/core/tool-executor.js +7 -2
  51. package/dist/src/core/tool-executor.js.map +1 -1
  52. package/dist/src/core/types.d.ts +1 -0
  53. package/dist/src/core/types.d.ts.map +1 -1
  54. package/dist/src/core/types.js.map +1 -1
  55. package/dist/src/integrations/agents/agent-registry.d.ts +262 -0
  56. package/dist/src/integrations/agents/agent-registry.d.ts.map +1 -0
  57. package/dist/src/integrations/agents/agent-registry.js +686 -0
  58. package/dist/src/integrations/agents/agent-registry.js.map +1 -0
  59. package/dist/src/integrations/agents/async-subagent.d.ts +135 -0
  60. package/dist/src/integrations/agents/async-subagent.d.ts.map +1 -0
  61. package/dist/src/integrations/agents/async-subagent.js +213 -0
  62. package/dist/src/integrations/agents/async-subagent.js.map +1 -0
  63. package/dist/src/integrations/agents/complexity-classifier.d.ts +86 -0
  64. package/dist/src/integrations/agents/complexity-classifier.d.ts.map +1 -0
  65. package/dist/src/integrations/agents/complexity-classifier.js +233 -0
  66. package/dist/src/integrations/agents/complexity-classifier.js.map +1 -0
  67. package/dist/src/integrations/agents/delegation-protocol.d.ts +86 -0
  68. package/dist/src/integrations/agents/delegation-protocol.d.ts.map +1 -0
  69. package/dist/src/integrations/agents/delegation-protocol.js +127 -0
  70. package/dist/src/integrations/agents/delegation-protocol.js.map +1 -0
  71. package/dist/src/integrations/agents/multi-agent.d.ts +150 -0
  72. package/dist/src/integrations/agents/multi-agent.d.ts.map +1 -0
  73. package/dist/src/integrations/agents/multi-agent.js +306 -0
  74. package/dist/src/integrations/agents/multi-agent.js.map +1 -0
  75. package/dist/src/integrations/agents/result-synthesizer.d.ts +389 -0
  76. package/dist/src/integrations/agents/result-synthesizer.d.ts.map +1 -0
  77. package/dist/src/integrations/agents/result-synthesizer.js +951 -0
  78. package/dist/src/integrations/agents/result-synthesizer.js.map +1 -0
  79. package/dist/src/integrations/agents/shared-blackboard.d.ts +406 -0
  80. package/dist/src/integrations/agents/shared-blackboard.d.ts.map +1 -0
  81. package/dist/src/integrations/agents/shared-blackboard.js +757 -0
  82. package/dist/src/integrations/agents/shared-blackboard.js.map +1 -0
  83. package/dist/src/integrations/agents/subagent-output-store.d.ts +91 -0
  84. package/dist/src/integrations/agents/subagent-output-store.d.ts.map +1 -0
  85. package/dist/src/integrations/agents/subagent-output-store.js +257 -0
  86. package/dist/src/integrations/agents/subagent-output-store.js.map +1 -0
  87. package/dist/src/integrations/budget/budget-pool.d.ts +115 -0
  88. package/dist/src/integrations/budget/budget-pool.d.ts.map +1 -0
  89. package/dist/src/integrations/budget/budget-pool.js +205 -0
  90. package/dist/src/integrations/budget/budget-pool.js.map +1 -0
  91. package/dist/src/integrations/budget/cancellation.d.ts +229 -0
  92. package/dist/src/integrations/budget/cancellation.d.ts.map +1 -0
  93. package/dist/src/integrations/budget/cancellation.js +520 -0
  94. package/dist/src/integrations/budget/cancellation.js.map +1 -0
  95. package/dist/src/integrations/budget/dynamic-budget.d.ts +81 -0
  96. package/dist/src/integrations/budget/dynamic-budget.d.ts.map +1 -0
  97. package/dist/src/integrations/budget/dynamic-budget.js +151 -0
  98. package/dist/src/integrations/budget/dynamic-budget.js.map +1 -0
  99. package/dist/src/integrations/budget/economics.d.ts +435 -0
  100. package/dist/src/integrations/budget/economics.d.ts.map +1 -0
  101. package/dist/src/integrations/budget/economics.js +1007 -0
  102. package/dist/src/integrations/budget/economics.js.map +1 -0
  103. package/dist/src/integrations/budget/injection-budget.d.ts +71 -0
  104. package/dist/src/integrations/budget/injection-budget.d.ts.map +1 -0
  105. package/dist/src/integrations/budget/injection-budget.js +137 -0
  106. package/dist/src/integrations/budget/injection-budget.js.map +1 -0
  107. package/dist/src/integrations/budget/loop-detector.d.ts +105 -0
  108. package/dist/src/integrations/budget/loop-detector.d.ts.map +1 -0
  109. package/dist/src/integrations/budget/loop-detector.js +287 -0
  110. package/dist/src/integrations/budget/loop-detector.js.map +1 -0
  111. package/dist/src/integrations/budget/phase-tracker.d.ts +114 -0
  112. package/dist/src/integrations/budget/phase-tracker.d.ts.map +1 -0
  113. package/dist/src/integrations/budget/phase-tracker.js +262 -0
  114. package/dist/src/integrations/budget/phase-tracker.js.map +1 -0
  115. package/dist/src/integrations/budget/resources.d.ts +182 -0
  116. package/dist/src/integrations/budget/resources.d.ts.map +1 -0
  117. package/dist/src/integrations/budget/resources.js +318 -0
  118. package/dist/src/integrations/budget/resources.js.map +1 -0
  119. package/dist/src/integrations/context/auto-compaction.d.ts +210 -0
  120. package/dist/src/integrations/context/auto-compaction.d.ts.map +1 -0
  121. package/dist/src/integrations/context/auto-compaction.js +477 -0
  122. package/dist/src/integrations/context/auto-compaction.js.map +1 -0
  123. package/dist/src/integrations/context/code-analyzer.d.ts +71 -0
  124. package/dist/src/integrations/context/code-analyzer.d.ts.map +1 -0
  125. package/dist/src/integrations/context/code-analyzer.js +448 -0
  126. package/dist/src/integrations/context/code-analyzer.js.map +1 -0
  127. package/dist/src/integrations/context/code-selector.d.ts +78 -0
  128. package/dist/src/integrations/context/code-selector.d.ts.map +1 -0
  129. package/dist/src/integrations/context/code-selector.js +649 -0
  130. package/dist/src/integrations/context/code-selector.js.map +1 -0
  131. package/dist/src/integrations/context/codebase-ast.d.ts +138 -0
  132. package/dist/src/integrations/context/codebase-ast.d.ts.map +1 -0
  133. package/dist/src/integrations/context/codebase-ast.js +818 -0
  134. package/dist/src/integrations/context/codebase-ast.js.map +1 -0
  135. package/dist/src/integrations/context/codebase-context.d.ts +473 -0
  136. package/dist/src/integrations/context/codebase-context.d.ts.map +1 -0
  137. package/dist/src/integrations/context/codebase-context.js +685 -0
  138. package/dist/src/integrations/context/codebase-context.js.map +1 -0
  139. package/dist/src/integrations/context/compaction.d.ts +191 -0
  140. package/dist/src/integrations/context/compaction.d.ts.map +1 -0
  141. package/dist/src/integrations/context/compaction.js +384 -0
  142. package/dist/src/integrations/context/compaction.js.map +1 -0
  143. package/dist/src/integrations/context/context-engineering.d.ts +274 -0
  144. package/dist/src/integrations/context/context-engineering.d.ts.map +1 -0
  145. package/dist/src/integrations/context/context-engineering.js +437 -0
  146. package/dist/src/integrations/context/context-engineering.js.map +1 -0
  147. package/dist/src/integrations/context/file-cache.d.ts +97 -0
  148. package/dist/src/integrations/context/file-cache.d.ts.map +1 -0
  149. package/dist/src/integrations/context/file-cache.js +218 -0
  150. package/dist/src/integrations/context/file-cache.js.map +1 -0
  151. package/dist/src/integrations/context/semantic-cache.d.ts +178 -0
  152. package/dist/src/integrations/context/semantic-cache.d.ts.map +1 -0
  153. package/dist/src/integrations/context/semantic-cache.js +372 -0
  154. package/dist/src/integrations/context/semantic-cache.js.map +1 -0
  155. package/dist/src/integrations/index.d.ts +72 -68
  156. package/dist/src/integrations/index.d.ts.map +1 -1
  157. package/dist/src/integrations/index.js +76 -68
  158. package/dist/src/integrations/index.js.map +1 -1
  159. package/dist/src/integrations/lsp/lsp.d.ts +196 -0
  160. package/dist/src/integrations/lsp/lsp.d.ts.map +1 -0
  161. package/dist/src/integrations/lsp/lsp.js +583 -0
  162. package/dist/src/integrations/lsp/lsp.js.map +1 -0
  163. package/dist/src/integrations/mcp/mcp-client.d.ts +279 -0
  164. package/dist/src/integrations/mcp/mcp-client.d.ts.map +1 -0
  165. package/dist/src/integrations/mcp/mcp-client.js +755 -0
  166. package/dist/src/integrations/mcp/mcp-client.js.map +1 -0
  167. package/dist/src/integrations/mcp/mcp-custom-tools.d.ts +102 -0
  168. package/dist/src/integrations/mcp/mcp-custom-tools.d.ts.map +1 -0
  169. package/dist/src/integrations/mcp/mcp-custom-tools.js +232 -0
  170. package/dist/src/integrations/mcp/mcp-custom-tools.js.map +1 -0
  171. package/dist/src/integrations/mcp/mcp-tool-search.d.ts +77 -0
  172. package/dist/src/integrations/mcp/mcp-tool-search.d.ts.map +1 -0
  173. package/dist/src/integrations/mcp/mcp-tool-search.js +220 -0
  174. package/dist/src/integrations/mcp/mcp-tool-search.js.map +1 -0
  175. package/dist/src/integrations/mcp/mcp-tool-validator.d.ts +60 -0
  176. package/dist/src/integrations/mcp/mcp-tool-validator.d.ts.map +1 -0
  177. package/dist/src/integrations/mcp/mcp-tool-validator.js +141 -0
  178. package/dist/src/integrations/mcp/mcp-tool-validator.js.map +1 -0
  179. package/dist/src/integrations/persistence/codebase-repository.d.ts +45 -0
  180. package/dist/src/integrations/persistence/codebase-repository.d.ts.map +1 -0
  181. package/dist/src/integrations/persistence/codebase-repository.js +81 -0
  182. package/dist/src/integrations/persistence/codebase-repository.js.map +1 -0
  183. package/dist/src/integrations/persistence/goal-repository.d.ts +71 -0
  184. package/dist/src/integrations/persistence/goal-repository.d.ts.map +1 -0
  185. package/dist/src/integrations/persistence/goal-repository.js +184 -0
  186. package/dist/src/integrations/persistence/goal-repository.js.map +1 -0
  187. package/dist/src/integrations/persistence/history.d.ts +72 -0
  188. package/dist/src/integrations/persistence/history.d.ts.map +1 -0
  189. package/dist/src/integrations/persistence/history.js +165 -0
  190. package/dist/src/integrations/persistence/history.js.map +1 -0
  191. package/dist/src/integrations/persistence/persistence.d.ts +49 -0
  192. package/dist/src/integrations/persistence/persistence.d.ts.map +1 -0
  193. package/dist/src/integrations/persistence/persistence.js +197 -0
  194. package/dist/src/integrations/persistence/persistence.js.map +1 -0
  195. package/dist/src/integrations/persistence/session-repository.d.ts +212 -0
  196. package/dist/src/integrations/persistence/session-repository.d.ts.map +1 -0
  197. package/dist/src/integrations/persistence/session-repository.js +770 -0
  198. package/dist/src/integrations/persistence/session-repository.js.map +1 -0
  199. package/dist/src/integrations/persistence/session-store.d.ts +184 -0
  200. package/dist/src/integrations/persistence/session-store.d.ts.map +1 -0
  201. package/dist/src/integrations/persistence/session-store.js +346 -0
  202. package/dist/src/integrations/persistence/session-store.js.map +1 -0
  203. package/dist/src/integrations/persistence/sqlite-store.d.ts +453 -0
  204. package/dist/src/integrations/persistence/sqlite-store.d.ts.map +1 -0
  205. package/dist/src/integrations/persistence/sqlite-store.js +676 -0
  206. package/dist/src/integrations/persistence/sqlite-store.js.map +1 -0
  207. package/dist/src/integrations/persistence/worker-repository.d.ts +65 -0
  208. package/dist/src/integrations/persistence/worker-repository.d.ts.map +1 -0
  209. package/dist/src/integrations/persistence/worker-repository.js +183 -0
  210. package/dist/src/integrations/persistence/worker-repository.js.map +1 -0
  211. package/dist/src/integrations/quality/auto-checkpoint.d.ts +98 -0
  212. package/dist/src/integrations/quality/auto-checkpoint.d.ts.map +1 -0
  213. package/dist/src/integrations/quality/auto-checkpoint.js +252 -0
  214. package/dist/src/integrations/quality/auto-checkpoint.js.map +1 -0
  215. package/dist/src/integrations/quality/dead-letter-queue.d.ts +233 -0
  216. package/dist/src/integrations/quality/dead-letter-queue.d.ts.map +1 -0
  217. package/dist/src/integrations/quality/dead-letter-queue.js +543 -0
  218. package/dist/src/integrations/quality/dead-letter-queue.js.map +1 -0
  219. package/dist/src/integrations/quality/health-check.d.ts +218 -0
  220. package/dist/src/integrations/quality/health-check.d.ts.map +1 -0
  221. package/dist/src/integrations/quality/health-check.js +415 -0
  222. package/dist/src/integrations/quality/health-check.js.map +1 -0
  223. package/dist/src/integrations/quality/learning-store.d.ts +291 -0
  224. package/dist/src/integrations/quality/learning-store.d.ts.map +1 -0
  225. package/dist/src/integrations/quality/learning-store.js +646 -0
  226. package/dist/src/integrations/quality/learning-store.js.map +1 -0
  227. package/dist/src/integrations/quality/self-improvement.d.ts +90 -0
  228. package/dist/src/integrations/quality/self-improvement.d.ts.map +1 -0
  229. package/dist/src/integrations/quality/self-improvement.js +229 -0
  230. package/dist/src/integrations/quality/self-improvement.js.map +1 -0
  231. package/dist/src/integrations/quality/tool-recommendation.d.ts +61 -0
  232. package/dist/src/integrations/quality/tool-recommendation.d.ts.map +1 -0
  233. package/dist/src/integrations/quality/tool-recommendation.js +268 -0
  234. package/dist/src/integrations/quality/tool-recommendation.js.map +1 -0
  235. package/dist/src/integrations/safety/bash-policy.d.ts +33 -0
  236. package/dist/src/integrations/safety/bash-policy.d.ts.map +1 -0
  237. package/dist/src/integrations/safety/bash-policy.js +144 -0
  238. package/dist/src/integrations/safety/bash-policy.js.map +1 -0
  239. package/dist/src/integrations/safety/edit-validator.d.ts +30 -0
  240. package/dist/src/integrations/safety/edit-validator.d.ts.map +1 -0
  241. package/dist/src/integrations/safety/edit-validator.js +87 -0
  242. package/dist/src/integrations/safety/edit-validator.js.map +1 -0
  243. package/dist/src/integrations/safety/execution-policy.d.ts +189 -0
  244. package/dist/src/integrations/safety/execution-policy.d.ts.map +1 -0
  245. package/dist/src/integrations/safety/execution-policy.js +352 -0
  246. package/dist/src/integrations/safety/execution-policy.js.map +1 -0
  247. package/dist/src/integrations/safety/policy-engine.d.ts +55 -0
  248. package/dist/src/integrations/safety/policy-engine.d.ts.map +1 -0
  249. package/dist/src/integrations/safety/policy-engine.js +247 -0
  250. package/dist/src/integrations/safety/policy-engine.js.map +1 -0
  251. package/dist/src/integrations/safety/safety.d.ts +174 -0
  252. package/dist/src/integrations/safety/safety.d.ts.map +1 -0
  253. package/dist/src/integrations/safety/safety.js +470 -0
  254. package/dist/src/integrations/safety/safety.js.map +1 -0
  255. package/dist/src/integrations/safety/sandbox/basic.d.ts +81 -0
  256. package/dist/src/integrations/safety/sandbox/basic.d.ts.map +1 -0
  257. package/dist/src/integrations/safety/sandbox/basic.js +335 -0
  258. package/dist/src/integrations/safety/sandbox/basic.js.map +1 -0
  259. package/dist/src/integrations/safety/sandbox/docker.d.ts +94 -0
  260. package/dist/src/integrations/safety/sandbox/docker.d.ts.map +1 -0
  261. package/dist/src/integrations/safety/sandbox/docker.js +294 -0
  262. package/dist/src/integrations/safety/sandbox/docker.js.map +1 -0
  263. package/dist/src/integrations/safety/sandbox/index.d.ts +188 -0
  264. package/dist/src/integrations/safety/sandbox/index.d.ts.map +1 -0
  265. package/dist/src/integrations/safety/sandbox/index.js +386 -0
  266. package/dist/src/integrations/safety/sandbox/index.js.map +1 -0
  267. package/dist/src/integrations/safety/sandbox/landlock.d.ts +59 -0
  268. package/dist/src/integrations/safety/sandbox/landlock.d.ts.map +1 -0
  269. package/dist/src/integrations/safety/sandbox/landlock.js +329 -0
  270. package/dist/src/integrations/safety/sandbox/landlock.js.map +1 -0
  271. package/dist/src/integrations/safety/sandbox/seatbelt.d.ts +68 -0
  272. package/dist/src/integrations/safety/sandbox/seatbelt.d.ts.map +1 -0
  273. package/dist/src/integrations/safety/sandbox/seatbelt.js +298 -0
  274. package/dist/src/integrations/safety/sandbox/seatbelt.js.map +1 -0
  275. package/dist/src/integrations/safety/type-checker.d.ts +53 -0
  276. package/dist/src/integrations/safety/type-checker.d.ts.map +1 -0
  277. package/dist/src/integrations/safety/type-checker.js +142 -0
  278. package/dist/src/integrations/safety/type-checker.js.map +1 -0
  279. package/dist/src/integrations/skills/skill-executor.d.ts +113 -0
  280. package/dist/src/integrations/skills/skill-executor.d.ts.map +1 -0
  281. package/dist/src/integrations/skills/skill-executor.js +270 -0
  282. package/dist/src/integrations/skills/skill-executor.js.map +1 -0
  283. package/dist/src/integrations/skills/skills.d.ts +262 -0
  284. package/dist/src/integrations/skills/skills.d.ts.map +1 -0
  285. package/dist/src/integrations/skills/skills.js +602 -0
  286. package/dist/src/integrations/skills/skills.js.map +1 -0
  287. package/dist/src/integrations/streaming/pty-shell.d.ts +169 -0
  288. package/dist/src/integrations/streaming/pty-shell.d.ts.map +1 -0
  289. package/dist/src/integrations/streaming/pty-shell.js +367 -0
  290. package/dist/src/integrations/streaming/pty-shell.js.map +1 -0
  291. package/dist/src/integrations/streaming/streaming.d.ts +102 -0
  292. package/dist/src/integrations/streaming/streaming.d.ts.map +1 -0
  293. package/dist/src/integrations/streaming/streaming.js +362 -0
  294. package/dist/src/integrations/streaming/streaming.js.map +1 -0
  295. package/dist/src/integrations/swarm/index.d.ts +2 -1
  296. package/dist/src/integrations/swarm/index.d.ts.map +1 -1
  297. package/dist/src/integrations/swarm/index.js +2 -0
  298. package/dist/src/integrations/swarm/index.js.map +1 -1
  299. package/dist/src/integrations/swarm/model-selector.js +1 -1
  300. package/dist/src/integrations/swarm/model-selector.js.map +1 -1
  301. package/dist/src/integrations/swarm/swarm-budget.d.ts +1 -1
  302. package/dist/src/integrations/swarm/swarm-budget.d.ts.map +1 -1
  303. package/dist/src/integrations/swarm/swarm-budget.js +1 -1
  304. package/dist/src/integrations/swarm/swarm-budget.js.map +1 -1
  305. package/dist/src/integrations/swarm/swarm-config-loader.d.ts.map +1 -1
  306. package/dist/src/integrations/swarm/swarm-config-loader.js +7 -0
  307. package/dist/src/integrations/swarm/swarm-config-loader.js.map +1 -1
  308. package/dist/src/integrations/swarm/swarm-events.d.ts +1 -1
  309. package/dist/src/integrations/swarm/swarm-events.d.ts.map +1 -1
  310. package/dist/src/integrations/swarm/swarm-execution.d.ts +27 -0
  311. package/dist/src/integrations/swarm/swarm-execution.d.ts.map +1 -0
  312. package/dist/src/integrations/swarm/swarm-execution.js +1021 -0
  313. package/dist/src/integrations/swarm/swarm-execution.js.map +1 -0
  314. package/dist/src/integrations/swarm/swarm-helpers.d.ts +26 -0
  315. package/dist/src/integrations/swarm/swarm-helpers.d.ts.map +1 -0
  316. package/dist/src/integrations/swarm/swarm-helpers.js +95 -0
  317. package/dist/src/integrations/swarm/swarm-helpers.js.map +1 -0
  318. package/dist/src/integrations/swarm/swarm-lifecycle.d.ts +100 -0
  319. package/dist/src/integrations/swarm/swarm-lifecycle.d.ts.map +1 -0
  320. package/dist/src/integrations/swarm/swarm-lifecycle.js +922 -0
  321. package/dist/src/integrations/swarm/swarm-lifecycle.js.map +1 -0
  322. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts +84 -203
  323. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts.map +1 -1
  324. package/dist/src/integrations/swarm/swarm-orchestrator.js +251 -2870
  325. package/dist/src/integrations/swarm/swarm-orchestrator.js.map +1 -1
  326. package/dist/src/integrations/swarm/swarm-quality-gate.js +1 -1
  327. package/dist/src/integrations/swarm/swarm-quality-gate.js.map +1 -1
  328. package/dist/src/integrations/swarm/swarm-recovery.d.ts +75 -0
  329. package/dist/src/integrations/swarm/swarm-recovery.d.ts.map +1 -0
  330. package/dist/src/integrations/swarm/swarm-recovery.js +550 -0
  331. package/dist/src/integrations/swarm/swarm-recovery.js.map +1 -0
  332. package/dist/src/integrations/swarm/swarm-state-store.d.ts.map +1 -1
  333. package/dist/src/integrations/swarm/swarm-state-store.js +6 -0
  334. package/dist/src/integrations/swarm/swarm-state-store.js.map +1 -1
  335. package/dist/src/integrations/swarm/task-queue.d.ts +1 -1
  336. package/dist/src/integrations/swarm/task-queue.d.ts.map +1 -1
  337. package/dist/src/integrations/swarm/task-queue.js +28 -1
  338. package/dist/src/integrations/swarm/task-queue.js.map +1 -1
  339. package/dist/src/integrations/swarm/types.d.ts +17 -5
  340. package/dist/src/integrations/swarm/types.d.ts.map +1 -1
  341. package/dist/src/integrations/swarm/types.js.map +1 -1
  342. package/dist/src/integrations/swarm/worker-pool.d.ts +1 -1
  343. package/dist/src/integrations/swarm/worker-pool.d.ts.map +1 -1
  344. package/dist/src/integrations/swarm/worker-pool.js +13 -9
  345. package/dist/src/integrations/swarm/worker-pool.js.map +1 -1
  346. package/dist/src/integrations/tasks/dependency-analyzer.d.ts +34 -0
  347. package/dist/src/integrations/tasks/dependency-analyzer.d.ts.map +1 -0
  348. package/dist/src/integrations/tasks/dependency-analyzer.js +232 -0
  349. package/dist/src/integrations/tasks/dependency-analyzer.js.map +1 -0
  350. package/dist/src/integrations/tasks/interactive-planning.d.ts +322 -0
  351. package/dist/src/integrations/tasks/interactive-planning.d.ts.map +1 -0
  352. package/dist/src/integrations/tasks/interactive-planning.js +655 -0
  353. package/dist/src/integrations/tasks/interactive-planning.js.map +1 -0
  354. package/dist/src/integrations/tasks/pending-plan.d.ts +196 -0
  355. package/dist/src/integrations/tasks/pending-plan.d.ts.map +1 -0
  356. package/dist/src/integrations/tasks/pending-plan.js +431 -0
  357. package/dist/src/integrations/tasks/pending-plan.js.map +1 -0
  358. package/dist/src/integrations/tasks/planning.d.ts +115 -0
  359. package/dist/src/integrations/tasks/planning.d.ts.map +1 -0
  360. package/dist/src/integrations/tasks/planning.js +413 -0
  361. package/dist/src/integrations/tasks/planning.js.map +1 -0
  362. package/dist/src/integrations/tasks/smart-decomposer.d.ts +316 -0
  363. package/dist/src/integrations/tasks/smart-decomposer.d.ts.map +1 -0
  364. package/dist/src/integrations/tasks/smart-decomposer.js +661 -0
  365. package/dist/src/integrations/tasks/smart-decomposer.js.map +1 -0
  366. package/dist/src/integrations/tasks/task-manager.d.ts +164 -0
  367. package/dist/src/integrations/tasks/task-manager.d.ts.map +1 -0
  368. package/dist/src/integrations/tasks/task-manager.js +383 -0
  369. package/dist/src/integrations/tasks/task-manager.js.map +1 -0
  370. package/dist/src/integrations/tasks/task-splitter.d.ts +56 -0
  371. package/dist/src/integrations/tasks/task-splitter.d.ts.map +1 -0
  372. package/dist/src/integrations/tasks/task-splitter.js +537 -0
  373. package/dist/src/integrations/tasks/task-splitter.js.map +1 -0
  374. package/dist/src/integrations/tasks/verification-gate.d.ts +103 -0
  375. package/dist/src/integrations/tasks/verification-gate.d.ts.map +1 -0
  376. package/dist/src/integrations/tasks/verification-gate.js +193 -0
  377. package/dist/src/integrations/tasks/verification-gate.js.map +1 -0
  378. package/dist/src/integrations/tasks/work-log.d.ts +87 -0
  379. package/dist/src/integrations/tasks/work-log.d.ts.map +1 -0
  380. package/dist/src/integrations/tasks/work-log.js +275 -0
  381. package/dist/src/integrations/tasks/work-log.js.map +1 -0
  382. package/dist/src/integrations/utilities/capabilities.d.ts +160 -0
  383. package/dist/src/integrations/utilities/capabilities.d.ts.map +1 -0
  384. package/dist/src/integrations/utilities/capabilities.js +426 -0
  385. package/dist/src/integrations/utilities/capabilities.js.map +1 -0
  386. package/dist/src/integrations/utilities/diff-utils.d.ts +105 -0
  387. package/dist/src/integrations/utilities/diff-utils.d.ts.map +1 -0
  388. package/dist/src/integrations/utilities/diff-utils.js +497 -0
  389. package/dist/src/integrations/utilities/diff-utils.js.map +1 -0
  390. package/dist/src/integrations/utilities/environment-facts.d.ts +52 -0
  391. package/dist/src/integrations/utilities/environment-facts.d.ts.map +1 -0
  392. package/dist/src/integrations/utilities/environment-facts.js +84 -0
  393. package/dist/src/integrations/utilities/environment-facts.js.map +1 -0
  394. package/dist/src/integrations/utilities/file-change-tracker.d.ts +162 -0
  395. package/dist/src/integrations/utilities/file-change-tracker.d.ts.map +1 -0
  396. package/dist/src/integrations/utilities/file-change-tracker.js +538 -0
  397. package/dist/src/integrations/utilities/file-change-tracker.js.map +1 -0
  398. package/dist/src/integrations/utilities/graph-visualization.d.ts +72 -0
  399. package/dist/src/integrations/utilities/graph-visualization.d.ts.map +1 -0
  400. package/dist/src/integrations/utilities/graph-visualization.js +383 -0
  401. package/dist/src/integrations/utilities/graph-visualization.js.map +1 -0
  402. package/dist/src/integrations/utilities/hierarchical-config.d.ts +215 -0
  403. package/dist/src/integrations/utilities/hierarchical-config.d.ts.map +1 -0
  404. package/dist/src/integrations/utilities/hierarchical-config.js +504 -0
  405. package/dist/src/integrations/utilities/hierarchical-config.js.map +1 -0
  406. package/dist/src/integrations/utilities/hooks.d.ts +116 -0
  407. package/dist/src/integrations/utilities/hooks.d.ts.map +1 -0
  408. package/dist/src/integrations/utilities/hooks.js +410 -0
  409. package/dist/src/integrations/utilities/hooks.js.map +1 -0
  410. package/dist/src/integrations/utilities/ignore.d.ts +143 -0
  411. package/dist/src/integrations/utilities/ignore.d.ts.map +1 -0
  412. package/dist/src/integrations/utilities/ignore.js +417 -0
  413. package/dist/src/integrations/utilities/ignore.js.map +1 -0
  414. package/dist/src/integrations/utilities/image-renderer.d.ts +119 -0
  415. package/dist/src/integrations/utilities/image-renderer.d.ts.map +1 -0
  416. package/dist/src/integrations/utilities/image-renderer.js +306 -0
  417. package/dist/src/integrations/utilities/image-renderer.js.map +1 -0
  418. package/dist/src/integrations/utilities/logger.d.ts +104 -0
  419. package/dist/src/integrations/utilities/logger.d.ts.map +1 -0
  420. package/dist/src/integrations/utilities/logger.js +219 -0
  421. package/dist/src/integrations/utilities/logger.js.map +1 -0
  422. package/dist/src/integrations/utilities/memory.d.ts +116 -0
  423. package/dist/src/integrations/utilities/memory.d.ts.map +1 -0
  424. package/dist/src/integrations/utilities/memory.js +311 -0
  425. package/dist/src/integrations/utilities/memory.js.map +1 -0
  426. package/dist/src/integrations/utilities/observability.d.ts +162 -0
  427. package/dist/src/integrations/utilities/observability.d.ts.map +1 -0
  428. package/dist/src/integrations/utilities/observability.js +407 -0
  429. package/dist/src/integrations/utilities/observability.js.map +1 -0
  430. package/dist/src/integrations/utilities/openrouter-pricing.d.ts +67 -0
  431. package/dist/src/integrations/utilities/openrouter-pricing.d.ts.map +1 -0
  432. package/dist/src/integrations/utilities/openrouter-pricing.js +166 -0
  433. package/dist/src/integrations/utilities/openrouter-pricing.js.map +1 -0
  434. package/dist/src/integrations/utilities/react.d.ts +139 -0
  435. package/dist/src/integrations/utilities/react.d.ts.map +1 -0
  436. package/dist/src/integrations/utilities/react.js +273 -0
  437. package/dist/src/integrations/utilities/react.js.map +1 -0
  438. package/dist/src/integrations/utilities/retry.d.ts +132 -0
  439. package/dist/src/integrations/utilities/retry.d.ts.map +1 -0
  440. package/dist/src/integrations/utilities/retry.js +233 -0
  441. package/dist/src/integrations/utilities/retry.js.map +1 -0
  442. package/dist/src/integrations/utilities/routing.d.ts +118 -0
  443. package/dist/src/integrations/utilities/routing.d.ts.map +1 -0
  444. package/dist/src/integrations/utilities/routing.js +348 -0
  445. package/dist/src/integrations/utilities/routing.js.map +1 -0
  446. package/dist/src/integrations/utilities/rules.d.ts +131 -0
  447. package/dist/src/integrations/utilities/rules.d.ts.map +1 -0
  448. package/dist/src/integrations/utilities/rules.js +284 -0
  449. package/dist/src/integrations/utilities/rules.js.map +1 -0
  450. package/dist/src/integrations/utilities/sourcegraph.d.ts +169 -0
  451. package/dist/src/integrations/utilities/sourcegraph.d.ts.map +1 -0
  452. package/dist/src/integrations/utilities/sourcegraph.js +379 -0
  453. package/dist/src/integrations/utilities/sourcegraph.js.map +1 -0
  454. package/dist/src/integrations/utilities/thinking-strategy.d.ts +52 -0
  455. package/dist/src/integrations/utilities/thinking-strategy.d.ts.map +1 -0
  456. package/dist/src/integrations/utilities/thinking-strategy.js +129 -0
  457. package/dist/src/integrations/utilities/thinking-strategy.js.map +1 -0
  458. package/dist/src/integrations/utilities/thread-manager.d.ts +199 -0
  459. package/dist/src/integrations/utilities/thread-manager.d.ts.map +1 -0
  460. package/dist/src/integrations/utilities/thread-manager.js +357 -0
  461. package/dist/src/integrations/utilities/thread-manager.js.map +1 -0
  462. package/dist/src/integrations/utilities/token-estimate.d.ts +11 -0
  463. package/dist/src/integrations/utilities/token-estimate.d.ts.map +1 -0
  464. package/dist/src/integrations/utilities/token-estimate.js +14 -0
  465. package/dist/src/integrations/utilities/token-estimate.js.map +1 -0
  466. package/dist/src/main.js +10 -4
  467. package/dist/src/main.js.map +1 -1
  468. package/dist/src/modes/repl.d.ts.map +1 -1
  469. package/dist/src/modes/repl.js +22 -5
  470. package/dist/src/modes/repl.js.map +1 -1
  471. package/dist/src/modes/tui.d.ts.map +1 -1
  472. package/dist/src/modes/tui.js +23 -6
  473. package/dist/src/modes/tui.js.map +1 -1
  474. package/dist/src/modes.js +1 -1
  475. package/dist/src/modes.js.map +1 -1
  476. package/dist/src/observability/tracer.js +1 -1
  477. package/dist/src/observability/tracer.js.map +1 -1
  478. package/dist/src/persistence/schema.d.ts +2 -0
  479. package/dist/src/persistence/schema.d.ts.map +1 -1
  480. package/dist/src/persistence/schema.js +31 -0
  481. package/dist/src/persistence/schema.js.map +1 -1
  482. package/dist/src/providers/adapters/anthropic.d.ts +6 -0
  483. package/dist/src/providers/adapters/anthropic.d.ts.map +1 -1
  484. package/dist/src/providers/adapters/anthropic.js +99 -15
  485. package/dist/src/providers/adapters/anthropic.js.map +1 -1
  486. package/dist/src/providers/adapters/azure.d.ts +74 -0
  487. package/dist/src/providers/adapters/azure.d.ts.map +1 -0
  488. package/dist/src/providers/adapters/azure.js +354 -0
  489. package/dist/src/providers/adapters/azure.js.map +1 -0
  490. package/dist/src/providers/adapters/mock.d.ts +16 -2
  491. package/dist/src/providers/adapters/mock.d.ts.map +1 -1
  492. package/dist/src/providers/adapters/mock.js +44 -3
  493. package/dist/src/providers/adapters/mock.js.map +1 -1
  494. package/dist/src/providers/adapters/openai.d.ts +6 -1
  495. package/dist/src/providers/adapters/openai.d.ts.map +1 -1
  496. package/dist/src/providers/adapters/openai.js +39 -8
  497. package/dist/src/providers/adapters/openai.js.map +1 -1
  498. package/dist/src/providers/adapters/openrouter.d.ts +6 -0
  499. package/dist/src/providers/adapters/openrouter.d.ts.map +1 -1
  500. package/dist/src/providers/adapters/openrouter.js +73 -3
  501. package/dist/src/providers/adapters/openrouter.js.map +1 -1
  502. package/dist/src/providers/provider.js +1 -1
  503. package/dist/src/providers/provider.js.map +1 -1
  504. package/dist/src/providers/resilient-provider.js +1 -1
  505. package/dist/src/providers/resilient-provider.js.map +1 -1
  506. package/dist/src/providers/types.d.ts +23 -2
  507. package/dist/src/providers/types.d.ts.map +1 -1
  508. package/dist/src/session-picker.d.ts +1 -1
  509. package/dist/src/session-picker.d.ts.map +1 -1
  510. package/dist/src/session-picker.js +1 -1
  511. package/dist/src/session-picker.js.map +1 -1
  512. package/dist/src/shared/budget-tracker.js +1 -1
  513. package/dist/src/shared/budget-tracker.js.map +1 -1
  514. package/dist/src/tools/agent.d.ts +1 -1
  515. package/dist/src/tools/agent.d.ts.map +1 -1
  516. package/dist/src/tools/bash.js +1 -1
  517. package/dist/src/tools/bash.js.map +1 -1
  518. package/dist/src/tools/file.js +1 -1
  519. package/dist/src/tools/file.js.map +1 -1
  520. package/dist/src/tools/permission.js +2 -2
  521. package/dist/src/tools/permission.js.map +1 -1
  522. package/dist/src/tools/registry.d.ts +1 -1
  523. package/dist/src/tools/registry.d.ts.map +1 -1
  524. package/dist/src/tools/registry.js +1 -1
  525. package/dist/src/tools/registry.js.map +1 -1
  526. package/dist/src/tools/tasks.d.ts +1 -1
  527. package/dist/src/tools/tasks.d.ts.map +1 -1
  528. package/dist/src/tools/undo.d.ts +1 -1
  529. package/dist/src/tools/undo.d.ts.map +1 -1
  530. package/dist/src/tracing/cache-boundary-tracker.d.ts.map +1 -1
  531. package/dist/src/tracing/cache-boundary-tracker.js +2 -2
  532. package/dist/src/tracing/cache-boundary-tracker.js.map +1 -1
  533. package/dist/src/tracing/trace-collector.d.ts +22 -0
  534. package/dist/src/tracing/trace-collector.d.ts.map +1 -1
  535. package/dist/src/tracing/trace-collector.js +27 -3
  536. package/dist/src/tracing/trace-collector.js.map +1 -1
  537. package/dist/src/tracing/types.d.ts +17 -1
  538. package/dist/src/tracing/types.d.ts.map +1 -1
  539. package/dist/src/tracing/types.js.map +1 -1
  540. package/dist/src/tricks/failure-evidence.js +1 -1
  541. package/dist/src/tricks/failure-evidence.js.map +1 -1
  542. package/dist/src/tricks/recitation.d.ts.map +1 -1
  543. package/dist/src/tricks/recitation.js +2 -1
  544. package/dist/src/tricks/recitation.js.map +1 -1
  545. package/dist/src/tricks/recursive-context.d.ts.map +1 -1
  546. package/dist/src/tricks/recursive-context.js +2 -2
  547. package/dist/src/tricks/recursive-context.js.map +1 -1
  548. package/dist/src/tricks/reversible-compaction.d.ts.map +1 -1
  549. package/dist/src/tricks/reversible-compaction.js +6 -2
  550. package/dist/src/tricks/reversible-compaction.js.map +1 -1
  551. package/dist/src/tui/app.d.ts +3 -3
  552. package/dist/src/tui/app.d.ts.map +1 -1
  553. package/dist/src/tui/app.js +86 -14
  554. package/dist/src/tui/app.js.map +1 -1
  555. package/dist/src/tui/components/CollapsibleDiffView.d.ts +1 -1
  556. package/dist/src/tui/components/CollapsibleDiffView.d.ts.map +1 -1
  557. package/dist/src/tui/components/DiagnosticsPanel.d.ts +24 -0
  558. package/dist/src/tui/components/DiagnosticsPanel.d.ts.map +1 -0
  559. package/dist/src/tui/components/DiagnosticsPanel.js +47 -0
  560. package/dist/src/tui/components/DiagnosticsPanel.js.map +1 -0
  561. package/dist/src/tui/components/DiffView.d.ts +1 -1
  562. package/dist/src/tui/components/DiffView.d.ts.map +1 -1
  563. package/dist/src/tui/components/ErrorBoundary.js +1 -1
  564. package/dist/src/tui/components/ErrorBoundary.js.map +1 -1
  565. package/dist/src/tui/components/TasksPanel.d.ts +1 -1
  566. package/dist/src/tui/components/TasksPanel.d.ts.map +1 -1
  567. package/dist/src/tui/event-display.js +1 -1
  568. package/dist/src/tui/event-display.js.map +1 -1
  569. package/dist/src/tui/index.js +1 -1
  570. package/dist/src/tui/index.js.map +1 -1
  571. package/dist/src/tui/transparency-aggregator.d.ts +13 -0
  572. package/dist/src/tui/transparency-aggregator.d.ts.map +1 -1
  573. package/dist/src/tui/transparency-aggregator.js +21 -0
  574. package/dist/src/tui/transparency-aggregator.js.map +1 -1
  575. package/dist/src/types.d.ts +27 -2
  576. package/dist/src/types.d.ts.map +1 -1
  577. package/package.json +1 -1
@@ -0,0 +1,755 @@
1
+ /**
2
+ * Lesson 25: MCP Client
3
+ *
4
+ * Connects to Model Context Protocol (MCP) servers to extend agent capabilities.
5
+ * Supports stdio-based servers (spawned as child processes).
6
+ */
7
+ import { spawn } from 'node:child_process';
8
+ import { readFile } from 'node:fs/promises';
9
+ import { existsSync } from 'node:fs';
10
+ import { createInterface } from 'node:readline';
11
+ import { withRetry, MCP_RETRY_CONFIG } from '../utilities/retry.js';
12
+ import { MCPError, isRecoverable } from '../../errors/index.js';
13
+ import { validateAllTools, formatValidationSummary } from './mcp-tool-validator.js';
14
+ import { logger } from '../utilities/logger.js';
15
+ // =============================================================================
16
+ // MCP CLIENT
17
+ // =============================================================================
18
+ /**
19
+ * MCP Client manages connections to MCP servers.
20
+ */
21
+ export class MCPClient {
22
+ config;
23
+ servers = new Map();
24
+ listeners = [];
25
+ dlq = null;
26
+ sessionId;
27
+ constructor(config = {}) {
28
+ this.config = {
29
+ configPath: config.configPath || '.mcp.json',
30
+ configPaths: config.configPaths ?? [],
31
+ requestTimeout: config.requestTimeout ?? 30000,
32
+ autoConnect: config.autoConnect ?? true,
33
+ lazyLoading: config.lazyLoading ?? false,
34
+ alwaysLoadTools: config.alwaysLoadTools ?? [],
35
+ summaryDescriptionLimit: config.summaryDescriptionLimit ?? 100,
36
+ maxToolsPerSearch: config.maxToolsPerSearch ?? 5,
37
+ };
38
+ }
39
+ /**
40
+ * Load servers from config file.
41
+ */
42
+ async loadFromConfig(configPath) {
43
+ const path = configPath || this.config.configPath;
44
+ if (!existsSync(path)) {
45
+ return; // No config file, silently skip
46
+ }
47
+ try {
48
+ const content = await readFile(path, 'utf-8');
49
+ const mcpConfig = JSON.parse(content);
50
+ for (const [name, serverConfig] of Object.entries(mcpConfig.servers)) {
51
+ // Expand environment variables in config
52
+ const expandedConfig = this.expandEnvVars(serverConfig);
53
+ this.registerServer(name, expandedConfig);
54
+ if (this.config.autoConnect) {
55
+ await this.connectServer(name).catch(err => {
56
+ logger.warn('Failed to connect to MCP server', { server: name, error: String(err.message) });
57
+ });
58
+ }
59
+ }
60
+ }
61
+ catch (err) {
62
+ logger.warn('Failed to load MCP config', { path, error: String(err) });
63
+ }
64
+ }
65
+ /**
66
+ * Load servers from multiple config files (hierarchical).
67
+ * Later configs override earlier ones for the same server name.
68
+ * Servers from all configs are merged together.
69
+ */
70
+ async loadFromHierarchicalConfigs(configPaths) {
71
+ const mergedServers = {};
72
+ // Load and merge all configs
73
+ for (const configPath of configPaths) {
74
+ if (!existsSync(configPath)) {
75
+ continue;
76
+ }
77
+ try {
78
+ const content = await readFile(configPath, 'utf-8');
79
+ const mcpConfig = JSON.parse(content);
80
+ // Merge servers (later overrides earlier)
81
+ for (const [name, serverConfig] of Object.entries(mcpConfig.servers)) {
82
+ mergedServers[name] = this.expandEnvVars(serverConfig);
83
+ }
84
+ }
85
+ catch (err) {
86
+ logger.warn('Failed to load MCP config', { configPath, error: String(err) });
87
+ }
88
+ }
89
+ // Register all merged servers
90
+ for (const [name, config] of Object.entries(mergedServers)) {
91
+ this.registerServer(name, config);
92
+ if (this.config.autoConnect) {
93
+ await this.connectServer(name).catch(err => {
94
+ logger.warn('Failed to connect to MCP server', { server: name, error: String(err.message) });
95
+ });
96
+ }
97
+ }
98
+ }
99
+ /**
100
+ * Expand environment variables in config.
101
+ */
102
+ expandEnvVars(config) {
103
+ const expand = (str) => {
104
+ return str.replace(/\$\{(\w+)\}/g, (_, name) => process.env[name] || '');
105
+ };
106
+ return {
107
+ command: expand(config.command),
108
+ args: config.args?.map(expand),
109
+ env: config.env
110
+ ? Object.fromEntries(Object.entries(config.env).map(([k, v]) => [k, expand(v)]))
111
+ : undefined,
112
+ cwd: config.cwd ? expand(config.cwd) : undefined,
113
+ };
114
+ }
115
+ /**
116
+ * Register a server (without connecting).
117
+ */
118
+ registerServer(name, config) {
119
+ this.servers.set(name, {
120
+ name,
121
+ config,
122
+ process: null,
123
+ readline: null,
124
+ tools: [],
125
+ status: 'disconnected',
126
+ pendingRequests: new Map(),
127
+ nextRequestId: 1,
128
+ loadedTools: new Set(),
129
+ });
130
+ }
131
+ /**
132
+ * Connect to a registered server.
133
+ */
134
+ async connectServer(name) {
135
+ const server = this.servers.get(name);
136
+ if (!server) {
137
+ throw MCPError.serverNotFound(name);
138
+ }
139
+ if (server.status === 'connected') {
140
+ return; // Already connected
141
+ }
142
+ server.status = 'connecting';
143
+ this.emit({ type: 'server.connecting', name });
144
+ try {
145
+ // Spawn the server process
146
+ const proc = spawn(server.config.command, server.config.args || [], {
147
+ env: { ...process.env, ...server.config.env },
148
+ cwd: server.config.cwd,
149
+ stdio: ['pipe', 'pipe', 'pipe'],
150
+ });
151
+ server.process = proc;
152
+ // Set up readline for stdout
153
+ server.readline = createInterface({
154
+ input: proc.stdout,
155
+ crlfDelay: Infinity,
156
+ });
157
+ // Handle incoming messages
158
+ server.readline.on('line', (line) => {
159
+ this.handleServerMessage(server, line);
160
+ });
161
+ // Handle errors
162
+ proc.stderr?.on('data', (data) => {
163
+ logger.error('MCP server stderr output', { server: name, output: data.toString() });
164
+ });
165
+ proc.on('error', (err) => {
166
+ server.status = 'error';
167
+ server.error = err.message;
168
+ // CRITICAL: Reject ALL pending requests before clearing
169
+ const errorMsg = new Error(`MCP server "${name}" process error: ${err.message}`);
170
+ for (const [_id, pending] of server.pendingRequests) {
171
+ pending.reject(errorMsg);
172
+ }
173
+ server.pendingRequests.clear();
174
+ this.emit({ type: 'server.error', name, error: err.message });
175
+ });
176
+ proc.on('exit', (code, signal) => {
177
+ // CRITICAL: Reject ALL pending requests before clearing
178
+ // This prevents orphaned promises that never resolve
179
+ const exitError = new Error(`MCP server "${name}" exited unexpectedly (code: ${code}, signal: ${signal})`);
180
+ for (const [_id, pending] of server.pendingRequests) {
181
+ pending.reject(exitError);
182
+ }
183
+ server.pendingRequests.clear();
184
+ server.status = 'disconnected';
185
+ server.process = null;
186
+ server.readline = null;
187
+ this.emit({ type: 'server.disconnected', name });
188
+ });
189
+ // Initialize the connection
190
+ await this.initializeServer(server);
191
+ server.status = 'connected';
192
+ this.emit({ type: 'server.connected', name, toolCount: server.tools.length });
193
+ }
194
+ catch (err) {
195
+ server.status = 'error';
196
+ server.error = err instanceof Error ? err.message : String(err);
197
+ this.emit({ type: 'server.error', name, error: server.error });
198
+ throw err;
199
+ }
200
+ }
201
+ /**
202
+ * Initialize MCP protocol with server.
203
+ */
204
+ async initializeServer(server) {
205
+ // Send initialize request
206
+ const initResult = await this.sendRequest(server, 'initialize', {
207
+ protocolVersion: '2024-11-05',
208
+ capabilities: {},
209
+ clientInfo: {
210
+ name: 'first-principles-agent',
211
+ version: '1.0.0',
212
+ },
213
+ });
214
+ // Send initialized notification
215
+ this.sendNotification(server, 'notifications/initialized', {});
216
+ // List available tools
217
+ const toolsResult = await this.sendRequest(server, 'tools/list', {});
218
+ server.tools = toolsResult.tools || [];
219
+ }
220
+ /**
221
+ * Send a JSON-RPC request and wait for response.
222
+ */
223
+ sendRequest(server, method, params) {
224
+ return new Promise((resolve, reject) => {
225
+ const id = server.nextRequestId++;
226
+ const request = {
227
+ jsonrpc: '2.0',
228
+ id,
229
+ method,
230
+ params,
231
+ };
232
+ server.pendingRequests.set(id, { resolve, reject });
233
+ // Set timeout
234
+ const timeout = setTimeout(() => {
235
+ server.pendingRequests.delete(id);
236
+ reject(MCPError.timeout(server.name, method));
237
+ }, this.config.requestTimeout);
238
+ // Store timeout to clear later
239
+ const originalResolve = resolve;
240
+ server.pendingRequests.set(id, {
241
+ resolve: (result) => {
242
+ clearTimeout(timeout);
243
+ originalResolve(result);
244
+ },
245
+ reject: (error) => {
246
+ clearTimeout(timeout);
247
+ reject(error);
248
+ },
249
+ });
250
+ // Send request
251
+ server.process?.stdin?.write(JSON.stringify(request) + '\n');
252
+ });
253
+ }
254
+ /**
255
+ * Send a JSON-RPC notification (no response expected).
256
+ */
257
+ sendNotification(server, method, params) {
258
+ const notification = {
259
+ jsonrpc: '2.0',
260
+ method,
261
+ params,
262
+ };
263
+ server.process?.stdin?.write(JSON.stringify(notification) + '\n');
264
+ }
265
+ /**
266
+ * Handle incoming message from server.
267
+ */
268
+ handleServerMessage(server, line) {
269
+ let message;
270
+ try {
271
+ message = JSON.parse(line);
272
+ }
273
+ catch (parseError) {
274
+ // Log malformed JSON instead of silently ignoring
275
+ // This helps diagnose protocol desync issues
276
+ const preview = line.length > 100 ? line.substring(0, 100) + '...' : line;
277
+ logger.error('Malformed JSON-RPC message from MCP server', { server: server.name, preview });
278
+ this.emit({ type: 'server.error', name: server.name, error: 'Protocol error: malformed JSON' });
279
+ return; // Don't crash, just skip this malformed message
280
+ }
281
+ // Handle response
282
+ if (message.id !== undefined) {
283
+ const pending = server.pendingRequests.get(message.id);
284
+ if (pending) {
285
+ server.pendingRequests.delete(message.id);
286
+ if (message.error) {
287
+ pending.reject(new Error(message.error.message || 'Unknown error'));
288
+ }
289
+ else {
290
+ pending.resolve(message.result);
291
+ }
292
+ }
293
+ }
294
+ // Handle notifications from server (if any)
295
+ // MCP servers can send notifications for things like resource updates
296
+ }
297
+ /**
298
+ * Disconnect from a server.
299
+ */
300
+ async disconnectServer(name) {
301
+ const server = this.servers.get(name);
302
+ if (!server) {
303
+ return;
304
+ }
305
+ if (server.process) {
306
+ server.process.kill();
307
+ server.process = null;
308
+ }
309
+ if (server.readline) {
310
+ server.readline.close();
311
+ server.readline = null;
312
+ }
313
+ server.status = 'disconnected';
314
+ server.tools = [];
315
+ this.emit({ type: 'server.disconnected', name });
316
+ }
317
+ /**
318
+ * Call a tool on a specific server.
319
+ * Includes automatic retry for transient failures (timeouts, connection resets).
320
+ */
321
+ async callTool(serverName, toolName, args) {
322
+ const server = this.servers.get(serverName);
323
+ if (!server) {
324
+ throw MCPError.serverNotFound(serverName);
325
+ }
326
+ if (server.status !== 'connected') {
327
+ throw MCPError.serverNotConnected(serverName);
328
+ }
329
+ this.emit({ type: 'tool.call', server: serverName, tool: toolName });
330
+ try {
331
+ // Wrap the request with retry logic for transient failures
332
+ const result = await withRetry(async () => {
333
+ return await this.sendRequest(server, 'tools/call', {
334
+ name: toolName,
335
+ arguments: args,
336
+ });
337
+ }, {
338
+ maxAttempts: 2, // Initial + 1 retry
339
+ ...MCP_RETRY_CONFIG,
340
+ onRetry: (attempt, error, delay) => {
341
+ this.emit({
342
+ type: 'tool.call',
343
+ server: serverName,
344
+ tool: toolName,
345
+ // @ts-expect-error Extended event with retry info
346
+ retry: { attempt, error: error.message, delayMs: delay },
347
+ });
348
+ },
349
+ });
350
+ this.emit({ type: 'tool.result', server: serverName, tool: toolName, success: true });
351
+ // Extract text content from result
352
+ const textContent = result.content
353
+ ?.filter(c => c.type === 'text')
354
+ .map(c => c.text)
355
+ .join('\n');
356
+ return textContent || result;
357
+ }
358
+ catch (err) {
359
+ this.emit({ type: 'tool.result', server: serverName, tool: toolName, success: false });
360
+ // Write to DLQ if the error is not recoverable (permanent failure)
361
+ if (this.dlq?.isAvailable() && !isRecoverable(err)) {
362
+ try {
363
+ this.dlq.add({
364
+ operation: `mcp:${serverName}:${toolName}`,
365
+ args,
366
+ error: err,
367
+ sessionId: this.sessionId,
368
+ });
369
+ }
370
+ catch {
371
+ // Don't let DLQ errors affect MCP execution
372
+ }
373
+ }
374
+ throw err;
375
+ }
376
+ }
377
+ /**
378
+ * List all servers and their status.
379
+ */
380
+ listServers() {
381
+ return Array.from(this.servers.values()).map(s => ({
382
+ name: s.name,
383
+ status: s.status,
384
+ toolCount: s.tools.length,
385
+ error: s.error,
386
+ }));
387
+ }
388
+ /**
389
+ * Get tools from a specific server.
390
+ */
391
+ getServerTools(serverName) {
392
+ const server = this.servers.get(serverName);
393
+ return server?.tools || [];
394
+ }
395
+ // ===========================================================================
396
+ // LAZY LOADING METHODS
397
+ // ===========================================================================
398
+ /**
399
+ * Get lightweight summaries for all tools (low token cost).
400
+ * Use this for initial context, then load full definitions on-demand.
401
+ */
402
+ getAllToolSummaries() {
403
+ const summaries = [];
404
+ const descLimit = this.config.summaryDescriptionLimit;
405
+ for (const server of this.servers.values()) {
406
+ if (server.status !== 'connected')
407
+ continue;
408
+ for (const tool of server.tools) {
409
+ const fullName = `mcp_${server.name}_${tool.name}`;
410
+ const desc = tool.description || `MCP tool: ${tool.name}`;
411
+ summaries.push({
412
+ name: fullName,
413
+ description: desc.length > descLimit ? desc.slice(0, descLimit) + '...' : desc,
414
+ serverName: server.name,
415
+ originalName: tool.name,
416
+ });
417
+ }
418
+ }
419
+ return summaries;
420
+ }
421
+ /**
422
+ * Search tools by name or description with BM25-style scoring.
423
+ * Returns matching tool summaries sorted by relevance.
424
+ */
425
+ searchTools(query, options = {}) {
426
+ const { limit = this.config.maxToolsPerSearch, regex = false } = options;
427
+ const summaries = this.getAllToolSummaries();
428
+ if (!query.trim()) {
429
+ return summaries.slice(0, limit);
430
+ }
431
+ // Normalize query
432
+ const queryLower = query.toLowerCase();
433
+ const queryTerms = queryLower.split(/\s+/).filter(t => t.length > 0);
434
+ // Score each tool
435
+ const scored = summaries.map(summary => {
436
+ let score = 0;
437
+ const nameLower = summary.name.toLowerCase();
438
+ const descLower = summary.description.toLowerCase();
439
+ const originalLower = summary.originalName.toLowerCase();
440
+ if (regex) {
441
+ try {
442
+ const re = new RegExp(query, 'i');
443
+ if (re.test(summary.name))
444
+ score += 10;
445
+ if (re.test(summary.description))
446
+ score += 5;
447
+ if (re.test(summary.originalName))
448
+ score += 8;
449
+ }
450
+ catch {
451
+ // Invalid regex, fall back to substring matching
452
+ }
453
+ }
454
+ // BM25-style term frequency scoring
455
+ for (const term of queryTerms) {
456
+ // Exact match bonuses
457
+ if (originalLower === term)
458
+ score += 20;
459
+ if (nameLower.includes(term))
460
+ score += 10;
461
+ if (originalLower.includes(term))
462
+ score += 8;
463
+ if (descLower.includes(term))
464
+ score += 3;
465
+ // Partial match (prefix)
466
+ if (originalLower.startsWith(term))
467
+ score += 5;
468
+ }
469
+ // Boost if all terms appear
470
+ const allTermsInName = queryTerms.every(t => nameLower.includes(t));
471
+ const allTermsInDesc = queryTerms.every(t => descLower.includes(t));
472
+ if (allTermsInName)
473
+ score += 15;
474
+ if (allTermsInDesc)
475
+ score += 5;
476
+ return { summary, score };
477
+ });
478
+ // Filter and sort by score
479
+ const results = scored
480
+ .filter(s => s.score > 0)
481
+ .sort((a, b) => b.score - a.score)
482
+ .slice(0, limit)
483
+ .map(s => s.summary);
484
+ this.emit({ type: 'tool.search', query, resultCount: results.length });
485
+ return results;
486
+ }
487
+ /**
488
+ * Get full tool definition for a specific tool.
489
+ * Marks the tool as loaded for context tracking.
490
+ */
491
+ getFullToolDefinition(toolName) {
492
+ // Parse tool name: mcp_{serverName}_{originalToolName}
493
+ const match = toolName.match(/^mcp_([^_]+)_(.+)$/);
494
+ if (!match)
495
+ return null;
496
+ const [, serverName, originalName] = match;
497
+ const server = this.servers.get(serverName);
498
+ if (!server || server.status !== 'connected')
499
+ return null;
500
+ const mcpTool = server.tools.find(t => t.name === originalName);
501
+ if (!mcpTool)
502
+ return null;
503
+ // Mark as loaded
504
+ server.loadedTools.add(originalName);
505
+ this.emit({ type: 'tool.dynamicLoad', name: toolName, serverName });
506
+ return {
507
+ name: toolName,
508
+ description: mcpTool.description || `MCP tool: ${mcpTool.name} (from ${serverName})`,
509
+ parameters: mcpTool.inputSchema || { type: 'object', properties: {} },
510
+ execute: async (args) => {
511
+ return this.callTool(serverName, originalName, args);
512
+ },
513
+ };
514
+ }
515
+ /**
516
+ * Batch load multiple tools by name.
517
+ * Returns array of loaded ToolDefinitions.
518
+ */
519
+ loadTools(toolNames) {
520
+ const loaded = [];
521
+ for (const name of toolNames) {
522
+ const tool = this.getFullToolDefinition(name);
523
+ if (tool) {
524
+ loaded.push(tool);
525
+ }
526
+ }
527
+ return loaded;
528
+ }
529
+ /**
530
+ * Get context statistics for MCP tools.
531
+ * Useful for monitoring token usage with lazy loading.
532
+ */
533
+ getContextStats() {
534
+ let summaryCount = 0;
535
+ let loadedCount = 0;
536
+ let summaryTokens = 0;
537
+ let definitionTokens = 0;
538
+ for (const server of this.servers.values()) {
539
+ if (server.status !== 'connected')
540
+ continue;
541
+ for (const tool of server.tools) {
542
+ const isLoaded = server.loadedTools.has(tool.name);
543
+ if (isLoaded) {
544
+ loadedCount++;
545
+ // Full definition tokens: name + description + schema
546
+ const schemaStr = tool.inputSchema ? JSON.stringify(tool.inputSchema) : '{}';
547
+ const defChars = (tool.name.length) +
548
+ (tool.description?.length || 0) +
549
+ schemaStr.length;
550
+ definitionTokens += Math.ceil(defChars / 4); // ~4 chars per token
551
+ }
552
+ else {
553
+ summaryCount++;
554
+ // Summary tokens: name + truncated description
555
+ const descLen = Math.min(tool.description?.length || 0, this.config.summaryDescriptionLimit);
556
+ const sumChars = tool.name.length + descLen + server.name.length;
557
+ summaryTokens += Math.ceil(sumChars / 4);
558
+ }
559
+ }
560
+ }
561
+ return {
562
+ summaryTokens,
563
+ definitionTokens,
564
+ summaryCount,
565
+ loadedCount,
566
+ totalTools: summaryCount + loadedCount,
567
+ };
568
+ }
569
+ /**
570
+ * Check if a tool is fully loaded (has schema in context).
571
+ */
572
+ isToolLoaded(toolName) {
573
+ const match = toolName.match(/^mcp_([^_]+)_(.+)$/);
574
+ if (!match)
575
+ return false;
576
+ const [, serverName, originalName] = match;
577
+ const server = this.servers.get(serverName);
578
+ return server?.loadedTools.has(originalName) ?? false;
579
+ }
580
+ /**
581
+ * Get all tools with lazy loading support.
582
+ * When lazyMode is true, only returns always-loaded tools + previously loaded tools.
583
+ * When lazyMode is false (default), returns all tools with full definitions.
584
+ */
585
+ getAllTools(options = {}) {
586
+ const { lazyMode = this.config.lazyLoading } = options;
587
+ if (!lazyMode) {
588
+ // Original behavior: return all tools with full definitions
589
+ const tools = [];
590
+ for (const server of this.servers.values()) {
591
+ if (server.status !== 'connected')
592
+ continue;
593
+ for (const tool of server.tools) {
594
+ tools.push({
595
+ name: `mcp_${server.name}_${tool.name}`,
596
+ description: tool.description || `MCP tool: ${tool.name} (from ${server.name})`,
597
+ parameters: tool.inputSchema || { type: 'object', properties: {} },
598
+ execute: async (args) => {
599
+ return this.callTool(server.name, tool.name, args);
600
+ },
601
+ });
602
+ }
603
+ }
604
+ // Validate tool descriptions (non-invasive: logs warnings, doesn't reject tools)
605
+ if (tools.length > 0) {
606
+ try {
607
+ const results = validateAllTools(tools);
608
+ const poor = results.filter(r => r.score < 50);
609
+ if (poor.length > 0) {
610
+ logger.warn('MCP tool quality issues detected', { poorCount: poor.length, totalCount: tools.length, summary: formatValidationSummary(poor) });
611
+ }
612
+ }
613
+ catch {
614
+ // Validation is optional — don't fail if module has issues
615
+ }
616
+ }
617
+ return tools;
618
+ }
619
+ // Lazy mode: only return always-loaded tools + previously loaded tools
620
+ const tools = [];
621
+ for (const server of this.servers.values()) {
622
+ if (server.status !== 'connected')
623
+ continue;
624
+ for (const tool of server.tools) {
625
+ const fullName = `mcp_${server.name}_${tool.name}`;
626
+ const isAlwaysLoaded = this.config.alwaysLoadTools.some(pattern => fullName.includes(pattern) || tool.name.includes(pattern));
627
+ const isPreviouslyLoaded = server.loadedTools.has(tool.name);
628
+ if (isAlwaysLoaded || isPreviouslyLoaded) {
629
+ // Mark as loaded
630
+ server.loadedTools.add(tool.name);
631
+ tools.push({
632
+ name: fullName,
633
+ description: tool.description || `MCP tool: ${tool.name} (from ${server.name})`,
634
+ parameters: tool.inputSchema || { type: 'object', properties: {} },
635
+ execute: async (args) => {
636
+ return this.callTool(server.name, tool.name, args);
637
+ },
638
+ });
639
+ }
640
+ }
641
+ }
642
+ return tools;
643
+ }
644
+ /**
645
+ * Check if a server is connected.
646
+ */
647
+ isConnected(serverName) {
648
+ const server = this.servers.get(serverName);
649
+ return server?.status === 'connected';
650
+ }
651
+ /**
652
+ * Subscribe to events.
653
+ */
654
+ on(listener) {
655
+ this.listeners.push(listener);
656
+ return () => {
657
+ const idx = this.listeners.indexOf(listener);
658
+ if (idx >= 0)
659
+ this.listeners.splice(idx, 1);
660
+ };
661
+ }
662
+ /**
663
+ * Set the dead letter queue for failed operation tracking.
664
+ * When set, permanent failures will be logged to the DLQ for later retry.
665
+ */
666
+ setDeadLetterQueue(dlq, sessionId) {
667
+ this.dlq = dlq;
668
+ this.sessionId = sessionId;
669
+ }
670
+ /**
671
+ * Emit an event.
672
+ */
673
+ emit(event) {
674
+ for (const listener of this.listeners) {
675
+ try {
676
+ listener(event);
677
+ }
678
+ catch {
679
+ // Ignore listener errors
680
+ }
681
+ }
682
+ }
683
+ /**
684
+ * Cleanup - disconnect all servers.
685
+ */
686
+ async cleanup() {
687
+ for (const name of this.servers.keys()) {
688
+ await this.disconnectServer(name);
689
+ }
690
+ this.servers.clear();
691
+ }
692
+ }
693
+ // =============================================================================
694
+ // FACTORY
695
+ // =============================================================================
696
+ /**
697
+ * Create and initialize an MCP client.
698
+ */
699
+ export async function createMCPClient(config) {
700
+ const client = new MCPClient(config);
701
+ // Use hierarchical loading if configPaths provided, otherwise single config
702
+ if (config?.configPaths && config.configPaths.length > 0) {
703
+ await client.loadFromHierarchicalConfigs(config.configPaths);
704
+ }
705
+ else {
706
+ await client.loadFromConfig();
707
+ }
708
+ return client;
709
+ }
710
+ // =============================================================================
711
+ // UTILITIES
712
+ // =============================================================================
713
+ /**
714
+ * Format server list for display.
715
+ */
716
+ export function formatServerList(servers) {
717
+ if (servers.length === 0) {
718
+ return 'No MCP servers configured.';
719
+ }
720
+ const lines = ['MCP Servers:'];
721
+ for (const server of servers) {
722
+ const statusIcon = server.status === 'connected' ? '✓' : server.status === 'error' ? '✗' : '○';
723
+ const statusColor = server.status === 'connected' ? 'green' : server.status === 'error' ? 'red' : 'dim';
724
+ lines.push(` ${statusIcon} ${server.name} (${server.status}) - ${server.toolCount} tools`);
725
+ if (server.error) {
726
+ lines.push(` Error: ${server.error}`);
727
+ }
728
+ }
729
+ return lines.join('\n');
730
+ }
731
+ /**
732
+ * Create a sample .mcp.json config file content.
733
+ */
734
+ export function getSampleMCPConfig() {
735
+ return JSON.stringify({
736
+ servers: {
737
+ filesystem: {
738
+ command: 'npx',
739
+ args: ['-y', '@anthropic/mcp-server-filesystem', '/path/to/allowed/dir'],
740
+ },
741
+ sqlite: {
742
+ command: 'npx',
743
+ args: ['-y', '@anthropic/mcp-server-sqlite', '~/database.db'],
744
+ },
745
+ github: {
746
+ command: 'npx',
747
+ args: ['-y', '@anthropic/mcp-server-github'],
748
+ env: {
749
+ GITHUB_TOKEN: '${GITHUB_TOKEN}',
750
+ },
751
+ },
752
+ },
753
+ }, null, 2);
754
+ }
755
+ //# sourceMappingURL=mcp-client.js.map