تصور کنید برای ساخت یک میز کار ساده برای عاملهای هوشمند، مجبور باشید برای هر پلتفرم یک رابط کاربری کاملاً جدید بنویسید. این ناکارآمدی دقیقاً همان جایی است که کتابخانه acp-components در ۲۷ ژوئن ۲۰۲۶ وارد میدان شد تا پایان دهد.
acp-components با نگاه به رابط کاربری بهعنوان مجموعهای از قطعات لایهبندیشده — شبیه قطعات لگو که هر کدام جایگاه مشخصی دارند — این چرخه تکراری را میشکند. این پروژه بر اساس پروتکل کلاینت عامل (ACP) طراحی شده و از مدل «جداسازی لایه داده/UI + انتزاع پلتفرم» استفاده میکند تا توسعهدهندگان بتوانند محیطهای چندعاملی را بدون بازنویسی کد، روی وب، اپلیکیشنهای دسکتاپ و افزونههای IDE اجرا کنند.
طبق گزارش مستندات فنی dev.to، این کتابخانه برای مقابله با «هرجومرج چندعاملی» ساخته شده است؛ وضعیتی که در آن توسعهدهندگان سعی میکنند مدلهای مختلفی مثل OpenCode، Codex و Claude را بهطور همزمان متصل کنند. بدون یک استاندارد واحد، برنامهنویسان با چهار مانع جدی روبرو هستند: پیادهسازی مجدد UI برای هر میزبان، مدیریت پیچیده جریانهای NDJSON در کامپوننتهای React، منطق دشوار جابهجایی بین پوشههای کاری و مرزهای امنیتی نامشخص در دسترسی به فایلسیستم. این چالشهای زیرساختی، بهویژه در محیطهای عملیاتی، یادآور ضرورت بهروزرسانیهای امنیتی است که بهتازگی در گزارش بررسی پایداری عملیاتی AI و امنیت React به آنها پرداخته شد.
همانطور که در تحلیلهای قبلی ما دربارهی استانداردهای ارتباطی مدلهای زبانی اشاره کردیم، یکپارچهسازی لایه انتقال داده کلید مقیاسپذیری است. فلسفه اصلی این پروژه بر جداسازی کامل لایه داده از لایه نمایش استوار است. پروژه در دو بسته مجزا عرضه میشود: @acp-components/react برای لایه نمایش و @acp-components/core برای لایه داده. لایهی Core خود بر پایه SDK پروتکل ACP بنا شده است.
اصل اول: هسته مستقل از فریمورک
سختگیرانهترین قانون معماری این کتابخانه، عدم وابستگی core به React است. در فایل package.json هیچ اثری از React دیده نمیشود. بهجای آن، چهار ذخیرهساز داده از zustand/vanilla استفاده میکنند تا یک ساختار سهگانه شامل {getState, setState, subscribe} ایجاد کنند. لایهی React سپس از طریق useSyncExternalStore به این ذخیرهها متصل میشود.
این طراحی اجازه میدهد هسته سیستم با Vue یا Svelte نیز استفاده شود. در این مدل، اکشنها توابعی خالص هستند که کلاینت ACP را بهعنوان ورودی میگیرند و بنابراین بدون وضعیت (stateless) و بهراحتی قابل تست هستند. همچنین، کامپوننتهای UI هرگز مستقیماً با localStorage یا window.prompt تعامل ندارند تا در محیطهای تست مثل jsdom بهطور بینقص اجرا شوند.
مدل وضعیت سهلایه
این کتابخانه برای مدیریت سناریوهای چندعاملی و چند-فضای کاری، از یک انتزاع سهسطحی استفاده میکند:
- عامل میزبان (Home Agent): یک اتصال مستقل ACP شامل انتقال، وضعیت و قابلیتها.
- فضای کاری (Workspace): یک دایرکتوری (cwd) که جلسات چندین عامل را در خود جای داده است.
- جلسه (Session): یک جفت شناسه منحصربهفرد شامل شناسه عامل و مسیر دایرکتوری.
این مدل به کاربر اجازه میدهد مثلاً با OpenCode کد بنویسد، با Codex آن را بررسی کند و از Claude سوال بپرسد — همه در یک قاب و طبقهبندی شده بر اساس پوشهها، بدون اینکه جلسات با هم تداخل کنند.
برای مدیریت اتصالات، createAcpProvider تمام عاملها را بهصورت موازی و از طریق Promise.allSettled متصل میکند تا سیستم مسدود نشود. یک ثبتکننده کلاینت محدودشده (scopedClientRegistry) باعث میشود شکست در اتصال یک عامل، کل سیستم را متوقف نکند.
طراحی پلتفرم متعامد (Orthogonal)
یکی از حیاتیترین تصمیمات مهندسی، جداسازی رابط پلتفرم از AcpContext است. پلتفرم مالک قابلیتهای بومی (native) است و AcpContext مدیریت وضعیت اتصال عاملها را بر عهده دارد. این دو در سطح رابط یا اسمبلینگ هرگز به یکدیگر ارجاع نمیدهند.

