إنتقل إلى المحتوى الرئيسي

الإعدادات

يحمّل EstaCoda إعدادات ملف شخصي واحد محدد في كل جلسة. لا يوجد دمج إعدادات عام، ولا تغطية على مستوى المشروع، ولا سطح إعدادات لتجميع بيانات الاعتماد. الملف الشخصي الذي تختاره هو ما تحصل عليه.

توجد الإعدادات في:

~/.estacoda/profiles/<profile-id>/config.json

تنتمي الأسرار إلى .env أو auth.json الخاص بالملف الشخصي المحدد، وليس في config.json أو أمثلة من الوثائق.

عائلات الإعدادات

تدعم إعدادات الملف الشخصي هذه العائلات على المستوى الأعلى. ليس كل عائلة مطلوبة. العائلات المُهملة تستخدم القيم الافتراضية الآمنة أو تبقى غير نشطة.

model

مسار النموذج الأساسي. يقرر أي مزود ونموذج يتولى حلقة الاستدلال الرئيسية.

{
"model": {
"provider": "openai",
"id": "gpt-4.1",
"apiKeyEnv": "OPENAI_API_KEY",
"maxTokens": 8192
}
}

الشكل المكافئ:

model:
provider: openai
id: gpt-4.1
maxTokens: 8192

الحقل model.maxTokens هو حد الخرج على مستوى المسار. إذا كان غير مضبوط، يُستخدم الافتراضي لدى المزود. تُقبل الأعداد الصحيحة الموجبة، سواء كانت أرقامًا أو سلاسل نصية. تُرفض القيم 0، والقيم السالبة، والكسور، والسلاسل غير الرقمية. تعرض التشخيصات provider default عندما يكون غير مضبوط، وتحذر من القيم المضبوطة تحت 2048.

الحقل maxTokens على مستوى الطلب يتجاوز إعداد المسار لتلك مكالمة المزود فقط. لا يغيّر إعداد الملف الشخصي، ولا تجاوزات الجلسة، ولا الأسماء المستعارة، ولا الاحتياطيات، ولا البصمات.

تُختار أسماء معاملات حد الرموز حسب وضع API:

المزود/وضع APIالمعامل المرسل
OpenAI Chat Completionsmax_completion_tokens
دردشة طرف ثالث متوافقة مع OpenAImax_tokens
OpenAI Responses APImax_output_tokens

إذا كان الحد غير مضبوط، لا يُرسل أي معامل حد رموز.

تملك طلبات المزود أيضًا ضوابط مهلة:

{
"model": {
"provider": "kimi",
"id": "kimi-k2.6",
"timeoutMs": 1800000,
"staleTimeoutMs": 120000
},
"providers": {
"kimi": {
"timeoutMs": 1800000,
"staleTimeoutMs": 120000
}
}
}

timeoutMs هي ميزانية الطلب الكلية للمزود. قيمتها الافتراضية 1800000 مللي ثانية، أي 30 دقيقة. staleTimeoutMs هي ميزانية انعدام التقدم. قيمتها الافتراضية 120000 مللي ثانية، أي دقيقتان.

الأسبقية:

model.timeoutMs / model.fallbacks[].timeoutMs
→ providers.<id>.timeoutMs
→ 1800000

model.staleTimeoutMs / model.fallbacks[].staleTimeoutMs
→ providers.<id>.staleTimeoutMs
→ 120000

في طلبات المزود غير المتدفقة، تقيس staleTimeoutMs مدة انتظار رؤوس الاستجابة فقط. بعد وصول الرؤوس، تحكم المهلة الكلية قراءة جسم الاستجابة. في الطلبات المتدفقة، يعاد ضبط staleTimeoutMs بعد كل بايتات مستلمة، فتلتقط تعطل أول بايت وتعطل منتصف التدفق. مهلات النماذج المساعدة تضبط بشكل منفصل عبر auxiliaryModels.*.timeoutMs؛ مهلات الركود للنماذج المساعدة وأعلام CLI لضبط مهلات المزود ليست جزءًا من هذا السطح.

modelAliases / model_aliases

اختصارات مُسمّاة لتركيبات مزود/نموذج.

{
"modelAliases": {
"fast": { "provider": "openai", "model": "gpt-4o-mini" }
}
}

providers

مسارات مزود إضافية، وبدائل، وبيانات وصفية.

