@gaodefa/daocore 2026.5.85 → 2026.5.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/acp/control-plane/manager.d.ts +2 -1
  2. package/dist/{agent-command-COFQwKxZ.d.ts → agent-command-DQ1XgXqe.d.ts} +2 -38
  3. package/dist/{agent-harness-WlBoSv-g.d.ts → agent-harness-Bt_1zRJ1.d.ts} +1 -1
  4. package/dist/build-info.json +2 -2
  5. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  6. package/dist/{channel-lifecycle-C4NrMjdz.d.ts → channel-lifecycle-BXdiTu_h.d.ts} +1 -0
  7. package/dist/{channel-pairing-ndZVB-VX.d.ts → channel-pairing-qPwn6FAN.d.ts} +1 -1
  8. package/dist/cli-startup-metadata.json +8 -8
  9. package/dist/control-ui/sw.js +2 -2
  10. package/dist/extensions/anthropic/doctor-contract-api.d.ts +1 -1
  11. package/dist/extensions/browser/test-support.d.ts +1 -1
  12. package/dist/extensions/google/doctor-contract-api.d.ts +1 -1
  13. package/dist/extensions/image-generation-core/api.d.ts +1 -1
  14. package/dist/extensions/imessage/message-tool-api.d.ts +1 -1
  15. package/dist/extensions/imessage/runtime-api.d.ts +1 -1
  16. package/dist/extensions/mattermost/runtime-api.d.ts +7 -7
  17. package/dist/extensions/signal/api.d.ts +1 -1
  18. package/dist/extensions/signal/runtime-api.d.ts +2 -2
  19. package/dist/extensions/telegram/api.d.ts +1 -1
  20. package/dist/extensions/video-generation-core/api.d.ts +1 -1
  21. package/dist/extensions/webhooks/runtime-api.d.ts +2 -2
  22. package/dist/{hook-runtime-Cms52qXe.d.ts → hook-runtime-BBONf8H3.d.ts} +1 -0
  23. package/dist/index.d.ts +1 -1
  24. package/dist/manager-DWN3qo90.d.ts +10 -0
  25. package/dist/{manager-CuzV3XAs.d.ts → manager.core-BRd2_lqA.d.ts} +1 -8
  26. package/dist/{pairing-challenge-EwSQYSud.d.ts → pairing-store-Cfy_zHzi.d.ts} +34 -34
  27. package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
  28. package/dist/plugin-sdk/src/commands/doctor.types.d.ts +0 -1
  29. package/dist/plugin-sdk/src/compat/legacy-names.d.ts +1 -1
  30. package/dist/plugin-sdk/src/plugins/manifest.d.ts +1 -1
  31. package/dist/reply-runtime-DUv2dRp3.d.ts +34 -0
  32. package/dist/{runtime-C3k-ZByi.d.ts → runtime-D21vC5Bd.d.ts} +1 -1
  33. package/dist/{runtime-api.actions-CzDO06T7.d.ts → runtime-api.actions-CClxRuYx.d.ts} +1 -1
  34. package/dist/{runtime-api.send-C_MjuzGA.d.ts → runtime-api.send-wXeDllRu.d.ts} +1 -1
  35. package/dist/{runtime-doctor-_yVIDUi3.d.ts → runtime-doctor-DVYwKwIT.d.ts} +0 -1
  36. package/dist/{send-DaFuA5cD.d.ts → send-D95RJNJM.d.ts} +0 -1
  37. package/dist/{send-CTDEXMPp.d.ts → send-DZ4YhPHH.d.ts} +1 -1
  38. package/dist/{send.types-DU1uiiR9.d.ts → send.types-_f4omMzG.d.ts} +0 -1
  39. package/dist/server-plugins-BVVgDSdq.d.ts +1 -0
  40. package/dist/subagent-registry-BVVgDSdq.d.ts +1 -0
  41. package/dist/subagent-registry-read-BVVgDSdq.d.ts +1 -0
  42. package/dist/task-registry-control.runtime.d.ts +1 -1
  43. package/dist/{test-fixtures-HY6a4nTW.d.ts → test-fixtures-xgg7UsEw.d.ts} +1 -0
  44. package/dist/test-support-BVVgDSdq.d.ts +1 -0
  45. package/dist/{typed-cases-BYRVKA1F.d.ts → typed-cases-v8PtmO3g.d.ts} +1 -1
  46. package/dist/{webhook-targets-DqetRJVn.d.ts → webhook-targets-C9cJD_kB.d.ts} +1 -1
  47. package/npm-shrinkwrap.json +2 -2
  48. package/package.json +1 -1
  49. package/dist/control-ui/apple-touch-icon.png +0 -0
  50. package/dist/control-ui/assets/agents-DHLE0HFl.js +0 -1008
  51. package/dist/control-ui/assets/ar-DmY3OKJ7.js +0 -2
  52. package/dist/control-ui/assets/channel-config-extras-CxFOBh-V.js +0 -2
  53. package/dist/control-ui/assets/channels-C6FcgeKY.js +0 -367
  54. package/dist/control-ui/assets/cron-SXiWM7mY.js +0 -1013
  55. package/dist/control-ui/assets/de-nNWCMyC9.js +0 -2
  56. package/dist/control-ui/assets/debug-B0jMeZzd.js +0 -97
  57. package/dist/control-ui/assets/es-BcdhLNdf.js +0 -2
  58. package/dist/control-ui/assets/fa-DbS2z7VZ.js +0 -2
  59. package/dist/control-ui/assets/fr-CBqvw0rY.js +0 -2
  60. package/dist/control-ui/assets/id-DXES9f6X.js +0 -2
  61. package/dist/control-ui/assets/index-BimYwq-S.css +0 -1
  62. package/dist/control-ui/assets/index-DL8I3w4m.js +0 -7373
  63. package/dist/control-ui/assets/instances-CzcXlcf6.js +0 -57
  64. package/dist/control-ui/assets/it-DpT4ZVOU.js +0 -2
  65. package/dist/control-ui/assets/ja-JP-D8RXA_04.js +0 -2
  66. package/dist/control-ui/assets/ko-5en8VO8w.js +0 -2
  67. package/dist/control-ui/assets/logs-UowLBcx5.js +0 -74
  68. package/dist/control-ui/assets/nl-Bb10QoRg.js +0 -2
  69. package/dist/control-ui/assets/nodes-elwKg1C7.js +0 -436
  70. package/dist/control-ui/assets/pl-Y8UIOEIm.js +0 -2
  71. package/dist/control-ui/assets/preview-BBw3vauN.js +0 -2
  72. package/dist/control-ui/assets/pt-BR-DDsy5M68.js +0 -2
  73. package/dist/control-ui/assets/push-subscription-TTvs1whj.js +0 -2
  74. package/dist/control-ui/assets/sessions-zRBKS883.js +0 -399
  75. package/dist/control-ui/assets/skills-Bdaz7HoH.js +0 -314
  76. package/dist/control-ui/assets/skills-shared-DMTrs8i3.js +0 -11
  77. package/dist/control-ui/assets/th-D_2DtFn6.js +0 -2
  78. package/dist/control-ui/assets/tr-DBsYZTmE.js +0 -2
  79. package/dist/control-ui/assets/uk-BUxHBc05.js +0 -2
  80. package/dist/control-ui/assets/vi-B67Eos5b.js +0 -2
  81. package/dist/control-ui/assets/zh-CN-1-UH_6gQ.js +0 -2
  82. package/dist/control-ui/assets/zh-TW-CA4YEnf2.js +0 -2
  83. package/dist/control-ui/favicon-32.png +0 -0
  84. package/dist/control-ui/favicon-512.png +0 -0
  85. package/dist/control-ui/favicon.ico +0 -0
  86. package/dist/control-ui/favicon.svg +0 -12
  87. package/dist/control-ui/index.html +0 -322
  88. package/dist/control-ui/manifest.webmanifest +0 -40
  89. package/dist/plugin-sdk/scripts/lib/plugin-sdk-doc-metadata.d.ts +0 -107
  90. /package/dist/{models-D6WT5XG8.d.ts → models-D6WT5XG82.d.ts} +0 -0
  91. /package/dist/{runtime-api-C7ToEUFX2.d.ts → runtime-api-C7ToEUFX.d.ts} +0 -0
