@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,615 +0,0 @@
1
- import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import type { Tool } from "@clinebot/shared";
5
- import { describe, expect, it } from "vitest";
6
- import { TelemetryService } from "../services/telemetry/TelemetryService";
7
- import type { CoreSessionConfig } from "../types/config";
8
- import { DefaultRuntimeBuilder } from "./runtime-builder";
9
-
10
- function makeSpawnTool(): Tool {
11
- return {
12
- name: "spawn_agent",
13
- description: "Spawn a subagent",
14
- inputSchema: { type: "object", properties: {}, required: [] },
15
- execute: async () => ({ ok: true }),
16
- };
17
- }
18
-
19
- function makeBaseConfig(
20
- overrides: Partial<CoreSessionConfig> = {},
21
- ): CoreSessionConfig {
22
- return {
23
- providerId: "anthropic",
24
- modelId: "claude-sonnet-4-6",
25
- apiKey: "key",
26
- systemPrompt: "test",
27
- cwd: process.cwd(),
28
- enableTools: true,
29
- enableSpawnAgent: false,
30
- enableAgentTeams: false,
31
- ...overrides,
32
- };
33
- }
34
-
35
- describe("DefaultRuntimeBuilder", () => {
36
- it("includes builtin tools when enabled", async () => {
37
- const runtime = await new DefaultRuntimeBuilder().build({
38
- config: makeBaseConfig(),
39
- });
40
-
41
- const names = runtime.tools.map((tool) => tool.name);
42
- expect(names.length).toBeGreaterThan(0);
43
- expect(names).not.toContain("spawn_agent");
44
- });
45
-
46
- it("forwards runtime logger for downstream agent creation", async () => {
47
- const logger = {
48
- debug: () => {},
49
- log: () => {},
50
- };
51
- const runtime = await new DefaultRuntimeBuilder().build({
52
- config: makeBaseConfig({
53
- enableTools: false,
54
- logger,
55
- }),
56
- });
57
-
58
- expect(runtime.logger).toBe(logger);
59
- });
60
-
61
- it("forwards telemetry for downstream runtime consumers", async () => {
62
- const telemetry = new TelemetryService();
63
- const runtime = await new DefaultRuntimeBuilder().build({
64
- config: makeBaseConfig({
65
- enableTools: false,
66
- telemetry,
67
- }),
68
- });
69
-
70
- expect(runtime.telemetry).toBe(telemetry);
71
- });
72
-
73
- it("uses readonly preset in plan mode", async () => {
74
- const runtime = await new DefaultRuntimeBuilder().build({
75
- config: makeBaseConfig({
76
- mode: "plan",
77
- }),
78
- });
79
-
80
- expect(runtime.tools.map((tool) => tool.name)).not.toContain("editor");
81
- });
82
-
83
- it("uses yolo preset only when yolo mode is explicit", async () => {
84
- const runtime = await new DefaultRuntimeBuilder().build({
85
- config: makeBaseConfig({
86
- mode: "yolo",
87
- }),
88
- defaultToolExecutors: {
89
- submit: async () => "submitted",
90
- },
91
- });
92
-
93
- const names = runtime.tools.map((tool) => tool.name);
94
- expect(names).not.toContain("ask_question");
95
- expect(names).toContain("submit_and_exit");
96
- });
97
-
98
- it("does not infer yolo preset from auto-approval alone", async () => {
99
- const runtime = await new DefaultRuntimeBuilder().build({
100
- config: makeBaseConfig({
101
- mode: "act",
102
- toolPolicies: {
103
- "*": { autoApprove: true },
104
- },
105
- }),
106
- defaultToolExecutors: {
107
- submit: async () => "submitted",
108
- askQuestion: async () => "question",
109
- },
110
- });
111
-
112
- const names = runtime.tools.map((tool) => tool.name);
113
- expect(names).toContain("ask_question");
114
- expect(names).not.toContain("submit_and_exit");
115
- });
116
-
117
- it("uses yolo preset runtime defaults for spawn and teams", async () => {
118
- const runtime = await new DefaultRuntimeBuilder().build({
119
- config: {
120
- ...makeBaseConfig({
121
- enableTools: false,
122
- mode: "yolo",
123
- }),
124
- } as CoreSessionConfig,
125
- createSpawnTool: makeSpawnTool,
126
- });
127
-
128
- expect(runtime.tools.map((tool) => tool.name)).not.toContain("spawn_agent");
129
- });
130
-
131
- it("uses apply_patch instead of editor for codex/gpt model IDs in act mode", async () => {
132
- const runtime = await new DefaultRuntimeBuilder().build({
133
- config: makeBaseConfig({
134
- providerId: "openai",
135
- modelId: "openai/gpt-5.4",
136
- mode: "act",
137
- }),
138
- });
139
-
140
- const names = runtime.tools.map((tool) => tool.name);
141
- expect(names).toContain("apply_patch");
142
- expect(names).not.toContain("editor");
143
- });
144
-
145
- it("keeps editor for non-codex/non-gpt model IDs in act mode", async () => {
146
- const runtime = await new DefaultRuntimeBuilder().build({
147
- config: makeBaseConfig({
148
- mode: "act",
149
- }),
150
- });
151
-
152
- const names = runtime.tools.map((tool) => tool.name);
153
- expect(names).toContain("editor");
154
- expect(names).not.toContain("apply_patch");
155
- });
156
-
157
- it("applies custom tool routing rules from session config", async () => {
158
- const runtime = await new DefaultRuntimeBuilder().build({
159
- config: makeBaseConfig({
160
- mode: "act",
161
- toolRoutingRules: [
162
- {
163
- mode: "act",
164
- providerIdIncludes: ["anthropic"],
165
- modelIdIncludes: ["claude"],
166
- enableTools: ["apply_patch"],
167
- disableTools: ["editor"],
168
- },
169
- ],
170
- }),
171
- });
172
-
173
- const names = runtime.tools.map((tool) => tool.name);
174
- expect(names).toContain("apply_patch");
175
- expect(names).not.toContain("editor");
176
- });
177
-
178
- it("omits builtin tools when disabled", async () => {
179
- const runtime = await new DefaultRuntimeBuilder().build({
180
- config: makeBaseConfig({
181
- enableTools: false,
182
- }),
183
- });
184
-
185
- expect(runtime.tools).toEqual([]);
186
- });
187
-
188
- it("omits tools disabled by policy from the advertised runtime tool list", async () => {
189
- const runtime = await new DefaultRuntimeBuilder().build({
190
- config: makeBaseConfig({
191
- toolPolicies: {
192
- run_commands: { enabled: false },
193
- read_files: { enabled: false },
194
- },
195
- }),
196
- });
197
-
198
- const names = runtime.tools.map((tool) => tool.name);
199
- expect(names).not.toContain("run_commands");
200
- expect(names).not.toContain("read_files");
201
- expect(names).toContain("search_codebase");
202
- });
203
-
204
- it("adds spawn tool when enabled", async () => {
205
- const runtime = await new DefaultRuntimeBuilder().build({
206
- config: makeBaseConfig({
207
- enableTools: false,
208
- enableSpawnAgent: true,
209
- }),
210
- createSpawnTool: makeSpawnTool,
211
- });
212
-
213
- expect(runtime.tools.map((tool) => tool.name)).toContain("spawn_agent");
214
- });
215
-
216
- it("provides a shutdown helper", async () => {
217
- const runtime = await new DefaultRuntimeBuilder().build({
218
- config: makeBaseConfig({
219
- enableTools: false,
220
- }),
221
- });
222
-
223
- await expect(runtime.shutdown("test")).resolves.toBeUndefined();
224
- });
225
-
226
- it("includes MCP tools from configured servers", async () => {
227
- const tempRoot = mkdtempSync(join(tmpdir(), "runtime-builder-mcp-"));
228
- const serverPath = join(tempRoot, "mock-mcp-server.js");
229
- const settingsPath = join(tempRoot, "cline_mcp_settings.json");
230
- const previousSettingsPath = process.env.CLINE_MCP_SETTINGS_PATH;
231
-
232
- writeFileSync(
233
- serverPath,
234
- `let buffer = "";
235
- function write(payload) {
236
- const body = JSON.stringify(payload);
237
- process.stdout.write("Content-Length: " + Buffer.byteLength(body, "utf8") + "\\r\\n\\r\\n" + body);
238
- }
239
- function handle(message) {
240
- if (message.method === "initialize") {
241
- write({ jsonrpc: "2.0", id: message.id, result: { protocolVersion: "2024-11-05", capabilities: { tools: {} }, serverInfo: { name: "mock", version: "1.0.0" } } });
242
- return;
243
- }
244
- if (message.method === "tools/list") {
245
- write({ jsonrpc: "2.0", id: message.id, result: { tools: [{ name: "echo", description: "Echo tool", inputSchema: { type: "object", properties: { value: { type: "string" } }, required: [] } }] } });
246
- return;
247
- }
248
- if (message.method === "tools/call") {
249
- write({ jsonrpc: "2.0", id: message.id, result: { echoed: message.params?.arguments?.value ?? null } });
250
- }
251
- }
252
- process.stdin.on("data", (chunk) => {
253
- buffer += chunk.toString("utf8");
254
- while (true) {
255
- const separator = buffer.indexOf("\\r\\n\\r\\n");
256
- if (separator < 0) break;
257
- const header = buffer.slice(0, separator);
258
- const match = header.match(/Content-Length:\\s*(\\d+)/i);
259
- if (!match) throw new Error("missing content length");
260
- const length = Number(match[1]);
261
- const start = separator + 4;
262
- const end = start + length;
263
- if (buffer.length < end) break;
264
- const body = buffer.slice(start, end);
265
- buffer = buffer.slice(end);
266
- const message = JSON.parse(body);
267
- if (message.method === "notifications/initialized") continue;
268
- handle(message);
269
- }
270
- });`,
271
- "utf8",
272
- );
273
- writeFileSync(
274
- settingsPath,
275
- JSON.stringify(
276
- {
277
- mcpServers: {
278
- mock: {
279
- command: process.execPath,
280
- args: [serverPath],
281
- },
282
- },
283
- },
284
- null,
285
- 2,
286
- ),
287
- "utf8",
288
- );
289
-
290
- process.env.CLINE_MCP_SETTINGS_PATH = settingsPath;
291
- try {
292
- const runtime = await new DefaultRuntimeBuilder().build({
293
- config: makeBaseConfig(),
294
- });
295
- expect(runtime.tools.map((tool) => tool.name)).toContain("mock__echo");
296
- await runtime.shutdown("test");
297
- } finally {
298
- process.env.CLINE_MCP_SETTINGS_PATH = previousSettingsPath;
299
- }
300
- });
301
-
302
- it("skips MCP settings tools when disableMcpSettingsTools is true", async () => {
303
- const tempRoot = mkdtempSync(
304
- join(tmpdir(), "runtime-builder-mcp-disabled-"),
305
- );
306
- const serverPath = join(tempRoot, "mock-mcp-server.js");
307
- const settingsPath = join(tempRoot, "cline_mcp_settings.json");
308
- const previousSettingsPath = process.env.CLINE_MCP_SETTINGS_PATH;
309
-
310
- writeFileSync(
311
- serverPath,
312
- `let buffer = "";
313
- function write(payload) {
314
- const body = JSON.stringify(payload);
315
- process.stdout.write("Content-Length: " + Buffer.byteLength(body, "utf8") + "\\r\\n\\r\\n" + body);
316
- }
317
- function handle(message) {
318
- if (message.method === "initialize") {
319
- write({ jsonrpc: "2.0", id: message.id, result: { protocolVersion: "2024-11-05", capabilities: { tools: {} }, serverInfo: { name: "mock", version: "1.0.0" } } });
320
- return;
321
- }
322
- if (message.method === "tools/list") {
323
- write({ jsonrpc: "2.0", id: message.id, result: { tools: [{ name: "echo", description: "Echo tool", inputSchema: { type: "object", properties: { value: { type: "string" } }, required: [] } }] } });
324
- return;
325
- }
326
- if (message.method === "tools/call") {
327
- write({ jsonrpc: "2.0", id: message.id, result: { echoed: message.params?.arguments?.value ?? null } });
328
- }
329
- }
330
- process.stdin.on("data", (chunk) => {
331
- buffer += chunk.toString("utf8");
332
- while (true) {
333
- const separator = buffer.indexOf("\\r\\n\\r\\n");
334
- if (separator < 0) break;
335
- const header = buffer.slice(0, separator);
336
- const match = header.match(/Content-Length:\\s*(\\d+)/i);
337
- if (!match) throw new Error("missing content length");
338
- const length = Number(match[1]);
339
- const start = separator + 4;
340
- const end = start + length;
341
- if (buffer.length < end) break;
342
- const body = buffer.slice(start, end);
343
- buffer = buffer.slice(end);
344
- const message = JSON.parse(body);
345
- if (message.method === "notifications/initialized") continue;
346
- handle(message);
347
- }
348
- });`,
349
- "utf8",
350
- );
351
- writeFileSync(
352
- settingsPath,
353
- JSON.stringify(
354
- {
355
- mcpServers: {
356
- mock: {
357
- command: process.execPath,
358
- args: [serverPath],
359
- },
360
- },
361
- },
362
- null,
363
- 2,
364
- ),
365
- "utf8",
366
- );
367
-
368
- process.env.CLINE_MCP_SETTINGS_PATH = settingsPath;
369
- try {
370
- const runtime = await new DefaultRuntimeBuilder().build({
371
- config: makeBaseConfig({
372
- disableMcpSettingsTools: true,
373
- }),
374
- });
375
- expect(runtime.tools.map((tool) => tool.name)).not.toContain(
376
- "mock__echo",
377
- );
378
- await runtime.shutdown("test");
379
- } finally {
380
- process.env.CLINE_MCP_SETTINGS_PATH = previousSettingsPath;
381
- }
382
- });
383
-
384
- it("skips broken MCP servers without crashing", async () => {
385
- const tempRoot = mkdtempSync(join(tmpdir(), "runtime-builder-mcp-bad-"));
386
- const serverPath = join(tempRoot, "malformed-mcp-server.js");
387
- const settingsPath = join(tempRoot, "cline_mcp_settings.json");
388
- const previousSettingsPath = process.env.CLINE_MCP_SETTINGS_PATH;
389
-
390
- writeFileSync(
391
- serverPath,
392
- `process.stdin.once("data", () => {
393
- process.stdout.write("Content-Length: 2\\r\\n\\r\\n{]");
394
- });`,
395
- "utf8",
396
- );
397
- writeFileSync(
398
- settingsPath,
399
- JSON.stringify(
400
- {
401
- mcpServers: {
402
- broken: {
403
- command: process.execPath,
404
- args: [serverPath],
405
- },
406
- },
407
- },
408
- null,
409
- 2,
410
- ),
411
- "utf8",
412
- );
413
-
414
- process.env.CLINE_MCP_SETTINGS_PATH = settingsPath;
415
- try {
416
- const runtime = await new DefaultRuntimeBuilder().build({
417
- config: makeBaseConfig(),
418
- });
419
- const mcpTools = runtime.tools.filter((t) =>
420
- t.name.startsWith("broken__"),
421
- );
422
- expect(mcpTools).toEqual([]);
423
- await runtime.shutdown("test");
424
- } finally {
425
- process.env.CLINE_MCP_SETTINGS_PATH = previousSettingsPath;
426
- }
427
- });
428
-
429
- it("skips invalid MCP settings file without crashing", async () => {
430
- const tempRoot = mkdtempSync(
431
- join(tmpdir(), "runtime-builder-mcp-invalid-"),
432
- );
433
- const settingsPath = join(tempRoot, "cline_mcp_settings.json");
434
- const previousSettingsPath = process.env.CLINE_MCP_SETTINGS_PATH;
435
-
436
- writeFileSync(settingsPath, "{ not valid json !!!", "utf8");
437
-
438
- process.env.CLINE_MCP_SETTINGS_PATH = settingsPath;
439
- try {
440
- const runtime = await new DefaultRuntimeBuilder().build({
441
- config: makeBaseConfig(),
442
- });
443
- const mcpTools = runtime.tools.filter((t) => t.name.includes("__"));
444
- expect(mcpTools).toEqual([]);
445
- await runtime.shutdown("test");
446
- } finally {
447
- process.env.CLINE_MCP_SETTINGS_PATH = previousSettingsPath;
448
- }
449
- });
450
-
451
- it("includes skills tool when workspace skills are available", async () => {
452
- const cwd = mkdtempSync(join(tmpdir(), "runtime-builder-skills-"));
453
- const skillDir = join(cwd, ".cline", "skills", "commit");
454
- mkdirSync(skillDir, { recursive: true });
455
- writeFileSync(
456
- join(skillDir, "SKILL.md"),
457
- `---
458
- name: commit
459
- description: Create commit message
460
- ---
461
- Use conventional commits.`,
462
- "utf8",
463
- );
464
-
465
- const runtime = await new DefaultRuntimeBuilder().build({
466
- config: makeBaseConfig({ cwd }),
467
- });
468
-
469
- expect(runtime.tools.map((tool) => tool.name)).toContain("skills");
470
- await runtime.shutdown("test");
471
- });
472
-
473
- it("allows tool routing rules to disable skills even when skills exist", async () => {
474
- const cwd = mkdtempSync(
475
- join(tmpdir(), "runtime-builder-skills-routing-disabled-"),
476
- );
477
- const skillDir = join(cwd, ".cline", "skills", "commit");
478
- mkdirSync(skillDir, { recursive: true });
479
- writeFileSync(
480
- join(skillDir, "SKILL.md"),
481
- `---
482
- name: commit
483
- description: Create commit message
484
- ---
485
- Use conventional commits.`,
486
- "utf8",
487
- );
488
-
489
- const runtime = await new DefaultRuntimeBuilder().build({
490
- config: makeBaseConfig({
491
- providerId: "openrouter",
492
- modelId: "google/gemini-3-flash-preview",
493
- cwd,
494
- toolRoutingRules: [
495
- {
496
- mode: "act",
497
- providerIdIncludes: ["openrouter"],
498
- modelIdIncludes: ["gemini"],
499
- disableTools: ["skills"],
500
- },
501
- ],
502
- }),
503
- });
504
-
505
- expect(runtime.tools.map((tool) => tool.name)).not.toContain("skills");
506
- await runtime.shutdown("test");
507
- });
508
-
509
- it("marks configured but disabled skills in executor metadata", async () => {
510
- const cwd = mkdtempSync(join(tmpdir(), "runtime-builder-skills-disabled-"));
511
- const enabledDir = join(cwd, ".cline", "skills", "commit");
512
- const disabledDir = join(cwd, ".cline", "skills", "review");
513
- mkdirSync(enabledDir, { recursive: true });
514
- mkdirSync(disabledDir, { recursive: true });
515
- writeFileSync(
516
- join(enabledDir, "SKILL.md"),
517
- `---
518
- name: commit
519
- ---
520
- Enabled skill.`,
521
- "utf8",
522
- );
523
- writeFileSync(
524
- join(disabledDir, "SKILL.md"),
525
- `---
526
- name: review
527
- disabled: true
528
- ---
529
- Disabled skill.`,
530
- "utf8",
531
- );
532
-
533
- const runtime = await new DefaultRuntimeBuilder().build({
534
- config: makeBaseConfig({ cwd }),
535
- });
536
-
537
- const skillsTool = runtime.tools.find((tool) => tool.name === "skills");
538
- expect(skillsTool).toBeDefined();
539
- if (!skillsTool) {
540
- throw new Error("Expected skills tool.");
541
- }
542
-
543
- const disabledResult = await skillsTool.execute(
544
- { skill: "review" },
545
- {
546
- agentId: "agent-1",
547
- conversationId: "conv-1",
548
- iteration: 1,
549
- },
550
- );
551
- expect(disabledResult).toContain("configured but disabled");
552
-
553
- await runtime.shutdown("test");
554
- });
555
-
556
- it("scopes skills tool to session-configured skills", async () => {
557
- const cwd = mkdtempSync(join(tmpdir(), "runtime-builder-skills-scoped-"));
558
- const commitDir = join(cwd, ".cline", "skills", "commit");
559
- const reviewDir = join(cwd, ".cline", "skills", "review");
560
- mkdirSync(commitDir, { recursive: true });
561
- mkdirSync(reviewDir, { recursive: true });
562
- writeFileSync(
563
- join(commitDir, "SKILL.md"),
564
- `---
565
- name: commit
566
- ---
567
- Commit skill.`,
568
- "utf8",
569
- );
570
- writeFileSync(
571
- join(reviewDir, "SKILL.md"),
572
- `---
573
- name: review
574
- ---
575
- Review skill.`,
576
- "utf8",
577
- );
578
-
579
- const runtime = await new DefaultRuntimeBuilder().build({
580
- config: makeBaseConfig({
581
- cwd,
582
- skills: ["commit"],
583
- }),
584
- });
585
-
586
- const skillsTool = runtime.tools.find((tool) => tool.name === "skills");
587
- expect(skillsTool).toBeDefined();
588
- if (!skillsTool) {
589
- throw new Error("Expected skills tool.");
590
- }
591
-
592
- const known = await skillsTool.execute(
593
- { skill: "commit" },
594
- {
595
- agentId: "agent-1",
596
- conversationId: "conv-1",
597
- iteration: 1,
598
- },
599
- );
600
- expect(known).toContain("<command-name>commit</command-name>");
601
-
602
- const blocked = await skillsTool.execute(
603
- { skill: "review" },
604
- {
605
- agentId: "agent-1",
606
- conversationId: "conv-1",
607
- iteration: 1,
608
- },
609
- );
610
- expect(blocked).toContain('Skill "review" not found.');
611
- expect(blocked).toContain("Available skills: commit");
612
-
613
- await runtime.shutdown("test");
614
- });
615
- });