agent-log-viewer 1.0.0 → 1.0.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 (582) hide show
  1. package/README.md +12 -21
  2. package/bin/cli.mjs +28 -4
  3. package/bin/mcp-server.mjs +7 -0
  4. package/bin/mcp-server.test.ts +2 -0
  5. package/bin/provision-telegram-connector.mjs +193 -0
  6. package/bin/server-runtime.mjs +4 -8
  7. package/bin/server-runtime.test.ts +46 -7
  8. package/bin/telegram-login-bridge.py +253 -0
  9. package/bin/telegram-mcp-server.py +106 -0
  10. package/bin/telegram-session-reader.mjs +6 -0
  11. package/bin/telegram-session-validator.mjs +71 -0
  12. package/dist/mcp-server.mjs +31771 -25627
  13. package/dist/standalone/.next/BUILD_ID +1 -1
  14. package/dist/standalone/.next/app-path-routes-manifest.json +22 -15
  15. package/dist/standalone/.next/build-manifest.json +3 -3
  16. package/dist/standalone/.next/prerender-manifest.json +3 -3
  17. package/dist/standalone/.next/react-loadable-manifest.json +19 -0
  18. package/dist/standalone/.next/required-server-files.json +4 -1
  19. package/dist/standalone/.next/routes-manifest.json +48 -6
  20. package/dist/standalone/.next/server/account-migration-controller-worker.js +1 -0
  21. package/dist/standalone/.next/server/app/_global-error/page.js +3 -3
  22. package/dist/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  23. package/dist/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  24. package/dist/standalone/.next/server/app/_global-error.html +1 -1
  25. package/dist/standalone/.next/server/app/_global-error.rsc +1 -1
  26. package/dist/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  27. package/dist/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  28. package/dist/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  29. package/dist/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  30. package/dist/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  31. package/dist/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  32. package/dist/standalone/.next/server/app/_not-found/page.js +2 -2
  33. package/dist/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  34. package/dist/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  35. package/dist/standalone/.next/server/app/_not-found.html +1 -1
  36. package/dist/standalone/.next/server/app/_not-found.rsc +2 -2
  37. package/dist/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  38. package/dist/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  39. package/dist/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  40. package/dist/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  41. package/dist/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  42. package/dist/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  43. package/dist/standalone/.next/server/app/api/access/route.js +1 -1
  44. package/dist/standalone/.next/server/app/api/access/route.js.nft.json +1 -1
  45. package/dist/standalone/.next/server/app/api/account-migrations/[intentId]/route.js +1 -1
  46. package/dist/standalone/.next/server/app/api/account-migrations/[intentId]/route.js.nft.json +1 -1
  47. package/dist/standalone/.next/server/app/api/accounts/claude/[id]/status/route.js +4 -1
  48. package/dist/standalone/.next/server/app/api/accounts/claude/[id]/status/route.js.nft.json +1 -1
  49. package/dist/standalone/.next/server/app/api/accounts/claude/active/route.js +1 -1
  50. package/dist/standalone/.next/server/app/api/accounts/claude/active/route.js.nft.json +1 -1
  51. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/input/route.js +4 -1
  52. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/input/route.js.nft.json +1 -1
  53. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/route.js +4 -1
  54. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/route.js.nft.json +1 -1
  55. package/dist/standalone/.next/server/app/api/accounts/claude/policy/route.js +1 -1
  56. package/dist/standalone/.next/server/app/api/accounts/claude/policy/route.js.nft.json +1 -1
  57. package/dist/standalone/.next/server/app/api/accounts/claude/route.js +1 -1
  58. package/dist/standalone/.next/server/app/api/accounts/claude/route.js.nft.json +1 -1
  59. package/dist/standalone/.next/server/app/api/accounts/claude/terminal/route.js +4 -1
  60. package/dist/standalone/.next/server/app/api/accounts/claude/terminal/route.js.nft.json +1 -1
  61. package/dist/standalone/.next/server/app/api/accounts/codex/active/route.js +1 -1
  62. package/dist/standalone/.next/server/app/api/accounts/codex/active/route.js.nft.json +1 -1
  63. package/dist/standalone/.next/server/app/api/accounts/codex/policy/route.js +1 -1
  64. package/dist/standalone/.next/server/app/api/accounts/codex/policy/route.js.nft.json +1 -1
  65. package/dist/standalone/.next/server/app/api/accounts/codex/route.js +1 -1
  66. package/dist/standalone/.next/server/app/api/accounts/codex/route.js.nft.json +1 -1
  67. package/dist/standalone/.next/server/app/api/accounts/codex/terminal/route.js +4 -1
  68. package/dist/standalone/.next/server/app/api/accounts/codex/terminal/route.js.nft.json +1 -1
  69. package/dist/standalone/.next/server/app/api/accounts/route.js +1 -1
  70. package/dist/standalone/.next/server/app/api/accounts/route.js.nft.json +1 -1
  71. package/dist/standalone/.next/server/app/api/agent/route.js +1 -1
  72. package/dist/standalone/.next/server/app/api/agent/route.js.nft.json +1 -1
  73. package/dist/standalone/.next/server/app/api/agent/snapshot/route.js +1 -1
  74. package/dist/standalone/.next/server/app/api/agent/snapshot/route.js.nft.json +1 -1
  75. package/dist/standalone/.next/server/app/api/answer/route.js +1 -1
  76. package/dist/standalone/.next/server/app/api/answer/route.js.nft.json +1 -1
  77. package/dist/standalone/.next/server/app/api/artifact/route.js +1 -0
  78. package/dist/standalone/.next/server/app/api/{orchestrator → artifact}/route.js.nft.json +1 -1
  79. package/dist/standalone/.next/server/app/api/artifact/route_client-reference-manifest.js +1 -0
  80. package/dist/standalone/.next/server/app/api/attach-command/route.js +1 -1
  81. package/dist/standalone/.next/server/app/api/attach-command/route.js.nft.json +1 -1
  82. package/dist/standalone/.next/server/app/api/attention/[id]/route.js +1 -1
  83. package/dist/standalone/.next/server/app/api/attention/[id]/route.js.nft.json +1 -1
  84. package/dist/standalone/.next/server/app/api/attention/route.js +1 -1
  85. package/dist/standalone/.next/server/app/api/attention/route.js.nft.json +1 -1
  86. package/dist/standalone/.next/server/app/api/board/route.js +1 -1
  87. package/dist/standalone/.next/server/app/api/board/route.js.nft.json +1 -1
  88. package/dist/standalone/.next/server/app/api/bridge/route.js +2 -2
  89. package/dist/standalone/.next/server/app/api/bridge/route.js.nft.json +1 -1
  90. package/dist/standalone/.next/server/app/api/conversations/[conversationId]/migration/route.js +1 -1
  91. package/dist/standalone/.next/server/app/api/conversations/[conversationId]/migration/route.js.nft.json +1 -1
  92. package/dist/standalone/.next/server/app/api/conversations/route.js +1 -1
  93. package/dist/standalone/.next/server/app/api/conversations/route.js.nft.json +1 -1
  94. package/dist/standalone/.next/server/app/api/files/route.js +2 -2
  95. package/dist/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  96. package/dist/standalone/.next/server/app/api/flows/[id]/route.js +1 -1
  97. package/dist/standalone/.next/server/app/api/flows/[id]/route.js.nft.json +1 -1
  98. package/dist/standalone/.next/server/app/api/flows/route.js +1 -1
  99. package/dist/standalone/.next/server/app/api/flows/route.js.nft.json +1 -1
  100. package/dist/standalone/.next/server/app/api/image/route.js +1 -1
  101. package/dist/standalone/.next/server/app/api/image/route.js.nft.json +1 -1
  102. package/dist/standalone/.next/server/app/api/inbox/route.js +2 -2
  103. package/dist/standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  104. package/dist/standalone/.next/server/app/api/lifecycle/reaper/route.js +1 -1
  105. package/dist/standalone/.next/server/app/api/lifecycle/reaper/route.js.nft.json +1 -1
  106. package/dist/standalone/.next/server/app/api/limits/history/route.js +4 -1
  107. package/dist/standalone/.next/server/app/api/limits/history/route.js.nft.json +1 -1
  108. package/dist/standalone/.next/server/app/api/limits/route.js +4 -1
  109. package/dist/standalone/.next/server/app/api/limits/route.js.nft.json +1 -1
  110. package/dist/standalone/.next/server/app/api/log/preflight/route.js +1 -1
  111. package/dist/standalone/.next/server/app/api/log/preflight/route.js.nft.json +1 -1
  112. package/dist/standalone/.next/server/app/api/log/project-delete/route.js +1 -1
  113. package/dist/standalone/.next/server/app/api/log/project-delete/route.js.nft.json +1 -1
  114. package/dist/standalone/.next/server/app/api/log/provenance/route.js +1 -0
  115. package/dist/standalone/.next/server/app/api/log/provenance/route.js.nft.json +1 -0
  116. package/dist/standalone/.next/server/app/api/log/provenance/route_client-reference-manifest.js +1 -0
  117. package/dist/standalone/.next/server/app/api/log/route.js +1 -1
  118. package/dist/standalone/.next/server/app/api/log/route.js.nft.json +1 -1
  119. package/dist/standalone/.next/server/app/api/logs/route.js +1 -1
  120. package/dist/standalone/.next/server/app/api/logs/route.js.nft.json +1 -1
  121. package/dist/standalone/.next/server/app/api/logs/stream/route.js +2 -2
  122. package/dist/standalone/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
  123. package/dist/standalone/.next/server/app/api/monitor/lock/route.js +2 -2
  124. package/dist/standalone/.next/server/app/api/monitor/lock/route.js.nft.json +1 -1
  125. package/dist/standalone/.next/server/app/api/monitor/runs/route.js +1 -1
  126. package/dist/standalone/.next/server/app/api/monitor/runs/route.js.nft.json +1 -1
  127. package/dist/standalone/.next/server/app/api/orchestrator/rotate/route.js +1 -1
  128. package/dist/standalone/.next/server/app/api/orchestrator/rotate/route.js.nft.json +1 -1
  129. package/dist/standalone/.next/server/app/api/orchestrator/seat/route.js +1 -1
  130. package/dist/standalone/.next/server/app/api/orchestrator/seat/route.js.nft.json +1 -1
  131. package/dist/standalone/.next/server/app/api/orchestrator/seat/status/route.js +3 -0
  132. package/dist/standalone/.next/server/app/api/orchestrator/seat/status/route.js.nft.json +1 -0
  133. package/dist/standalone/.next/server/app/api/orchestrator/seat/status/route_client-reference-manifest.js +1 -0
  134. package/dist/standalone/.next/server/app/api/pipelines/[id]/route.js +1 -1
  135. package/dist/standalone/.next/server/app/api/pipelines/[id]/route.js.nft.json +1 -1
  136. package/dist/standalone/.next/server/app/api/pipelines/preflight/route.js +1 -1
  137. package/dist/standalone/.next/server/app/api/pipelines/preflight/route.js.nft.json +1 -1
  138. package/dist/standalone/.next/server/app/api/pipelines/route.js +2 -2
  139. package/dist/standalone/.next/server/app/api/pipelines/route.js.nft.json +1 -1
  140. package/dist/standalone/.next/server/app/api/pipelines/tick/route.js +2 -2
  141. package/dist/standalone/.next/server/app/api/pipelines/tick/route.js.nft.json +1 -1
  142. package/dist/standalone/.next/server/app/api/proc/route.js +1 -1
  143. package/dist/standalone/.next/server/app/api/proc/route.js.nft.json +1 -1
  144. package/dist/standalone/.next/server/app/api/projects/create/route.js +3 -0
  145. package/dist/standalone/.next/server/app/api/projects/create/route.js.nft.json +1 -0
  146. package/dist/standalone/.next/server/app/api/projects/create/route_client-reference-manifest.js +1 -0
  147. package/dist/standalone/.next/server/app/api/projects/crown/route.js +1 -0
  148. package/dist/standalone/.next/server/app/api/projects/crown/route.js.nft.json +1 -0
  149. package/dist/standalone/.next/server/app/api/projects/crown/route_client-reference-manifest.js +1 -0
  150. package/dist/standalone/.next/server/app/api/push/route.js +2 -2
  151. package/dist/standalone/.next/server/app/api/push/route.js.nft.json +1 -1
  152. package/dist/standalone/.next/server/app/api/resources/route.js +1 -1
  153. package/dist/standalone/.next/server/app/api/resources/route.js.nft.json +1 -1
  154. package/dist/standalone/.next/server/app/api/roles/route.js +2 -2
  155. package/dist/standalone/.next/server/app/api/roles/route.js.nft.json +1 -1
  156. package/dist/standalone/.next/server/app/api/runtime/answer/route.js +1 -1
  157. package/dist/standalone/.next/server/app/api/runtime/answer/route.js.nft.json +1 -1
  158. package/dist/standalone/.next/server/app/api/runtime/deployments/[deploymentId]/route.js +1 -1
  159. package/dist/standalone/.next/server/app/api/runtime/deployments/[deploymentId]/route.js.nft.json +1 -1
  160. package/dist/standalone/.next/server/app/api/runtime/deployments/capabilities/v1/route.js +1 -1
  161. package/dist/standalone/.next/server/app/api/runtime/deployments/capabilities/v1/route.js.nft.json +1 -1
  162. package/dist/standalone/.next/server/app/api/runtime/deployments/route.js +1 -1
  163. package/dist/standalone/.next/server/app/api/runtime/deployments/route.js.nft.json +1 -1
  164. package/dist/standalone/.next/server/app/api/runtime/interrupt/route.js +1 -1
  165. package/dist/standalone/.next/server/app/api/runtime/interrupt/route.js.nft.json +1 -1
  166. package/dist/standalone/.next/server/app/api/runtime/operations/[operationId]/route.js +1 -1
  167. package/dist/standalone/.next/server/app/api/runtime/operations/[operationId]/route.js.nft.json +1 -1
  168. package/dist/standalone/.next/server/app/api/runtime/operations/route.js +1 -1
  169. package/dist/standalone/.next/server/app/api/runtime/operations/route.js.nft.json +1 -1
  170. package/dist/standalone/.next/server/app/api/runtime/realtime/route.js +1 -1
  171. package/dist/standalone/.next/server/app/api/runtime/realtime/route.js.nft.json +1 -1
  172. package/dist/standalone/.next/server/app/api/runtime/send/route.js +1 -1
  173. package/dist/standalone/.next/server/app/api/runtime/send/route.js.nft.json +1 -1
  174. package/dist/standalone/.next/server/app/api/runtime/snapshot/route.js +1 -1
  175. package/dist/standalone/.next/server/app/api/runtime/snapshot/route.js.nft.json +1 -1
  176. package/dist/standalone/.next/server/app/api/runtime/spawn/route.js +1 -1
  177. package/dist/standalone/.next/server/app/api/runtime/spawn/route.js.nft.json +1 -1
  178. package/dist/standalone/.next/server/app/api/runtime/steer/route.js +1 -1
  179. package/dist/standalone/.next/server/app/api/runtime/steer/route.js.nft.json +1 -1
  180. package/dist/standalone/.next/server/app/api/runtime/stream/route.js +2 -2
  181. package/dist/standalone/.next/server/app/api/runtime/stream/route.js.nft.json +1 -1
  182. package/dist/standalone/.next/server/app/api/search/transcripts/route.js +2 -0
  183. package/dist/standalone/.next/server/app/api/search/transcripts/route.js.nft.json +1 -0
  184. package/dist/standalone/.next/server/app/api/search/transcripts/route_client-reference-manifest.js +1 -0
  185. package/dist/standalone/.next/server/app/api/session/route.js +1 -1
  186. package/dist/standalone/.next/server/app/api/session/route.js.nft.json +1 -1
  187. package/dist/standalone/.next/server/app/api/session/supersedence/route.js +1 -1
  188. package/dist/standalone/.next/server/app/api/session/supersedence/route.js.nft.json +1 -1
  189. package/dist/standalone/.next/server/app/api/session/title/route.js +1 -1
  190. package/dist/standalone/.next/server/app/api/session/title/route.js.nft.json +1 -1
  191. package/dist/standalone/.next/server/app/api/spawn/policy/route.js +6 -3
  192. package/dist/standalone/.next/server/app/api/spawn/policy/route.js.nft.json +1 -1
  193. package/dist/standalone/.next/server/app/api/spawn/route.js +2 -2
  194. package/dist/standalone/.next/server/app/api/spawn/route.js.nft.json +1 -1
  195. package/dist/standalone/.next/server/app/api/staging/route.js +2 -2
  196. package/dist/standalone/.next/server/app/api/staging/route.js.nft.json +1 -1
  197. package/dist/standalone/.next/server/app/api/task-attachments/route.js +2 -2
  198. package/dist/standalone/.next/server/app/api/task-attachments/route.js.nft.json +1 -1
  199. package/dist/standalone/.next/server/app/api/tasks/[id]/assignment/route.js +1 -1
  200. package/dist/standalone/.next/server/app/api/tasks/[id]/assignment/route.js.nft.json +1 -1
  201. package/dist/standalone/.next/server/app/api/tasks/[id]/route.js +1 -1
  202. package/dist/standalone/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
  203. package/dist/standalone/.next/server/app/api/tasks/[id]/send/route.js +1 -1
  204. package/dist/standalone/.next/server/app/api/tasks/[id]/send/route.js.nft.json +1 -1
  205. package/dist/standalone/.next/server/app/api/tasks/[id]/spawn/route.js +1 -1
  206. package/dist/standalone/.next/server/app/api/tasks/[id]/spawn/route.js.nft.json +1 -1
  207. package/dist/standalone/.next/server/app/api/tasks/curator/route.js +1 -1
  208. package/dist/standalone/.next/server/app/api/tasks/curator/route.js.nft.json +1 -1
  209. package/dist/standalone/.next/server/app/api/tasks/route.js +2 -2
  210. package/dist/standalone/.next/server/app/api/tasks/route.js.nft.json +1 -1
  211. package/dist/standalone/.next/server/app/api/telegram/reports/route.js +1 -0
  212. package/dist/standalone/.next/server/app/api/telegram/reports/route.js.nft.json +1 -0
  213. package/dist/standalone/.next/server/app/api/telegram/reports/route_client-reference-manifest.js +1 -0
  214. package/dist/standalone/.next/server/app/api/telegram/route.js +1 -0
  215. package/dist/standalone/.next/server/app/api/telegram/route.js.nft.json +1 -0
  216. package/dist/standalone/.next/server/app/api/telegram/route_client-reference-manifest.js +1 -0
  217. package/dist/standalone/.next/server/app/api/timeline/route.js +1 -1
  218. package/dist/standalone/.next/server/app/api/timeline/route.js.nft.json +1 -1
  219. package/dist/standalone/.next/server/app/api/tmux/route.js +1 -1
  220. package/dist/standalone/.next/server/app/api/tmux/route.js.nft.json +1 -1
  221. package/dist/standalone/.next/server/app/api/tmux/targets/route.js +1 -1
  222. package/dist/standalone/.next/server/app/api/tmux/targets/route.js.nft.json +1 -1
  223. package/dist/standalone/.next/server/app/api/transcribe/backend/route.js +2 -2
  224. package/dist/standalone/.next/server/app/api/transcribe/backend/route.js.nft.json +1 -1
  225. package/dist/standalone/.next/server/app/api/transcribe/route.js +2 -2
  226. package/dist/standalone/.next/server/app/api/transcribe/route.js.nft.json +1 -1
  227. package/dist/standalone/.next/server/app/api/transcribe/token/route.js +2 -2
  228. package/dist/standalone/.next/server/app/api/transcribe/token/route.js.nft.json +1 -1
  229. package/dist/standalone/.next/server/app/api/tts/backend/route.js +1 -1
  230. package/dist/standalone/.next/server/app/api/tts/backend/route.js.nft.json +1 -1
  231. package/dist/standalone/.next/server/app/api/tts/route.js +3 -3
  232. package/dist/standalone/.next/server/app/api/tts/route.js.nft.json +1 -1
  233. package/dist/standalone/.next/server/app/api/view/presence/route.js +1 -2
  234. package/dist/standalone/.next/server/app/api/view/presence/route.js.nft.json +1 -1
  235. package/dist/standalone/.next/server/app/api/workflows/[id]/route.js +1 -1
  236. package/dist/standalone/.next/server/app/api/workflows/[id]/route.js.nft.json +1 -1
  237. package/dist/standalone/.next/server/app/api/workflows/route.js +1 -1
  238. package/dist/standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  239. package/dist/standalone/.next/server/app/favicon.ico/route.js +1 -1
  240. package/dist/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  241. package/dist/standalone/.next/server/app/index.html +1 -1
  242. package/dist/standalone/.next/server/app/index.rsc +3 -3
  243. package/dist/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  244. package/dist/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  245. package/dist/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  246. package/dist/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  247. package/dist/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  248. package/dist/standalone/.next/server/app/page.js +41 -24
  249. package/dist/standalone/.next/server/app/page.js.nft.json +1 -1
  250. package/dist/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  251. package/dist/standalone/.next/server/app-paths-manifest.json +22 -15
  252. package/dist/standalone/.next/server/chunks/156.js +2 -2
  253. package/dist/standalone/.next/server/chunks/1617.js +2 -0
  254. package/dist/standalone/.next/server/chunks/1858.js +91 -0
  255. package/dist/standalone/.next/server/chunks/1888.js +1 -0
  256. package/dist/standalone/.next/server/chunks/1920.js +1 -1
  257. package/dist/standalone/.next/server/chunks/2190.js +1 -1
  258. package/dist/standalone/.next/server/chunks/230.js +1 -0
  259. package/dist/standalone/.next/server/chunks/2318.js +2 -0
  260. package/dist/standalone/.next/server/chunks/2324.js +1 -0
  261. package/dist/standalone/.next/server/chunks/2338.js +9 -0
  262. package/dist/standalone/.next/server/chunks/2904.js +42 -0
  263. package/dist/standalone/.next/server/chunks/2923.js +1 -0
  264. package/dist/standalone/.next/server/chunks/2962.js +1 -0
  265. package/dist/standalone/.next/server/chunks/2977.js +1 -1
  266. package/dist/standalone/.next/server/chunks/306.js +3 -3
  267. package/dist/standalone/.next/server/chunks/3086.js +1 -0
  268. package/dist/standalone/.next/server/chunks/3139.js +10 -0
  269. package/dist/standalone/.next/server/chunks/3214.js +82 -0
  270. package/dist/standalone/.next/server/chunks/3336.js +1 -1
  271. package/dist/standalone/.next/server/chunks/3558.js +1 -1
  272. package/dist/standalone/.next/server/chunks/3587.js +1 -1
  273. package/dist/standalone/.next/server/chunks/3598.js +81 -0
  274. package/dist/standalone/.next/server/chunks/3740.js +126 -0
  275. package/dist/standalone/.next/server/chunks/3793.js +6 -0
  276. package/dist/standalone/.next/server/chunks/3916.js +1 -0
  277. package/dist/standalone/.next/server/chunks/3953.js +1 -0
  278. package/dist/standalone/.next/server/chunks/4012.js +2 -2
  279. package/dist/standalone/.next/server/chunks/4191.js +1 -1
  280. package/dist/standalone/.next/server/chunks/4260.js +2 -2
  281. package/dist/standalone/.next/server/chunks/4509.js +1 -1
  282. package/dist/standalone/.next/server/chunks/4968.js +1 -1
  283. package/dist/standalone/.next/server/chunks/4972.js +130 -2
  284. package/dist/standalone/.next/server/chunks/5689.js +11 -0
  285. package/dist/standalone/.next/server/chunks/6333.js +47 -0
  286. package/dist/standalone/.next/server/chunks/6796.js +1 -0
  287. package/dist/standalone/.next/server/chunks/6826.js +2 -2
  288. package/dist/standalone/.next/server/chunks/6850.js +1 -1
  289. package/dist/standalone/.next/server/chunks/6909.js +1 -0
  290. package/dist/standalone/.next/server/chunks/6977.js +1 -0
  291. package/dist/standalone/.next/server/chunks/7126.js +1 -0
  292. package/dist/standalone/.next/server/chunks/7159.js +1 -0
  293. package/dist/standalone/.next/server/chunks/7270.js +45 -0
  294. package/dist/standalone/.next/server/chunks/7295.js +10 -0
  295. package/dist/standalone/.next/server/chunks/7471.js +16 -14
  296. package/dist/standalone/.next/server/chunks/7563.js +1 -1
  297. package/dist/standalone/.next/server/chunks/7644.js +13 -0
  298. package/dist/standalone/.next/server/chunks/7722.js +1 -1
  299. package/dist/standalone/.next/server/chunks/7733.js +4 -0
  300. package/dist/standalone/.next/server/chunks/7868.js +1 -0
  301. package/dist/standalone/.next/server/chunks/8026.js +1 -0
  302. package/dist/standalone/.next/server/chunks/8176.js +1 -1
  303. package/dist/standalone/.next/server/chunks/8444.js +1 -1
  304. package/dist/standalone/.next/server/chunks/8465.js +2 -0
  305. package/dist/standalone/.next/server/chunks/849.js +6 -0
  306. package/dist/standalone/.next/server/chunks/8600.js +12 -0
  307. package/dist/standalone/.next/server/chunks/8617.js +2 -0
  308. package/dist/standalone/.next/server/chunks/8797.js +1 -1
  309. package/dist/standalone/.next/server/chunks/8817.js +5 -0
  310. package/dist/standalone/.next/server/chunks/8966.js +2 -2
  311. package/dist/standalone/.next/server/chunks/8996.js +1 -0
  312. package/dist/standalone/.next/server/chunks/9246.js +47 -0
  313. package/dist/standalone/.next/server/chunks/9364.js +310 -0
  314. package/dist/standalone/.next/server/chunks/9411.js +3 -3
  315. package/dist/standalone/.next/server/chunks/9434.js +13 -0
  316. package/dist/standalone/.next/server/chunks/9507.js +1 -0
  317. package/dist/standalone/.next/server/chunks/9676.js +62 -0
  318. package/dist/standalone/.next/server/chunks/9733.js +6 -3
  319. package/dist/standalone/.next/server/chunks/9901.js +62 -0
  320. package/dist/standalone/.next/server/chunks/9937.js +2 -0
  321. package/dist/standalone/.next/server/chunks/9940.js +128 -0
  322. package/dist/standalone/.next/server/chunks/static/media/pdf.worker.min.65fe1ff1.mjs +6 -0
  323. package/dist/standalone/.next/server/file-scanner-worker.js +2 -2
  324. package/dist/standalone/.next/server/files-response-worker.js +5 -5
  325. package/dist/standalone/.next/server/functions-config-manifest.json +8 -1
  326. package/dist/standalone/.next/server/instrumentation.js +1 -1
  327. package/dist/standalone/.next/server/middleware-build-manifest.js +1 -1
  328. package/dist/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  329. package/dist/standalone/.next/server/pages/404.html +1 -1
  330. package/dist/standalone/.next/server/pages/500.html +1 -1
  331. package/dist/standalone/.next/server/resource-collector-worker.js +1 -1
  332. package/dist/standalone/.next/server/server-reference-manifest.json +1 -1
  333. package/dist/standalone/.next/server/wakatime-sync-worker.js +2 -0
  334. package/dist/standalone/.next/server/webpack-runtime.js +1 -1
  335. package/dist/standalone/.next/static/chunks/2619.fd64e7a5bd9005d5.js +1 -0
  336. package/dist/standalone/.next/static/chunks/8293.5545fdbde0213c98.js +1 -0
  337. package/dist/standalone/.next/static/chunks/9178-e32f088e89b55503.js +1 -0
  338. package/dist/standalone/.next/static/chunks/9b0008ae.eb7a9c4c1c92a63b.js +45 -0
  339. package/dist/standalone/.next/static/chunks/app/_global-error/page-c132c5ba005ff29e.js +1 -0
  340. package/dist/standalone/.next/static/chunks/app/api/access/route-c132c5ba005ff29e.js +1 -0
  341. package/dist/standalone/.next/static/chunks/app/api/account-migrations/[intentId]/route-c132c5ba005ff29e.js +1 -0
  342. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/[id]/status/route-c132c5ba005ff29e.js +1 -0
  343. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/active/route-c132c5ba005ff29e.js +1 -0
  344. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/login/[operationId]/input/route-c132c5ba005ff29e.js +1 -0
  345. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/login/[operationId]/route-c132c5ba005ff29e.js +1 -0
  346. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/policy/route-c132c5ba005ff29e.js +1 -0
  347. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/route-c132c5ba005ff29e.js +1 -0
  348. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/terminal/route-c132c5ba005ff29e.js +1 -0
  349. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/active/route-c132c5ba005ff29e.js +1 -0
  350. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/policy/route-c132c5ba005ff29e.js +1 -0
  351. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/route-c132c5ba005ff29e.js +1 -0
  352. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/terminal/route-c132c5ba005ff29e.js +1 -0
  353. package/dist/standalone/.next/static/chunks/app/api/accounts/route-c132c5ba005ff29e.js +1 -0
  354. package/dist/standalone/.next/static/chunks/app/api/agent/route-c132c5ba005ff29e.js +1 -0
  355. package/dist/standalone/.next/static/chunks/app/api/agent/snapshot/route-c132c5ba005ff29e.js +1 -0
  356. package/dist/standalone/.next/static/chunks/app/api/answer/route-c132c5ba005ff29e.js +1 -0
  357. package/dist/standalone/.next/static/chunks/app/api/artifact/route-c132c5ba005ff29e.js +1 -0
  358. package/dist/standalone/.next/static/chunks/app/api/attach-command/route-c132c5ba005ff29e.js +1 -0
  359. package/dist/standalone/.next/static/chunks/app/api/attention/[id]/route-c132c5ba005ff29e.js +1 -0
  360. package/dist/standalone/.next/static/chunks/app/api/attention/route-c132c5ba005ff29e.js +1 -0
  361. package/dist/standalone/.next/static/chunks/app/api/board/route-c132c5ba005ff29e.js +1 -0
  362. package/dist/standalone/.next/static/chunks/app/api/bridge/route-c132c5ba005ff29e.js +1 -0
  363. package/dist/standalone/.next/static/chunks/app/api/conversations/[conversationId]/migration/route-c132c5ba005ff29e.js +1 -0
  364. package/dist/standalone/.next/static/chunks/app/api/conversations/route-c132c5ba005ff29e.js +1 -0
  365. package/dist/standalone/.next/static/chunks/app/api/files/route-c132c5ba005ff29e.js +1 -0
  366. package/dist/standalone/.next/static/chunks/app/api/flows/[id]/route-c132c5ba005ff29e.js +1 -0
  367. package/dist/standalone/.next/static/chunks/app/api/flows/route-c132c5ba005ff29e.js +1 -0
  368. package/dist/standalone/.next/static/chunks/app/api/image/route-c132c5ba005ff29e.js +1 -0
  369. package/dist/standalone/.next/static/chunks/app/api/inbox/route-c132c5ba005ff29e.js +1 -0
  370. package/dist/standalone/.next/static/chunks/app/api/lifecycle/reaper/route-c132c5ba005ff29e.js +1 -0
  371. package/dist/standalone/.next/static/chunks/app/api/limits/history/route-c132c5ba005ff29e.js +1 -0
  372. package/dist/standalone/.next/static/chunks/app/api/limits/route-c132c5ba005ff29e.js +1 -0
  373. package/dist/standalone/.next/static/chunks/app/api/log/preflight/route-c132c5ba005ff29e.js +1 -0
  374. package/dist/standalone/.next/static/chunks/app/api/log/project-delete/route-c132c5ba005ff29e.js +1 -0
  375. package/dist/standalone/.next/static/chunks/app/api/log/provenance/route-c132c5ba005ff29e.js +1 -0
  376. package/dist/standalone/.next/static/chunks/app/api/log/route-c132c5ba005ff29e.js +1 -0
  377. package/dist/standalone/.next/static/chunks/app/api/logs/route-c132c5ba005ff29e.js +1 -0
  378. package/dist/standalone/.next/static/chunks/app/api/logs/stream/route-c132c5ba005ff29e.js +1 -0
  379. package/dist/standalone/.next/static/chunks/app/api/monitor/lock/route-c132c5ba005ff29e.js +1 -0
  380. package/dist/standalone/.next/static/chunks/app/api/monitor/runs/route-c132c5ba005ff29e.js +1 -0
  381. package/dist/standalone/.next/static/chunks/app/api/orchestrator/rotate/route-c132c5ba005ff29e.js +1 -0
  382. package/dist/standalone/.next/static/chunks/app/api/orchestrator/seat/route-c132c5ba005ff29e.js +1 -0
  383. package/dist/standalone/.next/static/chunks/app/api/orchestrator/seat/status/route-c132c5ba005ff29e.js +1 -0
  384. package/dist/standalone/.next/static/chunks/app/api/pipelines/[id]/route-c132c5ba005ff29e.js +1 -0
  385. package/dist/standalone/.next/static/chunks/app/api/pipelines/preflight/route-c132c5ba005ff29e.js +1 -0
  386. package/dist/standalone/.next/static/chunks/app/api/pipelines/route-c132c5ba005ff29e.js +1 -0
  387. package/dist/standalone/.next/static/chunks/app/api/pipelines/tick/route-c132c5ba005ff29e.js +1 -0
  388. package/dist/standalone/.next/static/chunks/app/api/proc/route-c132c5ba005ff29e.js +1 -0
  389. package/dist/standalone/.next/static/chunks/app/api/projects/create/route-c132c5ba005ff29e.js +1 -0
  390. package/dist/standalone/.next/static/chunks/app/api/projects/crown/route-c132c5ba005ff29e.js +1 -0
  391. package/dist/standalone/.next/static/chunks/app/api/push/route-c132c5ba005ff29e.js +1 -0
  392. package/dist/standalone/.next/static/chunks/app/api/resources/route-c132c5ba005ff29e.js +1 -0
  393. package/dist/standalone/.next/static/chunks/app/api/roles/route-c132c5ba005ff29e.js +1 -0
  394. package/dist/standalone/.next/static/chunks/app/api/runtime/answer/route-c132c5ba005ff29e.js +1 -0
  395. package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/[deploymentId]/route-c132c5ba005ff29e.js +1 -0
  396. package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/capabilities/v1/route-c132c5ba005ff29e.js +1 -0
  397. package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/route-c132c5ba005ff29e.js +1 -0
  398. package/dist/standalone/.next/static/chunks/app/api/runtime/interrupt/route-c132c5ba005ff29e.js +1 -0
  399. package/dist/standalone/.next/static/chunks/app/api/runtime/operations/[operationId]/route-c132c5ba005ff29e.js +1 -0
  400. package/dist/standalone/.next/static/chunks/app/api/runtime/operations/route-c132c5ba005ff29e.js +1 -0
  401. package/dist/standalone/.next/static/chunks/app/api/runtime/realtime/route-c132c5ba005ff29e.js +1 -0
  402. package/dist/standalone/.next/static/chunks/app/api/runtime/send/route-c132c5ba005ff29e.js +1 -0
  403. package/dist/standalone/.next/static/chunks/app/api/runtime/snapshot/route-c132c5ba005ff29e.js +1 -0
  404. package/dist/standalone/.next/static/chunks/app/api/runtime/spawn/route-c132c5ba005ff29e.js +1 -0
  405. package/dist/standalone/.next/static/chunks/app/api/runtime/steer/route-c132c5ba005ff29e.js +1 -0
  406. package/dist/standalone/.next/static/chunks/app/api/runtime/stream/route-c132c5ba005ff29e.js +1 -0
  407. package/dist/standalone/.next/static/chunks/app/api/search/transcripts/route-c132c5ba005ff29e.js +1 -0
  408. package/dist/standalone/.next/static/chunks/app/api/session/route-c132c5ba005ff29e.js +1 -0
  409. package/dist/standalone/.next/static/chunks/app/api/session/supersedence/route-c132c5ba005ff29e.js +1 -0
  410. package/dist/standalone/.next/static/chunks/app/api/session/title/route-c132c5ba005ff29e.js +1 -0
  411. package/dist/standalone/.next/static/chunks/app/api/spawn/policy/route-c132c5ba005ff29e.js +1 -0
  412. package/dist/standalone/.next/static/chunks/app/api/spawn/route-c132c5ba005ff29e.js +1 -0
  413. package/dist/standalone/.next/static/chunks/app/api/staging/route-c132c5ba005ff29e.js +1 -0
  414. package/dist/standalone/.next/static/chunks/app/api/task-attachments/route-c132c5ba005ff29e.js +1 -0
  415. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/assignment/route-c132c5ba005ff29e.js +1 -0
  416. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/route-c132c5ba005ff29e.js +1 -0
  417. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/send/route-c132c5ba005ff29e.js +1 -0
  418. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/spawn/route-c132c5ba005ff29e.js +1 -0
  419. package/dist/standalone/.next/static/chunks/app/api/tasks/curator/route-c132c5ba005ff29e.js +1 -0
  420. package/dist/standalone/.next/static/chunks/app/api/tasks/route-c132c5ba005ff29e.js +1 -0
  421. package/dist/standalone/.next/static/chunks/app/api/telegram/reports/route-c132c5ba005ff29e.js +1 -0
  422. package/dist/standalone/.next/static/chunks/app/api/telegram/route-c132c5ba005ff29e.js +1 -0
  423. package/dist/standalone/.next/static/chunks/app/api/timeline/route-c132c5ba005ff29e.js +1 -0
  424. package/dist/standalone/.next/static/chunks/app/api/tmux/route-c132c5ba005ff29e.js +1 -0
  425. package/dist/standalone/.next/static/chunks/app/api/tmux/targets/route-c132c5ba005ff29e.js +1 -0
  426. package/dist/standalone/.next/static/chunks/app/api/transcribe/backend/route-c132c5ba005ff29e.js +1 -0
  427. package/dist/standalone/.next/static/chunks/app/api/transcribe/route-c132c5ba005ff29e.js +1 -0
  428. package/dist/standalone/.next/static/chunks/app/api/transcribe/token/route-c132c5ba005ff29e.js +1 -0
  429. package/dist/standalone/.next/static/chunks/app/api/tts/backend/route-c132c5ba005ff29e.js +1 -0
  430. package/dist/standalone/.next/static/chunks/app/api/tts/route-c132c5ba005ff29e.js +1 -0
  431. package/dist/standalone/.next/static/chunks/app/api/view/presence/route-c132c5ba005ff29e.js +1 -0
  432. package/dist/standalone/.next/static/chunks/app/api/workflows/[id]/route-c132c5ba005ff29e.js +1 -0
  433. package/dist/standalone/.next/static/chunks/app/api/workflows/route-c132c5ba005ff29e.js +1 -0
  434. package/dist/standalone/.next/static/chunks/app/page-ac9463b910bf83fe.js +77 -0
  435. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c132c5ba005ff29e.js +1 -0
  436. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c132c5ba005ff29e.js +1 -0
  437. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c132c5ba005ff29e.js +1 -0
  438. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c132c5ba005ff29e.js +1 -0
  439. package/dist/standalone/.next/static/chunks/webpack-1637988d4c7cf23c.js +1 -0
  440. package/dist/standalone/.next/static/css/498f12ddef7ecb0e.css +1 -0
  441. package/dist/standalone/.next/static/kt9OPe8iwfpNcdOX9ygvb/_buildManifest.js +1 -0
  442. package/dist/standalone/.next/static/media/pdf.worker.min.e890bf87.mjs +6 -0
  443. package/dist/standalone/package.json +9 -5
  444. package/dist/standalone/server.bun.js +38 -0
  445. package/dist/standalone/server.js +18 -37
  446. package/package.json +9 -5
  447. package/vendor/telegram-mcp/.python-version +1 -0
  448. package/vendor/telegram-mcp/LICENSE +201 -0
  449. package/vendor/telegram-mcp/PROVENANCE.md +70 -0
  450. package/vendor/telegram-mcp/SHA256SUMS +24 -0
  451. package/vendor/telegram-mcp/main.py +67 -0
  452. package/vendor/telegram-mcp/pyproject.toml +100 -0
  453. package/vendor/telegram-mcp/requirements.txt +7 -0
  454. package/vendor/telegram-mcp/sanitize.py +143 -0
  455. package/vendor/telegram-mcp/session_string_generator.py +259 -0
  456. package/vendor/telegram-mcp/telegram_mcp/__init__.py +15 -0
  457. package/vendor/telegram-mcp/telegram_mcp/client_identity.py +31 -0
  458. package/vendor/telegram-mcp/telegram_mcp/install_guard.py +209 -0
  459. package/vendor/telegram-mcp/telegram_mcp/runner.py +198 -0
  460. package/vendor/telegram-mcp/telegram_mcp/runtime.py +1812 -0
  461. package/vendor/telegram-mcp/telegram_mcp/singleton.py +143 -0
  462. package/vendor/telegram-mcp/telegram_mcp/tools/__init__.py +13 -0
  463. package/vendor/telegram-mcp/telegram_mcp/tools/accounts.py +31 -0
  464. package/vendor/telegram-mcp/telegram_mcp/tools/chats.py +1163 -0
  465. package/vendor/telegram-mcp/telegram_mcp/tools/contacts.py +802 -0
  466. package/vendor/telegram-mcp/telegram_mcp/tools/events.py +485 -0
  467. package/vendor/telegram-mcp/telegram_mcp/tools/folders.py +600 -0
  468. package/vendor/telegram-mcp/telegram_mcp/tools/groups.py +1286 -0
  469. package/vendor/telegram-mcp/telegram_mcp/tools/media.py +470 -0
  470. package/vendor/telegram-mcp/telegram_mcp/tools/messages.py +2041 -0
  471. package/vendor/telegram-mcp/telegram_mcp/tools/profile.py +449 -0
  472. package/vendor/telegram-mcp/uv.lock +1693 -0
  473. package/dist/standalone/.next/server/app/api/orchestrator/route.js +0 -1
  474. package/dist/standalone/.next/server/app/api/orchestrator/route_client-reference-manifest.js +0 -1
  475. package/dist/standalone/.next/server/chunks/1699.js +0 -1
  476. package/dist/standalone/.next/server/chunks/2596.js +0 -1
  477. package/dist/standalone/.next/server/chunks/3886.js +0 -1
  478. package/dist/standalone/.next/server/chunks/4792.js +0 -101
  479. package/dist/standalone/.next/server/chunks/5622.js +0 -2
  480. package/dist/standalone/.next/server/chunks/616.js +0 -42
  481. package/dist/standalone/.next/server/chunks/620.js +0 -1
  482. package/dist/standalone/.next/server/chunks/6299.js +0 -4
  483. package/dist/standalone/.next/server/chunks/9598.js +0 -1
  484. package/dist/standalone/.next/server/chunks/9936.js +0 -6
  485. package/dist/standalone/.next/static/5aZdjqUDNxpxX8nVsuO2S/_buildManifest.js +0 -1
  486. package/dist/standalone/.next/static/chunks/9260-0e7e550c65609f11.js +0 -1
  487. package/dist/standalone/.next/static/chunks/app/_global-error/page-483eb859fba02a43.js +0 -1
  488. package/dist/standalone/.next/static/chunks/app/api/access/route-483eb859fba02a43.js +0 -1
  489. package/dist/standalone/.next/static/chunks/app/api/account-migrations/[intentId]/route-483eb859fba02a43.js +0 -1
  490. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/[id]/status/route-483eb859fba02a43.js +0 -1
  491. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/active/route-483eb859fba02a43.js +0 -1
  492. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/login/[operationId]/input/route-483eb859fba02a43.js +0 -1
  493. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/login/[operationId]/route-483eb859fba02a43.js +0 -1
  494. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/policy/route-483eb859fba02a43.js +0 -1
  495. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/route-483eb859fba02a43.js +0 -1
  496. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/terminal/route-483eb859fba02a43.js +0 -1
  497. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/active/route-483eb859fba02a43.js +0 -1
  498. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/policy/route-483eb859fba02a43.js +0 -1
  499. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/route-483eb859fba02a43.js +0 -1
  500. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/terminal/route-483eb859fba02a43.js +0 -1
  501. package/dist/standalone/.next/static/chunks/app/api/accounts/route-483eb859fba02a43.js +0 -1
  502. package/dist/standalone/.next/static/chunks/app/api/agent/route-483eb859fba02a43.js +0 -1
  503. package/dist/standalone/.next/static/chunks/app/api/agent/snapshot/route-483eb859fba02a43.js +0 -1
  504. package/dist/standalone/.next/static/chunks/app/api/answer/route-483eb859fba02a43.js +0 -1
  505. package/dist/standalone/.next/static/chunks/app/api/attach-command/route-483eb859fba02a43.js +0 -1
  506. package/dist/standalone/.next/static/chunks/app/api/attention/[id]/route-483eb859fba02a43.js +0 -1
  507. package/dist/standalone/.next/static/chunks/app/api/attention/route-483eb859fba02a43.js +0 -1
  508. package/dist/standalone/.next/static/chunks/app/api/board/route-483eb859fba02a43.js +0 -1
  509. package/dist/standalone/.next/static/chunks/app/api/bridge/route-483eb859fba02a43.js +0 -1
  510. package/dist/standalone/.next/static/chunks/app/api/conversations/[conversationId]/migration/route-483eb859fba02a43.js +0 -1
  511. package/dist/standalone/.next/static/chunks/app/api/conversations/route-483eb859fba02a43.js +0 -1
  512. package/dist/standalone/.next/static/chunks/app/api/files/route-483eb859fba02a43.js +0 -1
  513. package/dist/standalone/.next/static/chunks/app/api/flows/[id]/route-483eb859fba02a43.js +0 -1
  514. package/dist/standalone/.next/static/chunks/app/api/flows/route-483eb859fba02a43.js +0 -1
  515. package/dist/standalone/.next/static/chunks/app/api/image/route-483eb859fba02a43.js +0 -1
  516. package/dist/standalone/.next/static/chunks/app/api/inbox/route-483eb859fba02a43.js +0 -1
  517. package/dist/standalone/.next/static/chunks/app/api/lifecycle/reaper/route-483eb859fba02a43.js +0 -1
  518. package/dist/standalone/.next/static/chunks/app/api/limits/history/route-483eb859fba02a43.js +0 -1
  519. package/dist/standalone/.next/static/chunks/app/api/limits/route-483eb859fba02a43.js +0 -1
  520. package/dist/standalone/.next/static/chunks/app/api/log/preflight/route-483eb859fba02a43.js +0 -1
  521. package/dist/standalone/.next/static/chunks/app/api/log/project-delete/route-483eb859fba02a43.js +0 -1
  522. package/dist/standalone/.next/static/chunks/app/api/log/route-483eb859fba02a43.js +0 -1
  523. package/dist/standalone/.next/static/chunks/app/api/logs/route-483eb859fba02a43.js +0 -1
  524. package/dist/standalone/.next/static/chunks/app/api/logs/stream/route-483eb859fba02a43.js +0 -1
  525. package/dist/standalone/.next/static/chunks/app/api/monitor/lock/route-483eb859fba02a43.js +0 -1
  526. package/dist/standalone/.next/static/chunks/app/api/monitor/runs/route-483eb859fba02a43.js +0 -1
  527. package/dist/standalone/.next/static/chunks/app/api/orchestrator/rotate/route-483eb859fba02a43.js +0 -1
  528. package/dist/standalone/.next/static/chunks/app/api/orchestrator/route-483eb859fba02a43.js +0 -1
  529. package/dist/standalone/.next/static/chunks/app/api/orchestrator/seat/route-483eb859fba02a43.js +0 -1
  530. package/dist/standalone/.next/static/chunks/app/api/pipelines/[id]/route-483eb859fba02a43.js +0 -1
  531. package/dist/standalone/.next/static/chunks/app/api/pipelines/preflight/route-483eb859fba02a43.js +0 -1
  532. package/dist/standalone/.next/static/chunks/app/api/pipelines/route-483eb859fba02a43.js +0 -1
  533. package/dist/standalone/.next/static/chunks/app/api/pipelines/tick/route-483eb859fba02a43.js +0 -1
  534. package/dist/standalone/.next/static/chunks/app/api/proc/route-483eb859fba02a43.js +0 -1
  535. package/dist/standalone/.next/static/chunks/app/api/push/route-483eb859fba02a43.js +0 -1
  536. package/dist/standalone/.next/static/chunks/app/api/resources/route-483eb859fba02a43.js +0 -1
  537. package/dist/standalone/.next/static/chunks/app/api/roles/route-483eb859fba02a43.js +0 -1
  538. package/dist/standalone/.next/static/chunks/app/api/runtime/answer/route-483eb859fba02a43.js +0 -1
  539. package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/[deploymentId]/route-483eb859fba02a43.js +0 -1
  540. package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/capabilities/v1/route-483eb859fba02a43.js +0 -1
  541. package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/route-483eb859fba02a43.js +0 -1
  542. package/dist/standalone/.next/static/chunks/app/api/runtime/interrupt/route-483eb859fba02a43.js +0 -1
  543. package/dist/standalone/.next/static/chunks/app/api/runtime/operations/[operationId]/route-483eb859fba02a43.js +0 -1
  544. package/dist/standalone/.next/static/chunks/app/api/runtime/operations/route-483eb859fba02a43.js +0 -1
  545. package/dist/standalone/.next/static/chunks/app/api/runtime/realtime/route-483eb859fba02a43.js +0 -1
  546. package/dist/standalone/.next/static/chunks/app/api/runtime/send/route-483eb859fba02a43.js +0 -1
  547. package/dist/standalone/.next/static/chunks/app/api/runtime/snapshot/route-483eb859fba02a43.js +0 -1
  548. package/dist/standalone/.next/static/chunks/app/api/runtime/spawn/route-483eb859fba02a43.js +0 -1
  549. package/dist/standalone/.next/static/chunks/app/api/runtime/steer/route-483eb859fba02a43.js +0 -1
  550. package/dist/standalone/.next/static/chunks/app/api/runtime/stream/route-483eb859fba02a43.js +0 -1
  551. package/dist/standalone/.next/static/chunks/app/api/session/route-483eb859fba02a43.js +0 -1
  552. package/dist/standalone/.next/static/chunks/app/api/session/supersedence/route-483eb859fba02a43.js +0 -1
  553. package/dist/standalone/.next/static/chunks/app/api/session/title/route-483eb859fba02a43.js +0 -1
  554. package/dist/standalone/.next/static/chunks/app/api/spawn/policy/route-483eb859fba02a43.js +0 -1
  555. package/dist/standalone/.next/static/chunks/app/api/spawn/route-483eb859fba02a43.js +0 -1
  556. package/dist/standalone/.next/static/chunks/app/api/staging/route-483eb859fba02a43.js +0 -1
  557. package/dist/standalone/.next/static/chunks/app/api/task-attachments/route-483eb859fba02a43.js +0 -1
  558. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/assignment/route-483eb859fba02a43.js +0 -1
  559. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/route-483eb859fba02a43.js +0 -1
  560. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/send/route-483eb859fba02a43.js +0 -1
  561. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/spawn/route-483eb859fba02a43.js +0 -1
  562. package/dist/standalone/.next/static/chunks/app/api/tasks/curator/route-483eb859fba02a43.js +0 -1
  563. package/dist/standalone/.next/static/chunks/app/api/tasks/route-483eb859fba02a43.js +0 -1
  564. package/dist/standalone/.next/static/chunks/app/api/timeline/route-483eb859fba02a43.js +0 -1
  565. package/dist/standalone/.next/static/chunks/app/api/tmux/route-483eb859fba02a43.js +0 -1
  566. package/dist/standalone/.next/static/chunks/app/api/tmux/targets/route-483eb859fba02a43.js +0 -1
  567. package/dist/standalone/.next/static/chunks/app/api/transcribe/backend/route-483eb859fba02a43.js +0 -1
  568. package/dist/standalone/.next/static/chunks/app/api/transcribe/route-483eb859fba02a43.js +0 -1
  569. package/dist/standalone/.next/static/chunks/app/api/transcribe/token/route-483eb859fba02a43.js +0 -1
  570. package/dist/standalone/.next/static/chunks/app/api/tts/backend/route-483eb859fba02a43.js +0 -1
  571. package/dist/standalone/.next/static/chunks/app/api/tts/route-483eb859fba02a43.js +0 -1
  572. package/dist/standalone/.next/static/chunks/app/api/view/presence/route-483eb859fba02a43.js +0 -1
  573. package/dist/standalone/.next/static/chunks/app/api/workflows/[id]/route-483eb859fba02a43.js +0 -1
  574. package/dist/standalone/.next/static/chunks/app/api/workflows/route-483eb859fba02a43.js +0 -1
  575. package/dist/standalone/.next/static/chunks/app/page-45fd788b5dbb86eb.js +0 -57
  576. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-483eb859fba02a43.js +0 -1
  577. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-483eb859fba02a43.js +0 -1
  578. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-483eb859fba02a43.js +0 -1
  579. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-483eb859fba02a43.js +0 -1
  580. package/dist/standalone/.next/static/chunks/webpack-46c1a0323c2ca312.js +0 -1
  581. package/dist/standalone/.next/static/css/b5b2fbc52caf460a.css +0 -1
  582. /package/dist/standalone/.next/static/{5aZdjqUDNxpxX8nVsuO2S → kt9OPe8iwfpNcdOX9ygvb}/_ssgManifest.js +0 -0
