@clinebot/core 0.0.35 → 0.0.37

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 (441) hide show
  1. package/README.md +1 -2
  2. package/dist/ClineCore.d.ts +362 -39
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/account/cline-account-service.d.ts.map +1 -1
  5. package/dist/account/index.d.ts +1 -1
  6. package/dist/account/index.d.ts.map +1 -1
  7. package/dist/account/rpc.d.ts +6 -6
  8. package/dist/account/rpc.d.ts.map +1 -1
  9. package/dist/cron/cron-event-ingress.d.ts +38 -0
  10. package/dist/cron/cron-event-ingress.d.ts.map +1 -0
  11. package/dist/cron/cron-materializer.d.ts +36 -0
  12. package/dist/cron/cron-materializer.d.ts.map +1 -0
  13. package/dist/cron/cron-reconciler.d.ts +62 -0
  14. package/dist/cron/cron-reconciler.d.ts.map +1 -0
  15. package/dist/cron/cron-report-writer.d.ts +41 -0
  16. package/dist/cron/cron-report-writer.d.ts.map +1 -0
  17. package/dist/cron/cron-runner.d.ts +43 -0
  18. package/dist/cron/cron-runner.d.ts.map +1 -0
  19. package/dist/cron/cron-schema.d.ts +3 -0
  20. package/dist/cron/cron-schema.d.ts.map +1 -0
  21. package/dist/cron/cron-service.d.ts +57 -0
  22. package/dist/cron/cron-service.d.ts.map +1 -0
  23. package/dist/cron/cron-spec-parser.d.ts +27 -0
  24. package/dist/cron/cron-spec-parser.d.ts.map +1 -0
  25. package/dist/cron/cron-watcher.d.ts +23 -0
  26. package/dist/cron/cron-watcher.d.ts.map +1 -0
  27. package/dist/cron/resource-limiter.d.ts +9 -0
  28. package/dist/cron/resource-limiter.d.ts.map +1 -0
  29. package/dist/cron/schedule-command-service.d.ts +10 -0
  30. package/dist/cron/schedule-command-service.d.ts.map +1 -0
  31. package/dist/cron/schedule-service.d.ts +100 -0
  32. package/dist/cron/schedule-service.d.ts.map +1 -0
  33. package/dist/cron/scheduler.d.ts +68 -0
  34. package/dist/cron/scheduler.d.ts.map +1 -0
  35. package/dist/cron/sqlite-cron-store.d.ts +230 -0
  36. package/dist/cron/sqlite-cron-store.d.ts.map +1 -0
  37. package/dist/cron/sqlite-schedule-store.d.ts +52 -0
  38. package/dist/cron/sqlite-schedule-store.d.ts.map +1 -0
  39. package/dist/extensions/config/agent-config-loader.d.ts +4 -3
  40. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  41. package/dist/extensions/config/runtime-commands.d.ts +1 -0
  42. package/dist/extensions/config/runtime-commands.d.ts.map +1 -1
  43. package/dist/extensions/config/user-instruction-config-loader.d.ts +1 -0
  44. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  45. package/dist/extensions/context/agentic-compaction.d.ts +2 -2
  46. package/dist/extensions/context/agentic-compaction.d.ts.map +1 -1
  47. package/dist/extensions/context/compaction-shared.d.ts +5 -4
  48. package/dist/extensions/context/compaction-shared.d.ts.map +1 -1
  49. package/dist/extensions/context/compaction.d.ts.map +1 -1
  50. package/dist/extensions/plugin/plugin-config-loader.d.ts +15 -2
  51. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  52. package/dist/extensions/plugin/plugin-loader.d.ts +13 -7
  53. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  54. package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -1
  55. package/dist/extensions/plugin/plugin-sandbox.d.ts +21 -2
  56. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  57. package/dist/extensions/plugin/plugin-targeting.d.ts +7 -0
  58. package/dist/extensions/plugin/plugin-targeting.d.ts.map +1 -0
  59. package/dist/extensions/plugin-sandbox-bootstrap.js +237 -276
  60. package/dist/extensions/tools/constants.d.ts +1 -0
  61. package/dist/extensions/tools/constants.d.ts.map +1 -1
  62. package/dist/extensions/tools/definitions.d.ts +3 -4
  63. package/dist/extensions/tools/definitions.d.ts.map +1 -1
  64. package/dist/extensions/tools/executors/apply-patch.d.ts +3 -1
  65. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -1
  66. package/dist/extensions/tools/executors/editor.d.ts.map +1 -1
  67. package/dist/extensions/tools/executors/search.d.ts +1 -1
  68. package/dist/extensions/tools/executors/search.d.ts.map +1 -1
  69. package/dist/extensions/tools/helpers.d.ts +1 -0
  70. package/dist/extensions/tools/helpers.d.ts.map +1 -1
  71. package/dist/extensions/tools/index.d.ts +3 -2
  72. package/dist/extensions/tools/index.d.ts.map +1 -1
  73. package/dist/extensions/tools/presets.d.ts +27 -44
  74. package/dist/extensions/tools/presets.d.ts.map +1 -1
  75. package/dist/extensions/tools/runtime.d.ts +25 -0
  76. package/dist/extensions/tools/runtime.d.ts.map +1 -0
  77. package/dist/extensions/tools/schemas.d.ts +25 -3
  78. package/dist/extensions/tools/schemas.d.ts.map +1 -1
  79. package/dist/extensions/tools/team/delegated-agent.d.ts +2 -2
  80. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -1
  81. package/dist/extensions/tools/team/multi-agent.d.ts +7 -3
  82. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -1
  83. package/dist/extensions/tools/team/team-tools.d.ts +1 -0
  84. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -1
  85. package/dist/extensions/tools/types.d.ts +0 -5
  86. package/dist/extensions/tools/types.d.ts.map +1 -1
  87. package/dist/hooks/hook-bridge.d.ts +118 -0
  88. package/dist/hooks/hook-bridge.d.ts.map +1 -0
  89. package/dist/hooks/hook-file-hooks.d.ts +6 -2
  90. package/dist/hooks/hook-file-hooks.d.ts.map +1 -1
  91. package/dist/hooks/hook-registry.d.ts +16 -0
  92. package/dist/hooks/hook-registry.d.ts.map +1 -0
  93. package/dist/hooks/index.d.ts +0 -1
  94. package/dist/hooks/index.d.ts.map +1 -1
  95. package/dist/hooks/subprocess.d.ts +8 -1
  96. package/dist/hooks/subprocess.d.ts.map +1 -1
  97. package/dist/hub/browser-websocket.d.ts +18 -0
  98. package/dist/hub/browser-websocket.d.ts.map +1 -0
  99. package/dist/hub/client.d.ts +51 -0
  100. package/dist/hub/client.d.ts.map +1 -0
  101. package/dist/hub/connect.d.ts +15 -0
  102. package/dist/hub/connect.d.ts.map +1 -0
  103. package/dist/hub/daemon-entry.d.ts +2 -0
  104. package/dist/hub/daemon-entry.d.ts.map +1 -0
  105. package/dist/hub/daemon-entry.js +1305 -0
  106. package/dist/hub/daemon.d.ts +5 -0
  107. package/dist/hub/daemon.d.ts.map +1 -0
  108. package/dist/hub/defaults.d.ts +17 -0
  109. package/dist/hub/defaults.d.ts.map +1 -0
  110. package/dist/hub/discovery.d.ts +29 -0
  111. package/dist/hub/discovery.d.ts.map +1 -0
  112. package/dist/hub/index.d.ts +15 -0
  113. package/dist/hub/index.d.ts.map +1 -0
  114. package/dist/hub/index.js +1294 -0
  115. package/dist/hub/native-transport.d.ts +17 -0
  116. package/dist/hub/native-transport.d.ts.map +1 -0
  117. package/dist/hub/runtime-handlers.d.ts +11 -0
  118. package/dist/hub/runtime-handlers.d.ts.map +1 -0
  119. package/dist/hub/server.d.ts +104 -0
  120. package/dist/hub/server.d.ts.map +1 -0
  121. package/dist/hub/session-client.d.ts +90 -0
  122. package/dist/hub/session-client.d.ts.map +1 -0
  123. package/dist/hub/start-shared-server.d.ts +19 -0
  124. package/dist/hub/start-shared-server.d.ts.map +1 -0
  125. package/dist/hub/transport.d.ts +8 -0
  126. package/dist/hub/transport.d.ts.map +1 -0
  127. package/dist/hub/ui-client.d.ts +45 -0
  128. package/dist/hub/ui-client.d.ts.map +1 -0
  129. package/dist/hub/workspace.d.ts +4 -0
  130. package/dist/hub/workspace.d.ts.map +1 -0
  131. package/dist/index.d.ts +29 -16
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +782 -471
  134. package/dist/llms/cline-recommended-models.d.ts +20 -0
  135. package/dist/llms/cline-recommended-models.d.ts.map +1 -0
  136. package/dist/llms/configured-provider-registry.d.ts +28 -0
  137. package/dist/llms/configured-provider-registry.d.ts.map +1 -0
  138. package/dist/llms/handler-factory.d.ts +16 -0
  139. package/dist/llms/handler-factory.d.ts.map +1 -0
  140. package/dist/llms/provider-defaults.d.ts +27 -0
  141. package/dist/llms/provider-defaults.d.ts.map +1 -0
  142. package/dist/llms/provider-settings.d.ts +245 -0
  143. package/dist/llms/provider-settings.d.ts.map +1 -0
  144. package/dist/llms/runtime-config.d.ts +4 -0
  145. package/dist/llms/runtime-config.d.ts.map +1 -0
  146. package/dist/llms/runtime-registry.d.ts +20 -0
  147. package/dist/llms/runtime-registry.d.ts.map +1 -0
  148. package/dist/llms/runtime-types.d.ts +85 -0
  149. package/dist/llms/runtime-types.d.ts.map +1 -0
  150. package/dist/runtime/agent-config-adapter.d.ts +148 -0
  151. package/dist/runtime/agent-config-adapter.d.ts.map +1 -0
  152. package/dist/runtime/agent-runtime-config-builder.d.ts +96 -0
  153. package/dist/runtime/agent-runtime-config-builder.d.ts.map +1 -0
  154. package/dist/runtime/history.d.ts +6 -0
  155. package/dist/runtime/history.d.ts.map +1 -1
  156. package/dist/runtime/host.d.ts +1 -2
  157. package/dist/runtime/host.d.ts.map +1 -1
  158. package/dist/runtime/loop-detection.d.ts +59 -0
  159. package/dist/runtime/loop-detection.d.ts.map +1 -0
  160. package/dist/runtime/mistake-tracker.d.ts +69 -0
  161. package/dist/runtime/mistake-tracker.d.ts.map +1 -0
  162. package/dist/runtime/rules.d.ts +1 -0
  163. package/dist/runtime/rules.d.ts.map +1 -1
  164. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  165. package/dist/runtime/runtime-event-adapter.d.ts +102 -0
  166. package/dist/runtime/runtime-event-adapter.d.ts.map +1 -0
  167. package/dist/runtime/runtime-host.d.ts +49 -26
  168. package/dist/runtime/runtime-host.d.ts.map +1 -1
  169. package/dist/runtime/runtime-oauth-token-manager.d.ts.map +1 -1
  170. package/dist/runtime/session-runtime-orchestrator.d.ts +261 -0
  171. package/dist/runtime/session-runtime-orchestrator.d.ts.map +1 -0
  172. package/dist/runtime/session-runtime.d.ts +16 -21
  173. package/dist/runtime/session-runtime.d.ts.map +1 -1
  174. package/dist/runtime/user-input-builder.d.ts +24 -0
  175. package/dist/runtime/user-input-builder.d.ts.map +1 -0
  176. package/dist/services/global-settings.d.ts +12 -0
  177. package/dist/services/global-settings.d.ts.map +1 -0
  178. package/dist/services/index.js +28 -0
  179. package/dist/services/local-runtime-bootstrap.d.ts +9 -3
  180. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -1
  181. package/dist/services/plugin-tools.d.ts +16 -0
  182. package/dist/services/plugin-tools.d.ts.map +1 -0
  183. package/dist/services/providers/local-provider-registry.d.ts +199 -23
  184. package/dist/services/providers/local-provider-registry.d.ts.map +1 -1
  185. package/dist/services/providers/local-provider-service.d.ts +15 -13
  186. package/dist/services/providers/local-provider-service.d.ts.map +1 -1
  187. package/dist/services/session-data.d.ts +1 -1
  188. package/dist/services/session-data.d.ts.map +1 -1
  189. package/dist/services/session-telemetry.d.ts +7 -2
  190. package/dist/services/session-telemetry.d.ts.map +1 -1
  191. package/dist/services/storage/file-team-store.d.ts.map +1 -1
  192. package/dist/services/storage/provider-settings-legacy-migration.d.ts +1 -1
  193. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -1
  194. package/dist/services/storage/provider-settings-manager.d.ts +1 -0
  195. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -1
  196. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -1
  197. package/dist/services/workspace-manifest.d.ts +11 -0
  198. package/dist/services/workspace-manifest.d.ts.map +1 -1
  199. package/dist/session/conversation-store.d.ts +30 -0
  200. package/dist/session/conversation-store.d.ts.map +1 -0
  201. package/dist/session/message-builder.d.ts +65 -0
  202. package/dist/session/message-builder.d.ts.map +1 -0
  203. package/dist/session/persistence-service.d.ts +11 -23
  204. package/dist/session/persistence-service.d.ts.map +1 -1
  205. package/dist/session/session-manifest-store.d.ts +22 -0
  206. package/dist/session/session-manifest-store.d.ts.map +1 -0
  207. package/dist/session/session-manifest.d.ts +1 -1
  208. package/dist/session/session-row.d.ts +93 -0
  209. package/dist/session/session-row.d.ts.map +1 -0
  210. package/dist/session/session-service.d.ts +2 -102
  211. package/dist/session/session-service.d.ts.map +1 -1
  212. package/dist/session/subagent-session-manager.d.ts +36 -0
  213. package/dist/session/subagent-session-manager.d.ts.map +1 -0
  214. package/dist/session/team-persistence-store.d.ts +24 -0
  215. package/dist/session/team-persistence-store.d.ts.map +1 -0
  216. package/dist/transports/hub.d.ts +58 -0
  217. package/dist/transports/hub.d.ts.map +1 -0
  218. package/dist/transports/local.d.ts +23 -9
  219. package/dist/transports/local.d.ts.map +1 -1
  220. package/dist/transports/remote.d.ts +10 -0
  221. package/dist/transports/remote.d.ts.map +1 -0
  222. package/dist/transports/runtime-host-support.d.ts +3 -2
  223. package/dist/transports/runtime-host-support.d.ts.map +1 -1
  224. package/dist/types/chat-schema.d.ts +15 -17
  225. package/dist/types/chat-schema.d.ts.map +1 -1
  226. package/dist/types/config.d.ts +17 -7
  227. package/dist/types/config.d.ts.map +1 -1
  228. package/dist/types/events.d.ts +7 -6
  229. package/dist/types/events.d.ts.map +1 -1
  230. package/dist/types/provider-settings.d.ts +4 -5
  231. package/dist/types/provider-settings.d.ts.map +1 -1
  232. package/dist/types/session.d.ts +7 -3
  233. package/dist/types/session.d.ts.map +1 -1
  234. package/dist/types.d.ts +11 -4
  235. package/dist/types.d.ts.map +1 -1
  236. package/package.json +20 -6
  237. package/src/ClineCore.ts +757 -44
  238. package/src/account/cline-account-service.ts +44 -6
  239. package/src/account/index.ts +3 -3
  240. package/src/account/rpc.ts +12 -12
  241. package/src/cron/cron-event-ingress.ts +357 -0
  242. package/src/cron/cron-materializer.ts +97 -0
  243. package/src/cron/cron-reconciler.ts +241 -0
  244. package/src/cron/cron-report-writer.ts +153 -0
  245. package/src/cron/cron-runner.ts +495 -0
  246. package/src/cron/cron-schema.ts +127 -0
  247. package/src/cron/cron-service.ts +163 -0
  248. package/src/cron/cron-spec-parser.ts +489 -0
  249. package/src/cron/cron-watcher.ts +102 -0
  250. package/src/cron/index.ts +15 -0
  251. package/src/cron/resource-limiter.ts +46 -0
  252. package/src/cron/schedule-command-service.ts +193 -0
  253. package/src/cron/schedule-service.ts +703 -0
  254. package/src/cron/scheduler.ts +772 -0
  255. package/src/cron/sqlite-cron-store.ts +1286 -0
  256. package/src/cron/sqlite-schedule-store.ts +708 -0
  257. package/src/extensions/config/agent-config-loader.ts +17 -7
  258. package/src/extensions/config/runtime-commands.ts +6 -0
  259. package/src/extensions/config/user-instruction-config-loader.ts +1 -0
  260. package/src/extensions/context/agentic-compaction.ts +3 -3
  261. package/src/extensions/context/basic-compaction.ts +2 -2
  262. package/src/extensions/context/compaction-shared.ts +5 -4
  263. package/src/extensions/context/compaction.ts +3 -3
  264. package/src/extensions/plugin/plugin-config-loader.ts +37 -2
  265. package/src/extensions/plugin/plugin-loader.ts +69 -9
  266. package/src/extensions/plugin/plugin-module-import.ts +0 -2
  267. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +243 -39
  268. package/src/extensions/plugin/plugin-sandbox.ts +173 -29
  269. package/src/extensions/plugin/plugin-targeting.ts +32 -0
  270. package/src/extensions/tools/constants.ts +2 -0
  271. package/src/extensions/tools/definitions.ts +61 -71
  272. package/src/extensions/tools/executors/apply-patch.ts +69 -80
  273. package/src/extensions/tools/executors/editor.ts +4 -3
  274. package/src/extensions/tools/executors/search.ts +195 -3
  275. package/src/extensions/tools/helpers.ts +24 -0
  276. package/src/extensions/tools/index.ts +11 -2
  277. package/src/extensions/tools/presets.ts +32 -47
  278. package/src/extensions/tools/runtime.ts +261 -0
  279. package/src/extensions/tools/schemas.ts +17 -20
  280. package/src/extensions/tools/team/delegated-agent.ts +8 -3
  281. package/src/extensions/tools/team/multi-agent.ts +135 -19
  282. package/src/extensions/tools/team/team-tools.ts +172 -91
  283. package/src/extensions/tools/types.ts +0 -6
  284. package/src/hooks/hook-bridge.ts +489 -0
  285. package/src/hooks/hook-file-hooks.ts +66 -5
  286. package/src/hooks/hook-registry.ts +257 -0
  287. package/src/hooks/index.ts +0 -7
  288. package/src/hooks/subprocess-runner.ts +1 -1
  289. package/src/hooks/subprocess.ts +9 -0
  290. package/src/hub/browser-websocket.ts +159 -0
  291. package/src/hub/client.ts +633 -0
  292. package/src/hub/connect.ts +156 -0
  293. package/src/hub/daemon-entry.ts +122 -0
  294. package/src/hub/daemon.ts +284 -0
  295. package/src/hub/defaults.ts +70 -0
  296. package/src/hub/discovery.ts +247 -0
  297. package/src/hub/index.ts +14 -0
  298. package/src/hub/native-transport.ts +31 -0
  299. package/src/hub/runtime-handlers.ts +141 -0
  300. package/src/hub/server.ts +2317 -0
  301. package/src/hub/session-client.ts +502 -0
  302. package/src/hub/start-shared-server.ts +61 -0
  303. package/src/hub/transport.ts +14 -0
  304. package/src/hub/ui-client.ts +126 -0
  305. package/src/hub/workspace.ts +19 -0
  306. package/src/index.ts +169 -68
  307. package/src/llms/cline-recommended-models.ts +167 -0
  308. package/src/llms/configured-provider-registry.ts +193 -0
  309. package/src/llms/handler-factory.ts +56 -0
  310. package/src/llms/provider-defaults.ts +653 -0
  311. package/src/llms/provider-settings.ts +310 -0
  312. package/src/llms/runtime-config.ts +43 -0
  313. package/src/llms/runtime-registry.ts +172 -0
  314. package/src/llms/runtime-types.ts +121 -0
  315. package/src/runtime/agent-config-adapter.ts +636 -0
  316. package/src/runtime/agent-runtime-config-builder.ts +205 -0
  317. package/src/runtime/error-feedback.ts +142 -0
  318. package/src/runtime/history.ts +137 -0
  319. package/src/runtime/host.ts +127 -267
  320. package/src/runtime/index.ts +1 -0
  321. package/src/runtime/loop-detection.ts +162 -0
  322. package/src/runtime/mistake-tracker.ts +221 -0
  323. package/src/runtime/rules.ts +12 -0
  324. package/src/runtime/runtime-builder.ts +85 -13
  325. package/src/runtime/runtime-event-adapter.ts +412 -0
  326. package/src/runtime/runtime-host.ts +134 -62
  327. package/src/runtime/runtime-oauth-token-manager.ts +11 -15
  328. package/src/runtime/session-runtime-orchestrator.ts +1253 -0
  329. package/src/runtime/session-runtime.ts +16 -26
  330. package/src/runtime/user-input-builder.ts +167 -0
  331. package/src/services/global-settings.ts +122 -0
  332. package/src/services/local-runtime-bootstrap.ts +175 -31
  333. package/src/services/plugin-tools.ts +86 -0
  334. package/src/services/providers/local-provider-registry.ts +277 -61
  335. package/src/services/providers/local-provider-service.ts +109 -44
  336. package/src/services/session-data.ts +18 -10
  337. package/src/services/session-telemetry.ts +6 -15
  338. package/src/services/storage/file-team-store.ts +1 -5
  339. package/src/services/storage/provider-settings-legacy-migration.ts +14 -51
  340. package/src/services/storage/provider-settings-manager.ts +17 -2
  341. package/src/services/storage/sqlite-team-store.ts +1 -5
  342. package/src/services/workspace-manifest.ts +18 -0
  343. package/src/session/conversation-store.ts +77 -0
  344. package/src/session/file-session-service.ts +1 -1
  345. package/src/session/index.ts +6 -27
  346. package/src/session/message-builder.ts +941 -0
  347. package/src/session/persistence-service.ts +119 -504
  348. package/src/session/session-manifest-store.ts +158 -0
  349. package/src/session/session-row.ts +199 -0
  350. package/src/session/session-service.ts +17 -376
  351. package/src/session/session-team-coordination.ts +1 -1
  352. package/src/session/subagent-session-manager.ts +397 -0
  353. package/src/session/team-persistence-store.ts +176 -0
  354. package/src/transports/hub.ts +1081 -0
  355. package/src/transports/local.ts +419 -93
  356. package/src/transports/remote.ts +27 -0
  357. package/src/transports/runtime-host-support.ts +63 -9
  358. package/src/types/chat-schema.ts +4 -5
  359. package/src/types/config.ts +17 -7
  360. package/src/types/events.ts +8 -6
  361. package/src/types/index.ts +3 -0
  362. package/src/types/provider-settings.ts +18 -7
  363. package/src/types/session.ts +7 -6
  364. package/src/types.ts +42 -2
  365. package/dist/hooks/persistent.d.ts +0 -64
  366. package/dist/hooks/persistent.d.ts.map +0 -1
  367. package/dist/runtime/rpc-runtime-ensure.d.ts +0 -65
  368. package/dist/runtime/rpc-runtime-ensure.d.ts.map +0 -1
  369. package/dist/runtime/rpc-spawn-lease.d.ts +0 -8
  370. package/dist/runtime/rpc-spawn-lease.d.ts.map +0 -1
  371. package/dist/services/telemetry/index.js +0 -15
  372. package/dist/session/rpc-session-service.d.ts +0 -16
  373. package/dist/session/rpc-session-service.d.ts.map +0 -1
  374. package/dist/session/sqlite-rpc-session-backend.d.ts +0 -31
  375. package/dist/session/sqlite-rpc-session-backend.d.ts.map +0 -1
  376. package/dist/transports/rpc.d.ts +0 -51
  377. package/dist/transports/rpc.d.ts.map +0 -1
  378. package/src/ClineCore.test.ts +0 -226
  379. package/src/account/cline-account-service.test.ts +0 -185
  380. package/src/account/featurebase-token.test.ts +0 -175
  381. package/src/account/rpc.test.ts +0 -63
  382. package/src/auth/bounded-ttl-cache.test.ts +0 -38
  383. package/src/auth/client.test.ts +0 -69
  384. package/src/auth/cline.test.ts +0 -267
  385. package/src/auth/codex.test.ts +0 -170
  386. package/src/auth/oca.test.ts +0 -340
  387. package/src/auth/server.test.ts +0 -287
  388. package/src/auth/utils.test.ts +0 -128
  389. package/src/extensions/config/agent-config-loader.test.ts +0 -236
  390. package/src/extensions/config/hooks-config-loader.test.ts +0 -20
  391. package/src/extensions/config/runtime-commands.test.ts +0 -115
  392. package/src/extensions/config/unified-config-file-watcher.test.ts +0 -196
  393. package/src/extensions/config/user-instruction-config-loader.test.ts +0 -246
  394. package/src/extensions/context/compaction.test.ts +0 -483
  395. package/src/extensions/mcp/config-loader.test.ts +0 -238
  396. package/src/extensions/mcp/manager.test.ts +0 -105
  397. package/src/extensions/plugin/plugin-config-loader.test.ts +0 -184
  398. package/src/extensions/plugin/plugin-loader.test.ts +0 -292
  399. package/src/extensions/plugin/plugin-sandbox.test.ts +0 -423
  400. package/src/extensions/tools/definitions.test.ts +0 -780
  401. package/src/extensions/tools/executors/bash.test.ts +0 -87
  402. package/src/extensions/tools/executors/editor.test.ts +0 -35
  403. package/src/extensions/tools/executors/file-read.test.ts +0 -125
  404. package/src/extensions/tools/model-tool-routing.test.ts +0 -86
  405. package/src/extensions/tools/presets.test.ts +0 -70
  406. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +0 -455
  407. package/src/extensions/tools/team/spawn-agent-tool.test.ts +0 -381
  408. package/src/extensions/tools/team/team-tools.test.ts +0 -918
  409. package/src/hooks/checkpoint-hooks.test.ts +0 -168
  410. package/src/hooks/hook-file-hooks.test.ts +0 -311
  411. package/src/hooks/persistent.ts +0 -661
  412. package/src/runtime/history.test.ts +0 -114
  413. package/src/runtime/host.test.ts +0 -230
  414. package/src/runtime/rpc-runtime-ensure.test.ts +0 -123
  415. package/src/runtime/rpc-runtime-ensure.ts +0 -659
  416. package/src/runtime/rpc-spawn-lease.test.ts +0 -81
  417. package/src/runtime/rpc-spawn-lease.ts +0 -156
  418. package/src/runtime/runtime-builder.team-persistence.test.ts +0 -245
  419. package/src/runtime/runtime-builder.test.ts +0 -615
  420. package/src/runtime/runtime-oauth-token-manager.test.ts +0 -137
  421. package/src/runtime/runtime-parity.test.ts +0 -143
  422. package/src/services/providers/local-provider-service.test.ts +0 -1062
  423. package/src/services/session-data.test.ts +0 -160
  424. package/src/services/storage/provider-settings-legacy-migration.test.ts +0 -424
  425. package/src/services/storage/provider-settings-manager.test.ts +0 -191
  426. package/src/services/telemetry/OpenTelemetryAdapter.test.ts +0 -157
  427. package/src/services/telemetry/OpenTelemetryProvider.test.ts +0 -326
  428. package/src/services/telemetry/TelemetryLoggerSink.test.ts +0 -42
  429. package/src/services/telemetry/TelemetryService.test.ts +0 -134
  430. package/src/services/telemetry/distinct-id.test.ts +0 -57
  431. package/src/services/workspace/file-indexer.d.ts +0 -11
  432. package/src/services/workspace/file-indexer.test.ts +0 -156
  433. package/src/services/workspace/mention-enricher.test.ts +0 -106
  434. package/src/session/persistence-service.test.ts +0 -300
  435. package/src/session/rpc-session-service.ts +0 -114
  436. package/src/session/session-service.team-persistence.test.ts +0 -48
  437. package/src/session/sqlite-rpc-session-backend.ts +0 -301
  438. package/src/transports/local.e2e.test.ts +0 -380
  439. package/src/transports/local.test.ts +0 -2559
  440. package/src/transports/rpc.test.ts +0 -82
  441. package/src/transports/rpc.ts +0 -665