{
"providers": {
"fallback": { "provider": "openrouter", "model": "openrouter/auto" }
}
}

يمكن للمزود المدمج local أن يشير إلى نقطة نهاية محلية أو مخصصة متوافقة مع OpenAI. قيمته الافتراضية هي http://localhost:11434/v1 وبلا اعتماد، لذلك يكون apiKeyEnv اختياريًا:

{
"model": {
"provider": "local",
"id": "qwen2.5-coder"
},
"providers": {
"local": {
"baseUrl": "http://localhost:1234/v1",
"authMethod": "none"
}
}
}

إذا كانت نقطة النهاية تتطلب مفتاحًا، خزّن المفتاح الخام في ملف .env للملف الشخصي المختار وأشر إليه من الإعداد:

{
"providers": {
"local": {
"baseUrl": "https://private-model-gateway.example/v1",
"apiKeyEnv": "OPENAI_COMPATIBLE_API_KEY"
}
}
}

استخدم معرف مزود مخصص فقط عندما تحتاج هوية مسار OpenAI-compatible منفصلة:

{
"providers": {
"lmstudio": {
"baseUrl": "http://localhost:1234/v1",
"apiKeyEnv": "OPENAI_COMPATIBLE_API_KEY"
}
}
}

auxiliaryModels

مسارات متخصصة للمهام غير الأساسية. الأسماء غير المدعومة تُلقي أخطاء أثناء تطبيع الإعدادات.

المسارالغرض
visionتحليل الصور
compressionضغط الجلسة الدلالي
assessorمقيّم الموافقة الأمنية
web_extractاستخراج الويب
session_searchتلخيص استدعاء الجلسة
mcpتفويض أدوات MCP
memory_flushعمليات الذاكرة
delegationتفويض الوكيل الفرعي
skills_libraryتوزيع المهارات
title_generationتوليد عنوان الجلسة
curatorتأهيل المهارات
memory_compactionضغط ملف الذاكرة
profile_contextتوليد سياق الملف الشخصي

delegation

إعدادات تفويض الوكلاء الفرعيين تُطبّع بالقيم الافتراضية عندما تكون محذوفة.

المفتاحالافتراضيالسلوك
maxSpawnDepth1أقصى عمق لتفويض الأطفال recursively. أطفال leaf لا يفوضون.
maxConcurrentChildren3أقصى عدد أطفال نشطين في دفعة.
maxDelegateCallsPerTurn3سقف كل provider turn لاستدعاءات delegate_task المنفصلة.
maxBatchTasks10أقصى طول لـ tasks[].
childTimeoutSeconds600حد timeout للطفل؛ الحد الأدنى 30 ثانية.
heartbeatSeconds30فترة heartbeat للأب أثناء عمل الأطفال.
heartbeatStaleCyclesIdle3عتبة stale-heartbeat عندما يكون الطفل idle.
heartbeatStaleCyclesInTool6عتبة stale-heartbeat عندما يكون الطفل داخل أداة.
recoverJsonStringTaskstrueاسترداد صارم لمصفوفات tasks المرسلة كسلسلة JSON.
diagnostics.enabledtrueكتابة تشخيصات timeout/stale محدودة عندما يوجد diagnostics root للملف التعريفي.
diagnostics.includePromptPreviewfalseمعاينات prompt الكاملة تبقى معطلة افتراضيًا.
outcomeMemory.enabledfalseذاكرة نتائج التفويض اختيارية ومحدودة.
defaultAllowedRiskClassesread-only-local, read-only-networkفئات مخاطر أدوات الطفل الافتراضية بعد التقاطع مع أدوات الأب المرئية.
defaultExcludedToolsetsbrowser, media, mcptoolsets تُزال من مخططات الأطفال الافتراضية.
defaultAllowedToolsetsفارغلا يوجد grant افتراضي واسع لـ toolset.
blockedToolNames / blockedToolPrefixesdeny list مدمجةإزالة أدوات exact/prefix قبل بناء مخططات الطفل.
childRuntimerecall/learning/compression معطلة، project context محدودتعطيل ميزات runtime الشبيهة بالأب داخل حلقات الأطفال.

