@clinebot/core 0.0.20 → 0.0.22

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 (356) hide show
  1. package/dist/account/cline-account-service.d.ts +3 -2
  2. package/dist/account/cline-account-service.d.ts.map +1 -0
  3. package/dist/account/index.d.ts +1 -0
  4. package/dist/account/index.d.ts.map +1 -0
  5. package/dist/account/rpc.d.ts +1 -0
  6. package/dist/account/rpc.d.ts.map +1 -0
  7. package/dist/account/types.d.ts +1 -0
  8. package/dist/account/types.d.ts.map +1 -0
  9. package/dist/agents/agent-config-loader.d.ts +1 -0
  10. package/dist/agents/agent-config-loader.d.ts.map +1 -0
  11. package/dist/agents/agent-config-parser.d.ts +1 -0
  12. package/dist/agents/agent-config-parser.d.ts.map +1 -0
  13. package/dist/agents/hooks-config-loader.d.ts +1 -0
  14. package/dist/agents/hooks-config-loader.d.ts.map +1 -0
  15. package/dist/agents/index.d.ts +1 -0
  16. package/dist/agents/index.d.ts.map +1 -0
  17. package/dist/agents/plugin-config-loader.d.ts +1 -0
  18. package/dist/agents/plugin-config-loader.d.ts.map +1 -0
  19. package/dist/agents/plugin-loader.d.ts +1 -0
  20. package/dist/agents/plugin-loader.d.ts.map +1 -0
  21. package/dist/agents/plugin-sandbox.d.ts +1 -0
  22. package/dist/agents/plugin-sandbox.d.ts.map +1 -0
  23. package/dist/agents/unified-config-file-watcher.d.ts +1 -0
  24. package/dist/agents/unified-config-file-watcher.d.ts.map +1 -0
  25. package/dist/agents/user-instruction-config-loader.d.ts +1 -0
  26. package/dist/agents/user-instruction-config-loader.d.ts.map +1 -0
  27. package/dist/auth/client.d.ts +1 -0
  28. package/dist/auth/client.d.ts.map +1 -0
  29. package/dist/auth/cline.d.ts +1 -0
  30. package/dist/auth/cline.d.ts.map +1 -0
  31. package/dist/auth/codex.d.ts +1 -0
  32. package/dist/auth/codex.d.ts.map +1 -0
  33. package/dist/auth/oca.d.ts +1 -0
  34. package/dist/auth/oca.d.ts.map +1 -0
  35. package/dist/auth/server.d.ts +1 -0
  36. package/dist/auth/server.d.ts.map +1 -0
  37. package/dist/auth/types.d.ts +1 -0
  38. package/dist/auth/types.d.ts.map +1 -0
  39. package/dist/auth/utils.d.ts +1 -0
  40. package/dist/auth/utils.d.ts.map +1 -0
  41. package/dist/chat/chat-schema.d.ts +13 -12
  42. package/dist/chat/chat-schema.d.ts.map +1 -0
  43. package/dist/index.d.ts +3 -1
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.node.d.ts +2 -0
  46. package/dist/index.node.d.ts.map +1 -0
  47. package/dist/index.node.js +303 -302
  48. package/dist/input/file-indexer.d.ts +1 -0
  49. package/dist/input/file-indexer.d.ts.map +1 -0
  50. package/dist/input/index.d.ts +1 -0
  51. package/dist/input/index.d.ts.map +1 -0
  52. package/dist/input/mention-enricher.d.ts +1 -0
  53. package/dist/input/mention-enricher.d.ts.map +1 -0
  54. package/dist/mcp/config-loader.d.ts +1 -0
  55. package/dist/mcp/config-loader.d.ts.map +1 -0
  56. package/dist/mcp/index.d.ts +1 -0
  57. package/dist/mcp/index.d.ts.map +1 -0
  58. package/dist/mcp/manager.d.ts +1 -0
  59. package/dist/mcp/manager.d.ts.map +1 -0
  60. package/dist/mcp/types.d.ts +1 -0
  61. package/dist/mcp/types.d.ts.map +1 -0
  62. package/dist/providers/local-provider-registry.d.ts +36 -0
  63. package/dist/providers/local-provider-registry.d.ts.map +1 -0
  64. package/dist/providers/local-provider-service.d.ts +2 -1
  65. package/dist/providers/local-provider-service.d.ts.map +1 -0
  66. package/dist/runtime/commands.d.ts +1 -0
  67. package/dist/runtime/commands.d.ts.map +1 -0
  68. package/dist/runtime/hook-file-hooks.d.ts +1 -0
  69. package/dist/runtime/hook-file-hooks.d.ts.map +1 -0
  70. package/dist/runtime/rules.d.ts +1 -0
  71. package/dist/runtime/rules.d.ts.map +1 -0
  72. package/dist/runtime/runtime-builder.d.ts +1 -0
  73. package/dist/runtime/runtime-builder.d.ts.map +1 -0
  74. package/dist/runtime/sandbox/subprocess-sandbox.d.ts +1 -0
  75. package/dist/runtime/sandbox/subprocess-sandbox.d.ts.map +1 -0
  76. package/dist/runtime/session-runtime.d.ts +2 -0
  77. package/dist/runtime/session-runtime.d.ts.map +1 -0
  78. package/dist/runtime/skills.d.ts +1 -0
  79. package/dist/runtime/skills.d.ts.map +1 -0
  80. package/dist/runtime/tool-approval.d.ts +1 -0
  81. package/dist/runtime/tool-approval.d.ts.map +1 -0
  82. package/dist/runtime/workflows.d.ts +1 -0
  83. package/dist/runtime/workflows.d.ts.map +1 -0
  84. package/dist/session/default-session-manager.d.ts +4 -0
  85. package/dist/session/default-session-manager.d.ts.map +1 -0
  86. package/dist/session/file-session-service.d.ts +1 -0
  87. package/dist/session/file-session-service.d.ts.map +1 -0
  88. package/dist/session/rpc-session-service.d.ts +1 -0
  89. package/dist/session/rpc-session-service.d.ts.map +1 -0
  90. package/dist/session/rpc-spawn-lease.d.ts +1 -0
  91. package/dist/session/rpc-spawn-lease.d.ts.map +1 -0
  92. package/dist/session/runtime-oauth-token-manager.d.ts +1 -0
  93. package/dist/session/runtime-oauth-token-manager.d.ts.map +1 -0
  94. package/dist/session/session-agent-events.d.ts +20 -1
  95. package/dist/session/session-agent-events.d.ts.map +1 -0
  96. package/dist/session/session-artifacts.d.ts +1 -0
  97. package/dist/session/session-artifacts.d.ts.map +1 -0
  98. package/dist/session/session-config-builder.d.ts +1 -0
  99. package/dist/session/session-config-builder.d.ts.map +1 -0
  100. package/dist/session/session-graph.d.ts +1 -0
  101. package/dist/session/session-graph.d.ts.map +1 -0
  102. package/dist/session/session-host.d.ts +1 -0
  103. package/dist/session/session-host.d.ts.map +1 -0
  104. package/dist/session/session-manager.d.ts +1 -0
  105. package/dist/session/session-manager.d.ts.map +1 -0
  106. package/dist/session/session-manifest.d.ts +2 -1
  107. package/dist/session/session-manifest.d.ts.map +1 -0
  108. package/dist/session/session-service.d.ts +1 -0
  109. package/dist/session/session-service.d.ts.map +1 -0
  110. package/dist/session/session-team-coordination.d.ts +1 -0
  111. package/dist/session/session-team-coordination.d.ts.map +1 -0
  112. package/dist/session/session-telemetry.d.ts +3 -1
  113. package/dist/session/session-telemetry.d.ts.map +1 -0
  114. package/dist/session/sqlite-rpc-session-backend.d.ts +1 -0
  115. package/dist/session/sqlite-rpc-session-backend.d.ts.map +1 -0
  116. package/dist/session/unified-session-persistence-service.d.ts +1 -0
  117. package/dist/session/unified-session-persistence-service.d.ts.map +1 -0
  118. package/dist/session/utils/helpers.d.ts +1 -0
  119. package/dist/session/utils/helpers.d.ts.map +1 -0
  120. package/dist/session/utils/types.d.ts +1 -0
  121. package/dist/session/utils/types.d.ts.map +1 -0
  122. package/dist/session/utils/usage.d.ts +1 -0
  123. package/dist/session/utils/usage.d.ts.map +1 -0
  124. package/dist/session/workspace-manager.d.ts +1 -0
  125. package/dist/session/workspace-manager.d.ts.map +1 -0
  126. package/dist/session/workspace-manifest.d.ts +1 -0
  127. package/dist/session/workspace-manifest.d.ts.map +1 -0
  128. package/dist/storage/file-team-store.d.ts +1 -0
  129. package/dist/storage/file-team-store.d.ts.map +1 -0
  130. package/dist/storage/provider-settings-legacy-migration.d.ts +1 -0
  131. package/dist/storage/provider-settings-legacy-migration.d.ts.map +1 -0
  132. package/dist/storage/provider-settings-manager.d.ts +1 -0
  133. package/dist/storage/provider-settings-manager.d.ts.map +1 -0
  134. package/dist/storage/sqlite-session-store.d.ts +1 -0
  135. package/dist/storage/sqlite-session-store.d.ts.map +1 -0
  136. package/dist/storage/sqlite-team-store.d.ts +1 -0
  137. package/dist/storage/sqlite-team-store.d.ts.map +1 -0
  138. package/dist/storage/team-store.d.ts +1 -0
  139. package/dist/storage/team-store.d.ts.map +1 -0
  140. package/dist/team/index.d.ts +1 -0
  141. package/dist/team/index.d.ts.map +1 -0
  142. package/dist/team/projections.d.ts +1 -0
  143. package/dist/team/projections.d.ts.map +1 -0
  144. package/dist/telemetry/ITelemetryAdapter.d.ts +1 -0
  145. package/dist/telemetry/ITelemetryAdapter.d.ts.map +1 -0
  146. package/dist/telemetry/LoggerTelemetryAdapter.d.ts +1 -0
  147. package/dist/telemetry/LoggerTelemetryAdapter.d.ts.map +1 -0
  148. package/dist/telemetry/OpenTelemetryAdapter.d.ts +1 -0
  149. package/dist/telemetry/OpenTelemetryAdapter.d.ts.map +1 -0
  150. package/dist/telemetry/OpenTelemetryProvider.d.ts +1 -0
  151. package/dist/telemetry/OpenTelemetryProvider.d.ts.map +1 -0
  152. package/dist/telemetry/TelemetryService.d.ts +1 -0
  153. package/dist/telemetry/TelemetryService.d.ts.map +1 -0
  154. package/dist/telemetry/core-events.d.ts +55 -22
  155. package/dist/telemetry/core-events.d.ts.map +1 -0
  156. package/dist/telemetry/opentelemetry.d.ts +1 -0
  157. package/dist/telemetry/opentelemetry.d.ts.map +1 -0
  158. package/dist/tools/constants.d.ts +1 -0
  159. package/dist/tools/constants.d.ts.map +1 -0
  160. package/dist/tools/definitions.d.ts +8 -1
  161. package/dist/tools/definitions.d.ts.map +1 -0
  162. package/dist/tools/executors/apply-patch-parser.d.ts +1 -0
  163. package/dist/tools/executors/apply-patch-parser.d.ts.map +1 -0
  164. package/dist/tools/executors/apply-patch.d.ts +1 -0
  165. package/dist/tools/executors/apply-patch.d.ts.map +1 -0
  166. package/dist/tools/executors/bash.d.ts +2 -1
  167. package/dist/tools/executors/bash.d.ts.map +1 -0
  168. package/dist/tools/executors/editor.d.ts +1 -0
  169. package/dist/tools/executors/editor.d.ts.map +1 -0
  170. package/dist/tools/executors/file-read.d.ts +1 -0
  171. package/dist/tools/executors/file-read.d.ts.map +1 -0
  172. package/dist/tools/executors/index.d.ts +14 -7
  173. package/dist/tools/executors/index.d.ts.map +1 -0
  174. package/dist/tools/executors/search.d.ts +1 -0
  175. package/dist/tools/executors/search.d.ts.map +1 -0
  176. package/dist/tools/executors/web-fetch.d.ts +1 -0
  177. package/dist/tools/executors/web-fetch.d.ts.map +1 -0
  178. package/dist/tools/helpers.d.ts +15 -0
  179. package/dist/tools/helpers.d.ts.map +1 -0
  180. package/dist/tools/index.d.ts +2 -1
  181. package/dist/tools/index.d.ts.map +1 -0
  182. package/dist/tools/model-tool-routing.d.ts +1 -0
  183. package/dist/tools/model-tool-routing.d.ts.map +1 -0
  184. package/dist/tools/presets.d.ts +1 -0
  185. package/dist/tools/presets.d.ts.map +1 -0
  186. package/dist/tools/schemas.d.ts +41 -0
  187. package/dist/tools/schemas.d.ts.map +1 -0
  188. package/dist/tools/types.d.ts +3 -2
  189. package/dist/tools/types.d.ts.map +1 -0
  190. package/dist/types/common.d.ts +1 -0
  191. package/dist/types/common.d.ts.map +1 -0
  192. package/dist/types/config.d.ts +1 -0
  193. package/dist/types/config.d.ts.map +1 -0
  194. package/dist/types/events.d.ts +1 -0
  195. package/dist/types/events.d.ts.map +1 -0
  196. package/dist/types/provider-settings.d.ts +1 -0
  197. package/dist/types/provider-settings.d.ts.map +1 -0
  198. package/dist/types/sessions.d.ts +1 -0
  199. package/dist/types/sessions.d.ts.map +1 -0
  200. package/dist/types/storage.d.ts +1 -0
  201. package/dist/types/storage.d.ts.map +1 -0
  202. package/dist/types/workspace.d.ts +1 -0
  203. package/dist/types/workspace.d.ts.map +1 -0
  204. package/dist/types.d.ts +1 -0
  205. package/dist/types.d.ts.map +1 -0
  206. package/package.json +8 -6
  207. package/src/account/cline-account-service.test.ts +0 -101
  208. package/src/account/cline-account-service.ts +0 -287
  209. package/src/account/index.ts +0 -22
  210. package/src/account/rpc.test.ts +0 -62
  211. package/src/account/rpc.ts +0 -172
  212. package/src/account/types.ts +0 -98
  213. package/src/agents/agent-config-loader.test.ts +0 -236
  214. package/src/agents/agent-config-loader.ts +0 -108
  215. package/src/agents/agent-config-parser.ts +0 -198
  216. package/src/agents/hooks-config-loader.test.ts +0 -20
  217. package/src/agents/hooks-config-loader.ts +0 -118
  218. package/src/agents/index.ts +0 -85
  219. package/src/agents/plugin-config-loader.test.ts +0 -140
  220. package/src/agents/plugin-config-loader.ts +0 -97
  221. package/src/agents/plugin-loader.test.ts +0 -228
  222. package/src/agents/plugin-loader.ts +0 -172
  223. package/src/agents/plugin-sandbox-bootstrap.ts +0 -445
  224. package/src/agents/plugin-sandbox.test.ts +0 -317
  225. package/src/agents/plugin-sandbox.ts +0 -341
  226. package/src/agents/unified-config-file-watcher.test.ts +0 -196
  227. package/src/agents/unified-config-file-watcher.ts +0 -483
  228. package/src/agents/user-instruction-config-loader.test.ts +0 -158
  229. package/src/agents/user-instruction-config-loader.ts +0 -438
  230. package/src/auth/client.test.ts +0 -40
  231. package/src/auth/client.ts +0 -25
  232. package/src/auth/cline.test.ts +0 -130
  233. package/src/auth/cline.ts +0 -420
  234. package/src/auth/codex.test.ts +0 -170
  235. package/src/auth/codex.ts +0 -491
  236. package/src/auth/oca.test.ts +0 -215
  237. package/src/auth/oca.ts +0 -573
  238. package/src/auth/server.ts +0 -216
  239. package/src/auth/types.ts +0 -81
  240. package/src/auth/utils.test.ts +0 -128
  241. package/src/auth/utils.ts +0 -247
  242. package/src/chat/chat-schema.ts +0 -82
  243. package/src/index.node.ts +0 -285
  244. package/src/index.ts +0 -211
  245. package/src/input/file-indexer.d.ts +0 -11
  246. package/src/input/file-indexer.test.ts +0 -127
  247. package/src/input/file-indexer.ts +0 -327
  248. package/src/input/index.ts +0 -7
  249. package/src/input/mention-enricher.test.ts +0 -85
  250. package/src/input/mention-enricher.ts +0 -122
  251. package/src/mcp/config-loader.test.ts +0 -238
  252. package/src/mcp/config-loader.ts +0 -219
  253. package/src/mcp/index.ts +0 -26
  254. package/src/mcp/manager.test.ts +0 -106
  255. package/src/mcp/manager.ts +0 -262
  256. package/src/mcp/types.ts +0 -88
  257. package/src/providers/local-provider-service.ts +0 -608
  258. package/src/runtime/commands.test.ts +0 -98
  259. package/src/runtime/commands.ts +0 -83
  260. package/src/runtime/hook-file-hooks.test.ts +0 -237
  261. package/src/runtime/hook-file-hooks.ts +0 -859
  262. package/src/runtime/index.ts +0 -37
  263. package/src/runtime/rules.ts +0 -34
  264. package/src/runtime/runtime-builder.team-persistence.test.ts +0 -202
  265. package/src/runtime/runtime-builder.test.ts +0 -371
  266. package/src/runtime/runtime-builder.ts +0 -589
  267. package/src/runtime/runtime-parity.test.ts +0 -143
  268. package/src/runtime/sandbox/subprocess-sandbox.ts +0 -231
  269. package/src/runtime/session-runtime.ts +0 -46
  270. package/src/runtime/skills.ts +0 -44
  271. package/src/runtime/tool-approval.ts +0 -104
  272. package/src/runtime/workflows.test.ts +0 -119
  273. package/src/runtime/workflows.ts +0 -45
  274. package/src/session/default-session-manager.e2e.test.ts +0 -384
  275. package/src/session/default-session-manager.test.ts +0 -1741
  276. package/src/session/default-session-manager.ts +0 -1233
  277. package/src/session/file-session-service.ts +0 -280
  278. package/src/session/index.ts +0 -42
  279. package/src/session/rpc-session-service.ts +0 -107
  280. package/src/session/rpc-spawn-lease.test.ts +0 -49
  281. package/src/session/rpc-spawn-lease.ts +0 -122
  282. package/src/session/runtime-oauth-token-manager.test.ts +0 -137
  283. package/src/session/runtime-oauth-token-manager.ts +0 -272
  284. package/src/session/session-agent-events.ts +0 -159
  285. package/src/session/session-artifacts.ts +0 -106
  286. package/src/session/session-config-builder.ts +0 -113
  287. package/src/session/session-graph.ts +0 -92
  288. package/src/session/session-host.test.ts +0 -29
  289. package/src/session/session-host.ts +0 -242
  290. package/src/session/session-manager.ts +0 -69
  291. package/src/session/session-manifest.ts +0 -29
  292. package/src/session/session-service.team-persistence.test.ts +0 -48
  293. package/src/session/session-service.ts +0 -673
  294. package/src/session/session-team-coordination.ts +0 -229
  295. package/src/session/session-telemetry.ts +0 -95
  296. package/src/session/sqlite-rpc-session-backend.ts +0 -303
  297. package/src/session/unified-session-persistence-service.test.ts +0 -85
  298. package/src/session/unified-session-persistence-service.ts +0 -996
  299. package/src/session/utils/helpers.ts +0 -139
  300. package/src/session/utils/types.ts +0 -57
  301. package/src/session/utils/usage.ts +0 -32
  302. package/src/session/workspace-manager.ts +0 -98
  303. package/src/session/workspace-manifest.ts +0 -100
  304. package/src/storage/artifact-store.ts +0 -1
  305. package/src/storage/file-team-store.ts +0 -257
  306. package/src/storage/index.ts +0 -11
  307. package/src/storage/provider-settings-legacy-migration.test.ts +0 -307
  308. package/src/storage/provider-settings-legacy-migration.ts +0 -689
  309. package/src/storage/provider-settings-manager.test.ts +0 -145
  310. package/src/storage/provider-settings-manager.ts +0 -150
  311. package/src/storage/session-store.ts +0 -1
  312. package/src/storage/sqlite-session-store.ts +0 -275
  313. package/src/storage/sqlite-team-store.ts +0 -454
  314. package/src/storage/team-store.ts +0 -40
  315. package/src/team/index.ts +0 -4
  316. package/src/team/projections.ts +0 -285
  317. package/src/telemetry/ITelemetryAdapter.ts +0 -94
  318. package/src/telemetry/LoggerTelemetryAdapter.test.ts +0 -42
  319. package/src/telemetry/LoggerTelemetryAdapter.ts +0 -114
  320. package/src/telemetry/OpenTelemetryAdapter.test.ts +0 -157
  321. package/src/telemetry/OpenTelemetryAdapter.ts +0 -348
  322. package/src/telemetry/OpenTelemetryProvider.test.ts +0 -113
  323. package/src/telemetry/OpenTelemetryProvider.ts +0 -322
  324. package/src/telemetry/TelemetryService.test.ts +0 -134
  325. package/src/telemetry/TelemetryService.ts +0 -141
  326. package/src/telemetry/core-events.ts +0 -344
  327. package/src/telemetry/opentelemetry.ts +0 -20
  328. package/src/tools/constants.ts +0 -35
  329. package/src/tools/definitions.test.ts +0 -658
  330. package/src/tools/definitions.ts +0 -726
  331. package/src/tools/executors/apply-patch-parser.ts +0 -520
  332. package/src/tools/executors/apply-patch.ts +0 -359
  333. package/src/tools/executors/bash.ts +0 -205
  334. package/src/tools/executors/editor.test.ts +0 -35
  335. package/src/tools/executors/editor.ts +0 -219
  336. package/src/tools/executors/file-read.test.ts +0 -49
  337. package/src/tools/executors/file-read.ts +0 -110
  338. package/src/tools/executors/index.ts +0 -75
  339. package/src/tools/executors/search.ts +0 -278
  340. package/src/tools/executors/web-fetch.ts +0 -259
  341. package/src/tools/index.ts +0 -168
  342. package/src/tools/model-tool-routing.test.ts +0 -86
  343. package/src/tools/model-tool-routing.ts +0 -132
  344. package/src/tools/presets.test.ts +0 -62
  345. package/src/tools/presets.ts +0 -168
  346. package/src/tools/schemas.ts +0 -284
  347. package/src/tools/types.ts +0 -328
  348. package/src/types/common.ts +0 -14
  349. package/src/types/config.ts +0 -84
  350. package/src/types/events.ts +0 -74
  351. package/src/types/index.ts +0 -24
  352. package/src/types/provider-settings.ts +0 -43
  353. package/src/types/sessions.ts +0 -16
  354. package/src/types/storage.ts +0 -64
  355. package/src/types/workspace.ts +0 -7
  356. package/src/types.ts +0 -128
