@cydm/happy-elves 0.1.0-beta.31 → 0.1.0-beta.310

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 (342) hide show
  1. package/apps/cli/dist/commands/app.js +10 -0
  2. package/apps/cli/dist/commands/daemon.js +92 -4
  3. package/apps/cli/dist/commands/gateway.d.ts +2 -0
  4. package/apps/cli/dist/commands/gateway.js +429 -0
  5. package/apps/cli/dist/commands/lib/args.js +49 -0
  6. package/apps/cli/dist/commands/lib/bootstrap-daemon.d.ts +2 -2
  7. package/apps/cli/dist/commands/lib/bootstrap-daemon.js +2 -2
  8. package/apps/cli/dist/commands/lib/doctor.d.ts +11 -0
  9. package/apps/cli/dist/commands/lib/doctor.js +276 -11
  10. package/apps/cli/dist/commands/lib/gateway-store.d.ts +38 -0
  11. package/apps/cli/dist/commands/lib/gateway-store.js +33 -0
  12. package/apps/cli/dist/commands/lib/index.d.ts +4 -2
  13. package/apps/cli/dist/commands/lib/index.js +2 -0
  14. package/apps/cli/dist/commands/lib/json.d.ts +2 -2
  15. package/apps/cli/dist/commands/lib/json.js +5 -2
  16. package/apps/cli/dist/commands/lib/local-daemon.d.ts +1 -0
  17. package/apps/cli/dist/commands/lib/local-daemon.js +14 -0
  18. package/apps/cli/dist/commands/lib/paths.d.ts +2 -0
  19. package/apps/cli/dist/commands/lib/paths.js +2 -0
  20. package/apps/cli/dist/commands/lib/relay-db-audit.d.ts +37 -0
  21. package/apps/cli/dist/commands/lib/relay-db-audit.js +300 -0
  22. package/apps/cli/dist/commands/lib/relay-http.d.ts +1 -1
  23. package/apps/cli/dist/commands/lib/scope.d.ts +1 -1
  24. package/apps/cli/dist/commands/lib/session-output.d.ts +15 -1
  25. package/apps/cli/dist/commands/lib/session-output.js +214 -6
  26. package/apps/cli/dist/commands/lib/session-view.d.ts +2 -2
  27. package/apps/cli/dist/commands/lib/status.js +5 -1
  28. package/apps/cli/dist/commands/lib/types.d.ts +4 -2
  29. package/apps/cli/dist/commands/lib/usage.js +123 -10
  30. package/apps/cli/dist/commands/lib/workspace.d.ts +2 -2
  31. package/apps/cli/dist/commands/lib/workspace.js +63 -10
  32. package/apps/cli/dist/commands/machine.js +50 -9
  33. package/apps/cli/dist/commands/memory.d.ts +2 -0
  34. package/apps/cli/dist/commands/memory.js +179 -0
  35. package/apps/cli/dist/commands/relay.js +29 -2
  36. package/apps/cli/dist/commands/release.d.ts +2 -0
  37. package/apps/cli/dist/commands/release.js +197 -0
  38. package/apps/cli/dist/commands/remote.js +10 -2
  39. package/apps/cli/dist/commands/schedule.d.ts +2 -0
  40. package/apps/cli/dist/commands/schedule.js +273 -0
  41. package/apps/cli/dist/commands/session.js +517 -5
  42. package/apps/cli/dist/commands/turn.js +225 -9
  43. package/apps/cli/dist/commands/workspace.d.ts +2 -0
  44. package/apps/cli/dist/commands/workspace.js +68 -0
  45. package/apps/cli/package.json +6 -0
  46. package/apps/daemon/dist/gateway/adapters.d.ts +38 -0
  47. package/apps/daemon/dist/gateway/adapters.js +2 -0
  48. package/apps/daemon/dist/gateway/feishu.d.ts +65 -0
  49. package/apps/daemon/dist/gateway/feishu.js +493 -0
  50. package/apps/daemon/dist/gateway/format.d.ts +2 -0
  51. package/apps/daemon/dist/gateway/format.js +19 -0
  52. package/apps/daemon/dist/gateway/handler.d.ts +7 -0
  53. package/apps/daemon/dist/gateway/handler.js +151 -0
  54. package/apps/daemon/dist/gateway/runtime.d.ts +33 -0
  55. package/apps/daemon/dist/gateway/runtime.js +850 -0
  56. package/apps/daemon/dist/gateway/store.d.ts +92 -0
  57. package/apps/daemon/dist/gateway/store.js +268 -0
  58. package/apps/daemon/dist/memory/handler.d.ts +7 -0
  59. package/apps/daemon/dist/memory/handler.js +105 -0
  60. package/apps/daemon/dist/memory/manager.d.ts +44 -0
  61. package/apps/daemon/dist/memory/manager.js +359 -0
  62. package/apps/daemon/dist/paths.d.ts +3 -0
  63. package/apps/daemon/dist/paths.js +3 -0
  64. package/apps/daemon/dist/relay/admission.d.ts +30 -0
  65. package/apps/daemon/dist/relay/admission.js +31 -0
  66. package/apps/daemon/dist/relay/connection.js +37 -1
  67. package/apps/daemon/dist/relay/devtools.d.ts +1 -1
  68. package/apps/daemon/dist/relay/register.js +2 -0
  69. package/apps/daemon/dist/relay/send.d.ts +2 -2
  70. package/apps/daemon/dist/relay/send.js +2 -0
  71. package/apps/daemon/dist/relay-http.d.ts +1 -1
  72. package/apps/daemon/dist/runtime/external-provider.d.ts +1 -1
  73. package/apps/daemon/dist/runtime/external-provider.js +187 -17
  74. package/apps/daemon/dist/runtime.d.ts +1 -2
  75. package/apps/daemon/dist/runtime.js +0 -3
  76. package/apps/daemon/dist/schedule/handler.d.ts +9 -0
  77. package/apps/daemon/dist/schedule/handler.js +148 -0
  78. package/apps/daemon/dist/schedule/runner.d.ts +21 -0
  79. package/apps/daemon/dist/schedule/runner.js +547 -0
  80. package/apps/daemon/dist/schedule/store.d.ts +9 -0
  81. package/apps/daemon/dist/schedule/store.js +143 -0
  82. package/apps/daemon/dist/session/create-session.d.ts +1 -1
  83. package/apps/daemon/dist/session/directory.d.ts +1 -1
  84. package/apps/daemon/dist/session/events.d.ts +15 -2
  85. package/apps/daemon/dist/session/events.js +76 -24
  86. package/apps/daemon/dist/session/file-preview.d.ts +1 -1
  87. package/apps/daemon/dist/session/lifecycle.d.ts +26 -3
  88. package/apps/daemon/dist/session/lifecycle.js +161 -22
  89. package/apps/daemon/dist/session/metadata.d.ts +2 -2
  90. package/apps/daemon/dist/session/metadata.js +42 -1
  91. package/apps/daemon/dist/session/primitives.d.ts +1 -1
  92. package/apps/daemon/dist/session/primitives.js +37 -6
  93. package/apps/daemon/dist/session/prompt.d.ts +28 -1
  94. package/apps/daemon/dist/session/prompt.js +340 -5
  95. package/apps/daemon/dist/session/reconcile.d.ts +3 -0
  96. package/apps/daemon/dist/session/reconcile.js +235 -0
  97. package/apps/daemon/dist/session/runtime-handle.d.ts +1 -1
  98. package/apps/daemon/dist/start.js +5 -1
  99. package/apps/daemon/dist/state.d.ts +2 -2
  100. package/apps/daemon/dist/turn-coordinator.d.ts +1 -0
  101. package/apps/daemon/dist/turn-coordinator.js +4 -0
  102. package/apps/daemon/dist/types.d.ts +16 -1
  103. package/apps/daemon/package.json +3 -25
  104. package/apps/relay/dist/connections.d.ts +2 -0
  105. package/apps/relay/dist/controller-handlers.d.ts +42 -2
  106. package/apps/relay/dist/controller-handlers.js +349 -37
  107. package/apps/relay/dist/db.js +296 -2
  108. package/apps/relay/dist/errors.d.ts +2 -1
  109. package/apps/relay/dist/errors.js +3 -1
  110. package/apps/relay/dist/http-routes.js +659 -33
  111. package/apps/relay/dist/http-schemas.d.ts +156 -0
  112. package/apps/relay/dist/http-schemas.js +85 -0
  113. package/apps/relay/dist/index.js +31 -1
  114. package/apps/relay/dist/machine-handlers.d.ts +15 -7
  115. package/apps/relay/dist/machine-handlers.js +567 -27
  116. package/apps/relay/dist/projections.d.ts +1 -1
  117. package/apps/relay/dist/projections.js +13 -0
  118. package/apps/relay/dist/relay-context.d.ts +41 -3
  119. package/apps/relay/dist/relay-context.js +244 -19
  120. package/apps/relay/dist/repositories.d.ts +2 -2
  121. package/apps/relay/dist/repositories.js +28 -1
  122. package/apps/relay/dist/runtime-bindings.d.ts +25 -0
  123. package/apps/relay/dist/runtime-bindings.js +49 -0
  124. package/apps/relay/dist/scope.d.ts +1 -1
  125. package/apps/relay/dist/types.d.ts +71 -1
  126. package/apps/relay/dist/websocket.js +2 -0
  127. package/package.json +5 -11
  128. package/packages/agent-sdk/dist/index.d.ts +80 -0
  129. package/packages/agent-sdk/dist/index.js +16 -0
  130. package/packages/client/dist/account.d.ts +35 -2
  131. package/packages/client/dist/account.js +98 -1
  132. package/packages/client/dist/client.d.ts +59 -6
  133. package/packages/client/dist/client.js +312 -58
  134. package/packages/client/dist/index.d.ts +1 -1
  135. package/packages/client/dist/parsers.d.ts +28 -2
  136. package/packages/client/dist/parsers.js +167 -0
  137. package/packages/client/dist/transport.d.ts +21 -1
  138. package/packages/client/dist/transport.js +69 -6
  139. package/packages/client/dist/types.d.ts +177 -1
  140. package/packages/client/dist/validation.d.ts +1 -1
  141. package/packages/runtime/dist/index.d.ts +66 -0
  142. package/packages/runtime-acpx/dist/index.d.ts +1 -1
  143. package/packages/runtime-acpx/dist/index.js +8 -0
  144. package/packages/runtime-cli/dist/claude-history.d.ts +1 -2
  145. package/packages/runtime-cli/dist/claude-history.js +0 -3
  146. package/packages/runtime-cli/dist/claude-session-store.d.ts +0 -1
  147. package/packages/runtime-cli/dist/claude-session-store.js +1 -1
  148. package/packages/runtime-cli/dist/claude-turn.d.ts +2 -1
  149. package/packages/runtime-cli/dist/claude-turn.js +29 -9
  150. package/packages/runtime-cli/dist/codex-app-server.d.ts +8 -3
  151. package/packages/runtime-cli/dist/codex-app-server.js +122 -25
  152. package/packages/runtime-cli/dist/codex-history.d.ts +1 -2
  153. package/packages/runtime-cli/dist/codex-history.js +11 -5
  154. package/packages/runtime-cli/dist/codex-protocol.d.ts +2 -2
  155. package/packages/runtime-cli/dist/codex-protocol.js +4 -4
  156. package/packages/runtime-cli/dist/history-merge.d.ts +1 -1
  157. package/packages/runtime-cli/dist/index.d.ts +1 -1
  158. package/packages/runtime-cli/dist/index.js +108 -2
  159. package/packages/runtime-cli/dist/permissions.d.ts +1 -1
  160. package/packages/runtime-cli/dist/session-store.d.ts +2 -1
  161. package/packages/runtime-cli/dist/session-store.js +9 -8
  162. package/packages/shared/dist/index.d.ts +2 -0
  163. package/packages/shared/dist/index.js +2 -0
  164. package/packages/shared/dist/protocol-schemas.d.ts +1077 -0
  165. package/packages/shared/dist/protocol-schemas.js +273 -0
  166. package/packages/shared/dist/protocol-types.d.ts +371 -3
  167. package/packages/shared/dist/protocol.d.ts +181 -2
  168. package/packages/shared/dist/protocol.js +197 -1
  169. package/packages/shared/dist/session-tags.d.ts +12 -0
  170. package/packages/shared/dist/session-tags.js +50 -0
  171. package/apps/cli/dist/commands/account.js.map +0 -1
  172. package/apps/cli/dist/commands/app.js.map +0 -1
  173. package/apps/cli/dist/commands/collect.js.map +0 -1
  174. package/apps/cli/dist/commands/command.js.map +0 -1
  175. package/apps/cli/dist/commands/config.js.map +0 -1
  176. package/apps/cli/dist/commands/daemon.js.map +0 -1
  177. package/apps/cli/dist/commands/lib/args.js.map +0 -1
  178. package/apps/cli/dist/commands/lib/audit.js.map +0 -1
  179. package/apps/cli/dist/commands/lib/bootstrap-config.js.map +0 -1
  180. package/apps/cli/dist/commands/lib/bootstrap-daemon.js.map +0 -1
  181. package/apps/cli/dist/commands/lib/bootstrap-output.js.map +0 -1
  182. package/apps/cli/dist/commands/lib/bootstrap.js.map +0 -1
  183. package/apps/cli/dist/commands/lib/config.js.map +0 -1
  184. package/apps/cli/dist/commands/lib/doctor.js.map +0 -1
  185. package/apps/cli/dist/commands/lib/exit.js.map +0 -1
  186. package/apps/cli/dist/commands/lib/index.js.map +0 -1
  187. package/apps/cli/dist/commands/lib/json.js.map +0 -1
  188. package/apps/cli/dist/commands/lib/local-daemon.js.map +0 -1
  189. package/apps/cli/dist/commands/lib/loop-store.js.map +0 -1
  190. package/apps/cli/dist/commands/lib/paths.js.map +0 -1
  191. package/apps/cli/dist/commands/lib/relay-http.js.map +0 -1
  192. package/apps/cli/dist/commands/lib/scope.js.map +0 -1
  193. package/apps/cli/dist/commands/lib/session-output.js.map +0 -1
  194. package/apps/cli/dist/commands/lib/session-view.js.map +0 -1
  195. package/apps/cli/dist/commands/lib/status.js.map +0 -1
  196. package/apps/cli/dist/commands/lib/types.js.map +0 -1
  197. package/apps/cli/dist/commands/lib/usage.js.map +0 -1
  198. package/apps/cli/dist/commands/lib/workspace.js.map +0 -1
  199. package/apps/cli/dist/commands/loop.js.map +0 -1
  200. package/apps/cli/dist/commands/machine.js.map +0 -1
  201. package/apps/cli/dist/commands/relay.js.map +0 -1
  202. package/apps/cli/dist/commands/remote.js.map +0 -1
  203. package/apps/cli/dist/commands/session.js.map +0 -1
  204. package/apps/cli/dist/commands/token.js.map +0 -1
  205. package/apps/cli/dist/commands/turn.js.map +0 -1
  206. package/apps/cli/dist/errors.js.map +0 -1
  207. package/apps/cli/dist/index.js.map +0 -1
  208. package/apps/daemon/dist/app.js.map +0 -1
  209. package/apps/daemon/dist/args.js.map +0 -1
  210. package/apps/daemon/dist/audit.js.map +0 -1
  211. package/apps/daemon/dist/cli.js.map +0 -1
  212. package/apps/daemon/dist/config.js.map +0 -1
  213. package/apps/daemon/dist/errors.js.map +0 -1
  214. package/apps/daemon/dist/loop/runner.js.map +0 -1
  215. package/apps/daemon/dist/loop/store.js.map +0 -1
  216. package/apps/daemon/dist/pair.js.map +0 -1
  217. package/apps/daemon/dist/paths.js.map +0 -1
  218. package/apps/daemon/dist/process.js.map +0 -1
  219. package/apps/daemon/dist/relay/connection.js.map +0 -1
  220. package/apps/daemon/dist/relay/devtools.js.map +0 -1
  221. package/apps/daemon/dist/relay/register.js.map +0 -1
  222. package/apps/daemon/dist/relay/send.js.map +0 -1
  223. package/apps/daemon/dist/relay-http.js.map +0 -1
  224. package/apps/daemon/dist/runtime/external-provider.js.map +0 -1
  225. package/apps/daemon/dist/runtime.js.map +0 -1
  226. package/apps/daemon/dist/session/create-session.js.map +0 -1
  227. package/apps/daemon/dist/session/directory.js.map +0 -1
  228. package/apps/daemon/dist/session/events.js.map +0 -1
  229. package/apps/daemon/dist/session/file-preview.js.map +0 -1
  230. package/apps/daemon/dist/session/lifecycle.js.map +0 -1
  231. package/apps/daemon/dist/session/metadata.js.map +0 -1
  232. package/apps/daemon/dist/session/primitives.js.map +0 -1
  233. package/apps/daemon/dist/session/prompt.js.map +0 -1
  234. package/apps/daemon/dist/session/runtime-handle.js.map +0 -1
  235. package/apps/daemon/dist/start.js.map +0 -1
  236. package/apps/daemon/dist/state.js.map +0 -1
  237. package/apps/daemon/dist/turn-coordinator.js.map +0 -1
  238. package/apps/daemon/dist/types.js.map +0 -1
  239. package/apps/daemon/dist/utils.js.map +0 -1
  240. package/apps/relay/dist/auth.js.map +0 -1
  241. package/apps/relay/dist/connections.js.map +0 -1
  242. package/apps/relay/dist/controller-handlers.js.map +0 -1
  243. package/apps/relay/dist/db.js.map +0 -1
  244. package/apps/relay/dist/errors.js.map +0 -1
  245. package/apps/relay/dist/http-routes.js.map +0 -1
  246. package/apps/relay/dist/http-schemas.js.map +0 -1
  247. package/apps/relay/dist/index.js.map +0 -1
  248. package/apps/relay/dist/machine-handlers.js.map +0 -1
  249. package/apps/relay/dist/projections.js.map +0 -1
  250. package/apps/relay/dist/relay-context.js.map +0 -1
  251. package/apps/relay/dist/repositories.js.map +0 -1
  252. package/apps/relay/dist/retention.js.map +0 -1
  253. package/apps/relay/dist/scope.js.map +0 -1
  254. package/apps/relay/dist/security.js.map +0 -1
  255. package/apps/relay/dist/types.js.map +0 -1
  256. package/apps/relay/dist/websocket.js.map +0 -1
  257. package/apps/relay/package.json +0 -29
  258. package/packages/agent-sdk/dist/index.d.ts.map +0 -1
  259. package/packages/agent-sdk/dist/index.js.map +0 -1
  260. package/packages/agent-sdk/package.json +0 -20
  261. package/packages/client/dist/account.d.ts.map +0 -1
  262. package/packages/client/dist/account.js.map +0 -1
  263. package/packages/client/dist/client.d.ts.map +0 -1
  264. package/packages/client/dist/client.js.map +0 -1
  265. package/packages/client/dist/errors.d.ts.map +0 -1
  266. package/packages/client/dist/errors.js.map +0 -1
  267. package/packages/client/dist/http.d.ts.map +0 -1
  268. package/packages/client/dist/http.js.map +0 -1
  269. package/packages/client/dist/index.d.ts.map +0 -1
  270. package/packages/client/dist/index.js.map +0 -1
  271. package/packages/client/dist/parsers.d.ts.map +0 -1
  272. package/packages/client/dist/parsers.js.map +0 -1
  273. package/packages/client/dist/transport.d.ts.map +0 -1
  274. package/packages/client/dist/transport.js.map +0 -1
  275. package/packages/client/dist/types.d.ts.map +0 -1
  276. package/packages/client/dist/types.js.map +0 -1
  277. package/packages/client/dist/validation.d.ts.map +0 -1
  278. package/packages/client/dist/validation.js.map +0 -1
  279. package/packages/client/package.json +0 -22
  280. package/packages/pie-provider/dist/index.d.ts.map +0 -1
  281. package/packages/pie-provider/dist/index.js.map +0 -1
  282. package/packages/pie-provider/package.json +0 -26
  283. package/packages/runtime/dist/index.d.ts.map +0 -1
  284. package/packages/runtime/dist/index.js.map +0 -1
  285. package/packages/runtime/package.json +0 -19
  286. package/packages/runtime-acpx/dist/index.d.ts.map +0 -1
  287. package/packages/runtime-acpx/dist/index.js.map +0 -1
  288. package/packages/runtime-acpx/package.json +0 -23
  289. package/packages/runtime-cli/dist/async-queue.d.ts.map +0 -1
  290. package/packages/runtime-cli/dist/async-queue.js.map +0 -1
  291. package/packages/runtime-cli/dist/claude-history.d.ts.map +0 -1
  292. package/packages/runtime-cli/dist/claude-history.js.map +0 -1
  293. package/packages/runtime-cli/dist/claude-json.d.ts.map +0 -1
  294. package/packages/runtime-cli/dist/claude-json.js.map +0 -1
  295. package/packages/runtime-cli/dist/claude-rename.d.ts.map +0 -1
  296. package/packages/runtime-cli/dist/claude-rename.js.map +0 -1
  297. package/packages/runtime-cli/dist/claude-session-store.d.ts.map +0 -1
  298. package/packages/runtime-cli/dist/claude-session-store.js.map +0 -1
  299. package/packages/runtime-cli/dist/claude-turn.d.ts.map +0 -1
  300. package/packages/runtime-cli/dist/claude-turn.js.map +0 -1
  301. package/packages/runtime-cli/dist/codex-app-server.d.ts.map +0 -1
  302. package/packages/runtime-cli/dist/codex-app-server.js.map +0 -1
  303. package/packages/runtime-cli/dist/codex-approvals.d.ts.map +0 -1
  304. package/packages/runtime-cli/dist/codex-approvals.js.map +0 -1
  305. package/packages/runtime-cli/dist/codex-history.d.ts.map +0 -1
  306. package/packages/runtime-cli/dist/codex-history.js.map +0 -1
  307. package/packages/runtime-cli/dist/codex-json-rpc.d.ts.map +0 -1
  308. package/packages/runtime-cli/dist/codex-json-rpc.js.map +0 -1
  309. package/packages/runtime-cli/dist/codex-lifecycle.d.ts.map +0 -1
  310. package/packages/runtime-cli/dist/codex-lifecycle.js.map +0 -1
  311. package/packages/runtime-cli/dist/codex-protocol.d.ts.map +0 -1
  312. package/packages/runtime-cli/dist/codex-protocol.js.map +0 -1
  313. package/packages/runtime-cli/dist/command-resolver.d.ts.map +0 -1
  314. package/packages/runtime-cli/dist/command-resolver.js.map +0 -1
  315. package/packages/runtime-cli/dist/history-merge.d.ts.map +0 -1
  316. package/packages/runtime-cli/dist/history-merge.js.map +0 -1
  317. package/packages/runtime-cli/dist/index.d.ts.map +0 -1
  318. package/packages/runtime-cli/dist/index.js.map +0 -1
  319. package/packages/runtime-cli/dist/permissions.d.ts.map +0 -1
  320. package/packages/runtime-cli/dist/permissions.js.map +0 -1
  321. package/packages/runtime-cli/dist/session-store.d.ts.map +0 -1
  322. package/packages/runtime-cli/dist/session-store.js.map +0 -1
  323. package/packages/runtime-cli/package.json +0 -22
  324. package/packages/shared/dist/args.d.ts.map +0 -1
  325. package/packages/shared/dist/args.js.map +0 -1
  326. package/packages/shared/dist/crypto.d.ts.map +0 -1
  327. package/packages/shared/dist/crypto.js.map +0 -1
  328. package/packages/shared/dist/ids.d.ts.map +0 -1
  329. package/packages/shared/dist/ids.js.map +0 -1
  330. package/packages/shared/dist/index.d.ts.map +0 -1
  331. package/packages/shared/dist/index.js.map +0 -1
  332. package/packages/shared/dist/protocol-schemas.d.ts.map +0 -1
  333. package/packages/shared/dist/protocol-schemas.js.map +0 -1
  334. package/packages/shared/dist/protocol-types.d.ts.map +0 -1
  335. package/packages/shared/dist/protocol-types.js.map +0 -1
  336. package/packages/shared/dist/protocol.d.ts.map +0 -1
  337. package/packages/shared/dist/protocol.js.map +0 -1
  338. package/packages/shared/dist/session-name.d.ts.map +0 -1
  339. package/packages/shared/dist/session-name.js.map +0 -1
  340. package/packages/shared/dist/session-state.d.ts.map +0 -1
  341. package/packages/shared/dist/session-state.js.map +0 -1
  342. package/packages/shared/package.json +0 -24
