- [ ] از اسکریپت laxi هرچیزی که اضافه هست رو حذف کنیم. - [ ] برای لوگو یک لوگو از خودمون میذاریم. - [ ] مثلا لاگین یا اگر داده‌ای به جایی میفرسته نباید بفرسته اینا هم اضافی هستن - [ ] هدف نهایی: بتونیم با استفاده از این پلاگین کپشن رو بگیریم - [ ] راهکارها: - [ ] پلاگین خودش یک mcp سرویس بده روی یک پورت --- **درباره حذف کدهای laxis:** فایل‌هایی که احتمالاً باید بررسی بشن: `analytics.js`، `login.js`، `runtime.js` (در `google-meet-transcripts-extension/`) — اینا بیشترین احتمال ارتباط با سرور laxis رو دارن. `config/` هم ممکنه endpoint داشته باشه. پیشنهاد: اول یه `grep` روی همه فایل‌ها برای `laxis` و `api.` و `fetch(` بزن تا دقیق بفهمیم کجاها data میفرسته. **درباره MCP روی پورت:** این رویکرد خوبیه ولی یه محدودیت داره — Chrome extension نمیتونه مستقیم TCP server باز کنه. راه‌حل‌های ممکن: 1. **Native Messaging:** extension با یه اپ native (Python/Node) صحبت میکنه که اون اپ MCP server هست — پیچیده‌تر ولی استانداردتر 2. **WebSocket از extension:** extension یه WebSocket server روی `localhost` باز میکنه از طریق یه background service worker + `chrome.sockets` API — محدودیت‌های manifest v3 داره 3. **Polling روی clipboard یا فایل:** ساده‌ترین راه — extension هر X ثانیه caption رو در یه فایل یا clipboard میریزه، اپ دیگه‌ای میخونه کدوم راهکار رو در نظر داری؟ --- # پیاده‌سازی — معماری Bridge > راهکار انتخابی: **افزونه به‌عنوان WebSocket _client_** به یک سرور پایتونِ بیرون مرورگر وصل می‌شود. > (نه راهکار ۲ که افزونه خودش server باشد — در MV3 سرویس‌ورکر نمی‌تواند پورت TCP باز کند.) ## دیاگرام جریان داده ```mermaid flowchart TD A["Google Meet
caption روی صفحه"] -->|"DOM observer"| B["content script
captionProcessing.js"] B -->|"setSpeaker()"| C["storage.js
نقطه‌ی choke هر caption"] C -->|"chrome.runtime.sendMessage
{type: TRANSCRIPT_UPDATE}"| D["service worker
bridge.js"] D -->|"WebSocket
ws://127.0.0.1:8765"| E["سرور پایتون
bridge/server.py"] E -->|"ذخیره"| F["transcripts/<sessionId>.txt"] E -.->|"ACK / PONG"| D E ==>|"گام بعدی"| G["MCP Server"] G ==> H["Claude
transcript زنده را می‌خواند"] style E fill:#2F5496,color:#fff style G fill:#888,color:#fff,stroke-dasharray: 5 5 style H fill:#888,color:#fff,stroke-dasharray: 5 5 ``` ## چرا client و نه server؟ - **CSP گوگل میت:** اگر WebSocket را از content script باز کنیم، `connect-src` صفحه بلاکش می‌کند. سرویس‌ورکر تابع CSP صفحه نیست → اتصال از آن‌جا باز می‌شود. - **MV3 لایف‌سایکل:** سرویس‌ورکر بعد ~۳۰ ثانیه می‌خوابد. دو مکانیزم نگهش می‌دارد: (۱) هر پیام جدید از content script بیدارش می‌کند، (۲) heartbeat (PING) هر ۲۰ ثانیه (از Chrome 116+ پیام WebSocket زیر ۳۰ ثانیه ورکر را زنده نگه می‌دارد). ## وضعیت فعلی — ✅ گام ۱ انجام شد (MVP اتصال) | قطعه | فایل | کار | |------|------|-----| | سرور پایتون | `bridge/server.py` | WebSocket روی `127.0.0.1:8765`، ذخیره در `transcripts/` | | WS client | `google-meet-transcripts-extension/bridge.js` | اتصال + reconnect + heartbeat | | ایمپورت در ورکر | `login.js` | `importScripts("bridge.js")` | | نقطه‌ی hook | `storage.js` → `setSpeaker` | ارسال `TRANSCRIPT_UPDATE` | | دسترسی شبکه | `manifest.json` | `ws://127.0.0.1:8765/*` در host_permissions | تست end-to-end سمت پایتون با `_smoke_test.py` پاس شد (PONG + ACK + ذخیره‌ی فایل). ## مراحل بعدی - [ ] **پاک‌سازی کد laxis** (طبق بالای همین سند): حذف لاگین، analytics، و fetch به `domainUrl`. - [ ] **تست میدانی با Chrome واقعی:** سرور را بالا بیاور، افزونه را Reload کن، در یک Meet caption را روشن کن و خروجی را در ترمینال/فایل ببین. - [ ] **افزودن MCP server** روی همین `server.py` (مثلاً با `mcp` SDK پایتون) تا Claude بتواند transcript زنده را به‌عنوان resource/tool بخواند. - [ ] **لوگوی اختصاصی** جایگزین لوگوی laxis. ## محیط توسعه پایتون داخل **venv** اجرا می‌شود تا سیستم تمیز بماند (راهنما: `bridge/README.md`).