sensorium-mcp 3.0.102 → 3.1.0-refactor.0

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 (564) hide show
  1. package/README.md +25 -0
  2. package/dist/config/agent-settings.d.ts +69 -0
  3. package/dist/config/agent-settings.d.ts.map +1 -0
  4. package/dist/config/agent-settings.js +225 -0
  5. package/dist/config/agent-settings.js.map +1 -0
  6. package/dist/config/agent-templates.d.ts +39 -0
  7. package/dist/config/agent-templates.d.ts.map +1 -0
  8. package/dist/config/agent-templates.js +105 -0
  9. package/dist/config/agent-templates.js.map +1 -0
  10. package/dist/config/index.d.ts +16 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +58 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/config/keep-alive-settings.d.ts +29 -0
  15. package/dist/config/keep-alive-settings.d.ts.map +1 -0
  16. package/dist/config/keep-alive-settings.js +100 -0
  17. package/dist/config/keep-alive-settings.js.map +1 -0
  18. package/dist/config/mcp-settings.d.ts +59 -0
  19. package/dist/config/mcp-settings.d.ts.map +1 -0
  20. package/dist/config/mcp-settings.js +196 -0
  21. package/dist/config/mcp-settings.js.map +1 -0
  22. package/dist/config/misc-settings.d.ts +46 -0
  23. package/dist/config/misc-settings.d.ts.map +1 -0
  24. package/dist/config/misc-settings.js +146 -0
  25. package/dist/config/misc-settings.js.map +1 -0
  26. package/dist/config/settings-store.d.ts +10 -0
  27. package/dist/config/settings-store.d.ts.map +1 -0
  28. package/dist/config/settings-store.js +65 -0
  29. package/dist/config/settings-store.js.map +1 -0
  30. package/dist/dashboard/log-parser.d.ts.map +1 -1
  31. package/dist/dashboard/log-parser.js +12 -2
  32. package/dist/dashboard/log-parser.js.map +1 -1
  33. package/dist/dashboard/presets.d.ts +1 -1
  34. package/dist/dashboard/presets.d.ts.map +1 -1
  35. package/dist/dashboard/presets.js +1 -1
  36. package/dist/dashboard/presets.js.map +1 -1
  37. package/dist/dashboard/routes/agent-templates.d.ts.map +1 -1
  38. package/dist/dashboard/routes/agent-templates.js +13 -8
  39. package/dist/dashboard/routes/agent-templates.js.map +1 -1
  40. package/dist/dashboard/routes/claude.d.ts.map +1 -1
  41. package/dist/dashboard/routes/claude.js +6 -3
  42. package/dist/dashboard/routes/claude.js.map +1 -1
  43. package/dist/dashboard/routes/copilot.d.ts.map +1 -1
  44. package/dist/dashboard/routes/copilot.js +16 -7
  45. package/dist/dashboard/routes/copilot.js.map +1 -1
  46. package/dist/dashboard/routes/data.d.ts.map +1 -1
  47. package/dist/dashboard/routes/data.js +43 -15
  48. package/dist/dashboard/routes/data.js.map +1 -1
  49. package/dist/dashboard/routes/env-vars.d.ts.map +1 -1
  50. package/dist/dashboard/routes/env-vars.js.map +1 -1
  51. package/dist/dashboard/routes/mcp-servers.d.ts.map +1 -1
  52. package/dist/dashboard/routes/mcp-servers.js +11 -5
  53. package/dist/dashboard/routes/mcp-servers.js.map +1 -1
  54. package/dist/dashboard/routes/prompts.d.ts.map +1 -1
  55. package/dist/dashboard/routes/prompts.js +2 -2
  56. package/dist/dashboard/routes/prompts.js.map +1 -1
  57. package/dist/dashboard/routes/settings.d.ts.map +1 -1
  58. package/dist/dashboard/routes/settings.js +5 -3
  59. package/dist/dashboard/routes/settings.js.map +1 -1
  60. package/dist/dashboard/routes/skills.d.ts.map +1 -1
  61. package/dist/dashboard/routes/skills.js +4 -4
  62. package/dist/dashboard/routes/skills.js.map +1 -1
  63. package/dist/dashboard/routes/snapshots.d.ts.map +1 -1
  64. package/dist/dashboard/routes/snapshots.js +18 -11
  65. package/dist/dashboard/routes/snapshots.js.map +1 -1
  66. package/dist/dashboard/routes/templates.d.ts.map +1 -1
  67. package/dist/dashboard/routes/templates.js +6 -3
  68. package/dist/dashboard/routes/templates.js.map +1 -1
  69. package/dist/dashboard/routes/threads-create.d.ts +22 -0
  70. package/dist/dashboard/routes/threads-create.d.ts.map +1 -0
  71. package/dist/dashboard/routes/threads-create.js +225 -0
  72. package/dist/dashboard/routes/threads-create.js.map +1 -0
  73. package/dist/dashboard/routes/threads-helpers.d.ts +28 -0
  74. package/dist/dashboard/routes/threads-helpers.d.ts.map +1 -0
  75. package/dist/dashboard/routes/threads-helpers.js +138 -0
  76. package/dist/dashboard/routes/threads-helpers.js.map +1 -0
  77. package/dist/dashboard/routes/threads-read.d.ts +26 -0
  78. package/dist/dashboard/routes/threads-read.d.ts.map +1 -0
  79. package/dist/dashboard/routes/threads-read.js +118 -0
  80. package/dist/dashboard/routes/threads-read.js.map +1 -0
  81. package/dist/dashboard/routes/threads.d.ts +5 -44
  82. package/dist/dashboard/routes/threads.d.ts.map +1 -1
  83. package/dist/dashboard/routes/threads.js +40 -496
  84. package/dist/dashboard/routes/threads.js.map +1 -1
  85. package/dist/dashboard/routes/types.d.ts.map +1 -1
  86. package/dist/dashboard/routes/types.js.map +1 -1
  87. package/dist/dashboard/routes.d.ts.map +1 -1
  88. package/dist/dashboard/routes.js +30 -5
  89. package/dist/dashboard/routes.js.map +1 -1
  90. package/dist/data/daily-marker.d.ts.map +1 -1
  91. package/dist/data/daily-marker.js +1 -1
  92. package/dist/data/daily-marker.js.map +1 -1
  93. package/dist/data/file-storage.d.ts.map +1 -1
  94. package/dist/data/file-storage.js +40 -16
  95. package/dist/data/file-storage.js.map +1 -1
  96. package/dist/data/interfaces.d.ts +23 -2
  97. package/dist/data/interfaces.d.ts.map +1 -1
  98. package/dist/data/memory/bootstrap.d.ts +1 -1
  99. package/dist/data/memory/bootstrap.d.ts.map +1 -1
  100. package/dist/data/memory/bootstrap.js +32 -13
  101. package/dist/data/memory/bootstrap.js.map +1 -1
  102. package/dist/data/memory/consolidation.d.ts.map +1 -1
  103. package/dist/data/memory/consolidation.js +17 -8
  104. package/dist/data/memory/consolidation.js.map +1 -1
  105. package/dist/data/memory/db-types.d.ts +4 -0
  106. package/dist/data/memory/db-types.d.ts.map +1 -0
  107. package/dist/data/memory/db-types.js +2 -0
  108. package/dist/data/memory/db-types.js.map +1 -0
  109. package/dist/data/memory/episodes.d.ts.map +1 -1
  110. package/dist/data/memory/episodes.js +3 -5
  111. package/dist/data/memory/episodes.js.map +1 -1
  112. package/dist/data/memory/index.d.ts +28 -14
  113. package/dist/data/memory/index.d.ts.map +1 -1
  114. package/dist/data/memory/index.js +28 -14
  115. package/dist/data/memory/index.js.map +1 -1
  116. package/dist/data/memory/migration-runner.d.ts +1 -1
  117. package/dist/data/memory/migration-runner.d.ts.map +1 -1
  118. package/dist/data/memory/migration-runner.js +23 -15
  119. package/dist/data/memory/migration-runner.js.map +1 -1
  120. package/dist/data/memory/narrative-lint.d.ts +12 -0
  121. package/dist/data/memory/narrative-lint.d.ts.map +1 -0
  122. package/dist/data/memory/narrative-lint.js +117 -0
  123. package/dist/data/memory/narrative-lint.js.map +1 -0
  124. package/dist/data/memory/narrative-resolutions.d.ts +26 -0
  125. package/dist/data/memory/narrative-resolutions.d.ts.map +1 -0
  126. package/dist/data/memory/narrative-resolutions.js +81 -0
  127. package/dist/data/memory/narrative-resolutions.js.map +1 -0
  128. package/dist/data/memory/narrative-sources.d.ts +19 -0
  129. package/dist/data/memory/narrative-sources.d.ts.map +1 -0
  130. package/dist/data/memory/narrative-sources.js +150 -0
  131. package/dist/data/memory/narrative-sources.js.map +1 -0
  132. package/dist/data/memory/narrative-store.d.ts +11 -0
  133. package/dist/data/memory/narrative-store.d.ts.map +1 -0
  134. package/dist/data/memory/narrative-store.js +80 -0
  135. package/dist/data/memory/narrative-store.js.map +1 -0
  136. package/dist/data/memory/narrative-types.d.ts +15 -0
  137. package/dist/data/memory/narrative-types.d.ts.map +1 -0
  138. package/dist/data/memory/narrative-types.js +3 -0
  139. package/dist/data/memory/narrative-types.js.map +1 -0
  140. package/dist/data/memory/narrative.d.ts +5 -2
  141. package/dist/data/memory/narrative.d.ts.map +1 -1
  142. package/dist/data/memory/narrative.js +31 -521
  143. package/dist/data/memory/narrative.js.map +1 -1
  144. package/dist/data/memory/note-archival.d.ts +17 -0
  145. package/dist/data/memory/note-archival.d.ts.map +1 -0
  146. package/dist/data/memory/note-archival.js +48 -0
  147. package/dist/data/memory/note-archival.js.map +1 -0
  148. package/dist/data/memory/note-embeddings.d.ts +27 -0
  149. package/dist/data/memory/note-embeddings.d.ts.map +1 -0
  150. package/dist/data/memory/note-embeddings.js +98 -0
  151. package/dist/data/memory/note-embeddings.js.map +1 -0
  152. package/dist/data/memory/reflection-dedup.d.ts +17 -0
  153. package/dist/data/memory/reflection-dedup.d.ts.map +1 -0
  154. package/dist/data/memory/reflection-dedup.js +55 -0
  155. package/dist/data/memory/reflection-dedup.js.map +1 -0
  156. package/dist/data/memory/reflection-gates.d.ts +40 -0
  157. package/dist/data/memory/reflection-gates.d.ts.map +1 -0
  158. package/dist/data/memory/reflection-gates.js +220 -0
  159. package/dist/data/memory/reflection-gates.js.map +1 -0
  160. package/dist/data/memory/reflection-sources.d.ts +13 -0
  161. package/dist/data/memory/reflection-sources.d.ts.map +1 -0
  162. package/dist/data/memory/reflection-sources.js +115 -0
  163. package/dist/data/memory/reflection-sources.js.map +1 -0
  164. package/dist/data/memory/reflection.d.ts +5 -35
  165. package/dist/data/memory/reflection.d.ts.map +1 -1
  166. package/dist/data/memory/reflection.js +25 -329
  167. package/dist/data/memory/reflection.js.map +1 -1
  168. package/dist/data/memory/schema-ddl.d.ts +1 -1
  169. package/dist/data/memory/schema-ddl.d.ts.map +1 -1
  170. package/dist/data/memory/schema-ddl.js +5 -3
  171. package/dist/data/memory/schema-ddl.js.map +1 -1
  172. package/dist/data/memory/schema-guard.d.ts +1 -1
  173. package/dist/data/memory/schema-guard.d.ts.map +1 -1
  174. package/dist/data/memory/schema-guard.js +5 -4
  175. package/dist/data/memory/schema-guard.js.map +1 -1
  176. package/dist/data/memory/schema.d.ts +2 -2
  177. package/dist/data/memory/schema.d.ts.map +1 -1
  178. package/dist/data/memory/schema.js +4 -2
  179. package/dist/data/memory/schema.js.map +1 -1
  180. package/dist/data/memory/{semantic.d.ts → semantic-notes.d.ts} +6 -72
  181. package/dist/data/memory/semantic-notes.d.ts.map +1 -0
  182. package/dist/data/memory/semantic-notes.js +249 -0
  183. package/dist/data/memory/semantic-notes.js.map +1 -0
  184. package/dist/data/memory/semantic-search.d.ts +29 -0
  185. package/dist/data/memory/semantic-search.d.ts.map +1 -0
  186. package/dist/data/memory/semantic-search.js +156 -0
  187. package/dist/data/memory/semantic-search.js.map +1 -0
  188. package/dist/data/memory/synthesis.d.ts.map +1 -1
  189. package/dist/data/memory/synthesis.js +15 -7
  190. package/dist/data/memory/synthesis.js.map +1 -1
  191. package/dist/data/memory/thread-registry.d.ts +2 -2
  192. package/dist/data/memory/thread-registry.d.ts.map +1 -1
  193. package/dist/data/memory/thread-registry.js +74 -36
  194. package/dist/data/memory/thread-registry.js.map +1 -1
  195. package/dist/data/memory/topic-index.d.ts +20 -0
  196. package/dist/data/memory/topic-index.d.ts.map +1 -0
  197. package/dist/data/memory/topic-index.js +91 -0
  198. package/dist/data/memory/topic-index.js.map +1 -0
  199. package/dist/data/memory/topic-shift.js +1 -1
  200. package/dist/data/memory/topic-shift.js.map +1 -1
  201. package/dist/data/memory/utils.d.ts +0 -5
  202. package/dist/data/memory/utils.d.ts.map +1 -1
  203. package/dist/data/memory/utils.js +0 -94
  204. package/dist/data/memory/utils.js.map +1 -1
  205. package/dist/data/sent-message.repository.js +2 -2
  206. package/dist/data/sent-message.repository.js.map +1 -1
  207. package/dist/data/templates.js +2 -2
  208. package/dist/data/templates.js.map +1 -1
  209. package/dist/index.js +21 -19
  210. package/dist/index.js.map +1 -1
  211. package/dist/integrations/openai/chat.d.ts.map +1 -1
  212. package/dist/integrations/openai/chat.js +5 -5
  213. package/dist/integrations/openai/chat.js.map +1 -1
  214. package/dist/integrations/openai/speech.d.ts +1 -1
  215. package/dist/integrations/openai/speech.d.ts.map +1 -1
  216. package/dist/integrations/openai/speech.js +1 -3
  217. package/dist/integrations/openai/speech.js.map +1 -1
  218. package/dist/integrations/openai/video.d.ts.map +1 -1
  219. package/dist/integrations/openai/video.js +21 -10
  220. package/dist/integrations/openai/video.js.map +1 -1
  221. package/dist/integrations/openai/vision.d.ts.map +1 -1
  222. package/dist/integrations/openai/vision.js.map +1 -1
  223. package/dist/integrations/openai/voice-emotion.d.ts.map +1 -1
  224. package/dist/integrations/openai/voice-emotion.js +2 -2
  225. package/dist/integrations/openai/voice-emotion.js.map +1 -1
  226. package/dist/lib/logger.d.ts.map +1 -0
  227. package/dist/{logger.js → lib/logger.js} +77 -50
  228. package/dist/lib/logger.js.map +1 -0
  229. package/dist/lib/markdown.d.ts.map +1 -0
  230. package/dist/{markdown.js → lib/markdown.js} +13 -5
  231. package/dist/lib/markdown.js.map +1 -0
  232. package/dist/{types.d.ts → lib/types.d.ts} +0 -1
  233. package/dist/lib/types.d.ts.map +1 -0
  234. package/dist/lib/types.js.map +1 -0
  235. package/dist/lib/utils.d.ts.map +1 -0
  236. package/dist/{utils.js → lib/utils.js} +29 -9
  237. package/dist/lib/utils.js.map +1 -0
  238. package/dist/llm/json.d.ts +14 -0
  239. package/dist/llm/json.d.ts.map +1 -0
  240. package/dist/llm/json.js +112 -0
  241. package/dist/llm/json.js.map +1 -0
  242. package/dist/llm/prompts/narrative.d.ts +7 -0
  243. package/dist/llm/prompts/narrative.d.ts.map +1 -0
  244. package/dist/llm/prompts/narrative.js +124 -0
  245. package/dist/llm/prompts/narrative.js.map +1 -0
  246. package/dist/llm/prompts/reflection.d.ts +6 -0
  247. package/dist/llm/prompts/reflection.d.ts.map +1 -0
  248. package/dist/llm/prompts/reflection.js +77 -0
  249. package/dist/llm/prompts/reflection.js.map +1 -0
  250. package/dist/server/factory.d.ts +2 -2
  251. package/dist/server/factory.d.ts.map +1 -1
  252. package/dist/server/factory.js +152 -73
  253. package/dist/server/factory.js.map +1 -1
  254. package/dist/{http-server.d.ts → server/http-server.d.ts} +2 -2
  255. package/dist/server/http-server.d.ts.map +1 -0
  256. package/dist/{http-server.js → server/http-server.js} +38 -17
  257. package/dist/server/http-server.js.map +1 -0
  258. package/dist/{stdio-server.d.ts → server/stdio-server.d.ts} +1 -1
  259. package/dist/server/stdio-server.d.ts.map +1 -0
  260. package/dist/{stdio-server.js → server/stdio-server.js} +25 -11
  261. package/dist/server/stdio-server.js.map +1 -0
  262. package/dist/services/agent-spawn.service.d.ts +1 -1
  263. package/dist/services/agent-spawn.service.d.ts.map +1 -1
  264. package/dist/services/agent-spawn.service.js +17 -7
  265. package/dist/services/agent-spawn.service.js.map +1 -1
  266. package/dist/services/background-runner.d.ts +2 -2
  267. package/dist/services/background-runner.d.ts.map +1 -1
  268. package/dist/services/background-runner.js +8 -3
  269. package/dist/services/background-runner.js.map +1 -1
  270. package/dist/services/claude-spawn.service.d.ts.map +1 -1
  271. package/dist/services/claude-spawn.service.js +61 -52
  272. package/dist/services/claude-spawn.service.js.map +1 -1
  273. package/dist/services/codex-spawn.service.d.ts.map +1 -1
  274. package/dist/services/codex-spawn.service.js +52 -40
  275. package/dist/services/codex-spawn.service.js.map +1 -1
  276. package/dist/services/consolidation-prompts.d.ts +26 -0
  277. package/dist/services/consolidation-prompts.d.ts.map +1 -0
  278. package/dist/services/consolidation-prompts.js +144 -0
  279. package/dist/services/consolidation-prompts.js.map +1 -0
  280. package/dist/services/consolidation.service.d.ts +1 -5
  281. package/dist/services/consolidation.service.d.ts.map +1 -1
  282. package/dist/services/consolidation.service.js +53 -322
  283. package/dist/services/consolidation.service.js.map +1 -1
  284. package/dist/services/copilot-spawn.service.d.ts.map +1 -1
  285. package/dist/services/copilot-spawn.service.js +47 -57
  286. package/dist/services/copilot-spawn.service.js.map +1 -1
  287. package/dist/{daily-session.d.ts → services/daily-session.d.ts} +1 -1
  288. package/dist/services/daily-session.d.ts.map +1 -0
  289. package/dist/{daily-session.js → services/daily-session.js} +15 -14
  290. package/dist/services/daily-session.js.map +1 -0
  291. package/dist/services/dispatcher/broker.d.ts +0 -6
  292. package/dist/services/dispatcher/broker.d.ts.map +1 -1
  293. package/dist/services/dispatcher/broker.js +46 -38
  294. package/dist/services/dispatcher/broker.js.map +1 -1
  295. package/dist/services/dispatcher/index.d.ts +1 -1
  296. package/dist/services/dispatcher/index.d.ts.map +1 -1
  297. package/dist/services/dispatcher/index.js +1 -1
  298. package/dist/services/dispatcher/index.js.map +1 -1
  299. package/dist/services/dispatcher/lock.d.ts.map +1 -1
  300. package/dist/services/dispatcher/lock.js +24 -9
  301. package/dist/services/dispatcher/lock.js.map +1 -1
  302. package/dist/services/dispatcher/poller.d.ts +1 -1
  303. package/dist/services/dispatcher/poller.d.ts.map +1 -1
  304. package/dist/services/dispatcher/poller.js +74 -49
  305. package/dist/services/dispatcher/poller.js.map +1 -1
  306. package/dist/services/drive.d.ts.map +1 -0
  307. package/dist/{drive.js → services/drive.js} +1 -1
  308. package/dist/services/drive.js.map +1 -0
  309. package/dist/services/intent.d.ts.map +1 -0
  310. package/dist/{intent.js → services/intent.js} +78 -23
  311. package/dist/services/intent.js.map +1 -0
  312. package/dist/services/keep-alive-sync.service.d.ts +11 -0
  313. package/dist/services/keep-alive-sync.service.d.ts.map +1 -0
  314. package/dist/services/keep-alive-sync.service.js +47 -0
  315. package/dist/services/keep-alive-sync.service.js.map +1 -0
  316. package/dist/services/keeper.service.d.ts +1 -1
  317. package/dist/services/keeper.service.d.ts.map +1 -1
  318. package/dist/services/keeper.service.js +31 -18
  319. package/dist/services/keeper.service.js.map +1 -1
  320. package/dist/services/maintenance-signal.js +1 -1
  321. package/dist/services/maintenance-signal.js.map +1 -1
  322. package/dist/services/mcp-config.service.d.ts.map +1 -1
  323. package/dist/services/mcp-config.service.js +19 -6
  324. package/dist/services/mcp-config.service.js.map +1 -1
  325. package/dist/services/memory-briefing.service.d.ts.map +1 -1
  326. package/dist/services/memory-briefing.service.js +13 -7
  327. package/dist/services/memory-briefing.service.js.map +1 -1
  328. package/dist/services/memory-pruning.service.d.ts +12 -0
  329. package/dist/services/memory-pruning.service.d.ts.map +1 -0
  330. package/dist/services/memory-pruning.service.js +177 -0
  331. package/dist/services/memory-pruning.service.js.map +1 -0
  332. package/dist/services/process.service.d.ts +7 -2
  333. package/dist/services/process.service.d.ts.map +1 -1
  334. package/dist/services/process.service.js +233 -103
  335. package/dist/services/process.service.js.map +1 -1
  336. package/dist/services/reconnect-snapshot.service.d.ts.map +1 -1
  337. package/dist/services/reconnect-snapshot.service.js +3 -3
  338. package/dist/services/reconnect-snapshot.service.js.map +1 -1
  339. package/dist/{scheduler.d.ts → services/scheduler.d.ts} +1 -23
  340. package/dist/services/scheduler.d.ts.map +1 -0
  341. package/dist/{scheduler.js → services/scheduler.js} +6 -8
  342. package/dist/services/scheduler.js.map +1 -0
  343. package/dist/services/self-update.service.d.ts +15 -5
  344. package/dist/services/self-update.service.d.ts.map +1 -1
  345. package/dist/services/self-update.service.js +85 -41
  346. package/dist/services/self-update.service.js.map +1 -1
  347. package/dist/services/spawn-common.d.ts +40 -16
  348. package/dist/services/spawn-common.d.ts.map +1 -1
  349. package/dist/services/spawn-common.js +163 -36
  350. package/dist/services/spawn-common.js.map +1 -1
  351. package/dist/{telegram.d.ts → services/telegram.d.ts} +3 -3
  352. package/dist/services/telegram.d.ts.map +1 -0
  353. package/dist/{telegram.js → services/telegram.js} +16 -8
  354. package/dist/services/telegram.js.map +1 -0
  355. package/dist/services/thread-config.service.d.ts +25 -0
  356. package/dist/services/thread-config.service.d.ts.map +1 -0
  357. package/dist/services/thread-config.service.js +73 -0
  358. package/dist/services/thread-config.service.js.map +1 -0
  359. package/dist/services/thread-health.service.d.ts.map +1 -1
  360. package/dist/services/thread-health.service.js +23 -9
  361. package/dist/services/thread-health.service.js.map +1 -1
  362. package/dist/services/thread-lifecycle.service.d.ts.map +1 -1
  363. package/dist/services/thread-lifecycle.service.js +21 -7
  364. package/dist/services/thread-lifecycle.service.js.map +1 -1
  365. package/dist/services/topic.service.d.ts.map +1 -1
  366. package/dist/services/topic.service.js +17 -6
  367. package/dist/services/topic.service.js.map +1 -1
  368. package/dist/services/worker-cleanup.service.d.ts +3 -2
  369. package/dist/services/worker-cleanup.service.d.ts.map +1 -1
  370. package/dist/services/worker-cleanup.service.js +31 -19
  371. package/dist/services/worker-cleanup.service.js.map +1 -1
  372. package/dist/sessions/dashboard-registry.d.ts +38 -0
  373. package/dist/sessions/dashboard-registry.d.ts.map +1 -0
  374. package/dist/sessions/dashboard-registry.js +84 -0
  375. package/dist/sessions/dashboard-registry.js.map +1 -0
  376. package/dist/{sessions.d.ts → sessions/mcp-registry.d.ts} +3 -60
  377. package/dist/sessions/mcp-registry.d.ts.map +1 -0
  378. package/dist/{sessions.js → sessions/mcp-registry.js} +5 -214
  379. package/dist/sessions/mcp-registry.js.map +1 -0
  380. package/dist/sessions/session-store.d.ts +17 -0
  381. package/dist/sessions/session-store.d.ts.map +1 -0
  382. package/dist/sessions/session-store.js +69 -0
  383. package/dist/sessions/session-store.js.map +1 -0
  384. package/dist/sessions/topic-registry.d.ts +14 -0
  385. package/dist/sessions/topic-registry.d.ts.map +1 -0
  386. package/dist/sessions/topic-registry.js +67 -0
  387. package/dist/sessions/topic-registry.js.map +1 -0
  388. package/dist/tools/definitions.d.ts +1 -9
  389. package/dist/tools/definitions.d.ts.map +1 -1
  390. package/dist/tools/definitions.js.map +1 -1
  391. package/dist/tools/defs/memory-defs.d.ts +1 -1
  392. package/dist/tools/defs/memory-defs.d.ts.map +1 -1
  393. package/dist/tools/defs/memory-defs.js +1 -1
  394. package/dist/tools/defs/memory-defs.js.map +1 -1
  395. package/dist/tools/defs/session-defs.d.ts +1 -1
  396. package/dist/tools/defs/session-defs.d.ts.map +1 -1
  397. package/dist/tools/defs/session-defs.js +3 -14
  398. package/dist/tools/defs/session-defs.js.map +1 -1
  399. package/dist/tools/defs/skill-defs.d.ts +1 -1
  400. package/dist/tools/defs/skill-defs.d.ts.map +1 -1
  401. package/dist/tools/defs/types.d.ts +11 -0
  402. package/dist/tools/defs/types.d.ts.map +1 -0
  403. package/dist/{chat-ui/src → tools/defs}/types.js.map +1 -1
  404. package/dist/tools/defs/utility-defs.d.ts +1 -1
  405. package/dist/tools/defs/utility-defs.d.ts.map +1 -1
  406. package/dist/tools/defs/utility-defs.js.map +1 -1
  407. package/dist/tools/defs/wait-defs.d.ts +1 -1
  408. package/dist/tools/defs/wait-defs.d.ts.map +1 -1
  409. package/dist/tools/delegate-tool.d.ts +2 -2
  410. package/dist/tools/delegate-tool.d.ts.map +1 -1
  411. package/dist/tools/delegate-tool.js +57 -37
  412. package/dist/tools/delegate-tool.js.map +1 -1
  413. package/dist/tools/memory-tools.d.ts +2 -2
  414. package/dist/tools/memory-tools.d.ts.map +1 -1
  415. package/dist/tools/memory-tools.js +108 -37
  416. package/dist/tools/memory-tools.js.map +1 -1
  417. package/dist/{response-builders.d.ts → tools/response-builders.d.ts} +2 -2
  418. package/dist/tools/response-builders.d.ts.map +1 -0
  419. package/dist/{response-builders.js → tools/response-builders.js} +152 -31
  420. package/dist/tools/response-builders.js.map +1 -0
  421. package/dist/tools/session-tools.d.ts +5 -14
  422. package/dist/tools/session-tools.d.ts.map +1 -1
  423. package/dist/tools/session-tools.js +17 -12
  424. package/dist/tools/session-tools.js.map +1 -1
  425. package/dist/tools/shared-agent-utils.d.ts +1 -1
  426. package/dist/tools/shared-agent-utils.d.ts.map +1 -1
  427. package/dist/tools/shared-agent-utils.js +2 -4
  428. package/dist/tools/shared-agent-utils.js.map +1 -1
  429. package/dist/tools/skill-tools.d.ts +1 -1
  430. package/dist/tools/skill-tools.d.ts.map +1 -1
  431. package/dist/tools/skill-tools.js +12 -7
  432. package/dist/tools/skill-tools.js.map +1 -1
  433. package/dist/tools/start-session-tool.d.ts +3 -3
  434. package/dist/tools/start-session-tool.d.ts.map +1 -1
  435. package/dist/tools/start-session-tool.js +35 -25
  436. package/dist/tools/start-session-tool.js.map +1 -1
  437. package/dist/tools/utility-tools.d.ts +3 -3
  438. package/dist/tools/utility-tools.d.ts.map +1 -1
  439. package/dist/tools/utility-tools.js +46 -28
  440. package/dist/tools/utility-tools.js.map +1 -1
  441. package/dist/tools/wait/auto-forward.d.ts +1 -1
  442. package/dist/tools/wait/auto-forward.d.ts.map +1 -1
  443. package/dist/tools/wait/auto-forward.js +6 -4
  444. package/dist/tools/wait/auto-forward.js.map +1 -1
  445. package/dist/tools/wait/context.d.ts +45 -0
  446. package/dist/tools/wait/context.d.ts.map +1 -0
  447. package/dist/tools/wait/context.js +5 -0
  448. package/dist/tools/wait/context.js.map +1 -0
  449. package/dist/tools/wait/drive-handler.d.ts +2 -2
  450. package/dist/tools/wait/drive-handler.d.ts.map +1 -1
  451. package/dist/tools/wait/drive-handler.js +24 -12
  452. package/dist/tools/wait/drive-handler.js.map +1 -1
  453. package/dist/tools/wait/index.d.ts +2 -1
  454. package/dist/tools/wait/index.d.ts.map +1 -1
  455. package/dist/tools/wait/index.js.map +1 -1
  456. package/dist/tools/wait/media-processor.d.ts +4 -4
  457. package/dist/tools/wait/media-processor.d.ts.map +1 -1
  458. package/dist/tools/wait/media-processor.js +17 -8
  459. package/dist/tools/wait/media-processor.js.map +1 -1
  460. package/dist/tools/wait/message-delivery.d.ts +5 -5
  461. package/dist/tools/wait/message-delivery.d.ts.map +1 -1
  462. package/dist/tools/wait/message-delivery.js +78 -37
  463. package/dist/tools/wait/message-delivery.js.map +1 -1
  464. package/dist/tools/wait/message-processing.d.ts +2 -2
  465. package/dist/tools/wait/message-processing.d.ts.map +1 -1
  466. package/dist/tools/wait/message-processing.js +95 -37
  467. package/dist/tools/wait/message-processing.js.map +1 -1
  468. package/dist/tools/wait/poll-loop.d.ts +2 -41
  469. package/dist/tools/wait/poll-loop.d.ts.map +1 -1
  470. package/dist/tools/wait/poll-loop.js +75 -23
  471. package/dist/tools/wait/poll-loop.js.map +1 -1
  472. package/dist/tools/wait/reaction-handler.d.ts +3 -3
  473. package/dist/tools/wait/reaction-handler.d.ts.map +1 -1
  474. package/dist/tools/wait/reaction-handler.js +6 -6
  475. package/dist/tools/wait/reaction-handler.js.map +1 -1
  476. package/dist/tools/wait/task-handler.d.ts +1 -1
  477. package/dist/tools/wait/task-handler.d.ts.map +1 -1
  478. package/dist/tools/wait/task-handler.js +5 -4
  479. package/dist/tools/wait/task-handler.js.map +1 -1
  480. package/package.json +11 -2
  481. package/templates/code-review.default.md +1 -1
  482. package/templates/fire-and-forget.default.md +1 -1
  483. package/templates/handoff.default.md +1 -1
  484. package/templates/playwright.default.md +6 -6
  485. package/templates/sensorium-repair.default.md +4 -1
  486. package/templates/sleep.default.md +1 -1
  487. package/dist/chat-ui/src/main.d.ts +0 -2
  488. package/dist/chat-ui/src/main.d.ts.map +0 -1
  489. package/dist/chat-ui/src/main.js +0 -4
  490. package/dist/chat-ui/src/main.js.map +0 -1
  491. package/dist/chat-ui/src/markdown.d.ts +0 -2
  492. package/dist/chat-ui/src/markdown.d.ts.map +0 -1
  493. package/dist/chat-ui/src/markdown.js +0 -39
  494. package/dist/chat-ui/src/markdown.js.map +0 -1
  495. package/dist/chat-ui/src/mock-data.d.ts +0 -4
  496. package/dist/chat-ui/src/mock-data.d.ts.map +0 -1
  497. package/dist/chat-ui/src/mock-data.js +0 -230
  498. package/dist/chat-ui/src/mock-data.js.map +0 -1
  499. package/dist/chat-ui/src/types.d.ts +0 -47
  500. package/dist/chat-ui/src/types.d.ts.map +0 -1
  501. package/dist/chat-ui/vite.config.d.ts +0 -3
  502. package/dist/chat-ui/vite.config.d.ts.map +0 -1
  503. package/dist/chat-ui/vite.config.js +0 -14
  504. package/dist/chat-ui/vite.config.js.map +0 -1
  505. package/dist/config.d.ts +0 -228
  506. package/dist/config.d.ts.map +0 -1
  507. package/dist/config.js +0 -841
  508. package/dist/config.js.map +0 -1
  509. package/dist/daily-session.d.ts.map +0 -1
  510. package/dist/daily-session.js.map +0 -1
  511. package/dist/dashboard.d.ts +0 -10
  512. package/dist/dashboard.d.ts.map +0 -1
  513. package/dist/dashboard.js +0 -10
  514. package/dist/dashboard.js.map +0 -1
  515. package/dist/data/memory/semantic.d.ts.map +0 -1
  516. package/dist/data/memory/semantic.js +0 -588
  517. package/dist/data/memory/semantic.js.map +0 -1
  518. package/dist/dispatcher.d.ts +0 -9
  519. package/dist/dispatcher.d.ts.map +0 -1
  520. package/dist/dispatcher.js +0 -9
  521. package/dist/dispatcher.js.map +0 -1
  522. package/dist/drive.d.ts.map +0 -1
  523. package/dist/drive.js.map +0 -1
  524. package/dist/http-server.d.ts.map +0 -1
  525. package/dist/http-server.js.map +0 -1
  526. package/dist/intent.d.ts.map +0 -1
  527. package/dist/intent.js.map +0 -1
  528. package/dist/logger.d.ts.map +0 -1
  529. package/dist/logger.js.map +0 -1
  530. package/dist/markdown.d.ts.map +0 -1
  531. package/dist/markdown.js.map +0 -1
  532. package/dist/memory.d.ts +0 -9
  533. package/dist/memory.d.ts.map +0 -1
  534. package/dist/memory.js +0 -9
  535. package/dist/memory.js.map +0 -1
  536. package/dist/openai.d.ts +0 -13
  537. package/dist/openai.d.ts.map +0 -1
  538. package/dist/openai.js +0 -17
  539. package/dist/openai.js.map +0 -1
  540. package/dist/response-builders.d.ts.map +0 -1
  541. package/dist/response-builders.js.map +0 -1
  542. package/dist/scheduler.d.ts.map +0 -1
  543. package/dist/scheduler.js.map +0 -1
  544. package/dist/sessions.d.ts.map +0 -1
  545. package/dist/sessions.js.map +0 -1
  546. package/dist/stdio-server.d.ts.map +0 -1
  547. package/dist/stdio-server.js.map +0 -1
  548. package/dist/telegram.d.ts.map +0 -1
  549. package/dist/telegram.js.map +0 -1
  550. package/dist/tool-definitions.d.ts +0 -2
  551. package/dist/tool-definitions.d.ts.map +0 -1
  552. package/dist/tool-definitions.js +0 -2
  553. package/dist/tool-definitions.js.map +0 -1
  554. package/dist/types.d.ts.map +0 -1
  555. package/dist/types.js.map +0 -1
  556. package/dist/utils.d.ts.map +0 -1
  557. package/dist/utils.js.map +0 -1
  558. /package/dist/{logger.d.ts → lib/logger.d.ts} +0 -0
  559. /package/dist/{markdown.d.ts → lib/markdown.d.ts} +0 -0
  560. /package/dist/{types.js → lib/types.js} +0 -0
  561. /package/dist/{utils.d.ts → lib/utils.d.ts} +0 -0
  562. /package/dist/{drive.d.ts → services/drive.d.ts} +0 -0
  563. /package/dist/{intent.d.ts → services/intent.d.ts} +0 -0
  564. /package/dist/{chat-ui/src → tools/defs}/types.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/threads.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAuB5D,OAAO,EAA2B,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAoIxF,eAAO,MAAM,gBAAgB,EAAE,YAI9B,CAAC;AAIF,eAAO,MAAM,oBAAoB,EAAE,YAGlC,CAAC;AAIF,eAAO,MAAM,yBAAyB,EAAE,YAGvC,CAAC;AAIF,eAAO,MAAM,wBAAwB,EAAE,YAItC,CAAC;AAIF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA0ChF;AAID,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA2ChF;AAID,eAAO,MAAM,kBAAkB,EAAE,YAmEhC,CAAC;AAIF;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,YAuC9B,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,YAwDhC,CAAC;AAcF,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQ1E;AAED,8FAA8F;AAC9F,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIjF;AAED,qGAAqG;AACrG,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAInF;AAqBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAkB9E;AAED,mEAAmE;AACnE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAItF;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAyD7E;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAyC7E;AAYD,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA8B5E;AAID,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA6B9E;AAID;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CA+B1D"}
