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,253 @@
1
+ #!/usr/bin/env python3
2
+ """Viewer-owned Telegram enrollment bridge (issue #1059).
3
+
4
+ Runs from the same Telethon environment as the vendored connector
5
+ (vendor/telegram-mcp) and speaks a small sanitized NDJSON protocol:
6
+
7
+ stdout events (one JSON object per line, nothing else ever printed here):
8
+ {"event": "qr", "url": "tg://login?token=...", "expiresAt": iso}
9
+ {"event": "password_required"}
10
+ {"event": "password_invalid"}
11
+ {"event": "verifying"}
12
+ {"event": "authorized", "session": "<string session>", "identity": {...}}
13
+ {"event": "health", "status": "connected"|"expired"|"error", ...}
14
+ {"event": "logout", "ok": bool, "code": str|None}
15
+ {"event": "failed", "code": "<sanitized code>"}
16
+
17
+ stdin control lines:
18
+ enroll: {"password": "..."} (only after password_required)
19
+ health: {"session": "..."} (first line)
20
+ logout: {"session": "..."} (first line)
21
+
22
+ The session string crosses ONLY these pipes: it is never an argument, never an
23
+ environment variable of this process, and never part of an error event. Every
24
+ failure is reduced to a sanitized code — raw exception text stays off stdout.
25
+ Telegram API credentials arrive as TELEGRAM_API_ID / TELEGRAM_API_HASH in the
26
+ environment, exactly as the vendored connector expects.
27
+ """
28
+
29
+ from __future__ import annotations
30
+
31
+ import asyncio
32
+ import datetime
33
+ import json
34
+ import os
35
+ import sys
36
+
37
+ from telethon import TelegramClient
38
+ from telethon.errors import (
39
+ AuthKeyDuplicatedError,
40
+ AuthKeyUnregisteredError,
41
+ PasswordHashInvalidError,
42
+ SessionPasswordNeededError,
43
+ SessionRevokedError,
44
+ )
45
+ from telethon.sessions import StringSession
46
+ from telegram_mcp.singleton import SessionLock, session_identity
47
+
48
+ # The whole enrollment self-terminates even if the supervisor dies: an orphaned
49
+ # bridge holding a half-done QR login must not linger with a live connection.
50
+ ENROLL_DEADLINE_S = 15 * 60
51
+ CONNECT_TIMEOUT_S = 30
52
+
53
+ DEVICE_MODEL = "Agent Log Viewer"
54
+ SESSION_LOCK_GRACE_S = 20.0
55
+
56
+
57
+ def emit(payload: dict) -> None:
58
+ print(json.dumps(payload, separators=(",", ":")), flush=True)
59
+
60
+
61
+ def fail(code: str) -> None:
62
+ emit({"event": "failed", "code": code})
63
+
64
+
65
+ def api_credentials() -> tuple[int, str]:
66
+ return int(os.environ["TELEGRAM_API_ID"]), os.environ["TELEGRAM_API_HASH"]
67
+
68
+
69
+ def make_client(session: str | None) -> TelegramClient:
70
+ api_id, api_hash = api_credentials()
71
+ return TelegramClient(
72
+ StringSession(session),
73
+ api_id,
74
+ api_hash,
75
+ device_model=DEVICE_MODEL,
76
+ app_version="1.0",
77
+ )
78
+
79
+
80
+ async def acquire_session_lock(client: TelegramClient) -> SessionLock:
81
+ """Share the connector's exact per-session exclusion boundary."""
82
+ lock = SessionLock("default", session_identity(client))
83
+ await asyncio.to_thread(lock.acquire, grace_seconds=SESSION_LOCK_GRACE_S)
84
+ return lock
85
+
86
+
87
+ def identity_of(user) -> dict:
88
+ name = " ".join(part for part in [user.first_name, user.last_name] if part) or "Telegram account"
89
+ # The numeric account id (issue #1091): names and handles are the operator's
90
+ # to change at any moment, so the id is what "the same account" means to the
91
+ # report-run verifier. A string, because a Telegram id is a 64-bit integer.
92
+ # Read defensively: an authorization that produced an entity without an id
93
+ # is still an authorization, and losing the login over a grouping field
94
+ # would be a far worse failure than reporting no id.
95
+ account_id = getattr(user, "id", None)
96
+ return {
97
+ "name": name,
98
+ "username": user.username or None,
99
+ "id": str(account_id) if isinstance(account_id, int) else None,
100
+ }
101
+
102
+
103
+ async def read_stdin_line() -> dict | None:
104
+ loop = asyncio.get_running_loop()
105
+ line = await loop.run_in_executor(None, sys.stdin.readline)
106
+ if not line:
107
+ return None
108
+ try:
109
+ parsed = json.loads(line)
110
+ except json.JSONDecodeError:
111
+ return None
112
+ return parsed if isinstance(parsed, dict) else None
113
+
114
+
115
+ async def sign_in_with_password(client: TelegramClient) -> object | None:
116
+ """2FA loop: each invalid password is reported and another one awaited."""
117
+ emit({"event": "password_required"})
118
+ while True:
119
+ control = await read_stdin_line()
120
+ if control is None:
121
+ return None
122
+ entered = control.get("password")
123
+ if not isinstance(entered, str) or not entered:
124
+ continue
125
+ try:
126
+ return await client.sign_in(password=entered)
127
+ except PasswordHashInvalidError:
128
+ emit({"event": "password_invalid"})
129
+
130
+
131
+ async def enroll() -> None:
132
+ client = make_client(None)
133
+ lock = None
134
+ await client.connect()
135
+ try:
136
+ qr = await client.qr_login()
137
+ user = None
138
+ while user is None:
139
+ expires_in = max(5.0, (qr.expires - datetime.datetime.now(datetime.timezone.utc)).total_seconds())
140
+ emit({"event": "qr", "url": qr.url, "expiresAt": qr.expires.isoformat()})
141
+ try:
142
+ user = await qr.wait(timeout=expires_in)
143
+ except asyncio.TimeoutError:
144
+ # Expired token: mint a fresh one and re-announce it.
145
+ await qr.recreate()
146
+ except SessionPasswordNeededError:
147
+ user = await sign_in_with_password(client)
148
+ if user is None:
149
+ fail("canceled")
150
+ return
151
+ emit({"event": "verifying"})
152
+ me = await client.get_me()
153
+ lock = await acquire_session_lock(client)
154
+ emit({
155
+ "event": "authorized",
156
+ "session": client.session.save(),
157
+ "identity": identity_of(me if me is not None else user),
158
+ })
159
+ finally:
160
+ await client.disconnect()
161
+ if lock is not None:
162
+ lock.release()
163
+
164
+
165
+ async def health() -> None:
166
+ control = await read_stdin_line()
167
+ session = control.get("session") if control else None
168
+ if not isinstance(session, str) or not session:
169
+ emit({"event": "health", "status": "error", "code": "bridge_failed"})
170
+ return
171
+ client = make_client(session)
172
+ lock = None
173
+ try:
174
+ lock = await acquire_session_lock(client)
175
+ await asyncio.wait_for(client.connect(), timeout=CONNECT_TIMEOUT_S)
176
+ try:
177
+ if not await client.is_user_authorized():
178
+ emit({"event": "health", "status": "expired"})
179
+ return
180
+ me = await client.get_me()
181
+ if me is None:
182
+ emit({"event": "health", "status": "expired"})
183
+ return
184
+ emit({"event": "health", "status": "connected", "identity": identity_of(me)})
185
+ finally:
186
+ await client.disconnect()
187
+ except (AuthKeyUnregisteredError, AuthKeyDuplicatedError, SessionRevokedError):
188
+ emit({"event": "health", "status": "expired"})
189
+ except (asyncio.TimeoutError, ConnectionError, OSError):
190
+ emit({"event": "health", "status": "error", "code": "network_failed"})
191
+ except Exception:
192
+ emit({"event": "health", "status": "error", "code": "bridge_failed"})
193
+ finally:
194
+ if lock is not None:
195
+ lock.release()
196
+
197
+
198
+ async def logout() -> None:
199
+ control = await read_stdin_line()
200
+ session = control.get("session") if control else None
201
+ if not isinstance(session, str) or not session:
202
+ emit({"event": "logout", "ok": False, "code": "bridge_failed"})
203
+ return
204
+ client = make_client(session)
205
+ lock = None
206
+ try:
207
+ lock = await acquire_session_lock(client)
208
+ await asyncio.wait_for(client.connect(), timeout=CONNECT_TIMEOUT_S)
209
+ ok = bool(await client.log_out())
210
+ emit({"event": "logout", "ok": ok, "code": None if ok else "logout_failed"})
211
+ except (AuthKeyUnregisteredError, AuthKeyDuplicatedError, SessionRevokedError):
212
+ # Telegram already considers the authorization gone: remote logout is done.
213
+ emit({"event": "logout", "ok": True, "code": None})
214
+ except (asyncio.TimeoutError, ConnectionError, OSError):
215
+ emit({"event": "logout", "ok": False, "code": "network_failed"})
216
+ except Exception:
217
+ emit({"event": "logout", "ok": False, "code": "bridge_failed"})
218
+ finally:
219
+ try:
220
+ await client.disconnect()
221
+ finally:
222
+ if lock is not None:
223
+ lock.release()
224
+
225
+
226
+ async def run(command: str) -> None:
227
+ if command == "enroll":
228
+ try:
229
+ await asyncio.wait_for(enroll(), timeout=ENROLL_DEADLINE_S)
230
+ except asyncio.TimeoutError:
231
+ fail("timed_out")
232
+ except (ConnectionError, OSError):
233
+ fail("network_failed")
234
+ except Exception:
235
+ fail("bridge_failed")
236
+ elif command == "health":
237
+ await health()
238
+ elif command == "logout":
239
+ await logout()
240
+ else:
241
+ fail("bridge_failed")
242
+
243
+
244
+ def main() -> None:
245
+ command = sys.argv[1] if len(sys.argv) > 1 else ""
246
+ if "TELEGRAM_API_ID" not in os.environ or "TELEGRAM_API_HASH" not in os.environ:
247
+ fail("credentials_missing")
248
+ sys.exit(1)
249
+ asyncio.run(run(command))
250
+
251
+
252
+ if __name__ == "__main__":
253
+ main()
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env python3
2
+ """Authenticated entrypoint for the packaged Telegram MCP connector."""
3
+
4
+ import hashlib
5
+ import hmac
6
+ import os
7
+ import re
8
+ import sys
9
+
10
+
11
+ TOKEN = os.environ.get("LLV_TELEGRAM_MCP_TOKEN", "")
12
+ VENDOR_DIR = os.environ.get("LLV_TELEGRAM_VENDOR_DIR", "")
13
+ EXCLUDED_TOOLS = [
14
+ name.strip()
15
+ for name in os.environ.get("LLV_TELEGRAM_EXCLUDED_TOOLS", "").split(",")
16
+ if name.strip()
17
+ ]
18
+ if len(TOKEN) < 32 or not VENDOR_DIR:
19
+ raise SystemExit("authenticated Telegram MCP configuration is missing")
20
+
21
+ sys.path.insert(0, VENDOR_DIR)
22
+
23
+ from mcp.server.fastmcp import FastMCP # noqa: E402
24
+
25
+
26
+ class BearerAuthMiddleware:
27
+ def __init__(self, app, token: str):
28
+ self.app = app
29
+ self.expected = f"Bearer {token}".encode("utf-8")
30
+
31
+ async def __call__(self, scope, receive, send):
32
+ if scope.get("type") == "http":
33
+ headers = {key.lower(): value for key, value in scope.get("headers", [])}
34
+ if scope.get("path") == "/llv-telegram-proof" and scope.get("method") == "GET":
35
+ nonce = headers.get(b"x-llv-telegram-nonce", b"")
36
+ if not re.fullmatch(rb"[A-Za-z0-9_-]{43}", nonce):
37
+ await send({"type": "http.response.start", "status": 400, "headers": []})
38
+ await send({"type": "http.response.body", "body": b"Invalid nonce"})
39
+ return
40
+ proof = hmac.new(TOKEN.encode("utf-8"), nonce, hashlib.sha256).hexdigest().encode("ascii")
41
+ await send({"type": "http.response.start", "status": 200, "headers": [(b"content-type", b"text/plain")]})
42
+ await send({"type": "http.response.body", "body": proof})
43
+ return
44
+ supplied = headers.get(b"authorization", b"")
45
+ if not hmac.compare_digest(supplied, self.expected):
46
+ await send({
47
+ "type": "http.response.start",
48
+ "status": 401,
49
+ "headers": [
50
+ (b"content-type", b"text/plain; charset=utf-8"),
51
+ (b"www-authenticate", b"Bearer"),
52
+ ],
53
+ })
54
+ await send({"type": "http.response.body", "body": b"Unauthorized"})
55
+ return
56
+ await self.app(scope, receive, send)
57
+
58
+
59
+ _original_streamable_http_app = FastMCP.streamable_http_app
60
+
61
+
62
+ def _authenticated_streamable_http_app(self):
63
+ return BearerAuthMiddleware(_original_streamable_http_app(self), TOKEN)
64
+
65
+
66
+ FastMCP.streamable_http_app = _authenticated_streamable_http_app
67
+
68
+ from telegram_mcp.runtime import mcp # noqa: E402
69
+
70
+ mcp._mcp_server.name = f"telegram-{hashlib.sha256(TOKEN.encode('utf-8')).hexdigest()}"
71
+
72
+ from telegram_mcp.runner import main # noqa: E402
73
+
74
+
75
+ def _withhold_excluded_tools():
76
+ """Remove the tools this connector must not expose (issue #1091).
77
+
78
+ The Viewer runs this connector with the incoming event feed on, and the
79
+ feed CONSUMES settled bursts. A blocking wait tool that consumes the same
80
+ bursts would race it — whichever scans first takes one — so the Viewer
81
+ names those tools in LLV_TELEGRAM_EXCLUDED_TOOLS and they are dropped here,
82
+ leaving the feed the only consumer.
83
+
84
+ This lives in the Viewer's own entrypoint because upstream's
85
+ TELEGRAM_EXPOSED_TOOLS can only WIDEN a read-only surface with named write
86
+ tools, never narrow it, and the vendored tree stays byte-identical to the
87
+ pinned release. Importing the runner above already registered every tool,
88
+ so the surface is complete by the time it is pruned. An unknown name fails
89
+ the launch: after a vendor bump that renamed a consumer, silently exposing
90
+ it would be exactly the race this prevents.
91
+ """
92
+ if not EXCLUDED_TOOLS:
93
+ return
94
+ registered = {tool.name for tool in mcp._tool_manager.list_tools()}
95
+ unknown = sorted(set(EXCLUDED_TOOLS) - registered)
96
+ if unknown:
97
+ raise SystemExit(
98
+ f"cannot withhold unknown Telegram tool(s): {', '.join(unknown)}"
99
+ )
100
+ for name in EXCLUDED_TOOLS:
101
+ mcp._tool_manager.remove_tool(name)
102
+
103
+
104
+ if __name__ == "__main__":
105
+ _withhold_excluded_tools()
106
+ main()
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import { readValidatedTelegramSessionFiles } from "./telegram-session-validator.mjs";
3
+
4
+ const result = readValidatedTelegramSessionFiles(process.argv[2] ?? "");
5
+ if (result.status === "valid") process.stdout.write(result.connectorToken);
6
+ else process.exitCode = 1;
@@ -0,0 +1,71 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+
5
+ /**
6
+ * Validates the complete owner-only Telegram session pair. This module is
7
+ * shared by the Viewer session store and the packaged tmux token reader so
8
+ * both paths enforce the same directory, file, schema, and digest fence.
9
+ *
10
+ * @param {string} directory
11
+ * @returns {
12
+ * | { status: "missing" }
13
+ * | { status: "unsafe"; detail: string }
14
+ * | { status: "valid"; sessionFile: { version: 1; credentialRef: string; sessionString: string; savedAt: string; connectorTokenSha256: string }; connectorToken: string }
15
+ * }
16
+ */
17
+ export function readValidatedTelegramSessionFiles(directory) {
18
+ const expectedUid = typeof process.getuid === "function" ? process.getuid() : null;
19
+ let directoryStat;
20
+ try { directoryStat = fs.lstatSync(directory); }
21
+ catch (error) {
22
+ if (error?.code === "ENOENT") return { status: "missing" };
23
+ return { status: "unsafe", detail: "cannot inspect telegram directory" };
24
+ }
25
+ if (directoryStat.isSymbolicLink() || !directoryStat.isDirectory()) {
26
+ return { status: "unsafe", detail: "telegram directory is unsafe" };
27
+ }
28
+ if ((directoryStat.mode & 0o077) !== 0 || (expectedUid !== null && directoryStat.uid !== expectedUid)) {
29
+ return { status: "unsafe", detail: "telegram directory ownership or permissions are unsafe" };
30
+ }
31
+
32
+ const sessionPath = path.join(directory, "session.json");
33
+ const tokenPath = path.join(directory, "connector-token");
34
+ let sessionStat;
35
+ try { sessionStat = fs.lstatSync(sessionPath); }
36
+ catch (error) {
37
+ if (error?.code === "ENOENT") return { status: "missing" };
38
+ return { status: "unsafe", detail: "cannot inspect session file" };
39
+ }
40
+ if (sessionStat.isSymbolicLink() || !sessionStat.isFile() || (sessionStat.mode & 0o077) !== 0
41
+ || (expectedUid !== null && sessionStat.uid !== expectedUid)) {
42
+ return { status: "unsafe", detail: "session file ownership or permissions are unsafe" };
43
+ }
44
+
45
+ let sessionFile;
46
+ try { sessionFile = JSON.parse(fs.readFileSync(sessionPath, "utf8")); }
47
+ catch { return { status: "unsafe", detail: "session data is unreadable" }; }
48
+ if (!sessionFile || typeof sessionFile !== "object" || sessionFile.version !== 1
49
+ || typeof sessionFile.credentialRef !== "string"
50
+ || typeof sessionFile.sessionString !== "string" || !sessionFile.sessionString
51
+ || typeof sessionFile.savedAt !== "string"
52
+ || typeof sessionFile.connectorTokenSha256 !== "string") {
53
+ return { status: "unsafe", detail: "session data is invalid" };
54
+ }
55
+
56
+ let tokenStat;
57
+ try { tokenStat = fs.lstatSync(tokenPath); }
58
+ catch { return { status: "unsafe", detail: "connector token is missing or unreadable" }; }
59
+ if (tokenStat.isSymbolicLink() || !tokenStat.isFile() || (tokenStat.mode & 0o077) !== 0
60
+ || (expectedUid !== null && tokenStat.uid !== expectedUid)) {
61
+ return { status: "unsafe", detail: "connector token ownership or permissions are unsafe" };
62
+ }
63
+ let connectorToken;
64
+ try { connectorToken = fs.readFileSync(tokenPath, "utf8").trim(); }
65
+ catch { return { status: "unsafe", detail: "connector token is unreadable" }; }
66
+ const tokenHash = crypto.createHash("sha256").update(connectorToken).digest("hex");
67
+ if (!/^[A-Za-z0-9_-]{43}$/.test(connectorToken) || tokenHash !== sessionFile.connectorTokenSha256) {
68
+ return { status: "unsafe", detail: "connector token is invalid" };
69
+ }
70
+ return { status: "valid", sessionFile, connectorToken };
71
+ }