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.
- package/README.md +12 -21
- package/bin/cli.mjs +28 -4
- package/bin/mcp-server.mjs +7 -0
- package/bin/mcp-server.test.ts +2 -0
- package/bin/provision-telegram-connector.mjs +193 -0
- package/bin/server-runtime.mjs +4 -8
- package/bin/server-runtime.test.ts +46 -7
- package/bin/telegram-login-bridge.py +253 -0
- package/bin/telegram-mcp-server.py +106 -0
- package/bin/telegram-session-reader.mjs +6 -0
- package/bin/telegram-session-validator.mjs +71 -0
- package/dist/mcp-server.mjs +31771 -25627
- package/dist/standalone/.next/BUILD_ID +1 -1
- package/dist/standalone/.next/app-path-routes-manifest.json +22 -15
- package/dist/standalone/.next/build-manifest.json +3 -3
- package/dist/standalone/.next/prerender-manifest.json +3 -3
- package/dist/standalone/.next/react-loadable-manifest.json +19 -0
- package/dist/standalone/.next/required-server-files.json +4 -1
- package/dist/standalone/.next/routes-manifest.json +48 -6
- package/dist/standalone/.next/server/account-migration-controller-worker.js +1 -0
- package/dist/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/standalone/.next/server/app/_not-found.rsc +2 -2
- package/dist/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/dist/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/dist/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/standalone/.next/server/app/api/access/route.js +1 -1
- package/dist/standalone/.next/server/app/api/access/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/account-migrations/[intentId]/route.js +1 -1
- package/dist/standalone/.next/server/app/api/account-migrations/[intentId]/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/[id]/status/route.js +4 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/[id]/status/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/active/route.js +1 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/active/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/input/route.js +4 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/input/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/route.js +4 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/login/[operationId]/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/policy/route.js +1 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/policy/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/route.js +1 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/terminal/route.js +4 -1
- package/dist/standalone/.next/server/app/api/accounts/claude/terminal/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/accounts/codex/active/route.js +1 -1
- package/dist/standalone/.next/server/app/api/accounts/codex/active/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/accounts/codex/policy/route.js +1 -1
- package/dist/standalone/.next/server/app/api/accounts/codex/policy/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/accounts/codex/route.js +1 -1
- package/dist/standalone/.next/server/app/api/accounts/codex/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/accounts/codex/terminal/route.js +4 -1
- package/dist/standalone/.next/server/app/api/accounts/codex/terminal/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/accounts/route.js +1 -1
- package/dist/standalone/.next/server/app/api/accounts/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/agent/route.js +1 -1
- package/dist/standalone/.next/server/app/api/agent/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/agent/snapshot/route.js +1 -1
- package/dist/standalone/.next/server/app/api/agent/snapshot/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/answer/route.js +1 -1
- package/dist/standalone/.next/server/app/api/answer/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/artifact/route.js +1 -0
- package/dist/standalone/.next/server/app/api/{orchestrator → artifact}/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/artifact/route_client-reference-manifest.js +1 -0
- package/dist/standalone/.next/server/app/api/attach-command/route.js +1 -1
- package/dist/standalone/.next/server/app/api/attach-command/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/attention/[id]/route.js +1 -1
- package/dist/standalone/.next/server/app/api/attention/[id]/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/attention/route.js +1 -1
- package/dist/standalone/.next/server/app/api/attention/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/board/route.js +1 -1
- package/dist/standalone/.next/server/app/api/board/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/bridge/route.js +2 -2
- package/dist/standalone/.next/server/app/api/bridge/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/conversations/[conversationId]/migration/route.js +1 -1
- package/dist/standalone/.next/server/app/api/conversations/[conversationId]/migration/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/conversations/route.js +1 -1
- package/dist/standalone/.next/server/app/api/conversations/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/files/route.js +2 -2
- package/dist/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/flows/[id]/route.js +1 -1
- package/dist/standalone/.next/server/app/api/flows/[id]/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/flows/route.js +1 -1
- package/dist/standalone/.next/server/app/api/flows/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/image/route.js +1 -1
- package/dist/standalone/.next/server/app/api/image/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/inbox/route.js +2 -2
- package/dist/standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/lifecycle/reaper/route.js +1 -1
- package/dist/standalone/.next/server/app/api/lifecycle/reaper/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/limits/history/route.js +4 -1
- package/dist/standalone/.next/server/app/api/limits/history/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/limits/route.js +4 -1
- package/dist/standalone/.next/server/app/api/limits/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/log/preflight/route.js +1 -1
- package/dist/standalone/.next/server/app/api/log/preflight/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/log/project-delete/route.js +1 -1
- package/dist/standalone/.next/server/app/api/log/project-delete/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/log/provenance/route.js +1 -0
- package/dist/standalone/.next/server/app/api/log/provenance/route.js.nft.json +1 -0
- package/dist/standalone/.next/server/app/api/log/provenance/route_client-reference-manifest.js +1 -0
- package/dist/standalone/.next/server/app/api/log/route.js +1 -1
- package/dist/standalone/.next/server/app/api/log/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/logs/route.js +1 -1
- package/dist/standalone/.next/server/app/api/logs/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/logs/stream/route.js +2 -2
- package/dist/standalone/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/monitor/lock/route.js +2 -2
- package/dist/standalone/.next/server/app/api/monitor/lock/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/monitor/runs/route.js +1 -1
- package/dist/standalone/.next/server/app/api/monitor/runs/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/orchestrator/rotate/route.js +1 -1
- package/dist/standalone/.next/server/app/api/orchestrator/rotate/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/orchestrator/seat/route.js +1 -1
- package/dist/standalone/.next/server/app/api/orchestrator/seat/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/orchestrator/seat/status/route.js +3 -0
- package/dist/standalone/.next/server/app/api/orchestrator/seat/status/route.js.nft.json +1 -0
- package/dist/standalone/.next/server/app/api/orchestrator/seat/status/route_client-reference-manifest.js +1 -0
- package/dist/standalone/.next/server/app/api/pipelines/[id]/route.js +1 -1
- package/dist/standalone/.next/server/app/api/pipelines/[id]/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/pipelines/preflight/route.js +1 -1
- package/dist/standalone/.next/server/app/api/pipelines/preflight/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/pipelines/route.js +2 -2
- package/dist/standalone/.next/server/app/api/pipelines/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/pipelines/tick/route.js +2 -2
- package/dist/standalone/.next/server/app/api/pipelines/tick/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/proc/route.js +1 -1
- package/dist/standalone/.next/server/app/api/proc/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/projects/create/route.js +3 -0
- package/dist/standalone/.next/server/app/api/projects/create/route.js.nft.json +1 -0
- package/dist/standalone/.next/server/app/api/projects/create/route_client-reference-manifest.js +1 -0
- package/dist/standalone/.next/server/app/api/projects/crown/route.js +1 -0
- package/dist/standalone/.next/server/app/api/projects/crown/route.js.nft.json +1 -0
- package/dist/standalone/.next/server/app/api/projects/crown/route_client-reference-manifest.js +1 -0
- package/dist/standalone/.next/server/app/api/push/route.js +2 -2
- package/dist/standalone/.next/server/app/api/push/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/resources/route.js +1 -1
- package/dist/standalone/.next/server/app/api/resources/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/roles/route.js +2 -2
- package/dist/standalone/.next/server/app/api/roles/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/answer/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/answer/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/deployments/[deploymentId]/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/deployments/[deploymentId]/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/deployments/capabilities/v1/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/deployments/capabilities/v1/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/deployments/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/deployments/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/interrupt/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/interrupt/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/operations/[operationId]/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/operations/[operationId]/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/operations/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/operations/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/realtime/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/realtime/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/send/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/send/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/snapshot/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/snapshot/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/spawn/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/spawn/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/steer/route.js +1 -1
- package/dist/standalone/.next/server/app/api/runtime/steer/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/runtime/stream/route.js +2 -2
- package/dist/standalone/.next/server/app/api/runtime/stream/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/search/transcripts/route.js +2 -0
- package/dist/standalone/.next/server/app/api/search/transcripts/route.js.nft.json +1 -0
- package/dist/standalone/.next/server/app/api/search/transcripts/route_client-reference-manifest.js +1 -0
- package/dist/standalone/.next/server/app/api/session/route.js +1 -1
- package/dist/standalone/.next/server/app/api/session/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/session/supersedence/route.js +1 -1
- package/dist/standalone/.next/server/app/api/session/supersedence/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/session/title/route.js +1 -1
- package/dist/standalone/.next/server/app/api/session/title/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/spawn/policy/route.js +6 -3
- package/dist/standalone/.next/server/app/api/spawn/policy/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/spawn/route.js +2 -2
- package/dist/standalone/.next/server/app/api/spawn/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/staging/route.js +2 -2
- package/dist/standalone/.next/server/app/api/staging/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/task-attachments/route.js +2 -2
- package/dist/standalone/.next/server/app/api/task-attachments/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/tasks/[id]/assignment/route.js +1 -1
- package/dist/standalone/.next/server/app/api/tasks/[id]/assignment/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/tasks/[id]/route.js +1 -1
- package/dist/standalone/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/tasks/[id]/send/route.js +1 -1
- package/dist/standalone/.next/server/app/api/tasks/[id]/send/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/tasks/[id]/spawn/route.js +1 -1
- package/dist/standalone/.next/server/app/api/tasks/[id]/spawn/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/tasks/curator/route.js +1 -1
- package/dist/standalone/.next/server/app/api/tasks/curator/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/tasks/route.js +2 -2
- package/dist/standalone/.next/server/app/api/tasks/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/telegram/reports/route.js +1 -0
- package/dist/standalone/.next/server/app/api/telegram/reports/route.js.nft.json +1 -0
- package/dist/standalone/.next/server/app/api/telegram/reports/route_client-reference-manifest.js +1 -0
- package/dist/standalone/.next/server/app/api/telegram/route.js +1 -0
- package/dist/standalone/.next/server/app/api/telegram/route.js.nft.json +1 -0
- package/dist/standalone/.next/server/app/api/telegram/route_client-reference-manifest.js +1 -0
- package/dist/standalone/.next/server/app/api/timeline/route.js +1 -1
- package/dist/standalone/.next/server/app/api/timeline/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/tmux/route.js +1 -1
- package/dist/standalone/.next/server/app/api/tmux/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/tmux/targets/route.js +1 -1
- package/dist/standalone/.next/server/app/api/tmux/targets/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/transcribe/backend/route.js +2 -2
- package/dist/standalone/.next/server/app/api/transcribe/backend/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/transcribe/route.js +2 -2
- package/dist/standalone/.next/server/app/api/transcribe/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/transcribe/token/route.js +2 -2
- package/dist/standalone/.next/server/app/api/transcribe/token/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/tts/backend/route.js +1 -1
- package/dist/standalone/.next/server/app/api/tts/backend/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/tts/route.js +3 -3
- package/dist/standalone/.next/server/app/api/tts/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/view/presence/route.js +1 -2
- package/dist/standalone/.next/server/app/api/view/presence/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/workflows/[id]/route.js +1 -1
- package/dist/standalone/.next/server/app/api/workflows/[id]/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/api/workflows/route.js +1 -1
- package/dist/standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/favicon.ico/route.js +1 -1
- package/dist/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/index.html +1 -1
- package/dist/standalone/.next/server/app/index.rsc +3 -3
- package/dist/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/dist/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/dist/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/standalone/.next/server/app/page.js +41 -24
- package/dist/standalone/.next/server/app/page.js.nft.json +1 -1
- package/dist/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/standalone/.next/server/app-paths-manifest.json +22 -15
- package/dist/standalone/.next/server/chunks/156.js +2 -2
- package/dist/standalone/.next/server/chunks/1617.js +2 -0
- package/dist/standalone/.next/server/chunks/1858.js +91 -0
- package/dist/standalone/.next/server/chunks/1888.js +1 -0
- package/dist/standalone/.next/server/chunks/1920.js +1 -1
- package/dist/standalone/.next/server/chunks/2190.js +1 -1
- package/dist/standalone/.next/server/chunks/230.js +1 -0
- package/dist/standalone/.next/server/chunks/2318.js +2 -0
- package/dist/standalone/.next/server/chunks/2324.js +1 -0
- package/dist/standalone/.next/server/chunks/2338.js +9 -0
- package/dist/standalone/.next/server/chunks/2904.js +42 -0
- package/dist/standalone/.next/server/chunks/2923.js +1 -0
- package/dist/standalone/.next/server/chunks/2962.js +1 -0
- package/dist/standalone/.next/server/chunks/2977.js +1 -1
- package/dist/standalone/.next/server/chunks/306.js +3 -3
- package/dist/standalone/.next/server/chunks/3086.js +1 -0
- package/dist/standalone/.next/server/chunks/3139.js +10 -0
- package/dist/standalone/.next/server/chunks/3214.js +82 -0
- package/dist/standalone/.next/server/chunks/3336.js +1 -1
- package/dist/standalone/.next/server/chunks/3558.js +1 -1
- package/dist/standalone/.next/server/chunks/3587.js +1 -1
- package/dist/standalone/.next/server/chunks/3598.js +81 -0
- package/dist/standalone/.next/server/chunks/3740.js +126 -0
- package/dist/standalone/.next/server/chunks/3793.js +6 -0
- package/dist/standalone/.next/server/chunks/3916.js +1 -0
- package/dist/standalone/.next/server/chunks/3953.js +1 -0
- package/dist/standalone/.next/server/chunks/4012.js +2 -2
- package/dist/standalone/.next/server/chunks/4191.js +1 -1
- package/dist/standalone/.next/server/chunks/4260.js +2 -2
- package/dist/standalone/.next/server/chunks/4509.js +1 -1
- package/dist/standalone/.next/server/chunks/4968.js +1 -1
- package/dist/standalone/.next/server/chunks/4972.js +130 -2
- package/dist/standalone/.next/server/chunks/5689.js +11 -0
- package/dist/standalone/.next/server/chunks/6333.js +47 -0
- package/dist/standalone/.next/server/chunks/6796.js +1 -0
- package/dist/standalone/.next/server/chunks/6826.js +2 -2
- package/dist/standalone/.next/server/chunks/6850.js +1 -1
- package/dist/standalone/.next/server/chunks/6909.js +1 -0
- package/dist/standalone/.next/server/chunks/6977.js +1 -0
- package/dist/standalone/.next/server/chunks/7126.js +1 -0
- package/dist/standalone/.next/server/chunks/7159.js +1 -0
- package/dist/standalone/.next/server/chunks/7270.js +45 -0
- package/dist/standalone/.next/server/chunks/7295.js +10 -0
- package/dist/standalone/.next/server/chunks/7471.js +16 -14
- package/dist/standalone/.next/server/chunks/7563.js +1 -1
- package/dist/standalone/.next/server/chunks/7644.js +13 -0
- package/dist/standalone/.next/server/chunks/7722.js +1 -1
- package/dist/standalone/.next/server/chunks/7733.js +4 -0
- package/dist/standalone/.next/server/chunks/7868.js +1 -0
- package/dist/standalone/.next/server/chunks/8026.js +1 -0
- package/dist/standalone/.next/server/chunks/8176.js +1 -1
- package/dist/standalone/.next/server/chunks/8444.js +1 -1
- package/dist/standalone/.next/server/chunks/8465.js +2 -0
- package/dist/standalone/.next/server/chunks/849.js +6 -0
- package/dist/standalone/.next/server/chunks/8600.js +12 -0
- package/dist/standalone/.next/server/chunks/8617.js +2 -0
- package/dist/standalone/.next/server/chunks/8797.js +1 -1
- package/dist/standalone/.next/server/chunks/8817.js +5 -0
- package/dist/standalone/.next/server/chunks/8966.js +2 -2
- package/dist/standalone/.next/server/chunks/8996.js +1 -0
- package/dist/standalone/.next/server/chunks/9246.js +47 -0
- package/dist/standalone/.next/server/chunks/9364.js +310 -0
- package/dist/standalone/.next/server/chunks/9411.js +3 -3
- package/dist/standalone/.next/server/chunks/9434.js +13 -0
- package/dist/standalone/.next/server/chunks/9507.js +1 -0
- package/dist/standalone/.next/server/chunks/9676.js +62 -0
- package/dist/standalone/.next/server/chunks/9733.js +6 -3
- package/dist/standalone/.next/server/chunks/9901.js +62 -0
- package/dist/standalone/.next/server/chunks/9937.js +2 -0
- package/dist/standalone/.next/server/chunks/9940.js +128 -0
- package/dist/standalone/.next/server/chunks/static/media/pdf.worker.min.65fe1ff1.mjs +6 -0
- package/dist/standalone/.next/server/file-scanner-worker.js +2 -2
- package/dist/standalone/.next/server/files-response-worker.js +5 -5
- package/dist/standalone/.next/server/functions-config-manifest.json +8 -1
- package/dist/standalone/.next/server/instrumentation.js +1 -1
- package/dist/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/standalone/.next/server/pages/404.html +1 -1
- package/dist/standalone/.next/server/pages/500.html +1 -1
- package/dist/standalone/.next/server/resource-collector-worker.js +1 -1
- package/dist/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/standalone/.next/server/wakatime-sync-worker.js +2 -0
- package/dist/standalone/.next/server/webpack-runtime.js +1 -1
- package/dist/standalone/.next/static/chunks/2619.fd64e7a5bd9005d5.js +1 -0
- package/dist/standalone/.next/static/chunks/8293.5545fdbde0213c98.js +1 -0
- package/dist/standalone/.next/static/chunks/9178-e32f088e89b55503.js +1 -0
- package/dist/standalone/.next/static/chunks/9b0008ae.eb7a9c4c1c92a63b.js +45 -0
- package/dist/standalone/.next/static/chunks/app/_global-error/page-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/access/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/account-migrations/[intentId]/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/[id]/status/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/active/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/login/[operationId]/input/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/login/[operationId]/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/policy/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/terminal/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/accounts/codex/active/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/accounts/codex/policy/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/accounts/codex/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/accounts/codex/terminal/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/accounts/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/agent/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/agent/snapshot/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/answer/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/artifact/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/attach-command/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/attention/[id]/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/attention/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/board/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/bridge/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/conversations/[conversationId]/migration/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/conversations/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/files/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/flows/[id]/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/flows/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/image/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/inbox/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/lifecycle/reaper/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/limits/history/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/limits/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/log/preflight/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/log/project-delete/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/log/provenance/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/log/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/logs/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/logs/stream/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/monitor/lock/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/monitor/runs/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/orchestrator/rotate/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/orchestrator/seat/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/orchestrator/seat/status/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/pipelines/[id]/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/pipelines/preflight/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/pipelines/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/pipelines/tick/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/proc/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/projects/create/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/projects/crown/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/push/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/resources/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/roles/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/answer/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/[deploymentId]/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/capabilities/v1/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/interrupt/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/operations/[operationId]/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/operations/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/realtime/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/send/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/snapshot/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/spawn/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/steer/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/runtime/stream/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/search/transcripts/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/session/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/session/supersedence/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/session/title/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/spawn/policy/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/spawn/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/staging/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/task-attachments/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/assignment/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/send/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/spawn/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/tasks/curator/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/tasks/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/telegram/reports/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/telegram/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/timeline/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/tmux/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/tmux/targets/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/transcribe/backend/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/transcribe/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/transcribe/token/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/tts/backend/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/tts/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/view/presence/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/workflows/[id]/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/api/workflows/route-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/app/page-ac9463b910bf83fe.js +77 -0
- package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c132c5ba005ff29e.js +1 -0
- package/dist/standalone/.next/static/chunks/webpack-1637988d4c7cf23c.js +1 -0
- package/dist/standalone/.next/static/css/498f12ddef7ecb0e.css +1 -0
- package/dist/standalone/.next/static/kt9OPe8iwfpNcdOX9ygvb/_buildManifest.js +1 -0
- package/dist/standalone/.next/static/media/pdf.worker.min.e890bf87.mjs +6 -0
- package/dist/standalone/package.json +9 -5
- package/dist/standalone/server.bun.js +38 -0
- package/dist/standalone/server.js +18 -37
- package/package.json +9 -5
- package/vendor/telegram-mcp/.python-version +1 -0
- package/vendor/telegram-mcp/LICENSE +201 -0
- package/vendor/telegram-mcp/PROVENANCE.md +70 -0
- package/vendor/telegram-mcp/SHA256SUMS +24 -0
- package/vendor/telegram-mcp/main.py +67 -0
- package/vendor/telegram-mcp/pyproject.toml +100 -0
- package/vendor/telegram-mcp/requirements.txt +7 -0
- package/vendor/telegram-mcp/sanitize.py +143 -0
- package/vendor/telegram-mcp/session_string_generator.py +259 -0
- package/vendor/telegram-mcp/telegram_mcp/__init__.py +15 -0
- package/vendor/telegram-mcp/telegram_mcp/client_identity.py +31 -0
- package/vendor/telegram-mcp/telegram_mcp/install_guard.py +209 -0
- package/vendor/telegram-mcp/telegram_mcp/runner.py +198 -0
- package/vendor/telegram-mcp/telegram_mcp/runtime.py +1812 -0
- package/vendor/telegram-mcp/telegram_mcp/singleton.py +143 -0
- package/vendor/telegram-mcp/telegram_mcp/tools/__init__.py +13 -0
- package/vendor/telegram-mcp/telegram_mcp/tools/accounts.py +31 -0
- package/vendor/telegram-mcp/telegram_mcp/tools/chats.py +1163 -0
- package/vendor/telegram-mcp/telegram_mcp/tools/contacts.py +802 -0
- package/vendor/telegram-mcp/telegram_mcp/tools/events.py +485 -0
- package/vendor/telegram-mcp/telegram_mcp/tools/folders.py +600 -0
- package/vendor/telegram-mcp/telegram_mcp/tools/groups.py +1286 -0
- package/vendor/telegram-mcp/telegram_mcp/tools/media.py +470 -0
- package/vendor/telegram-mcp/telegram_mcp/tools/messages.py +2041 -0
- package/vendor/telegram-mcp/telegram_mcp/tools/profile.py +449 -0
- package/vendor/telegram-mcp/uv.lock +1693 -0
- package/dist/standalone/.next/server/app/api/orchestrator/route.js +0 -1
- package/dist/standalone/.next/server/app/api/orchestrator/route_client-reference-manifest.js +0 -1
- package/dist/standalone/.next/server/chunks/1699.js +0 -1
- package/dist/standalone/.next/server/chunks/2596.js +0 -1
- package/dist/standalone/.next/server/chunks/3886.js +0 -1
- package/dist/standalone/.next/server/chunks/4792.js +0 -101
- package/dist/standalone/.next/server/chunks/5622.js +0 -2
- package/dist/standalone/.next/server/chunks/616.js +0 -42
- package/dist/standalone/.next/server/chunks/620.js +0 -1
- package/dist/standalone/.next/server/chunks/6299.js +0 -4
- package/dist/standalone/.next/server/chunks/9598.js +0 -1
- package/dist/standalone/.next/server/chunks/9936.js +0 -6
- package/dist/standalone/.next/static/5aZdjqUDNxpxX8nVsuO2S/_buildManifest.js +0 -1
- package/dist/standalone/.next/static/chunks/9260-0e7e550c65609f11.js +0 -1
- package/dist/standalone/.next/static/chunks/app/_global-error/page-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/access/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/account-migrations/[intentId]/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/[id]/status/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/active/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/login/[operationId]/input/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/login/[operationId]/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/policy/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/accounts/claude/terminal/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/accounts/codex/active/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/accounts/codex/policy/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/accounts/codex/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/accounts/codex/terminal/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/accounts/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/agent/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/agent/snapshot/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/answer/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/attach-command/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/attention/[id]/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/attention/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/board/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/bridge/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/conversations/[conversationId]/migration/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/conversations/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/files/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/flows/[id]/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/flows/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/image/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/inbox/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/lifecycle/reaper/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/limits/history/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/limits/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/log/preflight/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/log/project-delete/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/log/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/logs/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/logs/stream/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/monitor/lock/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/monitor/runs/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/orchestrator/rotate/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/orchestrator/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/orchestrator/seat/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/pipelines/[id]/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/pipelines/preflight/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/pipelines/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/pipelines/tick/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/proc/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/push/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/resources/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/roles/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/answer/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/[deploymentId]/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/capabilities/v1/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/deployments/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/interrupt/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/operations/[operationId]/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/operations/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/realtime/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/send/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/snapshot/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/spawn/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/steer/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/runtime/stream/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/session/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/session/supersedence/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/session/title/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/spawn/policy/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/spawn/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/staging/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/task-attachments/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/assignment/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/send/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/tasks/[id]/spawn/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/tasks/curator/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/tasks/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/timeline/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/tmux/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/tmux/targets/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/transcribe/backend/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/transcribe/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/transcribe/token/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/tts/backend/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/tts/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/view/presence/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/workflows/[id]/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/api/workflows/route-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/app/page-45fd788b5dbb86eb.js +0 -57
- package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-483eb859fba02a43.js +0 -1
- package/dist/standalone/.next/static/chunks/webpack-46c1a0323c2ca312.js +0 -1
- package/dist/standalone/.next/static/css/b5b2fbc52caf460a.css +0 -1
- /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
|
+
}
|