agent-console یک کنسول محلی است که ترنسکریپت‌های Claude Code و Codex را روی همان دستگاه می‌خواند و توکن، کش و هزینه‌ی تخمینی را نشان می‌دهد. در این نوشته نسخه‌ی 0.4.1 را نصب کردم، سه نقطه‌ی پایانی مستندشده‌اش را با curl صدا زدم، لایه‌ی policy را روی یک ریپوی آزمایشی اعمال کردم و بنچمارک خود پروژه را روی ۱٫۸ گیگابایت تاریخچه‌ی مصنوعی اجرا کردم: خواندن اولیه ۶۳ ثانیه و ۴۶۶ مگابایت حافظه، و هزینه‌ی گذر بیکار با دو برابر شدن تاریخچه رشد نکرد.

این ابزار دقیقا چه چیزی را می‌خواند

مخزن LockedinLabs-AI/agent-console در ۲۹ شهریور ۱۴۰۵ ساخته شد و تا لحظه‌ی خواندن این نوشته (۱۱ مهر ۱۴۰۵، برابر با ۳ اکتبر ۲۰۲۶) ۷۹۰ ستاره، ۱۴۰ فورک و ۵ issue باز دارد. نسخه‌ی 0.4.1 در ۵ مهر ۱۴۰۵ منتشر شد؛ مجوز MIT.

منبع داده‌اش دو پوشه است: ترنسکریپت‌های JSONL کلاد کد زیر ~/.claude/projects و فایل‌های rollout کدکس زیر ~/.codex/sessions. سند حسابداری توکن تصریح می‌کند هر دو فقط محلی و فقط خواندنی خوانده می‌شوند؛ نه کلید API مدل لازم است، نه حساب ابری، نه افزونه‌ی مرورگر.

توکن‌ها را در چهار کلاس جدا می‌شمارد: ورودی تازه، خروجی، نوشتن کش و خواندن کش. قاعده‌ی صریحی دارد: کلاسی که ابزار گزارش نکرده «نامعلوم» است، نه صفر، و جمع در آن حالت فقط یک کف است. نسخه‌ی ۱٫۱ همین سند که در ۳۱ شهریور ۱۴۰۵ بازنویسی شد، دلیلش را نوشته: از روی همان لاگ‌های واقعی، بازگردانی‌های ناموفق در یک بازه ۱۹ رویداد و ۲٬۵۸۳٬۲۱۶ توکن را از دست داده بودند.

نگهداری دو لایه است: جزئیات دقیقه‌ای ۸ روز نگه داشته می‌شود و مجموع روزانه تا ۴۰۰ روز. پرسش ماهانه جواب دارد، اما شمار نشست‌های ماه ندارد.

نصب و اولین اجرا

راهنمای نصب سه مسیر می‌دهد و هر سه به یک نسخه می‌رسند:

  1. سورس روی main با گیت و Node.js نسخه‌ی ۲۲ به بالا. هیچ وابستگی و هیچ مرحله‌ی build ندارد.
  2. آرشیو .tgz همان ریلیز، با npm install --global. فایل منتشرشده ۸۱۰ هزار بایت است.
  3. فایل اجرایی مستقل برای شش سیستم‌عامل و معماری، بدون نیاز به Node.js. فایل لینوکس ۶۴ بیتی ۱۲۹ مگابایت است.

نام بسته در رجیستری npm منتشر نشده است، پس npm i -g @lockedinlabs/agent-console کار نمی‌کند؛ همان دستور بالا با نشانی مستقیم فایل ریلیز کار می‌کند.

node --version
# v26.7.0 روی این ماشین؛ خود راهنما حداقل v22 را لازم می‌دارد

git clone https://github.com/LockedinLabs-AI/agent-console.git
cd agent-console

node bin/agent-console.mjs --version
# پیش از هر چیز دیگری نسخه را چاپ می‌کند و بی‌خروجی رد می‌شود
agent-console 0.4.1

همین یک خط، ارزان‌ترین راه برای اطمینان از نصب است. بعد از آن --open کنسول را روی 127.0.0.1:6787 باز و واردشده‌ی یک‌بارمصرف بالا می‌آورد؛ پورتی که با --port بدهید هرگز جابه‌جا نمی‌شود، و اگر پورت پیش‌فرض اشغال باشد آدرس واقعی چاپ می‌شود.