1
+ {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/threads.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,OAAO,EAA2B,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAmBrE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA4ChF;AAID,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiEhF;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAqE7E;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA0C7E;AAcD,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAuC5E;AAID,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA+C9E"}
@@ -1,172 +1,20 @@
1
1
  /**
2
- * Dashboard API — thread registry route handlers.
3
- * Covers: listing, creating, updating, archiving, and deleting threads.
2
+ * Dashboard API — thread lifecycle route handlers: unarchive, summary
3
+ * generation, update, delete/archive, start, and branch→root conversion.
4
+ * Read handlers live in threads-read.ts, creation in threads-create.ts,
5
+ * shared validation/enrichment in threads-helpers.ts.
4
6
  */
5
- import { registerThread, getThread, getRootThreads, getKeepAliveThreads, getActiveThreads, getArchivedThreads, getDashboardThreads, getThreadsByRoot, updateThread, archiveThread, unarchiveThread, deleteThread, getExplicitTelegramTopicId, resolveTelegramTopicId, } from "../../data/memory/thread-registry.js";
6
- import { forkMemory } from "../../data/memory/synthesis.js";
7
- import { config, getAgentType, setKeepAliveEnabled, setKeepAliveThreadId, setKeepAliveClient, setKeepAliveMaxRetries, setKeepAliveCooldownMs, setThreadKeepAlive, removeThreadKeepAlive, isValidKeeperClient, setThreadMcpServers, deleteThreadMcpServers, getAllThreadMcpServers, maskThreadMcpServers, MASK_SENTINEL, } from "../../config.js";
7
+ import { getThread, getThreadsByRoot, updateThread, archiveThread, unarchiveThread, deleteThread, getExplicitTelegramTopicId, resolveTelegramTopicId, } from "../../data/memory/thread-registry.js";
8
+ import { config, setThreadMcpServers, deleteThreadMcpServers, } from "../../config/index.js";
8
9
  import { readBody, safeParseJSON } from "./types.js";
9
- import { errorMessage } from "../../utils.js";
10
- import { log } from "../../logger.js";
11
- import { isThreadRunning, THREAD_LOGS_DIR } from "../../services/process.service.js";
12
- import { readThreadHeartbeat } from "../../data/file-storage.js";
13
- import { parseClaudeStreamLog, renderThreadLog, sliceLogWindow } from "../log-parser.js";
14
- import { readdirSync, statSync, readFileSync } from "node:fs";
15
- import { join } from "node:path";
16
- import { createManagedTopic, deleteTelegramTopicByBotApi, remapThreadToNewTopic } from "../../services/topic.service.js";
10
+ import { buildThreadUpdates, parseThreadMcpServersBody, withThreadMcpServers, } from "./threads-helpers.js";
11
+ import { syncKeepAliveToSettings } from "../../services/keep-alive-sync.service.js";
12
+ import { errorMessage } from "../../lib/utils.js";
13
+ import { log } from "../../lib/logger.js";
14
+ import { isThreadRunning } from "../../services/process.service.js";
15
+ import { deleteTelegramTopicByBotApi, remapThreadToNewTopic, } from "../../services/topic.service.js";
17
16
  import { dispatchSpawn } from "../../services/agent-spawn.service.js";
18
- import { TelegramClient } from "../../telegram.js";
19
- // ─── Helpers ────────────────────────────────────────────────────────────────
20
- const VALID_STATUSES = ["active", "archived", "expired", "exited"];
21
- const VALID_CLIENTS = ["claude", "copilot", "codex", "openai_codex"];
22
- /** Extract valid update fields from a request body. Returns an error string on validation failure. */
23
- function buildThreadUpdates(body) {
24
- const updates = {};
25
- if (typeof body.name === "string" && body.name.trim())
26
- updates.name = body.name.trim();
27
- if (typeof body.status === "string") {
28
- if (!VALID_STATUSES.includes(body.status)) {
29
- return `status must be one of: ${VALID_STATUSES.join(", ")}`;
30
- }
31
- updates.status = body.status;
32
- }
33
- if (typeof body.keepAlive === "boolean")
34
- updates.keepAlive = body.keepAlive;
35
- if (typeof body.dailyRotation === "boolean")
36
- updates.dailyRotation = body.dailyRotation;
37
- if (typeof body.autonomousMode === "boolean")
38
- updates.autonomousMode = body.autonomousMode;
39
- if (typeof body.client === "string") {
40
- if (!VALID_CLIENTS.includes(body.client)) {
41
- return `client must be one of: ${VALID_CLIENTS.join(", ")}`;
42
- }
43
- updates.client = body.client;
44
- }
45
- if (typeof body.maxRetries === "number") {
46
- if (!Number.isFinite(body.maxRetries) || !Number.isInteger(body.maxRetries) || body.maxRetries < 0) {
47
- return "maxRetries must be a non-negative integer";
48
- }
49
- updates.maxRetries = body.maxRetries;
50
- }
51
- if (typeof body.cooldownMs === "number") {
52
- if (!Number.isFinite(body.cooldownMs) || !Number.isInteger(body.cooldownMs) || body.cooldownMs < 0) {
53
- return "cooldownMs must be a non-negative integer";
54
- }
55
- updates.cooldownMs = body.cooldownMs;
56
- }
57
- if (typeof body.badge === "string")
58
- updates.badge = body.badge;
59
- if (typeof body.identityPrompt === "string")
60
- updates.identityPrompt = body.identityPrompt;
61
- if (body.identityPrompt === null)
62
- updates.identityPrompt = null;
63
- if (typeof body.telegramTopicId === "number" && Number.isFinite(body.telegramTopicId))
64
- updates.telegramTopicId = body.telegramTopicId;
65
- if (body.telegramTopicId === null)
66
- updates.telegramTopicId = null;
67
- if (typeof body.workingDirectory === "string" && body.workingDirectory.trim())
68
- updates.workingDirectory = body.workingDirectory.trim();
69
- if (body.workingDirectory === null)
70
- updates.workingDirectory = null;
71
- return updates;
72
- }
73
- /**
74
- * Enrich thread entries with topic names from topic_registry
75
- * when the thread name is generic (e.g. "Thread 1234").
76
- */
77
- function enrichThreadNames(db, threads) {
78
- const genericPattern = /^Thread \d+$/i;
79
- const needsEnrichment = threads.filter(t => genericPattern.test(t.name));
80
- if (needsEnrichment.length === 0)
81
- return threads;
82
- try {
83
- const topicNames = new Map();
84
- const rows = db.prepare(`SELECT thread_id, name FROM topic_registry`).all();
85
- for (const r of rows)
86
- topicNames.set(r.thread_id, r.name);
87
- return threads.map(t => {
88
- if (!genericPattern.test(t.name))
89
- return t;
90
- // Check topic_registry by thread_id or telegramTopicId
91
- const topicName = topicNames.get(t.telegramTopicId ?? t.threadId) ?? topicNames.get(t.threadId);
92
- if (topicName)
93
- return { ...t, name: topicName };
94
- return t;
95
- });
96
- }
97
- catch {
98
- return threads; // topic_registry might not exist
99
- }
100
- }
101
- /** Attach each thread's custom MCP servers (settings.json, not the DB), header values masked. */
102
- function withThreadMcpServers(threads) {
103
- const all = getAllThreadMcpServers();
104
- return threads.map(t => {
105
- const s = all[String(t.threadId)];
106
- return { ...t, mcpServers: s ? maskThreadMcpServers(s) : null };
107
- });
108
- }
109
- /**
110
- * Coerce a PATCH `mcpServers` body into a validated server map (or null to clear).
111
- * Shape-checks http-only transport and rejects the header mask sentinel so a
112
- * round-tripped masked value can never be persisted. Returns an error string on
113
- * malformed input; deeper rules (reserved names) are enforced by setThreadMcpServers.
114
- */
115
- function parseThreadMcpServersBody(raw) {
116
- if (raw === null || raw === undefined)
117
- return null;
118
- if (typeof raw !== "object" || Array.isArray(raw))
119
- return "mcpServers must be an object or null";
120
- const out = {};
121
- for (const [name, val] of Object.entries(raw)) {
122
- if (!val || typeof val !== "object" || Array.isArray(val))
123
- return `mcpServers["${name}"] must be an object`;
124
- const o = val;
125
- if (o.type !== "http")
126
- return `mcpServers["${name}"] must have type "http"`;
127
- if (typeof o.url !== "string" || !o.url.trim())
128
- return `mcpServers["${name}"] requires a url`;
129
- const entry = { type: "http", url: o.url.trim() };
130
- if (o.headers !== undefined && o.headers !== null) {
131
- if (typeof o.headers !== "object" || Array.isArray(o.headers))
132
- return `mcpServers["${name}"].headers must be an object`;
133
- const headers = {};
134
- for (const [k, v] of Object.entries(o.headers)) {
135
- if (typeof v !== "string")
136
- return `mcpServers["${name}"].headers["${k}"] must be a string`;
137
- if (v.includes(MASK_SENTINEL))
138
- return `mcpServers["${name}"].headers["${k}"] still masked — re-enter the value`;
139
- headers[k] = v;
140
- }
141
- if (Object.keys(headers).length > 0)
142
- entry.headers = headers;
143
- }
144
- out[name] = entry;
145
- }
146
- return out;
147
- }
148
- // ─── GET /api/threads — list all active threads grouped ─────────────────────
149
- export const handleGetThreads = ({ json, db }) => {
150
- const threads = withThreadMcpServers(enrichThreadNames(db, getDashboardThreads(db)));
151
- json({ threads });
152
- return true;
153
- };
154
- // ─── GET /api/threads/roots — list root threads only ────────────────────────
155
- export const handleGetRootThreads = ({ json, db }) => {
156
- json({ threads: withThreadMcpServers(enrichThreadNames(db, getRootThreads(db))) });
157
- return true;
158
- };
159
- // ─── GET /api/threads/keepalive — list all threads with keepAlive=true (excl. workers) ─
160
- export const handleGetKeepAliveThreads = ({ json, db }) => {
161
- json({ threads: withThreadMcpServers(enrichThreadNames(db, getKeepAliveThreads(db))) });
162
- return true;
163
- };
164
- // ─── GET /api/threads/archived — list archived threads ──────────────────────
165
- export const handleGetArchivedThreads = ({ json, db }) => {
166
- const threads = withThreadMcpServers(enrichThreadNames(db, getArchivedThreads(db)));
167
- json({ threads });
168
- return true;
169
- };
17
+ import { TelegramClient } from "../../services/telegram.js";
170
18
  // ─── POST /api/threads/:threadId/unarchive — restore an archived thread ────
171
19
  export function handleUnarchiveThread(args, threadId) {
172
20
  const { json, db, ctx } = args;
@@ -226,17 +74,31 @@ export function handleGenerateSummary(args, threadId) {
226
74
  return;
227
75
  }
228
76
  // Gather recent episodes for context
229
- const episodes = db.prepare(`SELECT content, type, modality, timestamp FROM episodes
230
- WHERE thread_id = ? ORDER BY timestamp DESC LIMIT 30`).all(threadId);
77
+ const episodes = db
78
+ .prepare(`SELECT content, type, modality, timestamp FROM episodes
79
+ WHERE thread_id = ? ORDER BY timestamp DESC LIMIT 30`)
80
+ .all(threadId);
231
81
  if (episodes.length === 0) {
232
- json({ ok: true, summary: `Thread "${thread.name}" (${thread.type}) — no episodes recorded.` });
82
+ json({
83
+ ok: true,
84
+ summary: `Thread "${thread.name}" (${thread.type}) — no episodes recorded.`,
85
+ });
233
86
  return;
234
87
  }
235
- const episodeText = episodes.reverse().map(e => `[${e.timestamp}] (${e.type}) ${e.content.slice(0, 200)}`).join("\n");
88
+ const episodeText = episodes
89
+ .reverse()
90
+ .map((e) => `[${e.timestamp}] (${e.type}) ${e.content.slice(0, 200)}`)
91
+ .join("\n");
236
92
  const { chatCompletion } = await import("../../integrations/openai/chat.js");
237
93
  const summary = await chatCompletion([
238
- { role: "system", content: "You are a concise summarizer. Given a thread's conversation episodes, produce a 1-2 sentence summary of what was discussed/accomplished. Be specific about the topic and outcome. No filler." },
239
- { role: "user", content: `Thread: "${thread.name}" (type: ${thread.type})\n\nEpisodes:\n${episodeText}` },
94
+ {
95
+ role: "system",
96
+ content: "You are a concise summarizer. Given a thread's conversation episodes, produce a 1-2 sentence summary of what was discussed/accomplished. Be specific about the topic and outcome. No filler.",
97
+ },
98
+ {
99
+ role: "user",
100
+ content: `Thread: "${thread.name}" (type: ${thread.type})\n\nEpisodes:\n${episodeText}`,
101
+ },
240
102
  ], apiKey, { maxTokens: 150, temperature: 0.3 });
241
103
  const trimmed = summary.trim();
242
104
  if (!trimmed) {
@@ -251,290 +113,6 @@ export function handleGenerateSummary(args, threadId) {
251
113
  })();
252
114
  return true;
253
115
  }
254
- // ─── POST /api/threads — create/register a thread ──────────────────────────
255
- export const handleCreateThread = ({ req, json, db }) => {
256
- void (async () => {
257
- try {
258
- const raw = await readBody(req);
259
- const body = safeParseJSON(raw);
260
- if (!body || typeof body !== "object") {
261
- json({ error: "Invalid request body" }, 400);
262
- return;
263
- }
264
- const threadId = body.threadId;
265
- if (typeof threadId !== "number" || !Number.isFinite(threadId) || !Number.isInteger(threadId) || threadId <= 0) {
266
- json({ error: "threadId must be a positive integer" }, 400);
267
- return;
268
- }
269
- const name = body.name;
270
- if (typeof name !== "string" || !name.trim()) {
271
- json({ error: "name is required" }, 400);
272
- return;
273
- }
274
- const validTypes = ["root", "daily", "branch", "worker"];
275
- const type = body.type;
276
- if (typeof type !== "string" || !validTypes.includes(type)) {
277
- json({ error: `type must be one of: ${validTypes.join(", ")}` }, 400);
278
- return;
279
- }
280
- const client = typeof body.client === "string" && VALID_CLIENTS.includes(body.client)
281
- ? body.client
282
- : undefined;
283
- const keepAlive = typeof body.keepAlive === "boolean" ? body.keepAlive : undefined;
284
- const workingDirectory = typeof body.workingDirectory === "string" && body.workingDirectory.trim()
285
- ? body.workingDirectory.trim()
286
- : undefined;
287
- // Check for duplicate
288
- const existing = getThread(db, threadId);
289
- if (existing) {
290
- json({ error: `Thread ${threadId} already exists` }, 409);
291
- return;
292
- }
293
- const entry = registerThread(db, {
294
- threadId,
295
- name: name.trim(),
296
- type: type,
297
- rootThreadId: typeof body.rootThreadId === "number" ? body.rootThreadId : undefined,
298
- badge: typeof body.badge === "string" ? body.badge : undefined,
299
- client,
300
- keepAlive,
301
- workingDirectory,
302
- });
303
- json(entry, 201);
304
- // Sync keepAlive to settings.json for watcher backward compatibility
305
- if (entry.keepAlive) {
306
- syncKeepAliveToSettings(db);
307
- }
308
- }
309
- catch (err) {
310
- json({ error: errorMessage(err) }, 500);
311
- }
312
- })();
313
- return true;
314
- };
315
- // ─── POST /api/threads/create-root — create a fresh topic + root thread ─────
316
- /**
317
- * Create a brand-new root thread: opens a Telegram forum topic and registers
318
- * the thread. Unlike POST /api/threads (which only registers a caller-supplied
319
- * topic id), this owns topic creation so callers without Telegram access (e.g.
320
- * the supervisor) can spin up threads. keepAlive + dailyRotation default on for
321
- * root threads via registerThread.
322
- */
323
- export const handleCreateRoot = ({ req, json, db, ctx }) => {
324
- void (async () => {
325
- try {
326
- const raw = await readBody(req);
327
- const body = safeParseJSON(raw);
328
- if (!body || typeof body !== "object") {
329
- json({ error: "Invalid request body" }, 400);
330
- return;
331
- }
332
- const name = typeof body.name === "string" ? body.name.trim() : "";
333
- if (!name) {
334
- json({ error: "name is required" }, 400);
335
- return;
336
- }
337
- const agentType = resolveAgentType(body.agentType);
338
- if (agentType === INVALID_AGENT) {
339
- json({ error: `agentType must be one of: ${VALID_CLIENTS.join(", ")}` }, 400);
340
- return;
341
- }
342
- const workingDirectory = typeof body.workingDirectory === "string" ? body.workingDirectory.trim() : "";
343
- if (!workingDirectory) {
344
- json({ error: "workingDirectory is required" }, 400);
345
- return;
346
- }
347
- const { TELEGRAM_TOKEN, TELEGRAM_CHAT_ID } = config;
348
- if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID) {
349
- json({ error: "Telegram is not configured" }, 500);
350
- return;
351
- }
352
- const telegram = new TelegramClient(TELEGRAM_TOKEN);
353
- const threadId = await createManagedTopic(telegram, TELEGRAM_CHAT_ID, name);
354
- const thread = ctx.threadLifecycle.registerThread(db, {
355
- threadId,
356
- name,
357
- type: "root",
358
- client: agentType ?? getAgentType(),
359
- workingDirectory,
360
- chatId: TELEGRAM_CHAT_ID,
361
- telegramTopicId: threadId,
362
- });
363
- json({ ok: true, threadId, thread }, 201);
364
- syncKeepAliveToSettings(db);
365
- }
366
- catch (err) {
367
- json({ error: errorMessage(err) }, 500);
368
- }
369
- })();
370
- return true;
371
- };
372
- // ─── POST /api/threads/create-branch — create a fresh topic + branch thread ──
373
- /**
374
- * Create a branch thread under an existing root: opens a Telegram forum topic
375
- * and registers it with type=branch. Working directory and agent type are
376
- * inherited from the parent root unless overridden.
377
- */
378
- export const handleCreateBranch = ({ req, json, db, ctx }) => {
379
- void (async () => {
380
- try {
381
- const raw = await readBody(req);
382
- const body = safeParseJSON(raw);
383
- if (!body || typeof body !== "object") {
384
- json({ error: "Invalid request body" }, 400);
385
- return;
386
- }
387
- const rootThreadId = body.rootThreadId;
388
- if (typeof rootThreadId !== "number" || !Number.isInteger(rootThreadId) || rootThreadId <= 0) {
389
- json({ error: "rootThreadId must be a positive integer" }, 400);
390
- return;
391
- }
392
- const name = typeof body.name === "string" ? body.name.trim() : "";
393
- if (!name) {
394
- json({ error: "name is required" }, 400);
395
- return;
396
- }
397
- const parent = getThread(db, rootThreadId);
398
- if (!parent) {
399
- json({ error: `Root thread ${rootThreadId} not found` }, 404);
400
- return;
401
- }
402
- if (parent.type === "worker") {
403
- json({ error: "Cannot branch from a worker thread" }, 400);
404
- return;
405
- }
406
- const agentType = resolveAgentType(body.agentType);
407
- if (agentType === INVALID_AGENT) {
408
- json({ error: `agentType must be one of: ${VALID_CLIENTS.join(", ")}` }, 400);
409
- return;
410
- }
411
- const workingDirectoryOverride = typeof body.workingDirectory === "string" && body.workingDirectory.trim()
412
- ? body.workingDirectory.trim()
413
- : undefined;
414
- const { TELEGRAM_TOKEN, TELEGRAM_CHAT_ID } = config;
415
- if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID) {
416
- json({ error: "Telegram is not configured" }, 500);
417
- return;
418
- }
419
- const telegram = new TelegramClient(TELEGRAM_TOKEN);
420
- const threadId = await createManagedTopic(telegram, TELEGRAM_CHAT_ID, name);
421
- const thread = ctx.threadLifecycle.registerThread(db, {
422
- threadId,
423
- name,
424
- type: "branch",
425
- rootThreadId,
426
- client: agentType ?? parent.client ?? getAgentType(),
427
- workingDirectory: workingDirectoryOverride ?? parent.workingDirectory ?? undefined,
428
- chatId: TELEGRAM_CHAT_ID,
429
- telegramTopicId: threadId,
430
- });
431
- try {
432
- const fork = forkMemory(db, rootThreadId, threadId);
433
- log.info(`[create-branch] Forked memory ${rootThreadId} → ${threadId}: ${fork.notesCopied} notes, ${fork.narrativesCopied} narratives, ${fork.episodesCopied} episodes`);
434
- }
435
- catch (err) {
436
- log.warn(`[create-branch] Memory fork failed (non-fatal): ${errorMessage(err)}`);
437
- }
438
- json({ ok: true, threadId, thread }, 201);
439
- syncKeepAliveToSettings(db);
440
- }
441
- catch (err) {
442
- json({ error: errorMessage(err) }, 500);
443
- }
444
- })();
445
- return true;
446
- };
447
- /** Sentinel returned by resolveAgentType when an explicit agentType is invalid. */
448
- const INVALID_AGENT = Symbol("invalid-agent");
449
- /** Validate an optional agentType field: undefined → undefined, valid → the value, invalid → INVALID_AGENT. */
450
- function resolveAgentType(value) {
451
- if (value === undefined)
452
- return undefined;
453
- if (typeof value === "string" && VALID_CLIENTS.includes(value))
454
- return value;
455
- return INVALID_AGENT;
456
- }
457
- // ─── Dynamic handlers (threadId extracted by caller) ────────────────────────
458
- /** GET /api/threads/:threadId — get single thread */
459
- export function handleGetThread(args, threadId) {
460
- const thread = getThread(args.db, threadId);
461
- if (thread) {
462
- args.json(thread);
463
- }
464
- else {
465
- args.json({ error: `Thread ${threadId} not found` }, 404);
466
- }
467
- return true;
468
- }
469
- /** GET /api/threads/:threadId/running — check if an agent process is alive for this thread */
470
- export function handleGetThreadRunning(args, threadId) {
471
- const running = isThreadRunning(threadId);
472
- args.json({ threadId, running });
473
- return true;
474
- }
475
- /** GET /api/threads/:threadId/heartbeat — last MCP activity timestamp for stuck-process detection */
476
- export function handleGetThreadHeartbeat(args, threadId) {
477
- const lastActivityMs = readThreadHeartbeat(threadId);
478
- args.json({ threadId, lastActivityMs });
479
- return true;
480
- }
481
- /** Locate the most-recently-modified log file for a thread, or null if none exist. */
482
- function findLatestThreadLogFile(threadId) {
483
- let files;
484
- try {
485
- files = readdirSync(THREAD_LOGS_DIR);
486
- }
487
- catch {
488
- return null;
489
- }
490
- const suffixRe = new RegExp(`_${threadId}_\\d{4}-\\d{2}-\\d{2}\\.jsonl?$`);
491
- let best = null;
492
- for (const file of files) {
493
- if (!suffixRe.test(file))
494
- continue;
495
- const full = join(THREAD_LOGS_DIR, file);
496
- try {
497
- const mtimeMs = statSync(full).mtimeMs;
498
- if (!best || mtimeMs > best.mtimeMs)
499
- best = { path: full, mtimeMs };
500
- }
501
- catch { /* file vanished between readdir and stat */ }
502
- }
503
- return best?.path ?? null;
504
- }
505
- /**
506
- * GET /api/threads/:threadId/logs — a readable digest of the agent's raw stdout.
507
- *
508
- * Parses the newest stream-json log file into tail-first turns, then returns a
509
- * single character window (default 4000, Telegram-sized). Callers page deeper
510
- * into history with ?offset=; nextOffset/hasMore drive a "next chunk" button.
511
- */
512
- export function handleGetThreadLogs(args, threadId) {
513
- const { json, url } = args;
514
- const logFile = findLatestThreadLogFile(threadId);
515
- if (!logFile) {
516
- json({ threadId, text: "", offset: 0, nextOffset: 0, hasMore: false, totalLength: 0 });
517
- return true;
518
- }
519
- let raw;
520
- try {
521
- raw = readFileSync(logFile, "utf-8");
522
- }
523
- catch (err) {
524
- json({ error: errorMessage(err) }, 500);
525
- return true;
526
- }
527
- const rendered = renderThreadLog(parseClaudeStreamLog(raw), true);
528
- const page = sliceLogWindow(rendered, Number(url.searchParams.get("offset")), Number(url.searchParams.get("limit")));
529
- json({ threadId, ...page });
530
- return true;
531
- }
532
- /** GET /api/threads/:threadId/children — get children of a root */
533
- export function handleGetThreadChildren(args, rootThreadId) {
534
- const children = withThreadMcpServers(getThreadsByRoot(args.db, rootThreadId));
535
- args.json({ threads: children });
536
- return true;
537
- }
538
116
  /** PATCH /api/threads/:threadId — update a thread */
