@clinebot/core 0.0.33 → 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 (412) 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/auth/client.d.ts +19 -0
  5. package/dist/auth/client.d.ts.map +1 -1
  6. package/dist/auth/cline.d.ts.map +1 -1
  7. package/dist/auth/oca.d.ts.map +1 -1
  8. package/dist/auth/server.d.ts +32 -0
  9. package/dist/auth/server.d.ts.map +1 -1
  10. package/dist/auth/types.d.ts +29 -0
  11. package/dist/auth/types.d.ts.map +1 -1
  12. package/dist/extensions/config/agent-config-loader.d.ts +2 -2
  13. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  14. package/dist/extensions/config/agent-config-parser.d.ts +1 -1
  15. package/dist/extensions/config/agent-config-parser.d.ts.map +1 -1
  16. package/dist/extensions/config/hooks-config-loader.d.ts +2 -2
  17. package/dist/extensions/config/hooks-config-loader.d.ts.map +1 -1
  18. package/dist/extensions/config/index.d.ts +3 -3
  19. package/dist/extensions/config/index.d.ts.map +1 -1
  20. package/dist/extensions/config/user-instruction-config-loader.d.ts +2 -2
  21. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  22. package/dist/extensions/index.d.ts +2 -1
  23. package/dist/extensions/index.d.ts.map +1 -1
  24. package/dist/extensions/plugin/plugin-config-loader.d.ts +2 -1
  25. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  26. package/dist/extensions/plugin/plugin-load-report.d.ts +19 -0
  27. package/dist/extensions/plugin/plugin-load-report.d.ts.map +1 -0
  28. package/dist/extensions/plugin/plugin-loader.d.ts +6 -0
  29. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  30. package/dist/extensions/plugin/plugin-sandbox.d.ts +2 -1
  31. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  32. package/dist/extensions/plugin-sandbox-bootstrap.js +242 -242
  33. package/dist/extensions/tools/constants.d.ts.map +1 -0
  34. package/dist/extensions/tools/definitions.d.ts.map +1 -0
  35. package/dist/extensions/tools/executors/apply-patch-parser.d.ts.map +1 -0
  36. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -0
  37. package/dist/extensions/tools/executors/bash.d.ts.map +1 -0
  38. package/dist/extensions/tools/executors/editor.d.ts.map +1 -0
  39. package/dist/extensions/tools/executors/file-read.d.ts.map +1 -0
  40. package/dist/extensions/tools/executors/index.d.ts.map +1 -0
  41. package/dist/extensions/tools/executors/search.d.ts.map +1 -0
  42. package/dist/extensions/tools/executors/web-fetch.d.ts.map +1 -0
  43. package/dist/extensions/tools/helpers.d.ts.map +1 -0
  44. package/dist/extensions/tools/index.d.ts.map +1 -0
  45. package/dist/{tools → extensions/tools}/model-tool-routing.d.ts +1 -1
  46. package/dist/extensions/tools/model-tool-routing.d.ts.map +1 -0
  47. package/dist/{tools → extensions/tools}/presets.d.ts +1 -2
  48. package/dist/extensions/tools/presets.d.ts.map +1 -0
  49. package/dist/extensions/tools/schemas.d.ts.map +1 -0
  50. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -0
  51. package/dist/extensions/tools/team/index.d.ts.map +1 -0
  52. package/dist/{team → extensions/tools/team}/multi-agent.d.ts +1 -3
  53. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -0
  54. package/dist/extensions/tools/team/projections.d.ts.map +1 -0
  55. package/dist/extensions/tools/team/runtime.d.ts.map +1 -0
  56. package/dist/{team → extensions/tools/team}/spawn-agent-tool.d.ts +0 -1
  57. package/dist/extensions/tools/team/spawn-agent-tool.d.ts.map +1 -0
  58. package/dist/extensions/tools/team/subagent-prompts.d.ts.map +1 -0
  59. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -0
  60. package/dist/{tools → extensions/tools}/types.d.ts +4 -3
  61. package/dist/extensions/tools/types.d.ts.map +1 -0
  62. package/dist/{runtime → hooks}/checkpoint-hooks.d.ts +7 -0
  63. package/dist/hooks/checkpoint-hooks.d.ts.map +1 -0
  64. package/dist/{runtime → hooks}/hook-file-hooks.d.ts +0 -2
  65. package/dist/hooks/hook-file-hooks.d.ts.map +1 -0
  66. package/dist/hooks/subprocess.d.ts +3 -130
  67. package/dist/hooks/subprocess.d.ts.map +1 -1
  68. package/dist/index.d.ts +38 -35
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +386 -384
  71. package/dist/runtime/history.d.ts +4 -0
  72. package/dist/runtime/history.d.ts.map +1 -0
  73. package/dist/runtime/host.d.ts +9 -0
  74. package/dist/runtime/host.d.ts.map +1 -0
  75. package/dist/{session → runtime}/rpc-runtime-ensure.d.ts +13 -1
  76. package/dist/{session → runtime}/rpc-runtime-ensure.d.ts.map +1 -1
  77. package/dist/{session → runtime}/rpc-spawn-lease.d.ts.map +1 -1
  78. package/dist/runtime/runtime-builder.d.ts +1 -1
  79. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  80. package/dist/{session/session-manager.d.ts → runtime/runtime-host.d.ts} +55 -12
  81. package/dist/runtime/runtime-host.d.ts.map +1 -0
  82. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts +1 -1
  83. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts.map +1 -1
  84. package/dist/runtime/session-runtime.d.ts +2 -2
  85. package/dist/runtime/session-runtime.d.ts.map +1 -1
  86. package/dist/runtime/subprocess-sandbox.d.ts +2 -0
  87. package/dist/runtime/subprocess-sandbox.d.ts.map +1 -1
  88. package/dist/runtime/tool-approval.d.ts.map +1 -1
  89. package/dist/{session/session-agent-events.d.ts → services/agent-events.d.ts} +4 -4
  90. package/dist/services/agent-events.d.ts.map +1 -0
  91. package/dist/services/config.d.ts +3 -0
  92. package/dist/services/config.d.ts.map +1 -0
  93. package/dist/services/local-runtime-bootstrap.d.ts +41 -0
  94. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -0
  95. package/dist/services/providers/local-provider-registry.d.ts.map +1 -0
  96. package/dist/services/providers/local-provider-service.d.ts.map +1 -0
  97. package/dist/{session → services}/session-artifacts.d.ts +2 -4
  98. package/dist/services/session-artifacts.d.ts.map +1 -0
  99. package/dist/{session/utils/helpers.d.ts → services/session-data.d.ts} +19 -27
  100. package/dist/services/session-data.d.ts.map +1 -0
  101. package/dist/{session → services}/session-telemetry.d.ts +2 -2
  102. package/dist/services/session-telemetry.d.ts.map +1 -0
  103. package/dist/{storage → services/storage}/file-team-store.d.ts +2 -2
  104. package/dist/services/storage/file-team-store.d.ts.map +1 -0
  105. package/dist/{storage → services/storage}/provider-settings-legacy-migration.d.ts +1 -1
  106. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -0
  107. package/dist/{storage → services/storage}/provider-settings-manager.d.ts +1 -1
  108. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -0
  109. package/dist/{storage → services/storage}/sqlite-session-store.d.ts +3 -3
  110. package/dist/services/storage/sqlite-session-store.d.ts.map +1 -0
  111. package/dist/{storage → services/storage}/sqlite-team-store.d.ts +2 -2
  112. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -0
  113. package/dist/{storage → services/storage}/team-store.d.ts +1 -1
  114. package/dist/services/storage/team-store.d.ts.map +1 -0
  115. package/dist/services/telemetry/ITelemetryAdapter.d.ts.map +1 -0
  116. package/dist/services/telemetry/OpenTelemetryAdapter.d.ts.map +1 -0
  117. package/dist/services/telemetry/OpenTelemetryProvider.d.ts.map +1 -0
  118. package/dist/services/telemetry/TelemetryLoggerSink.d.ts.map +1 -0
  119. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -0
  120. package/dist/services/telemetry/core-events.d.ts.map +1 -0
  121. package/dist/services/telemetry/distinct-id.d.ts.map +1 -0
  122. package/dist/services/telemetry/index.d.ts.map +1 -0
  123. package/dist/{telemetry → services/telemetry}/index.js +6 -6
  124. package/dist/{session/utils → services}/usage.d.ts +1 -1
  125. package/dist/services/usage.d.ts.map +1 -0
  126. package/dist/services/workspace/file-indexer.d.ts.map +1 -0
  127. package/dist/services/workspace/index.d.ts.map +1 -0
  128. package/dist/services/workspace/mention-enricher.d.ts.map +1 -0
  129. package/dist/services/workspace-manifest.d.ts.map +1 -0
  130. package/dist/session/file-session-service.d.ts +4 -1
  131. package/dist/session/file-session-service.d.ts.map +1 -1
  132. package/dist/session/persistence-service.d.ts +8 -6
  133. package/dist/session/persistence-service.d.ts.map +1 -1
  134. package/dist/session/rpc-session-service.d.ts +3 -0
  135. package/dist/session/rpc-session-service.d.ts.map +1 -1
  136. package/dist/session/session-service.d.ts +8 -9
  137. package/dist/session/session-service.d.ts.map +1 -1
  138. package/dist/session/session-team-coordination.d.ts +4 -4
  139. package/dist/session/session-team-coordination.d.ts.map +1 -1
  140. package/dist/session/sqlite-rpc-session-backend.d.ts.map +1 -1
  141. package/dist/{session/default-session-manager.d.ts → transports/local.d.ts} +24 -14
  142. package/dist/transports/local.d.ts.map +1 -0
  143. package/dist/transports/rpc.d.ts +51 -0
  144. package/dist/transports/rpc.d.ts.map +1 -0
  145. package/dist/transports/runtime-host-support.d.ts +21 -0
  146. package/dist/transports/runtime-host-support.d.ts.map +1 -0
  147. package/dist/types/chat-schema.d.ts.map +1 -0
  148. package/dist/types/config.d.ts +3 -2
  149. package/dist/types/config.d.ts.map +1 -1
  150. package/dist/{session/utils/types.d.ts → types/session.d.ts} +15 -6
  151. package/dist/types/session.d.ts.map +1 -0
  152. package/dist/types/sessions.d.ts +19 -0
  153. package/dist/types/sessions.d.ts.map +1 -1
  154. package/dist/types/storage.d.ts +1 -3
  155. package/dist/types/storage.d.ts.map +1 -1
  156. package/dist/types.d.ts +7 -6
  157. package/dist/types.d.ts.map +1 -1
  158. package/package.json +7 -12
  159. package/src/ClineCore.test.ts +95 -19
  160. package/src/ClineCore.ts +120 -50
  161. package/src/auth/client.test.ts +29 -0
  162. package/src/auth/client.ts +21 -0
  163. package/src/auth/cline.ts +3 -1
  164. package/src/auth/codex.ts +1 -1
  165. package/src/auth/oca.ts +3 -1
  166. package/src/auth/server.test.ts +287 -0
  167. package/src/auth/server.ts +50 -1
  168. package/src/auth/types.ts +29 -0
  169. package/src/extensions/config/agent-config-loader.test.ts +3 -3
  170. package/src/extensions/config/agent-config-loader.ts +1 -5
  171. package/src/extensions/config/agent-config-parser.ts +1 -1
  172. package/src/extensions/config/hooks-config-loader.ts +1 -2
  173. package/src/extensions/config/index.ts +0 -4
  174. package/src/extensions/config/user-instruction-config-loader.ts +0 -4
  175. package/src/extensions/index.ts +6 -0
  176. package/src/extensions/plugin/plugin-config-loader.test.ts +39 -0
  177. package/src/extensions/plugin/plugin-config-loader.ts +18 -10
  178. package/src/extensions/plugin/plugin-load-report.ts +20 -0
  179. package/src/extensions/plugin/plugin-loader.test.ts +45 -0
  180. package/src/extensions/plugin/plugin-loader.ts +57 -3
  181. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +158 -86
  182. package/src/extensions/plugin/plugin-sandbox.test.ts +70 -0
  183. package/src/extensions/plugin/plugin-sandbox.ts +17 -6
  184. package/src/{tools → extensions/tools}/definitions.ts +1 -1
  185. package/src/extensions/tools/executors/file-read.test.ts +125 -0
  186. package/src/{tools → extensions/tools}/executors/file-read.ts +29 -4
  187. package/src/{tools → extensions/tools}/executors/search.ts +1 -1
  188. package/src/{tools → extensions/tools}/model-tool-routing.ts +1 -1
  189. package/src/{tools → extensions/tools}/presets.ts +2 -3
  190. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +455 -0
  191. package/src/{team → extensions/tools/team}/multi-agent.ts +80 -17
  192. package/src/{team → extensions/tools/team}/spawn-agent-tool.test.ts +0 -6
  193. package/src/{team → extensions/tools/team}/spawn-agent-tool.ts +1 -7
  194. package/src/{team → extensions/tools/team}/subagent-prompts.ts +2 -2
  195. package/src/{team → extensions/tools/team}/team-tools.test.ts +146 -30
  196. package/src/{team → extensions/tools/team}/team-tools.ts +98 -69
  197. package/src/{tools → extensions/tools}/types.ts +5 -3
  198. package/src/{runtime → hooks}/checkpoint-hooks.ts +27 -0
  199. package/src/{runtime → hooks}/hook-file-hooks.test.ts +42 -7
  200. package/src/{runtime → hooks}/hook-file-hooks.ts +6 -11
  201. package/src/hooks/subprocess.ts +48 -257
  202. package/src/index.ts +178 -158
  203. package/src/runtime/history.test.ts +114 -0
  204. package/src/runtime/history.ts +237 -0
  205. package/src/runtime/host.test.ts +230 -0
  206. package/src/runtime/host.ts +362 -0
  207. package/src/runtime/rpc-runtime-ensure.test.ts +123 -0
  208. package/src/{session → runtime}/rpc-runtime-ensure.ts +165 -27
  209. package/src/{session → runtime}/rpc-spawn-lease.test.ts +33 -1
  210. package/src/{session → runtime}/rpc-spawn-lease.ts +54 -20
  211. package/src/runtime/runtime-builder.team-persistence.test.ts +6 -3
  212. package/src/runtime/runtime-builder.test.ts +101 -4
  213. package/src/runtime/runtime-builder.ts +125 -86
  214. package/src/runtime/runtime-host.ts +178 -0
  215. package/src/{session → runtime}/runtime-oauth-token-manager.ts +1 -1
  216. package/src/runtime/runtime-parity.test.ts +1 -1
  217. package/src/runtime/session-runtime.ts +2 -2
  218. package/src/runtime/subprocess-sandbox.ts +26 -23
  219. package/src/runtime/tool-approval.ts +13 -15
  220. package/src/{session/session-agent-events.ts → services/agent-events.ts} +7 -7
  221. package/src/services/config.ts +5 -0
  222. package/src/services/local-runtime-bootstrap.ts +280 -0
  223. package/src/{providers → services/providers}/local-provider-service.ts +4 -4
  224. package/src/{session → services}/session-artifacts.ts +23 -19
  225. package/src/{session/utils/helpers.test.ts → services/session-data.test.ts} +1 -1
  226. package/src/{session/utils/helpers.ts → services/session-data.ts} +76 -72
  227. package/src/{session → services}/session-telemetry.ts +7 -9
  228. package/src/services/storage/artifact-store.ts +1 -0
  229. package/src/{storage → services/storage}/file-team-store.ts +2 -2
  230. package/src/{storage → services/storage}/provider-settings-legacy-migration.test.ts +1 -1
  231. package/src/{storage → services/storage}/provider-settings-legacy-migration.ts +2 -2
  232. package/src/{storage → services/storage}/provider-settings-manager.ts +2 -2
  233. package/src/services/storage/session-store.ts +1 -0
  234. package/src/{storage → services/storage}/sqlite-session-store.ts +7 -12
  235. package/src/{storage → services/storage}/sqlite-team-store.ts +4 -4
  236. package/src/{storage → services/storage}/team-store.ts +1 -1
  237. package/src/{session/utils → services}/usage.ts +1 -1
  238. package/src/{input → services/workspace}/file-indexer.test.ts +30 -1
  239. package/src/{input → services/workspace}/file-indexer.ts +26 -2
  240. package/src/{input → services/workspace}/mention-enricher.test.ts +21 -0
  241. package/src/{input → services/workspace}/mention-enricher.ts +1 -1
  242. package/src/session/file-session-service.ts +9 -7
  243. package/src/session/index.ts +25 -17
  244. package/src/session/persistence-service.test.ts +121 -24
  245. package/src/session/persistence-service.ts +118 -102
  246. package/src/session/rpc-session-service.ts +9 -2
  247. package/src/session/session-service.team-persistence.test.ts +1 -1
  248. package/src/session/session-service.ts +32 -19
  249. package/src/session/session-team-coordination.ts +13 -6
  250. package/src/session/sqlite-rpc-session-backend.ts +4 -6
  251. package/src/session/workspace-manager.ts +1 -1
  252. package/src/{session/default-session-manager.e2e.test.ts → transports/local.e2e.test.ts} +13 -17
  253. package/src/{session/default-session-manager.test.ts → transports/local.test.ts} +316 -230
  254. package/src/{session/default-session-manager.ts → transports/local.ts} +138 -172
  255. package/src/transports/rpc.test.ts +82 -0
  256. package/src/transports/rpc.ts +665 -0
  257. package/src/transports/runtime-host-support.ts +86 -0
  258. package/src/types/config.ts +3 -2
  259. package/src/{session/utils/types.ts → types/session.ts} +18 -5
  260. package/src/types/sessions.ts +21 -0
  261. package/src/types/storage.ts +1 -6
  262. package/src/types.ts +25 -18
  263. package/dist/chat/chat-schema.d.ts.map +0 -1
  264. package/dist/input/file-indexer.d.ts.map +0 -1
  265. package/dist/input/index.d.ts.map +0 -1
  266. package/dist/input/mention-enricher.d.ts.map +0 -1
  267. package/dist/prompt/default-system.d.ts +0 -2
  268. package/dist/prompt/default-system.d.ts.map +0 -1
  269. package/dist/providers/local-provider-registry.d.ts.map +0 -1
  270. package/dist/providers/local-provider-service.d.ts.map +0 -1
  271. package/dist/runtime/checkpoint-hooks.d.ts.map +0 -1
  272. package/dist/runtime/hook-file-hooks.d.ts.map +0 -1
  273. package/dist/runtime/team-runtime-registry.d.ts +0 -13
  274. package/dist/runtime/team-runtime-registry.d.ts.map +0 -1
  275. package/dist/session/default-session-manager.d.ts.map +0 -1
  276. package/dist/session/session-agent-events.d.ts.map +0 -1
  277. package/dist/session/session-artifacts.d.ts.map +0 -1
  278. package/dist/session/session-config-builder.d.ts +0 -16
  279. package/dist/session/session-config-builder.d.ts.map +0 -1
  280. package/dist/session/session-host.d.ts +0 -15
  281. package/dist/session/session-host.d.ts.map +0 -1
  282. package/dist/session/session-manager.d.ts.map +0 -1
  283. package/dist/session/session-telemetry.d.ts.map +0 -1
  284. package/dist/session/utils/helpers.d.ts.map +0 -1
  285. package/dist/session/utils/types.d.ts.map +0 -1
  286. package/dist/session/utils/usage.d.ts.map +0 -1
  287. package/dist/session/workspace-manifest.d.ts.map +0 -1
  288. package/dist/storage/file-team-store.d.ts.map +0 -1
  289. package/dist/storage/provider-settings-legacy-migration.d.ts.map +0 -1
  290. package/dist/storage/provider-settings-manager.d.ts.map +0 -1
  291. package/dist/storage/sqlite-session-store.d.ts.map +0 -1
  292. package/dist/storage/sqlite-team-store.d.ts.map +0 -1
  293. package/dist/storage/team-store.d.ts.map +0 -1
  294. package/dist/team/delegated-agent.d.ts.map +0 -1
  295. package/dist/team/index.d.ts.map +0 -1
  296. package/dist/team/multi-agent.d.ts.map +0 -1
  297. package/dist/team/projections.d.ts.map +0 -1
  298. package/dist/team/runtime.d.ts.map +0 -1
  299. package/dist/team/spawn-agent-tool.d.ts.map +0 -1
  300. package/dist/team/subagent-prompts.d.ts.map +0 -1
  301. package/dist/team/team-tools.d.ts.map +0 -1
  302. package/dist/telemetry/ITelemetryAdapter.d.ts.map +0 -1
  303. package/dist/telemetry/OpenTelemetryAdapter.d.ts.map +0 -1
  304. package/dist/telemetry/OpenTelemetryProvider.d.ts.map +0 -1
  305. package/dist/telemetry/TelemetryLoggerSink.d.ts.map +0 -1
  306. package/dist/telemetry/TelemetryService.d.ts.map +0 -1
  307. package/dist/telemetry/core-events.d.ts.map +0 -1
  308. package/dist/telemetry/distinct-id.d.ts.map +0 -1
  309. package/dist/telemetry/index.d.ts.map +0 -1
  310. package/dist/tools/constants.d.ts.map +0 -1
  311. package/dist/tools/definitions.d.ts.map +0 -1
  312. package/dist/tools/executors/apply-patch-parser.d.ts.map +0 -1
  313. package/dist/tools/executors/apply-patch.d.ts.map +0 -1
  314. package/dist/tools/executors/bash.d.ts.map +0 -1
  315. package/dist/tools/executors/editor.d.ts.map +0 -1
  316. package/dist/tools/executors/file-read.d.ts.map +0 -1
  317. package/dist/tools/executors/index.d.ts.map +0 -1
  318. package/dist/tools/executors/search.d.ts.map +0 -1
  319. package/dist/tools/executors/web-fetch.d.ts.map +0 -1
  320. package/dist/tools/helpers.d.ts.map +0 -1
  321. package/dist/tools/index.d.ts.map +0 -1
  322. package/dist/tools/model-tool-routing.d.ts.map +0 -1
  323. package/dist/tools/presets.d.ts.map +0 -1
  324. package/dist/tools/schemas.d.ts.map +0 -1
  325. package/dist/tools/types.d.ts.map +0 -1
  326. package/src/prompt/default-system.ts +0 -21
  327. package/src/runtime/team-runtime-registry.ts +0 -43
  328. package/src/session/session-config-builder.ts +0 -126
  329. package/src/session/session-host.test.ts +0 -89
  330. package/src/session/session-host.ts +0 -213
  331. package/src/session/session-manager.ts +0 -74
  332. package/src/storage/artifact-store.ts +0 -1
  333. package/src/storage/session-store.ts +0 -1
  334. package/src/team/multi-agent.lifecycle.test.ts +0 -201
  335. package/src/tools/executors/file-read.test.ts +0 -49
  336. /package/dist/{tools → extensions/tools}/constants.d.ts +0 -0
  337. /package/dist/{tools → extensions/tools}/definitions.d.ts +0 -0
  338. /package/dist/{tools → extensions/tools}/executors/apply-patch-parser.d.ts +0 -0
  339. /package/dist/{tools → extensions/tools}/executors/apply-patch.d.ts +0 -0
  340. /package/dist/{tools → extensions/tools}/executors/bash.d.ts +0 -0
  341. /package/dist/{tools → extensions/tools}/executors/editor.d.ts +0 -0
  342. /package/dist/{tools → extensions/tools}/executors/file-read.d.ts +0 -0
  343. /package/dist/{tools → extensions/tools}/executors/index.d.ts +0 -0
  344. /package/dist/{tools → extensions/tools}/executors/search.d.ts +0 -0
  345. /package/dist/{tools → extensions/tools}/executors/web-fetch.d.ts +0 -0
  346. /package/dist/{tools → extensions/tools}/helpers.d.ts +0 -0
  347. /package/dist/{tools → extensions/tools}/index.d.ts +0 -0
  348. /package/dist/{tools → extensions/tools}/schemas.d.ts +0 -0
  349. /package/dist/{team → extensions/tools/team}/delegated-agent.d.ts +0 -0
  350. /package/dist/{team → extensions/tools/team}/index.d.ts +0 -0
  351. /package/dist/{team → extensions/tools/team}/projections.d.ts +0 -0
  352. /package/dist/{team → extensions/tools/team}/runtime.d.ts +0 -0
  353. /package/dist/{team → extensions/tools/team}/subagent-prompts.d.ts +0 -0
  354. /package/dist/{team → extensions/tools/team}/team-tools.d.ts +0 -0
  355. /package/dist/{session → runtime}/rpc-spawn-lease.d.ts +0 -0
  356. /package/dist/{providers → services/providers}/local-provider-registry.d.ts +0 -0
  357. /package/dist/{providers → services/providers}/local-provider-service.d.ts +0 -0
  358. /package/dist/{telemetry → services/telemetry}/ITelemetryAdapter.d.ts +0 -0
  359. /package/dist/{telemetry → services/telemetry}/OpenTelemetryAdapter.d.ts +0 -0
  360. /package/dist/{telemetry → services/telemetry}/OpenTelemetryProvider.d.ts +0 -0
  361. /package/dist/{telemetry → services/telemetry}/TelemetryLoggerSink.d.ts +0 -0
  362. /package/dist/{telemetry → services/telemetry}/TelemetryService.d.ts +0 -0
  363. /package/dist/{telemetry → services/telemetry}/core-events.d.ts +0 -0
  364. /package/dist/{telemetry → services/telemetry}/distinct-id.d.ts +0 -0
  365. /package/dist/{telemetry → services/telemetry}/index.d.ts +0 -0
  366. /package/dist/{input → services/workspace}/file-indexer.d.ts +0 -0
  367. /package/dist/{input → services/workspace}/index.d.ts +0 -0
  368. /package/dist/{input → services/workspace}/mention-enricher.d.ts +0 -0
  369. /package/dist/{session → services}/workspace-manifest.d.ts +0 -0
  370. /package/dist/{chat → types}/chat-schema.d.ts +0 -0
  371. /package/src/{tools → extensions/tools}/constants.ts +0 -0
  372. /package/src/{tools → extensions/tools}/definitions.test.ts +0 -0
  373. /package/src/{tools → extensions/tools}/executors/apply-patch-parser.ts +0 -0
  374. /package/src/{tools → extensions/tools}/executors/apply-patch.ts +0 -0
  375. /package/src/{tools → extensions/tools}/executors/bash.test.ts +0 -0
  376. /package/src/{tools → extensions/tools}/executors/bash.ts +0 -0
  377. /package/src/{tools → extensions/tools}/executors/editor.test.ts +0 -0
  378. /package/src/{tools → extensions/tools}/executors/editor.ts +0 -0
  379. /package/src/{tools → extensions/tools}/executors/index.ts +0 -0
  380. /package/src/{tools → extensions/tools}/executors/web-fetch.ts +0 -0
  381. /package/src/{tools → extensions/tools}/helpers.ts +0 -0
  382. /package/src/{tools → extensions/tools}/index.ts +0 -0
  383. /package/src/{tools → extensions/tools}/model-tool-routing.test.ts +0 -0
  384. /package/src/{tools → extensions/tools}/presets.test.ts +0 -0
  385. /package/src/{tools → extensions/tools}/schemas.ts +0 -0
  386. /package/src/{team → extensions/tools/team}/delegated-agent.ts +0 -0
  387. /package/src/{team → extensions/tools/team}/index.ts +0 -0
  388. /package/src/{team → extensions/tools/team}/projections.ts +0 -0
  389. /package/src/{team → extensions/tools/team}/runtime.ts +0 -0
  390. /package/src/{runtime → hooks}/checkpoint-hooks.test.ts +0 -0
  391. /package/src/{session → runtime}/runtime-oauth-token-manager.test.ts +0 -0
  392. /package/src/{providers → services/providers}/local-provider-registry.ts +0 -0
  393. /package/src/{providers → services/providers}/local-provider-service.test.ts +0 -0
  394. /package/src/{storage → services/storage}/index.ts +0 -0
  395. /package/src/{storage → services/storage}/provider-settings-manager.test.ts +0 -0
  396. /package/src/{telemetry → services/telemetry}/ITelemetryAdapter.ts +0 -0
  397. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.test.ts +0 -0
  398. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.ts +0 -0
  399. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.test.ts +0 -0
  400. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.ts +0 -0
  401. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.test.ts +0 -0
  402. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.ts +0 -0
  403. /package/src/{telemetry → services/telemetry}/TelemetryService.test.ts +0 -0
  404. /package/src/{telemetry → services/telemetry}/TelemetryService.ts +0 -0
  405. /package/src/{telemetry → services/telemetry}/core-events.ts +0 -0
  406. /package/src/{telemetry → services/telemetry}/distinct-id.test.ts +0 -0
  407. /package/src/{telemetry → services/telemetry}/distinct-id.ts +0 -0
  408. /package/src/{telemetry → services/telemetry}/index.ts +0 -0
  409. /package/src/{input → services/workspace}/file-indexer.d.ts +0 -0
  410. /package/src/{input → services/workspace}/index.ts +0 -0
  411. /package/src/{session → services}/workspace-manifest.ts +0 -0
  412. /package/src/{chat → types}/chat-schema.ts +0 -0
