تصور کنید یک عامل هوشمند را استخدام کردهاید که به جای کلیک کردن روی دکمههای وب، دقیقاً مثل یک انسان موشواره را میگیرد و نرمافزارهای دسکتاپ شما را مدیریت میکند. این دیگر یک تخیل نیست، بلکه نتیجهی خروج مدلها از «قفس طلایی» مرورگرهاست. در حالی که عاملهای نرمافزاری خودگردان سالها بود که در محدودههای استریل و بسیار ساختاریافتهی مدل شیءگرای سند (DOM) و درخواستهای ایزولهی HTTP محبوس بودند، یک تغییر معماری جدید اکنون به آنها اجازه میدهد تا از این قفس خارج شده و دسکتاپ واقعی کاربر را کنترل کنند.
به گزارش وبسایت dev.to در ۵ آگوست ۲۰۲۶، یک بررسی فنی عمیق نشان میدهد که چگونه میتوان با پیوند دادن استدلالهای سطح بالای موتور V8 جاوااسکریپت با فراخوانیهای سیستمی سطح پایین C++، عاملهایی ساخت که قادر به دیدن کل صفحه نمایش و دستکاری فیزیکی سیستمعامل میزبان باشند.
تا پیش از این، عاملهای هوشمند عمدتاً در محیط ساختاریافتهی DOM زندگی میکردند. آنها در کلیک کردن روی دکمههای HTML، پر کردن فرمهای SaaS، استخراج دادهها و تجزیه و تحلیل بستههای JSON استاد بودند، اما به محض اینکه یک جریان کاری نیاز به تعامل با پنجرهی انتخاب فایل (File Picker) بومی سیستمعامل، دستکاری یک نصب محلی از کلاینت یا تأیید نرمافزارهای دسکتاپ داشت، به یک دیوار سخت میخوردند. همانطور که در تحلیلهای پیشین ما دربارهی پروتکلهای ارتباطی مدلها اشاره کردیم، اکثر این عاملها به پروتکل ابزارهای توسعه کروم (CDP) متکی بودند که آنها را به محیط استریل یک مرورگر شبیهسازیشده محدود میکرد. اما نیازهای مدرن سازمانی و موج بعدی جریانهای کاری خودگردانِ چندمنظوره، نیازمند عاملهایی است که بتوانند از این فضای ایزوله (Sandbox) بیرون بیایند و خودِ سیستمعامل میزبان را دستکاری کنند. این تغییر رویکرد باعث شده تا تأخیرهای ناشی از محیطهای ابری در اجرای عاملهای تککاربره به شدت کاهش یابد و بهرهوری عملیاتی افزایش پیدا کند.
برای حل این چالش، مهندسان از Node-API (node-addon-api) برای ساخت کتابخانههای اشتراکی دینامیک (فایلهای .node) استفاده میکنند. این رویکرد، فاصله بین محیط اجرای جاوااسکریپت و هستهی سیستمعامل را به شدت کاهش میدهد. در این معماری، به جای استفاده از پلهای ارتباطی کندِ بین-فرآیندی (IPC) که بر پایه تفسیر اجرا میشوند یا پروکسیهای مبتنی بر شبکه، افزونهی بومی مستقیماً در همان فضای حافظهی پردازشی برنامهی Node.js اجرا میشود. این کار باعث حذف سربار سریالسازی (Serialization) و دسریالسازی میشود که در IPCهای معمول رایج است و در نتیجه، پرفورمنس مورد نیاز برای کنترل بلادرنگ و مبتنی بر بینایی فراهم میگردد.
شکاف فنی: V8 در برابر هسته (Kernel)
برای درک ضرورت این افزونهها باید به تفاوت بنیادین معماری بین موتور V8 و هستهی سیستمعامل نگاه کرد. موتورهای جاوااسکریپت در محیطهای اجرای مجازیسازی شده و ایزولهای اجرا میشوند که برای امنیت حافظه، جمعآوری زباله (Garbage Collection) و اجرای وب بدون وابستگی به پلتفرم بهینه شدهاند. این به این معناست که آنها طبیعتاً از قابلیتهای خام سیستم مانند مدیران پنجره (Window Managers)، درختهای دسترسیپذیری (Accessibility Trees)، سرورهای نمایش یا صفهای رویداد ورودی جدا شدهاند. در این راستا، بهینهسازیهای جدیدی مانند استفاده از V8 Isolate در برابر سندباکسهای لینوکسی توانستهاند زمان شروع به کار (Cold Start) عاملها را به طور چشمگیری کاهش دهند.
بسته به پلتفرم، این قابلیتها از طریق APIهای سیستمی سطح پایین C و C++ ارائه میشوند:
- macOS: مدیریت از طریق CoreGraphics و APIهای دسترسیپذیری (Accessibility APIs).
- Windows: مدیریت از طریق Win32 API.
- Linux: مدیریت از طریق X11 یا Wayland.
اگر یک عامل بخواهد عکسهای دقیق (Pixel-perfect) از صفحه بگیرد، مختصات فضایی را محاسبه کند یا کلیکهای موشواره را از طریق جاوااسکریپت تفسیرشده شبیهسازی کند، تأخیر (Latency) ایجاد شده غیرقابلقبول خواهد بود. به همین دلیل، افزونهی بومی مانند یک درایور فوق-بهینهشده عمل میکند. در حالی که V8 همچنان نقش ارکستراتور (سازماندهنده) را بر عهده دارد — یعنی اجرای حلقههای عامل، مدیریت وضعیت، رسیدگی به اجرای ابزارهای غیرهمزمان و هماهنگی وظایف موازی — لایهی C++ تعاملات سختافزاری با پهنای باند بالا و در سطح سختافزار خام (Bare-metal) را مدیریت میکند.
استعارهی میکروسرویس
این رابطه شبیه به یک معماری توسعهی وب است که در آن یک API Gateway سطح بالا (Node.js/V8) با میکروسرویسهای سطح پایین و پرقدرتی تعامل دارد که روی سختافزار خام اجرا میشوند.
یک پلتفرم را تصور کنید که در آن API Gateway جلسات و منطق کسبوکار را با استفاده از TypeScript مدیریت میکند. این لایه بسیار بیانگر (Expressive) و منعطف است. با این حال، اگر یک مسیر (Route) به رمزگذاری ویدیویی در لحظه یا تعامل مستقیم با سختافزارهای تخصصی نیاز داشته باشد، تلاش برای انجام این کار در جاوااسکریپت تفسیرشده یا با ایجاد زیر-فرآیندهای پایتون خارجی برای هر فریم ثبتشده، باعث کند شدن شدید سیستم میشود. سریالسازی شبکه و جابهجایی زمینه (Context Switching) بین پردازشها، پهنای باند را خفه میکند. در عوض، معمار سیستم یک میکروسرویس اختصاصی میسازد که با کد ماشین بومی کامپایل شده و از طریق بلوکهای حافظهی مشترک ارتباط برقرار میکند. در این مدل، V8 مغز و سازماندهنده است و افزونهی C++ نقش عضله را ایفا میکند.
از تحلیل DOM به حلقههای بینایی
سیستمعاملهای دسکتاپ برخلاف وب، یک DOM واحد، تمیز و جهانی برای هر برنامه ارائه نمیدهند. یک برنامه قدیمی Win32 که با C++ نوشته شده، یک اپلیکیشن چندپلتفرمی Electron، یک اپلیکیشن بومی macOS SwiftUI و یک بازی ویدئویی با شتاب سختافزاری، همگی پیکسلهای خود را به یک بافر نمایش مشترک (Shared Display Buffer) میفرستند. این بافر توسط یک سرور پنجره (مانند Quartz در macOS، مدیر پنجرههای دسکتاپ یا DWM در ویندوز، یا Wayland/X11 در لینوکس) مدیریت میشود. از دید سیستمعامل، این برنامهها اساساً بافتهای بیتمپ (Bitmap Textures) و دستورات ترسیمی هستند که به یک فریمباف ارسال میشوند.
در نتیجه، عاملها باید از پرسوجوی معنایی گرهها (مانند تگهای <button>، <input> و <div>) به استدلال فضایی مبتنی بر بینایی ارتقا یابند. خط لوله (Pipeline) برای این تعامل بومی از یک حلقه سختگیرانه پیروی میکند:
- تصویربرداری از وضعیت صفحه: افزونه، فریمباف نمایش یا بافر پنجره فعلی را در سطح پیکسل خام ثبت میکند و بدین ترتیب سندباکسهای مرورگر را دور میزند.
- استنتاج مدل بینایی: این عکس به یک مدل بینایی-زبانی چندوجهی (VLM) ارسال میشود که چیدمان را تحلیل کرده، اجزای رابط کاربری (آیکونها، فیلدهای متنی، نوارهای اسکرول) را شناسایی میکند و مختصات فضایی $(x, y)$ یا کادرهای محیطی (Bounding Boxes) را برمیگرداند.
- شبیهسازی رویداد بومی: عامل این مختصات را به یک «امضای فراخوانی ابزار» (Tool Invocation Signature) ترجمه میکند که افزونهی بومی آن را به عنوان یک وقفه (Interrupt) سطح پایین سیستمعامل اجرا میکند (مثلاً
CGEventCreateMouseEventدر macOS یاSendInputدر ویندوز) تا نشانگر سختافزاری حرکت کرده و کلیک انجام شود.
مدیریت عملکرد و همروندی (Concurrency)
از آنجا که اجرای جاوااسکریپت در Node.js تکرشتهای (Single-threaded) است، فراخوانی یک API همزمان سیستمعامل برای ثبت یک فریمباف نمایش 4K یا پرسوجو از درخت دسترسیپذیری پلتفرم، کل حلقهی رویداد (Event Loop) را منجمد میکند. در این حالت، تایمرها متوقف شده و چارچوب عامل به طور کامل از کار میافتد.
برای جلوگیری از این اتفاق، افزونههای سطح سازمانی باید «مدیریت ابزارهای غیرهمزمان» را در لایهی C++ پیادهسازی کنند. این کار با استفاده از موارد زیر محقق میشود:
- Napi::AsyncWorker: برای انتقال کارهای سنگین از رشتهی اصلی به پسزمینه.
- napi_create_threadsafe_function: برای برگرداندن ایمن نتایج و ارتباط مجدد با رشتهی اصلی V8.
عملیاتهای سنگین — مانند ثبت صفحه، پرسوجو از دستگیرههای پنجره (Window Handles) یا محاسبه تفاوتهای پیکسلی — به رشتههای پسزمینه که توسط استخر رشتههای (Thread Pool) libuv مدیریت میشوند، سپرده میشوند. پس از تکمیل، نتیجه به رشتهی V8 بازگشت داده شده و یک Promise جاوااسکریپت را حل (Resolve) میکند. این معماری «اجرای موازی ابزارها» را ممکن میسازد. به عنوان مثال، عاملی در یک محیط چند-مانیتوره میتواند همزمان از دو نمایشگر مختلف تصویر بگیرد یا در حالی که یک کلید اصلاحکننده (Modifier Key) را فشار داده، روی یک المان رابط کاربری کلیک کند، بدون اینکه رشتهی اصلی استدلال متوقف شود.
جزئیات پیادهسازی در سیستمعاملها
کنترل مستقیم کامپیوتر بسته به پلتفرم استراتژیهای متفاوتی میطلبد و افزونههای بومی اجازه میدهند این پیادهسازیهای دقیق صورت گیرند:
تصویربرداری از صفحه و دسترسی به فریمباف
- MacOS: نیازمند تعامل با چارچوب CoreGraphics (مانند
CGWindowListCreateImage) یا APIهای ScreenCaptureKit است. این موارد نیازمند مجوزهای صریح دسترسیپذیری هستند که باید به باینری در حال اجرا اعطا شوند. - Windows: شامل تکثیر خروجی دسکتاپ با استفاده از Desktop Duplication API مبتنی بر DirectX یا استفاده از APIهای قدیمیتر GDI مانند
GetDCوBitBltبرای ثبتهای مربوط به پنجرههای خاص است. - Linux: نیازمند ارتباط با سرور نمایش X11 (مانند
XGetImage) یا استفاده از پروتکلهای Screen-casting در PipeWire/Wayland است.
تولید ورودیهای مصنوعی
- MacOS: از
CGEventCreateMouseEvent،CGEventSetIntegerValueFieldوCGEventPostبرای تولید حرکات موشواره، فشردن دکمهها، اسکرول و فشردن کلیدها استفاده میکند. - Windows: بر پایه API
SendInputاست که آرایهای از ساختارهایINPUTرا میپذیرد که نشاندهندهی ضربات کیبورد و حرکات موشواره هستند. - Linux: با افزونه XTest در X11 (مانند
XTestFakeMotionEventوXTestFakeButtonEvent) یا دستگاههای ورودی مجازی کیبورد/پوینتر از طریق libinput در Wayland تعامل میکند.
زبان C++ اجازه تخصیص بافرهای حافظه (std::vector<uint8_t>) را میدهد که دادههای خام پیکسلی RGBA را نگه میدارند. با استفاده از Napi::Buffer، این دادهها میتوانند بدون کپی شدن در حافظه به جاوااسکریپت منتقل شوند که سرعت ارسال تصاویر به مدل بینایی را به شدت افزایش میدهد. علاوه بر این، اکشنهای پیچیده مانند «کشیدن و رها کردن» (Drag and Drop) به صورت توالیهای هماهنگ پیادهسازی میشوند: حرکت نشانگر $\rightarrow$ فشردن دکمه $\rightarrow$ تأخیر کوتاه $\rightarrow$ درونیابی حرکت در امتداد یک منحنی بزیر (Bezier Curve) $\rightarrow$ رها کردن دکمه. پیادهسازی این موارد در C++ زمانبندی قطعی (Deterministic) اجرا را تضمین میکند و از لرزشهای (Jitter) ناشی از توقفهای Garbage Collection در کدهای تفسیرشده جلوگیری میکند.
امنیت و حاکمیت
دادن قدرت تایپ دستورات شل (Shell) یا حرکت دادن موشواره به یک عامل هوش مصنوعی، یک تهدید امنیتی داخلی عظیم ایجاد میکند. یک عامل بدون محدودیت میتواند دادههای حساس سازمانی را خارج کند یا اقدامات گرافیکی دلخواه و مخربی را اجرا نماید. حاکمیت بر این ابزارها نمیتواند صرفاً به مهندسی پرامپت (مثلاً «لطفاً روی لینکهای مخرب کلیک نکن») متکی باشد، بلکه باید در معماری C++ و تایپاسکریپت (TypeScript) تعبیه شود.
حفاظهای پیشنهادی عبارتاند از:
- کنترل دسترسی مبتنی بر قابلیت (CBAC): مقداردهی اولیه افزونهها با پرچمهای قابلیت سختگیرانه. برای مثال، یک حالت محدود ممکن است اجازه تصویربرداری از صفحه را بدهد اما شبیهسازی بومی کیبورد را غیرفعال کند.
- سندباکسینگ در سطح پنجره: محدود کردن کلیکهای موشواره به کادرهای محیطی (Bounding Boxes) پنجرههای خاص برای جلوگیری از خروج عامل از یک برنامه تعیینشده.
- قطعکنندههای بصری (Visual Circuit Breakers): استفاده از مدل بینایی برای شناسایی اعلانهای امنیتی پرخطر یا محیطهای برنامهای غیرمجاز، که منجر به توقف خودکار اجرا و پرتاب یک استثنای حاکمیتی (Governance Exception) شود.
- ثبت وقایع مرزی هسته: ایجاد یک ردپای بازرسی (Audit Trail) تغییرناپذیر و دارای مهر زمانی در سطح بومی. هر ضربه کلید شبیهسازی شده، مختصات موشواره و هشِ فریمهای ثبتشده لاگ میشوند تا یک رکورد رمزنگاریشده برای افسران تطبیق (Compliance Officers) فراهم شود.
پیادهسازی در محیط عملیاتی
در یک محیط تولید، این اتصال بومی در یک کلاس TypeScript پیچیده (Wrap) میشود تا امنیت نوع (Type Safety) تضمین گردد. یک پیادهسازی استاندارد در سطح تولید شامل یک حالت «شبیهسازی» برای محیطهای CI/CD یا رانرهای ابری است که در آنها باینریهای بومی قابل اجرا نیستند.
برای مثال، یک کلاس SaaSDesktopAutomationEngine (که از EventEmitter ارثبری میکند) میتواند مدیریت ارکستراسیون سطح بالا را بر عهده بگیرد. این کلاس تضمین میکند که یک جلسه مقداردهی شده و مجوزهای سیستمعامل از طریق متدی مانند verifyOSPermissions() پیش از اجرای هر اقدامی تأیید شده است. این ساختار، فراخوانیهای سطح پایین بومی مانند captureScreenRegion یا simulateClick را در قالب Promiseهای غیرهمزمان ارائه میدهد و تلمتری (Telemetry) را از طریق رویدادهایی مانند captureStart و actionComplete و بازیابی از خطا را برای لاگهای بازرسی فراهم میکند.
این تکامل، گامی به سوی «تجسد عاملمحور» (Agentic Embodiment) است. عامل دیگر یک نمایش متنی از صفحه را نمیخواند، بلکه کامپیوتر را دقیقاً همانطور که یک انسان میبیند، مشاهده کرده و با آن تعامل میکند. این یک گذار از استدلال انتزاعی در DOM به واقعیت فیزیکی سیستمعامل است.
این چارچوب فنی نشان میدهد که آینده بهرهوری تنها در مدلهای زبانی بهتر نیست، بلکه در «دستهای» بهتر برای این مدلهاست. با انتقال مرز محاسبات به هستهی سیستمعامل، ما از عاملهایی که میتوانند «وبگردی» (Browse) کنند به عاملهایی میرسیم که میتوانند «اپراتوری» (Operate) کنند.
برای پیادهسازی این سیستم، توسعهدهندگان باید پروتکل زمینهٔ مدل (MCP) و استانداردهای Computer Use را بررسی کنند تا اطمینان حاصل شود که ابزارهای آنها در محیطهای مختلف سیستمعامل با یکدیگر سازگار هستند. این مفاهیم و نقشههای معماری همراه آنها از کتاب Model Context Protocol (MCP) & Computer Use. Standardizing Tool Integration, Vision-Driven Browser Automation, and Agent Governance in TypeScript استخراج شدهاند.
گام بعدی شما
- بررسی پروتکل زمینهٔ مدل (MCP) برای استانداردسازی تعامل ابزارها در محیطهای مختلف سیستمعامل.
- مطالعه استانداردهای Computer Use برای پیادهسازی لایههای حاکمیتی و امنیتی در TypeScript.
- آزمایش کتابخانههای
node-addon-apiبرای ایجاد پلهای ارتباطی سریع بین منطق مدل و APIهای سیستمعامل.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو