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,600 @@
|
|
|
1
|
+
"""Folders MCP tools."""
|
|
2
|
+
|
|
3
|
+
from telegram_mcp.runtime import *
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@mcp.tool(annotations=ToolAnnotations(title="List Folders", openWorldHint=True, readOnlyHint=True))
|
|
7
|
+
@with_account(readonly=True)
|
|
8
|
+
async def list_folders(account: str = None) -> str:
|
|
9
|
+
"""
|
|
10
|
+
Get all dialog folders (filters) with their IDs, names, and emoji.
|
|
11
|
+
Returns a list of folders that can be used with other folder tools.
|
|
12
|
+
"""
|
|
13
|
+
try:
|
|
14
|
+
cl = get_client(account)
|
|
15
|
+
await ensure_connected(cl)
|
|
16
|
+
result = await cl(functions.messages.GetDialogFiltersRequest())
|
|
17
|
+
|
|
18
|
+
folders = []
|
|
19
|
+
for f in result.filters:
|
|
20
|
+
# Skip system default folder
|
|
21
|
+
if isinstance(f, DialogFilterDefault):
|
|
22
|
+
continue
|
|
23
|
+
|
|
24
|
+
if isinstance(f, DialogFilter):
|
|
25
|
+
# Handle title which can be str or TextWithEntities
|
|
26
|
+
title = f.title
|
|
27
|
+
if isinstance(title, TextWithEntities):
|
|
28
|
+
title = title.text
|
|
29
|
+
folder_data = {
|
|
30
|
+
"id": f.id,
|
|
31
|
+
"title": sanitize_name(title),
|
|
32
|
+
"emoticon": getattr(f, "emoticon", None),
|
|
33
|
+
"contacts": getattr(f, "contacts", False),
|
|
34
|
+
"non_contacts": getattr(f, "non_contacts", False),
|
|
35
|
+
"groups": getattr(f, "groups", False),
|
|
36
|
+
"broadcasts": getattr(f, "broadcasts", False),
|
|
37
|
+
"bots": getattr(f, "bots", False),
|
|
38
|
+
"exclude_muted": getattr(f, "exclude_muted", False),
|
|
39
|
+
"exclude_read": getattr(f, "exclude_read", False),
|
|
40
|
+
"exclude_archived": getattr(f, "exclude_archived", False),
|
|
41
|
+
"included_peers_count": len(getattr(f, "include_peers", [])),
|
|
42
|
+
"excluded_peers_count": len(getattr(f, "exclude_peers", [])),
|
|
43
|
+
"pinned_peers_count": len(getattr(f, "pinned_peers", [])),
|
|
44
|
+
}
|
|
45
|
+
folders.append(folder_data)
|
|
46
|
+
|
|
47
|
+
elif isinstance(f, DialogFilterChatlist):
|
|
48
|
+
# Shared folders use DialogFilterChatlist type
|
|
49
|
+
title = f.title
|
|
50
|
+
if isinstance(title, TextWithEntities):
|
|
51
|
+
title = title.text
|
|
52
|
+
folder_data = {
|
|
53
|
+
"id": f.id,
|
|
54
|
+
"title": sanitize_name(title),
|
|
55
|
+
"emoticon": getattr(f, "emoticon", None),
|
|
56
|
+
"type": "shared",
|
|
57
|
+
"included_peers_count": len(getattr(f, "include_peers", [])),
|
|
58
|
+
"pinned_peers_count": len(getattr(f, "pinned_peers", [])),
|
|
59
|
+
}
|
|
60
|
+
folders.append(folder_data)
|
|
61
|
+
|
|
62
|
+
if not folders:
|
|
63
|
+
return "No folders found. Create one with create_folder tool."
|
|
64
|
+
|
|
65
|
+
return json.dumps(
|
|
66
|
+
{"folders": folders, "count": len(folders)}, indent=2, default=json_serializer
|
|
67
|
+
)
|
|
68
|
+
except Exception as e:
|
|
69
|
+
logger.exception("list_folders failed")
|
|
70
|
+
return log_and_format_error("list_folders", e, ErrorCategory.FOLDER)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@mcp.tool(annotations=ToolAnnotations(title="Get Folder", openWorldHint=True, readOnlyHint=True))
|
|
74
|
+
@with_account(readonly=True)
|
|
75
|
+
async def get_folder(folder_id: int, account: str = None) -> str:
|
|
76
|
+
"""
|
|
77
|
+
Get detailed information about a specific folder including all included chats.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
folder_id: The folder ID (get from list_folders)
|
|
81
|
+
"""
|
|
82
|
+
try:
|
|
83
|
+
cl = get_client(account)
|
|
84
|
+
result = await cl(functions.messages.GetDialogFiltersRequest())
|
|
85
|
+
|
|
86
|
+
target_folder = None
|
|
87
|
+
for f in result.filters:
|
|
88
|
+
if isinstance(f, (DialogFilter, DialogFilterChatlist)) and f.id == folder_id:
|
|
89
|
+
target_folder = f
|
|
90
|
+
break
|
|
91
|
+
|
|
92
|
+
if not target_folder:
|
|
93
|
+
return (
|
|
94
|
+
f"Folder with ID {folder_id} not found. Use list_folders to see available folders."
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# Resolve included peers to readable names
|
|
98
|
+
included_chats = []
|
|
99
|
+
for peer in getattr(target_folder, "include_peers", []):
|
|
100
|
+
try:
|
|
101
|
+
entity = await resolve_entity(peer, cl)
|
|
102
|
+
chat_info = {
|
|
103
|
+
"id": get_marked_id(entity),
|
|
104
|
+
"name": sanitize_name(
|
|
105
|
+
getattr(entity, "title", None) or getattr(entity, "first_name", "Unknown")
|
|
106
|
+
),
|
|
107
|
+
"type": get_entity_type(entity),
|
|
108
|
+
}
|
|
109
|
+
if hasattr(entity, "username") and entity.username:
|
|
110
|
+
chat_info["username"] = entity.username
|
|
111
|
+
included_chats.append(chat_info)
|
|
112
|
+
except Exception:
|
|
113
|
+
included_chats.append({"id": str(peer), "name": "Unknown", "type": "Unknown"})
|
|
114
|
+
|
|
115
|
+
# Resolve excluded peers
|
|
116
|
+
excluded_chats = []
|
|
117
|
+
for peer in getattr(target_folder, "exclude_peers", []):
|
|
118
|
+
try:
|
|
119
|
+
entity = await resolve_entity(peer, cl)
|
|
120
|
+
chat_info = {
|
|
121
|
+
"id": get_marked_id(entity),
|
|
122
|
+
"name": sanitize_name(
|
|
123
|
+
getattr(entity, "title", None) or getattr(entity, "first_name", "Unknown")
|
|
124
|
+
),
|
|
125
|
+
"type": get_entity_type(entity),
|
|
126
|
+
}
|
|
127
|
+
excluded_chats.append(chat_info)
|
|
128
|
+
except Exception:
|
|
129
|
+
excluded_chats.append({"id": str(peer), "name": "Unknown", "type": "Unknown"})
|
|
130
|
+
|
|
131
|
+
# Resolve pinned peers
|
|
132
|
+
pinned_chats = []
|
|
133
|
+
for peer in getattr(target_folder, "pinned_peers", []):
|
|
134
|
+
try:
|
|
135
|
+
entity = await resolve_entity(peer, cl)
|
|
136
|
+
chat_info = {
|
|
137
|
+
"id": get_marked_id(entity),
|
|
138
|
+
"name": sanitize_name(
|
|
139
|
+
getattr(entity, "title", None) or getattr(entity, "first_name", "Unknown")
|
|
140
|
+
),
|
|
141
|
+
"type": get_entity_type(entity),
|
|
142
|
+
}
|
|
143
|
+
pinned_chats.append(chat_info)
|
|
144
|
+
except Exception:
|
|
145
|
+
pinned_chats.append({"id": str(peer), "name": "Unknown", "type": "Unknown"})
|
|
146
|
+
|
|
147
|
+
# Handle title which can be str or TextWithEntities
|
|
148
|
+
title = target_folder.title
|
|
149
|
+
if isinstance(title, TextWithEntities):
|
|
150
|
+
title = title.text
|
|
151
|
+
|
|
152
|
+
folder_data = {
|
|
153
|
+
"id": target_folder.id,
|
|
154
|
+
"title": sanitize_name(title),
|
|
155
|
+
"emoticon": getattr(target_folder, "emoticon", None),
|
|
156
|
+
"included_chats": included_chats,
|
|
157
|
+
"excluded_chats": excluded_chats,
|
|
158
|
+
"pinned_chats": pinned_chats,
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if isinstance(target_folder, DialogFilterChatlist):
|
|
162
|
+
folder_data["type"] = "shared"
|
|
163
|
+
else:
|
|
164
|
+
folder_data["filters"] = {
|
|
165
|
+
"contacts": getattr(target_folder, "contacts", False),
|
|
166
|
+
"non_contacts": getattr(target_folder, "non_contacts", False),
|
|
167
|
+
"groups": getattr(target_folder, "groups", False),
|
|
168
|
+
"broadcasts": getattr(target_folder, "broadcasts", False),
|
|
169
|
+
"bots": getattr(target_folder, "bots", False),
|
|
170
|
+
"exclude_muted": getattr(target_folder, "exclude_muted", False),
|
|
171
|
+
"exclude_read": getattr(target_folder, "exclude_read", False),
|
|
172
|
+
"exclude_archived": getattr(target_folder, "exclude_archived", False),
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return json.dumps(folder_data, indent=2, default=json_serializer)
|
|
176
|
+
except Exception as e:
|
|
177
|
+
logger.exception(f"get_folder failed (folder_id={folder_id})")
|
|
178
|
+
return log_and_format_error("get_folder", e, ErrorCategory.FOLDER, folder_id=folder_id)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@mcp.tool(
|
|
182
|
+
annotations=ToolAnnotations(
|
|
183
|
+
title="Create Folder", openWorldHint=True, destructiveHint=True, idempotentHint=False
|
|
184
|
+
)
|
|
185
|
+
)
|
|
186
|
+
@with_account(readonly=False)
|
|
187
|
+
async def create_folder(
|
|
188
|
+
title: str,
|
|
189
|
+
emoticon: Optional[str] = None,
|
|
190
|
+
chat_ids: Optional[List[Union[int, str]]] = None,
|
|
191
|
+
contacts: bool = False,
|
|
192
|
+
non_contacts: bool = False,
|
|
193
|
+
groups: bool = False,
|
|
194
|
+
broadcasts: bool = False,
|
|
195
|
+
bots: bool = False,
|
|
196
|
+
exclude_muted: bool = False,
|
|
197
|
+
exclude_read: bool = False,
|
|
198
|
+
exclude_archived: bool = True,
|
|
199
|
+
account: str = None,
|
|
200
|
+
) -> str:
|
|
201
|
+
"""
|
|
202
|
+
Create a new dialog folder.
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
title: Folder name (required)
|
|
206
|
+
emoticon: Folder emoji (optional, e.g., "📁", "🏠", "💼")
|
|
207
|
+
chat_ids: List of chat IDs or usernames to include (optional)
|
|
208
|
+
contacts: Include all contacts
|
|
209
|
+
non_contacts: Include all non-contacts
|
|
210
|
+
groups: Include all groups
|
|
211
|
+
broadcasts: Include all channels
|
|
212
|
+
bots: Include all bots
|
|
213
|
+
exclude_muted: Exclude muted chats
|
|
214
|
+
exclude_read: Exclude read chats
|
|
215
|
+
exclude_archived: Exclude archived chats (default True)
|
|
216
|
+
"""
|
|
217
|
+
try:
|
|
218
|
+
cl = get_client(account)
|
|
219
|
+
# Get existing folders to check count and find next ID
|
|
220
|
+
result = await cl(functions.messages.GetDialogFiltersRequest())
|
|
221
|
+
|
|
222
|
+
existing_ids = set()
|
|
223
|
+
folder_count = 0
|
|
224
|
+
for f in result.filters:
|
|
225
|
+
if isinstance(f, (DialogFilter, DialogFilterChatlist)):
|
|
226
|
+
existing_ids.add(f.id)
|
|
227
|
+
folder_count += 1
|
|
228
|
+
|
|
229
|
+
# Telegram limit: max 10 custom folders
|
|
230
|
+
if folder_count >= 10:
|
|
231
|
+
return "Cannot create folder: Telegram limit is 10 folders. Delete one first."
|
|
232
|
+
|
|
233
|
+
# Find next available ID (IDs 0 and 1 are reserved for system)
|
|
234
|
+
new_id = 2
|
|
235
|
+
while new_id in existing_ids:
|
|
236
|
+
new_id += 1
|
|
237
|
+
|
|
238
|
+
# Resolve chat_ids to input peers
|
|
239
|
+
include_peers = []
|
|
240
|
+
if chat_ids:
|
|
241
|
+
for chat_id in chat_ids:
|
|
242
|
+
try:
|
|
243
|
+
peer = await resolve_input_entity(chat_id, cl)
|
|
244
|
+
include_peers.append(peer)
|
|
245
|
+
except Exception as e:
|
|
246
|
+
return f"Failed to resolve chat '{chat_id}': {str(e)}"
|
|
247
|
+
|
|
248
|
+
# Create the folder (title must be TextWithEntities)
|
|
249
|
+
title_obj = TextWithEntities(text=title, entities=[])
|
|
250
|
+
new_filter = DialogFilter(
|
|
251
|
+
id=new_id,
|
|
252
|
+
title=title_obj,
|
|
253
|
+
emoticon=emoticon,
|
|
254
|
+
pinned_peers=[],
|
|
255
|
+
include_peers=include_peers,
|
|
256
|
+
exclude_peers=[],
|
|
257
|
+
contacts=contacts,
|
|
258
|
+
non_contacts=non_contacts,
|
|
259
|
+
groups=groups,
|
|
260
|
+
broadcasts=broadcasts,
|
|
261
|
+
bots=bots,
|
|
262
|
+
exclude_muted=exclude_muted,
|
|
263
|
+
exclude_read=exclude_read,
|
|
264
|
+
exclude_archived=exclude_archived,
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
await cl(functions.messages.UpdateDialogFilterRequest(id=new_id, filter=new_filter))
|
|
268
|
+
|
|
269
|
+
return json.dumps(
|
|
270
|
+
{
|
|
271
|
+
"success": True,
|
|
272
|
+
"folder_id": new_id,
|
|
273
|
+
"title": title,
|
|
274
|
+
"emoticon": emoticon,
|
|
275
|
+
"included_chats_count": len(include_peers),
|
|
276
|
+
},
|
|
277
|
+
indent=2,
|
|
278
|
+
)
|
|
279
|
+
except Exception as e:
|
|
280
|
+
logger.exception(f"create_folder failed (title={title})")
|
|
281
|
+
return log_and_format_error("create_folder", e, ErrorCategory.FOLDER, title=title)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
@mcp.tool(
|
|
285
|
+
annotations=ToolAnnotations(
|
|
286
|
+
title="Add Chat to Folder", openWorldHint=True, destructiveHint=True, idempotentHint=True
|
|
287
|
+
)
|
|
288
|
+
)
|
|
289
|
+
@with_account(readonly=False)
|
|
290
|
+
@validate_id("chat_id")
|
|
291
|
+
async def add_chat_to_folder(
|
|
292
|
+
folder_id: int,
|
|
293
|
+
chat_id: Union[int, str],
|
|
294
|
+
pinned: bool = False,
|
|
295
|
+
account: str = None,
|
|
296
|
+
) -> str:
|
|
297
|
+
"""
|
|
298
|
+
Add a chat to an existing folder.
|
|
299
|
+
|
|
300
|
+
Args:
|
|
301
|
+
folder_id: The folder ID (get from list_folders)
|
|
302
|
+
chat_id: Chat ID or username to add
|
|
303
|
+
pinned: Pin the chat in this folder (default False)
|
|
304
|
+
"""
|
|
305
|
+
try:
|
|
306
|
+
cl = get_client(account)
|
|
307
|
+
# Get the folder
|
|
308
|
+
result = await cl(functions.messages.GetDialogFiltersRequest())
|
|
309
|
+
|
|
310
|
+
target_folder = None
|
|
311
|
+
for f in result.filters:
|
|
312
|
+
if isinstance(f, (DialogFilter, DialogFilterChatlist)) and f.id == folder_id:
|
|
313
|
+
target_folder = f
|
|
314
|
+
break
|
|
315
|
+
|
|
316
|
+
if not target_folder:
|
|
317
|
+
return (
|
|
318
|
+
f"Folder with ID {folder_id} not found. Use list_folders to see available folders."
|
|
319
|
+
)
|
|
320
|
+
|
|
321
|
+
# Resolve chat to input peer
|
|
322
|
+
try:
|
|
323
|
+
peer = await resolve_input_entity(chat_id, cl)
|
|
324
|
+
except Exception as e:
|
|
325
|
+
return f"Failed to resolve chat '{chat_id}': {str(e)}"
|
|
326
|
+
|
|
327
|
+
# Check if already included (idempotent)
|
|
328
|
+
include_peers = list(getattr(target_folder, "include_peers", []))
|
|
329
|
+
pinned_peers = list(getattr(target_folder, "pinned_peers", []))
|
|
330
|
+
|
|
331
|
+
# Get peer ID for comparison
|
|
332
|
+
peer_id = utils.get_peer_id(peer)
|
|
333
|
+
already_included = any(utils.get_peer_id(p) == peer_id for p in include_peers)
|
|
334
|
+
already_pinned = any(utils.get_peer_id(p) == peer_id for p in pinned_peers)
|
|
335
|
+
|
|
336
|
+
if already_included and (not pinned or already_pinned):
|
|
337
|
+
return f"Chat {chat_id} is already in folder {folder_id}."
|
|
338
|
+
|
|
339
|
+
# Add to appropriate list
|
|
340
|
+
if not already_included:
|
|
341
|
+
include_peers.append(peer)
|
|
342
|
+
if pinned and not already_pinned:
|
|
343
|
+
pinned_peers.append(peer)
|
|
344
|
+
|
|
345
|
+
# Update the folder (keep all original attributes)
|
|
346
|
+
if isinstance(target_folder, DialogFilterChatlist):
|
|
347
|
+
updated_filter = DialogFilterChatlist(
|
|
348
|
+
id=target_folder.id,
|
|
349
|
+
title=target_folder.title,
|
|
350
|
+
emoticon=getattr(target_folder, "emoticon", None),
|
|
351
|
+
pinned_peers=pinned_peers,
|
|
352
|
+
include_peers=include_peers,
|
|
353
|
+
title_noanimate=getattr(target_folder, "title_noanimate", None),
|
|
354
|
+
color=getattr(target_folder, "color", None),
|
|
355
|
+
)
|
|
356
|
+
else:
|
|
357
|
+
updated_filter = DialogFilter(
|
|
358
|
+
id=target_folder.id,
|
|
359
|
+
title=target_folder.title,
|
|
360
|
+
emoticon=getattr(target_folder, "emoticon", None),
|
|
361
|
+
pinned_peers=pinned_peers,
|
|
362
|
+
include_peers=include_peers,
|
|
363
|
+
exclude_peers=list(getattr(target_folder, "exclude_peers", [])),
|
|
364
|
+
contacts=getattr(target_folder, "contacts", False),
|
|
365
|
+
non_contacts=getattr(target_folder, "non_contacts", False),
|
|
366
|
+
groups=getattr(target_folder, "groups", False),
|
|
367
|
+
broadcasts=getattr(target_folder, "broadcasts", False),
|
|
368
|
+
bots=getattr(target_folder, "bots", False),
|
|
369
|
+
exclude_muted=getattr(target_folder, "exclude_muted", False),
|
|
370
|
+
exclude_read=getattr(target_folder, "exclude_read", False),
|
|
371
|
+
exclude_archived=getattr(target_folder, "exclude_archived", False),
|
|
372
|
+
title_noanimate=getattr(target_folder, "title_noanimate", None),
|
|
373
|
+
color=getattr(target_folder, "color", None),
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
await cl(functions.messages.UpdateDialogFilterRequest(id=folder_id, filter=updated_filter))
|
|
377
|
+
|
|
378
|
+
return (
|
|
379
|
+
f"Chat {chat_id} added to folder {folder_id}" + (" (pinned)" if pinned else "") + "."
|
|
380
|
+
)
|
|
381
|
+
except Exception as e:
|
|
382
|
+
logger.exception(f"add_chat_to_folder failed (folder_id={folder_id}, chat_id={chat_id})")
|
|
383
|
+
return log_and_format_error(
|
|
384
|
+
"add_chat_to_folder", e, ErrorCategory.FOLDER, folder_id=folder_id, chat_id=chat_id
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
@mcp.tool(
|
|
389
|
+
annotations=ToolAnnotations(
|
|
390
|
+
title="Remove Chat from Folder",
|
|
391
|
+
openWorldHint=True,
|
|
392
|
+
destructiveHint=True,
|
|
393
|
+
idempotentHint=True,
|
|
394
|
+
)
|
|
395
|
+
)
|
|
396
|
+
@with_account(readonly=False)
|
|
397
|
+
@validate_id("chat_id")
|
|
398
|
+
async def remove_chat_from_folder(
|
|
399
|
+
folder_id: int, chat_id: Union[int, str], account: str = None
|
|
400
|
+
) -> str:
|
|
401
|
+
"""
|
|
402
|
+
Remove a chat from a folder.
|
|
403
|
+
|
|
404
|
+
Args:
|
|
405
|
+
folder_id: The folder ID (get from list_folders)
|
|
406
|
+
chat_id: Chat ID or username to remove
|
|
407
|
+
"""
|
|
408
|
+
try:
|
|
409
|
+
cl = get_client(account)
|
|
410
|
+
# Get the folder
|
|
411
|
+
result = await cl(functions.messages.GetDialogFiltersRequest())
|
|
412
|
+
|
|
413
|
+
target_folder = None
|
|
414
|
+
for f in result.filters:
|
|
415
|
+
if isinstance(f, (DialogFilter, DialogFilterChatlist)) and f.id == folder_id:
|
|
416
|
+
target_folder = f
|
|
417
|
+
break
|
|
418
|
+
|
|
419
|
+
if not target_folder:
|
|
420
|
+
return (
|
|
421
|
+
f"Folder with ID {folder_id} not found. Use list_folders to see available folders."
|
|
422
|
+
)
|
|
423
|
+
|
|
424
|
+
# Resolve chat to get peer ID
|
|
425
|
+
try:
|
|
426
|
+
peer = await resolve_input_entity(chat_id, cl)
|
|
427
|
+
peer_id = utils.get_peer_id(peer)
|
|
428
|
+
except Exception as e:
|
|
429
|
+
return f"Failed to resolve chat '{chat_id}': {str(e)}"
|
|
430
|
+
|
|
431
|
+
# Filter out the peer from both include and pinned lists
|
|
432
|
+
include_peers = [
|
|
433
|
+
p
|
|
434
|
+
for p in getattr(target_folder, "include_peers", [])
|
|
435
|
+
if utils.get_peer_id(p) != peer_id
|
|
436
|
+
]
|
|
437
|
+
pinned_peers = [
|
|
438
|
+
p
|
|
439
|
+
for p in getattr(target_folder, "pinned_peers", [])
|
|
440
|
+
if utils.get_peer_id(p) != peer_id
|
|
441
|
+
]
|
|
442
|
+
|
|
443
|
+
original_include_count = len(getattr(target_folder, "include_peers", []))
|
|
444
|
+
original_pinned_count = len(getattr(target_folder, "pinned_peers", []))
|
|
445
|
+
|
|
446
|
+
# Check if anything was removed (idempotent)
|
|
447
|
+
if (
|
|
448
|
+
len(include_peers) == original_include_count
|
|
449
|
+
and len(pinned_peers) == original_pinned_count
|
|
450
|
+
):
|
|
451
|
+
return f"Chat {chat_id} was not in folder {folder_id}."
|
|
452
|
+
|
|
453
|
+
# Update the folder (keep all original attributes)
|
|
454
|
+
if isinstance(target_folder, DialogFilterChatlist):
|
|
455
|
+
updated_filter = DialogFilterChatlist(
|
|
456
|
+
id=target_folder.id,
|
|
457
|
+
title=target_folder.title,
|
|
458
|
+
emoticon=getattr(target_folder, "emoticon", None),
|
|
459
|
+
pinned_peers=pinned_peers,
|
|
460
|
+
include_peers=include_peers,
|
|
461
|
+
title_noanimate=getattr(target_folder, "title_noanimate", None),
|
|
462
|
+
color=getattr(target_folder, "color", None),
|
|
463
|
+
)
|
|
464
|
+
else:
|
|
465
|
+
updated_filter = DialogFilter(
|
|
466
|
+
id=target_folder.id,
|
|
467
|
+
title=target_folder.title,
|
|
468
|
+
emoticon=getattr(target_folder, "emoticon", None),
|
|
469
|
+
pinned_peers=pinned_peers,
|
|
470
|
+
include_peers=include_peers,
|
|
471
|
+
exclude_peers=list(getattr(target_folder, "exclude_peers", [])),
|
|
472
|
+
contacts=getattr(target_folder, "contacts", False),
|
|
473
|
+
non_contacts=getattr(target_folder, "non_contacts", False),
|
|
474
|
+
groups=getattr(target_folder, "groups", False),
|
|
475
|
+
broadcasts=getattr(target_folder, "broadcasts", False),
|
|
476
|
+
bots=getattr(target_folder, "bots", False),
|
|
477
|
+
exclude_muted=getattr(target_folder, "exclude_muted", False),
|
|
478
|
+
exclude_read=getattr(target_folder, "exclude_read", False),
|
|
479
|
+
exclude_archived=getattr(target_folder, "exclude_archived", False),
|
|
480
|
+
title_noanimate=getattr(target_folder, "title_noanimate", None),
|
|
481
|
+
color=getattr(target_folder, "color", None),
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
await cl(functions.messages.UpdateDialogFilterRequest(id=folder_id, filter=updated_filter))
|
|
485
|
+
|
|
486
|
+
return f"Chat {chat_id} removed from folder {folder_id}."
|
|
487
|
+
except Exception as e:
|
|
488
|
+
logger.exception(
|
|
489
|
+
f"remove_chat_from_folder failed (folder_id={folder_id}, chat_id={chat_id})"
|
|
490
|
+
)
|
|
491
|
+
return log_and_format_error(
|
|
492
|
+
"remove_chat_from_folder",
|
|
493
|
+
e,
|
|
494
|
+
ErrorCategory.FOLDER,
|
|
495
|
+
folder_id=folder_id,
|
|
496
|
+
chat_id=chat_id,
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
@mcp.tool(
|
|
501
|
+
annotations=ToolAnnotations(
|
|
502
|
+
title="Delete Folder", openWorldHint=True, destructiveHint=True, idempotentHint=True
|
|
503
|
+
)
|
|
504
|
+
)
|
|
505
|
+
@with_account(readonly=False)
|
|
506
|
+
async def delete_folder(folder_id: int, account: str = None) -> str:
|
|
507
|
+
"""
|
|
508
|
+
Delete a folder. Chats in the folder are preserved, only the folder is removed.
|
|
509
|
+
|
|
510
|
+
Args:
|
|
511
|
+
folder_id: The folder ID to delete (get from list_folders)
|
|
512
|
+
"""
|
|
513
|
+
try:
|
|
514
|
+
cl = get_client(account)
|
|
515
|
+
await ensure_connected(cl)
|
|
516
|
+
# System folders (id < 2) cannot be deleted
|
|
517
|
+
if folder_id < 2:
|
|
518
|
+
return f"Cannot delete system folder (ID {folder_id}). Only custom folders can be deleted."
|
|
519
|
+
|
|
520
|
+
# Check if folder exists
|
|
521
|
+
result = await cl(functions.messages.GetDialogFiltersRequest())
|
|
522
|
+
|
|
523
|
+
folder_exists = False
|
|
524
|
+
folder_title = None
|
|
525
|
+
for f in result.filters:
|
|
526
|
+
if isinstance(f, (DialogFilter, DialogFilterChatlist)) and f.id == folder_id:
|
|
527
|
+
folder_exists = True
|
|
528
|
+
# Handle title which can be str or TextWithEntities
|
|
529
|
+
title = f.title
|
|
530
|
+
if isinstance(title, TextWithEntities):
|
|
531
|
+
title = title.text
|
|
532
|
+
folder_title = title
|
|
533
|
+
break
|
|
534
|
+
|
|
535
|
+
if not folder_exists:
|
|
536
|
+
return f"Folder with ID {folder_id} not found (may already be deleted)."
|
|
537
|
+
|
|
538
|
+
# Delete by passing None as filter
|
|
539
|
+
await cl(functions.messages.UpdateDialogFilterRequest(id=folder_id, filter=None))
|
|
540
|
+
|
|
541
|
+
return f"Folder '{sanitize_name(folder_title)}' (ID {folder_id}) deleted. Chats are preserved."
|
|
542
|
+
except Exception as e:
|
|
543
|
+
logger.exception(f"delete_folder failed (folder_id={folder_id})")
|
|
544
|
+
return log_and_format_error("delete_folder", e, ErrorCategory.FOLDER, folder_id=folder_id)
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
@mcp.tool(
|
|
548
|
+
annotations=ToolAnnotations(
|
|
549
|
+
title="Reorder Folders", openWorldHint=True, destructiveHint=True, idempotentHint=True
|
|
550
|
+
)
|
|
551
|
+
)
|
|
552
|
+
@with_account(readonly=False)
|
|
553
|
+
async def reorder_folders(folder_ids: List[int], account: str = None) -> str:
|
|
554
|
+
"""
|
|
555
|
+
Change the order of folders in the folder list.
|
|
556
|
+
|
|
557
|
+
Args:
|
|
558
|
+
folder_ids: List of folder IDs in the desired order
|
|
559
|
+
"""
|
|
560
|
+
try:
|
|
561
|
+
cl = get_client(account)
|
|
562
|
+
await ensure_connected(cl)
|
|
563
|
+
# Get existing folders to validate
|
|
564
|
+
result = await cl(functions.messages.GetDialogFiltersRequest())
|
|
565
|
+
|
|
566
|
+
existing_ids = set()
|
|
567
|
+
for f in result.filters:
|
|
568
|
+
if isinstance(f, (DialogFilter, DialogFilterChatlist)):
|
|
569
|
+
existing_ids.add(f.id)
|
|
570
|
+
|
|
571
|
+
# Validate all provided IDs exist
|
|
572
|
+
for fid in folder_ids:
|
|
573
|
+
if fid not in existing_ids:
|
|
574
|
+
return f"Folder ID {fid} not found. Use list_folders to see available folders."
|
|
575
|
+
|
|
576
|
+
# Validate all existing folders are included
|
|
577
|
+
if set(folder_ids) != existing_ids:
|
|
578
|
+
missing = existing_ids - set(folder_ids)
|
|
579
|
+
return f"All folder IDs must be included. Missing: {missing}"
|
|
580
|
+
|
|
581
|
+
# Reorder
|
|
582
|
+
await cl(functions.messages.UpdateDialogFiltersOrderRequest(order=folder_ids))
|
|
583
|
+
|
|
584
|
+
return f"Folders reordered: {folder_ids}"
|
|
585
|
+
except Exception as e:
|
|
586
|
+
logger.exception(f"reorder_folders failed (folder_ids={folder_ids})")
|
|
587
|
+
return log_and_format_error(
|
|
588
|
+
"reorder_folders", e, ErrorCategory.FOLDER, folder_ids=folder_ids
|
|
589
|
+
)
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
__all__ = [
|
|
593
|
+
"list_folders",
|
|
594
|
+
"get_folder",
|
|
595
|
+
"create_folder",
|
|
596
|
+
"add_chat_to_folder",
|
|
597
|
+
"remove_chat_from_folder",
|
|
598
|
+
"delete_folder",
|
|
599
|
+
"reorder_folders",
|
|
600
|
+
]
|