From 3fd1265d8905c73515f67947bcc565a4e43bc067 Mon Sep 17 00:00:00 2001 From: Diego Rodrigues de Sa e Souza Date: Sat, 19 Sep 2026 00:41:36 -0300 Subject: [PATCH] fix(dashboard): explicit notice for size-limit-omitted log payloads (#14045) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merged via /merge-batch (2026-09-19) on top of the current `release/v3.8.51` tip. **Reconciled before landing:** `requestLogger.detail.payloadSizeLimitOmitted` was stamped `__MISSING__:` in 65 locales and the new-key gate rejects markers since 2026-09-17. The LAN translation backends were unavailable (codex accounts at quota for ~136h, claude connection expired, .113 instance in resource_pressure), so the single string was translated by hand in `818a1151` — `CALL_LOG_PIPELINE_MAX_SIZE_KB` kept verbatim in every locale, one line changed per catalog. **Evidence on the merged tree:** `check-new-key-coverage` PASS (every new key reached all 65 locales); `payload-section-size-limit-notice.test.tsx` 7/7; `typecheck:core` clean; file-size, changelog-integrity, complexity and cognitive-complexity gates OK; prettier clean on all 65 catalogs. **Inherited, not from this PR** (identical on the pure tip): `check-env-doc-sync` misses `BRIDGE_PORT`/`CERT_DIR`/`OPENWA_SERVICE_PORT`/`ROUTER_URL` in `.env.example`, and `check-key-completeness` reports 7 keys (`providers.claude*`, `sidebar.pin*`) present in `en.json` but absent from every locale. Closes #13894 --- .env.example | 4 +- .../13894-log-detail-size-limit-notice.md | 1 + src/i18n/messages/am.json | 3 +- src/i18n/messages/ar.json | 1 + src/i18n/messages/az.json | 1 + src/i18n/messages/bg.json | 1 + src/i18n/messages/bn.json | 1 + src/i18n/messages/cs.json | 1 + src/i18n/messages/da.json | 1 + src/i18n/messages/de.json | 1 + src/i18n/messages/el.json | 3 +- src/i18n/messages/en.json | 1 + src/i18n/messages/es.json | 1 + src/i18n/messages/et.json | 1 + src/i18n/messages/fa.json | 1 + src/i18n/messages/fi.json | 1 + src/i18n/messages/fr.json | 1 + src/i18n/messages/ga.json | 3 +- src/i18n/messages/gu.json | 1 + src/i18n/messages/ha.json | 3 +- src/i18n/messages/he.json | 1 + src/i18n/messages/hi.json | 1 + src/i18n/messages/hr.json | 1 + src/i18n/messages/hu.json | 1 + src/i18n/messages/hy.json | 3 +- src/i18n/messages/id.json | 1 + src/i18n/messages/ig.json | 1 + src/i18n/messages/it.json | 1 + src/i18n/messages/ja.json | 1 + src/i18n/messages/ka.json | 1 + src/i18n/messages/km.json | 3 +- src/i18n/messages/kn.json | 1 + src/i18n/messages/ko.json | 1 + src/i18n/messages/lt.json | 1 + src/i18n/messages/lv.json | 3 +- src/i18n/messages/ml.json | 1 + src/i18n/messages/mr.json | 1 + src/i18n/messages/ms.json | 1 + src/i18n/messages/mt.json | 1 + src/i18n/messages/my.json | 1 + src/i18n/messages/ne.json | 1 + src/i18n/messages/nl.json | 1 + src/i18n/messages/no.json | 1 + src/i18n/messages/or.json | 1 + src/i18n/messages/pa.json | 1 + src/i18n/messages/phi.json | 1 + src/i18n/messages/pl.json | 1 + src/i18n/messages/pt-BR.json | 1 + src/i18n/messages/pt.json | 1 + src/i18n/messages/ro.json | 1 + src/i18n/messages/ru.json | 1 + src/i18n/messages/si.json | 3 +- src/i18n/messages/sk.json | 1 + src/i18n/messages/sl.json | 1 + src/i18n/messages/sr.json | 1 + src/i18n/messages/sv.json | 1 + src/i18n/messages/sw.json | 1 + src/i18n/messages/ta.json | 1 + src/i18n/messages/te.json | 1 + src/i18n/messages/th.json | 1 + src/i18n/messages/tr.json | 1 + src/i18n/messages/uk-UA.json | 1 + src/i18n/messages/ur.json | 1 + src/i18n/messages/uz.json | 1 + src/i18n/messages/vi.json | 1 + src/i18n/messages/yo.json | 3 +- src/i18n/messages/zh-CN.json | 1 + src/i18n/messages/zh-TW.json | 1 + src/lib/usage/callLogArtifacts.ts | 28 ++-- .../RequestLoggerDetail.sections.tsx | 77 ++++++++-- src/shared/components/RequestLoggerDetail.tsx | 34 +++-- .../constants/callLogSizeLimitMarkers.ts | 40 ++++++ ...payload-section-size-limit-notice.test.tsx | 134 ++++++++++++++++++ 73 files changed, 348 insertions(+), 54 deletions(-) create mode 100644 changelog.d/fixes/13894-log-detail-size-limit-notice.md create mode 100644 src/shared/constants/callLogSizeLimitMarkers.ts create mode 100644 tests/unit/dashboard/payload-section-size-limit-notice.test.tsx diff --git a/.env.example b/.env.example index 67775b6725..a31d2284a2 100644 --- a/.env.example +++ b/.env.example @@ -1890,8 +1890,8 @@ APP_LOG_TO_FILE=true # bodies is retained in the database. # Used by: open-sse/handlers/chatCore.ts — cloneBoundedChatLogPayload() # CHAT_LOG_TEXT_LIMIT=65536 # Max string length before truncation (default: 64 KB) -# CHAT_LOG_ARRAY_TAIL_ITEMS=128 # Number of array items retained from tail (default: 128) -# CHAT_LOG_MAX_DEPTH=6 # Max nesting depth before truncation (default: 6) +# CHAT_LOG_ARRAY_TAIL_ITEMS=1000 # Number of array items retained from tail (default: 1000) +# CHAT_LOG_MAX_DEPTH=20 # Max nesting depth before truncation (default: 20) # CHAT_LOG_MAX_OBJECT_KEYS=80 # Max object keys retained (default: 80, 0 = no limit) # CHAT_LOG_MAX_BODY_KB=1024 # Whole request/response body size before it's replaced by a bare # {_truncated, messageCount, ...} summary instead of the full clone diff --git a/changelog.d/fixes/13894-log-detail-size-limit-notice.md b/changelog.d/fixes/13894-log-detail-size-limit-notice.md new file mode 100644 index 0000000000..fe9010edc3 --- /dev/null +++ b/changelog.d/fixes/13894-log-detail-size-limit-notice.md @@ -0,0 +1 @@ +- **fix(dashboard):** the request-log detail view now shows an explicit "payload omitted — exceeded the call log size limit" notice for a pipeline/request/response section that was replaced by the size-limit marker (`_omniroute_truncated` / `[omitted: call log artifact size limit exceeded]`), instead of silently rendering the marker verbatim under a generic "Pipeline Error" title as if it were a real upstream error. Also fixed `.env.example` documenting stale `CHAT_LOG_ARRAY_TAIL_ITEMS=128`/`CHAT_LOG_MAX_DEPTH=6` defaults that no longer match the code's actual `1000`/`20`. diff --git a/src/i18n/messages/am.json b/src/i18n/messages/am.json index 8f5f029db8..e5602201aa 100644 --- a/src/i18n/messages/am.json +++ b/src/i18n/messages/am.json @@ -11464,7 +11464,8 @@ "correlationIdValue": "የትስስር መታወቂያ፦ {id}", "detailedPayloadInfo": "ለአዳዲስ ጥያቄዎች ባለአራት-ደረጃ የደንበኛ/አቅራቢ ውሂብ እይታን ከፈለጉ፣ መጀመሪያ ዝርዝር ምዝገባን ያንቁ።", "copyAll": "ሁሉንም ቅዳ", - "copiedAll": "ሁሉም ተቀድቷል" + "copiedAll": "ሁሉም ተቀድቷል", + "payloadSizeLimitOmitted": "ጭነት ተትቷል — ይህ ክፍል የጥሪ ምዝግብ መጠን ገደብን (CALL_LOG_PIPELINE_MAX_SIZE_KB) አልፏል እና አልተቀመጠም፤ እውነተኛ የላይኛው ስህተት አይደለም።" } }, "proxyLogger": { diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json index 3f0f02f257..b91d4b0890 100644 --- a/src/i18n/messages/ar.json +++ b/src/i18n/messages/ar.json @@ -11411,6 +11411,7 @@ "clientResponse": "استجابة العميل", "pipelineError": "خطأ في خط الأنابيب" }, + "payloadSizeLimitOmitted": "تم حذف الحمولة — تجاوز هذا القسم حد حجم سجل الاستدعاءات (CALL_LOG_PIPELINE_MAX_SIZE_KB) ولم يتم تخزينه؛ هذا ليس خطأً حقيقيًا من المزوّد.", "payloadMissing": "لا يتوفر حِمل البيانات التفصيلي بعد الآن لهذه السجل.", "payloadCorrupt": "تعذر تحليل الحمولة التفصيلية.", "notAvailable": "غير متوفر", diff --git a/src/i18n/messages/az.json b/src/i18n/messages/az.json index 5f1588a81f..4f76783c38 100644 --- a/src/i18n/messages/az.json +++ b/src/i18n/messages/az.json @@ -11411,6 +11411,7 @@ "clientResponse": "Müştəri Cavabı", "pipelineError": "Borular Xətası" }, + "payloadSizeLimitOmitted": "Yük buraxıldı — bu bölmə çağırış jurnalının ölçü limitini (CALL_LOG_PIPELINE_MAX_SIZE_KB) aşdı və saxlanılmadı; bu, real yuxarı axın xətası deyil.", "payloadMissing": "Bu log girişinə aid ətraflı yük artefaktı artıq mövcud deyil.", "payloadCorrupt": "Ətraflı yük artefaktı təhlil oluna bilmədi.", "notAvailable": "Mövcud deyil", diff --git a/src/i18n/messages/bg.json b/src/i18n/messages/bg.json index f5f0740e90..fb58a93d13 100644 --- a/src/i18n/messages/bg.json +++ b/src/i18n/messages/bg.json @@ -11411,6 +11411,7 @@ "clientResponse": "Отговор на клиента", "pipelineError": "Грешка в потока" }, + "payloadSizeLimitOmitted": "Съдържанието е пропуснато — тази секция надвиши лимита за размер на дневника на заявките (CALL_LOG_PIPELINE_MAX_SIZE_KB) и не беше записана; това не е реална грешка от доставчика.", "payloadMissing": "Подробният артефакт на полезния товар вече не е наличен за този запис на лог.", "payloadCorrupt": "Неуспешно парсиране на детайлен артефакт на полезния товар.", "notAvailable": "Няма данни", diff --git a/src/i18n/messages/bn.json b/src/i18n/messages/bn.json index 378738b366..3cc50edbb1 100644 --- a/src/i18n/messages/bn.json +++ b/src/i18n/messages/bn.json @@ -11411,6 +11411,7 @@ "clientResponse": "ক্লায়েন্ট প্রতিক্রিয়া", "pipelineError": "পাইপলাইন ত্রুটি" }, + "payloadSizeLimitOmitted": "পেলোড বাদ দেওয়া হয়েছে — এই অংশটি কল লগের আকারসীমা (CALL_LOG_PIPELINE_MAX_SIZE_KB) ছাড়িয়ে গেছে এবং সংরক্ষণ করা হয়নি; এটি প্রকৃত আপস্ট্রিম ত্রুটি নয়।", "payloadMissing": "এই লগ এন্ট্রির জন্য বিস্তারিত পেলোড আর্টিফ্যাক্ট আর উপলব্ধ নেই।", "payloadCorrupt": "বিস্তারিত পেলোড আর্টিফ্যাক্ট পার্স করা যায়নি।", "notAvailable": "প্রযোজ্য নয়", diff --git a/src/i18n/messages/cs.json b/src/i18n/messages/cs.json index 3168a9838c..fb2ac9b876 100644 --- a/src/i18n/messages/cs.json +++ b/src/i18n/messages/cs.json @@ -11411,6 +11411,7 @@ "clientResponse": "Odpověď klienta", "pipelineError": "Chyba v pipeline" }, + "payloadSizeLimitOmitted": "Obsah vynechán — tato sekce překročila limit velikosti záznamu volání (CALL_LOG_PIPELINE_MAX_SIZE_KB) a nebyla uložena; nejde o skutečnou chybu poskytovatele.", "payloadMissing": "Podrobný artefakt payloadu již není k dispozici pro tento záznam protokolu.", "payloadCorrupt": "Podrobný payload artefakt nebyl možné analyzovat.", "notAvailable": "Není k dispozici", diff --git a/src/i18n/messages/da.json b/src/i18n/messages/da.json index de39f2ea2e..e24cd8e168 100644 --- a/src/i18n/messages/da.json +++ b/src/i18n/messages/da.json @@ -11411,6 +11411,7 @@ "clientResponse": "Klientrespons", "pipelineError": "Pipeline Fejl" }, + "payloadSizeLimitOmitted": "Payload udeladt — denne sektion overskred størrelsesgrænsen for kaldloggen (CALL_LOG_PIPELINE_MAX_SIZE_KB) og blev ikke gemt; det er ikke en reel upstream-fejl.", "payloadMissing": "Den detaljerede payload-artifact er ikke længere tilgængelig for denne logpost.", "payloadCorrupt": "Den detaljerede payload-artifact kunne ikke parses.", "notAvailable": "Ikke tilgængelig", diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json index 7bd41db6da..4d3a945fca 100644 --- a/src/i18n/messages/de.json +++ b/src/i18n/messages/de.json @@ -11411,6 +11411,7 @@ "clientResponse": "Kundenantwort", "pipelineError": "Pipeline-Fehler" }, + "payloadSizeLimitOmitted": "Payload ausgelassen — dieser Abschnitt hat das Größenlimit des Aufrufprotokolls (CALL_LOG_PIPELINE_MAX_SIZE_KB) überschritten und wurde nicht gespeichert; es handelt sich nicht um einen echten Upstream-Fehler.", "payloadMissing": "Das detaillierte Payload-Artefakt ist für diesen Protokolleintrag nicht mehr verfügbar.", "payloadCorrupt": "Detailliertes Payload-Artefakt konnte nicht analysiert werden.", "notAvailable": "Nicht verfügbar", diff --git a/src/i18n/messages/el.json b/src/i18n/messages/el.json index 495ae6eaf8..4d367cb94e 100644 --- a/src/i18n/messages/el.json +++ b/src/i18n/messages/el.json @@ -11464,7 +11464,8 @@ "correlationIdValue": "Αναγνωριστικό συσχέτισης: {id}", "detailedPayloadInfo": "Ενεργοποιήστε πρώτα τη λεπτομερή καταγραφή εάν θέλετε την προβολή ωφέλιμου φορτίου τεσσάρων σταδίων πελάτη/παρόχου για νέα αιτήματα.", "copyAll": "Αντιγραφή όλων", - "copiedAll": "Αντιγράφηκαν όλα" + "copiedAll": "Αντιγράφηκαν όλα", + "payloadSizeLimitOmitted": "Το φορτίο παραλείφθηκε — αυτή η ενότητα υπέρβη το όριο μεγέθους του αρχείου κλήσεων (CALL_LOG_PIPELINE_MAX_SIZE_KB) και δεν αποθηκεύτηκε· δεν πρόκειται για πραγματικό σφάλμα του παρόχου." } }, "proxyLogger": { diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 18433ec10a..a5b7e344e1 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -11418,6 +11418,7 @@ "clientResponse": "Client Response", "pipelineError": "Pipeline Error" }, + "payloadSizeLimitOmitted": "Payload omitted — this section exceeded the call log size limit (CALL_LOG_PIPELINE_MAX_SIZE_KB) and was not stored, not a real upstream error.", "payloadMissing": "Detailed payload artifact is no longer available for this log entry.", "payloadCorrupt": "Detailed payload artifact could not be parsed.", "notAvailable": "N/A", diff --git a/src/i18n/messages/es.json b/src/i18n/messages/es.json index c994343113..b42c6ee410 100644 --- a/src/i18n/messages/es.json +++ b/src/i18n/messages/es.json @@ -11411,6 +11411,7 @@ "clientResponse": "Respuesta del Cliente", "pipelineError": "Error de Pipeline" }, + "payloadSizeLimitOmitted": "Contenido omitido — esta sección superó el límite de tamaño del registro de llamadas (CALL_LOG_PIPELINE_MAX_SIZE_KB) y no se guardó; no es un error real del proveedor.", "payloadMissing": "El artefacto de carga detallada ya no está disponible para esta entrada de registro.", "payloadCorrupt": "No se pudo analizar el artefacto de carga detallada.", "notAvailable": "N/D", diff --git a/src/i18n/messages/et.json b/src/i18n/messages/et.json index 2c707d5a7f..ffef4d6957 100644 --- a/src/i18n/messages/et.json +++ b/src/i18n/messages/et.json @@ -11411,6 +11411,7 @@ "clientResponse": "Kliendi vastus", "pipelineError": "Töötluskonveieri viga" }, + "payloadSizeLimitOmitted": "Sisu jäeti välja — see jaotis ületas kõnelogi suurusepiirangu (CALL_LOG_PIPELINE_MAX_SIZE_KB) ja seda ei salvestatud; tegemist ei ole tegeliku ülesvoolu veaga.", "payloadMissing": "Selle logikirje üksikasjaliku andmekoormuse artefakt pole enam saadaval.", "payloadCorrupt": "Üksikasjaliku andmekoormuse artefakti ei saanud sõeluda.", "notAvailable": "Pole kohaldatav", diff --git a/src/i18n/messages/fa.json b/src/i18n/messages/fa.json index 05851eebf8..96661041d3 100644 --- a/src/i18n/messages/fa.json +++ b/src/i18n/messages/fa.json @@ -11411,6 +11411,7 @@ "clientResponse": "پاسخ مشتری", "pipelineError": "خطای پایپ‌لاین" }, + "payloadSizeLimitOmitted": "محتوا حذف شد — این بخش از محدودیت اندازهٔ گزارش فراخوانی (CALL_LOG_PIPELINE_MAX_SIZE_KB) فراتر رفت و ذخیره نشد؛ این یک خطای واقعی از سمت ارائه‌دهنده نیست.", "payloadMissing": "آرتیفکت بارگذاری دقیق دیگر برای این ورودی لاگ در دسترس نیست.", "payloadCorrupt": "بارگذاری جزئیات بارگذاری نمی‌تواند تجزیه شود.", "notAvailable": "غیر قابل استفاده", diff --git a/src/i18n/messages/fi.json b/src/i18n/messages/fi.json index 8481082f86..be5a2d51bb 100644 --- a/src/i18n/messages/fi.json +++ b/src/i18n/messages/fi.json @@ -11411,6 +11411,7 @@ "clientResponse": "Asiakkaan Vastaus", "pipelineError": "Putkivirhe" }, + "payloadSizeLimitOmitted": "Sisältö jätetty pois — tämä osio ylitti kutsulokin kokorajan (CALL_LOG_PIPELINE_MAX_SIZE_KB) eikä sitä tallennettu; kyseessä ei ole todellinen upstream-virhe.", "payloadMissing": "Yksityiskohtainen kuormitusartefakti ei ole enää saatavilla tälle lokimerkinnälle.", "payloadCorrupt": "Yksityiskohtaisia kuormitusartefakteja ei voitu jäsentää.", "notAvailable": "Ei saatavilla", diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json index 2a6c4f708a..1cd48ab3a6 100644 --- a/src/i18n/messages/fr.json +++ b/src/i18n/messages/fr.json @@ -11411,6 +11411,7 @@ "clientResponse": "Réponse du client", "pipelineError": "Erreur du pipeline" }, + "payloadSizeLimitOmitted": "Contenu omis — cette section a dépassé la limite de taille du journal d'appels (CALL_LOG_PIPELINE_MAX_SIZE_KB) et n'a pas été enregistrée ; ce n'est pas une véritable erreur du fournisseur.", "payloadMissing": "L’artefact de charge utile détaillé n’est plus disponible pour cette entrée de journal.", "payloadCorrupt": "L’artefact de charge utile détaillé n’a pas pu être analysé.", "notAvailable": "N/D", diff --git a/src/i18n/messages/ga.json b/src/i18n/messages/ga.json index 8cd9bea706..4b502b7a1b 100644 --- a/src/i18n/messages/ga.json +++ b/src/i18n/messages/ga.json @@ -11464,7 +11464,8 @@ "correlationIdValue": "Aitheantas Comhghaoil: {id}", "detailedPayloadInfo": "Cumasaigh logáil mhionsonraithe ar dtús más mian leat an t-amharc ceithre chéim ar ualaí cliaint/soláthraí le haghaidh iarratais nua.", "copyAll": "Cóipeáil go léir", - "copiedAll": "Cóipeáilte go léir" + "copiedAll": "Cóipeáilte go léir", + "payloadSizeLimitOmitted": "Fágadh an pálasta ar lár — sháraigh an rannán seo teorainn mhéid an logchomhaid glaonna (CALL_LOG_PIPELINE_MAX_SIZE_KB) agus níor stóráladh é; ní fíorearráid ón soláthraí é seo." } }, "proxyLogger": { diff --git a/src/i18n/messages/gu.json b/src/i18n/messages/gu.json index 9ff6a83a56..161bf7ce3b 100644 --- a/src/i18n/messages/gu.json +++ b/src/i18n/messages/gu.json @@ -11411,6 +11411,7 @@ "clientResponse": "ક્લાયન્ટ પ્રતિસાદ", "pipelineError": "પાઇપલાઇન ભૂલ" }, + "payloadSizeLimitOmitted": "પેલોડ છોડી દેવાયો — આ વિભાગ કૉલ લૉગની કદ મર્યાદા (CALL_LOG_PIPELINE_MAX_SIZE_KB) ઓળંગી ગયો અને સંગ્રહાયો નથી; આ વાસ્તવિક અપસ્ટ્રીમ ભૂલ નથી.", "payloadMissing": "આ લોગ એન્ટ્રી માટે વિગતવાર પેઇલોડ આર્ટિફેક્ટ હવે ઉપલબ્ધ નથી.", "payloadCorrupt": "વિસ્તૃત પેલોડ આર્ટિફેક્ટને પાર્સ કરી શકાયું નથી.", "notAvailable": "લાગુ પડતું નથી", diff --git a/src/i18n/messages/ha.json b/src/i18n/messages/ha.json index d61386288c..92324a9147 100644 --- a/src/i18n/messages/ha.json +++ b/src/i18n/messages/ha.json @@ -11464,7 +11464,8 @@ "correlationIdValue": "ID na Alaƙa: {id}", "detailedPayloadInfo": "Da farko, kunna yin cikakken log idan kana son ganin payload na matakai huɗu na abokin ciniki/mai bayarwa don sabbin buƙatu.", "copyAll": "Kwafi duka", - "copiedAll": "An kwafi duka" + "copiedAll": "An kwafi duka", + "payloadSizeLimitOmitted": "An bar abin da aka aika — wannan sashe ya wuce iyakar girman rajistar kira (CALL_LOG_PIPELINE_MAX_SIZE_KB) kuma ba a adana shi ba; wannan ba ainihin kuskuren mai bayarwa ba ne." } }, "proxyLogger": { diff --git a/src/i18n/messages/he.json b/src/i18n/messages/he.json index b52c5d1d7a..54fa106d02 100644 --- a/src/i18n/messages/he.json +++ b/src/i18n/messages/he.json @@ -11411,6 +11411,7 @@ "clientResponse": "תגובה מהלקוח", "pipelineError": "שגיאת צינור" }, + "payloadSizeLimitOmitted": "התוכן הושמט — מקטע זה חרג ממגבלת הגודל של יומן הקריאות (CALL_LOG_PIPELINE_MAX_SIZE_KB) ולא נשמר; אין מדובר בשגיאה אמיתית מהספק.", "payloadMissing": "פרטי העמסה מפורטים אינם זמינים יותר עבור רשומת הלוג הזו.", "payloadCorrupt": "לא ניתן לנתח את הארטיפקט של העומס המפורט.", "notAvailable": "לא זמין", diff --git a/src/i18n/messages/hi.json b/src/i18n/messages/hi.json index 1b109bf450..4751f721c9 100644 --- a/src/i18n/messages/hi.json +++ b/src/i18n/messages/hi.json @@ -11411,6 +11411,7 @@ "clientResponse": "क्लाइंट प्रतिक्रिया", "pipelineError": "पाइपलाइन त्रुटि" }, + "payloadSizeLimitOmitted": "पेलोड छोड़ दिया गया — यह अनुभाग कॉल लॉग की आकार सीमा (CALL_LOG_PIPELINE_MAX_SIZE_KB) से अधिक हो गया और संग्रहीत नहीं किया गया; यह कोई वास्तविक अपस्ट्रीम त्रुटि नहीं है।", "payloadMissing": "इस लॉग प्रविष्टि के लिए विस्तृत पेलोड आर्टिफैक्ट अब उपलब्ध नहीं है।", "payloadCorrupt": "विस्तृत पेलोड आर्टिफैक्ट को पार्स नहीं किया जा सका।", "notAvailable": "लागू नहीं", diff --git a/src/i18n/messages/hr.json b/src/i18n/messages/hr.json index 74fdd5c2d6..898a38a146 100644 --- a/src/i18n/messages/hr.json +++ b/src/i18n/messages/hr.json @@ -11411,6 +11411,7 @@ "clientResponse": "Odgovor klijenta", "pipelineError": "Greška cjevovoda" }, + "payloadSizeLimitOmitted": "Sadržaj izostavljen — ovaj odjeljak premašio je ograničenje veličine zapisnika poziva (CALL_LOG_PIPELINE_MAX_SIZE_KB) i nije pohranjen; nije riječ o stvarnoj pogrešci pružatelja.", "payloadMissing": "Detaljan artefakt sadržaja više nije dostupan za ovaj unos zapisa.", "payloadCorrupt": "Detaljan artefakt sadržaja nije bilo moguće raščlaniti.", "notAvailable": "Nije primjenjivo", diff --git a/src/i18n/messages/hu.json b/src/i18n/messages/hu.json index 53d40f95e2..a5d4c4f116 100644 --- a/src/i18n/messages/hu.json +++ b/src/i18n/messages/hu.json @@ -11411,6 +11411,7 @@ "clientResponse": "Ügyfél Válasz", "pipelineError": "Pipeline Hiba" }, + "payloadSizeLimitOmitted": "Tartalom kihagyva — ez a szakasz túllépte a hívásnapló méretkorlátját (CALL_LOG_PIPELINE_MAX_SIZE_KB), ezért nem lett elmentve; ez nem valódi upstream hiba.", "payloadMissing": "A részletes payload artefaktum már nem elérhető ehhez a naplóbejegyzéshez.", "payloadCorrupt": "A részletes payload artefaktumot nem sikerült elemezni.", "notAvailable": "N/A", diff --git a/src/i18n/messages/hy.json b/src/i18n/messages/hy.json index 8145760cc1..8b0fe9f2d4 100644 --- a/src/i18n/messages/hy.json +++ b/src/i18n/messages/hy.json @@ -11464,7 +11464,8 @@ "correlationIdValue": "Կապակցման ID՝ {id}", "detailedPayloadInfo": "Նոր հարցումների համար հաճախորդի/մատակարարի օգտակար բեռների քառափուլ տեսքը դիտելու նպատակով նախ միացրեք մանրամասն գրանցումը։", "copyAll": "Պատճենել ամբողջը", - "copiedAll": "Ամբողջը պատճենված է" + "copiedAll": "Ամբողջը պատճենված է", + "payloadSizeLimitOmitted": "Բովանդակությունը բաց է թողնվել — այս բաժինը գերազանցել է կանչերի մատյանի չափի սահմանը (CALL_LOG_PIPELINE_MAX_SIZE_KB) և չի պահպանվել. սա իրական վերին հոսքի սխալ չէ։" } }, "proxyLogger": { diff --git a/src/i18n/messages/id.json b/src/i18n/messages/id.json index e10e9c2f16..90d2a60902 100644 --- a/src/i18n/messages/id.json +++ b/src/i18n/messages/id.json @@ -11414,6 +11414,7 @@ "clientResponse": "Tanggapan Klien", "pipelineError": "Kesalahan Pipeline" }, + "payloadSizeLimitOmitted": "Payload dihilangkan — bagian ini melampaui batas ukuran log panggilan (CALL_LOG_PIPELINE_MAX_SIZE_KB) dan tidak disimpan; ini bukan kesalahan upstream yang sebenarnya.", "payloadMissing": "Artifact payload yang terperinci tidak lagi tersedia untuk entri log ini.", "payloadCorrupt": "Artifact payload yang rinci tidak dapat diparsing.", "notAvailable": "T/A", diff --git a/src/i18n/messages/ig.json b/src/i18n/messages/ig.json index 1b389cf312..23b85cde89 100644 --- a/src/i18n/messages/ig.json +++ b/src/i18n/messages/ig.json @@ -11411,6 +11411,7 @@ "clientResponse": "Nzaghachi Onye Ahịa", "pipelineError": "Njehie Pipeline" }, + "payloadSizeLimitOmitted": "Ewepụrụ ihe ezigara — akụkụ a gafere oke nha ndekọ oku (CALL_LOG_PIPELINE_MAX_SIZE_KB), a chekwaghịkwa ya; ọ bụghị ezigbo njehie sitere n'aka onye na-enye ọrụ.", "payloadMissing": "Nkọwa payload zuru ezu adịkwaghị maka ndekọ a.", "payloadCorrupt": "Enweghị ike ịgụ ma nyochaa payload ahụ nwere nkọwa zuru ezu.", "notAvailable": "Ọ dịghị", diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json index d0a6f84f35..324ff86137 100644 --- a/src/i18n/messages/it.json +++ b/src/i18n/messages/it.json @@ -11415,6 +11415,7 @@ "clientResponse": "Risposta del Cliente", "pipelineError": "Errore della Pipeline" }, + "payloadSizeLimitOmitted": "Contenuto omesso — questa sezione ha superato il limite di dimensione del registro delle chiamate (CALL_LOG_PIPELINE_MAX_SIZE_KB) e non è stata salvata; non si tratta di un vero errore del provider.", "payloadMissing": "L'articolo del payload dettagliato non è più disponibile per questa voce di log.", "payloadCorrupt": "L'artifact del payload dettagliato non può essere analizzato.", "notAvailable": "N/D", diff --git a/src/i18n/messages/ja.json b/src/i18n/messages/ja.json index 5d55b1a124..d7fca9b640 100644 --- a/src/i18n/messages/ja.json +++ b/src/i18n/messages/ja.json @@ -11411,6 +11411,7 @@ "clientResponse": "クライアントの応答", "pipelineError": "パイプラインエラー" }, + "payloadSizeLimitOmitted": "ペイロードは省略されました — このセクションは呼び出しログのサイズ上限(CALL_LOG_PIPELINE_MAX_SIZE_KB)を超えたため保存されませんでした。実際のアップストリームエラーではありません。", "payloadMissing": "このログエントリの詳細なペイロードアーティファクトはもはや利用できません。", "payloadCorrupt": "詳細なペイロードアーティファクトを解析できませんでした。", "notAvailable": "該当なし", diff --git a/src/i18n/messages/ka.json b/src/i18n/messages/ka.json index 7972173aae..f7cfbcd030 100644 --- a/src/i18n/messages/ka.json +++ b/src/i18n/messages/ka.json @@ -11411,6 +11411,7 @@ "clientResponse": "კლიენტის პასუხი", "pipelineError": "კონვეიერის შეცდომა" }, + "payloadSizeLimitOmitted": "შიგთავსი გამოტოვებულია — ამ განყოფილებამ გადააჭარბა გამოძახებების ჟურნალის ზომის ლიმიტს (CALL_LOG_PIPELINE_MAX_SIZE_KB) და არ შეინახა; ეს არ არის პროვაიდერის რეალური შეცდომა.", "payloadMissing": "ამ ჟურნალის ჩანაწერის დეტალური სასარგებლო მონაცემების არტეფაქტი აღარ არის ხელმისაწვდომი.", "payloadCorrupt": "დეტალური სასარგებლო მონაცემების არტეფაქტის გარჩევა ვერ მოხერხდა.", "notAvailable": "არ გამოიყენება", diff --git a/src/i18n/messages/km.json b/src/i18n/messages/km.json index 42aced97d5..1496aaec82 100644 --- a/src/i18n/messages/km.json +++ b/src/i18n/messages/km.json @@ -11464,7 +11464,8 @@ "correlationIdValue": "លេខសម្គាល់ទំនាក់ទំនង៖ {id}", "detailedPayloadInfo": "សូមបើកការកត់ត្រាលម្អិតជាមុនសិន ប្រសិនបើអ្នកចង់មើល payload បួនដំណាក់កាលរបស់កម្មវិធីអតិថិជន/អ្នកផ្តល់សេវា សម្រាប់សំណើថ្មីៗ។", "copyAll": "ចម្លងទាំងអស់", - "copiedAll": "បានចម្លងទាំងអស់" + "copiedAll": "បានចម្លងទាំងអស់", + "payloadSizeLimitOmitted": "បានលុបខ្លឹមសារ — ផ្នែកនេះលើសដែនកំណត់ទំហំកំណត់ហេតុការហៅ (CALL_LOG_PIPELINE_MAX_SIZE_KB) ហើយមិនត្រូវបានរក្សាទុកទេ។ នេះមិនមែនជាកំហុសពិតពីអ្នកផ្តល់សេវាទេ។" } }, "proxyLogger": { diff --git a/src/i18n/messages/kn.json b/src/i18n/messages/kn.json index 2a076d431b..205492b0be 100644 --- a/src/i18n/messages/kn.json +++ b/src/i18n/messages/kn.json @@ -11411,6 +11411,7 @@ "clientResponse": "ಕ್ಲೈಂಟ್ ಪ್ರತಿಕ್ರಿಯೆ", "pipelineError": "ಪೈಪ್ಲೈನ್ ದೋಷ" }, + "payloadSizeLimitOmitted": "ಪೇಲೋಡ್ ಬಿಟ್ಟುಬಿಡಲಾಗಿದೆ — ಈ ವಿಭಾಗವು ಕರೆ ಲಾಗ್ ಗಾತ್ರ ಮಿತಿಯನ್ನು (CALL_LOG_PIPELINE_MAX_SIZE_KB) ಮೀರಿದೆ ಮತ್ತು ಸಂಗ್ರಹಿಸಲಾಗಿಲ್ಲ; ಇದು ನಿಜವಾದ ಅಪ್‌ಸ್ಟ್ರೀಮ್ ದೋಷವಲ್ಲ.", "payloadMissing": "ಈ ಲಾಗ್ ನಮೂದಿಗೆ ವಿವರವಾದ ಪೇಲೋಡ್ ಆರ್ಟಿಫ್ಯಾಕ್ಟ್ ಇನ್ನು ಮುಂದೆ ಲಭ್ಯವಿಲ್ಲ.", "payloadCorrupt": "ವಿವರವಾದ ಪೇಲೋಡ್ ಆರ್ಟಿಫ್ಯಾಕ್ಟ್ ಅನ್ನು ಪಾರ್ಸ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.", "notAvailable": "ಅನ್ವಯಿಸುವುದಿಲ್ಲ", diff --git a/src/i18n/messages/ko.json b/src/i18n/messages/ko.json index 89b351f5be..7bab3beb2f 100644 --- a/src/i18n/messages/ko.json +++ b/src/i18n/messages/ko.json @@ -11411,6 +11411,7 @@ "clientResponse": "클라이언트 응답", "pipelineError": "파이프라인 오류" }, + "payloadSizeLimitOmitted": "페이로드가 생략되었습니다 — 이 섹션은 호출 로그 크기 제한(CALL_LOG_PIPELINE_MAX_SIZE_KB)을 초과하여 저장되지 않았습니다. 실제 업스트림 오류가 아닙니다.", "payloadMissing": "이 로그 항목에 대한 상세 페이로드 아티팩트가 더 이상 사용 가능하지 않습니다.", "payloadCorrupt": "상세 페이로드 아티팩트를 구문 분석할 수 없습니다.", "notAvailable": "해당 없음", diff --git a/src/i18n/messages/lt.json b/src/i18n/messages/lt.json index 8ea3176e6d..11352f7bb1 100644 --- a/src/i18n/messages/lt.json +++ b/src/i18n/messages/lt.json @@ -11411,6 +11411,7 @@ "clientResponse": "Kliento atsakymas", "pipelineError": "Konvejerio klaida" }, + "payloadSizeLimitOmitted": "Turinys praleistas — ši dalis viršijo iškvietimų žurnalo dydžio limitą (CALL_LOG_PIPELINE_MAX_SIZE_KB) ir nebuvo išsaugota; tai nėra tikra tiekėjo klaida.", "payloadMissing": "Išsamus šio žurnalo įrašo duomenų artefaktas nebepasiekiamas.", "payloadCorrupt": "Nepavyko išanalizuoti išsamaus duomenų artefakto.", "notAvailable": "Nėra duomenų", diff --git a/src/i18n/messages/lv.json b/src/i18n/messages/lv.json index c14afdf389..38312cc206 100644 --- a/src/i18n/messages/lv.json +++ b/src/i18n/messages/lv.json @@ -11464,7 +11464,8 @@ "correlationIdValue": "Korelācijas ID: {id}", "detailedPayloadInfo": "Vispirms iespējojiet detalizētu žurnalēšanu, ja vēlaties četru posmu klienta/nodrošinātāja derīgās slodzes skatu jauniem pieprasījumiem.", "copyAll": "Kopēt visu", - "copiedAll": "Viss nokopēts" + "copiedAll": "Viss nokopēts", + "payloadSizeLimitOmitted": "Saturs izlaists — šī sadaļa pārsniedza izsaukumu žurnāla izmēra ierobežojumu (CALL_LOG_PIPELINE_MAX_SIZE_KB) un netika saglabāta; tā nav īsta pakalpojumu sniedzēja kļūda." } }, "proxyLogger": { diff --git a/src/i18n/messages/ml.json b/src/i18n/messages/ml.json index 71062c5c59..77dc791e9b 100644 --- a/src/i18n/messages/ml.json +++ b/src/i18n/messages/ml.json @@ -11411,6 +11411,7 @@ "clientResponse": "ക്ലയന്റ് പ്രതികരണം", "pipelineError": "പൈപ്പ്ലൈൻ പിശക്" }, + "payloadSizeLimitOmitted": "പേലോഡ് ഒഴിവാക്കി — ഈ വിഭാഗം കോൾ ലോഗ് വലുപ്പ പരിധി (CALL_LOG_PIPELINE_MAX_SIZE_KB) കവിഞ്ഞതിനാൽ സംഭരിച്ചിട്ടില്ല; ഇത് യഥാർത്ഥ അപ്‌സ്ട്രീം പിശകല്ല.", "payloadMissing": "ഈ ലോഗ് എൻട്രിക്കായുള്ള വിശദമായ പേലോഡ് ആർട്ടിഫാക്റ്റ് ഇനി ലഭ്യമല്ല.", "payloadCorrupt": "വിശദമായ പേലോഡ് ആർട്ടിഫാക്റ്റ് പാഴ്സ് ചെയ്യാനായില്ല.", "notAvailable": "ലഭ്യമല്ല", diff --git a/src/i18n/messages/mr.json b/src/i18n/messages/mr.json index ef78ec0db1..9006718762 100644 --- a/src/i18n/messages/mr.json +++ b/src/i18n/messages/mr.json @@ -11411,6 +11411,7 @@ "clientResponse": "ग्राहक प्रतिसाद", "pipelineError": "पाइपलाइन त्रुटी" }, + "payloadSizeLimitOmitted": "पेलोड वगळला — हा विभाग कॉल लॉगच्या आकार मर्यादेपेक्षा (CALL_LOG_PIPELINE_MAX_SIZE_KB) मोठा झाला आणि संग्रहित केला गेला नाही; ही खरी अपस्ट्रीम त्रुटी नाही.", "payloadMissing": "या लॉग नोंदीसाठी तपशीलवार पेलोड आर्टिफॅक्ट आता उपलब्ध नाही.", "payloadCorrupt": "तपशीलवार पेलोड आर्टिफॅक्ट पार्स केला जाऊ शकला नाही.", "notAvailable": "लागू नाही", diff --git a/src/i18n/messages/ms.json b/src/i18n/messages/ms.json index e5dab503f5..4a7ca0a34b 100644 --- a/src/i18n/messages/ms.json +++ b/src/i18n/messages/ms.json @@ -11411,6 +11411,7 @@ "clientResponse": "Tanggapan Klien", "pipelineError": "Ralat Saluran" }, + "payloadSizeLimitOmitted": "Muatan diabaikan — bahagian ini melebihi had saiz log panggilan (CALL_LOG_PIPELINE_MAX_SIZE_KB) dan tidak disimpan; ini bukan ralat huluan yang sebenar.", "payloadMissing": "Artifak payload terperinci tidak lagi tersedia untuk entri log ini.", "payloadCorrupt": "Artifak payload terperinci tidak dapat dianalisis.", "notAvailable": "T/B", diff --git a/src/i18n/messages/mt.json b/src/i18n/messages/mt.json index ba922fe89b..281c74597d 100644 --- a/src/i18n/messages/mt.json +++ b/src/i18n/messages/mt.json @@ -11411,6 +11411,7 @@ "clientResponse": "Risposta lill-klijent", "pipelineError": "Żball fil-pipeline" }, + "payloadSizeLimitOmitted": "Il-kontenut tħalla barra — din it-taqsima qabżet il-limitu tad-daqs tar-reġistru tas-sejħiet (CALL_LOG_PIPELINE_MAX_SIZE_KB) u ma nħażnitx; dan mhuwiex żball reali tal-fornitur.", "payloadMissing": "L-artifatt dettaljat tal-payload m’għadux disponibbli għal din l-entrata tal-log.", "payloadCorrupt": "L-artifatt dettaljat tal-payload ma setax jiġi analizzat.", "notAvailable": "Mhux applikabbli", diff --git a/src/i18n/messages/my.json b/src/i18n/messages/my.json index 47d87291bd..fbb996d509 100644 --- a/src/i18n/messages/my.json +++ b/src/i18n/messages/my.json @@ -11411,6 +11411,7 @@ "clientResponse": "Client တုံ့ပြန်ချက်", "pipelineError": "Pipeline အမှား" }, + "payloadSizeLimitOmitted": "ပေးပို့ဒေတာကို ချန်လှပ်ထားသည် — ဤအပိုင်းသည် ခေါ်ဆိုမှုမှတ်တမ်း အရွယ်အစားကန့်သတ်ချက် (CALL_LOG_PIPELINE_MAX_SIZE_KB) ကို ကျော်လွန်သဖြင့် သိမ်းဆည်းမထားပါ။ ဤသည်မှာ အထက်စီးကြောင်းမှ အမှန်တကယ်အမှားမဟုတ်ပါ။", "payloadMissing": "ဤမှတ်တမ်းအတွက် အသေးစိတ် payload artifact ကို မရနိုင်တော့ပါ။", "payloadCorrupt": "အသေးစိတ် payload artifact ကို ခွဲခြမ်းဖတ်ရှု၍ မရပါ။", "notAvailable": "မသက်ဆိုင်ပါ", diff --git a/src/i18n/messages/ne.json b/src/i18n/messages/ne.json index 89f527cbf7..4c2f27c1c7 100644 --- a/src/i18n/messages/ne.json +++ b/src/i18n/messages/ne.json @@ -11411,6 +11411,7 @@ "clientResponse": "क्लाइन्ट प्रतिक्रिया", "pipelineError": "पाइपलाइन त्रुटि" }, + "payloadSizeLimitOmitted": "पेलोड छोडियो — यो खण्डले कल लगको आकार सीमा (CALL_LOG_PIPELINE_MAX_SIZE_KB) नाघ्यो र भण्डारण गरिएन; यो वास्तविक अपस्ट्रिम त्रुटि होइन।", "payloadMissing": "यो लग प्रविष्टिका लागि विस्तृत पेलोड आर्टिफ्याक्ट अब उपलब्ध छैन।", "payloadCorrupt": "विस्तृत पेलोड आर्टिफ्याक्ट पार्स गर्न सकिएन।", "notAvailable": "लागू हुँदैन", diff --git a/src/i18n/messages/nl.json b/src/i18n/messages/nl.json index d99866011d..a174af5554 100644 --- a/src/i18n/messages/nl.json +++ b/src/i18n/messages/nl.json @@ -11411,6 +11411,7 @@ "clientResponse": "Klantreactie", "pipelineError": "Pijplijnfout" }, + "payloadSizeLimitOmitted": "Payload weggelaten — deze sectie overschreed de groottelimiet van het aanroeplogboek (CALL_LOG_PIPELINE_MAX_SIZE_KB) en is niet opgeslagen; dit is geen echte upstream-fout.", "payloadMissing": "Gedetailleerde payload-artifact is niet langer beschikbaar voor deze logvermelding.", "payloadCorrupt": "Gedetailleerde payload-artifact kon niet worden geparsed.", "notAvailable": "N.v.t.", diff --git a/src/i18n/messages/no.json b/src/i18n/messages/no.json index b07e9b3cc8..1fba7fca2d 100644 --- a/src/i18n/messages/no.json +++ b/src/i18n/messages/no.json @@ -11411,6 +11411,7 @@ "clientResponse": "Klientrespons", "pipelineError": "Pipeline-feil" }, + "payloadSizeLimitOmitted": "Innhold utelatt — denne seksjonen overskred størrelsesgrensen for kalloggen (CALL_LOG_PIPELINE_MAX_SIZE_KB) og ble ikke lagret; dette er ikke en reell upstream-feil.", "payloadMissing": "Detaljert nyttelastartefakt er ikke lenger tilgjengelig for denne loggoppføringen.", "payloadCorrupt": "Detaljert nyttelastartefakt kunne ikke bli analysert.", "notAvailable": "Ikke tilgjengelig", diff --git a/src/i18n/messages/or.json b/src/i18n/messages/or.json index 47d74d8b03..8338f6db16 100644 --- a/src/i18n/messages/or.json +++ b/src/i18n/messages/or.json @@ -11411,6 +11411,7 @@ "clientResponse": "କ୍ଲାଏଣ୍ଟ ପ୍ରତିକ୍ରିୟା", "pipelineError": "ପାଇପ୍ଲାଇନ୍ ତ୍ରୁଟି" }, + "payloadSizeLimitOmitted": "ପେଲୋଡ୍ ଛାଡ଼ି ଦିଆଯାଇଛି — ଏହି ବିଭାଗ କଲ୍ ଲଗ୍ ଆକାର ସୀମା (CALL_LOG_PIPELINE_MAX_SIZE_KB) ଅତିକ୍ରମ କରିଛି ଏବଂ ସଂରକ୍ଷିତ ହୋଇନାହିଁ; ଏହା ପ୍ରକୃତ ଅପଷ୍ଟ୍ରିମ୍ ତ୍ରୁଟି ନୁହେଁ।", "payloadMissing": "ଏହି ଲଗ୍ ଏଣ୍ଟ୍ରି ପାଇଁ ବିସ୍ତୃତ ପେଲୋଡ୍ ଆର୍ଟିଫ୍ୟାକ୍ଟ ଆଉ ଉପଲବ୍ଧ ନାହିଁ।", "payloadCorrupt": "ବିସ୍ତୃତ ପେଲୋଡ୍ ଆର୍ଟିଫ୍ୟାକ୍ଟକୁ ପାର୍ସ କରାଯାଇପାରିଲା ନାହିଁ।", "notAvailable": "ପ୍ରଯୁଜ୍ୟ ନୁହେଁ", diff --git a/src/i18n/messages/pa.json b/src/i18n/messages/pa.json index 3bc1974ba4..1b4e809373 100644 --- a/src/i18n/messages/pa.json +++ b/src/i18n/messages/pa.json @@ -11411,6 +11411,7 @@ "clientResponse": "ਕਲਾਇੰਟ ਜਵਾਬ", "pipelineError": "ਪਾਈਪਲਾਈਨ ਗਲਤੀ" }, + "payloadSizeLimitOmitted": "ਪੇਲੋਡ ਛੱਡ ਦਿੱਤਾ ਗਿਆ — ਇਹ ਭਾਗ ਕਾਲ ਲੌਗ ਦੀ ਆਕਾਰ ਸੀਮਾ (CALL_LOG_PIPELINE_MAX_SIZE_KB) ਤੋਂ ਵੱਧ ਗਿਆ ਅਤੇ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਗਿਆ; ਇਹ ਅਸਲ ਅੱਪਸਟ੍ਰੀਮ ਗਲਤੀ ਨਹੀਂ ਹੈ।", "payloadMissing": "ਇਸ ਲੌਗ ਐਂਟਰੀ ਲਈ ਵਿਸਤ੍ਰਿਤ ਪੇਲੋਡ ਆਰਟੀਫੈਕਟ ਹੁਣ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।", "payloadCorrupt": "ਵਿਸਤ੍ਰਿਤ ਪੇਲੋਡ ਆਰਟੀਫੈਕਟ ਨੂੰ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।", "notAvailable": "ਲਾਗੂ ਨਹੀਂ", diff --git a/src/i18n/messages/phi.json b/src/i18n/messages/phi.json index e027549c9f..906dd77768 100644 --- a/src/i18n/messages/phi.json +++ b/src/i18n/messages/phi.json @@ -11411,6 +11411,7 @@ "clientResponse": "Tugon ng Kliyente", "pipelineError": "Error sa Pipeline" }, + "payloadSizeLimitOmitted": "Inalis ang payload — lumampas ang seksyong ito sa limitasyon ng laki ng call log (CALL_LOG_PIPELINE_MAX_SIZE_KB) at hindi na-save; hindi ito tunay na upstream error.", "payloadMissing": "Ang detalyadong payload artifact ay hindi na available para sa log entry na ito.", "payloadCorrupt": "Hindi ma-parse ang detalyadong payload artifact.", "notAvailable": "Hindi naaangkop", diff --git a/src/i18n/messages/pl.json b/src/i18n/messages/pl.json index 74cd55d13c..4d6bf333c2 100644 --- a/src/i18n/messages/pl.json +++ b/src/i18n/messages/pl.json @@ -11411,6 +11411,7 @@ "clientResponse": "Odpowiedź Klienta", "pipelineError": "Błąd potoku" }, + "payloadSizeLimitOmitted": "Zawartość pominięta — ta sekcja przekroczyła limit rozmiaru dziennika wywołań (CALL_LOG_PIPELINE_MAX_SIZE_KB) i nie została zapisana; to nie jest rzeczywisty błąd dostawcy.", "payloadMissing": "Szczegółowy ładunek artefaktu nie jest już dostępny dla tego wpisu dziennika.", "payloadCorrupt": "Szczegółowy ładunek artefaktu nie mógł zostać sparsowany.", "notAvailable": "N/D", diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json index 2d47bd31e1..3114c9ca26 100644 --- a/src/i18n/messages/pt-BR.json +++ b/src/i18n/messages/pt-BR.json @@ -11415,6 +11415,7 @@ "clientResponse": "Resposta do Cliente", "pipelineError": "Erro de Pipeline" }, + "payloadSizeLimitOmitted": "Payload omitido — esta seção excedeu o limite de tamanho do log de chamadas (CALL_LOG_PIPELINE_MAX_SIZE_KB) e não foi armazenada; não é um erro real do upstream.", "payloadMissing": "O artefato de carga detalhada não está mais disponível para esta entrada de log.", "payloadCorrupt": "O artefato de carga detalhada não pôde ser analisado.", "notAvailable": "N/D", diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json index d04fdc9f39..6093ca0ef3 100644 --- a/src/i18n/messages/pt.json +++ b/src/i18n/messages/pt.json @@ -11411,6 +11411,7 @@ "clientResponse": "Resposta do Cliente", "pipelineError": "Erro de Pipeline" }, + "payloadSizeLimitOmitted": "Conteúdo omitido — esta secção excedeu o limite de tamanho do registo de chamadas (CALL_LOG_PIPELINE_MAX_SIZE_KB) e não foi guardada; não se trata de um erro real do fornecedor.", "payloadMissing": "O artefato de carga detalhada já não está disponível para esta entrada de log.", "payloadCorrupt": "O artefato do payload detalhado não pôde ser analisado.", "notAvailable": "N/D", diff --git a/src/i18n/messages/ro.json b/src/i18n/messages/ro.json index f3e6c00b10..ebf5f746ff 100644 --- a/src/i18n/messages/ro.json +++ b/src/i18n/messages/ro.json @@ -11411,6 +11411,7 @@ "clientResponse": "Răspunsul Clientului", "pipelineError": "Eroare de Pipeline" }, + "payloadSizeLimitOmitted": "Conținut omis — această secțiune a depășit limita de dimensiune a jurnalului de apeluri (CALL_LOG_PIPELINE_MAX_SIZE_KB) și nu a fost stocată; nu este o eroare reală a furnizorului.", "payloadMissing": "Artifactul detaliat al payload-ului nu mai este disponibil pentru această intrare de jurnal.", "payloadCorrupt": "Artifactul detaliat al payload-ului nu a putut fi analizat.", "notAvailable": "Indisponibil", diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index d0409b2e5d..1f1b187e79 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -11411,6 +11411,7 @@ "clientResponse": "Ответ клиента", "pipelineError": "Ошибка конвейера" }, + "payloadSizeLimitOmitted": "Содержимое пропущено — этот раздел превысил ограничение размера журнала вызовов (CALL_LOG_PIPELINE_MAX_SIZE_KB) и не был сохранён; это не реальная ошибка провайдера.", "payloadMissing": "Подробный артефакт полезной нагрузки больше недоступен для этой записи журнала.", "payloadCorrupt": "Не удалось разобрать детализированный артефакт полезной нагрузки.", "notAvailable": "Н/Д", diff --git a/src/i18n/messages/si.json b/src/i18n/messages/si.json index 5f3d885b47..617ee6f718 100644 --- a/src/i18n/messages/si.json +++ b/src/i18n/messages/si.json @@ -11464,7 +11464,8 @@ "correlationIdValue": "සහසම්බන්ධතා හැඳුනුම්කාරකය: {id}", "detailedPayloadInfo": "නව ඉල්ලීම් සඳහා අදියර හතරක සේවාලාභී/සපයන්නා දත්ත කොටස් දසුන අවශ්ය නම්, පළමුව සවිස්තරාත්මක ලොග් කිරීම සබල කරන්න.", "copyAll": "සියල්ල පිටපත් කරන්න", - "copiedAll": "සියල්ල පිටපත් කරන ලදී" + "copiedAll": "සියල්ල පිටපත් කරන ලදී", + "payloadSizeLimitOmitted": "අන්තර්ගතය මඟ හැරිණි — මෙම කොටස ඇමතුම් ලොග් ප්‍රමාණ සීමාව (CALL_LOG_PIPELINE_MAX_SIZE_KB) ඉක්මවා ගිය අතර ගබඩා නොකෙරිණි; මෙය සැබෑ සැපයුම්කරු දෝෂයක් නොවේ." } }, "proxyLogger": { diff --git a/src/i18n/messages/sk.json b/src/i18n/messages/sk.json index ebb5da0775..f4280c7127 100644 --- a/src/i18n/messages/sk.json +++ b/src/i18n/messages/sk.json @@ -11411,6 +11411,7 @@ "clientResponse": "Odpoveď Klienta", "pipelineError": "Chyba v pipeline" }, + "payloadSizeLimitOmitted": "Obsah vynechaný — táto sekcia prekročila limit veľkosti záznamu volaní (CALL_LOG_PIPELINE_MAX_SIZE_KB) a nebola uložená; nejde o skutočnú chybu poskytovateľa.", "payloadMissing": "Podrobný payload artefakt už nie je k dispozícii pre tento záznam protokolu.", "payloadCorrupt": "Podrobný payload artefakt sa nedal analyzovať.", "notAvailable": "N/A", diff --git a/src/i18n/messages/sl.json b/src/i18n/messages/sl.json index b0c00b74b6..a666be7b0f 100644 --- a/src/i18n/messages/sl.json +++ b/src/i18n/messages/sl.json @@ -11411,6 +11411,7 @@ "clientResponse": "Odgovor odjemalcu", "pipelineError": "Napaka obdelovalnega cevovoda" }, + "payloadSizeLimitOmitted": "Vsebina izpuščena — ta razdelek je presegel omejitev velikosti dnevnika klicev (CALL_LOG_PIPELINE_MAX_SIZE_KB) in ni bil shranjen; ne gre za dejansko napako ponudnika.", "payloadMissing": "Artefakt s podrobno vsebino za ta vnos v dnevniku ni več na voljo.", "payloadCorrupt": "Artefakta s podrobno vsebino ni bilo mogoče razčleniti.", "notAvailable": "Ni na voljo", diff --git a/src/i18n/messages/sr.json b/src/i18n/messages/sr.json index c67f0eb22c..1bc27ecf97 100644 --- a/src/i18n/messages/sr.json +++ b/src/i18n/messages/sr.json @@ -11411,6 +11411,7 @@ "clientResponse": "Одговор клијенту", "pipelineError": "Грешка тока обраде" }, + "payloadSizeLimitOmitted": "Садржај изостављен — овај одељак је премашио ограничење величине дневника позива (CALL_LOG_PIPELINE_MAX_SIZE_KB) и није сачуван; није реч о стварној грешци провајдера.", "payloadMissing": "Детаљни артефакт корисног садржаја више није доступан за овај унос дневника.", "payloadCorrupt": "Детаљни артефакт корисног садржаја није могао бити рашчлањен.", "notAvailable": "Н/П", diff --git a/src/i18n/messages/sv.json b/src/i18n/messages/sv.json index 0fec4a0513..a0aa94fc7c 100644 --- a/src/i18n/messages/sv.json +++ b/src/i18n/messages/sv.json @@ -11411,6 +11411,7 @@ "clientResponse": "Klientens Svar", "pipelineError": "Pipeline-fel" }, + "payloadSizeLimitOmitted": "Innehåll utelämnat — det här avsnittet överskred storleksgränsen för anropsloggen (CALL_LOG_PIPELINE_MAX_SIZE_KB) och sparades inte; det är inte ett verkligt uppströmsfel.", "payloadMissing": "Den detaljerade nyttolasten artefakt är inte längre tillgänglig för denna loggpost.", "payloadCorrupt": "Detaljerad payload-artikel kunde inte tolkas.", "notAvailable": "Ej tillämpligt", diff --git a/src/i18n/messages/sw.json b/src/i18n/messages/sw.json index 61f43b7764..9b70afd273 100644 --- a/src/i18n/messages/sw.json +++ b/src/i18n/messages/sw.json @@ -11411,6 +11411,7 @@ "clientResponse": "Majibu ya Mteja", "pipelineError": "Kosa la Pipeline" }, + "payloadSizeLimitOmitted": "Maudhui yameachwa — sehemu hii ilizidi kikomo cha ukubwa wa kumbukumbu ya miito (CALL_LOG_PIPELINE_MAX_SIZE_KB) na haikuhifadhiwa; hili si kosa halisi la mtoa huduma.", "payloadMissing": "Kipande cha maelezo ya mzigo hakipatikani tena kwa ajili ya kipande hiki cha kumbukumbu.", "payloadCorrupt": "Kipande cha mzigo kilichofafanuliwa hakiwezi kufasiriwa.", "notAvailable": "Haitumiki", diff --git a/src/i18n/messages/ta.json b/src/i18n/messages/ta.json index 20a4322188..41d8a923c3 100644 --- a/src/i18n/messages/ta.json +++ b/src/i18n/messages/ta.json @@ -11411,6 +11411,7 @@ "clientResponse": "கிளையனின் பதில்", "pipelineError": "பைப்லைன் பிழை" }, + "payloadSizeLimitOmitted": "பேலோடு தவிர்க்கப்பட்டது — இந்தப் பகுதி அழைப்புப் பதிவின் அளவு வரம்பை (CALL_LOG_PIPELINE_MAX_SIZE_KB) மீறியதால் சேமிக்கப்படவில்லை; இது உண்மையான அப்ஸ்ட்ரீம் பிழை அல்ல.", "payloadMissing": "இந்த பதிவு நுழைவுக்கு விரிவான payload கலைப்பொருள் இனி கிடைக்கவில்லை.", "payloadCorrupt": "விவரமான payload கலைப்பொருள் பகுப்பாய்வு செய்ய முடியவில்லை.", "notAvailable": "பொருந்தாது", diff --git a/src/i18n/messages/te.json b/src/i18n/messages/te.json index 8b7a85f744..89fe9201fc 100644 --- a/src/i18n/messages/te.json +++ b/src/i18n/messages/te.json @@ -11411,6 +11411,7 @@ "clientResponse": "క్లయింట్ ప్రతిస్పందన", "pipelineError": "పైప్‌లైన్ లో పొరపాటు" }, + "payloadSizeLimitOmitted": "పేలోడ్ వదిలివేయబడింది — ఈ విభాగం కాల్ లాగ్ పరిమాణ పరిమితిని (CALL_LOG_PIPELINE_MAX_SIZE_KB) మించిపోయినందున నిల్వ చేయబడలేదు; ఇది నిజమైన అప్‌స్ట్రీమ్ లోపం కాదు.", "payloadMissing": "ఈ లాగ్ ఎంట్రీకి సంబంధించి వివరమైన పేమెంట్ ఆర్టిఫాక్ట్ అందుబాటులో లేదు.", "payloadCorrupt": "వివరమైన పేమెంట్ ఆర్టిఫాక్ట్‌ను పార్స్ చేయలేకపోయింది.", "notAvailable": "వర్తించదు", diff --git a/src/i18n/messages/th.json b/src/i18n/messages/th.json index 042d87ad3c..bafe833e75 100644 --- a/src/i18n/messages/th.json +++ b/src/i18n/messages/th.json @@ -11411,6 +11411,7 @@ "clientResponse": "การตอบสนองของลูกค้า", "pipelineError": "ข้อผิดพลาดของ Pipeline" }, + "payloadSizeLimitOmitted": "ละเว้นเพย์โหลด — ส่วนนี้เกินขีดจำกัดขนาดของบันทึกการเรียก (CALL_LOG_PIPELINE_MAX_SIZE_KB) จึงไม่ถูกจัดเก็บ ไม่ใช่ข้อผิดพลาดจริงจากผู้ให้บริการต้นทาง", "payloadMissing": "ข้อมูลรายละเอียดของ payload artifact ไม่สามารถใช้งานได้อีกต่อไปสำหรับรายการบันทึกนี้.", "payloadCorrupt": "ไม่สามารถแยกวิเคราะห์ข้อมูลพารามิเตอร์ที่ละเอียดได้。", "notAvailable": "ไม่สามารถใช้ได้", diff --git a/src/i18n/messages/tr.json b/src/i18n/messages/tr.json index 9cf33051d4..8007f6c2c0 100644 --- a/src/i18n/messages/tr.json +++ b/src/i18n/messages/tr.json @@ -11411,6 +11411,7 @@ "clientResponse": "Müşteri Yanıtı", "pipelineError": "Pipeline Hatası" }, + "payloadSizeLimitOmitted": "İçerik atlandı — bu bölüm çağrı günlüğü boyut sınırını (CALL_LOG_PIPELINE_MAX_SIZE_KB) aştı ve kaydedilmedi; bu gerçek bir sağlayıcı hatası değildir.", "payloadMissing": "Bu günlük girişi için ayrıntılı yük nesnesi artık mevcut değil.", "payloadCorrupt": "Ayrıntılı yük nesnesi ayrıştırılamadı.", "notAvailable": "Yok", diff --git a/src/i18n/messages/uk-UA.json b/src/i18n/messages/uk-UA.json index 905f24cf88..f73c30a786 100644 --- a/src/i18n/messages/uk-UA.json +++ b/src/i18n/messages/uk-UA.json @@ -11411,6 +11411,7 @@ "clientResponse": "Відповідь клієнта", "pipelineError": "Помилка конвеєра" }, + "payloadSizeLimitOmitted": "Вміст пропущено — цей розділ перевищив обмеження розміру журналу викликів (CALL_LOG_PIPELINE_MAX_SIZE_KB) і не був збережений; це не справжня помилка провайдера.", "payloadMissing": "Детальний артефакт корисного навантаження більше недоступний для цього запису журналу.", "payloadCorrupt": "Не вдалося розібрати детальний артефакт корисного навантаження.", "notAvailable": "Н/Д", diff --git a/src/i18n/messages/ur.json b/src/i18n/messages/ur.json index 19a0010436..39bc2f467c 100644 --- a/src/i18n/messages/ur.json +++ b/src/i18n/messages/ur.json @@ -11411,6 +11411,7 @@ "clientResponse": "کلائنٹ کا جواب", "pipelineError": "پائپ لائن کی خرابی" }, + "payloadSizeLimitOmitted": "پے لوڈ چھوڑ دیا گیا — یہ حصہ کال لاگ کی سائز حد (CALL_LOG_PIPELINE_MAX_SIZE_KB) سے تجاوز کر گیا اور محفوظ نہیں کیا گیا؛ یہ حقیقی اپ اسٹریم خرابی نہیں ہے۔", "payloadMissing": "اس لاگ اندراج کے لیے تفصیلی پیلوڈ آرٹيفیکٹ اب دستیاب نہیں ہے۔", "payloadCorrupt": "تفصیلی پیلوڈ آرٹفیکٹ کو پارس نہیں کیا جا سکا۔", "notAvailable": "دستیاب نہیں", diff --git a/src/i18n/messages/uz.json b/src/i18n/messages/uz.json index ecd45c966f..bf3c7a9dea 100644 --- a/src/i18n/messages/uz.json +++ b/src/i18n/messages/uz.json @@ -11411,6 +11411,7 @@ "clientResponse": "Mijozga javob", "pipelineError": "Konveyer xatosi" }, + "payloadSizeLimitOmitted": "Kontent tashlab ketildi — bu boʻlim chaqiruvlar jurnalining hajm chegarasidan (CALL_LOG_PIPELINE_MAX_SIZE_KB) oshib ketdi va saqlanmadi; bu haqiqiy provayder xatosi emas.", "payloadMissing": "Bu jurnal yozuvi uchun batafsil foydali yuk artefakti endi mavjud emas.", "payloadCorrupt": "Batafsil foydali yuk artefaktini tahlil qilib boʻlmadi.", "notAvailable": "Mavjud emas", diff --git a/src/i18n/messages/vi.json b/src/i18n/messages/vi.json index d56aac4081..526c9a28ed 100644 --- a/src/i18n/messages/vi.json +++ b/src/i18n/messages/vi.json @@ -11411,6 +11411,7 @@ "clientResponse": "Phản hồi client", "pipelineError": "Lỗi Pipeline" }, + "payloadSizeLimitOmitted": "Đã bỏ qua payload — phần này vượt quá giới hạn kích thước nhật ký cuộc gọi (CALL_LOG_PIPELINE_MAX_SIZE_KB) nên không được lưu; đây không phải lỗi thực sự từ upstream.", "payloadMissing": "Không còn artifact payload chi tiết cho mục nhật ký này.", "payloadCorrupt": "Không thể phân tích artifact payload chi tiết.", "notAvailable": "Không áp dụng", diff --git a/src/i18n/messages/yo.json b/src/i18n/messages/yo.json index 9544c193d6..d17dff5864 100644 --- a/src/i18n/messages/yo.json +++ b/src/i18n/messages/yo.json @@ -11464,7 +11464,8 @@ "correlationIdValue": "ID Ìbámu: {id}", "detailedPayloadInfo": "Kọ́kọ́ mú ìforúkọsílẹ̀ alálàyé ṣiṣẹ́ bí o bá fẹ́ àfihàn àkóónú client/provider onípele mẹ́rin fún àwọn ìbéèrè tuntun.", "copyAll": "Ṣe àdàkọ gbogbo rẹ̀", - "copiedAll": "A ti ṣe àdàkọ gbogbo rẹ̀" + "copiedAll": "A ti ṣe àdàkọ gbogbo rẹ̀", + "payloadSizeLimitOmitted": "A fo ẹrù-ìsọfúnni sílẹ̀ — apá yìí kọjá ààlà ìwọ̀n àkọsílẹ̀ ìpè (CALL_LOG_PIPELINE_MAX_SIZE_KB), a kò sì tọ́jú rẹ̀; kì í ṣe àṣìṣe gidi láti ọ̀dọ̀ olùpèsè." } }, "proxyLogger": { diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json index 163ba54af2..04a182d854 100644 --- a/src/i18n/messages/zh-CN.json +++ b/src/i18n/messages/zh-CN.json @@ -11411,6 +11411,7 @@ "clientResponse": "客户端响应", "pipelineError": "管道错误" }, + "payloadSizeLimitOmitted": "已省略负载 — 此部分超出了调用日志大小限制(CALL_LOG_PIPELINE_MAX_SIZE_KB),未被存储;这不是真正的上游错误。", "payloadMissing": "此日志条目的详细有效负载工件不再可用。", "payloadCorrupt": "无法解析详细的有效负载工件。", "notAvailable": "不适用", diff --git a/src/i18n/messages/zh-TW.json b/src/i18n/messages/zh-TW.json index 110c9d2cbe..589394fe29 100644 --- a/src/i18n/messages/zh-TW.json +++ b/src/i18n/messages/zh-TW.json @@ -11411,6 +11411,7 @@ "clientResponse": "客戶回應", "pipelineError": "管道錯誤" }, + "payloadSizeLimitOmitted": "已省略承載內容 — 此區段超出了呼叫日誌大小上限(CALL_LOG_PIPELINE_MAX_SIZE_KB),因此未被儲存;這並非真正的上游錯誤。", "payloadMissing": "此日誌條目的詳細有效負載工件不再可用。", "payloadCorrupt": "無法解析詳細的有效負載工件。", "notAvailable": "不適用", diff --git a/src/lib/usage/callLogArtifacts.ts b/src/lib/usage/callLogArtifacts.ts index 1fe14b98e7..c1a5d263ad 100644 --- a/src/lib/usage/callLogArtifacts.ts +++ b/src/lib/usage/callLogArtifacts.ts @@ -3,6 +3,12 @@ import path from "node:path"; import type { RequestPipelinePayloads } from "@omniroute/open-sse/utils/requestLogger.ts"; import { resolveDataDir } from "../dataPaths"; import { getCallLogPipelineMaxSizeBytes, isChatDebugFileEnabled } from "../logEnv"; +import { + CALL_LOG_SIZE_LIMIT_REASON as SIZE_LIMIT_EXCEEDED_REASON, + CALL_LOG_BODY_OMITTED_FOR_SIZE_LIMIT as OMITTED_FOR_SIZE_LIMIT, + CALL_LOG_STREAM_CHUNKS_OMITTED_FOR_SIZE_LIMIT as STREAM_CHUNKS_OMITTED_FOR_SIZE_LIMIT, + isSizeLimitOmissionMarker, +} from "@/shared/constants/callLogSizeLimitMarkers"; const isCloud = typeof globalThis.caches === "object" && globalThis.caches !== null; const isBuildPhase = @@ -12,21 +18,11 @@ const DATA_DIR = resolveDataDir({ isCloud }); export const CALL_LOGS_DIR = isCloud ? null : path.join(DATA_DIR, "call_logs"); export const MAX_CALL_LOG_ARTIFACT_BYTES = 512 * 1024; -const SIZE_LIMIT_EXCEEDED_REASON = "call_log_artifact_size_limit_exceeded"; -const OMITTED_FOR_SIZE_LIMIT = "[omitted: call log artifact size limit exceeded]"; -const STREAM_CHUNKS_OMITTED_FOR_SIZE_LIMIT = - "[stream chunks omitted: call log artifact size limit exceeded]"; - -/** - * True for a placeholder a size-limit fallback wrote in place of a real - * payload. Consumers that fall back from one artifact field to another - * (`maybeEnrichCompletedDetail`) must treat a marker as absent: it is a - * non-empty string, so a bare truthiness check happily "recovers" it and - * overwrites the real value it was meant to stand in for. - */ -export function isSizeLimitOmissionMarker(value: unknown): boolean { - return value === OMITTED_FOR_SIZE_LIMIT || value === STREAM_CHUNKS_OMITTED_FOR_SIZE_LIMIT; -} +// Re-exported for backward compatibility: consumers (completedRequestDetails.ts) +// import this marker check from here. Definition now lives in the shared +// constants module so the client-side detail view can use the exact same check +// without importing this fs/path-dependent, server-only module (see #13894). +export { isSizeLimitOmissionMarker }; // The error is the only field that says *why* a request failed, and it is // typically ~90 bytes next to the multi-hundred-KB bodies that trip the cap. @@ -54,7 +50,7 @@ function preserveErrorForSizeLimit(error: unknown): unknown { if (error === null || error === undefined) return null; let serialized: string; try { - serialized = typeof error === "string" ? error : JSON.stringify(error) ?? String(error); + serialized = typeof error === "string" ? error : (JSON.stringify(error) ?? String(error)); } catch { // A circular or unserializable error must not take the whole artifact down. serialized = String(error); diff --git a/src/shared/components/RequestLoggerDetail.sections.tsx b/src/shared/components/RequestLoggerDetail.sections.tsx index cbdce62a01..d5d5521a38 100644 --- a/src/shared/components/RequestLoggerDetail.sections.tsx +++ b/src/shared/components/RequestLoggerDetail.sections.tsx @@ -13,6 +13,47 @@ import { } from "@/shared/hooks/useTimestampTitles"; import { JsonTreeExpandControls } from "@/shared/components/JsonTreeExpandControls"; import { useJsonTreeExpandLevel } from "@/store/jsonTreeExpandStore"; +import { + isPipelineSizeLimitMarker, + isSizeLimitOmissionMarker, +} from "@/shared/constants/callLogSizeLimitMarkers"; + +// ─── Size-limit omission detection (#13894) ───────────────────────────────── +// A size-limited call-log artifact does not simply drop a payload -- it writes +// an explicit marker in its place (see callLogArtifacts.ts's +// omitOversizedPipeline()/buildMinimalArtifactForSizeLimit()). Before this fix +// the detail view fed that marker straight into the generic JSON/`
`
+// renderer, so a size-limit omission was indistinguishable from a real
+// upstream error or a genuinely empty payload -- a silent fallback. These
+// helpers turn the marker into an explicit, labeled notice instead.
+
+/** Builds the pipeline payload sections, replacing the `error` marker object
+ * left by a size-limited pipeline capture with an explicit notice entry
+ * instead of letting it render as if it were a real pipeline error. */
+export function buildPipelinePayloadSections(entries, pipelinePayloads) {
+  return entries
+    .map(([key, title]) => {
+      const value = pipelinePayloads?.[key];
+      if (key === "error" && isPipelineSizeLimitMarker(value)) {
+        return { key, title, json: null, notice: true };
+      }
+      if (value === null || value === undefined) return { key, title, json: null, notice: false };
+      let json;
+      try {
+        json = JSON.stringify(value, null, 2);
+      } catch {
+        json = String(value);
+      }
+      return { key, title, json, notice: false };
+    })
+    .filter((section) => section.json || section.notice);
+}
+
+/** True when a top-level requestBody/responseBody was replaced by the
+ * size-limit omission placeholder string rather than genuinely absent. */
+export function isBodySizeLimitOmission(value) {
+  return isSizeLimitOmissionMarker(value);
+}
 
 // ─── Payload Code Block ─────────────────────────────────────────────────────
 // Renders parsed payloads as a collapsible JSON tree (react18-json-view) so
@@ -21,11 +62,15 @@ import { useJsonTreeExpandLevel } from "@/store/jsonTreeExpandStore";
 // the plain 
 dump for anything that isn't valid JSON (e.g. a captured
 // error string), since json is display text sourced from JSON.stringify with
 // a String() fallback on failure -- it is not guaranteed parseable.
+// `notice`, when true, takes over rendering entirely: it means `json` is not a
+// real payload but a size-limit omission marker (#13894) that must be shown as
+// an explicit, labeled notice rather than a generic JSON/error dump.
 
 export function PayloadSection({
   title,
   sectionId,
   json,
+  notice = false,
   onCopy,
   collapsible = true,
   defaultOpen = true,
@@ -78,20 +123,28 @@ export function PayloadSection({
           )}
         
         
- + {!notice && ( + + )} {parsedJson !== null && }
- {open && parsedJson !== null && ( + {open && notice && ( +
+ warning + {t("payloadSizeLimitOmitted")} +
+ )} + {open && !notice && parsedJson !== null && (
)} - {open && parsedJson === null && ( + {open && !notice && parsedJson === null && (
           {json}
         
diff --git a/src/shared/components/RequestLoggerDetail.tsx b/src/shared/components/RequestLoggerDetail.tsx index 0721a34e58..acc5fd0035 100644 --- a/src/shared/components/RequestLoggerDetail.tsx +++ b/src/shared/components/RequestLoggerDetail.tsx @@ -20,6 +20,8 @@ import { useJsonTreeExpandLevel } from "@/store/jsonTreeExpandStore"; import { PayloadSection, ConversationContextSection, + buildPipelinePayloadSections, + isBodySizeLimitOmission, } from "@/shared/components/RequestLoggerDetail.sections"; // ─── Copy-all composition ──────────────────────────────────────────────────── @@ -470,22 +472,21 @@ export default function RequestLoggerDetail({ const pipelinePayloads = detail?.pipelinePayloads || null; const payloadSections = pipelinePayloads - ? [ - ["clientRawRequest", t("payload.clientRawRequest")], - ["clientRequest", t("payload.clientRequest")], - ["openaiRequest", t("payload.openaiRequest")], - ["providerRequest", t("payload.providerRequest")], - ["providerResponse", t("payload.providerResponse")], - ["clientResponse", t("payload.clientResponse")], - ["error", t("payload.pipelineError")], - ] - .map(([key, title]) => ({ - key, - title, - json: toPrettyJson(pipelinePayloads[key]), - })) - .filter((section) => section.json) + ? buildPipelinePayloadSections( + [ + ["clientRawRequest", t("payload.clientRawRequest")], + ["clientRequest", t("payload.clientRequest")], + ["openaiRequest", t("payload.openaiRequest")], + ["providerRequest", t("payload.providerRequest")], + ["providerResponse", t("payload.providerResponse")], + ["clientResponse", t("payload.clientResponse")], + ["error", t("payload.pipelineError")], + ], + pipelinePayloads + ) : []; + const requestBodyOmitted = isBodySizeLimitOmission(detail?.requestBody); + const responseBodyOmitted = isBodySizeLimitOmission(detail?.responseBody); const requestJson = detail?.requestBody ? toPrettyJson(detail.requestBody) : null; const responseJson = detail?.responseBody ? toPrettyJson(detail.responseBody) : null; const streamChunks = (() => { @@ -1155,6 +1156,7 @@ export default function RequestLoggerDetail({ title={section.title} sectionId={section.key} json={section.json} + notice={section.notice} onCopy={() => onCopy(section.json)} /> ))} @@ -1164,6 +1166,7 @@ export default function RequestLoggerDetail({ title={t("responsePayloadLegacy")} sectionId="responsePayloadLegacy" json={responseJson} + notice={responseBodyOmitted} onCopy={() => onCopy(responseJson)} /> )} @@ -1173,6 +1176,7 @@ export default function RequestLoggerDetail({ title={t("requestPayloadLegacy")} sectionId="requestPayloadLegacy" json={requestJson} + notice={requestBodyOmitted} onCopy={() => onCopy(requestJson)} /> )} diff --git a/src/shared/constants/callLogSizeLimitMarkers.ts b/src/shared/constants/callLogSizeLimitMarkers.ts new file mode 100644 index 0000000000..1a794114ea --- /dev/null +++ b/src/shared/constants/callLogSizeLimitMarkers.ts @@ -0,0 +1,40 @@ +// Sentinel markers written by src/lib/usage/callLogArtifacts.ts when a call-log +// artifact's request/response body or pipeline payload had to be dropped because +// it exceeded the configured size cap (CALL_LOG_PIPELINE_MAX_SIZE_KB / +// MAX_CALL_LOG_ARTIFACT_BYTES). Kept here — not inside callLogArtifacts.ts, which +// pulls in `fs`/`path` and cannot be imported by a client component — so the +// artifact writer and the request-log detail view (RequestLoggerDetail.tsx) share +// one definition of "this is a size-limit omission" instead of each guessing at +// the shape independently (see issue #13894: the previous frontend rendered the +// pipeline marker verbatim as if it were a real upstream error). + +export const CALL_LOG_SIZE_LIMIT_REASON = "call_log_artifact_size_limit_exceeded"; + +export const CALL_LOG_BODY_OMITTED_FOR_SIZE_LIMIT = + "[omitted: call log artifact size limit exceeded]"; + +export const CALL_LOG_STREAM_CHUNKS_OMITTED_FOR_SIZE_LIMIT = + "[stream chunks omitted: call log artifact size limit exceeded]"; + +/** + * True for a placeholder a size-limit fallback wrote in place of a real + * requestBody/responseBody/stream-chunk payload. + */ +export function isSizeLimitOmissionMarker(value: unknown): boolean { + return ( + value === CALL_LOG_BODY_OMITTED_FOR_SIZE_LIMIT || + value === CALL_LOG_STREAM_CHUNKS_OMITTED_FOR_SIZE_LIMIT + ); +} + +/** + * True for the `pipeline.error` marker object omitOversizedPipeline() writes in + * place of the real pipeline payload once it exceeds CALL_LOG_PIPELINE_MAX_SIZE_KB. + * Checked by shape (not just truthiness) so a real upstream error that happens to + * be named `error` is never mistaken for the size-limit marker. + */ +export function isPipelineSizeLimitMarker(pipelineError: unknown): boolean { + if (!pipelineError || typeof pipelineError !== "object") return false; + const candidate = pipelineError as { _omniroute_truncated?: unknown; reason?: unknown }; + return candidate._omniroute_truncated === true && candidate.reason === CALL_LOG_SIZE_LIMIT_REASON; +} diff --git a/tests/unit/dashboard/payload-section-size-limit-notice.test.tsx b/tests/unit/dashboard/payload-section-size-limit-notice.test.tsx new file mode 100644 index 0000000000..42510e1c10 --- /dev/null +++ b/tests/unit/dashboard/payload-section-size-limit-notice.test.tsx @@ -0,0 +1,134 @@ +// @vitest-environment jsdom +// +// Regression guard for #13894: a size-limited call-log artifact does not +// simply drop a payload — callLogArtifacts.ts writes an explicit marker in +// its place (`{ error: { _omniroute_truncated: true, reason: ... } }` for the +// pipeline, or the `[omitted: call log artifact size limit exceeded]` string +// for requestBody/responseBody). Before this fix, RequestLoggerDetail fed +// that marker straight into the generic JSON/`
` renderer under a
+// generically-titled "Pipeline Error" section, so a size-limit omission was
+// silently indistinguishable from a real upstream error. PayloadSection must
+// now render an explicit, labeled notice instead whenever `notice` is set,
+// and buildPipelinePayloadSections()/isBodySizeLimitOmission() must detect
+// the marker shapes and set it.
+import React, { act } from "react";
+import { createRoot, type Root } from "react-dom/client";
+import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
+
+vi.mock("next-intl", () => ({
+  useTranslations: () => (key: string) => key,
+}));
+
+vi.mock("@/shared/hooks/useTheme", () => ({
+  useTheme: () => ({ isDark: false }),
+}));
+
+const { PayloadSection, buildPipelinePayloadSections, isBodySizeLimitOmission } =
+  await import("../../../src/shared/components/RequestLoggerDetail.sections.tsx");
+
+let container: HTMLDivElement;
+let root: Root;
+
+beforeEach(() => {
+  container = document.createElement("div");
+  document.body.appendChild(container);
+  root = createRoot(container);
+});
+
+afterEach(() => {
+  act(() => root.unmount());
+  container.remove();
+  vi.clearAllMocks();
+});
+
+describe("PayloadSection size-limit omission notice (#13894)", () => {
+  it("renders an explicit notice instead of a JSON dump when notice=true, even if json is set", () => {
+    act(() => {
+      root.render(
+        
+      );
+    });
+
+    expect(container.querySelector("pre")).toBeNull();
+    expect(container.textContent).toContain("payloadSizeLimitOmitted");
+    expect(container.textContent).not.toContain("_omniroute_truncated");
+  });
+
+  it("renders the normal JSON tree when notice is not set", () => {
+    act(() => {
+      root.render(
+        
+      );
+    });
+
+    expect(container.textContent).not.toContain("payloadSizeLimitOmitted");
+    expect(container.textContent).toContain("status");
+  });
+
+  describe("buildPipelinePayloadSections()", () => {
+    const entries: Array<[string, string]> = [
+      ["providerResponse", "Provider Response"],
+      ["error", "Pipeline Error"],
+    ];
+
+    it("flags the pipeline.error size-limit marker with notice=true instead of dumping it as JSON", () => {
+      const pipelinePayloads = {
+        providerResponse: { status: 200 },
+        error: { _omniroute_truncated: true, reason: "call_log_artifact_size_limit_exceeded" },
+      };
+
+      const sections = buildPipelinePayloadSections(entries, pipelinePayloads);
+      const errorSection = sections.find((s) => s.key === "error");
+
+      expect(errorSection).toBeDefined();
+      expect(errorSection.notice).toBe(true);
+      expect(errorSection.json).toBeNull();
+    });
+
+    it("does NOT flag a real upstream error object shaped like {error: {...}} as a size-limit marker", () => {
+      const pipelinePayloads = {
+        providerResponse: { status: 500 },
+        error: { message: "upstream 500", code: "internal_error" },
+      };
+
+      const sections = buildPipelinePayloadSections(entries, pipelinePayloads);
+      const errorSection = sections.find((s) => s.key === "error");
+
+      expect(errorSection).toBeDefined();
+      expect(errorSection.notice).toBe(false);
+      expect(errorSection.json).toContain("upstream 500");
+    });
+
+    it("does not include a section for a key with no payload at all", () => {
+      const pipelinePayloads = { providerResponse: { status: 200 } };
+      const sections = buildPipelinePayloadSections(entries, pipelinePayloads);
+      expect(sections.map((s) => s.key)).toEqual(["providerResponse"]);
+    });
+  });
+
+  describe("isBodySizeLimitOmission()", () => {
+    it("is true for the requestBody/responseBody omission placeholder string", () => {
+      expect(isBodySizeLimitOmission("[omitted: call log artifact size limit exceeded]")).toBe(
+        true
+      );
+    });
+
+    it("is false for a real body value, including one that merely contains similar text", () => {
+      expect(isBodySizeLimitOmission({ messages: [{ role: "user", content: "hi" }] })).toBe(false);
+      expect(isBodySizeLimitOmission("call log artifact size limit exceeded (mentioned)")).toBe(
+        false
+      );
+      expect(isBodySizeLimitOmission(null)).toBe(false);
+      expect(isBodySizeLimitOmission(undefined)).toBe(false);
+    });
+  });
+});