Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
1235c2d
feat(data-explorer): add unified connection vault to local router
itsmeakhil Aug 4, 2026
8f8af62
feat(data-explorer): add source adapter contract and registry
itsmeakhil Aug 4, 2026
20f978a
feat(data-explorer): add unified connection store client
itsmeakhil Aug 4, 2026
8de2742
feat(data-explorer): register route and tool metadata
itsmeakhil Aug 4, 2026
78f8b8f
feat(data-explorer): add shell layout, vault gate, and unified tab bar
itsmeakhil Aug 4, 2026
a1df403
fix(data-explorer): correct persistence comment, i18n the load-failed…
itsmeakhil Aug 4, 2026
2e3b24f
feat(data-explorer): add connection dialog with source picker
itsmeakhil Aug 4, 2026
a5b6ef0
feat(data-explorer): add unified sidebar with per-source grouping
itsmeakhil Aug 4, 2026
45b438b
fix(data-explorer): stable sidebar handlers, a11y labels, prune orpha…
itsmeakhil Aug 4, 2026
c52117b
feat(data-explorer): add MongoDB adapter config, form, and registration
itsmeakhil Aug 4, 2026
58b6f40
fix(data-explorer): route MongoDB adapter validation/error copy throu…
itsmeakhil Aug 4, 2026
ff64a0b
feat(data-explorer): add Mongo actions hook
itsmeakhil Aug 4, 2026
1393aa4
feat(data-explorer): add MongoDB sidebar tree
itsmeakhil Aug 4, 2026
21060e3
feat(data-explorer): restore Mongo tree parity — bulk delete, search,…
itsmeakhil Aug 4, 2026
330fd7e
feat(data-explorer): add MongoDB pane with full parity
itsmeakhil Aug 4, 2026
3dc335a
fix(data-explorer): confirm single-document delete, key pane per tab
itsmeakhil Aug 4, 2026
e6230f5
feat(data-explorer): add Redis adapter config, form, and registration
itsmeakhil Aug 4, 2026
c3f0cf4
fix(data-explorer): make sanitizeRedisError fail closed on parse failure
itsmeakhil Aug 4, 2026
5754332
feat(data-explorer): add Redis sidebar tree and pane with full parity
itsmeakhil Aug 4, 2026
016b42f
fix(data-explorer): drop in-pane db selector and Redis read-only switch
itsmeakhil Aug 4, 2026
8ad4279
feat(data-explorer): add legacy connection import
itsmeakhil Aug 4, 2026
820b2c1
fix(data-explorer): dedupe legacy imports by config, gate on loaded s…
itsmeakhil Aug 4, 2026
04c6014
feat(data-explorer): add DataExplorer translations for all locales
itsmeakhil Aug 4, 2026
a8a4abe
fix(data-explorer): review wave — mobile trigger, optional test, live…
itsmeakhil Aug 4, 2026
e65ae98
feat(data-explorer): make the data source picker a dropdown
itsmeakhil Aug 4, 2026
a2c9556
feat(data-explorer): infer Mongo dialect instead of asking for it
itsmeakhil Aug 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 149 additions & 0 deletions apps/desktop-ui/messages/af.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"jsonFormatter": "JSON-formateerder",
"emailValidator": "E-posvalidasie",
"nosqlExplorer": "Databasis Verkenner",
"dataExplorer": "Data Explorer",
"toDo": "Tasks",
"notes": "Notes",
"encryptionPlayground": "Enkripsie-speelgrond",
Expand Down Expand Up @@ -348,6 +349,10 @@
"title": "Database Explorer",
"description": "Verken MongoDB-databasisse."
},
"dataExplorer": {
"title": "Data Explorer",
"description": "Een werkspasie vir MongoDB en Redis. Blaai, doen navrae en wysig met 'n versleutelde geloofsbriewe-winkel."
},
"emailValidator": {
"title": "E-posvalidator",
"description": "Verifieer en valideer e-posadresse."
Expand Down Expand Up @@ -1859,6 +1864,150 @@
"exportHtml": "HTML report"
}
},
"DataExplorer": {
"title": "Data Explorer",
"emptyTitle": "Nog geen koppelings nie",
"emptyBody": "Voeg 'n MongoDB- of Redis-koppeling by om te begin blaai. Geloofsbriewe word op jou toestel versleutel.",
"addConnection": "Nuwe koppeling",
"importLegacy": "Voer in vanaf bestaande nutsmiddels",
"searchConnections": "Soek koppelings",
"openSidebar": "Open verbindings",
"unsupportedSource": "Nie-ondersteunde bron",
"unsupportedSourceHint": "Hierdie koppeling is deur 'n nuwer weergawe van die app geskep.",
"noResults": "Geen koppelings pas by jou soektog nie.",
"connectionActions": "Aksies vir {name}",
"menuEdit": "Wysig",
"menuDelete": "Vee uit",
"deleteTitle": "Vee koppeling uit?",
"deleteBody": "{name} en sy gestoorde geloofsbriewe sal van hierdie toestel verwyder word. Dit kan nie ongedaan gemaak word nie.",
"deleteDocTitle": "Vee dokument uit?",
"deleteDocBody": "Hierdie dokument sal permanent uit die versameling verwyder word. Dit kan nie ongedaan gemaak word nie.",
"closeAll": "Sluit alles",
"noTabsTitle": "Niks oop nie",
"noTabsBody": "Kies 'n koppeling in die sybalk om 'n oortjie oop te maak.",
"connectionDialog": {
"createTitle": "Nuwe koppeling",
"editTitle": "Wysig koppeling",
"pickSource": "Databron",
"name": "Naam",
"namePlaceholder": "My koppeling",
"folder": "Vouer",
"folderPlaceholder": "Opsionele groep",
"color": "Kleur",
"colorNone": "Geen kleur nie",
"dbType": "Databasistipe",
"connectionString": "Koppelingsstring",
"readOnly": "Leesalleen",
"readOnlyHint": "Blokkeer elke skryfbewerking vir hierdie koppeling.",
"test": "Toets koppeling",
"testOk": "Gekoppel",
"testFailed": "Kon nie koppel nie",
"save": "Stoor",
"cancel": "Kanselleer"
},
"importDialog": {
"title": "Voer in vanaf bestaande nutsmiddels",
"loading": "Soek tans na koppelings in Databasis Verkenner en Redis Bestuurder…",
"notReady": "Besig om jou bestaande koppelings te laai — probeer oor 'n oomblik weer.",
"empty": "Geen koppelings gevind in Databasis Verkenner of Redis Bestuurder nie.",
"allSkipped": "{count, plural, one {# koppeling is} other {# koppelings is}} reeds ingevoer. Niks nuuts om in te bring nie.",
"previewHeading": "{count, plural, one {# koppeling} other {# koppelings}} sal ingevoer word:",
"skippedNote": "{count, plural, one {# koppeling is} other {# koppelings is}} reeds ingevoer en sal oorgeslaan word.",
"importing": "Voer tans in…",
"confirm": "Voer {count, plural, one {# koppeling} other {# koppelings}} in"
},
"toast": {
"saved": "Koppeling gestoor",
"deleted": "Koppeling uitgevee",
"saveFailed": "Kon nie die koppeling stoor nie",
"deleteFailed": "Kon nie die koppeling uitvee nie",
"loadFailed": "Kon nie koppelings laai nie",
"fetchFailed": "Kon nie dokumente vir {collection} laai nie",
"docDeleted": "Dokument uitgevee",
"legacyImportFailed": "Kon nie bestaande koppelings van Databasis Verkenner of Redis Bestuurder lees nie",
"legacyImportResult": "{imported, plural, =0 {Geen nuwe koppelings ingevoer nie} one {# koppeling ingevoer} other {# koppelings ingevoer}}{skipped, plural, =0 {} other {, # reeds ingevoer}}{failed, plural, =0 {} other {, # het misluk}}"
},
"validation": {
"connectionStringRequired": "Voer 'n koppelingsstring in.",
"connectionStringScheme": "Koppelingsstring moet begin met mongodb:// of mongodb+srv://.",
"redisUrlRequired": "Voer 'n Redis-URL in.",
"redisUrlScheme": "Redis-URL moet begin met redis:// of rediss://."
},
"redis": {
"urlMode": "URL",
"builderMode": "Bouer",
"url": "Redis-URL",
"urlPlaceholder": "redis://localhost:6379 of rediss://user:pass@host:6380",
"urlHint": "Ondersteun redis:// en rediss:// (TLS). Geloofsbriewe word voor stoor versleutel.",
"host": "Gasheer",
"port": "Poort",
"username": "Gebruikersnaam (ACL)",
"usernamePlaceholder": "default",
"password": "Wagwoord",
"dbIndex": "DB-indeks",
"dbIndexPlaceholder": "0",
"tls": "Gebruik TLS (rediss://)",
"dbLabel": "db {index}",
"noMatches": "Geen passende databasisse nie",
"tabKeyEditor": "Sleutelredigeerder",
"tabConsole": "Konsole",
"tabServer": "Bediener",
"tabPubSub": "Pub/Sub",
"tabMonitor": "Monitor",
"tabScanner": "Skandeerder",
"tabSearch": "Soek",
"flush": "Spoel",
"flushTitle": "Spoel Sleutels",
"flushDescription": "Voer 'n patroon in om passende sleutels uit te vee, of laat leeg om die hele databasis te spoel (vereis DANGER_ZONE=true).",
"flushPatternLabel": "Patroon (opsioneel)",
"flushPatternPlaceholder": "bv. session:* — leeg = FLUSHDB",
"flushing": "Spoel tans…",
"flushedAll": "Databasis gespoel",
"flushedKeys": "{count, plural, one {# sleutel uitgevee} other {# sleutels uitgevee}}",
"flushFailed": "Spoel het misluk"
},
"mongo": {
"refreshDatabases": "Verfris databasisse",
"serverMonitor": "Bediener-monitor",
"connecting": "Besig om te koppel…",
"connectionFailed": "Kon nie koppel nie",
"noDatabases": "Geen databasisse nie",
"loadingCollections": "Laai tans versamelings…",
"collectionsFailed": "Kon nie versamelings laai nie",
"noCollections": "Geen versamelings nie",
"noMatches": "Geen databasisse pas by jou soektog nie",
"databaseActions": "Aksies vir databasis {name}",
"collectionActions": "Aksies vir versameling {name}",
"selectCollection": "Kies versameling {name}",
"deleteSelected": "Vee {count} gekose uit",
"clearSelection": "Maak skoon",
"refresh": "Verfris",
"rename": "Hernoem",
"copyDbName": "Kopieer databasisnaam",
"browseGridfs": "Blaai deur GridFS",
"sync": "Sinkroniseer versameling",
"dropDatabase": "Laat databasis val",
"dropCollection": "Laat versameling val",
"toast": {
"connectFailed": "Kon nie aan {name} koppel nie",
"collectionsFailed": "Kon nie versamelings vir {name} laai nie",
"dbNameCopied": "Databasisnaam gekopieer",
"nameEmpty": "Voer 'n naam in.",
"nameTooLong": "Daardie naam is te lank.",
"nameForbiddenChars": "'n Databasisnaam mag nie / \\ . of $ bevat nie",
"nameConsecutiveDots": "'n Databasisnaam mag nie opeenvolgende punte bevat nie.",
"nameNullChar": "'n Versamelingnaam mag nie 'n nul-karakter bevat nie.",
"nameReservedPrefix": "'n Versamelingnaam mag nie met $ begin nie — daardie voorvoegsel is gereserveer.",
"nameInvalid": "Daardie naam is nie geldig nie.",
"renamed": "Hernoem na {name}",
"renameFailed": "Kon nie hernoem nie",
"dropped": "{name} laat val",
"dropFailed": "Kon nie {name} laat val nie",
"bulkDropped": "{count} versamelings laat val",
"bulkDropFailed": "Kon nie {count} versamelings laat val nie"
}
}
},
"ApiClient": {
"defaults": {
"newRequest": "Nuwe versoek",
Expand Down
149 changes: 149 additions & 0 deletions apps/desktop-ui/messages/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"jsonFormatter": "منسّق JSON",
"emailValidator": "التحقق من البريد",
"nosqlExplorer": "مستكشف قاعدة البيانات",
"dataExplorer": "Data Explorer",
"toDo": "Tasks",
"notes": "Notes",
"encryptionPlayground": "ملعب التشفير",
Expand Down Expand Up @@ -348,6 +349,10 @@
"title": "Database Explorer",
"description": "استكشف قواعد بيانات MongoDB."
},
"dataExplorer": {
"title": "Data Explorer",
"description": "مساحة عمل واحدة لـ MongoDB و Redis. تصفح واستعلم وعدّل باستخدام مخزن بيانات اعتماد مشفّر."
},
"emailValidator": {
"title": "التحقق من البريد",
"description": "تحقق من عناوين البريد الإلكتروني."
Expand Down Expand Up @@ -1944,6 +1949,150 @@
"colCoverage": "التغطية"
}
},
"DataExplorer": {
"title": "Data Explorer",
"emptyTitle": "لا توجد اتصالات بعد",
"emptyBody": "أضف اتصال MongoDB أو Redis لبدء التصفح. تُشفَّر بيانات الاعتماد على جهازك.",
"addConnection": "اتصال جديد",
"importLegacy": "الاستيراد من الأدوات الحالية",
"searchConnections": "البحث في الاتصالات",
"openSidebar": "فتح الاتصالات",
"unsupportedSource": "مصدر غير مدعوم",
"unsupportedSourceHint": "تم إنشاء هذا الاتصال بواسطة إصدار أحدث من التطبيق.",
"noResults": "لا توجد اتصالات تطابق بحثك.",
"connectionActions": "إجراءات لـ {name}",
"menuEdit": "تعديل",
"menuDelete": "حذف",
"deleteTitle": "حذف الاتصال؟",
"deleteBody": "سيتم إزالة {name} وبيانات الاعتماد المحفوظة الخاصة به من هذا الجهاز. لا يمكن التراجع عن هذا الإجراء.",
"deleteDocTitle": "حذف المستند؟",
"deleteDocBody": "سيتم حذف هذا المستند نهائيًا من المجموعة. لا يمكن التراجع عن هذا الإجراء.",
"closeAll": "إغلاق الكل",
"noTabsTitle": "لا شيء مفتوح",
"noTabsBody": "اختر اتصالاً من الشريط الجانبي لفتح تبويب.",
"connectionDialog": {
"createTitle": "اتصال جديد",
"editTitle": "تعديل الاتصال",
"pickSource": "مصدر البيانات",
"name": "الاسم",
"namePlaceholder": "اتصالي",
"folder": "المجلد",
"folderPlaceholder": "مجموعة اختيارية",
"color": "اللون",
"colorNone": "بدون لون",
"dbType": "نوع قاعدة البيانات",
"connectionString": "سلسلة الاتصال",
"readOnly": "للقراءة فقط",
"readOnlyHint": "يمنع كل عمليات الكتابة لهذا الاتصال.",
"test": "اختبار الاتصال",
"testOk": "متصل",
"testFailed": "تعذّر الاتصال",
"save": "حفظ",
"cancel": "إلغاء"
},
"importDialog": {
"title": "الاستيراد من الأدوات الحالية",
"loading": "جارٍ البحث عن اتصالات في مستكشف قاعدة البيانات ومنفّذ Redis…",
"notReady": "لا تزال اتصالاتك الحالية قيد التحميل — أعد المحاولة بعد قليل.",
"empty": "لم يتم العثور على اتصالات في مستكشف قاعدة البيانات أو منفّذ Redis.",
"allSkipped": "{count, plural, zero {لا اتصالات مستوردة بعد} one {تم استيراد اتصال واحد بالفعل} two {تم استيراد اتصالين بالفعل} few {تم استيراد # اتصالات بالفعل} many {تم استيراد # اتصالاً بالفعل} other {تم استيراد # اتصال بالفعل}}. لا جديد لإحضاره.",
"previewHeading": "{count, plural, zero {لا اتصالات لاستيرادها} one {سيتم استيراد اتصال واحد} two {سيتم استيراد اتصالين} few {سيتم استيراد # اتصالات} many {سيتم استيراد # اتصالاً} other {سيتم استيراد # اتصال}}:",
"skippedNote": "{count, plural, zero {لا اتصالات تم استيرادها مسبقًا} one {تم استيراد اتصال واحد مسبقًا وسيُتخطى} two {تم استيراد اتصالين مسبقًا وسيُتخطيان} few {تم استيراد # اتصالات مسبقًا وستُتخطى} many {تم استيراد # اتصالاً مسبقًا وستُتخطى} other {تم استيراد # اتصال مسبقًا وستُتخطى}}.",
"importing": "جارٍ الاستيراد…",
"confirm": "استيراد {count, plural, zero {# اتصالات} one {اتصال واحد} two {اتصالين} few {# اتصالات} many {# اتصالاً} other {# اتصال}}"
},
"toast": {
"saved": "تم حفظ الاتصال",
"deleted": "تم حذف الاتصال",
"saveFailed": "تعذّر حفظ الاتصال",
"deleteFailed": "تعذّر حذف الاتصال",
"loadFailed": "تعذّر تحميل الاتصالات",
"fetchFailed": "فشل جلب مستندات {collection}",
"docDeleted": "تم حذف المستند",
"legacyImportFailed": "تعذّرت قراءة الاتصالات الحالية من مستكشف قاعدة البيانات أو منفّذ Redis",
"legacyImportResult": "{imported, plural, =0 {لم تُستورد أي اتصالات جديدة} one {تم استيراد اتصال واحد} two {تم استيراد اتصالين} few {تم استيراد # اتصالات} many {تم استيراد # اتصالاً} other {تم استيراد # اتصال}}{skipped, plural, =0 {} one {، اتصال واحد مستورد مسبقًا} two {، اتصالان مستوردان مسبقًا} few {، # اتصالات مستوردة مسبقًا} many {، # اتصالاً مستوردًا مسبقًا} other {، # اتصال مستورد مسبقًا}}{failed, plural, =0 {} one {، وفشل اتصال واحد} two {، وفشل اتصالان} few {، وفشلت # اتصالات} many {، وفشل # اتصالاً} other {، وفشل # اتصال}}"
},
"validation": {
"connectionStringRequired": "أدخل سلسلة الاتصال.",
"connectionStringScheme": "يجب أن تبدأ سلسلة الاتصال بـ mongodb:// أو mongodb+srv://.",
"redisUrlRequired": "أدخل رابط Redis.",
"redisUrlScheme": "يجب أن يبدأ رابط Redis بـ redis:// أو rediss://."
},
"redis": {
"urlMode": "الرابط",
"builderMode": "منشئ",
"url": "رابط Redis",
"urlPlaceholder": "redis://localhost:6379 أو rediss://user:pass@host:6380",
"urlHint": "يدعم redis:// و rediss:// (TLS). يتم تشفير بيانات الاعتماد قبل التخزين.",
"host": "المضيف",
"port": "المنفذ",
"username": "اسم المستخدم (ACL)",
"usernamePlaceholder": "default",
"password": "كلمة المرور",
"dbIndex": "فهرس قاعدة البيانات",
"dbIndexPlaceholder": "0",
"tls": "استخدام TLS (rediss://)",
"dbLabel": "قاعدة {index}",
"noMatches": "لا توجد قواعد بيانات مطابقة",
"tabKeyEditor": "محرر المفاتيح",
"tabConsole": "وحدة التحكم",
"tabServer": "الخادم",
"tabPubSub": "Pub/Sub",
"tabMonitor": "المراقبة",
"tabScanner": "الماسح",
"tabSearch": "البحث",
"flush": "تفريغ",
"flushTitle": "تفريغ المفاتيح",
"flushDescription": "أدخل نمطًا لحذف المفاتيح المطابقة، أو اتركه فارغًا لتفريغ قاعدة البيانات بأكملها (يتطلب DANGER_ZONE=true).",
"flushPatternLabel": "النمط (اختياري)",
"flushPatternPlaceholder": "مثال: session:* — الحقل الفارغ = FLUSHDB",
"flushing": "جارٍ التفريغ…",
"flushedAll": "تم تفريغ قاعدة البيانات",
"flushedKeys": "{count, plural, zero {لم يُحذف أي مفتاح} one {تم حذف مفتاح واحد} two {تم حذف مفتاحين} few {تم حذف # مفاتيح} many {تم حذف # مفتاحاً} other {تم حذف # مفتاح}}",
"flushFailed": "فشل التفريغ"
},
"mongo": {
"refreshDatabases": "تحديث قواعد البيانات",
"serverMonitor": "مراقب الخادم",
"connecting": "جارٍ الاتصال…",
"connectionFailed": "تعذّر الاتصال",
"noDatabases": "لا قواعد بيانات",
"loadingCollections": "جارٍ تحميل المجموعات…",
"collectionsFailed": "تعذّر تحميل المجموعات",
"noCollections": "لا مجموعات",
"noMatches": "لا توجد قواعد بيانات تطابق بحثك",
"databaseActions": "إجراءات لقاعدة البيانات {name}",
"collectionActions": "إجراءات للمجموعة {name}",
"selectCollection": "تحديد المجموعة {name}",
"deleteSelected": "حذف {count} محدد",
"clearSelection": "مسح",
"refresh": "تحديث",
"rename": "إعادة تسمية",
"copyDbName": "نسخ اسم قاعدة البيانات",
"browseGridfs": "تصفح GridFS",
"sync": "مزامنة المجموعة",
"dropDatabase": "حذف قاعدة البيانات",
"dropCollection": "حذف المجموعة",
"toast": {
"connectFailed": "تعذّر الاتصال بـ {name}",
"collectionsFailed": "تعذّر تحميل مجموعات {name}",
"dbNameCopied": "تم نسخ اسم قاعدة البيانات",
"nameEmpty": "أدخل اسمًا.",
"nameTooLong": "هذا الاسم طويل جدًا.",
"nameForbiddenChars": "لا يمكن أن يحتوي اسم قاعدة البيانات على / \\ . أو $",
"nameConsecutiveDots": "لا يمكن أن يحتوي اسم قاعدة البيانات على نقاط متتالية.",
"nameNullChar": "لا يمكن أن يحتوي اسم المجموعة على حرف فارغ (null).",
"nameReservedPrefix": "لا يمكن أن يبدأ اسم المجموعة بـ $ — هذه البادئة محجوزة.",
"nameInvalid": "هذا الاسم غير صالح.",
"renamed": "تمت إعادة التسمية إلى {name}",
"renameFailed": "تعذّرت إعادة التسمية",
"dropped": "تم حذف {name}",
"dropFailed": "تعذّر حذف {name}",
"bulkDropped": "تم حذف {count} مجموعة",
"bulkDropFailed": "تعذّر حذف {count} مجموعة"
}
}
},
"ApiClient": {
"defaults": {
"newRequest": "طلب جديد",
Expand Down
Loading