@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,272 @@
1
+ "use strict";
2
+ /**
3
+ * Session Pool - Claude CLI Session Reuse Manager
4
+ *
5
+ * Manages Claude CLI session IDs per channel to enable conversation continuity.
6
+ * Instead of creating new sessions for each message, reuses existing sessions
7
+ * so Claude CLI maintains its own conversation history.
8
+ *
9
+ * Benefits:
10
+ * - 6x token reduction (no manual history injection needed)
11
+ * - Natural conversation flow (Claude remembers context)
12
+ * - Automatic summarization by Claude when context fills up
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SessionPool = void 0;
16
+ exports.getSessionPool = getSessionPool;
17
+ exports.setSessionPool = setSessionPool;
18
+ exports.buildChannelKey = buildChannelKey;
19
+ const crypto_1 = require("crypto");
20
+ /**
21
+ * Context window threshold (80% of 200K)
22
+ * When exceeded, session will be reset on next request
23
+ */
24
+ const CONTEXT_THRESHOLD_TOKENS = 160000;
25
+ const DEFAULT_SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
26
+ const DEFAULT_MAX_SESSIONS = 100;
27
+ const DEFAULT_CLEANUP_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
28
+ /**
29
+ * Session Pool for Claude CLI session management
30
+ *
31
+ * Key design:
32
+ * - Channel key format: "{source}:{channelId}" (e.g., "discord:123456")
33
+ * - Sessions expire after timeout (default 30 min)
34
+ * - Automatic cleanup of stale sessions
35
+ */
36
+ class SessionPool {
37
+ sessions = new Map();
38
+ config;
39
+ cleanupTimer = null;
40
+ constructor(config = {}) {
41
+ this.config = {
42
+ sessionTimeoutMs: config.sessionTimeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS,
43
+ maxSessions: config.maxSessions ?? DEFAULT_MAX_SESSIONS,
44
+ cleanupIntervalMs: config.cleanupIntervalMs ?? DEFAULT_CLEANUP_INTERVAL_MS,
45
+ };
46
+ // Start periodic cleanup
47
+ this.startCleanupTimer();
48
+ }
49
+ /**
50
+ * Get or create session ID for a channel
51
+ *
52
+ * With --no-session-persistence flag, Claude CLI doesn't lock session IDs.
53
+ * This allows session reuse for conversation continuity.
54
+ *
55
+ * Auto-resets session when context window reaches 80% (160K tokens).
56
+ *
57
+ * @param channelKey - Channel identifier (format: "{source}:{channelId}")
58
+ * @returns Object with sessionId and isNew flag
59
+ */
60
+ getSession(channelKey) {
61
+ const existing = this.sessions.get(channelKey);
62
+ const now = Date.now();
63
+ // Check if existing session is still valid
64
+ if (existing) {
65
+ const isExpired = now - existing.lastActive > this.config.sessionTimeoutMs;
66
+ const isContextFull = existing.totalInputTokens >= CONTEXT_THRESHOLD_TOKENS;
67
+ if (isExpired) {
68
+ this.sessions.delete(channelKey);
69
+ console.log(`[SessionPool] Session expired for ${channelKey}, creating new one`);
70
+ }
71
+ else if (isContextFull) {
72
+ this.sessions.delete(channelKey);
73
+ console.log(`[SessionPool] Context 80% full (${existing.totalInputTokens} tokens) for ${channelKey}, creating fresh session`);
74
+ }
75
+ else {
76
+ // Reuse existing session
77
+ existing.lastActive = now;
78
+ existing.messageCount++;
79
+ const usagePercent = Math.round((existing.totalInputTokens / 200000) * 100);
80
+ console.log(`[SessionPool] Reusing session for ${channelKey}: ${existing.sessionId} (msg #${existing.messageCount}, ${usagePercent}% context)`);
81
+ return { sessionId: existing.sessionId, isNew: false };
82
+ }
83
+ }
84
+ // Create new session
85
+ const sessionId = this.createSession(channelKey);
86
+ return { sessionId, isNew: true };
87
+ }
88
+ /**
89
+ * Update token usage for a session
90
+ * Called after each Claude CLI response
91
+ *
92
+ * @param channelKey - Channel identifier
93
+ * @param inputTokens - Input tokens from this request
94
+ * @returns Current total tokens and whether threshold is approaching
95
+ */
96
+ updateTokens(channelKey, inputTokens) {
97
+ const existing = this.sessions.get(channelKey);
98
+ if (!existing) {
99
+ return { totalTokens: 0, nearThreshold: false };
100
+ }
101
+ existing.totalInputTokens += inputTokens;
102
+ const nearThreshold = existing.totalInputTokens >= CONTEXT_THRESHOLD_TOKENS * 0.9; // 90% of threshold
103
+ if (nearThreshold) {
104
+ console.log(`[SessionPool] ⚠️ Context approaching limit: ${existing.totalInputTokens} tokens (${Math.round(existing.totalInputTokens / 2000)}% of 200K)`);
105
+ }
106
+ return {
107
+ totalTokens: existing.totalInputTokens,
108
+ nearThreshold,
109
+ };
110
+ }
111
+ /**
112
+ * Get current token usage for a session
113
+ */
114
+ getTokenUsage(channelKey) {
115
+ const existing = this.sessions.get(channelKey);
116
+ return existing?.totalInputTokens ?? 0;
117
+ }
118
+ /**
119
+ * Legacy method for backward compatibility
120
+ * @deprecated Use getSession() instead
121
+ */
122
+ getSessionId(channelKey) {
123
+ return this.getSession(channelKey).sessionId;
124
+ }
125
+ /**
126
+ * Release a session after use (no-op since we use fresh sessions)
127
+ */
128
+ releaseSession(_channelKey) {
129
+ // No-op: Each request uses a fresh session ID
130
+ // Claude CLI locks session IDs, preventing reuse
131
+ }
132
+ /**
133
+ * Create a new session for a channel
134
+ */
135
+ createSession(channelKey) {
136
+ const now = Date.now();
137
+ const sessionId = (0, crypto_1.randomUUID)();
138
+ // Enforce max sessions limit
139
+ if (this.sessions.size >= this.config.maxSessions) {
140
+ this.evictOldestSession();
141
+ }
142
+ const entry = {
143
+ sessionId,
144
+ lastActive: now,
145
+ messageCount: 1,
146
+ createdAt: now,
147
+ inUse: true, // Lock on creation
148
+ totalInputTokens: 0,
149
+ };
150
+ this.sessions.set(channelKey, entry);
151
+ console.log(`[SessionPool] Created new session for ${channelKey}: ${sessionId}`);
152
+ return sessionId;
153
+ }
154
+ /**
155
+ * Force create a new session (for /clear command)
156
+ */
157
+ resetSession(channelKey) {
158
+ this.sessions.delete(channelKey);
159
+ return this.createSession(channelKey);
160
+ }
161
+ /**
162
+ * Check if a session exists and is active
163
+ */
164
+ hasActiveSession(channelKey) {
165
+ const existing = this.sessions.get(channelKey);
166
+ if (!existing)
167
+ return false;
168
+ const isExpired = Date.now() - existing.lastActive > this.config.sessionTimeoutMs;
169
+ return !isExpired;
170
+ }
171
+ /**
172
+ * Get session info for a channel
173
+ */
174
+ getSessionInfo(channelKey) {
175
+ return this.sessions.get(channelKey) || null;
176
+ }
177
+ /**
178
+ * Get all active sessions (for debugging/monitoring)
179
+ */
180
+ listSessions() {
181
+ return new Map(this.sessions);
182
+ }
183
+ /**
184
+ * Get active session count
185
+ */
186
+ getActiveSessionCount() {
187
+ return this.sessions.size;
188
+ }
189
+ /**
190
+ * Evict the oldest (least recently used) session
191
+ */
192
+ evictOldestSession() {
193
+ let oldestKey = null;
194
+ let oldestTime = Infinity;
195
+ for (const [key, entry] of this.sessions) {
196
+ if (entry.lastActive < oldestTime) {
197
+ oldestTime = entry.lastActive;
198
+ oldestKey = key;
199
+ }
200
+ }
201
+ if (oldestKey) {
202
+ this.sessions.delete(oldestKey);
203
+ console.log(`[SessionPool] Evicted oldest session: ${oldestKey}`);
204
+ }
205
+ }
206
+ /**
207
+ * Clean up expired sessions
208
+ */
209
+ cleanup() {
210
+ const now = Date.now();
211
+ let cleaned = 0;
212
+ for (const [key, entry] of this.sessions) {
213
+ if (now - entry.lastActive > this.config.sessionTimeoutMs) {
214
+ this.sessions.delete(key);
215
+ cleaned++;
216
+ }
217
+ }
218
+ if (cleaned > 0) {
219
+ console.log(`[SessionPool] Cleaned up ${cleaned} expired sessions`);
220
+ }
221
+ return cleaned;
222
+ }
223
+ /**
224
+ * Start periodic cleanup timer
225
+ */
226
+ startCleanupTimer() {
227
+ if (this.cleanupTimer)
228
+ return;
229
+ this.cleanupTimer = setInterval(() => {
230
+ this.cleanup();
231
+ }, this.config.cleanupIntervalMs);
232
+ // Don't prevent process exit
233
+ this.cleanupTimer.unref();
234
+ }
235
+ /**
236
+ * Stop cleanup timer and clear all sessions
237
+ */
238
+ dispose() {
239
+ if (this.cleanupTimer) {
240
+ clearInterval(this.cleanupTimer);
241
+ this.cleanupTimer = null;
242
+ }
243
+ this.sessions.clear();
244
+ }
245
+ }
246
+ exports.SessionPool = SessionPool;
247
+ /**
248
+ * Global session pool instance
249
+ */
250
+ let globalSessionPool = null;
251
+ /**
252
+ * Get global session pool instance
253
+ */
254
+ function getSessionPool() {
255
+ if (!globalSessionPool) {
256
+ globalSessionPool = new SessionPool();
257
+ }
258
+ return globalSessionPool;
259
+ }
260
+ /**
261
+ * Set global session pool instance (for testing)
262
+ */
263
+ function setSessionPool(pool) {
264
+ globalSessionPool = pool;
265
+ }
266
+ /**
267
+ * Build channel key from source and channel ID
268
+ */
269
+ function buildChannelKey(source, channelId) {
270
+ return `${source}:${channelId}`;
271
+ }
272
+ //# sourceMappingURL=session-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-pool.js","sourceRoot":"","sources":["../../src/agent/session-pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Streaming Callback Manager
3
+ *
4
+ * Coordinates callbacks between ClaudeClient and Discord gateway.
5
+ * Manages placeholder message creation, text accumulation, and error handling.
6
+ */
7
+ import type { Message } from 'discord.js';
8
+ import type { ClaudeResponse } from './types.js';
9
+ /**
10
+ * Interface for Discord gateway operations
11
+ */
12
+ export interface DiscordGatewayInterface {
13
+ /**
14
+ * Edit a message with throttling to prevent rate limits
15
+ * @param message Discord message to edit
16
+ * @param content New message content
17
+ */
18
+ editMessageThrottled(message: Message, content: string): Promise<void>;
19
+ }
20
+ /**
21
+ * Manages streaming callbacks and coordinates with Discord gateway
22
+ *
23
+ * Responsibilities:
24
+ * - Create placeholder message before streaming starts
25
+ * - Accumulate text deltas and update Discord message
26
+ * - Track tool use events
27
+ * - Handle errors and update placeholder with error message
28
+ * - Clean up references after streaming completes
29
+ */
30
+ export declare class StreamingCallbackManager {
31
+ private discordGateway;
32
+ private originalMessage;
33
+ private placeholderMessage;
34
+ private accumulatedText;
35
+ /**
36
+ * Create a new streaming callback manager
37
+ * @param discordGateway Discord gateway for message operations
38
+ * @param originalMessage Original message to reply to
39
+ */
40
+ constructor(discordGateway: DiscordGatewayInterface, originalMessage: Message);
41
+ /**
42
+ * Create a placeholder message to be updated with streaming content
43
+ * @throws Error if message creation fails
44
+ */
45
+ createPlaceholder(): Promise<void>;
46
+ /**
47
+ * Handle text delta from streaming response
48
+ * Accumulates text and updates Discord message
49
+ * @param text Text delta to add
50
+ */
51
+ onDelta(text: string): Promise<void>;
52
+ /**
53
+ * Handle tool use event
54
+ * @param name Tool name
55
+ * @param _input Tool input
56
+ */
57
+ onToolUse(name: string, _input: unknown): void;
58
+ /**
59
+ * Handle final response from streaming
60
+ * @param _response Final Claude response
61
+ */
62
+ onFinal(_response: ClaudeResponse): Promise<void>;
63
+ /**
64
+ * Handle error during streaming
65
+ * Updates placeholder message with error information
66
+ * @param error Error that occurred
67
+ */
68
+ onError(error: Error): Promise<void>;
69
+ /**
70
+ * Clean up resources and clear references
71
+ * Should be called after streaming completes
72
+ */
73
+ cleanup(): Promise<void>;
74
+ /**
75
+ * Get the current placeholder message
76
+ * @returns Placeholder message or null if not created
77
+ */
78
+ getPlaceholderMessage(): Message | null;
79
+ /**
80
+ * Get the accumulated text so far
81
+ * @returns Accumulated text content
82
+ */
83
+ getAccumulatedText(): string;
84
+ }
85
+ //# sourceMappingURL=streaming-callback-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-callback-manager.d.ts","sourceRoot":"","sources":["../../src/agent/streaming-callback-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE;AAED;;;;;;;;;GASG;AACH,qBAAa,wBAAwB;IAUjC,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,eAAe;IAVzB,OAAO,CAAC,kBAAkB,CAAwB;IAClD,OAAO,CAAC,eAAe,CAAM;IAE7B;;;;OAIG;gBAEO,cAAc,EAAE,uBAAuB,EACvC,eAAe,EAAE,OAAO;IAGlC;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC;;;;OAIG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1C;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAI9C;;;OAGG;IACG,OAAO,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD;;;;OAIG;IACG,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1C;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;;OAGG;IACH,qBAAqB,IAAI,OAAO,GAAG,IAAI;IAIvC;;;OAGG;IACH,kBAAkB,IAAI,MAAM;CAG7B"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /**
3
+ * Streaming Callback Manager
4
+ *
5
+ * Coordinates callbacks between ClaudeClient and Discord gateway.
6
+ * Manages placeholder message creation, text accumulation, and error handling.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.StreamingCallbackManager = void 0;
10
+ /**
11
+ * Manages streaming callbacks and coordinates with Discord gateway
12
+ *
13
+ * Responsibilities:
14
+ * - Create placeholder message before streaming starts
15
+ * - Accumulate text deltas and update Discord message
16
+ * - Track tool use events
17
+ * - Handle errors and update placeholder with error message
18
+ * - Clean up references after streaming completes
19
+ */
20
+ class StreamingCallbackManager {
21
+ discordGateway;
22
+ originalMessage;
23
+ placeholderMessage = null;
24
+ accumulatedText = '';
25
+ /**
26
+ * Create a new streaming callback manager
27
+ * @param discordGateway Discord gateway for message operations
28
+ * @param originalMessage Original message to reply to
29
+ */
30
+ constructor(discordGateway, originalMessage) {
31
+ this.discordGateway = discordGateway;
32
+ this.originalMessage = originalMessage;
33
+ }
34
+ /**
35
+ * Create a placeholder message to be updated with streaming content
36
+ * @throws Error if message creation fails
37
+ */
38
+ async createPlaceholder() {
39
+ this.placeholderMessage = await this.originalMessage.reply('⏳ Processing...');
40
+ }
41
+ /**
42
+ * Handle text delta from streaming response
43
+ * Accumulates text and updates Discord message
44
+ * @param text Text delta to add
45
+ */
46
+ async onDelta(text) {
47
+ this.accumulatedText += text;
48
+ if (this.placeholderMessage) {
49
+ await this.discordGateway.editMessageThrottled(this.placeholderMessage, this.accumulatedText);
50
+ }
51
+ }
52
+ /**
53
+ * Handle tool use event
54
+ * @param name Tool name
55
+ * @param _input Tool input
56
+ */
57
+ onToolUse(name, _input) {
58
+ console.log(`[Streaming] Tool called: ${name}`);
59
+ }
60
+ /**
61
+ * Handle final response from streaming
62
+ * @param _response Final Claude response
63
+ */
64
+ async onFinal(_response) {
65
+ console.log('[Streaming] Stream complete');
66
+ // Final flush handled by Discord gateway's throttle mechanism
67
+ }
68
+ /**
69
+ * Handle error during streaming
70
+ * Updates placeholder message with error information
71
+ * @param error Error that occurred
72
+ */
73
+ async onError(error) {
74
+ console.error('[Streaming] Error:', error);
75
+ if (this.placeholderMessage) {
76
+ await this.placeholderMessage.edit(`❌ Translation failed: ${error.message}\n\nPlease try again or use a smaller image.`);
77
+ }
78
+ }
79
+ /**
80
+ * Clean up resources and clear references
81
+ * Should be called after streaming completes
82
+ */
83
+ async cleanup() {
84
+ this.placeholderMessage = null;
85
+ this.accumulatedText = '';
86
+ }
87
+ /**
88
+ * Get the current placeholder message
89
+ * @returns Placeholder message or null if not created
90
+ */
91
+ getPlaceholderMessage() {
92
+ return this.placeholderMessage;
93
+ }
94
+ /**
95
+ * Get the accumulated text so far
96
+ * @returns Accumulated text content
97
+ */
98
+ getAccumulatedText() {
99
+ return this.accumulatedText;
100
+ }
101
+ }
102
+ exports.StreamingCallbackManager = StreamingCallbackManager;
103
+ //# sourceMappingURL=streaming-callback-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-callback-manager.js","sourceRoot":"","sources":["../../src/agent/streaming-callback-manager.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAiBH;;;;;;;;;GASG;AACH,MAAa,wBAAwB;IAUzB;IACA;IAVF,kBAAkB,GAAmB,IAAI,CAAC;IAC1C,eAAe,GAAG,EAAE,CAAC;IAE7B;;;;OAIG;IACH,YACU,cAAuC,EACvC,eAAwB;QADxB,mBAAc,GAAd,cAAc,CAAyB;QACvC,oBAAe,GAAf,eAAe,CAAS;IAC/B,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,iBAAiB;QACrB,IAAI,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAChF,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC;QAC7B,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,IAAY,EAAE,MAAe;QACrC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,SAAyB;QACrC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,8DAA8D;IAChE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,KAAY;QACxB,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAChC,yBAAyB,KAAK,CAAC,OAAO,8CAA8C,CACrF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,qBAAqB;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF;AA1FD,4DA0FC"}