@@ -0,0 +1,547 @@
1
+ import { createHash } from "node:crypto";
2
+ import { encryptJson, } from "../../../../packages/shared/dist/index.js";
3
+ import { admitMachineCreateSession, admitMachinePrompt } from "../relay/admission.js";
4
+ import { sessions, sessionTurns } from "../state.js";
5
+ import { readScheduleStore, updateScheduleStore } from "./store.js";
6
+ const activeScheduleRuns = new Set();
7
+ const defaultStopOn = ["blocked", "failed", "permission"];
8
+ export async function tickSchedules(config, onlineSinceMs) {
9
+ const store = await readScheduleStore();
10
+ const nowMs = Date.now();
11
+ for (const schedule of store.schedules) {
12
+ if (schedule.status !== "active")
13
+ continue;
14
+ const dueAt = schedule.nextRunAt ?? nextRunAtForSchedule(schedule, nowMs - 1);
15
+ if (!dueAt)
16
+ continue;
17
+ const occurrenceId = occurrenceIdFor(schedule, dueAt);
18
+ if (schedule.runs.some((run) => run.occurrenceId === occurrenceId))
19
+ continue;
20
+ const dueMs = Date.parse(dueAt);
21
+ if (!Number.isFinite(dueMs) || dueMs > nowMs)
22
+ continue;
23
+ if (isScheduleOccurrenceActive(schedule.id, occurrenceId))
24
+ continue;
25
+ if (dueMs < onlineSinceMs) {
26
+ const run = scheduleRun(schedule, occurrenceId, dueAt, "missed", "daemon was offline at due time");
27
+ await recordScheduleRun(schedule.id, run);
28
+ continue;
29
+ }
30
+ void runScheduleOccurrence(config, schedule, occurrenceId, dueAt, "due").catch(async (error) => {
31
+ const run = scheduleRun(schedule, occurrenceId, dueAt, "failed", error instanceof Error ? error.message : String(error));
32
+ await recordScheduleRun(schedule.id, run);
33
+ });
34
+ }
35
+ }
36
+ export async function runMissedScheduleOccurrence(config, schedule, occurrenceId) {
37
+ const existing = schedule.runs.find((run) => run.occurrenceId === occurrenceId);
38
+ if (!existing || existing.status !== "missed") {
39
+ const admitted = schedule.runs.find((run) => run.occurrenceId === occurrenceId && run.status === "admitted");
40
+ if (admitted)
41
+ return admitted;
42
+ throw new Error("Missed occurrence not found");
43
+ }
44
+ return await runScheduleOccurrence(config, schedule, occurrenceId, existing.dueAt, "manual");
45
+ }
46
+ export async function runScheduleNow(config, schedule) {
47
+ if (schedule.status === "deleted")
48
+ throw new Error("Schedule is deleted");
49
+ const dueAt = new Date().toISOString();
50
+ const occurrenceId = stableScheduleId("occ_manual", schedule.id, dueAt);
51
+ return await runScheduleOccurrence(config, schedule, occurrenceId, dueAt, "manual");
52
+ }
53
+ export async function runDueSchedulesNow(config) {
54
+ const store = await readScheduleStore();
55
+ const nowMs = Date.now();
56
+ const results = [];
57
+ for (const schedule of store.schedules) {
58
+ if (schedule.status !== "active")
59
+ continue;
60
+ const dueAt = schedule.nextRunAt ?? nextRunAtForSchedule(schedule, nowMs - 1);
61
+ if (!dueAt)
62
+ continue;
63
+ const occurrenceId = occurrenceIdFor(schedule, dueAt);
64
+ if (schedule.runs.some((run) => run.occurrenceId === occurrenceId))
65
+ continue;
66
+ const dueMs = Date.parse(dueAt);
67
+ if (!Number.isFinite(dueMs) || dueMs > nowMs)
68
+ continue;
69
+ if (isScheduleOccurrenceActive(schedule.id, occurrenceId))
70
+ continue;
71
+ const run = await runScheduleOccurrence(config, schedule, occurrenceId, dueAt, "manual");
72
+ results.push({ scheduleId: schedule.id, run });
73
+ }
74
+ return results;
75
+ }
76
+ export function occurrenceIdFor(schedule, dueAt) {
77
+ const occurrenceDueAt = dueAt ?? schedule.nextRunAt ?? schedule.dueAt;
78
+ if (!occurrenceDueAt)
79
+ throw new Error("Schedule has no due occurrence");
80
+ return stableScheduleId("occ", schedule.id, occurrenceDueAt);
81
+ }
82
+ function stableScheduleId(prefix, ...parts) {
83
+ const hash = createHash("sha256").update(parts.join("\0")).digest("base64url").slice(0, 32);
84
+ return `${prefix}_${hash}`;
85
+ }
86
+ function activeScheduleRunKey(scheduleId, occurrenceId) {
87
+ return `${scheduleId}:${occurrenceId}`;
88
+ }
89
+ function isScheduleOccurrenceActive(scheduleId, occurrenceId) {
90
+ return activeScheduleRuns.has(activeScheduleRunKey(scheduleId, occurrenceId));
91
+ }
92
+ export async function __testWithActiveScheduleOccurrence(scheduleId, occurrenceId, action) {
93
+ const key = activeScheduleRunKey(scheduleId, occurrenceId);
94
+ activeScheduleRuns.add(key);
95
+ try {
96
+ return await action();
97
+ }
98
+ finally {
99
+ activeScheduleRuns.delete(key);
100
+ }
101
+ }
102
+ export function nextRunAtForSchedule(schedule, afterMs = Date.now()) {
103
+ const spec = normalizedSpec(schedule.schedule, schedule.dueAt);
104
+ if (spec.type === "manual")
105
+ return undefined;
106
+ if (spec.type === "oneshot") {
107
+ if (schedule.runs.some(runConsumesOccurrence))
108
+ return undefined;
109
+ return new Date(spec.runAt).toISOString();
110
+ }
111
+ if (spec.type === "interval") {
112
+ const lastDueMs = latestDueMs(schedule.runs) ?? afterMs;
113
+ return new Date(Math.max(afterMs, lastDueMs) + spec.everyMs).toISOString();
114
+ }
115
+ return nextCronRunAt(spec, afterMs);
116
+ }
117
+ export function nextRunPreviewForSchedule(schedule, count = 3, afterMs = Date.now()) {
118
+ const spec = normalizedSpec(schedule.schedule, schedule.dueAt);
119
+ if (spec.type === "manual")
120
+ return [];
121
+ const runs = [...schedule.runs];
122
+ const preview = [];
123
+ let cursor = afterMs;
124
+ for (let index = 0; index < count; index += 1) {
125
+ const next = nextRunAtForSchedule({ schedule: schedule.schedule, dueAt: schedule.dueAt, runs }, cursor);
126
+ if (!next)
127
+ break;
128
+ preview.push(next);
129
+ if (spec.type === "oneshot")
130
+ break;
131
+ runs.unshift({
132
+ occurrenceId: stableScheduleId("occ_preview", schedule.id, next),
133
+ dueAt: next,
134
+ requestId: stableScheduleId("sched_req_preview", schedule.id, next),
135
+ turnId: stableScheduleId("turn_sched_preview", schedule.id, next),
136
+ status: "scheduled",
137
+ });
138
+ cursor = Date.parse(next);
139
+ }
140
+ return preview;
141
+ }
142
+ export async function settleScheduleTurnTerminal(input) {
143
+ let settledRun;
144
+ const finishedAt = input.finishedAt ?? new Date().toISOString();
145
+ await updateScheduleStore((store) => {
146
+ let changed = false;
147
+ const schedules = store.schedules.map((schedule) => {
148
+ const existing = schedule.runs.find((run) => run.requestId === input.requestId ||
149
+ run.turnId === input.turnId);
150
+ if (!existing)
151
+ return schedule;
152
+ if (existing.status === "completed" || existing.status === "failed") {
153
+ settledRun = existing;
154
+ return schedule;
155
+ }
156
+ const status = input.status === "completed" ? "completed" : "failed";
157
+ const run = {
158
+ ...existing,
159
+ status,
160
+ finishedAt,
161
+ ...(input.outputPreview !== undefined ? { outputPreview: input.outputPreview } : {}),
162
+ ...(status === "failed" ? { error: input.error ?? input.status } : input.error ? { error: input.error } : {}),
163
+ };
164
+ const runs = [run, ...schedule.runs.filter((item) => item.occurrenceId !== run.occurrenceId)];
165
+ const spec = normalizedSpec(schedule.schedule, schedule.dueAt);
166
+ const oneshotCompleted = spec.type === "oneshot" && status === "completed";
167
+ const failedStop = status === "failed" && (schedule.stopOn ?? [...defaultStopOn]).includes("failed");
168
+ changed = true;
169
+ settledRun = run;
170
+ return {
171
+ ...schedule,
172
+ status: oneshotCompleted ? "completed" : failedStop ? "paused" : schedule.status,
173
+ nextRunAt: nextRunAtForSchedule({ ...schedule, runs }, Date.parse(run.dueAt)),
174
+ runCount: countScheduleRuns(runs),
175
+ lastRun: runs[0],
176
+ runs,
177
+ updatedAt: finishedAt,
178
+ };
179
+ });
180
+ return changed ? { ...store, schedules } : store;
181
+ });
182
+ return settledRun;
183
+ }
184
+ async function runScheduleOccurrence(config, schedule, occurrenceId, dueAt, reason) {
185
+ const key = activeScheduleRunKey(schedule.id, occurrenceId);
186
+ if (activeScheduleRuns.has(key)) {
187
+ throw new Error("Schedule occurrence is already running");
188
+ }
189
+ activeScheduleRuns.add(key);
190
+ try {
191
+ const executionSession = await resolveScheduleExecutionSession(config, schedule, occurrenceId);
192
+ const requestId = stableScheduleId("sched_req", schedule.id, occurrenceId);
193
+ const turnId = stableScheduleId("turn_sched", schedule.id, occurrenceId);
194
+ if (sessionTurns.activeTurnId(executionSession.sessionId)) {
195
+ const run = {
196
+ ...scheduleRun(schedule, occurrenceId, dueAt, "blocked", "target session already has a running turn"),
197
+ sessionId: executionSession.sessionId,
198
+ sourceSessionId: executionSession.sourceSessionId,
199
+ };
200
+ await recordScheduleRun(schedule.id, run);
201
+ return run;
202
+ }
203
+ let sent;
204
+ try {
205
+ sent = await admitMachinePrompt(config, {
206
+ requestId,
207
+ sessionId: executionSession.sessionId,
208
+ turnId,
209
+ encryptedPrompt: await encryptJson(config.accountSecret, `schedule:${schedule.id}:${occurrenceId}`, {
210
+ type: "user_prompt",
211
+ text: schedule.prompt,
212
+ }),
213
+ encryptedMemoryOptions: executionSession.memoryMode === "inherit"
214
+ ? undefined
215
+ : await encryptJson(config.accountSecret, `schedule:${schedule.id}:${occurrenceId}:memory`, {
216
+ mode: executionSession.memoryMode,
217
+ projectKey: scheduleMemoryProjectKey(config, schedule, executionSession.sourceSessionId ?? executionSession.sessionId),
218
+ topN: 3,
219
+ }),
220
+ permissionMode: permissionModeForSchedule(schedule),
221
+ });
222
+ }
223
+ catch (error) {
224
+ if (errorCode(error) === "SESSION_BUSY") {
225
+ const run = {
226
+ ...scheduleRun(schedule, occurrenceId, dueAt, "blocked", "relay rejected schedule run because the target session is busy"),
227
+ sessionId: executionSession.sessionId,
228
+ sourceSessionId: executionSession.sourceSessionId,
229
+ };
230
+ await recordScheduleRun(schedule.id, run);
231
+ return run;
232
+ }
233
+ throw error;
234
+ }
235
+ const run = {
236
+ occurrenceId,
237
+ dueAt,
238
+ requestId,
239
+ turnId: sent.turnId ?? turnId,
240
+ status: "admitted",
241
+ sessionId: sent.sessionId ?? executionSession.sessionId,
242
+ sourceSessionId: executionSession.sourceSessionId,
243
+ admittedAt: new Date().toISOString(),
244
+ reason,
245
+ };
246
+ await recordScheduleRun(schedule.id, run);
247
+ return run;
248
+ }
249
+ finally {
250
+ activeScheduleRuns.delete(key);
251
+ }
252
+ }
253
+ async function recordScheduleRun(scheduleId, run) {
254
+ await updateScheduleStore((store) => ({
255
+ ...store,
256
+ schedules: store.schedules.map((schedule) => {
257
+ if (schedule.id !== scheduleId)
258
+ return schedule;
259
+ const runs = [run, ...schedule.runs.filter((item) => item.occurrenceId !== run.occurrenceId)];
260
+ const nextRunAt = nextRunAtForSchedule({ ...schedule, runs }, Date.parse(run.dueAt));
261
+ const completed = normalizedSpec(schedule.schedule, schedule.dueAt).type === "oneshot" && run.status === "completed";
262
+ const blocked = run.status === "blocked" && (schedule.stopOn ?? [...defaultStopOn]).includes("blocked");
263
+ return {
264
+ ...schedule,
265
+ status: completed ? "completed" : blocked ? "paused" : schedule.status,
266
+ ...(run.sourceSessionId ? { sourceSessionId: run.sourceSessionId, sessionId: run.sourceSessionId } : {}),
267
+ ...(run.sourceSessionId && schedule.target?.type === "project"
268
+ ? { target: { ...schedule.target, sourceSessionId: run.sourceSessionId } }
269
+ : {}),
270
+ nextRunAt,
271
+ runCount: countScheduleRuns(runs),
272
+ lastRun: runs[0],
273
+ runs,
274
+ updatedAt: new Date().toISOString(),
275
+ };
276
+ }),
277
+ }));
278
+ }
279
+ function scheduleRun(schedule, occurrenceId, dueAt, status, reason) {
280
+ return {
281
+ occurrenceId,
282
+ dueAt,
283
+ requestId: stableScheduleId("sched_req", schedule.id, occurrenceId),
284
+ turnId: stableScheduleId("turn_sched", schedule.id, occurrenceId),
285
+ status,
286
+ reason,
287
+ sessionId: schedule.sessionId,
288
+ sourceSessionId: schedule.sourceSessionId,
289
+ finishedAt: new Date().toISOString(),
290
+ };
291
+ }
292
+ function runConsumesOccurrence(run) {
293
+ return run.status === "admitted" ||
294
+ run.status === "completed" ||
295
+ run.status === "failed" ||
296
+ run.status === "blocked" ||
297
+ run.status === "missed";
298
+ }
299
+ function countScheduleRuns(runs) {
300
+ return runs.filter((run) => run.status === "admitted" ||
301
+ run.status === "completed" ||
302
+ run.status === "failed" ||
303
+ run.status === "blocked").length;
304
+ }
305
+ async function resolveScheduleExecutionSession(config, schedule, occurrenceId) {
306
+ const source = await ensureSourceSession(config, schedule);
307
+ const memoryMode = schedule.memoryMode ?? "inherit";
308
+ if ((schedule.execution ?? "continue") !== "isolated")
309
+ return { sessionId: source.sessionId, sourceSessionId: source.sessionId, memoryMode };
310
+ const target = schedule.target;
311
+ if (target?.type === "project") {
312
+ const sessionId = stableScheduleId("ses_sched_run", schedule.id, occurrenceId);
313
+ await admitMachineCreateSession(config, {
314
+ requestId: stableScheduleId("sched_run_create_req", schedule.id, occurrenceId),
315
+ sessionId,
316
+ agent: target.agent,
317
+ cwd: target.cwd,
318
+ name: `${schedule.name ?? "Schedule"} run`,
319
+ encryptedMetadata: await encryptJson(config.accountSecret, `session:${sessionId}:metadata`, {
320
+ agent: target.agent,
321
+ cwd: target.cwd,
322
+ name: `${schedule.name ?? "Schedule"} run`,
323
+ sourceSessionId: source.sessionId,
324
+ scheduleId: schedule.id,
325
+ scheduleExecution: "isolated",
326
+ }),
327
+ });
328
+ return { sessionId, sourceSessionId: source.sessionId, memoryMode };
329
+ }
330
+ const sourceState = sessions.get(source.sessionId);
331
+ if (!sourceState)
332
+ throw new Error("isolated schedule with source session requires the source session to be loaded on this daemon");
333
+ const sessionId = stableScheduleId("ses_sched_run", schedule.id, occurrenceId);
334
+ await admitMachineCreateSession(config, {
335
+ requestId: stableScheduleId("sched_run_create_req", schedule.id, occurrenceId),
336
+ sessionId,
337
+ agent: sourceState.agent,
338
+ cwd: sourceState.cwd,
339
+ name: `${schedule.name ?? sourceState.name} run`,
340
+ encryptedMetadata: await encryptJson(config.accountSecret, `session:${sessionId}:metadata`, {
341
+ agent: sourceState.agent,
342
+ cwd: sourceState.cwd,
343
+ name: `${schedule.name ?? sourceState.name} run`,
344
+ sourceSessionId: source.sessionId,
345
+ scheduleId: schedule.id,
346
+ scheduleExecution: "isolated",
347
+ }),
348
+ });
349
+ return { sessionId, sourceSessionId: source.sessionId, memoryMode };
350
+ }
351
+ async function ensureSourceSession(config, schedule) {
352
+ const target = schedule.target;
353
+ if (target?.type === "sourceSession")
354
+ return { sessionId: target.sourceSessionId };
355
+ if (schedule.sourceSessionId)
356
+ return { sessionId: schedule.sourceSessionId };
357
+ if (schedule.sessionId)
358
+ return { sessionId: schedule.sessionId };
359
+ if (target?.type !== "project")
360
+ throw new Error("Schedule target session is not available");
361
+ const sourceSessionId = target.sourceSessionId ?? stableScheduleId("ses_sched", schedule.id);
362
+ await admitMachineCreateSession(config, {
363
+ requestId: stableScheduleId("sched_create_req", schedule.id),
364
+ sessionId: sourceSessionId,
365
+ agent: target.agent,
366
+ cwd: target.cwd,
367
+ name: schedule.name ? `Schedule: ${schedule.name}` : "Scheduled automation",
368
+ encryptedMetadata: await encryptJson(config.accountSecret, `session:${sourceSessionId}:metadata`, {
369
+ agent: target.agent,
370
+ cwd: target.cwd,
371
+ name: schedule.name ? `Schedule: ${schedule.name}` : "Scheduled automation",
372
+ scheduleId: schedule.id,
373
+ scheduleOwned: true,
374
+ }),
375
+ });
376
+ await updateScheduleStore((store) => ({
377
+ ...store,
378
+ schedules: store.schedules.map((item) => {
379
+ if (item.id !== schedule.id)
380
+ return item;
381
+ return {
382
+ ...item,
383
+ sessionId: sourceSessionId,
384
+ sourceSessionId,
385
+ target: { ...target, sourceSessionId },
386
+ updatedAt: new Date().toISOString(),
387
+ };
388
+ }),
389
+ }));
390
+ return { sessionId: sourceSessionId };
391
+ }
392
+ function normalizedSpec(spec, legacyDueAt) {
393
+ if (spec)
394
+ return spec;
395
+ return legacyDueAt ? { type: "oneshot", runAt: legacyDueAt } : { type: "manual" };
396
+ }
397
+ function latestDueMs(runs) {
398
+ let latest;
399
+ for (const run of runs) {
400
+ const dueMs = Date.parse(run.dueAt);
401
+ if (!Number.isFinite(dueMs))
402
+ continue;
403
+ latest = latest === undefined ? dueMs : Math.max(latest, dueMs);
404
+ }
405
+ return latest;
406
+ }
407
+ function scheduleMemoryProjectKey(config, schedule, sessionId) {
408
+ const target = schedule.target;
409
+ if (target?.type === "project")
410
+ return `${target.machineId ?? config.machineId}:${target.cwd}`;
411
+ return `${sessionId}:schedule`;
412
+ }
413
+ function permissionModeForSchedule(schedule) {
414
+ return (schedule.stopOn ?? [...defaultStopOn]).includes("permission") ? "approve-reads" : "approve-all";
415
+ }
416
+ function errorCode(error) {
417
+ return error && typeof error === "object" && "code" in error && typeof error.code === "string"
418
+ ? error.code
419
+ : undefined;
420
+ }
421
+ function nextCronRunAt(spec, afterMs) {
422
+ const fields = parseCron(spec.expr);
423
+ if (!fields)
424
+ throw new Error(`Unsupported cron expression: ${spec.expr}`);
425
+ const timeZoneFormatter = spec.timezone ? cronTimeZoneFormatter(spec.timezone) : undefined;
426
+ const date = new Date(afterMs);
427
+ if (timeZoneFormatter) {
428
+ date.setUTCSeconds(0, 0);
429
+ date.setUTCMinutes(date.getUTCMinutes() + 1);
430
+ }
431
+ else {
432
+ date.setSeconds(0, 0);
433
+ date.setMinutes(date.getMinutes() + 1);
434
+ }
435
+ for (let i = 0; i < 366 * 24 * 60; i += 1) {
436
+ const parts = cronDateParts(date, timeZoneFormatter);
437
+ if (fields.minutes.has(parts.minute) &&
438
+ fields.hours.has(parts.hour) &&
439
+ fields.days.has(parts.day) &&
440
+ fields.months.has(parts.month) &&
441
+ fields.dows.has(parts.dow)) {
442
+ return date.toISOString();
443
+ }
444
+ if (timeZoneFormatter)
445
+ date.setUTCMinutes(date.getUTCMinutes() + 1);
446
+ else
447
+ date.setMinutes(date.getMinutes() + 1);
448
+ }
449
+ return undefined;
450
+ }
451
+ function cronTimeZoneFormatter(timeZone) {
452
+ try {
453
+ return new Intl.DateTimeFormat("en-US", {
454
+ timeZone,
455
+ hour12: false,
456
+ year: "numeric",
457
+ month: "2-digit",
458
+ day: "2-digit",
459
+ hour: "2-digit",
460
+ minute: "2-digit",
461
+ weekday: "short",
462
+ });
463
+ }
464
+ catch {
465
+ throw new Error(`Invalid cron timezone: ${timeZone}`);
466
+ }
467
+ }
468
+ function cronDateParts(date, formatter) {
469
+ if (!formatter) {
470
+ return {
471
+ minute: date.getMinutes(),
472
+ hour: date.getHours(),
473
+ day: date.getDate(),
474
+ month: date.getMonth() + 1,
475
+ dow: date.getDay(),
476
+ };
477
+ }
478
+ const parts = Object.fromEntries(formatter.formatToParts(date).map((part) => [part.type, part.value]));
479
+ const year = Number(parts.year);
480
+ const month = Number(parts.month);
481
+ const day = Number(parts.day);
482
+ const hour = Number(parts.hour) % 24;
483
+ const minute = Number(parts.minute);
484
+ if (![year, month, day, hour, minute].every(Number.isFinite))
485
+ throw new Error("Cron timezone formatting failed");
486
+ return {
487
+ minute,
488
+ hour,
489
+ day,
490
+ month,
491
+ dow: new Date(Date.UTC(year, month - 1, day)).getUTCDay(),
492
+ };
493
+ }
494
+ function parseCron(expr) {
495
+ const parts = expr.trim().split(/\s+/);
496
+ if (parts.length !== 5)
497
+ return undefined;
498
+ const [minute, hour, day, month, dow] = parts;
499
+ const minutes = parseCronField(minute, 0, 59);
500
+ const hours = parseCronField(hour, 0, 23);
501
+ const days = parseCronField(day, 1, 31);
502
+ const months = parseCronField(month, 1, 12);
503
+ const dows = parseCronField(dow, 0, 7);
504
+ if (!minutes || !hours || !days || !months || !dows)
505
+ return undefined;
506
+ if (dows.has(7)) {
507
+ dows.add(0);
508
+ dows.delete(7);
509
+ }
510
+ return { minutes, hours, days, months, dows };
511
+ }
512
+ function parseCronField(field, min, max) {
513
+ const values = new Set();
514
+ for (const part of field.split(",")) {
515
+ if (part === "*") {
516
+ for (let value = min; value <= max; value += 1)
517
+ values.add(value);
518
+ continue;
519
+ }
520
+ const stepMatch = part.match(/^\*\/(\d+)$/);
521
+ if (stepMatch) {
522
+ const step = Number(stepMatch[1]);
523
+ if (!Number.isInteger(step) || step <= 0)
524
+ return undefined;
525
+ for (let value = min; value <= max; value += step)
526
+ values.add(value);
527
+ continue;
528
+ }
529
+ const rangeMatch = part.match(/^(\d+)-(\d+)(?:\/(\d+))?$/);
530
+ if (rangeMatch) {
531
+ const start = Number(rangeMatch[1]);
532
+ const end = Number(rangeMatch[2]);
533
+ const step = rangeMatch[3] ? Number(rangeMatch[3]) : 1;
534
+ if (!Number.isInteger(start) || !Number.isInteger(end) || !Number.isInteger(step) || step <= 0 || start < min || end > max || start > end)
535
+ return undefined;
536
+ for (let value = start; value <= end; value += step)
537
+ values.add(value);
538
+ continue;
539
+ }
540
+ const value = Number(part);
541
+ if (!Number.isInteger(value) || value < min || value > max)
542
+ return undefined;
543
+ values.add(value);
544
+ }
545
+ return values;
546
+ }
547
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1,9 @@
1
+ import type { ScheduleRecord } from "../../../../packages/shared/dist/index.js";
2
+ export type ScheduleStore = {
3
+ version: 1;
4
+ schedules: ScheduleRecord[];
5
+ };
6
+ export declare function readScheduleStore(): Promise<ScheduleStore>;
7
+ export declare function updateScheduleStore(update: (store: ScheduleStore) => ScheduleStore | Promise<ScheduleStore>): Promise<ScheduleStore>;
8
+ export declare function compactSchedules(store: ScheduleStore): ScheduleRecord[];
9
+ export declare function normalizeScheduleRecord(input: unknown): ScheduleRecord | undefined;