agent-log-viewer 0.11.7 → 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 (619) hide show
  1. package/README.md +218 -39
  2. package/bin/cli.mjs +60 -16
  3. package/bin/mcp-server.mjs +136 -0
  4. package/bin/mcp-server.test.ts +266 -0
  5. package/bin/provision-telegram-connector.mjs +193 -0
  6. package/bin/server-runtime.mjs +53 -0
  7. package/bin/server-runtime.test.ts +161 -0
  8. package/bin/tailscale-credential-isolation.test.ts +56 -0
  9. package/bin/tailscale.mjs +6 -4
  10. package/bin/telegram-login-bridge.py +253 -0
  11. package/bin/telegram-mcp-server.py +106 -0
  12. package/bin/telegram-session-reader.mjs +6 -0
  13. package/bin/telegram-session-validator.mjs +71 -0
  14. package/dist/mcp-server.mjs +48505 -0
  15. package/dist/standalone/.next/BUILD_ID +1 -1
  16. package/dist/standalone/.next/app-path-routes-manifest.json +73 -9
  17. package/dist/standalone/.next/build-manifest.json +6 -6
  18. package/dist/standalone/.next/prerender-manifest.json +3 -3
  19. package/dist/standalone/.next/react-loadable-manifest.json +89 -0
  20. package/dist/standalone/.next/required-server-files.json +12 -2
  21. package/dist/standalone/.next/routes-manifest.json +402 -0
  22. package/dist/standalone/.next/server/account-migration-controller-worker.js +1 -0
  23. package/dist/standalone/.next/server/app/_global-error/page.js +3 -3
  24. package/dist/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  25. package/dist/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  26. package/dist/standalone/.next/server/app/_global-error.html +1 -1
  27. package/dist/standalone/.next/server/app/_global-error.rsc +1 -1
  28. package/dist/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  29. package/dist/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  30. package/dist/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  31. package/dist/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  32. package/dist/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  33. package/dist/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  34. package/dist/standalone/.next/server/app/_not-found/page.js +2 -2
  35. package/dist/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  36. package/dist/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  37. package/dist/standalone/.next/server/app/_not-found.html +1 -1
  38. package/dist/standalone/.next/server/app/_not-found.rsc +3 -3
  39. package/dist/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  40. package/dist/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  41. package/dist/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  42. package/dist/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  43. package/dist/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  44. package/dist/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  45. package/dist/standalone/.next/server/app/api/access/route.js +1 -1
  46. package/dist/standalone/.next/server/app/api/access/route.js.nft.json +1 -1
  47. package/dist/standalone/.next/server/app/api/account-migrations/[intentId]/route.js +1 -0
  48. package/dist/standalone/.next/server/app/api/account-migrations/[intentId]/route.js.nft.json +1 -0
  49. package/dist/standalone/.next/server/app/api/account-migrations/[intentId]/route_client-reference-manifest.js +1 -0
  50. package/dist/standalone/.next/server/app/api/accounts/claude/[id]/status/route.js +4 -0
  51. package/dist/standalone/.next/server/app/api/accounts/claude/[id]/status/route.js.nft.json +1 -0
  52. package/dist/standalone/.next/server/app/api/accounts/claude/[id]/status/route_client-reference-manifest.js +1 -0
  53. package/dist/standalone/.next/server/app/api/accounts/claude/active/route.js +1 -0
  54. package/dist/standalone/.next/server/app/api/accounts/claude/active/route.js.nft.json +1 -0
  55. package/dist/standalone/.next/server/app/api/accounts/claude/active/route_client-reference-manifest.js +1 -0
  56. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/input/route.js +4 -0
  57. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/input/route.js.nft.json +1 -0
  58. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/input/route_client-reference-manifest.js +1 -0
  59. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/route.js +4 -0
  60. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/route.js.nft.json +1 -0
  61. package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/route_client-reference-manifest.js +1 -0
  62. package/dist/standalone/.next/server/app/api/accounts/claude/policy/route.js +1 -0
  63. package/dist/standalone/.next/server/app/api/accounts/claude/policy/route.js.nft.json +1 -0
  64. package/dist/standalone/.next/server/app/api/accounts/claude/policy/route_client-reference-manifest.js +1 -0
  65. package/dist/standalone/.next/server/app/api/accounts/claude/route.js +1 -0
  66. package/dist/standalone/.next/server/app/api/accounts/claude/route.js.nft.json +1 -0
  67. package/dist/standalone/.next/server/app/api/accounts/claude/route_client-reference-manifest.js +1 -0
  68. package/dist/standalone/.next/server/app/api/accounts/claude/terminal/route.js +4 -0
  69. package/dist/standalone/.next/server/app/api/accounts/claude/terminal/route.js.nft.json +1 -0
  70. package/dist/standalone/.next/server/app/api/accounts/claude/terminal/route_client-reference-manifest.js +1 -0
  71. package/dist/standalone/.next/server/app/api/accounts/codex/active/route.js +1 -0
  72. package/dist/standalone/.next/server/app/api/accounts/codex/active/route.js.nft.json +1 -0
  73. package/dist/standalone/.next/server/app/api/accounts/codex/active/route_client-reference-manifest.js +1 -0
  74. package/dist/standalone/.next/server/app/api/accounts/codex/policy/route.js +1 -0
  75. package/dist/standalone/.next/server/app/api/accounts/codex/policy/route.js.nft.json +1 -0
  76. package/dist/standalone/.next/server/app/api/accounts/codex/policy/route_client-reference-manifest.js +1 -0
  77. package/dist/standalone/.next/server/app/api/accounts/codex/route.js +1 -0
  78. package/dist/standalone/.next/server/app/api/accounts/codex/route.js.nft.json +1 -0
  79. package/dist/standalone/.next/server/app/api/accounts/codex/route_client-reference-manifest.js +1 -0
  80. package/dist/standalone/.next/server/app/api/accounts/codex/terminal/route.js +4 -0
  81. package/dist/standalone/.next/server/app/api/accounts/codex/terminal/route.js.nft.json +1 -0
  82. package/dist/standalone/.next/server/app/api/accounts/codex/terminal/route_client-reference-manifest.js +1 -0
  83. package/dist/standalone/.next/server/app/api/accounts/route.js +1 -0
  84. package/dist/standalone/.next/server/app/api/accounts/route.js.nft.json +1 -0
  85. package/dist/standalone/.next/server/app/api/accounts/route_client-reference-manifest.js +1 -0
  86. package/dist/standalone/.next/server/app/api/agent/route.js +1 -0
  87. package/dist/standalone/.next/server/app/api/agent/route.js.nft.json +1 -0
  88. package/dist/standalone/.next/server/app/api/agent/route_client-reference-manifest.js +1 -0
  89. package/dist/standalone/.next/server/app/api/agent/snapshot/route.js +1 -0
  90. package/dist/standalone/.next/server/app/api/agent/snapshot/route.js.nft.json +1 -0
  91. package/dist/standalone/.next/server/app/api/agent/snapshot/route_client-reference-manifest.js +1 -0
  92. package/dist/standalone/.next/server/app/api/answer/route.js +1 -1
  93. package/dist/standalone/.next/server/app/api/answer/route.js.nft.json +1 -1
  94. package/dist/standalone/.next/server/app/api/artifact/route.js +1 -0
  95. package/dist/standalone/.next/server/app/api/artifact/route.js.nft.json +1 -0
  96. package/dist/standalone/.next/server/app/api/artifact/route_client-reference-manifest.js +1 -0
  97. package/dist/standalone/.next/server/app/api/attach-command/route.js +1 -0
  98. package/dist/standalone/.next/server/app/api/attach-command/route.js.nft.json +1 -0
  99. package/dist/standalone/.next/server/app/api/attach-command/route_client-reference-manifest.js +1 -0
  100. package/dist/standalone/.next/server/app/api/attention/[id]/route.js +1 -0
  101. package/dist/standalone/.next/server/app/api/attention/[id]/route.js.nft.json +1 -0
  102. package/dist/standalone/.next/server/app/api/attention/[id]/route_client-reference-manifest.js +1 -0
  103. package/dist/standalone/.next/server/app/api/attention/route.js +1 -0
  104. package/dist/standalone/.next/server/app/api/attention/route.js.nft.json +1 -0
  105. package/dist/standalone/.next/server/app/api/attention/route_client-reference-manifest.js +1 -0
  106. package/dist/standalone/.next/server/app/api/board/route.js +1 -0
  107. package/dist/standalone/.next/server/app/api/board/route.js.nft.json +1 -0
  108. package/dist/standalone/.next/server/app/api/board/route_client-reference-manifest.js +1 -0
  109. package/dist/standalone/.next/server/app/api/bridge/route.js +2 -0
  110. package/dist/standalone/.next/server/app/api/bridge/route.js.nft.json +1 -0
  111. package/dist/standalone/.next/server/app/api/bridge/route_client-reference-manifest.js +1 -0
  112. package/dist/standalone/.next/server/app/api/conversations/[conversationId]/migration/route.js +1 -0
  113. package/dist/standalone/.next/server/app/api/conversations/[conversationId]/migration/route.js.nft.json +1 -0
  114. package/dist/standalone/.next/server/app/api/conversations/[conversationId]/migration/route_client-reference-manifest.js +1 -0
  115. package/dist/standalone/.next/server/app/api/conversations/route.js +1 -0
  116. package/dist/standalone/.next/server/app/api/conversations/route.js.nft.json +1 -0
  117. package/dist/standalone/.next/server/app/api/conversations/route_client-reference-manifest.js +1 -0
  118. package/dist/standalone/.next/server/app/api/files/route.js +2 -1
  119. package/dist/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  120. package/dist/standalone/.next/server/app/api/flows/[id]/route.js +1 -1
  121. package/dist/standalone/.next/server/app/api/flows/[id]/route.js.nft.json +1 -1
  122. package/dist/standalone/.next/server/app/api/flows/route.js +1 -1
  123. package/dist/standalone/.next/server/app/api/flows/route.js.nft.json +1 -1
  124. package/dist/standalone/.next/server/app/api/image/route.js +1 -1
  125. package/dist/standalone/.next/server/app/api/image/route.js.nft.json +1 -1
  126. package/dist/standalone/.next/server/app/api/inbox/route.js +2 -2
  127. package/dist/standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  128. package/dist/standalone/.next/server/app/api/lifecycle/reaper/route.js +1 -0
  129. package/dist/standalone/.next/server/app/api/lifecycle/reaper/route.js.nft.json +1 -0
  130. package/dist/standalone/.next/server/app/api/lifecycle/reaper/route_client-reference-manifest.js +1 -0
  131. package/dist/standalone/.next/server/app/api/limits/history/route.js +4 -0
  132. package/dist/standalone/.next/server/app/api/limits/history/route.js.nft.json +1 -0
  133. package/dist/standalone/.next/server/app/api/limits/history/route_client-reference-manifest.js +1 -0
  134. package/dist/standalone/.next/server/app/api/limits/route.js +4 -2
  135. package/dist/standalone/.next/server/app/api/limits/route.js.nft.json +1 -1
  136. package/dist/standalone/.next/server/app/api/log/preflight/route.js +1 -0
  137. package/dist/standalone/.next/server/app/api/log/preflight/route.js.nft.json +1 -0
  138. package/dist/standalone/.next/server/app/api/log/preflight/route_client-reference-manifest.js +1 -0
  139. package/dist/standalone/.next/server/app/api/log/project-delete/route.js +1 -0
  140. package/dist/standalone/.next/server/app/api/log/project-delete/route.js.nft.json +1 -0
  141. package/dist/standalone/.next/server/app/api/log/project-delete/route_client-reference-manifest.js +1 -0
  142. package/dist/standalone/.next/server/app/api/log/provenance/route.js +1 -0
  143. package/dist/standalone/.next/server/app/api/log/provenance/route.js.nft.json +1 -0
  144. package/dist/standalone/.next/server/app/api/log/provenance/route_client-reference-manifest.js +1 -0
  145. package/dist/standalone/.next/server/app/api/log/route.js +1 -1
  146. package/dist/standalone/.next/server/app/api/log/route.js.nft.json +1 -1
  147. package/dist/standalone/.next/server/app/api/logs/route.js +1 -1
  148. package/dist/standalone/.next/server/app/api/logs/route.js.nft.json +1 -1
  149. package/dist/standalone/.next/server/app/api/logs/stream/route.js +4 -4
  150. package/dist/standalone/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
  151. package/dist/standalone/.next/server/app/api/monitor/lock/route.js +3 -0
  152. package/dist/standalone/.next/server/app/api/monitor/lock/route.js.nft.json +1 -0
  153. package/dist/standalone/.next/server/app/api/monitor/lock/route_client-reference-manifest.js +1 -0
  154. package/dist/standalone/.next/server/app/api/monitor/runs/route.js +3 -0
  155. package/dist/standalone/.next/server/app/api/monitor/runs/route.js.nft.json +1 -0
  156. package/dist/standalone/.next/server/app/api/monitor/runs/route_client-reference-manifest.js +1 -0
  157. package/dist/standalone/.next/server/app/api/orchestrator/rotate/route.js +1 -0
  158. package/dist/standalone/.next/server/app/api/orchestrator/rotate/route.js.nft.json +1 -0
  159. package/dist/standalone/.next/server/app/api/orchestrator/rotate/route_client-reference-manifest.js +1 -0
  160. package/dist/standalone/.next/server/app/api/orchestrator/seat/route.js +1 -0
  161. package/dist/standalone/.next/server/app/api/orchestrator/seat/route.js.nft.json +1 -0
  162. package/dist/standalone/.next/server/app/api/orchestrator/seat/route_client-reference-manifest.js +1 -0
  163. package/dist/standalone/.next/server/app/api/orchestrator/seat/status/route.js +3 -0
  164. package/dist/standalone/.next/server/app/api/orchestrator/seat/status/route.js.nft.json +1 -0
  165. package/dist/standalone/.next/server/app/api/orchestrator/seat/status/route_client-reference-manifest.js +1 -0
  166. package/dist/standalone/.next/server/app/api/pipelines/[id]/route.js +1 -0
  167. package/dist/standalone/.next/server/app/api/pipelines/[id]/route.js.nft.json +1 -0
  168. package/dist/standalone/.next/server/app/api/pipelines/[id]/route_client-reference-manifest.js +1 -0
  169. package/dist/standalone/.next/server/app/api/pipelines/preflight/route.js +1 -0
  170. package/dist/standalone/.next/server/app/api/pipelines/preflight/route.js.nft.json +1 -0
  171. package/dist/standalone/.next/server/app/api/pipelines/preflight/route_client-reference-manifest.js +1 -0
  172. package/dist/standalone/.next/server/app/api/pipelines/route.js +2 -0
  173. package/dist/standalone/.next/server/app/api/pipelines/route.js.nft.json +1 -0
  174. package/dist/standalone/.next/server/app/api/pipelines/route_client-reference-manifest.js +1 -0
  175. package/dist/standalone/.next/server/app/api/pipelines/tick/route.js +2 -0
  176. package/dist/standalone/.next/server/app/api/pipelines/tick/route.js.nft.json +1 -0
  177. package/dist/standalone/.next/server/app/api/pipelines/tick/route_client-reference-manifest.js +1 -0
  178. package/dist/standalone/.next/server/app/api/proc/route.js +1 -1
  179. package/dist/standalone/.next/server/app/api/proc/route.js.nft.json +1 -1
  180. package/dist/standalone/.next/server/app/api/projects/create/route.js +3 -0
  181. package/dist/standalone/.next/server/app/api/projects/create/route.js.nft.json +1 -0
  182. package/dist/standalone/.next/server/app/api/projects/create/route_client-reference-manifest.js +1 -0
  183. package/dist/standalone/.next/server/app/api/projects/crown/route.js +1 -0
  184. package/dist/standalone/.next/server/app/api/projects/crown/route.js.nft.json +1 -0
  185. package/dist/standalone/.next/server/app/api/projects/crown/route_client-reference-manifest.js +1 -0
  186. package/dist/standalone/.next/server/app/api/push/route.js +2 -1
  187. package/dist/standalone/.next/server/app/api/push/route.js.nft.json +1 -1
  188. package/dist/standalone/.next/server/app/api/resources/route.js +1 -1
  189. package/dist/standalone/.next/server/app/api/resources/route.js.nft.json +1 -1
  190. package/dist/standalone/.next/server/app/api/roles/route.js +2 -0
  191. package/dist/standalone/.next/server/app/api/roles/route.js.nft.json +1 -0
  192. package/dist/standalone/.next/server/app/api/roles/route_client-reference-manifest.js +1 -0
  193. package/dist/standalone/.next/server/app/api/runtime/answer/route.js +1 -0
  194. package/dist/standalone/.next/server/app/api/runtime/answer/route.js.nft.json +1 -0
  195. package/dist/standalone/.next/server/app/api/runtime/answer/route_client-reference-manifest.js +1 -0
  196. package/dist/standalone/.next/server/app/api/runtime/deployments/[deploymentId]/route.js +1 -0
  197. package/dist/standalone/.next/server/app/api/runtime/deployments/[deploymentId]/route.js.nft.json +1 -0
  198. package/dist/standalone/.next/server/app/api/runtime/deployments/[deploymentId]/route_client-reference-manifest.js +1 -0
  199. package/dist/standalone/.next/server/app/api/runtime/deployments/capabilities/v1/route.js +1 -0
  200. package/dist/standalone/.next/server/app/api/runtime/deployments/capabilities/v1/route.js.nft.json +1 -0
  201. package/dist/standalone/.next/server/app/api/runtime/deployments/capabilities/v1/route_client-reference-manifest.js +1 -0
  202. package/dist/standalone/.next/server/app/api/runtime/deployments/route.js +1 -0
  203. package/dist/standalone/.next/server/app/api/runtime/deployments/route.js.nft.json +1 -0
  204. package/dist/standalone/.next/server/app/api/runtime/deployments/route_client-reference-manifest.js +1 -0
  205. package/dist/standalone/.next/server/app/api/runtime/interrupt/route.js +1 -0
  206. package/dist/standalone/.next/server/app/api/runtime/interrupt/route.js.nft.json +1 -0
  207. package/dist/standalone/.next/server/app/api/runtime/interrupt/route_client-reference-manifest.js +1 -0
  208. package/dist/standalone/.next/server/app/api/runtime/operations/[operationId]/route.js +1 -0
  209. package/dist/standalone/.next/server/app/api/runtime/operations/[operationId]/route.js.nft.json +1 -0
  210. package/dist/standalone/.next/server/app/api/runtime/operations/[operationId]/route_client-reference-manifest.js +1 -0
  211. package/dist/standalone/.next/server/app/api/runtime/operations/route.js +1 -0
  212. package/dist/standalone/.next/server/app/api/runtime/operations/route.js.nft.json +1 -0
  213. package/dist/standalone/.next/server/app/api/runtime/operations/route_client-reference-manifest.js +1 -0
  214. package/dist/standalone/.next/server/app/api/runtime/realtime/route.js +1 -0
  215. package/dist/standalone/.next/server/app/api/runtime/realtime/route.js.nft.json +1 -0
  216. package/dist/standalone/.next/server/app/api/runtime/realtime/route_client-reference-manifest.js +1 -0
  217. package/dist/standalone/.next/server/app/api/runtime/send/route.js +1 -0
  218. package/dist/standalone/.next/server/app/api/runtime/send/route.js.nft.json +1 -0
  219. package/dist/standalone/.next/server/app/api/runtime/send/route_client-reference-manifest.js +1 -0
  220. package/dist/standalone/.next/server/app/api/runtime/snapshot/route.js +1 -0
  221. package/dist/standalone/.next/server/app/api/runtime/snapshot/route.js.nft.json +1 -0
  222. package/dist/standalone/.next/server/app/api/runtime/snapshot/route_client-reference-manifest.js +1 -0
  223. package/dist/standalone/.next/server/app/api/runtime/spawn/route.js +1 -0
  224. package/dist/standalone/.next/server/app/api/runtime/spawn/route.js.nft.json +1 -0
  225. package/dist/standalone/.next/server/app/api/runtime/spawn/route_client-reference-manifest.js +1 -0
  226. package/dist/standalone/.next/server/app/api/runtime/steer/route.js +1 -0
  227. package/dist/standalone/.next/server/app/api/runtime/steer/route.js.nft.json +1 -0
  228. package/dist/standalone/.next/server/app/api/runtime/steer/route_client-reference-manifest.js +1 -0
  229. package/dist/standalone/.next/server/app/api/runtime/stream/route.js +8 -0
  230. package/dist/standalone/.next/server/app/api/runtime/stream/route.js.nft.json +1 -0
  231. package/dist/standalone/.next/server/app/api/runtime/stream/route_client-reference-manifest.js +1 -0
  232. package/dist/standalone/.next/server/app/api/search/transcripts/route.js +2 -0
  233. package/dist/standalone/.next/server/app/api/search/transcripts/route.js.nft.json +1 -0
  234. package/dist/standalone/.next/server/app/api/search/transcripts/route_client-reference-manifest.js +1 -0
  235. package/dist/standalone/.next/server/app/api/session/route.js +1 -1
  236. package/dist/standalone/.next/server/app/api/session/route.js.nft.json +1 -1
  237. package/dist/standalone/.next/server/app/api/session/supersedence/route.js +1 -0
  238. package/dist/standalone/.next/server/app/api/session/supersedence/route.js.nft.json +1 -0
  239. package/dist/standalone/.next/server/app/api/session/supersedence/route_client-reference-manifest.js +1 -0
  240. package/dist/standalone/.next/server/app/api/session/title/route.js +1 -0
  241. package/dist/standalone/.next/server/app/api/session/title/route.js.nft.json +1 -0
  242. package/dist/standalone/.next/server/app/api/session/title/route_client-reference-manifest.js +1 -0
  243. package/dist/standalone/.next/server/app/api/spawn/policy/route.js +6 -0
  244. package/dist/standalone/.next/server/app/api/spawn/policy/route.js.nft.json +1 -0
  245. package/dist/standalone/.next/server/app/api/spawn/policy/route_client-reference-manifest.js +1 -0
  246. package/dist/standalone/.next/server/app/api/spawn/route.js +2 -1
  247. package/dist/standalone/.next/server/app/api/spawn/route.js.nft.json +1 -1
  248. package/dist/standalone/.next/server/app/api/staging/route.js +2 -0
  249. package/dist/standalone/.next/server/app/api/staging/route.js.nft.json +1 -0
  250. package/dist/standalone/.next/server/app/api/staging/route_client-reference-manifest.js +1 -0
  251. package/dist/standalone/.next/server/app/api/task-attachments/route.js +2 -0
  252. package/dist/standalone/.next/server/app/api/task-attachments/route.js.nft.json +1 -0
  253. package/dist/standalone/.next/server/app/api/task-attachments/route_client-reference-manifest.js +1 -0
  254. package/dist/standalone/.next/server/app/api/tasks/[id]/assignment/route.js +1 -2
  255. package/dist/standalone/.next/server/app/api/tasks/[id]/assignment/route.js.nft.json +1 -1
  256. package/dist/standalone/.next/server/app/api/tasks/[id]/route.js +1 -2
  257. package/dist/standalone/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
  258. package/dist/standalone/.next/server/app/api/tasks/[id]/send/route.js +1 -1
  259. package/dist/standalone/.next/server/app/api/tasks/[id]/send/route.js.nft.json +1 -1
  260. package/dist/standalone/.next/server/app/api/tasks/[id]/spawn/route.js +1 -1
  261. package/dist/standalone/.next/server/app/api/tasks/[id]/spawn/route.js.nft.json +1 -1
  262. package/dist/standalone/.next/server/app/api/tasks/curator/route.js +1 -1
  263. package/dist/standalone/.next/server/app/api/tasks/curator/route.js.nft.json +1 -1
  264. package/dist/standalone/.next/server/app/api/tasks/route.js +11 -2
  265. package/dist/standalone/.next/server/app/api/tasks/route.js.nft.json +1 -1
  266. package/dist/standalone/.next/server/app/api/telegram/reports/route.js +1 -0
  267. package/dist/standalone/.next/server/app/api/telegram/reports/route.js.nft.json +1 -0
  268. package/dist/standalone/.next/server/app/api/telegram/reports/route_client-reference-manifest.js +1 -0
  269. package/dist/standalone/.next/server/app/api/telegram/route.js +1 -0
  270. package/dist/standalone/.next/server/app/api/telegram/route.js.nft.json +1 -0
  271. package/dist/standalone/.next/server/app/api/telegram/route_client-reference-manifest.js +1 -0
  272. package/dist/standalone/.next/server/app/api/timeline/route.js +1 -1
  273. package/dist/standalone/.next/server/app/api/timeline/route.js.nft.json +1 -1
  274. package/dist/standalone/.next/server/app/api/tmux/route.js +1 -1
  275. package/dist/standalone/.next/server/app/api/tmux/route.js.nft.json +1 -1
  276. package/dist/standalone/.next/server/app/api/tmux/targets/route.js +1 -1
  277. package/dist/standalone/.next/server/app/api/tmux/targets/route.js.nft.json +1 -1
  278. package/dist/standalone/.next/server/app/api/transcribe/backend/route.js +2 -2
  279. package/dist/standalone/.next/server/app/api/transcribe/backend/route.js.nft.json +1 -1
  280. package/dist/standalone/.next/server/app/api/transcribe/route.js +2 -2
  281. package/dist/standalone/.next/server/app/api/transcribe/route.js.nft.json +1 -1
  282. package/dist/standalone/.next/server/app/api/transcribe/token/route.js +2 -2
  283. package/dist/standalone/.next/server/app/api/transcribe/token/route.js.nft.json +1 -1
  284. package/dist/standalone/.next/server/app/api/tts/backend/route.js +1 -0
  285. package/dist/standalone/.next/server/app/api/tts/backend/route.js.nft.json +1 -0
  286. package/dist/standalone/.next/server/app/api/tts/backend/route_client-reference-manifest.js +1 -0
  287. package/dist/standalone/.next/server/app/api/tts/route.js +3 -0
  288. package/dist/standalone/.next/server/app/api/tts/route.js.nft.json +1 -0
  289. package/dist/standalone/.next/server/app/api/tts/route_client-reference-manifest.js +1 -0
  290. package/dist/standalone/.next/server/app/api/view/presence/route.js +1 -0
  291. package/dist/standalone/.next/server/app/api/view/presence/route.js.nft.json +1 -0
  292. package/dist/standalone/.next/server/app/api/view/presence/route_client-reference-manifest.js +1 -0
  293. package/dist/standalone/.next/server/app/api/workflows/[id]/route.js +1 -1
  294. package/dist/standalone/.next/server/app/api/workflows/[id]/route.js.nft.json +1 -1
  295. package/dist/standalone/.next/server/app/api/workflows/route.js +1 -1
  296. package/dist/standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  297. package/dist/standalone/.next/server/app/favicon.ico/route.js +1 -1
  298. package/dist/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  299. package/dist/standalone/.next/server/app/index.html +1 -1
  300. package/dist/standalone/.next/server/app/index.rsc +4 -4
  301. package/dist/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  302. package/dist/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  303. package/dist/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  304. package/dist/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  305. package/dist/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  306. package/dist/standalone/.next/server/app/page.js +74 -3
  307. package/dist/standalone/.next/server/app/page.js.nft.json +1 -1
  308. package/dist/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  309. package/dist/standalone/.next/server/app-paths-manifest.json +73 -9
  310. package/dist/standalone/.next/server/chunks/1068.js +1 -0
  311. package/dist/standalone/.next/server/chunks/1097.js +1 -0
  312. package/dist/standalone/.next/server/chunks/156.js +2 -0
  313. package/dist/standalone/.next/server/chunks/1617.js +2 -0
  314. package/dist/standalone/.next/server/chunks/1813.js +1 -0
  315. package/dist/standalone/.next/server/chunks/1858.js +91 -0
  316. package/dist/standalone/.next/server/chunks/1888.js +1 -0
  317. package/dist/standalone/.next/server/chunks/1911.js +1 -0
  318. package/dist/standalone/.next/server/chunks/1918.js +1 -0
  319. package/dist/standalone/.next/server/chunks/1920.js +27 -0
  320. package/dist/standalone/.next/server/chunks/2190.js +1 -0
  321. package/dist/standalone/.next/server/chunks/230.js +1 -0
  322. package/dist/standalone/.next/server/chunks/2318.js +2 -0
  323. package/dist/standalone/.next/server/chunks/2324.js +1 -0
  324. package/dist/standalone/.next/server/chunks/2338.js +9 -0
  325. package/dist/standalone/.next/server/chunks/2904.js +42 -0
  326. package/dist/standalone/.next/server/chunks/2923.js +1 -0
  327. package/dist/standalone/.next/server/chunks/2962.js +1 -0
  328. package/dist/standalone/.next/server/chunks/2977.js +1 -0
  329. package/dist/standalone/.next/server/chunks/306.js +3 -0
  330. package/dist/standalone/.next/server/chunks/3086.js +1 -0
  331. package/dist/standalone/.next/server/chunks/3139.js +10 -0
  332. package/dist/standalone/.next/server/chunks/3214.js +82 -0
  333. package/dist/standalone/.next/server/chunks/3313.js +1 -0
  334. package/dist/standalone/.next/server/chunks/3336.js +1 -0
  335. package/dist/standalone/.next/server/chunks/3438.js +2 -0
  336. package/dist/standalone/.next/server/chunks/3558.js +1 -0
  337. package/dist/standalone/.next/server/chunks/3587.js +1 -0
  338. package/dist/standalone/.next/server/chunks/3598.js +81 -0
  339. package/dist/standalone/.next/server/chunks/3669.js +1 -0
  340. package/dist/standalone/.next/server/chunks/3740.js +126 -0
  341. package/dist/standalone/.next/server/chunks/3793.js +6 -0
  342. package/dist/standalone/.next/server/chunks/3817.js +1 -0
  343. package/dist/standalone/.next/server/chunks/3916.js +1 -0
  344. package/dist/standalone/.next/server/chunks/3944.js +1 -0
  345. package/dist/standalone/.next/server/chunks/3953.js +1 -0
  346. package/dist/standalone/.next/server/chunks/4012.js +4 -0
  347. package/dist/standalone/.next/server/chunks/4127.js +1 -0
  348. package/dist/standalone/.next/server/chunks/4191.js +1 -0
  349. package/dist/standalone/.next/server/chunks/4260.js +2 -0
  350. package/dist/standalone/.next/server/chunks/4509.js +1 -0
  351. package/dist/standalone/.next/server/chunks/{741.js → 4741.js} +1 -1
  352. package/dist/standalone/.next/server/chunks/4968.js +1 -0
  353. package/dist/standalone/.next/server/chunks/4972.js +130 -0
  354. package/dist/standalone/.next/server/chunks/5689.js +11 -0
  355. package/dist/standalone/.next/server/chunks/6333.js +47 -0
  356. package/dist/standalone/.next/server/chunks/6389.js +1 -0
  357. package/dist/standalone/.next/server/chunks/640.js +1 -0
  358. package/dist/standalone/.next/server/chunks/6796.js +1 -0
  359. package/dist/standalone/.next/server/chunks/6826.js +2 -0
  360. package/dist/standalone/.next/server/chunks/6850.js +1 -0
  361. package/dist/standalone/.next/server/chunks/6909.js +1 -0
  362. package/dist/standalone/.next/server/chunks/6977.js +1 -0
  363. package/dist/standalone/.next/server/chunks/7126.js +1 -0
  364. package/dist/standalone/.next/server/chunks/7159.js +1 -0
  365. package/dist/standalone/.next/server/chunks/7270.js +45 -0
  366. package/dist/standalone/.next/server/chunks/7295.js +10 -0
  367. package/dist/standalone/.next/server/chunks/7471.js +87 -0
  368. package/dist/standalone/.next/server/chunks/7563.js +1 -0
  369. package/dist/standalone/.next/server/chunks/7644.js +13 -0
  370. package/dist/standalone/.next/server/chunks/7722.js +1 -0
  371. package/dist/standalone/.next/server/chunks/7733.js +4 -0
  372. package/dist/standalone/.next/server/chunks/7868.js +1 -0
  373. package/dist/standalone/.next/server/chunks/8026.js +1 -0
  374. package/dist/standalone/.next/server/chunks/8140.js +1 -0
  375. package/dist/standalone/.next/server/chunks/8176.js +1 -0
  376. package/dist/standalone/.next/server/chunks/8444.js +1 -0
  377. package/dist/standalone/.next/server/chunks/8465.js +2 -0
  378. package/dist/standalone/.next/server/chunks/849.js +6 -0
  379. package/dist/standalone/.next/server/chunks/8576.js +1 -0
  380. package/dist/standalone/.next/server/chunks/8600.js +12 -0
  381. package/dist/standalone/.next/server/chunks/8617.js +2 -0
  382. package/dist/standalone/.next/server/chunks/8797.js +1 -0
  383. package/dist/standalone/.next/server/chunks/8817.js +5 -0
  384. package/dist/standalone/.next/server/chunks/8966.js +2 -0
  385. package/dist/standalone/.next/server/chunks/8996.js +1 -0
  386. package/dist/standalone/.next/server/chunks/9246.js +47 -0
  387. package/dist/standalone/.next/server/chunks/9364.js +310 -0
  388. package/dist/standalone/.next/server/chunks/9411.js +14 -0
  389. package/dist/standalone/.next/server/chunks/9434.js +13 -0
  390. package/dist/standalone/.next/server/chunks/9507.js +1 -0
  391. package/dist/standalone/.next/server/chunks/9676.js +62 -0
  392. package/dist/standalone/.next/server/chunks/9733.js +42 -0
  393. package/dist/standalone/.next/server/chunks/9901.js +62 -0
  394. package/dist/standalone/.next/server/chunks/9937.js +2 -0
  395. package/dist/standalone/.next/server/chunks/9940.js +128 -0
  396. package/dist/standalone/.next/server/chunks/9998.js +1 -0
  397. package/dist/standalone/.next/server/chunks/static/media/pdf.worker.min.65fe1ff1.mjs +6 -0
  398. package/dist/standalone/.next/server/file-scanner-worker.js +4 -0
  399. package/dist/standalone/.next/server/files-response-worker.js +13 -0
  400. package/dist/standalone/.next/server/functions-config-manifest.json +64 -0
  401. package/dist/standalone/.next/server/instrumentation.js +1 -0
  402. package/dist/standalone/.next/server/middleware-build-manifest.js +1 -1
  403. package/dist/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  404. package/dist/standalone/.next/server/middleware.js +2 -2
  405. package/dist/standalone/.next/server/pages/404.html +1 -1
  406. package/dist/standalone/.next/server/pages/500.html +1 -1
  407. package/dist/standalone/.next/server/resource-collector-worker.js +1 -0
  408. package/dist/standalone/.next/server/server-reference-manifest.json +1 -1
  409. package/dist/standalone/.next/server/wakatime-sync-worker.js +2 -0
  410. package/dist/standalone/.next/server/webpack-runtime.js +1 -1
  411. package/dist/standalone/.next/static/chunks/1783.662e4b7044e5db2f.js +1 -0
  412. package/dist/standalone/.next/static/chunks/2345.c09668c2640f24ad.js +1 -0
  413. package/dist/standalone/.next/static/chunks/2462.217e83e51ac07519.js +1 -0
  414. package/dist/standalone/.next/static/chunks/2619.fd64e7a5bd9005d5.js +1 -0
  415. package/dist/standalone/.next/static/chunks/3015.f61f117dd9ccb747.js +1 -0
  416. package/dist/standalone/.next/static/chunks/{794-0fc36bf1952fbc29.js → 3794-a205959ce301b5c6.js} +1 -1
  417. package/dist/standalone/.next/static/chunks/4bd1b696-c2f6e0877b6c10aa.js +1 -0
  418. package/dist/standalone/.next/static/chunks/6370.4f217a9379f47764.js +1 -0
  419. package/dist/standalone/.next/static/chunks/7067.f02e8d0616800bac.js +1 -0
  420. package/dist/standalone/.next/static/chunks/7297.aaa457b2a2939f7b.js +1 -0
  421. package/dist/standalone/.next/static/chunks/7774.cca1e546ab5623e0.js +1 -0
  422. package/dist/standalone/.next/static/chunks/8293.5545fdbde0213c98.js +1 -0
  423. package/dist/standalone/.next/static/chunks/8327.33abd84515b38836.js +1 -0
  424. package/dist/standalone/.next/static/chunks/858.302d545082b159c6.js +1 -0
  425. package/dist/standalone/.next/static/chunks/9178-e32f088e89b55503.js +1 -0
  426. package/dist/standalone/.next/static/chunks/9583.b999fb5de3a3494a.js +1 -0
  427. package/dist/standalone/.next/static/chunks/9b0008ae.eb7a9c4c1c92a63b.js +45 -0
  428. package/dist/standalone/.next/static/chunks/app/_global-error/page-c132c5ba005ff29e.js +1 -0
  429. package/dist/standalone/.next/static/chunks/app/_not-found/page-9e7648417ae57bf7.js +1 -0
  430. package/dist/standalone/.next/static/chunks/app/api/access/route-c132c5ba005ff29e.js +1 -0
  431. package/dist/standalone/.next/static/chunks/app/api/account-migrations/[intentId]/route-c132c5ba005ff29e.js +1 -0
  432. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/[id]/status/route-c132c5ba005ff29e.js +1 -0
  433. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/active/route-c132c5ba005ff29e.js +1 -0
  434. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/login/[operationId]/input/route-c132c5ba005ff29e.js +1 -0
  435. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/login/[operationId]/route-c132c5ba005ff29e.js +1 -0
  436. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/policy/route-c132c5ba005ff29e.js +1 -0
  437. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/route-c132c5ba005ff29e.js +1 -0
  438. package/dist/standalone/.next/static/chunks/app/api/accounts/claude/terminal/route-c132c5ba005ff29e.js +1 -0
  439. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/active/route-c132c5ba005ff29e.js +1 -0
  440. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/policy/route-c132c5ba005ff29e.js +1 -0
  441. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/route-c132c5ba005ff29e.js +1 -0
  442. package/dist/standalone/.next/static/chunks/app/api/accounts/codex/terminal/route-c132c5ba005ff29e.js +1 -0
  443. package/dist/standalone/.next/static/chunks/app/api/accounts/route-c132c5ba005ff29e.js +1 -0
  444. package/dist/standalone/.next/static/chunks/app/api/agent/route-c132c5ba005ff29e.js +1 -0
  445. package/dist/standalone/.next/static/chunks/app/api/agent/snapshot/route-c132c5ba005ff29e.js +1 -0
  446. package/dist/standalone/.next/static/chunks/app/api/answer/route-c132c5ba005ff29e.js +1 -0
  447. package/dist/standalone/.next/static/chunks/app/api/artifact/route-c132c5ba005ff29e.js +1 -0
  448. package/dist/standalone/.next/static/chunks/app/api/attach-command/route-c132c5ba005ff29e.js +1 -0
  449. package/dist/standalone/.next/static/chunks/app/api/attention/[id]/route-c132c5ba005ff29e.js +1 -0
  450. package/dist/standalone/.next/static/chunks/app/api/attention/route-c132c5ba005ff29e.js +1 -0
  451. package/dist/standalone/.next/static/chunks/app/api/board/route-c132c5ba005ff29e.js +1 -0
  452. package/dist/standalone/.next/static/chunks/app/api/bridge/route-c132c5ba005ff29e.js +1 -0
  453. package/dist/standalone/.next/static/chunks/app/api/conversations/[conversationId]/migration/route-c132c5ba005ff29e.js +1 -0
  454. package/dist/standalone/.next/static/chunks/app/api/conversations/route-c132c5ba005ff29e.js +1 -0
  455. package/dist/standalone/.next/static/chunks/app/api/files/route-c132c5ba005ff29e.js +1 -0
  456. package/dist/standalone/.next/static/chunks/app/api/flows/[id]/route-c132c5ba005ff29e.js +1 -0
  457. package/dist/standalone/.next/static/chunks/app/api/flows/route-c132c5ba005ff29e.js +1 -0
  458. package/dist/standalone/.next/static/chunks/app/api/image/route-c132c5ba005ff29e.js +1 -0
  459. package/dist/standalone/.next/static/chunks/app/api/inbox/route-c132c5ba005ff29e.js +1 -0
  460. package/dist/standalone/.next/static/chunks/app/api/lifecycle/reaper/route-c132c5ba005ff29e.js +1 -0
  461. package/dist/standalone/.next/static/chunks/app/api/limits/history/route-c132c5ba005ff29e.js +1 -0
  462. package/dist/standalone/.next/static/chunks/app/api/limits/route-c132c5ba005ff29e.js +1 -0
  463. package/dist/standalone/.next/static/chunks/app/api/log/preflight/route-c132c5ba005ff29e.js +1 -0
  464. package/dist/standalone/.next/static/chunks/app/api/log/project-delete/route-c132c5ba005ff29e.js +1 -0
  465. package/dist/standalone/.next/static/chunks/app/api/log/provenance/route-c132c5ba005ff29e.js +1 -0
  466. package/dist/standalone/.next/static/chunks/app/api/log/route-c132c5ba005ff29e.js +1 -0
  467. package/dist/standalone/.next/static/chunks/app/api/logs/route-c132c5ba005ff29e.js +1 -0
  468. package/dist/standalone/.next/static/chunks/app/api/logs/stream/route-c132c5ba005ff29e.js +1 -0
  469. package/dist/standalone/.next/static/chunks/app/api/monitor/lock/route-c132c5ba005ff29e.js +1 -0
  470. package/dist/standalone/.next/static/chunks/app/api/monitor/runs/route-c132c5ba005ff29e.js +1 -0
  471. package/dist/standalone/.next/static/chunks/app/api/orchestrator/rotate/route-c132c5ba005ff29e.js +1 -0
  472. package/dist/standalone/.next/static/chunks/app/api/orchestrator/seat/route-c132c5ba005ff29e.js +1 -0
  473. package/dist/standalone/.next/static/chunks/app/api/orchestrator/seat/status/route-c132c5ba005ff29e.js +1 -0
  474. package/dist/standalone/.next/static/chunks/app/api/pipelines/[id]/route-c132c5ba005ff29e.js +1 -0
  475. package/dist/standalone/.next/static/chunks/app/api/pipelines/preflight/route-c132c5ba005ff29e.js +1 -0
  476. package/dist/standalone/.next/static/chunks/app/api/pipelines/route-c132c5ba005ff29e.js +1 -0
  477. package/dist/standalone/.next/static/chunks/app/api/pipelines/tick/route-c132c5ba005ff29e.js +1 -0
  478. package/dist/standalone/.next/static/chunks/app/api/proc/route-c132c5ba005ff29e.js +1 -0
  479. package/dist/standalone/.next/static/chunks/app/api/projects/create/route-c132c5ba005ff29e.js +1 -0
  480. package/dist/standalone/.next/static/chunks/app/api/projects/crown/route-c132c5ba005ff29e.js +1 -0
  481. package/dist/standalone/.next/static/chunks/app/api/push/route-c132c5ba005ff29e.js +1 -0
  482. package/dist/standalone/.next/static/chunks/app/api/resources/route-c132c5ba005ff29e.js +1 -0
  483. package/dist/standalone/.next/static/chunks/app/api/roles/route-c132c5ba005ff29e.js +1 -0
  484. package/dist/standalone/.next/static/chunks/app/api/runtime/answer/route-c132c5ba005ff29e.js +1 -0
  485. package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/[deploymentId]/route-c132c5ba005ff29e.js +1 -0
  486. package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/capabilities/v1/route-c132c5ba005ff29e.js +1 -0
  487. package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/route-c132c5ba005ff29e.js +1 -0
  488. package/dist/standalone/.next/static/chunks/app/api/runtime/interrupt/route-c132c5ba005ff29e.js +1 -0
  489. package/dist/standalone/.next/static/chunks/app/api/runtime/operations/[operationId]/route-c132c5ba005ff29e.js +1 -0
  490. package/dist/standalone/.next/static/chunks/app/api/runtime/operations/route-c132c5ba005ff29e.js +1 -0
  491. package/dist/standalone/.next/static/chunks/app/api/runtime/realtime/route-c132c5ba005ff29e.js +1 -0
  492. package/dist/standalone/.next/static/chunks/app/api/runtime/send/route-c132c5ba005ff29e.js +1 -0
  493. package/dist/standalone/.next/static/chunks/app/api/runtime/snapshot/route-c132c5ba005ff29e.js +1 -0
  494. package/dist/standalone/.next/static/chunks/app/api/runtime/spawn/route-c132c5ba005ff29e.js +1 -0
  495. package/dist/standalone/.next/static/chunks/app/api/runtime/steer/route-c132c5ba005ff29e.js +1 -0
  496. package/dist/standalone/.next/static/chunks/app/api/runtime/stream/route-c132c5ba005ff29e.js +1 -0
  497. package/dist/standalone/.next/static/chunks/app/api/search/transcripts/route-c132c5ba005ff29e.js +1 -0
  498. package/dist/standalone/.next/static/chunks/app/api/session/route-c132c5ba005ff29e.js +1 -0
  499. package/dist/standalone/.next/static/chunks/app/api/session/supersedence/route-c132c5ba005ff29e.js +1 -0
  500. package/dist/standalone/.next/static/chunks/app/api/session/title/route-c132c5ba005ff29e.js +1 -0
  501. package/dist/standalone/.next/static/chunks/app/api/spawn/policy/route-c132c5ba005ff29e.js +1 -0
  502. package/dist/standalone/.next/static/chunks/app/api/spawn/route-c132c5ba005ff29e.js +1 -0
  503. package/dist/standalone/.next/static/chunks/app/api/staging/route-c132c5ba005ff29e.js +1 -0
  504. package/dist/standalone/.next/static/chunks/app/api/task-attachments/route-c132c5ba005ff29e.js +1 -0
  505. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/assignment/route-c132c5ba005ff29e.js +1 -0
  506. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/route-c132c5ba005ff29e.js +1 -0
  507. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/send/route-c132c5ba005ff29e.js +1 -0
  508. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/spawn/route-c132c5ba005ff29e.js +1 -0
  509. package/dist/standalone/.next/static/chunks/app/api/tasks/curator/route-c132c5ba005ff29e.js +1 -0
  510. package/dist/standalone/.next/static/chunks/app/api/tasks/route-c132c5ba005ff29e.js +1 -0
  511. package/dist/standalone/.next/static/chunks/app/api/telegram/reports/route-c132c5ba005ff29e.js +1 -0
  512. package/dist/standalone/.next/static/chunks/app/api/telegram/route-c132c5ba005ff29e.js +1 -0
  513. package/dist/standalone/.next/static/chunks/app/api/timeline/route-c132c5ba005ff29e.js +1 -0
  514. package/dist/standalone/.next/static/chunks/app/api/tmux/route-c132c5ba005ff29e.js +1 -0
  515. package/dist/standalone/.next/static/chunks/app/api/tmux/targets/route-c132c5ba005ff29e.js +1 -0
  516. package/dist/standalone/.next/static/chunks/app/api/transcribe/backend/route-c132c5ba005ff29e.js +1 -0
  517. package/dist/standalone/.next/static/chunks/app/api/transcribe/route-c132c5ba005ff29e.js +1 -0
  518. package/dist/standalone/.next/static/chunks/app/api/transcribe/token/route-c132c5ba005ff29e.js +1 -0
  519. package/dist/standalone/.next/static/chunks/app/api/tts/backend/route-c132c5ba005ff29e.js +1 -0
  520. package/dist/standalone/.next/static/chunks/app/api/tts/route-c132c5ba005ff29e.js +1 -0
  521. package/dist/standalone/.next/static/chunks/app/api/view/presence/route-c132c5ba005ff29e.js +1 -0
  522. package/dist/standalone/.next/static/chunks/app/api/workflows/[id]/route-c132c5ba005ff29e.js +1 -0
  523. package/dist/standalone/.next/static/chunks/app/api/workflows/route-c132c5ba005ff29e.js +1 -0
  524. package/dist/standalone/.next/static/chunks/app/layout-c8390ace9b222dd6.js +1 -0
  525. package/dist/standalone/.next/static/chunks/app/page-ac9463b910bf83fe.js +77 -0
  526. package/dist/standalone/.next/static/chunks/framework-d1de002210ddaaef.js +1 -0
  527. package/dist/standalone/.next/static/chunks/{main-3cec32f88450e0e3.js → main-343fc547124ab6ff.js} +2 -2
  528. package/dist/standalone/.next/static/chunks/main-app-63e09a6ca85925cd.js +1 -0
  529. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c132c5ba005ff29e.js +1 -0
  530. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c132c5ba005ff29e.js +1 -0
  531. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-a07ea5db82382b93.js +1 -0
  532. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c132c5ba005ff29e.js +1 -0
  533. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c132c5ba005ff29e.js +1 -0
  534. package/dist/standalone/.next/static/chunks/webpack-1637988d4c7cf23c.js +1 -0
  535. package/dist/standalone/.next/static/css/498f12ddef7ecb0e.css +1 -0
  536. package/dist/standalone/.next/static/kt9OPe8iwfpNcdOX9ygvb/_buildManifest.js +1 -0
  537. package/dist/standalone/.next/static/media/pdf.worker.min.e890bf87.mjs +6 -0
  538. package/dist/standalone/package.json +31 -8
  539. package/dist/standalone/server.bun.js +38 -0
  540. package/dist/standalone/server.js +18 -37
  541. package/package.json +31 -8
  542. package/vendor/telegram-mcp/.python-version +1 -0
  543. package/vendor/telegram-mcp/LICENSE +201 -0
  544. package/vendor/telegram-mcp/PROVENANCE.md +70 -0
  545. package/vendor/telegram-mcp/SHA256SUMS +24 -0
  546. package/vendor/telegram-mcp/main.py +67 -0
  547. package/vendor/telegram-mcp/pyproject.toml +100 -0
  548. package/vendor/telegram-mcp/requirements.txt +7 -0
  549. package/vendor/telegram-mcp/sanitize.py +143 -0
  550. package/vendor/telegram-mcp/session_string_generator.py +259 -0
  551. package/vendor/telegram-mcp/telegram_mcp/__init__.py +15 -0
  552. package/vendor/telegram-mcp/telegram_mcp/client_identity.py +31 -0
  553. package/vendor/telegram-mcp/telegram_mcp/install_guard.py +209 -0
  554. package/vendor/telegram-mcp/telegram_mcp/runner.py +198 -0
  555. package/vendor/telegram-mcp/telegram_mcp/runtime.py +1812 -0
  556. package/vendor/telegram-mcp/telegram_mcp/singleton.py +143 -0
  557. package/vendor/telegram-mcp/telegram_mcp/tools/__init__.py +13 -0
  558. package/vendor/telegram-mcp/telegram_mcp/tools/accounts.py +31 -0
  559. package/vendor/telegram-mcp/telegram_mcp/tools/chats.py +1163 -0
  560. package/vendor/telegram-mcp/telegram_mcp/tools/contacts.py +802 -0
  561. package/vendor/telegram-mcp/telegram_mcp/tools/events.py +485 -0
  562. package/vendor/telegram-mcp/telegram_mcp/tools/folders.py +600 -0
  563. package/vendor/telegram-mcp/telegram_mcp/tools/groups.py +1286 -0
  564. package/vendor/telegram-mcp/telegram_mcp/tools/media.py +470 -0
  565. package/vendor/telegram-mcp/telegram_mcp/tools/messages.py +2041 -0
  566. package/vendor/telegram-mcp/telegram_mcp/tools/profile.py +449 -0
  567. package/vendor/telegram-mcp/uv.lock +1693 -0
  568. package/dist/standalone/.next/server/chunks/628.js +0 -2
  569. package/dist/standalone/.next/server/chunks/747.js +0 -4
  570. package/dist/standalone/.next/server/chunks/813.js +0 -1
  571. package/dist/standalone/.next/server/chunks/918.js +0 -1
  572. package/dist/standalone/.next/server/chunks/998.js +0 -1
  573. package/dist/standalone/.next/static/U4SZ1qekrUMw43qsp4kED/_buildManifest.js +0 -1
  574. package/dist/standalone/.next/static/chunks/4bd1b696-215e5051988c3dde.js +0 -1
  575. package/dist/standalone/.next/static/chunks/647-0b14204033b8658c.js +0 -1
  576. package/dist/standalone/.next/static/chunks/app/_global-error/page-d0de276a8c0b264e.js +0 -1
  577. package/dist/standalone/.next/static/chunks/app/_not-found/page-811f7dc4ec7ef451.js +0 -1
  578. package/dist/standalone/.next/static/chunks/app/api/access/route-d0de276a8c0b264e.js +0 -1
  579. package/dist/standalone/.next/static/chunks/app/api/answer/route-d0de276a8c0b264e.js +0 -1
  580. package/dist/standalone/.next/static/chunks/app/api/files/route-d0de276a8c0b264e.js +0 -1
  581. package/dist/standalone/.next/static/chunks/app/api/flows/[id]/route-d0de276a8c0b264e.js +0 -1
  582. package/dist/standalone/.next/static/chunks/app/api/flows/route-d0de276a8c0b264e.js +0 -1
  583. package/dist/standalone/.next/static/chunks/app/api/image/route-d0de276a8c0b264e.js +0 -1
  584. package/dist/standalone/.next/static/chunks/app/api/inbox/route-d0de276a8c0b264e.js +0 -1
  585. package/dist/standalone/.next/static/chunks/app/api/limits/route-d0de276a8c0b264e.js +0 -1
  586. package/dist/standalone/.next/static/chunks/app/api/log/route-d0de276a8c0b264e.js +0 -1
  587. package/dist/standalone/.next/static/chunks/app/api/logs/route-d0de276a8c0b264e.js +0 -1
  588. package/dist/standalone/.next/static/chunks/app/api/logs/stream/route-d0de276a8c0b264e.js +0 -1
  589. package/dist/standalone/.next/static/chunks/app/api/proc/route-d0de276a8c0b264e.js +0 -1
  590. package/dist/standalone/.next/static/chunks/app/api/push/route-d0de276a8c0b264e.js +0 -1
  591. package/dist/standalone/.next/static/chunks/app/api/resources/route-d0de276a8c0b264e.js +0 -1
  592. package/dist/standalone/.next/static/chunks/app/api/session/route-d0de276a8c0b264e.js +0 -1
  593. package/dist/standalone/.next/static/chunks/app/api/spawn/route-d0de276a8c0b264e.js +0 -1
  594. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/assignment/route-d0de276a8c0b264e.js +0 -1
  595. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/route-d0de276a8c0b264e.js +0 -1
  596. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/send/route-d0de276a8c0b264e.js +0 -1
  597. package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/spawn/route-d0de276a8c0b264e.js +0 -1
  598. package/dist/standalone/.next/static/chunks/app/api/tasks/curator/route-d0de276a8c0b264e.js +0 -1
  599. package/dist/standalone/.next/static/chunks/app/api/tasks/route-d0de276a8c0b264e.js +0 -1
  600. package/dist/standalone/.next/static/chunks/app/api/timeline/route-d0de276a8c0b264e.js +0 -1
  601. package/dist/standalone/.next/static/chunks/app/api/tmux/route-d0de276a8c0b264e.js +0 -1
  602. package/dist/standalone/.next/static/chunks/app/api/tmux/targets/route-d0de276a8c0b264e.js +0 -1
  603. package/dist/standalone/.next/static/chunks/app/api/transcribe/backend/route-d0de276a8c0b264e.js +0 -1
  604. package/dist/standalone/.next/static/chunks/app/api/transcribe/route-d0de276a8c0b264e.js +0 -1
  605. package/dist/standalone/.next/static/chunks/app/api/transcribe/token/route-d0de276a8c0b264e.js +0 -1
  606. package/dist/standalone/.next/static/chunks/app/api/workflows/[id]/route-d0de276a8c0b264e.js +0 -1
  607. package/dist/standalone/.next/static/chunks/app/api/workflows/route-d0de276a8c0b264e.js +0 -1
  608. package/dist/standalone/.next/static/chunks/app/layout-22e93960d4e3259a.js +0 -1
  609. package/dist/standalone/.next/static/chunks/app/page-6c0325e2d49a521e.js +0 -2
  610. package/dist/standalone/.next/static/chunks/framework-93cda6578f6c76ec.js +0 -1
  611. package/dist/standalone/.next/static/chunks/main-app-e6ff5fbff7d5b38f.js +0 -1
  612. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d0de276a8c0b264e.js +0 -1
  613. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d0de276a8c0b264e.js +0 -1
  614. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-2b3b5eea82b805ca.js +0 -1
  615. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d0de276a8c0b264e.js +0 -1
  616. package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d0de276a8c0b264e.js +0 -1
  617. package/dist/standalone/.next/static/chunks/webpack-7dc14fd5ff1227ce.js +0 -1
  618. package/dist/standalone/.next/static/css/b9bc533a63013ced.css +0 -1
  619. /package/dist/standalone/.next/static/{U4SZ1qekrUMw43qsp4kED → kt9OPe8iwfpNcdOX9ygvb}/_ssgManifest.js +0 -0
