@jungjaehoon/mama-os 0.1.1

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/CHANGELOG.md +67 -0
  2. package/README.md +643 -0
  3. package/dist/agent/agent-loop.d.ts +98 -0
  4. package/dist/agent/agent-loop.d.ts.map +1 -0
  5. package/dist/agent/agent-loop.js +417 -0
  6. package/dist/agent/agent-loop.js.map +1 -0
  7. package/dist/agent/auto-recall.d.ts +48 -0
  8. package/dist/agent/auto-recall.d.ts.map +1 -0
  9. package/dist/agent/auto-recall.js +178 -0
  10. package/dist/agent/auto-recall.js.map +1 -0
  11. package/dist/agent/claude-cli-wrapper.d.ts +130 -0
  12. package/dist/agent/claude-cli-wrapper.d.ts.map +1 -0
  13. package/dist/agent/claude-cli-wrapper.js +227 -0
  14. package/dist/agent/claude-cli-wrapper.js.map +1 -0
  15. package/dist/agent/claude-client.d.ts +50 -0
  16. package/dist/agent/claude-client.d.ts.map +1 -0
  17. package/dist/agent/claude-client.js +214 -0
  18. package/dist/agent/claude-client.js.map +1 -0
  19. package/dist/agent/gateway-tool-executor.d.ts +75 -0
  20. package/dist/agent/gateway-tool-executor.d.ts.map +1 -0
  21. package/dist/agent/gateway-tool-executor.js +348 -0
  22. package/dist/agent/gateway-tool-executor.js.map +1 -0
  23. package/dist/agent/index.d.ts +13 -0
  24. package/dist/agent/index.d.ts.map +1 -0
  25. package/dist/agent/index.js +18 -0
  26. package/dist/agent/index.js.map +1 -0
  27. package/dist/agent/mcp-executor.d.ts +75 -0
  28. package/dist/agent/mcp-executor.d.ts.map +1 -0
  29. package/dist/agent/mcp-executor.js +307 -0
  30. package/dist/agent/mcp-executor.js.map +1 -0
  31. package/dist/agent/session-pool.d.ts +148 -0
  32. package/dist/agent/session-pool.d.ts.map +1 -0
  33. package/dist/agent/session-pool.js +272 -0
  34. package/dist/agent/session-pool.js.map +1 -0
  35. package/dist/agent/streaming-callback-manager.d.ts +85 -0
  36. package/dist/agent/streaming-callback-manager.d.ts.map +1 -0
  37. package/dist/agent/streaming-callback-manager.js +103 -0
  38. package/dist/agent/streaming-callback-manager.js.map +1 -0
  39. package/dist/agent/types.d.ts +437 -0
  40. package/dist/agent/types.d.ts.map +1 -0
  41. package/dist/agent/types.js +29 -0
  42. package/dist/agent/types.js.map +1 -0
  43. package/dist/api/cron-handler.d.ts +44 -0
  44. package/dist/api/cron-handler.d.ts.map +1 -0
  45. package/dist/api/cron-handler.js +195 -0
  46. package/dist/api/cron-handler.js.map +1 -0
  47. package/dist/api/error-handler.d.ts +22 -0
  48. package/dist/api/error-handler.d.ts.map +1 -0
  49. package/dist/api/error-handler.js +104 -0
  50. package/dist/api/error-handler.js.map +1 -0
  51. package/dist/api/heartbeat-handler.d.ts +49 -0
  52. package/dist/api/heartbeat-handler.d.ts.map +1 -0
  53. package/dist/api/heartbeat-handler.js +91 -0
  54. package/dist/api/heartbeat-handler.js.map +1 -0
  55. package/dist/api/index.d.ts +61 -0
  56. package/dist/api/index.d.ts.map +1 -0
  57. package/dist/api/index.js +145 -0
  58. package/dist/api/index.js.map +1 -0
  59. package/dist/api/types.d.ts +156 -0
  60. package/dist/api/types.d.ts.map +1 -0
  61. package/dist/api/types.js +62 -0
  62. package/dist/api/types.js.map +1 -0
  63. package/dist/auth/index.d.ts +7 -0
  64. package/dist/auth/index.d.ts.map +1 -0
  65. package/dist/auth/index.js +11 -0
  66. package/dist/auth/index.js.map +1 -0
  67. package/dist/auth/oauth-manager.d.ts +59 -0
  68. package/dist/auth/oauth-manager.d.ts.map +1 -0
  69. package/dist/auth/oauth-manager.js +237 -0
  70. package/dist/auth/oauth-manager.js.map +1 -0
  71. package/dist/auth/types.d.ts +92 -0
  72. package/dist/auth/types.d.ts.map +1 -0
  73. package/dist/auth/types.js +23 -0
  74. package/dist/auth/types.js.map +1 -0
  75. package/dist/cli/commands/init.d.ts +19 -0
  76. package/dist/cli/commands/init.d.ts.map +1 -0
  77. package/dist/cli/commands/init.js +155 -0
  78. package/dist/cli/commands/init.js.map +1 -0
  79. package/dist/cli/commands/run.d.ts +19 -0
  80. package/dist/cli/commands/run.d.ts.map +1 -0
  81. package/dist/cli/commands/run.js +89 -0
  82. package/dist/cli/commands/run.js.map +1 -0
  83. package/dist/cli/commands/setup.d.ts +19 -0
  84. package/dist/cli/commands/setup.d.ts.map +1 -0
  85. package/dist/cli/commands/setup.js +134 -0
  86. package/dist/cli/commands/setup.js.map +1 -0
  87. package/dist/cli/commands/start.d.ts +24 -0
  88. package/dist/cli/commands/start.d.ts.map +1 -0
  89. package/dist/cli/commands/start.js +1073 -0
  90. package/dist/cli/commands/start.js.map +1 -0
  91. package/dist/cli/commands/status.d.ts +10 -0
  92. package/dist/cli/commands/status.d.ts.map +1 -0
  93. package/dist/cli/commands/status.js +85 -0
  94. package/dist/cli/commands/status.js.map +1 -0
  95. package/dist/cli/commands/stop.d.ts +10 -0
  96. package/dist/cli/commands/stop.d.ts.map +1 -0
  97. package/dist/cli/commands/stop.js +65 -0
  98. package/dist/cli/commands/stop.js.map +1 -0
  99. package/dist/cli/config/config-manager.d.ts +51 -0
  100. package/dist/cli/config/config-manager.d.ts.map +1 -0
  101. package/dist/cli/config/config-manager.js +216 -0
  102. package/dist/cli/config/config-manager.js.map +1 -0
  103. package/dist/cli/config/types.d.ts +172 -0
  104. package/dist/cli/config/types.d.ts.map +1 -0
  105. package/dist/cli/config/types.js +48 -0
  106. package/dist/cli/config/types.js.map +1 -0
  107. package/dist/cli/index.d.ts +8 -0
  108. package/dist/cli/index.d.ts.map +1 -0
  109. package/dist/cli/index.js +92 -0
  110. package/dist/cli/index.js.map +1 -0
  111. package/dist/cli/utils/pid-manager.d.ts +66 -0
  112. package/dist/cli/utils/pid-manager.d.ts.map +1 -0
  113. package/dist/cli/utils/pid-manager.js +167 -0
  114. package/dist/cli/utils/pid-manager.js.map +1 -0
  115. package/dist/concurrency/index.d.ts +13 -0
  116. package/dist/concurrency/index.d.ts.map +1 -0
  117. package/dist/concurrency/index.js +22 -0
  118. package/dist/concurrency/index.js.map +1 -0
  119. package/dist/concurrency/lane-manager.d.ts +113 -0
  120. package/dist/concurrency/lane-manager.d.ts.map +1 -0
  121. package/dist/concurrency/lane-manager.js +245 -0
  122. package/dist/concurrency/lane-manager.js.map +1 -0
  123. package/dist/concurrency/session-key.d.ts +41 -0
  124. package/dist/concurrency/session-key.d.ts.map +1 -0
  125. package/dist/concurrency/session-key.js +61 -0
  126. package/dist/concurrency/session-key.js.map +1 -0
  127. package/dist/concurrency/types.d.ts +69 -0
  128. package/dist/concurrency/types.d.ts.map +1 -0
  129. package/dist/concurrency/types.js +16 -0
  130. package/dist/concurrency/types.js.map +1 -0
  131. package/dist/gateways/channel-history.d.ts +102 -0
  132. package/dist/gateways/channel-history.d.ts.map +1 -0
  133. package/dist/gateways/channel-history.js +181 -0
  134. package/dist/gateways/channel-history.js.map +1 -0
  135. package/dist/gateways/context-injector.d.ts +74 -0
  136. package/dist/gateways/context-injector.d.ts.map +1 -0
  137. package/dist/gateways/context-injector.js +121 -0
  138. package/dist/gateways/context-injector.js.map +1 -0
  139. package/dist/gateways/discord.d.ts +122 -0
  140. package/dist/gateways/discord.d.ts.map +1 -0
  141. package/dist/gateways/discord.js +602 -0
  142. package/dist/gateways/discord.js.map +1 -0
  143. package/dist/gateways/index.d.ts +30 -0
  144. package/dist/gateways/index.d.ts.map +1 -0
  145. package/dist/gateways/index.js +49 -0
  146. package/dist/gateways/index.js.map +1 -0
  147. package/dist/gateways/message-router.d.ts +116 -0
  148. package/dist/gateways/message-router.d.ts.map +1 -0
  149. package/dist/gateways/message-router.js +315 -0
  150. package/dist/gateways/message-router.js.map +1 -0
  151. package/dist/gateways/message-splitter.d.ts +54 -0
  152. package/dist/gateways/message-splitter.d.ts.map +1 -0
  153. package/dist/gateways/message-splitter.js +146 -0
  154. package/dist/gateways/message-splitter.js.map +1 -0
  155. package/dist/gateways/plugin-loader.d.ts +76 -0
  156. package/dist/gateways/plugin-loader.d.ts.map +1 -0
  157. package/dist/gateways/plugin-loader.js +221 -0
  158. package/dist/gateways/plugin-loader.js.map +1 -0
  159. package/dist/gateways/session-store.d.ts +77 -0
  160. package/dist/gateways/session-store.d.ts.map +1 -0
  161. package/dist/gateways/session-store.js +233 -0
  162. package/dist/gateways/session-store.js.map +1 -0
  163. package/dist/gateways/slack.d.ts +90 -0
  164. package/dist/gateways/slack.d.ts.map +1 -0
  165. package/dist/gateways/slack.js +281 -0
  166. package/dist/gateways/slack.js.map +1 -0
  167. package/dist/gateways/telegram.d.ts +79 -0
  168. package/dist/gateways/telegram.d.ts.map +1 -0
  169. package/dist/gateways/telegram.js +207 -0
  170. package/dist/gateways/telegram.js.map +1 -0
  171. package/dist/gateways/types.d.ts +340 -0
  172. package/dist/gateways/types.d.ts.map +1 -0
  173. package/dist/gateways/types.js +6 -0
  174. package/dist/gateways/types.js.map +1 -0
  175. package/dist/index.d.ts +7 -0
  176. package/dist/index.d.ts.map +1 -0
  177. package/dist/index.js +26 -0
  178. package/dist/index.js.map +1 -0
  179. package/dist/memory/memory-logger.d.ts +47 -0
  180. package/dist/memory/memory-logger.d.ts.map +1 -0
  181. package/dist/memory/memory-logger.js +126 -0
  182. package/dist/memory/memory-logger.js.map +1 -0
  183. package/dist/onboarding/all-tools.d.ts +18 -0
  184. package/dist/onboarding/all-tools.d.ts.map +1 -0
  185. package/dist/onboarding/all-tools.js +149 -0
  186. package/dist/onboarding/all-tools.js.map +1 -0
  187. package/dist/onboarding/autonomous-discovery-tools.d.ts +13 -0
  188. package/dist/onboarding/autonomous-discovery-tools.d.ts.map +1 -0
  189. package/dist/onboarding/autonomous-discovery-tools.js +268 -0
  190. package/dist/onboarding/autonomous-discovery-tools.js.map +1 -0
  191. package/dist/onboarding/bootstrap-template.d.ts +5 -0
  192. package/dist/onboarding/bootstrap-template.d.ts.map +1 -0
  193. package/dist/onboarding/bootstrap-template.js +142 -0
  194. package/dist/onboarding/bootstrap-template.js.map +1 -0
  195. package/dist/onboarding/complete-autonomous-prompt.d.ts +13 -0
  196. package/dist/onboarding/complete-autonomous-prompt.d.ts.map +1 -0
  197. package/dist/onboarding/complete-autonomous-prompt.js +1220 -0
  198. package/dist/onboarding/complete-autonomous-prompt.js.map +1 -0
  199. package/dist/onboarding/onboarding-state.d.ts +70 -0
  200. package/dist/onboarding/onboarding-state.d.ts.map +1 -0
  201. package/dist/onboarding/onboarding-state.js +184 -0
  202. package/dist/onboarding/onboarding-state.js.map +1 -0
  203. package/dist/onboarding/personality-quiz.d.ts +35 -0
  204. package/dist/onboarding/personality-quiz.d.ts.map +1 -0
  205. package/dist/onboarding/personality-quiz.js +219 -0
  206. package/dist/onboarding/personality-quiz.js.map +1 -0
  207. package/dist/onboarding/phase-5-summary.d.ts +22 -0
  208. package/dist/onboarding/phase-5-summary.d.ts.map +1 -0
  209. package/dist/onboarding/phase-5-summary.js +151 -0
  210. package/dist/onboarding/phase-5-summary.js.map +1 -0
  211. package/dist/onboarding/phase-6-security.d.ts +33 -0
  212. package/dist/onboarding/phase-6-security.d.ts.map +1 -0
  213. package/dist/onboarding/phase-6-security.js +473 -0
  214. package/dist/onboarding/phase-6-security.js.map +1 -0
  215. package/dist/onboarding/phase-7-integrations.d.ts +66 -0
  216. package/dist/onboarding/phase-7-integrations.d.ts.map +1 -0
  217. package/dist/onboarding/phase-7-integrations.js +619 -0
  218. package/dist/onboarding/phase-7-integrations.js.map +1 -0
  219. package/dist/onboarding/phase-8-demo.d.ts +43 -0
  220. package/dist/onboarding/phase-8-demo.d.ts.map +1 -0
  221. package/dist/onboarding/phase-8-demo.js +346 -0
  222. package/dist/onboarding/phase-8-demo.js.map +1 -0
  223. package/dist/onboarding/phase-9-finalization.d.ts +22 -0
  224. package/dist/onboarding/phase-9-finalization.d.ts.map +1 -0
  225. package/dist/onboarding/phase-9-finalization.js +375 -0
  226. package/dist/onboarding/phase-9-finalization.js.map +1 -0
  227. package/dist/onboarding/ritual-prompt.d.ts +2 -0
  228. package/dist/onboarding/ritual-prompt.d.ts.map +1 -0
  229. package/dist/onboarding/ritual-prompt.js +285 -0
  230. package/dist/onboarding/ritual-prompt.js.map +1 -0
  231. package/dist/onboarding/ritual-tools.d.ts +13 -0
  232. package/dist/onboarding/ritual-tools.d.ts.map +1 -0
  233. package/dist/onboarding/ritual-tools.js +93 -0
  234. package/dist/onboarding/ritual-tools.js.map +1 -0
  235. package/dist/runners/cli-runner.d.ts +59 -0
  236. package/dist/runners/cli-runner.d.ts.map +1 -0
  237. package/dist/runners/cli-runner.js +190 -0
  238. package/dist/runners/cli-runner.js.map +1 -0
  239. package/dist/runners/index.d.ts +11 -0
  240. package/dist/runners/index.d.ts.map +1 -0
  241. package/dist/runners/index.js +15 -0
  242. package/dist/runners/index.js.map +1 -0
  243. package/dist/runners/types.d.ts +81 -0
  244. package/dist/runners/types.d.ts.map +1 -0
  245. package/dist/runners/types.js +31 -0
  246. package/dist/runners/types.js.map +1 -0
  247. package/dist/scheduler/cron-scheduler.d.ts +115 -0
  248. package/dist/scheduler/cron-scheduler.d.ts.map +1 -0
  249. package/dist/scheduler/cron-scheduler.js +320 -0
  250. package/dist/scheduler/cron-scheduler.js.map +1 -0
  251. package/dist/scheduler/heartbeat.d.ts +53 -0
  252. package/dist/scheduler/heartbeat.d.ts.map +1 -0
  253. package/dist/scheduler/heartbeat.js +160 -0
  254. package/dist/scheduler/heartbeat.js.map +1 -0
  255. package/dist/scheduler/index.d.ts +22 -0
  256. package/dist/scheduler/index.d.ts.map +1 -0
  257. package/dist/scheduler/index.js +31 -0
  258. package/dist/scheduler/index.js.map +1 -0
  259. package/dist/scheduler/job-lock.d.ts +85 -0
  260. package/dist/scheduler/job-lock.d.ts.map +1 -0
  261. package/dist/scheduler/job-lock.js +137 -0
  262. package/dist/scheduler/job-lock.js.map +1 -0
  263. package/dist/scheduler/recovery.d.ts +78 -0
  264. package/dist/scheduler/recovery.d.ts.map +1 -0
  265. package/dist/scheduler/recovery.js +124 -0
  266. package/dist/scheduler/recovery.js.map +1 -0
  267. package/dist/scheduler/schedule-store.d.ts +112 -0
  268. package/dist/scheduler/schedule-store.d.ts.map +1 -0
  269. package/dist/scheduler/schedule-store.js +259 -0
  270. package/dist/scheduler/schedule-store.js.map +1 -0
  271. package/dist/scheduler/token-keep-alive.d.ts +49 -0
  272. package/dist/scheduler/token-keep-alive.d.ts.map +1 -0
  273. package/dist/scheduler/token-keep-alive.js +102 -0
  274. package/dist/scheduler/token-keep-alive.js.map +1 -0
  275. package/dist/scheduler/types.d.ts +96 -0
  276. package/dist/scheduler/types.d.ts.map +1 -0
  277. package/dist/scheduler/types.js +21 -0
  278. package/dist/scheduler/types.js.map +1 -0
  279. package/dist/setup/setup-prompt.d.ts +2 -0
  280. package/dist/setup/setup-prompt.d.ts.map +1 -0
  281. package/dist/setup/setup-prompt.js +138 -0
  282. package/dist/setup/setup-prompt.js.map +1 -0
  283. package/dist/setup/setup-server.d.ts +8 -0
  284. package/dist/setup/setup-server.d.ts.map +1 -0
  285. package/dist/setup/setup-server.js +71 -0
  286. package/dist/setup/setup-server.js.map +1 -0
  287. package/dist/setup/setup-tools.d.ts +13 -0
  288. package/dist/setup/setup-tools.d.ts.map +1 -0
  289. package/dist/setup/setup-tools.js +103 -0
  290. package/dist/setup/setup-tools.js.map +1 -0
  291. package/dist/setup/setup-websocket.d.ts +6 -0
  292. package/dist/setup/setup-websocket.d.ts.map +1 -0
  293. package/dist/setup/setup-websocket.js +312 -0
  294. package/dist/setup/setup-websocket.js.map +1 -0
  295. package/dist/skills/index.d.ts +10 -0
  296. package/dist/skills/index.d.ts.map +1 -0
  297. package/dist/skills/index.js +26 -0
  298. package/dist/skills/index.js.map +1 -0
  299. package/dist/skills/skill-executor.d.ts +48 -0
  300. package/dist/skills/skill-executor.d.ts.map +1 -0
  301. package/dist/skills/skill-executor.js +483 -0
  302. package/dist/skills/skill-executor.js.map +1 -0
  303. package/dist/skills/skill-loader.d.ts +40 -0
  304. package/dist/skills/skill-loader.d.ts.map +1 -0
  305. package/dist/skills/skill-loader.js +225 -0
  306. package/dist/skills/skill-loader.js.map +1 -0
  307. package/dist/skills/skill-matcher.d.ts +33 -0
  308. package/dist/skills/skill-matcher.d.ts.map +1 -0
  309. package/dist/skills/skill-matcher.js +190 -0
  310. package/dist/skills/skill-matcher.js.map +1 -0
  311. package/dist/skills/types.d.ts +123 -0
  312. package/dist/skills/types.d.ts.map +1 -0
  313. package/dist/skills/types.js +12 -0
  314. package/dist/skills/types.js.map +1 -0
  315. package/dist/tools/browser-tool.d.ts +149 -0
  316. package/dist/tools/browser-tool.d.ts.map +1 -0
  317. package/dist/tools/browser-tool.js +257 -0
  318. package/dist/tools/browser-tool.js.map +1 -0
  319. package/package.json +84 -0
  320. package/public/favicon.ico +0 -0
  321. package/public/setup.html +1026 -0
  322. package/public/viewer/icons/icon-192.png +0 -0
  323. package/public/viewer/icons/icon-512.png +0 -0
  324. package/public/viewer/js/modules/chat.js +1587 -0
  325. package/public/viewer/js/modules/dashboard.js +275 -0
  326. package/public/viewer/js/modules/graph.js +997 -0
  327. package/public/viewer/js/modules/memory.js +353 -0
  328. package/public/viewer/js/modules/settings.js +255 -0
  329. package/public/viewer/js/utils/api.js +169 -0
  330. package/public/viewer/js/utils/dom.js +92 -0
  331. package/public/viewer/js/utils/format.js +192 -0
  332. package/public/viewer/manifest.json +26 -0
  333. package/public/viewer/sw.js +131 -0
  334. package/public/viewer/viewer.css +500 -0
  335. package/public/viewer/viewer.html +1535 -0
  336. package/scripts/postinstall.js +118 -0
  337. package/templates/skills/document-analyze.md +63 -0
  338. package/templates/skills/heartbeat-report.md +75 -0
  339. package/templates/skills/image-translate.md +67 -0
  340. package/templates/workspace/skill-forge/DESIGN.md +115 -0
  341. package/templates/workspace/skill-forge/agents/architect.ts +295 -0
  342. package/templates/workspace/skill-forge/agents/developer.ts +364 -0
  343. package/templates/workspace/skill-forge/agents/qa.ts +313 -0
  344. package/templates/workspace/skill-forge/claude-api.ts +353 -0
  345. package/templates/workspace/skill-forge/discord-ui.ts +580 -0
  346. package/templates/workspace/skill-forge/error-handler.ts +354 -0
  347. package/templates/workspace/skill-forge/mama-integration.ts +357 -0
  348. package/templates/workspace/skill-forge/orchestrator.ts +495 -0
  349. package/templates/workspace/skill-forge/output/generated-skills/skills/hello-world/README.md +24 -0
  350. package/templates/workspace/skill-forge/output/generated-skills/skills/hello-world/index.ts +79 -0
  351. package/templates/workspace/skill-forge/output/generated-skills/skills/hello-world/types.ts +17 -0
  352. package/templates/workspace/skill-forge/package.json +21 -0
  353. package/templates/workspace/skill-forge/state/session.json +132 -0
  354. package/templates/workspace/skill-forge/test-e2e.ts +139 -0
  355. package/templates/workspace/skill-forge/tsconfig.json +20 -0
  356. package/templates/workspace/skill-forge/types.ts +159 -0
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Job Lock for preventing concurrent execution
3
+ *
4
+ * Simple in-memory lock mechanism for single-process environments.
5
+ * For multi-process scenarios, use a distributed lock (Redis, etc.)
6
+ */
7
+ /**
8
+ * Lock information
9
+ */
10
+ export interface LockInfo {
11
+ /** Job ID */
12
+ jobId: string;
13
+ /** When lock was acquired */
14
+ acquiredAt: Date;
15
+ /** Lock timeout in ms (0 = no timeout) */
16
+ timeout: number;
17
+ }
18
+ export declare class JobLock {
19
+ private locks;
20
+ private readonly defaultTimeout;
21
+ /**
22
+ * Create a new JobLock instance
23
+ *
24
+ * @param defaultTimeout - Default lock timeout in ms (0 = no timeout)
25
+ */
26
+ constructor(defaultTimeout?: number);
27
+ /**
28
+ * Attempt to acquire a lock for a job
29
+ *
30
+ * @param jobId - Job identifier
31
+ * @param timeout - Lock timeout in ms (overrides default)
32
+ * @returns true if lock acquired, false if already locked
33
+ */
34
+ acquire(jobId: string, timeout?: number): boolean;
35
+ /**
36
+ * Release a lock for a job
37
+ *
38
+ * @param jobId - Job identifier
39
+ * @returns true if lock was released, false if not locked
40
+ */
41
+ release(jobId: string): boolean;
42
+ /**
43
+ * Check if a job is currently locked
44
+ *
45
+ * Also handles timeout expiration.
46
+ *
47
+ * @param jobId - Job identifier
48
+ * @returns true if locked, false otherwise
49
+ */
50
+ isLocked(jobId: string): boolean;
51
+ /**
52
+ * Get lock information for a job
53
+ *
54
+ * @param jobId - Job identifier
55
+ * @returns Lock info or null if not locked
56
+ */
57
+ getLockInfo(jobId: string): LockInfo | null;
58
+ /**
59
+ * Get all currently held locks
60
+ *
61
+ * @returns Array of lock info
62
+ */
63
+ getAllLocks(): LockInfo[];
64
+ /**
65
+ * Release all locks
66
+ */
67
+ releaseAll(): void;
68
+ /**
69
+ * Get the number of currently held locks
70
+ */
71
+ get size(): number;
72
+ /**
73
+ * Execute a function with a lock
74
+ *
75
+ * Automatically acquires and releases lock around the function.
76
+ *
77
+ * @param jobId - Job identifier
78
+ * @param fn - Function to execute
79
+ * @param timeout - Lock timeout in ms
80
+ * @returns Result of the function
81
+ * @throws Error if lock cannot be acquired
82
+ */
83
+ withLock<T>(jobId: string, fn: () => Promise<T>, timeout?: number): Promise<T>;
84
+ }
85
+ //# sourceMappingURL=job-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-lock.d.ts","sourceRoot":"","sources":["../../src/scheduler/job-lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,UAAU,EAAE,IAAI,CAAC;IACjB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC;;;;OAIG;gBACS,cAAc,SAAI;IAI9B;;;;;;OAMG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAgBjD;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI/B;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAoBhC;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAO3C;;;;OAIG;IACH,WAAW,IAAI,QAAQ,EAAE;IAazB;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAWrF"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ /**
3
+ * Job Lock for preventing concurrent execution
4
+ *
5
+ * Simple in-memory lock mechanism for single-process environments.
6
+ * For multi-process scenarios, use a distributed lock (Redis, etc.)
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.JobLock = void 0;
10
+ class JobLock {
11
+ locks = new Map();
12
+ defaultTimeout;
13
+ /**
14
+ * Create a new JobLock instance
15
+ *
16
+ * @param defaultTimeout - Default lock timeout in ms (0 = no timeout)
17
+ */
18
+ constructor(defaultTimeout = 0) {
19
+ this.defaultTimeout = defaultTimeout;
20
+ }
21
+ /**
22
+ * Attempt to acquire a lock for a job
23
+ *
24
+ * @param jobId - Job identifier
25
+ * @param timeout - Lock timeout in ms (overrides default)
26
+ * @returns true if lock acquired, false if already locked
27
+ */
28
+ acquire(jobId, timeout) {
29
+ // Check if already locked
30
+ if (this.isLocked(jobId)) {
31
+ return false;
32
+ }
33
+ // Acquire lock
34
+ this.locks.set(jobId, {
35
+ jobId,
36
+ acquiredAt: new Date(),
37
+ timeout: timeout ?? this.defaultTimeout,
38
+ });
39
+ return true;
40
+ }
41
+ /**
42
+ * Release a lock for a job
43
+ *
44
+ * @param jobId - Job identifier
45
+ * @returns true if lock was released, false if not locked
46
+ */
47
+ release(jobId) {
48
+ return this.locks.delete(jobId);
49
+ }
50
+ /**
51
+ * Check if a job is currently locked
52
+ *
53
+ * Also handles timeout expiration.
54
+ *
55
+ * @param jobId - Job identifier
56
+ * @returns true if locked, false otherwise
57
+ */
58
+ isLocked(jobId) {
59
+ const lock = this.locks.get(jobId);
60
+ if (!lock) {
61
+ return false;
62
+ }
63
+ // Check for timeout expiration
64
+ if (lock.timeout > 0) {
65
+ const elapsed = Date.now() - lock.acquiredAt.getTime();
66
+ if (elapsed >= lock.timeout) {
67
+ // Lock expired, release it
68
+ this.locks.delete(jobId);
69
+ return false;
70
+ }
71
+ }
72
+ return true;
73
+ }
74
+ /**
75
+ * Get lock information for a job
76
+ *
77
+ * @param jobId - Job identifier
78
+ * @returns Lock info or null if not locked
79
+ */
80
+ getLockInfo(jobId) {
81
+ if (!this.isLocked(jobId)) {
82
+ return null;
83
+ }
84
+ return this.locks.get(jobId) ?? null;
85
+ }
86
+ /**
87
+ * Get all currently held locks
88
+ *
89
+ * @returns Array of lock info
90
+ */
91
+ getAllLocks() {
92
+ // Filter out expired locks
93
+ const activeLocks = [];
94
+ for (const [jobId, lock] of this.locks) {
95
+ if (this.isLocked(jobId)) {
96
+ activeLocks.push(lock);
97
+ }
98
+ }
99
+ return activeLocks;
100
+ }
101
+ /**
102
+ * Release all locks
103
+ */
104
+ releaseAll() {
105
+ this.locks.clear();
106
+ }
107
+ /**
108
+ * Get the number of currently held locks
109
+ */
110
+ get size() {
111
+ return this.getAllLocks().length;
112
+ }
113
+ /**
114
+ * Execute a function with a lock
115
+ *
116
+ * Automatically acquires and releases lock around the function.
117
+ *
118
+ * @param jobId - Job identifier
119
+ * @param fn - Function to execute
120
+ * @param timeout - Lock timeout in ms
121
+ * @returns Result of the function
122
+ * @throws Error if lock cannot be acquired
123
+ */
124
+ async withLock(jobId, fn, timeout) {
125
+ if (!this.acquire(jobId, timeout)) {
126
+ throw new Error(`Failed to acquire lock for job: ${jobId}`);
127
+ }
128
+ try {
129
+ return await fn();
130
+ }
131
+ finally {
132
+ this.release(jobId);
133
+ }
134
+ }
135
+ }
136
+ exports.JobLock = JobLock;
137
+ //# sourceMappingURL=job-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-lock.js","sourceRoot":"","sources":["../../src/scheduler/job-lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Schedule recovery module
3
+ *
4
+ * Recovers enabled schedules from the database on server startup
5
+ * and registers them with the scheduler.
6
+ */
7
+ import { CronScheduler } from './cron-scheduler.js';
8
+ import { ScheduleStore } from './schedule-store.js';
9
+ /**
10
+ * Recovery result information
11
+ */
12
+ export interface RecoveryResult {
13
+ /** Number of schedules recovered */
14
+ recovered: number;
15
+ /** Number of schedules that failed to recover */
16
+ failed: number;
17
+ /** Details of recovered schedules */
18
+ schedules: Array<{
19
+ id: string;
20
+ name: string;
21
+ cronExpr: string;
22
+ success: boolean;
23
+ error?: string;
24
+ }>;
25
+ }
26
+ /**
27
+ * Recovery options
28
+ */
29
+ export interface RecoveryOptions {
30
+ /** Whether to log recovery progress */
31
+ verbose?: boolean;
32
+ /** Logger function (defaults to console.log) */
33
+ logger?: (message: string) => void;
34
+ }
35
+ /**
36
+ * Recover enabled schedules from the database and register with scheduler
37
+ *
38
+ * @param scheduler - The CronScheduler instance
39
+ * @param store - The ScheduleStore instance
40
+ * @param options - Recovery options
41
+ * @returns Recovery result with details
42
+ */
43
+ export declare function recoverSchedules(scheduler: CronScheduler, store: ScheduleStore, options?: RecoveryOptions): RecoveryResult;
44
+ /**
45
+ * Sync scheduler state with database
46
+ *
47
+ * Updates next_run times in the database based on scheduler state.
48
+ * Call this after recovery to ensure database reflects current scheduler state.
49
+ *
50
+ * @param scheduler - The CronScheduler instance
51
+ * @param store - The ScheduleStore instance
52
+ */
53
+ export declare function syncSchedulerState(scheduler: CronScheduler, store: ScheduleStore): void;
54
+ /**
55
+ * Create a schedule store event handler that persists changes to database
56
+ *
57
+ * @param store - The ScheduleStore instance
58
+ * @returns Event handler function for scheduler events
59
+ */
60
+ export declare function createPersistenceHandler(store: ScheduleStore): {
61
+ /**
62
+ * Handle job started event
63
+ */
64
+ onJobStarted(jobId: string): string;
65
+ /**
66
+ * Handle job completed event
67
+ */
68
+ onJobCompleted(logId: string, success: boolean, output?: string, error?: string): void;
69
+ /**
70
+ * Handle job state change (enabled/disabled)
71
+ */
72
+ onJobStateChanged(jobId: string, enabled: boolean): void;
73
+ /**
74
+ * Handle next run time update
75
+ */
76
+ onNextRunUpdated(jobId: string, nextRun: Date | undefined): void;
77
+ };
78
+ //# sourceMappingURL=recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/scheduler/recovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,aAAa,EACpB,OAAO,GAAE,eAAoB,GAC5B,cAAc,CA0DhB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAUvF;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa;IAEzD;;OAEG;wBACiB,MAAM,GAAG,MAAM;IAInC;;OAEG;0BACmB,MAAM,WAAW,OAAO,WAAW,MAAM,UAAU,MAAM,GAAG,IAAI;IAItF;;OAEG;6BACsB,MAAM,WAAW,OAAO,GAAG,IAAI;IAIxD;;OAEG;4BACqB,MAAM,WAAW,IAAI,GAAG,SAAS,GAAG,IAAI;EAMnE"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ /**
3
+ * Schedule recovery module
4
+ *
5
+ * Recovers enabled schedules from the database on server startup
6
+ * and registers them with the scheduler.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.recoverSchedules = recoverSchedules;
10
+ exports.syncSchedulerState = syncSchedulerState;
11
+ exports.createPersistenceHandler = createPersistenceHandler;
12
+ /**
13
+ * Recover enabled schedules from the database and register with scheduler
14
+ *
15
+ * @param scheduler - The CronScheduler instance
16
+ * @param store - The ScheduleStore instance
17
+ * @param options - Recovery options
18
+ * @returns Recovery result with details
19
+ */
20
+ function recoverSchedules(scheduler, store, options = {}) {
21
+ const { verbose = false, logger = console.log } = options;
22
+ const result = {
23
+ recovered: 0,
24
+ failed: 0,
25
+ schedules: [],
26
+ };
27
+ // Get all enabled schedules from database
28
+ const enabledJobs = store.listEnabledJobs();
29
+ if (verbose) {
30
+ logger(`Found ${enabledJobs.length} enabled schedules to recover`);
31
+ }
32
+ for (const job of enabledJobs) {
33
+ const scheduleResult = {
34
+ id: job.id,
35
+ name: job.name,
36
+ cronExpr: job.cron_expr,
37
+ success: false,
38
+ error: undefined,
39
+ };
40
+ try {
41
+ // Register the job with the scheduler
42
+ scheduler.addJob({
43
+ id: job.id,
44
+ name: job.name,
45
+ cronExpr: job.cron_expr,
46
+ prompt: job.prompt,
47
+ enabled: true,
48
+ });
49
+ scheduleResult.success = true;
50
+ result.recovered++;
51
+ if (verbose) {
52
+ logger(` ✓ Recovered: ${job.name} (${job.cron_expr})`);
53
+ }
54
+ }
55
+ catch (error) {
56
+ scheduleResult.error = error instanceof Error ? error.message : String(error);
57
+ result.failed++;
58
+ if (verbose) {
59
+ logger(` ✗ Failed: ${job.name} - ${scheduleResult.error}`);
60
+ }
61
+ }
62
+ result.schedules.push(scheduleResult);
63
+ }
64
+ if (verbose) {
65
+ logger(`Recovery complete: ${result.recovered} recovered, ${result.failed} failed`);
66
+ }
67
+ return result;
68
+ }
69
+ /**
70
+ * Sync scheduler state with database
71
+ *
72
+ * Updates next_run times in the database based on scheduler state.
73
+ * Call this after recovery to ensure database reflects current scheduler state.
74
+ *
75
+ * @param scheduler - The CronScheduler instance
76
+ * @param store - The ScheduleStore instance
77
+ */
78
+ function syncSchedulerState(scheduler, store) {
79
+ const jobs = scheduler.listJobs();
80
+ for (const job of jobs) {
81
+ if (job.nextRun) {
82
+ store.updateJob(job.id, {
83
+ next_run: job.nextRun.getTime(),
84
+ });
85
+ }
86
+ }
87
+ }
88
+ /**
89
+ * Create a schedule store event handler that persists changes to database
90
+ *
91
+ * @param store - The ScheduleStore instance
92
+ * @returns Event handler function for scheduler events
93
+ */
94
+ function createPersistenceHandler(store) {
95
+ return {
96
+ /**
97
+ * Handle job started event
98
+ */
99
+ onJobStarted(jobId) {
100
+ return store.logStart(jobId);
101
+ },
102
+ /**
103
+ * Handle job completed event
104
+ */
105
+ onJobCompleted(logId, success, output, error) {
106
+ store.logFinish(logId, success ? 'success' : 'failed', output, error);
107
+ },
108
+ /**
109
+ * Handle job state change (enabled/disabled)
110
+ */
111
+ onJobStateChanged(jobId, enabled) {
112
+ store.updateJob(jobId, { enabled });
113
+ },
114
+ /**
115
+ * Handle next run time update
116
+ */
117
+ onNextRunUpdated(jobId, nextRun) {
118
+ store.updateJob(jobId, {
119
+ next_run: nextRun ? nextRun.getTime() : null,
120
+ });
121
+ },
122
+ };
123
+ }
124
+ //# sourceMappingURL=recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/scheduler/recovery.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAyCH,4CA8DC;AAWD,gDAUC;AAQD,4DAgCC;AAnID;;;;;;;GAOG;AACH,SAAgB,gBAAgB,CAC9B,SAAwB,EACxB,KAAoB,EACpB,UAA2B,EAAE;IAE7B,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAE1D,MAAM,MAAM,GAAmB;QAC7B,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,EAAE;KACd,CAAC;IAEF,0CAA0C;IAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;IAE5C,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,SAAS,WAAW,CAAC,MAAM,+BAA+B,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,cAAc,GAAG;YACrB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,SAA+B;SACvC,CAAC;QAEF,IAAI,CAAC;YACH,sCAAsC;YACtC,SAAS,CAAC,MAAM,CAAC;gBACf,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,QAAQ,EAAE,GAAG,CAAC,SAAS;gBACvB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAC9B,MAAM,CAAC,SAAS,EAAE,CAAC;YAEnB,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,kBAAkB,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9E,MAAM,CAAC,MAAM,EAAE,CAAC;YAEhB,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,eAAe,GAAG,CAAC,IAAI,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,sBAAsB,MAAM,CAAC,SAAS,eAAe,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,kBAAkB,CAAC,SAAwB,EAAE,KAAoB;IAC/E,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;IAElC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE;gBACtB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,wBAAwB,CAAC,KAAoB;IAC3D,OAAO;QACL;;WAEG;QACH,YAAY,CAAC,KAAa;YACxB,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED;;WAEG;QACH,cAAc,CAAC,KAAa,EAAE,OAAgB,EAAE,MAAe,EAAE,KAAc;YAC7E,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACxE,CAAC;QAED;;WAEG;QACH,iBAAiB,CAAC,KAAa,EAAE,OAAgB;YAC/C,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACtC,CAAC;QAED;;WAEG;QACH,gBAAgB,CAAC,KAAa,EAAE,OAAyB;YACvD,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE;gBACrB,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;aAC7C,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Schedule persistence store using SQLite
3
+ *
4
+ * Stores cron job definitions and execution logs in SQLite database.
5
+ * Supports server restart recovery and execution history tracking.
6
+ */
7
+ import Database from 'better-sqlite3';
8
+ /**
9
+ * Persisted schedule (cron job) definition
10
+ */
11
+ export interface Schedule {
12
+ id: string;
13
+ name: string;
14
+ cron_expr: string;
15
+ prompt: string;
16
+ enabled: boolean;
17
+ last_run: number | null;
18
+ next_run: number | null;
19
+ created_at: number;
20
+ }
21
+ /**
22
+ * Schedule execution log entry
23
+ */
24
+ export interface ScheduleLog {
25
+ id: string;
26
+ schedule_id: string;
27
+ started_at: number;
28
+ finished_at: number | null;
29
+ status: 'running' | 'success' | 'failed';
30
+ output: string | null;
31
+ error: string | null;
32
+ }
33
+ /**
34
+ * Input for creating a new schedule
35
+ */
36
+ export type CreateScheduleInput = Omit<Schedule, 'id' | 'created_at' | 'last_run'>;
37
+ /**
38
+ * Input for updating a schedule
39
+ */
40
+ export type UpdateScheduleInput = Partial<Omit<Schedule, 'id' | 'created_at'>>;
41
+ /**
42
+ * SQLite-backed store for schedules and execution logs
43
+ */
44
+ export declare class ScheduleStore {
45
+ private db;
46
+ constructor(db: Database.Database);
47
+ /**
48
+ * Run database migration to create tables
49
+ */
50
+ private runMigration;
51
+ /**
52
+ * Create a new schedule
53
+ */
54
+ createJob(input: CreateScheduleInput): string;
55
+ /**
56
+ * Get a schedule by ID
57
+ */
58
+ getJob(id: string): Schedule | null;
59
+ /**
60
+ * List all schedules
61
+ */
62
+ listJobs(): Schedule[];
63
+ /**
64
+ * List only enabled schedules
65
+ */
66
+ listEnabledJobs(): Schedule[];
67
+ /**
68
+ * Update a schedule
69
+ */
70
+ updateJob(id: string, updates: UpdateScheduleInput): boolean;
71
+ /**
72
+ * Delete a schedule (cascade deletes logs)
73
+ */
74
+ deleteJob(id: string): boolean;
75
+ /**
76
+ * Log the start of a schedule execution
77
+ */
78
+ logStart(scheduleId: string): string;
79
+ /**
80
+ * Log the finish of a schedule execution
81
+ */
82
+ logFinish(logId: string, status: 'success' | 'failed', output?: string, error?: string): boolean;
83
+ /**
84
+ * Get execution logs for a schedule
85
+ */
86
+ getLogs(scheduleId: string, limit?: number, offset?: number): ScheduleLog[];
87
+ /**
88
+ * Get the last execution for a schedule
89
+ */
90
+ getLastExecution(scheduleId: string): ScheduleLog | null;
91
+ /**
92
+ * Get the last execution across all schedules (for heartbeat status)
93
+ */
94
+ getLastExecutionGlobal(): ScheduleLog | null;
95
+ /**
96
+ * Get a specific log entry by ID
97
+ */
98
+ getLog(logId: string): ScheduleLog | null;
99
+ /**
100
+ * Convert database row to Schedule object
101
+ */
102
+ private rowToSchedule;
103
+ /**
104
+ * Convert database row to ScheduleLog object
105
+ */
106
+ private rowToLog;
107
+ /**
108
+ * Close the database connection
109
+ */
110
+ close(): void;
111
+ }
112
+ //# sourceMappingURL=schedule-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-store.d.ts","sourceRoot":"","sources":["../../src/scheduler/schedule-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAOtC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,YAAY,GAAG,UAAU,CAAC,CAAC;AAEnF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC;AA+B/E;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAKjC;;OAEG;IACH,OAAO,CAAC,YAAY;IAuCpB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM;IAU7C;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAMnC;;OAEG;IACH,QAAQ,IAAI,QAAQ,EAAE;IAMtB;;OAEG;IACH,eAAe,IAAI,QAAQ,EAAE;IAQ7B;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO;IAqC5D;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAU9B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAgBpC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAUhG;;OAEG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,WAAW,EAAE;IAWlE;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAWxD;;OAEG;IACH,sBAAsB,IAAI,WAAW,GAAG,IAAI;IAU5C;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAUzC;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAYhB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}