@clinebot/core 0.0.33 → 0.0.35

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 (412) hide show
  1. package/README.md +12 -8
  2. package/dist/ClineCore.d.ts +48 -29
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/auth/client.d.ts +19 -0
  5. package/dist/auth/client.d.ts.map +1 -1
  6. package/dist/auth/cline.d.ts.map +1 -1
  7. package/dist/auth/oca.d.ts.map +1 -1
  8. package/dist/auth/server.d.ts +32 -0
  9. package/dist/auth/server.d.ts.map +1 -1
  10. package/dist/auth/types.d.ts +29 -0
  11. package/dist/auth/types.d.ts.map +1 -1
  12. package/dist/extensions/config/agent-config-loader.d.ts +2 -2
  13. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  14. package/dist/extensions/config/agent-config-parser.d.ts +1 -1
  15. package/dist/extensions/config/agent-config-parser.d.ts.map +1 -1
  16. package/dist/extensions/config/hooks-config-loader.d.ts +2 -2
  17. package/dist/extensions/config/hooks-config-loader.d.ts.map +1 -1
  18. package/dist/extensions/config/index.d.ts +3 -3
  19. package/dist/extensions/config/index.d.ts.map +1 -1
  20. package/dist/extensions/config/user-instruction-config-loader.d.ts +2 -2
  21. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  22. package/dist/extensions/index.d.ts +2 -1
  23. package/dist/extensions/index.d.ts.map +1 -1
  24. package/dist/extensions/plugin/plugin-config-loader.d.ts +2 -1
  25. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  26. package/dist/extensions/plugin/plugin-load-report.d.ts +19 -0
  27. package/dist/extensions/plugin/plugin-load-report.d.ts.map +1 -0
  28. package/dist/extensions/plugin/plugin-loader.d.ts +6 -0
  29. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  30. package/dist/extensions/plugin/plugin-sandbox.d.ts +2 -1
  31. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  32. package/dist/extensions/plugin-sandbox-bootstrap.js +242 -242
  33. package/dist/extensions/tools/constants.d.ts.map +1 -0
  34. package/dist/extensions/tools/definitions.d.ts.map +1 -0
  35. package/dist/extensions/tools/executors/apply-patch-parser.d.ts.map +1 -0
  36. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -0
  37. package/dist/extensions/tools/executors/bash.d.ts.map +1 -0
  38. package/dist/extensions/tools/executors/editor.d.ts.map +1 -0
  39. package/dist/extensions/tools/executors/file-read.d.ts.map +1 -0
  40. package/dist/extensions/tools/executors/index.d.ts.map +1 -0
  41. package/dist/extensions/tools/executors/search.d.ts.map +1 -0
  42. package/dist/extensions/tools/executors/web-fetch.d.ts.map +1 -0
  43. package/dist/extensions/tools/helpers.d.ts.map +1 -0
  44. package/dist/extensions/tools/index.d.ts.map +1 -0
  45. package/dist/{tools → extensions/tools}/model-tool-routing.d.ts +1 -1
  46. package/dist/extensions/tools/model-tool-routing.d.ts.map +1 -0
  47. package/dist/{tools → extensions/tools}/presets.d.ts +1 -2
  48. package/dist/extensions/tools/presets.d.ts.map +1 -0
  49. package/dist/extensions/tools/schemas.d.ts.map +1 -0
  50. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -0
  51. package/dist/extensions/tools/team/index.d.ts.map +1 -0
  52. package/dist/{team → extensions/tools/team}/multi-agent.d.ts +1 -3
  53. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -0
  54. package/dist/extensions/tools/team/projections.d.ts.map +1 -0
  55. package/dist/extensions/tools/team/runtime.d.ts.map +1 -0
  56. package/dist/{team → extensions/tools/team}/spawn-agent-tool.d.ts +0 -1
  57. package/dist/extensions/tools/team/spawn-agent-tool.d.ts.map +1 -0
  58. package/dist/extensions/tools/team/subagent-prompts.d.ts.map +1 -0
  59. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -0
  60. package/dist/{tools → extensions/tools}/types.d.ts +4 -3
  61. package/dist/extensions/tools/types.d.ts.map +1 -0
  62. package/dist/{runtime → hooks}/checkpoint-hooks.d.ts +7 -0
  63. package/dist/hooks/checkpoint-hooks.d.ts.map +1 -0
  64. package/dist/{runtime → hooks}/hook-file-hooks.d.ts +0 -2
  65. package/dist/hooks/hook-file-hooks.d.ts.map +1 -0
  66. package/dist/hooks/subprocess.d.ts +3 -130
  67. package/dist/hooks/subprocess.d.ts.map +1 -1
  68. package/dist/index.d.ts +38 -35
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +386 -384
  71. package/dist/runtime/history.d.ts +4 -0
  72. package/dist/runtime/history.d.ts.map +1 -0
  73. package/dist/runtime/host.d.ts +9 -0
  74. package/dist/runtime/host.d.ts.map +1 -0
  75. package/dist/{session → runtime}/rpc-runtime-ensure.d.ts +13 -1
  76. package/dist/{session → runtime}/rpc-runtime-ensure.d.ts.map +1 -1
  77. package/dist/{session → runtime}/rpc-spawn-lease.d.ts.map +1 -1
  78. package/dist/runtime/runtime-builder.d.ts +1 -1
  79. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  80. package/dist/{session/session-manager.d.ts → runtime/runtime-host.d.ts} +55 -12
  81. package/dist/runtime/runtime-host.d.ts.map +1 -0
  82. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts +1 -1
  83. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts.map +1 -1
  84. package/dist/runtime/session-runtime.d.ts +2 -2
  85. package/dist/runtime/session-runtime.d.ts.map +1 -1
  86. package/dist/runtime/subprocess-sandbox.d.ts +2 -0
  87. package/dist/runtime/subprocess-sandbox.d.ts.map +1 -1
  88. package/dist/runtime/tool-approval.d.ts.map +1 -1
  89. package/dist/{session/session-agent-events.d.ts → services/agent-events.d.ts} +4 -4
  90. package/dist/services/agent-events.d.ts.map +1 -0
  91. package/dist/services/config.d.ts +3 -0
  92. package/dist/services/config.d.ts.map +1 -0
  93. package/dist/services/local-runtime-bootstrap.d.ts +41 -0
  94. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -0
  95. package/dist/services/providers/local-provider-registry.d.ts.map +1 -0
  96. package/dist/services/providers/local-provider-service.d.ts.map +1 -0
  97. package/dist/{session → services}/session-artifacts.d.ts +2 -4
  98. package/dist/services/session-artifacts.d.ts.map +1 -0
  99. package/dist/{session/utils/helpers.d.ts → services/session-data.d.ts} +19 -27
  100. package/dist/services/session-data.d.ts.map +1 -0
  101. package/dist/{session → services}/session-telemetry.d.ts +2 -2
  102. package/dist/services/session-telemetry.d.ts.map +1 -0
  103. package/dist/{storage → services/storage}/file-team-store.d.ts +2 -2
  104. package/dist/services/storage/file-team-store.d.ts.map +1 -0
  105. package/dist/{storage → services/storage}/provider-settings-legacy-migration.d.ts +1 -1
  106. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -0
  107. package/dist/{storage → services/storage}/provider-settings-manager.d.ts +1 -1
  108. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -0
  109. package/dist/{storage → services/storage}/sqlite-session-store.d.ts +3 -3
  110. package/dist/services/storage/sqlite-session-store.d.ts.map +1 -0
  111. package/dist/{storage → services/storage}/sqlite-team-store.d.ts +2 -2
  112. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -0
  113. package/dist/{storage → services/storage}/team-store.d.ts +1 -1
  114. package/dist/services/storage/team-store.d.ts.map +1 -0
  115. package/dist/services/telemetry/ITelemetryAdapter.d.ts.map +1 -0
  116. package/dist/services/telemetry/OpenTelemetryAdapter.d.ts.map +1 -0
  117. package/dist/services/telemetry/OpenTelemetryProvider.d.ts.map +1 -0
  118. package/dist/services/telemetry/TelemetryLoggerSink.d.ts.map +1 -0
  119. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -0
  120. package/dist/services/telemetry/core-events.d.ts.map +1 -0
  121. package/dist/services/telemetry/distinct-id.d.ts.map +1 -0
  122. package/dist/services/telemetry/index.d.ts.map +1 -0
  123. package/dist/{telemetry → services/telemetry}/index.js +6 -6
  124. package/dist/{session/utils → services}/usage.d.ts +1 -1
  125. package/dist/services/usage.d.ts.map +1 -0
  126. package/dist/services/workspace/file-indexer.d.ts.map +1 -0
  127. package/dist/services/workspace/index.d.ts.map +1 -0
  128. package/dist/services/workspace/mention-enricher.d.ts.map +1 -0
  129. package/dist/services/workspace-manifest.d.ts.map +1 -0
  130. package/dist/session/file-session-service.d.ts +4 -1
  131. package/dist/session/file-session-service.d.ts.map +1 -1
  132. package/dist/session/persistence-service.d.ts +8 -6
  133. package/dist/session/persistence-service.d.ts.map +1 -1
  134. package/dist/session/rpc-session-service.d.ts +3 -0
  135. package/dist/session/rpc-session-service.d.ts.map +1 -1
  136. package/dist/session/session-service.d.ts +8 -9
  137. package/dist/session/session-service.d.ts.map +1 -1
  138. package/dist/session/session-team-coordination.d.ts +4 -4
  139. package/dist/session/session-team-coordination.d.ts.map +1 -1
  140. package/dist/session/sqlite-rpc-session-backend.d.ts.map +1 -1
  141. package/dist/{session/default-session-manager.d.ts → transports/local.d.ts} +24 -14
  142. package/dist/transports/local.d.ts.map +1 -0
  143. package/dist/transports/rpc.d.ts +51 -0
  144. package/dist/transports/rpc.d.ts.map +1 -0
  145. package/dist/transports/runtime-host-support.d.ts +21 -0
  146. package/dist/transports/runtime-host-support.d.ts.map +1 -0
  147. package/dist/types/chat-schema.d.ts.map +1 -0
  148. package/dist/types/config.d.ts +3 -2
  149. package/dist/types/config.d.ts.map +1 -1
  150. package/dist/{session/utils/types.d.ts → types/session.d.ts} +15 -6
  151. package/dist/types/session.d.ts.map +1 -0
  152. package/dist/types/sessions.d.ts +19 -0
  153. package/dist/types/sessions.d.ts.map +1 -1
  154. package/dist/types/storage.d.ts +1 -3
  155. package/dist/types/storage.d.ts.map +1 -1
  156. package/dist/types.d.ts +7 -6
  157. package/dist/types.d.ts.map +1 -1
  158. package/package.json +7 -12
  159. package/src/ClineCore.test.ts +95 -19
  160. package/src/ClineCore.ts +120 -50
  161. package/src/auth/client.test.ts +29 -0
  162. package/src/auth/client.ts +21 -0
  163. package/src/auth/cline.ts +3 -1
  164. package/src/auth/codex.ts +1 -1
  165. package/src/auth/oca.ts +3 -1
  166. package/src/auth/server.test.ts +287 -0
  167. package/src/auth/server.ts +50 -1
  168. package/src/auth/types.ts +29 -0
  169. package/src/extensions/config/agent-config-loader.test.ts +3 -3
  170. package/src/extensions/config/agent-config-loader.ts +1 -5
  171. package/src/extensions/config/agent-config-parser.ts +1 -1
  172. package/src/extensions/config/hooks-config-loader.ts +1 -2
  173. package/src/extensions/config/index.ts +0 -4
  174. package/src/extensions/config/user-instruction-config-loader.ts +0 -4
  175. package/src/extensions/index.ts +6 -0
  176. package/src/extensions/plugin/plugin-config-loader.test.ts +39 -0
  177. package/src/extensions/plugin/plugin-config-loader.ts +18 -10
  178. package/src/extensions/plugin/plugin-load-report.ts +20 -0
  179. package/src/extensions/plugin/plugin-loader.test.ts +45 -0
  180. package/src/extensions/plugin/plugin-loader.ts +57 -3
  181. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +158 -86
  182. package/src/extensions/plugin/plugin-sandbox.test.ts +70 -0
  183. package/src/extensions/plugin/plugin-sandbox.ts +17 -6
  184. package/src/{tools → extensions/tools}/definitions.ts +1 -1
  185. package/src/extensions/tools/executors/file-read.test.ts +125 -0
  186. package/src/{tools → extensions/tools}/executors/file-read.ts +29 -4
  187. package/src/{tools → extensions/tools}/executors/search.ts +1 -1
  188. package/src/{tools → extensions/tools}/model-tool-routing.ts +1 -1
  189. package/src/{tools → extensions/tools}/presets.ts +2 -3
  190. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +455 -0
  191. package/src/{team → extensions/tools/team}/multi-agent.ts +80 -17
  192. package/src/{team → extensions/tools/team}/spawn-agent-tool.test.ts +0 -6
  193. package/src/{team → extensions/tools/team}/spawn-agent-tool.ts +1 -7
  194. package/src/{team → extensions/tools/team}/subagent-prompts.ts +2 -2
  195. package/src/{team → extensions/tools/team}/team-tools.test.ts +146 -30
  196. package/src/{team → extensions/tools/team}/team-tools.ts +98 -69
  197. package/src/{tools → extensions/tools}/types.ts +5 -3
  198. package/src/{runtime → hooks}/checkpoint-hooks.ts +27 -0
  199. package/src/{runtime → hooks}/hook-file-hooks.test.ts +42 -7
  200. package/src/{runtime → hooks}/hook-file-hooks.ts +6 -11
  201. package/src/hooks/subprocess.ts +48 -257
  202. package/src/index.ts +178 -158
  203. package/src/runtime/history.test.ts +114 -0
  204. package/src/runtime/history.ts +237 -0
  205. package/src/runtime/host.test.ts +230 -0
  206. package/src/runtime/host.ts +362 -0
  207. package/src/runtime/rpc-runtime-ensure.test.ts +123 -0
  208. package/src/{session → runtime}/rpc-runtime-ensure.ts +165 -27
  209. package/src/{session → runtime}/rpc-spawn-lease.test.ts +33 -1
  210. package/src/{session → runtime}/rpc-spawn-lease.ts +54 -20
  211. package/src/runtime/runtime-builder.team-persistence.test.ts +6 -3
  212. package/src/runtime/runtime-builder.test.ts +101 -4
  213. package/src/runtime/runtime-builder.ts +125 -86
  214. package/src/runtime/runtime-host.ts +178 -0
  215. package/src/{session → runtime}/runtime-oauth-token-manager.ts +1 -1
  216. package/src/runtime/runtime-parity.test.ts +1 -1
  217. package/src/runtime/session-runtime.ts +2 -2
  218. package/src/runtime/subprocess-sandbox.ts +26 -23
  219. package/src/runtime/tool-approval.ts +13 -15
  220. package/src/{session/session-agent-events.ts → services/agent-events.ts} +7 -7
  221. package/src/services/config.ts +5 -0
  222. package/src/services/local-runtime-bootstrap.ts +280 -0
  223. package/src/{providers → services/providers}/local-provider-service.ts +4 -4
  224. package/src/{session → services}/session-artifacts.ts +23 -19
  225. package/src/{session/utils/helpers.test.ts → services/session-data.test.ts} +1 -1
  226. package/src/{session/utils/helpers.ts → services/session-data.ts} +76 -72
  227. package/src/{session → services}/session-telemetry.ts +7 -9
  228. package/src/services/storage/artifact-store.ts +1 -0
  229. package/src/{storage → services/storage}/file-team-store.ts +2 -2
  230. package/src/{storage → services/storage}/provider-settings-legacy-migration.test.ts +1 -1
  231. package/src/{storage → services/storage}/provider-settings-legacy-migration.ts +2 -2
  232. package/src/{storage → services/storage}/provider-settings-manager.ts +2 -2
  233. package/src/services/storage/session-store.ts +1 -0
  234. package/src/{storage → services/storage}/sqlite-session-store.ts +7 -12
  235. package/src/{storage → services/storage}/sqlite-team-store.ts +4 -4
  236. package/src/{storage → services/storage}/team-store.ts +1 -1
  237. package/src/{session/utils → services}/usage.ts +1 -1
  238. package/src/{input → services/workspace}/file-indexer.test.ts +30 -1
  239. package/src/{input → services/workspace}/file-indexer.ts +26 -2
  240. package/src/{input → services/workspace}/mention-enricher.test.ts +21 -0
  241. package/src/{input → services/workspace}/mention-enricher.ts +1 -1
  242. package/src/session/file-session-service.ts +9 -7
  243. package/src/session/index.ts +25 -17
  244. package/src/session/persistence-service.test.ts +121 -24
  245. package/src/session/persistence-service.ts +118 -102
  246. package/src/session/rpc-session-service.ts +9 -2
  247. package/src/session/session-service.team-persistence.test.ts +1 -1
  248. package/src/session/session-service.ts +32 -19
  249. package/src/session/session-team-coordination.ts +13 -6
  250. package/src/session/sqlite-rpc-session-backend.ts +4 -6
  251. package/src/session/workspace-manager.ts +1 -1
  252. package/src/{session/default-session-manager.e2e.test.ts → transports/local.e2e.test.ts} +13 -17
  253. package/src/{session/default-session-manager.test.ts → transports/local.test.ts} +316 -230
  254. package/src/{session/default-session-manager.ts → transports/local.ts} +138 -172
  255. package/src/transports/rpc.test.ts +82 -0
  256. package/src/transports/rpc.ts +665 -0
  257. package/src/transports/runtime-host-support.ts +86 -0
  258. package/src/types/config.ts +3 -2
  259. package/src/{session/utils/types.ts → types/session.ts} +18 -5
  260. package/src/types/sessions.ts +21 -0
  261. package/src/types/storage.ts +1 -6
  262. package/src/types.ts +25 -18
  263. package/dist/chat/chat-schema.d.ts.map +0 -1
  264. package/dist/input/file-indexer.d.ts.map +0 -1
  265. package/dist/input/index.d.ts.map +0 -1
  266. package/dist/input/mention-enricher.d.ts.map +0 -1
  267. package/dist/prompt/default-system.d.ts +0 -2
  268. package/dist/prompt/default-system.d.ts.map +0 -1
  269. package/dist/providers/local-provider-registry.d.ts.map +0 -1
  270. package/dist/providers/local-provider-service.d.ts.map +0 -1
  271. package/dist/runtime/checkpoint-hooks.d.ts.map +0 -1
  272. package/dist/runtime/hook-file-hooks.d.ts.map +0 -1
  273. package/dist/runtime/team-runtime-registry.d.ts +0 -13
  274. package/dist/runtime/team-runtime-registry.d.ts.map +0 -1
  275. package/dist/session/default-session-manager.d.ts.map +0 -1
  276. package/dist/session/session-agent-events.d.ts.map +0 -1
  277. package/dist/session/session-artifacts.d.ts.map +0 -1
  278. package/dist/session/session-config-builder.d.ts +0 -16
  279. package/dist/session/session-config-builder.d.ts.map +0 -1
  280. package/dist/session/session-host.d.ts +0 -15
  281. package/dist/session/session-host.d.ts.map +0 -1
  282. package/dist/session/session-manager.d.ts.map +0 -1
  283. package/dist/session/session-telemetry.d.ts.map +0 -1
  284. package/dist/session/utils/helpers.d.ts.map +0 -1
  285. package/dist/session/utils/types.d.ts.map +0 -1
  286. package/dist/session/utils/usage.d.ts.map +0 -1
  287. package/dist/session/workspace-manifest.d.ts.map +0 -1
  288. package/dist/storage/file-team-store.d.ts.map +0 -1
  289. package/dist/storage/provider-settings-legacy-migration.d.ts.map +0 -1
  290. package/dist/storage/provider-settings-manager.d.ts.map +0 -1
  291. package/dist/storage/sqlite-session-store.d.ts.map +0 -1
  292. package/dist/storage/sqlite-team-store.d.ts.map +0 -1
  293. package/dist/storage/team-store.d.ts.map +0 -1
  294. package/dist/team/delegated-agent.d.ts.map +0 -1
  295. package/dist/team/index.d.ts.map +0 -1
  296. package/dist/team/multi-agent.d.ts.map +0 -1
  297. package/dist/team/projections.d.ts.map +0 -1
  298. package/dist/team/runtime.d.ts.map +0 -1
  299. package/dist/team/spawn-agent-tool.d.ts.map +0 -1
  300. package/dist/team/subagent-prompts.d.ts.map +0 -1
  301. package/dist/team/team-tools.d.ts.map +0 -1
  302. package/dist/telemetry/ITelemetryAdapter.d.ts.map +0 -1
  303. package/dist/telemetry/OpenTelemetryAdapter.d.ts.map +0 -1
  304. package/dist/telemetry/OpenTelemetryProvider.d.ts.map +0 -1
  305. package/dist/telemetry/TelemetryLoggerSink.d.ts.map +0 -1
  306. package/dist/telemetry/TelemetryService.d.ts.map +0 -1
  307. package/dist/telemetry/core-events.d.ts.map +0 -1
  308. package/dist/telemetry/distinct-id.d.ts.map +0 -1
  309. package/dist/telemetry/index.d.ts.map +0 -1
  310. package/dist/tools/constants.d.ts.map +0 -1
  311. package/dist/tools/definitions.d.ts.map +0 -1
  312. package/dist/tools/executors/apply-patch-parser.d.ts.map +0 -1
  313. package/dist/tools/executors/apply-patch.d.ts.map +0 -1
  314. package/dist/tools/executors/bash.d.ts.map +0 -1
  315. package/dist/tools/executors/editor.d.ts.map +0 -1
  316. package/dist/tools/executors/file-read.d.ts.map +0 -1
  317. package/dist/tools/executors/index.d.ts.map +0 -1
  318. package/dist/tools/executors/search.d.ts.map +0 -1
  319. package/dist/tools/executors/web-fetch.d.ts.map +0 -1
  320. package/dist/tools/helpers.d.ts.map +0 -1
  321. package/dist/tools/index.d.ts.map +0 -1
  322. package/dist/tools/model-tool-routing.d.ts.map +0 -1
  323. package/dist/tools/presets.d.ts.map +0 -1
  324. package/dist/tools/schemas.d.ts.map +0 -1
  325. package/dist/tools/types.d.ts.map +0 -1
  326. package/src/prompt/default-system.ts +0 -21
  327. package/src/runtime/team-runtime-registry.ts +0 -43
  328. package/src/session/session-config-builder.ts +0 -126
  329. package/src/session/session-host.test.ts +0 -89
  330. package/src/session/session-host.ts +0 -213
  331. package/src/session/session-manager.ts +0 -74
  332. package/src/storage/artifact-store.ts +0 -1
  333. package/src/storage/session-store.ts +0 -1
  334. package/src/team/multi-agent.lifecycle.test.ts +0 -201
  335. package/src/tools/executors/file-read.test.ts +0 -49
  336. /package/dist/{tools → extensions/tools}/constants.d.ts +0 -0
  337. /package/dist/{tools → extensions/tools}/definitions.d.ts +0 -0
  338. /package/dist/{tools → extensions/tools}/executors/apply-patch-parser.d.ts +0 -0
  339. /package/dist/{tools → extensions/tools}/executors/apply-patch.d.ts +0 -0
  340. /package/dist/{tools → extensions/tools}/executors/bash.d.ts +0 -0
  341. /package/dist/{tools → extensions/tools}/executors/editor.d.ts +0 -0
  342. /package/dist/{tools → extensions/tools}/executors/file-read.d.ts +0 -0
  343. /package/dist/{tools → extensions/tools}/executors/index.d.ts +0 -0
  344. /package/dist/{tools → extensions/tools}/executors/search.d.ts +0 -0
  345. /package/dist/{tools → extensions/tools}/executors/web-fetch.d.ts +0 -0
  346. /package/dist/{tools → extensions/tools}/helpers.d.ts +0 -0
  347. /package/dist/{tools → extensions/tools}/index.d.ts +0 -0
  348. /package/dist/{tools → extensions/tools}/schemas.d.ts +0 -0
  349. /package/dist/{team → extensions/tools/team}/delegated-agent.d.ts +0 -0
  350. /package/dist/{team → extensions/tools/team}/index.d.ts +0 -0
  351. /package/dist/{team → extensions/tools/team}/projections.d.ts +0 -0
  352. /package/dist/{team → extensions/tools/team}/runtime.d.ts +0 -0
  353. /package/dist/{team → extensions/tools/team}/subagent-prompts.d.ts +0 -0
  354. /package/dist/{team → extensions/tools/team}/team-tools.d.ts +0 -0
  355. /package/dist/{session → runtime}/rpc-spawn-lease.d.ts +0 -0
  356. /package/dist/{providers → services/providers}/local-provider-registry.d.ts +0 -0
  357. /package/dist/{providers → services/providers}/local-provider-service.d.ts +0 -0
  358. /package/dist/{telemetry → services/telemetry}/ITelemetryAdapter.d.ts +0 -0
  359. /package/dist/{telemetry → services/telemetry}/OpenTelemetryAdapter.d.ts +0 -0
  360. /package/dist/{telemetry → services/telemetry}/OpenTelemetryProvider.d.ts +0 -0
  361. /package/dist/{telemetry → services/telemetry}/TelemetryLoggerSink.d.ts +0 -0
  362. /package/dist/{telemetry → services/telemetry}/TelemetryService.d.ts +0 -0
  363. /package/dist/{telemetry → services/telemetry}/core-events.d.ts +0 -0
  364. /package/dist/{telemetry → services/telemetry}/distinct-id.d.ts +0 -0
  365. /package/dist/{telemetry → services/telemetry}/index.d.ts +0 -0
  366. /package/dist/{input → services/workspace}/file-indexer.d.ts +0 -0
  367. /package/dist/{input → services/workspace}/index.d.ts +0 -0
  368. /package/dist/{input → services/workspace}/mention-enricher.d.ts +0 -0
  369. /package/dist/{session → services}/workspace-manifest.d.ts +0 -0
  370. /package/dist/{chat → types}/chat-schema.d.ts +0 -0
  371. /package/src/{tools → extensions/tools}/constants.ts +0 -0
  372. /package/src/{tools → extensions/tools}/definitions.test.ts +0 -0
  373. /package/src/{tools → extensions/tools}/executors/apply-patch-parser.ts +0 -0
  374. /package/src/{tools → extensions/tools}/executors/apply-patch.ts +0 -0
  375. /package/src/{tools → extensions/tools}/executors/bash.test.ts +0 -0
  376. /package/src/{tools → extensions/tools}/executors/bash.ts +0 -0
  377. /package/src/{tools → extensions/tools}/executors/editor.test.ts +0 -0
  378. /package/src/{tools → extensions/tools}/executors/editor.ts +0 -0
  379. /package/src/{tools → extensions/tools}/executors/index.ts +0 -0
  380. /package/src/{tools → extensions/tools}/executors/web-fetch.ts +0 -0
  381. /package/src/{tools → extensions/tools}/helpers.ts +0 -0
  382. /package/src/{tools → extensions/tools}/index.ts +0 -0
  383. /package/src/{tools → extensions/tools}/model-tool-routing.test.ts +0 -0
  384. /package/src/{tools → extensions/tools}/presets.test.ts +0 -0
  385. /package/src/{tools → extensions/tools}/schemas.ts +0 -0
  386. /package/src/{team → extensions/tools/team}/delegated-agent.ts +0 -0
  387. /package/src/{team → extensions/tools/team}/index.ts +0 -0
  388. /package/src/{team → extensions/tools/team}/projections.ts +0 -0
  389. /package/src/{team → extensions/tools/team}/runtime.ts +0 -0
  390. /package/src/{runtime → hooks}/checkpoint-hooks.test.ts +0 -0
  391. /package/src/{session → runtime}/runtime-oauth-token-manager.test.ts +0 -0
  392. /package/src/{providers → services/providers}/local-provider-registry.ts +0 -0
  393. /package/src/{providers → services/providers}/local-provider-service.test.ts +0 -0
  394. /package/src/{storage → services/storage}/index.ts +0 -0
  395. /package/src/{storage → services/storage}/provider-settings-manager.test.ts +0 -0
  396. /package/src/{telemetry → services/telemetry}/ITelemetryAdapter.ts +0 -0
  397. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.test.ts +0 -0
  398. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.ts +0 -0
  399. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.test.ts +0 -0
  400. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.ts +0 -0
  401. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.test.ts +0 -0
  402. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.ts +0 -0
  403. /package/src/{telemetry → services/telemetry}/TelemetryService.test.ts +0 -0
  404. /package/src/{telemetry → services/telemetry}/TelemetryService.ts +0 -0
  405. /package/src/{telemetry → services/telemetry}/core-events.ts +0 -0
  406. /package/src/{telemetry → services/telemetry}/distinct-id.test.ts +0 -0
  407. /package/src/{telemetry → services/telemetry}/distinct-id.ts +0 -0
  408. /package/src/{telemetry → services/telemetry}/index.ts +0 -0
  409. /package/src/{input → services/workspace}/file-indexer.d.ts +0 -0
  410. /package/src/{input → services/workspace}/index.ts +0 -0
  411. /package/src/{session → services}/workspace-manifest.ts +0 -0
  412. /package/src/{chat → types}/chat-schema.ts +0 -0