539
117
  export function handleUpdateThread(args, threadId) {
540
118
  const { req, json, db } = args;
@@ -587,7 +165,10 @@ export function handleUpdateThread(args, threadId) {
587
165
  }
588
166
  json(withThreadMcpServers([getThread(db, threadId)])[0]);
589
167
  // Sync keepAlive to settings.json for watcher backward compatibility
590
- if ("keepAlive" in updates || "client" in updates || "maxRetries" in updates || "cooldownMs" in updates) {
168
+ if ("keepAlive" in updates ||
169
+ "client" in updates ||
170
+ "maxRetries" in updates ||
171
+ "cooldownMs" in updates) {
591
172
  syncKeepAliveToSettings(db);
592
173
  }
593
174
  }
@@ -642,7 +223,9 @@ function deleteTelegramTopic(topicId) {
642
223
  const { TELEGRAM_TOKEN, TELEGRAM_CHAT_ID } = config;
643
224
  if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID)
644
225
  return;
645
- void deleteTelegramTopicByBotApi(TELEGRAM_TOKEN, TELEGRAM_CHAT_ID, topicId).catch(() => { });
226
+ void deleteTelegramTopicByBotApi(TELEGRAM_TOKEN, TELEGRAM_CHAT_ID, topicId).catch(() => {
227
+ /* topic might not exist or already deleted */
228
+ });
646
229
  }