package/src/auth/cline.ts CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  captureAuthStarted,
6
6
  captureAuthSucceeded,
7
7
  identifyAccount,
8
- } from "../telemetry/core-events";
8
+ } from "../services/telemetry/core-events";
9
9
  import { startLocalOAuthServer } from "./server";
10
10
  import type {
11
11
  OAuthCredentials,
@@ -457,6 +457,8 @@ export async function loginClineOAuth(
457
457
  : await startLocalOAuthServer({
458
458
  ports: callbackPorts,
459
459
  callbackPath,
460
+ onListening: options.callbacks.onServerListening,
461
+ onClose: options.callbacks.onServerClose,
460
462
  });
461
463
  const callbackUrl =
462
464
  localServer?.callbackUrl ||
package/src/auth/codex.ts CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  captureAuthStarted,
14
14
  captureAuthSucceeded,
15
15
  identifyAccount,
16
- } from "../telemetry/core-events";
16
+ } from "../services/telemetry/core-events";
17
17
  import { startLocalOAuthServer } from "./server";
18
18
  import type {
19
19
  OAuthCredentials,
package/src/auth/oca.ts CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  captureAuthStarted,
7
7
  captureAuthSucceeded,
8
8
  identifyAccount,
9
- } from "../telemetry/core-events";
9
+ } from "../services/telemetry/core-events";
10
10
  import { BoundedTtlCache } from "./bounded-ttl-cache";