قبل از اینکه به سراغ عدد برویم، بدانیم این ابزار چه چیزی را نمی‌بیند. مستندات رسمی Claude Code می‌گوید هزینه‌ی هر نشست را از روی توکن و قیمت فهرست در همان دستگاه حساب می‌کند و خودش آن را تخمینی می‌خواند؛ صفحه‌ی مدیریت هزینه می‌گوید این عدد با پاسخ‌های دیت‌رسیدنی ۱٫۱ برابر هم می‌شود، پس با صورتحساب شرکت یکی نیست. برای پس‌زمینه‌ی کش، پست کش پرامپت چطور کار می‌کند همین جدایی را از سمت دیگر نشان می‌دهد.

سه فراخوانی واقعی به API

پنل کنسول یک صفحه‌ی جاوااسکریپتی است، اما همان داده‌ها یک API هم دارند. این ترنسکریپت روی همین ماشین اجرا شد:

$ node bin/agent-console.mjs --port 6801 --state-dir ./state-curl --json &
{"ok":true,"dashboard":{"name":"Agent Console","version":"0.4.1",
"url":"http://127.0.0.1:6801",
"signIn":"http://127.0.0.1:6801/login?ticket=UO5GFOfu9nNNsC-...",
"port":6801,"reportPort":6802,"listen":"127.0.0.1",
"demo":false,"local":true}}

$ curl -s -o /dev/null -c jar.txt -w "%{http_code} -> %{redirect_url}\n" \
    "http://127.0.0.1:6801/login?ticket=UO5GFOfu9nNNsC-..."
303 -> http://127.0.0.1:6801/

$ curl -s -H "X-Agent-Console: 1" http://127.0.0.1:6801/api/hello
{"product":"Agent Console","version":"0.4.1","demo":false,
 "redaction":{"count":0,"kinds":{}}}

$ curl -s -o console.json -w "status %{http_code}  bytes %{size_download}\n" \
    -b jar.txt -H "X-Agent-Console: 1" http://127.0.0.1:6801/api/console
status 200  bytes 20002