647
230
  // ─── POST /api/threads/:threadId/start — manually start a thread ────────────
648
231
  /** POST /api/threads/:threadId/start — spawn a thread process from the dashboard */
@@ -718,43 +301,4 @@ export function handleConvertToRoot(args, threadId) {
718
301
  })();
719
302
  return true;
720
303
  }
721
- // ─── Settings.json sync for watcher backward compatibility ──────────────────
722
- /**
723
- * Sync thread_registry keepAlive settings to settings.json for watcher backward compatibility.
724
- * The watcher's readKeeperSettingsFromFile() reads settings.json during startup before the MCP server is ready.
725
- */
726
- export function syncKeepAliveToSettings(db) {
727
- try {
728
- const allThreads = getActiveThreads(db);
729
- const activeKeepAlive = allThreads.find(r => r.keepAlive);
730
- if (activeKeepAlive) {
731
- setKeepAliveEnabled(true);
732
- setKeepAliveThreadId(activeKeepAlive.threadId);
733
- if (isValidKeeperClient(activeKeepAlive.client))
734
- setKeepAliveClient(activeKeepAlive.client);
735
- setKeepAliveMaxRetries(activeKeepAlive.maxRetries);
736
- setKeepAliveCooldownMs(activeKeepAlive.cooldownMs);
737
- }
738
- else {
739
- setKeepAliveEnabled(false);
740
- }
741
- // Sync per-thread overrides
742
- for (const t of allThreads) {
743
- if (t.keepAlive) {
744
- setThreadKeepAlive(t.threadId, {
745
- enabled: true,
746
- client: t.client,
747
- maxRetries: t.maxRetries,
748
- cooldownMs: t.cooldownMs,
749
- });
750
- }
751
- else {
752
- removeThreadKeepAlive(t.threadId);
753
- }
754
- }
755
- }
756
- catch (err) {
757
- log.warn(`[threads] Keep-alive sync failed: ${errorMessage(err)}`);
758
- }
759
- }
760
304
  //# sourceMappingURL=threads.js.map