terminal.run، وأدوات الكتابة/التحكم بالعمليات، والذاكرة/بحث الجلسات، وتعديل المهارات/الإعداد/cron/الثقة، وأس surfaces بيانات الاعتماد تُزال افتراضيًا. terminal.inspect هي أداة read-only-local وقد تظهر للطفل فقط عندما تكون مرئية للأب وتسمح بها سياسة القراءة فقط. إعدادات التفويض تدخل في runtime fingerprint حتى تعيد تغييرات المخطط بناء provider tool schemas.

web

اختيار خلفية بحث الويب.

{
"web": {
"searchBackend": "brave",
"extractBackend": "fetch",
"brave": {
"apiKeyEnv": "BRAVE_SEARCH_API_KEY"
}
}
}

الاختيار خاص بكل قدرة:

web.searchBackend / web.extractBackend / web.crawlBackend
→ web.backend
→ auto-detect available providers
→ unavailable

الإعداد الصريح يفوز. إذا سمّى web.searchBackend مزودًا غير متاح، تُرجع web.search سبب عدم توفر ذلك المزود بدل الرجوع بصمت إلى مزود آخر.

المفتاحالنوعملاحظات
web.backendstringتفضيل عام/قديم لمزود الويب يُستخدم عندما لا يوجد backend خاص بالقدرة.
web.searchBackendstringتفضيل مزود البحث. مزودا البحث الحيّان هما brave وddgs.
web.extractBackendstringتفضيل مزود الاستخراج. fetch هو fallback الاستخراج الحارس الحي.
web.crawlBackendstringتفضيل مزود الزحف. لا يوجد مزود زحف حي في هذا الإصدار.
web.brave.apiKeyEnvstringمرجع متغير البيئة لـ Brave Search. الافتراضي BRAVE_SEARCH_API_KEY. لا تخزن مفتاح API الخام في الإعدادات.

Brave Search مزود خارجي ببيانات اعتماد ويستخدم نمط مرجع البيئة/السر المؤجل نفسه مثل مزودي النماذج. يستخدم DDGS قدرة Python المُدارة ddgs؛ ثبّتها أو تحقق منها صراحةً عبر estacoda python-env setup ddgs وestacoda python-env verify ddgs. لا تثبت web.search حزم Python تلقائيًا أثناء التشغيل.

تبقى Firecrawl وParallel وTavily وExa وSearXNG أطرًا مسجلة وتُبلغ أنها غير متاحة عند تكوينها.

compression

ضغط الجلسة الدلالي. تجريبي فقط في v0.1.0.

{
"compression": {
"enabled": false,
"experimental": false,
"threshold": 0.50,
"targetRatio": 0.20,
"protectFirstTurns": 3,
"protectLastTurns": 20
}
}

يجب أن يكون كل من enabled و experimental true حتى يُفعّل الضغط.

externalMemory / external_memory

استدعاء خارجي اختياري ونسخ متطابق. معطل افتراضيًا.

{
"externalMemory": {
"enabled": false,
"provider": "file",
"timeoutMs": 750,
"maxResults": 3,
"maxChars": 2500,
"mirrorWrites": false
}
}

فقط موفر file المدمج مُنفذ. المسارات المطلقة مرفوضة.

browser

اختيار خلفية المتصفح.

{
"browser": {
"backend": "local-cdp",
"supervised": true,
"autoLaunch": true,
"launchExecutable": "/path/to/chrome",
"launchArgs": ["--headless=new"],
"chromeFlags": ["--no-first-run"],
"summarizeSnapshots": "auto",
"snapshotSummarizeThreshold": 8000
}
}

يدعم local-cdp الاتصال اليدوي عبر CDP والتشغيل التلقائي المُشرف عليه. استخدم launchExecutable وlaunchArgs وchromeFlags لإعداد التشغيل المنظم. يبقى launchCommand مقبولًا فقط كبيانات توافق مهملة ولا يُحلل كـ shell.

