- Removed all cloud-related functionalities, including login prompts and token handling. - Disabled Laxis cloud features, ensuring no data is sent to external servers. - Updated manifest to reflect the new local-only functionality. - Added a new Python server to handle transcripts locally, including WebSocket support. - Implemented storage management for transcripts, including deduplication and file writing. - Created a smoke test for the WebSocket server to simulate transcript updates. - Updated README with setup instructions and usage details for the new local server.
5.2 KiB
- از اسکریپت 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 باز کنه. راهحلهای ممکن:
- Native Messaging: extension با یه اپ native (Python/Node) صحبت میکنه که اون اپ MCP server هست — پیچیدهتر ولی استانداردتر
- WebSocket از extension: extension یه WebSocket server روی
localhostباز میکنه از طریق یه background service worker +chrome.socketsAPI — محدودیتهای manifest v3 داره - Polling روی clipboard یا فایل: سادهترین راه — extension هر X ثانیه caption رو در یه فایل یا clipboard میریزه، اپ دیگهای میخونه
کدوم راهکار رو در نظر داری؟
پیادهسازی — معماری Bridge
راهکار انتخابی: افزونه بهعنوان WebSocket client به یک سرور پایتونِ بیرون مرورگر وصل میشود. (نه راهکار ۲ که افزونه خودش server باشد — در MV3 سرویسورکر نمیتواند پورت TCP باز کند.)
دیاگرام جریان داده
flowchart TD
A["Google Meet<br/>caption روی صفحه"] -->|"DOM observer"| B["content script<br/>captionProcessing.js"]
B -->|"setSpeaker()"| C["storage.js<br/>نقطهی choke هر caption"]
C -->|"chrome.runtime.sendMessage<br/>{type: TRANSCRIPT_UPDATE}"| D["service worker<br/>bridge.js"]
D -->|"WebSocket<br/>ws://127.0.0.1:8765"| E["سرور پایتون<br/>bridge/server.py"]
E -->|"ذخیره"| F["transcripts/<sessionId>.txt"]
E -.->|"ACK / PONG"| D
E ==>|"گام بعدی"| G["MCP Server"]
G ==> H["Claude<br/>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(مثلاً باmcpSDK پایتون) تا Claude بتواند transcript زنده را بهعنوان resource/tool بخواند. - لوگوی اختصاصی جایگزین لوگوی laxis.
محیط توسعه
پایتون داخل venv اجرا میشود تا سیستم تمیز بماند (راهنما: bridge/README.md).