@@ -138,6 +138,23 @@ export interface SpawnTeammateOptions {
138
138
  config: TeamMemberConfig;
139
139
  }
140
140
 
141
+ function isAbortLikeError(error: unknown): boolean {
142
+ if (
143
+ typeof DOMException !== "undefined" &&
144
+ error instanceof DOMException &&
145
+ error.name === "AbortError"
146
+ ) {
147
+ return true;
148
+ }
149
+ if (!(error instanceof Error)) {
150
+ return false;
151
+ }
152
+ return (
153
+ error.name === "AbortError" ||
154
+ error.message.toLowerCase().includes("aborted")
155
+ );
156
+ }
157
+
141
158
  // =============================================================================
142
159
  // AgentTeam
143
160
  // =============================================================================
@@ -484,6 +501,7 @@ interface TeamMemberState extends TeamMemberSnapshot {
484
501
  runningCount: number;
485
502
  lastMissionStep: number;
486
503
  lastMissionAt: number;
504
+ pendingSteerMessage?: string;
487
505
  }
488
506
 
489
507
  export class AgentTeamsRuntime {
@@ -568,8 +586,6 @@ export class AgentTeamsRuntime {
568
586
  listTaskItems(options?: {
569
587
  status?: TeamTaskStatus;
570
588
  assignee?: string;
571
- unassignedOnly?: boolean;
572
- readyOnly?: boolean;
573
589
  }): TeamTaskListItem[] {
574
590
  return Array.from(this.tasks.values())
575
591
  .map((task) => {
@@ -590,12 +606,6 @@ export class AgentTeamsRuntime {
590
606
  if (options?.assignee && task.assignee !== options.assignee) {
591
607
  return false;
592
608
  }
593
- if (options?.unassignedOnly && !!task.assignee) {
594
- return false;
595
- }
596
- if (options?.readyOnly && !task.isReady) {
597
- return false;
598
- }
599
609
  return true;
600
610
  });
601
611
  }
@@ -825,6 +835,15 @@ export class AgentTeamsRuntime {
825
835
  const wrappedConfig: TeamMemberConfig = {
826
836
  ...config,
827
837
  apiTimeoutMs: TEAMMATE_API_TIMEOUT_MS,
838
+ consumePendingUserMessage: () => {
839
+ const member = this.members.get(agentId);
840
+ if (!member || !member.pendingSteerMessage) {
841
+ return undefined;
842
+ }
843
+ const message = member.pendingSteerMessage;
844
+ member.pendingSteerMessage = undefined;
845
+ return message;
846
+ },
828
847
  onEvent: (event: AgentEvent) => {
829
848
  config.onEvent?.(event);
830
849
  this.emitEvent({ type: TeamMessageType.AgentEvent, agentId, event });
@@ -870,7 +889,13 @@ export class AgentTeamsRuntime {
870
889
  if (!member || member.role !== "teammate") {
871
890
  throw new Error(`Teammate "${agentId}" was not found`);
872
891
  }
873
- member.agent?.abort();
892
+ try {
893
+ member.agent?.abort();
894
+ } catch (error) {
895
+ if (!isAbortLikeError(error)) {
896
+ throw error;
897
+ }
898
+ }
874
899
  member.status = "stopped";
875
900
  this.emitEvent({ type: TeamMessageType.TeammateShutdown, agentId, reason });
876
901
  }
@@ -986,9 +1011,17 @@ export class AgentTeamsRuntime {
986
1011
  this.emitEvent({ type: TeamMessageType.TaskStart, agentId, message });
987
1012
 
988
1013
  try {
1014
+ const unreadMail = this.listMailbox(agentId, {
1015
+ unreadOnly: true,
1016
+ markRead: true,
1017
+ });
1018
+ const enrichedMessage =
1019
+ unreadMail.length > 0
1020
+ ? `${this.buildMailboxNotification(unreadMail)}\n\n${message}`
1021
+ : message;
989
1022
  const result = options?.continueConversation
990
- ? await member.agent.continue(message)
991
- : await member.agent.run(message);
1023
+ ? await member.agent.continue(enrichedMessage)
1024
+ : await member.agent.run(enrichedMessage);
992
1025
  this.emitEvent({ type: TeamMessageType.TaskEnd, agentId, result });
993
1026
  this.recordProgressStep(
994
1027
  agentId,
@@ -1254,7 +1287,8 @@ export class AgentTeamsRuntime {
1254
1287
  if (!this.members.has(fromAgentId)) {
1255
1288
  throw new Error(`Unknown sender "${fromAgentId}"`);
1256
1289
  }
1257
- if (!this.members.has(toAgentId)) {
1290
+ const recipient = this.members.get(toAgentId);
1291
+ if (!recipient) {
1258
1292
  throw new Error(`Unknown recipient "${toAgentId}"`);
1259
1293
  }
1260
1294
  const message: TeamMailboxMessage = {
@@ -1272,6 +1306,13 @@ export class AgentTeamsRuntime {
1272
1306
  type: TeamMessageType.TeamMessage,
1273
1307
  message: { ...message },
1274
1308
  });
1309
+ if (
1310
+ recipient.role === "teammate" &&
1311
+ recipient.runningCount > 0 &&
1312
+ recipient.agent
1313
+ ) {
1314
+ recipient.pendingSteerMessage = `[MAILBOX] You got a message from ${fromAgentId}. Subject: "${subject}". Use the team_read_mailbox tool to read it at your convenience.`;
1315
+ }
1275
1316
  return { ...message };
1276
1317
  }
1277
1318
 
@@ -1279,15 +1320,14 @@ export class AgentTeamsRuntime {
1279
1320
  fromAgentId: string,
1280
1321
  subject: string,
1281
1322
  body: string,
1282
- options?: { includeLead?: boolean; taskId?: string },
1323
+ options?: { taskId?: string },
1283
1324
  ): TeamMailboxMessage[] {
1284
- const includeLead = options?.includeLead ?? false;
1285
1325
  const messages: TeamMailboxMessage[] = [];
1286
1326
  for (const member of this.members.values()) {
1287
1327
  if (member.agentId === fromAgentId) {
1288
1328
  continue;
1289
1329
  }
1290
- if (!includeLead && member.role === "lead") {
1330
+ if (member.role === "lead") {
1291
1331
  continue;
1292
1332
  }
1293
1333
  messages.push(
@@ -1458,7 +1498,13 @@ export class AgentTeamsRuntime {
1458
1498
 
1459
1499
  for (const member of this.members.values()) {
1460
1500
  if (member.role === "teammate") {
1461
- member.agent?.abort();
1501
+ try {
1502
+ member.agent?.abort();
1503
+ } catch (error) {
1504
+ if (!isAbortLikeError(error)) {
1505
+ throw error;
1506
+ }
1507
+ }
1462
1508
  }
1463
1509
  }
1464
1510
 
@@ -1526,7 +1572,7 @@ export class AgentTeamsRuntime {
1526
1572
  this.appendMissionLog({
1527
1573
  agentId,
1528
1574
  kind: "done",
1529
- summary: `Run completed after ${event.iterations} iteration(s)`,
1575
+ summary: `Completed a delegated run (${event.iterations} iterations)`,
1530
1576
  });
1531
1577
  return;
1532
1578
  }
@@ -1638,6 +1684,23 @@ export class AgentTeamsRuntime {
1638
1684
  });
1639
1685
  }
1640
1686
 
1687
+ private buildMailboxNotification(messages: TeamMailboxMessage[]): string {
1688
+ if (messages.length === 0) {
1689
+ return "";
1690
+ }
1691
+ const lines: string[] = [
1692
+ `[MAILBOX] You have ${messages.length} unread message(s):`,
1693
+ ];
1694
+ for (const msg of messages) {
1695
+ lines.push(
1696
+ `--- Message from ${msg.fromAgentId} | subject: ${msg.subject} ---`,
1697
+ );
1698
+ lines.push(msg.body);
1699
+ }
1700
+ lines.push("---");
1701
+ return lines.join("\n");
1702
+ }
1703
+
1641
1704
  private emitEvent(event: TeamEvent): void {
1642
1705
  try {
1643
1706
  this.onTeamEvent?.(event);
@@ -180,7 +180,6 @@ describe("createSpawnAgentTool", () => {
180
180
  {
181
181
  systemPrompt: "System",
182
182
  task: "Fail task",
183
- maxIterations: 6,
184
183
  },
185
184
  {
186
185
  agentId: "parent-2",
@@ -197,11 +196,6 @@ describe("createSpawnAgentTool", () => {
197
196
  error: expect.any(Error),
198
197
  }),
199
198
  );
200
- expect(agentConstructorSpy).toHaveBeenCalledWith(
201
- expect.objectContaining({
202
- maxIterations: 6,
203
- }),
204
- );
205
199
  });
206
200
 
207
201
  it("leaves maxIterations unset when neither input nor default is provided", async () => {
@@ -32,12 +32,6 @@ export const SpawnAgentInputSchema = z.object({
32
32
  .string()
33
33
  .describe("System prompt defining the sub-agent's behavior"),
34
34
  task: z.string().describe("Task for the sub-agent to complete"),
35
- maxIterations: z
36
- .number()
37
- .int()
38
- .min(1)
39
- .optional()
40
- .describe("Max iterations for the sub-agent"),
41
35
  });
42
36
 
43
37
  export type SpawnAgentInput = z.infer<typeof SpawnAgentInputSchema>;
@@ -136,7 +130,7 @@ export function createSpawnAgentTool(
136
130
  prompt: input.systemPrompt,
137
131
  configProvider: config.configProvider,
138
132
  tools,
139
- maxIterations: input.maxIterations ?? config.defaultMaxIterations,
133
+ maxIterations: config.defaultMaxIterations,
140
134
  parentAgentId: context.agentId,
141
135
  abortSignal: context.abortSignal,
142
136
  onEvent: config.onSubAgentEvent,
@@ -11,7 +11,7 @@ export function buildTeammateSystemPrompt(
11
11
  }
12
12
 
13
13
  return buildClineSystemPrompt({
14
- ide: config.clineIdeName?.trim() || "Terminal Shell",
14
+ ide: config.clineIdeName?.trim() || "Terminal",
15
15
  workspaceRoot: config.cwd?.trim() || "/",
16
16
  providerId: config.providerId,
17
17
  rules: `# Team Teammate Role\n${trimmedPrompt}`,
@@ -31,7 +31,7 @@ export function buildSubAgentSystemPrompt(
31
31
  }
32
32
 
33
33
  return buildClineSystemPrompt({
34
- ide: "Terminal Shell",
34
+ ide: config.clineIdeName || "Terminal",
35
35
  workspaceRoot: config.cwd?.trim() || "/",
36
36
  providerId: config.providerId,
37
37
  overridePrompt: trimmedPrompt,
@@ -69,8 +69,10 @@ describe("createAgentTeamsTools schema surface", () => {
69
69
  const createOutcome = tools.find(
70
70
  (tool) => tool.name === "team_create_outcome",
71
71
  );
72
- const teamAwaitRun = tools.find((tool) => tool.name === "team_await_run");
73
- const teamLogUpdate = tools.find((tool) => tool.name === "team_log_update");
72
+ const teamAwaitRuns = tools.find((tool) => tool.name === "team_await_runs");
73
+ const teamLogUpdate = tools.find(
74
+ (tool) => tool.name === "team_mission_log",
75
+ );
74
76
 
75
77
  expect(spawn?.inputSchema.type).toBe("object");
76
78
  const teamTaskSchema = teamTask?.inputSchema as
@@ -85,7 +87,7 @@ describe("createAgentTeamsTools schema surface", () => {
85
87
  expect(teamTaskSchema?.required).toEqual(["action"]);
86
88
  expect(send?.inputSchema.type).toBe("object");
87
89
  expect(createOutcome?.inputSchema.type).toBe("object");
88
- expect(teamAwaitRun?.inputSchema.type).toBe("object");
90
+ expect(teamAwaitRuns?.inputSchema.type).toBe("object");
89
91
  const schema = teamLogUpdate?.inputSchema as
90
92
  | { properties: Record<string, unknown>; required: unknown[] }
91
93
  | undefined;
@@ -243,7 +245,7 @@ describe("createAgentTeamsTools schema surface", () => {
243
245
  });
244
246
  });
245
247
 
246
- it("rejects fields that do not belong to the selected action", async () => {
248
+ it("ignores non-create fields for action=create and reports them back", async () => {
247
249
  const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
248
250
  const tools = createAgentTeamsTools({
249
251
  runtime,
@@ -252,13 +254,18 @@ describe("createAgentTeamsTools schema surface", () => {
252
254
  });
253
255
  const teamTask = tools.find((tool) => tool.name === "team_task");
254
256
  expect(teamTask).toBeDefined();
257
+ if (!teamTask) {
258
+ throw new Error("Expected team_task tool to be defined");
259
+ }
255
260
 
256
261
  await expect(
257
- teamTask?.execute(
262
+ teamTask.execute(
258
263
  {
259
- action: "claim",
260
- taskId: "task_0001",
261
- title: "should not be here",
264
+ action: "create",
265
+ title: "Draft TypeScript haiku",
266
+ description: "Write a concise haiku",
267
+ status: "pending",
268
+ summary: "not used",
262
269
  },
263
270
  {
264
271
  agentId: "lead",
@@ -266,7 +273,13 @@ describe("createAgentTeamsTools schema surface", () => {
266
273
  iteration: 1,
267
274
  },
268
275
  ),
269
- ).rejects.toThrow('Field "title" is not allowed when action=claim');
276
+ ).resolves.toMatchObject({
277
+ action: "create",
278
+ status: "pending",
279
+ taskId: expect.stringMatching(/^task_/),
280
+ ignoredFields: ["status", "summary"],
281
+ note: "Ignored fields for action=create: status, summary",
282
+ });
270
283
  });
271
284
 
272
285
  it("defaults requiredSections for team_create_outcome", async () => {
@@ -530,7 +543,7 @@ describe("createAgentTeamsTools runtime behavior", () => {
530
543
  );
531
544
  });
532
545
 
533
- it("throws from team_await_run when async delegated run fails", async () => {
546
+ it("throws from team_await_runs when a requested async delegated run fails", async () => {
534
547
  const runtime = {
535
548
  awaitRun: vi.fn(async () => ({
536
549
  id: "run_0001",
@@ -544,11 +557,11 @@ describe("createAgentTeamsTools runtime behavior", () => {
544
557
  requesterId: "lead",
545
558
  teammateConfigProvider: makeTeammateConfigProvider(),
546
559
  });
547
- const awaitRun = tools.find((tool) => tool.name === "team_await_run");
548
- expect(awaitRun).toBeDefined();
560
+ const awaitRuns = tools.find((tool) => tool.name === "team_await_runs");
561
+ expect(awaitRuns).toBeDefined();
549
562
 
550
563
  await expect(
551
- awaitRun?.execute(
564
+ awaitRuns?.execute(
552
565
  { runId: "run_0001" },
553
566
  {
554
567
  agentId: "lead",
@@ -559,7 +572,7 @@ describe("createAgentTeamsTools runtime behavior", () => {
559
572
  ).rejects.toThrow('Run "run_0001" failed: Authentication failed');
560
573
  });
561
574
 
562
- it("throws from team_await_all_runs when any delegated run is not successful", async () => {
575
+ it("throws from team_await_runs when any delegated run is not successful in all-runs mode", async () => {
563
576
  const runtime = {
564
577
  awaitAllRuns: vi.fn(async () => [
565
578
  { id: "run_ok", status: "completed" },
@@ -572,13 +585,11 @@ describe("createAgentTeamsTools runtime behavior", () => {
572
585
  requesterId: "lead",
573
586
  teammateConfigProvider: makeTeammateConfigProvider(),
574
587
  });
575
- const awaitAllRuns = tools.find(
576
- (tool) => tool.name === "team_await_all_runs",
577
- );
578
- expect(awaitAllRuns).toBeDefined();
588
+ const awaitRuns = tools.find((tool) => tool.name === "team_await_runs");
589
+ expect(awaitRuns).toBeDefined();
579
590
 
580
591
  await expect(
581
- awaitAllRuns?.execute(
592
+ awaitRuns?.execute(
582
593
  {},
583
594
  {
584
595
  agentId: "lead",
@@ -591,7 +602,7 @@ describe("createAgentTeamsTools runtime behavior", () => {
591
602
  );
592
603
  });
593
604
 
594
- it("returns compact summaries from team_await_run without full teammate transcripts", async () => {
605
+ it("returns compact summaries from team_await_runs without full teammate transcripts", async () => {
595
606
  const runtime = {
596
607
  awaitRun: vi.fn(async () => ({
597
608
  id: "run_0001",
@@ -633,10 +644,10 @@ describe("createAgentTeamsTools runtime behavior", () => {
633
644
  requesterId: "lead",
634
645
  teammateConfigProvider: makeTeammateConfigProvider(),
635
646
  });
636
- const awaitRun = tools.find((tool) => tool.name === "team_await_run");
647
+ const awaitRuns = tools.find((tool) => tool.name === "team_await_runs");
637
648
 
638
649
  await expect(
639
- awaitRun?.execute(
650
+ awaitRuns?.execute(
640
651
  { runId: "run_0001" },
641
652
  {
642
653
  agentId: "lead",
@@ -728,22 +739,122 @@ describe("createAgentTeamsTools runtime behavior", () => {
728
739
  ]);
729
740
  });
730
741
 
731
- it("sets long timeout for team await tools", () => {
742
+ it("sets long timeout for team await tool", () => {
732
743
  const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
733
744
  const tools = createAgentTeamsTools({
734
745
  runtime,
735
746
  requesterId: "lead",
736
747
  teammateConfigProvider: makeTeammateConfigProvider(),
737
748
  });
738
- const awaitRun = tools.find((tool) => tool.name === "team_await_run");
739
- const awaitAllRuns = tools.find(
740
- (tool) => tool.name === "team_await_all_runs",
749
+ const awaitRuns = tools.find((tool) => tool.name === "team_await_runs");
750
+ expect(awaitRuns?.timeoutMs).toBe(60 * 60 * 1000);
751
+ });
752
+
753
+ it("deduplicates concurrent sync team_run_task calls to the same agent", async () => {
754
+ let resolveRoute!: (value: { text: string; iterations: number }) => void;
755
+ const routePromise = new Promise<{ text: string; iterations: number }>(
756
+ (resolve) => {
757
+ resolveRoute = resolve;
758
+ },
741
759
  );
742
- expect(awaitRun?.timeoutMs).toBe(60 * 60 * 1000);
743
- expect(awaitAllRuns?.timeoutMs).toBe(60 * 60 * 1000);
760
+ const routeToTeammate = vi.fn(() => routePromise);
761
+ const runtime = {
762
+ routeToTeammate,
763
+ getMemberRole: vi.fn(() => "lead"),
764
+ } as unknown as AgentTeamsRuntime;
765
+
766
+ const tools = createAgentTeamsTools({
767
+ runtime,
768
+ requesterId: "lead",
769
+ teammateConfigProvider: makeTeammateConfigProvider(),
770
+ });
771
+ const runTask = tools.find((tool) => tool.name === "team_run_task");
772
+ expect(runTask).toBeDefined();
773
+ if (!runTask) {
774
+ throw new Error("Expected team_run_task tool to be defined");
775
+ }
776
+
777
+ const ctx = { agentId: "lead", conversationId: "conv-1", iteration: 1 };
778
+ const input = {
779
+ agentId: "educator",
780
+ task: "Explain probability",
781
+ runMode: "sync",
782
+ };
783
+
784
+ // Fire two concurrent sync calls to the same agent
785
+ const call1 = runTask.execute(input, ctx);
786
+ const call2 = runTask.execute(input, ctx);
787
+
788
+ // Second call should throw with duplicate detection error
789
+ await expect(call2).rejects.toThrow(
790
+ 'Duplicate team_run_task call detected for agent "educator"',
791
+ );
792
+
793
+ // Only one routeToTeammate call should have been made
794
+ expect(routeToTeammate).toHaveBeenCalledTimes(1);
795
+
796
+ // Now resolve the first call
797
+ resolveRoute({ text: "Probability explained", iterations: 3 });
798
+ const result1 = (await call1) as { text?: string; iterations?: number };
799
+ expect(result1.text).toBe("Probability explained");
800
+ expect(result1.iterations).toBe(3);
801
+ });
802
+
803
+ it("allows concurrent sync team_run_task calls to different agents", async () => {
804
+ let resolveRoute1!: (value: { text: string; iterations: number }) => void;
805
+ let resolveRoute2!: (value: { text: string; iterations: number }) => void;
806
+ const routeToTeammate = vi.fn((agentId: string) => {
807
+ if (agentId === "educator") {
808
+ return new Promise<{ text: string; iterations: number }>((resolve) => {
809
+ resolveRoute1 = resolve;
810
+ });
811
+ }
812
+ return new Promise<{ text: string; iterations: number }>((resolve) => {
813
+ resolveRoute2 = resolve;
814
+ });
815
+ });
816
+ const runtime = {
817
+ routeToTeammate,
818
+ getMemberRole: vi.fn(() => "lead"),
819
+ } as unknown as AgentTeamsRuntime;
820
+
821
+ const tools = createAgentTeamsTools({
822
+ runtime,
823
+ requesterId: "lead",
824
+ teammateConfigProvider: makeTeammateConfigProvider(),
825
+ });
826
+ const runTask = tools.find((tool) => tool.name === "team_run_task");
827
+ expect(runTask).toBeDefined();
828
+ if (!runTask) {
829
+ throw new Error("Expected team_run_task tool to be defined");
830
+ }
831
+
832
+ const ctx = { agentId: "lead", conversationId: "conv-1", iteration: 1 };
833
+
834
+ // Fire sync calls to two different agents - both should proceed
835
+ const call1 = runTask.execute(
836
+ { agentId: "educator", task: "Explain probability", runMode: "sync" },
837
+ ctx,
838
+ );
839
+ const call2 = runTask.execute(
840
+ { agentId: "assessor", task: "Evaluate answer", runMode: "sync" },
841
+ ctx,
842
+ );
843
+
844
+ // Both should have called routeToTeammate
845
+ expect(routeToTeammate).toHaveBeenCalledTimes(2);
846
+
847
+ // Resolve both
848
+ resolveRoute1({ text: "Explained", iterations: 2 });
849
+ resolveRoute2({ text: "Evaluated", iterations: 1 });
850
+
851
+ const result1 = (await call1) as { text?: string };
852
+ const result2 = (await call2) as { text?: string };
853
+ expect(result1.text).toBe("Explained");
854
+ expect(result2.text).toBe("Evaluated");
744
855
  });
745
856
 
746
- it("lists ready-to-claim tasks through team_task list action", async () => {
857
+ it("lists team tasks through team_task list action", async () => {
747
858
  const runtime = new AgentTeamsRuntime({ teamName: "test-team" });
748
859
  const tools = createAgentTeamsTools({
749
860
  runtime,
@@ -781,7 +892,7 @@ describe("createAgentTeamsTools runtime behavior", () => {
781
892
 
782
893
  await expect(
783
894
  teamTask?.execute(
784
- { action: "list", readyOnly: true },
895
+ { action: "list" },
785
896
  {
786
897
  agentId: "lead",
787
898
  conversationId: "conv-1",
@@ -796,6 +907,11 @@ describe("createAgentTeamsTools runtime behavior", () => {
796
907
  isReady: true,
797
908
  blockedBy: [],
798
909
  }),
910
+ expect.objectContaining({
911
+ title: "Blocked task",
912
+ isReady: false,
913
+ blockedBy: [first.taskId],
914
+ }),
799
915
  ],
800
916
  });
801
917
  });