المفتاحالنوعملاحظات
browser.launchExecutablestringمسار Chrome/Chromium الصريح والمفضل للتشغيل التلقائي المحلي عبر CDP المُشرف عليه.
browser.launchArgsstring arrayوسائط تشغيل منظمة. كرر --launch-arg في إعداد CLI للإضافة.
browser.chromeFlagsstring arrayأعلام Chrome منظمة. كرر --chrome-flag في إعداد CLI للإضافة.
browser.launchCommandstringبيانات توافق مهملة فقط. لا تُقسم ولا تُخمن ولا تُحلل كـ shell.
browser.hybridRoutingbooleanيوجّه عناوين HTTP(S) العامة إلى السحابة والعناوين الخاصة/الداخلية المسموحة إلى المحلي عند الإعداد. لا يتجاوز أمان URL.
browser.cloudFallbackbooleanيسمح لإخفاقات Browserbase المؤهلة بالرجوع إلى المحلي. إخفاقات موافقة الإنفاق لا ترجع.
browser.cloudSpendApprovedboolean أو "pending"موافقة صريحة لإنشاء جلسات متصفح سحابية قابلة للفوترة. بيانات الاعتماد وحدها لا توافق على الإنفاق.
browser.summarizeSnapshotsboolean أو "auto"يتحكم في إمكانية تلخيص اللقطات المعروضة الضخمة.
browser.snapshotSummarizeThresholdnumberعتبة أحرف عرض اللقطة قبل التفكير في التلخيص.

Browserbase مُنفّذ عبر خلفية المتصفح، ويتطلب BROWSERBASE_API_KEY وBROWSERBASE_PROJECT_ID وbrowser.cloudSpendApproved: true صريحة قبل إنشاء جلسات قابلة للفوترة. يضبط estacoda browser approve-cloud الموافقة، ويعطلها estacoda browser revoke-cloud. الإعداد وحده لا ينشئ جلسات Browserbase. تبقى browser-use وFirecrawl browser وCamofox مزودات مؤجلة.

يتبع التوجيه الهجين سياسة أمان URL للمتصفح: تبقى العناوين الخاصة/الداخلية محظورة ما لم تكن security.allowPrivateUrls مفعّلة صراحةً، وتبقى نقاط metadata محظورة دائمًا، وتُفرّغ التحويلات غير الآمنة إلى about:blank عندما يمكن ذلك أو تُغلق الجلسة غير الآمنة.

imageGen / image_gen

مزود توليد الصور والنموذج.

{
"imageGen": {
"provider": "fal",
"model": "fal-ai/flux-2/klein/9b",
"useGateway": false
}
}

المزودون المدعومون: fal، byteplus، openai.

tts

مزود تحويل النص إلى كلام وإعدادات الصوت.

{
"tts": {
"enabled": true,
"provider": "edge",
"edge": {
"voice": "en-US-AriaNeural",
"speed": 1.0
}
}
}

TTS المُنفذ: OpenAI، ElevenLabs، MiniMax، Gemini، xAI، و Edge. لا يتطلب Edge مفتاح API، لكنه شبكي: يُرسل نص التوليف إلى خدمة Microsoft Edge speech، ويكون الخرج MP3 (audio/mpeg). مزودا TTS المحليان/offline neutts و kittentts، و Mistral TTS، مؤجلون.

يسأل الإعداد التفاعلي عن مزود TTS فقط. يستخدم الإعدادات الافتراضية للتشغيل للنماذج والأصوات وإعدادات المزود، ويجمع مفاتيح API للمزودين المستضافين عبر إدخال masked. تخزن الإعدادات مراجع متغيرات البيئة مثل apiKeyEnv، بينما تُكتب قيم الأسرار المحلية للملف الشخصي إلى .env فقط بعد review/apply. تبقى أعلام CLI المباشرة للمشغل مثل estacoda voice setup --tts-model و--tts-api-key-env و--tts-api-key متاحة للإعداد عبر السكربتات.

stt

مزود تحويل الكلام إلى نص والنموذج.

{
"stt": {
"enabled": true,
"provider": "openai",
"openai": {
"model": "gpt-4o-mini-transcribe",
"apiKeyEnv": "VOICE_TOOLS_OPENAI_KEY"
}
}
}

STT المستضاف المستقر: OpenAI، Groq، xAI. STT المحلي يدعم command و faster-whisper. Mistral STT مؤجل.

يسأل الإعداد التفاعلي عن مزود STT فقط. يستخدم الإعدادات الافتراضية للتشغيل للنماذج وإعدادات المزود، ويجمع مفاتيح API للمزودين المستضافين عبر إدخال masked. تخزن الإعدادات مراجع متغيرات البيئة مثل apiKeyEnv، بينما تُكتب قيم الأسرار المحلية للملف الشخصي إلى .env فقط بعد review/apply. تبقى أعلام CLI المباشرة للمشغل مثل estacoda voice setup --stt-model و--stt-api-key-env و--stt-api-key متاحة للإعداد عبر السكربتات.

