@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
@@ -4,42 +4,54 @@ import type {
4
4
  ToolApprovalRequest,
5
5
  ToolApprovalResult,
6
6
  } from "@clinebot/shared";
7
+ import type { ToolExecutors } from "../extensions/tools";
7
8
  import type { HookEventPayload } from "../hooks";
9
+ import type { ProviderSettings } from "../llms/provider-settings";
8
10
  import type { SessionManifest } from "../session/session-manifest";
9
11
  import type { SessionSource } from "../types/common";
10
12
  import type { CoreSessionConfig } from "../types/config";
11
13
  import type { CoreSessionEvent } from "../types/events";
12
14
  import type { SessionRecord } from "../types/sessions";
13
15
 
14
- export interface RuntimeSessionConfig {
15
- sessionId?: string;
16
- providerId: string;
17
- modelId: string;
18
- apiKey?: string;
19
- cwd: string;
20
- workspaceRoot?: string;
21
- systemPrompt: string;
22
- mode: CoreSessionConfig["mode"];
23
- rules?: CoreSessionConfig["rules"];
24
- maxIterations?: CoreSessionConfig["maxIterations"];
25
- enableTools: boolean;
26
- enableSpawnAgent: boolean;
27
- enableAgentTeams: boolean;
28
- disableMcpSettingsTools?: boolean;
29
- teamName?: string;
30
- missionLogIntervalSteps?: number;
31
- missionLogIntervalMs?: number;
32
- }
16
+ type LocalOnlyCoreSessionConfigKeys =
17
+ | "hooks"
18
+ | "logger"
19
+ | "telemetry"
20
+ | "extraTools"
21
+ | "extensions"
22
+ | "onTeamEvent"
23
+ | "onConsecutiveMistakeLimitReached";
24
+
25
+ export type RuntimeSessionConfig = Omit<
26
+ CoreSessionConfig,
27
+ LocalOnlyCoreSessionConfigKeys | "checkpoint" | "compaction"
28
+ > & {
29
+ checkpoint?: Omit<
30
+ NonNullable<CoreSessionConfig["checkpoint"]>,
31
+ "createCheckpoint"
32
+ >;
33
+ compaction?: Omit<NonNullable<CoreSessionConfig["compaction"]>, "compact">;
34
+ };
33
35
 
34
- export type LocalRuntimeConfigOverrides = Omit<
36
+ export type LocalRuntimeConfigOverrides = Pick<
35
37
  CoreSessionConfig,
36
- keyof RuntimeSessionConfig
37
- >;
38
+ LocalOnlyCoreSessionConfigKeys
39
+ > & {
40
+ checkpoint?: Pick<
41
+ NonNullable<CoreSessionConfig["checkpoint"]>,
42
+ "createCheckpoint"
43
+ > &
44
+ Partial<NonNullable<CoreSessionConfig["checkpoint"]>>;
45
+ compaction?: Pick<NonNullable<CoreSessionConfig["compaction"]>, "compact"> &
46
+ Partial<NonNullable<CoreSessionConfig["compaction"]>>;
47
+ };
38
48
 
39
49
  export interface LocalRuntimeStartOptions {
40
50
  configOverrides?: Partial<LocalRuntimeConfigOverrides>;
51
+ modelCatalogDefaults?: Partial<NonNullable<ProviderSettings["modelCatalog"]>>;
41
52
  userInstructionWatcher?: import("../extensions/config").UserInstructionConfigWatcher;
42
53
  onTeamRestored?: () => void;
54
+ defaultToolExecutors?: Partial<ToolExecutors>;
43
55
  }
44
56
 
