کدنویسی با AI

AiraCode اکنون افزونهٔ کروم اختصاصی خودش را دارد: کنترل مرورگر واقعی تو از ترمینال

افزونهٔ کروم اختصاصی AiraCode با پل محلی native messaging: سیزده ابزار مرورگر، مجوز به تفکیک دامنه، خواندن console و شبکه، و رفع باگ در همان تبی که در آن لاگین هستی.

نوشتهٔ ۶ دقیقه مطالعه
تصویر مقالهٔ AiraCode اکنون افزونهٔ کروم اختصاصی خودش را دارد: کنترل مرورگر واقعی تو از ترمینال

بیشتر ایجنت‌های کدنویسی یک نقطهٔ کور مشترک دارند: مرورگر تو. مدل می‌تواند کد را بنویسد، تست را اجرا کند و لاگ سرور را بخواند، اما وقتی باگ فقط در مرورگرِ واردشدهٔ تو بازتولید می‌شود، حلقه می‌شکند. آن‌وقت باید نقش واسط دستی را بازی کنی: اسکرین‌شات بگیر، خطای console را کپی کن، آن را در ترمینال جای‌گذاری کن و دوباره امتحان کن.

AiraCode از این نسخه افزونهٔ کروم اختصاصی خودش را دارد و آن حلقه را می‌بندد. این مقاله توضیح می‌دهد دقیقاً چه چیزی ساخته شده، چه چیزی ساخته نشده، و چطور امروز از آن استفاده کنی.

چرا مرورگر هدلس این مسئله را حل نمی‌کند

ابزارهای موجود معمولاً نمونه‌ای تازه و خالی از Chromium را اجرا می‌کنند. برای تست یک صفحهٔ عمومی خوب است، اما:

  • آن مرورگر هیچ‌کدام از نشست‌های تو را ندارد. پنل مدیریتِ نیازمند ورود، درگاه پرداخت، محیط استیجینگ پشت SSO — هیچ‌کدام در دسترس نیست.
  • هر بار باید دوباره وارد شوی، و اگر ورود دومرحله‌ای فعال باشد عملاً به بن‌بست می‌خوری.
  • خطاهایی که فقط با افزونه‌ها، کوکی‌ها یا وضعیت واقعی حساب تو رخ می‌دهند، در یک مرورگر تازه اصلاً بازتولید نمی‌شوند.

مرورگر دیگری نساز؛ به همان مرورگری وصل شو که اکنون در آن کار می‌کنی.

معماری: چهار ایستگاه بین ترمینال و تب تو

AiraCode CLI ──stdio──▶ MCP adapter ──unix socket──▶ native host ──native messaging──▶ افزونه ──▶ تب‌های تو

CLI هرگز مستقیماً با مرورگر ارتباط برقرار نمی‌کند. ابزار MCP را صدا می‌زند، آداپتور آن را روی یک سوکت محلی قاب‌بندی می‌کند، native host — که خودِ باینری aira در یک حالت خاص است و کروم آن را اجرا می‌کند — پیام را با native messaging به افزونه می‌رساند، افزونه کار را در صفحه انجام می‌دهد و نتیجه از همان مسیر برمی‌گردد.

نکتهٔ مهم: تمام این مسیر روی همان دستگاه انجام می‌شود — از طریق stdio، سوکت unix و native messaging. برای اتوماسیون مرورگر نه سرور واسطی در کار است، نه حسابی برای جفت‌شدن افزونه، نه تونل ابری.

سیزده ابزاری که مدل در اختیار دارد

ابزارکاری که می‌کند
tabs_contextفهرست تب‌های قابل‌دسترسی با شناسه، عنوان و نشانی
tabs_create / tabs_closeباز کردن یک نشانی در تب تازه / بستن تب
navigateانتقال یک تب به نشانی مشخص و انتظار تا پایان بارگذاری
read_pageساختار صفحه: عنوان‌ها و عناصر تعاملی، هرکدام با یک ارجاع مثل [e12]
get_page_textمتن قابل‌مشاهدهٔ صفحه
findپیدا کردن عنصر با متن، برچسب یا ویژگی
form_inputپر کردن input، textarea، select و چک‌باکس با ارجاع
computerاسکرین‌شات، کلیک، تایپ، کلید، اسکرول، درگ
javascript_toolاجرای JS در صفحه و برگرداندن نتیجه
read_console_messagesخروجی console با فیلتر regex، یا فقط خطاها و هشدارها
read_network_requestsدرخواست‌های شبکهٔ همان تب، با فیلتر نشانی یا فقط ناموفق‌ها
resize_windowتغییر اندازهٔ پنجره