@@ -1,143 +0,0 @@
1
- import { mkdtempSync } from "node:fs";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import type { Tool } from "@clinebot/agents";
5
- import { describe, expect, it } from "vitest";
6
- import { createBuiltinTools } from "../tools";
7
- import { DefaultRuntimeBuilder } from "./runtime-builder";
8
-
9
- type LegacyConfig = {
10
- providerId: string;
11
- modelId: string;
12
- apiKey: string;
13
- systemPrompt: string;
14
- cwd: string;
15
- enableTools: boolean;
16
- enableSpawnAgent: boolean;
17
- enableAgentTeams: boolean;
18
- };
19
-
20
- function legacyBuiltinTools(cwd: string): Tool[] {
21
- return createBuiltinTools({
22
- cwd,
23
- enableReadFiles: true,
24
- enableSearch: true,
25
- enableBash: true,
26
- enableWebFetch: true,
27
- });
28
- }
29
-
30
- function legacyBuildRuntimeEnvironment(
31
- config: LegacyConfig,
32
- createSpawnTool?: () => Tool,
33
- ): Tool[] {
34
- const tools: Tool[] = [];
35
- if (config.enableTools) {
36
- tools.push(...legacyBuiltinTools(config.cwd));
37
- }
38
- if (config.enableSpawnAgent && createSpawnTool) {
39
- const spawnTool = createSpawnTool();
40
- tools.push({
41
- ...spawnTool,
42
- execute: async (input, context) => spawnTool.execute(input, context),
43
- });
44
- }
45
- return tools;
46
- }
47
-
48
- function normalizeParityToolNames(toolNames: string[]): string[] {
49
- // Skills are discovered from user/workspace config and can appear in tests
50
- // depending on the machine state. They are intentionally excluded from
51
- // strict legacy parity checks.
52
- return toolNames.filter((toolName) => toolName !== "skills");
53
- }
54
-
55
- function makeEmptyWorkspaceCwd(): string {
56
- return mkdtempSync(join(tmpdir(), "runtime-parity-"));
57
- }
58
-
59
- function makeSpawnTool(): Tool {
60
- return {
61
- name: "spawn_agent",
62
- description: "Spawn a subagent",
63
- inputSchema: { type: "object", properties: {}, required: [] },
64
- execute: async () => ({ ok: true }),
65
- };
66
- }
67
-
68
- describe("runtime tool parity", () => {
69
- it("matches legacy tool list when tools+spawn are enabled", () => {
70
- const config: LegacyConfig = {
71
- providerId: "anthropic",
72
- modelId: "claude-sonnet-4-6",
73
- apiKey: "key",
74
- systemPrompt: "test",
75
- cwd: makeEmptyWorkspaceCwd(),
76
- enableTools: true,
77
- enableSpawnAgent: true,
78
- enableAgentTeams: false,
79
- };
80
- const createSpawnTool = makeSpawnTool;
81
- const expected = normalizeParityToolNames(
82
- legacyBuildRuntimeEnvironment(config, createSpawnTool).map(
83
- (tool) => tool.name,
84
- ),
85
- );
86
- const actual = new DefaultRuntimeBuilder()
87
- .build({
88
- config,
89
- createSpawnTool,
90
- })
91
- .tools.map((tool) => tool.name);
92
-
93
- expect(normalizeParityToolNames(actual)).toEqual(expected);
94
- });
95
-
96
- it("matches legacy tool list when only spawn is enabled", () => {
97
- const config: LegacyConfig = {
98
- providerId: "anthropic",
99
- modelId: "claude-sonnet-4-6",
100
- apiKey: "key",
101
- systemPrompt: "test",
102
- cwd: makeEmptyWorkspaceCwd(),
103
- enableTools: false,
104
- enableSpawnAgent: true,
105
- enableAgentTeams: false,
106
- };
107
- const createSpawnTool = makeSpawnTool;
108
- const expected = normalizeParityToolNames(
109
- legacyBuildRuntimeEnvironment(config, createSpawnTool).map(
110
- (tool) => tool.name,
111
- ),
112
- );
113
- const actual = new DefaultRuntimeBuilder()
114
- .build({
115
- config,
116
- createSpawnTool,
117
- })
118
- .tools.map((tool) => tool.name);
119
-
120
- expect(normalizeParityToolNames(actual)).toEqual(expected);
121
- });
122
-
123
- it("matches legacy tool list when tools+spawn are disabled", () => {
124
- const config: LegacyConfig = {
125
- providerId: "anthropic",
126
- modelId: "claude-sonnet-4-6",
127
- apiKey: "key",
128
- systemPrompt: "test",
129
- cwd: makeEmptyWorkspaceCwd(),
130
- enableTools: false,
131
- enableSpawnAgent: false,
132
- enableAgentTeams: false,
133
- };
134
- const expected = normalizeParityToolNames(
135
- legacyBuildRuntimeEnvironment(config).map((tool) => tool.name),
136
- );
137
- const actual = new DefaultRuntimeBuilder()
138
- .build({ config })
139
- .tools.map((tool) => tool.name);
140
-
141
- expect(normalizeParityToolNames(actual)).toEqual(expected);
142
- });
143
- });
@@ -1,231 +0,0 @@
1
- import { type ChildProcess, spawn } from "node:child_process";
2
-
3
- interface SandboxCallMessage {
4
- type: "call";
5
- id: string;
6
- method: string;
7
- args: unknown;
8
- }
9
-
10
- interface SandboxResponseMessage {
11
- type: "response";
12
- id: string;
13
- ok: boolean;
14
- result?: unknown;
15
- error?: { message: string; stack?: string };
16
- }
17
-
18
- interface SandboxEventMessage {
19
- type: "event";
20
- name: string;
21
- payload?: unknown;
22
- }
23
-
24
- export interface SubprocessSandboxOptions {
25
- /** Inline script to execute via `node -e`. Mutually exclusive with {@link bootstrapFile}. */
26
- bootstrapScript?: string;
27
- /** Path to a JavaScript file to execute via `node <file>`. Mutually exclusive with {@link bootstrapScript}. */
28
- bootstrapFile?: string;
29
- name?: string;
30
- onEvent?: (event: { name: string; payload?: unknown }) => void;
31
- }
32
-
33
- export interface SandboxCallOptions {
34
- timeoutMs?: number;
35
- }
36
-
37
- type PendingRequest = {
38
- resolve: (value: unknown) => void;
39
- reject: (error: Error) => void;
40
- timeout?: NodeJS.Timeout;
41
- };
42
-
43
- function asError(value: unknown): Error {
44
- if (value instanceof Error) {
45
- return value;
46
- }
47
- return new Error(String(value));
48
- }
49
-
50
- export class SubprocessSandbox {
51
- private readonly options: SubprocessSandboxOptions;
52
- private process: ChildProcess | null = null;
53
- private requestCounter = 0;
54
- private readonly pending = new Map<string, PendingRequest>();
55
-
56
- constructor(options: SubprocessSandboxOptions) {
57
- this.options = options;
58
- }
59
-
60
- start(): void {
61
- if (this.process && this.process.exitCode === null) {
62
- return;
63
- }
64
-
65
- const args = this.options.bootstrapFile
66
- ? [this.options.bootstrapFile]
67
- : ["-e", this.options.bootstrapScript ?? ""];
68
-
69
- const child = spawn(process.execPath, args, {
70
- stdio: ["ignore", "ignore", "ignore", "ipc"],
71
- });
72
- this.process = child;
73
- child.on("message", (message) => {
74
- this.onMessage(message as SandboxResponseMessage | SandboxEventMessage);
75
- });
76
- child.on("error", (error) => {
77
- this.failPending(
78
- new Error(
79
- `${this.options.name ?? "sandbox"} process error: ${asError(error).message}`,
80
- ),
81
- );
82
- });
83
- child.on("exit", (code, signal) => {
84
- this.process = null;
85
- this.failPending(
86
- new Error(
87
- `${this.options.name ?? "sandbox"} process exited (code=${String(code)}, signal=${String(signal)})`,
88
- ),
89
- );
90
- });
91
- }
92
-
93
- async call<TResult = unknown>(
94
- method: string,
95
- args: unknown,
96
- options: SandboxCallOptions = {},
97
- ): Promise<TResult> {
98
- this.start();
99
- const child = this.process;
100
- if (!child || child.exitCode !== null) {
101
- throw new Error(
102
- `${this.options.name ?? "sandbox"} process is not available`,
103
- );
104
- }
105
-
106
- const id = `req_${++this.requestCounter}`;
107
- const message: SandboxCallMessage = {
108
- type: "call",
109
- id,
110
- method,
111
- args,
112
- };
113
-
114
- return await new Promise<TResult>((resolve, reject) => {
115
- const pending: PendingRequest = {
116
- resolve: (value) => resolve(value as TResult),
117
- reject,
118
- };
119
- if ((options.timeoutMs ?? 0) > 0) {
120
- pending.timeout = setTimeout(() => {
121
- this.pending.delete(id);
122
- this.shutdown().catch(() => {
123
- // Best-effort process shutdown after timeout.
124
- });
125
- reject(
126
- new Error(
127
- `${this.options.name ?? "sandbox"} call timed out after ${options.timeoutMs}ms: ${method}`,
128
- ),
129
- );
130
- }, options.timeoutMs);
131
- }
132
- this.pending.set(id, pending);
133
- child.send(message, (error) => {
134
- if (!error) {
135
- return;
136
- }
137
- const entry = this.pending.get(id);
138
- if (!entry) {
139
- return;
140
- }
141
- this.pending.delete(id);
142
- if (entry.timeout) {
143
- clearTimeout(entry.timeout);
144
- }
145
- entry.reject(
146
- new Error(
147
- `${this.options.name ?? "sandbox"} failed to send call "${method}": ${asError(error).message}`,
148
- ),
149
- );
150
- });
151
- });
152
- }
153
-
154
- async shutdown(): Promise<void> {
155
- const child = this.process;
156
- this.process = null;
157
- if (!child || child.exitCode !== null) {
158
- this.failPending(new Error(`${this.options.name ?? "sandbox"} shutdown`));
159
- return;
160
- }
161
- await new Promise<void>((resolve) => {
162
- const timeout = setTimeout(() => {
163
- try {
164
- child.kill("SIGKILL");
165
- } catch {
166
- // Ignore kill failures.
167
- }
168
- resolve();
169
- }, 300);
170
- child.once("exit", () => {
171
- clearTimeout(timeout);
172
- resolve();
173
- });
174
- try {
175
- child.kill("SIGTERM");
176
- } catch {
177
- clearTimeout(timeout);
178
- resolve();
179
- }
180
- });
181
- this.failPending(new Error(`${this.options.name ?? "sandbox"} shutdown`));
182
- }
183
-
184
- private onMessage(
185
- message: SandboxResponseMessage | SandboxEventMessage,
186
- ): void {
187
- if (!message) {
188
- return;
189
- }
190
- if (message.type === "event") {
191
- if (typeof message.name === "string" && message.name.length > 0) {
192
- this.options.onEvent?.({
193
- name: message.name,
194
- payload: message.payload,
195
- });
196
- }
197
- return;
198
- }
199
- if (message.type !== "response" || !message.id) {
200
- return;
201
- }
202
- const pending = this.pending.get(message.id);
203
- if (!pending) {
204
- return;
205
- }
206
- this.pending.delete(message.id);
207
- if (pending.timeout) {
208
- clearTimeout(pending.timeout);
209
- }
210
- if (message.ok) {
211
- pending.resolve(message.result);
212
- return;
213
- }
214
- pending.reject(
215
- new Error(
216
- message.error?.message ||
217
- `${this.options.name ?? "sandbox"} call failed`,
218
- ),
219
- );
220
- }
221
-
222
- private failPending(error: Error): void {
223
- for (const [id, pending] of this.pending.entries()) {
224
- this.pending.delete(id);
225
- if (pending.timeout) {
226
- clearTimeout(pending.timeout);
227
- }
228
- pending.reject(error);
229
- }
230
- }
231
- }
@@ -1,46 +0,0 @@
1
- import type {
2
- AgentConfig,
3
- AgentHooks,
4
- AgentResult,
5
- AgentTeamsRuntime,
6
- Tool,
7
- } from "@clinebot/agents";
8
- import type { BasicLogger, ITelemetryService } from "@clinebot/shared";
9
- import type { UserInstructionConfigWatcher } from "../agents";
10
- import type { ToolExecutors } from "../tools";
11
- import type { CoreSessionConfig } from "../types/config";
12
-
13
- export interface BuiltRuntime {
14
- tools: Tool[];
15
- hooks?: AgentHooks;
16
- logger?: BasicLogger;
17
- telemetry?: ITelemetryService;
18
- teamRuntime?: AgentTeamsRuntime;
19
- completionGuard?: () => string | undefined;
20
- shutdown: (reason: string) => Promise<void> | void;
21
- }
22
-
23
- export interface RuntimeBuilderInput {
24
- config: CoreSessionConfig;
25
- hooks?: AgentHooks;
26
- extensions?: AgentConfig["extensions"];
27
- onTeamEvent?: (event: import("@clinebot/agents").TeamEvent) => void;
28
- createSpawnTool?: () => Tool;
29
- onTeamRestored?: () => void;
30
- userInstructionWatcher?: UserInstructionConfigWatcher;
31
- defaultToolExecutors?: Partial<ToolExecutors>;
32
- logger?: BasicLogger;
33
- telemetry?: ITelemetryService;
34
- }
35
-
36
- export interface RuntimeBuilder {
37
- build(input: RuntimeBuilderInput): BuiltRuntime;
38
- }
39
-
40
- export interface SessionRuntime {
41
- start(config: CoreSessionConfig): Promise<{ sessionId: string }>;
42
- send(sessionId: string, prompt: string): Promise<AgentResult | undefined>;
43
- abort(sessionId: string, reason?: unknown): Promise<void>;
44
- stop(sessionId: string): Promise<void>;
45
- poll(): Promise<string[]>;
46
- }
@@ -1,44 +0,0 @@
1
- import type { UserInstructionConfigWatcher } from "../agents";
2
- import {
3
- listAvailableRuntimeCommandsForKindFromWatcher,
4
- resolveRuntimeSlashCommandFromWatcher,
5
- } from "./commands";
6
-
7
- export type AvailableSkill = {
8
- id: string;
9
- name: string;
10
- instructions: string;
11
- };
12
-
13
- function matchesLeadingSlashCommand(input: string, name: string): boolean {
14
- const match = input.match(/^\/(\S+)/);
15
- return match?.[1] === name;
16
- }
17
-
18
- export function listAvailableSkillsFromWatcher(
19
- watcher: UserInstructionConfigWatcher,
20
- ): AvailableSkill[] {
21
- return listAvailableRuntimeCommandsForKindFromWatcher(watcher, "skill").map(
22
- (skill) => ({
23
- id: skill.id,
24
- name: skill.name,
25
- instructions: skill.instructions,
26
- }),
27
- );
28
- }
29
-
30
- /**
31
- * Expands a leading slash command (e.g. "/release") to skill instructions.
32
- * If the input starts with "/<skill-name>", that prefix is replaced and the
33
- * remaining input is preserved unchanged.
34
- */
35
- export function resolveSkillsSlashCommandFromWatcher(
36
- input: string,
37
- watcher: UserInstructionConfigWatcher,
38
- ): string {
39
- const resolved = resolveRuntimeSlashCommandFromWatcher(input, watcher);
40
- const matched = listAvailableSkillsFromWatcher(watcher).some((skill) =>
41
- matchesLeadingSlashCommand(input, skill.name),
42
- );
43
- return matched ? resolved : input;
44
- }
@@ -1,104 +0,0 @@
1
- import { mkdir, readFile, unlink, writeFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
- import type { ToolApprovalRequest, ToolApprovalResult } from "@clinebot/agents";
4
-
5
- export type DesktopToolApprovalOptions = {
6
- approvalDir?: string;
7
- sessionId?: string;
8
- timeoutMs?: number;
9
- pollIntervalMs?: number;
10
- nowIso?: () => string;
11
- };
12
-
13
- function sanitizeApprovalToken(value: string): string {
14
- return value.replace(/[^a-zA-Z0-9._-]+/g, "_");
15
- }
16
-
17
- function delay(ms: number): Promise<void> {
18
- return new Promise((resolve) => setTimeout(resolve, ms));
19
- }
20
-
21
- export async function requestDesktopToolApproval(
22
- request: ToolApprovalRequest,
23
- options: DesktopToolApprovalOptions = {},
24
- ): Promise<ToolApprovalResult> {
25
- const approvalDir = options.approvalDir?.trim();
26
- const sessionId = options.sessionId?.trim();
27
- if (!approvalDir || !sessionId) {
28
- return {
29
- approved: false,
30
- reason: "Desktop tool approval IPC is not configured",
31
- };
32
- }
33
-
34
- await mkdir(approvalDir, { recursive: true });
35
- const requestId = sanitizeApprovalToken(`${request.toolCallId}`);
36
- const requestPath = join(
37
- approvalDir,
38
- `${sessionId}.request.${requestId}.json`,
39
- );
40
- const decisionPath = join(
41
- approvalDir,
42
- `${sessionId}.decision.${requestId}.json`,
43
- );
44
- const nowIso = options.nowIso ?? (() => new Date().toISOString());
45
-
46
- await writeFile(
47
- requestPath,
48
- `${JSON.stringify(
49
- {
50
- requestId,
51
- sessionId,
52
- createdAt: nowIso(),
53
- toolCallId: request.toolCallId,
54
- toolName: request.toolName,
55
- input: request.input,
56
- iteration: request.iteration,
57
- agentId: request.agentId,
58
- conversationId: request.conversationId,
59
- },
60
- null,
61
- 2,
62
- )}\n`,
63
- "utf8",
64
- );
65
-
66
- const timeoutMs = options.timeoutMs ?? 5 * 60_000;
67
- const pollIntervalMs = options.pollIntervalMs ?? 200;
68
- const startedAt = Date.now();
69
- while (Date.now() - startedAt < timeoutMs) {
70
- try {
71
- const raw = await readFile(decisionPath, "utf8");
72
- const parsed = JSON.parse(raw) as {
73
- approved?: boolean;
74
- reason?: string;
75
- };
76
- const result = {
77
- approved: parsed.approved === true,
78
- reason: typeof parsed.reason === "string" ? parsed.reason : undefined,
79
- };
80
- try {
81
- await unlink(decisionPath);
82
- } catch {
83
- // Best-effort cleanup.
84
- }
85
- try {
86
- await unlink(requestPath);
87
- } catch {
88
- // Best-effort cleanup.
89
- }
90
- return result;
91
- } catch {
92
- // Decision not available yet.
93
- }
94
- await delay(pollIntervalMs);
95
- }
96
-
97
- try {
98
- await unlink(requestPath);
99
- } catch {
100
- // Best-effort cleanup.
101
- }
102
-
103
- return { approved: false, reason: "Tool approval request timed out" };
104
- }
@@ -1,119 +0,0 @@
1
- import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import { afterEach, describe, expect, it } from "vitest";
5
- import { createUserInstructionConfigWatcher } from "../agents";
6
- import {
7
- listAvailableWorkflowsFromWatcher,
8
- resolveWorkflowSlashCommandFromWatcher,
9
- } from "./workflows";
10
-
11
- describe("runtime workflows helpers", () => {
12
- const tempRoots: string[] = [];
13
-
14
- afterEach(async () => {
15
- await Promise.all(
16
- tempRoots.map((dir) => rm(dir, { recursive: true, force: true })),
17
- );
18
- tempRoots.length = 0;
19
- });
20
-
21
- it("lists only enabled workflows from watcher snapshots", async () => {
22
- const tempRoot = await mkdtemp(join(tmpdir(), "core-runtime-workflows-"));
23
- tempRoots.push(tempRoot);
24
- const workflowsDir = join(tempRoot, "workflows");
25
- await mkdir(workflowsDir, { recursive: true });
26
- await writeFile(
27
- join(workflowsDir, "enabled.md"),
28
- `---
29
- name: enabled-workflow
30
- ---
31
- Run enabled workflow.`,
32
- );
33
- await writeFile(
34
- join(workflowsDir, "disabled.md"),
35
- `---
36
- name: disabled-workflow
37
- disabled: true
38
- ---
39
- Run disabled workflow.`,
40
- );
41
-
42
- const watcher = createUserInstructionConfigWatcher({
43
- skills: { directories: [] },
44
- rules: { directories: [] },
45
- workflows: { directories: [workflowsDir] },
46
- });
47
-
48
- try {
49
- await watcher.start();
50
- expect(listAvailableWorkflowsFromWatcher(watcher)).toEqual([
51
- {
52
- id: "enabled-workflow",
53
- name: "enabled-workflow",
54
- instructions: "Run enabled workflow.",
55
- },
56
- ]);
57
- } finally {
58
- watcher.stop();
59
- }
60
- });
61
-
62
- it("expands leading slash commands and preserves trailing user text", async () => {
63
- const tempRoot = await mkdtemp(join(tmpdir(), "core-runtime-workflows-"));
64
- tempRoots.push(tempRoot);
65
- const workflowsDir = join(tempRoot, "workflows");
66
- await mkdir(workflowsDir, { recursive: true });
67
- await writeFile(
68
- join(workflowsDir, "release.md"),
69
- `---
70
- name: release
71
- ---
72
- Run the release workflow.`,
73
- );
74
- await writeFile(
75
- join(workflowsDir, "disabled.md"),
76
- `---
77
- name: disabled
78
- disabled: true
79
- ---
80
- Do not run this workflow.`,
81
- );
82
-
83
- const watcher = createUserInstructionConfigWatcher({
84
- skills: { directories: [] },
85
- rules: { directories: [] },
86
- workflows: { directories: [workflowsDir] },
87
- });
88
-
89
- try {
90
- await watcher.start();
91
- expect(resolveWorkflowSlashCommandFromWatcher("/release", watcher)).toBe(
92
- "Run the release workflow.",
93
- );
94
- expect(
95
- resolveWorkflowSlashCommandFromWatcher(" /release ", watcher),
96
- ).toBe(" /release ");
97
- expect(resolveWorkflowSlashCommandFromWatcher("/disabled", watcher)).toBe(
98
- "/disabled",
99
- );
100
- expect(resolveWorkflowSlashCommandFromWatcher("/missing", watcher)).toBe(
101
- "/missing",
102
- );
103
- expect(
104
- resolveWorkflowSlashCommandFromWatcher("/release now", watcher),
105
- ).toBe("Run the release workflow. now");
106
- expect(
107
- resolveWorkflowSlashCommandFromWatcher(
108
- "/release use javascript",
109
- watcher,
110
- ),
111
- ).toBe("Run the release workflow. use javascript");
112
- expect(
113
- resolveWorkflowSlashCommandFromWatcher("please run /release", watcher),
114
- ).toBe("please run /release");
115
- } finally {
116
- watcher.stop();
117
- }
118
- });
119
- });