@clinebot/core 0.0.35 → 0.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/README.md +1 -2
  2. package/dist/ClineCore.d.ts +53 -39
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/account/index.d.ts +1 -1
  5. package/dist/account/index.d.ts.map +1 -1
  6. package/dist/account/rpc.d.ts +6 -6
  7. package/dist/account/rpc.d.ts.map +1 -1
  8. package/dist/cron/index.d.ts +6 -0
  9. package/dist/cron/index.d.ts.map +1 -0
  10. package/dist/cron/resource-limiter.d.ts +9 -0
  11. package/dist/cron/resource-limiter.d.ts.map +1 -0
  12. package/dist/cron/schedule-command-service.d.ts +10 -0
  13. package/dist/cron/schedule-command-service.d.ts.map +1 -0
  14. package/dist/cron/schedule-service.d.ts +100 -0
  15. package/dist/cron/schedule-service.d.ts.map +1 -0
  16. package/dist/cron/scheduler.d.ts +66 -0
  17. package/dist/cron/scheduler.d.ts.map +1 -0
  18. package/dist/cron/sqlite-schedule-store.d.ts +52 -0
  19. package/dist/cron/sqlite-schedule-store.d.ts.map +1 -0
  20. package/dist/extensions/config/agent-config-loader.d.ts +4 -3
  21. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  22. package/dist/extensions/config/runtime-commands.d.ts +1 -0
  23. package/dist/extensions/config/runtime-commands.d.ts.map +1 -1
  24. package/dist/extensions/config/user-instruction-config-loader.d.ts +1 -0
  25. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  26. package/dist/extensions/context/agentic-compaction.d.ts +2 -2
  27. package/dist/extensions/context/agentic-compaction.d.ts.map +1 -1
  28. package/dist/extensions/context/compaction-shared.d.ts +5 -4
  29. package/dist/extensions/context/compaction-shared.d.ts.map +1 -1
  30. package/dist/extensions/context/compaction.d.ts.map +1 -1
  31. package/dist/extensions/plugin/plugin-config-loader.d.ts +9 -2
  32. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  33. package/dist/extensions/plugin/plugin-loader.d.ts +5 -3
  34. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  35. package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -1
  36. package/dist/extensions/plugin/plugin-sandbox.d.ts +15 -2
  37. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  38. package/dist/extensions/plugin/plugin-targeting.d.ts +7 -0
  39. package/dist/extensions/plugin/plugin-targeting.d.ts.map +1 -0
  40. package/dist/extensions/plugin-sandbox-bootstrap.js +211 -211
  41. package/dist/extensions/tools/definitions.d.ts +1 -1
  42. package/dist/extensions/tools/definitions.d.ts.map +1 -1
  43. package/dist/extensions/tools/executors/apply-patch.d.ts +3 -1
  44. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -1
  45. package/dist/extensions/tools/executors/search.d.ts +1 -1
  46. package/dist/extensions/tools/executors/search.d.ts.map +1 -1
  47. package/dist/extensions/tools/index.d.ts +2 -0
  48. package/dist/extensions/tools/index.d.ts.map +1 -1
  49. package/dist/extensions/tools/presets.d.ts +26 -43
  50. package/dist/extensions/tools/presets.d.ts.map +1 -1
  51. package/dist/extensions/tools/runtime.d.ts +25 -0
  52. package/dist/extensions/tools/runtime.d.ts.map +1 -0
  53. package/dist/extensions/tools/schemas.d.ts.map +1 -1
  54. package/dist/extensions/tools/team/team-tools.d.ts +1 -0
  55. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -1
  56. package/dist/hooks/hook-file-hooks.d.ts +4 -1
  57. package/dist/hooks/hook-file-hooks.d.ts.map +1 -1
  58. package/dist/hooks/index.d.ts +0 -1
  59. package/dist/hooks/index.d.ts.map +1 -1
  60. package/dist/hooks/subprocess.d.ts +8 -1
  61. package/dist/hooks/subprocess.d.ts.map +1 -1
  62. package/dist/hub/browser-websocket.d.ts +18 -0
  63. package/dist/hub/browser-websocket.d.ts.map +1 -0
  64. package/dist/hub/client.d.ts +45 -0
  65. package/dist/hub/client.d.ts.map +1 -0
  66. package/dist/hub/connect.d.ts +15 -0
  67. package/dist/hub/connect.d.ts.map +1 -0
  68. package/dist/hub/daemon-entry.d.ts +2 -0
  69. package/dist/hub/daemon-entry.d.ts.map +1 -0
  70. package/dist/hub/daemon-entry.js +1045 -0
  71. package/dist/hub/daemon.d.ts +5 -0
  72. package/dist/hub/daemon.d.ts.map +1 -0
  73. package/dist/hub/defaults.d.ts +13 -0
  74. package/dist/hub/defaults.d.ts.map +1 -0
  75. package/dist/hub/discovery.d.ts +29 -0
  76. package/dist/hub/discovery.d.ts.map +1 -0
  77. package/dist/hub/index.d.ts +15 -0
  78. package/dist/hub/index.d.ts.map +1 -0
  79. package/dist/hub/index.js +1044 -0
  80. package/dist/hub/native-transport.d.ts +17 -0
  81. package/dist/hub/native-transport.d.ts.map +1 -0
  82. package/dist/hub/runtime-handlers.d.ts +11 -0
  83. package/dist/hub/runtime-handlers.d.ts.map +1 -0
  84. package/dist/hub/server.d.ts +86 -0
  85. package/dist/hub/server.d.ts.map +1 -0
  86. package/dist/hub/session-client.d.ts +87 -0
  87. package/dist/hub/session-client.d.ts.map +1 -0
  88. package/dist/hub/start-shared-server.d.ts +19 -0
  89. package/dist/hub/start-shared-server.d.ts.map +1 -0
  90. package/dist/hub/transport.d.ts +8 -0
  91. package/dist/hub/transport.d.ts.map +1 -0
  92. package/dist/hub/ui-client.d.ts +44 -0
  93. package/dist/hub/ui-client.d.ts.map +1 -0
  94. package/dist/hub/workspace.d.ts +4 -0
  95. package/dist/hub/workspace.d.ts.map +1 -0
  96. package/dist/index.d.ts +26 -15
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +498 -476
  99. package/dist/llms/configured-provider-registry.d.ts +28 -0
  100. package/dist/llms/configured-provider-registry.d.ts.map +1 -0
  101. package/dist/llms/provider-defaults.d.ts +27 -0
  102. package/dist/llms/provider-defaults.d.ts.map +1 -0
  103. package/dist/llms/provider-settings.d.ts +202 -0
  104. package/dist/llms/provider-settings.d.ts.map +1 -0
  105. package/dist/llms/runtime-config.d.ts +4 -0
  106. package/dist/llms/runtime-config.d.ts.map +1 -0
  107. package/dist/llms/runtime-registry.d.ts +20 -0
  108. package/dist/llms/runtime-registry.d.ts.map +1 -0
  109. package/dist/llms/runtime-types.d.ts +85 -0
  110. package/dist/llms/runtime-types.d.ts.map +1 -0
  111. package/dist/runtime/host.d.ts +1 -2
  112. package/dist/runtime/host.d.ts.map +1 -1
  113. package/dist/runtime/rules.d.ts +1 -0
  114. package/dist/runtime/rules.d.ts.map +1 -1
  115. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  116. package/dist/runtime/runtime-host.d.ts +22 -24
  117. package/dist/runtime/runtime-host.d.ts.map +1 -1
  118. package/dist/runtime/runtime-oauth-token-manager.d.ts.map +1 -1
  119. package/dist/runtime/session-runtime.d.ts +1 -19
  120. package/dist/runtime/session-runtime.d.ts.map +1 -1
  121. package/dist/services/global-settings.d.ts +12 -0
  122. package/dist/services/global-settings.d.ts.map +1 -0
  123. package/dist/services/local-runtime-bootstrap.d.ts +9 -3
  124. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -1
  125. package/dist/services/plugin-tools.d.ts +16 -0
  126. package/dist/services/plugin-tools.d.ts.map +1 -0
  127. package/dist/services/providers/local-provider-registry.d.ts +4 -4
  128. package/dist/services/providers/local-provider-registry.d.ts.map +1 -1
  129. package/dist/services/providers/local-provider-service.d.ts +13 -13
  130. package/dist/services/providers/local-provider-service.d.ts.map +1 -1
  131. package/dist/services/session-data.d.ts +1 -1
  132. package/dist/services/session-data.d.ts.map +1 -1
  133. package/dist/services/storage/provider-settings-legacy-migration.d.ts +1 -1
  134. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -1
  135. package/dist/services/telemetry/index.js +28 -15
  136. package/dist/services/workspace-manifest.d.ts +11 -0
  137. package/dist/services/workspace-manifest.d.ts.map +1 -1
  138. package/dist/session/persistence-service.d.ts +11 -23
  139. package/dist/session/persistence-service.d.ts.map +1 -1
  140. package/dist/session/session-manifest-store.d.ts +22 -0
  141. package/dist/session/session-manifest-store.d.ts.map +1 -0
  142. package/dist/session/session-row.d.ts +93 -0
  143. package/dist/session/session-row.d.ts.map +1 -0
  144. package/dist/session/session-service.d.ts +2 -102
  145. package/dist/session/session-service.d.ts.map +1 -1
  146. package/dist/session/subagent-session-manager.d.ts +36 -0
  147. package/dist/session/subagent-session-manager.d.ts.map +1 -0
  148. package/dist/session/team-persistence-store.d.ts +24 -0
  149. package/dist/session/team-persistence-store.d.ts.map +1 -0
  150. package/dist/transports/hub.d.ts +47 -0
  151. package/dist/transports/hub.d.ts.map +1 -0
  152. package/dist/transports/local.d.ts +10 -6
  153. package/dist/transports/local.d.ts.map +1 -1
  154. package/dist/transports/remote.d.ts +10 -0
  155. package/dist/transports/remote.d.ts.map +1 -0
  156. package/dist/transports/runtime-host-support.d.ts +3 -2
  157. package/dist/transports/runtime-host-support.d.ts.map +1 -1
  158. package/dist/types/chat-schema.d.ts +10 -12
  159. package/dist/types/chat-schema.d.ts.map +1 -1
  160. package/dist/types/config.d.ts +8 -7
  161. package/dist/types/config.d.ts.map +1 -1
  162. package/dist/types/provider-settings.d.ts +4 -5
  163. package/dist/types/provider-settings.d.ts.map +1 -1
  164. package/dist/types/session.d.ts +2 -1
  165. package/dist/types/session.d.ts.map +1 -1
  166. package/dist/types.d.ts +8 -1
  167. package/dist/types.d.ts.map +1 -1
  168. package/package.json +20 -6
  169. package/src/ClineCore.ts +68 -40
  170. package/src/account/index.ts +3 -3
  171. package/src/account/rpc.ts +12 -12
  172. package/src/cron/index.ts +5 -0
  173. package/src/cron/resource-limiter.ts +46 -0
  174. package/src/cron/schedule-command-service.ts +193 -0
  175. package/src/cron/schedule-service.ts +703 -0
  176. package/src/cron/scheduler.ts +637 -0
  177. package/src/cron/sqlite-schedule-store.ts +708 -0
  178. package/src/extensions/config/agent-config-loader.ts +17 -7
  179. package/src/extensions/config/runtime-commands.ts +6 -0
  180. package/src/extensions/config/user-instruction-config-loader.ts +1 -0
  181. package/src/extensions/context/agentic-compaction.ts +3 -3
  182. package/src/extensions/context/basic-compaction.ts +2 -2
  183. package/src/extensions/context/compaction-shared.ts +5 -4
  184. package/src/extensions/context/compaction.ts +3 -3
  185. package/src/extensions/plugin/plugin-config-loader.ts +17 -2
  186. package/src/extensions/plugin/plugin-loader.ts +48 -4
  187. package/src/extensions/plugin/plugin-module-import.ts +0 -2
  188. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +93 -39
  189. package/src/extensions/plugin/plugin-sandbox.ts +47 -27
  190. package/src/extensions/plugin/plugin-targeting.ts +32 -0
  191. package/src/extensions/tools/definitions.ts +30 -49
  192. package/src/extensions/tools/executors/apply-patch.ts +69 -80
  193. package/src/extensions/tools/executors/search.ts +195 -3
  194. package/src/extensions/tools/index.ts +10 -0
  195. package/src/extensions/tools/presets.ts +31 -46
  196. package/src/extensions/tools/runtime.ts +261 -0
  197. package/src/extensions/tools/schemas.ts +4 -2
  198. package/src/extensions/tools/team/team-tools.ts +21 -0
  199. package/src/hooks/hook-file-hooks.ts +8 -2
  200. package/src/hooks/index.ts +0 -7
  201. package/src/hooks/subprocess-runner.ts +1 -1
  202. package/src/hooks/subprocess.ts +9 -0
  203. package/src/hub/browser-websocket.ts +137 -0
  204. package/src/hub/client.ts +574 -0
  205. package/src/hub/connect.ts +156 -0
  206. package/src/hub/daemon-entry.ts +87 -0
  207. package/src/hub/daemon.ts +181 -0
  208. package/src/hub/defaults.ts +43 -0
  209. package/src/hub/discovery.ts +247 -0
  210. package/src/hub/index.ts +14 -0
  211. package/src/hub/native-transport.ts +31 -0
  212. package/src/hub/runtime-handlers.ts +140 -0
  213. package/src/hub/server.ts +1888 -0
  214. package/src/hub/session-client.ts +460 -0
  215. package/src/hub/start-shared-server.ts +58 -0
  216. package/src/hub/transport.ts +14 -0
  217. package/src/hub/ui-client.ts +122 -0
  218. package/src/hub/workspace.ts +19 -0
  219. package/src/index.ts +124 -68
  220. package/src/llms/configured-provider-registry.ts +193 -0
  221. package/src/llms/provider-defaults.ts +637 -0
  222. package/src/llms/provider-settings.ts +263 -0
  223. package/src/llms/runtime-config.ts +43 -0
  224. package/src/llms/runtime-registry.ts +171 -0
  225. package/src/llms/runtime-types.ts +121 -0
  226. package/src/runtime/host.ts +107 -269
  227. package/src/runtime/index.ts +1 -0
  228. package/src/runtime/rules.ts +12 -0
  229. package/src/runtime/runtime-builder.ts +24 -8
  230. package/src/runtime/runtime-host.ts +89 -61
  231. package/src/runtime/runtime-oauth-token-manager.ts +11 -15
  232. package/src/runtime/session-runtime.ts +0 -24
  233. package/src/services/global-settings.ts +122 -0
  234. package/src/services/local-runtime-bootstrap.ts +51 -13
  235. package/src/services/plugin-tools.ts +85 -0
  236. package/src/services/providers/local-provider-registry.ts +6 -6
  237. package/src/services/providers/local-provider-service.ts +42 -37
  238. package/src/services/session-data.ts +15 -9
  239. package/src/services/storage/provider-settings-legacy-migration.ts +6 -4
  240. package/src/services/storage/provider-settings-manager.ts +1 -1
  241. package/src/services/workspace-manifest.ts +18 -0
  242. package/src/session/file-session-service.ts +1 -1
  243. package/src/session/index.ts +6 -27
  244. package/src/session/persistence-service.ts +119 -504
  245. package/src/session/session-manifest-store.ts +158 -0
  246. package/src/session/session-row.ts +199 -0
  247. package/src/session/session-service.ts +17 -376
  248. package/src/session/session-team-coordination.ts +1 -1
  249. package/src/session/subagent-session-manager.ts +397 -0
  250. package/src/session/team-persistence-store.ts +176 -0
  251. package/src/transports/hub.ts +656 -0
  252. package/src/transports/local.ts +135 -40
  253. package/src/transports/remote.ts +26 -0
  254. package/src/transports/runtime-host-support.ts +63 -9
  255. package/src/types/chat-schema.ts +4 -5
  256. package/src/types/config.ts +8 -7
  257. package/src/types/provider-settings.ts +11 -7
  258. package/src/types/session.ts +2 -4
  259. package/src/types.ts +27 -1
  260. package/dist/hooks/persistent.d.ts +0 -64
  261. package/dist/hooks/persistent.d.ts.map +0 -1
  262. package/dist/runtime/rpc-runtime-ensure.d.ts +0 -65
  263. package/dist/runtime/rpc-runtime-ensure.d.ts.map +0 -1
  264. package/dist/runtime/rpc-spawn-lease.d.ts +0 -8
  265. package/dist/runtime/rpc-spawn-lease.d.ts.map +0 -1
  266. package/dist/session/rpc-session-service.d.ts +0 -16
  267. package/dist/session/rpc-session-service.d.ts.map +0 -1
  268. package/dist/session/sqlite-rpc-session-backend.d.ts +0 -31
  269. package/dist/session/sqlite-rpc-session-backend.d.ts.map +0 -1
  270. package/dist/transports/rpc.d.ts +0 -51
  271. package/dist/transports/rpc.d.ts.map +0 -1
  272. package/src/ClineCore.test.ts +0 -226
  273. package/src/account/cline-account-service.test.ts +0 -185
  274. package/src/account/featurebase-token.test.ts +0 -175
  275. package/src/account/rpc.test.ts +0 -63
  276. package/src/auth/bounded-ttl-cache.test.ts +0 -38
  277. package/src/auth/client.test.ts +0 -69
  278. package/src/auth/cline.test.ts +0 -267
  279. package/src/auth/codex.test.ts +0 -170
  280. package/src/auth/oca.test.ts +0 -340
  281. package/src/auth/server.test.ts +0 -287
  282. package/src/auth/utils.test.ts +0 -128
  283. package/src/extensions/config/agent-config-loader.test.ts +0 -236
  284. package/src/extensions/config/hooks-config-loader.test.ts +0 -20
  285. package/src/extensions/config/runtime-commands.test.ts +0 -115
  286. package/src/extensions/config/unified-config-file-watcher.test.ts +0 -196
  287. package/src/extensions/config/user-instruction-config-loader.test.ts +0 -246
  288. package/src/extensions/context/compaction.test.ts +0 -483
  289. package/src/extensions/mcp/config-loader.test.ts +0 -238
  290. package/src/extensions/mcp/manager.test.ts +0 -105
  291. package/src/extensions/plugin/plugin-config-loader.test.ts +0 -184
  292. package/src/extensions/plugin/plugin-loader.test.ts +0 -292
  293. package/src/extensions/plugin/plugin-sandbox.test.ts +0 -423
  294. package/src/extensions/tools/definitions.test.ts +0 -780
  295. package/src/extensions/tools/executors/bash.test.ts +0 -87
  296. package/src/extensions/tools/executors/editor.test.ts +0 -35
  297. package/src/extensions/tools/executors/file-read.test.ts +0 -125
  298. package/src/extensions/tools/model-tool-routing.test.ts +0 -86
  299. package/src/extensions/tools/presets.test.ts +0 -70
  300. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +0 -455
  301. package/src/extensions/tools/team/spawn-agent-tool.test.ts +0 -381
  302. package/src/extensions/tools/team/team-tools.test.ts +0 -918
  303. package/src/hooks/checkpoint-hooks.test.ts +0 -168
  304. package/src/hooks/hook-file-hooks.test.ts +0 -311
  305. package/src/hooks/persistent.ts +0 -661
  306. package/src/runtime/history.test.ts +0 -114
  307. package/src/runtime/host.test.ts +0 -230
  308. package/src/runtime/rpc-runtime-ensure.test.ts +0 -123
  309. package/src/runtime/rpc-runtime-ensure.ts +0 -659
  310. package/src/runtime/rpc-spawn-lease.test.ts +0 -81
  311. package/src/runtime/rpc-spawn-lease.ts +0 -156
  312. package/src/runtime/runtime-builder.team-persistence.test.ts +0 -245
  313. package/src/runtime/runtime-builder.test.ts +0 -615
  314. package/src/runtime/runtime-oauth-token-manager.test.ts +0 -137
  315. package/src/runtime/runtime-parity.test.ts +0 -143
  316. package/src/services/providers/local-provider-service.test.ts +0 -1062
  317. package/src/services/session-data.test.ts +0 -160
  318. package/src/services/storage/provider-settings-legacy-migration.test.ts +0 -424
  319. package/src/services/storage/provider-settings-manager.test.ts +0 -191
  320. package/src/services/telemetry/OpenTelemetryAdapter.test.ts +0 -157
  321. package/src/services/telemetry/OpenTelemetryProvider.test.ts +0 -326
  322. package/src/services/telemetry/TelemetryLoggerSink.test.ts +0 -42
  323. package/src/services/telemetry/TelemetryService.test.ts +0 -134
  324. package/src/services/telemetry/distinct-id.test.ts +0 -57
  325. package/src/services/workspace/file-indexer.d.ts +0 -11
  326. package/src/services/workspace/file-indexer.test.ts +0 -156
  327. package/src/services/workspace/mention-enricher.test.ts +0 -106
  328. package/src/session/persistence-service.test.ts +0 -300
  329. package/src/session/rpc-session-service.ts +0 -114
  330. package/src/session/session-service.team-persistence.test.ts +0 -48
  331. package/src/session/sqlite-rpc-session-backend.ts +0 -301
  332. package/src/transports/local.e2e.test.ts +0 -380
  333. package/src/transports/local.test.ts +0 -2559
  334. package/src/transports/rpc.test.ts +0 -82
  335. package/src/transports/rpc.ts +0 -665