في v0.1.0، يعني stt.provider: "local" faster-whisper المُدار افتراضياً:

{
"stt": {
"provider": "local",
"local": {
"engine": "faster-whisper",
"model": "base",
"pythonBinary": "/optional/custom/python",
"fasterWhisper": {
"enabled": true,
"model": "base",
"device": "auto",
"computeType": "default",
"hfHome": "/optional/model-cache",
"allowModelDownload": true,
"gatewayAllowModelDownload": true,
"queueDepth": 1,
"timeoutMs": 300000
}
}
}
}

اترك pythonBinary غير مضبوط لاستخدام المسار المُدار تحت ~/.estacoda/python-env، أو اضبطه على Python يملكه المشغل عند استخدام estacoda voice setup --stt-provider local --python-binary /path/to/python. ذاكرة النموذج الافتراضية هي ~/.estacoda/cache/huggingface وهي منفصلة عن venv.

ترث تنزيلات النموذج عبر البوابة allowModelDownload. لأن allowModelDownload افتراضياً true، تكون تنزيلات التشغيل الأول التي تطلقها البوابة مسموحة افتراضياً؛ اضبط gatewayAllowModelDownload: false فقط عندما يجب أن تتطلب رسائل البوابة الصوتية نموذجاً مخزناً مسبقاً.

وضع الأوامر صريح:

{
"stt": {
"provider": "local",
"local": {
"engine": "command",
"command": "/path/to/transcriber {input}"
}
}
}

engine: "command" هو الحاكم ولا يستخدم faster-whisper المُدار.

voice

سلوك auto-TTS في البوابة.

{
"voice": {
"autoTts": false,
"autoTtsMaxCharsPerReply": 1200,
"autoTtsMaxCharsPerHourPerChat": 5000
}
}

mcpServers / mcp_servers

تعريفات خوادم MCP.

{
"mcpServers": {
"my-server": {
"command": "node",
"args": ["/path/to/server.js"],
"cwd": "/optional/cwd",
"env": { "KEY": "value" },
"includeTools": ["tool1"],
"excludeTools": ["tool2"],
"trust": "conservative",
"timeout": 30000
}
}
}

مستويات الثقة: conservative، read-only-network، read-only-local.

skills

تحميل المهارات وسياسة Agent Evolution.

{
"skills": {
"autonomy": "suggest",
"externalDirs": ["/optional/external/skill/root"]
}
}

أوضاع الاستقلالية: none، suggest، proactive، autonomous.

skills.autonomy هو مفتاح التوافق المحفوظ لـ Agent Evolution. يتحكم في سلوك الأدلة وproposal القابل للمراجعة. وضع autonomous هو وضع ظل فقط: يسجّل القرارات للمراجعة ولا ينفذ ترقية تلقائية أو استرجاعًا تلقائيًا أو تعديلًا لملفات المهارات.

ui

تفضيلات واجهة المستخدم الطرفية.

{
"ui": {
"theme": "dark",
"locale": "en"
}
}

profile

بيانات وصفية للملف الشخصي.

{
"profile": {
"name": "work",
"description": "Production work profile"
}
}

security

وضع الأمان وتجاوزات السياسة.

{
"security": {
"mode": "adaptive",
"allowPrivateUrls": false,
"websiteBlocklist": {
"domains": ["*.example.com"]
}
}
}

الأوضاع: strict، adaptive، open. الافتراضي هو adaptive.

channels

إعدادات محول القنوات. راجع إعدادات القنوات للمخطط الكامل.

{
"channels": {
"telegram": {
"enabled": true,
"botTokenEnv": "ESTACODA_TELEGRAM_BOT_TOKEN",
"streaming": {
"enabled": true,
"editIntervalMs": 750,
"minInitialChars": 24,
"cursor": "▌",
"maxFloodStrikes": 2,
"cleanupFailedAttempts": true,
"transport": "auto",
"freshFinalAfterSeconds": 0
},
"busyPolicy": "reject",
"queueDepth": 3
}
}
}

الإعداد الموجّه لـ Telegram يخزن رمز البوت في .env الخاص بالملف الشخصي المحدد تحت ESTACODA_TELEGRAM_BOT_TOKEN، ويكتب botTokenEnv: "ESTACODA_TELEGRAM_BOT_TOKEN" في الإعدادات. يجب ألا يظهر رمز بوت Telegram الخام في مراجعة الإعدادات أو مخرجات الإعداد.