این ساختار تضمین میکند قابلیتهای پرریسک در سمت میزبان باقی بمانند. رابط پلتفرم متدهای مشخصی را برای تعاملات بومی (مثل باز کردن لینک)، فایلسیستم (خواندن و نوشتن فایل) و ماندگاری دادهها (ذخیره لیست فضاهای کاری) تعریف میکند.
بهدلیل این جداسازی، یک درخت کامپوننت واحد میتواند هم یک دموی وب، هم یک اپلیکیشن دسکتاپ Tauri و هم یک افزونه VS Code را تغذیه کند. دسترسی به فایلها بهجای اینکه در هسته باشد، بهعنوان یک قابلیت سمت UI از طریق usePlatform() مصرف میشود و تصمیمات امنیتی را به میزبان میسپارد.
دو پیادهسازی آماده این موضوع را اثبات میکنند:
۱. createWebPlatform: از fetch برای ارتباط با سرور واسط، EventSource برای نظارت بر فایلها و localStorage برای ذخیرهسازی استفاده میکند.
۲. createTauriPlatform: از پلاگینهای FS و Dialog در Tauri استفاده کرده و مدیریت لیست فضاهای کاری را به زبان Rust میسپارد.
انتقال دادههای جریانیافته و تجربه کاربری
پروژه از چهار گزینه برای انتقال داده در پروتکل ACP (که مبتنی بر NDJSON است) پشتیبانی میکند. هر پیام JSON در یک خط قرار دارد و توسط رابط AcpTransport مدیریت میشود:
- StdioTransport: گزینه اصلی دسکتاپ که یک پروسه فرزند ایجاد کرده و ورودی/خروجی استاندارد را مدیریت میکند.
- WebSocketTransport: مخصوص دموهای وب.
- HttpTransport: پیادهسازی مبتنی بر fetch برای اتصالات کوتاهمدت.
- Custom Transport: مانند
TauriIpcTransportکه برای ارتباط با Rust بهینه شده است.
برای روانتر شدن تجربه کاربری، کتابخانه از دستهبندی تکههای متنی (batching) با پنجره زمانی ۱۶ میلیثانیه استفاده میکند. این کار مانع از این میشود که یک فراخوانی ابزار در یک جلسه، باعث پرش یا لرزش متن در جلسهای دیگر شود. برای نمایش لیستهای طولانی نیز از react-virtuoso استفاده شده تا هزاران پیام بدون افت سرعت رندر شوند.

کامپوننتهای آماده بهکار
این کتابخانه بهجای یک پوسته ساده، یک میز کار کامل با ۱۸ دایرکتوری کامپوننت ارائه میدهد که شامل موارد زیر است:
- اسکلت (Skeleton): چیدمان سه ستونی با قابلیت تغییر اندازه.
- مدیریت جلسات: لیست جلسات با دستهبندی سهسطحی و سایدبار جابهجایی بین فایلها و جلسات.
- خانواده چت: شامل نمایش پیامها، حبابها، Composer با پشتیبانی از دستورات
/و نمایشگرهای Thought و Plan. - فایلها: نمایشگر فایل با ویرایشگر Monaco و درخت فایلها.
- دیالوگها: دیالوگهای اجازه دسترسی و ورود (Login) با تایماوت ۳۰۰ ثانیهای.
- متفرقه: نمای Diff، پالت دستورات و نوار مصرف توکن با نمایشگر SVG.
زیرساخت و استانداردهای فنی
پروژه برای پایداری در سطح تولید (production) ساخته شده است:
- TypeScript 5.9: استفاده از حالت strict و خروجی دوگانه ESM/CJS با Vite 6.
- وضعیت و UI: جداسازی Zustand 5 و سازگاری با React 19.
- استایل: استفاده از SCSS Modules با متغیرهای CSS (Design Tokens)؛ استفاده از رنگهای هاردکد شده ممنوع است.
- تمها: پشتیبانی از تمهای Dark (Midnight) و Light (Dawn).
- چندزبانه (i18n): مدیریت توسط
i18nextبرای انگلیسی و چینی. - تست: استفاده از Vitest 3 و
@testing-library/react.
این معماری، فرانتاند عاملها را از یک UI یکپارچه به یک سیستم بومی-پروتکل تبدیل میکند. چه یک ابزار وب سبک بسازید و چه یک افزونه سنگین IDE، اکنون میتوانید یک میز کار کامل را بدون بازطراحی مدیریت وضعیت برای هر میزبان، جایگذاری کنید.
توسعهدهندگان میتوانند نمونههای موجود در ریپوزیتوری را بررسی کنند: دموی وب با Vite، سرور واسط Node برای اتصال به OpenCode و Claude، و قالب دسکتاپ Tauri با بکاندهای Rust.
گام بعدی شما
- بررسی ریپوزیتوری
acp-componentsدر گیتهاب و اجرای دستورpnpm devبرای تست دمو. - مطالعه فایل
docs/ARCHITECTURE.mdبرای درک عمیقتر جداسازی لایههای داده و نمایش. - آزمایش جایگزینی رابطهای فعلی مدیریت جلسه در پروژههای خود با مدل سهلایه ACP.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو