@clinebot/core 0.0.27 → 0.0.29

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 (339) hide show
  1. package/README.md +7 -0
  2. package/dist/ClineCore.d.ts +28 -2
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/account/cline-account-service.d.ts +1 -1
  5. package/dist/account/cline-account-service.d.ts.map +1 -1
  6. package/dist/account/index.d.ts +1 -1
  7. package/dist/account/index.d.ts.map +1 -1
  8. package/dist/account/types.d.ts +5 -0
  9. package/dist/account/types.d.ts.map +1 -1
  10. package/dist/auth/bounded-ttl-cache.d.ts +14 -0
  11. package/dist/auth/bounded-ttl-cache.d.ts.map +1 -0
  12. package/dist/auth/cline.d.ts +27 -2
  13. package/dist/auth/cline.d.ts.map +1 -1
  14. package/dist/auth/oca.d.ts.map +1 -1
  15. package/dist/chat/chat-schema.d.ts +8 -8
  16. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -0
  17. package/dist/{agents → extensions/config}/agent-config-parser.d.ts +2 -2
  18. package/dist/extensions/config/agent-config-parser.d.ts.map +1 -0
  19. package/dist/{agents → extensions/config}/hooks-config-loader.d.ts +1 -1
  20. package/dist/extensions/config/hooks-config-loader.d.ts.map +1 -0
  21. package/dist/{agents → extensions/config}/index.d.ts +2 -4
  22. package/dist/extensions/config/index.d.ts.map +1 -0
  23. package/dist/{runtime/commands.d.ts → extensions/config/runtime-commands.d.ts} +2 -3
  24. package/dist/extensions/config/runtime-commands.d.ts.map +1 -0
  25. package/dist/extensions/config/unified-config-file-watcher.d.ts.map +1 -0
  26. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -0
  27. package/dist/extensions/context/agentic-compaction.d.ts +13 -0
  28. package/dist/extensions/context/agentic-compaction.d.ts.map +1 -0
  29. package/dist/extensions/context/basic-compaction.d.ts +9 -0
  30. package/dist/extensions/context/basic-compaction.d.ts.map +1 -0
  31. package/dist/extensions/context/compaction-shared.d.ts +60 -0
  32. package/dist/extensions/context/compaction-shared.d.ts.map +1 -0
  33. package/dist/extensions/context/compaction.d.ts +20 -0
  34. package/dist/extensions/context/compaction.d.ts.map +1 -0
  35. package/dist/extensions/index.d.ts +5 -0
  36. package/dist/extensions/index.d.ts.map +1 -0
  37. package/dist/extensions/mcp/client.d.ts +3 -0
  38. package/dist/extensions/mcp/client.d.ts.map +1 -0
  39. package/dist/extensions/mcp/config-loader.d.ts.map +1 -0
  40. package/dist/extensions/mcp/index.d.ts +9 -0
  41. package/dist/extensions/mcp/index.d.ts.map +1 -0
  42. package/dist/{mcp → extensions/mcp}/manager.d.ts +1 -2
  43. package/dist/extensions/mcp/manager.d.ts.map +1 -0
  44. package/dist/extensions/mcp/name-transform.d.ts +3 -0
  45. package/dist/extensions/mcp/name-transform.d.ts.map +1 -0
  46. package/dist/extensions/mcp/policies.d.ts +15 -0
  47. package/dist/extensions/mcp/policies.d.ts.map +1 -0
  48. package/dist/extensions/mcp/tools.d.ts +4 -0
  49. package/dist/extensions/mcp/tools.d.ts.map +1 -0
  50. package/dist/{mcp → extensions/mcp}/types.d.ts +29 -1
  51. package/dist/extensions/mcp/types.d.ts.map +1 -0
  52. package/dist/{agents → extensions/plugin}/plugin-config-loader.d.ts +1 -1
  53. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -0
  54. package/dist/{agents → extensions/plugin}/plugin-loader.d.ts +1 -1
  55. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -0
  56. package/dist/extensions/plugin/plugin-module-import.d.ts +5 -0
  57. package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -0
  58. package/dist/{agents → extensions/plugin}/plugin-sandbox.d.ts +1 -1
  59. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -0
  60. package/dist/extensions/plugin-sandbox-bootstrap.js +485 -0
  61. package/dist/hooks/index.d.ts +4 -0
  62. package/dist/hooks/index.d.ts.map +1 -0
  63. package/dist/hooks/persistent.d.ts +64 -0
  64. package/dist/hooks/persistent.d.ts.map +1 -0
  65. package/dist/hooks/subprocess-runner.d.ts +22 -0
  66. package/dist/hooks/subprocess-runner.d.ts.map +1 -0
  67. package/dist/hooks/subprocess.d.ts +189 -0
  68. package/dist/hooks/subprocess.d.ts.map +1 -0
  69. package/dist/index.d.ts +22 -25
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +560 -447
  72. package/dist/prompt/default-system.d.ts +2 -0
  73. package/dist/prompt/default-system.d.ts.map +1 -0
  74. package/dist/providers/local-provider-service.d.ts +1 -1
  75. package/dist/providers/local-provider-service.d.ts.map +1 -1
  76. package/dist/runtime/checkpoint-hooks.d.ts +21 -0
  77. package/dist/runtime/checkpoint-hooks.d.ts.map +1 -0
  78. package/dist/runtime/hook-file-hooks.d.ts +1 -1
  79. package/dist/runtime/hook-file-hooks.d.ts.map +1 -1
  80. package/dist/runtime/rules.d.ts +1 -1
  81. package/dist/runtime/rules.d.ts.map +1 -1
  82. package/dist/runtime/runtime-builder.d.ts +1 -1
  83. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  84. package/dist/runtime/session-runtime.d.ts +25 -5
  85. package/dist/runtime/session-runtime.d.ts.map +1 -1
  86. package/dist/runtime/subprocess-sandbox.d.ts.map +1 -0
  87. package/dist/runtime/team-runtime-registry.d.ts +1 -1
  88. package/dist/runtime/team-runtime-registry.d.ts.map +1 -1
  89. package/dist/runtime/tool-approval.d.ts +1 -1
  90. package/dist/session/default-session-manager.d.ts +4 -3
  91. package/dist/session/default-session-manager.d.ts.map +1 -1
  92. package/dist/session/file-session-service.d.ts +1 -1
  93. package/dist/session/file-session-service.d.ts.map +1 -1
  94. package/dist/session/{unified-session-persistence-service.d.ts → persistence-service.d.ts} +11 -42
  95. package/dist/session/persistence-service.d.ts.map +1 -0
  96. package/dist/session/rpc-session-service.d.ts +1 -1
  97. package/dist/session/rpc-session-service.d.ts.map +1 -1
  98. package/dist/session/session-agent-events.d.ts +1 -1
  99. package/dist/session/session-artifacts.d.ts.map +1 -1
  100. package/dist/session/session-config-builder.d.ts.map +1 -1
  101. package/dist/session/session-graph.d.ts +1 -1
  102. package/dist/session/session-graph.d.ts.map +1 -1
  103. package/dist/session/session-host.d.ts.map +1 -1
  104. package/dist/session/session-manager.d.ts +6 -5
  105. package/dist/session/session-manager.d.ts.map +1 -1
  106. package/dist/session/session-manifest.d.ts +1 -1
  107. package/dist/session/session-service.d.ts +3 -2
  108. package/dist/session/session-service.d.ts.map +1 -1
  109. package/dist/session/session-team-coordination.d.ts +2 -1
  110. package/dist/session/session-team-coordination.d.ts.map +1 -1
  111. package/dist/session/utils/helpers.d.ts +51 -3
  112. package/dist/session/utils/helpers.d.ts.map +1 -1
  113. package/dist/session/utils/types.d.ts +41 -7
  114. package/dist/session/utils/types.d.ts.map +1 -1
  115. package/dist/session/workspace-manager.d.ts +1 -2
  116. package/dist/session/workspace-manager.d.ts.map +1 -1
  117. package/dist/session/workspace-manifest.d.ts +1 -22
  118. package/dist/session/workspace-manifest.d.ts.map +1 -1
  119. package/dist/storage/file-team-store.d.ts +2 -1
  120. package/dist/storage/file-team-store.d.ts.map +1 -1
  121. package/dist/storage/sqlite-team-store.d.ts +4 -1
  122. package/dist/storage/sqlite-team-store.d.ts.map +1 -1
  123. package/dist/storage/team-store.d.ts.map +1 -1
  124. package/dist/team/delegated-agent.d.ts +44 -0
  125. package/dist/team/delegated-agent.d.ts.map +1 -0
  126. package/dist/team/index.d.ts +1 -0
  127. package/dist/team/index.d.ts.map +1 -1
  128. package/dist/team/multi-agent.d.ts +229 -0
  129. package/dist/team/multi-agent.d.ts.map +1 -0
  130. package/dist/team/projections.d.ts +2 -2
  131. package/dist/team/projections.d.ts.map +1 -1
  132. package/dist/team/runtime.d.ts +5 -0
  133. package/dist/team/runtime.d.ts.map +1 -0
  134. package/dist/team/spawn-agent-tool.d.ts +85 -0
  135. package/dist/team/spawn-agent-tool.d.ts.map +1 -0
  136. package/dist/team/subagent-prompts.d.ts +4 -0
  137. package/dist/team/subagent-prompts.d.ts.map +1 -0
  138. package/dist/team/team-tools.d.ts +35 -0
  139. package/dist/team/team-tools.d.ts.map +1 -0
  140. package/dist/telemetry/OpenTelemetryProvider.d.ts +11 -1
  141. package/dist/telemetry/OpenTelemetryProvider.d.ts.map +1 -1
  142. package/dist/telemetry/{LoggerTelemetryAdapter.d.ts → TelemetryLoggerSink.d.ts} +10 -4
  143. package/dist/telemetry/TelemetryLoggerSink.d.ts.map +1 -0
  144. package/dist/telemetry/TelemetryService.d.ts.map +1 -1
  145. package/dist/telemetry/index.js +15 -28
  146. package/dist/tools/definitions.d.ts +4 -3
  147. package/dist/tools/definitions.d.ts.map +1 -1
  148. package/dist/tools/index.d.ts +5 -5
  149. package/dist/tools/index.d.ts.map +1 -1
  150. package/dist/tools/model-tool-routing.d.ts.map +1 -1
  151. package/dist/tools/presets.d.ts +26 -0
  152. package/dist/tools/presets.d.ts.map +1 -1
  153. package/dist/tools/schemas.d.ts +8 -0
  154. package/dist/tools/schemas.d.ts.map +1 -1
  155. package/dist/tools/types.d.ts +23 -2
  156. package/dist/tools/types.d.ts.map +1 -1
  157. package/dist/types/config.d.ts +47 -3
  158. package/dist/types/config.d.ts.map +1 -1
  159. package/dist/types/events.d.ts +1 -1
  160. package/dist/types/provider-settings.d.ts +1 -1
  161. package/dist/types/provider-settings.d.ts.map +1 -1
  162. package/dist/types/storage.d.ts +2 -1
  163. package/dist/types/storage.d.ts.map +1 -1
  164. package/dist/types.d.ts +7 -16
  165. package/dist/types.d.ts.map +1 -1
  166. package/package.json +16 -13
  167. package/src/ClineCore.test.ts +150 -0
  168. package/src/ClineCore.ts +114 -8
  169. package/src/account/cline-account-service.test.ts +84 -0
  170. package/src/account/cline-account-service.ts +2 -2
  171. package/src/account/index.ts +1 -0
  172. package/src/account/types.ts +6 -0
  173. package/src/auth/bounded-ttl-cache.test.ts +38 -0
  174. package/src/auth/bounded-ttl-cache.ts +53 -0
  175. package/src/auth/cline.test.ts +173 -36
  176. package/src/auth/cline.ts +395 -93
  177. package/src/auth/oca.test.ts +125 -0
  178. package/src/auth/oca.ts +17 -4
  179. package/src/{agents → extensions/config}/agent-config-loader.test.ts +1 -1
  180. package/src/{agents → extensions/config}/agent-config-parser.ts +2 -2
  181. package/src/{agents → extensions/config}/hooks-config-loader.ts +1 -1
  182. package/src/{agents → extensions/config}/index.ts +7 -11
  183. package/src/{runtime/commands.test.ts → extensions/config/runtime-commands.test.ts} +20 -3
  184. package/src/{runtime/commands.ts → extensions/config/runtime-commands.ts} +1 -8
  185. package/src/{agents → extensions/config}/unified-config-file-watcher.ts +15 -2
  186. package/src/{agents → extensions/config}/user-instruction-config-loader.test.ts +90 -2
  187. package/src/{agents → extensions/config}/user-instruction-config-loader.ts +126 -12
  188. package/src/extensions/context/agentic-compaction.ts +119 -0
  189. package/src/extensions/context/basic-compaction.ts +275 -0
  190. package/src/extensions/context/compaction-shared.ts +458 -0
  191. package/src/extensions/context/compaction.test.ts +477 -0
  192. package/src/extensions/context/compaction.ts +203 -0
  193. package/src/extensions/index.ts +12 -0
  194. package/src/extensions/mcp/client.ts +420 -0
  195. package/src/{mcp → extensions/mcp}/index.ts +16 -0
  196. package/src/{mcp → extensions/mcp}/manager.test.ts +1 -2
  197. package/src/{mcp → extensions/mcp}/manager.ts +3 -5
  198. package/src/extensions/mcp/name-transform.ts +33 -0
  199. package/src/extensions/mcp/policies.ts +47 -0
  200. package/src/extensions/mcp/tools.ts +47 -0
  201. package/src/{mcp → extensions/mcp}/types.ts +35 -7
  202. package/src/{agents → extensions/plugin}/plugin-config-loader.test.ts +18 -13
  203. package/src/{agents → extensions/plugin}/plugin-config-loader.ts +1 -1
  204. package/src/{agents → extensions/plugin}/plugin-loader.test.ts +41 -4
  205. package/src/extensions/plugin/plugin-loader.ts +106 -0
  206. package/src/extensions/plugin/plugin-module-import.ts +278 -0
  207. package/src/{agents → extensions/plugin}/plugin-sandbox-bootstrap.ts +30 -92
  208. package/src/{agents → extensions/plugin}/plugin-sandbox.test.ts +60 -3
  209. package/src/{agents → extensions/plugin}/plugin-sandbox.ts +146 -56
  210. package/src/hooks/index.ts +25 -0
  211. package/src/hooks/persistent.ts +661 -0
  212. package/src/hooks/subprocess-runner.ts +196 -0
  213. package/src/hooks/subprocess.ts +669 -0
  214. package/src/index.ts +200 -118
  215. package/src/prompt/default-system.ts +21 -0
  216. package/src/providers/local-provider-registry.ts +1 -1
  217. package/src/providers/local-provider-service.test.ts +23 -2
  218. package/src/providers/local-provider-service.ts +2 -2
  219. package/src/runtime/checkpoint-hooks.test.ts +167 -0
  220. package/src/runtime/checkpoint-hooks.ts +186 -0
  221. package/src/runtime/hook-file-hooks.test.ts +40 -1
  222. package/src/runtime/hook-file-hooks.ts +35 -16
  223. package/src/runtime/index.ts +4 -19
  224. package/src/runtime/rules.ts +4 -1
  225. package/src/runtime/runtime-builder.team-persistence.test.ts +3 -6
  226. package/src/runtime/runtime-builder.test.ts +266 -160
  227. package/src/runtime/runtime-builder.ts +120 -47
  228. package/src/runtime/runtime-parity.test.ts +22 -22
  229. package/src/runtime/session-runtime.ts +36 -6
  230. package/src/runtime/{sandbox/subprocess-sandbox.ts → subprocess-sandbox.ts} +24 -3
  231. package/src/runtime/team-runtime-registry.ts +1 -4
  232. package/src/runtime/tool-approval.ts +1 -1
  233. package/src/session/default-session-manager.e2e.test.ts +2 -2
  234. package/src/session/default-session-manager.test.ts +553 -9
  235. package/src/session/default-session-manager.ts +140 -46
  236. package/src/session/file-session-service.ts +3 -3
  237. package/src/session/index.ts +6 -6
  238. package/src/session/persistence-service.test.ts +212 -0
  239. package/src/session/{unified-session-persistence-service.ts → persistence-service.ts} +106 -172
  240. package/src/session/rpc-session-service.ts +3 -3
  241. package/src/session/runtime-oauth-token-manager.ts +1 -1
  242. package/src/session/session-agent-events.ts +1 -1
  243. package/src/session/session-artifacts.ts +32 -4
  244. package/src/session/session-config-builder.ts +22 -9
  245. package/src/session/session-graph.ts +1 -1
  246. package/src/session/session-host.ts +19 -11
  247. package/src/session/session-manager.ts +11 -6
  248. package/src/session/session-service.team-persistence.test.ts +1 -1
  249. package/src/session/session-service.ts +6 -9
  250. package/src/session/session-team-coordination.ts +7 -3
  251. package/src/session/session-telemetry.ts +1 -1
  252. package/src/session/utils/helpers.test.ts +160 -0
  253. package/src/session/utils/helpers.ts +289 -42
  254. package/src/session/utils/types.ts +47 -7
  255. package/src/session/workspace-manager.ts +5 -3
  256. package/src/session/workspace-manifest.ts +3 -49
  257. package/src/storage/file-team-store.ts +2 -5
  258. package/src/storage/provider-settings-legacy-migration.ts +2 -2
  259. package/src/storage/provider-settings-manager.test.ts +1 -1
  260. package/src/storage/sqlite-team-store.ts +212 -125
  261. package/src/storage/team-store.ts +1 -5
  262. package/src/team/delegated-agent.ts +131 -0
  263. package/src/team/index.ts +1 -0
  264. package/src/team/multi-agent.lifecycle.test.ts +201 -0
  265. package/src/team/multi-agent.ts +1666 -0
  266. package/src/team/projections.ts +2 -4
  267. package/src/team/runtime.ts +54 -0
  268. package/src/team/spawn-agent-tool.test.ts +387 -0
  269. package/src/team/spawn-agent-tool.ts +207 -0
  270. package/src/team/subagent-prompts.ts +41 -0
  271. package/src/team/team-tools.test.ts +802 -0
  272. package/src/team/team-tools.ts +792 -0
  273. package/src/telemetry/OpenTelemetryProvider.test.ts +25 -3
  274. package/src/telemetry/OpenTelemetryProvider.ts +108 -18
  275. package/src/telemetry/TelemetryLoggerSink.test.ts +42 -0
  276. package/src/telemetry/{LoggerTelemetryAdapter.ts → TelemetryLoggerSink.ts} +21 -14
  277. package/src/telemetry/TelemetryService.test.ts +7 -7
  278. package/src/telemetry/TelemetryService.ts +2 -4
  279. package/src/tools/definitions.test.ts +76 -0
  280. package/src/tools/definitions.ts +41 -2
  281. package/src/tools/executors/apply-patch.ts +1 -1
  282. package/src/tools/executors/editor.ts +1 -1
  283. package/src/tools/executors/file-read.ts +1 -1
  284. package/src/tools/executors/search.ts +1 -1
  285. package/src/tools/executors/web-fetch.ts +1 -1
  286. package/src/tools/index.ts +6 -1
  287. package/src/tools/model-tool-routing.ts +2 -0
  288. package/src/tools/presets.test.ts +8 -0
  289. package/src/tools/presets.ts +40 -2
  290. package/src/tools/schemas.ts +19 -0
  291. package/src/tools/types.ts +31 -2
  292. package/src/types/config.ts +61 -7
  293. package/src/types/events.ts +1 -1
  294. package/src/types/index.ts +0 -1
  295. package/src/types/provider-settings.ts +1 -1
  296. package/src/types/storage.ts +2 -5
  297. package/src/types.ts +32 -44
  298. package/dist/agents/agent-config-loader.d.ts.map +0 -1
  299. package/dist/agents/agent-config-parser.d.ts.map +0 -1
  300. package/dist/agents/hooks-config-loader.d.ts.map +0 -1
  301. package/dist/agents/index.d.ts.map +0 -1
  302. package/dist/agents/plugin-config-loader.d.ts.map +0 -1
  303. package/dist/agents/plugin-loader.d.ts.map +0 -1
  304. package/dist/agents/plugin-sandbox-bootstrap.js +0 -446
  305. package/dist/agents/plugin-sandbox.d.ts.map +0 -1
  306. package/dist/agents/unified-config-file-watcher.d.ts.map +0 -1
  307. package/dist/agents/user-instruction-config-loader.d.ts.map +0 -1
  308. package/dist/mcp/config-loader.d.ts.map +0 -1
  309. package/dist/mcp/index.d.ts +0 -5
  310. package/dist/mcp/index.d.ts.map +0 -1
  311. package/dist/mcp/manager.d.ts.map +0 -1
  312. package/dist/mcp/types.d.ts.map +0 -1
  313. package/dist/runtime/commands.d.ts.map +0 -1
  314. package/dist/runtime/sandbox/subprocess-sandbox.d.ts.map +0 -1
  315. package/dist/runtime/skills.d.ts +0 -14
  316. package/dist/runtime/skills.d.ts.map +0 -1
  317. package/dist/runtime/workflows.d.ts +0 -14
  318. package/dist/runtime/workflows.d.ts.map +0 -1
  319. package/dist/session/unified-session-persistence-service.d.ts.map +0 -1
  320. package/dist/telemetry/LoggerTelemetryAdapter.d.ts.map +0 -1
  321. package/dist/types/workspace.d.ts +0 -8
  322. package/dist/types/workspace.d.ts.map +0 -1
  323. package/src/agents/plugin-loader.ts +0 -175
  324. package/src/runtime/skills.ts +0 -44
  325. package/src/runtime/workflows.test.ts +0 -119
  326. package/src/runtime/workflows.ts +0 -45
  327. package/src/session/unified-session-persistence-service.test.ts +0 -85
  328. package/src/telemetry/LoggerTelemetryAdapter.test.ts +0 -42
  329. package/src/types/workspace.ts +0 -7
  330. /package/dist/{agents → extensions/config}/agent-config-loader.d.ts +0 -0
  331. /package/dist/{agents → extensions/config}/unified-config-file-watcher.d.ts +0 -0
  332. /package/dist/{agents → extensions/config}/user-instruction-config-loader.d.ts +0 -0
  333. /package/dist/{mcp → extensions/mcp}/config-loader.d.ts +0 -0
  334. /package/dist/runtime/{sandbox/subprocess-sandbox.d.ts → subprocess-sandbox.d.ts} +0 -0
  335. /package/src/{agents → extensions/config}/agent-config-loader.ts +0 -0
  336. /package/src/{agents → extensions/config}/hooks-config-loader.test.ts +0 -0
  337. /package/src/{agents → extensions/config}/unified-config-file-watcher.test.ts +0 -0
  338. /package/src/{mcp → extensions/mcp}/config-loader.test.ts +0 -0
  339. /package/src/{mcp → extensions/mcp}/config-loader.ts +0 -0
@@ -1,25 +1,32 @@
1
1
  import { existsSync, readdirSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import {
4
- AgentTeamsRuntime,
5
- bootstrapAgentTeams,
6
- createDelegatedAgentConfigProvider,
7
- type TeamEvent,
8
- type TeamTeammateSpec,
9
- type Tool,
10
- } from "@clinebot/agents";
3
+ import type { BasicLogger, TeamTeammateSpec, Tool } from "@clinebot/shared";
11
4
  import { resolveSkillsConfigSearchPaths } from "@clinebot/shared/storage";
12
5
  import { nanoid } from "nanoid";
13
6
  import {
14
7
  createUserInstructionConfigWatcher,
15
8
  type SkillConfig,
16
9
  type UserInstructionConfigWatcher,
17
- } from "../agents";
18
- import { buildWorkspaceMetadata } from "../session/workspace-manifest";
10
+ } from "../extensions/config";
11
+ import {
12
+ createDefaultMcpServerClientFactory,
13
+ createMcpTools,
14
+ hasMcpSettingsFile,
15
+ InMemoryMcpManager,
16
+ registerMcpServersFromSettingsFile,
17
+ resolveDefaultMcpSettingsPath,
18
+ } from "../extensions/mcp";
19
19
  import { createLocalTeamStore } from "../storage/team-store";
