@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,195 @@
1
+ "use strict";
2
+ /**
3
+ * Cron API router for /api/cron endpoints
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ScheduleStoreAdapter = exports.InMemoryLogStore = void 0;
7
+ exports.createCronRouter = createCronRouter;
8
+ const express_1 = require("express");
9
+ const types_js_1 = require("./types.js");
10
+ const error_handler_js_1 = require("./error-handler.js");
11
+ /**
12
+ * In-memory execution log store (placeholder until S6)
13
+ */
14
+ class InMemoryLogStore {
15
+ logs = new Map();
16
+ async getLogs(jobId, limit, offset) {
17
+ const jobLogs = this.logs.get(jobId) || [];
18
+ return jobLogs.slice(offset, offset + limit);
19
+ }
20
+ async addLog(jobId, log) {
21
+ if (!this.logs.has(jobId)) {
22
+ this.logs.set(jobId, []);
23
+ }
24
+ this.logs.get(jobId).unshift(log); // Most recent first
25
+ }
26
+ async updateLog(logId, updates) {
27
+ for (const logs of this.logs.values()) {
28
+ const log = logs.find((l) => l.id === logId);
29
+ if (log) {
30
+ Object.assign(log, updates);
31
+ return;
32
+ }
33
+ }
34
+ }
35
+ }
36
+ exports.InMemoryLogStore = InMemoryLogStore;
37
+ /**
38
+ * Adapter to use ScheduleStore as ExecutionLogStore
39
+ *
40
+ * Wraps ScheduleStore to provide ExecutionLogStore interface.
41
+ * This allows the API handlers to use persistent SQLite storage.
42
+ */
43
+ class ScheduleStoreAdapter {
44
+ store;
45
+ constructor(store) {
46
+ this.store = store;
47
+ }
48
+ async getLogs(jobId, limit, offset) {
49
+ const logs = this.store.getLogs(jobId, limit, offset);
50
+ return logs.map((log) => ({
51
+ id: log.id,
52
+ started_at: log.started_at,
53
+ finished_at: log.finished_at,
54
+ status: log.status,
55
+ output: log.output,
56
+ error: log.error,
57
+ }));
58
+ }
59
+ async addLog(jobId, log) {
60
+ // Use logStart for initial log creation
61
+ const logId = this.store.logStart(jobId);
62
+ // If the log has a specific ID, we need to track the mapping
63
+ // For now, we just use the store's generated ID
64
+ if (log.status !== 'running') {
65
+ this.store.logFinish(logId, log.status === 'success' ? 'success' : 'failed', log.output || undefined, log.error || undefined);
66
+ }
67
+ }
68
+ async updateLog(logId, updates) {
69
+ if (updates.status && updates.status !== 'running') {
70
+ this.store.logFinish(logId, updates.status === 'success' ? 'success' : 'failed', updates.output || undefined, updates.error || undefined);
71
+ }
72
+ }
73
+ }
74
+ exports.ScheduleStoreAdapter = ScheduleStoreAdapter;
75
+ /**
76
+ * Create cron API router
77
+ */
78
+ function createCronRouter(scheduler, logStore = new InMemoryLogStore()) {
79
+ const router = (0, express_1.Router)();
80
+ // GET /api/cron - List all jobs
81
+ router.get('/', (0, error_handler_js_1.asyncHandler)(async (_req, res) => {
82
+ const jobs = scheduler.listJobs();
83
+ const apiJobs = jobs.map(types_js_1.toApiCronJob);
84
+ res.json({ jobs: apiJobs });
85
+ }));
86
+ // POST /api/cron - Create a new job
87
+ router.post('/', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
88
+ const body = req.body;
89
+ (0, error_handler_js_1.validateRequired)(body, ['name', 'cron_expr', 'prompt']);
90
+ const id = `job_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
91
+ scheduler.addJob({
92
+ id,
93
+ name: body.name,
94
+ cronExpr: body.cron_expr,
95
+ prompt: body.prompt,
96
+ enabled: body.enabled ?? true,
97
+ });
98
+ res.json({ id, created: true });
99
+ }));
100
+ // GET /api/cron/:id - Get a specific job
101
+ router.get('/:id', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
102
+ const id = req.params.id;
103
+ const job = scheduler.getJob(id);
104
+ if (!job) {
105
+ throw new types_js_1.ApiError(`Job not found: ${id}`, 404, 'NOT_FOUND');
106
+ }
107
+ res.json({ job: (0, types_js_1.toApiCronJob)(job) });
108
+ }));
109
+ // PUT /api/cron/:id - Update a job
110
+ router.put('/:id', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
111
+ const id = req.params.id;
112
+ const body = req.body;
113
+ const job = scheduler.getJob(id);
114
+ if (!job) {
115
+ throw new types_js_1.ApiError(`Job not found: ${id}`, 404, 'NOT_FOUND');
116
+ }
117
+ // Update job - need to remove and re-add for scheduler
118
+ // First get current values
119
+ const currentJob = scheduler.getJob(id);
120
+ // Build updated config
121
+ const updatedConfig = {
122
+ id: id,
123
+ name: body.name ?? currentJob.name,
124
+ cronExpr: body.cron_expr ?? currentJob.cronExpr,
125
+ prompt: body.prompt ?? currentJob.prompt,
126
+ enabled: body.enabled ?? currentJob.enabled,
127
+ };
128
+ // Remove old job and add updated one
129
+ scheduler.removeJob(id);
130
+ scheduler.addJob(updatedConfig);
131
+ res.json({ updated: true });
132
+ }));
133
+ // DELETE /api/cron/:id - Delete a job
134
+ router.delete('/:id', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
135
+ const id = req.params.id;
136
+ const job = scheduler.getJob(id);
137
+ if (!job) {
138
+ throw new types_js_1.ApiError(`Job not found: ${id}`, 404, 'NOT_FOUND');
139
+ }
140
+ scheduler.removeJob(id);
141
+ res.json({ deleted: true });
142
+ }));
143
+ // POST /api/cron/:id/run - Run job immediately
144
+ router.post('/:id/run', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
145
+ const id = req.params.id;
146
+ const job = scheduler.getJob(id);
147
+ if (!job) {
148
+ throw new types_js_1.ApiError(`Job not found: ${id}`, 404, 'NOT_FOUND');
149
+ }
150
+ const executionId = `exec_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
151
+ // Create log entry for this execution
152
+ const log = {
153
+ id: executionId,
154
+ started_at: Date.now(),
155
+ finished_at: null,
156
+ status: 'running',
157
+ output: null,
158
+ error: null,
159
+ };
160
+ await logStore.addLog(id, log);
161
+ // Run the job asynchronously
162
+ scheduler
163
+ .runNow(id)
164
+ .then(async (result) => {
165
+ await logStore.updateLog(executionId, {
166
+ finished_at: Date.now(),
167
+ status: result.success ? 'success' : 'failed',
168
+ output: result.success ? 'Execution completed' : null,
169
+ error: result.error || null,
170
+ });
171
+ })
172
+ .catch(async (err) => {
173
+ await logStore.updateLog(executionId, {
174
+ finished_at: Date.now(),
175
+ status: 'failed',
176
+ error: err.message,
177
+ });
178
+ });
179
+ res.json({ execution_id: executionId, started: true });
180
+ }));
181
+ // GET /api/cron/:id/logs - Get execution logs
182
+ router.get('/:id/logs', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
183
+ const id = req.params.id;
184
+ const limit = parseInt(req.query.limit) || 20;
185
+ const offset = parseInt(req.query.offset) || 0;
186
+ const job = scheduler.getJob(id);
187
+ if (!job) {
188
+ throw new types_js_1.ApiError(`Job not found: ${id}`, 404, 'NOT_FOUND');
189
+ }
190
+ const logs = await logStore.getLogs(id, limit, offset);
191
+ res.json({ logs });
192
+ }));
193
+ return router;
194
+ }
195
+ //# sourceMappingURL=cron-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-handler.js","sourceRoot":"","sources":["../../src/api/cron-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Error handling middleware for API
3
+ */
4
+ import type { Request, Response, NextFunction } from 'express';
5
+ export { ApiError } from './types.js';
6
+ /**
7
+ * Express error handling middleware
8
+ */
9
+ export declare function errorHandler(err: Error, _req: Request, res: Response, _next: NextFunction): void;
10
+ /**
11
+ * Async handler wrapper to catch promise rejections
12
+ */
13
+ export declare function asyncHandler<T>(fn: (req: Request, res: Response, next: NextFunction) => Promise<T>): (req: Request, res: Response, next: NextFunction) => void;
14
+ /**
15
+ * Validate required fields in request body
16
+ */
17
+ export declare function validateRequired(body: Record<string, unknown>, fields: string[]): void;
18
+ /**
19
+ * 404 handler for unmatched routes
20
+ */
21
+ export declare function notFoundHandler(req: Request, res: Response, _next: NextFunction): void;
22
+ //# sourceMappingURL=error-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/api/error-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI/D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CA0BhG;AAoCD;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,GAClE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAI3D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAOtF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAMtF"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /**
3
+ * Error handling middleware for API
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ApiError = void 0;
7
+ exports.errorHandler = errorHandler;
8
+ exports.asyncHandler = asyncHandler;
9
+ exports.validateRequired = validateRequired;
10
+ exports.notFoundHandler = notFoundHandler;
11
+ const types_js_1 = require("./types.js");
12
+ // Re-export ApiError for convenience
13
+ var types_js_2 = require("./types.js");
14
+ Object.defineProperty(exports, "ApiError", { enumerable: true, get: function () { return types_js_2.ApiError; } });
15
+ const types_js_3 = require("../scheduler/types.js");
16
+ /**
17
+ * Express error handling middleware
18
+ */
19
+ function errorHandler(err, _req, res, _next) {
20
+ console.error('API Error:', err);
21
+ // Handle ApiError instances
22
+ if (err instanceof types_js_1.ApiError) {
23
+ res.status(err.statusCode).json(err.toResponse());
24
+ return;
25
+ }
26
+ // Handle SchedulerError instances
27
+ if (err instanceof types_js_3.SchedulerError) {
28
+ const statusCode = getStatusCodeForSchedulerError(err.code);
29
+ const response = {
30
+ error: err.message,
31
+ code: mapSchedulerErrorCode(err.code),
32
+ };
33
+ res.status(statusCode).json(response);
34
+ return;
35
+ }
36
+ // Handle generic errors
37
+ const response = {
38
+ error: 'Internal server error',
39
+ code: 'INTERNAL_ERROR',
40
+ };
41
+ res.status(500).json(response);
42
+ }
43
+ /**
44
+ * Map SchedulerError code to HTTP status code
45
+ */
46
+ function getStatusCodeForSchedulerError(code) {
47
+ switch (code) {
48
+ case 'INVALID_CRON':
49
+ case 'JOB_EXISTS':
50
+ return 400;
51
+ case 'JOB_NOT_FOUND':
52
+ return 404;
53
+ case 'JOB_RUNNING':
54
+ return 409;
55
+ default:
56
+ return 500;
57
+ }
58
+ }
59
+ /**
60
+ * Map SchedulerError code to ApiErrorCode
61
+ */
62
+ function mapSchedulerErrorCode(code) {
63
+ switch (code) {
64
+ case 'INVALID_CRON':
65
+ case 'JOB_EXISTS':
66
+ return 'VALIDATION_ERROR';
67
+ case 'JOB_NOT_FOUND':
68
+ return 'NOT_FOUND';
69
+ case 'JOB_RUNNING':
70
+ return 'JOB_RUNNING';
71
+ default:
72
+ return 'INTERNAL_ERROR';
73
+ }
74
+ }
75
+ /**
76
+ * Async handler wrapper to catch promise rejections
77
+ */
78
+ function asyncHandler(fn) {
79
+ return (req, res, next) => {
80
+ Promise.resolve(fn(req, res, next)).catch(next);
81
+ };
82
+ }
83
+ /**
84
+ * Validate required fields in request body
85
+ */
86
+ function validateRequired(body, fields) {
87
+ const missing = fields.filter((field) => body[field] === undefined);
88
+ if (missing.length > 0) {
89
+ throw new types_js_1.ApiError(`Missing required fields: ${missing.join(', ')}`, 400, 'BAD_REQUEST', {
90
+ missing,
91
+ });
92
+ }
93
+ }
94
+ /**
95
+ * 404 handler for unmatched routes
96
+ */
97
+ function notFoundHandler(req, res, _next) {
98
+ const response = {
99
+ error: `Route not found: ${req.method} ${req.path}`,
100
+ code: 'NOT_FOUND',
101
+ };
102
+ res.status(404).json(response);
103
+ }
104
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/api/error-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Heartbeat API router for /api/heartbeat endpoints
3
+ */
4
+ import { Router } from 'express';
5
+ import { CronScheduler } from '../scheduler/index.js';
6
+ import type { LastExecution } from './types.js';
7
+ import type { ExecutionLogStore } from './cron-handler.js';
8
+ /**
9
+ * Default heartbeat prompt for scheduled reports
10
+ */
11
+ export declare const DEFAULT_HEARTBEAT_PROMPT = "\uD83D\uDEA8 \uC885\uD569\uBCF4\uACE0 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8:\n1. MAMA \uB85C\uB4DC: load_checkpoint\n2. \uB370\uC774\uD130 \uC218\uC9D1: \uCD5C\uADFC \uD65C\uB3D9 \uAC80\uC0C9\n3. \uBCF4\uACE0\uC11C \uC791\uC131: \uC694\uC57D \uC0DD\uC131\n4. \uBA54\uC2E0\uC800 \uC804\uC1A1 (\uC124\uC815\uB41C \uACBD\uC6B0)\n5. MAMA \uC800\uC7A5: checkpoint";
12
+ /**
13
+ * Heartbeat execution tracker interface
14
+ */
15
+ export interface HeartbeatTracker {
16
+ /** Get the last heartbeat execution */
17
+ getLastExecution(): Promise<LastExecution | null>;
18
+ /** Record a heartbeat execution */
19
+ recordExecution(execution: LastExecution): Promise<void>;
20
+ }
21
+ /**
22
+ * In-memory heartbeat tracker (placeholder until S6)
23
+ */
24
+ export declare class InMemoryHeartbeatTracker implements HeartbeatTracker {
25
+ private lastExecution;
26
+ getLastExecution(): Promise<LastExecution | null>;
27
+ recordExecution(execution: LastExecution): Promise<void>;
28
+ }
29
+ /**
30
+ * Options for creating heartbeat router
31
+ */
32
+ export interface HeartbeatRouterOptions {
33
+ /** Scheduler instance */
34
+ scheduler: CronScheduler;
35
+ /** Log store for execution logs */
36
+ logStore: ExecutionLogStore;
37
+ /** Heartbeat tracker */
38
+ tracker?: HeartbeatTracker;
39
+ /** Heartbeat execution callback */
40
+ onHeartbeat?: (prompt: string) => Promise<{
41
+ success: boolean;
42
+ error?: string;
43
+ }>;
44
+ }
45
+ /**
46
+ * Create heartbeat API router
47
+ */
48
+ export declare function createHeartbeatRouter(options: HeartbeatRouterOptions): Router;
49
+ //# sourceMappingURL=heartbeat-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat-handler.d.ts","sourceRoot":"","sources":["../../src/api/heartbeat-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAoD,aAAa,EAAE,MAAM,YAAY,CAAC;AAElG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,wBAAwB,oWAKd,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,gBAAgB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAClD,mCAAmC;IACnC,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED;;GAEG;AACH,qBAAa,wBAAyB,YAAW,gBAAgB;IAC/D,OAAO,CAAC,aAAa,CAA8B;IAE7C,gBAAgB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIjD,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/D;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,yBAAyB;IACzB,SAAS,EAAE,aAAa,CAAC;IACzB,mCAAmC;IACnC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,wBAAwB;IACxB,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,mCAAmC;IACnC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAqE7E"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ /**
3
+ * Heartbeat API router for /api/heartbeat endpoints
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.InMemoryHeartbeatTracker = exports.DEFAULT_HEARTBEAT_PROMPT = void 0;
7
+ exports.createHeartbeatRouter = createHeartbeatRouter;
8
+ const express_1 = require("express");
9
+ const error_handler_js_1 = require("./error-handler.js");
10
+ /**
11
+ * Default heartbeat prompt for scheduled reports
12
+ */
13
+ exports.DEFAULT_HEARTBEAT_PROMPT = `🚨 종합보고 체크리스트:
14
+ 1. MAMA 로드: load_checkpoint
15
+ 2. 데이터 수집: 최근 활동 검색
16
+ 3. 보고서 작성: 요약 생성
17
+ 4. 메신저 전송 (설정된 경우)
18
+ 5. MAMA 저장: checkpoint`;
19
+ /**
20
+ * In-memory heartbeat tracker (placeholder until S6)
21
+ */
22
+ class InMemoryHeartbeatTracker {
23
+ lastExecution = null;
24
+ async getLastExecution() {
25
+ return this.lastExecution;
26
+ }
27
+ async recordExecution(execution) {
28
+ this.lastExecution = execution;
29
+ }
30
+ }
31
+ exports.InMemoryHeartbeatTracker = InMemoryHeartbeatTracker;
32
+ /**
33
+ * Create heartbeat API router
34
+ */
35
+ function createHeartbeatRouter(options) {
36
+ const { scheduler, tracker = new InMemoryHeartbeatTracker(), onHeartbeat } = options;
37
+ const router = (0, express_1.Router)();
38
+ // GET /api/heartbeat - Get heartbeat status
39
+ router.get('/', (0, error_handler_js_1.asyncHandler)(async (_req, res) => {
40
+ const jobs = scheduler.listJobs();
41
+ const activeJobs = jobs.filter((j) => j.enabled).length;
42
+ const lastExecution = await tracker.getLastExecution();
43
+ const response = {
44
+ status: activeJobs > 0 ? 'active' : 'inactive',
45
+ active_jobs: activeJobs,
46
+ last_execution: lastExecution,
47
+ };
48
+ res.json(response);
49
+ }));
50
+ // POST /api/heartbeat - Trigger manual heartbeat
51
+ router.post('/', (0, error_handler_js_1.asyncHandler)(async (req, res) => {
52
+ const body = req.body;
53
+ const prompt = body.prompt || exports.DEFAULT_HEARTBEAT_PROMPT;
54
+ const executionId = `heartbeat_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
55
+ const startedAt = Date.now();
56
+ // Execute heartbeat asynchronously
57
+ if (onHeartbeat) {
58
+ // Run asynchronously and track result
59
+ onHeartbeat(prompt)
60
+ .then(async (result) => {
61
+ const execution = {
62
+ id: executionId,
63
+ started_at: startedAt,
64
+ status: result.success ? 'success' : 'failed',
65
+ };
66
+ await tracker.recordExecution(execution);
67
+ })
68
+ .catch(async () => {
69
+ const execution = {
70
+ id: executionId,
71
+ started_at: startedAt,
72
+ status: 'failed',
73
+ };
74
+ await tracker.recordExecution(execution);
75
+ });
76
+ }
77
+ else {
78
+ // No handler, just record as pending
79
+ // The caller is responsible for executing the heartbeat
80
+ const execution = {
81
+ id: executionId,
82
+ started_at: startedAt,
83
+ status: 'success', // Assume success if no handler
84
+ };
85
+ await tracker.recordExecution(execution);
86
+ }
87
+ res.json({ execution_id: executionId, started: true });
88
+ }));
89
+ return router;
90
+ }
91
+ //# sourceMappingURL=heartbeat-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat-handler.js","sourceRoot":"","sources":["../../src/api/heartbeat-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * API module exports
3
+ *
4
+ * Provides HTTP API for cron job management and heartbeat functionality.
5
+ */
6
+ import { type Express, type Router } from 'express';
7
+ import { type ExecutionLogStore } from './cron-handler.js';
8
+ import { type HeartbeatTracker } from './heartbeat-handler.js';
9
+ import { CronScheduler } from '../scheduler/index.js';
10
+ export * from './types.js';
11
+ export type { ExecutionLogStore } from './cron-handler.js';
12
+ export { InMemoryLogStore, ScheduleStoreAdapter } from './cron-handler.js';
13
+ export type { HeartbeatTracker } from './heartbeat-handler.js';
14
+ export { InMemoryHeartbeatTracker, DEFAULT_HEARTBEAT_PROMPT } from './heartbeat-handler.js';
15
+ export { asyncHandler, validateRequired, ApiError } from './error-handler.js';
16
+ /**
17
+ * API server options
18
+ */
19
+ export interface ApiServerOptions {
20
+ /** Scheduler instance */
21
+ scheduler: CronScheduler;
22
+ /** Port to listen on (default: 3848) */
23
+ port?: number;
24
+ /** Log store for execution logs (default: InMemoryLogStore) */
25
+ logStore?: ExecutionLogStore;
26
+ /** Heartbeat tracker (default: InMemoryHeartbeatTracker) */
27
+ heartbeatTracker?: HeartbeatTracker;
28
+ /** Heartbeat execution callback */
29
+ onHeartbeat?: (prompt: string) => Promise<{
30
+ success: boolean;
31
+ error?: string;
32
+ }>;
33
+ }
34
+ /**
35
+ * API server instance
36
+ */
37
+ export interface ApiServer {
38
+ /** Express app instance */
39
+ app: Express;
40
+ /** HTTP server instance */
41
+ server: ReturnType<(typeof import('express'))['application']['listen']> | null;
42
+ /** Start the server */
43
+ start(): Promise<void>;
44
+ /** Stop the server */
45
+ stop(): Promise<void>;
46
+ /** Get the port the server is listening on */
47
+ port: number;
48
+ }
49
+ /**
50
+ * Create and configure the API server
51
+ */
52
+ export declare function createApiServer(options: ApiServerOptions): ApiServer;
53
+ /**
54
+ * Create API routers without starting a server
55
+ * Useful for integrating into an existing Express app
56
+ */
57
+ export declare function createApiRouters(options: ApiServerOptions): {
58
+ cronRouter: Router;
59
+ heartbeatRouter: Router;
60
+ };
61
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAgB,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAsC,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,SAAS,EAAE,aAAa,CAAC;IACzB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,mCAAmC;IACnC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjF;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,2BAA2B;IAC3B,GAAG,EAAE,OAAO,CAAC;IACb,2BAA2B;IAC3B,MAAM,EAAE,UAAU,CAAC,CAAC,cAAc,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC;IAC/E,uBAAuB;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,sBAAsB;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA+FpE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB,CAiBA"}