diff --git a/open-sse/services/compression/languageDetector.ts b/open-sse/services/compression/languageDetector.ts index 3b3aa9b002..3b515ab2bb 100644 --- a/open-sse/services/compression/languageDetector.ts +++ b/open-sse/services/compression/languageDetector.ts @@ -4,6 +4,7 @@ const LANGUAGE_HINTS: Record = { de: [/\b(?:ich|datei|fehler|bitte|kannst|konfiguration|danke)\b/i], fr: [/\b(?:fichier|erreur|merci|peux|configuration|besoin)\b/i], ja: [/[\u3040-\u30ff]/], + id: [/\b(?:saya|kamu|anda|dengan|untuk|yang|tidak|bisa|terima\s+kasih|dari)\b/i], }; export function detectCompressionLanguage(text: string): string { diff --git a/open-sse/services/compression/outputMode.ts b/open-sse/services/compression/outputMode.ts index b90bf84d1a..c512c05cb1 100644 --- a/open-sse/services/compression/outputMode.ts +++ b/open-sse/services/compression/outputMode.ts @@ -59,6 +59,11 @@ const CAVEMAN_INSTRUCTION_BY_LANGUAGE = { full: `短く圧縮して回答。断片文可。技術内容、コード、エラー、URL、識別子は正確に保持。${SHARED_BOUNDARIES}`, ultra: `超短く回答。DB/auth/config/req/res/fn など一般的な略語は可。コード記号、API名、エラー文字列、URL、識別子は省略しない。${SHARED_BOUNDARIES}`, }, + id: { + lite: `Jawab ringkas. Hapus pengisi, salam sopan santun, keraguan. Pertahankan istilah teknis, kode, error, URL, & identifier secara persis. ${SHARED_BOUNDARIES}`, + full: `Jawab sangat singkat ala caveman pintar. Hapus kata pengisi (hanya/sangat/sebenarnya), salam sopan santun. Kalimat pendek/tidak lengkap OK. Gunakan sinonim pendek. Pertahankan semua substansi teknis, kode, error, URL, & identifier secara persis. ${SHARED_BOUNDARIES}`, + ultra: `Jawab ultra singkat. Kompresi maksimal. Gunakan singkatan umum (DB/auth/config/req/res/fn/impl), hilangkan kata hubung, gunakan panah untuk kausalitas (X → Y). Satu kata jika cukup. Jangan singkat simbol kode, nama API, string error, URL, atau identifier. ${SHARED_BOUNDARIES}`, + }, } as const; const CAVEMAN_OUTPUT_MARKER = "[OmniRoute Caveman Output Mode]"; diff --git a/open-sse/services/compression/rules/id/context.json b/open-sse/services/compression/rules/id/context.json new file mode 100644 index 0000000000..dabc27d86c --- /dev/null +++ b/open-sse/services/compression/rules/id/context.json @@ -0,0 +1,113 @@ +{ + "language": "id", + "category": "context", + "rules": [ + { + "name": "id_explanatory_prefix", + "pattern": "\\b(?:fungsi\\s+ini\\s+nampaknya\\s+menangani|kode\\s+ini\\s+tampaknya|kelas\\s+ini|modul\\s+ini\\s+adalah)\\b", + "replacement": "Fungsi:", + "replacementMap": { + "fungsi ini nampaknya menangani": "Fungsi:", + "kode ini tampaknya": "Kode:", + "kelas ini": "Kelas:", + "modul ini adalah": "Modul:" + }, + "context": "all", + "category": "context", + "minIntensity": "lite" + }, + { + "name": "id_question_to_directive", + "pattern": "\\b(?:bisa\\s+jelaskan\\s+kenapa|bisa\\s+tunjukkan\\s+bagaimana|bisa\\s+beritahu\\s+saya|tolong\\s+beritahu\\s+ke|tolong\\s+jelasin\\s+kenapa|tolong\\s+infoin|kasih\\s+tau\\s+gimana|tunjukkan\\s+cara\\s+bagaimana|tunjukkan\\s+cara)\\b", + "replacement": "Jelaskan kenapa ", + "replacementMap": { + "bisa jelaskan kenapa": "Jelaskan kenapa ", + "bisa tunjukkan bagaimana": "Tunjukkan bagaimana ", + "bisa beritahu saya": "Beritahu saya ", + "tolong beritahu ke": "Beritahu ", + "tolong jelasin kenapa": "Jelaskan kenapa ", + "tolong infoin": "Info ", + "kasih tau gimana": "Tunjukkan bagaimana ", + "tunjukkan cara bagaimana": "Tunjukkan cara ", + "tunjukkan cara": "Tunjukkan cara " + }, + "context": "user", + "category": "context", + "minIntensity": "lite" + }, + { + "name": "id_context_setup", + "pattern": "\\b(?:saya\\s+punya\\s+kode\\s+berikut|berikut\\s+adalah\\s+kode\\s+saya|berikut\\s+kodenya|ini\\s+kodenya|kode\\s+di\\s+bawah\\s+ini|ini\\s+filenya|berikut\\s+isi\\s+filenya|berikut\\s+isi\\s+berkasnya|berikut\\s+kodenya)\\b\\s*[:.]?\\s*", + "replacement": "Kode:", + "context": "user", + "category": "context", + "minIntensity": "lite", + "replacementMap": { + "saya punya kode berikut": "Kode:", + "berikut adalah kode saya": "Kode:", + "berikut kodenya": "Kode:", + "ini kodenya": "Kode:", + "kode di bawah ini": "Kode:", + "ini filenya": "File:", + "berikut isi filenya": "File:", + "berikut isi berkasnya": "File:" + } + }, + { + "name": "id_intent_clarification", + "pattern": "\\b(?:apa\\s+yang\\s+sedang\\s+saya\\s+coba\\s+lakukan\\s+adalah|tujuan\\s+saya\\s+adalah\\s+untuk|yang\\s+saya\\s+butuhkan\\s+adalah|saya\\s+menargetkan\\s+untuk|gw\\s+mau|gua\\s+mau|saya\\s+pengen|aku\\s+ingin)\\b\\s*", + "replacement": "Tujuan:", + "context": "user", + "category": "context", + "minIntensity": "lite" + }, + { + "name": "id_background_removal", + "pattern": "\\b(?:seperti\\s+yang\\s+anda\\s+ketahui|seperti\\s+yang\\s+kita\\s+diskusikan\\s+sebelumnya)\\s*", + "replacement": "", + "context": "all", + "category": "context", + "minIntensity": "lite" + }, + { + "name": "id_meta_commentary", + "pattern": "^(?:catat\\s+bahwa|perlu\\s+diingat\\s+bahwa|ingat\\s+bahwa)\\b\\s*", + "replacement": "", + "context": "all", + "category": "context", + "minIntensity": "lite" + }, + { + "name": "id_purpose_statement", + "pattern": "\\b(?:dengan\\s+tujuan\\s+untuk|dalam\\s+upaya\\s+untuk|untuk\\s+setiap)\\b", + "replacement": "untuk", + "replacementMap": { + "dengan tujuan untuk": "untuk", + "dalam upaya untuk": "untuk", + "untuk setiap": "per" + }, + "context": "all", + "category": "context", + "minIntensity": "lite" + }, + { + "name": "id_conversational_connectors", + "pattern": "\\b(?:pertama-tama|kedua|selanjutnya|lalu|kemudian|di\\s+samping\\s+itu|oleh\\s+karena\\s+itu|maka\\s+dari\\s+itu|dengan\\s+kata\\s+lain|sebagai\\s+catatan)\\b", + "replacementMap": { + "pertama-tama": "1.", + "kedua": "2.", + "selanjutnya": "lalu", + "lalu": ">", + "kemudian": ">", + "di samping itu": "juga", + "oleh karena itu": "jadi", + "maka dari itu": "jadi", + "dengan kata lain": "artinya", + "sebagai catatan": "catatan:" + }, + "context": "all", + "category": "context", + "minIntensity": "lite" + } + ] +} \ No newline at end of file diff --git a/open-sse/services/compression/rules/id/dedup.json b/open-sse/services/compression/rules/id/dedup.json new file mode 100644 index 0000000000..875880c5a4 --- /dev/null +++ b/open-sse/services/compression/rules/id/dedup.json @@ -0,0 +1,38 @@ +{ + "language": "id", + "category": "dedup", + "rules": [ + { + "name": "id_repeated_context", + "pattern": "\\b(?:seperti\\s+yang\\s+kita\\s+diskusikan\\s+tadi|seperti\\s+yang\\s+disebutkan\\s+taraf\\s+awal|seperti\\s+dijelaskan\\s+sebelumnya|seperti\\s+saya\\s+katakan\\s+tadi|sebelumnya\\s+sudah\\s+saya\\s+jelaskan|seperti\\s+yang\\s+saya\\s+sebutkan\\s+tadi|seperti\\s+yang\\s+sudah\\s+dibahas|seperti\\s+yang\\s+dibilang\\s+sebelumnya)\\b[,.]?\\s*", + "replacement": "Sama seperti di atas. ", + "context": "all", + "category": "dedup", + "minIntensity": "lite" + }, + { + "name": "id_repeated_question", + "pattern": "\\b(?:pertanyaan\\s+yang\\s+sama\\s+seperti\\s+sebelumnya|saya\\s+tanya\\s+ini\\s+tadi|ini\\s+pertanyaan\\s+yang\\s+sama)\\b[,.]?\\s*", + "replacement": "[pertanyaan sama] ", + "context": "user", + "category": "dedup", + "minIntensity": "lite" + }, + { + "name": "id_reestablished_context", + "pattern": "\\b(?:kembali\\s+ke\\s+kode\\s+di\\s+atas|merujuk\\s+kembali\\s+ke|kembali\\s+ke|kembali\\s+ke\\s+pembahasan|kembali\\s+ke\\s+topik|balik\\s+lagi\\s+ke|kembali\\s+membahas)\\b\\s*", + "replacement": "Re: ", + "context": "all", + "category": "dedup", + "minIntensity": "lite" + }, + { + "name": "id_summary_replacement", + "pattern": "\\b(?:untuk\\s+meringkas\\s+apa\\s+yang\\s+kita\\s+bahas|ringkasan\\s+dari\\s+diskusi\\s+kita|singkatnya|singkat\\s+cerita|kesimpulannya|intisarinya)\\b[,.]?\\s*", + "replacement": "Summary: ", + "context": "assistant", + "category": "dedup", + "minIntensity": "lite" + } + ] +} \ No newline at end of file diff --git a/open-sse/services/compression/rules/id/filler.json b/open-sse/services/compression/rules/id/filler.json new file mode 100644 index 0000000000..3b2ecb2328 --- /dev/null +++ b/open-sse/services/compression/rules/id/filler.json @@ -0,0 +1,138 @@ +{ + "language": "id", + "category": "filler", + "rules": [ + { + "name": "id_pleasantries", + "pattern": "\\b(?:terima\\s+kasih\\s+banyak|terima\\s+kasih|makasih\\s+banyak|makasih|suwun|hatur\\s+nuhun|nuhun|mohon\\s+bantuannya|tolong\\s+bantuannya|sama-sama|terima\\s+kasih\\s+kembali|kembali|sama\\s+sama|sangat\\s+membantu|senang\\s+membantu|salam\\s+hangat|semoga\\s+membantu|semoga\\s+bermanfaat|terima\\s+kasih\\s+banyak\\s+ya|makasih\\s+ya)\\b[,.!?\\s]*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_polite_framing", + "pattern": "\\b(?:mohon\\s+info|mohon|tolong|tolong\\s+dong|tlg|tolong\\s+buatkan|saya\\s+ingin\\s+meminta|saya\\s+ingin|ingin\\s+meminta|bisa\\s+tolong|tolong\\s+jelaskan|tolong\\s+tunjukkan|minta\\s+tolong|tolongin|mohon\\s+bantu|mohon\\s+bantuan)\\b\\s*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_hedging", + "pattern": "\\b(?:sepertinya|tampaknya|mungkin|rasanya|kiranya|kurang\\s+lebih|bisa\\s+jadi|seolah-olah|seolah|kelihatannya)\\b\\s*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_verbose_instructions", + "pattern": "\\b(?:berikan\\s+penjelasan\\s+rinci\\s+tentang|berikan\\s+penjelasan\\s+detail\\s+tentang|jelaskan\\s+secara\\s+rinci|jelaskan\\s+secara\\s+detail|tuliskan\\s+secara\\s+lengkap|secara\\s+mendetail|secara\\s+mendalam|secara\\s+rinci|secara\\s+detail)\\b\\s*", + "replacement": "jelaskan ", + "replacementMap": { + "berikan penjelasan rinci tentang": "jelaskan ", + "berikan penjelasan detail tentang": "jelaskan ", + "jelaskan secara rinci": "jelaskan ", + "jelaskan secara detail": "jelaskan ", + "tuliskan secara lengkap": "tulis ", + "secara mendetail": "", + "secara mendalam": "", + "secara rinci": "", + "secara detail": "" + }, + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_filler_adverbs", + "pattern": "\\b(?:pada\\s+dasarnya|sebenarnya|secara\\s+harfiah|gampangnya|mudahnya|sederhananya|saat\\s+ini|sekarang|cuma|hanya)\\b\\s*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_filler_phrases", + "pattern": "^(?:saya\\s+ingin|saya\\s+butuh|saya\\s+mau|saya\\s+sedang\\s+mencari|tujuan\\s+saya|rencana\\s+saya)\\b\\s*", + "replacement": "", + "context": "user", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_redundant_openers", + "pattern": "^(?:halo\\s+gan|halo\\s+min|halo|hai|hi|hey|heyy|selamat\\s+pagi|selamat\\s+siang|selamat\\s+sore|selamat\\s+malam|permisi|assalamualaikum|assalamu\\'alaikum|assalamualaikum\\s+wr\\s+wb|salam\\s+sejahtera|permisi\\s+(?:kak|gan|sis|bro|mas|bang|min)|permisi\\s+semuanya|halo\\s+(?:bro|kak|sis|guys|kawan))\\b\\s*[,.!?\\s]?\\s*", + "replacement": "", + "context": "user", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_verbose_requests", + "pattern": "\\b(?:saya\\s+penasaran\\s+apakah|apakah\\s+memungkinkan\\s+untuk|apakah\\s+bisa|apakah\\s+mungkin)\\b\\s*", + "replacement": "", + "context": "user", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_self_reference", + "pattern": "^(?:saya|gw|gua|gue|aku|kita|ane)\\s+(?:sedang|lagi|masih)(?:\\s+(?:mencoba\\s+untuk|mengerjakan))?\\b\\s*", + "replacement": "", + "context": "user", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_qualifier_removal", + "pattern": "\\b(?:sedikit|agak|terkadang|kadang-kadang|kadang|semacam)\\b\\s*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_softeners", + "pattern": "\\b(?:jika\\s+memungkinkan|kalau\\s+bisa|kalau\\s+sempat|bila\\s+berkenan|sekadar\\s+bertanya)\\b[,.!?\\s]*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_uncertainty_fillers", + "pattern": "\\b(?:saya\\s+rasa|saya\\s+kira|kurang\\s+lebih|kira-kira|kira\\s+kira)\\b\\s*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_assistant_fillers", + "pattern": "^(?:berikut\\s+adalah|berikut|ini\\s+adalah|bawah\\s+ini\\s+adalah)\\s+", + "replacement": "", + "context": "assistant", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_discourse_fillers", + "pattern": "\\b(?:kebetulan|sekadar|sekedar|sejujurnya|secara\\s+pribadi|rupanya|pada\\s+intinya|intinya|singkat\\s+kata|omong-omong|ngomong-ngomong|btw|fyi|asalkan|asal)\\b\\s*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "id_particles_removal", + "pattern": "\\b(?:dong|deh|sih|kok|loh|lah|tah|kah|pun|tuh|si|kek|ya)\\b", + "flags": "gi", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + } + ] +} \ No newline at end of file diff --git a/open-sse/services/compression/rules/id/structural.json b/open-sse/services/compression/rules/id/structural.json new file mode 100644 index 0000000000..15d14d27e2 --- /dev/null +++ b/open-sse/services/compression/rules/id/structural.json @@ -0,0 +1,111 @@ +{ + "language": "id", + "category": "structural", + "rules": [ + { + "name": "id_redundant_phrasing", + "pattern": "\\b(?:pastikan\\s+untuk|harus\\s+dipastikan|perlu\\s+untuk|dianjurkan\\s+untuk|disarankan\\s+untuk|wajib\\s+untuk)\\b\\s*", + "context": "all", + "category": "structural", + "minIntensity": "full", + "replacementMap": { + "pastikan untuk": "pastikan ", + "harus dipastikan": "pastikan ", + "perlu untuk": "perlu ", + "dianjurkan untuk": "dianjurkan ", + "disarankan untuk": "disarankan ", + "wajib untuk": "wajib " + } + }, + { + "name": "id_redundant_because", + "pattern": "\\b(?:dikarenakan\\s+adanya\\s+fakta\\s+bahwa|alasan\\s+utamanya\\s+adalah\\s+karena|oleh\\s+karena\\s+fakta\\s+bahwa|disebabkan\\s+oleh\\s+karena|karena\\s+alasan\\s+bahwa)\\b\\s*", + "replacement": "karena ", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "id_redundant_directive", + "pattern": "\\b(?:penting\\s+untuk|anda\\s+seharusnya|ingat\\s+untuk)\\b\\s*", + "replacement": "", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "id_list_conjunction", + "pattern": ",\\s*dan\\s+juga\\s+|,\\s*serta\\s+|,\\s*maupun\\s+juga\\s*", + "replacement": ", ", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "id_purpose_phrases", + "pattern": "\\b(?:agar\\s+bisa\\s+untuk|supaya\\s+bisa\\s+untuk|bertujuan\\s+untuk)\\b\\s*", + "replacement": "untuk ", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "id_redundant_quantifiers", + "pattern": "\\b(?:masing-masing\\s+dan\\s+setiap|tiap-tiap\\s+dan\\s+setiap)\\b", + "replacement": "setiap", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "id_all_quantifier", + "pattern": "\\bapapun\\s+dan\\s+semua\\b", + "replacement": "semua", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "id_verbose_connectors", + "pattern": "\\b(?:selain\\s+itu|lebih\\s+lanjut\\s+lagi|tambahan\\s+lagi|dan\\s+juga)\\b\\s*", + "replacement": "juga ", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "id_transition_removal", + "pattern": "^(?:Di\\s+sisi\\s+lain,?\\s*|Sebaliknya,?\\s*|Namun,?\\s*|Akan\\s+tetapi,?\\s*)", + "replacement": "", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "id_emphasis_removal", + "pattern": "\\b(?:sangat|sekali|amat|luar\\s+biasa|sungguh)\\s+(?=[a-z])", + "replacement": "", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "id_passive_voice", + "pattern": "\\b(?:sedang\\s+digunakan|sedang\\s+dipanggil|sedang\\s+dibuat|telah\\s+dibuat|telah\\s+diterapkan|sedang\\s+dijalankan|sedang\\s+diuji|telah\\s+diimplementasikan)\\b", + "replacement": "pakai", + "replacementMap": { + "sedang digunakan": "pakai", + "sedang dipanggil": "panggil", + "sedang dibuat": "buat", + "telah dibuat": "buat", + "telah diterapkan": "terapkan", + "sedang dijalankan": "jalan", + "sedang diuji": "uji", + "telah diimplementasikan": "terapkan" + }, + "context": "all", + "category": "structural", + "minIntensity": "full" + } + ] +} \ No newline at end of file diff --git a/open-sse/services/compression/rules/id/ultra.json b/open-sse/services/compression/rules/id/ultra.json new file mode 100644 index 0000000000..be0f0cc2fe --- /dev/null +++ b/open-sse/services/compression/rules/id/ultra.json @@ -0,0 +1,252 @@ +{ + "language": "id", + "category": "ultra", + "rules": [ + { + "name": "id_articles_removal", + "pattern": "\\b(?:itu|tersebut|ini)\\s+(?=[a-z])", + "flags": "g", + "replacement": "", + "context": "all", + "category": "terse", + "minIntensity": "full" + }, + { + "name": "id_leader_phrases", + "pattern": "^(?:saya\\s+akan|saya\\s+bisa|biarkan\\s+saya|kamu\\s+bisa|kita\\s+bisa|mari|mari\\s+kita)\\s+(?=[a-z])", + "replacement": "", + "context": "all", + "category": "terse", + "minIntensity": "full" + }, + { + "name": "id_ultra_abbreviations", + "pattern": "\\b(?:basis\\s+data|database)\\b", + "replacement": "DB", + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "id_ultra_config_abbreviation", + "pattern": "\\b(?:konfigurasi|pengaturan)\\b", + "replacement": "config", + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "id_ultra_function_abbreviation", + "pattern": "\\b(?:fungsi|metode)\\b", + "replacement": "fn", + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "id_ultra_request_abbreviation", + "pattern": "\\b(?:permintaan|request)\\b", + "replacement": "req", + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "id_ultra_response_abbreviation", + "pattern": "\\b(?:tanggapan|respons|jawaban|response)\\b", + "replacement": "res", + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "id_ultra_implementation_abbreviation", + "pattern": "\\b(?:implementasi|penerapan)\\b", + "replacement": "impl", + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "id_ultra_authentication_abbreviation", + "pattern": "\\b(?:auten|autentikasi|otentikasi|authentication)\\b", + "replacement": "auth", + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "id_ultra_authorization_abbreviation", + "pattern": "\\b(?:otorisasi|authorization)\\b", + "replacement": "authz", + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "id_ultra_application_abbreviation", + "pattern": "\\b(?:aplikasi|program|application)\\b", + "replacement": "app", + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "id_ultra_dependency_abbreviation", + "pattern": "\\b(?:ketergantungan|depedensi|dependensi|dependencies)\\b", + "replacement": "dep", + "replacementMap": { + "ketergantungan": "dep", + "depedensi": "dep", + "dependensi": "dep", + "dependencies": "deps" + }, + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "ultra_id_common_shortenings", + "pattern": "\\b(?:yang|untuk|dengan|adalah|tidak|sebagai|dari|dan|bisa|atau|dalam|oleh|pada|sudah|belum|akan|juga|karena|setelah|sebelum|terhadap|tentang|secara|seperti|bahwa|hanya|cuma|saja|bagaimana|mengapa|kenapa|apakah|sebagaimana|agar|supaya|bahwasanya)\\b", + "flags": "gi", + "replacementMap": { + "yang": "yg", + "untuk": "utk", + "dengan": "dg", + "adalah": "=", + "tidak": "gk", + "sebagai": "sbg", + "dari": "dr", + "dan": "&", + "bisa": "bs", + "atau": "/", + "dalam": "dlm", + "oleh": "olh", + "pada": "pd", + "sudah": "sdh", + "belum": "blm", + "akan": "akn", + "juga": "jg", + "karena": "krn", + "setelah": "stlh", + "sebelum": "sblm", + "terhadap": "thd", + "tentang": "ttg", + "secara": "scr", + "seperti": "spt", + "bahwa": "bwh", + "hanya": "hnya", + "cuma": "cma", + "saja": "aja", + "bagaimana": "gmn", + "mengapa": "knp", + "kenapa": "knp", + "apakah": "apa", + "sebagaimana": "sbgmn", + "agar": "agr", + "supaya": "spya", + "bahwasanya": "bwhsnya" + }, + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "ultra_id_technical_shortenings", + "pattern": "\\b(?:informasi|parameter|argumen|variabel|nilai|alamat|nomor|jumlah|indeks|sumber|tujuan|berkas|kesalahan|pesan|pengguna|sistem|klien|server|jaringan|koneksi|pernyataan|transaksi|objek|kamus|daftar|panjang|karakter|tanggapan|autentikasi|konfigurasi)\\b", + "flags": "gi", + "replacementMap": { + "informasi": "info", + "parameter": "param", + "argumen": "arg", + "variabel": "var", + "nilai": "val", + "alamat": "addr", + "nomor": "no", + "jumlah": "qty", + "indeks": "idx", + "sumber": "src", + "tujuan": "dest", + "berkas": "file", + "kesalahan": "err", + "pesan": "msg", + "pengguna": "usr", + "sistem": "sys", + "klien": "cli", + "server": "srv", + "jaringan": "net", + "koneksi": "conn", + "pernyataan": "stmt", + "transaksi": "tx", + "objek": "obj", + "kamus": "dict", + "daftar": "list", + "panjang": "len", + "karakter": "char", + "tanggapan": "res", + "autentikasi": "auth", + "konfigurasi": "config" + }, + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "ultra_id_slang_abbreviations", + "pattern": "\\b(?:gimana|kenapa|sekarang|sebentar|cepat|langsung|tapi|terus|banget|terlalu|banyak|sedikit|masalah|tambah|kurang|mungkin|melihat|buat|buatkan|pakai|dulu|nanti|kasih|tanya|minta|tolong|kirim|simpan|kerja|selesai|eror|website|aplikasi|database|kembali|iya|oke|tidak|jangan|pengen|gua|gue|lu|ente|kamu|aku|saya)\\b", + "flags": "gi", + "replacementMap": { + "gimana": "gmn", + "kenapa": "knp", + "sekarang": "skrg", + "sebentar": "bntr", + "cepat": "cpt", + "langsung": "lsg", + "tapi": "tp", + "terus": "trus", + "banget": "bgt", + "terlalu": "trl", + "banyak": "bnyk", + "sedikit": "sdkt", + "masalah": "mslh", + "tambah": "tmbh", + "kurang": "krg", + "mungkin": "mgkn", + "melihat": "lht", + "buat": "bwt", + "buatkan": "bwt", + "pakai": "pake", + "dulu": "dlu", + "nanti": "nti", + "kasih": "ksh", + "tanya": "tny", + "minta": "mnt", + "tolong": "tlg", + "kirim": "krm", + "simpan": "smpn", + "kerja": "krj", + "selesai": "sls", + "eror": "err", + "website": "web", + "aplikasi": "app", + "database": "DB", + "kembali": "ret", + "iya": "y", + "oke": "ok", + "tidak": "gk", + "jangan": "jgn", + "pengen": "mau", + "gua": "gw", + "gue": "gw", + "lu": "lo", + "ente": "lo", + "kamu": "lo", + "aku": "gw", + "saya": "gw" + }, + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + } + ] +} \ No newline at end of file diff --git a/tests/unit/compression/language-packs.test.ts b/tests/unit/compression/language-packs.test.ts index 114bddadef..61b6936851 100644 --- a/tests/unit/compression/language-packs.test.ts +++ b/tests/unit/compression/language-packs.test.ts @@ -9,10 +9,10 @@ import { import { applyRulesToText } from "../../../open-sse/services/compression/caveman.ts"; import { getRulesForContext } from "../../../open-sse/services/compression/cavemanRules.ts"; -const LANGUAGES = ["pt-BR", "es", "de", "fr", "ja"]; +const LANGUAGES = ["pt-BR", "es", "de", "fr", "ja", "id"]; describe("Caveman language packs", () => { - it("ships 5 language packs with at least 15 rules each", () => { + it("ships 6 language packs with at least 15 rules each", () => { for (const language of LANGUAGES) { const rules = loadAllRulesForLanguage(language, { refresh: true }); assert.ok(rules.length >= 15, `${language} expected 15+ rules, got ${rules.length}`); @@ -37,6 +37,7 @@ describe("Caveman language packs", () => { assert.equal(detectCompressionLanguage("ich brauche diese konfiguration"), "de"); assert.equal(detectCompressionLanguage("j'ai besoin de corriger cette erreur fichier"), "fr"); assert.equal(detectCompressionLanguage("このコードを修正してください"), "ja"); + assert.equal(detectCompressionLanguage("bisa tolong jelaskan tentang database ini"), "id"); }); it("applies non-English rule packs to golden samples", () => { @@ -79,6 +80,20 @@ describe("Caveman language packs", () => { assert.ok(text.includes("src/auth.ts")); }); + it("applies Indonesian rules without touching technical terms", () => { + const idRules = getRulesForContext("user", "ultra", "id"); + const { text } = applyRulesToText( + "Tolong berikan penjelasan detail tentang basis data dan autentikasi di src/auth.ts", + idRules + ); + + assert.ok(!text.toLowerCase().includes("tolong")); + assert.ok(!text.toLowerCase().includes("penjelasan detail")); + assert.ok(text.includes("DB")); + assert.ok(text.includes("auth")); + assert.ok(text.includes("src/auth.ts")); + }); + it("builds localized output mode instructions", () => { const config = { enabled: true, intensity: "full" as const, autoClarity: true }; @@ -87,5 +102,6 @@ describe("Caveman language packs", () => { assert.match(buildCavemanOutputInstruction(config, "de"), /Antworte/); assert.match(buildCavemanOutputInstruction(config, "fr"), /Reponds/); assert.match(buildCavemanOutputInstruction(config, "ja"), /回答/); + assert.match(buildCavemanOutputInstruction(config, "id"), /Jawab/); }); });