The platform no longer exposes a public /api/* REST surface. The original
HTTP route handlers are preserved verbatim as the single source of truth
inside an internal, never-socket-bound FastAPI app (rpc_app), and are now
reached only via RPC-over-WebSocket dispatch.
- realtime router: anonymous connections allowed only to /api/auth/login
and /api/auth/signup; all other RPCs/subscribes refused until token auth.
- RPC dispatch re-injects the bearer token and X-Request-ID, then forwards
through httpx.ASGITransport against the internal app (no network hop).
- Public app now serves only /, /health, /health/ready and /api/ws;
docs/openapi disabled.
- Frontend: apiRequest routes /api/* to ws.rpc(); /health probes keep fetch.
RealtimeClient gains rpc() with id correlation, timeout and AbortSignal.
- Tests repointed to get_rpc_app(); anonymous-auth behaviour covered.
Result: zero REST on the public surface; 264 backend tests + frontend
typecheck pass.
- حذف کامل providerهای mock و openai_compatible: دامنه، آداپوترها، رجیستری، کانفیگ، seed و رابطٔ مدیریت
- بخش «ارائهدهندهها» از کنسول حذف شد؛ ورود اکانتها فقط از صفحهٔ اکانتهای agy
- صفحهٔ مدلها بازطراحی شد: ارائهدهنده → اکانت → مدل (کاتالوگ لحظهای و زندهٔ همان اکانت از Google) → افورت استدلال؛ بدون هیچ ورود دستی نام مدل
- مدلها ستون reasoning_effort گرفتند؛ آداپتور آن را به thinkingConfig (بودجهٔ ۱۰۲۴ تا ۳۲۷۶۸) ترجمه میکند و فقط به مدلهای استدلالی میفرستد
- مهاجرت c2d3e4f5b6a7: افزودن reasoning_effort و حذف ردیفهای providerهای قدیمی
- تستها: ۲۴۶ تست بکاند و ۵۱ تست فرانت سبز؛ ruff و mypy و tsc و eslint تمیز
صفحهٔ `/admin/agy-accounts` بعد از پاس motion ساخته شد، بنابراین ریشهٔ
خودش `.anim-stagger` نداشت و کل صفحه یکجا ظاهر میشد در حالی که بقیهٔ
پنل آبشاری وارد میشوند. فهرست اکانتها هم که async لود میشود stagger
نگرفته بود.
هر صفحهٔ جدیدی که بعد از این ساخته شود باید همین دو کلاس را بگیرد؛
`motion.test.tsx` واژگان را محافظت میکند اما اعمال آن روی صفحههای
تازه را نمیگیرد.
یک حباب کوچک و شیشهای با فونت تکعرض در فوتر ستون کناری، کنار دکمهٔ خروج:
- `font-mono` — پشتهٔ فونتهای سیستمی (ui-monospace، SFMono، Menlo،
Consolas) که همیشه نصباند؛ پس نسخه روی هر دستگاه یکسان رندر میشود،
بدون انتظار برای وبفونت، و رقمها جابهجا نمیشوند.
- شیشهای با translucent و blur: `bg-white/5` + `border-white/10` +
`backdrop-blur-sm`. بدون gradient و بدون shadow، مطابق §12 پلن.
- `ltr-inline` تا الگوریتم bidi در پوستهٔ RTL رشتهٔ لاتین را جابهجا نکند،
و `tabular-nums` تا عرض numeralها ثابت بماند.
نسخه از `src/lib/version.ts` میآید — بهجای import کردن کل
`package.json` که کل manifest را برای یک رشته به باندل کلاینت میکشید.
هزینهٔ این انتخاب drift است، پس `version.test.tsx` میسنجد که با
`apps/web/package.json` یکی باشد.
تستهای جدید: ۵ (نسخه و نشان نسخه در پوسته).
- Adapter اکانتمحور با چرخش round-robin و بنچشدن خودکار روی ۴۲۹/۴۰۱
- ورود ادمین از طریق URL بازگشتی گوگل (PKCE) و ذخیرهٔ رمزنگاریشدهٔ refresh token
- صفحهٔ مدیریت اکانتهای agy در پنل ادمین به همراه تست و فعال/غیرفعالسازی
- مهاجرت Alembic b1c2d3e4f5a6 برای ستونهای اکانت agy
- seed همیشه کاتالوگ agy را میسازد و فقط با AI_DEFAULT_PROVIDER=agy مسیریابی میشود
چندین سطح تعاملی (منوی سازمان، منوی کاربر، لینکهای بردکرامب، آیتمهای
پالت فرمان، دکمهٔ ساخت سازمان، لینک ردیابی) رنگ را در hover یکباره
تغییر میدادند و بقیهٔ رابط نرم بود. اکنون همه یکسان transition
میگیرند.
واژگان مشترک حرکت در globals.css: شش @keyframes و شش کلاس .anim-*
بههمراه .anim-stagger برای ورود آبشاری. همهٔ مدتزمانها پشت custom
property هستند تا یک override کل اپ را تنظیم کند.
- packages/ui: Button، Card، Stat، Loading/Empty/ErrorState، UsageBar،
Timeline، Modal، Drawer، Table، ToastStack و ArtifactViewer
- ریشهٔ هر صفحهٔ (app) با .anim-stagger وارد میشود
- AppShell: محتوا fade، منوی کنار stagger، منوهای کشویی slide-up
- prefers-reduced-motion مدتزمانها را به ۰.۰۱ms میرساند تا
وضعیت پایانی حفظ شود
- قرارداد motion در src/test/motion.test.tsx تست میشود تا
بازنویسی بعدی آن را بیصدا حذف نکند
- تستهای فرانتاند: ۳۵ ← ۴۵
دو شکاف رسیدگیشده از بازبینی PLAN.md و TODO.md:
- پالت فرمان: جستوجو و رفتن سریع بین بخشها با ⌘K/Ctrl+K، پیمایش با
کلیدهای جهتدار، Enter برای رفتن، و Escape برای بستن. گروه اختصاصی
«کنسول مالک سامانه» فقط برای مالک سامانه نمایش داده میشود.
- صفحهٔ /admin/usage: گزارش مصرف سراسری به تفکیک سازمان. اندپوینت
`GET /admin/usage` و کلاینت `adminUsage()` از قبل وجود داشتند و توسط
صفحات نمای کلی و سازمانها مصرف میشدند؛ این صفحهٔ اختصاصی آن است.
همچنین `NAV_ITEMS` به `lib/nav.ts` منتقل شد تا sidebar و پالت فرمان
هرگز از هم واگرا نشوند.
تست: ۱۰ تست جدید برای پالت فرمان. مجموع تستهای فرانتاند از ۲۵ به ۳۵
رسید. tsc، eslint و ruff تمیز.
نام نمایشی و هویت اپلیکیشن در همهٔ سطوح کاربر-پسند از «AGY Web» به
«Smart Organization» تغییر کرد:
- UI: عنوان تب مرورگر، صفحهٔ ورود، برند و لوگوی پوستهٔ اپ (AG → SO)
- بکاند: مقدار پیشفرض app_name، نام و توضیح توزیع پایتون
- مانیفستها: package.json ریشه و چهار پکیج، pyproject.toml
- مستندات: README، PLAN، TODO و دو سند docs
شناسههای داخلی عمداً دستنخورده ماندهاند: scope پکیجهای @agy/*،
کلیدهای localStorage، نامهای logger، نام فایل پایگاهٔ داده، و اطلاعات
اتصال پایگاه داده در .env.example و infra/docker/docker-compose.yml.
مخزن اختصاصی برنامهٔ وب؛ محتوای پوشهٔ web در ریشهٔ مخزن قرار گرفت.
تاریخچهٔ پروژهٔ ربات (agy-bot) در این مخزن وجود ندارد و هیچ وابستگی runtime به آن نیست.