يُضبط بث Telegram تحت channels.telegram.streaming. يكون مفعلاً افتراضيًا لقنوات Telegram المُعدّة، ويؤثر في توصيل Telegram فقط. لتعطيله، اضبط channels.telegram.streaming.enabled على false. لا يغير حالة الجلسة، أو الذاكرة، أو الموافقات، أو تنفيذ الأدوات، أو المنتجات، أو response.text النهائي.

الإعدادالنوع / القيم المسموحةالافتراضيملاحظات
channels.telegram.streaming.enabledbooleantrueيفعّل بث Telegram للقنوات المُعدّة. اضبطه على false لتعطيله.
channels.telegram.streaming.editIntervalMsعدد صحيح غير سالب750فاصل تجميع تعديلات Telegram الجزئية.
channels.telegram.streaming.minInitialCharsعدد صحيح غير سالب24حد الأحرف المرئية بعد التصفية قبل أول إرسال جزئي.
channels.telegram.streaming.cursorstring"▌"مؤشر بث مؤقت يُلحق بالرسائل الجزئية.
channels.telegram.streaming.maxFloodStrikesعدد صحيح غير سالب2حد تدهور flood-control للدور النشط.
channels.telegram.streaming.cleanupFailedAttemptsbooleantrueحذف أو تحييد الرسائل المبثوثة المؤقتة بعد فشل المزود أو fallback.
channels.telegram.streaming.transport"auto"، "edit"، أو "draft""auto"يختار "auto" معاينات المسودات للرسائل المباشرة عند دعمها، وإلا يستخدم edit streaming. يستخدم "edit" تعديلات الرسائل العادية. يستخدم "draft" معاينات مسودات Telegram في الرسائل المباشرة فقط عندما يدعمها Bot API.
channels.telegram.streaming.freshFinalAfterSecondsعدد صحيح غير سالب0القيمة 0 تعطل fresh-final delivery. القيمة الموجبة ترسل الرد المكتمل كرسالة جديدة بعد ظهور المعاينة لذلك العدد من الثواني، ثم تحذف المعاينة best-effort.

يعمل بث Telegram قبل توجيه النص النهائي العادي. إذا لم يتمكن البث من توصيل الرد المكتمل، يرجع ChannelGateway إلى توصيل DeliveryRouter العادي. يستخدم البث الجزئي HTML escaping خفيفًا؛ أما التوصيل النهائي فيستخدم تنسيق Telegram العادي. تعتمد معاينات المسودات وrich message delivery على دعم Telegram وBot API. يكون rich message delivery انتهازيًا ويرجع إلى تنسيق Telegram العادي عندما يكون غير مدعوم، أو طويلًا جدًا، أو ملتبسًا. flood control، أو الحمولات الجزئية الكبيرة، أو حدود الموافقة، أو حدود المنتجات، أو فشل final edit تفرض fallback للنص النهائي العادي للدور النشط فقط. يبقى البث تجربة توصيل فقط؛ يبقى response.text النهائي هو المرجع.

التعامل مع الأسرار

  • تكتب عمليات إعداد المزود مفاتيح API الخام فقط إلى .env الخاص بالملف الشخصي المحدد، وليس إلى config.json. نقاط النهاية المحلية / الخاصة بلا اعتماد افتراضيًا، ولا تكتب مفتاحًا إلا عندما يقدمه المستخدم.
  • تعرض review manifests لإعداد Voice مراجع متغيرات البيئة فقط. لا تُخزن مفاتيح API الخام الخاصة بـ Voice في الإعدادات، ولا تظهر في review manifests، ولا تُدرج في prompt context.
  • يتم تعيين أذونات .env للملف الشخصي على 0600 عند الكتابة بواسطة مخزن الأسرار البيئية.
  • تحمّل إعدادات التشغيل .env الخاص بالملف الشخصي المحدد قبل التنفيذ.
  • لا تلصق أسرار حقيقية في مقتطفات الإعدادات.

التحقق من الصحة

يتحقق EstaCoda من الإعدادات أثناء التحميل. القيم غير الصالحة تعود إلى الإعدادات الافتراضية أو تُقيّد ضمن الحدود الآمنة. بيانات الاعتماد المطلوبة المفقودة تُنتج تلميحات تحتاج إلى إعداد، ولي أعطال.

صفحات ذات صلة