@clinebot/core 0.0.34 → 0.0.36

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 (546) hide show
  1. package/README.md +13 -10
  2. package/dist/ClineCore.d.ts +96 -63
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/account/index.d.ts +1 -1
  5. package/dist/account/index.d.ts.map +1 -1
  6. package/dist/account/rpc.d.ts +6 -6
  7. package/dist/account/rpc.d.ts.map +1 -1
  8. package/dist/cron/index.d.ts +6 -0
  9. package/dist/cron/index.d.ts.map +1 -0
  10. package/dist/cron/resource-limiter.d.ts +9 -0
  11. package/dist/cron/resource-limiter.d.ts.map +1 -0
  12. package/dist/cron/schedule-command-service.d.ts +10 -0
  13. package/dist/cron/schedule-command-service.d.ts.map +1 -0
  14. package/dist/cron/schedule-service.d.ts +100 -0
  15. package/dist/cron/schedule-service.d.ts.map +1 -0
  16. package/dist/cron/scheduler.d.ts +66 -0
  17. package/dist/cron/scheduler.d.ts.map +1 -0
  18. package/dist/cron/sqlite-schedule-store.d.ts +52 -0
  19. package/dist/cron/sqlite-schedule-store.d.ts.map +1 -0
  20. package/dist/extensions/config/agent-config-loader.d.ts +6 -5
  21. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  22. package/dist/extensions/config/agent-config-parser.d.ts +1 -1
  23. package/dist/extensions/config/agent-config-parser.d.ts.map +1 -1
  24. package/dist/extensions/config/hooks-config-loader.d.ts +2 -2
  25. package/dist/extensions/config/hooks-config-loader.d.ts.map +1 -1
  26. package/dist/extensions/config/index.d.ts +3 -3
  27. package/dist/extensions/config/index.d.ts.map +1 -1
  28. package/dist/extensions/config/runtime-commands.d.ts +1 -0
  29. package/dist/extensions/config/runtime-commands.d.ts.map +1 -1
  30. package/dist/extensions/config/user-instruction-config-loader.d.ts +3 -2
  31. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  32. package/dist/extensions/context/agentic-compaction.d.ts +2 -2
  33. package/dist/extensions/context/agentic-compaction.d.ts.map +1 -1
  34. package/dist/extensions/context/compaction-shared.d.ts +5 -4
  35. package/dist/extensions/context/compaction-shared.d.ts.map +1 -1
  36. package/dist/extensions/context/compaction.d.ts.map +1 -1
  37. package/dist/extensions/plugin/plugin-config-loader.d.ts +9 -2
  38. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  39. package/dist/extensions/plugin/plugin-loader.d.ts +5 -3
  40. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  41. package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -1
  42. package/dist/extensions/plugin/plugin-sandbox.d.ts +15 -2
  43. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  44. package/dist/extensions/plugin/plugin-targeting.d.ts +7 -0
  45. package/dist/extensions/plugin/plugin-targeting.d.ts.map +1 -0
  46. package/dist/extensions/plugin-sandbox-bootstrap.js +253 -253
  47. package/dist/extensions/tools/constants.d.ts.map +1 -0
  48. package/dist/{tools → extensions/tools}/definitions.d.ts +1 -1
  49. package/dist/extensions/tools/definitions.d.ts.map +1 -0
  50. package/dist/extensions/tools/executors/apply-patch-parser.d.ts.map +1 -0
  51. package/dist/{tools → extensions/tools}/executors/apply-patch.d.ts +3 -1
  52. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -0
  53. package/dist/extensions/tools/executors/bash.d.ts.map +1 -0
  54. package/dist/extensions/tools/executors/editor.d.ts.map +1 -0
  55. package/dist/extensions/tools/executors/file-read.d.ts.map +1 -0
  56. package/dist/extensions/tools/executors/index.d.ts.map +1 -0
  57. package/dist/{tools → extensions/tools}/executors/search.d.ts +1 -1
  58. package/dist/extensions/tools/executors/search.d.ts.map +1 -0
  59. package/dist/extensions/tools/executors/web-fetch.d.ts.map +1 -0
  60. package/dist/extensions/tools/helpers.d.ts.map +1 -0
  61. package/dist/{tools → extensions/tools}/index.d.ts +2 -0
  62. package/dist/extensions/tools/index.d.ts.map +1 -0
  63. package/dist/{tools → extensions/tools}/model-tool-routing.d.ts +1 -1
  64. package/dist/extensions/tools/model-tool-routing.d.ts.map +1 -0
  65. package/dist/{tools → extensions/tools}/presets.d.ts +26 -44
  66. package/dist/extensions/tools/presets.d.ts.map +1 -0
  67. package/dist/extensions/tools/runtime.d.ts +25 -0
  68. package/dist/extensions/tools/runtime.d.ts.map +1 -0
  69. package/dist/extensions/tools/schemas.d.ts.map +1 -0
  70. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -0
  71. package/dist/extensions/tools/team/index.d.ts.map +1 -0
  72. package/dist/{team → extensions/tools/team}/multi-agent.d.ts +1 -3
  73. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -0
  74. package/dist/extensions/tools/team/projections.d.ts.map +1 -0
  75. package/dist/extensions/tools/team/runtime.d.ts.map +1 -0
  76. package/dist/{team → extensions/tools/team}/spawn-agent-tool.d.ts +0 -1
  77. package/dist/extensions/tools/team/spawn-agent-tool.d.ts.map +1 -0
  78. package/dist/extensions/tools/team/subagent-prompts.d.ts.map +1 -0
  79. package/dist/{team → extensions/tools/team}/team-tools.d.ts +1 -0
  80. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -0
  81. package/dist/{tools → extensions/tools}/types.d.ts +4 -3
  82. package/dist/extensions/tools/types.d.ts.map +1 -0
  83. package/dist/{runtime → hooks}/checkpoint-hooks.d.ts +7 -0
  84. package/dist/hooks/checkpoint-hooks.d.ts.map +1 -0
  85. package/dist/{runtime → hooks}/hook-file-hooks.d.ts +4 -3
  86. package/dist/hooks/hook-file-hooks.d.ts.map +1 -0
  87. package/dist/hooks/index.d.ts +0 -1
  88. package/dist/hooks/index.d.ts.map +1 -1
  89. package/dist/hooks/subprocess.d.ts +10 -130
  90. package/dist/hooks/subprocess.d.ts.map +1 -1
  91. package/dist/hub/browser-websocket.d.ts +18 -0
  92. package/dist/hub/browser-websocket.d.ts.map +1 -0
  93. package/dist/hub/client.d.ts +45 -0
  94. package/dist/hub/client.d.ts.map +1 -0
  95. package/dist/hub/connect.d.ts +15 -0
  96. package/dist/hub/connect.d.ts.map +1 -0
  97. package/dist/hub/daemon-entry.d.ts +2 -0
  98. package/dist/hub/daemon-entry.d.ts.map +1 -0
  99. package/dist/hub/daemon-entry.js +1045 -0
  100. package/dist/hub/daemon.d.ts +5 -0
  101. package/dist/hub/daemon.d.ts.map +1 -0
  102. package/dist/hub/defaults.d.ts +13 -0
  103. package/dist/hub/defaults.d.ts.map +1 -0
  104. package/dist/hub/discovery.d.ts +29 -0
  105. package/dist/hub/discovery.d.ts.map +1 -0
  106. package/dist/hub/index.d.ts +15 -0
  107. package/dist/hub/index.d.ts.map +1 -0
  108. package/dist/hub/index.js +1044 -0
  109. package/dist/hub/native-transport.d.ts +17 -0
  110. package/dist/hub/native-transport.d.ts.map +1 -0
  111. package/dist/hub/runtime-handlers.d.ts +11 -0
  112. package/dist/hub/runtime-handlers.d.ts.map +1 -0
  113. package/dist/hub/server.d.ts +86 -0
  114. package/dist/hub/server.d.ts.map +1 -0
  115. package/dist/hub/session-client.d.ts +87 -0
  116. package/dist/hub/session-client.d.ts.map +1 -0
  117. package/dist/hub/start-shared-server.d.ts +19 -0
  118. package/dist/hub/start-shared-server.d.ts.map +1 -0
  119. package/dist/hub/transport.d.ts +8 -0
  120. package/dist/hub/transport.d.ts.map +1 -0
  121. package/dist/hub/ui-client.d.ts +44 -0
  122. package/dist/hub/ui-client.d.ts.map +1 -0
  123. package/dist/hub/workspace.d.ts +4 -0
  124. package/dist/hub/workspace.d.ts.map +1 -0
  125. package/dist/index.d.ts +52 -39
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +557 -533
  128. package/dist/llms/configured-provider-registry.d.ts +28 -0
  129. package/dist/llms/configured-provider-registry.d.ts.map +1 -0
  130. package/dist/llms/provider-defaults.d.ts +27 -0
  131. package/dist/llms/provider-defaults.d.ts.map +1 -0
  132. package/dist/llms/provider-settings.d.ts +202 -0
  133. package/dist/llms/provider-settings.d.ts.map +1 -0
  134. package/dist/llms/runtime-config.d.ts +4 -0
  135. package/dist/llms/runtime-config.d.ts.map +1 -0
  136. package/dist/llms/runtime-registry.d.ts +20 -0
  137. package/dist/llms/runtime-registry.d.ts.map +1 -0
  138. package/dist/llms/runtime-types.d.ts +85 -0
  139. package/dist/llms/runtime-types.d.ts.map +1 -0
  140. package/dist/runtime/history.d.ts +4 -0
  141. package/dist/runtime/history.d.ts.map +1 -0
  142. package/dist/runtime/host.d.ts +8 -0
  143. package/dist/runtime/host.d.ts.map +1 -0
  144. package/dist/runtime/rules.d.ts +1 -0
  145. package/dist/runtime/rules.d.ts.map +1 -1
  146. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  147. package/dist/runtime/runtime-host.d.ts +103 -0
  148. package/dist/runtime/runtime-host.d.ts.map +1 -0
  149. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts +1 -1
  150. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts.map +1 -1
  151. package/dist/runtime/session-runtime.d.ts +3 -21
  152. package/dist/runtime/session-runtime.d.ts.map +1 -1
  153. package/dist/{session/session-agent-events.d.ts → services/agent-events.d.ts} +4 -4
  154. package/dist/services/agent-events.d.ts.map +1 -0
  155. package/dist/services/config.d.ts +3 -0
  156. package/dist/services/config.d.ts.map +1 -0
  157. package/dist/services/global-settings.d.ts +12 -0
  158. package/dist/services/global-settings.d.ts.map +1 -0
  159. package/dist/services/local-runtime-bootstrap.d.ts +47 -0
  160. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -0
  161. package/dist/services/plugin-tools.d.ts +16 -0
  162. package/dist/services/plugin-tools.d.ts.map +1 -0
  163. package/dist/{providers → services/providers}/local-provider-registry.d.ts +4 -4
  164. package/dist/services/providers/local-provider-registry.d.ts.map +1 -0
  165. package/dist/{providers → services/providers}/local-provider-service.d.ts +13 -13
  166. package/dist/services/providers/local-provider-service.d.ts.map +1 -0
  167. package/dist/{session → services}/session-artifacts.d.ts +0 -4
  168. package/dist/services/session-artifacts.d.ts.map +1 -0
  169. package/dist/{session/utils/helpers.d.ts → services/session-data.d.ts} +19 -27
  170. package/dist/services/session-data.d.ts.map +1 -0
  171. package/dist/{session → services}/session-telemetry.d.ts +2 -2
  172. package/dist/services/session-telemetry.d.ts.map +1 -0
  173. package/dist/{storage → services/storage}/file-team-store.d.ts +2 -2
  174. package/dist/services/storage/file-team-store.d.ts.map +1 -0
  175. package/dist/{storage → services/storage}/provider-settings-legacy-migration.d.ts +1 -1
  176. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -0
  177. package/dist/{storage → services/storage}/provider-settings-manager.d.ts +1 -1
  178. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -0
  179. package/dist/{storage → services/storage}/sqlite-session-store.d.ts +3 -3
  180. package/dist/services/storage/sqlite-session-store.d.ts.map +1 -0
  181. package/dist/{storage → services/storage}/sqlite-team-store.d.ts +2 -2
  182. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -0
  183. package/dist/{storage → services/storage}/team-store.d.ts +1 -1
  184. package/dist/services/storage/team-store.d.ts.map +1 -0
  185. package/dist/services/telemetry/ITelemetryAdapter.d.ts.map +1 -0
  186. package/dist/services/telemetry/OpenTelemetryAdapter.d.ts.map +1 -0
  187. package/dist/services/telemetry/OpenTelemetryProvider.d.ts.map +1 -0
  188. package/dist/services/telemetry/TelemetryLoggerSink.d.ts.map +1 -0
  189. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -0
  190. package/dist/services/telemetry/core-events.d.ts.map +1 -0
  191. package/dist/services/telemetry/distinct-id.d.ts.map +1 -0
  192. package/dist/services/telemetry/index.d.ts.map +1 -0
  193. package/dist/services/telemetry/index.js +28 -0
  194. package/dist/{session/utils → services}/usage.d.ts +1 -1
  195. package/dist/services/usage.d.ts.map +1 -0
  196. package/dist/services/workspace/file-indexer.d.ts.map +1 -0
  197. package/dist/services/workspace/index.d.ts.map +1 -0
  198. package/dist/services/workspace/mention-enricher.d.ts.map +1 -0
  199. package/dist/services/workspace-manifest.d.ts +16 -0
  200. package/dist/services/workspace-manifest.d.ts.map +1 -0
  201. package/dist/session/file-session-service.d.ts +4 -1
  202. package/dist/session/file-session-service.d.ts.map +1 -1
  203. package/dist/session/persistence-service.d.ts +15 -25
  204. package/dist/session/persistence-service.d.ts.map +1 -1
  205. package/dist/session/session-manifest-store.d.ts +22 -0
  206. package/dist/session/session-manifest-store.d.ts.map +1 -0
  207. package/dist/session/session-row.d.ts +93 -0
  208. package/dist/session/session-row.d.ts.map +1 -0
  209. package/dist/session/session-service.d.ts +8 -109
  210. package/dist/session/session-service.d.ts.map +1 -1
  211. package/dist/session/session-team-coordination.d.ts +4 -4
  212. package/dist/session/session-team-coordination.d.ts.map +1 -1
  213. package/dist/session/subagent-session-manager.d.ts +36 -0
  214. package/dist/session/subagent-session-manager.d.ts.map +1 -0
  215. package/dist/session/team-persistence-store.d.ts +24 -0
  216. package/dist/session/team-persistence-store.d.ts.map +1 -0
  217. package/dist/transports/hub.d.ts +47 -0
  218. package/dist/transports/hub.d.ts.map +1 -0
  219. package/dist/{session/default-session-manager.d.ts → transports/local.d.ts} +30 -16
  220. package/dist/transports/local.d.ts.map +1 -0
  221. package/dist/transports/remote.d.ts +10 -0
  222. package/dist/transports/remote.d.ts.map +1 -0
  223. package/dist/transports/runtime-host-support.d.ts +22 -0
  224. package/dist/transports/runtime-host-support.d.ts.map +1 -0
  225. package/dist/{chat → types}/chat-schema.d.ts +10 -12
  226. package/dist/types/chat-schema.d.ts.map +1 -0
  227. package/dist/types/config.d.ts +10 -9
  228. package/dist/types/config.d.ts.map +1 -1
  229. package/dist/types/provider-settings.d.ts +4 -5
  230. package/dist/types/provider-settings.d.ts.map +1 -1
  231. package/dist/{session/utils/types.d.ts → types/session.d.ts} +16 -6
  232. package/dist/types/session.d.ts.map +1 -0
  233. package/dist/types/sessions.d.ts +19 -0
  234. package/dist/types/sessions.d.ts.map +1 -1
  235. package/dist/types/storage.d.ts +1 -3
  236. package/dist/types/storage.d.ts.map +1 -1
  237. package/dist/types.d.ts +14 -6
  238. package/dist/types.d.ts.map +1 -1
  239. package/package.json +22 -13
  240. package/src/ClineCore.ts +183 -85
  241. package/src/account/index.ts +3 -3
  242. package/src/account/rpc.ts +12 -12
  243. package/src/auth/cline.ts +1 -1
  244. package/src/auth/codex.ts +1 -1
  245. package/src/auth/oca.ts +1 -1
  246. package/src/cron/index.ts +5 -0
  247. package/src/cron/resource-limiter.ts +46 -0
  248. package/src/cron/schedule-command-service.ts +193 -0
  249. package/src/cron/schedule-service.ts +703 -0
  250. package/src/cron/scheduler.ts +637 -0
  251. package/src/cron/sqlite-schedule-store.ts +708 -0
  252. package/src/extensions/config/agent-config-loader.ts +18 -12
  253. package/src/extensions/config/agent-config-parser.ts +1 -1
  254. package/src/extensions/config/hooks-config-loader.ts +1 -2
  255. package/src/extensions/config/index.ts +0 -4
  256. package/src/extensions/config/runtime-commands.ts +6 -0
  257. package/src/extensions/config/user-instruction-config-loader.ts +1 -4
  258. package/src/extensions/context/agentic-compaction.ts +3 -3
  259. package/src/extensions/context/basic-compaction.ts +2 -2
  260. package/src/extensions/context/compaction-shared.ts +5 -4
  261. package/src/extensions/context/compaction.ts +3 -3
  262. package/src/extensions/plugin/plugin-config-loader.ts +17 -2
  263. package/src/extensions/plugin/plugin-loader.ts +48 -4
  264. package/src/extensions/plugin/plugin-module-import.ts +0 -2
  265. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +93 -39
  266. package/src/extensions/plugin/plugin-sandbox.ts +47 -27
  267. package/src/extensions/plugin/plugin-targeting.ts +32 -0
  268. package/src/{tools → extensions/tools}/definitions.ts +31 -50
  269. package/src/{tools → extensions/tools}/executors/apply-patch.ts +69 -80
  270. package/src/{tools → extensions/tools}/executors/file-read.ts +29 -4
  271. package/src/{tools → extensions/tools}/executors/search.ts +196 -4
  272. package/src/{tools → extensions/tools}/index.ts +10 -0
  273. package/src/{tools → extensions/tools}/model-tool-routing.ts +1 -1
  274. package/src/{tools → extensions/tools}/presets.ts +31 -47
  275. package/src/extensions/tools/runtime.ts +261 -0
  276. package/src/{tools → extensions/tools}/schemas.ts +4 -2
  277. package/src/{team → extensions/tools/team}/multi-agent.ts +80 -17
  278. package/src/{team → extensions/tools/team}/spawn-agent-tool.ts +1 -7
  279. package/src/{team → extensions/tools/team}/subagent-prompts.ts +2 -2
  280. package/src/{team → extensions/tools/team}/team-tools.ts +84 -53
  281. package/src/{tools → extensions/tools}/types.ts +5 -3
  282. package/src/{runtime → hooks}/checkpoint-hooks.ts +27 -0
  283. package/src/{runtime → hooks}/hook-file-hooks.ts +14 -13
  284. package/src/hooks/index.ts +0 -7
  285. package/src/hooks/subprocess-runner.ts +1 -1
  286. package/src/hooks/subprocess.ts +57 -257
  287. package/src/hub/browser-websocket.ts +137 -0
  288. package/src/hub/client.ts +574 -0
  289. package/src/hub/connect.ts +156 -0
  290. package/src/hub/daemon-entry.ts +87 -0
  291. package/src/hub/daemon.ts +181 -0
  292. package/src/hub/defaults.ts +43 -0
  293. package/src/hub/discovery.ts +247 -0
  294. package/src/hub/index.ts +14 -0
  295. package/src/hub/native-transport.ts +31 -0
  296. package/src/hub/runtime-handlers.ts +140 -0
  297. package/src/hub/server.ts +1888 -0
  298. package/src/hub/session-client.ts +460 -0
  299. package/src/hub/start-shared-server.ts +58 -0
  300. package/src/hub/transport.ts +14 -0
  301. package/src/hub/ui-client.ts +122 -0
  302. package/src/hub/workspace.ts +19 -0
  303. package/src/index.ts +264 -199
  304. package/src/llms/configured-provider-registry.ts +193 -0
  305. package/src/llms/provider-defaults.ts +637 -0
  306. package/src/llms/provider-settings.ts +263 -0
  307. package/src/llms/runtime-config.ts +43 -0
  308. package/src/llms/runtime-registry.ts +171 -0
  309. package/src/llms/runtime-types.ts +121 -0
  310. package/src/runtime/history.ts +237 -0
  311. package/src/runtime/host.ts +200 -0
  312. package/src/runtime/index.ts +1 -0
  313. package/src/runtime/rules.ts +12 -0
  314. package/src/runtime/runtime-builder.ts +37 -29
  315. package/src/runtime/runtime-host.ts +206 -0
  316. package/src/{session → runtime}/runtime-oauth-token-manager.ts +12 -16
  317. package/src/runtime/session-runtime.ts +2 -26
  318. package/src/{session/session-agent-events.ts → services/agent-events.ts} +7 -7
  319. package/src/services/config.ts +5 -0
  320. package/src/services/global-settings.ts +122 -0
  321. package/src/services/local-runtime-bootstrap.ts +318 -0
  322. package/src/services/plugin-tools.ts +85 -0
  323. package/src/{providers → services/providers}/local-provider-registry.ts +6 -6
  324. package/src/{providers → services/providers}/local-provider-service.ts +46 -41
  325. package/src/{session → services}/session-artifacts.ts +7 -19
  326. package/src/{session/utils/helpers.ts → services/session-data.ts} +90 -80
  327. package/src/{session → services}/session-telemetry.ts +7 -9
  328. package/src/services/storage/artifact-store.ts +1 -0
  329. package/src/{storage → services/storage}/file-team-store.ts +2 -2
  330. package/src/{storage → services/storage}/provider-settings-legacy-migration.ts +6 -4
  331. package/src/{storage → services/storage}/provider-settings-manager.ts +3 -3
  332. package/src/services/storage/session-store.ts +1 -0
  333. package/src/{storage → services/storage}/sqlite-session-store.ts +7 -12
  334. package/src/{storage → services/storage}/sqlite-team-store.ts +4 -4
  335. package/src/{storage → services/storage}/team-store.ts +1 -1
  336. package/src/{session/utils → services}/usage.ts +1 -1
  337. package/src/{input → services/workspace}/file-indexer.ts +26 -2
  338. package/src/{input → services/workspace}/mention-enricher.ts +1 -1
  339. package/src/{session → services}/workspace-manifest.ts +18 -0
  340. package/src/session/file-session-service.ts +10 -8
  341. package/src/session/index.ts +10 -23
  342. package/src/session/persistence-service.ts +144 -528
  343. package/src/session/session-manifest-store.ts +158 -0
  344. package/src/session/session-row.ts +199 -0
  345. package/src/session/session-service.ts +43 -389
  346. package/src/session/session-team-coordination.ts +14 -7
  347. package/src/session/subagent-session-manager.ts +397 -0
  348. package/src/session/team-persistence-store.ts +176 -0
  349. package/src/session/workspace-manager.ts +1 -1
  350. package/src/transports/hub.ts +656 -0
  351. package/src/{session/default-session-manager.ts → transports/local.ts} +263 -200
  352. package/src/transports/remote.ts +26 -0
  353. package/src/transports/runtime-host-support.ts +140 -0
  354. package/src/{chat → types}/chat-schema.ts +4 -5
  355. package/src/types/config.ts +10 -9
  356. package/src/types/provider-settings.ts +11 -7
  357. package/src/{session/utils/types.ts → types/session.ts} +16 -5
  358. package/src/types/sessions.ts +21 -0
  359. package/src/types/storage.ts +1 -6
  360. package/src/types.ts +52 -19
  361. package/dist/chat/chat-schema.d.ts.map +0 -1
  362. package/dist/hooks/persistent.d.ts +0 -64
  363. package/dist/hooks/persistent.d.ts.map +0 -1
  364. package/dist/input/file-indexer.d.ts.map +0 -1
  365. package/dist/input/index.d.ts.map +0 -1
  366. package/dist/input/mention-enricher.d.ts.map +0 -1
  367. package/dist/prompt/default-system.d.ts +0 -2
  368. package/dist/prompt/default-system.d.ts.map +0 -1
  369. package/dist/providers/local-provider-registry.d.ts.map +0 -1
  370. package/dist/providers/local-provider-service.d.ts.map +0 -1
  371. package/dist/runtime/checkpoint-hooks.d.ts.map +0 -1
  372. package/dist/runtime/hook-file-hooks.d.ts.map +0 -1
  373. package/dist/session/default-session-manager.d.ts.map +0 -1
  374. package/dist/session/rpc-runtime-ensure.d.ts +0 -53
  375. package/dist/session/rpc-runtime-ensure.d.ts.map +0 -1
  376. package/dist/session/rpc-session-service.d.ts +0 -13
  377. package/dist/session/rpc-session-service.d.ts.map +0 -1
  378. package/dist/session/rpc-spawn-lease.d.ts +0 -8
  379. package/dist/session/rpc-spawn-lease.d.ts.map +0 -1
  380. package/dist/session/session-agent-events.d.ts.map +0 -1
  381. package/dist/session/session-artifacts.d.ts.map +0 -1
  382. package/dist/session/session-config-builder.d.ts +0 -16
  383. package/dist/session/session-config-builder.d.ts.map +0 -1
  384. package/dist/session/session-host.d.ts +0 -15
  385. package/dist/session/session-host.d.ts.map +0 -1
  386. package/dist/session/session-manager.d.ts +0 -62
  387. package/dist/session/session-manager.d.ts.map +0 -1
  388. package/dist/session/session-telemetry.d.ts.map +0 -1
  389. package/dist/session/sqlite-rpc-session-backend.d.ts +0 -31
  390. package/dist/session/sqlite-rpc-session-backend.d.ts.map +0 -1
  391. package/dist/session/utils/helpers.d.ts.map +0 -1
  392. package/dist/session/utils/types.d.ts.map +0 -1
  393. package/dist/session/utils/usage.d.ts.map +0 -1
  394. package/dist/session/workspace-manifest.d.ts +0 -5
  395. package/dist/session/workspace-manifest.d.ts.map +0 -1
  396. package/dist/storage/file-team-store.d.ts.map +0 -1
  397. package/dist/storage/provider-settings-legacy-migration.d.ts.map +0 -1
  398. package/dist/storage/provider-settings-manager.d.ts.map +0 -1
  399. package/dist/storage/sqlite-session-store.d.ts.map +0 -1
  400. package/dist/storage/sqlite-team-store.d.ts.map +0 -1
  401. package/dist/storage/team-store.d.ts.map +0 -1
  402. package/dist/team/delegated-agent.d.ts.map +0 -1
  403. package/dist/team/index.d.ts.map +0 -1
  404. package/dist/team/multi-agent.d.ts.map +0 -1
  405. package/dist/team/projections.d.ts.map +0 -1
  406. package/dist/team/runtime.d.ts.map +0 -1
  407. package/dist/team/spawn-agent-tool.d.ts.map +0 -1
  408. package/dist/team/subagent-prompts.d.ts.map +0 -1
  409. package/dist/team/team-tools.d.ts.map +0 -1
  410. package/dist/telemetry/ITelemetryAdapter.d.ts.map +0 -1
  411. package/dist/telemetry/OpenTelemetryAdapter.d.ts.map +0 -1
  412. package/dist/telemetry/OpenTelemetryProvider.d.ts.map +0 -1
  413. package/dist/telemetry/TelemetryLoggerSink.d.ts.map +0 -1
  414. package/dist/telemetry/TelemetryService.d.ts.map +0 -1
  415. package/dist/telemetry/core-events.d.ts.map +0 -1
  416. package/dist/telemetry/distinct-id.d.ts.map +0 -1
  417. package/dist/telemetry/index.d.ts.map +0 -1
  418. package/dist/telemetry/index.js +0 -15
  419. package/dist/tools/constants.d.ts.map +0 -1
  420. package/dist/tools/definitions.d.ts.map +0 -1
  421. package/dist/tools/executors/apply-patch-parser.d.ts.map +0 -1
  422. package/dist/tools/executors/apply-patch.d.ts.map +0 -1
  423. package/dist/tools/executors/bash.d.ts.map +0 -1
  424. package/dist/tools/executors/editor.d.ts.map +0 -1
  425. package/dist/tools/executors/file-read.d.ts.map +0 -1
  426. package/dist/tools/executors/index.d.ts.map +0 -1
  427. package/dist/tools/executors/search.d.ts.map +0 -1
  428. package/dist/tools/executors/web-fetch.d.ts.map +0 -1
  429. package/dist/tools/helpers.d.ts.map +0 -1
  430. package/dist/tools/index.d.ts.map +0 -1
  431. package/dist/tools/model-tool-routing.d.ts.map +0 -1
  432. package/dist/tools/presets.d.ts.map +0 -1
  433. package/dist/tools/schemas.d.ts.map +0 -1
  434. package/dist/tools/types.d.ts.map +0 -1
  435. package/src/ClineCore.test.ts +0 -150
  436. package/src/account/cline-account-service.test.ts +0 -185
  437. package/src/account/featurebase-token.test.ts +0 -175
  438. package/src/account/rpc.test.ts +0 -63
  439. package/src/auth/bounded-ttl-cache.test.ts +0 -38
  440. package/src/auth/client.test.ts +0 -69
  441. package/src/auth/cline.test.ts +0 -267
  442. package/src/auth/codex.test.ts +0 -170
  443. package/src/auth/oca.test.ts +0 -340
  444. package/src/auth/server.test.ts +0 -287
  445. package/src/auth/utils.test.ts +0 -128
  446. package/src/extensions/config/agent-config-loader.test.ts +0 -236
  447. package/src/extensions/config/hooks-config-loader.test.ts +0 -20
  448. package/src/extensions/config/runtime-commands.test.ts +0 -115
  449. package/src/extensions/config/unified-config-file-watcher.test.ts +0 -196
  450. package/src/extensions/config/user-instruction-config-loader.test.ts +0 -246
  451. package/src/extensions/context/compaction.test.ts +0 -483
  452. package/src/extensions/mcp/config-loader.test.ts +0 -238
  453. package/src/extensions/mcp/manager.test.ts +0 -105
  454. package/src/extensions/plugin/plugin-config-loader.test.ts +0 -182
  455. package/src/extensions/plugin/plugin-loader.test.ts +0 -292
  456. package/src/extensions/plugin/plugin-sandbox.test.ts +0 -423
  457. package/src/hooks/persistent.ts +0 -661
  458. package/src/input/file-indexer.d.ts +0 -11
  459. package/src/input/file-indexer.test.ts +0 -127
  460. package/src/input/mention-enricher.test.ts +0 -85
  461. package/src/prompt/default-system.ts +0 -21
  462. package/src/providers/local-provider-service.test.ts +0 -1062
  463. package/src/runtime/checkpoint-hooks.test.ts +0 -168
  464. package/src/runtime/hook-file-hooks.test.ts +0 -311
  465. package/src/runtime/runtime-builder.team-persistence.test.ts +0 -242
  466. package/src/runtime/runtime-builder.test.ts +0 -616
  467. package/src/runtime/runtime-parity.test.ts +0 -143
  468. package/src/session/default-session-manager.e2e.test.ts +0 -384
  469. package/src/session/default-session-manager.test.ts +0 -2473
  470. package/src/session/persistence-service.test.ts +0 -241
  471. package/src/session/rpc-runtime-ensure.ts +0 -521
  472. package/src/session/rpc-session-service.ts +0 -107
  473. package/src/session/rpc-spawn-lease.test.ts +0 -49
  474. package/src/session/rpc-spawn-lease.ts +0 -122
  475. package/src/session/runtime-oauth-token-manager.test.ts +0 -137
  476. package/src/session/session-config-builder.ts +0 -172
  477. package/src/session/session-host.test.ts +0 -89
  478. package/src/session/session-host.ts +0 -213
  479. package/src/session/session-manager.ts +0 -74
  480. package/src/session/session-service.team-persistence.test.ts +0 -48
  481. package/src/session/sqlite-rpc-session-backend.ts +0 -303
  482. package/src/session/utils/helpers.test.ts +0 -160
  483. package/src/storage/artifact-store.ts +0 -1
  484. package/src/storage/provider-settings-legacy-migration.test.ts +0 -424
  485. package/src/storage/provider-settings-manager.test.ts +0 -191
  486. package/src/storage/session-store.ts +0 -1
  487. package/src/team/multi-agent.lifecycle.test.ts +0 -201
  488. package/src/team/spawn-agent-tool.test.ts +0 -387
  489. package/src/team/team-tools.test.ts +0 -906
  490. package/src/telemetry/OpenTelemetryAdapter.test.ts +0 -157
  491. package/src/telemetry/OpenTelemetryProvider.test.ts +0 -326
  492. package/src/telemetry/TelemetryLoggerSink.test.ts +0 -42
  493. package/src/telemetry/TelemetryService.test.ts +0 -134
  494. package/src/telemetry/distinct-id.test.ts +0 -57
  495. package/src/tools/definitions.test.ts +0 -780
  496. package/src/tools/executors/bash.test.ts +0 -87
  497. package/src/tools/executors/editor.test.ts +0 -35
  498. package/src/tools/executors/file-read.test.ts +0 -49
  499. package/src/tools/model-tool-routing.test.ts +0 -86
  500. package/src/tools/presets.test.ts +0 -70
  501. /package/dist/{tools → extensions/tools}/constants.d.ts +0 -0
  502. /package/dist/{tools → extensions/tools}/executors/apply-patch-parser.d.ts +0 -0
  503. /package/dist/{tools → extensions/tools}/executors/bash.d.ts +0 -0
  504. /package/dist/{tools → extensions/tools}/executors/editor.d.ts +0 -0
  505. /package/dist/{tools → extensions/tools}/executors/file-read.d.ts +0 -0
  506. /package/dist/{tools → extensions/tools}/executors/index.d.ts +0 -0
  507. /package/dist/{tools → extensions/tools}/executors/web-fetch.d.ts +0 -0
  508. /package/dist/{tools → extensions/tools}/helpers.d.ts +0 -0
  509. /package/dist/{tools → extensions/tools}/schemas.d.ts +0 -0
  510. /package/dist/{team → extensions/tools/team}/delegated-agent.d.ts +0 -0
  511. /package/dist/{team → extensions/tools/team}/index.d.ts +0 -0
  512. /package/dist/{team → extensions/tools/team}/projections.d.ts +0 -0
  513. /package/dist/{team → extensions/tools/team}/runtime.d.ts +0 -0
  514. /package/dist/{team → extensions/tools/team}/subagent-prompts.d.ts +0 -0
  515. /package/dist/{telemetry → services/telemetry}/ITelemetryAdapter.d.ts +0 -0
  516. /package/dist/{telemetry → services/telemetry}/OpenTelemetryAdapter.d.ts +0 -0
  517. /package/dist/{telemetry → services/telemetry}/OpenTelemetryProvider.d.ts +0 -0
  518. /package/dist/{telemetry → services/telemetry}/TelemetryLoggerSink.d.ts +0 -0
  519. /package/dist/{telemetry → services/telemetry}/TelemetryService.d.ts +0 -0
  520. /package/dist/{telemetry → services/telemetry}/core-events.d.ts +0 -0
  521. /package/dist/{telemetry → services/telemetry}/distinct-id.d.ts +0 -0
  522. /package/dist/{telemetry → services/telemetry}/index.d.ts +0 -0
  523. /package/dist/{input → services/workspace}/file-indexer.d.ts +0 -0
  524. /package/dist/{input → services/workspace}/index.d.ts +0 -0
  525. /package/dist/{input → services/workspace}/mention-enricher.d.ts +0 -0
  526. /package/src/{tools → extensions/tools}/constants.ts +0 -0
  527. /package/src/{tools → extensions/tools}/executors/apply-patch-parser.ts +0 -0
  528. /package/src/{tools → extensions/tools}/executors/bash.ts +0 -0
  529. /package/src/{tools → extensions/tools}/executors/editor.ts +0 -0
  530. /package/src/{tools → extensions/tools}/executors/index.ts +0 -0
  531. /package/src/{tools → extensions/tools}/executors/web-fetch.ts +0 -0
  532. /package/src/{tools → extensions/tools}/helpers.ts +0 -0
  533. /package/src/{team → extensions/tools/team}/delegated-agent.ts +0 -0
  534. /package/src/{team → extensions/tools/team}/index.ts +0 -0
  535. /package/src/{team → extensions/tools/team}/projections.ts +0 -0
  536. /package/src/{team → extensions/tools/team}/runtime.ts +0 -0
  537. /package/src/{storage → services/storage}/index.ts +0 -0
  538. /package/src/{telemetry → services/telemetry}/ITelemetryAdapter.ts +0 -0
  539. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.ts +0 -0
  540. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.ts +0 -0
  541. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.ts +0 -0
  542. /package/src/{telemetry → services/telemetry}/TelemetryService.ts +0 -0
  543. /package/src/{telemetry → services/telemetry}/core-events.ts +0 -0
  544. /package/src/{telemetry → services/telemetry}/distinct-id.ts +0 -0
  545. /package/src/{telemetry → services/telemetry}/index.ts +0 -0
  546. /package/src/{input → services/workspace}/index.ts +0 -0
