sensorium-mcp 3.0.103 → 3.1.0-refactor.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 (563) 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 +9 -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} +151 -30
  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/sensorium-repair.default.md +1 -1
  485. package/templates/sleep.default.md +1 -1
  486. package/dist/chat-ui/src/main.d.ts +0 -2
  487. package/dist/chat-ui/src/main.d.ts.map +0 -1
  488. package/dist/chat-ui/src/main.js +0 -4
  489. package/dist/chat-ui/src/main.js.map +0 -1
  490. package/dist/chat-ui/src/markdown.d.ts +0 -2
  491. package/dist/chat-ui/src/markdown.d.ts.map +0 -1
  492. package/dist/chat-ui/src/markdown.js +0 -39
  493. package/dist/chat-ui/src/markdown.js.map +0 -1
  494. package/dist/chat-ui/src/mock-data.d.ts +0 -4
  495. package/dist/chat-ui/src/mock-data.d.ts.map +0 -1
  496. package/dist/chat-ui/src/mock-data.js +0 -230
  497. package/dist/chat-ui/src/mock-data.js.map +0 -1
  498. package/dist/chat-ui/src/types.d.ts +0 -47
  499. package/dist/chat-ui/src/types.d.ts.map +0 -1
  500. package/dist/chat-ui/vite.config.d.ts +0 -3
  501. package/dist/chat-ui/vite.config.d.ts.map +0 -1
  502. package/dist/chat-ui/vite.config.js +0 -14
  503. package/dist/chat-ui/vite.config.js.map +0 -1
  504. package/dist/config.d.ts +0 -228
  505. package/dist/config.d.ts.map +0 -1
  506. package/dist/config.js +0 -841
  507. package/dist/config.js.map +0 -1
  508. package/dist/daily-session.d.ts.map +0 -1
  509. package/dist/daily-session.js.map +0 -1
  510. package/dist/dashboard.d.ts +0 -10
  511. package/dist/dashboard.d.ts.map +0 -1
  512. package/dist/dashboard.js +0 -10
  513. package/dist/dashboard.js.map +0 -1
  514. package/dist/data/memory/semantic.d.ts.map +0 -1
  515. package/dist/data/memory/semantic.js +0 -588
  516. package/dist/data/memory/semantic.js.map +0 -1
  517. package/dist/dispatcher.d.ts +0 -9
  518. package/dist/dispatcher.d.ts.map +0 -1
  519. package/dist/dispatcher.js +0 -9
  520. package/dist/dispatcher.js.map +0 -1
  521. package/dist/drive.d.ts.map +0 -1
  522. package/dist/drive.js.map +0 -1
  523. package/dist/http-server.d.ts.map +0 -1
  524. package/dist/http-server.js.map +0 -1
  525. package/dist/intent.d.ts.map +0 -1
  526. package/dist/intent.js.map +0 -1
  527. package/dist/logger.d.ts.map +0 -1
  528. package/dist/logger.js.map +0 -1
  529. package/dist/markdown.d.ts.map +0 -1
  530. package/dist/markdown.js.map +0 -1
  531. package/dist/memory.d.ts +0 -9
  532. package/dist/memory.d.ts.map +0 -1
  533. package/dist/memory.js +0 -9
  534. package/dist/memory.js.map +0 -1
  535. package/dist/openai.d.ts +0 -13
  536. package/dist/openai.d.ts.map +0 -1
  537. package/dist/openai.js +0 -17
  538. package/dist/openai.js.map +0 -1
  539. package/dist/response-builders.d.ts.map +0 -1
  540. package/dist/response-builders.js.map +0 -1
  541. package/dist/scheduler.d.ts.map +0 -1
  542. package/dist/scheduler.js.map +0 -1
  543. package/dist/sessions.d.ts.map +0 -1
  544. package/dist/sessions.js.map +0 -1
  545. package/dist/stdio-server.d.ts.map +0 -1
  546. package/dist/stdio-server.js.map +0 -1
  547. package/dist/telegram.d.ts.map +0 -1
  548. package/dist/telegram.js.map +0 -1
  549. package/dist/tool-definitions.d.ts +0 -2
  550. package/dist/tool-definitions.d.ts.map +0 -1
  551. package/dist/tool-definitions.js +0 -2
  552. package/dist/tool-definitions.js.map +0 -1
  553. package/dist/types.d.ts.map +0 -1
  554. package/dist/types.js.map +0 -1
  555. package/dist/utils.d.ts.map +0 -1
  556. package/dist/utils.js.map +0 -1
  557. /package/dist/{logger.d.ts → lib/logger.d.ts} +0 -0
  558. /package/dist/{markdown.d.ts → lib/markdown.d.ts} +0 -0
  559. /package/dist/{types.js → lib/types.js} +0 -0
  560. /package/dist/{utils.d.ts → lib/utils.d.ts} +0 -0
  561. /package/dist/{drive.d.ts → services/drive.d.ts} +0 -0
  562. /package/dist/{intent.d.ts → services/intent.d.ts} +0 -0
  563. /package/dist/{chat-ui/src → tools/defs}/types.js +0 -0
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Dashboard API — thread creation route handlers: raw registration, root
3
+ * creation (owns Telegram topic creation), and branch creation (with memory
4
+ * fork from the parent root).
5
+ */
6
+ import { registerThread, getThread, } from "../../data/memory/thread-registry.js";
7
+ import { forkMemory } from "../../data/memory/synthesis.js";
8
+ import { config, getAgentType } from "../../config/index.js";
9
+ import { readBody, safeParseJSON } from "./types.js";
10
+ import { VALID_CLIENTS } 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 { createManagedTopic } from "../../services/topic.service.js";
15
+ import { TelegramClient } from "../../services/telegram.js";
16
+ // ─── POST /api/threads — create/register a thread ──────────────────────────
17
+ export const handleCreateThread = ({ req, json, db }) => {
18
+ void (async () => {
19
+ try {
20
+ const raw = await readBody(req);
21
+ const body = safeParseJSON(raw);
22
+ if (!body || typeof body !== "object") {
23
+ json({ error: "Invalid request body" }, 400);
24
+ return;
25
+ }
26
+ const threadId = body.threadId;
27
+ if (typeof threadId !== "number" ||
28
+ !Number.isFinite(threadId) ||
29
+ !Number.isInteger(threadId) ||
30
+ threadId <= 0) {
31
+ json({ error: "threadId must be a positive integer" }, 400);
32
+ return;
33
+ }
34
+ const name = body.name;
35
+ if (typeof name !== "string" || !name.trim()) {
36
+ json({ error: "name is required" }, 400);
37
+ return;
38
+ }
39
+ const validTypes = ["root", "daily", "branch", "worker"];
40
+ const type = body.type;
41
+ if (typeof type !== "string" || !validTypes.includes(type)) {
42
+ json({ error: `type must be one of: ${validTypes.join(", ")}` }, 400);
43
+ return;
44
+ }
45
+ const client = typeof body.client === "string" &&
46
+ VALID_CLIENTS.includes(body.client)
47
+ ? body.client
48
+ : undefined;
49
+ const keepAlive = typeof body.keepAlive === "boolean" ? body.keepAlive : undefined;
50
+ const workingDirectory = typeof body.workingDirectory === "string" && body.workingDirectory.trim()
51
+ ? body.workingDirectory.trim()
52
+ : undefined;
53
+ // Check for duplicate
54
+ const existing = getThread(db, threadId);
55
+ if (existing) {
56
+ json({ error: `Thread ${threadId} already exists` }, 409);
57
+ return;
58
+ }
59
+ const entry = registerThread(db, {
60
+ threadId,
61
+ name: name.trim(),
62
+ type: type,
63
+ rootThreadId: typeof body.rootThreadId === "number" ? body.rootThreadId : undefined,
64
+ badge: typeof body.badge === "string" ? body.badge : undefined,
65
+ client,
66
+ keepAlive,
67
+ workingDirectory,
68
+ });
69
+ json(entry, 201);
70
+ // Sync keepAlive to settings.json for watcher backward compatibility
71
+ if (entry.keepAlive) {
72
+ syncKeepAliveToSettings(db);
73
+ }
74
+ }
75
+ catch (err) {
76
+ json({ error: errorMessage(err) }, 500);
77
+ }
78
+ })();
79
+ return true;
80
+ };
81
+ // ─── POST /api/threads/create-root — create a fresh topic + root thread ─────
82
+ /**
83
+ * Create a brand-new root thread: opens a Telegram forum topic and registers
84
+ * the thread. Unlike POST /api/threads (which only registers a caller-supplied
85
+ * topic id), this owns topic creation so callers without Telegram access (e.g.
86
+ * the supervisor) can spin up threads. keepAlive + dailyRotation default on for
87
+ * root threads via registerThread.
88
+ */
89
+ export const handleCreateRoot = ({ req, json, db, ctx }) => {
90
+ void (async () => {
91
+ try {
92
+ const raw = await readBody(req);
93
+ const body = safeParseJSON(raw);
94
+ if (!body || typeof body !== "object") {
95
+ json({ error: "Invalid request body" }, 400);
96
+ return;
97
+ }
98
+ const name = typeof body.name === "string" ? body.name.trim() : "";
99
+ if (!name) {
100
+ json({ error: "name is required" }, 400);
101
+ return;
102
+ }
103
+ const agentType = resolveAgentType(body.agentType);
104
+ if (agentType === INVALID_AGENT) {
105
+ json({ error: `agentType must be one of: ${VALID_CLIENTS.join(", ")}` }, 400);
106
+ return;
107
+ }
108
+ const workingDirectory = typeof body.workingDirectory === "string" ? body.workingDirectory.trim() : "";
109
+ if (!workingDirectory) {
110
+ json({ error: "workingDirectory is required" }, 400);
111
+ return;
112
+ }
113
+ const { TELEGRAM_TOKEN, TELEGRAM_CHAT_ID } = config;
114
+ if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID) {
115
+ json({ error: "Telegram is not configured" }, 500);
116
+ return;
117
+ }
118
+ const telegram = new TelegramClient(TELEGRAM_TOKEN);
119
+ const threadId = await createManagedTopic(telegram, TELEGRAM_CHAT_ID, name);
120
+ const thread = ctx.threadLifecycle.registerThread(db, {
121
+ threadId,
122
+ name,
123
+ type: "root",
124
+ client: agentType ?? getAgentType(),
125
+ workingDirectory,
126
+ chatId: TELEGRAM_CHAT_ID,
127
+ telegramTopicId: threadId,
128
+ });
129
+ json({ ok: true, threadId, thread }, 201);
130
+ syncKeepAliveToSettings(db);
131
+ }
132
+ catch (err) {
133
+ json({ error: errorMessage(err) }, 500);
134
+ }
135
+ })();
136
+ return true;
137
+ };
138
+ // ─── POST /api/threads/create-branch — create a fresh topic + branch thread ──
139
+ /**
140
+ * Create a branch thread under an existing root: opens a Telegram forum topic
141
+ * and registers it with type=branch. Working directory and agent type are
142
+ * inherited from the parent root unless overridden.
143
+ */
144
+ export const handleCreateBranch = ({ req, json, db, ctx }) => {
145
+ void (async () => {
146
+ try {
147
+ const raw = await readBody(req);
148
+ const body = safeParseJSON(raw);
149
+ if (!body || typeof body !== "object") {
150
+ json({ error: "Invalid request body" }, 400);
151
+ return;
152
+ }
153
+ const rootThreadId = body.rootThreadId;
154
+ if (typeof rootThreadId !== "number" ||
155
+ !Number.isInteger(rootThreadId) ||
156
+ rootThreadId <= 0) {
157
+ json({ error: "rootThreadId must be a positive integer" }, 400);
158
+ return;
159
+ }
160
+ const name = typeof body.name === "string" ? body.name.trim() : "";
161
+ if (!name) {
162
+ json({ error: "name is required" }, 400);
163
+ return;
164
+ }
165
+ const parent = getThread(db, rootThreadId);
166
+ if (!parent) {
167
+ json({ error: `Root thread ${rootThreadId} not found` }, 404);
168
+ return;
169
+ }
170
+ if (parent.type === "worker") {
171
+ json({ error: "Cannot branch from a worker thread" }, 400);
172
+ return;
173
+ }
174
+ const agentType = resolveAgentType(body.agentType);
175
+ if (agentType === INVALID_AGENT) {
176
+ json({ error: `agentType must be one of: ${VALID_CLIENTS.join(", ")}` }, 400);
177
+ return;
178
+ }
179
+ const workingDirectoryOverride = typeof body.workingDirectory === "string" && body.workingDirectory.trim()
180
+ ? body.workingDirectory.trim()
181
+ : undefined;
182
+ const { TELEGRAM_TOKEN, TELEGRAM_CHAT_ID } = config;
183
+ if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID) {
184
+ json({ error: "Telegram is not configured" }, 500);
185
+ return;
186
+ }
187
+ const telegram = new TelegramClient(TELEGRAM_TOKEN);
188
+ const threadId = await createManagedTopic(telegram, TELEGRAM_CHAT_ID, name);
189
+ const thread = ctx.threadLifecycle.registerThread(db, {
190
+ threadId,
191
+ name,
192
+ type: "branch",
193
+ rootThreadId,
194
+ client: agentType ?? parent.client ?? getAgentType(),
195
+ workingDirectory: workingDirectoryOverride ?? parent.workingDirectory ?? undefined,
196
+ chatId: TELEGRAM_CHAT_ID,
197
+ telegramTopicId: threadId,
198
+ });
199
+ try {
200
+ const fork = forkMemory(db, rootThreadId, threadId);
201
+ log.info(`[create-branch] Forked memory ${rootThreadId} → ${threadId}: ${fork.notesCopied} notes, ${fork.narrativesCopied} narratives, ${fork.episodesCopied} episodes`);
202
+ }
203
+ catch (err) {
204
+ log.warn(`[create-branch] Memory fork failed (non-fatal): ${errorMessage(err)}`);
205
+ }
206
+ json({ ok: true, threadId, thread }, 201);
207
+ syncKeepAliveToSettings(db);
208
+ }
209
+ catch (err) {
210
+ json({ error: errorMessage(err) }, 500);
211
+ }
212
+ })();
213
+ return true;
214
+ };
215
+ /** Sentinel returned by resolveAgentType when an explicit agentType is invalid. */
216
+ const INVALID_AGENT = Symbol("invalid-agent");
217
+ /** Validate an optional agentType field: undefined → undefined, valid → the value, invalid → INVALID_AGENT. */
218
+ function resolveAgentType(value) {
219
+ if (value === undefined)
220
+ return undefined;
221
+ if (typeof value === "string" && VALID_CLIENTS.includes(value))
222
+ return value;
223
+ return INVALID_AGENT;
224
+ }
225
+ //# sourceMappingURL=threads-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads-create.js","sourceRoot":"","sources":["../../../src/dashboard/routes/threads-create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Dashboard API — shared helpers for the thread route handlers: update-body
3
+ * validation, thread-name enrichment, per-thread MCP server attachment/parsing.
4
+ */
5
+ import type { ThreadRegistryEntry } from "../../data/memory/thread-registry.js";
6
+ import type { Database } from "../../data/memory/schema.js";
7
+ import { maskThreadMcpServers, type ThreadMcpServer } from "../../config/index.js";
8
+ export declare const VALID_CLIENTS: readonly ["claude", "copilot", "codex", "openai_codex"];
9
+ /** Extract valid update fields from a request body. Returns an error string on validation failure. */
10
+ export declare function buildThreadUpdates(body: Record<string, unknown>): Partial<Pick<ThreadRegistryEntry, "name" | "status" | "keepAlive" | "dailyRotation" | "autonomousMode" | "client" | "maxRetries" | "cooldownMs" | "badge" | "identityPrompt" | "telegramTopicId" | "workingDirectory">> | string;
11
+ /**
12
+ * Enrich thread entries with topic names from topic_registry
13
+ * when the thread name is generic (e.g. "Thread 1234").
14
+ */
15
+ export declare function enrichThreadNames(db: Database, threads: ThreadRegistryEntry[]): ThreadRegistryEntry[];
16
+ export type ThreadEntryOut = ThreadRegistryEntry & {
17
+ mcpServers: ReturnType<typeof maskThreadMcpServers> | null;
18
+ };
19
+ /** Attach each thread's custom MCP servers (settings.json, not the DB), header values masked. */
20
+ export declare function withThreadMcpServers(threads: ThreadRegistryEntry[]): ThreadEntryOut[];
21
+ /**
22
+ * Coerce a PATCH `mcpServers` body into a validated server map (or null to clear).
23
+ * Shape-checks http-only transport and rejects the header mask sentinel so a
24
+ * round-tripped masked value can never be persisted. Returns an error string on
25
+ * malformed input; deeper rules (reserved names) are enforced by setThreadMcpServers.
26
+ */
27
+ export declare function parseThreadMcpServersBody(raw: unknown): Record<string, ThreadMcpServer> | null | string;
28
+ //# sourceMappingURL=threads-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads-helpers.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/threads-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAEL,oBAAoB,EAEpB,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAG/B,eAAO,MAAM,aAAa,yDAA0D,CAAC;AAErF,sGAAsG;AACtG,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAE3B,OAAO,CACL,IAAI,CACF,mBAAmB,EACjB,MAAM,GACN,QAAQ,GACR,WAAW,GACX,eAAe,GACf,gBAAgB,GAChB,QAAQ,GACR,YAAY,GACZ,YAAY,GACZ,OAAO,GACP,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,CACrB,CACF,GACD,MAAM,CAgET;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,mBAAmB,EAAE,GAC7B,mBAAmB,EAAE,CAwBvB;AAED,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG;IACjD,UAAU,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,GAAG,IAAI,CAAC;CAC5D,CAAC;AAEF,iGAAiG;AACjG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,cAAc,EAAE,CAMrF;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,OAAO,GACX,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,GAAG,MAAM,CA0BjD"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Dashboard API — shared helpers for the thread route handlers: update-body
3
+ * validation, thread-name enrichment, per-thread MCP server attachment/parsing.
4
+ */
5
+ import { getAllThreadMcpServers, maskThreadMcpServers, MASK_SENTINEL, } from "../../config/index.js";
6
+ const VALID_STATUSES = ["active", "archived", "expired", "exited"];
7
+ export const VALID_CLIENTS = ["claude", "copilot", "codex", "openai_codex"];
8
+ /** Extract valid update fields from a request body. Returns an error string on validation failure. */
9
+ export function buildThreadUpdates(body) {
10
+ const updates = {};
11
+ if (typeof body.name === "string" && body.name.trim())
12
+ updates.name = body.name.trim();
13
+ if (typeof body.status === "string") {
14
+ if (!VALID_STATUSES.includes(body.status)) {
15
+ return `status must be one of: ${VALID_STATUSES.join(", ")}`;
16
+ }
17
+ updates.status = body.status;
18
+ }
19
+ if (typeof body.keepAlive === "boolean")
20
+ updates.keepAlive = body.keepAlive;
21
+ if (typeof body.dailyRotation === "boolean")
22
+ updates.dailyRotation = body.dailyRotation;
23
+ if (typeof body.autonomousMode === "boolean")
24
+ updates.autonomousMode = body.autonomousMode;
25
+ if (typeof body.client === "string") {
26
+ if (!VALID_CLIENTS.includes(body.client)) {
27
+ return `client must be one of: ${VALID_CLIENTS.join(", ")}`;
28
+ }
29
+ updates.client = body.client;
30
+ }
31
+ if (typeof body.maxRetries === "number") {
32
+ if (!Number.isFinite(body.maxRetries) ||
33
+ !Number.isInteger(body.maxRetries) ||
34
+ body.maxRetries < 0) {
35
+ return "maxRetries must be a non-negative integer";
36
+ }
37
+ updates.maxRetries = body.maxRetries;
38
+ }
39
+ if (typeof body.cooldownMs === "number") {
40
+ if (!Number.isFinite(body.cooldownMs) ||
41
+ !Number.isInteger(body.cooldownMs) ||
42
+ body.cooldownMs < 0) {
43
+ return "cooldownMs must be a non-negative integer";
44
+ }
45
+ updates.cooldownMs = body.cooldownMs;
46
+ }
47
+ if (typeof body.badge === "string")
48
+ updates.badge = body.badge;
49
+ if (typeof body.identityPrompt === "string")
50
+ updates.identityPrompt = body.identityPrompt;
51
+ if (body.identityPrompt === null)
52
+ updates.identityPrompt = null;
53
+ if (typeof body.telegramTopicId === "number" && Number.isFinite(body.telegramTopicId))
54
+ updates.telegramTopicId = body.telegramTopicId;
55
+ if (body.telegramTopicId === null)
56
+ updates.telegramTopicId = null;
57
+ if (typeof body.workingDirectory === "string" && body.workingDirectory.trim())
58
+ updates.workingDirectory = body.workingDirectory.trim();
59
+ if (body.workingDirectory === null)
60
+ updates.workingDirectory = null;
61
+ return updates;
62
+ }
63
+ /**
64
+ * Enrich thread entries with topic names from topic_registry
65
+ * when the thread name is generic (e.g. "Thread 1234").
66
+ */
67
+ export function enrichThreadNames(db, threads) {
68
+ const genericPattern = /^Thread \d+$/i;
69
+ const needsEnrichment = threads.filter((t) => genericPattern.test(t.name));
70
+ if (needsEnrichment.length === 0)
71
+ return threads;
72
+ try {
73
+ const topicNames = new Map();
74
+ const rows = db.prepare(`SELECT thread_id, name FROM topic_registry`).all();
75
+ for (const r of rows)
76
+ topicNames.set(r.thread_id, r.name);
77
+ return threads.map((t) => {
78
+ if (!genericPattern.test(t.name))
79
+ return t;
80
+ // Check topic_registry by thread_id or telegramTopicId
81
+ const topicName = topicNames.get(t.telegramTopicId ?? t.threadId) ?? topicNames.get(t.threadId);
82
+ if (topicName)
83
+ return { ...t, name: topicName };
84
+ return t;
85
+ });
86
+ }
87
+ catch {
88
+ return threads; // topic_registry might not exist
89
+ }
90
+ }
91
+ /** Attach each thread's custom MCP servers (settings.json, not the DB), header values masked. */
92
+ export function withThreadMcpServers(threads) {
93
+ const all = getAllThreadMcpServers();
94
+ return threads.map((t) => {
95
+ const s = all[String(t.threadId)];
96
+ return { ...t, mcpServers: s ? maskThreadMcpServers(s) : null };
97
+ });
98
+ }
99
+ /**
100
+ * Coerce a PATCH `mcpServers` body into a validated server map (or null to clear).
101
+ * Shape-checks http-only transport and rejects the header mask sentinel so a
102
+ * round-tripped masked value can never be persisted. Returns an error string on
103
+ * malformed input; deeper rules (reserved names) are enforced by setThreadMcpServers.
104
+ */
105
+ export function parseThreadMcpServersBody(raw) {
106
+ if (raw === null || raw === undefined)
107
+ return null;
108
+ if (typeof raw !== "object" || Array.isArray(raw))
109
+ return "mcpServers must be an object or null";
110
+ const out = {};
111
+ for (const [name, val] of Object.entries(raw)) {
112
+ if (!val || typeof val !== "object" || Array.isArray(val))
113
+ return `mcpServers["${name}"] must be an object`;
114
+ const o = val;
115
+ if (o.type !== "http")
116
+ return `mcpServers["${name}"] must have type "http"`;
117
+ if (typeof o.url !== "string" || !o.url.trim())
118
+ return `mcpServers["${name}"] requires a url`;
119
+ const entry = { type: "http", url: o.url.trim() };
120
+ if (o.headers !== undefined && o.headers !== null) {
121
+ if (typeof o.headers !== "object" || Array.isArray(o.headers))
122
+ return `mcpServers["${name}"].headers must be an object`;
123
+ const headers = {};
124
+ for (const [k, v] of Object.entries(o.headers)) {
125
+ if (typeof v !== "string")
126
+ return `mcpServers["${name}"].headers["${k}"] must be a string`;
127
+ if (v.includes(MASK_SENTINEL))
128
+ return `mcpServers["${name}"].headers["${k}"] still masked — re-enter the value`;
129
+ headers[k] = v;
130
+ }
131
+ if (Object.keys(headers).length > 0)
132
+ entry.headers = headers;
133
+ }
134
+ out[name] = entry;
135
+ }
136
+ return out;
137
+ }
138
+ //# sourceMappingURL=threads-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads-helpers.js","sourceRoot":"","sources":["../../../src/dashboard/routes/threads-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,GAEd,MAAM,uBAAuB,CAAC;AAE/B,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAC5E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,CAAU,CAAC;AAErF,sGAAsG;AACtG,MAAM,UAAU,kBAAkB,CAChC,IAA6B;IAoB7B,MAAM,OAAO,GAgBT,EAAE,CAAC;IACP,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACvF,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACpC,IAAI,CAAE,cAAoC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,OAAO,0BAA0B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAuC,CAAC;IAChE,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAC5E,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,SAAS;QAAE,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IACxF,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,SAAS;QAAE,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IAC3F,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACpC,IAAI,CAAE,aAAmC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChE,OAAO,0BAA0B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/B,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACxC,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;YACjC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;YAClC,IAAI,CAAC,UAAU,GAAG,CAAC,EACnB,CAAC;YACD,OAAO,2CAA2C,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACxC,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;YACjC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;YAClC,IAAI,CAAC,UAAU,GAAG,CAAC,EACnB,CAAC;YACD,OAAO,2CAA2C,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC/D,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ;QAAE,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IAC1F,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI;QAAE,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAChE,IAAI,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC;QACnF,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;IACjD,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI;QAAE,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAClE,IAAI,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;QAC3E,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;IAC1D,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;QAAE,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IACpE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,EAAY,EACZ,OAA8B;IAE9B,MAAM,cAAc,GAAG,eAAe,CAAC;IACvC,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAGtE,CAAC;QACJ,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAE1D,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;YAC3C,uDAAuD;YACvD,MAAM,SAAS,GACb,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAChF,IAAI,SAAS;gBAAE,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAChD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,CAAC,iCAAiC;IACnD,CAAC;AACH,CAAC;AAMD,iGAAiG;AACjG,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,MAAM,GAAG,GAAG,sBAAsB,EAAE,CAAC;IACrC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACvB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClC,OAAO,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,GAAY;IAEZ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,sCAAsC,CAAC;IACjG,MAAM,GAAG,GAAoC,EAAE,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YACvD,OAAO,eAAe,IAAI,sBAAsB,CAAC;QACnD,MAAM,CAAC,GAAG,GAA8B,CAAC;QACzC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,eAAe,IAAI,0BAA0B,CAAC;QAC5E,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE,OAAO,eAAe,IAAI,mBAAmB,CAAC;QAC9F,MAAM,KAAK,GAAoB,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QACnE,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAClD,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC3D,OAAO,eAAe,IAAI,8BAA8B,CAAC;YAC3D,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAkC,CAAC,EAAE,CAAC;gBAC1E,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,OAAO,eAAe,IAAI,eAAe,CAAC,qBAAqB,CAAC;gBAC3F,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;oBAC3B,OAAO,eAAe,IAAI,eAAe,CAAC,sCAAsC,CAAC;gBACnF,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QAC/D,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Dashboard API — read-only thread route handlers: listing endpoints, single
3
+ * thread lookup, running/heartbeat probes, log digests, and children.
4
+ */
5
+ import { type RouteHandler, type RouteArgs } from "./types.js";
6
+ export declare const handleGetThreads: RouteHandler;
7
+ export declare const handleGetRootThreads: RouteHandler;
8
+ export declare const handleGetKeepAliveThreads: RouteHandler;
9
+ export declare const handleGetArchivedThreads: RouteHandler;
10
+ /** GET /api/threads/:threadId — get single thread */
11
+ export declare function handleGetThread(args: RouteArgs, threadId: number): boolean;
12
+ /** GET /api/threads/:threadId/running — check if an agent process is alive for this thread */
13
+ export declare function handleGetThreadRunning(args: RouteArgs, threadId: number): boolean;
14
+ /** GET /api/threads/:threadId/heartbeat — last MCP activity timestamp for stuck-process detection */
15
+ export declare function handleGetThreadHeartbeat(args: RouteArgs, threadId: number): boolean;
16
+ /**
17
+ * GET /api/threads/:threadId/logs — a readable digest of the agent's raw stdout.
18
+ *
19
+ * Parses the newest stream-json log file into tail-first turns, then returns a
20
+ * single character window (default 4000, Telegram-sized). Callers page deeper
21
+ * into history with ?offset=; nextOffset/hasMore drive a "next chunk" button.
22
+ */
23
+ export declare function handleGetThreadLogs(args: RouteArgs, threadId: number): boolean;
24
+ /** GET /api/threads/:threadId/children — get children of a root */
25
+ export declare function handleGetThreadChildren(args: RouteArgs, rootThreadId: number): boolean;
26
+ //# sourceMappingURL=threads-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads-read.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/threads-read.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAW/D,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,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;AA0BD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA0B9E;AAED,mEAAmE;AACnE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAItF"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Dashboard API — read-only thread route handlers: listing endpoints, single
3
+ * thread lookup, running/heartbeat probes, log digests, and children.
4
+ */
5
+ import { getThread, getRootThreads, getKeepAliveThreads, getArchivedThreads, getDashboardThreads, getThreadsByRoot, } from "../../data/memory/thread-registry.js";
6
+ import { enrichThreadNames, withThreadMcpServers } from "./threads-helpers.js";
7
+ import { errorMessage } from "../../lib/utils.js";
8
+ import { isThreadRunning, THREAD_LOGS_DIR } from "../../services/process.service.js";
9
+ import { readThreadHeartbeat } from "../../data/file-storage.js";
10
+ import { parseClaudeStreamLog, renderThreadLog, sliceLogWindow } from "../log-parser.js";
11
+ import { readdirSync, statSync, readFileSync } from "node:fs";
12
+ import { join } from "node:path";
13
+ // ─── GET /api/threads — list all active threads grouped ─────────────────────
14
+ export const handleGetThreads = ({ json, db }) => {
15
+ const threads = withThreadMcpServers(enrichThreadNames(db, getDashboardThreads(db)));
16
+ json({ threads });
17
+ return true;
18
+ };
19
+ // ─── GET /api/threads/roots — list root threads only ────────────────────────
20
+ export const handleGetRootThreads = ({ json, db }) => {
21
+ json({ threads: withThreadMcpServers(enrichThreadNames(db, getRootThreads(db))) });
22
+ return true;
23
+ };
24
+ // ─── GET /api/threads/keepalive — list all threads with keepAlive=true (excl. workers) ─
25
+ export const handleGetKeepAliveThreads = ({ json, db }) => {
26
+ json({ threads: withThreadMcpServers(enrichThreadNames(db, getKeepAliveThreads(db))) });
27
+ return true;
28
+ };
29
+ // ─── GET /api/threads/archived — list archived threads ──────────────────────
30
+ export const handleGetArchivedThreads = ({ json, db }) => {
31
+ const threads = withThreadMcpServers(enrichThreadNames(db, getArchivedThreads(db)));
32
+ json({ threads });
33
+ return true;
34
+ };
35
+ // ─── Dynamic handlers (threadId extracted by caller) ────────────────────────
36
+ /** GET /api/threads/:threadId — get single thread */
37
+ export function handleGetThread(args, threadId) {
38
+ const thread = getThread(args.db, threadId);
39
+ if (thread) {
40
+ args.json(thread);
41
+ }
42
+ else {
43
+ args.json({ error: `Thread ${threadId} not found` }, 404);
44
+ }
45
+ return true;
46
+ }
47
+ /** GET /api/threads/:threadId/running — check if an agent process is alive for this thread */
48
+ export function handleGetThreadRunning(args, threadId) {
49
+ const running = isThreadRunning(threadId);
50
+ args.json({ threadId, running });
51
+ return true;
52
+ }
53
+ /** GET /api/threads/:threadId/heartbeat — last MCP activity timestamp for stuck-process detection */
54
+ export function handleGetThreadHeartbeat(args, threadId) {
55
+ const lastActivityMs = readThreadHeartbeat(threadId);
56
+ args.json({ threadId, lastActivityMs });
57
+ return true;
58
+ }
59
+ /** Locate the most-recently-modified log file for a thread, or null if none exist. */
60
+ function findLatestThreadLogFile(threadId) {
61
+ let files;
62
+ try {
63
+ files = readdirSync(THREAD_LOGS_DIR);
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ const suffixRe = new RegExp(`_${threadId}_\\d{4}-\\d{2}-\\d{2}\\.jsonl?$`);
69
+ let best = null;
70
+ for (const file of files) {
71
+ if (!suffixRe.test(file))
72
+ continue;
73
+ const full = join(THREAD_LOGS_DIR, file);
74
+ try {
75
+ const mtimeMs = statSync(full).mtimeMs;
76
+ if (!best || mtimeMs > best.mtimeMs)
77
+ best = { path: full, mtimeMs };
78
+ }
79
+ catch {
80
+ /* file vanished between readdir and stat */
81
+ }
82
+ }
83
+ return best?.path ?? null;
84
+ }
85
+ /**
86
+ * GET /api/threads/:threadId/logs — a readable digest of the agent's raw stdout.
87
+ *
88
+ * Parses the newest stream-json log file into tail-first turns, then returns a
89
+ * single character window (default 4000, Telegram-sized). Callers page deeper
90
+ * into history with ?offset=; nextOffset/hasMore drive a "next chunk" button.
91
+ */
92
+ export function handleGetThreadLogs(args, threadId) {
93
+ const { json, url } = args;
94
+ const logFile = findLatestThreadLogFile(threadId);
95
+ if (!logFile) {
96
+ json({ threadId, text: "", offset: 0, nextOffset: 0, hasMore: false, totalLength: 0 });
97
+ return true;
98
+ }
99
+ let raw;
100
+ try {
101
+ raw = readFileSync(logFile, "utf-8");
102
+ }
103
+ catch (err) {
104
+ json({ error: errorMessage(err) }, 500);
105
+ return true;
106
+ }
107
+ const rendered = renderThreadLog(parseClaudeStreamLog(raw), true);
108
+ const page = sliceLogWindow(rendered, Number(url.searchParams.get("offset")), Number(url.searchParams.get("limit")));
109
+ json({ threadId, ...page });
110
+ return true;
111
+ }
112
+ /** GET /api/threads/:threadId/children — get children of a root */
113
+ export function handleGetThreadChildren(args, rootThreadId) {
114
+ const children = withThreadMcpServers(getThreadsByRoot(args.db, rootThreadId));
115
+ args.json({ threads: children });
116
+ return true;
117
+ }
118
+ //# sourceMappingURL=threads-read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads-read.js","sourceRoot":"","sources":["../../../src/dashboard/routes/threads-read.ts"],"names":[],"mappings":"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"}
@@ -1,46 +1,12 @@
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 type { Database } from "../../data/memory/schema.js";
6
- import { type RouteHandler, type RouteArgs } from "./types.js";
7
- export declare const handleGetThreads: RouteHandler;
8
- export declare const handleGetRootThreads: RouteHandler;
9
- export declare const handleGetKeepAliveThreads: RouteHandler;
10
- export declare const handleGetArchivedThreads: RouteHandler;
7
+ import { type RouteArgs } from "./types.js";
11
8
  export declare function handleUnarchiveThread(args: RouteArgs, threadId: number): boolean;
12
9
  export declare function handleGenerateSummary(args: RouteArgs, threadId: number): boolean;
13
- export declare const handleCreateThread: RouteHandler;
14
- /**
15
- * Create a brand-new root thread: opens a Telegram forum topic and registers
16
- * the thread. Unlike POST /api/threads (which only registers a caller-supplied
17
- * topic id), this owns topic creation so callers without Telegram access (e.g.
18
- * the supervisor) can spin up threads. keepAlive + dailyRotation default on for
19
- * root threads via registerThread.
20
- */
21
- export declare const handleCreateRoot: RouteHandler;
22
- /**
23
- * Create a branch thread under an existing root: opens a Telegram forum topic
24
- * and registers it with type=branch. Working directory and agent type are
25
- * inherited from the parent root unless overridden.
26
- */
27
- export declare const handleCreateBranch: RouteHandler;
28
- /** GET /api/threads/:threadId — get single thread */
29
- export declare function handleGetThread(args: RouteArgs, threadId: number): boolean;
30
- /** GET /api/threads/:threadId/running — check if an agent process is alive for this thread */
31
- export declare function handleGetThreadRunning(args: RouteArgs, threadId: number): boolean;
32
- /** GET /api/threads/:threadId/heartbeat — last MCP activity timestamp for stuck-process detection */
33
- export declare function handleGetThreadHeartbeat(args: RouteArgs, threadId: number): boolean;
34
- /**
35
- * GET /api/threads/:threadId/logs — a readable digest of the agent's raw stdout.
36
- *
37
- * Parses the newest stream-json log file into tail-first turns, then returns a
38
- * single character window (default 4000, Telegram-sized). Callers page deeper
39
- * into history with ?offset=; nextOffset/hasMore drive a "next chunk" button.
40
- */
41
- export declare function handleGetThreadLogs(args: RouteArgs, threadId: number): boolean;
42
- /** GET /api/threads/:threadId/children — get children of a root */
43
- export declare function handleGetThreadChildren(args: RouteArgs, rootThreadId: number): boolean;
44
10
  /** PATCH /api/threads/:threadId — update a thread */
45
11
  export declare function handleUpdateThread(args: RouteArgs, threadId: number): boolean;
46
12
  /** DELETE /api/threads/:threadId — archive or delete a thread */
@@ -49,9 +15,4 @@ export declare function handleDeleteThread(args: RouteArgs, threadId: number): b
49
15
  export declare function handleStartThread(args: RouteArgs, threadId: number): boolean;
50
16
  /** POST /api/threads/:threadId/convert-to-root — convert a branch thread to a root thread */
51
17
  export declare function handleConvertToRoot(args: RouteArgs, threadId: number): boolean;
52
- /**
53
- * Sync thread_registry keepAlive settings to settings.json for watcher backward compatibility.
54
- * The watcher's readKeeperSettingsFromFile() reads settings.json during startup before the MCP server is ready.
55
- */
56
- export declare function syncKeepAliveToSettings(db: Database): void;
57
18
  //# sourceMappingURL=threads.d.ts.map