@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,233 @@
1
+ "use strict";
2
+ /**
3
+ * Session store for messenger conversations
4
+ *
5
+ * Manages conversation sessions with rolling context (history)
6
+ * for cross-platform messenger integration.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SessionStore = void 0;
10
+ const crypto_1 = require("crypto");
11
+ // ============================================================================
12
+ // SessionStore Class
13
+ // ============================================================================
14
+ /**
15
+ * SQLite-backed session store for messenger conversations
16
+ */
17
+ class SessionStore {
18
+ db;
19
+ maxTurns;
20
+ maxResponseLength;
21
+ constructor(db, options = {}) {
22
+ this.db = db;
23
+ this.maxTurns = options.maxTurns ?? 50; // Extended from 10 to 50 for better conversation continuity
24
+ this.maxResponseLength = options.maxResponseLength ?? 500; // Extended from 200 to 500
25
+ this.runMigration();
26
+ }
27
+ /**
28
+ * Run database migration
29
+ */
30
+ runMigration() {
31
+ this.db.exec(`
32
+ CREATE TABLE IF NOT EXISTS messenger_sessions (
33
+ id TEXT PRIMARY KEY,
34
+ source TEXT NOT NULL,
35
+ channel_id TEXT NOT NULL,
36
+ user_id TEXT,
37
+ context TEXT,
38
+ created_at INTEGER,
39
+ last_active INTEGER,
40
+ UNIQUE(source, channel_id)
41
+ );
42
+
43
+ CREATE INDEX IF NOT EXISTS idx_messenger_source_channel
44
+ ON messenger_sessions(source, channel_id);
45
+ `);
46
+ }
47
+ /**
48
+ * Get existing session or create new one
49
+ */
50
+ getOrCreate(source, channelId, userId) {
51
+ const existing = this.db
52
+ .prepare(`
53
+ SELECT * FROM messenger_sessions
54
+ WHERE source = ? AND channel_id = ?
55
+ `)
56
+ .get(source, channelId);
57
+ if (existing) {
58
+ return this.rowToSession(existing);
59
+ }
60
+ // Create new session
61
+ const id = (0, crypto_1.randomUUID)();
62
+ const now = Date.now();
63
+ this.db
64
+ .prepare(`
65
+ INSERT INTO messenger_sessions (id, source, channel_id, user_id, context, created_at, last_active)
66
+ VALUES (?, ?, ?, ?, ?, ?, ?)
67
+ `)
68
+ .run(id, source, channelId, userId || null, '[]', now, now);
69
+ return {
70
+ id,
71
+ source,
72
+ channelId,
73
+ userId,
74
+ context: '[]',
75
+ createdAt: now,
76
+ lastActive: now,
77
+ };
78
+ }
79
+ /**
80
+ * Get session by ID
81
+ */
82
+ getById(sessionId) {
83
+ const row = this.db.prepare('SELECT * FROM messenger_sessions WHERE id = ?').get(sessionId);
84
+ return row ? this.rowToSession(row) : null;
85
+ }
86
+ /**
87
+ * Update session with new conversation turn
88
+ */
89
+ updateSession(sessionId, userMessage, botResponse) {
90
+ const session = this.getById(sessionId);
91
+ if (!session)
92
+ return false;
93
+ // Parse existing context
94
+ let history;
95
+ try {
96
+ history = JSON.parse(session.context || '[]');
97
+ }
98
+ catch {
99
+ history = [];
100
+ }
101
+ // Add new turn
102
+ history.push({
103
+ user: userMessage,
104
+ bot: this.truncate(botResponse, this.maxResponseLength),
105
+ timestamp: Date.now(),
106
+ });
107
+ // Keep only recent turns
108
+ const recentHistory = history.slice(-this.maxTurns);
109
+ // Update database
110
+ const result = this.db
111
+ .prepare(`
112
+ UPDATE messenger_sessions
113
+ SET context = ?, last_active = ?
114
+ WHERE id = ?
115
+ `)
116
+ .run(JSON.stringify(recentHistory), Date.now(), sessionId);
117
+ return result.changes > 0;
118
+ }
119
+ /**
120
+ * Get conversation history for a session
121
+ */
122
+ getHistory(sessionId) {
123
+ const session = this.getById(sessionId);
124
+ if (!session)
125
+ return [];
126
+ try {
127
+ return JSON.parse(session.context || '[]');
128
+ }
129
+ catch {
130
+ return [];
131
+ }
132
+ }
133
+ /**
134
+ * Clear session context (start fresh)
135
+ */
136
+ clearContext(sessionId) {
137
+ const result = this.db
138
+ .prepare(`
139
+ UPDATE messenger_sessions
140
+ SET context = ?, last_active = ?
141
+ WHERE id = ?
142
+ `)
143
+ .run('[]', Date.now(), sessionId);
144
+ return result.changes > 0;
145
+ }
146
+ /**
147
+ * Delete a session
148
+ */
149
+ deleteSession(sessionId) {
150
+ const result = this.db.prepare('DELETE FROM messenger_sessions WHERE id = ?').run(sessionId);
151
+ return result.changes > 0;
152
+ }
153
+ /**
154
+ * List all sessions for a source
155
+ */
156
+ listSessions(source) {
157
+ let stmt;
158
+ if (source) {
159
+ stmt = this.db.prepare('SELECT * FROM messenger_sessions WHERE source = ? ORDER BY last_active DESC');
160
+ return stmt.all(source).map((row) => this.rowToSession(row));
161
+ }
162
+ else {
163
+ stmt = this.db.prepare('SELECT * FROM messenger_sessions ORDER BY last_active DESC');
164
+ return stmt.all().map((row) => this.rowToSession(row));
165
+ }
166
+ }
167
+ /**
168
+ * Delete inactive sessions older than specified age
169
+ */
170
+ cleanupInactiveSessions(maxAgeMs) {
171
+ const cutoff = Date.now() - maxAgeMs;
172
+ const result = this.db
173
+ .prepare('DELETE FROM messenger_sessions WHERE last_active < ?')
174
+ .run(cutoff);
175
+ return result.changes;
176
+ }
177
+ /**
178
+ * Get the most recently active session for a specific source
179
+ */
180
+ getLastActiveSession(source) {
181
+ let stmt;
182
+ let row;
183
+ if (source) {
184
+ stmt = this.db.prepare('SELECT * FROM messenger_sessions WHERE source = ? ORDER BY last_active DESC LIMIT 1');
185
+ row = stmt.get(source);
186
+ }
187
+ else {
188
+ stmt = this.db.prepare('SELECT * FROM messenger_sessions ORDER BY last_active DESC LIMIT 1');
189
+ row = stmt.get();
190
+ }
191
+ return row ? this.rowToSession(row) : null;
192
+ }
193
+ /**
194
+ * Format context as readable string for system prompt
195
+ */
196
+ formatContextForPrompt(sessionId) {
197
+ const history = this.getHistory(sessionId);
198
+ if (history.length === 0) {
199
+ return 'New conversation';
200
+ }
201
+ return history.map((turn) => `User: ${turn.user}\nAssistant: ${turn.bot}`).join('\n\n');
202
+ }
203
+ /**
204
+ * Convert database row to Session object
205
+ */
206
+ rowToSession(row) {
207
+ return {
208
+ id: row.id,
209
+ source: row.source,
210
+ channelId: row.channel_id,
211
+ userId: row.user_id || undefined,
212
+ context: row.context || '[]',
213
+ createdAt: row.created_at,
214
+ lastActive: row.last_active,
215
+ };
216
+ }
217
+ /**
218
+ * Truncate text to specified length
219
+ */
220
+ truncate(text, maxLength) {
221
+ if (text.length <= maxLength)
222
+ return text;
223
+ return text.slice(0, maxLength - 3) + '...';
224
+ }
225
+ /**
226
+ * Close database connection
227
+ */
228
+ close() {
229
+ this.db.close();
230
+ }
231
+ }
232
+ exports.SessionStore = SessionStore;
233
+ //# sourceMappingURL=session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/gateways/session-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Slack Gateway for MAMA Standalone
3
+ *
4
+ * Provides Slack integration using Socket Mode for receiving and responding to messages.
5
+ * Supports both DM and channel mentions with thread context preservation.
6
+ */
7
+ import { MessageRouter } from './message-router.js';
8
+ import type { Gateway, GatewayEventHandler, SlackGatewayConfig, SlackChannelConfig } from './types.js';
9
+ /**
10
+ * Slack Gateway options
11
+ */
12
+ export interface SlackGatewayOptions {
13
+ /** Slack bot token (xoxb-...) */
14
+ botToken: string;
15
+ /** Slack app token for Socket Mode (xapp-...) */
16
+ appToken: string;
17
+ /** Message router for processing messages */
18
+ messageRouter: MessageRouter;
19
+ /** Gateway configuration */
20
+ config?: Partial<SlackGatewayConfig>;
21
+ }
22
+ /**
23
+ * Slack Gateway class
24
+ *
25
+ * Connects to Slack via Socket Mode and routes messages
26
+ * to the MessageRouter for processing.
27
+ */
28
+ export declare class SlackGateway implements Gateway {
29
+ readonly source: "slack";
30
+ private socketClient;
31
+ private webClient;
32
+ private messageRouter;
33
+ private config;
34
+ private eventHandlers;
35
+ private connected;
36
+ constructor(options: SlackGatewayOptions);
37
+ /**
38
+ * Set up Socket Mode event listeners
39
+ */
40
+ private setupEventListeners;
41
+ /**
42
+ * Handle incoming Slack message
43
+ */
44
+ private handleMessage;
45
+ /**
46
+ * Check if bot should respond to this message
47
+ */
48
+ private shouldRespond;
49
+ /**
50
+ * Clean message content (remove mentions)
51
+ */
52
+ private cleanMessageContent;
53
+ /**
54
+ * Send response to Slack (handling length limits and threading)
55
+ */
56
+ private sendResponse;
57
+ /**
58
+ * Emit event to registered handlers
59
+ */
60
+ private emitEvent;
61
+ /**
62
+ * Start the Slack gateway
63
+ */
64
+ start(): Promise<void>;
65
+ /**
66
+ * Stop the Slack gateway
67
+ */
68
+ stop(): Promise<void>;
69
+ /**
70
+ * Check if gateway is connected
71
+ */
72
+ isConnected(): boolean;
73
+ /**
74
+ * Register event handler
75
+ */
76
+ onEvent(handler: GatewayEventHandler): void;
77
+ /**
78
+ * Update gateway configuration
79
+ */
80
+ setConfig(config: Partial<SlackGatewayConfig>): void;
81
+ /**
82
+ * Get current configuration
83
+ */
84
+ getConfig(): SlackGatewayConfig;
85
+ /**
86
+ * Add channel configuration
87
+ */
88
+ addChannelConfig(channelId: string, config: SlackChannelConfig): void;
89
+ }
90
+ //# sourceMappingURL=slack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../src/gateways/slack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EACV,OAAO,EAEP,mBAAmB,EAEnB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAgBpB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,aAAa,EAAE,aAAa,CAAC;IAC7B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACtC;AAED;;;;;GAKG;AACH,qBAAa,YAAa,YAAW,OAAO;IAC1C,QAAQ,CAAC,MAAM,EAAG,OAAO,CAAU;IAEnC,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,mBAAmB;IAoBxC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsD3B;;OAEG;YACW,aAAa;IAgE3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;YACW,YAAY;IAa1B;;OAEG;IACH,OAAO,CAAC,SAAS;IAcjB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAQ3C;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IASpD;;OAEG;IACH,SAAS,IAAI,kBAAkB;IAI/B;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI;CAItE"}
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ /**
3
+ * Slack Gateway for MAMA Standalone
4
+ *
5
+ * Provides Slack integration using Socket Mode for receiving and responding to messages.
6
+ * Supports both DM and channel mentions with thread context preservation.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SlackGateway = void 0;
10
+ const socket_mode_1 = require("@slack/socket-mode");
11
+ const web_api_1 = require("@slack/web-api");
12
+ const message_splitter_js_1 = require("./message-splitter.js");
13
+ /**
14
+ * Slack Gateway class
15
+ *
16
+ * Connects to Slack via Socket Mode and routes messages
17
+ * to the MessageRouter for processing.
18
+ */
19
+ class SlackGateway {
20
+ source = 'slack';
21
+ socketClient;
22
+ webClient;
23
+ messageRouter;
24
+ config;
25
+ eventHandlers = [];
26
+ connected = false;
27
+ constructor(options) {
28
+ this.messageRouter = options.messageRouter;
29
+ this.config = {
30
+ enabled: true,
31
+ botToken: options.botToken,
32
+ appToken: options.appToken,
33
+ channels: options.config?.channels || {},
34
+ };
35
+ // Create Socket Mode client for real-time events
36
+ this.socketClient = new socket_mode_1.SocketModeClient({
37
+ appToken: options.appToken,
38
+ });
39
+ // Create Web client for API calls
40
+ this.webClient = new web_api_1.WebClient(options.botToken);
41
+ this.setupEventListeners();
42
+ }
43
+ /**
44
+ * Set up Socket Mode event listeners
45
+ */
46
+ setupEventListeners() {
47
+ // Connection events
48
+ this.socketClient.on('connected', () => {
49
+ console.log('Slack gateway connected via Socket Mode');
50
+ this.connected = true;
51
+ this.emitEvent({
52
+ type: 'connected',
53
+ source: 'slack',
54
+ timestamp: new Date(),
55
+ });
56
+ });
57
+ this.socketClient.on('disconnected', () => {
58
+ this.connected = false;
59
+ this.emitEvent({
60
+ type: 'disconnected',
61
+ source: 'slack',
62
+ timestamp: new Date(),
63
+ });
64
+ });
65
+ // Direct message events
66
+ this.socketClient.on('message', async ({ event, ack }) => {
67
+ try {
68
+ await ack();
69
+ await this.handleMessage(event, false);
70
+ }
71
+ catch (error) {
72
+ console.error('Error handling Slack message:', error);
73
+ this.emitEvent({
74
+ type: 'error',
75
+ source: 'slack',
76
+ timestamp: new Date(),
77
+ error: error instanceof Error ? error : new Error(String(error)),
78
+ });
79
+ }
80
+ });
81
+ // App mention events (when @bot is mentioned in a channel)
82
+ this.socketClient.on('app_mention', async ({ event, ack }) => {
83
+ try {
84
+ await ack();
85
+ await this.handleMessage(event, true);
86
+ }
87
+ catch (error) {
88
+ console.error('Error handling Slack mention:', error);
89
+ this.emitEvent({
90
+ type: 'error',
91
+ source: 'slack',
92
+ timestamp: new Date(),
93
+ error: error instanceof Error ? error : new Error(String(error)),
94
+ });
95
+ }
96
+ });
97
+ }
98
+ /**
99
+ * Handle incoming Slack message
100
+ */
101
+ async handleMessage(event, isMention) {
102
+ // Ignore bot messages
103
+ if (event.bot_id)
104
+ return;
105
+ const isDM = event.channel_type === 'im';
106
+ // Check if we should respond to this message
107
+ if (!this.shouldRespond(event, isDM, isMention)) {
108
+ return;
109
+ }
110
+ // Emit message received event
111
+ this.emitEvent({
112
+ type: 'message_received',
113
+ source: 'slack',
114
+ timestamp: new Date(),
115
+ data: {
116
+ channelId: event.channel,
117
+ userId: event.user,
118
+ isDM,
119
+ isMention,
120
+ hasThread: !!event.thread_ts,
121
+ },
122
+ });
123
+ // Remove mentions from message content
124
+ const cleanContent = this.cleanMessageContent(event.text);
125
+ if (!cleanContent.trim()) {
126
+ return; // Don't process empty messages
127
+ }
128
+ // Normalize message for router
129
+ const normalizedMessage = {
130
+ source: 'slack',
131
+ channelId: event.channel,
132
+ userId: event.user,
133
+ text: cleanContent,
134
+ metadata: {
135
+ threadTs: event.thread_ts || event.ts,
136
+ messageId: event.ts,
137
+ },
138
+ };
139
+ // Process through message router
140
+ const result = await this.messageRouter.process(normalizedMessage);
141
+ // Send response in thread
142
+ await this.sendResponse(event, result.response);
143
+ // Emit message sent event
144
+ this.emitEvent({
145
+ type: 'message_sent',
146
+ source: 'slack',
147
+ timestamp: new Date(),
148
+ data: {
149
+ channelId: event.channel,
150
+ responseLength: result.response.length,
151
+ duration: result.duration,
152
+ threadTs: event.thread_ts || event.ts,
153
+ },
154
+ });
155
+ }
156
+ /**
157
+ * Check if bot should respond to this message
158
+ */
159
+ shouldRespond(event, isDM, isMention) {
160
+ // Always respond to DMs
161
+ if (isDM)
162
+ return true;
163
+ // For channel messages, check if mention is required
164
+ const channelConfig = this.config.channels?.[event.channel];
165
+ if (channelConfig) {
166
+ // Channel-specific config
167
+ if (channelConfig.requireMention === false) {
168
+ return true; // No mention required for this channel
169
+ }
170
+ return isMention;
171
+ }
172
+ // Default: require mention for channel messages
173
+ return isMention;
174
+ }
175
+ /**
176
+ * Clean message content (remove mentions)
177
+ */
178
+ cleanMessageContent(content) {
179
+ // Remove user/bot mentions (<@U12345> or <@W12345>)
180
+ return content
181
+ .replace(/<@[UW]\w+>/g, '')
182
+ .replace(/<@[UW]\w+\|[^>]+>/g, '') // Mentions with display name
183
+ .trim();
184
+ }
185
+ /**
186
+ * Send response to Slack (handling length limits and threading)
187
+ */
188
+ async sendResponse(originalEvent, response) {
189
+ const threadTs = originalEvent.thread_ts || originalEvent.ts;
190
+ const chunks = (0, message_splitter_js_1.splitForSlack)(response);
191
+ for (const chunk of chunks) {
192
+ await this.webClient.chat.postMessage({
193
+ channel: originalEvent.channel,
194
+ text: chunk,
195
+ thread_ts: threadTs, // Always reply in thread
196
+ });
197
+ }
198
+ }
199
+ /**
200
+ * Emit event to registered handlers
201
+ */
202
+ emitEvent(event) {
203
+ for (const handler of this.eventHandlers) {
204
+ try {
205
+ handler(event);
206
+ }
207
+ catch (error) {
208
+ console.error('Error in gateway event handler:', error);
209
+ }
210
+ }
211
+ }
212
+ // ============================================================================
213
+ // Gateway Interface Implementation
214
+ // ============================================================================
215
+ /**
216
+ * Start the Slack gateway
217
+ */
218
+ async start() {
219
+ if (this.connected) {
220
+ console.log('Slack gateway already connected');
221
+ return;
222
+ }
223
+ await this.socketClient.start();
224
+ }
225
+ /**
226
+ * Stop the Slack gateway
227
+ */
228
+ async stop() {
229
+ if (!this.connected) {
230
+ return;
231
+ }
232
+ await this.socketClient.disconnect();
233
+ this.connected = false;
234
+ this.emitEvent({
235
+ type: 'disconnected',
236
+ source: 'slack',
237
+ timestamp: new Date(),
238
+ });
239
+ }
240
+ /**
241
+ * Check if gateway is connected
242
+ */
243
+ isConnected() {
244
+ return this.connected;
245
+ }
246
+ /**
247
+ * Register event handler
248
+ */
249
+ onEvent(handler) {
250
+ this.eventHandlers.push(handler);
251
+ }
252
+ // ============================================================================
253
+ // Configuration
254
+ // ============================================================================
255
+ /**
256
+ * Update gateway configuration
257
+ */
258
+ setConfig(config) {
259
+ if (config.channels) {
260
+ this.config.channels = { ...this.config.channels, ...config.channels };
261
+ }
262
+ if (config.enabled !== undefined) {
263
+ this.config.enabled = config.enabled;
264
+ }
265
+ }
266
+ /**
267
+ * Get current configuration
268
+ */
269
+ getConfig() {
270
+ return { ...this.config };
271
+ }
272
+ /**
273
+ * Add channel configuration
274
+ */
275
+ addChannelConfig(channelId, config) {
276
+ this.config.channels = this.config.channels || {};
277
+ this.config.channels[channelId] = config;
278
+ }
279
+ }
280
+ exports.SlackGateway = SlackGateway;
281
+ //# sourceMappingURL=slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/gateways/slack.ts"],"names":[],"mappings":"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"}