@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,300 +0,0 @@
1
- import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import { afterEach, describe, expect, it, vi } from "vitest";
5
- import { SqliteSessionStore } from "../services/storage/sqlite-session-store";
6
- import { SessionSource } from "../types/common";
7
- import { CoreSessionService } from "./session-service";
8
-
9
- describe("UnifiedSessionPersistenceService", () => {
10
- const tempDirs: string[] = [];
11
- const stores: Array<SqliteSessionStore> = [];
12
-
13
- afterEach(() => {
14
- for (const store of stores.splice(0)) {
15
- store.close();
16
- }
17
- for (const dir of tempDirs.splice(0)) {
18
- rmSync(dir, { recursive: true, force: true });
19
- }
20
- });
21
-
22
- it("reconciles dead running sessions into failed manifests with terminal markers", async () => {
23
- const dbDir = mkdtempSync(join(tmpdir(), "stale-session-reconcile-db-"));
24
- const sessionsDir = mkdtempSync(
25
- join(tmpdir(), "stale-session-reconcile-sessions-"),
26
- );
27
- tempDirs.push(dbDir, sessionsDir);
28
-
29
- const store = new SqliteSessionStore({ sessionsDir: dbDir });
30
- stores.push(store);
31
- const service = new CoreSessionService(store, {
32
- sessionArtifactsDir: sessionsDir,
33
- });
34
- const sessionId = "stale-root-session";
35
- const artifacts = await service.createRootSessionWithArtifacts({
36
- sessionId,
37
- source: SessionSource.CLI,
38
- pid: 999_999_999,
39
- interactive: false,
40
- provider: "mock-provider",
41
- model: "mock-model",
42
- cwd: "/tmp/project",
43
- workspaceRoot: "/tmp/project",
44
- enableTools: true,
45
- enableSpawn: true,
46
- enableTeams: false,
47
- prompt: "hello",
48
- startedAt: "2026-01-01T00:00:00.000Z",
49
- });
50
-
51
- const reconciled = await service.reconcileDeadSessions();
52
- expect(reconciled).toBe(1);
53
-
54
- const rows = await service.listSessions(10);
55
- expect(rows).toHaveLength(1);
56
- expect(rows[0]).toMatchObject({
57
- sessionId,
58
- status: "failed",
59
- exitCode: 1,
60
- });
61
- expect(rows[0]?.endedAt).toBeTruthy();
62
-
63
- const manifest = JSON.parse(
64
- readFileSync(artifacts.manifestPath, "utf8"),
65
- ) as Record<string, unknown>;
66
- expect(manifest.status).toBe("failed");
67
- expect(manifest.exit_code).toBe(1);
68
- expect(manifest.ended_at).toBeTruthy();
69
- expect(manifest.metadata).toMatchObject({
70
- terminal_marker: "failed_external_process_exit",
71
- terminal_marker_pid: 999_999_999,
72
- terminal_marker_source: "stale_session_reconciler",
73
- });
74
- expect(
75
- (manifest.metadata as Record<string, unknown>).terminal_marker_at,
76
- ).toBeTruthy();
77
-
78
- const globalHookLog = process.env.CLINE_HOOKS_LOG_PATH ?? "";
79
- if (globalHookLog && existsSync(globalHookLog)) {
80
- const hookContent = readFileSync(globalHookLog, "utf8");
81
- expect(hookContent).toContain('"hookName":"session_shutdown"');
82
- expect(hookContent).toContain('"reason":"failed_external_process_exit"');
83
- }
84
- }, 15_000);
85
-
86
- it("persists teammate task metadata in the file envelope and usage on messages", async () => {
87
- const dbDir = mkdtempSync(join(tmpdir(), "team-task-messages-db-"));
88
- const sessionsDir = mkdtempSync(join(tmpdir(), "team-task-messages-"));
89
- tempDirs.push(dbDir, sessionsDir);
90
-
91
- const store = new SqliteSessionStore({ sessionsDir: dbDir });
92
- stores.push(store);
93
- const service = new CoreSessionService(store, {
94
- sessionArtifactsDir: sessionsDir,
95
- });
96
- const rootSessionId = "root-session";
97
- await service.createRootSessionWithArtifacts({
98
- sessionId: rootSessionId,
99
- source: SessionSource.CLI,
100
- pid: process.pid,
101
- interactive: false,
102
- provider: "anthropic",
103
- model: "claude-sonnet-4-6",
104
- cwd: "/tmp/project",
105
- workspaceRoot: "/tmp/project",
106
- enableTools: true,
107
- enableSpawn: true,
108
- enableTeams: true,
109
- prompt: "lead task",
110
- startedAt: "2026-04-10T19:00:00.000Z",
111
- });
112
-
113
- await service.onTeamTaskStart(
114
- rootSessionId,
115
- "java-haiku-agent",
116
- "Write a haiku about Java",
117
- );
118
- await service.onTeamTaskEnd(
119
- rootSessionId,
120
- "java-haiku-agent",
121
- "completed",
122
- "[done] completed",
123
- {
124
- text: "Classes wrap the world\nWrite once, run on every machine —\nVerbose, yet it soars",
125
- usage: {
126
- inputTokens: 42,
127
- outputTokens: 17,
128
- cacheReadTokens: 9,
129
- cacheWriteTokens: 0,
130
- totalCost: 0.123,
131
- },
132
- messages: [
133
- {
134
- role: "user",
135
- content: "Write a haiku about Java. Return only the haiku.",
136
- },
137
- {
138
- role: "assistant",
139
- content: [
140
- {
141
- type: "text",
142
- text: "Classes wrap the world\nWrite once, run on every machine —\nVerbose, yet it soars",
143
- },
144
- ],
145
- },
146
- ],
147
- toolCalls: [],
148
- iterations: 1,
149
- finishReason: "completed",
150
- model: {
151
- id: "claude-sonnet-4-6",
152
- provider: "anthropic",
153
- info: { id: "claude-sonnet-4-6" },
154
- },
155
- startedAt: new Date("2026-04-10T19:00:01.000Z"),
156
- endedAt: new Date("2026-04-10T19:00:02.000Z"),
157
- durationMs: 1000,
158
- },
159
- );
160
-
161
- const childSessions = await service.listSessions(10);
162
- const teammateSessionId = childSessions.find((row) =>
163
- row.sessionId.includes("__teamtask__java-haiku-agent__"),
164
- )?.sessionId;
165
- expect(teammateSessionId).toBeTruthy();
166
- const row = childSessions.find(
167
- (item) => item.sessionId === teammateSessionId,
168
- );
169
- expect(row?.messagesPath).toBeTruthy();
170
- const path = row?.messagesPath as string;
171
- const payload = JSON.parse(readFileSync(path, "utf8")) as {
172
- agent?: string;
173
- sessionId?: string;
174
- taskType?: string;
175
- messages: Array<Record<string, unknown>>;
176
- };
177
- const user = payload.messages[0] as Record<string, unknown>;
178
- const assistant = payload.messages[1] as Record<string, unknown>;
179
-
180
- expect(payload.agent).toBe("teammate");
181
- expect(payload.sessionId).toBe(rootSessionId);
182
- expect(payload.taskType).toBe("team");
183
- expect(assistant.id).toEqual(expect.any(String));
184
- expect(user.agent).toBeUndefined();
185
- expect(user.sessionId).toBeUndefined();
186
- expect(assistant.agent).toBeUndefined();
187
- expect(assistant.sessionId).toBeUndefined();
188
- expect(assistant.modelInfo).toMatchObject({
189
- id: "claude-sonnet-4-6",
190
- provider: "anthropic",
191
- });
192
- expect(assistant.metrics).toMatchObject({
193
- inputTokens: 42,
194
- outputTokens: 17,
195
- cacheReadTokens: 9,
196
- cacheWriteTokens: 0,
197
- cost: 0.123,
198
- });
199
- expect(row?.messagesPath).toBe(path);
200
- });
201
-
202
- it("uploads messages after persisting them when a messages uploader is configured", async () => {
203
- const dbDir = mkdtempSync(join(tmpdir(), "messages-upload-db-"));
204
- const sessionsDir = mkdtempSync(join(tmpdir(), "messages-upload-"));
205
- tempDirs.push(dbDir, sessionsDir);
206
-
207
- const store = new SqliteSessionStore({ sessionsDir: dbDir });
208
- stores.push(store);
209
- const uploadMessagesFile = vi.fn(async () => {});
210
- const service = new CoreSessionService(store, {
211
- sessionArtifactsDir: sessionsDir,
212
- messagesArtifactUploader: {
213
- uploadMessagesFile,
214
- },
215
- });
216
- const sessionId = "root-upload-session";
217
- await service.createRootSessionWithArtifacts({
218
- sessionId,
219
- source: SessionSource.CLI,
220
- pid: process.pid,
221
- interactive: false,
222
- provider: "anthropic",
223
- model: "claude-sonnet-4-6",
224
- cwd: "/tmp/project",
225
- workspaceRoot: "/tmp/project",
226
- enableTools: true,
227
- enableSpawn: false,
228
- enableTeams: false,
229
- prompt: "hello",
230
- metadata: {
231
- blobUpload: true,
232
- },
233
- startedAt: "2026-04-10T19:00:00.000Z",
234
- });
235
-
236
- await service.persistSessionMessages(sessionId, [
237
- {
238
- role: "user",
239
- content: "hello",
240
- },
241
- ]);
242
-
243
- expect(uploadMessagesFile).toHaveBeenCalledTimes(1);
244
- expect(uploadMessagesFile).toHaveBeenCalledWith(
245
- expect.objectContaining({
246
- sessionId,
247
- path: expect.stringContaining(`${sessionId}.messages.json`),
248
- contents: expect.stringContaining('"role": "user"'),
249
- row: expect.objectContaining({
250
- sessionId,
251
- metadata: {
252
- blobUpload: true,
253
- title: "hello",
254
- },
255
- }),
256
- }),
257
- );
258
- });
259
-
260
- it("deletes the full root session directory even when artifact paths are stale", async () => {
261
- const dbDir = mkdtempSync(join(tmpdir(), "delete-root-session-dir-db-"));
262
- const sessionsDir = mkdtempSync(join(tmpdir(), "delete-root-session-dir-"));
263
- tempDirs.push(dbDir, sessionsDir);
264
-
265
- const store = new SqliteSessionStore({ sessionsDir: dbDir });
266
- stores.push(store);
267
- const service = new CoreSessionService(store, {
268
- sessionArtifactsDir: sessionsDir,
269
- });
270
- const sessionId = "root-session-delete";
271
- const artifacts = await service.createRootSessionWithArtifacts({
272
- sessionId,
273
- source: SessionSource.CLI,
274
- pid: process.pid,
275
- interactive: false,
276
- provider: "anthropic",
277
- model: "claude-sonnet-4-6",
278
- cwd: "/tmp/project",
279
- workspaceRoot: "/tmp/project",
280
- enableTools: true,
281
- enableSpawn: false,
282
- enableTeams: false,
283
- prompt: "delete me",
284
- startedAt: "2026-04-10T19:00:00.000Z",
285
- });
286
-
287
- store.run(`UPDATE sessions SET messages_path = NULL WHERE session_id = ?`, [
288
- sessionId,
289
- ]);
290
-
291
- expect(existsSync(artifacts.messagesPath)).toBe(true);
292
- expect(existsSync(join(sessionsDir, sessionId))).toBe(true);
293
-
294
- const result = await service.deleteSession(sessionId);
295
-
296
- expect(result).toEqual({ deleted: true });
297
- expect(existsSync(artifacts.messagesPath)).toBe(false);
298
- expect(existsSync(join(sessionsDir, sessionId))).toBe(false);
299
- });
300
- });
@@ -1,114 +0,0 @@
1
- import { existsSync, mkdirSync } from "node:fs";
2
- import { RpcSessionClient, type RpcSessionRow } from "@clinebot/rpc";
3
- import type { SessionMessagesArtifactUploader } from "../types/session";
4
- import type {
5
- PersistedSessionUpdateInput,
6
- SessionPersistenceAdapter,
7
- } from "./persistence-service";
8
- import { UnifiedSessionPersistenceService } from "./persistence-service";
9
- import type { SessionRow } from "./session-service";
10
-
11
- // ── Adapter ──────────────────────────────────────────────────────────
12
-
13
- class RpcSessionPersistenceAdapter implements SessionPersistenceAdapter {
14
- constructor(private readonly client: RpcSessionClient) {}
15
-
16
- ensureSessionsDir(): string {
17
- return "";
18
- }
19
-
20
- async upsertSession(row: SessionRow): Promise<void> {
21
- await this.client.upsertSession(row as RpcSessionRow);
22
- }
23
-
24
- async getSession(sessionId: string): Promise<SessionRow | undefined> {
25
- const row = await this.client.getSession(sessionId);
26
- return (row as SessionRow | undefined) ?? undefined;
27
- }
28
-
29
- async listSessions(options: {
30
- limit: number;
31
- parentSessionId?: string;
32
- status?: string;
33
- }): Promise<SessionRow[]> {
34
- const rows = await this.client.listSessions(options);
35
- return rows as SessionRow[];
36
- }
37
-
38
- async updateSession(
39
- input: PersistedSessionUpdateInput,
40
- ): Promise<{ updated: boolean; statusLock: number }> {
41
- return this.client.updateSession({
42
- sessionId: input.sessionId,
43
- status: input.status,
44
- endedAt: input.endedAt,
45
- exitCode: input.exitCode,
46
- prompt: input.prompt,
47
- metadata: input.metadata,
48
- parentSessionId: input.parentSessionId,
49
- parentAgentId: input.parentAgentId,
50
- agentId: input.agentId,
51
- conversationId: input.conversationId,
52
- expectedStatusLock: input.expectedStatusLock,
53
- setRunning: input.setRunning,
54
- });
55
- }
56
-
57
- async deleteSession(sessionId: string, cascade: boolean): Promise<boolean> {
58
- return this.client.deleteSession(sessionId, cascade);
59
- }
60
-
61
- async enqueueSpawnRequest(input: {
62
- rootSessionId: string;
63
- parentAgentId: string;
64
- task?: string;
65
- systemPrompt?: string;
66
- }): Promise<void> {
67
- await this.client.enqueueSpawnRequest(input);
68
- }
69
-
70
- async claimSpawnRequest(
71
- rootSessionId: string,
72
- parentAgentId: string,
73
- ): Promise<string | undefined> {
74
- return this.client.claimSpawnRequest(rootSessionId, parentAgentId);
75
- }
76
- }
77
-
78
- // ── Service ──────────────────────────────────────────────────────────
79
-
80
- export interface RpcCoreSessionServiceOptions {
81
- address?: string;
82
- sessionsDir: string;
83
- messagesArtifactUploader?: SessionMessagesArtifactUploader;
84
- }
85
-
86
- export class RpcCoreSessionService extends UnifiedSessionPersistenceService {
87
- private readonly sessionsDirPath: string;
88
- private readonly client: RpcSessionClient;
89
- public readonly address: string;
90
-
91
- constructor(options: RpcCoreSessionServiceOptions) {
92
- const address = options.address?.trim() || "127.0.0.1:4317";
93
- const client = new RpcSessionClient({
94
- address,
95
- });
96
- super(new RpcSessionPersistenceAdapter(client), {
97
- messagesArtifactUploader: options.messagesArtifactUploader,
98
- });
99
- this.sessionsDirPath = options.sessionsDir;
100
- this.client = client;
101
- this.address = address;
102
- }
103
-
104
- override ensureSessionsDir(): string {
105
- if (!existsSync(this.sessionsDirPath)) {
106
- mkdirSync(this.sessionsDirPath, { recursive: true });
107
- }
108
- return this.sessionsDirPath;
109
- }
110
-
111
- close(): void {
112
- this.client.close();
113
- }
114
- }
@@ -1,48 +0,0 @@
1
- import { existsSync, mkdtempSync } from "node:fs";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import { describe, expect, it } from "vitest";
5
- import { AgentTeamsRuntime } from "../extensions/tools/team";
6
- import { FileTeamPersistenceStore } from "./session-service";
7
-
8
- describe("FileTeamPersistenceStore", () => {
9
- it("does not create state.json for an empty runtime", () => {
10
- const baseDir = mkdtempSync(join(tmpdir(), "team-store-"));
11
- const store = new FileTeamPersistenceStore({
12
- teamName: "agent-team-nmnn9",
13
- baseDir,
14
- });
15
- const runtime = new AgentTeamsRuntime({ teamName: "agent-team-nmnn9" });
16
-
17
- store.persist(runtime);
18
-
19
- expect(
20
- existsSync(join(baseDir, "agent-team-nmnn9", "state.json")),
21
- ).toBeFalsy();
22
- });
23
-
24
- it("removes persisted state when runtime becomes empty again", () => {
25
- const baseDir = mkdtempSync(join(tmpdir(), "team-store-"));
26
- const store = new FileTeamPersistenceStore({
27
- teamName: "agent-team-cleanup",
28
- baseDir,
29
- });
30
- const runtime = new AgentTeamsRuntime({ teamName: "agent-team-cleanup" });
31
-
32
- store.upsertTeammateSpec({
33
- agentId: "worker",
34
- rolePrompt: "Implement tasks",
35
- });
36
- store.persist(runtime);
37
- expect(
38
- existsSync(join(baseDir, "agent-team-cleanup", "state.json")),
39
- ).toBeTruthy();
40
-
41
- store.removeTeammateSpec("worker");
42
- runtime.cleanup();
43
- store.persist(runtime);
44
- expect(
45
- existsSync(join(baseDir, "agent-team-cleanup", "state.json")),
46
- ).toBeFalsy();
47
- });
48
- });