گردش کار بر پایهٔ ارجاع‌هاست: read_page یا find به هر عنصر یک شناسهٔ کوتاه مثل e12 می‌دهد، و computer و form_input از همان شناسه استفاده می‌کنند. یعنی مدل به‌جای حدس زدن مختصات پیکسلی به یک عنصر مشخص اشاره می‌کند؛ و اگر صفحه دوباره رندر شود و آن عنصر دیگر وجود نداشته باشد، خطایی صریح دریافت می‌شود، نه کلیکی روی جای اشتباه.

مجوز: هیچ سایتی بدون اجازهٔ تو باز نمی‌شود

این بخشی است که باید پیش از نصب بخوانی.

  • دسترسی به تفکیک مبدأ (origin) است، یعنی پروتکل و پورت هم جزئی از آن است. نخستین بار که AiraCode سراغ مبدأیی می‌رود، ابزار با خطای permission_required برمی‌گردد و از مدل می‌خواهد از تو اجازه بگیرد. تو در پنجرهٔ افزونه Allow را انتخاب می‌کنی و از آن پس آن مبدأ مجاز است.
  • مبدأ بلاک‌شده بلاک می‌ماند. حتی اگر نشستی را در حالت bypass اجرا کرده باشی، بلاک اولویت دارد.
  • گزینهٔ «همهٔ سایت‌ها مجاز باشند» وجود دارد، به‌صورت پیش‌فرض خاموش است و در همان پنجره هم صراحتاً به‌عنوان گزینهٔ توصیه‌نشده برچسب خورده است.
  • صفحه‌های داخلی مرورگر مانند chrome:// و صفحهٔ افزونه‌ها همیشه رد می‌شوند.

دو جزئیات دیگر که ارزش دانستن دارند: خروجی console داخل خود صفحه در یک بافر محدود نگه داشته می‌شود و تنها زمانی از صفحه خارج می‌شود که read_console_messages روی یک تبِ مجاز اجرا شود؛ و درخواست‌های شبکه فقط برای تب‌هایی ضبط می‌شوند که AiraCode پیش‌تر با آن‌ها کار کرده است، نه برای هر تبی که تو باز کرده‌ای.

در عمل: یک حلقهٔ رفع باگ در چهار قدم

فرض کن ارسال فرم ثبت‌نام در محیط آزمایشی، فقط برای حساب تو، بدون نمایش خطا ناموفق است.

۱. تب را به مدل نشان بده

در همان کروم خودم، تب محیط آزمایشی باز است. با tabs_context ببین کدام تب است، بعد صفحه را بخوان.

۲. بگذار خودش صفحه را بفهمد

read_page ساختار فرم را با ارجاع برمی‌گرداند. لازم نیست انتخاب‌گر (selector) مشخص کنی.

۳. سناریو را اجرا و شواهد را جمع کن

فرم را با یک ایمیل آزمایشی پر کن و آن را ارسال کن، بعد read_console_messages و read_network_requests را با onlyErrors بخوان.

اینجاست که ارزش واقعی پیدا می‌شود: مدل هم‌زمان خطای JS و پاسخ ۴۰۰ سرور را می‌بیند و می‌فهمد کدام یک علت است و کدام معلول.

۴. اصلاح کن و در همان تب دوباره تست کن

چون همان تب و همان نشست حفظ می‌شوند، تکرار سناریو به‌جای چند دقیقه ورود دوباره، فقط چند ثانیه زمان می‌برد.

محدودیت‌ها را پیش از نصب بدان

