@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,381 +0,0 @@
1
- import type { AgentConfig } from "@clinebot/shared";
2
- import { beforeEach, describe, expect, it, vi } from "vitest";
3
- import { createDelegatedAgentConfigProvider } from "./delegated-agent";
4
-
5
- type AgentExtension = NonNullable<AgentConfig["extensions"]>[number];
6
-
7
- const runMock = vi.fn();
8
- const getAgentIdMock = vi.fn(() => "sub-agent-1");
9
- const getConversationIdMock = vi.fn(() => "conv-sub-1");
10
- const agentConstructorSpy = vi.fn();
11
-
12
- vi.mock("@clinebot/agents", async () => {
13
- const actual =
14
- await vi.importActual<typeof import("@clinebot/agents")>(
15
- "@clinebot/agents",
16
- );
17
-
18
- return {
19
- ...actual,
20
- Agent: class MockAgent {
21
- constructor(config: unknown) {
22
- agentConstructorSpy(config);
23
- }
24
-
25
- getAgentId(): string {
26
- return getAgentIdMock();
27
- }
28
-
29
- getConversationId(): string {
30
- return getConversationIdMock();
31
- }
32
-
33
- async run(input: string): Promise<unknown> {
34
- return runMock(input);
35
- }
36
- },
37
- };
38
- });
39
-
40
- describe("createSpawnAgentTool", () => {
41
- beforeEach(() => {
42
- vi.clearAllMocks();
43
- });
44
-
45
- it("creates a sub-agent, forwards callbacks, and returns normalized output", async () => {
46
- const { createSpawnAgentTool } = await import("./spawn-agent-tool.js");
47
- runMock.mockResolvedValue({
48
- text: "sub-agent result",
49
- iterations: 2,
50
- finishReason: "completed",
51
- usage: { inputTokens: 11, outputTokens: 7 },
52
- });
53
-
54
- const onSubAgentStart = vi.fn();
55
- const onSubAgentEnd = vi.fn();
56
- const createSubAgentTools = vi.fn().mockResolvedValue([]);
57
- const extensions = [
58
- {
59
- name: "sample-ext",
60
- manifest: { capabilities: ["hooks"], hookStages: ["runtime_event"] },
61
- onRuntimeEvent: vi.fn(),
62
- } as AgentExtension,
63
- ];
64
-
65
- const tool = createSpawnAgentTool({
66
- configProvider: createDelegatedAgentConfigProvider({
67
- providerId: "anthropic",
68
- modelId: "mock-model",
69
- extensions,
70
- }),
71
- defaultMaxIterations: 4,
72
- createSubAgentTools,
73
- onSubAgentStart,
74
- onSubAgentEnd,
75
- });
76
-
77
- const output = await tool.execute(
78
- {
79
- systemPrompt: "You are focused",
80
- task: "Do delegated work",
81
- },
82
- {
83
- agentId: "parent-1",
84
- conversationId: "conv-parent",
85
- iteration: 3,
86
- },
87
- );
88
-
89
- expect(createSubAgentTools).toHaveBeenCalledTimes(1);
90
- expect(runMock).toHaveBeenCalledWith("Do delegated work");
91
- expect(onSubAgentStart).toHaveBeenCalledTimes(1);
92
- expect(onSubAgentEnd).toHaveBeenCalledTimes(1);
93
- expect(output).toEqual({
94
- text: "sub-agent result",
95
- iterations: 2,
96
- finishReason: "completed",
97
- usage: {
98
- inputTokens: 11,
99
- outputTokens: 7,
100
- },
101
- });
102
- expect(agentConstructorSpy).toHaveBeenCalledWith(
103
- expect.objectContaining({
104
- parentAgentId: "parent-1",
105
- maxIterations: 4,
106
- extensions,
107
- }),
108
- );
109
- expect(agentConstructorSpy).toHaveBeenCalledWith(
110
- expect.not.objectContaining({
111
- prepareTurn: expect.anything(),
112
- }),
113
- );
114
- });
115
-
116
- it("passes extension hooks through delegated config", async () => {
117
- const { createSpawnAgentTool } = await import("./spawn-agent-tool.js");
118
- runMock.mockResolvedValue({
119
- text: "sub-agent result",
120
- iterations: 1,
121
- finishReason: "completed",
122
- usage: { inputTokens: 1, outputTokens: 1 },
123
- });
124
-
125
- const extensions = [
126
- {
127
- name: "before-start-ext",
128
- manifest: {
129
- capabilities: ["hooks"],
130
- hookStages: ["before_agent_start"],
131
- },
132
- onBeforeAgentStart: vi.fn(),
133
- } as AgentExtension,
134
- ];
135
-
136
- const tool = createSpawnAgentTool({
137
- configProvider: createDelegatedAgentConfigProvider({
138
- providerId: "anthropic",
139
- modelId: "mock-model",
140
- extensions,
141
- }),
142
- subAgentTools: [],
143
- });
144
-
145
- await tool.execute(
146
- {
147
- systemPrompt: "You are focused",
148
- task: "Do delegated work",
149
- },
150
- {
151
- agentId: "parent-1",
152
- conversationId: "conv-parent",
153
- iteration: 3,
154
- },
155
- );
156
-
157
- expect(agentConstructorSpy).toHaveBeenCalledWith(
158
- expect.objectContaining({
159
- extensions,
160
- }),
161
- );
162
- });
163
-
164
- it("propagates sub-agent errors and still reports onSubAgentEnd", async () => {
165
- const { createSpawnAgentTool } = await import("./spawn-agent-tool.js");
166
- runMock.mockRejectedValue(new Error("sub-agent failed"));
167
- const onSubAgentEnd = vi.fn();
168
-
169
- const tool = createSpawnAgentTool({
170
- configProvider: createDelegatedAgentConfigProvider({
171
- providerId: "anthropic",
172
- modelId: "mock-model",
173
- }),
174
- subAgentTools: [],
175
- onSubAgentEnd,
176
- });
177
-
178
- await expect(
179
- tool.execute(
180
- {
181
- systemPrompt: "System",
182
- task: "Fail task",
183
- },
184
- {
185
- agentId: "parent-2",
186
- conversationId: "conv-parent",
187
- iteration: 1,
188
- },
189
- ),
190
- ).rejects.toThrow("sub-agent failed");
191
-
192
- expect(onSubAgentEnd).toHaveBeenCalledTimes(1);
193
- expect(onSubAgentEnd).toHaveBeenCalledWith(
194
- expect.objectContaining({
195
- parentAgentId: "parent-2",
196
- error: expect.any(Error),
197
- }),
198
- );
199
- });
200
-
201
- it("leaves maxIterations unset when neither input nor default is provided", async () => {
202
- const { createSpawnAgentTool } = await import("./spawn-agent-tool.js");
203
- runMock.mockResolvedValue({
204
- text: "sub-agent result",
205
- iterations: 1,
206
- finishReason: "completed",
207
- usage: { inputTokens: 1, outputTokens: 1 },
208
- });
209
-
210
- const tool = createSpawnAgentTool({
211
- configProvider: createDelegatedAgentConfigProvider({
212
- providerId: "anthropic",
213
- modelId: "mock-model",
214
- }),
215
- subAgentTools: [],
216
- });
217
-
218
- await tool.execute(
219
- {
220
- systemPrompt: "System",
221
- task: "Do task",
222
- },
223
- {
224
- agentId: "parent-3",
225
- conversationId: "conv-parent",
226
- iteration: 1,
227
- },
228
- );
229
-
230
- expect(agentConstructorSpy).toHaveBeenCalledWith(
231
- expect.objectContaining({
232
- maxIterations: undefined,
233
- }),
234
- );
235
- });
236
-
237
- it("appends workspace metadata for cline sub-agents when missing", async () => {
238
- const { createSpawnAgentTool } = await import("./spawn-agent-tool.js");
239
- runMock.mockResolvedValue({
240
- text: "ok",
241
- iterations: 1,
242
- finishReason: "completed",
243
- usage: { inputTokens: 1, outputTokens: 1 },
244
- });
245
-
246
- const workspaceMetadata = `# Workspace Configuration
247
- {
248
- "workspaces": {
249
- "/repo/demo": {
250
- "hint": "demo"
251
- }
252
- }
253
- }`;
254
-
255
- const tool = createSpawnAgentTool({
256
- configProvider: createDelegatedAgentConfigProvider({
257
- providerId: "cline",
258
- modelId: "anthropic/claude-sonnet-4.6",
259
- cwd: "/repo/demo",
260
- workspaceMetadata,
261
- }),
262
- subAgentTools: [],
263
- });
264
-
265
- await tool.execute(
266
- {
267
- systemPrompt: "You are a specialist teammate.",
268
- task: "Investigate module boundaries",
269
- },
270
- {
271
- agentId: "parent-4",
272
- conversationId: "conv-parent",
273
- iteration: 1,
274
- },
275
- );
276
-
277
- expect(agentConstructorSpy).toHaveBeenCalledWith(
278
- expect.objectContaining({
279
- systemPrompt: expect.stringContaining(workspaceMetadata),
280
- }),
281
- );
282
- });
283
-
284
- it("does not duplicate workspace metadata for cline sub-agents", async () => {
285
- const { createSpawnAgentTool } = await import("./spawn-agent-tool.js");
286
- runMock.mockResolvedValue({
287
- text: "ok",
288
- iterations: 1,
289
- finishReason: "completed",
290
- usage: { inputTokens: 1, outputTokens: 1 },
291
- });
292
-
293
- const inputSystemPrompt = `You are a specialist teammate.
294
-
295
- # Workspace Configuration
296
- {
297
- "workspaces": {
298
- "/repo/demo": {
299
- "hint": "demo"
300
- }
301
- }
302
- }`;
303
-
304
- const tool = createSpawnAgentTool({
305
- configProvider: createDelegatedAgentConfigProvider({
306
- providerId: "cline",
307
- modelId: "anthropic/claude-sonnet-4.6",
308
- cwd: "/repo/demo",
309
- workspaceMetadata: "# Workspace Configuration\n{}",
310
- }),
311
- subAgentTools: [],
312
- });
313
-
314
- await tool.execute(
315
- {
316
- systemPrompt: inputSystemPrompt,
317
- task: "Investigate module boundaries",
318
- },
319
- {
320
- agentId: "parent-5",
321
- conversationId: "conv-parent",
322
- iteration: 1,
323
- },
324
- );
325
-
326
- expect(agentConstructorSpy).toHaveBeenCalledWith(
327
- expect.objectContaining({
328
- systemPrompt: inputSystemPrompt,
329
- }),
330
- );
331
- });
332
-
333
- it("resolves connection settings lazily at execution time", async () => {
334
- const { createSpawnAgentTool } = await import("./spawn-agent-tool.js");
335
- runMock.mockResolvedValue({
336
- text: "ok",
337
- iterations: 1,
338
- finishReason: "completed",
339
- usage: { inputTokens: 1, outputTokens: 1 },
340
- });
341
-
342
- const configProvider = createDelegatedAgentConfigProvider({
343
- providerId: "cline",
344
- modelId: "stale-model",
345
- apiKey: "oauth-access-old",
346
- });
347
- const updateConnectionDefaults = vi.spyOn(
348
- configProvider,
349
- "updateConnectionDefaults",
350
- );
351
- configProvider.updateConnectionDefaults({
352
- apiKey: "oauth-access-new",
353
- modelId: "updated-model",
354
- });
355
-
356
- const tool = createSpawnAgentTool({
357
- configProvider,
358
- subAgentTools: [],
359
- });
360
-
361
- await tool.execute(
362
- {
363
- systemPrompt: "System",
364
- task: "Do task",
365
- },
366
- {
367
- agentId: "parent-6",
368
- conversationId: "conv-parent",
369
- iteration: 1,
370
- },
371
- );
372
-
373
- expect(updateConnectionDefaults).toHaveBeenCalledTimes(1);
374
- expect(agentConstructorSpy).toHaveBeenCalledWith(
375
- expect.objectContaining({
376
- apiKey: "oauth-access-new",
377
- modelId: "updated-model",
378
- }),
379
- );
380
- });
381
- });