11
11
  import { startLocalOAuthServer } from "./server";
12
12
  import type {
@@ -363,6 +363,8 @@ export async function loginOcaOAuth(
363
363
  const localServer = await startLocalOAuthServer({
364
364
  ports: callbackPorts,
365
365
  callbackPath,
366
+ onListening: options.callbacks.onServerListening,
367
+ onClose: options.callbacks.onServerClose,
366
368
  });
367
369
  const callbackUrl = localServer.callbackUrl;
368
370
  if (!callbackUrl) {
@@ -0,0 +1,287 @@
1
+ import http from "node:http";
2
+ import net from "node:net";
3
+ import { afterEach, describe, expect, it, vi } from "vitest";
4
+ import { startLocalOAuthServer } from "./server";
5
+
6
+ // ---------------------------------------------------------------------------
7
+ // Helpers
8
+ // ---------------------------------------------------------------------------
9
+
10
+ /** Bind to port 0 to let the OS pick a free port, then release it. */
11
+ function getFreePort(): Promise<number> {
12
+ return new Promise((resolve, reject) => {
13
+ const srv = net.createServer();
14
+ srv.listen(0, "127.0.0.1", () => {
15
+ const addr = srv.address() as net.AddressInfo;
16
+ srv.close(() => resolve(addr.port));
17
+ });
18
+ srv.on("error", reject);
19
+ });
20
+ }
21
+
22
+ /** Occupy a port so the OAuth server cannot bind to it. */
23
+ function occupyPort(port: number): Promise<http.Server> {
24
+ return new Promise((resolve, reject) => {
25
+ const srv = http.createServer();
26
+ srv.listen(port, "127.0.0.1", () => resolve(srv));
27
+ srv.on("error", reject);
28
+ });
29
+ }
30
+
31
+ /** Close an http.Server, resolving when the socket is gone. */
32
+ function closeServer(srv: http.Server): Promise<void> {
33
+ return new Promise((resolve, reject) =>
34
+ srv.close((err) => (err ? reject(err) : resolve())),
35
+ );
36
+ }
37
+
38
+ /** Make a GET request and return status + body. */
39
+ function get(url: string): Promise<{ status: number; body: string }> {
40
+ return new Promise((resolve, reject) => {
41
+ http
42
+ .get(url, (res) => {
43
+ let body = "";
44
+ res.on("data", (chunk: Buffer) => {
45
+ body += chunk.toString();
46
+ });
47
+ res.on("end", () => resolve({ status: res.statusCode ?? 0, body }));
48
+ })
49
+ .on("error", reject);
50
+ });
51
+ }
52
+
53
+ /** Flush microtasks + a short macro-task delay for fire-and-forget promises. */
54
+ function flushAsync(): Promise<void> {
55
+ return new Promise((resolve) => setTimeout(resolve, 20));
56
+ }
57
+
58
+ // ---------------------------------------------------------------------------
59
+ // onListening
60
+ // ---------------------------------------------------------------------------
61
+
62
+ describe("auth/server startLocalOAuthServer — onListening", () => {
63
+ it("is called with host, port, and callbackUrl when the server binds", async () => {
64
+ const port = await getFreePort();
65
+ const onListening = vi.fn();
66
+
67
+ const server = await startLocalOAuthServer({
68
+ ports: [port],
69
+ callbackPath: "/callback",
70
+ onListening,
71
+ });
72
+
73
+ expect(onListening).toHaveBeenCalledOnce();
74
+ expect(onListening).toHaveBeenCalledWith({
75
+ host: "127.0.0.1",
76
+ port,
77
+ callbackUrl: `http://127.0.0.1:${port}/callback`,
78
+ });
79
+
80
+ server.close();
81
+ });
82
+
83
+ it("is not called when no port can be bound", async () => {
84
+ const port = await getFreePort();
85
+ const blocker = await occupyPort(port);
86
+ const onListening = vi.fn();
87
+
88
+ await startLocalOAuthServer({
89
+ ports: [port],
90
+ callbackPath: "/callback",
91
+ onListening,
92
+ });
93
+
94
+ expect(onListening).not.toHaveBeenCalled();
95
+
96
+ await closeServer(blocker);
97
+ });
98
+
99
+ it("fires for the first available port and skips occupied ones", async () => {
100
+ const [port1, port2] = await Promise.all([getFreePort(), getFreePort()]);
101
+ const blocker = await occupyPort(port1);
102
+ const onListening = vi.fn();
103
+
104
+ const server = await startLocalOAuthServer({
105
+ ports: [port1, port2],
106
+ callbackPath: "/cb",
107
+ onListening,
108
+ });
109
+
110
+ expect(onListening).toHaveBeenCalledOnce();
111
+ expect(onListening).toHaveBeenCalledWith(
112
+ expect.objectContaining({ port: port2 }),
113
+ );
114
+
115
+ server.close();
116
+ await closeServer(blocker);
117
+ });
118
+
119
+ it("swallows errors thrown by the onListening callback", async () => {
120
+ const port = await getFreePort();
121
+ const onListening = vi
122
+ .fn()
123
+ .mockReturnValue(Promise.reject(new Error("listening boom")));
124
+
125
+ const server = await startLocalOAuthServer({
126
+ ports: [port],
127
+ callbackPath: "/callback",
128
+ onListening,
129
+ });
130
+
131
+ await flushAsync();
132
+ expect(onListening).toHaveBeenCalledOnce();
133
+
134
+ server.close();
135
+ });
136
+ });
137
+
138
+ // ---------------------------------------------------------------------------
139
+ // onClose
140
+ // ---------------------------------------------------------------------------
141
+
142
+ describe("auth/server startLocalOAuthServer — onClose", () => {
143
+ it("is called with host and port when close() is invoked", async () => {
144
+ const port = await getFreePort();
145
+ const onClose = vi.fn();
146
+
147
+ const server = await startLocalOAuthServer({
148
+ ports: [port],
149
+ callbackPath: "/callback",
150
+ onClose,
151
+ });
152
+
153
+ server.close();
154
+
155
+ expect(onClose).toHaveBeenCalledOnce();
156
+ expect(onClose).toHaveBeenCalledWith({ host: "127.0.0.1", port });
157
+ });
158
+
159
+ it("is called with host and port when cancelWait() is invoked", async () => {
160
+ const port = await getFreePort();
161
+ const onClose = vi.fn();
162
+
163
+ const server = await startLocalOAuthServer({
164
+ ports: [port],
165
+ callbackPath: "/callback",
166
+ onClose,
167
+ });
168
+
169
+ server.cancelWait();
170
+
171
+ expect(onClose).toHaveBeenCalledOnce();
172
+ expect(onClose).toHaveBeenCalledWith({ host: "127.0.0.1", port });
173
+ });
174
+
175
+ it("is called after a successful OAuth callback request", async () => {
176
+ const port = await getFreePort();
177
+ const onClose = vi.fn();
178
+
179
+ const server = await startLocalOAuthServer({
180
+ ports: [port],
181
+ callbackPath: "/callback",
182
+ onClose,
183
+ });
184
+
185
+ const waitPromise = server.waitForCallback();
186
+ const { status } = await get(
187
+ `http://127.0.0.1:${port}/callback?code=tok123`,
188
+ );
189
+ expect(status).toBe(200);
190
+
191
+ await waitPromise;
192
+
193
+ expect(onClose).toHaveBeenCalledOnce();
194
+ expect(onClose).toHaveBeenCalledWith({ host: "127.0.0.1", port });
195
+ });
196
+
197
+ it("is not called when no port was bound", async () => {
198
+ const port = await getFreePort();
199
+ const blocker = await occupyPort(port);
200
+ const onClose = vi.fn();
201
+
202
+ const server = await startLocalOAuthServer({
203
+ ports: [port],
204
+ callbackPath: "/callback",
205
+ onClose,
206
+ });
207
+
208
+ server.close();
209
+ expect(onClose).not.toHaveBeenCalled();
210
+
211
+ await closeServer(blocker);
212
+ });
213
+
214
+ it("swallows errors thrown by the onClose callback", async () => {
215
+ const port = await getFreePort();
216
+ const onClose = vi
217
+ .fn()
218
+ .mockReturnValue(Promise.reject(new Error("teardown failed")));
219
+
220
+ const server = await startLocalOAuthServer({
221
+ ports: [port],
222
+ callbackPath: "/callback",
223
+ onClose,
224
+ });
225
+
226
+ server.close();
227
+ await flushAsync();
228
+
229
+ expect(onClose).toHaveBeenCalledOnce();
230
+ });
231
+ });
232
+
233
+ // ---------------------------------------------------------------------------
234
+ // onListening + onClose ordering
235
+ // ---------------------------------------------------------------------------
236
+
237
+ describe("auth/server startLocalOAuthServer — onListening + onClose together", () => {
238
+ afterEach(() => {
239
+ vi.restoreAllMocks();
240
+ });
241
+
242
+ it("fires onListening on bind then onClose after a successful callback", async () => {
243
+ const port = await getFreePort();
244
+ const order: string[] = [];
245
+
246
+ const server = await startLocalOAuthServer({
247
+ ports: [port],
248
+ callbackPath: "/cb",
249
+ onListening: vi.fn(() => {
250
+ order.push("listening");
251
+ }),
252
+ onClose: vi.fn(() => {
253
+ order.push("close");
254
+ }),
255
+ });
256
+
257
+ expect(order).toEqual(["listening"]);
258
+
259
+ const waitPromise = server.waitForCallback();
260
+ await get(`http://127.0.0.1:${port}/cb?code=mycode`);
261
+ const payload = await waitPromise;
262
+
263
+ expect(payload?.code).toBe("mycode");
264
+ expect(order).toEqual(["listening", "close"]);
265
+ });
266
+
267
+ it("fires onListening on bind then onClose after cancelWait()", async () => {
268
+ const port = await getFreePort();
269
+ const order: string[] = [];
270
+
271
+ const server = await startLocalOAuthServer({
272
+ ports: [port],
273
+ callbackPath: "/cb",
274
+ onListening: vi.fn(() => {
275
+ order.push("listening");
276
+ }),
277
+ onClose: vi.fn(() => {
278
+ order.push("close");
279
+ }),
280
+ });
281
+
282
+ expect(order).toEqual(["listening"]);
283
+
284
+ server.cancelWait();
285
+ expect(order).toEqual(["listening", "close"]);
286
+ });
287
+ });
@@ -19,6 +19,17 @@ function createDeferred<T>(): Deferred<T> {
19
19
  return { promise, resolve };
20
20
  }
21
21
 
22
+ export interface OAuthServerListeningInfo {
23
+ host: string;
24
+ port: number;
25
+ callbackUrl: string;
26
+ }
27
+
28
+ export interface OAuthServerCloseInfo {
29
+ host: string;
30
+ port: number;
31
+ }
32
+
22
33
  export interface LocalOAuthServerOptions {
23
34
  host?: string;
24
35
  ports: number[];
@@ -26,6 +37,29 @@ export interface LocalOAuthServerOptions {
26
37
  timeoutMs?: number;
27
38
  expectedState?: string;
28
39
  successHtml?: string;
40
+ /**
41
+ * Called when the local redirect server successfully binds to a port and is
42
+ * ready to receive the OAuth callback. Hosts can use this to display a
43
+ * "waiting for callback" status indicator or — in remote-development
44
+ * environments like JetBrains Gateway — to forward the port from the remote
45
+ * machine to the local machine where the user's browser is running.
46
+ *
47
+ * May be async; `startLocalOAuthServer` will **await** this callback before
48
+ * returning so that any setup it performs (e.g. port-forwarding) is
49
+ * guaranteed to complete before the caller opens the auth URL. Errors
50
+ * thrown by this callback are swallowed — they do not prevent the OAuth
51
+ * flow from proceeding.
52
+ */
53
+ onListening?: (info: OAuthServerListeningInfo) => void | Promise<void>;
54
+ /**
55
+ * Called when the local redirect server closes, either because the OAuth
56
+ * callback was received, the flow was cancelled, or the timeout elapsed.
57
+ * Hosts should use this to tear down any port-forward set up in
58
+ * `onListening` and clear any "waiting for callback" status UI.
59
+ *
60
+ * May be async; fired after the underlying server socket is closed.
61
+ */
62
+ onClose?: (info: OAuthServerCloseInfo) => void | Promise<void>;
29
63
  }
30
64
 
31
65
  export interface LocalOAuthServer {
@@ -48,6 +82,7 @@ export async function startLocalOAuthServer(
48
82
  let settled = false;
49
83
  let timeout: ReturnType<typeof setTimeout> | null = null;
50
84
  let activeServer: import("node:http").Server | null = null;
85
+ let boundPort: number | null = null;
51
86
 
52
87
  const settle = (value: OAuthCallbackPayload | null) => {
53
88
  if (settled) return;
@@ -60,10 +95,17 @@ export async function startLocalOAuthServer(
60
95
  clearTimeout(timeout);
61
96
  timeout = null;
62
97
  }
98
+ const closingPort = boundPort;
99
+ boundPort = null;
63
100
  if (activeServer) {
64
101
  activeServer.close();
65
102
  activeServer = null;
66
103
  }
104
+ if (closingPort !== null && options.onClose) {
105
+ void Promise.resolve(options.onClose({ host, port: closingPort })).catch(
106
+ () => {},
107
+ );
108
+ }
67
109
  };
68
110
 
69
111
  const waitForCallback = async () => {
@@ -149,8 +191,15 @@ export async function startLocalOAuthServer(
149
191
  }
150
192
 
151
193
  if (bindResult.bound) {
194
+ boundPort = port;
195
+ const callbackUrl = `http://${host}:${port}${options.callbackPath}`;
196
+ if (options.onListening) {
197
+ await Promise.resolve(
198
+ options.onListening({ host, port, callbackUrl }),
199
+ ).catch(() => {});
200
+ }
152
201
  return {
153
- callbackUrl: `http://${host}:${port}${options.callbackPath}`,
202
+ callbackUrl,
154
203
  waitForCallback,
155
204
  cancelWait: () => {
156
205
  close();
package/src/auth/types.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { ITelemetryService } from "@clinebot/shared";
2
+ import type { OAuthServerCloseInfo, OAuthServerListeningInfo } from "./server";
2
3
 
3
4
  export interface OAuthPrompt {
4
5
  message: string;
@@ -31,6 +32,34 @@ export interface OAuthLoginCallbacks {
31
32
  onPrompt: (prompt: OAuthPrompt) => Promise<string>;
32
33
  onProgress?: (message: string) => void;
33
34
  onManualCodeInput?: () => Promise<string>;
35
+ /**
36
+ * Called when the local OAuth redirect server successfully binds to a port
37
+ * and is ready to receive the browser callback. The `info` object contains
38
+ * the host, the bound port number, and the full `callbackUrl`.
39
+ *
40
+ * Use this to:
41
+ * - Show a "waiting for OAuth callback on port N" status indicator in your UI.
42
+ * - Forward the port in remote-development environments (e.g. JetBrains
43
+ * Gateway) from the remote machine to the machine running the browser.
44
+ *
45
+ * Paired with `onServerClose` for teardown.
46
+ *
47
+ * Only fired when the provider uses a local callback server
48
+ * (`OAuthProviderInterface.usesCallbackServer === true`).
49
+ */
50
+ onServerListening?: (info: OAuthServerListeningInfo) => void | Promise<void>;
51
+ /**
52
+ * Called when the local OAuth redirect server closes — either because the
53
+ * callback was received, the flow was cancelled, or the timeout elapsed.
54
+ *
55
+ * Use this to:
56
+ * - Clear any "waiting for callback" status UI shown in `onServerListening`.
57
+ * - Tear down port-forwards set up in `onServerListening`.
58
+ *
59
+ * Only fired when the provider uses a local callback server
60
+ * (`OAuthProviderInterface.usesCallbackServer === true`).
61
+ */
62
+ onServerClose?: (info: OAuthServerCloseInfo) => void | Promise<void>;
34
63
  }
35
64
 
36
65
  export interface OAuthProviderInterface {
@@ -2,6 +2,7 @@ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
2
2
  import { tmpdir } from "node:os";
3
3
  import { join } from "node:path";
4
4
  import type { Tool, ToolContext } from "@clinebot/shared";
5
+ import { resolveDocumentsExtensionPath } from "@clinebot/shared/storage";
5
6
  import { afterEach, describe, expect, it } from "vitest";
6
7
  import {
7
8
  AGENT_CONFIG_DIRECTORY_NAME,
@@ -12,7 +13,6 @@ import {
12
13
  resolveAgentConfigSearchPaths,
13
14
  resolveAgentsConfigDirPath,
14
15
  resolveAgentTools,
15
- resolveDocumentsAgentConfigDirectoryPath,
16
16
  toPartialAgentConfig,
17
17
  } from "./agent-config-loader";
18
18
 
@@ -46,7 +46,7 @@ describe("agent config YAML loader", () => {
46
46
  it("includes documents and settings search paths", () => {
47
47
  process.env.CLINE_DATA_DIR = "/tmp/cline-data";
48
48
  expect(resolveAgentConfigSearchPaths()).toEqual([
49
- resolveDocumentsAgentConfigDirectoryPath(),
49
+ resolveDocumentsExtensionPath("Agents"),
50
50
  join("/tmp/cline-data", "settings", AGENT_CONFIG_DIRECTORY_NAME),
51
51
  ]);
52
52
  });
@@ -56,7 +56,7 @@ describe("agent config YAML loader", () => {
56
56
  const definition = createAgentConfigDefinition();
57
57
  expect(definition.type).toBe("agent");
58
58
  expect(definition.directories).toEqual([
59
- resolveDocumentsAgentConfigDirectoryPath(),
59
+ resolveDocumentsExtensionPath("Agents"),
60
60
  join("/tmp/cline-data", "settings", AGENT_CONFIG_DIRECTORY_NAME),
61
61
  ]);
62
62
  expect(definition.includeFile?.("agent.yaml", "/tmp/agent.yaml")).toBe(
@@ -2,7 +2,6 @@ import {
2
2
  AGENT_CONFIG_DIRECTORY_NAME,
3
3
  resolveAgentConfigSearchPaths as resolveAgentConfigSearchPathsFromShared,
4
4
  resolveAgentsConfigDirPath as resolveAgentsConfigDirPathFromShared,
5
- resolveDocumentsAgentConfigDirectoryPath,
6
5
  } from "@clinebot/shared/storage";
7
6
  import {
8
7
  type AgentYamlConfig,
@@ -38,10 +37,7 @@ export type AgentConfigWatcherEvent = UnifiedConfigWatcherEvent<
38
37
  AgentYamlConfig
39
38
  >;
40
39
 
41
- export {
42
- AGENT_CONFIG_DIRECTORY_NAME,
43
- resolveDocumentsAgentConfigDirectoryPath,
44
- };
40
+ export { AGENT_CONFIG_DIRECTORY_NAME };
45
41
 
46
42
  export function resolveAgentsConfigDirPath(): string {
47
43
  return resolveAgentsConfigDirPathFromShared();
@@ -1,7 +1,7 @@
1
1
  import type { AgentConfig, Tool } from "@clinebot/shared";
2
2
  import YAML from "yaml";
3
3
  import { z } from "zod";
4
- import { ALL_DEFAULT_TOOL_NAMES, type DefaultToolName } from "../../tools";
4
+ import { ALL_DEFAULT_TOOL_NAMES, type DefaultToolName } from "../tools/";
5
5
 
6
6
  const AgentConfigFrontmatterSchema = z.object({
7
7
  name: z.string().trim().min(1),
@@ -2,12 +2,11 @@ import { existsSync, readdirSync } from "node:fs";
2
2
  import { basename, extname, join } from "node:path";
3
3
  import {
4
4
  HOOKS_CONFIG_DIRECTORY_NAME,
5
- resolveDocumentsHooksDirectoryPath,
6
5
  resolveHooksConfigSearchPaths as resolveHooksConfigSearchPathsFromShared,
7
6
  } from "@clinebot/shared/storage";
8
7
  import type { HookEventName } from "../../hooks";
9
8
 
10
- export { HOOKS_CONFIG_DIRECTORY_NAME, resolveDocumentsHooksDirectoryPath };
9
+ export { HOOKS_CONFIG_DIRECTORY_NAME };
11
10
 
12
11
  export function resolveHooksConfigSearchPaths(
13
12
  workspacePath?: string,
@@ -17,7 +17,6 @@ export {
17
17
  resolveAgentConfigSearchPaths,
18
18
  resolveAgentsConfigDirPath,
19
19
  resolveAgentTools,
20
- resolveDocumentsAgentConfigDirectoryPath,
21
20
  toPartialAgentConfig,
22
21
  } from "./agent-config-loader";
23
22
  export {
@@ -26,7 +25,6 @@ export {
26
25
  type HookConfigFileEntry,
27
26
  HookConfigFileName,
28
27
  listHookConfigFiles,
29
- resolveDocumentsHooksDirectoryPath,
30
28
  resolveHooksConfigSearchPaths,
31
29
  toHookConfigFileName,
32
30
  } from "./hooks-config-loader";
@@ -71,8 +69,6 @@ export {
71
69
  parseSkillConfigFromMarkdown,
72
70
  parseWorkflowConfigFromMarkdown,
73
71
  RULES_CONFIG_DIRECTORY_NAME,
74
- resolveDocumentsRulesDirectoryPath,
75
- resolveDocumentsWorkflowsDirectoryPath,
76
72
  resolveRulesConfigSearchPaths,
77
73
  resolveSkillsConfigSearchPaths,
78
74
  resolveWorkflowsConfigSearchPaths,
@@ -2,8 +2,6 @@ import { readdir, readFile, stat } from "node:fs/promises";
2
2
  import { basename, dirname, extname, join } from "node:path";
3
3
  import {
4
4
  RULES_CONFIG_DIRECTORY_NAME,
5
- resolveDocumentsRulesDirectoryPath,
6
- resolveDocumentsWorkflowsDirectoryPath,
7
5
  resolveRulesConfigSearchPaths as resolveRulesConfigSearchPathsFromShared,
8
6
  resolveSkillsConfigSearchPaths as resolveSkillsConfigSearchPathsFromShared,
9
7
  resolveWorkflowsConfigSearchPaths as resolveWorkflowsConfigSearchPathsFromShared,
@@ -25,8 +23,6 @@ const MARKDOWN_EXTENSIONS = new Set([".md", ".markdown", ".txt"]);
25
23
 
26
24
  export {
27
25
  RULES_CONFIG_DIRECTORY_NAME,
28
- resolveDocumentsRulesDirectoryPath,
29
- resolveDocumentsWorkflowsDirectoryPath,
30
26
  SKILLS_CONFIG_DIRECTORY_NAME,
31
27
  WORKFLOWS_CONFIG_DIRECTORY_NAME,
32
28
  };
@@ -5,8 +5,14 @@ export {
5
5
  resolveAndLoadAgentPlugins,
6
6
  resolvePluginConfigSearchPaths,
7
7
  } from "./plugin/plugin-config-loader";
8
+ export type {
9
+ PluginInitializationFailure,
10
+ PluginInitializationWarning,
11
+ PluginLoadDiagnostics,
12
+ } from "./plugin/plugin-load-report";
8
13
  export type { LoadAgentPluginFromPathOptions } from "./plugin/plugin-loader";
9
14
  export {
10
15
  loadAgentPluginFromPath,
11
16
  loadAgentPluginsFromPaths,
17
+ loadAgentPluginsFromPathsWithDiagnostics,
12
18
  } from "./plugin/plugin-loader";
@@ -6,6 +6,7 @@ import { afterEach, describe, expect, it } from "vitest";
6
6
  import {
7
7
  discoverPluginModulePaths,
8
8
  resolveAgentPluginPaths,
9
+ resolveAndLoadAgentPlugins,
9
10
  resolvePluginConfigSearchPaths,
10
11
  } from "./plugin-config-loader";
11
12
 
@@ -142,4 +143,42 @@ describe("plugin-config-loader", () => {
142
143
  await rm(workspace, { recursive: true, force: true });
143
144
  }
144
145
  });
146
+
147
+ it("loads valid plugins while reporting failures and duplicate overrides", async () => {
148
+ const root = await mkdtemp(join(tmpdir(), "core-plugin-config-loader-"));
149
+ try {
150
+ const first = join(root, "duplicate-one.js");
151
+ const second = join(root, "duplicate-two.js");
152
+ const invalid = join(root, "invalid.js");
153
+ await writeFile(
154
+ first,
155
+ "export default { name: 'duplicate-plugin', manifest: { capabilities: ['tools'] } };",
156
+ "utf8",
157
+ );
158
+ await writeFile(
159
+ second,
160
+ "export default { name: 'duplicate-plugin', manifest: { capabilities: ['commands'] } };",
161
+ "utf8",
162
+ );
163
+ await writeFile(invalid, "export default { name: 'broken' };", "utf8");
164
+
165
+ const loaded = await resolveAndLoadAgentPlugins({
166
+ mode: "in_process",
167
+ pluginPaths: [first, invalid, second],
168
+ cwd: root,
169
+ });
170
+
171
+ // Filter to only our test plugins to ignore any discovered system plugins
172
+ const testPlugins = loaded.extensions.filter(
173
+ (plugin) => plugin.name === "duplicate-plugin",
174
+ );
175
+ expect(testPlugins).toHaveLength(1);
176
+ expect(testPlugins[0]?.manifest.capabilities).toEqual(["commands"]);
177
+ expect(loaded.failures).toHaveLength(1);
178
+ expect(loaded.warnings).toHaveLength(1);
179
+ expect(loaded.warnings[0]?.overriddenPluginPath).toBe(first);
180
+ } finally {
181
+ await rm(root, { recursive: true, force: true });
182
+ }
183
+ });
145
184
  });