@@ -0,0 +1,600 @@
1
+ """Folders MCP tools."""
2
+
3
+ from telegram_mcp.runtime import *
4
+
5
+
6
+ @mcp.tool(annotations=ToolAnnotations(title="List Folders", openWorldHint=True, readOnlyHint=True))
7
+ @with_account(readonly=True)
8
+ async def list_folders(account: str = None) -> str:
9
+ """
10
+ Get all dialog folders (filters) with their IDs, names, and emoji.
11
+ Returns a list of folders that can be used with other folder tools.
12
+ """
13
+ try:
14
+ cl = get_client(account)
15
+ await ensure_connected(cl)
16
+ result = await cl(functions.messages.GetDialogFiltersRequest())
17
+
18
+ folders = []
19
+ for f in result.filters:
20
+ # Skip system default folder
21
+ if isinstance(f, DialogFilterDefault):
22
+ continue
23
+
24
+ if isinstance(f, DialogFilter):
25
+ # Handle title which can be str or TextWithEntities
26
+ title = f.title
27
+ if isinstance(title, TextWithEntities):
28
+ title = title.text
29
+ folder_data = {
30
+ "id": f.id,
31
+ "title": sanitize_name(title),
32
+ "emoticon": getattr(f, "emoticon", None),
33
+ "contacts": getattr(f, "contacts", False),
34
+ "non_contacts": getattr(f, "non_contacts", False),
35
+ "groups": getattr(f, "groups", False),
36
+ "broadcasts": getattr(f, "broadcasts", False),
37
+ "bots": getattr(f, "bots", False),
38
+ "exclude_muted": getattr(f, "exclude_muted", False),
39
+ "exclude_read": getattr(f, "exclude_read", False),
40
+ "exclude_archived": getattr(f, "exclude_archived", False),
41
+ "included_peers_count": len(getattr(f, "include_peers", [])),
42
+ "excluded_peers_count": len(getattr(f, "exclude_peers", [])),
43
+ "pinned_peers_count": len(getattr(f, "pinned_peers", [])),
44
+ }
45
+ folders.append(folder_data)
46
+
47
+ elif isinstance(f, DialogFilterChatlist):
48
+ # Shared folders use DialogFilterChatlist type
49
+ title = f.title
50
+ if isinstance(title, TextWithEntities):
51
+ title = title.text
52
+ folder_data = {
53
+ "id": f.id,
54
+ "title": sanitize_name(title),
55
+ "emoticon": getattr(f, "emoticon", None),
56
+ "type": "shared",
57
+ "included_peers_count": len(getattr(f, "include_peers", [])),
58
+ "pinned_peers_count": len(getattr(f, "pinned_peers", [])),
59
+ }
60
+ folders.append(folder_data)
61
+
62
+ if not folders:
63
+ return "No folders found. Create one with create_folder tool."
64
+
65
+ return json.dumps(
66
+ {"folders": folders, "count": len(folders)}, indent=2, default=json_serializer
67
+ )
68
+ except Exception as e:
69
+ logger.exception("list_folders failed")
70
+ return log_and_format_error("list_folders", e, ErrorCategory.FOLDER)
71
+
72
+
73
+ @mcp.tool(annotations=ToolAnnotations(title="Get Folder", openWorldHint=True, readOnlyHint=True))
74
+ @with_account(readonly=True)
75
+ async def get_folder(folder_id: int, account: str = None) -> str:
76
+ """
77
+ Get detailed information about a specific folder including all included chats.
78
+
79
+ Args:
80
+ folder_id: The folder ID (get from list_folders)
81
+ """
82
+ try:
83
+ cl = get_client(account)
84
+ result = await cl(functions.messages.GetDialogFiltersRequest())
85
+
86
+ target_folder = None
87
+ for f in result.filters:
88
+ if isinstance(f, (DialogFilter, DialogFilterChatlist)) and f.id == folder_id:
89
+ target_folder = f
90
+ break
91
+
92
+ if not target_folder:
93
+ return (
94
+ f"Folder with ID {folder_id} not found. Use list_folders to see available folders."
95
+ )
96
+
97
+ # Resolve included peers to readable names
98
+ included_chats = []
99
+ for peer in getattr(target_folder, "include_peers", []):
100
+ try:
101
+ entity = await resolve_entity(peer, cl)
102
+ chat_info = {
103
+ "id": get_marked_id(entity),
104
+ "name": sanitize_name(
105
+ getattr(entity, "title", None) or getattr(entity, "first_name", "Unknown")
106
+ ),
107
+ "type": get_entity_type(entity),
108
+ }
109
+ if hasattr(entity, "username") and entity.username:
110
+ chat_info["username"] = entity.username
111
+ included_chats.append(chat_info)
112
+ except Exception:
113
+ included_chats.append({"id": str(peer), "name": "Unknown", "type": "Unknown"})
114
+
115
+ # Resolve excluded peers
116
+ excluded_chats = []
117
+ for peer in getattr(target_folder, "exclude_peers", []):
118
+ try:
119
+ entity = await resolve_entity(peer, cl)
120
+ chat_info = {
121
+ "id": get_marked_id(entity),
122
+ "name": sanitize_name(
123
+ getattr(entity, "title", None) or getattr(entity, "first_name", "Unknown")
124
+ ),
125
+ "type": get_entity_type(entity),
126
+ }
127
+ excluded_chats.append(chat_info)
128
+ except Exception:
129
+ excluded_chats.append({"id": str(peer), "name": "Unknown", "type": "Unknown"})
130
+
131
+ # Resolve pinned peers
132
+ pinned_chats = []
133
+ for peer in getattr(target_folder, "pinned_peers", []):
134
+ try:
135
+ entity = await resolve_entity(peer, cl)
136
+ chat_info = {
137
+ "id": get_marked_id(entity),
138
+ "name": sanitize_name(
139
+ getattr(entity, "title", None) or getattr(entity, "first_name", "Unknown")
140
+ ),
141
+ "type": get_entity_type(entity),
142
+ }
143
+ pinned_chats.append(chat_info)
144
+ except Exception:
145
+ pinned_chats.append({"id": str(peer), "name": "Unknown", "type": "Unknown"})
146
+
147
+ # Handle title which can be str or TextWithEntities
148
+ title = target_folder.title
149
+ if isinstance(title, TextWithEntities):
150
+ title = title.text
151
+
152
+ folder_data = {
153
+ "id": target_folder.id,
154
+ "title": sanitize_name(title),
155
+ "emoticon": getattr(target_folder, "emoticon", None),
156
+ "included_chats": included_chats,
157
+ "excluded_chats": excluded_chats,
158
+ "pinned_chats": pinned_chats,
159
+ }
160
+
161
+ if isinstance(target_folder, DialogFilterChatlist):
162
+ folder_data["type"] = "shared"
163
+ else:
164
+ folder_data["filters"] = {
165
+ "contacts": getattr(target_folder, "contacts", False),
166
+ "non_contacts": getattr(target_folder, "non_contacts", False),
167
+ "groups": getattr(target_folder, "groups", False),
168
+ "broadcasts": getattr(target_folder, "broadcasts", False),
169
+ "bots": getattr(target_folder, "bots", False),
170
+ "exclude_muted": getattr(target_folder, "exclude_muted", False),
171
+ "exclude_read": getattr(target_folder, "exclude_read", False),
172
+ "exclude_archived": getattr(target_folder, "exclude_archived", False),
173
+ }
174
+
175
+ return json.dumps(folder_data, indent=2, default=json_serializer)
176
+ except Exception as e:
177
+ logger.exception(f"get_folder failed (folder_id={folder_id})")
178
+ return log_and_format_error("get_folder", e, ErrorCategory.FOLDER, folder_id=folder_id)
179
+
180
+
181
+ @mcp.tool(
182
+ annotations=ToolAnnotations(
183
+ title="Create Folder", openWorldHint=True, destructiveHint=True, idempotentHint=False
184
+ )
185
+ )
186
+ @with_account(readonly=False)
187
+ async def create_folder(
188
+ title: str,
189
+ emoticon: Optional[str] = None,
190
+ chat_ids: Optional[List[Union[int, str]]] = None,
191
+ contacts: bool = False,
192
+ non_contacts: bool = False,
193
+ groups: bool = False,
194
+ broadcasts: bool = False,
195
+ bots: bool = False,
196
+ exclude_muted: bool = False,
197
+ exclude_read: bool = False,
198
+ exclude_archived: bool = True,
199
+ account: str = None,
200
+ ) -> str:
201
+ """
202
+ Create a new dialog folder.
203
+
204
+ Args:
205
+ title: Folder name (required)
206
+ emoticon: Folder emoji (optional, e.g., "📁", "🏠", "💼")
207
+ chat_ids: List of chat IDs or usernames to include (optional)
208
+ contacts: Include all contacts
209
+ non_contacts: Include all non-contacts
210
+ groups: Include all groups
211
+ broadcasts: Include all channels
212
+ bots: Include all bots
213
+ exclude_muted: Exclude muted chats
214
+ exclude_read: Exclude read chats
215
+ exclude_archived: Exclude archived chats (default True)
216
+ """
217
+ try:
218
+ cl = get_client(account)
219
+ # Get existing folders to check count and find next ID
220
+ result = await cl(functions.messages.GetDialogFiltersRequest())
221
+
222
+ existing_ids = set()
223
+ folder_count = 0
224
+ for f in result.filters:
225
+ if isinstance(f, (DialogFilter, DialogFilterChatlist)):
226
+ existing_ids.add(f.id)
227
+ folder_count += 1
228
+
229
+ # Telegram limit: max 10 custom folders
230
+ if folder_count >= 10:
231
+ return "Cannot create folder: Telegram limit is 10 folders. Delete one first."
232
+
233
+ # Find next available ID (IDs 0 and 1 are reserved for system)
234
+ new_id = 2
235
+ while new_id in existing_ids:
236
+ new_id += 1
237
+
238
+ # Resolve chat_ids to input peers
239
+ include_peers = []
240
+ if chat_ids:
241
+ for chat_id in chat_ids:
242
+ try:
243
+ peer = await resolve_input_entity(chat_id, cl)
244
+ include_peers.append(peer)
245
+ except Exception as e:
246
+ return f"Failed to resolve chat '{chat_id}': {str(e)}"
247
+
248
+ # Create the folder (title must be TextWithEntities)
249
+ title_obj = TextWithEntities(text=title, entities=[])
250
+ new_filter = DialogFilter(
251
+ id=new_id,
252
+ title=title_obj,
253
+ emoticon=emoticon,
254
+ pinned_peers=[],
255
+ include_peers=include_peers,
256
+ exclude_peers=[],
257
+ contacts=contacts,
258
+ non_contacts=non_contacts,
259
+ groups=groups,
260
+ broadcasts=broadcasts,
261
+ bots=bots,
262
+ exclude_muted=exclude_muted,
263
+ exclude_read=exclude_read,
264
+ exclude_archived=exclude_archived,
265
+ )
266
+
267
+ await cl(functions.messages.UpdateDialogFilterRequest(id=new_id, filter=new_filter))
268
+
269
+ return json.dumps(
270
+ {
271
+ "success": True,
272
+ "folder_id": new_id,
273
+ "title": title,
274
+ "emoticon": emoticon,
275
+ "included_chats_count": len(include_peers),
276
+ },
277
+ indent=2,
278
+ )
279
+ except Exception as e:
280
+ logger.exception(f"create_folder failed (title={title})")
281
+ return log_and_format_error("create_folder", e, ErrorCategory.FOLDER, title=title)
282
+
283
+
284
+ @mcp.tool(
285
+ annotations=ToolAnnotations(
286
+ title="Add Chat to Folder", openWorldHint=True, destructiveHint=True, idempotentHint=True
287
+ )
288
+ )
289
+ @with_account(readonly=False)
290
+ @validate_id("chat_id")
291
+ async def add_chat_to_folder(
292
+ folder_id: int,
293
+ chat_id: Union[int, str],
294
+ pinned: bool = False,
295
+ account: str = None,
296
+ ) -> str:
297
+ """
298
+ Add a chat to an existing folder.
299
+
300
+ Args:
301
+ folder_id: The folder ID (get from list_folders)
302
+ chat_id: Chat ID or username to add
303
+ pinned: Pin the chat in this folder (default False)
304
+ """
305
+ try:
306
+ cl = get_client(account)
307
+ # Get the folder
308
+ result = await cl(functions.messages.GetDialogFiltersRequest())
309
+
310
+ target_folder = None
311
+ for f in result.filters:
312
+ if isinstance(f, (DialogFilter, DialogFilterChatlist)) and f.id == folder_id:
313
+ target_folder = f
314
+ break
315
+
316
+ if not target_folder:
317
+ return (
318
+ f"Folder with ID {folder_id} not found. Use list_folders to see available folders."
319
+ )
320
+
321
+ # Resolve chat to input peer
322
+ try:
323
+ peer = await resolve_input_entity(chat_id, cl)
324
+ except Exception as e:
325
+ return f"Failed to resolve chat '{chat_id}': {str(e)}"
326
+
327
+ # Check if already included (idempotent)
328
+ include_peers = list(getattr(target_folder, "include_peers", []))
329
+ pinned_peers = list(getattr(target_folder, "pinned_peers", []))
330
+
331
+ # Get peer ID for comparison
332
+ peer_id = utils.get_peer_id(peer)
333
+ already_included = any(utils.get_peer_id(p) == peer_id for p in include_peers)
334
+ already_pinned = any(utils.get_peer_id(p) == peer_id for p in pinned_peers)
335
+
336
+ if already_included and (not pinned or already_pinned):
337
+ return f"Chat {chat_id} is already in folder {folder_id}."
338
+
339
+ # Add to appropriate list
340
+ if not already_included:
341
+ include_peers.append(peer)
342
+ if pinned and not already_pinned:
343
+ pinned_peers.append(peer)
344
+
345
+ # Update the folder (keep all original attributes)
346
+ if isinstance(target_folder, DialogFilterChatlist):
347
+ updated_filter = DialogFilterChatlist(
348
+ id=target_folder.id,
349
+ title=target_folder.title,
350
+ emoticon=getattr(target_folder, "emoticon", None),
351
+ pinned_peers=pinned_peers,
352
+ include_peers=include_peers,
353
+ title_noanimate=getattr(target_folder, "title_noanimate", None),
354
+ color=getattr(target_folder, "color", None),
355
+ )
356
+ else:
357
+ updated_filter = DialogFilter(
358
+ id=target_folder.id,
359
+ title=target_folder.title,
360
+ emoticon=getattr(target_folder, "emoticon", None),
361
+ pinned_peers=pinned_peers,
362
+ include_peers=include_peers,
363
+ exclude_peers=list(getattr(target_folder, "exclude_peers", [])),
364
+ contacts=getattr(target_folder, "contacts", False),
365
+ non_contacts=getattr(target_folder, "non_contacts", False),
366
+ groups=getattr(target_folder, "groups", False),
367
+ broadcasts=getattr(target_folder, "broadcasts", False),
368
+ bots=getattr(target_folder, "bots", False),
369
+ exclude_muted=getattr(target_folder, "exclude_muted", False),
370
+ exclude_read=getattr(target_folder, "exclude_read", False),
371
+ exclude_archived=getattr(target_folder, "exclude_archived", False),
372
+ title_noanimate=getattr(target_folder, "title_noanimate", None),
373
+ color=getattr(target_folder, "color", None),
374
+ )
375
+
376
+ await cl(functions.messages.UpdateDialogFilterRequest(id=folder_id, filter=updated_filter))
377
+
378
+ return (
379
+ f"Chat {chat_id} added to folder {folder_id}" + (" (pinned)" if pinned else "") + "."
380
+ )
381
+ except Exception as e:
382
+ logger.exception(f"add_chat_to_folder failed (folder_id={folder_id}, chat_id={chat_id})")
383
+ return log_and_format_error(
384
+ "add_chat_to_folder", e, ErrorCategory.FOLDER, folder_id=folder_id, chat_id=chat_id
385
+ )
386
+
387
+
388
+ @mcp.tool(
389
+ annotations=ToolAnnotations(
390
+ title="Remove Chat from Folder",
391
+ openWorldHint=True,
392
+ destructiveHint=True,
393
+ idempotentHint=True,
394
+ )
395
+ )
396
+ @with_account(readonly=False)
397
+ @validate_id("chat_id")
398
+ async def remove_chat_from_folder(
399
+ folder_id: int, chat_id: Union[int, str], account: str = None
400
+ ) -> str:
401
+ """
402
+ Remove a chat from a folder.
403
+
404
+ Args:
405
+ folder_id: The folder ID (get from list_folders)
406
+ chat_id: Chat ID or username to remove
407
+ """
408
+ try:
409
+ cl = get_client(account)
410
+ # Get the folder
411
+ result = await cl(functions.messages.GetDialogFiltersRequest())
412
+
413
+ target_folder = None
414
+ for f in result.filters:
415
+ if isinstance(f, (DialogFilter, DialogFilterChatlist)) and f.id == folder_id:
416
+ target_folder = f
417
+ break
418
+
419
+ if not target_folder:
420
+ return (
421
+ f"Folder with ID {folder_id} not found. Use list_folders to see available folders."
422
+ )
423
+
424
+ # Resolve chat to get peer ID
425
+ try:
426
+ peer = await resolve_input_entity(chat_id, cl)
427
+ peer_id = utils.get_peer_id(peer)
428
+ except Exception as e:
429
+ return f"Failed to resolve chat '{chat_id}': {str(e)}"
430
+
431
+ # Filter out the peer from both include and pinned lists
432
+ include_peers = [
433
+ p
434
+ for p in getattr(target_folder, "include_peers", [])
435
+ if utils.get_peer_id(p) != peer_id
436
+ ]
437
+ pinned_peers = [
438
+ p
439
+ for p in getattr(target_folder, "pinned_peers", [])
440
+ if utils.get_peer_id(p) != peer_id
441
+ ]
442
+
443
+ original_include_count = len(getattr(target_folder, "include_peers", []))
444
+ original_pinned_count = len(getattr(target_folder, "pinned_peers", []))
445
+
446
+ # Check if anything was removed (idempotent)
447
+ if (
448
+ len(include_peers) == original_include_count
449
+ and len(pinned_peers) == original_pinned_count
450
+ ):
451
+ return f"Chat {chat_id} was not in folder {folder_id}."
452
+
453
+ # Update the folder (keep all original attributes)
454
+ if isinstance(target_folder, DialogFilterChatlist):
455
+ updated_filter = DialogFilterChatlist(
456
+ id=target_folder.id,
457
+ title=target_folder.title,
458
+ emoticon=getattr(target_folder, "emoticon", None),
459
+ pinned_peers=pinned_peers,
460
+ include_peers=include_peers,
461
+ title_noanimate=getattr(target_folder, "title_noanimate", None),
462
+ color=getattr(target_folder, "color", None),
463
+ )
464
+ else:
465
+ updated_filter = DialogFilter(
466
+ id=target_folder.id,
467
+ title=target_folder.title,
468
+ emoticon=getattr(target_folder, "emoticon", None),
469
+ pinned_peers=pinned_peers,
470
+ include_peers=include_peers,
471
+ exclude_peers=list(getattr(target_folder, "exclude_peers", [])),
472
+ contacts=getattr(target_folder, "contacts", False),
473
+ non_contacts=getattr(target_folder, "non_contacts", False),
474
+ groups=getattr(target_folder, "groups", False),
475
+ broadcasts=getattr(target_folder, "broadcasts", False),
476
+ bots=getattr(target_folder, "bots", False),
477
+ exclude_muted=getattr(target_folder, "exclude_muted", False),
478
+ exclude_read=getattr(target_folder, "exclude_read", False),
479
+ exclude_archived=getattr(target_folder, "exclude_archived", False),
480
+ title_noanimate=getattr(target_folder, "title_noanimate", None),
481
+ color=getattr(target_folder, "color", None),
482
+ )
483
+
484
+ await cl(functions.messages.UpdateDialogFilterRequest(id=folder_id, filter=updated_filter))
485
+
486
+ return f"Chat {chat_id} removed from folder {folder_id}."
487
+ except Exception as e:
488
+ logger.exception(
489
+ f"remove_chat_from_folder failed (folder_id={folder_id}, chat_id={chat_id})"
490
+ )
491
+ return log_and_format_error(
492
+ "remove_chat_from_folder",
493
+ e,
494
+ ErrorCategory.FOLDER,
495
+ folder_id=folder_id,
496
+ chat_id=chat_id,
497
+ )
498
+
499
+
500
+ @mcp.tool(
501
+ annotations=ToolAnnotations(
502
+ title="Delete Folder", openWorldHint=True, destructiveHint=True, idempotentHint=True
503
+ )
504
+ )
505
+ @with_account(readonly=False)
506
+ async def delete_folder(folder_id: int, account: str = None) -> str:
507
+ """
508
+ Delete a folder. Chats in the folder are preserved, only the folder is removed.
509
+
510
+ Args:
511
+ folder_id: The folder ID to delete (get from list_folders)
512
+ """
513
+ try:
514
+ cl = get_client(account)
515
+ await ensure_connected(cl)
516
+ # System folders (id < 2) cannot be deleted
517
+ if folder_id < 2:
518
+ return f"Cannot delete system folder (ID {folder_id}). Only custom folders can be deleted."
519
+
520
+ # Check if folder exists
521
+ result = await cl(functions.messages.GetDialogFiltersRequest())
522
+
523
+ folder_exists = False
524
+ folder_title = None
525
+ for f in result.filters:
526
+ if isinstance(f, (DialogFilter, DialogFilterChatlist)) and f.id == folder_id:
527
+ folder_exists = True
528
+ # Handle title which can be str or TextWithEntities
529
+ title = f.title
530
+ if isinstance(title, TextWithEntities):
531
+ title = title.text
532
+ folder_title = title
533
+ break
534
+
535
+ if not folder_exists:
536
+ return f"Folder with ID {folder_id} not found (may already be deleted)."
537
+
538
+ # Delete by passing None as filter
539
+ await cl(functions.messages.UpdateDialogFilterRequest(id=folder_id, filter=None))
540
+
541
+ return f"Folder '{sanitize_name(folder_title)}' (ID {folder_id}) deleted. Chats are preserved."
542
+ except Exception as e:
543
+ logger.exception(f"delete_folder failed (folder_id={folder_id})")
544
+ return log_and_format_error("delete_folder", e, ErrorCategory.FOLDER, folder_id=folder_id)
545
+
546
+
547
+ @mcp.tool(
548
+ annotations=ToolAnnotations(
549
+ title="Reorder Folders", openWorldHint=True, destructiveHint=True, idempotentHint=True
550
+ )
551
+ )
552
+ @with_account(readonly=False)
553
+ async def reorder_folders(folder_ids: List[int], account: str = None) -> str:
554
+ """
555
+ Change the order of folders in the folder list.
556
+
557
+ Args:
558
+ folder_ids: List of folder IDs in the desired order
559
+ """
560
+ try:
561
+ cl = get_client(account)
562
+ await ensure_connected(cl)
563
+ # Get existing folders to validate
564
+ result = await cl(functions.messages.GetDialogFiltersRequest())
565
+
566
+ existing_ids = set()
567
+ for f in result.filters:
568
+ if isinstance(f, (DialogFilter, DialogFilterChatlist)):
569
+ existing_ids.add(f.id)
570
+
571
+ # Validate all provided IDs exist
572
+ for fid in folder_ids:
573
+ if fid not in existing_ids:
574
+ return f"Folder ID {fid} not found. Use list_folders to see available folders."
575
+
576
+ # Validate all existing folders are included
577
+ if set(folder_ids) != existing_ids:
578
+ missing = existing_ids - set(folder_ids)
579
+ return f"All folder IDs must be included. Missing: {missing}"
580
+
581
+ # Reorder
582
+ await cl(functions.messages.UpdateDialogFiltersOrderRequest(order=folder_ids))
583
+
584
+ return f"Folders reordered: {folder_ids}"
585
+ except Exception as e:
586
+ logger.exception(f"reorder_folders failed (folder_ids={folder_ids})")
587
+ return log_and_format_error(
588
+ "reorder_folders", e, ErrorCategory.FOLDER, folder_ids=folder_ids
589
+ )
590
+
591
+
592
+ __all__ = [
593
+ "list_folders",
594
+ "get_folder",
595
+ "create_folder",
596
+ "add_chat_to_folder",
597
+ "remove_chat_from_folder",
598
+ "delete_folder",
599
+ "reorder_folders",
600
+ ]