@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,483 +0,0 @@
1
- import type * as LlmsProviders from "@clinebot/llms";
2
- import { beforeEach, describe, expect, it, vi } from "vitest";
3
- import { createContextCompactionPrepareTurn } from "./compaction";
4
-
5
- type FakeChunk = Record<string, unknown>;
6
-
7
- const createHandlerMock = vi.fn();
8
-
9
- vi.mock("@clinebot/llms", () => ({
10
- createHandler: (config: unknown) => createHandlerMock(config),
11
- }));
12
-
13
- async function* streamChunks(chunks: FakeChunk[]): AsyncGenerator<FakeChunk> {
14
- for (const chunk of chunks) {
15
- yield chunk;
16
- }
17
- }
18
-
19
- describe("createContextCompactionPrepareTurn", () => {
20
- beforeEach(() => {
21
- vi.clearAllMocks();
22
- });
23
-
24
- it("summarizes older messages and keeps recent messages", async () => {
25
- const emitStatusNotice = vi.fn();
26
- createHandlerMock.mockReturnValue({
27
- createMessage: vi.fn(() =>
28
- streamChunks([
29
- {
30
- type: "text",
31
- id: "summary-1",
32
- text: "## Goal\nShip the feature\n\n## Next\n- Finish it",
33
- },
34
- { type: "done", id: "summary-1", success: true },
35
- ]),
36
- ),
37
- });
38
-
39
- const prepareTurn = createContextCompactionPrepareTurn({
40
- providerId: "anthropic",
41
- modelId: "mock-model",
42
- providerConfig: {
43
- providerId: "anthropic",
44
- modelId: "mock-model",
45
- } as LlmsProviders.ProviderConfig,
46
- compaction: {
47
- enabled: true,
48
- strategy: "agentic",
49
- preserveRecentTokens: 1,
50
- reserveTokens: 5,
51
- },
52
- logger: undefined,
53
- });
54
-
55
- const result = await prepareTurn?.({
56
- agentId: "agent-1",
57
- conversationId: "conv-1",
58
- parentAgentId: null,
59
- iteration: 1,
60
- abortSignal: new AbortController().signal,
61
- emitStatusNotice,
62
- systemPrompt: "You are helpful.",
63
- tools: [],
64
- messages: [
65
- { role: "user", content: "Old turn to compact" },
66
- { role: "assistant", content: "Old answer" },
67
- { role: "user", content: "Implement the change" },
68
- {
69
- role: "assistant",
70
- content: [
71
- {
72
- type: "tool_use",
73
- id: "tool-1",
74
- name: "read_files",
75
- input: { file_paths: ["/tmp/example.ts"] },
76
- },
77
- ],
78
- },
79
- {
80
- role: "user",
81
- content: [
82
- {
83
- type: "tool_result",
84
- tool_use_id: "tool-1",
85
- content: "file contents",
86
- },
87
- ],
88
- },
89
- { role: "assistant", content: "Recent assistant state" },
90
- ],
91
- apiMessages: [
92
- { role: "user", content: "Old turn to compact" },
93
- { role: "assistant", content: "Old answer" },
94
- { role: "user", content: "Implement the change" },
95
- {
96
- role: "assistant",
97
- content: [
98
- {
99
- type: "tool_use",
100
- id: "tool-1",
101
- name: "read_files",
102
- input: { file_paths: ["/tmp/example.ts"] },
103
- },
104
- ],
105
- },
106
- {
107
- role: "user",
108
- content: [
109
- {
110
- type: "tool_result",
111
- tool_use_id: "tool-1",
112
- content: "file contents",
113
- },
114
- ],
115
- },
116
- { role: "assistant", content: "Recent assistant state" },
117
- ],
118
- model: {
119
- id: "mock-model",
120
- provider: "anthropic",
121
- info: { id: "mock-model", contextWindow: 10 },
122
- },
123
- });
124
-
125
- expect(createHandlerMock).toHaveBeenCalledTimes(1);
126
- expect(emitStatusNotice).toHaveBeenCalledWith(
127
- "auto-compacting",
128
- expect.objectContaining({
129
- kind: "auto_compaction",
130
- reason: "auto_compaction",
131
- iteration: 1,
132
- }),
133
- );
134
- expect(result?.messages).toHaveLength(5);
135
- expect(result?.messages[0]).toMatchObject({
136
- role: "user",
137
- metadata: expect.objectContaining({
138
- kind: "compaction_summary",
139
- details: {
140
- readFiles: [],
141
- modifiedFiles: [],
142
- },
143
- }),
144
- });
145
- expect(typeof result?.messages[0]?.content).toBe("string");
146
- const summaryContent = result?.messages[0]?.content as string;
147
- expect(summaryContent).toContain("Context summary:");
148
- expect(summaryContent).toContain("## Files");
149
- expect(result?.messages[1]).toEqual({
150
- role: "user",
151
- content: "Implement the change",
152
- });
153
- expect(result?.messages[4]).toEqual({
154
- role: "assistant",
155
- content: "Recent assistant state",
156
- });
157
- });
158
-
159
- it("uses the configured summarizer model for compaction", async () => {
160
- createHandlerMock.mockReturnValue({
161
- createMessage: vi.fn(() =>
162
- streamChunks([
163
- { type: "text", id: "summary-3", text: "## Goal\nSummarized" },
164
- { type: "done", id: "summary-3", success: true },
165
- ]),
166
- ),
167
- });
168
-
169
- const prepareTurn = createContextCompactionPrepareTurn({
170
- providerId: "anthropic",
171
- modelId: "primary-model",
172
- providerConfig: {
173
- providerId: "anthropic",
174
- modelId: "primary-model",
175
- } as LlmsProviders.ProviderConfig,
176
- compaction: {
177
- enabled: true,
178
- strategy: "agentic",
179
- preserveRecentTokens: 1,
180
- reserveTokens: 5,
181
- summarizer: {
182
- providerId: "openai",
183
- modelId: "gpt-summary",
184
- maxOutputTokens: 512,
185
- },
186
- },
187
- logger: undefined,
188
- });
189
-
190
- await prepareTurn?.({
191
- agentId: "agent-1",
192
- conversationId: "conv-1",
193
- parentAgentId: null,
194
- iteration: 1,
195
- abortSignal: new AbortController().signal,
196
- systemPrompt: "You are helpful.",
197
- tools: [],
198
- messages: [
199
- { role: "user", content: "Old turn" },
200
- { role: "assistant", content: "Old answer" },
201
- { role: "user", content: "Latest turn" },
202
- { role: "assistant", content: "Latest answer" },
203
- ],
204
- apiMessages: [
205
- { role: "user", content: "Old turn" },
206
- { role: "assistant", content: "Old answer" },
207
- { role: "user", content: "Latest turn" },
208
- { role: "assistant", content: "Latest answer" },
209
- ],
210
- model: {
211
- id: "primary-model",
212
- provider: "anthropic",
213
- info: { id: "primary-model", contextWindow: 10 },
214
- },
215
- });
216
-
217
- expect(createHandlerMock).toHaveBeenCalledWith(
218
- expect.objectContaining({
219
- providerId: "openai",
220
- modelId: "gpt-summary",
221
- maxOutputTokens: 512,
222
- thinking: false,
223
- }),
224
- );
225
- });
226
-
227
- it("uses basic compaction without calling the summarizer", async () => {
228
- const emitStatusNotice = vi.fn();
229
- const prepareTurn = createContextCompactionPrepareTurn({
230
- providerId: "anthropic",
231
- modelId: "mock-model",
232
- providerConfig: {
233
- providerId: "anthropic",
234
- modelId: "mock-model",
235
- } as LlmsProviders.ProviderConfig,
236
- compaction: {
237
- enabled: true,
238
- strategy: "basic",
239
- reserveTokens: 5,
240
- },
241
- logger: undefined,
242
- });
243
-
244
- const result = await prepareTurn?.({
245
- agentId: "agent-1",
246
- conversationId: "conv-1",
247
- parentAgentId: null,
248
- iteration: 1,
249
- abortSignal: new AbortController().signal,
250
- emitStatusNotice,
251
- systemPrompt: "You are helpful.",
252
- tools: [],
253
- messages: [
254
- { role: "user", content: "Initial request that should survive" },
255
- {
256
- role: "assistant",
257
- content: [
258
- { type: "thinking", thinking: "internal reasoning" },
259
- { type: "text", text: "Older assistant explanation" },
260
- {
261
- type: "tool_use",
262
- id: "tool-1",
263
- name: "read_files",
264
- input: { file_paths: ["/tmp/example.ts"] },
265
- },
266
- ],
267
- },
268
- {
269
- role: "user",
270
- content: [
271
- {
272
- type: "tool_result",
273
- tool_use_id: "tool-1",
274
- content: "tool output that should be removed",
275
- },
276
- ],
277
- },
278
- {
279
- role: "user",
280
- content: [
281
- { type: "text", text: "Most recent user turn" },
282
- {
283
- type: "image",
284
- data: "abc",
285
- mediaType: "image/png",
286
- },
287
- ],
288
- },
289
- {
290
- role: "assistant",
291
- content: [
292
- { type: "text", text: "Most recent assistant reply" },
293
- {
294
- type: "file",
295
- path: "/tmp/out.ts",
296
- content: "export const value = 1;",
297
- },
298
- ],
299
- },
300
- ],
301
- apiMessages: [
302
- { role: "user", content: "Initial request that should survive" },
303
- {
304
- role: "assistant",
305
- content: [
306
- { type: "thinking", thinking: "internal reasoning" },
307
- { type: "text", text: "Older assistant explanation" },
308
- {
309
- type: "tool_use",
310
- id: "tool-1",
311
- name: "read_files",
312
- input: { file_paths: ["/tmp/example.ts"] },
313
- },
314
- ],
315
- },
316
- {
317
- role: "user",
318
- content: [
319
- {
320
- type: "tool_result",
321
- tool_use_id: "tool-1",
322
- content: "tool output that should be removed",
323
- },
324
- ],
325
- },
326
- {
327
- role: "user",
328
- content: [
329
- { type: "text", text: "Most recent user turn" },
330
- {
331
- type: "image",
332
- data: "abc",
333
- mediaType: "image/png",
334
- },
335
- ],
336
- },
337
- {
338
- role: "assistant",
339
- content: [
340
- { type: "text", text: "Most recent assistant reply" },
341
- {
342
- type: "file",
343
- path: "/tmp/out.ts",
344
- content: "export const value = 1;",
345
- },
346
- ],
347
- },
348
- ],
349
- model: {
350
- id: "mock-model",
351
- provider: "anthropic",
352
- info: { id: "mock-model", contextWindow: 10 },
353
- },
354
- });
355
-
356
- expect(createHandlerMock).not.toHaveBeenCalled();
357
- expect(emitStatusNotice).toHaveBeenCalledWith(
358
- "auto-compacting",
359
- expect.objectContaining({
360
- kind: "auto_compaction",
361
- reason: "auto_compaction",
362
- }),
363
- );
364
- expect(result?.messages).toBeDefined();
365
- expect(result?.messages.length).toBeGreaterThan(0);
366
- // Compacted messages should not contain tool_result content that was pruned.
367
- for (const message of result?.messages ?? []) {
368
- if (typeof message.content === "string") {
369
- expect(message.content).not.toContain(
370
- "tool output that should be removed",
371
- );
372
- } else {
373
- for (const block of message.content) {
374
- if (block.type === "text") {
375
- expect(block.text).not.toContain(
376
- "tool output that should be removed",
377
- );
378
- }
379
- }
380
- }
381
- }
382
- });
383
-
384
- it("defaults to threshold ratio when reserveTokens is not configured", async () => {
385
- const prepareTurn = createContextCompactionPrepareTurn({
386
- providerId: "anthropic",
387
- modelId: "mock-model",
388
- providerConfig: {
389
- providerId: "anthropic",
390
- modelId: "mock-model",
391
- } as LlmsProviders.ProviderConfig,
392
- compaction: { enabled: true },
393
- logger: undefined,
394
- });
395
-
396
- const result = await prepareTurn?.({
397
- agentId: "agent-1",
398
- conversationId: "conv-1",
399
- parentAgentId: null,
400
- iteration: 1,
401
- abortSignal: new AbortController().signal,
402
- systemPrompt: "You are helpful.",
403
- tools: [],
404
- messages: [
405
- { role: "user", content: "Short request" },
406
- { role: "assistant", content: "Short reply" },
407
- ],
408
- apiMessages: [
409
- { role: "user", content: "Short request" },
410
- { role: "assistant", content: "Short reply" },
411
- ],
412
- model: {
413
- id: "mock-model",
414
- provider: "anthropic",
415
- info: { id: "mock-model", contextWindow: 100 },
416
- },
417
- });
418
-
419
- expect(createHandlerMock).not.toHaveBeenCalled();
420
- expect(result).toBeUndefined();
421
- });
422
-
423
- it("does not compact when only pre-truncation messages exceed the threshold", async () => {
424
- const prepareTurn = createContextCompactionPrepareTurn({
425
- providerId: "anthropic",
426
- modelId: "mock-model",
427
- providerConfig: {
428
- providerId: "anthropic",
429
- modelId: "mock-model",
430
- } as LlmsProviders.ProviderConfig,
431
- compaction: {
432
- enabled: true,
433
- thresholdRatio: 0.8,
434
- },
435
- logger: undefined,
436
- });
437
- expect(prepareTurn).toBeDefined();
438
-
439
- const result = await prepareTurn?.({
440
- agentId: "agent-1",
441
- conversationId: "conv-1",
442
- parentAgentId: null,
443
- iteration: 1,
444
- abortSignal: new AbortController().signal,
445
- systemPrompt: "You are helpful.",
446
- tools: [],
447
- messages: [
448
- { role: "user", content: "Initial request" },
449
- {
450
- role: "user",
451
- content: [
452
- {
453
- type: "tool_result",
454
- tool_use_id: "tool-1",
455
- content: "x".repeat(1000),
456
- },
457
- ],
458
- },
459
- ],
460
- apiMessages: [
461
- { role: "user", content: "Initial request" },
462
- {
463
- role: "user",
464
- content: [
465
- {
466
- type: "tool_result",
467
- tool_use_id: "tool-1",
468
- content: "x".repeat(100),
469
- },
470
- ],
471
- },
472
- ],
473
- model: {
474
- id: "mock-model",
475
- provider: "anthropic",
476
- info: { id: "mock-model", contextWindow: 100 },
477
- },
478
- });
479
-
480
- expect(createHandlerMock).not.toHaveBeenCalled();
481
- expect(result).toBeUndefined();
482
- });
483
- });
@@ -1,238 +0,0 @@
1
- import { mkdtemp, rm, writeFile } from "node:fs/promises";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import { afterEach, describe, expect, it } from "vitest";
5
- import {
6
- hasMcpSettingsFile,
7
- loadMcpSettingsFile,
8
- registerMcpServersFromSettingsFile,
9
- resolveMcpServerRegistrations,
10
- } from "./config-loader";
11
-
12
- describe("mcp config loader", () => {
13
- const tempRoots: string[] = [];
14
-
15
- afterEach(async () => {
16
- await Promise.all(
17
- tempRoots.map((directory) =>
18
- rm(directory, { recursive: true, force: true }),
19
- ),
20
- );
21
- tempRoots.length = 0;
22
- });
23
-
24
- it("loads and validates mcp server registrations from JSON", async () => {
25
- const tempRoot = await mkdtemp(join(tmpdir(), "core-mcp-config-loader-"));
26
- tempRoots.push(tempRoot);
27
- const filePath = join(tempRoot, "cline_mcp_settings.json");
28
- await writeFile(
29
- filePath,
30
- JSON.stringify(
31
- {
32
- mcpServers: {
33
- docs: {
34
- transport: {
35
- type: "stdio",
36
- command: "npx",
37
- args: ["-y", "@modelcontextprotocol/server-filesystem"],
38
- },
39
- },
40
- search: {
41
- transport: {
42
- type: "streamableHttp",
43
- url: "https://mcp.example.com",
44
- },
45
- disabled: true,
46
- },
47
- },
48
- },
49
- null,
50
- 2,
51
- ),
52
- "utf8",
53
- );
54
-
55
- expect(hasMcpSettingsFile({ filePath })).toBe(true);
56
- expect(
57
- loadMcpSettingsFile({ filePath }).mcpServers.docs.transport.type,
58
- ).toBe("stdio");
59
-
60
- const registrations = resolveMcpServerRegistrations({ filePath });
61
- expect(registrations).toEqual([
62
- {
63
- name: "docs",
64
- transport: {
65
- type: "stdio",
66
- command: "npx",
67
- args: ["-y", "@modelcontextprotocol/server-filesystem"],
68
- },
69
- disabled: undefined,
70
- metadata: undefined,
71
- },
72
- {
73
- name: "search",
74
- transport: {
75
- type: "streamableHttp",
76
- url: "https://mcp.example.com",
77
- },
78
- disabled: true,
79
- metadata: undefined,
80
- },
81
- ]);
82
- });
83
-
84
- it("registers loaded servers with an mcp manager", async () => {
85
- const tempRoot = await mkdtemp(join(tmpdir(), "core-mcp-config-loader-"));
86
- tempRoots.push(tempRoot);
87
- const filePath = join(tempRoot, "cline_mcp_settings.json");
88
- await writeFile(
89
- filePath,
90
- JSON.stringify(
91
- {
92
- mcpServers: {
93
- docs: {
94
- transport: {
95
- type: "stdio",
96
- command: "node",
97
- },
98
- },
99
- },
100
- },
101
- null,
102
- 2,
103
- ),
104
- "utf8",
105
- );
106
-
107
- const registered: Array<{ name: string }> = [];
108
- const manager = {
109
- registerServer: async (registration: { name: string }) => {
110
- registered.push(registration);
111
- },
112
- };
113
-
114
- await registerMcpServersFromSettingsFile(manager, { filePath });
115
- expect(registered).toEqual([
116
- {
117
- name: "docs",
118
- transport: {
119
- type: "stdio",
120
- command: "node",
121
- },
122
- disabled: undefined,
123
- metadata: undefined,
124
- },
125
- ]);
126
- });
127
-
128
- it("throws a clear error for invalid config", async () => {
129
- const tempRoot = await mkdtemp(join(tmpdir(), "core-mcp-config-loader-"));
130
- tempRoots.push(tempRoot);
131
- const filePath = join(tempRoot, "cline_mcp_settings.json");
132
- await writeFile(
133
- filePath,
134
- JSON.stringify(
135
- {
136
- mcpServers: {
137
- broken: {
138
- transport: {
139
- type: "stdio",
140
- command: "",
141
- },
142
- },
143
- },
144
- },
145
- null,
146
- 2,
147
- ),
148
- "utf8",
149
- );
150
-
151
- expect(() => resolveMcpServerRegistrations({ filePath })).toThrow(
152
- "Invalid MCP settings",
153
- );
154
- });
155
-
156
- it("accepts legacy flat stdio format", async () => {
157
- const tempRoot = await mkdtemp(join(tmpdir(), "core-mcp-config-loader-"));
158
- tempRoots.push(tempRoot);
159
- const filePath = join(tempRoot, "cline_mcp_settings.json");
160
- await writeFile(
161
- filePath,
162
- JSON.stringify(
163
- {
164
- mcpServers: {
165
- docs: {
166
- command: "node",
167
- args: ["server.js"],
168
- },
169
- },
170
- },
171
- null,
172
- 2,
173
- ),
174
- "utf8",
175
- );
176
-
177
- const registrations = resolveMcpServerRegistrations({ filePath });
178
- expect(registrations).toEqual([
179
- {
180
- name: "docs",
181
- transport: {
182
- type: "stdio",
183
- command: "node",
184
- args: ["server.js"],
185
- },
186
- disabled: undefined,
187
- metadata: undefined,
188
- },
189
- ]);
190
- });
191
-
192
- it("accepts legacy flat url format and preserves explicit transportType", async () => {
193
- const tempRoot = await mkdtemp(join(tmpdir(), "core-mcp-config-loader-"));
194
- tempRoots.push(tempRoot);
195
- const filePath = join(tempRoot, "cline_mcp_settings.json");
196
- await writeFile(
197
- filePath,
198
- JSON.stringify(
199
- {
200
- mcpServers: {
201
- legacySse: {
202
- url: "https://sse.example.com",
203
- },
204
- legacyHttp: {
205
- url: "https://http.example.com",
206
- transportType: "http",
207
- },
208
- },
209
- },
210
- null,
211
- 2,
212
- ),
213
- "utf8",
214
- );
215
-
216
- const registrations = resolveMcpServerRegistrations({ filePath });
217
- expect(registrations).toEqual([
218
- {
219
- name: "legacySse",
220
- transport: {
221
- type: "sse",
222
- url: "https://sse.example.com",
223
- },
224
- disabled: undefined,
225
- metadata: undefined,
226
- },
227
- {
228
- name: "legacyHttp",
229
- transport: {
230
- type: "streamableHttp",
231
- url: "https://http.example.com",
232
- },
233
- disabled: undefined,
234
- metadata: undefined,
235
- },
236
- ]);
237
- });
238
- });