@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,259 @@
1
+ "use strict";
2
+ /**
3
+ * Schedule persistence store using SQLite
4
+ *
5
+ * Stores cron job definitions and execution logs in SQLite database.
6
+ * Supports server restart recovery and execution history tracking.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ScheduleStore = void 0;
10
+ const crypto_1 = require("crypto");
11
+ // ============================================================================
12
+ // ScheduleStore Class
13
+ // ============================================================================
14
+ /**
15
+ * SQLite-backed store for schedules and execution logs
16
+ */
17
+ class ScheduleStore {
18
+ db;
19
+ constructor(db) {
20
+ this.db = db;
21
+ this.runMigration();
22
+ }
23
+ /**
24
+ * Run database migration to create tables
25
+ */
26
+ runMigration() {
27
+ // Enable foreign keys
28
+ this.db.pragma('foreign_keys = ON');
29
+ this.db.exec(`
30
+ -- schedules table
31
+ CREATE TABLE IF NOT EXISTS schedules (
32
+ id TEXT PRIMARY KEY,
33
+ name TEXT NOT NULL,
34
+ cron_expr TEXT NOT NULL,
35
+ prompt TEXT NOT NULL,
36
+ enabled INTEGER DEFAULT 1,
37
+ last_run INTEGER,
38
+ next_run INTEGER,
39
+ created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)
40
+ );
41
+
42
+ -- schedule_logs table
43
+ CREATE TABLE IF NOT EXISTS schedule_logs (
44
+ id TEXT PRIMARY KEY,
45
+ schedule_id TEXT NOT NULL REFERENCES schedules(id) ON DELETE CASCADE,
46
+ started_at INTEGER NOT NULL,
47
+ finished_at INTEGER,
48
+ status TEXT NOT NULL,
49
+ output TEXT,
50
+ error TEXT
51
+ );
52
+
53
+ -- Indexes
54
+ CREATE INDEX IF NOT EXISTS idx_schedules_enabled ON schedules(enabled);
55
+ CREATE INDEX IF NOT EXISTS idx_schedule_logs_schedule ON schedule_logs(schedule_id);
56
+ CREATE INDEX IF NOT EXISTS idx_schedule_logs_started ON schedule_logs(started_at DESC);
57
+ `);
58
+ }
59
+ // ==========================================================================
60
+ // Schedule CRUD Operations
61
+ // ==========================================================================
62
+ /**
63
+ * Create a new schedule
64
+ */
65
+ createJob(input) {
66
+ const id = (0, crypto_1.randomUUID)();
67
+ const stmt = this.db.prepare(`
68
+ INSERT INTO schedules (id, name, cron_expr, prompt, enabled, next_run)
69
+ VALUES (?, ?, ?, ?, ?, ?)
70
+ `);
71
+ stmt.run(id, input.name, input.cron_expr, input.prompt, input.enabled ? 1 : 0, input.next_run);
72
+ return id;
73
+ }
74
+ /**
75
+ * Get a schedule by ID
76
+ */
77
+ getJob(id) {
78
+ const stmt = this.db.prepare('SELECT * FROM schedules WHERE id = ?');
79
+ const row = stmt.get(id);
80
+ return row ? this.rowToSchedule(row) : null;
81
+ }
82
+ /**
83
+ * List all schedules
84
+ */
85
+ listJobs() {
86
+ const stmt = this.db.prepare('SELECT * FROM schedules ORDER BY created_at DESC');
87
+ const rows = stmt.all();
88
+ return rows.map((row) => this.rowToSchedule(row));
89
+ }
90
+ /**
91
+ * List only enabled schedules
92
+ */
93
+ listEnabledJobs() {
94
+ const stmt = this.db.prepare('SELECT * FROM schedules WHERE enabled = 1 ORDER BY created_at DESC');
95
+ const rows = stmt.all();
96
+ return rows.map((row) => this.rowToSchedule(row));
97
+ }
98
+ /**
99
+ * Update a schedule
100
+ */
101
+ updateJob(id, updates) {
102
+ const fields = [];
103
+ const values = [];
104
+ if (updates.name !== undefined) {
105
+ fields.push('name = ?');
106
+ values.push(updates.name);
107
+ }
108
+ if (updates.cron_expr !== undefined) {
109
+ fields.push('cron_expr = ?');
110
+ values.push(updates.cron_expr);
111
+ }
112
+ if (updates.prompt !== undefined) {
113
+ fields.push('prompt = ?');
114
+ values.push(updates.prompt);
115
+ }
116
+ if (updates.enabled !== undefined) {
117
+ fields.push('enabled = ?');
118
+ values.push(updates.enabled ? 1 : 0);
119
+ }
120
+ if (updates.last_run !== undefined) {
121
+ fields.push('last_run = ?');
122
+ values.push(updates.last_run);
123
+ }
124
+ if (updates.next_run !== undefined) {
125
+ fields.push('next_run = ?');
126
+ values.push(updates.next_run);
127
+ }
128
+ if (fields.length === 0)
129
+ return false;
130
+ values.push(id);
131
+ const stmt = this.db.prepare(`UPDATE schedules SET ${fields.join(', ')} WHERE id = ?`);
132
+ const result = stmt.run(...values);
133
+ return result.changes > 0;
134
+ }
135
+ /**
136
+ * Delete a schedule (cascade deletes logs)
137
+ */
138
+ deleteJob(id) {
139
+ const stmt = this.db.prepare('DELETE FROM schedules WHERE id = ?');
140
+ const result = stmt.run(id);
141
+ return result.changes > 0;
142
+ }
143
+ // ==========================================================================
144
+ // Log Operations
145
+ // ==========================================================================
146
+ /**
147
+ * Log the start of a schedule execution
148
+ */
149
+ logStart(scheduleId) {
150
+ const id = (0, crypto_1.randomUUID)();
151
+ const now = Date.now();
152
+ const stmt = this.db.prepare(`
153
+ INSERT INTO schedule_logs (id, schedule_id, started_at, status)
154
+ VALUES (?, ?, ?, 'running')
155
+ `);
156
+ stmt.run(id, scheduleId, now);
157
+ // Update last_run on schedule
158
+ this.updateJob(scheduleId, { last_run: now });
159
+ return id;
160
+ }
161
+ /**
162
+ * Log the finish of a schedule execution
163
+ */
164
+ logFinish(logId, status, output, error) {
165
+ const stmt = this.db.prepare(`
166
+ UPDATE schedule_logs
167
+ SET finished_at = ?, status = ?, output = ?, error = ?
168
+ WHERE id = ?
169
+ `);
170
+ const result = stmt.run(Date.now(), status, output || null, error || null, logId);
171
+ return result.changes > 0;
172
+ }
173
+ /**
174
+ * Get execution logs for a schedule
175
+ */
176
+ getLogs(scheduleId, limit = 20, offset = 0) {
177
+ const stmt = this.db.prepare(`
178
+ SELECT * FROM schedule_logs
179
+ WHERE schedule_id = ?
180
+ ORDER BY started_at DESC
181
+ LIMIT ? OFFSET ?
182
+ `);
183
+ const rows = stmt.all(scheduleId, limit, offset);
184
+ return rows.map((row) => this.rowToLog(row));
185
+ }
186
+ /**
187
+ * Get the last execution for a schedule
188
+ */
189
+ getLastExecution(scheduleId) {
190
+ const stmt = this.db.prepare(`
191
+ SELECT * FROM schedule_logs
192
+ WHERE schedule_id = ?
193
+ ORDER BY started_at DESC
194
+ LIMIT 1
195
+ `);
196
+ const row = stmt.get(scheduleId);
197
+ return row ? this.rowToLog(row) : null;
198
+ }
199
+ /**
200
+ * Get the last execution across all schedules (for heartbeat status)
201
+ */
202
+ getLastExecutionGlobal() {
203
+ const stmt = this.db.prepare(`
204
+ SELECT * FROM schedule_logs
205
+ ORDER BY started_at DESC
206
+ LIMIT 1
207
+ `);
208
+ const row = stmt.get();
209
+ return row ? this.rowToLog(row) : null;
210
+ }
211
+ /**
212
+ * Get a specific log entry by ID
213
+ */
214
+ getLog(logId) {
215
+ const stmt = this.db.prepare('SELECT * FROM schedule_logs WHERE id = ?');
216
+ const row = stmt.get(logId);
217
+ return row ? this.rowToLog(row) : null;
218
+ }
219
+ // ==========================================================================
220
+ // Utility Methods
221
+ // ==========================================================================
222
+ /**
223
+ * Convert database row to Schedule object
224
+ */
225
+ rowToSchedule(row) {
226
+ return {
227
+ id: row.id,
228
+ name: row.name,
229
+ cron_expr: row.cron_expr,
230
+ prompt: row.prompt,
231
+ enabled: row.enabled === 1,
232
+ last_run: row.last_run,
233
+ next_run: row.next_run,
234
+ created_at: row.created_at,
235
+ };
236
+ }
237
+ /**
238
+ * Convert database row to ScheduleLog object
239
+ */
240
+ rowToLog(row) {
241
+ return {
242
+ id: row.id,
243
+ schedule_id: row.schedule_id,
244
+ started_at: row.started_at,
245
+ finished_at: row.finished_at,
246
+ status: row.status,
247
+ output: row.output,
248
+ error: row.error,
249
+ };
250
+ }
251
+ /**
252
+ * Close the database connection
253
+ */
254
+ close() {
255
+ this.db.close();
256
+ }
257
+ }
258
+ exports.ScheduleStore = ScheduleStore;
259
+ //# sourceMappingURL=schedule-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-store.js","sourceRoot":"","sources":["../../src/scheduler/schedule-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Token Keep-Alive Scheduler
3
+ *
4
+ * Periodically runs Claude CLI to keep OAuth token refreshed.
5
+ * Prevents token expiration during long idle periods.
6
+ *
7
+ * Default: Every 6 hours
8
+ */
9
+ export interface TokenKeepAliveOptions {
10
+ /** Interval in milliseconds (default: 6 hours) */
11
+ intervalMs?: number;
12
+ /** Callback on successful refresh */
13
+ onRefresh?: () => void;
14
+ /** Callback on refresh error */
15
+ onError?: (error: Error) => void;
16
+ }
17
+ export declare class TokenKeepAlive {
18
+ private readonly intervalMs;
19
+ private readonly onRefresh?;
20
+ private readonly onError?;
21
+ private timer;
22
+ private lastRefresh;
23
+ constructor(options?: TokenKeepAliveOptions);
24
+ /**
25
+ * Start the keep-alive scheduler
26
+ */
27
+ start(): void;
28
+ /**
29
+ * Stop the keep-alive scheduler
30
+ */
31
+ stop(): void;
32
+ /**
33
+ * Manually refresh the token
34
+ */
35
+ refresh(): Promise<boolean>;
36
+ /**
37
+ * Get last refresh timestamp
38
+ */
39
+ getLastRefresh(): number | null;
40
+ /**
41
+ * Check if keep-alive is running
42
+ */
43
+ isRunning(): boolean;
44
+ /**
45
+ * Get time until next refresh (in milliseconds)
46
+ */
47
+ getTimeUntilNextRefresh(): number | null;
48
+ }
49
+ //# sourceMappingURL=token-keep-alive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-keep-alive.d.ts","sourceRoot":"","sources":["../../src/scheduler/token-keep-alive.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,gCAAgC;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAyB;IAClD,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,WAAW,CAAuB;gBAE9B,OAAO,GAAE,qBAA0B;IAM/C;;OAEG;IACH,KAAK,IAAI,IAAI;IAwBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAiBjC;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,uBAAuB,IAAI,MAAM,GAAG,IAAI;CAOzC"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ /**
3
+ * Token Keep-Alive Scheduler
4
+ *
5
+ * Periodically runs Claude CLI to keep OAuth token refreshed.
6
+ * Prevents token expiration during long idle periods.
7
+ *
8
+ * Default: Every 6 hours
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.TokenKeepAlive = void 0;
12
+ const node_child_process_1 = require("node:child_process");
13
+ const node_util_1 = require("node:util");
14
+ const execAsync = (0, node_util_1.promisify)(node_child_process_1.exec);
15
+ const DEFAULT_INTERVAL_MS = 6 * 60 * 60 * 1000; // 6 hours
16
+ class TokenKeepAlive {
17
+ intervalMs;
18
+ onRefresh;
19
+ onError;
20
+ timer = null;
21
+ lastRefresh = null;
22
+ constructor(options = {}) {
23
+ this.intervalMs = options.intervalMs ?? DEFAULT_INTERVAL_MS;
24
+ this.onRefresh = options.onRefresh;
25
+ this.onError = options.onError;
26
+ }
27
+ /**
28
+ * Start the keep-alive scheduler
29
+ */
30
+ start() {
31
+ if (this.timer) {
32
+ console.log('[TokenKeepAlive] Already running');
33
+ return;
34
+ }
35
+ // Run immediately on start to ensure token is valid
36
+ this.refresh().catch(() => {
37
+ // Ignore initial error - will retry on interval
38
+ });
39
+ this.timer = setInterval(() => {
40
+ this.refresh().catch(() => {
41
+ // Error already logged in refresh()
42
+ });
43
+ }, this.intervalMs);
44
+ // Don't prevent process exit
45
+ this.timer.unref();
46
+ const hours = Math.round(this.intervalMs / (60 * 60 * 1000));
47
+ console.log(`[TokenKeepAlive] Started (every ${hours} hours)`);
48
+ }
49
+ /**
50
+ * Stop the keep-alive scheduler
51
+ */
52
+ stop() {
53
+ if (this.timer) {
54
+ clearInterval(this.timer);
55
+ this.timer = null;
56
+ console.log('[TokenKeepAlive] Stopped');
57
+ }
58
+ }
59
+ /**
60
+ * Manually refresh the token
61
+ */
62
+ async refresh() {
63
+ try {
64
+ // Run simple claude command to trigger token refresh
65
+ await execAsync('claude --version', { timeout: 30000 });
66
+ this.lastRefresh = Date.now();
67
+ console.log(`[TokenKeepAlive] Token refreshed at ${new Date().toISOString()}`);
68
+ this.onRefresh?.();
69
+ return true;
70
+ }
71
+ catch (error) {
72
+ const err = error instanceof Error ? error : new Error(String(error));
73
+ console.error(`[TokenKeepAlive] Refresh failed: ${err.message}`);
74
+ this.onError?.(err);
75
+ return false;
76
+ }
77
+ }
78
+ /**
79
+ * Get last refresh timestamp
80
+ */
81
+ getLastRefresh() {
82
+ return this.lastRefresh;
83
+ }
84
+ /**
85
+ * Check if keep-alive is running
86
+ */
87
+ isRunning() {
88
+ return this.timer !== null;
89
+ }
90
+ /**
91
+ * Get time until next refresh (in milliseconds)
92
+ */
93
+ getTimeUntilNextRefresh() {
94
+ if (!this.timer || !this.lastRefresh) {
95
+ return null;
96
+ }
97
+ const elapsed = Date.now() - this.lastRefresh;
98
+ return Math.max(0, this.intervalMs - elapsed);
99
+ }
100
+ }
101
+ exports.TokenKeepAlive = TokenKeepAlive;
102
+ //# sourceMappingURL=token-keep-alive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-keep-alive.js","sourceRoot":"","sources":["../../src/scheduler/token-keep-alive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Type definitions for Cron Scheduler
3
+ */
4
+ /**
5
+ * Job execution status
6
+ */
7
+ export type JobStatus = 'idle' | 'running' | 'completed' | 'failed';
8
+ /**
9
+ * Job configuration for registration
10
+ */
11
+ export interface JobConfig {
12
+ /** Unique job identifier */
13
+ id: string;
14
+ /** Human-readable job name */
15
+ name: string;
16
+ /** Cron expression (e.g., "0/30 * * * *" for every 30 minutes) */
17
+ cronExpr: string;
18
+ /** Prompt to send to Agent Loop */
19
+ prompt: string;
20
+ /** Whether job is enabled (default: true) */
21
+ enabled?: boolean;
22
+ }
23
+ /**
24
+ * Full job information including runtime state
25
+ */
26
+ export interface CronJob extends JobConfig {
27
+ /** Whether job is currently enabled */
28
+ enabled: boolean;
29
+ /** Whether job is currently running */
30
+ isRunning: boolean;
31
+ /** Last execution time */
32
+ lastRun?: Date;
33
+ /** Next scheduled execution time */
34
+ nextRun?: Date;
35
+ /** Last execution result */
36
+ lastResult?: JobResult;
37
+ }
38
+ /**
39
+ * Job execution result
40
+ */
41
+ export interface JobResult {
42
+ /** Whether execution was successful */
43
+ success: boolean;
44
+ /** Execution start time */
45
+ startedAt: Date;
46
+ /** Execution end time */
47
+ completedAt: Date;
48
+ /** Duration in milliseconds */
49
+ duration: number;
50
+ /** Error message if failed */
51
+ error?: string;
52
+ /** Agent loop response */
53
+ response?: string;
54
+ }
55
+ /**
56
+ * Scheduler options
57
+ */
58
+ export interface SchedulerOptions {
59
+ /** Timezone for cron expressions (default: local) */
60
+ timezone?: string;
61
+ /** Whether to run missed jobs on startup (default: false) */
62
+ runMissedOnStartup?: boolean;
63
+ /** Maximum concurrent jobs (default: 1) */
64
+ maxConcurrent?: number;
65
+ }
66
+ /**
67
+ * Job event types
68
+ */
69
+ export type JobEventType = 'started' | 'completed' | 'failed' | 'skipped';
70
+ /**
71
+ * Job event for callbacks
72
+ */
73
+ export interface JobEvent {
74
+ type: JobEventType;
75
+ jobId: string;
76
+ timestamp: Date;
77
+ result?: JobResult;
78
+ reason?: string;
79
+ }
80
+ /**
81
+ * Job event handler
82
+ */
83
+ export type JobEventHandler = (event: JobEvent) => void;
84
+ /**
85
+ * Scheduler error codes
86
+ */
87
+ export type SchedulerErrorCode = 'INVALID_CRON' | 'JOB_NOT_FOUND' | 'JOB_EXISTS' | 'JOB_RUNNING' | 'SCHEDULER_ERROR';
88
+ /**
89
+ * Custom error class for scheduler errors
90
+ */
91
+ export declare class SchedulerError extends Error {
92
+ readonly code: SchedulerErrorCode;
93
+ readonly cause?: Error | undefined;
94
+ constructor(message: string, code: SchedulerErrorCode, cause?: Error | undefined);
95
+ }
96
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,OAAQ,SAAQ,SAAS;IACxC,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,oCAAoC;IACpC,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,4BAA4B;IAC5B,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,SAAS,EAAE,IAAI,CAAC;IAChB,yBAAyB;IACzB,WAAW,EAAE,IAAI,CAAC;IAClB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,eAAe,GACf,YAAY,GACZ,aAAa,GACb,iBAAiB,CAAC;AAEtB;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;aAGrB,IAAI,EAAE,kBAAkB;aACxB,KAAK,CAAC,EAAE,KAAK;gBAF7B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,kBAAkB,EACxB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for Cron Scheduler
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SchedulerError = void 0;
7
+ /**
8
+ * Custom error class for scheduler errors
9
+ */
10
+ class SchedulerError extends Error {
11
+ code;
12
+ cause;
13
+ constructor(message, code, cause) {
14
+ super(message);
15
+ this.code = code;
16
+ this.cause = cause;
17
+ this.name = 'SchedulerError';
18
+ }
19
+ }
20
+ exports.SchedulerError = SchedulerError;
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAoGH;;GAEG;AACH,MAAa,cAAe,SAAQ,KAAK;IAGrB;IACA;IAHlB,YACE,OAAe,EACC,IAAwB,EACxB,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAoB;QACxB,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AATD,wCASC"}
@@ -0,0 +1,2 @@
1
+ export declare const SETUP_SYSTEM_PROMPT = "You are MAMA Setup Assistant. Help users configure MAMA Standalone step by step.\n\n## Your Role\n\nGuide users through setting up MAMA Standalone by:\n1. Understanding what platform they want to use (Discord, Slack, etc.)\n2. Walking them through creating bots on those platforms\n3. Collecting tokens/credentials\n4. Validating and saving configuration\n5. Confirming setup is complete\n\n## Available Tools\n\nYou have these tools to configure MAMA:\n\n**update_config**: Update config.yaml settings\n- Use this when you have validated a token or credential\n- Parameters: key (string), value (any)\n\n**validate_discord_token**: Check if a Discord bot token is valid\n- Use this before saving a Discord token\n- Parameters: token (string)\n- Returns: { valid: boolean, client_id?: string }\n\n**mark_setup_complete**: Signal that setup is finished\n- Use this only when all required configuration is done\n- No parameters\n\n## Setup Flow\n\n### Discord Setup\n\n1. Ask if they want to set up Discord bot\n2. Guide them:\n - Go to https://discord.com/developers/applications\n - Click \"New Application\"\n - Give it a name (e.g., \"MAMA Bot\")\n - Go to \"Bot\" tab\n - Click \"Reset Token\" and copy it\n3. Ask them to paste the token\n4. Validate the token using validate_discord_token\n5. If valid, save it:\n ```\n update_config(\"discord.token\", \"MTQ2NDg4...\")\n update_config(\"discord.enabled\", true)\n ```\n6. Generate invite link: https://discord.com/oauth2/authorize?client_id=CLIENT_ID&permissions=8&scope=bot\n7. Ask them to invite the bot to their server\n8. Ask for the channel ID where they want MAMA to respond\n9. Save channel ID:\n ```\n update_config(\"discord.default_channel\", \"1464890972...\")\n ```\n\n### Slack Setup\n\n1. Ask if they want to set up Slack bot\n2. Guide them:\n - Go to https://api.slack.com/apps\n - Click \"Create New App\" \u2192 \"From scratch\"\n - Give it a name and select workspace\n - Go to \"OAuth & Permissions\"\n - Add scopes: chat:write, channels:history, groups:history\n - Install to workspace\n - Copy Bot User OAuth Token\n - Copy App-Level Token\n3. Save tokens:\n ```\n update_config(\"slack.bot_token\", \"xoxb-...\")\n update_config(\"slack.app_token\", \"xapp-...\")\n update_config(\"slack.enabled\", true)\n ```\n\n### Completion\n\nAfter setup is done:\n1. Summarize what was configured\n2. Tell them to run: mama start\n3. Explain how to use MAMA (mention bot in Discord/Slack)\n4. Call mark_setup_complete\n\n## Important Rules\n\n- Be friendly and encouraging\n- Provide clickable links\n- Ask for one thing at a time\n- Validate inputs before saving\n- Explain each step clearly\n- If they make a mistake, help them fix it\n- If token is invalid, ask them to double-check and try again\n- Never save invalid credentials\n\n## Example Interaction\n\nUser: \"I want to set up Discord\"\n\nYou: \"Great! Let's set up a Discord bot for MAMA. \n\nFirst, you'll need to create a Discord application:\n1. Go to https://discord.com/developers/applications\n2. Click 'New Application'\n3. Give it a name like 'MAMA Bot'\n4. Go to the 'Bot' tab\n5. Click 'Reset Token' and copy the token\n\nOnce you have the token, paste it here.\"\n\nUser: \"MTQ2NDg4OTAzNjI4MjkyNTIwMw...\"\n\nYou: [validate token] \"\u2713 Token is valid! I've saved it to your configuration.\n\nNow let's invite the bot to your server:\nhttps://discord.com/oauth2/authorize?client_id=1464889036282925203&permissions=8&scope=bot\n\nClick that link and select your server. After that, tell me the channel ID where you want MAMA to respond.\"\n\nUser: \"1464890972386365473\"\n\nYou: [save channel] \"Perfect! Your Discord bot is now configured.\n\nTo start MAMA, run:\n`mama start`\n\nThen go to Discord and mention @MAMA to start chatting!\n\n[mark_setup_complete]\"\n\n## Tone\n\n- Friendly but professional\n- Match the user's language (will be specified in system prompt)\n- Use emojis sparingly (\u2713, \uD83C\uDF89 for success moments)\n- Keep responses concise but complete\n";
2
+ //# sourceMappingURL=setup-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-prompt.d.ts","sourceRoot":"","sources":["../../src/setup/setup-prompt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,8+HAqI/B,CAAC"}