$ curl -s -H "X-Agent-Console: 1" http://127.0.0.1:6801/api/console
{"ok":false,"reason":"Sign in with the link the console printed when it
 started, or start it again with --open.","redaction":...}

سه چیز از این خروجی درمی‌آید که در README نوشته نشده بود. اول، بلیت ورود یک‌بارمصرف است و پاسخ ۳۰۳ می‌دهد؛ همان بلیت را دوباره بزنید و متن used or expired می‌گیرید. دوم، /api/hello تنها نقطه‌ای است که نشست لازم ندارد. سوم، /api/console بدون کوکی ۴۰۱ می‌دهد.

محل واقعی خواندن داده، همان hub.local.roots است که هر ریشه را با وجود یا نبودش و تعداد فایل گزارش می‌کند. روی این ماشین:

version      : 0.4.1
retentionDays: 8
prices       : {"v":1,"checkedOn":"2026-09-20","lastVerifiedOn":"2026-09-24",
                "currency":"USD","basis":"standard-global-api-equivalent",
                "models":22}
local.tools  : ['claude-code','claude-code','codex','codex']
root         : claude-code exists=False files=0
root         : codex      exists=True  files=6
root         : codex      exists=False files=0
dropped      : 0
devices      : 1
24h tokens   : total 0، fresh 0، output 0، cacheWrite 0، cacheRead 0
24h cost     : "none"

صفر بودن توکن‌ها اینجا نقص نیست، نتیجه‌ی همین دستگاه است. شش فایل rollout کدکس موجود بود و سند اندازه‌گیری صریح می‌گوید نبودِ تاریخچه یک حالت خالی معتبر است، نه نصب خراب. خودم فایل‌ها را باز کردم: نوع رکوردها task_started، message، task_complete و turn_aborted بود و صفر خط token_count داشتند.

لایه‌ی policy چه چیزی را واقعا می‌تواند اجرا کند

کنار کنسول یک لایه‌ی سیاست هست که agent-policy.yaml ریپو را به فایل‌های پروژه‌ی کلاد کد تبدیل می‌کند. روی یک ریپوی خالی تازه، با بودجه‌ی ۲۰۰ هزار توکن و سه گیت فشار-پیش:

$ node bin/agent-console.mjs policy diff --project ./repo
create: .claude/settings.json
create: .claude/agent-console-policy.json
create: .claude/hooks/agent-console-policy.mjs
create: .claude/hooks/classify.mjs
create: .claude/agents/agent-console-search.md
create: .claude/agents/agent-console-exploration.md
create: .claude/agents/agent-console-log-reading.md
create: .claude/agents/agent-console-code-edit.md
create: .claude/agents/agent-console-code-edit-verified.md
create: .claude/agents/agent-console-escalation.md
Not enforceable yet: hard token/dollar budgets, verifying-test proof,
failed-attempt count.

$ node bin/agent-console.mjs policy apply --project ./repo
# همان ده فایل، به‌علاوه‌ی نسخه‌ی خصوصی از تنظیمات قبلی

$ node bin/agent-console.mjs policy status --project ./repo --json
{"state":"installed",
 "policyDigest":"24befad1d3e191b12d35b3802a7becbf197353ce3c6f1f2aca66e080496bb664",
 "runtimeVerified":false,
 "issues":[],
 "coverage":{"tools":"configured-unverified",
             "modelSwitch":"configured-unverified",
             "hardBudgets":"not-enforced",
             "gateway":"not-configured"}}

آن جمله‌ی انگلیسی، مهم‌ترین خروجی کل این بخش است. بودجه‌ی توکن و دلار به‌صورت سخت قابل اجرا نیست، چون هک شروع ابزار در کلاد کد موجودی زنده‌ی توکن یا قیمت را نمی‌بیند، و تشخیص اینکه یک تست واقعا اجرا شده از روی پرامپت شروع هم ممکن نیست. سند لایه‌ی سیاست هر دو را «قابل اعمال نیست» اعلام می‌کند و runtimeVerified همیشه false می‌ماند مگر آنکه خودتان ثابت کنید.

روی یک ریپوی بدون سیاست هم policy diff چیزی جز پیام Unknown or incomplete policy option نمی‌دهد و چیزی نمی‌نویسد؛ یعنی تا سیاست نخواهی، چیزی نصب نمی‌شود. برای سخت‌کردن کلاد کد، راه درست‌تر قفل سندباکس با strictAllowlist است؛ این لایه بالاتر از سندباکس می‌نشیند.

بنچمارک: هزینه‌ی خواندن یک تاریخچه‌ی بلند

ادعای اصلی پروژه این است که بار اول به اندازه‌ی یک بار خواندن تاریخچه هزینه دارد و هر گذر بعدی به اندازه‌ی تغییرات. CI خودش را با دروازه‌ی عددی نگه می‌دارد، پس ادعا را می‌شود خودش آزمود. اول سناریوی ماه سنگین:

$ node bench/generate.mjs --out ./bench --lines 1000000 --sessions 240 --days 30
$ node bench/run.mjs cold --home ./bench/home-1 --retention-days 30
# روی این ماشین: ۵۴۱ فایل و ۱۰۰۰۳۴۴ خط، ۱۷۹۵۷۶۸۲۸۹ بایت روی دیسک
{
  "scenario": "cold", "node": "v26.7.0", "cpus": 1,
  "firstReadMs": 63529,
  "firstRead": { "peakRssMb": 466, "cpuS": 58,
                 "records": 8290, "tokens24h": 4112626135 },
  "newLineVisibleMs": [2028, 2105, 2008],
  "idleCpuPercent": 3.3,
  "console": { "answerMs": 228, "bytes": 146819 },
  "stateBytes": 160897444,
  "restart": { "readyMs": 3181, "peakRssMb": 247 }
}

۶۳ ثانیه برای ۱٫۸ گیگابایت، با ۴۶۶ مگابایت اوج حافظه. این بار اول است و یک‌بار پرداخت می‌شود. سخت‌تر بخش رفتار بعد از آن است، که دروازه‌ی CI خود پروژه روی دو اندازه‌ی تاریخچه می‌سنجد:

دروازه‌ی بودجه‌ی bench/check.mjs و اندازه‌گیری روی همین ماشین
سنجهبودجه۲۰٬۰۴۱ خط۱۰۰٬۰۴۰ خط
بایت خوانده به‌ازای هر بایت تاریخچه، بار اول۱٫۳۵۱٫۳۳۴۱٫۲۹۷
تجزیه‌ی JSON به‌ازای هر خط۱٫۱۵۰٫۹۸۳۱٫۰۵۸
نوشتن به‌ازای هر ۱۰۰۰ رکورد، بار اول۲٫۳۲٫۰۴۱٫۲۱
بایت خوانده در گذر بیکار۱۲۸ کیلوبایت۹۴٬۵۹۹ بایت۹۲٬۴۹۰ بایت
بایت نوشته در گذر بیکار۱ کیلوبایت۱۸ بایت۱۸ بایت
فایل بازشده در گذر بیکار۲۰۹۹
اندازه‌ی مکان‌نمای ذخیره‌شده۲۵۶ کیلوبایت۹۴٬۳۲۴ بایت۹۲٬۲۱۵ بایت
اندازه‌ی پاسخ کنسول۹۶ کیلوبایت۶۸٬۷۱۰ بایت۸۵٬۳۲۹ بایت
زمان بارگذاری انبار، تقسیم بر زمان JSON.parse۶٫۵—۴٫۸۳
نسبت هزینه‌ی گذر بیکار، ۱۰۰٬۰۴۱ خط نسبت به ۲۰٬۰۴۱ خط۱٫۵ برابر—۰٫۹۸ برابر

آخرین سطر همان چیزی است که ادعا را می‌ایستد: پنج برابر کردن تاریخچه، هزینه‌ی گذر بیکار را حتی یک درصد هم زیاد نکرد. عدد ۰٫۹۸ یعنی گذر بیکار به اندازه‌ی تاریخچه رشد نمی‌کند، و راه‌حل پشتش مکان‌نمای خواندن است: هر فایل یک جای خوانده‌شده‌ی ذخیره‌شده دارد و پاس بعدی از همان‌جا ادامه می‌دهد.

قاعده‌ی عملی ساده است: این ابزار را روی ماشینی نگذارید که تاریخچه‌اش بزرگ است و بعد انتظار ارزان بودن داشته باشید. چند گیگابایت لاگ دارید؟ همان ۶۳ ثانیه و آن ۴۶۶ مگابایت را روی ماشین خودتان ببینید و بعد تصمیم بگیرید.

سه مرزی که باید بدانید

اول، عدد دلاری صورتحساب نیست. جدول قیمت درون مخزن تاریخ‌دار است و صریح می‌گوید چه چیزهایی را نمی‌بیند: اشتراک، نرخ توافقی، batch، اضافه‌بار دیت‌رسیدنی، مالیات و هزینه‌ی ابزار. سه سطر از نرخ‌های OpenAI را با صفحه‌ی قیمت رسمی OpenAI روبه‌رو کردم و هر سه دقیقاً می‌خوانند: GPT-5.5 با ۵ دلار ورودی، ۰٫۵ دلار ورودی کش‌شده و ۳۰ دلار خروجی، و GPT-5.4 و GPT-5.4 mini هم همین‌طور.

دوم، سه شناسه‌ی مدل در همان جدول بی‌قیمت‌اند: codex-auto-review، gpt-5.3-codex-spark و gpt-reserve. ابزار آن‌ها را صفر حساب نمی‌کند؛ از جمع دلاری کنارشان می‌گذارد و وقتی همه بی‌قیمت باشند به‌جای عدد، واژه‌ی unpriced می‌نویسد.

سوم، این ابزار می‌گوید ابزارها چه نوشته‌اند، نه شرکت چه صورتحساب کرده است. سند معماری تصریح می‌کند داشبورد درخواست مدل را رهگیری نمی‌کند و گیت‌وی نیست. برای بودجه‌ی تیمی، هسته‌ی تحلیل مشترک تابع costPerOutcome دارد که هزینه به هر commit را می‌دهد و تاکید می‌کند این نسبت همبستگی دو عدد در یک بازه است، نه هزینه‌ای که یک commit ساخته.

جمع‌بندی: اگر چند ماشین دارید که روی آن‌ها ایجنت کار می‌کند و می‌خواهید بدانید توکن و کش کجا می‌رود، این مخزن همان کار را با یک git clone و بدون کلید API انجام می‌دهد. اگر دنبال صورتحساب رسمی، اجبار سخت روی بودجه یا کنترل دقیق مجوز هستید، جای آن‌ها را نمی‌گیرد و خودش هم این را در خروجی‌اش می‌گوید.

منابع

  1. مخزن LockedinLabs-AI/agent-console روی گیت‌هاب
  2. ریلیز v0.4.1 و فهرست کامل دارایی‌ها
  3. راهنمای نصب و سه مسیر راه‌اندازی
  4. سند اندازه‌گیری: منابع، چهار کلاس توکن و بازه‌ی زمانی
  5. سند حسابداری توکن، نسخه‌ی ۱٫۱ و قواعد حذف تکراری
  6. سند کارایی، سناریوهای آزمون و جدول بودجه‌ها
  7. لایه‌ی سیاست و آنچه هنوز قابل اجرا نیست
  8. هسته‌ی تحلیل مشترک و تابع costPerOutcome
  9. سند معماری و مرزهای اعتماد
  10. تاریخچه‌ی تغییرات، ورودی v0.4.1
  11. جدول قیمت تاریخ‌دار درون مخزن
  12. قیمت رسمی API در OpenAI
  13. قیمت رسمی مدل‌ها در پلتفرم Claude
  14. مستندات کلاد کد درباره‌ی محاسبه‌ی هزینه