@@ -1,2 +0,0 @@
1
- var e={common:{health:`الصحة`,ok:`حسنًا`,yes:`نعم`,no:`لا`,active:`نشط`,loading:`جارٍ التحميل…`,refreshing:`جارٍ التحديث…`,online:`متصل`,offline:`غير متصل`,connect:`اتصال`,connected:`متصل`,refresh:`تحديث`,reload:`إعادة التحميل`,reset:`إعادة تعيين`,probe:`فحص`,call:`اتصال`,confirm:`تأكيد`,cancel:`إلغاء`,next:`التالي`,back:`رجوع`,create:`إنشاء`,copy:`نسخ`,copied:`تم النسخ!`,copyCode:`نسخ الكود`,delete:`حذف`,dismiss:`تجاهل`,unselect:`إلغاء التحديد`,enabled:`مفعّل`,disabled:`معطّل`,none:`لا شيء`,na:`غير متوفر`,never:`أبدًا`,configured:`مهيأ`,running:`قيد التشغيل`,linked:`مرتبط`,mode:`الوضع`,system:`النظام`,light:`خفيف`,dark:`داكن`,baseUrl:`عنوان URL الأساسي`,lastStart:`آخر بدء`,lastProbe:`آخر فحص`,lastInbound:`آخر وارد`,lastConnect:`آخر اتصال`,lastMessage:`آخر رسالة`,authAge:`عمر المصادقة`,credential:`بيانات الاعتماد`,audience:`الجمهور`,publicKey:`المفتاح العام`,probeOk:`الفحص سليم`,probeFailed:`فشل الفحص`,reloadConfig:`إعادة تحميل الإعدادات`,loadConfig:`تحميل الإعدادات`,loadApprovals:`تحميل الموافقات`,settingsSections:`أقسام الإعدادات`,version:`الإصدار`,docs:`المستندات`,theme:`السمة`,colorMode:`وضع اللون`,colorModeOption:`وضع اللون: {mode}`,resources:`الموارد`,search:`بحث`,save:`حفظ`,saving:`جارٍ الحفظ…`,saveAndPublish:`حفظ ونشر`,importing:`جارٍ الاستيراد…`,importFromRelays:`الاستيراد من Relays`,showAdvanced:`إظهار المتقدم`,hideAdvanced:`إخفاء المتقدم`,unsavedChanges:`لديك تغييرات غير محفوظة`,secondsAgo:`قبل {count} ث`,working:`جارٍ العمل…`,showQr:`إظهار QR`,relink:`إعادة الربط`,waitForScan:`انتظار المسح`,logout:`تسجيل الخروج`},channels:{health:{title:`صحة القنوات`,subtitle:`لقطات حالة القنوات من Gateway.`,noSnapshotYet:`لا توجد لقطة بعد.`},generic:{subtitle:`حالة القناة وإعداداتها.`},gatewayUrlConfirmation:{title:`تغيير عنوان URL الخاص بـ Gateway`,subtitle:`سيؤدي هذا إلى إعادة الاتصال بخادم Gateway مختلف`,warning:`أكّد فقط إذا كنت تثق بهذا الرابط. يمكن للروابط الضارة أن تعرّض نظامك للخطر.`},nostr:{profile:`الملف الشخصي`,editProfile:`تعديل الملف الشخصي`,profilePicture:`صورة الملف الشخصي`,noProfile:`لم يتم تعيين ملف شخصي.`,noProfileHint:`انقر على "تعديل الملف الشخصي" لإضافة اسمك وسيرتك الذاتية وصورتك الرمزية.`,name:`الاسم`,displayName:`اسم العرض`,about:`نبذة`,advanced:`متقدم`,profilePicturePreview:`معاينة صورة الملف الشخصي`,account:`الحساب`,username:`اسم المستخدم`,usernameHelp:`اسم مستخدم قصير (مثال: satoshi)`,bio:`السيرة الذاتية`,bioPlaceholder:`أخبر الناس عن نفسك...`,bioHelp:`سيرة ذاتية أو وصف موجز`,displayNameHelp:`اسم العرض الكامل الخاص بك`,avatarUrl:`عنوان URL للصورة الرمزية`,avatarHelp:`عنوان URL بصيغة HTTPS لصورة ملفك الشخصي`,bannerUrl:`عنوان URL للّافتة`,bannerHelp:`عنوان URL بصيغة HTTPS لصورة لافتة`,website:`الموقع الإلكتروني`,websiteHelp:`موقعك الإلكتروني الشخصي`,nip05Identifier:`معرّف NIP-05`,nip05Help:`معرّف قابل للتحقق (مثال: you@domain.com)`,lightningAddress:`عنوان Lightning`,lightningHelp:`عنوان Lightning للإكراميات (LUD-16)`}},lazyView:{loadingTitle:`جارٍ تحميل اللوحة`,errorTitle:`فشل تحميل اللوحة`,errorSubtitle:`أعد تحميل الصفحة لتحميل أحدث حزمة Control UI، أو أعد المحاولة إذا فشل طلب الشبكة.`,retry:`إعادة المحاولة`,unknownError:`خطأ غير معروف في تحميل الوحدة.`},nodes:{binding:{loadConfigHint:`حمّل الإعدادات لتعديل الارتباطات.`,formModeHint:`بدّل تبويب الإعدادات إلى وضع النموذج لتعديل الارتباطات هنا.`,execNodeBinding:`ارتباط عقدة Exec`,execNodeBindingSubtitle:`ثبّت الوكلاء على عقدة محددة عند استخدام exec host=node.`,defaultBinding:`الارتباط الافتراضي`,defaultBindingHint:`يُستخدم عندما لا يتجاوز الوكلاء ارتباط العقدة.`,node:`العقدة`}},instances:{title:`المثيلات المتصلة`,subtitle:`إشارات الحضور من Gateway والعملاء.`,showHosts:`إظهار المضيفين وعناوين IP`,hideHosts:`إخفاء المضيفين وعناوين IP`,toggleHostVisibility:`تبديل إظهار المضيف`,noInstances:`لم يتم الإبلاغ عن أي مثيلات بعد.`,lastInput:`آخر إدخال {time}`,reason:`السبب {reason}`},sessionsView:{title:`الجلسات`,subtitle:`مفاتيح الجلسات النشطة والتجاوزات لكل جلسة.`,store:`المخزن: {path}`,active:`نشط`,limit:`الحد`,filters:`عوامل التصفية`,showFilters:`إظهار عوامل التصفية`,hideFilters:`إخفاء عوامل التصفية`,sourceFilters:`عوامل تصفية مصدر الجلسة`,global:`عام`,unknown:`غير معروف`,showArchived:`إظهار المؤرشفة`,activeTooltip:`تم التحديث خلال آخر {count} دقيقة.`,limitTooltip:`الحد الأقصى للجلسات المراد تحميلها.`,globalTooltip:`تضمين الجلسات العامة.`,unknownTooltip:`تضمين الجلسات غير المعروفة.`,showArchivedTooltip:`تضمين الجلسات المؤرشفة.`,minutesPlaceholder:`دقيقة`,searchPlaceholder:`تصفية حسب المفتاح أو الوكيل أو التسمية أو النوع…`,selected:`تم تحديد {count}`,deleteSelected:`حذف`,selectAllOnPage:`تحديد الكل في الصفحة`,selectSession:`تحديد الجلسة`,optionalPlaceholder:`(اختياري)`,key:`المفتاح`,label:`التسمية`,kind:`النوع`,updated:`تم التحديث`,tokens:`الرموز`,compaction:`الضغط`,thinking:`التفكير`,fast:`سريع`,verbose:`مطوّل`,reasoning:`الاستدلال`,noSessions:`لم يتم العثور على جلسات.`,noSessionsMatchFilters:`لا توجد جلسات تطابق عوامل التصفية لديك.`,showAll:`عرض الكل`,inherit:`وراثة`,defaultOption:`الافتراضي ({value})`,offExplicit:`إيقاف (صريح)`,on:`تشغيل`,off:`متوقف`,full:`كامل`,stream:`تدفّق`,customOption:`{value} (مخصّص)`,manual:`يدوي`,autoThreshold:`عتبة تلقائية`,overflowRetry:`إعادة المحاولة عند التجاوز`,timeoutRetry:`إعادة المحاولة عند انتهاء المهلة`,tokenRange:`{before} to {after} رموز`,tokensBefore:`{count} رموز قبل`,tokenDeltaUnavailable:`تغيّر الرموز غير متاح`,checkpoints:`{count} نقاط تحقق`,checkpoint:`{count} نقطة تحقق`,showSessionDetails:`عرض تفاصيل الجلسة لـ {count}`,hideSessionDetails:`إخفاء تفاصيل الجلسة لـ {count}`,sessionDetails:`تفاصيل الجلسة`,compactionHistory:`سجل الضغط`,status:`الحالة`,statusLive:`مباشر`,statusIdle:`خامل`,statusUnknown:`غير معروف`,statusRunning:`قيد التشغيل`,statusDone:`مكتمل`,statusFailed:`فشل`,statusKilled:`تم الإنهاء`,statusTimeout:`انتهت المهلة`,model:`النموذج`,provider:`المزود`,runtime:`وقت التشغيل`,surface:`السطح`,subject:`الموضوع`,room:`الغرفة`,space:`المساحة`,sessionId:`معرّف الجلسة`,activeRun:`تشغيل نشط`,archived:`مؤرشف`,loadingCheckpoints:`جارٍ تحميل نقاط التحقق…`,noCheckpoints:`لم تُسجَّل نقاط تحقق للضغط لهذه الجلسة.`,noSummary:`لم يتم التقاط أي ملخص.`,branchFromCheckpoint:`إنشاء فرع من نقطة التحقق`,restoreCheckpoint:`استعادة نقطة التحقق`},agents:{noAgents:`لا توجد وكلاء`,copyId:`نسخ المعرّف`,copyIdTitle:`نسخ معرّف الوكيل إلى الحافظة`,default:`افتراضي`,setDefault:`تعيين كافتراضي`,alreadyDefaultTitle:`الوكيل الافتراضي بالفعل`,setDefaultTitle:`تعيينه كوكيل افتراضي`,selectTitle:`اختر وكيلاً`,selectSubtitle:`اختر وكيلاً لفحص مساحة العمل والأدوات الخاصة به.`,tabs:{overview:`نظرة عامة`,files:`الملفات`,tools:`الأدوات`,skills:`Skills`,channels:`القنوات`,cronJobs:`مهام Cron`},context:{title:`سياق الوكيل`,workspace:`مساحة العمل`,openFilesTab:`فتح تبويب الملفات`,primaryModel:`النموذج الأساسي`,runtime:`وقت التشغيل`,identityName:`اسم الهوية`,identityAvatar:`صورة الهوية`,skillsFilter:`مرشح Skills`,default:`افتراضي`,configurationSubtitle:`تكوين مساحة العمل والهوية والنموذج.`,schedulingSubtitle:`مساحة العمل وأهداف الجدولة.`},channels:{title:`القنوات`,subtitle:`لقطة لحالة القنوات على مستوى Gateway.`,lastRefresh:`آخر تحديث: {time}`,loadHint:`حمّل القنوات لرؤية الحالة المباشرة.`,empty:`لم يتم العثور على قنوات.`,connectedCount:`{connected}/{total} متصلة`,noAccounts:`لا توجد حسابات`,configuredCount:`تم تكوين {count}`,notConfigured:`غير مكوّن`,enabledCount:`تم تمكين {count}`,setupGuide:`دليل الإعداد`},cronPanel:{schedulerTitle:`المجدول`,schedulerSubtitle:`حالة cron في Gateway.`,jobs:`المهام`,nextWake:`وقت التنبيه التالي`,agentJobsTitle:`مهام Cron للوكيل`,agentJobsSubtitle:`المهام المجدولة التي تستهدف هذا الوكيل.`,noJobs:`لا توجد مهام معينة.`,runNow:`تشغيل الآن`},files:{emptyDraft:`مسودة فارغة`,minRead:`{count} دقيقة قراءة`,markdownPreview:`معاينة Markdown`,extensionPreview:`معاينة {ext}`,preview:`معاينة`,expandPreview:`توسيع المعاينة`,collapsePreview:`طي المعاينة`,editFile:`تحرير الملف`,closePreview:`إغلاق المعاينة`,coreFilesTitle:`الملفات الأساسية`,coreFilesSubtitle:`إرشادات تمهيد الشخصية والهوية والأدوات.`,workspace:`مساحة العمل`,loadHint:`حمّل ملفات مساحة عمل الوكيل لتحرير التعليمات الأساسية.`,empty:`لم يتم العثور على ملفات.`,missing:`مفقود`,selectFile:`اختر ملفًا لتحريره.`,previewMarkdownTitle:`معاينة Markdown المعروض`,willCreateOnSave:`سيتم إنشاؤه عند الحفظ`,liveDraftPreview:`معاينة المسودة المباشرة`,savedPreview:`المعاينة المحفوظة`,updated:`تم التحديث {time}`,notCreatedYet:`لم يتم إنشاؤه بعد`,updatedUnknown:`تحديث غير معروف`,missingHint:`هذا الملف مفقود. سيؤدي الحفظ إلى إنشائه في مساحة عمل الوكيل.`,content:`المحتوى`,words:`{count} كلمة`,lines:`أسطر`}},debug:{snapshotsTitle:`اللقطات`,snapshotsSubtitle:`بيانات الحالة والسلامة ونبضات القلب.`,status:`الحالة`,health:`السلامة`,lastHeartbeat:`آخر نبضة قلب`,security:{audit:`تدقيق الأمان`,critical:`{count} حرجة`,warnings:`{count} تحذيرات`,noCriticalIssues:`لا توجد مشكلات حرجة`,info:`{count} معلومات`,runPrefix:`شغّل`,runSuffix:`للحصول على التفاصيل.`},manualRpcTitle:`RPC يدوي`,manualRpcSubtitle:`أرسل طريقة Gateway أولية مع معلمات JSON.`,method:`الطريقة`,selectMethod:`اختر طريقة…`,paramsJson:`المعلمات (JSON)`,modelsTitle:`النماذج`,modelsSubtitle:`الكتالوج من models.list.`,eventLogTitle:`سجل الأحداث`,eventLogSubtitle:`أحدث أحداث Gateway.`,noEvents:`لا توجد أحداث بعد.`},quickSettings:{security:{browserEnabled:`Browser enabled`,toolProfile:`Tool profile`}},execApproval:{expiresIn:`تنتهي خلال {time}`,expired:`منتهية الصلاحية`,execApprovalNeeded:`يلزم اعتماد Exec`,pluginApprovalNeeded:`يلزم اعتماد المكوّن الإضافي`,pending:`{count} قيد الانتظار`,allowOnce:`السماح مرة واحدة`,alwaysAllow:`السماح دائمًا`,deny:`رفض`,labels:{host:`المضيف`,agent:`الوكيل`,session:`الجلسة`,cwd:`CWD`,resolved:`تم الحل`,security:`الأمان`,ask:`السؤال`,severity:`الخطورة`,plugin:`المكوّن الإضافي`}},agentTools:{connectedSource:`متصل: {id}`,connected:`متصل`,channelSource:`القناة: {id}`,channel:`القناة`,builtIn:`مدمج`},nav:{chat:`الدردشة`,control:`التحكم`,agent:`الوكيل`,settings:`الإعدادات`,expand:`توسيع الشريط الجانبي`,collapse:`طي الشريط الجانبي`,resize:`تغيير حجم الشريط الجانبي`},tabs:{agents:`الوكلاء`,overview:`نظرة عامة`,channels:`القنوات`,instances:`المثيلات`,sessions:`الجلسات`,usage:`الاستخدام`,cron:`مهام Cron`,skills:`Skills`,nodes:`العقد`,chat:`الدردشة`,config:`الإعدادات`,communications:`الاتصالات`,appearance:`المظهر`,automation:`الأتمتة`,infrastructure:`البنية التحتية`,aiAgents:`الذكاء الاصطناعي والوكلاء`,debug:`تصحيح الأخطاء`,logs:`السجلات`,dreams:`الحلم`},subtitles:{agents:`مساحات العمل، والأدوات، والهويات.`,overview:`الحالة، ونقاط الدخول، والصحة.`,channels:`القنوات والإعدادات.`,instances:`العملاء والعقد المتصلة.`,sessions:`الجلسات النشطة والافتراضيات.`,usage:`استخدام API والتكاليف.`,cron:`الإيقاظات والتشغيلات المتكررة.`,skills:`Skills ومفاتيح API.`,nodes:`الأجهزة المقترنة والأوامر.`,chat:`دردشة Gateway للتدخلات السريعة.`,config:`تعديل daocore.json.`,communications:`القنوات، والرسائل، وإعدادات الصوت.`,appearance:`السمة، وواجهة المستخدم، وإعدادات معالج الإعداد.`,automation:`الأوامر، والخطافات، وcron، والمكونات الإضافية.`,infrastructure:`إعدادات Gateway، والويب، والمتصفح، والوسائط.`,aiAgents:`الوكلاء، والنماذج، والمهارات، والأدوات، والذاكرة، والجلسة.`,debug:`اللقطات، والأحداث، وRPC.`,logs:`سجلات Gateway المباشرة.`,dreams:`حلم الذاكرة، والدمج، والتأمل.`},overview:{access:{title:`الوصول إلى Gateway`,subtitle:`مكان اتصال لوحة المعلومات وكيفية مصادقتها.`,wsUrl:`عنوان URL لـ WebSocket`,token:`رمز Gateway`,password:`كلمة المرور (غير مخزنة)`,passwordPlaceholder:`كلمة مرور النظام أو كلمة مرور مشتركة`,sessionKey:`مفتاح الجلسة الافتراضي`,language:`اللغة`,connectHint:`انقر على اتصال لتطبيق تغييرات الاتصال.`,trustedProxy:`تمت المصادقة عبر وكيل موثوق.`,showToken:`إظهار الرمز`,hideToken:`إخفاء الرمز`,toggleTokenVisibility:`تبديل ظهور الرمز`,showPassword:`إظهار كلمة المرور`,hidePassword:`إخفاء كلمة المرور`,togglePasswordVisibility:`تبديل ظهور كلمة المرور`},snapshot:{title:`لقطة`,subtitle:`أحدث معلومات مصافحة Gateway.`,status:`الحالة`,uptime:`مدة التشغيل`,tickInterval:`فاصل النبض`,lastChannelsRefresh:`آخر تحديث للقنوات`,channelsHint:`استخدم القنوات لربط WhatsApp أو Telegram أو Discord أو Signal أو iMessage.`},stats:{instances:`المثيلات`,instancesHint:`إشارات الحضور في آخر 5 دقائق.`,sessions:`الجلسات`,sessionsHint:`مفاتيح الجلسات الحديثة التي يتتبعها Gateway.`,cron:`Cron`,cronNext:`التنبيه التالي {time}`},notes:{title:`ملاحظات`,subtitle:`تذكيرات سريعة لإعدادات التحكم عن بُعد.`,tailscaleTitle:`خدمة Tailscale`,tailscaleText:`فضّل وضع الخدمة لإبقاء Gateway على loopback مع مصادقة tailnet.`,sessionTitle:`نظافة الجلسات`,sessionText:`استخدم /new أو sessions.patch لإعادة تعيين السياق.`,cronTitle:`تذكيرات Cron`,cronText:`استخدم جلسات معزولة للتشغيلات المتكررة.`},auth:{required:`يتطلب هذا Gateway مصادقة. أضف رمزًا أو كلمة مرور، ثم انقر على اتصال.`,failed:`فشلت المصادقة. أعد نسخ عنوان URL مزود برمز باستخدام {command}، أو حدّث الرمز، ثم انقر على اتصال.`},pairing:{hint:`يحتاج هذا الجهاز إلى موافقة الاقتران من مضيف Gateway.`,scopeUpgradeTitle:`ترقية النطاق بانتظار الموافقة.`,scopeUpgradeSummary:`هذا الجهاز مقترن بالفعل، لكن النطاق الأوسع المطلوب بانتظار الموافقة.`,roleUpgradeTitle:`ترقية الدور بانتظار الموافقة.`,roleUpgradeSummary:`هذا الجهاز مقترن بالفعل، لكن تغيير الدور المطلوب بانتظار الموافقة.`,metadataUpgradeTitle:`تغيير بيانات تعريف الجهاز بانتظار الموافقة.`,metadataUpgradeSummary:`هذا الجهاز مقترن بالفعل، لكن تغيير بيانات التعريف بانتظار الموافقة.`,mobileHint:`على الهاتف؟ انسخ عنوان URL الكامل (بما في ذلك #token=...) من daocore dashboard --no-open على سطح المكتب.`,docsTitle:`مستندات اقتران الأجهزة (تُفتح في تبويب جديد)`,docsLink:`المستندات: اقتران الأجهزة`},insecure:{hint:`هذه الصفحة تستخدم HTTP، لذا يحظر المتصفح هوية الجهاز. استخدم HTTPS (Tailscale Serve) أو افتح {url} على مضيف Gateway.`,stayHttp:`إذا كان لا بد من البقاء على HTTP، فعيّن {config} (رمز فقط).`},connection:{title:`كيفية الاتصال`,step1:`ابدأ Gateway على جهازك المضيف:`,step2:`احصل على عنوان URL للوحة المعلومات مزود برمز:`,step3:`الصق عنوان URL لـ WebSocket والرمز أعلاه، أو افتح عنوان URL المزود برمز مباشرةً.`,step4:`أو أنشئ رمزًا قابلًا لإعادة الاستخدام:`,docsHint:`للوصول عن بُعد، يُوصى باستخدام Tailscale Serve. `,docsLink:`اقرأ المستندات →`,authDocsTitle:`مستندات مصادقة Control UI (تُفتح في تبويب جديد)`,authDocsLink:`المستندات: مصادقة Control UI`,tailscaleDocsTitle:`مستندات Tailscale Serve (تُفتح في تبويب جديد)`,tailscaleDocsLink:`المستندات: Tailscale Serve`,insecureHttpDocsTitle:`مستندات HTTP غير الآمن (تُفتح في تبويب جديد)`,insecureHttpDocsLink:`المستندات: HTTP غير الآمن`,copyCommand:`نسخ الأمر`,copyCommandAria:`نسخ الأمر: {command}`},cards:{cost:`التكلفة`,skills:`Skills`,recentSessions:`الجلسات الأخيرة`,modelAuth:`مصادقة النموذج`,modelAuthOk:`{count} سليم`,modelAuthExpired:`{count} منتهية`,modelAuthExpiring:`{count} توشك على الانتهاء`,modelAuthProviders:`{count} مزودين`,modelAuthUsageLeft:`متبقٍ {pct}%`,modelAuthExpiresIn:`ينتهي {when}`,modelAuthAttentionExpiredTitle:`انتهت صلاحية مصادقة النموذج`,modelAuthAttentionExpiringTitle:`ستنتهي صلاحية مصادقة النموذج قريبًا`,modelAuthAttentionExpiredDesc:`{providers} — أعد المصادقة باستخدام daocore models auth`,modelAuthAttentionExpiringEntry:`{provider} ({when})`},attention:{title:`تنبيه`},eventLog:{title:`سجل الأحداث`},logTail:{title:`سجلات Gateway`},quickActions:{newSession:`جلسة جديدة`,automation:`الأتمتة`,refreshAll:`تحديث الكل`,terminal:`الطرفية`},palette:{placeholder:`اكتب أمرًا…`,noResults:`لا توجد نتائج`,categories:{search:`بحث`,navigation:`التنقل`,skills:`Skills`},items:{overview:`نظرة عامة`,sessions:`الجلسات`,scheduled:`مجدولة`,skills:`Skills`,settings:`الإعدادات`,agents:`الوكلاء`,shellCommand:`أمر Shell`,debugMode:`وضع تصحيح الأخطاء`},descriptions:{shellCommand:`تشغيل shell`,debugMode:`تبديل تصحيح الأخطاء`},footer:{navigate:`تنقل`,select:`تحديد`,close:`إغلاق`}}},dreaming:{tabs:{scene:`المشهد`,diary:`اليوميات`,advanced:`متقدم`},header:{refresh:`تحديث`,refreshing:`جارٍ التحديث…`,on:`الحلم مفعّل`,off:`الحلم متوقف`},restartConfirmation:{title:`أعد تشغيل Gateway لتطبيق التغيير`,subtitle:`يؤدي تغيير وضع الحلم إلى إعادة تشغيل Gateway.`,warning:`سيؤدي هذا الإجراء إلى إعادة تشغيل Gateway وقد يقطع مؤقتًا الدردشات، والأتمتة، والقنوات المتصلة.`,confirm:`تأكيد إعادة التشغيل`,restarting:`جارٍ إعادة التشغيل…`,failed:`تعذر تطبيق التغيير. تحقق من اتصالك وحاول مرة أخرى.`},status:{active:`الحلم نشط`,idle:`الحلم خامل`,promotedSuffix:`تمت ترقيته`,nextSweepPrefix:`الفحص التالي`},scene:{backfill:`تعبئة بأثر رجعي`,dedupeDiary:`إزالة تكرار اليوميات`,reset:`إعادة تعيين`,clearGrounded:`مسح المُعاد تشغيله`,repairCache:`إصلاح ذاكرة التخزين المؤقت للحلم`,working:`جارٍ العمل…`},phase:{light:`خفيف`,deep:`عميق`,rem:`Rem`,off:`متوقف`},advanced:{eyebrow:`مراجعة`,title:`مراجعة السجل اليومي`,description:`راجع ما ورد من السجل اليومي، وما ينتظر الترقية، وما تمت ترقيته مؤخرًا.`,summaryFromDailyLog:`من السجل اليومي`,summaryWaiting:`بانتظار`,summaryPromotedToday:`تمت ترقيته اليوم`,stagedTitle:`من السجل اليومي`,stagedDescription:`مرشحو إعادة التشغيل المستخرجون من إدخالات السجل اليومي الأقدم.`,shortTermTitle:`بانتظار الترقية`,shortTermDescription:`المرشحون الحاليون قصيرو الأجل الذين ينتظرون الانتقال إلى الذاكرة الحقيقية.`,sortRecent:`الأحدث`,sortSignals:`أقوى دعم`,originDailyLog:`أُعيد تشغيله`,originLive:`مباشر`,originMixed:`مختلط`,promotedTitle:`الترقيات الأخيرة`,promotedDescription:`العناصر التي اجتازت الترقية بالفعل.`,emptyGrounded:`لا توجد إدخالات إعادة تشغيل مؤرضة مرحلية حاليًا.`,emptyShortTerm:`لا توجد إدخالات قصيرة الأجل لفحصها.`,emptyPromoted:`لا توجد ترقيات حديثة لفحصها.`,updatedPrefix:`تم التحديث`},stats:{shortTerm:`قصير الأجل`,grounded:`مؤرض`,signals:`الإشارات`,promoted:`تمت ترقيته`,phaseHits:`نتائج المراحل`},trace:{shortTerm:`قصير الأجل`,grounded:`مؤرض`,signals:`الإشارات`,promoted:`تمت ترقيته`,groundedLed:`تقوده العناصر المؤرضة`,emptyShortTerm:`لا توجد عناصر قصيرة الأجل نشطة.`,emptyGrounded:`لا توجد عناصر مؤرضة مرحلية.`,emptySignals:`لا توجد إشارات نشطة.`,emptyPromoted:`لم تتم ترقية أي شيء اليوم بعد.`},diary:{title:`يوميات الأحلام`,noDreamsYet:`لا توجد أحلام بعد`,noDreamsHint:`ستظهر الأحلام هنا بعد تشغيل أول دورة حلم.`,waitingTitle:`اليوميات بانتظار`,waitingHint:`ستظهر الإدخالات السردية بعد دورة الحلم التالية.`,older:`الأقدم`,newer:`الأحدث`,reload:`إعادة التحميل`,reloading:`جارٍ إعادة التحميل…`},phrases:{consolidatingMemories:`جارٍ دمج الذكريات…`,tidyingKnowledgeGraph:`جارٍ ترتيب الرسم البياني للمعرفة…`,replayingConversations:`جارٍ إعادة تشغيل محادثات اليوم…`,weavingShortTerm:`جارٍ نسج قصير الأجل في طويل الأجل…`,defragmentingMindPalace:`جارٍ إلغاء تجزئة قصر العقل…`,filingLooseThoughts:`جارٍ أرشفة الأفكار المتناثرة…`,connectingDots:`جارٍ وصل النقاط البعيدة…`,compostingContext:`جارٍ تدوير نوافذ السياق القديمة…`,alphabetizingSubconscious:`جارٍ ترتيب اللاوعي أبجديًا…`,promotingHunches:`جارٍ ترقية الحدوس الواعدة…`,forgettingNoise:`جارٍ نسيان ما لا يهم…`,dreamingEmbeddings:`جارٍ الحلم بالتضمينات…`,reorganizingAttic:`جارٍ إعادة تنظيم علية الذاكرة…`,indexingDay:`جارٍ فهرسة اليوم بلطف…`,nurturingInsights:`جارٍ رعاية الرؤى الناشئة…`,simmeringIdeas:`جارٍ إنضاج الأفكار نصف المتشكّلة…`,whisperingVectorStore:`جارٍ الهمس إلى مخزن المتجهات…`}},usage:{common:{emptyValue:`—`,unknown:`غير معروف`},loading:{title:`نظرة عامة على الاستخدام`,badge:`جارٍ التحميل`},metrics:{tokens:`الرموز`,cost:`التكلفة`,session:`جلسة`,sessions:`جلسات`},presets:{today:`اليوم`,last7d:`7 أيام`,last30d:`30 يومًا`,last90d:`90d`,last1y:`1y`,all:`الكل`},scope:{instance:`المثيل الحالي`,instanceHint:`اعرض فقط معرّف الجلسة النشطة لكل جلسة منطقية.`,family:`السلالة التاريخية`,familyHint:`اجمع معرّفات الجلسات المعروفة والمدعومة بالنصوص المنسوخة التي تم تدويرها.`,familyIncluded:`تتضمن السلالة التاريخية {count} من مثيلات الجلسات.`},filters:{title:`عوامل التصفية`,to:`إلى`,startDate:`تاريخ البدء`,endDate:`تاريخ الانتهاء`,timeZone:`المنطقة الزمنية`,timeZoneLocal:`محلي`,timeZoneUtc:`UTC`,pin:`تثبيت`,pinned:`مثبّتة`,unpin:`إلغاء تثبيت عوامل التصفية`,selectAll:`تحديد الكل`,clear:`مسح`,clearAll:`مسح الكل`,remove:`إزالة عامل التصفية`,all:`الكل`,days:`الأيام`,hours:`الساعات`,session:`الجلسة`,agent:`الوكيل`,channel:`القناة`,provider:`المزود`,model:`النموذج`,tool:`الأداة`,daysCount:`{count} يوم`,hoursCount:`{count} ساعة`,sessionsCount:`{count} جلسة`},query:{placeholder:`تصفية الجلسات (مثال: key:agent:main:cron* model:gpt-4o has:errors minTokens:2000)`,apply:`تصفية (من جهة العميل)`,matching:`{shown} من {total} جلسة متطابقة`,inRange:`{total} جلسة ضمن النطاق`,tip:`نصيحة: استخدم عوامل التصفية أو انقر على الأشرطة لتضييق الأيام.`},export:{label:`تصدير`,sessionsCsv:`CSV الجلسات`,dailyCsv:`CSV اليومي`,json:`JSON`},cacheStatus:{warning:`تجري إعادة بناء ذاكرة الاستخدام المؤقتة في الخلفية. قد تكون الإجماليات المعروضة قديمة.`,title:`{status}: {pending} معلّقة، {stale} قديمة، {cached} مخزّنة مؤقتًا`,status:{refreshing:`جارٍ التحديث`,stale:`قديم`,partial:`جزئي`}},empty:{title:`ابدأ بنطاق تاريخ`,subtitle:`حمّل بيانات الاستخدام لمقارنة التكاليف، وفحص الجلسات، والتعمق في الجداول الزمنية دون مغادرة لوحة المعلومات.`,hint:`حدد نطاق تاريخ وانقر على تحديث لتحميل الاستخدام.`,noData:`لا توجد بيانات`,featureOverview:`بطاقات النظرة العامة`,featureSessions:`ترتيب الجلسات`,featureTimeline:`التعمق في المخطط الزمني`},daily:{title:`الاستخدام اليومي`,total:`الإجمالي`,byType:`حسب النوع`,tokensTitle:`استخدام الرموز اليومي`,costTitle:`التكلفة اليومية`},breakdown:{output:`المخرجات`,input:`المدخلات`,cacheWrite:`كتابة ذاكرة التخزين المؤقت`,cacheRead:`قراءة ذاكرة التخزين المؤقت`,total:`الإجمالي`,tokensByType:`الرموز حسب النوع`,costByType:`التكلفة حسب النوع`},overview:{title:`نظرة عامة على الاستخدام`,messages:`الرسائل`,messagesHint:`إجمالي رسائل المستخدم والمساعد ضمن النطاق.`,messagesAbbrev:`رسائل`,user:`المستخدم`,assistant:`المساعد`,toolCalls:`استدعاءات الأدوات`,toolCallsHint:`إجمالي عدد استدعاءات الأدوات عبر الجلسات.`,toolsUsed:`الأدوات المستخدمة`,errors:`الأخطاء`,errorsHint:`إجمالي أخطاء الرسائل والأدوات ضمن النطاق.`,toolResults:`نتائج الأدوات`,avgTokens:`متوسط الرموز / رسالة`,avgTokensHint:`متوسط الرموز لكل رسالة في هذا النطاق.`,avgCost:`متوسط التكلفة / رسالة`,avgCostHint:`متوسط التكلفة لكل رسالة عندما يبلّغ المزودون عن التكاليف.`,avgCostHintMissing:`متوسط التكلفة لكل رسالة عندما يبلّغ المزودون عن التكاليف. بيانات التكلفة مفقودة لبعض الجلسات أو كلها في هذا النطاق.`,acrossMessages:`عبر {count} رسالة`,sessions:`الجلسات`,sessionsHint:`الجلسات المميزة ضمن النطاق.`,sessionsInRange:`من {count} ضمن النطاق`,throughput:`معدل الإنتاجية`,throughputHint:`يعرض معدل الإنتاجية الرموز في الدقيقة خلال الوقت النشط. الأعلى أفضل.`,tokensPerMinute:`رمز/دقيقة`,perMinute:`/ دقيقة`,errorRate:`معدل الأخطاء`,errorHint:`معدل الأخطاء = الأخطاء / إجمالي الرسائل. الأقل أفضل.`,avgSession:`متوسط الجلسة`,cacheHitRate:`معدل إصابة ذاكرة التخزين المؤقت`,cacheHint:`معدل إصابة ذاكرة التخزين المؤقت = قراءة ذاكرة التخزين المؤقت / (الإدخال + قراءة ذاكرة التخزين المؤقت + كتابة ذاكرة التخزين المؤقت). الأعلى أفضل.`,cached:`مخزن مؤقتًا`,prompt:`المطالبة`,calls:`الاستدعاءات`,topModels:`أهم النماذج`,topProviders:`أهم المزودين`,topTools:`أهم الأدوات`,topAgents:`أهم الوكلاء`,topChannels:`أهم القنوات`,peakErrorDays:`أيام ذروة الأخطاء`,peakErrorHours:`ساعات ذروة الأخطاء`,noModelData:`لا توجد بيانات نماذج`,noProviderData:`لا توجد بيانات مزودين`,noToolCalls:`لا توجد استدعاءات أدوات`,noAgentData:`لا توجد بيانات وكلاء`,noChannelData:`لا توجد بيانات قنوات`,noErrorData:`لا توجد بيانات أخطاء`},sessions:{title:`الجلسات`,shown:`{count} معروضة`,total:`{count} إجماليًا`,avg:`متوسط`,all:`الكل`,recent:`تم عرضها مؤخرًا`,recentShort:`حديثة`,sort:`فرز`,ascending:`تصاعدي`,descending:`تنازلي`,clearSelection:`مسح التحديد`,noRecent:`لا توجد جلسات حديثة`,noneInRange:`لا توجد جلسات ضمن النطاق`,more:`+{count} أخرى`,selected:`المحدد ({count})`,copy:`نسخ`,copyName:`نسخ اسم الجلسة`,limitReached:`يتم عرض أول 1,000 جلسة. ضيّق نطاق التاريخ للحصول على النتائج الكاملة.`},details:{noUsageData:`لا توجد بيانات استخدام لهذه الجلسة.`,duration:`المدة`,modelMix:`مزيج النماذج`,filtered:`(مفلتر)`,close:`إغلاق تفاصيل الجلسة`,noTimeline:`لا توجد بيانات مخطط زمني`,noDataInRange:`لا توجد بيانات ضمن النطاق`,usageOverTime:`الاستخدام بمرور الوقت`,reset:`إعادة تعيين`,perTurn:`لكل دور`,cumulative:`تراكمي`,turnRange:`الأدوار {start}–{end} من {total}`,assistantOutputTokens:`رموز مخرجات المساعد`,userToolInputTokens:`رموز إدخال المستخدم + الأداة`,tokensWrittenToCache:`الرموز المكتوبة إلى ذاكرة التخزين المؤقت`,tokensReadFromCache:`الرموز المقروءة من ذاكرة التخزين المؤقت`,noContextData:`لا توجد بيانات سياق`,systemPromptBreakdown:`تفصيل مطالبة النظام`,collapse:`طي`,collapseAll:`طي الكل`,expandAll:`توسيع الكل`,baseContextPerMessage:`السياق الأساسي لكل رسالة`,system:`النظام`,systemShort:`نظام`,skills:`Skills`,tools:`الأدوات`,files:`الملفات`,ofInput:`من الإدخال`,of:`من`,timelineFiltered:`المخطط الزمني مفلتر`,conversation:`المحادثة`,noMessages:`لا توجد رسائل`,tool:`الأداة`,toolResult:`نتيجة الأداة`,hasTools:`يتضمن أدوات`,searchConversation:`البحث في المحادثة`,you:`أنت`,noMessagesMatch:`لا توجد رسائل تطابق عوامل التصفية.`},mosaic:{title:`النشاط حسب الوقت`,subtitleEmpty:`تتطلب التقديرات طوابع زمنية للجلسات.`,subtitle:`مقدّر من نطاقات الجلسات (أول/آخر نشاط). المنطقة الزمنية: {zone}.`,noTimelineData:`لا توجد بيانات مخطط زمني بعد.`,dayOfWeek:`يوم الأسبوع`,midnight:`منتصف الليل`,fourAm:`4 ص`,eightAm:`8 ص`,noon:`الظهر`,fourPm:`4 م`,eightPm:`8 م`,legend:`كثافة رموز منخفضة → عالية`,sun:`الأحد`,mon:`الاثنين`,tue:`الثلاثاء`,wed:`الأربعاء`,thu:`الخميس`,fri:`الجمعة`,sat:`السبت`}},login:{subtitle:`لوحة معلومات Gateway`,passwordPlaceholder:`اختياري`,showToken:`إظهار الرمز`,hideToken:`إخفاء الرمز`,toggleTokenVisibility:`تبديل ظهور الرمز`,showPassword:`إظهار كلمة المرور`,hidePassword:`إخفاء كلمة المرور`,togglePasswordVisibility:`تبديل ظهور كلمة المرور`,failure:{rawError:`الخطأ الخام`,docsAuth:`وثائق مصادقة Control UI`,docsPairing:`وثائق إقران الجهاز`,docsInsecure:`وثائق HTTP غير الآمن`,authRequired:{title:`المصادقة مطلوبة`,summary:`يمكن الوصول إلى Gateway، لكنه يحتاج إلى رمز مميز أو كلمة مرور مطابقة قبل أن يتمكن هذا المتصفح من الاتصال.`,stepPaste:`الصق الرمز المميز من daocore dashboard --no-open أو أدخل كلمة المرور المكونة.`,stepGenerate:`إذا لم يتم تكوين رمز مميز، فشغل daocore doctor --generate-gateway-token على مضيف Gateway.`,stepConnect:`انقر على Connect مرة أخرى بعد تحديث بيانات الاعتماد.`},authFailed:{title:`بيانات المصادقة غير مطابقة`,summary:`تم رفض بيانات الاعتماد المقدمة. السبب الأكثر شيوعا هو رمز مميز قديم أو رمز منسوخ من عنوان Gateway آخر.`,stepDashboard:`شغل daocore dashboard --no-open وافتح عنوان URL الجديد أو الصق رمزه المميز.`,stepReplace:`استبدل قيم الرمز المميز/كلمة المرور القديمة؛ لا تعد استخدام رمز من عنوان Gateway آخر.`,stepMode:`استخدم وضع مصادقة مطابقا واحدا في كل مرة: رمز gateway لوضع الرمز، أو كلمة المرور لوضع كلمة المرور.`},rateLimited:{title:`محاولات فاشلة كثيرة جدا`,summary:`يقيد Gateway مؤقتا محاولات المصادقة لهذا العميل.`,stepStop:`توقف عن إعادة المحاولة من هذه علامة التبويب للحظة.`,stepWait:`انتظر حتى يهدأ محدد المصادقة، ثم أعد الاتصال ببيانات الاعتماد المصححة.`,stepCheckClients:`إذا كان هذا مضيفا مشتركا، فتحقق من العملاء الآخرين بحثا عن محاولات سيئة متكررة.`},pairing:{title:`إقران الجهاز مطلوب`,scopeTitle:`ترقية النطاق معلقة`,roleTitle:`ترقية الدور معلقة`,metadataTitle:`تحديث الجهاز معلق`,summary:`يحتاج هذا المتصفح إلى موافقة لمرة واحدة من مضيف Gateway قبل استخدام Control UI.`,upgradeSummary:`هذا المتصفح معروف بالفعل، لكن الوصول المطلوب تغير ويحتاج إلى موافقة جديدة.`,stepList:`شغل daocore devices list على مضيف Gateway.`,stepApproveId:`وافق على هذا الطلب: daocore devices approve {requestId}.`,stepApprove:`وافق على طلب المتصفح/الجهاز المعلق من تلك القائمة.`,stepReconnect:`أعد الاتصال بعد اكتمال الموافقة.`},insecure:{title:`سياق متصفح آمن مطلوب`,summary:`تعمل هذه الصفحة عبر HTTP عادي، لذلك لا يستطيع المتصفح إنشاء هوية الجهاز التي يتوقعها Gateway.`,stepHttps:`استخدم HTTPS/Tailscale Serve، أو افتح http://127.0.0.1:18789 على مضيف Gateway.`,stepLocalCompat:`للتوافق المحلي بوضع الرمز فقط، عين gateway.controlUi.allowInsecureAuth: true.`,stepAvoidDisable:`تجنب تعطيل مصادقة الجهاز للوصول عبر HTTP عن بعد.`},origin:{title:`أصل المتصفح غير مسموح`,summary:`رفض Gateway أصل هذه الصفحة قبل قبول اتصال Control UI.`,stepAllowedOrigins:`أضف أصل هذا المتصفح إلى gateway.controlUi.allowedOrigins.`,stepFullOrigin:`استخدم أصولا كاملة مثل http://localhost:5173، وليس أنماط أحرف بدل.`,stepRestart:`أعد تشغيل Gateway أو أعد تحميله بعد تغيير الأصول المسموح بها.`},protocol:{title:`عدم تطابق البروتوكول`,summary:`لا يتفق Control UI المقدم مع Gateway العامل على بروتوكول الاتصال المدعوم.`,stepDashboard:`أعد فتح لوحة المعلومات المقدمة باستخدام daocore dashboard حتى يأتي UI وGateway من التثبيت نفسه.`,stepDevUi:`إذا كنت تستخدم pnpm ui:dev، فأعد بناء أو تشغيل واجهة التطوير مقابل checkout الحالي.`,stepRestart:`أعد تشغيل Gateway بعد تحديث DaoCore حتى يقدم البروتوكول الحالي.`},network:{title:`تعذر الاتصال`,summary:`لم يتمكن المتصفح من إكمال اتصال Gateway. تحقق من الهدف والنقل قبل إعادة تجربة بيانات الاعتماد.`,stepGateway:`تأكد من أن Gateway يعمل باستخدام daocore status أو daocore gateway run.`,stepUrl:`تحقق من عنوان WebSocket واستخدم wss:// عندما يكون Gateway خلف HTTPS/Tailscale Serve.`,stepDashboard:`أعد فتح لوحة المعلومات باستخدام daocore dashboard --no-open لنسخ عنوان URL وتفاصيل المصادقة الحالية.`}}},chat:{disconnected:`تم قطع الاتصال بـ Gateway.`,refreshTitle:`تحديث بيانات الدردشة`,settings:`إعدادات الدردشة`,thinkingToggle:`تبديل مخرجات تفكير/عمل المساعد`,toolCallsToggle:`تبديل استدعاءات الأدوات ونتائج الأدوات`,autoScrollMode:`وضع التمرير التلقائي`,autoScrollAlways:`دائمًا`,autoScrollNearBottom:`قرب الأسفل`,autoScrollOff:`إيقاف`,focusToggle:`تبديل وضع التركيز (إخفاء الشريط الجانبي + رأس الصفحة)`,hideCronSessions:`إخفاء جلسات cron`,showCronSessions:`إظهار جلسات cron`,showCronSessionsHidden:`إظهار جلسات cron ({count} مخفية)`,onboardingDisabled:`معطل أثناء الإعداد`,gatewayStatus:`حالة Gateway: {status}`,commandPaletteTitle:`ابحث أو انتقل إلى… (⌘K)`,openCommandPalette:`فتح لوحة الأوامر`,docsOpensInNewTab:`{label} (يفتح في علامة تبويب جديدة)`,updateAvailable:`يتوفر تحديث:`,runningVersion:`الإصدار قيد التشغيل v{version}`,updating:`جارٍ التحديث…`,updateNow:`التحديث الآن`,dismissUpdateBanner:`إغلاق لافتة التحديث`,switchedSession:`تم التبديل إلى {session}`,welcome:{ready:`Ready to chat`,hintBeforeShortcut:`Type a message below ·`,hintAfterShortcut:`for commands`,suggestions:{whatCanYouDo:`What can you do?`,summarizeRecentSessions:`Summarize my recent sessions`,configureChannel:`Help me configure a channel`,checkSystemHealth:`Check system health`}},runControls:{newSession:`New session`,export:`تصدير`,exportChat:`Export chat`,queue:`Queue`,queueMessage:`Queue message`,stop:`Stop`,stopGenerating:`Stop generating`,send:`Send`,sendMessage:`Send message`},composer:{placeholder:`Message {name} (Enter to send)`,placeholderWithAttachments:`Add a message or paste more images...`,placeholderDisconnected:`Connect to the gateway to start chatting...`,attachFile:`Attach file`,startTalk:`Start Talk`,stillListening:`لا يزال يستمع`,talkTranscript:`نص الحديث`,stopTalk:`Stop Talk`},selectors:{agentFilter:`تصفية الجلسات حسب الوكيل`,session:`Chat session`,sessionSearch:`البحث في الجلسات`,clearSessionSearch:`مسح البحث في الجلسات`,loadMoreSessions:`تحميل المزيد من الجلسات`,model:`Chat model`,thinkingLevel:`Chat thinking level`}},languages:{en:`English (الإنجليزية)`,zhCN:`简体中文 (الصينية المبسطة)`,zhTW:`繁體中文 (الصينية التقليدية)`,ptBR:`Português (البرتغالية البرازيلية)`,de:`Deutsch (الألمانية)`,es:`Español (الإسبانية)`,jaJP:`日本語 (اليابانية)`,ko:`한국어 (الكورية)`,fr:`Français (الفرنسية)`,ar:`العربية`,it:`Italiano (الإيطالية)`,tr:`Türkçe (التركية)`,uk:`Українська (الأوكرانية)`,id:`Bahasa Indonesia (الإندونيسية)`,pl:`Polski (البولندية)`,th:`ไทย (التايلاندية)`,vi:`Tiếng Việt (الفيتنامية)`,nl:`Nederlands (الهولندية)`,fa:`فارسی (الفارسية)`},cron:{quickCreate:{schedules:{everyMorning:{label:`كل صباح`,description:`يوميًا في 8:00 ص`},everyEvening:{label:`كل مساء`,description:`يوميًا في 6:00 م`},hourly:{label:`كل ساعة`,description:`كل ساعة`},weekdays:{label:`أيام الأسبوع`,description:`من الاثنين إلى الجمعة في 9:00 ص`},weekly:{label:`أسبوعيًا`,description:`كل يوم اثنين في 9:00 ص`},once:{label:`تشغيل مرة واحدة`,description:`لمرة واحدة، يُحذف بعد التشغيل`}},delivery:{notify:{label:`إشعاري`,description:`إرسال النتائج إلى الدردشة`},silent:{label:`صامت`,description:`تشغيل دون إشعار`},isolated:{label:`جلسة مستقلة`,description:`تشغيل في جلسته الخاصة`}},steps:{what:`ماذا`,when:`متى`,how:`كيف`},defaultName:`الأتمتة`,whatHeading:`ماذا يجب أن يفعل؟`,whatHint:`صِف المهمة بلغة طبيعية. سيشغّل الوكيل هذه المطالبة في كل مرة.`,promptPlaceholder:`مثلاً، تحقّق من بريدي الوارد بحثًا عن رسائل عاجلة ولخّصها...`,nameOptional:`الاسم (اختياري)`,namePlaceholder:`مثلاً، فحص البريد الوارد الصباحي`,whenHeading:`متى يجب تشغيله؟`,whenHint:`اختر جدولاً. يمكنك ضبطه بدقة لاحقًا.`,howHeading:`كيف يجب أن يعمل؟`,howHint:`اختر طريقة تسليم النتائج.`,title:`أتمتة جديدة`},summary:{enabled:`مفعّل`,yes:`نعم`,no:`لا`,jobs:`المهام`,nextWake:`التنبيه التالي`,refreshing:`جارٍ التحديث...`,refresh:`تحديث`},jobs:{title:`المهام`,subtitle:`كل المهام المجدولة المخزنة في Gateway.`,shownOf:`{shown} معروضة من {total}`,searchJobs:`البحث في المهام`,searchPlaceholder:`الاسم أو الوصف أو الوكيل`,enabled:`مفعّل`,schedule:`الجدول`,lastRun:`آخر تشغيل`,all:`الكل`,sort:`فرز`,nextRun:`التشغيل التالي`,recentlyUpdated:`تم تحديثها مؤخرًا`,name:`الاسم`,direction:`الاتجاه`,ascending:`تصاعدي`,descending:`تنازلي`,reset:`إعادة تعيين`,emptyTitle:`No scheduled jobs yet.`,emptyHint:`Create one from a plain-language prompt; advanced fields can wait.`,emptyFilteredHint:`Clear or change filters to see scheduled jobs.`,noMatching:`لا توجد مهام مطابقة.`,loading:`جارٍ التحميل...`,loadMore:`تحميل المزيد من المهام`},runs:{title:`سجل التشغيلات`,subtitleAll:`أحدث التشغيلات عبر جميع المهام.`,subtitleJob:`أحدث التشغيلات لـ {title}.`,scope:`النطاق`,allJobs:`كل المهام`,selectedJob:`المهمة المحددة`,searchRuns:`البحث في التشغيلات`,searchPlaceholder:`الملخص أو الخطأ أو المهمة`,newestFirst:`الأحدث أولًا`,oldestFirst:`الأقدم أولًا`,status:`الحالة`,delivery:`التسليم`,clear:`مسح`,allStatuses:`كل الحالات`,allDelivery:`كل عمليات التسليم`,selectJobHint:`حدد مهمة لفحص سجل التشغيل.`,noMatching:`لا توجد تشغيلات مطابقة.`,loadMore:`تحميل المزيد من التشغيلات`,runStatusOk:`حسنًا`,runStatusError:`خطأ`,runStatusSkipped:`تم التخطي`,runStatusUnknown:`غير معروف`,deliveryDelivered:`تم التسليم`,deliveryNotDelivered:`لم يتم التسليم`,deliveryUnknown:`غير معروف`,deliveryNotRequested:`غير مطلوب`},form:{editJob:`تعديل المهمة`,newJob:`مهمة جديدة`,advancedJob:`Advanced job`,updateSubtitle:`حدّث المهمة المجدولة المحددة.`,createSubtitle:`أنشئ تنبيهًا مجدولًا أو تشغيل وكيل.`,required:`مطلوب`,requiredSr:`مطلوب`,basics:`الأساسيات`,basicsSub:`سمّها، واختر المساعد، واضبط حالة التفعيل.`,fieldName:`الاسم`,description:`الوصف`,agentId:`معرّف الوكيل`,namePlaceholder:`ملخص الصباح`,descriptionPlaceholder:`سياق اختياري لهذه المهمة`,agentPlaceholder:`main أو ops`,agentHelp:`ابدأ الكتابة لاختيار وكيل معروف، أو أدخل وكيلًا مخصصًا.`,schedule:`الجدول`,scheduleSub:`تحكم في وقت تشغيل هذه المهمة.`,every:`كل`,at:`عند`,cronOption:`Cron`,runAt:`التشغيل عند`,unit:`الوحدة`,minutes:`دقائق`,hours:`ساعات`,days:`أيام`,expression:`التعبير`,expressionPlaceholder:`0 7 * * *`,everyAmountPlaceholder:`30`,timezoneOptional:`المنطقة الزمنية (اختياري)`,timezonePlaceholder:`America/Los_Angeles`,timezoneHelp:`اختر منطقة زمنية شائعة أو أدخل أي منطقة زمنية IANA صالحة.`,jitterHelp:`تحتاج إلى تباين عشوائي؟ استخدم متقدم → نافذة التدرج / وحدة التدرج.`,execution:`التنفيذ`,executionSub:`اختر وقت التنبيه، وما الذي يجب أن تفعله هذه المهمة.`,session:`الجلسة`,main:`الرئيسية`,isolated:`معزولة`,sessionHelp:`تنشر الرئيسية حدث نظام. تشغّل المعزولة دور وكيل مخصص.`,wakeMode:`وضع التنبيه`,now:`الآن`,nextHeartbeat:`النبضة التالية`,wakeModeHelp:`الآن يشغّل فورًا. النبضة التالية تنتظر الدورة التالية.`,payloadKind:`ما الذي يجب تشغيله؟`,systemEvent:`نشر رسالة إلى المخطط الزمني الرئيسي`,agentTurn:`تشغيل مهمة المساعد (معزولة)`,systemEventHelp:`يرسل نصك إلى المخطط الزمني الرئيسي لـ Gateway (مفيد للتذكيرات/المشغلات).`,agentTurnHelp:`يبدأ تشغيل مساعد في جلسته الخاصة باستخدام مطالبتك.`,timeoutSeconds:`المهلة (بالثواني)`,timeoutPlaceholder:`اختياري، مثلًا 90`,timeoutHelp:`اختياري. اتركه فارغًا لاستخدام سلوك المهلة الافتراضي في Gateway لهذا التشغيل.`,mainTimelineMessage:`رسالة المخطط الزمني الرئيسي`,assistantTaskPrompt:`مطالبة مهمة المساعد`,deliverySection:`التسليم`,deliverySub:`اختر أين تُرسل ملخصات التشغيل.`,resultDelivery:`تسليم النتيجة`,announceDefault:`إعلان الملخص (افتراضي)`,webhookPost:`Webhook POST`,noneInternal:`لا شيء (داخلي)`,deliveryHelp:`ينشر الإعلان ملخصًا إلى الدردشة. لا شيء يبقي التنفيذ داخليًا.`,webhookUrl:`عنوان URL للـ Webhook`,channel:`القناة`,webhookPlaceholder:`https://example.com/cron`,channelHelp:`اختر القناة المتصلة التي تتلقى الملخص.`,webhookHelp:`أرسل ملخصات التشغيل إلى نقطة نهاية webhook.`,to:`إلى`,toPlaceholder:`+1555... أو معرّف الدردشة`,toHelp:`تجاوز اختياري للمستلم (معرّف الدردشة، أو الهاتف، أو معرّف المستخدم).`,advanced:`متقدم`,advancedHelp:`تجاوزات اختيارية لضمانات التسليم، وتباين الجدول العشوائي، وعناصر التحكم في النموذج.`,deleteAfterRun:`الحذف بعد التشغيل`,deleteAfterRunHelp:`الأفضل للتذكيرات لمرة واحدة التي يجب تنظيفها تلقائيًا.`,clearAgentOverride:`مسح تجاوز الوكيل`,clearAgentHelp:`إجبار هذه المهمة على استخدام المساعد الافتراضي في Gateway.`,exactTiming:`توقيت دقيق (بدون تدرج)`,exactTimingHelp:`التشغيل عند حدود cron الدقيقة بدون توزيع.`,staggerWindow:`نافذة التدرج`,staggerUnit:`وحدة التدرج`,staggerPlaceholder:`30`,seconds:`ثوانٍ`,model:`النموذج`,modelPlaceholder:`openai/gpt-5.2`,modelHelp:`ابدأ الكتابة لاختيار نموذج معروف، أو أدخل نموذجًا مخصصًا.`,thinking:`التفكير`,thinkingPlaceholder:`low`,thinkingHelp:`استخدم مستوى مقترحًا أو أدخل قيمة خاصة بالمزود.`,bestEffortDelivery:`تسليم بأفضل جهد`,bestEffortHelp:`لا تُفشل المهمة إذا فشل التسليم نفسه.`,cantAddYet:`لا يمكن إضافة المهمة بعد`,fillRequired:`املأ الحقول المطلوبة أدناه لتمكين الإرسال.`,fixFields:`أصلح {count} حقل للمتابعة.`,fixFieldsPlural:`أصلح {count} حقول للمتابعة.`,saving:`جارٍ الحفظ...`,saveChanges:`حفظ التغييرات`,addJob:`إضافة مهمة`,cancel:`إلغاء`},jobList:{allJobs:`كل المهام`,selectJob:`(حدد مهمة)`,enabled:`مفعّلة`,disabled:`معطّلة`,edit:`تعديل`,clone:`استنساخ`,disable:`تعطيل`,enable:`تفعيل`,run:`تشغيل`,history:`السجل`,remove:`إزالة`},jobDetail:{system:`النظام`,prompt:`المطالبة`,delivery:`التسليم`,agent:`الوكيل`},jobState:{status:`الحالة`,next:`التالي`,last:`الأخير`},runEntry:{noSummary:`لا يوجد ملخص.`,runAt:`التشغيل عند`,openRunChat:`فتح دردشة التشغيل`,next:`التالي {rel}`,due:`مستحق {rel}`},errors:{nameRequired:`الاسم مطلوب.`,scheduleAtInvalid:`أدخل تاريخًا/وقتًا صالحًا.`,everyAmountInvalid:`يجب أن يكون الفاصل أكبر من 0.`,cronExprRequired:`تعبير Cron مطلوب.`,staggerAmountInvalid:`يجب أن يكون التدرج أكبر من 0.`,systemTextRequired:`نص النظام مطلوب.`,agentMessageRequired:`رسالة الوكيل مطلوبة.`,timeoutInvalid:`إذا تم تعيينها، يجب أن تكون المهلة أكبر من 0 ثانية.`,webhookUrlRequired:`عنوان URL للـ Webhook مطلوب.`,webhookUrlInvalid:`يجب أن يبدأ عنوان URL للـ Webhook بـ http:// أو https://.`,invalidRunTime:`وقت التشغيل غير صالح.`,invalidIntervalAmount:`مقدار الفاصل غير صالح.`,cronExprRequiredShort:`تعبير Cron مطلوب.`,invalidStaggerAmount:`مقدار التدرج غير صالح.`,systemEventTextRequired:`نص حدث النظام مطلوب.`,agentMessageRequiredShort:`رسالة الوكيل مطلوبة.`,nameRequiredShort:`الاسم مطلوب.`}}};export{e as ar};
2
- //# sourceMappingURL=ar-DmY3OKJ7.js.map
@@ -1,2 +0,0 @@
1
- import{tt as e}from"./index-DL8I3w4m.js";function t(e,t){if(!e)return null;let n=(e.channels??{})[t];if(n&&typeof n==`object`)return n;let r=e[t];return r&&typeof r==`object`?r:null}function n(t){if(t==null)return e(`common.na`);if(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)return String(t);try{return JSON.stringify(t)}catch{return e(`common.na`)}}function r(e){let r=t(e.configForm,e.channelId);return r?e.fields.flatMap(e=>e in r?[{label:e,value:n(r[e])}]:[]):[]}export{t as n,r,n as t};
2
- //# sourceMappingURL=channel-config-extras-CxFOBh-V.js.map
@@ -1,367 +0,0 @@
1
- import{A as e,X as t,Z as n,c as r,it as i,k as a,l as o,rt as s,tt as c}from"./index-DL8I3w4m.js";import{n as l,t as u}from"./channel-config-extras-CxFOBh-V.js";function d(e,t){let r=e;for(let e of t){if(!r)return null;let t=n(r);if(t===`object`){let t=r.properties??{};if(typeof e==`string`&&t[e]){r=t[e];continue}let n=r.additionalProperties;if(typeof e==`string`&&n&&typeof n==`object`){r=n;continue}return null}if(t===`array`){if(typeof e!=`number`)return null;r=(Array.isArray(r.items)?r.items[0]:r.items)??null;continue}return null}return r}function f(e,t){return l(e,t)??{}}var p=[`groupPolicy`,`streamMode`,`dmPolicy`];function m(e){let t=p.flatMap(t=>t in e?[[t,e[t]]]:[]);return t.length===0?null:i`
2
- <div class="status-list" style="margin-top: 12px;">
3
- ${t.map(([e,t])=>i`
4
- <div>
5
- <span class="label">${e}</span>
6
- <span>${u(t)}</span>
7
- </div>
8
- `)}
9
- </div>
10
- `}function h(e){let t=r(e.schema),n=t.schema;if(!n)return i` <div class="callout danger">Schema unavailable. Use Raw.</div> `;let a=d(n,[`channels`,e.channelId]);if(!a)return i` <div class="callout danger">Channel config schema unavailable.</div> `;let s=f(e.configValue??{},e.channelId);return i`
11
- <div class="config-form">
12
- ${o({schema:a,value:s,path:[`channels`,e.channelId],hints:e.uiHints,unsupported:new Set(t.unsupportedPaths),disabled:e.disabled,showLabel:!1,onPatch:e.onPatch})}
13
- </div>
14
- ${m(s)}
15
- `}function g(e){let{channelId:t,props:n}=e,r=n.configSaving||n.configSchemaLoading;return i`
16
- <div style="margin-top: 16px;">
17
- ${n.configSchemaLoading?i` <div class="muted">Loading config schema…</div> `:h({channelId:t,configValue:n.configForm,schema:n.configSchema,uiHints:n.configUiHints,disabled:r,onPatch:n.onConfigPatch})}
18
- <div class="row" style="margin-top: 12px;">
19
- <button
20
- class="btn primary"
21
- ?disabled=${r||!n.configFormDirty}
22
- @click=${()=>n.onConfigSave()}
23
- >
24
- ${n.configSaving?`Saving…`:`Save`}
25
- </button>
26
- <button class="btn" ?disabled=${r} @click=${()=>n.onConfigReload()}>
27
- ${c(`common.reload`)}
28
- </button>
29
- </div>
30
- </div>
31
- `}function _(e,t){return t.snapshot?.channels?.[e]}function v(e,t){let n=t.snapshot?.channelAccounts?.[e]??[],r=t.snapshot?.channelDefaultAccountId?.[e];return(r?n.find(e=>e.accountId===r):void 0)??n[0]??null}function y(e,t){let n=_(e,t),r=t.snapshot?.channelAccounts?.[e]??[],i=v(e,t);return{configured:typeof n?.configured==`boolean`?n.configured:typeof i?.configured==`boolean`?i.configured:null,running:typeof n?.running==`boolean`?n.running:null,connected:typeof n?.connected==`boolean`?n.connected:null,defaultAccount:i,hasAnyActiveAccount:r.some(e=>e.configured||e.running||e.connected),status:n}}function b(e,t){if(!t.snapshot)return!1;let n=y(e,t);return n.configured===!0||n.running===!0||n.connected===!0||n.hasAnyActiveAccount}function x(e,t){return y(e,t).configured}function S(e){return c(e==null?`common.na`:e?`common.yes`:`common.no`)}function C(e){return i`
32
- <div class="card">
33
- <div class="card-title">${e.title}</div>
34
- <div class="card-sub">${e.subtitle}</div>
35
- ${e.accountCountLabel}
36
-
37
- <div class="status-list" style="margin-top: 16px;">
38
- ${e.statusRows.map(e=>i`
39
- <div>
40
- <span class="label">${e.label}</span>
41
- <span>${e.value}</span>
42
- </div>
43
- `)}
44
- </div>
45
-
46
- ${e.lastError?i`<div class="callout danger" style="margin-top: 12px;">${e.lastError}</div>`:s}
47
- ${e.secondaryCallout??s} ${e.extraContent??s}
48
- ${e.configSection} ${e.footer??s}
49
- </div>
50
- `}function w(e,t){return t?.[e]?.length??0}function T(e,t){let n=w(e,t);return n<2?s:i`<div class="account-count">Accounts (${n})</div>`}function E(e){let{props:t,discord:n,accountCountLabel:r}=e,o=x(`discord`,t);return C({title:`Discord`,subtitle:`Bot status and channel configuration.`,accountCountLabel:r,statusRows:[{label:c(`common.configured`),value:S(o)},{label:c(`common.running`),value:n?.running?c(`common.yes`):c(`common.no`)},{label:c(`common.lastStart`),value:n?.lastStartAt?a(n.lastStartAt):c(`common.na`)},{label:c(`common.lastProbe`),value:n?.lastProbeAt?a(n.lastProbeAt):c(`common.na`)}],lastError:n?.lastError,secondaryCallout:n?.probe?i`<div class="callout" style="margin-top: 12px;">
51
- ${n.probe.ok?c(`common.probeOk`):c(`common.probeFailed`)} ·
52
- ${n.probe.status??``} ${n.probe.error??``}
53
- </div>`:s,configSection:g({channelId:`discord`,props:t}),footer:i`<div class="row" style="margin-top: 12px;">
54
- <button class="btn" @click=${()=>t.onRefresh(!0)}>${c(`common.probe`)}</button>
55
- </div>`})}function D(e){let{props:t,googleChat:n,accountCountLabel:r}=e,o=x(`googlechat`,t);return C({title:`Google Chat`,subtitle:`Chat API webhook status and channel configuration.`,accountCountLabel:r,statusRows:[{label:c(`common.configured`),value:S(o)},{label:c(`common.running`),value:n?n.running?c(`common.yes`):c(`common.no`):c(`common.na`)},{label:c(`common.credential`),value:n?.credentialSource??c(`common.na`)},{label:c(`common.audience`),value:n?.audienceType?`${n.audienceType}${n.audience?` · ${n.audience}`:``}`:c(`common.na`)},{label:c(`common.lastStart`),value:n?.lastStartAt?a(n.lastStartAt):c(`common.na`)},{label:c(`common.lastProbe`),value:n?.lastProbeAt?a(n.lastProbeAt):c(`common.na`)}],lastError:n?.lastError,secondaryCallout:n?.probe?i`<div class="callout" style="margin-top: 12px;">
56
- ${n.probe.ok?c(`common.probeOk`):c(`common.probeFailed`)} ·
57
- ${n.probe.status??``} ${n.probe.error??``}
58
- </div>`:s,configSection:g({channelId:`googlechat`,props:t}),footer:i`<div class="row" style="margin-top: 12px;">
59
- <button class="btn" @click=${()=>t.onRefresh(!0)}>${c(`common.probe`)}</button>
60
- </div>`})}function O(e){let{props:t,imessage:n,accountCountLabel:r}=e,o=x(`imessage`,t);return C({title:`iMessage`,subtitle:`macOS bridge status and channel configuration.`,accountCountLabel:r,statusRows:[{label:c(`common.configured`),value:S(o)},{label:c(`common.running`),value:n?.running?c(`common.yes`):c(`common.no`)},{label:c(`common.lastStart`),value:n?.lastStartAt?a(n.lastStartAt):c(`common.na`)},{label:c(`common.lastProbe`),value:n?.lastProbeAt?a(n.lastProbeAt):c(`common.na`)}],lastError:n?.lastError,secondaryCallout:n?.probe?i`<div class="callout" style="margin-top: 12px;">
61
- ${n.probe.ok?c(`common.probeOk`):c(`common.probeFailed`)} ·
62
- ${n.probe.error??``}
63
- </div>`:s,configSection:g({channelId:`imessage`,props:t}),footer:i`<div class="row" style="margin-top: 12px;">
64
- <button class="btn" @click=${()=>t.onRefresh(!0)}>${c(`common.probe`)}</button>
65
- </div>`})}function k(e){return e?e.length<=20?e:`${e.slice(0,8)}...${e.slice(-8)}`:c(`common.na`)}function A(e){let{props:n,nostr:r,nostrAccounts:o,accountCountLabel:l,profileFormState:u,profileFormCallbacks:d,onEditProfile:f}=e,p=o[0],m=r?.configured??p?.configured??!1,h=r?.running??p?.running??!1,_=r?.publicKey??p?.publicKey,v=r?.lastStartAt??p?.lastStartAt??null,y=r?.lastError??p?.lastError??null,b=o.length>1,x=u!=null,S=e=>{let t=e.publicKey,n=e.profile;return i`
66
- <div class="account-card">
67
- <div class="account-card-header">
68
- <div class="account-card-title">${n?.displayName??n?.name??e.name??e.accountId}</div>
69
- <div class="account-card-id">${e.accountId}</div>
70
- </div>
71
- <div class="status-list account-card-status">
72
- <div>
73
- <span class="label">${c(`common.running`)}</span>
74
- <span>${e.running?c(`common.yes`):c(`common.no`)}</span>
75
- </div>
76
- <div>
77
- <span class="label">${c(`common.configured`)}</span>
78
- <span>${e.configured?c(`common.yes`):c(`common.no`)}</span>
79
- </div>
80
- <div>
81
- <span class="label">${c(`common.publicKey`)}</span>
82
- <span class="monospace" title="${t??``}">${k(t)}</span>
83
- </div>
84
- <div>
85
- <span class="label">${c(`common.lastInbound`)}</span>
86
- <span
87
- >${e.lastInboundAt?a(e.lastInboundAt):c(`common.na`)}</span
88
- >
89
- </div>
90
- ${e.lastError?i` <div class="account-card-error">${e.lastError}</div> `:s}
91
- </div>
92
- </div>
93
- `};return i`
94
- <div class="card">
95
- <div class="card-title">Nostr</div>
96
- <div class="card-sub">Decentralized DMs via Nostr relays (NIP-04).</div>
97
- ${l}
98
- ${b?i`
99
- <div class="account-card-list">
100
- ${o.map(e=>S(e))}
101
- </div>
102
- `:i`
103
- <div class="status-list" style="margin-top: 16px;">
104
- <div>
105
- <span class="label">${c(`common.configured`)}</span>
106
- <span>${c(m?`common.yes`:`common.no`)}</span>
107
- </div>
108
- <div>
109
- <span class="label">${c(`common.running`)}</span>
110
- <span>${c(h?`common.yes`:`common.no`)}</span>
111
- </div>
112
- <div>
113
- <span class="label">${c(`common.publicKey`)}</span>
114
- <span class="monospace" title="${_??``}"
115
- >${k(_)}</span
116
- >
117
- </div>
118
- <div>
119
- <span class="label">${c(`common.lastStart`)}</span>
120
- <span>
121
- ${v?a(v):c(`common.na`)}
122
- </span>
123
- </div>
124
- </div>
125
- `}
126
- ${y?i`<div class="callout danger" style="margin-top: 12px;">${y}</div>`:s}
127
- ${(()=>{if(x&&d)return t({state:u,callbacks:d,accountId:o[0]?.accountId??`default`});let{name:e,displayName:n,about:a,picture:l,nip05:h}=p?.profile??r?.profile??{},g=e||n||a||l||h;return i`
128
- <div
129
- style="margin-top: 16px; padding: 12px; background: var(--bg-secondary); border-radius: var(--radius-md);"
130
- >
131
- <div
132
- style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;"
133
- >
134
- <div style="font-weight: 500;">${c(`channels.nostr.profile`)}</div>
135
- ${m?i`
136
- <button
137
- class="btn btn--sm"
138
- @click=${f}
139
- style="font-size: 12px; padding: 4px 8px;"
140
- >
141
- ${c(`channels.nostr.editProfile`)}
142
- </button>
143
- `:s}
144
- </div>
145
- ${g?i`
146
- <div class="status-list">
147
- ${l?i`
148
- <div style="margin-bottom: 8px;">
149
- <img
150
- src=${l}
151
- alt=${c(`channels.nostr.profilePicture`)}
152
- style="width: 48px; height: 48px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);"
153
- @error=${e=>{e.target.style.display=`none`}}
154
- />
155
- </div>
156
- `:s}
157
- ${e?i`<div>
158
- <span class="label">${c(`channels.nostr.name`)}</span><span>${e}</span>
159
- </div>`:s}
160
- ${n?i`<div>
161
- <span class="label">${c(`channels.nostr.displayName`)}</span
162
- ><span>${n}</span>
163
- </div>`:s}
164
- ${a?i`<div>
165
- <span class="label">${c(`channels.nostr.about`)}</span
166
- ><span style="max-width: 300px; overflow: hidden; text-overflow: ellipsis;"
167
- >${a}</span
168
- >
169
- </div>`:s}
170
- ${h?i`<div><span class="label">NIP-05</span><span>${h}</span></div>`:s}
171
- </div>
172
- `:i`
173
- <div style="color: var(--text-muted); font-size: 13px">
174
- ${c(`channels.nostr.noProfile`)} ${c(`channels.nostr.noProfileHint`)}
175
- </div>
176
- `}
177
- </div>
178
- `})()} ${g({channelId:`nostr`,props:n})}
179
-
180
- <div class="row" style="margin-top: 12px;">
181
- <button class="btn" @click=${()=>n.onRefresh(!1)}>${c(`common.refresh`)}</button>
182
- </div>
183
- </div>
184
- `}function j(e){let{props:t,signal:n,accountCountLabel:r}=e,o=x(`signal`,t);return C({title:`Signal`,subtitle:`signal-cli status and channel configuration.`,accountCountLabel:r,statusRows:[{label:c(`common.configured`),value:S(o)},{label:c(`common.running`),value:n?.running?c(`common.yes`):c(`common.no`)},{label:c(`common.baseUrl`),value:n?.baseUrl??c(`common.na`)},{label:c(`common.lastStart`),value:n?.lastStartAt?a(n.lastStartAt):c(`common.na`)},{label:c(`common.lastProbe`),value:n?.lastProbeAt?a(n.lastProbeAt):c(`common.na`)}],lastError:n?.lastError,secondaryCallout:n?.probe?i`<div class="callout" style="margin-top: 12px;">
185
- ${n.probe.ok?c(`common.probeOk`):c(`common.probeFailed`)} ·
186
- ${n.probe.status??``} ${n.probe.error??``}
187
- </div>`:s,configSection:g({channelId:`signal`,props:t}),footer:i`<div class="row" style="margin-top: 12px;">
188
- <button class="btn" @click=${()=>t.onRefresh(!0)}>${c(`common.probe`)}</button>
189
- </div>`})}function M(e){let{props:t,slack:n,accountCountLabel:r}=e,o=x(`slack`,t);return C({title:`Slack`,subtitle:`Socket mode status and channel configuration.`,accountCountLabel:r,statusRows:[{label:c(`common.configured`),value:S(o)},{label:c(`common.running`),value:n?.running?c(`common.yes`):c(`common.no`)},{label:c(`common.lastStart`),value:n?.lastStartAt?a(n.lastStartAt):c(`common.na`)},{label:c(`common.lastProbe`),value:n?.lastProbeAt?a(n.lastProbeAt):c(`common.na`)}],lastError:n?.lastError,secondaryCallout:n?.probe?i`<div class="callout" style="margin-top: 12px;">
190
- ${n.probe.ok?c(`common.probeOk`):c(`common.probeFailed`)} ·
191
- ${n.probe.status??``} ${n.probe.error??``}
192
- </div>`:s,configSection:g({channelId:`slack`,props:t}),footer:i`<div class="row" style="margin-top: 12px;">
193
- <button class="btn" @click=${()=>t.onRefresh(!0)}>${c(`common.probe`)}</button>
194
- </div>`})}function N(e){let{props:t,telegram:n,telegramAccounts:r,accountCountLabel:o}=e,l=r.length>1,u=x(`telegram`,t),d=e=>{let t=e.probe?.bot?.username,n=e.name||e.accountId;return i`
195
- <div class="account-card">
196
- <div class="account-card-header">
197
- <div class="account-card-title">${t?`@${t}`:n}</div>
198
- <div class="account-card-id">${e.accountId}</div>
199
- </div>
200
- <div class="status-list account-card-status">
201
- <div>
202
- <span class="label">${c(`common.running`)}</span>
203
- <span>${e.running?c(`common.yes`):c(`common.no`)}</span>
204
- </div>
205
- <div>
206
- <span class="label">${c(`common.configured`)}</span>
207
- <span>${e.configured?c(`common.yes`):c(`common.no`)}</span>
208
- </div>
209
- <div>
210
- <span class="label">${c(`common.lastInbound`)}</span>
211
- <span
212
- >${e.lastInboundAt?a(e.lastInboundAt):c(`common.na`)}</span
213
- >
214
- </div>
215
- ${e.lastError?i` <div class="account-card-error">${e.lastError}</div> `:s}
216
- </div>
217
- </div>
218
- `};return l?i`
219
- <div class="card">
220
- <div class="card-title">Telegram</div>
221
- <div class="card-sub">Bot status and channel configuration.</div>
222
- ${o}
223
-
224
- <div class="account-card-list">
225
- ${r.map(e=>d(e))}
226
- </div>
227
-
228
- ${n?.lastError?i`<div class="callout danger" style="margin-top: 12px;">${n.lastError}</div>`:s}
229
- ${n?.probe?i`<div class="callout" style="margin-top: 12px;">
230
- ${n.probe.ok?c(`common.probeOk`):c(`common.probeFailed`)} ·
231
- ${n.probe.status??``} ${n.probe.error??``}
232
- </div>`:s}
233
- ${g({channelId:`telegram`,props:t})}
234
-
235
- <div class="row" style="margin-top: 12px;">
236
- <button class="btn" @click=${()=>t.onRefresh(!0)}>${c(`common.probe`)}</button>
237
- </div>
238
- </div>
239
- `:C({title:`Telegram`,subtitle:`Bot status and channel configuration.`,accountCountLabel:o,statusRows:[{label:c(`common.configured`),value:S(u)},{label:c(`common.running`),value:n?.running?c(`common.yes`):c(`common.no`)},{label:c(`common.mode`),value:n?.mode??c(`common.na`)},{label:c(`common.lastStart`),value:n?.lastStartAt?a(n.lastStartAt):c(`common.na`)},{label:c(`common.lastProbe`),value:n?.lastProbeAt?a(n.lastProbeAt):c(`common.na`)}],lastError:n?.lastError,secondaryCallout:n?.probe?i`<div class="callout" style="margin-top: 12px;">
240
- ${n.probe.ok?c(`common.probeOk`):c(`common.probeFailed`)} ·
241
- ${n.probe.status??``} ${n.probe.error??``}
242
- </div>`:s,configSection:g({channelId:`telegram`,props:t}),footer:i`<div class="row" style="margin-top: 12px;">
243
- <button class="btn" @click=${()=>t.onRefresh(!0)}>${c(`common.probe`)}</button>
244
- </div>`})}function P(t){let{props:n,whatsapp:r,accountCountLabel:o}=t,l=x(`whatsapp`,n),u=r?.linked===!0,d=n.whatsappQrDataUrl!=null;return C({title:`WhatsApp`,subtitle:`Link WhatsApp Web and monitor connection health.`,accountCountLabel:o,statusRows:[{label:c(`common.configured`),value:S(l)},{label:c(`common.linked`),value:r?.linked?c(`common.yes`):c(`common.no`)},{label:c(`common.running`),value:r?.running?c(`common.yes`):c(`common.no`)},{label:c(`common.connected`),value:r?.connected?c(`common.yes`):c(`common.no`)},{label:c(`common.lastConnect`),value:r?.lastConnectedAt?a(r.lastConnectedAt):c(`common.na`)},{label:c(`common.lastMessage`),value:r?.lastMessageAt?a(r.lastMessageAt):c(`common.na`)},{label:c(`common.authAge`),value:r?.authAgeMs==null?c(`common.na`):e(r.authAgeMs)}],lastError:r?.lastError,extraContent:i`
245
- ${n.whatsappMessage?i`<div class="callout" style="margin-top: 12px;">${n.whatsappMessage}</div>`:s}
246
- ${n.whatsappQrDataUrl?i`<div class="qr-wrap">
247
- <img src=${n.whatsappQrDataUrl} alt="WhatsApp QR" />
248
- </div>`:s}
249
- `,configSection:g({channelId:`whatsapp`,props:n}),footer:i`<div class="row" style="margin-top: 14px; flex-wrap: wrap;">
250
- ${u?i`<button
251
- class="btn"
252
- ?disabled=${n.whatsappBusy}
253
- @click=${()=>n.onWhatsAppStart(!0)}
254
- >
255
- ${c(`common.relink`)}
256
- </button>`:i`<button
257
- class="btn primary"
258
- ?disabled=${n.whatsappBusy}
259
- @click=${()=>n.onWhatsAppStart(!1)}
260
- >
261
- ${n.whatsappBusy?c(`common.working`):c(`common.showQr`)}
262
- </button>`}
263
- ${d?i`<button
264
- class="btn"
265
- ?disabled=${n.whatsappBusy}
266
- @click=${()=>n.onWhatsAppWait()}
267
- >
268
- ${c(`common.waitForScan`)}
269
- </button>`:s}
270
- <button
271
- class="btn danger"
272
- ?disabled=${n.whatsappBusy}
273
- @click=${()=>n.onWhatsAppLogout()}
274
- >
275
- ${c(`common.logout`)}
276
- </button>
277
- <button class="btn" @click=${()=>n.onRefresh(!0)}>${c(`common.refresh`)}</button>
278
- </div>`})}function F(e){let t=e.snapshot?.channels,n=t?.whatsapp??void 0,r=t?.telegram??void 0,o=t?.discord??null,l=t?.googlechat??null,u=t?.slack??null,d=t?.signal??null,f=t?.imessage??null,p=t?.nostr??null,m=I(e.snapshot).map((t,n)=>({key:t,enabled:b(t,e),order:n})).toSorted((e,t)=>e.enabled===t.enabled?e.order-t.order:e.enabled?-1:1),h=!!(e.loading&&e.snapshot&&e.lastSuccessAt),g=e.snapshot?.warnings?.filter(e=>e.trim())??[];return i`
279
- <section class="grid grid-cols-2">
280
- ${m.map(t=>L(t.key,e,{whatsapp:n,telegram:r,discord:o,googlechat:l,slack:u,signal:d,imessage:f,nostr:p,channelAccounts:e.snapshot?.channelAccounts??null}))}
281
- </section>
282
-
283
- <section class="card" style="margin-top: 18px;">
284
- <div class="row" style="justify-content: space-between;">
285
- <div>
286
- <div class="card-title">${c(`channels.health.title`)}</div>
287
- <div class="card-sub">${c(`channels.health.subtitle`)}</div>
288
- </div>
289
- <div class="muted">
290
- ${e.lastSuccessAt?a(e.lastSuccessAt):c(`common.na`)}
291
- </div>
292
- </div>
293
- ${h?i`
294
- <div class="callout info" style="margin-top: 12px;">
295
- Refreshing channel status in the background; showing the last successful snapshot.
296
- </div>
297
- `:s}
298
- ${e.snapshot?.partial?i`
299
- <div class="callout warn" style="margin-top: 12px;">
300
- Some channel checks did not finish before the UI budget.
301
- ${g.length>0?g.slice(0,3).join(`; `):``}
302
- </div>
303
- `:s}
304
- ${e.lastError?i`<div class="callout danger" style="margin-top: 12px;">${e.lastError}</div>`:s}
305
- <pre class="code-block" style="margin-top: 12px;">
306
- ${e.snapshot?JSON.stringify(e.snapshot,null,2):c(`channels.health.noSnapshotYet`)}
307
- </pre
308
- >
309
- </section>
310
- `}function I(e){return e?.channelMeta?.length?e.channelMeta.map(e=>e.id):e?.channelOrder?.length?e.channelOrder:[`whatsapp`,`telegram`,`discord`,`googlechat`,`slack`,`signal`,`imessage`,`nostr`]}function L(e,t,n){let r=T(e,n.channelAccounts);switch(e){case`whatsapp`:return P({props:t,whatsapp:n.whatsapp,accountCountLabel:r});case`telegram`:return N({props:t,telegram:n.telegram,telegramAccounts:n.channelAccounts?.telegram??[],accountCountLabel:r});case`discord`:return E({props:t,discord:n.discord,accountCountLabel:r});case`googlechat`:return D({props:t,googleChat:n.googlechat,accountCountLabel:r});case`slack`:return M({props:t,slack:n.slack,accountCountLabel:r});case`signal`:return j({props:t,signal:n.signal,accountCountLabel:r});case`imessage`:return O({props:t,imessage:n.imessage,accountCountLabel:r});case`nostr`:{let e=n.channelAccounts?.nostr??[],i=e[0],a=i?.accountId??`default`,o=i?.profile??null,s=t.nostrProfileAccountId===a?t.nostrProfileFormState:null,c=s?{onFieldChange:t.onNostrProfileFieldChange,onSave:t.onNostrProfileSave,onImport:t.onNostrProfileImport,onCancel:t.onNostrProfileCancel,onToggleAdvanced:t.onNostrProfileToggleAdvanced}:null;return A({props:t,nostr:n.nostr,nostrAccounts:e,accountCountLabel:r,profileFormState:s,profileFormCallbacks:c,onEditProfile:()=>t.onNostrProfileEdit(a,o)})}default:return R(e,t,n.channelAccounts??{})}}function R(e,t,n){let r=B(t.snapshot,e),a=y(e,t),o=typeof a.status?.lastError==`string`?a.status.lastError:void 0,l=n[e]??[],u=T(e,n);return i`
311
- <div class="card">
312
- <div class="card-title">${r}</div>
313
- <div class="card-sub">${c(`channels.generic.subtitle`)}</div>
314
- ${u}
315
- ${l.length>0?i`
316
- <div class="account-card-list">
317
- ${l.map(e=>G(e))}
318
- </div>
319
- `:i`
320
- <div class="status-list" style="margin-top: 16px;">
321
- <div>
322
- <span class="label">${c(`common.configured`)}</span>
323
- <span>${S(a.configured)}</span>
324
- </div>
325
- <div>
326
- <span class="label">${c(`common.running`)}</span>
327
- <span>${S(a.running)}</span>
328
- </div>
329
- <div>
330
- <span class="label">${c(`common.connected`)}</span>
331
- <span>${S(a.connected)}</span>
332
- </div>
333
- </div>
334
- `}
335
- ${o?i`<div class="callout danger" style="margin-top: 12px;">${o}</div>`:s}
336
- ${g({channelId:e,props:t})}
337
- </div>
338
- `}function z(e){return e?.channelMeta?.length?Object.fromEntries(e.channelMeta.map(e=>[e.id,e])):{}}function B(e,t){return z(e)[t]?.label??e?.channelLabels?.[t]??t}var V=600*1e3;function H(e){return e.lastInboundAt?Date.now()-e.lastInboundAt<V:!1}function U(e){return e.running?c(`common.yes`):H(e)?c(`common.active`):c(`common.no`)}function W(e){return e.connected===!0?c(`common.yes`):e.connected===!1?c(`common.no`):H(e)?c(`common.active`):c(`common.na`)}function G(e){let t=U(e),n=W(e);return i`
339
- <div class="account-card">
340
- <div class="account-card-header">
341
- <div class="account-card-title">${e.name||e.accountId}</div>
342
- <div class="account-card-id">${e.accountId}</div>
343
- </div>
344
- <div class="status-list account-card-status">
345
- <div>
346
- <span class="label">${c(`common.running`)}</span>
347
- <span>${t}</span>
348
- </div>
349
- <div>
350
- <span class="label">${c(`common.configured`)}</span>
351
- <span>${e.configured?c(`common.yes`):c(`common.no`)}</span>
352
- </div>
353
- <div>
354
- <span class="label">${c(`common.connected`)}</span>
355
- <span>${n}</span>
356
- </div>
357
- <div>
358
- <span class="label">${c(`common.lastInbound`)}</span>
359
- <span
360
- >${e.lastInboundAt?a(e.lastInboundAt):c(`common.na`)}</span
361
- >
362
- </div>
363
- ${e.lastError?i` <div class="account-card-error">${e.lastError}</div> `:s}
364
- </div>
365
- </div>
366
- `}export{F as renderChannels};
367
- //# sourceMappingURL=channels-C6FcgeKY.js.map