@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,665 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import type * as LlmsProviders from "@clinebot/llms";
3
- import { RpcSessionClient } from "@clinebot/rpc";
4
- import {
5
- type AgentEvent,
6
- type AgentResult,
7
- createSessionId,
8
- type RpcChatRunTurnRequest,
9
- type RpcChatStartSessionRequest,
10
- type RpcChatTurnResult,
11
- type TeamProgressLifecycleEvent,
12
- type TeamProgressSummary,
13
- type ToolApprovalRequest,
14
- type ToolApprovalResult,
15
- type ToolPolicy,
16
- } from "@clinebot/shared";
17
- import type { HookEventPayload } from "../hooks";
18
- import type {
19
- RuntimeHost,
20
- SendSessionInput,
21
- SessionAccumulatedUsage,
22
- StartSessionInput,
23
- StartSessionResult,
24
- } from "../runtime/runtime-host";
25
- import { toSessionRecord } from "../services/session-data";
26
- import type { RpcCoreSessionService } from "../session/rpc-session-service";
27
- import type { CoreSessionEvent } from "../types/events";
28
- import type { SessionRecord } from "../types/sessions";
29
- import {
30
- cloneAccumulatedUsage,
31
- RuntimeHostEventBus,
32
- readPersistedMessagesFile,
33
- replaySubagentHookEvent,
34
- } from "./runtime-host-support";
35
-
36
- type ApprovalRequester = (
37
- request: ToolApprovalRequest,
38
- ) => Promise<ToolApprovalResult>;
39
-
40
- const DEFAULT_MANUAL_APPROVAL_POLICY: ToolPolicy = {
41
- enabled: true,
42
- autoApprove: false,
43
- };
44
-
45
- function unsupportedRpcFeature(name: string): Error {
46
- return new Error(
47
- `RPC-backed ClineCore does not support ${name}. Use local backend mode for this session.`,
48
- );
49
- }
50
-
51
- function validateRpcStartInput(input: StartSessionInput): void {
52
- const overrides = input.localRuntime?.configOverrides;
53
- if (
54
- input.localRuntime?.userInstructionWatcher ||
55
- input.localRuntime?.onTeamRestored ||
56
- (overrides != null && Object.keys(overrides).length > 0)
57
- ) {
58
- throw unsupportedRpcFeature("local runtime bootstrap options");
59
- }
60
- }
61
-
62
- function toRpcStartRequest(
63
- input: StartSessionInput,
64
- ): RpcChatStartSessionRequest {
65
- const workspaceRoot =
66
- input.config.workspaceRoot?.trim() || input.config.cwd.trim();
67
- return {
68
- sessionId: input.config.sessionId?.trim() || undefined,
69
- workspaceRoot,
70
- cwd: input.config.cwd,
71
- provider: input.config.providerId,
72
- model: input.config.modelId,
73
- mode: input.config.mode,
74
- apiKey: input.config.apiKey?.trim() || "",
75
- systemPrompt: input.config.systemPrompt,
76
- rules: input.config.rules,
77
- maxIterations: input.config.maxIterations,
78
- enableTools: input.config.enableTools,
79
- enableSpawn: input.config.enableSpawnAgent,
80
- enableTeams: input.config.enableAgentTeams,
81
- disableMcpSettingsTools: input.config.disableMcpSettingsTools,
82
- autoApproveTools: input.toolPolicies?.["*"]?.autoApprove,
83
- teamName: input.config.teamName ?? "",
84
- missionStepInterval: input.config.missionLogIntervalSteps ?? 3,
85
- missionTimeIntervalMs: input.config.missionLogIntervalMs ?? 120_000,
86
- toolPolicies: input.toolPolicies,
87
- initialMessages: input.initialMessages as
88
- | RpcChatStartSessionRequest["initialMessages"]
89
- | undefined,
90
- sessions: undefined,
91
- source: input.source,
92
- interactive: input.interactive === true,
93
- };
94
- }
95
-
96
- async function buildTurnRequest(
97
- config: RpcChatStartSessionRequest,
98
- messages: LlmsProviders.Message[] | undefined,
99
- input: {
100
- prompt: string;
101
- userImages?: string[];
102
- userFiles?: string[];
103
- delivery?: "queue" | "steer";
104
- },
105
- ): Promise<RpcChatRunTurnRequest> {
106
- return {
107
- config,
108
- messages: messages as RpcChatRunTurnRequest["messages"] | undefined,
109
- prompt: input.prompt,
110
- delivery: input.delivery,
111
- attachments:
112
- input.userImages?.length || input.userFiles?.length
113
- ? {
114
- userImages: input.userImages,
115
- userFiles: input.userFiles
116
- ? await Promise.all(
117
- input.userFiles.map(async (path) => ({
118
- name: path.split("/").at(-1) || path,
119
- content: await readFile(path, "utf8"),
120
- })),
121
- )
122
- : undefined,
123
- }
124
- : undefined,
125
- };
126
- }
127
-
128
- function toAgentResult(
129
- result: RpcChatTurnResult,
130
- config: RpcChatStartSessionRequest,
131
- startedAt: Date,
132
- ): AgentResult {
133
- const endedAt = new Date();
134
- return {
135
- text: result.text,
136
- usage: result.usage,
137
- messages: result.messages as LlmsProviders.Message[],
138
- toolCalls: result.toolCalls.map((call) => ({
139
- id: createSessionId(),
140
- name: call.name,
141
- input: call.input,
142
- output: call.output,
143
- error: call.error,
144
- durationMs: call.durationMs ?? 0,
145
- startedAt,
146
- endedAt,
147
- })),
148
- iterations: result.iterations,
149
- finishReason: result.finishReason as AgentResult["finishReason"],
150
- model: {
151
- id: config.model,
152
- provider: config.provider,
153
- },
154
- startedAt,
155
- endedAt,
156
- durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),
157
- };
158
- }
159
-
160
- function accumulateUsage(
161
- base: SessionAccumulatedUsage | undefined,
162
- result: RpcChatTurnResult,
163
- ): SessionAccumulatedUsage {
164
- return {
165
- inputTokens: (base?.inputTokens ?? 0) + result.usage.inputTokens,
166
- outputTokens: (base?.outputTokens ?? 0) + result.usage.outputTokens,
167
- cacheReadTokens:
168
- (base?.cacheReadTokens ?? 0) + (result.usage.cacheReadTokens ?? 0),
169
- cacheWriteTokens:
170
- (base?.cacheWriteTokens ?? 0) + (result.usage.cacheWriteTokens ?? 0),
171
- totalCost: (base?.totalCost ?? 0) + (result.usage.totalCost ?? 0),
172
- };
173
- }
174
-
175
- export class RpcRuntimeHost implements RuntimeHost {
176
- public readonly runtimeAddress: string;
177
- private readonly client: RpcSessionClient;
178
- private readonly events = new RuntimeHostEventBus();
179
- private readonly sessionConfigs = new Map<
180
- string,
181
- RpcChatStartSessionRequest
182
- >();
183
- private readonly sessionApprovals = new Map<
184
- string,
185
- ApprovalRequester | undefined
186
- >();
187
- private readonly usageBySession = new Map<string, SessionAccumulatedUsage>();
188
- private readonly trackedSessionIds = new Set<string>();
189
- private stopEventStream?: () => void;
190
-
191
- constructor(
192
- private readonly backend: RpcCoreSessionService,
193
- private readonly defaultToolPolicies?: RpcChatStartSessionRequest["toolPolicies"],
194
- private readonly defaultRequestToolApproval?: ApprovalRequester,
195
- ) {
196
- this.runtimeAddress = backend.address;
197
- this.client = new RpcSessionClient({
198
- address: backend.address,
199
- });
200
- }
201
-
202
- async start(input: StartSessionInput): Promise<StartSessionResult> {
203
- validateRpcStartInput(input);
204
- const config = toRpcStartRequest(input);
205
- if (!config.toolPolicies && this.defaultToolPolicies) {
206
- config.toolPolicies = this.defaultToolPolicies;
207
- }
208
- const response = await this.client.startRuntimeSession(config);
209
- const sessionId = response.sessionId.trim();
210
- if (!sessionId) {
211
- throw new Error("RPC runtime start returned an empty session id");
212
- }
213
- const startResult = response.startResult;
214
- if (!startResult) {
215
- throw new Error("RPC runtime start did not return session artifacts");
216
- }
217
-
218
- this.sessionConfigs.set(sessionId, { ...config, sessionId });
219
- this.sessionApprovals.set(
220
- sessionId,
221
- input.requestToolApproval ?? this.defaultRequestToolApproval,
222
- );
223
- this.usageBySession.set(sessionId, {
224
- inputTokens: 0,
225
- outputTokens: 0,
226
- cacheReadTokens: 0,
227
- cacheWriteTokens: 0,
228
- totalCost: 0,
229
- });
230
- this.trackedSessionIds.add(sessionId);
231
- this.refreshEventStream();
232
- this.emit({
233
- type: "status",
234
- payload: { sessionId, status: "running" },
235
- });
236
-
237
- let result: AgentResult | undefined;
238
- if (input.prompt?.trim()) {
239
- result = await this.send({
240
- sessionId,
241
- prompt: input.prompt,
242
- userImages: input.userImages,
243
- userFiles: input.userFiles,
244
- });
245
- }
246
-
247
- const manifest = this.backend.readSessionManifest(sessionId);
248
- if (!manifest) {
249
- throw new Error(`Session manifest unavailable for ${sessionId}`);
250
- }
251
-
252
- return {
253
- sessionId,
254
- manifest,
255
- manifestPath: startResult.manifestPath,
256
- messagesPath: startResult.messagesPath,
257
- result,
258
- };
259
- }
260
-
261
- async send(input: SendSessionInput): Promise<AgentResult | undefined> {
262
- const config = this.sessionConfigs.get(input.sessionId);
263
- if (!config) {
264
- throw new Error(
265
- `RPC-backed session ${input.sessionId} is not attached to this ClineCore instance`,
266
- );
267
- }
268
- const messages = await this.readMessages(input.sessionId);
269
- const startedAt = new Date();
270
- const response = await this.client.sendRuntimeSession(
271
- input.sessionId,
272
- await buildTurnRequest(config, messages, input),
273
- );
274
- if (!response.result) {
275
- return undefined;
276
- }
277
- const usage = accumulateUsage(
278
- this.usageBySession.get(input.sessionId),
279
- response.result,
280
- );
281
- this.usageBySession.set(input.sessionId, usage);
282
- const result = toAgentResult(response.result, config, startedAt);
283
- await this.syncRemoteSessionState(input.sessionId);
284
- return result;
285
- }
286
-
287
- async getAccumulatedUsage(
288
- sessionId: string,
289
- ): Promise<SessionAccumulatedUsage | undefined> {
290
- return cloneAccumulatedUsage(this.usageBySession.get(sessionId));
291
- }
292
-
293
- async abort(sessionId: string, reason?: unknown): Promise<void> {
294
- void reason;
295
- await this.client.abortRuntimeSession(sessionId);
296
- }
297
-
298
- async stop(sessionId: string): Promise<void> {
299
- await this.client.stopRuntimeSession(sessionId);
300
- this.detachSession(sessionId);
301
- this.emit({
302
- type: "status",
303
- payload: { sessionId, status: "cancelled" },
304
- });
305
- this.emit({
306
- type: "ended",
307
- payload: {
308
- sessionId,
309
- reason: "rpc_stop_requested",
310
- ts: Date.now(),
311
- },
312
- });
313
- }
314
-
315
- async dispose(reason = "rpc_session_host_dispose"): Promise<void> {
316
- const sessionIds = [...this.trackedSessionIds];
317
- await Promise.allSettled(
318
- sessionIds.map(async (sessionId) => {
319
- try {
320
- await this.client.abortRuntimeSession(sessionId);
321
- } catch {
322
- // Best effort before stop.
323
- }
324
- try {
325
- await this.client.stopRuntimeSession(sessionId);
326
- } catch {
327
- // Best effort during dispose.
328
- }
329
- this.emit({
330
- type: "ended",
331
- payload: { sessionId, reason, ts: Date.now() },
332
- });
333
- }),
334
- );
335
- this.stopEventStream?.();
336
- this.stopEventStream = undefined;
337
- this.sessionConfigs.clear();
338
- this.sessionApprovals.clear();
339
- this.usageBySession.clear();
340
- this.trackedSessionIds.clear();
341
- this.client.close();
342
- }
343
-
344
- async get(sessionId: string): Promise<SessionRecord | undefined> {
345
- const row = await this.client.getSession(sessionId);
346
- return row ? toSessionRecord(row) : undefined;
347
- }
348
-
349
- async list(limit = 200): Promise<SessionRecord[]> {
350
- const rows = await this.backend.listSessions(limit);
351
- return rows.map(toSessionRecord);
352
- }
353
-
354
- async delete(sessionId: string): Promise<boolean> {
355
- const result = await this.backend.deleteSession(sessionId);
356
- if (result.deleted) {
357
- this.detachSession(sessionId);
358
- }
359
- return result.deleted;
360
- }
361
-
362
- async update(
363
- sessionId: string,
364
- updates: {
365
- prompt?: string | null;
366
- metadata?: Record<string, unknown> | null;
367
- title?: string | null;
368
- },
369
- ): Promise<{ updated: boolean }> {
370
- const result = await this.backend.updateSession({
371
- sessionId,
372
- prompt: updates.prompt,
373
- metadata: updates.metadata,
374
- title: updates.title,
375
- });
376
- return { updated: result.updated };
377
- }
378
-
379
- async readMessages(sessionId: string): Promise<LlmsProviders.Message[]> {
380
- const row = await this.client.getSession(sessionId);
381
- return readPersistedMessagesFile(row?.messagesPath);
382
- }
383
-
384
- async handleHookEvent(payload: HookEventPayload): Promise<void> {
385
- await replaySubagentHookEvent(payload, {
386
- queueSpawnRequest: (event: HookEventPayload) =>
387
- this.backend.queueSpawnRequest(event),
388
- upsertSubagentSessionFromHook: (event: HookEventPayload) =>
389
- this.backend.upsertSubagentSessionFromHook(event),
390
- appendSubagentHookAudit: (sessionId: string, event: HookEventPayload) =>
391
- this.backend.appendSubagentHookAudit(sessionId, event),
392
- applySubagentStatus: (sessionId: string, event: HookEventPayload) =>
393
- this.backend.applySubagentStatus(sessionId, event),
394
- });
395
- }
396
-
397
- subscribe(listener: (event: CoreSessionEvent) => void): () => void {
398
- const unsubscribe = this.events.subscribe(listener);
399
- this.refreshEventStream();
400
- return () => {
401
- unsubscribe();
402
- if (this.events.size === 0) {
403
- this.stopEventStream?.();
404
- this.stopEventStream = undefined;
405
- }
406
- };
407
- }
408
-
409
- async updateSessionModel(): Promise<void> {
410
- // Model updates for remote sessions are applied per-turn from the stored config.
411
- }
412
-
413
- private emit(event: CoreSessionEvent): void {
414
- this.events.emit(event);
415
- }
416
-
417
- private detachSession(sessionId: string): void {
418
- this.sessionConfigs.delete(sessionId);
419
- this.sessionApprovals.delete(sessionId);
420
- this.usageBySession.delete(sessionId);
421
- this.trackedSessionIds.delete(sessionId);
422
- this.refreshEventStream();
423
- }
424
-
425
- private refreshEventStream(): void {
426
- if (this.events.size === 0) {
427
- return;
428
- }
429
- this.stopEventStream?.();
430
- this.stopEventStream = undefined;
431
- if (this.trackedSessionIds.size === 0) {
432
- return;
433
- }
434
- this.stopEventStream = this.client.streamEvents(
435
- {
436
- clientId: `core-session-host-${createSessionId()}`,
437
- sessionIds: [...this.trackedSessionIds],
438
- },
439
- {
440
- onEvent: (event) => {
441
- void this.handleRpcEvent(event);
442
- },
443
- },
444
- );
445
- }
446
-
447
- private async handleRpcEvent(event: {
448
- sessionId: string;
449
- eventType: string;
450
- payload: Record<string, unknown>;
451
- }): Promise<void> {
452
- if (event.eventType === "approval.requested") {
453
- await this.handleApprovalRequest(event.sessionId, event.payload);
454
- return;
455
- }
456
- const mapped = this.mapRpcEvent(
457
- event.sessionId,
458
- event.eventType,
459
- event.payload,
460
- );
461
- if (mapped) {
462
- this.emit(mapped);
463
- }
464
- }
465
-
466
- private async handleApprovalRequest(
467
- sessionId: string,
468
- payload: Record<string, unknown>,
469
- ): Promise<void> {
470
- const requester = this.sessionApprovals.get(sessionId);
471
- if (!requester) {
472
- return;
473
- }
474
- const approvalId =
475
- typeof payload.approvalId === "string" ? payload.approvalId.trim() : "";
476
- const toolCallId =
477
- typeof payload.toolCallId === "string" ? payload.toolCallId.trim() : "";
478
- const toolName =
479
- typeof payload.toolName === "string" ? payload.toolName.trim() : "";
480
- if (!approvalId || !toolCallId || !toolName) {
481
- return;
482
- }
483
- let inputJson: unknown;
484
- if (typeof payload.inputJson === "string" && payload.inputJson.trim()) {
485
- try {
486
- inputJson = JSON.parse(payload.inputJson);
487
- } catch {
488
- inputJson = payload.inputJson;
489
- }
490
- }
491
- const decision = await requester({
492
- agentId: "",
493
- conversationId: sessionId,
494
- iteration: 0,
495
- toolCallId,
496
- toolName,
497
- input: inputJson,
498
- policy: DEFAULT_MANUAL_APPROVAL_POLICY,
499
- });
500
- await this.client.respondToolApproval({
501
- approvalId,
502
- approved: decision.approved,
503
- reason: decision.reason,
504
- responderClientId: `core-session-host-${sessionId}`,
505
- });
506
- }
507
-
508
- private mapRpcEvent(
509
- sessionId: string,
510
- eventType: string,
511
- payload: Record<string, unknown>,
512
- ): CoreSessionEvent | undefined {
513
- if (eventType === "runtime.chat.text_delta") {
514
- return {
515
- type: "agent_event",
516
- payload: {
517
- sessionId,
518
- event: {
519
- type: "content_start",
520
- contentType: "text",
521
- text: typeof payload.text === "string" ? payload.text : undefined,
522
- accumulated:
523
- typeof payload.accumulated === "string"
524
- ? payload.accumulated
525
- : undefined,
526
- } satisfies AgentEvent,
527
- },
528
- };
529
- }
530
- if (eventType === "runtime.chat.tool_call_start") {
531
- return {
532
- type: "agent_event",
533
- payload: {
534
- sessionId,
535
- event: {
536
- type: "content_start",
537
- contentType: "tool",
538
- toolCallId:
539
- typeof payload.toolCallId === "string"
540
- ? payload.toolCallId
541
- : undefined,
542
- toolName:
543
- typeof payload.toolName === "string"
544
- ? payload.toolName
545
- : undefined,
546
- input: payload.input,
547
- } satisfies AgentEvent,
548
- },
549
- };
550
- }
551
- if (eventType === "runtime.chat.tool_call_end") {
552
- return {
553
- type: "agent_event",
554
- payload: {
555
- sessionId,
556
- event: {
557
- type: "content_end",
558
- contentType: "tool",
559
- toolCallId:
560
- typeof payload.toolCallId === "string"
561
- ? payload.toolCallId
562
- : undefined,
563
- toolName:
564
- typeof payload.toolName === "string"
565
- ? payload.toolName
566
- : undefined,
567
- output: payload.output,
568
- error:
569
- typeof payload.error === "string" ? payload.error : undefined,
570
- durationMs:
571
- typeof payload.durationMs === "number"
572
- ? payload.durationMs
573
- : undefined,
574
- } satisfies AgentEvent,
575
- },
576
- };
577
- }
578
- if (eventType === "runtime.chat.error") {
579
- return {
580
- type: "agent_event",
581
- payload: {
582
- sessionId,
583
- event: {
584
- type: "error",
585
- error: new Error(
586
- typeof payload.message === "string"
587
- ? payload.message
588
- : "RPC runtime error",
589
- ),
590
- recoverable: payload.recoverable === true,
591
- iteration:
592
- typeof payload.iteration === "number" ? payload.iteration : 0,
593
- } satisfies AgentEvent,
594
- },
595
- };
596
- }
597
- if (eventType === "runtime.chat.pending_prompts") {
598
- const prompts = Array.isArray(payload.prompts) ? payload.prompts : [];
599
- return {
600
- type: "pending_prompts",
601
- payload: {
602
- sessionId,
603
- prompts: prompts.map((prompt) => {
604
- const typed = prompt as Record<string, unknown>;
605
- return {
606
- id: typeof typed.id === "string" ? typed.id : "",
607
- prompt: typeof typed.prompt === "string" ? typed.prompt : "",
608
- delivery: typed.delivery === "steer" ? "steer" : "queue",
609
- attachmentCount:
610
- typeof typed.attachmentCount === "number"
611
- ? typed.attachmentCount
612
- : 0,
613
- };
614
- }),
615
- },
616
- };
617
- }
618
- if (eventType === "runtime.team.progress.v1") {
619
- const summary =
620
- typeof payload.summary === "object" && payload.summary
621
- ? payload.summary
622
- : undefined;
623
- const lifecycle =
624
- typeof payload.lastEvent === "object" && payload.lastEvent
625
- ? payload.lastEvent
626
- : undefined;
627
- if (!summary || !lifecycle) {
628
- return undefined;
629
- }
630
- const typedSummary = summary as {
631
- teamName?: string;
632
- } & TeamProgressSummary;
633
- return {
634
- type: "team_progress",
635
- payload: {
636
- sessionId,
637
- teamName: typedSummary.teamName ?? "",
638
- summary: summary as TeamProgressSummary,
639
- lifecycle: lifecycle as TeamProgressLifecycleEvent,
640
- },
641
- };
642
- }
643
- return undefined;
644
- }
645
-
646
- private async syncRemoteSessionState(sessionId: string): Promise<void> {
647
- const row = await this.client.getSession(sessionId);
648
- if (!row || row.status === "running") {
649
- return;
650
- }
651
- this.emit({
652
- type: "status",
653
- payload: { sessionId, status: row.status },
654
- });
655
- this.emit({
656
- type: "ended",
657
- payload: {
658
- sessionId,
659
- reason: row.status,
660
- ts: row.endedAt ? new Date(row.endedAt).getTime() : Date.now(),
661
- },
662
- });
663
- this.detachSession(sessionId);
664
- }
665
- }