@@ -0,0 +1,209 @@
1
+ """Installation provenance checks for the Telegram MCP server.
2
+
3
+ The PyPI distribution name ``telegram-mcp`` is currently occupied by an
4
+ unrelated project. This guard can only protect executions that reach this
5
+ repository's code; it cannot run when a user launches the third-party package.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ from dataclasses import dataclass
12
+ from importlib import metadata
13
+ from pathlib import Path
14
+ from urllib.parse import unquote, urlparse
15
+
16
+ DISTRIBUTION_NAME = "telegram-mcp"
17
+
18
+
19
+ class UnsafeInstallationError(RuntimeError):
20
+ """Raised when installed package metadata points at the wrong project."""
21
+
22
+
23
+ @dataclass(frozen=True)
24
+ class DistributionIdentity:
25
+ """Small, testable view of Python package metadata."""
26
+
27
+ name: str
28
+ version: str
29
+ authors: tuple[str, ...] = ()
30
+ maintainers: tuple[str, ...] = ()
31
+ urls: tuple[str, ...] = ()
32
+ summary: str = ""
33
+ direct_url: str = ""
34
+ source_root: Path | None = None
35
+
36
+ @classmethod
37
+ def from_distribution(cls, dist: metadata.Distribution) -> "DistributionIdentity":
38
+ package_metadata = dist.metadata
39
+ urls = tuple(package_metadata.get_all("Project-URL") or ())
40
+ homepage = package_metadata.get("Home-page")
41
+ if homepage:
42
+ urls += (homepage,)
43
+
44
+ authors = tuple(
45
+ value
46
+ for value in (
47
+ package_metadata.get("Author"),
48
+ package_metadata.get("Author-email"),
49
+ )
50
+ if value
51
+ )
52
+ maintainers = tuple(
53
+ value
54
+ for value in (
55
+ package_metadata.get("Maintainer"),
56
+ package_metadata.get("Maintainer-email"),
57
+ )
58
+ if value
59
+ )
60
+
61
+ read_text = getattr(dist, "read_text", None)
62
+ direct_url = read_text("direct_url.json") if callable(read_text) else ""
63
+
64
+ return cls(
65
+ name=package_metadata.get("Name") or getattr(dist, "name", DISTRIBUTION_NAME),
66
+ version=package_metadata.get("Version") or dist.version,
67
+ authors=authors,
68
+ maintainers=maintainers,
69
+ urls=urls,
70
+ summary=package_metadata.get("Summary", ""),
71
+ direct_url=direct_url or "",
72
+ source_root=_distribution_source_root(dist),
73
+ )
74
+
75
+
76
+ def _project_root_declares_distribution_name(path: Path) -> bool:
77
+ pyproject_path = path / "pyproject.toml"
78
+ if not pyproject_path.is_file():
79
+ return False
80
+
81
+ try:
82
+ pyproject_text = pyproject_path.read_text(encoding="utf-8")
83
+ except OSError:
84
+ return False
85
+
86
+ return f'name = "{DISTRIBUTION_NAME}"' in pyproject_text
87
+
88
+
89
+ def _resolve_path(path: Path) -> Path:
90
+ try:
91
+ return path.resolve()
92
+ except OSError:
93
+ return path
94
+
95
+
96
+ def _candidate_is_project_root(path: Path) -> bool:
97
+ return _project_root_declares_distribution_name(_resolve_path(path))
98
+
99
+
100
+ def _distribution_source_root(dist: metadata.Distribution) -> Path | None:
101
+ """Return an editable/source-checkout root for installer metadata.
102
+
103
+ ``uv sync`` installs the project editably. In that mode ``importlib.metadata``
104
+ can resolve the active distribution to ``telegram_mcp.egg-info`` in the
105
+ checkout, while the PEP 610 ``direct_url.json`` file lives in the
106
+ environment's ``.dist-info`` directory. Treating the adjacent project root as
107
+ source provenance keeps the PyPI-collision guard strict for normal installs
108
+ without blocking cloned checkouts.
109
+ """
110
+
111
+ dist_path = getattr(dist, "_path", None)
112
+ if dist_path is not None:
113
+ metadata_path = Path(dist_path)
114
+ if metadata_path.name.endswith(".egg-info"):
115
+ candidate = metadata_path.parent
116
+ if _candidate_is_project_root(candidate):
117
+ return _resolve_path(candidate)
118
+
119
+ files = getattr(dist, "files", None)
120
+ locate_file = getattr(dist, "locate_file", None)
121
+ if not files or not callable(locate_file):
122
+ return None
123
+
124
+ for package_file in files:
125
+ if Path(str(package_file)) != Path("pyproject.toml"):
126
+ continue
127
+
128
+ candidate = Path(locate_file(package_file)).parent
129
+ if _candidate_is_project_root(candidate):
130
+ return _resolve_path(candidate)
131
+
132
+ return None
133
+
134
+
135
+ def _direct_url_json(direct_url: str) -> dict:
136
+ if not direct_url:
137
+ return {}
138
+
139
+ try:
140
+ direct_url_data = json.loads(direct_url)
141
+ except json.JSONDecodeError:
142
+ return {}
143
+
144
+ return direct_url_data if isinstance(direct_url_data, dict) else {}
145
+
146
+
147
+ def _direct_url_is_explicit_source_install(direct_url: str) -> bool:
148
+ direct_url_data = _direct_url_json(direct_url)
149
+ if not direct_url_data:
150
+ return False
151
+
152
+ raw_url = str(direct_url_data.get("url", "")).strip()
153
+ if not raw_url:
154
+ return False
155
+
156
+ parsed_url = urlparse(raw_url)
157
+
158
+ if parsed_url.scheme == "file":
159
+ source_path = Path(unquote(parsed_url.path)).resolve()
160
+ return _project_root_declares_distribution_name(source_path)
161
+
162
+ vcs_info = direct_url_data.get("vcs_info")
163
+ return isinstance(vcs_info, dict) and bool(vcs_info.get("vcs"))
164
+
165
+
166
+ def _looks_like_explicit_source_install(identity: DistributionIdentity) -> bool:
167
+ return (
168
+ _direct_url_is_explicit_source_install(identity.direct_url)
169
+ or identity.source_root is not None
170
+ )
171
+
172
+
173
+ def _format_unsafe_installation_message(identity: DistributionIdentity) -> str:
174
+ authors = ", ".join(identity.authors) or "unknown"
175
+ maintainers = ", ".join(identity.maintainers) or "unknown"
176
+ urls = "; ".join(identity.urls) or "unknown"
177
+
178
+ return (
179
+ "Refusing to start: the installed 'telegram-mcp' distribution was not "
180
+ "installed from an explicit source checkout.\n"
181
+ f"Detected distribution: name={identity.name!r}, version={identity.version!r}, "
182
+ f"authors={authors!r}, maintainers={maintainers!r}, urls={urls!r}.\n"
183
+ "The 'telegram-mcp' name on PyPI is currently owned by a different project. "
184
+ "This guard requires a source checkout or installer-recorded direct "
185
+ "git/file URL. Run this server from a cloned checkout or install a "
186
+ "trusted repository explicitly with: "
187
+ 'pip install "git+https://github.com/chigwell/telegram-mcp.git"'
188
+ )
189
+
190
+
191
+ def assert_safe_distribution(distribution_name: str = DISTRIBUTION_NAME) -> None:
192
+ """Abort when the installed distribution metadata is not this project.
193
+
194
+ Source checkouts that have not been installed as a distribution are allowed:
195
+ ``uv --directory /path/to/telegram-mcp run main.py`` can run from source
196
+ without package metadata. If metadata for ``telegram-mcp`` is present, it
197
+ must come from an explicit git or file install recorded by the installer.
198
+ """
199
+
200
+ try:
201
+ dist = metadata.distribution(distribution_name)
202
+ except metadata.PackageNotFoundError:
203
+ return
204
+
205
+ identity = DistributionIdentity.from_distribution(dist)
206
+ if _looks_like_explicit_source_install(identity):
207
+ return
208
+
209
+ raise UnsafeInstallationError(_format_unsafe_installation_message(identity))
@@ -0,0 +1,198 @@
1
+ """Application entrypoints for the Telegram MCP server."""
2
+
3
+ from telegram_mcp.install_guard import UnsafeInstallationError, assert_safe_distribution
4
+
5
+ try:
6
+ assert_safe_distribution()
7
+ except UnsafeInstallationError as exc:
8
+ raise SystemExit(str(exc)) from None
9
+
10
+ from telethon.errors import AuthKeyDuplicatedError
11
+
12
+ from telegram_mcp import runtime as _runtime
13
+ from telegram_mcp.runtime import *
14
+ from telegram_mcp.singleton import (
15
+ DEFAULT_GRACE_SECONDS,
16
+ SessionLock,
17
+ SessionLockError,
18
+ session_identity,
19
+ )
20
+ import telegram_mcp.tools # noqa: F401 - registers MCP tools via decorators
21
+
22
+ # Populated as each account's session lock is acquired; released in _main's
23
+ # finally block so a lock is never held past this process's lifetime.
24
+ _session_locks: dict[str, SessionLock] = {}
25
+
26
+
27
+ def _lock_grace_seconds() -> float:
28
+ raw = os.getenv("TELEGRAM_LOCK_GRACE_SECONDS")
29
+ if not raw:
30
+ return DEFAULT_GRACE_SECONDS
31
+ try:
32
+ return float(raw)
33
+ except ValueError:
34
+ return DEFAULT_GRACE_SECONDS
35
+
36
+
37
+ async def _connect_authorized_client(label, client) -> None:
38
+ # First, prevent our own duplicate-spawn case outright: an exclusive
39
+ # per-session lock means a second instance of this server never even
40
+ # attempts to connect while another instance already holds the same
41
+ # session (see telegram_mcp/singleton.py for why and how).
42
+ lock = SessionLock(label, session_identity(client))
43
+ await asyncio.to_thread(lock.acquire, grace_seconds=_lock_grace_seconds())
44
+ _session_locks[label] = lock
45
+
46
+ # Once we hold the lock, still tolerate a transient AuthKeyDuplicatedError
47
+ # from Telegram itself (e.g. the same session briefly seen from two IPs
48
+ # during a VPN reconnect) with a bounded retry, since that's not caused by
49
+ # a second instance of this server and a blip shouldn't take the server
50
+ # down. Give each concurrent client its own session (TELEGRAM_SESSION_STRINGS
51
+ # pool or TELEGRAM_SESSION_STRING_<LABEL>) to avoid the collision entirely.
52
+ max_attempts = 4
53
+ for attempt in range(1, max_attempts + 1):
54
+ try:
55
+ await client.connect()
56
+ break
57
+ except AuthKeyDuplicatedError:
58
+ if attempt >= max_attempts:
59
+ raise
60
+ delay = min(2**attempt, 15)
61
+ print(
62
+ f"AuthKeyDuplicatedError connecting '{label}' (attempt "
63
+ f"{attempt}/{max_attempts}): session in use from another IP. "
64
+ f"Retrying in {delay}s. If this persists, give each concurrent "
65
+ "client its own session via TELEGRAM_SESSION_STRINGS or "
66
+ "TELEGRAM_SESSION_STRING_<LABEL>.",
67
+ file=sys.stderr,
68
+ )
69
+ try:
70
+ await client.disconnect()
71
+ except Exception:
72
+ pass
73
+ await asyncio.sleep(delay)
74
+
75
+ if await client.is_user_authorized():
76
+ return
77
+
78
+ raise RuntimeError(
79
+ f"Telegram client '{label}' is not authorized. Interactive phone login "
80
+ "is disabled for the MCP server because it runs over stdio. Generate a "
81
+ "session string with `uv run session_string_generator.py`, then set "
82
+ "TELEGRAM_SESSION_STRING or TELEGRAM_SESSION_STRING_<LABEL> in .env. "
83
+ "For existing file sessions, run the login outside the MCP server first."
84
+ )
85
+
86
+
87
+ def _configure_transport_security() -> None:
88
+ """Wire MCP_ALLOWED_HOSTS/MCP_ALLOWED_ORIGINS into FastMCP's DNS-rebinding
89
+ protection, e.g. when the server sits behind a reverse proxy on a public
90
+ domain instead of only being reached via 127.0.0.1/localhost.
91
+ """
92
+ raw_hosts = os.getenv("MCP_ALLOWED_HOSTS", "")
93
+ allowed_hosts = [h.strip() for h in raw_hosts.split(",") if h.strip()]
94
+ if not allowed_hosts:
95
+ return
96
+
97
+ from mcp.server.transport_security import TransportSecuritySettings
98
+
99
+ raw_origins = os.getenv("MCP_ALLOWED_ORIGINS", "")
100
+ allowed_origins = [o.strip() for o in raw_origins.split(",") if o.strip()]
101
+
102
+ mcp.settings.transport_security = TransportSecuritySettings(
103
+ enable_dns_rebinding_protection=True,
104
+ allowed_hosts=allowed_hosts,
105
+ allowed_origins=allowed_origins,
106
+ )
107
+
108
+
109
+ async def _serve(transport: str) -> None:
110
+ """Run the MCP server on the selected transport.
111
+
112
+ HTTP transports let one long-lived process hold a single shared Telegram
113
+ connection while multiple local MCP clients connect over HTTP, instead of
114
+ each client spawning its own Telethon session (which Telegram
115
+ throttles/flags). "http" is streamable HTTP — the current MCP transport
116
+ that Claude Code (`--transport http`) and Codex (`--url`) speak natively;
117
+ "sse" is kept for clients that only support the legacy SSE transport.
118
+ """
119
+ if transport in ("http", "sse"):
120
+ mcp.settings.host = os.getenv("MCP_HOST", "127.0.0.1")
121
+ mcp.settings.port = int(os.getenv("MCP_PORT", "8765"))
122
+ _configure_transport_security()
123
+ if transport == "http":
124
+ await mcp.run_streamable_http_async()
125
+ else:
126
+ await mcp.run_sse_async()
127
+ else:
128
+ # Use the asynchronous entrypoint instead of mcp.run()
129
+ await mcp.run_stdio_async()
130
+
131
+
132
+ async def _main() -> None:
133
+ try:
134
+ labels = ", ".join(clients.keys())
135
+ print(f"Starting {len(clients)} Telegram client(s) ({labels})...", file=sys.stderr)
136
+ await asyncio.gather(
137
+ *(_connect_authorized_client(label, cl) for label, cl in clients.items())
138
+ )
139
+
140
+ # Warm entity caches — StringSession has no persistent cache,
141
+ # so fetch all dialogs once per client to populate them.
142
+ # Runs in background: blocking startup on this (e.g. under a
143
+ # GetDialogsRequest flood wait) makes MCP clients time out, and
144
+ # resolve_entity() re-warms the cache on miss anyway.
145
+ print("Warming entity caches (background)...", file=sys.stderr)
146
+
147
+ async def _warm_caches() -> None:
148
+ try:
149
+ await asyncio.gather(*(cl.get_dialogs() for cl in clients.values()))
150
+ print("Entity caches warmed.", file=sys.stderr)
151
+ except Exception as warm_exc:
152
+ print(f"Entity cache warm failed: {warm_exc}", file=sys.stderr)
153
+
154
+ warm_task = asyncio.create_task(_warm_caches())
155
+
156
+ transport = os.getenv("MCP_TRANSPORT", "stdio").lower()
157
+ print(
158
+ f"Telegram client(s) started ({labels}). Running MCP server ({transport})...",
159
+ file=sys.stderr,
160
+ )
161
+ await _serve(transport)
162
+ except Exception as e:
163
+ print(f"Error starting client: {e}", file=sys.stderr)
164
+ if isinstance(e, sqlite3.OperationalError) and "database is locked" in str(e):
165
+ print(
166
+ "Database lock detected. Please ensure no other instances are running.",
167
+ file=sys.stderr,
168
+ )
169
+ elif isinstance(e, SessionLockError):
170
+ print(
171
+ "Another instance of this MCP server already holds this Telegram "
172
+ "session (e.g. the client restarted the connector without the old "
173
+ "process exiting yet). This instance is exiting instead of "
174
+ "connecting a second time, which would risk Telegram invalidating "
175
+ "the session for both. Retry once the other instance is gone.",
176
+ file=sys.stderr,
177
+ )
178
+ sys.exit(1)
179
+ finally:
180
+ try:
181
+ await asyncio.gather(
182
+ *(cl.disconnect() for cl in clients.values()), return_exceptions=True
183
+ )
184
+ except Exception:
185
+ pass
186
+ for lock in _session_locks.values():
187
+ lock.release()
188
+ _session_locks.clear()
189
+
190
+
191
+ def main() -> None:
192
+ _configure_allowed_roots_from_cli(sys.argv[1:])
193
+ _runtime._apply_exposed_tools_mode()
194
+ asyncio.run(_main())
195
+
196
+
197
+ if __name__ == "__main__":
198
+ main()