45
57
  export interface StartSessionInput {
@@ -52,8 +64,9 @@ export interface StartSessionInput {
52
64
  userImages?: string[];
53
65
  userFiles?: string[];
54
66
  /**
55
- * Local runtime bootstrap options. These are intentionally isolated under a
56
- * local-only bag so the transport-facing host contract stays transport-safe.
67
+ * Host-local bootstrap options. These are intentionally isolated from the
68
+ * transport-neutral runtime session config so all runtime hosts share the
69
+ * same execution contract while still allowing host-specific preparation.
57
70
  */
58
71
  localRuntime?: LocalRuntimeStartOptions;
59
72
  toolPolicies?: import("@clinebot/shared").AgentConfig["toolPolicies"];
@@ -67,26 +80,36 @@ export function splitCoreSessionConfig(config: CoreSessionConfig): {
67
80
  localRuntime?: LocalRuntimeStartOptions;
68
81
  } {
69
82
  const {
70
- sessionId,
71
- providerId,
72
- modelId,
73
- apiKey,
74
- cwd,
75
- workspaceRoot,
76
- systemPrompt,
77
- mode,
78
- rules,
79
- maxIterations,
80
- enableTools,
81
- enableSpawnAgent,
82
- enableAgentTeams,
83
- disableMcpSettingsTools,
84
- teamName,
85
- missionLogIntervalSteps,
86
- missionLogIntervalMs,
87
- ...localConfigOverrides
83
+ hooks,
84
+ logger,
85
+ telemetry,
86
+ extraTools,
87
+ extensions,
88
+ onTeamEvent,
89
+ onConsecutiveMistakeLimitReached,
90
+ checkpoint,
91
+ compaction,
92
+ ...transportConfig
88
93
  } = config;
89
94
 
95
+ const localConfigOverrides: Partial<LocalRuntimeConfigOverrides> = {};
96
+ if (hooks) localConfigOverrides.hooks = hooks;
97
+ if (logger) localConfigOverrides.logger = logger;
98
+ if (telemetry) localConfigOverrides.telemetry = telemetry;
99
+ if (extraTools) localConfigOverrides.extraTools = extraTools;
100
+ if (extensions) localConfigOverrides.extensions = extensions;
101
+ if (onTeamEvent) localConfigOverrides.onTeamEvent = onTeamEvent;
102
+ if (onConsecutiveMistakeLimitReached) {
103
+ localConfigOverrides.onConsecutiveMistakeLimitReached =
104
+ onConsecutiveMistakeLimitReached;
105
+ }
106
+ if (checkpoint?.createCheckpoint) {
107
+ localConfigOverrides.checkpoint = checkpoint;
108
+ }
109
+ if (compaction?.compact) {
110
+ localConfigOverrides.compaction = compaction;
111
+ }
112
+
90
113
  const localRuntime =
91
114
  Object.keys(localConfigOverrides).length > 0
92
115
  ? {
@@ -97,23 +120,21 @@ export function splitCoreSessionConfig(config: CoreSessionConfig): {
97
120
 
98
121
  return {
99
122
  config: {
100
- ...(sessionId ? { sessionId } : {}),
101
- providerId,
102
- modelId,
103
- ...(apiKey ? { apiKey } : {}),
104
- cwd,
105
- ...(workspaceRoot ? { workspaceRoot } : {}),
106
- systemPrompt,
107
- mode,
108
- rules,
109
- maxIterations,
110
- enableTools,
111
- enableSpawnAgent,
112
- enableAgentTeams,
113
- disableMcpSettingsTools,
114
- teamName,
115
- missionLogIntervalSteps,
116
- missionLogIntervalMs,
123
+ ...transportConfig,
124
+ ...(checkpoint ? { checkpoint: { enabled: checkpoint.enabled } } : {}),
125
+ ...(compaction
126
+ ? {
127
+ compaction: {
128
+ enabled: compaction.enabled,
129
+ strategy: compaction.strategy,
130
+ thresholdRatio: compaction.thresholdRatio,
131
+ reserveTokens: compaction.reserveTokens,
132
+ preserveRecentTokens: compaction.preserveRecentTokens,
133
+ contextWindowTokens: compaction.contextWindowTokens,
134
+ summarizer: compaction.summarizer,
135
+ },
136
+ }
137
+ : {}),
117
138
  },
118
139
  ...(localRuntime ? { localRuntime } : {}),
119
140
  };
@@ -143,6 +164,10 @@ export interface SessionAccumulatedUsage {
143
164
  totalCost: number;
144
165
  }
145
166
 
167
+ export interface RuntimeHostSubscribeOptions {
168
+ sessionId?: string;
169
+ }
170
+
146
171
  /**
147
172
  * RuntimeHost is the transport/runtime boundary for core session execution.
148
173
  * Callers must normalize broad local config into `RuntimeSessionConfig`
@@ -171,8 +196,11 @@ export interface RuntimeHost {
171
196
  ): Promise<{ updated: boolean }>;
172
197
  readMessages(sessionId: string): Promise<LlmsProviders.Message[]>;
173
198
  handleHookEvent(payload: HookEventPayload): Promise<void>;
174
- subscribe(listener: (event: CoreSessionEvent) => void): () => void;
199
+ subscribe(
200
+ listener: (event: CoreSessionEvent) => void,
201
+ options?: RuntimeHostSubscribeOptions,
202
+ ): () => void;
175
203
  updateSessionModel?(sessionId: string, modelId: string): Promise<void>;
176
204
  }
177
205
 
178
- export type RuntimeHostMode = "auto" | "rpc" | "local";
206
+ export type RuntimeHostMode = "auto" | "local" | "hub" | "remote";
@@ -1,4 +1,3 @@
1
- import type * as LlmsProviders from "@clinebot/llms";
2
1
  import {
3
2
  type ITelemetryService,
4
3
  isOAuthProviderId,
@@ -12,6 +11,7 @@ import { getValidOpenAICodexCredentials } from "../auth/codex";
12
11
  import { getValidOcaCredentials } from "../auth/oca";
13
12
  import { decodeJwtPayload } from "../auth/utils";
14
13
  import { ProviderSettingsManager } from "../services/storage/provider-settings-manager";
14
+ import type { ProviderSettings } from "../types/provider-settings";
15
15
 
16
16
  const DEFAULT_CLINE_API_BASE_URL = "https://api.cline.bot";
17
17
  const WORKOS_TOKEN_PREFIX = "workos:";
@@ -51,12 +51,12 @@ function readExpiryFromToken(accessToken: string): number | null {
51
51
  }
52
52
 
53
53
  function deriveCredentialExpiry(
54
- settings: LlmsProviders.ProviderSettings,
54
+ settings: ProviderSettings,
55
55
  normalizedAccessToken: string,
56
56
  ): number {
57
57
  const explicitExpiry = (
58
58
  settings.auth as
59
- | (LlmsProviders.ProviderSettings["auth"] & { expiresAt?: number })
59
+ | (ProviderSettings["auth"] & { expiresAt?: number })
60
60
  | undefined
61
61
  )?.expiresAt;
62
62
  if (
@@ -78,7 +78,7 @@ function deriveCredentialExpiry(
78
78
 
79
79
  function toCredentials(
80
80
  providerId: ManagedOAuthProviderId,
81
- settings: LlmsProviders.ProviderSettings,
81
+ settings: ProviderSettings,
82
82
  ): ClineOAuthCredentials | null {
83
83
  const rawAccess = settings.auth?.accessToken?.trim();
84
84
  const refreshToken = settings.auth?.refreshToken?.trim();
@@ -99,18 +99,14 @@ function toCredentials(
99
99
  }
100
100
 
101
101
  function authSettingsEqual(
102
- a: LlmsProviders.ProviderSettings["auth"] | undefined,
103
- b: LlmsProviders.ProviderSettings["auth"] | undefined,
102
+ a: ProviderSettings["auth"] | undefined,
103
+ b: ProviderSettings["auth"] | undefined,
104
104
  ): boolean {
105
105
  const aExpiry = (
106
- a as
107
- | (LlmsProviders.ProviderSettings["auth"] & { expiresAt?: number })
108
- | undefined
106
+ a as (ProviderSettings["auth"] & { expiresAt?: number }) | undefined
109
107
  )?.expiresAt;
110
108
  const bExpiry = (
111
- b as
112
- | (LlmsProviders.ProviderSettings["auth"] & { expiresAt?: number })
113
- | undefined
109
+ b as (ProviderSettings["auth"] & { expiresAt?: number }) | undefined
114
110
  )?.expiresAt;
115
111
  return (
116
112
  a?.accessToken === b?.accessToken &&
@@ -219,9 +215,9 @@ export class RuntimeOAuthTokenManager {
219
215
  accessToken: persistedAccessToken,
220
216
  refreshToken: nextCredentials.refresh,
221
217
  accountId: nextCredentials.accountId,
222
- } as LlmsProviders.ProviderSettings["auth"] & { expiresAt?: number };
218
+ } as ProviderSettings["auth"] & { expiresAt?: number };
223
219
  nextAuth.expiresAt = nextCredentials.expires;
224
- const nextSettings: LlmsProviders.ProviderSettings = {
220
+ const nextSettings: ProviderSettings = {
225
221
  ...settings,
226
222
  auth: nextAuth,
227
223
  };
@@ -243,7 +239,7 @@ export class RuntimeOAuthTokenManager {
243
239
 
244
240
  private async resolveCredentials(
245
241
  providerId: ManagedOAuthProviderId,
246
- settings: LlmsProviders.ProviderSettings,
242
+ settings: ProviderSettings,
247
243
  currentCredentials: ClineOAuthCredentials,
248
244
  forceRefresh: boolean,
249
245
  ): Promise<ClineOAuthCredentials | null> {
@@ -5,7 +5,6 @@ import type {
5
5
  AgentResult,
6
6
  BasicLogger,
7
7
  ITelemetryService,
8
- TeamTeammateSpec,
9
8
  Tool,
10
9
  } from "@clinebot/shared";
11
10
  import type { UserInstructionConfigWatcher } from "../extensions/config";
@@ -30,28 +29,6 @@ export interface BuiltRuntime {
30
29
  shutdown: (reason: string) => Promise<void> | void;
31
30
  }
32
31
 
33
- export interface TeamToolsFactoryOptions {
34
- runtime: AgentTeamsRuntime;
35
- teammateConfigProvider: DelegatedAgentConfigProvider;
36
- createBaseTools?: () => Tool[];
37
- leadAgentId?: string;
38
- restoredTeammates?: TeamTeammateSpec[];
39
- restoredFromPersistence?: boolean;
40
- includeLeadSpawnTool?: boolean;
41
- includeLeadManagementTools?: boolean;
42
- onLeadToolsUnlocked?: (tools: Tool[]) => void;
43
- }
44
-
45
- export interface TeamToolsFactoryResult {
46
- tools: Tool[];
47
- restoredFromPersistence: boolean;
48
- restoredTeammates: string[];
49
- }
50
-
51
- export type TeamToolsFactory = (
52
- options: TeamToolsFactoryOptions,
53
- ) => TeamToolsFactoryResult;
54
-
55
32
  export interface RuntimeBuilderInput {
56
33
  config: CoreSessionConfig;
57
34
  hooks?: AgentHooks;
@@ -63,7 +40,6 @@ export interface RuntimeBuilderInput {
63
40
  defaultToolExecutors?: Partial<ToolExecutors>;
64
41
  logger?: BasicLogger;
65
42
  telemetry?: ITelemetryService;
66
- teamToolsFactory?: TeamToolsFactory;
67
43
  }
68
44
 
69
45
  export interface RuntimeBuilder {
@@ -0,0 +1,122 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import type { AgentConfig, Tool } from "@clinebot/shared";
4
+ import { resolveGlobalSettingsPath } from "@clinebot/shared/storage";
5
+
6
+ type AgentExtension = NonNullable<AgentConfig["extensions"]>[number];
7
+ type AgentExtensionApi = Parameters<NonNullable<AgentExtension["setup"]>>[0];
8
+
9
+ export interface GlobalSettings {
10
+ disabledTools?: string[];
11
+ }
12
+
13
+ function normalizeDisabledTools(value: unknown): string[] | undefined {
14
+ if (!Array.isArray(value)) {
15
+ return undefined;
16
+ }
17
+
18
+ const normalized = [
19
+ ...new Set(
20
+ value
21
+ .filter((entry): entry is string => typeof entry === "string")
22
+ .map((entry) => entry.trim())
23
+ .filter(Boolean),
24
+ ),
25
+ ].sort((left, right) => left.localeCompare(right));
26
+
27
+ return normalized.length > 0 ? normalized : undefined;
28
+ }
29
+
30
+ export function readGlobalSettings(): GlobalSettings {
31
+ const filePath = resolveGlobalSettingsPath();
32
+ try {
33
+ const parsed = JSON.parse(readFileSync(filePath, "utf8")) as GlobalSettings;
34
+ return {
35
+ disabledTools: normalizeDisabledTools(parsed.disabledTools),
36
+ };
37
+ } catch {
38
+ return {};
39
+ }
40
+ }
41
+
42
+ export function writeGlobalSettings(settings: GlobalSettings): void {
43
+ const filePath = resolveGlobalSettingsPath();
44
+ mkdirSync(dirname(filePath), { recursive: true });
45
+ const normalizedDisabledTools = normalizeDisabledTools(
46
+ settings.disabledTools,
47
+ );
48
+ const normalized: GlobalSettings = normalizedDisabledTools
49
+ ? { disabledTools: normalizedDisabledTools }
50
+ : {};
51
+ writeFileSync(filePath, `${JSON.stringify(normalized, null, 2)}\n`, "utf8");
52
+ }
53
+
54
+ export function resolveDisabledToolNames(
55
+ disabledToolNames?: ReadonlyArray<string>,
56
+ ): Set<string> {
57
+ return new Set(disabledToolNames ?? readGlobalSettings().disabledTools ?? []);
58
+ }
59
+
60
+ export function isToolDisabledGlobally(toolName: string): boolean {
61
+ return resolveDisabledToolNames().has(toolName);
62
+ }
63
+
64
+ export function toggleDisabledTool(toolName: string): boolean {
65
+ const disabled = resolveDisabledToolNames();
66
+ if (disabled.has(toolName)) {
67
+ disabled.delete(toolName);
68
+ writeGlobalSettings({ disabledTools: [...disabled] });
69
+ return false;
70
+ }
71
+
72
+ disabled.add(toolName);
73
+ writeGlobalSettings({ disabledTools: [...disabled] });
74
+ return true;
75
+ }
76
+
77
+ export function filterDisabledTools<T extends Pick<Tool, "name">>(
78
+ tools: ReadonlyArray<T>,
79
+ disabledToolNames?: ReadonlyArray<string>,
80
+ ): T[] {
81
+ const disabled = resolveDisabledToolNames(disabledToolNames);
82
+ if (disabled.size === 0) {
83
+ return [...tools];
84
+ }
85
+ return tools.filter((tool) => !disabled.has(tool.name));
86
+ }
87
+
88
+ export function filterExtensionToolRegistrations(
89
+ extensions: AgentConfig["extensions"],
90
+ disabledToolNames?: ReadonlyArray<string>,
91
+ ): AgentConfig["extensions"] {
92
+ if (!extensions || extensions.length === 0) {
93
+ return extensions;
94
+ }
95
+
96
+ const disabled = resolveDisabledToolNames(disabledToolNames);
97
+ if (disabled.size === 0) {
98
+ return extensions;
99
+ }
100
+
101
+ return extensions.map((extension) => {
102
+ if (!extension.setup) {
103
+ return extension;
104
+ }
105
+
106
+ return {
107
+ ...extension,
108
+ setup: (api: AgentExtensionApi, ctx) =>
109
+ extension.setup?.(
110
+ {
111
+ ...api,
112
+ registerTool: (tool) => {
113
+ if (!disabled.has(tool.name)) {
114
+ api.registerTool(tool);
115
+ }
116
+ },
117
+ },
118
+ ctx,
119
+ ),
120
+ };
121
+ });
122
+ }
@@ -5,6 +5,7 @@ import type {
5
5
  Tool,
6
6
  ToolApprovalRequest,
7
7
  ToolApprovalResult,
8
+ WorkspaceInfo,
8
9
  } from "@clinebot/shared";
9
10
  import { resolveAndLoadAgentPlugins } from "../extensions/plugin/plugin-config-loader";
10
11
  import type {
@@ -24,10 +25,7 @@ import type {
24
25
  LocalRuntimeStartOptions,
25
26
  StartSessionInput,
26
27
  } from "../runtime/runtime-host";
27
- import type {
28
- RuntimeBuilderInput,
29
- TeamToolsFactory,
30
- } from "../runtime/session-runtime";
28
+ import type { RuntimeBuilderInput } from "../runtime/session-runtime";
31
29
  import type { CoreSessionConfig } from "../types/config";
32
30
  import {
33
31
  type ProviderConfig,
@@ -35,9 +33,10 @@ import {
35
33
  toProviderConfig,
36
34
  } from "../types/provider-settings";
37
35
  import { resolveWorkspacePath } from "./config";
36
+ import { filterExtensionToolRegistrations } from "./global-settings";
38
37
  import { hasRuntimeHooks, mergeAgentExtensions } from "./session-data";
39
38
  import type { ProviderSettingsManager } from "./storage/provider-settings-manager";
40
- import { buildWorkspaceMetadata } from "./workspace-manifest";
39
+ import { buildWorkspaceMetadataWithInfo } from "./workspace-manifest";
41
40
 
42
41
  function formatPluginFailure(failure: PluginInitializationFailure): string {
43
42
  const label = failure.pluginName ?? failure.pluginPath;
@@ -93,8 +92,17 @@ function resolveReasoningSettings(
93
92
  function buildProviderConfig(
94
93
  config: CoreSessionConfig,
95
94
  providerSettingsManager: ProviderSettingsManager,
95
+ modelCatalogDefaults?: Partial<ProviderSettings["modelCatalog"]>,
96
+ defaultFetch?: typeof fetch,
96
97
  ): ProviderConfig {
97
98
  const stored = providerSettingsManager.getProviderSettings(config.providerId);
99
+ const modelCatalog =
100
+ modelCatalogDefaults || stored?.modelCatalog
101
+ ? {
102
+ ...(modelCatalogDefaults ?? {}),
103
+ ...(stored?.modelCatalog ?? {}),
104
+ }
105
+ : undefined;
98
106
  const settings: ProviderSettings = {
99
107
  ...(stored ?? {}),
100
108
  provider: config.providerId,
@@ -103,6 +111,7 @@ function buildProviderConfig(
103
111
  baseUrl: config.baseUrl ?? stored?.baseUrl,
104
112
  headers: config.headers ?? stored?.headers,
105
113
  reasoning: resolveReasoningSettings(config, stored?.reasoning),
114
+ modelCatalog,
106
115
  };
107
116
  const providerConfig = toProviderConfig(settings);
108
117
  if (config.knownModels) {
@@ -111,6 +120,13 @@ function buildProviderConfig(
111
120
  if (config.extensionContext) {
112
121
  providerConfig.extensionContext = config.extensionContext;
113
122
  }
123
+ // Thread a host-provided custom fetch through to the AI gateway providers.
124
+ // Precedence: explicit per-session config > stored provider settings > host default.
125
+ const sessionFetch = (config as { fetch?: typeof fetch }).fetch;
126
+ const resolvedFetch = sessionFetch ?? providerConfig.fetch ?? defaultFetch;
127
+ if (resolvedFetch) {
128
+ providerConfig.fetch = resolvedFetch;
129
+ }
114
130
  return providerConfig;
115
131
  }
116
132
 
@@ -121,11 +137,15 @@ export interface PrepareLocalRuntimeBootstrapOptions {
121
137
  providerSettingsManager: ProviderSettingsManager;
122
138
  defaultTelemetry?: ITelemetryService;
123
139
  defaultToolExecutors?: Partial<ToolExecutors>;
124
- teamToolsFactory?: TeamToolsFactory;
125
140
  defaultToolPolicies?: AgentConfig["toolPolicies"];
126
141
  defaultRequestToolApproval?: (
127
142
  request: ToolApprovalRequest,
128
143
  ) => Promise<ToolApprovalResult>;
144
+ /**
145
+ * Host-level default `fetch` threaded into `ProviderConfig.fetch` so the
146
+ * AI gateway providers can use a custom HTTP implementation.
147
+ */
148
+ defaultFetch?: typeof fetch;
129
149
  onPluginEvent: (event: { name: string; payload?: unknown }) => void;
130
150
  onTeamEvent: (event: TeamEvent) => void;
131
151
  createSpawnTool: () => Tool;
@@ -140,6 +160,8 @@ export interface LocalRuntimeBootstrap {
140
160
  config: CoreSessionConfig;
141
161
  providerConfig: ProviderConfig;
142
162
  workspaceMetadata: string;
163
+ /** Structured git + path metadata generated alongside workspaceMetadata. */
164
+ workspaceInfo: WorkspaceInfo;
143
165
  extensions: AgentConfig["extensions"];
144
166
  hooks: AgentHooks | undefined;
145
167
  toolPolicies: AgentConfig["toolPolicies"];
@@ -159,9 +181,9 @@ export async function prepareLocalRuntimeBootstrap(
159
181
  providerSettingsManager,
160
182
  defaultTelemetry,
161
183
  defaultToolExecutors,
162
- teamToolsFactory,
163
184
  defaultToolPolicies,
164
185
  defaultRequestToolApproval,
186
+ defaultFetch,
165
187
  onPluginEvent,
166
188
  onTeamEvent,
167
189
  createSpawnTool,
@@ -173,18 +195,27 @@ export async function prepareLocalRuntimeBootstrap(
173
195
  const configOverrides = localRuntime?.configOverrides as
174
196
  | Partial<LocalRuntimeConfigOverrides>
175
197
  | undefined;
198
+ const localConfig = configOverrides as Partial<CoreSessionConfig> | undefined;
199
+
200
+ // Generate workspace + git metadata once, early, so it can be forwarded to
201
+ // hooks and extensions. The serialized string goes into CoreSessionConfig
202
+ // as workspaceMetadata; the structured object is kept as workspaceInfo.
203
+ const { workspaceInfo, workspaceMetadata } =
204
+ await buildWorkspaceMetadataWithInfo(input.config.cwd);
176
205
 
177
206
  const fileHooks = createHookConfigFileHooks({
178
207
  cwd: input.config.cwd,
179
208
  workspacePath,
180
209
  rootSessionId: sessionId,
181
210
  logger: configOverrides?.logger,
211
+ workspaceInfo,
182
212
  });
183
213
  const auditHooks = hasRuntimeHooks(configOverrides?.hooks)
184
214
  ? undefined
185
215
  : createHookAuditHooks({
186
216
  rootSessionId: sessionId,
187
217
  workspacePath,
218
+ workspaceInfo,
188
219
  });
189
220
  const baseHooks = mergeAgentHooks([
190
221
  configOverrides?.hooks,
@@ -197,10 +228,13 @@ export async function prepareLocalRuntimeBootstrap(
197
228
  | undefined;
198
229
  try {
199
230
  loadedPlugins = await resolveAndLoadAgentPlugins({
200
- pluginPaths: configOverrides?.pluginPaths,
231
+ pluginPaths: localConfig?.pluginPaths,
201
232
  workspacePath,
202
233
  cwd: input.config.cwd,
203
234
  onEvent: onPluginEvent,
235
+ providerId: input.config.providerId,
236
+ modelId: input.config.modelId,
237
+ workspaceInfo,
204
238
  });
205
239
  logPluginDiagnostics(
206
240
  loadedPlugins.failures,
@@ -216,9 +250,8 @@ export async function prepareLocalRuntimeBootstrap(
216
250
 
217
251
  const extensions = mergeAgentExtensions(
218
252
  configOverrides?.extensions,
219
- loadedPlugins?.extensions,
253
+ filterExtensionToolRegistrations(loadedPlugins?.extensions),
220
254
  );
221
- const workspaceMetadata = await buildWorkspaceMetadata(input.config.cwd);
222
255
  const baseConfig: CoreSessionConfig = {
223
256
  ...input.config,
224
257
  ...(configOverrides ?? {}),
@@ -229,6 +262,8 @@ export async function prepareLocalRuntimeBootstrap(
229
262
  const providerConfig = buildProviderConfig(
230
263
  baseConfig,
231
264
  providerSettingsManager,
265
+ localRuntime?.modelCatalogDefaults,
266
+ defaultFetch,
232
267
  );
233
268
  const hooks = mergeAgentHooks([
234
269
  baseConfig.hooks,
@@ -249,15 +284,19 @@ export async function prepareLocalRuntimeBootstrap(
249
284
  workspaceMetadata,
250
285
  hooks,
251
286
  };
252
- const toolPolicies = input.toolPolicies ?? defaultToolPolicies;
287
+ const toolPolicies =
288
+ input.toolPolicies ?? baseConfig.toolPolicies ?? defaultToolPolicies;
253
289
  const requestToolApproval =
254
290
  input.requestToolApproval ?? defaultRequestToolApproval;
291
+ const effectiveToolExecutors =
292
+ localRuntime?.defaultToolExecutors ?? defaultToolExecutors;
255
293
 
256
294
  return {
257
295
  effectiveInput: input,
258
296
  config,
259
297
  providerConfig,
260
298
  workspaceMetadata,
299
+ workspaceInfo,
261
300
  extensions,
262
301
  hooks,
263
302
  toolPolicies,
@@ -271,10 +310,9 @@ export async function prepareLocalRuntimeBootstrap(
271
310
  createSpawnTool,
272
311
  onTeamRestored: localRuntime?.onTeamRestored,
273
312
  userInstructionWatcher: localRuntime?.userInstructionWatcher,
274
- defaultToolExecutors,
313
+ defaultToolExecutors: effectiveToolExecutors,
275
314
  logger: config.logger,
276
315
  telemetry: config.telemetry,
277
- teamToolsFactory,
278
316
  },
279
317
  };
280
318
  }