20
+ import {
21
+ AgentTeamsRuntime,
22
+ bootstrapAgentTeams,
23
+ createDelegatedAgentConfigProvider,
24
+ type TeamEvent,
25
+ } from "../team";
20
26
  import {
21
27
  createBuiltinTools,
22
28
  DEFAULT_MODEL_TOOL_ROUTING_RULES,
29
+ resolveToolPresetName,
23
30
  resolveToolRoutingConfig,
24
31
  type SkillsExecutor,
25
32
  type ToolExecutors,
@@ -41,8 +48,6 @@ type SkillsExecutorMetadataItem = {
41
48
  disabled: boolean;
42
49
  };
43
50
 
44
- const WORKSPACE_CONFIGURATION_MARKER = "# Workspace Configuration";
45
-
46
51
  type SkillsExecutorWithMetadata = SkillsExecutor & {
47
52
  configuredSkills?: SkillsExecutorMetadataItem[];
48
53
  };
@@ -55,13 +60,13 @@ function createBuiltinToolsList(
55
60
  cwd: string,
56
61
  providerId: string,
57
62
  mode: CoreAgentMode,
63
+ yolo: boolean | undefined,
58
64
  modelId: string,
59
65
  toolRoutingRules: ToolRoutingRule[] | undefined,
60
66
  skillsExecutor?: SkillsExecutorWithMetadata,
61
67
  executorOverrides?: Partial<ToolExecutors>,
62
68
  ): Tool[] {
63
- const preset =
64
- mode === "plan" ? ToolPresets.readonly : ToolPresets.development;
69
+ const preset = ToolPresets[resolveToolPresetName({ mode, yolo })];
65
70
  const toolRoutingConfig = resolveToolRoutingConfig(
66
71
  providerId,
67
72
  modelId,
@@ -186,6 +191,64 @@ function hasSkillsFiles(workspacePath: string): boolean {
186
191
  return false;
187
192
  }
188
193
 
194
+ async function loadConfiguredMcpTools(logger?: BasicLogger): Promise<{
195
+ tools: Tool[];
196
+ shutdown?: () => Promise<void>;
197
+ }> {
198
+ const settingsPath = resolveDefaultMcpSettingsPath();
199
+ if (!hasMcpSettingsFile({ filePath: settingsPath })) {
200
+ return { tools: [] };
201
+ }
202
+
203
+ const manager = new InMemoryMcpManager({
204
+ clientFactory: createDefaultMcpServerClientFactory(),
205
+ });
206
+
207
+ let registrations: Awaited<
208
+ ReturnType<typeof registerMcpServersFromSettingsFile>
209
+ >;
210
+ try {
211
+ registrations = await registerMcpServersFromSettingsFile(manager, {
212
+ filePath: settingsPath,
213
+ });
214
+ } catch (error) {
215
+ await manager.dispose().catch(() => {});
216
+ const message = error instanceof Error ? error.message : String(error);
217
+ logger?.log(
218
+ `[mcp] Failed to load MCP settings, skipping MCP tools: ${message}`,
219
+ );
220
+ return { tools: [] };
221
+ }
222
+
223
+ const enabled = registrations.filter((r) => r.disabled !== true);
224
+ const results = await Promise.allSettled(
225
+ enabled.map((r) =>
226
+ createMcpTools({ serverName: r.name, provider: manager }),
227
+ ),
228
+ );
229
+ const tools: Tool[] = [];
230
+ for (const [i, result] of results.entries()) {
231
+ if (result.status === "fulfilled") {
232
+ tools.push(...result.value);
233
+ } else {
234
+ const message =
235
+ result.reason instanceof Error
236
+ ? result.reason.message
237
+ : String(result.reason);
238
+ logger?.log(
239
+ `[mcp] Failed to load tools from MCP server "${enabled[i].name}", skipping: ${message}`,
240
+ );
241
+ }
242
+ }
243
+
244
+ return {
245
+ tools,
246
+ shutdown: async () => {
247
+ await manager.dispose();
248
+ },
249
+ };
250
+ }
251
+
189
252
  function resolveSkillRecord(
190
253
  watcher: UserInstructionConfigWatcher,
191
254
  requestedSkill: string,
@@ -314,17 +377,6 @@ function shutdownTeamRuntime(
314
377
  }
315
378
  }
316
379
 
317
- function extractWorkspaceMetadataFromSystemPrompt(
318
- systemPrompt: string,
319
- ): string | undefined {
320
- const markerIndex = systemPrompt.lastIndexOf(WORKSPACE_CONFIGURATION_MARKER);
321
- if (markerIndex < 0) {
322
- return undefined;
323
- }
324
- const metadata = systemPrompt.slice(markerIndex).trim();
325
- return metadata.length > 0 ? metadata : undefined;
326
- }
327
-
328
380
  function normalizeConfig(
329
381
  config: CoreSessionConfig,
330
382
  ): Required<
@@ -334,17 +386,28 @@ function normalizeConfig(
334
386
  | "enableTools"
335
387
  | "enableSpawnAgent"
336
388
  | "enableAgentTeams"
389
+ | "yolo"
337
390
  | "missionLogIntervalSteps"
338
391
  | "missionLogIntervalMs"
339
392
  | "sessionId"
340
393
  >
341
394
  > {
395
+ const preset =
396
+ ToolPresets[
397
+ resolveToolPresetName({
398
+ mode: config.mode,
399
+ yolo: config.yolo,
400
+ })
401
+ ];
342
402
  return {
343
403
  sessionId: config.sessionId || "",
344
404
  mode: config.mode === "plan" ? "plan" : "act",
345
405
  enableTools: config.enableTools !== false,
346
- enableSpawnAgent: config.enableSpawnAgent !== false,
347
- enableAgentTeams: config.enableAgentTeams !== false,
406
+ enableSpawnAgent:
407
+ config.enableSpawnAgent ?? preset.enableSpawnAgent ?? true,
408
+ enableAgentTeams:
409
+ config.enableAgentTeams ?? preset.enableAgentTeams ?? true,
410
+ yolo: config.yolo === true,
348
411
  missionLogIntervalSteps:
349
412
  typeof config.missionLogIntervalSteps === "number" &&
350
413
  Number.isFinite(config.missionLogIntervalSteps)
@@ -361,7 +424,7 @@ function normalizeConfig(
361
424
  export class DefaultRuntimeBuilder implements RuntimeBuilder {
362
425
  private readonly teamRuntimeRegistry = new TeamRuntimeRegistry();
363
426
 
364
- build(input: RuntimeBuilderInput): RuntimeEnvironment {
427
+ async build(input: RuntimeBuilderInput): Promise<RuntimeEnvironment> {
365
428
  const {
366
429
  config,
367
430
  hooks,
@@ -382,6 +445,7 @@ export class DefaultRuntimeBuilder implements RuntimeBuilder {
382
445
  let userInstructionWatcher = sharedUserInstructionWatcher;
383
446
  let watcherReady = Promise.resolve();
384
447
  let skillsExecutor: SkillsExecutorWithMetadata | undefined;
448
+ let mcpShutdown: (() => Promise<void>) | undefined;
385
449
 
386
450
  if (
387
451
  !userInstructionWatcher &&
@@ -416,12 +480,16 @@ export class DefaultRuntimeBuilder implements RuntimeBuilder {
416
480
  config.cwd,
417
481
  config.providerId,
418
482
  normalized.mode,
483
+ normalized.yolo,
419
484
  config.modelId,
420
485
  config.toolRoutingRules,
421
486
  skillsExecutor,
422
487
  defaultToolExecutors,
423
488
  ),
424
489
  );
490
+ const mcpRuntime = await loadConfiguredMcpTools(config.logger);
491
+ tools.push(...mcpRuntime.tools);
492
+ mcpShutdown = mcpRuntime.shutdown;
425
493
  }
426
494
 
427
495
  let teamRuntime: AgentTeamsRuntime | undefined;
@@ -435,6 +503,12 @@ export class DefaultRuntimeBuilder implements RuntimeBuilder {
435
503
  restoredTeammateSpecs.map((spec) => [spec.agentId, spec] as const),
436
504
  );
437
505
  const registryKey = config.sessionId || effectiveTeamName;
506
+ let leadAgentInstance:
507
+ | {
508
+ addTools: (tools: Tool[]) => void;
509
+ }
510
+ | undefined;
511
+ let pendingLeadTeamTools: Tool[] = [];
438
512
  const delegatedAgentConfigProvider = createDelegatedAgentConfigProvider({
439
513
  providerId: config.providerId,
440
514
  modelId: config.modelId,
@@ -445,29 +519,13 @@ export class DefaultRuntimeBuilder implements RuntimeBuilder {
445
519
  providerConfig: config.providerConfig,
446
520
  knownModels: config.knownModels,
447
521
  thinking: config.thinking,
448
- clineWorkspaceMetadata:
449
- config.providerId === "cline"
450
- ? extractWorkspaceMetadataFromSystemPrompt(config.systemPrompt)
451
- : undefined,
452
522
  maxIterations: config.maxIterations,
453
523
  hooks,
454
524
  extensions: extensions ?? config.extensions,
455
525
  logger: logger ?? config.logger,
456
526
  telemetry: input.telemetry ?? config.telemetry,
527
+ workspaceMetadata: config.workspaceMetadata,
457
528
  });
458
- const runtimeMetadata = delegatedAgentConfigProvider.getRuntimeConfig();
459
- if (
460
- config.providerId === "cline" &&
461
- !runtimeMetadata.clineWorkspaceMetadata
462
- ) {
463
- buildWorkspaceMetadata(config.cwd ?? "").then((metadata) => {
464
- const current = delegatedAgentConfigProvider.getRuntimeConfig();
465
- if (current.clineWorkspaceMetadata) {
466
- return;
467
- }
468
- Object.assign(current, { clineWorkspaceMetadata: metadata });
469
- });
470
- }
471
529
  this.teamRuntimeRegistry.getOrCreate(registryKey, () => ({
472
530
  delegatedAgentConfigProvider,
473
531
  }));
@@ -531,17 +589,25 @@ export class DefaultRuntimeBuilder implements RuntimeBuilder {
531
589
  }
532
590
  teamToolsRegistered = true;
533
591
 
534
- const teamBootstrap = bootstrapAgentTeams({
592
+ const factory = input.teamToolsFactory ?? bootstrapAgentTeams;
593
+ const teamBootstrap = factory({
535
594
  runtime: teamRuntime,
536
595
  leadAgentId: "lead",
537
596
  restoredFromPersistence: Boolean(restoredTeamState),
538
597
  restoredTeammates: restoredTeammateSpecs,
598
+ includeLeadSpawnTool: true,
599
+ includeLeadManagementTools: true,
600
+ onLeadToolsUnlocked: (teamTools) => {
601
+ pendingLeadTeamTools = teamTools;
602
+ leadAgentInstance?.addTools(teamTools);
603
+ },
539
604
  createBaseTools: normalized.enableTools
540
605
  ? () =>
541
606
  createBuiltinToolsList(
542
607
  config.cwd,
543
608
  config.providerId,
544
609
  normalized.mode,
610
+ normalized.yolo,
545
611
  config.modelId,
546
612
  config.toolRoutingRules,
547
613
  skillsExecutor,
@@ -618,9 +684,16 @@ export class DefaultRuntimeBuilder implements RuntimeBuilder {
618
684
  this.teamRuntimeRegistry.get(registryKey)
619
685
  ?.delegatedAgentConfigProvider ?? delegatedAgentConfigProvider,
620
686
  completionGuard,
621
- shutdown: (reason: string) => {
687
+ registerLeadAgent: (agent) => {
688
+ leadAgentInstance = agent;
689
+ if (pendingLeadTeamTools.length > 0) {
690
+ agent.addTools(pendingLeadTeamTools);
691
+ }
692
+ },
693
+ shutdown: async (reason: string) => {
622
694
  shutdownTeamRuntime(teamRuntime, reason);
623
695
  this.teamRuntimeRegistry.delete(registryKey);
696
+ await mcpShutdown?.();
624
697
  if (!watcherProvided) {
625
698
  userInstructionWatcher?.stop();
626
699
  }
@@ -1,7 +1,7 @@
1
1
  import { mkdtempSync } from "node:fs";
2
2
  import { tmpdir } from "node:os";
3
3
  import { join } from "node:path";
4
- import type { Tool } from "@clinebot/agents";
4
+ import type { Tool } from "@clinebot/shared";
5
5
  import { describe, expect, it } from "vitest";
6
6
  import { createBuiltinTools } from "../tools";
7
7
  import { DefaultRuntimeBuilder } from "./runtime-builder";
@@ -47,9 +47,12 @@ function legacyBuildRuntimeEnvironment(
47
47
 
48
48
  function normalizeParityToolNames(toolNames: string[]): string[] {
49
49
  // Skills are discovered from user/workspace config and can appear in tests
50
- // depending on the machine state. They are intentionally excluded from
51
- // strict legacy parity checks.
52
- return toolNames.filter((toolName) => toolName !== "skills");
50
+ // depending on the machine state. MCP tools may also be configured outside
51
+ // the test workspace. They are intentionally excluded from strict legacy
52
+ // parity checks.
53
+ return toolNames.filter(
54
+ (toolName) => toolName !== "skills" && !toolName.includes("__"),
55
+ );
53
56
  }
54
57
 
55
58
  function makeEmptyWorkspaceCwd(): string {
@@ -66,7 +69,7 @@ function makeSpawnTool(): Tool {
66
69
  }
67
70
 
68
71
  describe("runtime tool parity", () => {
69
- it("matches legacy tool list when tools+spawn are enabled", () => {
72
+ it("matches legacy tool list when tools+spawn are enabled", async () => {
70
73
  const config: LegacyConfig = {
71
74
  providerId: "anthropic",
72
75
  modelId: "claude-sonnet-4-6",
@@ -83,17 +86,16 @@ describe("runtime tool parity", () => {
83
86
  (tool) => tool.name,
84
87
  ),
85
88
  );
86
- const actual = new DefaultRuntimeBuilder()
87
- .build({
88
- config,
89
- createSpawnTool,
90
- })
91
- .tools.map((tool) => tool.name);
89
+ const runtime = await new DefaultRuntimeBuilder().build({
90
+ config,
91
+ createSpawnTool,
92
+ });
93
+ const actual = runtime.tools.map((tool) => tool.name);
92
94
 
93
95
  expect(normalizeParityToolNames(actual)).toEqual(expected);
94
96
  });
95
97
 
96
- it("matches legacy tool list when only spawn is enabled", () => {
98
+ it("matches legacy tool list when only spawn is enabled", async () => {
97
99
  const config: LegacyConfig = {
98
100
  providerId: "anthropic",
99
101
  modelId: "claude-sonnet-4-6",
@@ -110,17 +112,16 @@ describe("runtime tool parity", () => {
110
112
  (tool) => tool.name,
111
113
  ),
112
114
  );
113
- const actual = new DefaultRuntimeBuilder()
114
- .build({
115
- config,
116
- createSpawnTool,
117
- })
118
- .tools.map((tool) => tool.name);
115
+ const runtime = await new DefaultRuntimeBuilder().build({
116
+ config,
117
+ createSpawnTool,
118
+ });
119
+ const actual = runtime.tools.map((tool) => tool.name);
119
120
 
120
121
  expect(normalizeParityToolNames(actual)).toEqual(expected);
121
122
  });
122
123
 
123
- it("matches legacy tool list when tools+spawn are disabled", () => {
124
+ it("matches legacy tool list when tools+spawn are disabled", async () => {
124
125
  const config: LegacyConfig = {
125
126
  providerId: "anthropic",
126
127
  modelId: "claude-sonnet-4-6",
@@ -134,9 +135,8 @@ describe("runtime tool parity", () => {
134
135
  const expected = normalizeParityToolNames(
135
136
  legacyBuildRuntimeEnvironment(config).map((tool) => tool.name),
136
137
  );
137
- const actual = new DefaultRuntimeBuilder()
138
- .build({ config })
139
- .tools.map((tool) => tool.name);
138
+ const runtime = await new DefaultRuntimeBuilder().build({ config });
139
+ const actual = runtime.tools.map((tool) => tool.name);
140
140
 
141
141
  expect(normalizeParityToolNames(actual)).toEqual(expected);
142
142
  });
@@ -1,13 +1,19 @@
1
+ import type { Agent } from "@clinebot/agents";
1
2
  import type {
2
3
  AgentConfig,
3
4
  AgentHooks,
4
5
  AgentResult,
6
+ BasicLogger,
7
+ ITelemetryService,
8
+ TeamTeammateSpec,
9
+ Tool,
10
+ } from "@clinebot/shared";
11
+ import type { UserInstructionConfigWatcher } from "../extensions/config";
12
+ import type {
5
13
  AgentTeamsRuntime,
6
14
  DelegatedAgentConfigProvider,
7
- Tool,
8
- } from "@clinebot/agents";
9
- import type { BasicLogger, ITelemetryService } from "@clinebot/shared";
10
- import type { UserInstructionConfigWatcher } from "../agents";
15
+ TeamEvent,
16
+ } from "../team";
11
17
  import type { ToolExecutors } from "../tools";
12
18
  import type { CoreSessionConfig } from "../types/config";
13
19
 
@@ -20,24 +26,48 @@ export interface BuiltRuntime {
20
26
  teamRestoredFromPersistence?: boolean;
21
27
  delegatedAgentConfigProvider?: DelegatedAgentConfigProvider;
22
28
  completionGuard?: () => string | undefined;
29
+ registerLeadAgent?: (agent: Agent) => void;
23
30
  shutdown: (reason: string) => Promise<void> | void;
24
31
  }
25
32
 
33
+ export interface TeamToolsFactoryOptions {
34
+ runtime: AgentTeamsRuntime;
35
+ teammateConfigProvider: DelegatedAgentConfigProvider;
36
+ createBaseTools?: () => Tool[];
37
+ leadAgentId?: string;
38
+ restoredTeammates?: TeamTeammateSpec[];
39
+ restoredFromPersistence?: boolean;
40
+ includeLeadSpawnTool?: boolean;
41
+ includeLeadManagementTools?: boolean;
42
+ onLeadToolsUnlocked?: (tools: Tool[]) => void;
43
+ }
44
+
45
+ export interface TeamToolsFactoryResult {
46
+ tools: Tool[];
47
+ restoredFromPersistence: boolean;
48
+ restoredTeammates: string[];
49
+ }
50
+
51
+ export type TeamToolsFactory = (
52
+ options: TeamToolsFactoryOptions,
53
+ ) => TeamToolsFactoryResult;
54
+
26
55
  export interface RuntimeBuilderInput {
27
56
  config: CoreSessionConfig;
28
57
  hooks?: AgentHooks;
29
58
  extensions?: AgentConfig["extensions"];
30
- onTeamEvent?: (event: import("@clinebot/agents").TeamEvent) => void;
59
+ onTeamEvent?: (event: TeamEvent) => void;
31
60
  createSpawnTool?: () => Tool;
32
61
  onTeamRestored?: () => void;
33
62
  userInstructionWatcher?: UserInstructionConfigWatcher;
34
63
  defaultToolExecutors?: Partial<ToolExecutors>;
35
64
  logger?: BasicLogger;
36
65
  telemetry?: ITelemetryService;
66
+ teamToolsFactory?: TeamToolsFactory;
37
67
  }
38
68
 
39
69
  export interface RuntimeBuilder {
40
- build(input: RuntimeBuilderInput): BuiltRuntime;
70
+ build(input: RuntimeBuilderInput): Promise<BuiltRuntime> | BuiltRuntime;
41
71
  }
42
72
 
43
73
  export interface SessionRuntime {
@@ -1,4 +1,8 @@
1
1
  import { type ChildProcess, spawn } from "node:child_process";
2
+ import {
3
+ augmentNodeCommandForDebug,
4
+ withResolvedClineBuildEnv,
5
+ } from "@clinebot/shared";
2
6
 
3
7
  interface SandboxCallMessage {
4
8
  type: "call";
@@ -66,10 +70,26 @@ export class SubprocessSandbox {
66
70
  ? [this.options.bootstrapFile]
67
71
  : ["-e", this.options.bootstrapScript ?? ""];
68
72
 
69
- const child = spawn(process.execPath, args, {
70
- stdio: ["ignore", "ignore", "ignore", "ipc"],
73
+ const command = augmentNodeCommandForDebug([process.execPath, ...args], {
74
+ debugRole:
75
+ this.options.name === "plugin-sandbox" ? "plugin-sandbox" : "sandbox",
76
+ });
77
+ const child = spawn(command[0] ?? process.execPath, command.slice(1), {
78
+ stdio: ["ignore", "ignore", "pipe", "ipc"],
79
+ env: withResolvedClineBuildEnv(process.env),
71
80
  });
72
81
  this.process = child;
82
+ let stderrBuffer = "";
83
+ const appendStderr = (chunk: string) => {
84
+ const next = stderrBuffer + chunk;
85
+ // Keep only a small tail so errors include useful context
86
+ // without unbounded memory growth.
87
+ stderrBuffer = next.length > 4000 ? next.slice(-4000) : next;
88
+ };
89
+ child.stderr?.setEncoding("utf8");
90
+ child.stderr?.on("data", (chunk: string) => {
91
+ appendStderr(chunk);
92
+ });
73
93
  child.on("message", (message) => {
74
94
  this.onMessage(message as SandboxResponseMessage | SandboxEventMessage);
75
95
  });
@@ -82,9 +102,10 @@ export class SubprocessSandbox {
82
102
  });
83
103
  child.on("exit", (code, signal) => {
84
104
  this.process = null;
105
+ const stderrDetail = stderrBuffer.trim();
85
106
  this.failPending(
86
107
  new Error(
87
- `${this.options.name ?? "sandbox"} process exited (code=${String(code)}, signal=${String(signal)})`,
108
+ `${this.options.name ?? "sandbox"} process exited (code=${String(code)}, signal=${String(signal)})${stderrDetail ? `: ${stderrDetail}` : ""}`,
88
109
  ),
89
110
  );
90
111
  });
@@ -1,7 +1,4 @@
1
- import type {
2
- AgentTeamsRuntime,
3
- DelegatedAgentConfigProvider,
4
- } from "@clinebot/agents";
1
+ import type { AgentTeamsRuntime, DelegatedAgentConfigProvider } from "../team";
5
2
 
6
3
  export interface TeamRuntimeRegistryEntry {
7
4
  runtime?: AgentTeamsRuntime;
@@ -1,6 +1,6 @@
1
1
  import { mkdir, readFile, unlink, writeFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
- import type { ToolApprovalRequest, ToolApprovalResult } from "@clinebot/agents";
3
+ import type { ToolApprovalRequest, ToolApprovalResult } from "@clinebot/shared";
4
4
 
5
5
  export type DesktopToolApprovalOptions = {
6
6
  approvalDir?: string;
@@ -9,8 +9,8 @@ import {
9
9
  } from "node:fs";
10
10
  import { tmpdir } from "node:os";
11
11
  import { join } from "node:path";
12
- import type { AgentResult } from "@clinebot/agents";
13
- import type * as LlmsProviders from "@clinebot/llms/providers";
12
+ import type * as LlmsProviders from "@clinebot/llms";
13
+ import type { AgentResult } from "@clinebot/shared";
14
14
  import { setClineDir, setHomeDir } from "@clinebot/shared/storage";
15
15
  import { nanoid } from "nanoid";
16
16
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";