@clinebot/core 0.0.34 → 0.0.35

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 (372) hide show
  1. package/README.md +12 -8
  2. package/dist/ClineCore.d.ts +48 -29
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/extensions/config/agent-config-loader.d.ts +2 -2
  5. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  6. package/dist/extensions/config/agent-config-parser.d.ts +1 -1
  7. package/dist/extensions/config/agent-config-parser.d.ts.map +1 -1
  8. package/dist/extensions/config/hooks-config-loader.d.ts +2 -2
  9. package/dist/extensions/config/hooks-config-loader.d.ts.map +1 -1
  10. package/dist/extensions/config/index.d.ts +3 -3
  11. package/dist/extensions/config/index.d.ts.map +1 -1
  12. package/dist/extensions/config/user-instruction-config-loader.d.ts +2 -2
  13. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  14. package/dist/extensions/plugin-sandbox-bootstrap.js +248 -248
  15. package/dist/extensions/tools/constants.d.ts.map +1 -0
  16. package/dist/extensions/tools/definitions.d.ts.map +1 -0
  17. package/dist/extensions/tools/executors/apply-patch-parser.d.ts.map +1 -0
  18. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -0
  19. package/dist/extensions/tools/executors/bash.d.ts.map +1 -0
  20. package/dist/extensions/tools/executors/editor.d.ts.map +1 -0
  21. package/dist/extensions/tools/executors/file-read.d.ts.map +1 -0
  22. package/dist/extensions/tools/executors/index.d.ts.map +1 -0
  23. package/dist/extensions/tools/executors/search.d.ts.map +1 -0
  24. package/dist/extensions/tools/executors/web-fetch.d.ts.map +1 -0
  25. package/dist/extensions/tools/helpers.d.ts.map +1 -0
  26. package/dist/extensions/tools/index.d.ts.map +1 -0
  27. package/dist/{tools → extensions/tools}/model-tool-routing.d.ts +1 -1
  28. package/dist/extensions/tools/model-tool-routing.d.ts.map +1 -0
  29. package/dist/{tools → extensions/tools}/presets.d.ts +1 -2
  30. package/dist/extensions/tools/presets.d.ts.map +1 -0
  31. package/dist/extensions/tools/schemas.d.ts.map +1 -0
  32. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -0
  33. package/dist/extensions/tools/team/index.d.ts.map +1 -0
  34. package/dist/{team → extensions/tools/team}/multi-agent.d.ts +1 -3
  35. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -0
  36. package/dist/extensions/tools/team/projections.d.ts.map +1 -0
  37. package/dist/extensions/tools/team/runtime.d.ts.map +1 -0
  38. package/dist/{team → extensions/tools/team}/spawn-agent-tool.d.ts +0 -1
  39. package/dist/extensions/tools/team/spawn-agent-tool.d.ts.map +1 -0
  40. package/dist/extensions/tools/team/subagent-prompts.d.ts.map +1 -0
  41. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -0
  42. package/dist/{tools → extensions/tools}/types.d.ts +4 -3
  43. package/dist/extensions/tools/types.d.ts.map +1 -0
  44. package/dist/{runtime → hooks}/checkpoint-hooks.d.ts +7 -0
  45. package/dist/hooks/checkpoint-hooks.d.ts.map +1 -0
  46. package/dist/{runtime → hooks}/hook-file-hooks.d.ts +0 -2
  47. package/dist/hooks/hook-file-hooks.d.ts.map +1 -0
  48. package/dist/hooks/subprocess.d.ts +3 -130
  49. package/dist/hooks/subprocess.d.ts.map +1 -1
  50. package/dist/index.d.ts +35 -33
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +381 -379
  53. package/dist/runtime/history.d.ts +4 -0
  54. package/dist/runtime/history.d.ts.map +1 -0
  55. package/dist/runtime/host.d.ts +9 -0
  56. package/dist/runtime/host.d.ts.map +1 -0
  57. package/dist/{session → runtime}/rpc-runtime-ensure.d.ts +13 -1
  58. package/dist/{session → runtime}/rpc-runtime-ensure.d.ts.map +1 -1
  59. package/dist/{session → runtime}/rpc-spawn-lease.d.ts.map +1 -1
  60. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  61. package/dist/{session/session-manager.d.ts → runtime/runtime-host.d.ts} +55 -12
  62. package/dist/runtime/runtime-host.d.ts.map +1 -0
  63. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts +1 -1
  64. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts.map +1 -1
  65. package/dist/runtime/session-runtime.d.ts +2 -2
  66. package/dist/runtime/session-runtime.d.ts.map +1 -1
  67. package/dist/{session/session-agent-events.d.ts → services/agent-events.d.ts} +4 -4
  68. package/dist/services/agent-events.d.ts.map +1 -0
  69. package/dist/services/config.d.ts +3 -0
  70. package/dist/services/config.d.ts.map +1 -0
  71. package/dist/services/local-runtime-bootstrap.d.ts +41 -0
  72. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -0
  73. package/dist/services/providers/local-provider-registry.d.ts.map +1 -0
  74. package/dist/services/providers/local-provider-service.d.ts.map +1 -0
  75. package/dist/{session → services}/session-artifacts.d.ts +0 -4
  76. package/dist/services/session-artifacts.d.ts.map +1 -0
  77. package/dist/{session/utils/helpers.d.ts → services/session-data.d.ts} +19 -27
  78. package/dist/services/session-data.d.ts.map +1 -0
  79. package/dist/{session → services}/session-telemetry.d.ts +2 -2
  80. package/dist/services/session-telemetry.d.ts.map +1 -0
  81. package/dist/{storage → services/storage}/file-team-store.d.ts +2 -2
  82. package/dist/services/storage/file-team-store.d.ts.map +1 -0
  83. package/dist/{storage → services/storage}/provider-settings-legacy-migration.d.ts +1 -1
  84. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -0
  85. package/dist/{storage → services/storage}/provider-settings-manager.d.ts +1 -1
  86. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -0
  87. package/dist/{storage → services/storage}/sqlite-session-store.d.ts +3 -3
  88. package/dist/services/storage/sqlite-session-store.d.ts.map +1 -0
  89. package/dist/{storage → services/storage}/sqlite-team-store.d.ts +2 -2
  90. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -0
  91. package/dist/{storage → services/storage}/team-store.d.ts +1 -1
  92. package/dist/services/storage/team-store.d.ts.map +1 -0
  93. package/dist/services/telemetry/ITelemetryAdapter.d.ts.map +1 -0
  94. package/dist/services/telemetry/OpenTelemetryAdapter.d.ts.map +1 -0
  95. package/dist/services/telemetry/OpenTelemetryProvider.d.ts.map +1 -0
  96. package/dist/services/telemetry/TelemetryLoggerSink.d.ts.map +1 -0
  97. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -0
  98. package/dist/services/telemetry/core-events.d.ts.map +1 -0
  99. package/dist/services/telemetry/distinct-id.d.ts.map +1 -0
  100. package/dist/services/telemetry/index.d.ts.map +1 -0
  101. package/dist/{telemetry → services/telemetry}/index.js +6 -6
  102. package/dist/{session/utils → services}/usage.d.ts +1 -1
  103. package/dist/services/usage.d.ts.map +1 -0
  104. package/dist/services/workspace/file-indexer.d.ts.map +1 -0
  105. package/dist/services/workspace/index.d.ts.map +1 -0
  106. package/dist/services/workspace/mention-enricher.d.ts.map +1 -0
  107. package/dist/services/workspace-manifest.d.ts.map +1 -0
  108. package/dist/session/file-session-service.d.ts +4 -1
  109. package/dist/session/file-session-service.d.ts.map +1 -1
  110. package/dist/session/persistence-service.d.ts +8 -6
  111. package/dist/session/persistence-service.d.ts.map +1 -1
  112. package/dist/session/rpc-session-service.d.ts +3 -0
  113. package/dist/session/rpc-session-service.d.ts.map +1 -1
  114. package/dist/session/session-service.d.ts +8 -9
  115. package/dist/session/session-service.d.ts.map +1 -1
  116. package/dist/session/session-team-coordination.d.ts +4 -4
  117. package/dist/session/session-team-coordination.d.ts.map +1 -1
  118. package/dist/session/sqlite-rpc-session-backend.d.ts.map +1 -1
  119. package/dist/{session/default-session-manager.d.ts → transports/local.d.ts} +24 -14
  120. package/dist/transports/local.d.ts.map +1 -0
  121. package/dist/transports/rpc.d.ts +51 -0
  122. package/dist/transports/rpc.d.ts.map +1 -0
  123. package/dist/transports/runtime-host-support.d.ts +21 -0
  124. package/dist/transports/runtime-host-support.d.ts.map +1 -0
  125. package/dist/types/chat-schema.d.ts.map +1 -0
  126. package/dist/types/config.d.ts +2 -2
  127. package/dist/types/config.d.ts.map +1 -1
  128. package/dist/{session/utils/types.d.ts → types/session.d.ts} +15 -6
  129. package/dist/types/session.d.ts.map +1 -0
  130. package/dist/types/sessions.d.ts +19 -0
  131. package/dist/types/sessions.d.ts.map +1 -1
  132. package/dist/types/storage.d.ts +1 -3
  133. package/dist/types/storage.d.ts.map +1 -1
  134. package/dist/types.d.ts +7 -6
  135. package/dist/types.d.ts.map +1 -1
  136. package/package.json +7 -12
  137. package/src/ClineCore.test.ts +95 -19
  138. package/src/ClineCore.ts +120 -50
  139. package/src/auth/cline.ts +1 -1
  140. package/src/auth/codex.ts +1 -1
  141. package/src/auth/oca.ts +1 -1
  142. package/src/extensions/config/agent-config-loader.test.ts +3 -3
  143. package/src/extensions/config/agent-config-loader.ts +1 -5
  144. package/src/extensions/config/agent-config-parser.ts +1 -1
  145. package/src/extensions/config/hooks-config-loader.ts +1 -2
  146. package/src/extensions/config/index.ts +0 -4
  147. package/src/extensions/config/user-instruction-config-loader.ts +0 -4
  148. package/src/extensions/plugin/plugin-config-loader.test.ts +6 -4
  149. package/src/{tools → extensions/tools}/definitions.ts +1 -1
  150. package/src/extensions/tools/executors/file-read.test.ts +125 -0
  151. package/src/{tools → extensions/tools}/executors/file-read.ts +29 -4
  152. package/src/{tools → extensions/tools}/executors/search.ts +1 -1
  153. package/src/{tools → extensions/tools}/model-tool-routing.ts +1 -1
  154. package/src/{tools → extensions/tools}/presets.ts +2 -3
  155. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +455 -0
  156. package/src/{team → extensions/tools/team}/multi-agent.ts +80 -17
  157. package/src/{team → extensions/tools/team}/spawn-agent-tool.test.ts +0 -6
  158. package/src/{team → extensions/tools/team}/spawn-agent-tool.ts +1 -7
  159. package/src/{team → extensions/tools/team}/subagent-prompts.ts +2 -2
  160. package/src/{team → extensions/tools/team}/team-tools.test.ts +43 -31
  161. package/src/{team → extensions/tools/team}/team-tools.ts +63 -53
  162. package/src/{tools → extensions/tools}/types.ts +5 -3
  163. package/src/{runtime → hooks}/checkpoint-hooks.ts +27 -0
  164. package/src/{runtime → hooks}/hook-file-hooks.ts +6 -11
  165. package/src/hooks/subprocess.ts +48 -257
  166. package/src/index.ts +167 -158
  167. package/src/runtime/history.test.ts +114 -0
  168. package/src/runtime/history.ts +237 -0
  169. package/src/runtime/host.test.ts +230 -0
  170. package/src/runtime/host.ts +362 -0
  171. package/src/runtime/rpc-runtime-ensure.test.ts +123 -0
  172. package/src/{session → runtime}/rpc-runtime-ensure.ts +165 -27
  173. package/src/{session → runtime}/rpc-spawn-lease.test.ts +33 -1
  174. package/src/{session → runtime}/rpc-spawn-lease.ts +54 -20
  175. package/src/runtime/runtime-builder.team-persistence.test.ts +6 -3
  176. package/src/runtime/runtime-builder.test.ts +3 -4
  177. package/src/runtime/runtime-builder.ts +13 -21
  178. package/src/runtime/runtime-host.ts +178 -0
  179. package/src/{session → runtime}/runtime-oauth-token-manager.ts +1 -1
  180. package/src/runtime/runtime-parity.test.ts +1 -1
  181. package/src/runtime/session-runtime.ts +2 -2
  182. package/src/{session/session-agent-events.ts → services/agent-events.ts} +7 -7
  183. package/src/services/config.ts +5 -0
  184. package/src/services/local-runtime-bootstrap.ts +280 -0
  185. package/src/{providers → services/providers}/local-provider-service.ts +4 -4
  186. package/src/{session → services}/session-artifacts.ts +7 -19
  187. package/src/{session/utils/helpers.test.ts → services/session-data.test.ts} +1 -1
  188. package/src/{session/utils/helpers.ts → services/session-data.ts} +76 -72
  189. package/src/{session → services}/session-telemetry.ts +7 -9
  190. package/src/services/storage/artifact-store.ts +1 -0
  191. package/src/{storage → services/storage}/file-team-store.ts +2 -2
  192. package/src/{storage → services/storage}/provider-settings-legacy-migration.test.ts +1 -1
  193. package/src/{storage → services/storage}/provider-settings-legacy-migration.ts +2 -2
  194. package/src/{storage → services/storage}/provider-settings-manager.ts +2 -2
  195. package/src/services/storage/session-store.ts +1 -0
  196. package/src/{storage → services/storage}/sqlite-session-store.ts +7 -12
  197. package/src/{storage → services/storage}/sqlite-team-store.ts +4 -4
  198. package/src/{storage → services/storage}/team-store.ts +1 -1
  199. package/src/{session/utils → services}/usage.ts +1 -1
  200. package/src/{input → services/workspace}/file-indexer.test.ts +30 -1
  201. package/src/{input → services/workspace}/file-indexer.ts +26 -2
  202. package/src/{input → services/workspace}/mention-enricher.test.ts +21 -0
  203. package/src/{input → services/workspace}/mention-enricher.ts +1 -1
  204. package/src/session/file-session-service.ts +9 -7
  205. package/src/session/index.ts +25 -17
  206. package/src/session/persistence-service.test.ts +86 -27
  207. package/src/session/persistence-service.ts +104 -103
  208. package/src/session/rpc-session-service.ts +9 -2
  209. package/src/session/session-service.team-persistence.test.ts +1 -1
  210. package/src/session/session-service.ts +32 -19
  211. package/src/session/session-team-coordination.ts +13 -6
  212. package/src/session/sqlite-rpc-session-backend.ts +4 -6
  213. package/src/session/workspace-manager.ts +1 -1
  214. package/src/{session/default-session-manager.e2e.test.ts → transports/local.e2e.test.ts} +13 -17
  215. package/src/{session/default-session-manager.test.ts → transports/local.test.ts} +316 -230
  216. package/src/{session/default-session-manager.ts → transports/local.ts} +137 -169
  217. package/src/transports/rpc.test.ts +82 -0
  218. package/src/transports/rpc.ts +665 -0
  219. package/src/transports/runtime-host-support.ts +86 -0
  220. package/src/types/config.ts +2 -2
  221. package/src/{session/utils/types.ts → types/session.ts} +18 -5
  222. package/src/types/sessions.ts +21 -0
  223. package/src/types/storage.ts +1 -6
  224. package/src/types.ts +25 -18
  225. package/dist/chat/chat-schema.d.ts.map +0 -1
  226. package/dist/input/file-indexer.d.ts.map +0 -1
  227. package/dist/input/index.d.ts.map +0 -1
  228. package/dist/input/mention-enricher.d.ts.map +0 -1
  229. package/dist/prompt/default-system.d.ts +0 -2
  230. package/dist/prompt/default-system.d.ts.map +0 -1
  231. package/dist/providers/local-provider-registry.d.ts.map +0 -1
  232. package/dist/providers/local-provider-service.d.ts.map +0 -1
  233. package/dist/runtime/checkpoint-hooks.d.ts.map +0 -1
  234. package/dist/runtime/hook-file-hooks.d.ts.map +0 -1
  235. package/dist/session/default-session-manager.d.ts.map +0 -1
  236. package/dist/session/session-agent-events.d.ts.map +0 -1
  237. package/dist/session/session-artifacts.d.ts.map +0 -1
  238. package/dist/session/session-config-builder.d.ts +0 -16
  239. package/dist/session/session-config-builder.d.ts.map +0 -1
  240. package/dist/session/session-host.d.ts +0 -15
  241. package/dist/session/session-host.d.ts.map +0 -1
  242. package/dist/session/session-manager.d.ts.map +0 -1
  243. package/dist/session/session-telemetry.d.ts.map +0 -1
  244. package/dist/session/utils/helpers.d.ts.map +0 -1
  245. package/dist/session/utils/types.d.ts.map +0 -1
  246. package/dist/session/utils/usage.d.ts.map +0 -1
  247. package/dist/session/workspace-manifest.d.ts.map +0 -1
  248. package/dist/storage/file-team-store.d.ts.map +0 -1
  249. package/dist/storage/provider-settings-legacy-migration.d.ts.map +0 -1
  250. package/dist/storage/provider-settings-manager.d.ts.map +0 -1
  251. package/dist/storage/sqlite-session-store.d.ts.map +0 -1
  252. package/dist/storage/sqlite-team-store.d.ts.map +0 -1
  253. package/dist/storage/team-store.d.ts.map +0 -1
  254. package/dist/team/delegated-agent.d.ts.map +0 -1
  255. package/dist/team/index.d.ts.map +0 -1
  256. package/dist/team/multi-agent.d.ts.map +0 -1
  257. package/dist/team/projections.d.ts.map +0 -1
  258. package/dist/team/runtime.d.ts.map +0 -1
  259. package/dist/team/spawn-agent-tool.d.ts.map +0 -1
  260. package/dist/team/subagent-prompts.d.ts.map +0 -1
  261. package/dist/team/team-tools.d.ts.map +0 -1
  262. package/dist/telemetry/ITelemetryAdapter.d.ts.map +0 -1
  263. package/dist/telemetry/OpenTelemetryAdapter.d.ts.map +0 -1
  264. package/dist/telemetry/OpenTelemetryProvider.d.ts.map +0 -1
  265. package/dist/telemetry/TelemetryLoggerSink.d.ts.map +0 -1
  266. package/dist/telemetry/TelemetryService.d.ts.map +0 -1
  267. package/dist/telemetry/core-events.d.ts.map +0 -1
  268. package/dist/telemetry/distinct-id.d.ts.map +0 -1
  269. package/dist/telemetry/index.d.ts.map +0 -1
  270. package/dist/tools/constants.d.ts.map +0 -1
  271. package/dist/tools/definitions.d.ts.map +0 -1
  272. package/dist/tools/executors/apply-patch-parser.d.ts.map +0 -1
  273. package/dist/tools/executors/apply-patch.d.ts.map +0 -1
  274. package/dist/tools/executors/bash.d.ts.map +0 -1
  275. package/dist/tools/executors/editor.d.ts.map +0 -1
  276. package/dist/tools/executors/file-read.d.ts.map +0 -1
  277. package/dist/tools/executors/index.d.ts.map +0 -1
  278. package/dist/tools/executors/search.d.ts.map +0 -1
  279. package/dist/tools/executors/web-fetch.d.ts.map +0 -1
  280. package/dist/tools/helpers.d.ts.map +0 -1
  281. package/dist/tools/index.d.ts.map +0 -1
  282. package/dist/tools/model-tool-routing.d.ts.map +0 -1
  283. package/dist/tools/presets.d.ts.map +0 -1
  284. package/dist/tools/schemas.d.ts.map +0 -1
  285. package/dist/tools/types.d.ts.map +0 -1
  286. package/src/prompt/default-system.ts +0 -21
  287. package/src/session/session-config-builder.ts +0 -172
  288. package/src/session/session-host.test.ts +0 -89
  289. package/src/session/session-host.ts +0 -213
  290. package/src/session/session-manager.ts +0 -74
  291. package/src/storage/artifact-store.ts +0 -1
  292. package/src/storage/session-store.ts +0 -1
  293. package/src/team/multi-agent.lifecycle.test.ts +0 -201
  294. package/src/tools/executors/file-read.test.ts +0 -49
  295. /package/dist/{tools → extensions/tools}/constants.d.ts +0 -0
  296. /package/dist/{tools → extensions/tools}/definitions.d.ts +0 -0
  297. /package/dist/{tools → extensions/tools}/executors/apply-patch-parser.d.ts +0 -0
  298. /package/dist/{tools → extensions/tools}/executors/apply-patch.d.ts +0 -0
  299. /package/dist/{tools → extensions/tools}/executors/bash.d.ts +0 -0
  300. /package/dist/{tools → extensions/tools}/executors/editor.d.ts +0 -0
  301. /package/dist/{tools → extensions/tools}/executors/file-read.d.ts +0 -0
  302. /package/dist/{tools → extensions/tools}/executors/index.d.ts +0 -0
  303. /package/dist/{tools → extensions/tools}/executors/search.d.ts +0 -0
  304. /package/dist/{tools → extensions/tools}/executors/web-fetch.d.ts +0 -0
  305. /package/dist/{tools → extensions/tools}/helpers.d.ts +0 -0
  306. /package/dist/{tools → extensions/tools}/index.d.ts +0 -0
  307. /package/dist/{tools → extensions/tools}/schemas.d.ts +0 -0
  308. /package/dist/{team → extensions/tools/team}/delegated-agent.d.ts +0 -0
  309. /package/dist/{team → extensions/tools/team}/index.d.ts +0 -0
  310. /package/dist/{team → extensions/tools/team}/projections.d.ts +0 -0
  311. /package/dist/{team → extensions/tools/team}/runtime.d.ts +0 -0
  312. /package/dist/{team → extensions/tools/team}/subagent-prompts.d.ts +0 -0
  313. /package/dist/{team → extensions/tools/team}/team-tools.d.ts +0 -0
  314. /package/dist/{session → runtime}/rpc-spawn-lease.d.ts +0 -0
  315. /package/dist/{providers → services/providers}/local-provider-registry.d.ts +0 -0
  316. /package/dist/{providers → services/providers}/local-provider-service.d.ts +0 -0
  317. /package/dist/{telemetry → services/telemetry}/ITelemetryAdapter.d.ts +0 -0
  318. /package/dist/{telemetry → services/telemetry}/OpenTelemetryAdapter.d.ts +0 -0
  319. /package/dist/{telemetry → services/telemetry}/OpenTelemetryProvider.d.ts +0 -0
  320. /package/dist/{telemetry → services/telemetry}/TelemetryLoggerSink.d.ts +0 -0
  321. /package/dist/{telemetry → services/telemetry}/TelemetryService.d.ts +0 -0
  322. /package/dist/{telemetry → services/telemetry}/core-events.d.ts +0 -0
  323. /package/dist/{telemetry → services/telemetry}/distinct-id.d.ts +0 -0
  324. /package/dist/{telemetry → services/telemetry}/index.d.ts +0 -0
  325. /package/dist/{input → services/workspace}/file-indexer.d.ts +0 -0
  326. /package/dist/{input → services/workspace}/index.d.ts +0 -0
  327. /package/dist/{input → services/workspace}/mention-enricher.d.ts +0 -0
  328. /package/dist/{session → services}/workspace-manifest.d.ts +0 -0
  329. /package/dist/{chat → types}/chat-schema.d.ts +0 -0
  330. /package/src/{tools → extensions/tools}/constants.ts +0 -0
  331. /package/src/{tools → extensions/tools}/definitions.test.ts +0 -0
  332. /package/src/{tools → extensions/tools}/executors/apply-patch-parser.ts +0 -0
  333. /package/src/{tools → extensions/tools}/executors/apply-patch.ts +0 -0
  334. /package/src/{tools → extensions/tools}/executors/bash.test.ts +0 -0
  335. /package/src/{tools → extensions/tools}/executors/bash.ts +0 -0
  336. /package/src/{tools → extensions/tools}/executors/editor.test.ts +0 -0
  337. /package/src/{tools → extensions/tools}/executors/editor.ts +0 -0
  338. /package/src/{tools → extensions/tools}/executors/index.ts +0 -0
  339. /package/src/{tools → extensions/tools}/executors/web-fetch.ts +0 -0
  340. /package/src/{tools → extensions/tools}/helpers.ts +0 -0
  341. /package/src/{tools → extensions/tools}/index.ts +0 -0
  342. /package/src/{tools → extensions/tools}/model-tool-routing.test.ts +0 -0
  343. /package/src/{tools → extensions/tools}/presets.test.ts +0 -0
  344. /package/src/{tools → extensions/tools}/schemas.ts +0 -0
  345. /package/src/{team → extensions/tools/team}/delegated-agent.ts +0 -0
  346. /package/src/{team → extensions/tools/team}/index.ts +0 -0
  347. /package/src/{team → extensions/tools/team}/projections.ts +0 -0
  348. /package/src/{team → extensions/tools/team}/runtime.ts +0 -0
  349. /package/src/{runtime → hooks}/checkpoint-hooks.test.ts +0 -0
  350. /package/src/{runtime → hooks}/hook-file-hooks.test.ts +0 -0
  351. /package/src/{session → runtime}/runtime-oauth-token-manager.test.ts +0 -0
  352. /package/src/{providers → services/providers}/local-provider-registry.ts +0 -0
  353. /package/src/{providers → services/providers}/local-provider-service.test.ts +0 -0
  354. /package/src/{storage → services/storage}/index.ts +0 -0
  355. /package/src/{storage → services/storage}/provider-settings-manager.test.ts +0 -0
  356. /package/src/{telemetry → services/telemetry}/ITelemetryAdapter.ts +0 -0
  357. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.test.ts +0 -0
  358. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.ts +0 -0
  359. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.test.ts +0 -0
  360. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.ts +0 -0
  361. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.test.ts +0 -0
  362. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.ts +0 -0
  363. /package/src/{telemetry → services/telemetry}/TelemetryService.test.ts +0 -0
  364. /package/src/{telemetry → services/telemetry}/TelemetryService.ts +0 -0
  365. /package/src/{telemetry → services/telemetry}/core-events.ts +0 -0
  366. /package/src/{telemetry → services/telemetry}/distinct-id.test.ts +0 -0
  367. /package/src/{telemetry → services/telemetry}/distinct-id.ts +0 -0
  368. /package/src/{telemetry → services/telemetry}/index.ts +0 -0
  369. /package/src/{input → services/workspace}/file-indexer.d.ts +0 -0
  370. /package/src/{input → services/workspace}/index.ts +0 -0
  371. /package/src/{session → services}/workspace-manifest.ts +0 -0
  372. /package/src/{chat → types}/chat-schema.ts +0 -0
@@ -0,0 +1,665 @@
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
+ }