این نسخه عمداً یک هستهٔ کوچک و درست است، نه فهرستی بلند از قابلیت‌های نیم‌کاره:

  • ورودی‌ها رویداد ساختگی هستند، نه رویداد سطح سیستم‌عامل. فریم‌ورک‌هایی مانند React که به رویدادهای DOM گوش می‌دهند درست کار می‌کنند، اما هر چیزی که به isTrusted تکیه کند کار نمی‌کند.
  • فقط سند سطح بالا خوانده می‌شود؛ محتوای داخل قاب‌های iframe با مبدأ متفاوت خوانده نمی‌شود.
  • javascript_tool در دنیای اصلی صفحه اجرا می‌شود، پس یک CSP سخت‌گیرانه می‌تواند eval را ببندد. در آن حالت خطا برگردانده می‌شود، نه اینکه بی‌صدا نادیده گرفته شود.
  • اسکرین‌شات از تب فعالِ پنجره گرفته می‌شود، بنابراین گرفتن اسکرین‌شات از تب پس‌زمینه ابتدا آن را فعال می‌کند.
  • ضبط GIF در این نسخه وجود ندارد.

اهمیت این معماری برای توسعه‌دهندهٔ ایرانی

دو چیز اینجا مهم‌تر از بقیه است.

اول، نصب به حساب گوگل گره نخورده است. شناسهٔ افزونه با یک کلید ثابت در مانیفست قفل شده، بنابراین نسخهٔ unpacked و نسخهٔ بسته‌بندی‌شده یک شناسهٔ یکسان دارند. برای استفاده از نسخهٔ کنونی لازم نیست منتظر انتشار در فروشگاه کروم بمانی.

دوم، پل ارتباطی محلی است. برای اتوماسیون مرورگر لازم نیست ترافیک از هیچ سرویس خارجی رد شود؛ نه برای احراز هویت افزونه، نه برای انتقال دستورها. AiraCode در بخش‌های دیگر نیز همین منطق را دنبال می‌کند: مسیر بحرانی نباید به سرویسی وابسته باشد که ممکن است در دسترس نباشد. مرور کلی AiraCode همین رویکرد را در بقیهٔ محصول نشان می‌دهد.

نصب

خود AiraCode با یک خط نصب می‌شود:

curl -fsSL https://airacode.ir/install.sh | bash

افزونه هنوز روی فروشگاه کروم منتشر نشده، پس فعلاً به‌صورت unpacked نصب می‌شود:

cd apps/airacode-chrome
bun install && bun run build

سپس در chrome://extensions گزینهٔ Developer mode را فعال کن و پوشهٔ apps/airacode-chrome/dist را با Load unpacked بارگذاری کن. بعد یک بار AIRA_ENABLE_BROWSER_INTEGRATION=1 aira را اجرا کن تا مانیفست native host روی سیستم نوشته شود و کروم را یک بار دوباره راه‌اندازی کن. مرحله‌به‌مرحلهٔ به‌روز همیشه در مستندات Aira Browser است.

فقط دربارهٔ افزونهٔ کروم AiraCode نخوان؛ همین حالا نصبش کنفقط دربارهٔ افزونهٔ کروم AiraCode نخوان؛ همین حالا نصبش کن

اگر هنوز در حال صورت‌بندی مسئله هستی، از آیراچت برای شکستن آن به بخش‌های کوچک‌تر و ترسیم نقشه استفاده کن؛ و وقتی نقشه آماده شد، AiraCode همان نقشه را در ترمینال — و اکنون در مرورگر — اجرا می‌کند. لینک نصب دوباره: airacode.ir/download.

جمع‌بندی

جمع‌بندی ساده است: ارزش این افزونه در «کنترل مرورگر» نیست — آن را ابزارهای زیادی بلدند. ارزشش در این است که مرورگرِ تو، با نشست‌های واقعی تو، وارد همان حلقه‌ای می‌شود که کد در آن نوشته و تست می‌شود — و پل این ارتباط روی همان دستگاه باقی می‌ماند.

#AiraCode#افزونهٔ کروم#اتوماسیون مرورگر#ایجنت کدنویسی#رفع اشکال

ادامهٔ مسیر

همهٔ مقاله‌ها ←

بیشتر در «کدنویسی با AI»