@@ -1,906 +0,0 @@
1
- import { join } from "node:path";
2
- import { resolveTeamDataDir } from "@clinebot/shared/storage";
3
- import { afterEach, describe, expect, it, vi } from "vitest";
4
- import { createDelegatedAgentConfigProvider } from "./delegated-agent";
5
- import { AgentTeamsRuntime } from "./multi-agent";
6
- import { createAgentTeamsTools } from "./team-tools";
7
-
8
- type EnvSnapshot = {
9
- CLINE_DATA_DIR: string | undefined;
10
- CLINE_TEAM_DATA_DIR: string | undefined;
11
- };
12
-
13
- function captureEnv(): EnvSnapshot {
14
- return {
15
- CLINE_DATA_DIR: process.env.CLINE_DATA_DIR,
16
- CLINE_TEAM_DATA_DIR: process.env.CLINE_TEAM_DATA_DIR,
17
- };
18
- }
19
-
20
- function restoreEnv(snapshot: EnvSnapshot): void {
21
- process.env.CLINE_DATA_DIR = snapshot.CLINE_DATA_DIR;
22
- process.env.CLINE_TEAM_DATA_DIR = snapshot.CLINE_TEAM_DATA_DIR;
23
- }
24
-
25
- function makeTeammateConfigProvider(
26
- overrides?: Partial<Parameters<typeof createDelegatedAgentConfigProvider>[0]>,
27
- ) {
28
- return createDelegatedAgentConfigProvider({
29
- providerId: "anthropic",
30
- modelId: "claude-sonnet-4-5-20250929",
31
- ...overrides,
32
- });
33
- }
34
-
35
- describe("resolveTeamDataDir", () => {
36
- let snapshot: EnvSnapshot = captureEnv();
37
-
38
- afterEach(() => {
39
- restoreEnv(snapshot);
40
- });
41
-
42
- it("uses CLINE_TEAM_DATA_DIR when set", () => {
43
- snapshot = captureEnv();
44
- process.env.CLINE_TEAM_DATA_DIR = "/tmp/team-dir";
45
- process.env.CLINE_DATA_DIR = "/tmp/cline-data";
46
- expect(resolveTeamDataDir()).toBe("/tmp/team-dir");
47
- });
48
-
49
- it("falls back to CLINE_DATA_DIR/teams", () => {
50
- snapshot = captureEnv();
51
- delete process.env.CLINE_TEAM_DATA_DIR;
52
- process.env.CLINE_DATA_DIR = "/tmp/cline-data";
53
- expect(resolveTeamDataDir()).toBe(join("/tmp/cline-data", "teams"));
54
- });
55
- });
56
-
57
- describe("createAgentTeamsTools schema surface", () => {
58
- it("exposes a compact task action tool plus strict schemas elsewhere", () => {
59
- const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
60
- const tools = createAgentTeamsTools({
61
- runtime,
62
- requesterId: "lead",
63
- teammateConfigProvider: makeTeammateConfigProvider(),
64
- });
65
-
66
- const spawn = tools.find((tool) => tool.name === "team_spawn_teammate");
67
- const teamTask = tools.find((tool) => tool.name === "team_task");
68
- const send = tools.find((tool) => tool.name === "team_send_message");
69
- const createOutcome = tools.find(
70
- (tool) => tool.name === "team_create_outcome",
71
- );
72
- const teamAwaitRun = tools.find((tool) => tool.name === "team_await_run");
73
- const teamLogUpdate = tools.find((tool) => tool.name === "team_log_update");
74
-
75
- expect(spawn?.inputSchema.type).toBe("object");
76
- const teamTaskSchema = teamTask?.inputSchema as
77
- | {
78
- type?: string;
79
- properties?: Record<string, unknown>;
80
- required?: unknown[];
81
- }
82
- | undefined;
83
- expect(teamTaskSchema?.type).toBe("object");
84
- expect(teamTaskSchema?.properties).toHaveProperty("action");
85
- expect(teamTaskSchema?.required).toEqual(["action"]);
86
- expect(send?.inputSchema.type).toBe("object");
87
- expect(createOutcome?.inputSchema.type).toBe("object");
88
- expect(teamAwaitRun?.inputSchema.type).toBe("object");
89
- const schema = teamLogUpdate?.inputSchema as
90
- | { properties: Record<string, unknown>; required: unknown[] }
91
- | undefined;
92
- expect(schema?.properties.kind).toEqual({
93
- type: "string",
94
- enum: ["progress", "handoff", "blocked", "decision", "done", "error"],
95
- });
96
- expect(schema?.required).toEqual(["kind", "summary"]);
97
- });
98
-
99
- it("rejects extra fields for strict spawn schema", async () => {
100
- const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
101
- const tools = createAgentTeamsTools({
102
- runtime,
103
- requesterId: "lead",
104
- teammateConfigProvider: makeTeammateConfigProvider(),
105
- });
106
- const spawn = tools.find((tool) => tool.name === "team_spawn_teammate");
107
- expect(spawn).toBeDefined();
108
-
109
- await expect(
110
- spawn?.execute(
111
- {
112
- agentId: "python-poet",
113
- rolePrompt: "Write concise Python-focused haiku",
114
- action: "spawn",
115
- },
116
- {
117
- agentId: "lead",
118
- conversationId: "conv-1",
119
- iteration: 1,
120
- },
121
- ),
122
- ).rejects.toThrow("Unrecognized key");
123
- });
124
-
125
- it("can expose only the spawn tool until the first teammate is created", async () => {
126
- const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
127
- const onLeadToolsUnlocked = vi.fn();
128
- const tools = createAgentTeamsTools({
129
- runtime,
130
- requesterId: "lead",
131
- teammateConfigProvider: makeTeammateConfigProvider(),
132
- includeSpawnTool: true,
133
- includeManagementTools: false,
134
- onLeadToolsUnlocked,
135
- });
136
-
137
- expect(tools.map((tool) => tool.name)).toEqual(["team_spawn_teammate"]);
138
-
139
- const spawn = tools[0];
140
- await expect(
141
- spawn?.execute(
142
- {
143
- agentId: "writer",
144
- rolePrompt: "Write concise summaries",
145
- },
146
- {
147
- agentId: "lead",
148
- conversationId: "conv-1",
149
- iteration: 1,
150
- },
151
- ),
152
- ).resolves.toEqual({
153
- agentId: "writer",
154
- status: "spawned",
155
- });
156
-
157
- expect(onLeadToolsUnlocked).toHaveBeenCalledTimes(1);
158
- const unlockedTools = onLeadToolsUnlocked.mock.calls[0]?.[0] as
159
- | Array<{ name: string }>
160
- | undefined;
161
- expect(unlockedTools?.some((tool) => tool.name === "team_task")).toBe(true);
162
- expect(
163
- unlockedTools?.some((tool) => tool.name === "team_spawn_teammate"),
164
- ).toBe(false);
165
- });
166
-
167
- it("rejects non-object payloads for task tools", async () => {
168
- const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
169
- const tools = createAgentTeamsTools({
170
- runtime,
171
- requesterId: "lead",
172
- teammateConfigProvider: makeTeammateConfigProvider(),
173
- });
174
- const teamTask = tools.find((tool) => tool.name === "team_task");
175
- expect(teamTask).toBeDefined();
176
-
177
- await expect(
178
- teamTask?.execute(["create", "task"], {
179
- agentId: "lead",
180
- conversationId: "conv-1",
181
- iteration: 1,
182
- }),
183
- ).rejects.toThrow("expected object");
184
- });
185
-
186
- it("normalizes null placeholders for required fields into missing-field errors", async () => {
187
- const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
188
- const tools = createAgentTeamsTools({
189
- runtime,
190
- requesterId: "lead",
191
- teammateConfigProvider: makeTeammateConfigProvider(),
192
- });
193
- const teamTask = tools.find((tool) => tool.name === "team_task");
194
- expect(teamTask).toBeDefined();
195
-
196
- await expect(
197
- teamTask?.execute(
198
- {
199
- action: "complete",
200
- taskId: "task_0001",
201
- summary: null,
202
- },
203
- {
204
- agentId: "lead",
205
- conversationId: "conv-1",
206
- iteration: 1,
207
- },
208
- ),
209
- ).rejects.toThrow('Field "summary" is required when action=complete');
210
- });
211
-
212
- it("accepts null placeholders for optional fields", async () => {
213
- const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
214
- const tools = createAgentTeamsTools({
215
- runtime,
216
- requesterId: "lead",
217
- teammateConfigProvider: makeTeammateConfigProvider(),
218
- });
219
- const teamTask = tools.find((tool) => tool.name === "team_task");
220
- expect(teamTask).toBeDefined();
221
- if (!teamTask) {
222
- throw new Error("Expected team_task tool to be defined");
223
- }
224
-
225
- await expect(
226
- teamTask.execute(
227
- {
228
- action: "create",
229
- title: "Investigate llms boundaries",
230
- description: "Deep dive models and providers",
231
- dependsOn: null,
232
- },
233
- {
234
- agentId: "lead",
235
- conversationId: "conv-1",
236
- iteration: 1,
237
- },
238
- ),
239
- ).resolves.toMatchObject({
240
- action: "create",
241
- status: "pending",
242
- taskId: expect.stringMatching(/^task_/),
243
- });
244
- });
245
-
246
- it("rejects fields that do not belong to the selected action", async () => {
247
- const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
248
- const tools = createAgentTeamsTools({
249
- runtime,
250
- requesterId: "lead",
251
- teammateConfigProvider: makeTeammateConfigProvider(),
252
- });
253
- const teamTask = tools.find((tool) => tool.name === "team_task");
254
- expect(teamTask).toBeDefined();
255
-
256
- await expect(
257
- teamTask?.execute(
258
- {
259
- action: "claim",
260
- taskId: "task_0001",
261
- title: "should not be here",
262
- },
263
- {
264
- agentId: "lead",
265
- conversationId: "conv-1",
266
- iteration: 1,
267
- },
268
- ),
269
- ).rejects.toThrow('Field "title" is not allowed when action=claim');
270
- });
271
-
272
- it("defaults requiredSections for team_create_outcome", async () => {
273
- const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
274
- const tools = createAgentTeamsTools({
275
- runtime,
276
- requesterId: "lead",
277
- teammateConfigProvider: makeTeammateConfigProvider(),
278
- });
279
- const createOutcome = tools.find(
280
- (tool) => tool.name === "team_create_outcome",
281
- );
282
- expect(createOutcome).toBeDefined();
283
-
284
- await expect(
285
- createOutcome?.execute(
286
- {
287
- title: "LLMS boundary redesign",
288
- },
289
- {
290
- agentId: "lead",
291
- conversationId: "conv-1",
292
- iteration: 1,
293
- },
294
- ),
295
- ).resolves.toMatchObject({
296
- outcomeId: expect.stringMatching(/^out_/),
297
- status: "draft",
298
- });
299
-
300
- const outcomes = runtime.listOutcomes();
301
- expect(outcomes).toHaveLength(1);
302
- expect(outcomes[0]?.requiredSections).toEqual([
303
- "current_state",
304
- "boundary_analysis",
305
- "interface_proposal",
306
- ]);
307
- });
308
-
309
- it("can list outcomes via dedicated list tool", async () => {
310
- const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
311
- const tools = createAgentTeamsTools({
312
- runtime,
313
- requesterId: "lead",
314
- teammateConfigProvider: makeTeammateConfigProvider(),
315
- });
316
- const createOutcome = tools.find(
317
- (tool) => tool.name === "team_create_outcome",
318
- );
319
- const listOutcomes = tools.find(
320
- (tool) => tool.name === "team_list_outcomes",
321
- );
322
- expect(createOutcome).toBeDefined();
323
- expect(listOutcomes).toBeDefined();
324
-
325
- await createOutcome?.execute(
326
- { title: "LLMS redesign" },
327
- {
328
- agentId: "lead",
329
- conversationId: "conv-1",
330
- iteration: 1,
331
- },
332
- );
333
-
334
- await expect(
335
- listOutcomes?.execute(
336
- {},
337
- {
338
- agentId: "lead",
339
- conversationId: "conv-1",
340
- iteration: 1,
341
- },
342
- ),
343
- ).resolves.toEqual(
344
- expect.arrayContaining([
345
- expect.objectContaining({
346
- title: expect.any(String),
347
- }),
348
- ]),
349
- );
350
- });
351
-
352
- it("accepts null sourceRunId for team_attach_outcome_fragment", async () => {
353
- const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
354
- const tools = createAgentTeamsTools({
355
- runtime,
356
- requesterId: "lead",
357
- teammateConfigProvider: makeTeammateConfigProvider(),
358
- });
359
- const createOutcome = tools.find(
360
- (tool) => tool.name === "team_create_outcome",
361
- );
362
- const attachFragment = tools.find(
363
- (tool) => tool.name === "team_attach_outcome_fragment",
364
- );
365
- expect(createOutcome).toBeDefined();
366
- expect(attachFragment).toBeDefined();
367
- if (!createOutcome || !attachFragment) {
368
- throw new Error("Expected outcome tools to be defined");
369
- }
370
-
371
- const createdResult = await createOutcome.execute(
372
- { title: "Providers report" },
373
- {
374
- agentId: "lead",
375
- conversationId: "conv-1",
376
- iteration: 1,
377
- },
378
- );
379
- expect(createdResult).toMatchObject({
380
- outcomeId: expect.stringMatching(/^out_/),
381
- status: "draft",
382
- });
383
- const isCreatedOutcome = (
384
- value: unknown,
385
- ): value is { outcomeId: string; status: string } => {
386
- if (typeof value !== "object" || value === null) {
387
- return false;
388
- }
389
- const record = value as Record<string, unknown>;
390
- return (
391
- typeof record.outcomeId === "string" &&
392
- typeof record.status === "string"
393
- );
394
- };
395
- if (!isCreatedOutcome(createdResult)) {
396
- throw new Error(
397
- "Expected createOutcome result to include outcomeId and status",
398
- );
399
- }
400
- const created = createdResult;
401
-
402
- await expect(
403
- attachFragment.execute(
404
- {
405
- outcomeId: created.outcomeId,
406
- section: "current_state",
407
- sourceRunId: null,
408
- content: "Current findings.",
409
- },
410
- {
411
- agentId: "lead",
412
- conversationId: "conv-1",
413
- iteration: 1,
414
- },
415
- ),
416
- ).resolves.toMatchObject({
417
- fragmentId: expect.stringMatching(/^frag_/),
418
- status: "draft",
419
- });
420
-
421
- const [fragment] = runtime.listOutcomeFragments(created.outcomeId);
422
- expect(fragment?.sourceRunId).toBeUndefined();
423
- });
424
- });
425
-
426
- describe("createAgentTeamsTools runtime behavior", () => {
427
- it("forwards teammateRuntime headers when spawning teammates", async () => {
428
- const spawnTeammate = vi.fn();
429
- const runtime = {
430
- getMemberRole: vi.fn(() => "lead"),
431
- isTeammateActive: vi.fn(() => false),
432
- spawnTeammate,
433
- } as unknown as AgentTeamsRuntime;
434
-
435
- const tools = createAgentTeamsTools({
436
- runtime,
437
- requesterId: "lead",
438
- teammateConfigProvider: makeTeammateConfigProvider({
439
- providerId: "cline",
440
- modelId: "anthropic/claude-sonnet-4.6",
441
- headers: { Authorization: "Bearer token" },
442
- }),
443
- createBaseTools: () => [],
444
- });
445
- const spawnTool = tools.find((tool) => tool.name === "team_spawn_teammate");
446
- expect(spawnTool).toBeDefined();
447
-
448
- await spawnTool?.execute(
449
- {
450
- agentId: "investigator",
451
- rolePrompt: "Investigate code boundaries",
452
- },
453
- {
454
- agentId: "lead",
455
- conversationId: "conv-1",
456
- iteration: 1,
457
- },
458
- );
459
-
460
- expect(spawnTeammate).toHaveBeenCalledWith(
461
- expect.objectContaining({
462
- config: expect.objectContaining({
463
- headers: { Authorization: "Bearer token" },
464
- }),
465
- }),
466
- );
467
- });
468
-
469
- it("injects workspace metadata into cline teammate system prompt", async () => {
470
- const spawnTeammate = vi.fn();
471
- const runtime = {
472
- getMemberRole: vi.fn(() => "lead"),
473
- isTeammateActive: vi.fn(() => false),
474
- spawnTeammate,
475
- } as unknown as AgentTeamsRuntime;
476
-
477
- const tools = createAgentTeamsTools({
478
- runtime,
479
- requesterId: "lead",
480
- teammateConfigProvider: makeTeammateConfigProvider({
481
- providerId: "cline",
482
- modelId: "anthropic/claude-sonnet-4.6",
483
- cwd: "/repo/app",
484
- }),
485
- });
486
- const spawnTool = tools.find((tool) => tool.name === "team_spawn_teammate");
487
- expect(spawnTool).toBeDefined();
488
-
489
- await spawnTool?.execute(
490
- {
491
- agentId: "researcher",
492
- rolePrompt: "Investigate runtime boundary regressions.",
493
- },
494
- {
495
- agentId: "lead",
496
- conversationId: "conv-1",
497
- iteration: 1,
498
- },
499
- );
500
-
501
- expect(spawnTeammate).toHaveBeenCalledWith(
502
- expect.objectContaining({
503
- config: expect.objectContaining({
504
- systemPrompt: expect.stringContaining("# Workspace Configuration"),
505
- }),
506
- }),
507
- );
508
- expect(spawnTeammate).toHaveBeenCalledWith(
509
- expect.objectContaining({
510
- config: expect.objectContaining({
511
- systemPrompt: expect.stringContaining('"/repo/app"'),
512
- }),
513
- }),
514
- );
515
- expect(spawnTeammate).toHaveBeenCalledWith(
516
- expect.objectContaining({
517
- config: expect.objectContaining({
518
- systemPrompt: expect.stringContaining('"hint": "app"'),
519
- }),
520
- }),
521
- );
522
- expect(spawnTeammate).toHaveBeenCalledWith(
523
- expect.objectContaining({
524
- config: expect.objectContaining({
525
- systemPrompt: expect.stringContaining(
526
- "# Team Teammate Role\nInvestigate runtime boundary regressions.",
527
- ),
528
- }),
529
- }),
530
- );
531
- });
532
-
533
- it("throws from team_await_run when async delegated run fails", async () => {
534
- const runtime = {
535
- awaitRun: vi.fn(async () => ({
536
- id: "run_0001",
537
- status: "failed",
538
- error: "Authentication failed",
539
- })),
540
- } as unknown as AgentTeamsRuntime;
541
-
542
- const tools = createAgentTeamsTools({
543
- runtime,
544
- requesterId: "lead",
545
- teammateConfigProvider: makeTeammateConfigProvider(),
546
- });
547
- const awaitRun = tools.find((tool) => tool.name === "team_await_run");
548
- expect(awaitRun).toBeDefined();
549
-
550
- await expect(
551
- awaitRun?.execute(
552
- { runId: "run_0001" },
553
- {
554
- agentId: "lead",
555
- conversationId: "conv-1",
556
- iteration: 1,
557
- },
558
- ),
559
- ).rejects.toThrow('Run "run_0001" failed: Authentication failed');
560
- });
561
-
562
- it("throws from team_await_all_runs when any delegated run is not successful", async () => {
563
- const runtime = {
564
- awaitAllRuns: vi.fn(async () => [
565
- { id: "run_ok", status: "completed" },
566
- { id: "run_bad", status: "failed", error: "Auth expired" },
567
- ]),
568
- } as unknown as AgentTeamsRuntime;
569
-
570
- const tools = createAgentTeamsTools({
571
- runtime,
572
- requesterId: "lead",
573
- teammateConfigProvider: makeTeammateConfigProvider(),
574
- });
575
- const awaitAllRuns = tools.find(
576
- (tool) => tool.name === "team_await_all_runs",
577
- );
578
- expect(awaitAllRuns).toBeDefined();
579
-
580
- await expect(
581
- awaitAllRuns?.execute(
582
- {},
583
- {
584
- agentId: "lead",
585
- conversationId: "conv-1",
586
- iteration: 1,
587
- },
588
- ),
589
- ).rejects.toThrow(
590
- "One or more runs did not complete successfully: run_bad:failed(Auth expired)",
591
- );
592
- });
593
-
594
- it("returns compact summaries from team_await_run without full teammate transcripts", async () => {
595
- const runtime = {
596
- awaitRun: vi.fn(async () => ({
597
- id: "run_0001",
598
- agentId: "models-investigator",
599
- status: "completed",
600
- message:
601
- "Investigate the models directory and summarize the boundaries",
602
- priority: 0,
603
- retryCount: 0,
604
- maxRetries: 0,
605
- startedAt: new Date("2026-03-24T09:00:00.000Z"),
606
- endedAt: new Date("2026-03-24T09:01:00.000Z"),
607
- lastProgressAt: new Date("2026-03-24T09:00:59.000Z"),
608
- lastProgressMessage: "completed",
609
- currentActivity: "completed",
610
- result: {
611
- text: "Models are the public catalog and provider files are provider-specific defaults.",
612
- usage: {
613
- inputTokens: 1200,
614
- outputTokens: 300,
615
- cacheReadTokens: 900,
616
- cacheWriteTokens: 120,
617
- totalCost: 0.12,
618
- },
619
- messages: [{ role: "user", content: "huge transcript omitted" }],
620
- toolCalls: [{ name: "read_file", input: {}, output: "omitted" }],
621
- iterations: 3,
622
- finishReason: "completed",
623
- model: { id: "claude-sonnet-4-5-20250929", provider: "anthropic" },
624
- startedAt: new Date("2026-03-24T09:00:00.000Z"),
625
- endedAt: new Date("2026-03-24T09:01:00.000Z"),
626
- durationMs: 60_000,
627
- },
628
- })),
629
- } as unknown as AgentTeamsRuntime;
630
-
631
- const tools = createAgentTeamsTools({
632
- runtime,
633
- requesterId: "lead",
634
- teammateConfigProvider: makeTeammateConfigProvider(),
635
- });
636
- const awaitRun = tools.find((tool) => tool.name === "team_await_run");
637
-
638
- await expect(
639
- awaitRun?.execute(
640
- { runId: "run_0001" },
641
- {
642
- agentId: "lead",
643
- conversationId: "conv-1",
644
- iteration: 1,
645
- },
646
- ),
647
- ).resolves.toEqual({
648
- id: "run_0001",
649
- agentId: "models-investigator",
650
- status: "completed",
651
- messagePreview:
652
- "Investigate the models directory and summarize the boundaries",
653
- priority: 0,
654
- retryCount: 0,
655
- maxRetries: 0,
656
- startedAt: new Date("2026-03-24T09:00:00.000Z"),
657
- endedAt: new Date("2026-03-24T09:01:00.000Z"),
658
- lastProgressAt: new Date("2026-03-24T09:00:59.000Z"),
659
- lastProgressMessage: "completed",
660
- currentActivity: "completed",
661
- resultSummary: {
662
- textPreview:
663
- "Models are the public catalog and provider files are provider-specific defaults.",
664
- iterations: 3,
665
- finishReason: "completed",
666
- durationMs: 60_000,
667
- usage: {
668
- inputTokens: 1200,
669
- outputTokens: 300,
670
- cacheReadTokens: 900,
671
- cacheWriteTokens: 120,
672
- totalCost: 0.12,
673
- },
674
- },
675
- });
676
- });
677
-
678
- it("returns compact summaries from team_list_runs", async () => {
679
- const runtime = {
680
- listRuns: vi.fn(() => [
681
- {
682
- id: "run_0001",
683
- agentId: "providers-investigator",
684
- status: "running",
685
- message: "Investigate providers directory in detail",
686
- priority: 0,
687
- retryCount: 0,
688
- maxRetries: 0,
689
- startedAt: new Date("2026-03-24T09:00:00.000Z"),
690
- lastProgressAt: new Date("2026-03-24T09:00:30.000Z"),
691
- lastProgressMessage: "reading files",
692
- currentActivity: "reading_files",
693
- },
694
- ]),
695
- } as unknown as AgentTeamsRuntime;
696
-
697
- const tools = createAgentTeamsTools({
698
- runtime,
699
- requesterId: "lead",
700
- teammateConfigProvider: makeTeammateConfigProvider(),
701
- });
702
- const listRuns = tools.find((tool) => tool.name === "team_list_runs");
703
-
704
- await expect(
705
- listRuns?.execute(
706
- {},
707
- {
708
- agentId: "lead",
709
- conversationId: "conv-1",
710
- iteration: 1,
711
- },
712
- ),
713
- ).resolves.toEqual([
714
- {
715
- id: "run_0001",
716
- agentId: "providers-investigator",
717
- status: "running",
718
- messagePreview: "Investigate providers directory in detail",
719
- priority: 0,
720
- retryCount: 0,
721
- maxRetries: 0,
722
- startedAt: new Date("2026-03-24T09:00:00.000Z"),
723
- lastProgressAt: new Date("2026-03-24T09:00:30.000Z"),
724
- lastProgressMessage: "reading files",
725
- currentActivity: "reading_files",
726
- resultSummary: undefined,
727
- },
728
- ]);
729
- });
730
-
731
- it("sets long timeout for team await tools", () => {
732
- const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
733
- const tools = createAgentTeamsTools({
734
- runtime,
735
- requesterId: "lead",
736
- teammateConfigProvider: makeTeammateConfigProvider(),
737
- });
738
- const awaitRun = tools.find((tool) => tool.name === "team_await_run");
739
- const awaitAllRuns = tools.find(
740
- (tool) => tool.name === "team_await_all_runs",
741
- );
742
- expect(awaitRun?.timeoutMs).toBe(60 * 60 * 1000);
743
- expect(awaitAllRuns?.timeoutMs).toBe(60 * 60 * 1000);
744
- });
745
-
746
- it("deduplicates concurrent sync team_run_task calls to the same agent", async () => {
747
- let resolveRoute!: (value: { text: string; iterations: number }) => void;
748
- const routePromise = new Promise<{ text: string; iterations: number }>(
749
- (resolve) => {
750
- resolveRoute = resolve;
751
- },
752
- );
753
- const routeToTeammate = vi.fn(() => routePromise);
754
- const runtime = {
755
- routeToTeammate,
756
- getMemberRole: vi.fn(() => "lead"),
757
- } as unknown as AgentTeamsRuntime;
758
-
759
- const tools = createAgentTeamsTools({
760
- runtime,
761
- requesterId: "lead",
762
- teammateConfigProvider: makeTeammateConfigProvider(),
763
- });
764
- const runTask = tools.find((tool) => tool.name === "team_run_task");
765
- expect(runTask).toBeDefined();
766
- if (!runTask) {
767
- throw new Error("Expected team_run_task tool to be defined");
768
- }
769
-
770
- const ctx = { agentId: "lead", conversationId: "conv-1", iteration: 1 };
771
- const input = {
772
- agentId: "educator",
773
- task: "Explain probability",
774
- runMode: "sync",
775
- };
776
-
777
- // Fire two concurrent sync calls to the same agent
778
- const call1 = runTask.execute(input, ctx);
779
- const call2 = runTask.execute(input, ctx);
780
-
781
- // Second call should throw with duplicate detection error
782
- await expect(call2).rejects.toThrow(
783
- 'Duplicate team_run_task call detected for agent "educator"',
784
- );
785
-
786
- // Only one routeToTeammate call should have been made
787
- expect(routeToTeammate).toHaveBeenCalledTimes(1);
788
-
789
- // Now resolve the first call
790
- resolveRoute({ text: "Probability explained", iterations: 3 });
791
- const result1 = (await call1) as { text?: string; iterations?: number };
792
- expect(result1.text).toBe("Probability explained");
793
- expect(result1.iterations).toBe(3);
794
- });
795
-
796
- it("allows concurrent sync team_run_task calls to different agents", async () => {
797
- let resolveRoute1!: (value: { text: string; iterations: number }) => void;
798
- let resolveRoute2!: (value: { text: string; iterations: number }) => void;
799
- const routeToTeammate = vi.fn((agentId: string) => {
800
- if (agentId === "educator") {
801
- return new Promise<{ text: string; iterations: number }>((resolve) => {
802
- resolveRoute1 = resolve;
803
- });
804
- }
805
- return new Promise<{ text: string; iterations: number }>((resolve) => {
806
- resolveRoute2 = resolve;
807
- });
808
- });
809
- const runtime = {
810
- routeToTeammate,
811
- getMemberRole: vi.fn(() => "lead"),
812
- } as unknown as AgentTeamsRuntime;
813
-
814
- const tools = createAgentTeamsTools({
815
- runtime,
816
- requesterId: "lead",
817
- teammateConfigProvider: makeTeammateConfigProvider(),
818
- });
819
- const runTask = tools.find((tool) => tool.name === "team_run_task");
820
- expect(runTask).toBeDefined();
821
- if (!runTask) {
822
- throw new Error("Expected team_run_task tool to be defined");
823
- }
824
-
825
- const ctx = { agentId: "lead", conversationId: "conv-1", iteration: 1 };
826
-
827
- // Fire sync calls to two different agents - both should proceed
828
- const call1 = runTask.execute(
829
- { agentId: "educator", task: "Explain probability", runMode: "sync" },
830
- ctx,
831
- );
832
- const call2 = runTask.execute(
833
- { agentId: "assessor", task: "Evaluate answer", runMode: "sync" },
834
- ctx,
835
- );
836
-
837
- // Both should have called routeToTeammate
838
- expect(routeToTeammate).toHaveBeenCalledTimes(2);
839
-
840
- // Resolve both
841
- resolveRoute1({ text: "Explained", iterations: 2 });
842
- resolveRoute2({ text: "Evaluated", iterations: 1 });
843
-
844
- const result1 = (await call1) as { text?: string };
845
- const result2 = (await call2) as { text?: string };
846
- expect(result1.text).toBe("Explained");
847
- expect(result2.text).toBe("Evaluated");
848
- });
849
-
850
- it("lists ready-to-claim tasks through team_task list action", async () => {
851
- const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
852
- const tools = createAgentTeamsTools({
853
- runtime,
854
- requesterId: "lead",
855
- teammateConfigProvider: makeTeammateConfigProvider(),
856
- });
857
- const teamTask = tools.find((tool) => tool.name === "team_task");
858
- expect(teamTask).toBeDefined();
859
-
860
- const first = (await teamTask?.execute(
861
- {
862
- action: "create",
863
- title: "Ready task",
864
- description: "Claim immediately",
865
- },
866
- {
867
- agentId: "lead",
868
- conversationId: "conv-1",
869
- iteration: 1,
870
- },
871
- )) as { taskId: string };
872
- await teamTask?.execute(
873
- {
874
- action: "create",
875
- title: "Blocked task",
876
- description: "Wait on dependency",
877
- dependsOn: [first.taskId],
878
- },
879
- {
880
- agentId: "lead",
881
- conversationId: "conv-1",
882
- iteration: 1,
883
- },
884
- );
885
-
886
- await expect(
887
- teamTask?.execute(
888
- { action: "list", readyOnly: true },
889
- {
890
- agentId: "lead",
891
- conversationId: "conv-1",
892
- iteration: 1,
893
- },
894
- ),
895
- ).resolves.toEqual({
896
- action: "list",
897
- tasks: [
898
- expect.objectContaining({
899
- id: first.taskId,
900
- isReady: true,
901
- blockedBy: [],
902
- }),
903
- ],
904
- });
905
- });
906
- });