@clinebot/core 0.0.35 → 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 (335) hide show
  1. package/README.md +1 -2
  2. package/dist/ClineCore.d.ts +53 -39
  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 +4 -3
  21. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  22. package/dist/extensions/config/runtime-commands.d.ts +1 -0
  23. package/dist/extensions/config/runtime-commands.d.ts.map +1 -1
  24. package/dist/extensions/config/user-instruction-config-loader.d.ts +1 -0
  25. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  26. package/dist/extensions/context/agentic-compaction.d.ts +2 -2
  27. package/dist/extensions/context/agentic-compaction.d.ts.map +1 -1
  28. package/dist/extensions/context/compaction-shared.d.ts +5 -4
  29. package/dist/extensions/context/compaction-shared.d.ts.map +1 -1
  30. package/dist/extensions/context/compaction.d.ts.map +1 -1
  31. package/dist/extensions/plugin/plugin-config-loader.d.ts +9 -2
  32. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  33. package/dist/extensions/plugin/plugin-loader.d.ts +5 -3
  34. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  35. package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -1
  36. package/dist/extensions/plugin/plugin-sandbox.d.ts +15 -2
  37. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  38. package/dist/extensions/plugin/plugin-targeting.d.ts +7 -0
  39. package/dist/extensions/plugin/plugin-targeting.d.ts.map +1 -0
  40. package/dist/extensions/plugin-sandbox-bootstrap.js +211 -211
  41. package/dist/extensions/tools/definitions.d.ts +1 -1
  42. package/dist/extensions/tools/definitions.d.ts.map +1 -1
  43. package/dist/extensions/tools/executors/apply-patch.d.ts +3 -1
  44. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -1
  45. package/dist/extensions/tools/executors/search.d.ts +1 -1
  46. package/dist/extensions/tools/executors/search.d.ts.map +1 -1
  47. package/dist/extensions/tools/index.d.ts +2 -0
  48. package/dist/extensions/tools/index.d.ts.map +1 -1
  49. package/dist/extensions/tools/presets.d.ts +26 -43
  50. package/dist/extensions/tools/presets.d.ts.map +1 -1
  51. package/dist/extensions/tools/runtime.d.ts +25 -0
  52. package/dist/extensions/tools/runtime.d.ts.map +1 -0
  53. package/dist/extensions/tools/schemas.d.ts.map +1 -1
  54. package/dist/extensions/tools/team/team-tools.d.ts +1 -0
  55. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -1
  56. package/dist/hooks/hook-file-hooks.d.ts +4 -1
  57. package/dist/hooks/hook-file-hooks.d.ts.map +1 -1
  58. package/dist/hooks/index.d.ts +0 -1
  59. package/dist/hooks/index.d.ts.map +1 -1
  60. package/dist/hooks/subprocess.d.ts +8 -1
  61. package/dist/hooks/subprocess.d.ts.map +1 -1
  62. package/dist/hub/browser-websocket.d.ts +18 -0
  63. package/dist/hub/browser-websocket.d.ts.map +1 -0
  64. package/dist/hub/client.d.ts +45 -0
  65. package/dist/hub/client.d.ts.map +1 -0
  66. package/dist/hub/connect.d.ts +15 -0
  67. package/dist/hub/connect.d.ts.map +1 -0
  68. package/dist/hub/daemon-entry.d.ts +2 -0
  69. package/dist/hub/daemon-entry.d.ts.map +1 -0
  70. package/dist/hub/daemon-entry.js +1045 -0
  71. package/dist/hub/daemon.d.ts +5 -0
  72. package/dist/hub/daemon.d.ts.map +1 -0
  73. package/dist/hub/defaults.d.ts +13 -0
  74. package/dist/hub/defaults.d.ts.map +1 -0
  75. package/dist/hub/discovery.d.ts +29 -0
  76. package/dist/hub/discovery.d.ts.map +1 -0
  77. package/dist/hub/index.d.ts +15 -0
  78. package/dist/hub/index.d.ts.map +1 -0
  79. package/dist/hub/index.js +1044 -0
  80. package/dist/hub/native-transport.d.ts +17 -0
  81. package/dist/hub/native-transport.d.ts.map +1 -0
  82. package/dist/hub/runtime-handlers.d.ts +11 -0
  83. package/dist/hub/runtime-handlers.d.ts.map +1 -0
  84. package/dist/hub/server.d.ts +86 -0
  85. package/dist/hub/server.d.ts.map +1 -0
  86. package/dist/hub/session-client.d.ts +87 -0
  87. package/dist/hub/session-client.d.ts.map +1 -0
  88. package/dist/hub/start-shared-server.d.ts +19 -0
  89. package/dist/hub/start-shared-server.d.ts.map +1 -0
  90. package/dist/hub/transport.d.ts +8 -0
  91. package/dist/hub/transport.d.ts.map +1 -0
  92. package/dist/hub/ui-client.d.ts +44 -0
  93. package/dist/hub/ui-client.d.ts.map +1 -0
  94. package/dist/hub/workspace.d.ts +4 -0
  95. package/dist/hub/workspace.d.ts.map +1 -0
  96. package/dist/index.d.ts +26 -15
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +498 -476
  99. package/dist/llms/configured-provider-registry.d.ts +28 -0
  100. package/dist/llms/configured-provider-registry.d.ts.map +1 -0
  101. package/dist/llms/provider-defaults.d.ts +27 -0
  102. package/dist/llms/provider-defaults.d.ts.map +1 -0
  103. package/dist/llms/provider-settings.d.ts +202 -0
  104. package/dist/llms/provider-settings.d.ts.map +1 -0
  105. package/dist/llms/runtime-config.d.ts +4 -0
  106. package/dist/llms/runtime-config.d.ts.map +1 -0
  107. package/dist/llms/runtime-registry.d.ts +20 -0
  108. package/dist/llms/runtime-registry.d.ts.map +1 -0
  109. package/dist/llms/runtime-types.d.ts +85 -0
  110. package/dist/llms/runtime-types.d.ts.map +1 -0
  111. package/dist/runtime/host.d.ts +1 -2
  112. package/dist/runtime/host.d.ts.map +1 -1
  113. package/dist/runtime/rules.d.ts +1 -0
  114. package/dist/runtime/rules.d.ts.map +1 -1
  115. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  116. package/dist/runtime/runtime-host.d.ts +22 -24
  117. package/dist/runtime/runtime-host.d.ts.map +1 -1
  118. package/dist/runtime/runtime-oauth-token-manager.d.ts.map +1 -1
  119. package/dist/runtime/session-runtime.d.ts +1 -19
  120. package/dist/runtime/session-runtime.d.ts.map +1 -1
  121. package/dist/services/global-settings.d.ts +12 -0
  122. package/dist/services/global-settings.d.ts.map +1 -0
  123. package/dist/services/local-runtime-bootstrap.d.ts +9 -3
  124. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -1
  125. package/dist/services/plugin-tools.d.ts +16 -0
  126. package/dist/services/plugin-tools.d.ts.map +1 -0
  127. package/dist/services/providers/local-provider-registry.d.ts +4 -4
  128. package/dist/services/providers/local-provider-registry.d.ts.map +1 -1
  129. package/dist/services/providers/local-provider-service.d.ts +13 -13
  130. package/dist/services/providers/local-provider-service.d.ts.map +1 -1
  131. package/dist/services/session-data.d.ts +1 -1
  132. package/dist/services/session-data.d.ts.map +1 -1
  133. package/dist/services/storage/provider-settings-legacy-migration.d.ts +1 -1
  134. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -1
  135. package/dist/services/telemetry/index.js +28 -15
  136. package/dist/services/workspace-manifest.d.ts +11 -0
  137. package/dist/services/workspace-manifest.d.ts.map +1 -1
  138. package/dist/session/persistence-service.d.ts +11 -23
  139. package/dist/session/persistence-service.d.ts.map +1 -1
  140. package/dist/session/session-manifest-store.d.ts +22 -0
  141. package/dist/session/session-manifest-store.d.ts.map +1 -0
  142. package/dist/session/session-row.d.ts +93 -0
  143. package/dist/session/session-row.d.ts.map +1 -0
  144. package/dist/session/session-service.d.ts +2 -102
  145. package/dist/session/session-service.d.ts.map +1 -1
  146. package/dist/session/subagent-session-manager.d.ts +36 -0
  147. package/dist/session/subagent-session-manager.d.ts.map +1 -0
  148. package/dist/session/team-persistence-store.d.ts +24 -0
  149. package/dist/session/team-persistence-store.d.ts.map +1 -0
  150. package/dist/transports/hub.d.ts +47 -0
  151. package/dist/transports/hub.d.ts.map +1 -0
  152. package/dist/transports/local.d.ts +10 -6
  153. package/dist/transports/local.d.ts.map +1 -1
  154. package/dist/transports/remote.d.ts +10 -0
  155. package/dist/transports/remote.d.ts.map +1 -0
  156. package/dist/transports/runtime-host-support.d.ts +3 -2
  157. package/dist/transports/runtime-host-support.d.ts.map +1 -1
  158. package/dist/types/chat-schema.d.ts +10 -12
  159. package/dist/types/chat-schema.d.ts.map +1 -1
  160. package/dist/types/config.d.ts +8 -7
  161. package/dist/types/config.d.ts.map +1 -1
  162. package/dist/types/provider-settings.d.ts +4 -5
  163. package/dist/types/provider-settings.d.ts.map +1 -1
  164. package/dist/types/session.d.ts +2 -1
  165. package/dist/types/session.d.ts.map +1 -1
  166. package/dist/types.d.ts +8 -1
  167. package/dist/types.d.ts.map +1 -1
  168. package/package.json +20 -6
  169. package/src/ClineCore.ts +68 -40
  170. package/src/account/index.ts +3 -3
  171. package/src/account/rpc.ts +12 -12
  172. package/src/cron/index.ts +5 -0
  173. package/src/cron/resource-limiter.ts +46 -0
  174. package/src/cron/schedule-command-service.ts +193 -0
  175. package/src/cron/schedule-service.ts +703 -0
  176. package/src/cron/scheduler.ts +637 -0
  177. package/src/cron/sqlite-schedule-store.ts +708 -0
  178. package/src/extensions/config/agent-config-loader.ts +17 -7
  179. package/src/extensions/config/runtime-commands.ts +6 -0
  180. package/src/extensions/config/user-instruction-config-loader.ts +1 -0
  181. package/src/extensions/context/agentic-compaction.ts +3 -3
  182. package/src/extensions/context/basic-compaction.ts +2 -2
  183. package/src/extensions/context/compaction-shared.ts +5 -4
  184. package/src/extensions/context/compaction.ts +3 -3
  185. package/src/extensions/plugin/plugin-config-loader.ts +17 -2
  186. package/src/extensions/plugin/plugin-loader.ts +48 -4
  187. package/src/extensions/plugin/plugin-module-import.ts +0 -2
  188. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +93 -39
  189. package/src/extensions/plugin/plugin-sandbox.ts +47 -27
  190. package/src/extensions/plugin/plugin-targeting.ts +32 -0
  191. package/src/extensions/tools/definitions.ts +30 -49
  192. package/src/extensions/tools/executors/apply-patch.ts +69 -80
  193. package/src/extensions/tools/executors/search.ts +195 -3
  194. package/src/extensions/tools/index.ts +10 -0
  195. package/src/extensions/tools/presets.ts +31 -46
  196. package/src/extensions/tools/runtime.ts +261 -0
  197. package/src/extensions/tools/schemas.ts +4 -2
  198. package/src/extensions/tools/team/team-tools.ts +21 -0
  199. package/src/hooks/hook-file-hooks.ts +8 -2
  200. package/src/hooks/index.ts +0 -7
  201. package/src/hooks/subprocess-runner.ts +1 -1
  202. package/src/hooks/subprocess.ts +9 -0
  203. package/src/hub/browser-websocket.ts +137 -0
  204. package/src/hub/client.ts +574 -0
  205. package/src/hub/connect.ts +156 -0
  206. package/src/hub/daemon-entry.ts +87 -0
  207. package/src/hub/daemon.ts +181 -0
  208. package/src/hub/defaults.ts +43 -0
  209. package/src/hub/discovery.ts +247 -0
  210. package/src/hub/index.ts +14 -0
  211. package/src/hub/native-transport.ts +31 -0
  212. package/src/hub/runtime-handlers.ts +140 -0
  213. package/src/hub/server.ts +1888 -0
  214. package/src/hub/session-client.ts +460 -0
  215. package/src/hub/start-shared-server.ts +58 -0
  216. package/src/hub/transport.ts +14 -0
  217. package/src/hub/ui-client.ts +122 -0
  218. package/src/hub/workspace.ts +19 -0
  219. package/src/index.ts +124 -68
  220. package/src/llms/configured-provider-registry.ts +193 -0
  221. package/src/llms/provider-defaults.ts +637 -0
  222. package/src/llms/provider-settings.ts +263 -0
  223. package/src/llms/runtime-config.ts +43 -0
  224. package/src/llms/runtime-registry.ts +171 -0
  225. package/src/llms/runtime-types.ts +121 -0
  226. package/src/runtime/host.ts +107 -269
  227. package/src/runtime/index.ts +1 -0
  228. package/src/runtime/rules.ts +12 -0
  229. package/src/runtime/runtime-builder.ts +24 -8
  230. package/src/runtime/runtime-host.ts +89 -61
  231. package/src/runtime/runtime-oauth-token-manager.ts +11 -15
  232. package/src/runtime/session-runtime.ts +0 -24
  233. package/src/services/global-settings.ts +122 -0
  234. package/src/services/local-runtime-bootstrap.ts +51 -13
  235. package/src/services/plugin-tools.ts +85 -0
  236. package/src/services/providers/local-provider-registry.ts +6 -6
  237. package/src/services/providers/local-provider-service.ts +42 -37
  238. package/src/services/session-data.ts +15 -9
  239. package/src/services/storage/provider-settings-legacy-migration.ts +6 -4
  240. package/src/services/storage/provider-settings-manager.ts +1 -1
  241. package/src/services/workspace-manifest.ts +18 -0
  242. package/src/session/file-session-service.ts +1 -1
  243. package/src/session/index.ts +6 -27
  244. package/src/session/persistence-service.ts +119 -504
  245. package/src/session/session-manifest-store.ts +158 -0
  246. package/src/session/session-row.ts +199 -0
  247. package/src/session/session-service.ts +17 -376
  248. package/src/session/session-team-coordination.ts +1 -1
  249. package/src/session/subagent-session-manager.ts +397 -0
  250. package/src/session/team-persistence-store.ts +176 -0
  251. package/src/transports/hub.ts +656 -0
  252. package/src/transports/local.ts +135 -40
  253. package/src/transports/remote.ts +26 -0
  254. package/src/transports/runtime-host-support.ts +63 -9
  255. package/src/types/chat-schema.ts +4 -5
  256. package/src/types/config.ts +8 -7
  257. package/src/types/provider-settings.ts +11 -7
  258. package/src/types/session.ts +2 -4
  259. package/src/types.ts +27 -1
  260. package/dist/hooks/persistent.d.ts +0 -64
  261. package/dist/hooks/persistent.d.ts.map +0 -1
  262. package/dist/runtime/rpc-runtime-ensure.d.ts +0 -65
  263. package/dist/runtime/rpc-runtime-ensure.d.ts.map +0 -1
  264. package/dist/runtime/rpc-spawn-lease.d.ts +0 -8
  265. package/dist/runtime/rpc-spawn-lease.d.ts.map +0 -1
  266. package/dist/session/rpc-session-service.d.ts +0 -16
  267. package/dist/session/rpc-session-service.d.ts.map +0 -1
  268. package/dist/session/sqlite-rpc-session-backend.d.ts +0 -31
  269. package/dist/session/sqlite-rpc-session-backend.d.ts.map +0 -1
  270. package/dist/transports/rpc.d.ts +0 -51
  271. package/dist/transports/rpc.d.ts.map +0 -1
  272. package/src/ClineCore.test.ts +0 -226
  273. package/src/account/cline-account-service.test.ts +0 -185
  274. package/src/account/featurebase-token.test.ts +0 -175
  275. package/src/account/rpc.test.ts +0 -63
  276. package/src/auth/bounded-ttl-cache.test.ts +0 -38
  277. package/src/auth/client.test.ts +0 -69
  278. package/src/auth/cline.test.ts +0 -267
  279. package/src/auth/codex.test.ts +0 -170
  280. package/src/auth/oca.test.ts +0 -340
  281. package/src/auth/server.test.ts +0 -287
  282. package/src/auth/utils.test.ts +0 -128
  283. package/src/extensions/config/agent-config-loader.test.ts +0 -236
  284. package/src/extensions/config/hooks-config-loader.test.ts +0 -20
  285. package/src/extensions/config/runtime-commands.test.ts +0 -115
  286. package/src/extensions/config/unified-config-file-watcher.test.ts +0 -196
  287. package/src/extensions/config/user-instruction-config-loader.test.ts +0 -246
  288. package/src/extensions/context/compaction.test.ts +0 -483
  289. package/src/extensions/mcp/config-loader.test.ts +0 -238
  290. package/src/extensions/mcp/manager.test.ts +0 -105
  291. package/src/extensions/plugin/plugin-config-loader.test.ts +0 -184
  292. package/src/extensions/plugin/plugin-loader.test.ts +0 -292
  293. package/src/extensions/plugin/plugin-sandbox.test.ts +0 -423
  294. package/src/extensions/tools/definitions.test.ts +0 -780
  295. package/src/extensions/tools/executors/bash.test.ts +0 -87
  296. package/src/extensions/tools/executors/editor.test.ts +0 -35
  297. package/src/extensions/tools/executors/file-read.test.ts +0 -125
  298. package/src/extensions/tools/model-tool-routing.test.ts +0 -86
  299. package/src/extensions/tools/presets.test.ts +0 -70
  300. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +0 -455
  301. package/src/extensions/tools/team/spawn-agent-tool.test.ts +0 -381
  302. package/src/extensions/tools/team/team-tools.test.ts +0 -918
  303. package/src/hooks/checkpoint-hooks.test.ts +0 -168
  304. package/src/hooks/hook-file-hooks.test.ts +0 -311
  305. package/src/hooks/persistent.ts +0 -661
  306. package/src/runtime/history.test.ts +0 -114
  307. package/src/runtime/host.test.ts +0 -230
  308. package/src/runtime/rpc-runtime-ensure.test.ts +0 -123
  309. package/src/runtime/rpc-runtime-ensure.ts +0 -659
  310. package/src/runtime/rpc-spawn-lease.test.ts +0 -81
  311. package/src/runtime/rpc-spawn-lease.ts +0 -156
  312. package/src/runtime/runtime-builder.team-persistence.test.ts +0 -245
  313. package/src/runtime/runtime-builder.test.ts +0 -615
  314. package/src/runtime/runtime-oauth-token-manager.test.ts +0 -137
  315. package/src/runtime/runtime-parity.test.ts +0 -143
  316. package/src/services/providers/local-provider-service.test.ts +0 -1062
  317. package/src/services/session-data.test.ts +0 -160
  318. package/src/services/storage/provider-settings-legacy-migration.test.ts +0 -424
  319. package/src/services/storage/provider-settings-manager.test.ts +0 -191
  320. package/src/services/telemetry/OpenTelemetryAdapter.test.ts +0 -157
  321. package/src/services/telemetry/OpenTelemetryProvider.test.ts +0 -326
  322. package/src/services/telemetry/TelemetryLoggerSink.test.ts +0 -42
  323. package/src/services/telemetry/TelemetryService.test.ts +0 -134
  324. package/src/services/telemetry/distinct-id.test.ts +0 -57
  325. package/src/services/workspace/file-indexer.d.ts +0 -11
  326. package/src/services/workspace/file-indexer.test.ts +0 -156
  327. package/src/services/workspace/mention-enricher.test.ts +0 -106
  328. package/src/session/persistence-service.test.ts +0 -300
  329. package/src/session/rpc-session-service.ts +0 -114
  330. package/src/session/session-service.team-persistence.test.ts +0 -48
  331. package/src/session/sqlite-rpc-session-backend.ts +0 -301
  332. package/src/transports/local.e2e.test.ts +0 -380
  333. package/src/transports/local.test.ts +0 -2559
  334. package/src/transports/rpc.test.ts +0 -82
  335. package/src/transports/rpc.ts +0 -665