@@ -19,6 +19,33 @@ interface ClineApiEnvelope<T> {
19
19
  data?: T;
20
20
  }
21
21
 
22
+ function getClineApiEnvelopeError(parsed: unknown): string | undefined {
23
+ if (typeof parsed !== "object" || parsed === null || !("error" in parsed)) {
24
+ return undefined;
25
+ }
26
+ const error = parsed.error;
27
+ return typeof error === "string" && error.trim() ? error : undefined;
28
+ }
29
+
30
+ function formatClineAccountRequestFailure(
31
+ status: number,
32
+ bodyText: string,
33
+ parsed: unknown,
34
+ ): string {
35
+ const envelopeError = getClineApiEnvelopeError(parsed);
36
+ if (envelopeError) {
37
+ return envelopeError;
38
+ }
39
+
40
+ const body = bodyText.trim();
41
+ if (body) {
42
+ const preview = body.length > 200 ? `${body.slice(0, 200)}...` : body;
43
+ return `Cline account request failed with status ${status}: ${preview}`;
44
+ }
45
+
46
+ return `Cline account request failed with status ${status}`;
47
+ }
48
+
22
49
  export interface ClineAccountServiceOptions {
23
50
  apiBaseUrl: string;
24
51
  getAuthToken: () => Promise<string | undefined | null>;
@@ -266,15 +293,26 @@ export class ClineAccountService {
266
293
  const text = await response.text();
267
294
  let parsed: unknown;
268
295
  if (text.trim()) {
269
- parsed = JSON.parse(text);
296
+ try {
297
+ parsed = JSON.parse(text);
298
+ } catch {
299
+ if (!response.ok) {
300
+ throw new Error(
301
+ formatClineAccountRequestFailure(
302
+ response.status,
303
+ text,
304
+ undefined,
305
+ ),
306
+ );
307
+ }
308
+ throw new Error("Cline account response was not valid JSON");
309
+ }
270
310
  }
271
311
 
272
312
  if (!response.ok) {
273
- const message =
274
- typeof parsed === "object" && parsed !== null && "error" in parsed
275
- ? String((parsed as { error: unknown }).error)
276
- : `Cline account request failed with status ${response.status}`;
277
- throw new Error(message);
313
+ throw new Error(
314
+ formatClineAccountRequestFailure(response.status, text, parsed),
315
+ );
278
316
  }
279
317
 
280
318
  if (typeof parsed === "object" && parsed !== null) {
@@ -4,10 +4,10 @@ export {
4
4
  } from "./cline-account-service";
5
5
  export {
6
6
  type ClineAccountOperations,
7
- executeRpcClineAccountAction,
8
- isRpcClineAccountActionRequest,
7
+ executeClineAccountAction,
8
+ isClineAccountActionRequest,
9
+ type ProviderActionExecutor,
9
10
  RpcClineAccountService,
10
- type RpcProviderActionExecutor,
11
11
  } from "./rpc";
12
12
  export type {
13
13
  ClineAccountBalance,
@@ -1,6 +1,6 @@
1
1
  import type {
2
- RpcClineAccountActionRequest,
3
- RpcProviderActionRequest,
2
+ ClineAccountActionRequest,
3
+ ProviderActionRequest,
4
4
  } from "@clinebot/shared";
5
5
  import type {
6
6
  ClineAccountBalance,
@@ -34,14 +34,14 @@ export interface ClineAccountOperations {
34
34
  fetchFeaturebaseToken?(): Promise<FeaturebaseTokenResponse | undefined>;
35
35
  }
36
36
 
37
- export function isRpcClineAccountActionRequest(
38
- request: RpcProviderActionRequest,
39
- ): request is RpcClineAccountActionRequest {
37
+ export function isClineAccountActionRequest(
38
+ request: ProviderActionRequest,
39
+ ): request is ClineAccountActionRequest {
40
40
  return request.action === "clineAccount";
41
41
  }
42
42
 
43
- export async function executeRpcClineAccountAction(
44
- request: RpcClineAccountActionRequest,
43
+ export async function executeClineAccountAction(
44
+ request: ClineAccountActionRequest,
45
45
  service: ClineAccountOperations,
46
46
  ): Promise<unknown> {
47
47
  switch (request.operation) {
@@ -76,16 +76,16 @@ export async function executeRpcClineAccountAction(
76
76
  }
77
77
  }
78
78
 
79
- export interface RpcProviderActionExecutor {
80
- runProviderAction(request: RpcProviderActionRequest): Promise<{
79
+ export interface ProviderActionExecutor {
80
+ runProviderAction(request: ProviderActionRequest): Promise<{
81
81
  result: unknown;
82
82
  }>;
83
83
  }
84
84
 
85
85
  export class RpcClineAccountService implements ClineAccountOperations {
86
- private readonly executor: RpcProviderActionExecutor;
86
+ private readonly executor: ProviderActionExecutor;
87
87
 
88
- constructor(executor: RpcProviderActionExecutor) {
88
+ constructor(executor: ProviderActionExecutor) {
89
89
  this.executor = executor;
90
90
  }
91
91
 
@@ -178,7 +178,7 @@ export class RpcClineAccountService implements ClineAccountOperations {
178
178
  });
179
179
  }
180
180
 
181
- private async request<T>(request: RpcClineAccountActionRequest): Promise<T> {
181
+ private async request<T>(request: ClineAccountActionRequest): Promise<T> {
182
182
  const response = await this.executor.runProviderAction(request);
183
183
  return response.result as T;
184
184
  }
@@ -0,0 +1,357 @@
1
+ import type { AutomationEventEnvelope, BasicLogger } from "@clinebot/shared";
2
+ import type {
3
+ CronEventLogRecord,
4
+ CronRunRecord,
5
+ CronSpecRecord,
6
+ SqliteCronStore,
7
+ } from "./sqlite-cron-store";
8
+
9
+ /**
10
+ * Durable ingress for normalized automation events.
11
+ *
12
+ * This layer persists the incoming event before matching, then materializes
13
+ * queued `cron_runs` for matching event specs. It deliberately does not
14
+ * execute agents; the normal runner claim loop owns execution.
15
+ */
16
+
17
+ export interface CronEventIngressOptions {
18
+ store: SqliteCronStore;
19
+ now?: () => number;
20
+ logger?: BasicLogger;
21
+ }
22
+
23
+ export type CronEventSuppressionReason =
24
+ | "duplicate_event"
25
+ | "filter_mismatch"
26
+ | "dedupe_window"
27
+ | "cooldown";
28
+
29
+ export interface CronEventSuppression {
30
+ specId?: string;
31
+ externalId?: string;
32
+ reason: CronEventSuppressionReason;
33
+ dedupeKey?: string;
34
+ }
35
+
36
+ export interface CronEventIngressResult {
37
+ event: CronEventLogRecord;
38
+ duplicate: boolean;
39
+ matchedSpecs: CronSpecRecord[];
40
+ queuedRuns: CronRunRecord[];
41
+ suppressions: CronEventSuppression[];
42
+ }
43
+
44
+ function isRecord(value: unknown): value is Record<string, unknown> {
45
+ return !!value && typeof value === "object" && !Array.isArray(value);
46
+ }
47
+
48
+ function trimOrUndefined(value: string | undefined): string | undefined {
49
+ const trimmed = value?.trim();
50
+ return trimmed ? trimmed : undefined;
51
+ }
52
+
53
+ function normalizeIso(value: string | undefined, fallback: string): string {
54
+ const candidate = value?.trim();
55
+ if (!candidate) return fallback;
56
+ const ms = Date.parse(candidate);
57
+ if (!Number.isFinite(ms)) return fallback;
58
+ return new Date(ms).toISOString();
59
+ }
60
+
61
+ function addSeconds(iso: string, seconds: number): string {
62
+ return new Date(
63
+ new Date(iso).getTime() + Math.max(0, Math.floor(seconds)) * 1000,
64
+ ).toISOString();
65
+ }
66
+
67
+ function subtractSeconds(iso: string, seconds: number): string {
68
+ return new Date(
69
+ new Date(iso).getTime() - Math.max(0, Math.floor(seconds)) * 1000,
70
+ ).toISOString();
71
+ }
72
+
73
+ function maxIso(a: string | undefined, b: string): string {
74
+ if (!a) return b;
75
+ return new Date(a).getTime() >= new Date(b).getTime() ? a : b;
76
+ }
77
+
78
+ function normalizeEvent(
79
+ event: AutomationEventEnvelope,
80
+ receivedAt: string,
81
+ ): AutomationEventEnvelope {
82
+ const eventId = event.eventId.trim();
83
+ const eventType = event.eventType.trim();
84
+ const source = event.source.trim();
85
+ const subject = trimOrUndefined(event.subject);
86
+ const dedupeKey =
87
+ trimOrUndefined(event.dedupeKey) ??
88
+ `${eventType}:${source}:${subject ?? eventId}`;
89
+ return {
90
+ eventId,
91
+ eventType,
92
+ source,
93
+ subject,
94
+ occurredAt: normalizeIso(event.occurredAt, receivedAt),
95
+ workspaceRoot: trimOrUndefined(event.workspaceRoot),
96
+ payload: isRecord(event.payload) ? event.payload : undefined,
97
+ attributes: isRecord(event.attributes) ? event.attributes : undefined,
98
+ dedupeKey,
99
+ };
100
+ }
101
+
102
+ function getPath(value: unknown, path: string): unknown {
103
+ if (!path) return undefined;
104
+ const parts = path.split(".");
105
+ let current: unknown = value;
106
+ for (const part of parts) {
107
+ if (!isRecord(current)) return undefined;
108
+ current = current[part];
109
+ }
110
+ return current;
111
+ }
112
+
113
+ function resolveFilterValue(
114
+ event: AutomationEventEnvelope,
115
+ filterKey: string,
116
+ ): unknown {
117
+ if (event.attributes && Object.hasOwn(event.attributes, filterKey)) {
118
+ return event.attributes[filterKey];
119
+ }
120
+ if (event.payload && Object.hasOwn(event.payload, filterKey)) {
121
+ return event.payload[filterKey];
122
+ }
123
+ const candidate = {
124
+ eventId: event.eventId,
125
+ eventType: event.eventType,
126
+ source: event.source,
127
+ subject: event.subject,
128
+ occurredAt: event.occurredAt,
129
+ workspaceRoot: event.workspaceRoot,
130
+ dedupeKey: event.dedupeKey,
131
+ attributes: event.attributes,
132
+ payload: event.payload,
133
+ };
134
+ const direct = getPath(candidate, filterKey);
135
+ if (direct !== undefined) return direct;
136
+ if (event.attributes) {
137
+ const fromAttributes = getPath(event.attributes, filterKey);
138
+ if (fromAttributes !== undefined) return fromAttributes;
139
+ }
140
+ if (event.payload) {
141
+ return getPath(event.payload, filterKey);
142
+ }
143
+ return undefined;
144
+ }
145
+
146
+ function matchesExpected(actual: unknown, expected: unknown): boolean {
147
+ if (Array.isArray(expected)) {
148
+ return expected.some((item) => matchesExpected(actual, item));
149
+ }
150
+ if (Array.isArray(actual)) {
151
+ return actual.some((item) => matchesExpected(item, expected));
152
+ }
153
+ if (isRecord(expected)) {
154
+ if (!isRecord(actual)) return false;
155
+ return Object.entries(expected).every(([key, value]) =>
156
+ matchesExpected(actual[key], value),
157
+ );
158
+ }
159
+ return Object.is(actual, expected);
160
+ }
161
+
162
+ export function automationEventMatchesFilters(
163
+ event: AutomationEventEnvelope,
164
+ filters: Record<string, unknown> | undefined,
165
+ ): boolean {
166
+ if (!filters || Object.keys(filters).length === 0) return true;
167
+ return Object.entries(filters).every(([key, expected]) =>
168
+ matchesExpected(resolveFilterValue(event, key), expected),
169
+ );
170
+ }
171
+
172
+ export class CronEventIngress {
173
+ private readonly store: SqliteCronStore;
174
+ private readonly nowFn: () => number;
175
+ private readonly logger?: BasicLogger;
176
+
177
+ constructor(options: CronEventIngressOptions) {
178
+ this.store = options.store;
179
+ this.nowFn = options.now ?? (() => Date.now());
180
+ this.logger = options.logger;
181
+ }
182
+
183
+ public ingestEvent(event: AutomationEventEnvelope): CronEventIngressResult {
184
+ const receivedAt = new Date(this.nowFn()).toISOString();
185
+ const normalized = normalizeEvent(event, receivedAt);
186
+ const inserted = this.store.insertEventLog(normalized, {
187
+ receivedAtIso: receivedAt,
188
+ });
189
+ if (!inserted.created) {
190
+ this.logger?.debug("cron.event.duplicate", {
191
+ eventId: inserted.record.eventId,
192
+ eventType: inserted.record.eventType,
193
+ source: inserted.record.source,
194
+ });
195
+ return {
196
+ event: inserted.record,
197
+ duplicate: true,
198
+ matchedSpecs: [],
199
+ queuedRuns: [],
200
+ suppressions: [
201
+ {
202
+ reason: "duplicate_event",
203
+ dedupeKey: inserted.record.dedupeKey,
204
+ },
205
+ ],
206
+ };
207
+ }
208
+
209
+ try {
210
+ const allCandidateSpecs = this.store.listEventSpecsForType(
211
+ normalized.eventType,
212
+ );
213
+ const suppressions: CronEventSuppression[] = [];
214
+ const matchedSpecs: CronSpecRecord[] = [];
215
+ const queuedRuns: CronRunRecord[] = [];
216
+
217
+ for (const spec of allCandidateSpecs) {
218
+ if (!automationEventMatchesFilters(normalized, spec.filters)) {
219
+ suppressions.push({
220
+ specId: spec.specId,
221
+ externalId: spec.externalId,
222
+ reason: "filter_mismatch",
223
+ dedupeKey: normalized.dedupeKey,
224
+ });
225
+ continue;
226
+ }
227
+ matchedSpecs.push(spec);
228
+ const run = this.materializeForSpec(
229
+ spec,
230
+ normalized,
231
+ inserted.record.receivedAt,
232
+ );
233
+ if (run.run) {
234
+ queuedRuns.push(run.run);
235
+ } else {
236
+ suppressions.push({
237
+ specId: spec.specId,
238
+ externalId: spec.externalId,
239
+ reason: run.reason,
240
+ dedupeKey: normalized.dedupeKey,
241
+ });
242
+ }
243
+ }
244
+
245
+ const status =
246
+ matchedSpecs.length === 0
247
+ ? "unmatched"
248
+ : queuedRuns.length > 0
249
+ ? "queued"
250
+ : "suppressed";
251
+ this.store.updateEventLogProcessing(inserted.record.eventId, {
252
+ status,
253
+ matchedSpecCount: matchedSpecs.length,
254
+ queuedRunCount: queuedRuns.length,
255
+ suppressedCount: suppressions.filter(
256
+ (s) => s.reason !== "filter_mismatch",
257
+ ).length,
258
+ });
259
+ const updated = this.store.getEventLog(inserted.record.eventId);
260
+ this.logger?.debug("cron.event.processed", {
261
+ eventId: inserted.record.eventId,
262
+ eventType: inserted.record.eventType,
263
+ status,
264
+ matchedSpecCount: matchedSpecs.length,
265
+ queuedRunCount: queuedRuns.length,
266
+ });
267
+ return {
268
+ event: updated ?? inserted.record,
269
+ duplicate: false,
270
+ matchedSpecs,
271
+ queuedRuns,
272
+ suppressions,
273
+ };
274
+ } catch (err) {
275
+ this.store.updateEventLogProcessing(inserted.record.eventId, {
276
+ status: "failed",
277
+ error: err instanceof Error ? err.message : String(err),
278
+ });
279
+ if (this.logger?.error) {
280
+ this.logger.error("cron.event.failed", {
281
+ eventId: inserted.record.eventId,
282
+ eventType: inserted.record.eventType,
283
+ error: err,
284
+ });
285
+ }
286
+ throw err;
287
+ }
288
+ }
289
+
290
+ private materializeForSpec(
291
+ spec: CronSpecRecord,
292
+ event: AutomationEventEnvelope,
293
+ receivedAt: string,
294
+ ): {
295
+ run?: CronRunRecord;
296
+ reason: Exclude<
297
+ CronEventSuppressionReason,
298
+ "duplicate_event" | "filter_mismatch"
299
+ >;
300
+ } {
301
+ const dedupeKey = event.dedupeKey ?? event.eventId;
302
+ const debounceSeconds = spec.debounceSeconds ?? 0;
303
+ if (debounceSeconds > 0) {
304
+ const existing = this.store.findQueuedEventRunForDedupe({
305
+ specId: spec.specId,
306
+ dedupeKey,
307
+ });
308
+ if (existing) {
309
+ const scheduledFor = maxIso(
310
+ existing.scheduledFor,
311
+ addSeconds(receivedAt, debounceSeconds),
312
+ );
313
+ const updated = this.store.updateQueuedEventRunForDebounce({
314
+ runId: existing.runId,
315
+ triggerEventId: event.eventId,
316
+ scheduledFor,
317
+ });
318
+ if (updated) return { run: updated, reason: "dedupe_window" };
319
+ }
320
+ }
321
+
322
+ const dedupeWindowSeconds = spec.dedupeWindowSeconds ?? 0;
323
+ if (
324
+ dedupeWindowSeconds > 0 &&
325
+ this.store.hasRecentEventRunForDedupe({
326
+ specId: spec.specId,
327
+ dedupeKey,
328
+ sinceIso: subtractSeconds(receivedAt, dedupeWindowSeconds),
329
+ })
330
+ ) {
331
+ return { reason: "dedupe_window" };
332
+ }
333
+
334
+ const cooldownSeconds = spec.cooldownSeconds ?? 0;
335
+ if (
336
+ cooldownSeconds > 0 &&
337
+ this.store.hasRecentEventRunForSpec({
338
+ specId: spec.specId,
339
+ sinceIso: subtractSeconds(receivedAt, cooldownSeconds),
340
+ })
341
+ ) {
342
+ return { reason: "cooldown" };
343
+ }
344
+
345
+ const run = this.store.enqueueRun({
346
+ specId: spec.specId,
347
+ specRevision: spec.revision,
348
+ triggerKind: "event",
349
+ triggerEventId: event.eventId,
350
+ scheduledFor:
351
+ debounceSeconds > 0
352
+ ? addSeconds(receivedAt, debounceSeconds)
353
+ : receivedAt,
354
+ });
355
+ return { run, reason: "dedupe_window" };
356
+ }
357
+ }
@@ -0,0 +1,97 @@
1
+ import type { CronSpecRecord, SqliteCronStore } from "./sqlite-cron-store";
2
+
3
+ /**
4
+ * Queue materialization rules shared between the reconciler, watcher, and
5
+ * periodic runner tick. Execution stays trigger-agnostic once a row is
6
+ * queued; this module is the only place that decides when to create a row.
7
+ */
8
+
9
+ export interface CronMaterializerOptions {
10
+ store: SqliteCronStore;
11
+ now?: () => number;
12
+ }
13
+
14
+ export interface MaterializeSummary {
15
+ oneOffQueued: number;
16
+ scheduleQueued: number;
17
+ }
18
+
19
+ export class CronMaterializer {
20
+ private readonly store: SqliteCronStore;
21
+ private readonly nowFn: () => number;
22
+
23
+ constructor(options: CronMaterializerOptions) {
24
+ this.store = options.store;
25
+ this.nowFn = options.now ?? (() => Date.now());
26
+ }
27
+
28
+ /**
29
+ * Run materialization for every valid/enabled spec. Typically called at
30
+ * startup (after reconciliation) and on each runner tick.
31
+ */
32
+ public materializeAll(): MaterializeSummary {
33
+ const summary: MaterializeSummary = {
34
+ oneOffQueued: 0,
35
+ scheduleQueued: 0,
36
+ };
37
+
38
+ const oneOffs = this.store.listSpecs({
39
+ triggerKind: "one_off",
40
+ enabled: true,
41
+ parseStatus: "valid",
42
+ });
43
+ for (const spec of oneOffs) {
44
+ if (this.materializeOneOff(spec)) summary.oneOffQueued += 1;
45
+ }
46
+
47
+ const schedules = this.store.listSpecs({
48
+ triggerKind: "schedule",
49
+ enabled: true,
50
+ parseStatus: "valid",
51
+ });
52
+ for (const spec of schedules) {
53
+ try {
54
+ if (this.materializeSchedule(spec)) summary.scheduleQueued += 1;
55
+ } catch {
56
+ // Keep one stale/invalid persisted schedule from blocking other specs.
57
+ }
58
+ }
59
+
60
+ return summary;
61
+ }
62
+
63
+ /**
64
+ * Ensure a single one-off spec has exactly one run record for its current
65
+ * revision unless an explicit rerun path creates a different trigger kind.
66
+ * Returns true if a new queued run was created.
67
+ */
68
+ public materializeOneOff(spec: CronSpecRecord): boolean {
69
+ if (spec.triggerKind !== "one_off") return false;
70
+ if (!spec.enabled || spec.removed) return false;
71
+ if (this.store.hasOneOffRunForRevision(spec.specId, spec.revision)) {
72
+ return false;
73
+ }
74
+ this.store.enqueueRun({
75
+ specId: spec.specId,
76
+ specRevision: spec.revision,
77
+ triggerKind: "one_off",
78
+ scheduledFor: new Date(this.nowFn()).toISOString(),
79
+ });
80
+ return true;
81
+ }
82
+
83
+ /**
84
+ * Materialize schedule runs. Implements the "one overdue catch-up on
85
+ * startup, then advance" policy described in PLAN.md.
86
+ */
87
+ public materializeSchedule(spec: CronSpecRecord): boolean {
88
+ if (spec.triggerKind !== "schedule") return false;
89
+ if (!spec.enabled || spec.removed) return false;
90
+ if (!spec.scheduleExpr) return false;
91
+
92
+ return this.store.materializeDueScheduleRun({
93
+ specId: spec.specId,
94
+ nowMs: this.nowFn(),
95
+ }).queued;
96
+ }
97
+ }