@@ -1,134 +0,0 @@
1
- import type { BasicLogger } from "@clinebot/shared";
2
- import { describe, expect, it, vi } from "vitest";
3
- import type { ITelemetryAdapter } from "./ITelemetryAdapter";
4
- import { TelemetryService } from "./TelemetryService";
5
-
6
- describe("TelemetryService", () => {
7
- it("merges metadata and forwards calls to adapters", async () => {
8
- const { adapter, emit, recordCounter } = createAdapter();
9
- const service = new TelemetryService({
10
- adapters: [adapter],
11
- metadata: {
12
- extension_version: "1.2.3",
13
- cline_type: "cli",
14
- },
15
- distinctId: "distinct-1",
16
- commonProperties: {
17
- organization_id: "org-1",
18
- },
19
- });
20
-
21
- service.capture({
22
- event: "session.started",
23
- properties: { sessionId: "session-1" },
24
- });
25
- service.recordCounter("cline.session.starts.total", 1, {
26
- sessionId: "session-1",
27
- });
28
- await service.flush();
29
- await service.dispose();
30
-
31
- expect(emit).toHaveBeenCalledWith(
32
- "session.started",
33
- expect.objectContaining({
34
- sessionId: "session-1",
35
- organization_id: "org-1",
36
- extension_version: "1.2.3",
37
- cline_type: "cli",
38
- distinct_id: "distinct-1",
39
- }),
40
- );
41
- expect(recordCounter).toHaveBeenCalledWith(
42
- "cline.session.starts.total",
43
- 1,
44
- expect.objectContaining({
45
- sessionId: "session-1",
46
- distinct_id: "distinct-1",
47
- }),
48
- undefined,
49
- false,
50
- );
51
- });
52
-
53
- it("mirrors telemetry events into the logger when provided", () => {
54
- const logger: BasicLogger = {
55
- debug: vi.fn(),
56
- log: vi.fn(),
57
- error: vi.fn(),
58
- };
59
- const service = new TelemetryService({
60
- logger,
61
- metadata: {
62
- extension_version: "1.2.3",
63
- cline_type: "cli",
64
- },
65
- distinctId: "distinct-1",
66
- });
67
-
68
- service.capture({
69
- event: "session.started",
70
- properties: { sessionId: "session-1" },
71
- });
72
- service.captureRequired("user.opt_out", { reason: "manual" });
73
- service.recordCounter("cline.session.starts.total", 1, {
74
- sessionId: "session-1",
75
- });
76
-
77
- expect(logger.log).toHaveBeenCalledWith(
78
- "telemetry.event",
79
- expect.objectContaining({
80
- telemetrySink: "TelemetryLoggerSink",
81
- event: "session.started",
82
- properties: expect.objectContaining({
83
- sessionId: "session-1",
84
- extension_version: "1.2.3",
85
- distinct_id: "distinct-1",
86
- }),
87
- }),
88
- );
89
- expect(logger.log).toHaveBeenCalledWith(
90
- "telemetry.required_event",
91
- expect.objectContaining({
92
- telemetrySink: "TelemetryLoggerSink",
93
- severity: "warn",
94
- event: "user.opt_out",
95
- properties: expect.objectContaining({
96
- reason: "manual",
97
- extension_version: "1.2.3",
98
- }),
99
- }),
100
- );
101
- expect(logger.debug).toHaveBeenCalledWith(
102
- "telemetry.metric",
103
- expect.objectContaining({
104
- telemetrySink: "TelemetryLoggerSink",
105
- instrument: "counter",
106
- name: "cline.session.starts.total",
107
- }),
108
- );
109
- });
110
- });
111
-
112
- function createAdapter(): {
113
- adapter: ITelemetryAdapter;
114
- emit: ReturnType<typeof vi.fn>;
115
- recordCounter: ReturnType<typeof vi.fn>;
116
- } {
117
- const emit = vi.fn();
118
- const recordCounter = vi.fn();
119
- return {
120
- adapter: {
121
- name: "test",
122
- emit,
123
- emitRequired: vi.fn(),
124
- recordCounter,
125
- recordHistogram: vi.fn(),
126
- recordGauge: vi.fn(),
127
- isEnabled: vi.fn(() => true),
128
- flush: vi.fn().mockResolvedValue(undefined),
129
- dispose: vi.fn().mockResolvedValue(undefined),
130
- },
131
- emit,
132
- recordCounter,
133
- };
134
- }
@@ -1,57 +0,0 @@
1
- import { mkdtempSync, rmSync } from "node:fs";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
-
6
- const machineIdSyncMock = vi.hoisted(() => vi.fn());
7
-
8
- vi.mock("node-machine-id", () => ({
9
- machineIdSync: machineIdSyncMock,
10
- }));
11
-
12
- describe("resolveCoreDistinctId", () => {
13
- beforeEach(() => {
14
- vi.resetModules();
15
- });
16
-
17
- afterEach(() => {
18
- machineIdSyncMock.mockReset();
19
- vi.unstubAllEnvs();
20
- vi.restoreAllMocks();
21
- });
22
-
23
- it("returns the explicit distinct ID override when provided", async () => {
24
- const { resolveCoreDistinctId } = await import("./distinct-id");
25
-
26
- expect(resolveCoreDistinctId(" user-provided-id ")).toBe(
27
- "user-provided-id",
28
- );
29
- expect(machineIdSyncMock).not.toHaveBeenCalled();
30
- });
31
-
32
- it("uses node-machine-id when no explicit override is provided", async () => {
33
- machineIdSyncMock.mockReturnValue("machine-id-123");
34
- const { resolveCoreDistinctId } = await import("./distinct-id");
35
-
36
- expect(resolveCoreDistinctId()).toBe("machine-id-123");
37
- });
38
-
39
- it("persists and reuses a generated fallback when machine ID lookup fails", async () => {
40
- const tempDir = mkdtempSync(join(tmpdir(), "cline-distinct-id-"));
41
- try {
42
- vi.stubEnv("CLINE_DATA_DIR", tempDir);
43
- machineIdSyncMock.mockImplementation(() => {
44
- throw new Error("machine id unavailable");
45
- });
46
-
47
- const { resolveCoreDistinctId } = await import("./distinct-id");
48
- const first = resolveCoreDistinctId();
49
- const second = resolveCoreDistinctId();
50
-
51
- expect(first).toMatch(/^cl-/);
52
- expect(second).toBe(first);
53
- } finally {
54
- rmSync(tempDir, { recursive: true, force: true });
55
- }
56
- });
57
- });
@@ -1,11 +0,0 @@
1
- export interface FastFileIndexOptions {
2
- ttlMs?: number;
3
- }
4
- export declare function getFileIndex(
5
- cwd: string,
6
- options?: FastFileIndexOptions,
7
- ): Promise<Set<string>>;
8
- export declare function prewarmFileIndex(
9
- cwd: string,
10
- options?: FastFileIndexOptions,
11
- ): Promise<void>;
@@ -1,156 +0,0 @@
1
- import { chmod, mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
2
- import os from "node:os";
3
- import path from "node:path";
4
- import { describe, expect, it, vi } from "vitest";
5
- import { getFileIndex, prewarmFileIndex } from "./file-indexer";
6
-
7
- vi.mock("node:worker_threads", async () => {
8
- const actual = await vi.importActual<typeof import("node:worker_threads")>(
9
- "node:worker_threads",
10
- );
11
- return {
12
- ...actual,
13
- isMainThread: false,
14
- parentPort: null,
15
- };
16
- });
17
-
18
- async function createTempWorkspace(): Promise<string> {
19
- return mkdtemp(path.join(os.tmpdir(), "core-file-index-"));
20
- }
21
-
22
- describe("file indexer", () => {
23
- it("indexes files by relative posix path", async () => {
24
- const cwd = await createTempWorkspace();
25
- try {
26
- await mkdir(path.join(cwd, "src"), { recursive: true });
27
- await writeFile(path.join(cwd, "src", "main.ts"), "export {}\n", "utf8");
28
- await writeFile(path.join(cwd, "README.md"), "# Demo\n", "utf8");
29
-
30
- const index = await getFileIndex(cwd, { ttlMs: 0 });
31
- expect(index.has("src/main.ts")).toBe(true);
32
- expect(index.has("README.md")).toBe(true);
33
- } finally {
34
- await rm(cwd, { recursive: true, force: true });
35
- }
36
- });
37
-
38
- it("always excludes .git files from index", async () => {
39
- const cwd = await createTempWorkspace();
40
- try {
41
- await mkdir(path.join(cwd, ".git"), { recursive: true });
42
- await mkdir(path.join(cwd, "node_modules", "pkg"), { recursive: true });
43
- await writeFile(path.join(cwd, ".git", "config"), "[core]\n", "utf8");
44
- await writeFile(
45
- path.join(cwd, "node_modules", "pkg", "index.js"),
46
- "module.exports = {}\n",
47
- "utf8",
48
- );
49
- await writeFile(
50
- path.join(cwd, "app.ts"),
51
- "export const app = 1\n",
52
- "utf8",
53
- );
54
-
55
- const index = await getFileIndex(cwd, { ttlMs: 0 });
56
- expect(index.has("app.ts")).toBe(true);
57
- expect(index.has(".git/config")).toBe(false);
58
- } finally {
59
- await rm(cwd, { recursive: true, force: true });
60
- }
61
- });
62
-
63
- it("prewarm rebuilds index and includes new files", async () => {
64
- const cwd = await createTempWorkspace();
65
- try {
66
- await writeFile(
67
- path.join(cwd, "first.ts"),
68
- "export const first = 1\n",
69
- "utf8",
70
- );
71
- const firstIndex = await getFileIndex(cwd, { ttlMs: 60_000 });
72
- expect(firstIndex.has("first.ts")).toBe(true);
73
-
74
- await writeFile(
75
- path.join(cwd, "second.ts"),
76
- "export const second = 2\n",
77
- "utf8",
78
- );
79
- await prewarmFileIndex(cwd, { ttlMs: 60_000 });
80
-
81
- const rebuilt = await getFileIndex(cwd, { ttlMs: 60_000 });
82
- expect(rebuilt.has("second.ts")).toBe(true);
83
- } finally {
84
- await rm(cwd, { recursive: true, force: true });
85
- }
86
- });
87
-
88
- it("skips unreadable directories during fallback indexing", async () => {
89
- const cwd = await createTempWorkspace();
90
- const unreadableDir = path.join(cwd, "private");
91
- try {
92
- await mkdir(unreadableDir, { recursive: true });
93
- await writeFile(
94
- path.join(cwd, "visible.ts"),
95
- "export const ok = 1\n",
96
- "utf8",
97
- );
98
- await writeFile(
99
- path.join(unreadableDir, "hidden.ts"),
100
- "export const hidden = 1\n",
101
- "utf8",
102
- );
103
- await chmod(unreadableDir, 0o000);
104
-
105
- await expect(
106
- prewarmFileIndex(cwd, { ttlMs: 0 }),
107
- ).resolves.toBeUndefined();
108
-
109
- const index = await getFileIndex(cwd, { ttlMs: 0 });
110
- expect(index.has("visible.ts")).toBe(true);
111
- } finally {
112
- await chmod(unreadableDir, 0o755).catch(() => undefined);
113
- await rm(cwd, { recursive: true, force: true });
114
- }
115
- });
116
-
117
- it("evicts stale workspace indexes after 10 minutes when multiple workspaces exist", async () => {
118
- vi.useFakeTimers();
119
- const firstWorkspace = await createTempWorkspace();
120
- const secondWorkspace = await createTempWorkspace();
121
- try {
122
- await writeFile(
123
- path.join(firstWorkspace, "first.ts"),
124
- "export const first = 1\n",
125
- "utf8",
126
- );
127
- await writeFile(
128
- path.join(secondWorkspace, "second.ts"),
129
- "export const second = 2\n",
130
- "utf8",
131
- );
132
-
133
- const firstIndex = await getFileIndex(firstWorkspace, { ttlMs: 60_000 });
134
- expect(firstIndex.has("first.ts")).toBe(true);
135
-
136
- await getFileIndex(secondWorkspace, { ttlMs: 60_000 });
137
- vi.advanceTimersByTime(10 * 60_000 + 1);
138
-
139
- await getFileIndex(secondWorkspace, { ttlMs: 60_000 });
140
- await writeFile(
141
- path.join(firstWorkspace, "later.ts"),
142
- "export const later = 3\n",
143
- "utf8",
144
- );
145
-
146
- const rebuiltFirstIndex = await getFileIndex(firstWorkspace, {
147
- ttlMs: 60_000,
148
- });
149
- expect(rebuiltFirstIndex.has("later.ts")).toBe(true);
150
- } finally {
151
- vi.useRealTimers();
152
- await rm(firstWorkspace, { recursive: true, force: true });
153
- await rm(secondWorkspace, { recursive: true, force: true });
154
- }
155
- });
156
- });
@@ -1,106 +0,0 @@
1
- import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
2
- import os from "node:os";
3
- import path from "node:path";
4
- import { describe, expect, it, vi } from "vitest";
5
- import { enrichPromptWithMentions } from "./mention-enricher";
6
-
7
- vi.mock("node:worker_threads", async () => {
8
- const actual = await vi.importActual<typeof import("node:worker_threads")>(
9
- "node:worker_threads",
10
- );
11
- return {
12
- ...actual,
13
- isMainThread: false,
14
- parentPort: null,
15
- };
16
- });
17
-
18
- async function createTempWorkspace(): Promise<string> {
19
- return mkdtemp(path.join(os.tmpdir(), "core-mentions-"));
20
- }
21
-
22
- describe("enrichPromptWithMentions", () => {
23
- it("returns matched files for matching @path mentions", async () => {
24
- const cwd = await createTempWorkspace();
25
- try {
26
- const sourcePath = path.join(cwd, "src", "index.ts");
27
- await mkdir(path.dirname(sourcePath), { recursive: true });
28
- await writeFile(sourcePath, "export const answer = 42\n", "utf8");
29
-
30
- const result = await enrichPromptWithMentions(
31
- "Review @src/index.ts",
32
- cwd,
33
- );
34
-
35
- expect(result.mentions).toEqual(["src/index.ts"]);
36
- expect(result.matchedFiles).toEqual(["src/index.ts"]);
37
- expect(result.ignoredMentions).toEqual([]);
38
- expect(result.prompt).toBe("Review @src/index.ts");
39
- } finally {
40
- await rm(cwd, { recursive: true, force: true });
41
- }
42
- });
43
-
44
- it("ignores emails and unmatched mentions", async () => {
45
- const cwd = await createTempWorkspace();
46
- try {
47
- await writeFile(path.join(cwd, "README.md"), "# Demo\n", "utf8");
48
-
49
- const result = await enrichPromptWithMentions(
50
- "Ping me at test@example.com and check @missing/file.ts.",
51
- cwd,
52
- );
53
-
54
- expect(result.mentions).toEqual(["missing/file.ts"]);
55
- expect(result.matchedFiles).toEqual([]);
56
- expect(result.ignoredMentions).toEqual(["missing/file.ts"]);
57
- expect(result.prompt).toBe(
58
- "Ping me at test@example.com and check @missing/file.ts.",
59
- );
60
- } finally {
61
- await rm(cwd, { recursive: true, force: true });
62
- }
63
- });
64
-
65
- it("respects maxTotalBytes while keeping prompt unchanged", async () => {
66
- const cwd = await createTempWorkspace();
67
- try {
68
- await writeFile(path.join(cwd, "a.ts"), "123", "utf8");
69
- await writeFile(path.join(cwd, "b.ts"), "const b = 2\n", "utf8");
70
-
71
- const result = await enrichPromptWithMentions(
72
- "Use @a.ts and @b.ts",
73
- cwd,
74
- { maxTotalBytes: 5, maxFiles: 2, maxFileBytes: 5 },
75
- );
76
-
77
- expect(result.mentions).toEqual(["a.ts", "b.ts"]);
78
- expect(result.matchedFiles).toEqual(["a.ts"]);
79
- expect(result.ignoredMentions).toEqual(["b.ts"]);
80
- expect(result.prompt).toBe("Use @a.ts and @b.ts");
81
- } finally {
82
- await rm(cwd, { recursive: true, force: true });
83
- }
84
- });
85
-
86
- it("does not over-count totalBytes across multiple mentions", async () => {
87
- const cwd = await createTempWorkspace();
88
- try {
89
- await writeFile(path.join(cwd, "a.ts"), "aaa", "utf8");
90
- await writeFile(path.join(cwd, "b.ts"), "bbb", "utf8");
91
- await writeFile(path.join(cwd, "c.ts"), "ccc", "utf8");
92
-
93
- const result = await enrichPromptWithMentions(
94
- "Use @a.ts @b.ts @c.ts",
95
- cwd,
96
- { maxTotalBytes: 15, maxFiles: 5, maxFileBytes: 5 },
97
- );
98
-
99
- expect(result.mentions).toEqual(["a.ts", "b.ts", "c.ts"]);
100
- expect(result.matchedFiles).toEqual(["a.ts", "b.ts", "c.ts"]);
101
- expect(result.ignoredMentions).toEqual([]);
102
- } finally {
103
- await rm(cwd, { recursive: true, force: true });
104
- }
105
- });
106
- });