@@ -1,455 +0,0 @@
1
- import type { AgentEvent } from "@clinebot/shared";
2
- import { describe, expect, it, vi } from "vitest";
3
- import {
4
- AgentTeamsRuntime,
5
- type TeamEvent,
6
- TeamMessageType,
7
- } from "./multi-agent";
8
-
9
- const { createAgentMock } = vi.hoisted(() => ({
10
- createAgentMock: vi.fn(),
11
- }));
12
-
13
- vi.mock("@clinebot/agents", async () => {
14
- const actual =
15
- await vi.importActual<typeof import("@clinebot/agents")>(
16
- "@clinebot/agents",
17
- );
18
-
19
- return {
20
- ...actual,
21
- createAgent: createAgentMock,
22
- };
23
- });
24
-
25
- describe("AgentTeamsRuntime teammate lifecycle events", () => {
26
- it("spawns teammates with a 10 minute API timeout", () => {
27
- createAgentMock.mockReturnValueOnce({
28
- abort: vi.fn(),
29
- run: vi.fn(),
30
- continue: vi.fn(),
31
- canStartRun: vi.fn(() => true),
32
- getAgentId: vi.fn(() => "teammate-1"),
33
- getConversationId: vi.fn(() => "conv-1"),
34
- getMessages: vi.fn(() => []),
35
- });
36
- const runtime = new AgentTeamsRuntime({
37
- teamName: "test-team",
38
- });
39
-
40
- runtime.spawnTeammate({
41
- agentId: "python-poet",
42
- config: {
43
- providerId: "anthropic",
44
- modelId: "claude-sonnet-4-5-20250929",
45
- systemPrompt: "Write concise Python-focused haiku",
46
- tools: [],
47
- },
48
- });
49
-
50
- expect(createAgentMock).toHaveBeenCalledWith(
51
- expect.objectContaining({
52
- apiTimeoutMs: 10 * 60 * 1000,
53
- }),
54
- );
55
- });
56
-
57
- it("does not emit task_start when teammate is already busy", async () => {
58
- const events: TeamEvent[] = [];
59
- createAgentMock.mockReturnValueOnce({
60
- abort: vi.fn(),
61
- run: vi.fn(),
62
- continue: vi.fn(),
63
- canStartRun: vi.fn(() => false),
64
- getAgentId: vi.fn(() => "teammate-1"),
65
- getConversationId: vi.fn(() => "conv-1"),
66
- getMessages: vi.fn(() => []),
67
- });
68
- const runtime = new AgentTeamsRuntime({
69
- teamName: "test-team",
70
- onTeamEvent: (event) => events.push(event),
71
- });
72
-
73
- runtime.spawnTeammate({
74
- agentId: "python-poet",
75
- config: {
76
- providerId: "anthropic",
77
- modelId: "claude-sonnet-4-5-20250929",
78
- systemPrompt: "Write concise Python-focused haiku",
79
- maxIterations: 7,
80
- tools: [],
81
- },
82
- });
83
-
84
- await expect(
85
- runtime.routeToTeammate("python-poet", "write something"),
86
- ).rejects.toThrow(
87
- "Cannot start a new run while another run is already in progress",
88
- );
89
- expect(
90
- events.some((event) => event.type === TeamMessageType.TaskStart),
91
- ).toBe(false);
92
- });
93
-
94
- it("emits teammate_spawned with lifecycle payload", () => {
95
- const events: TeamEvent[] = [];
96
- createAgentMock.mockReturnValueOnce({
97
- abort: vi.fn(),
98
- run: vi.fn(),
99
- continue: vi.fn(),
100
- canStartRun: vi.fn(() => true),
101
- getAgentId: vi.fn(() => "teammate-1"),
102
- getConversationId: vi.fn(() => "conv-1"),
103
- getMessages: vi.fn(() => []),
104
- });
105
- const runtime = new AgentTeamsRuntime({
106
- teamName: "test-team",
107
- onTeamEvent: (event) => events.push(event),
108
- });
109
-
110
- runtime.spawnTeammate({
111
- agentId: "python-poet",
112
- config: {
113
- providerId: "anthropic",
114
- modelId: "claude-sonnet-4-5-20250929",
115
- systemPrompt: "Write concise Python-focused haiku",
116
- maxIterations: 7,
117
- tools: [],
118
- },
119
- });
120
-
121
- expect(events).toContainEqual({
122
- type: TeamMessageType.TeammateSpawned,
123
- agentId: "python-poet",
124
- role: undefined,
125
- teammate: {
126
- rolePrompt: "Write concise Python-focused haiku",
127
- modelId: "claude-sonnet-4-5-20250929",
128
- maxIterations: 7,
129
- runtimeAgentId: "teammate-1",
130
- conversationId: "conv-1",
131
- parentAgentId: null,
132
- },
133
- });
134
- });
135
-
136
- it("swallows abort-like shutdown errors from teammates", () => {
137
- const events: TeamEvent[] = [];
138
- createAgentMock.mockReturnValueOnce({
139
- abort: vi.fn(() => {
140
- throw new DOMException("This operation was aborted", "AbortError");
141
- }),
142
- run: vi.fn(),
143
- continue: vi.fn(),
144
- canStartRun: vi.fn(() => true),
145
- getAgentId: vi.fn(() => "teammate-1"),
146
- getConversationId: vi.fn(() => "conv-1"),
147
- getMessages: vi.fn(() => []),
148
- });
149
- const runtime = new AgentTeamsRuntime({
150
- teamName: "test-team",
151
- onTeamEvent: (event) => events.push(event),
152
- });
153
-
154
- runtime.spawnTeammate({
155
- agentId: "python-poet",
156
- config: {
157
- providerId: "anthropic",
158
- modelId: "claude-sonnet-4-5-20250929",
159
- systemPrompt: "Write concise Python-focused haiku",
160
- tools: [],
161
- },
162
- });
163
-
164
- expect(() =>
165
- runtime.shutdownTeammate("python-poet", "manual_restart"),
166
- ).not.toThrow();
167
- expect(runtime.getSnapshot().members).toContainEqual(
168
- expect.objectContaining({
169
- agentId: "python-poet",
170
- status: "stopped",
171
- }),
172
- );
173
- expect(events).toContainEqual({
174
- type: TeamMessageType.TeammateShutdown,
175
- agentId: "python-poet",
176
- reason: "manual_restart",
177
- });
178
- });
179
-
180
- it("prepends unread mailbox notification to teammate message", async () => {
181
- let routedMessage: string | undefined;
182
- createAgentMock.mockReturnValueOnce({
183
- abort: vi.fn(),
184
- run: vi.fn(async (message) => {
185
- routedMessage = message;
186
- return {
187
- text: "Task completed",
188
- iterations: 1,
189
- finishReason: "end_turn",
190
- durationMs: 100,
191
- usage: {
192
- inputTokens: 10,
193
- outputTokens: 20,
194
- cacheReadTokens: 0,
195
- cacheWriteTokens: 0,
196
- totalCost: 0,
197
- },
198
- messages: [],
199
- };
200
- }),
201
- continue: vi.fn(),
202
- canStartRun: vi.fn(() => true),
203
- getAgentId: vi.fn(() => "teammate-1"),
204
- getConversationId: vi.fn(() => "conv-1"),
205
- getMessages: vi.fn(() => []),
206
- });
207
- const runtime = new AgentTeamsRuntime({
208
- teamName: "test-team",
209
- });
210
-
211
- runtime.spawnTeammate({
212
- agentId: "alice",
213
- config: {
214
- providerId: "anthropic",
215
- modelId: "claude-sonnet-4-5-20250929",
216
- systemPrompt: "Helper teammate",
217
- tools: [],
218
- },
219
- });
220
-
221
- // Send message from lead to alice
222
- runtime.sendMessage(
223
- "lead",
224
- "alice",
225
- "Status check",
226
- "How is your work going?",
227
- );
228
-
229
- // Route task to alice
230
- await runtime.routeToTeammate("alice", "Complete your task");
231
-
232
- // Verify the routed message includes mailbox notification
233
- expect(routedMessage).toBeDefined();
234
- expect(routedMessage).toContain("[MAILBOX]");
235
- expect(routedMessage).toContain("You have 1 unread message(s)");
236
- expect(routedMessage).toContain(
237
- "Message from lead | subject: Status check",
238
- );
239
- expect(routedMessage).toContain("How is your work going?");
240
- expect(routedMessage).toContain("Complete your task");
241
-
242
- // Verify message is marked as read
243
- const unreadAfter = runtime.listMailbox("alice", { unreadOnly: true });
244
- expect(unreadAfter).toHaveLength(0);
245
- });
246
-
247
- it("does not prepend notification when no unread mail", async () => {
248
- let routedMessage: string | undefined;
249
- createAgentMock.mockReturnValueOnce({
250
- abort: vi.fn(),
251
- run: vi.fn(async (message) => {
252
- routedMessage = message;
253
- return {
254
- text: "Task completed",
255
- iterations: 1,
256
- finishReason: "end_turn",
257
- durationMs: 100,
258
- usage: {
259
- inputTokens: 10,
260
- outputTokens: 20,
261
- cacheReadTokens: 0,
262
- cacheWriteTokens: 0,
263
- totalCost: 0,
264
- },
265
- messages: [],
266
- };
267
- }),
268
- continue: vi.fn(),
269
- canStartRun: vi.fn(() => true),
270
- getAgentId: vi.fn(() => "teammate-1"),
271
- getConversationId: vi.fn(() => "conv-1"),
272
- getMessages: vi.fn(() => []),
273
- });
274
- const runtime = new AgentTeamsRuntime({
275
- teamName: "test-team",
276
- });
277
-
278
- runtime.spawnTeammate({
279
- agentId: "bob",
280
- config: {
281
- providerId: "anthropic",
282
- modelId: "claude-sonnet-4-5-20250929",
283
- systemPrompt: "Helper teammate",
284
- tools: [],
285
- },
286
- });
287
-
288
- // Route task to bob with no prior messages
289
- await runtime.routeToTeammate("bob", "Complete your task");
290
-
291
- // Verify the routed message does not contain mailbox notification
292
- expect(routedMessage).toBeDefined();
293
- expect(routedMessage).toBe("Complete your task");
294
- expect(routedMessage).not.toContain("[MAILBOX]");
295
- });
296
-
297
- it("queues steer message notification when recipient is running", () => {
298
- let consumePendingMessage: (() => string | undefined) | undefined;
299
- createAgentMock.mockImplementationOnce((config) => {
300
- consumePendingMessage = config.consumePendingUserMessage;
301
- return {
302
- abort: vi.fn(),
303
- run: vi.fn(),
304
- continue: vi.fn(),
305
- canStartRun: vi.fn(() => true),
306
- getAgentId: vi.fn(() => "teammate-1"),
307
- getConversationId: vi.fn(() => "conv-1"),
308
- getMessages: vi.fn(() => []),
309
- };
310
- });
311
- const runtime = new AgentTeamsRuntime({
312
- teamName: "test-team",
313
- });
314
-
315
- runtime.spawnTeammate({
316
- agentId: "charlie",
317
- config: {
318
- providerId: "anthropic",
319
- modelId: "claude-sonnet-4-5-20250929",
320
- systemPrompt: "Helper teammate",
321
- tools: [],
322
- },
323
- });
324
-
325
- // Simulate teammate is running by incrementing runningCount
326
- const runtimeMembers = (
327
- runtime as unknown as { members: Map<string, { runningCount: number }> }
328
- ).members;
329
- const member = runtimeMembers.get("charlie");
330
- if (member) {
331
- member.runningCount = 1;
332
- }
333
-
334
- // Send message from lead while charlie is running
335
- runtime.sendMessage("lead", "charlie", "urgent update", "Fix the bug now!");
336
-
337
- // Verify steer message is queued
338
- expect(consumePendingMessage).toBeDefined();
339
- const steerMsg = consumePendingMessage?.();
340
- expect(steerMsg).toBeDefined();
341
- expect(steerMsg).toContain("[MAILBOX]");
342
- expect(steerMsg).toContain("lead");
343
- expect(steerMsg).toContain("urgent update");
344
- expect(steerMsg).toContain("team_read_mailbox");
345
-
346
- // Verify consuming again returns undefined
347
- expect(consumePendingMessage?.()).toBeUndefined();
348
- });
349
-
350
- it("does not queue steer message when recipient is idle", () => {
351
- let consumePendingMessage: (() => string | undefined) | undefined;
352
- createAgentMock.mockImplementationOnce((config) => {
353
- consumePendingMessage = config.consumePendingUserMessage;
354
- return {
355
- abort: vi.fn(),
356
- run: vi.fn(),
357
- continue: vi.fn(),
358
- canStartRun: vi.fn(() => true),
359
- getAgentId: vi.fn(() => "teammate-1"),
360
- getConversationId: vi.fn(() => "conv-1"),
361
- getMessages: vi.fn(() => []),
362
- };
363
- });
364
- const runtime = new AgentTeamsRuntime({
365
- teamName: "test-team",
366
- });
367
-
368
- runtime.spawnTeammate({
369
- agentId: "diana",
370
- config: {
371
- providerId: "anthropic",
372
- modelId: "claude-sonnet-4-5-20250929",
373
- systemPrompt: "Helper teammate",
374
- tools: [],
375
- },
376
- });
377
-
378
- // Send message from lead while diana is idle (runningCount = 0)
379
- runtime.sendMessage("lead", "diana", "hello", "Hi there");
380
-
381
- // Verify no steer message is queued
382
- expect(consumePendingMessage?.()).toBeUndefined();
383
-
384
- // Message should still be in mailbox for next route
385
- const mailbox = runtime.listMailbox("diana", { unreadOnly: true });
386
- expect(mailbox).toHaveLength(1);
387
- expect(mailbox[0].subject).toBe("hello");
388
- });
389
-
390
- it("includes tool and run error details in run_progress activity", async () => {
391
- const events: TeamEvent[] = [];
392
- let wrappedOnEvent: ((event: AgentEvent) => void) | undefined;
393
- createAgentMock.mockImplementationOnce((config) => {
394
- wrappedOnEvent = config.onEvent;
395
- return {
396
- abort: vi.fn(),
397
- run: vi.fn(async () => {
398
- wrappedOnEvent?.({
399
- type: "content_end",
400
- contentType: "tool",
401
- toolName: "team_mission_log",
402
- error: "RPC backend returned 500 while appending mission log",
403
- });
404
- wrappedOnEvent?.({
405
- type: "error",
406
- error: new Error("API request timed out after 120000ms"),
407
- recoverable: false,
408
- iteration: 11,
409
- });
410
- throw new Error("API request timed out after 120000ms");
411
- }),
412
- continue: vi.fn(),
413
- canStartRun: vi.fn(() => true),
414
- getAgentId: vi.fn(() => "teammate-1"),
415
- getConversationId: vi.fn(() => "conv-1"),
416
- getMessages: vi.fn(() => []),
417
- };
418
- });
419
- const runtime = new AgentTeamsRuntime({
420
- teamName: "test-team",
421
- onTeamEvent: (event) => events.push(event),
422
- });
423
-
424
- runtime.spawnTeammate({
425
- agentId: "providers-investigator",
426
- config: {
427
- providerId: "anthropic",
428
- modelId: "claude-sonnet-4-5-20250929",
429
- systemPrompt: "Investigate providers thoroughly",
430
- tools: [],
431
- },
432
- });
433
-
434
- const run = runtime.startTeammateRun(
435
- "providers-investigator",
436
- "Investigate providers",
437
- );
438
- const settled = await runtime.awaitRun(run.id);
439
-
440
- expect(settled.status).toBe("failed");
441
- expect(events).toContainEqual(
442
- expect.objectContaining({
443
- type: TeamMessageType.RunProgress,
444
- message:
445
- "tool_team_mission_log_error: RPC backend returned 500 while appending mission log",
446
- }),
447
- );
448
- expect(events).toContainEqual(
449
- expect.objectContaining({
450
- type: TeamMessageType.RunProgress,
451
- message: "run_error: API request timed out after 120000ms",
452
- }),
453
- );
454
- });
455
- });