# RTK Compression (বাংলা) 🌐 **Languages:** 🇺🇸 [English](../../../../compression/RTK_COMPRESSION.md) · 🇪🇹 [am](../../../am/docs/compression/RTK_COMPRESSION.md) · 🇸🇦 [ar](../../../ar/docs/compression/RTK_COMPRESSION.md) · 🇦🇿 [az](../../../az/docs/compression/RTK_COMPRESSION.md) · 🇧🇬 [bg](../../../bg/docs/compression/RTK_COMPRESSION.md) · 🇧🇦 [bs](../../../bs/docs/compression/RTK_COMPRESSION.md) · 🇨🇿 [cs](../../../cs/docs/compression/RTK_COMPRESSION.md) · 🇩🇰 [da](../../../da/docs/compression/RTK_COMPRESSION.md) · 🇩🇪 [de](../../../de/docs/compression/RTK_COMPRESSION.md) · 🇬🇷 [el](../../../el/docs/compression/RTK_COMPRESSION.md) · 🇪🇸 [es](../../../es/docs/compression/RTK_COMPRESSION.md) · 🇪🇪 [et](../../../et/docs/compression/RTK_COMPRESSION.md) · 🇮🇷 [fa](../../../fa/docs/compression/RTK_COMPRESSION.md) · 🇫🇮 [fi](../../../fi/docs/compression/RTK_COMPRESSION.md) · 🇫🇷 [fr](../../../fr/docs/compression/RTK_COMPRESSION.md) · 🇮🇪 [ga](../../../ga/docs/compression/RTK_COMPRESSION.md) · 🇮🇳 [gu](../../../gu/docs/compression/RTK_COMPRESSION.md) · 🇳🇬 [ha](../../../ha/docs/compression/RTK_COMPRESSION.md) · 🇮🇱 [he](../../../he/docs/compression/RTK_COMPRESSION.md) · 🇮🇳 [hi](../../../hi/docs/compression/RTK_COMPRESSION.md) · 🇭🇷 [hr](../../../hr/docs/compression/RTK_COMPRESSION.md) · 🇭🇺 [hu](../../../hu/docs/compression/RTK_COMPRESSION.md) · 🇦🇲 [hy](../../../hy/docs/compression/RTK_COMPRESSION.md) · 🇮🇩 [id](../../../id/docs/compression/RTK_COMPRESSION.md) · 🇳🇬 [ig](../../../ig/docs/compression/RTK_COMPRESSION.md) · 🇮🇹 [it](../../../it/docs/compression/RTK_COMPRESSION.md) · 🇯🇵 [ja](../../../ja/docs/compression/RTK_COMPRESSION.md) · 🇬🇪 [ka](../../../ka/docs/compression/RTK_COMPRESSION.md) · 🇰🇭 [km](../../../km/docs/compression/RTK_COMPRESSION.md) · 🇮🇳 [kn](../../../kn/docs/compression/RTK_COMPRESSION.md) · 🇰🇷 [ko](../../../ko/docs/compression/RTK_COMPRESSION.md) · 🇱🇹 [lt](../../../lt/docs/compression/RTK_COMPRESSION.md) · 🇱🇻 [lv](../../../lv/docs/compression/RTK_COMPRESSION.md) · 🇮🇳 [ml](../../../ml/docs/compression/RTK_COMPRESSION.md) · 🇮🇳 [mr](../../../mr/docs/compression/RTK_COMPRESSION.md) · 🇲🇾 [ms](../../../ms/docs/compression/RTK_COMPRESSION.md) · 🇲🇹 [mt](../../../mt/docs/compression/RTK_COMPRESSION.md) · 🇲🇲 [my](../../../my/docs/compression/RTK_COMPRESSION.md) · 🇳🇵 [ne](../../../ne/docs/compression/RTK_COMPRESSION.md) · 🇳🇱 [nl](../../../nl/docs/compression/RTK_COMPRESSION.md) · 🇳🇴 [no](../../../no/docs/compression/RTK_COMPRESSION.md) · 🇮🇳 [or](../../../or/docs/compression/RTK_COMPRESSION.md) · 🇮🇳 [pa](../../../pa/docs/compression/RTK_COMPRESSION.md) · 🇵🇭 [phi](../../../phi/docs/compression/RTK_COMPRESSION.md) · 🇵🇱 [pl](../../../pl/docs/compression/RTK_COMPRESSION.md) · 🇵🇹 [pt](../../../pt/docs/compression/RTK_COMPRESSION.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/compression/RTK_COMPRESSION.md) · 🇷🇴 [ro](../../../ro/docs/compression/RTK_COMPRESSION.md) · 🇷🇺 [ru](../../../ru/docs/compression/RTK_COMPRESSION.md) · 🇱🇰 [si](../../../si/docs/compression/RTK_COMPRESSION.md) · 🇸🇰 [sk](../../../sk/docs/compression/RTK_COMPRESSION.md) · 🇸🇮 [sl](../../../sl/docs/compression/RTK_COMPRESSION.md) · 🇷🇸 [sr](../../../sr/docs/compression/RTK_COMPRESSION.md) · 🇸🇪 [sv](../../../sv/docs/compression/RTK_COMPRESSION.md) · 🇰🇪 [sw](../../../sw/docs/compression/RTK_COMPRESSION.md) · 🇮🇳 [ta](../../../ta/docs/compression/RTK_COMPRESSION.md) · 🇮🇳 [te](../../../te/docs/compression/RTK_COMPRESSION.md) · 🇹🇭 [th](../../../th/docs/compression/RTK_COMPRESSION.md) · 🇹🇷 [tr](../../../tr/docs/compression/RTK_COMPRESSION.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/compression/RTK_COMPRESSION.md) · 🇵🇰 [ur](../../../ur/docs/compression/RTK_COMPRESSION.md) · 🇺🇿 [uz](../../../uz/docs/compression/RTK_COMPRESSION.md) · 🇻🇳 [vi](../../../vi/docs/compression/RTK_COMPRESSION.md) · 🇳🇬 [yo](../../../yo/docs/compression/RTK_COMPRESSION.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/compression/RTK_COMPRESSION.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/compression/RTK_COMPRESSION.md) --- RTK কম্প্রেশন হলো টার্মিনাল ও টুল আউটপুটের জন্য OmniRoute-এর কমান্ড-সচেতন কম্প্রেশন ইঞ্জিন। এটি এমন coding-agent সেশনের জন্য তৈরি, যেখানে কনটেক্সট বৃদ্ধির বেশিরভাগই আসে টেস্ট লগ, বিল্ড আউটপুট, প্যাকেজ ম্যানেজারের অপ্রয়োজনীয় আউটপুট, শেল ট্রান্সক্রিপ্ট, Docker আউটপুট, git আউটপুট এবং স্ট্যাক ট্রেস থেকে। RTK সরাসরি `defaultMode: "rtk"` দিয়ে অথবা একটি স্ট্যাকড পাইপলাইনের প্রথম ধাপ হিসেবে চলতে পারে, সাধারণত: ```txt rtk -> caveman ``` এই ক্রমটি প্রথমে কোলাহলপূর্ণ মেশিন আউটপুট কম্প্রেস করে, তারপর অবশিষ্ট গদ্যকে সংক্ষিপ্ত করার সুযোগ দেয় Caveman-কে। আপস্ট্রিম RTK অনুযায়ী কমান্ড আউটপুটে `60-90%` সাশ্রয় হয়। এর README-এর নমুনা সেশনে `~118,000` স্ট্যান্ডার্ড টোকেন কমে `~23,900` RTK টোকেন হয়েছে, অর্থাৎ `79.7%` সাশ্রয় (`~80%`)। Caveman ইনপুট কম্প্রেশনের সঙ্গে স্ট্যাকড সাশ্রয় গণনার জন্য OmniRoute আপস্ট্রিমের সেই গড় ব্যবহার করে: ```txt RTK-এর গড়: 80% সাশ্রয় Caveman ইনপুট: 46% সাশ্রয় স্ট্যাকড: 1 - (1 - 0.80) * (1 - 0.46) = 89.2% সাশ্রয় পরিসর: 1 - (1 - 0.60..0.90) * (1 - 0.46) = 78.4-94.6% ``` ## এটি কী কম্প্রেস করে বিল্ট-ইন ক্যাটালগে বর্তমানে এই বিভাগগুলোজুড়ে 49টি ফিল্টার অন্তর্ভুক্ত রয়েছে: | বিভাগ | উদাহরণ | | --------- | ------------------------------------------------------------- | | `git` | `git status`, `git branch`, `git diff`, `git log` | | `test` | Vitest, Jest, Pytest, Playwright, Go টেস্ট, Cargo টেস্ট | | `build` | TypeScript, ESLint, Biome, Prettier, Vite, Webpack, Turbo, Nx | | `package` | `npm install`, `npm audit`, `pip`, `uv sync`, Poetry, Bundler | | `shell` | `ls`, `find`, `grep`, সাধারণ শেল লগ | | `docker` | `docker ps`, Docker লগ | | `infra` | Terraform, OpenTofu, `systemctl status` | | `generic` | JSON আউটপুট, স্ট্যাক ট্রেস, সাধারণ আউটপুট ফলব্যাক | `open-sse/services/compression/engines/rtk/commandDetector.ts`-এর ডিটেক্টরটি ফিল্টার নির্বাচনের আগে আউটপুট শ্রেণিবদ্ধ করে। একটি কমান্ড শ্রেণি যথেষ্ট না হলে, ফিল্টারগুলো কমান্ড প্যাটার্ন বা আউটপুট regex দিয়েও মিল খুঁজতে পারে। ## ফিল্টার রেজোলিউশন RTK এই ক্রমে ফিল্টার লোড করে: 1. `.rtk/filters.toml` এবং `.rtk/filters.json` থেকে প্রজেক্ট ফিল্টার, শুধুমাত্র বিশ্বস্ত হলে। 2. `DATA_DIR/rtk/filters.toml` এবং `DATA_DIR/rtk/filters.json` থেকে গ্লোবাল ফিল্টার। 3. `open-sse/services/compression/engines/rtk/filters/` থেকে বিল্ট-ইন ফিল্টার। একই স্কোপের মধ্যে, RTK TOML schema v1 ফিল্টার OmniRoute JSON ফিল্টারের চেয়ে অগ্রাধিকার পায়। কমান্ড-টাইপ ম্যাচিংয়ের আগে TOML `match_command` এক্সপ্রেশন পরীক্ষা করা হয়, যাতে একটি ইমপোর্ট করা কমান্ড-নির্দিষ্ট ফিল্টার সেই স্কোপের আরও বিস্তৃত কোনো ফিল্টারকে ওভাররাইড করতে পারে। ফাইল ফরম্যাট নির্বিশেষে, প্রজেক্ট স্কোপ এখনও গ্লোবাল স্কোপের চেয়ে অগ্রাধিকার পায়। প্রজেক্ট ফিল্টারগুলো ইচ্ছাকৃতভাবে ট্রাস্ট-গেটেড, কারণ regex ফিল্টার এজেন্টদের কাছে টুল আউটপুট কীভাবে দেখানো হয় তা পরিবর্তন করতে পারে। নিচের যেকোনো একটি সত্য হলে একটি প্রজেক্ট ফিল্টার ফাইল গ্রহণ করা হয়: - `rtkConfig.trustProjectFilters` হলো `true`। - `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS=1` সেট করা আছে। - `.rtk/trust.json`-এ প্রজেক্ট ফিল্টার ফাইলের সঙ্গে মিলে যাওয়া SHA-256 হ্যাশ রয়েছে। ট্রাস্ট ফাইলের উদাহরণ: ```json { "filtersSha256": "0123456789abcdef...", "filtersTomlSha256": "fedcba9876543210..." } ``` হ্যাশগুলো আলাদা: `filtersSha256` `.rtk/filters.json`-কে বিশ্বস্ত হিসেবে চিহ্নিত করে, আর `filtersTomlSha256` `.rtk/filters.toml`-কে বিশ্বস্ত হিসেবে চিহ্নিত করে। যেকোনো একটি ফাইল সম্পাদনা করলে শুধুমাত্র সেটির নিজস্ব ট্রাস্ট এন্ট্রি বাতিল হয়। গ্লোবাল ফাইলগুলো অ্যাডমিনিস্ট্রেটর দ্বারা ইনস্টল করা হয় এবং বিদ্যমান গ্লোবাল-ফিল্টার ট্রাস্ট আচরণ ব্যবহার করে। কাস্টম ফিল্টার একটি ফিল্টার অবজেক্ট অথবা ফিল্টার অবজেক্টের একটি অ্যারে হতে পারে। অবৈধ কাস্টম ফিল্টারগুলো বাদ দেওয়া হয় এবং `/api/context/rtk/filters` ডায়াগনস্টিকসে রিপোর্ট করা হয়। অবৈধ বিল্ট-ইন ফিল্টার অবিলম্বে ব্যর্থ হয়। ## RTK TOML schema v1 সামঞ্জস্যতা OmniRoute, RTK TOML schema v1 ব্যবহার করে ঘোষণামূলক ফিল্টার ফাইল পার্স, যাচাই, পরীক্ষা এবং ইনস্টল করতে পারে। সমর্থিত ফিল্ডগুলো হলো `description`, `match_command`, `strip_ansi`, `filter_stderr`, `strip_lines_matching`, `keep_lines_matching`, `replace`, `match_output`, `truncate_lines_at`, `head_lines`, `tail_lines`, `max_lines`, `on_empty`, এবং `[[tests.]]` ইনলাইন পরীক্ষা। অজানা ফিল্ড, অবৈধ বা অনিরাপদ রেগুলার এক্সপ্রেশন, একই সঙ্গে ব্যবহৃত strip/keep নিয়ম, 1 MiB-এর বেশি আকারের ফাইল এবং অজানা ফিল্টারের রেফারেন্স প্রত্যাখ্যান করা হয়। কোনো ফাইলের ইনলাইন পরীক্ষা ব্যর্থ হলে সেটি পরিদর্শনের জন্য যাচাই করা যেতে পারে, তবে ইনস্টল বা লোড করা যায় না। কাস্টম ফাইল লোড করতে ব্যর্থ হলেও fail-open আচরণ বজায় থাকে: অবৈধ ফাইলটি এড়িয়ে যাওয়া হয় এবং বাকি ফিল্টারগুলো কাজ করতে থাকে। ক্লায়েন্ট টুলের আউটপুট ইতিমধ্যেই ক্যাপচার করার পর OmniRoute সেটি গ্রহণ করে, তাই `filter_stderr = true` প্রসেস ক্যাপচার পরিবর্তন করতে পারে না। ফিল্ডটি no-op হিসেবে গ্রহণ করা হয় এবং যাচাইকরণ একটি সতর্কতা প্রদান করে। এটিকে ইচ্ছাকৃতভাবে **RTK TOML schema v1 সামঞ্জস্যতা** হিসেবে বর্ণনা করা হয়েছে, RTK executable, shell hooks, Rust command implementations বা এর trust-store layout-এর সঙ্গে পূর্ণ সামঞ্জস্যতা হিসেবে নয়। ড্যাশবোর্ডের উন্নত RTK ভিউতে পেস্ট বা আপলোড করা TOML গ্রহণ করা হয়। যাচাইকরণ শুধুমাত্র পঠনযোগ্য। ইনস্টলেশনের সময় সীমিত অনুমতিসহ `DATA_DIR/rtk/filters.toml` পরমাণবিকভাবে লেখা হয় এবং পুনরায় চালু না করেই সক্রিয় ফিল্টার ক্যাটালগ রিফ্রেশ করা হয়। বিদ্যমান ফাইল প্রতিস্থাপন করতে স্পষ্ট `overwrite` নিশ্চিতকরণ প্রয়োজন এবং প্রথমে `DATA_DIR/rtk/filters.toml.bak` তৈরি করা হয়। ## ফিল্টার DSL ফিল্টারগুলো [Compression Rules Format](./COMPRESSION_RULES_FORMAT.md)-এ বর্ণিত JSON schema ব্যবহার করে। রানটাইম নিম্নলিখিত ধাপগুলো ক্রমানুসারে প্রয়োগ করে: ```txt stripAnsi -> filterStderr -> replace -> matchOutput -> লাইন বাদ দেওয়া/অন্তর্ভুক্ত করা -> truncateLineAt -> head/tail/maxLines -> onEmpty ``` গুরুত্বপূর্ণ ফিল্ড: | ফিল্ড | উদ্দেশ্য | | ---------------------------- | ----------------------------------------------------------------------- | | `rules.stripAnsi` | মিল নির্ধারণের আগে টার্মিনালের রং/নিয়ন্ত্রণ সিকোয়েন্স সরানো | | `rules.filterStderr` | মিল নির্ধারণ/ফিল্টার করার আগে প্রচলিত stderr প্রিফিক্স স্বাভাবিক করা | | `rules.replace` | ক্রমানুসারে regex প্রতিস্থাপন প্রয়োগ করা | | `rules.matchOutput` | আউটপুট কোনো পরিচিত শর্তের সঙ্গে মিললে একটি সংক্ষিপ্ত সারাংশ ফেরত দেওয়া | | `rules.matchOutput[].unless` | কোনো error/failure প্যাটার্ন থাকলে শর্টকাটটি এড়িয়ে যাওয়া | | `rules.dropPatterns` | অপ্রয়োজনীয় কোলাহলপূর্ণ লাইন সরানো | | `rules.includePatterns` | কার্যকর পদক্ষেপ নেওয়া যায় এমন লাইনকে অগ্রাধিকার দেওয়া | | `rules.collapsePatterns` | বারবার মিলে যাওয়া লাইনগুলো সংকুচিত করা | | `rules.deduplicate` | প্রতি-ফিল্টার opt-in: পরপর থাকা একই লাইন সংকুচিত করা | | `rules.truncateLineAt` | Unicode-নিরাপদভাবে প্রতিটি লাইন ছাঁটাই করা | | `rules.onEmpty` | সব লাইন ফিল্টার হয়ে গেলে বিকল্প বার্তা | | `tests[]` | verify gate-এ ব্যবহৃত ইনলাইন নমুনা | বিল্ট-ইন ফিল্টারগুলোতে ইনলাইন `tests[]` নমুনা থাকা প্রত্যাশিত। কাস্টম ফিল্টারগুলোতেও সেগুলো অন্তর্ভুক্ত করা উচিত, বিশেষ করে যখন সেগুলো একাধিক প্রজেক্টে শেয়ার করা হয়। ## লাইন ডিডুপ্লিকেশন (দুই স্তর) RTK দুটি স্বতন্ত্র স্তরে ডুপ্লিকেট লাইন সংকুচিত করে: 1. **প্রতি-ফিল্টার `deduplicate` (অপ্ট-ইন, ডিফল্ট `false`)।** কোনো ফিল্টার `rules.deduplicate: true` সেট করে ট্রাঙ্কেশনের আগে _সেই ফিল্টারের মিলে যাওয়া আউটপুটের মধ্যে_ পরপর থাকা ডুপ্লিকেট লাইন সংকুচিত করতে পারে। এটি `lineFilter.ts`-এর মধ্যে চলে। লিগ্যাসি ফিল্টারের ক্ষেত্রে, ফিল্টারটি `collapsePatterns` নির্ধারণ করলে এটি স্বয়ংক্রিয়ভাবে সক্রিয় হয়। স্কিমা: `open-sse/services/compression/engines/rtk/filterSchema.ts`-এ `deduplicate: z.boolean().default(false)`। 2. **ইঞ্জিনব্যাপী `deduplicateThreshold` (ডিফল্ট `3`)।** সব ফিল্টার চলার পর, ইঞ্জিনটি সম্পূর্ণ ফলাফলজুড়ে পরপর থাকা একই লাইনের `>= deduplicateThreshold` দৈর্ঘ্যের যেকোনো ধারাকে সংকুচিত করে (`deduplicateRepeatedLines`, যা `engines/rtk/index.ts`-এ প্রয়োগ করা হয়)। নর্মালাইজেশনের সময় মানটি 2–100-এর মধ্যে সীমাবদ্ধ রাখা হয়। প্রতি-ফিল্টার পাসটি প্রথমে (ফিল্টারের মধ্যে) চলে, আর ইঞ্জিনব্যাপী পাসটি শেষে (সংযুক্ত আউটপুটের ওপর) চলে, ফলে দুটিকে একত্রে প্রয়োগ করলেও দ্বিগুণ গণনা হয় না। ## লাইন গ্রুপিং (`enableGrouping`) `rtkConfig.enableGrouping` যখন `true` হয় (ডিফল্ট `false`), তখন RTK ডিডুপ্লিকেশন-পরবর্তী ফলাফলের ওপর একটি অতিরিক্ত `groupSimilarLines` পাস চালায়, যা পরপর থাকা _প্রায়-সমতুল্য_ (বাইট-অভিন্ন নয়) লাইনগুলোর ধারাকে সংকুচিত করে। `rtkConfig.groupingThreshold` (ডিফল্ট `3`) হলো গ্রুপিং সক্রিয় করার জন্য প্রয়োজনীয় ন্যূনতম ধারার দৈর্ঘ্য। এটি `deduplicateThreshold`-এর কাঠামোগত প্রতিরূপ: ডিডুপ্লিকেশন হুবহু পুনরাবৃত্তি সামলায়, আর গ্রুপিং সামলায় "সামান্য পার্থক্যসহ একই আকৃতি"। উভয় ফ্ল্যাগই `key_value` টেবিলে সংরক্ষিত `rtkConfig` JSON-এর অংশ (উপরের কনফিগারেশন দেখুন), তাই রিস্টার্টের পরও সেটিংটি বজায় থাকে। ## কোড কমেন্ট অপসারণ (`stripCodeComments` / `preserveDocstrings`) `rtkConfig.applyToCodeBlocks` সক্রিয় থাকলে, RTK ফেন্সড কোড ব্লক থেকেও কমেন্ট অপসারণ করতে পারে: - `stripCodeComments` (ডিফল্ট `false`) — অপ্ট-ইন। `true` হলে, RTK JavaScript এবং TypeScript ফেন্সড ব্লক থেকে কমেন্ট সরিয়ে দেয়। ঐতিহাসিকভাবে ফ্ল্যাগটি পড়া হলেও কখনো প্রয়োগ করা হয়নি, তাই প্রোডাকশনে নীরব পরিবর্তন এড়াতে ডিফল্টটি "সংরক্ষণ" রাখা হয়েছে। - `preserveDocstrings` (ডিফল্ট `true`) — কমেন্ট অপসারণের সময় JSDoc/`/** … */` ব্লক কমেন্ট রাখা হয় (এগুলো যে পরিমাণ বাইট ব্যয় করে, তার চেয়ে বেশি মূল্যবান API ডকুমেন্টেশন বহন করে)। এগুলোও অপসারণ করতে `false` সেট করুন। কমেন্ট অপসারণ `open-sse/services/compression/engines/rtk/codeStripper.ts`-এ বাস্তবায়িত হয়েছে। এটি **TypeScript parser** ব্যবহার করে (regex নয়), যাতে string, template এবং regex literal-কে কখনোই ভুল করে কমেন্ট হিসেবে ধরা না হয়; আর JSX শনাক্ত হলে এটি সম্পূর্ণভাবে প্রক্রিয়া থেকে সরে আসে (যাতে JSX expression-container কমেন্ট কখনো বিকৃত না হয়)। বর্তমানে কমেন্ট অপসারণ শুধু **JavaScript এবং TypeScript**-এ প্রযোজ্য—স্ট্রিপারের `CodeLanguage` সেটের অন্যান্য ভাষায় (Python, Rust, Go, Ruby, Java) খালি লাইন ও হোয়াইটস্পেস সংকোচন রয়েছে, কিন্তু কমেন্ট অপসারণ নেই। স্ট্রিপ করা ব্লকের রানটি `rulesApplied`-এ `rtk:code-strip` ট্যাগ পায়। > **দ্রষ্টব্য—GCF / ট্যাবুলার এনকোডিং একটি পৃথক ইঞ্জিন।** RTK-তে "GCF" > (Graph Compact Format) ট্যাবুলার/কলামভিত্তিক JSON এনকোডার নেই। ওই এনকোডারটি—যা পুরোনো > `omni-tabular` এনকোডারকে প্রতিস্থাপন করেছে—**headroom** ইঞ্জিনে থাকে > (`open-sse/services/compression/engines/headroom/`, আর ভেন্ডরকৃত কোডেকটি রয়েছে > `headroom/gcf/`-এর অধীনে)। এখানে নথিভুক্ত RTK ফিল্টার পাইপলাইনের সঙ্গে এটির কোনো সম্পর্ক নেই। ## কনফিগারেশন গ্লোবাল সেটিংস `/api/settings/compression`-এর মাধ্যমে পাওয়া যায়। RTK-নির্দিষ্ট সেটিংসও `/api/context/rtk/config`-এর মাধ্যমে পাওয়া যায়। ```json { "defaultMode": "stacked", "autoTriggerMode": "stacked", "autoTriggerTokens": 32000, "stackedPipeline": [ { "engine": "rtk", "intensity": "standard" }, { "engine": "caveman", "intensity": "full" } ], "rtkConfig": { "enabled": true, "intensity": "standard", "applyToToolResults": true, "applyToCodeBlocks": false, "applyToAssistantMessages": false, "enabledFilters": [], "disabledFilters": [], "maxLinesPerResult": 120, "maxCharsPerResult": 12000, "deduplicateThreshold": 3, "customFiltersEnabled": true, "trustProjectFilters": false, "rawOutputRetention": "never", "rawOutputMaxBytes": 1048576, "enableGrouping": false, "groupingThreshold": 3, "stripCodeComments": false, "preserveDocstrings": true } } ``` `enabledFilters` এবং `disabledFilters` ফিল্টার আইডি ব্যবহার করে, যেমন `test-vitest` বা `git-diff`। সম্পূর্ণ `rtkConfig` কাঠামোটি `open-sse/services/compression/types.ts`-এ `RtkConfig` / `DEFAULT_RTK_CONFIG` দ্বারা সংজ্ঞায়িত। পুরো অবজেক্টটি SQLite-এর `key_value` টেবিলে `namespace = "compression"`, `key = "rtkConfig"`-এর অধীনে একটি একক JSON মান হিসেবে সংরক্ষিত হয় (`src/lib/db/compression.ts`) এবং পড়ার সময় `normalizeRtkConfig` দ্বারা স্বাভাবিকীকৃত হয়। তাই নিচের প্রতিটি ফিল্ড — `enableGrouping`, `groupingThreshold`, `stripCodeComments` এবং `preserveDocstrings`-সহ — একই স্টোরের মধ্য দিয়ে রাউন্ড-ট্রিপ করে এবং রিস্টার্টের পরও অক্ষুণ্ণ থাকে। | কী | ডিফল্ট | উদ্দেশ্য | | ---------------------- | ------- | ------------------------------------------------------------------------------------ | | `deduplicateThreshold` | `3` | সমগ্র ইঞ্জিনে: সংকুচিত করার জন্য ন্যূনতম ধারাবাহিক অভিন্ন লাইনের সংখ্যা (সীমা 2–100) | | `enableGrouping` | `false` | ঐচ্ছিক: প্রায়-সমতুল্য ধারাবাহিক লাইনের ক্রম সংকুচিত করা | | `groupingThreshold` | `3` | গ্রুপিং সক্রিয় করার জন্য ন্যূনতম ধারাবাহিক সদৃশ লাইনের সংখ্যা | | `stripCodeComments` | `false` | ঐচ্ছিক: ফেন্সড কোড ব্লক থেকে মন্তব্য সরানো (`applyToCodeBlocks` প্রয়োজন) | | `preserveDocstrings` | `true` | মন্তব্য সরানোর সময় JSDoc/`/** … */` ব্লক অক্ষুণ্ণ রাখা | ## API | রুট | মেথড | উদ্দেশ্য | | ---------------------------------- | ---- | --------------------------------------------------- | | `/api/context/rtk/config` | GET | RTK কনফিগ পড়া | | `/api/context/rtk/config` | PUT | RTK কনফিগ আপডেট করা | | `/api/context/rtk/filters` | GET | ফিল্টার ক্যাটালগ ও লোড ডায়াগনস্টিকের তালিকা দেখানো | | `/api/context/rtk/import` | POST | RTK TOML schema v1 ফাইল যাচাই বা ইনস্টল করা | | `/api/context/rtk/test` | POST | একটি টেক্সট পেলোডের জন্য RTK কম্প্রেশনের প্রিভিউ | | `/api/context/rtk/raw-output/[id]` | GET | সংরক্ষিত ও সংবেদনশীল তথ্য অপসারিত কাঁচা আউটপুট পড়া | | `/api/compression/preview` | POST | যেকোনো কম্প্রেশন মোডের প্রিভিউ | RTK টেস্ট পেলোড: ```json { "command": "npm test", "text": "FAIL tests/example.test.ts\nAssertionError: expected true\nTest Files 1 failed", "config": { "intensity": "standard" } } ``` কম্প্রেশন প্রিভিউ পেলোড: ```json { "mode": "stacked", "messages": [ { "role": "tool", "content": "FAIL tests/example.test.ts\nAssertionError: expected true\nTest Files 1 failed" } ], "config": { "rtkConfig": { "rawOutputRetention": "failures" } } } ``` ম্যানেজমেন্ট রুটগুলোর জন্য ড্যাশবোর্ড ম্যানেজমেন্ট অথ বা সংশ্লিষ্ট API-key পলিসি প্রয়োজন। RTK TOML যাচাইকরণ পেলোড: ```json { "action": "validate", "content": "schema_version = 1\n\n[filters.my-tool]\nmatch_command = \"^my-tool\\\\b\"\nmax_lines = 20\n" } ``` যাচাইকৃত ফাইলটি গ্লোবালি ইনস্টল করতে `"action": "install"` ব্যবহার করুন। বিদ্যমান কোনো গ্লোবাল ফাইল প্রতিস্থাপন পর্যালোচনা ও নিশ্চিত করার পরই কেবল `"overwrite": true` যোগ করুন। ## অপরিশোধিত আউটপুট পুনরুদ্ধার RTK সাধারণত কেবল সংকুচিত টেক্সট ফেরত দেয়। ডিবাগিংয়ের জন্য, `rawOutputRetention` সংশোধিত অপরিশোধিত আউটপুট সংরক্ষণ করতে পারে: | মান | আচরণ | | ---------- | -------------------------------------------------------------- | | `never` | অপরিশোধিত আউটপুট সংরক্ষণ করবেন না | | `failures` | কেবল সম্ভাব্য ব্যর্থতার আউটপুট সংরক্ষণ করুন | | `always` | সংশোধনের পরে প্রতিটি সংকুচিত RTK অপরিশোধিত আউটপুট সংরক্ষণ করুন | সংরক্ষিত ফাইলগুলো এখানে লেখা হয়: ```txt DATA_DIR/rtk/raw-output/ ``` স্থায়ীভাবে সংরক্ষণের আগে গোপন তথ্য সংশোধন করা হয়, যার মধ্যে রয়েছে প্রচলিত bearer token, API key, Slack token, AWS access key এবং assignment-ধাঁচের `token=...`, `secret=...`, `password=...` মান। অ্যানালিটিক্স কেবল pointer id, size এবং hash metadata সংরক্ষণ করে। ## যাচাইকরণ গেট কেন্দ্রীভূত যাচাইকরণ গেট বাহ্যিক কমান্ড shell-এর মাধ্যমে না চালিয়ে বিল্ট-ইন inline filter test চালায়: ```bash node --import tsx/esm --test tests/unit/compression/rtk-verify.test.ts ``` আরও বিস্তৃত RTK গেট হলো: ```bash node --import tsx/esm --test \ tests/unit/compression/rtk-*.test.ts \ tests/unit/compression/pipeline-integration.test.ts \ tests/unit/compression/context-compression-api.test.ts ``` রিলিজের আগে বিস্তৃত compression গেট চালান: ```bash node --import tsx/esm --test \ tests/unit/compression/*.test.ts \ tests/golden-set/*.test.ts \ tests/integration/compression-pipeline.test.ts \ tests/unit/api/compression/compression-api.test.ts ``` ## RTK সম্প্রসারণ 1. একটি filter JSON file যোগ বা আপডেট করুন। 2. গুরুত্বপূর্ণ আচরণটি প্রমাণ করে এমন অন্তত একটি `tests[]` নমুনা অন্তর্ভুক্ত করুন। 3. নতুন command family-এর জন্য `tests/unit/compression/fixtures/rtk/`-এর অধীনে একটি fixture যোগ করুন। 4. নতুন output class প্রবর্তনের সময় command detection coverage যোগ করুন। 5. যাচাইকরণ এবং বিস্তৃত RTK গেটগুলো চালান। 6. filter-টি project-local হলে, পর্যালোচনার পরেই `.rtk/filters.json` commit করুন এবং `.rtk/trust.json` refresh করুন। --- ## তীব্রতার মাত্রা (v3.8.16+) RTK **৩টি তীব্রতার মাত্রা** সমর্থন করে, যেগুলো **compression aggressiveness** এবং **নিরাপত্তা**-র মধ্যে ভারসাম্য নির্ধারণ করে। engine config-এ `config.intensity`-এর মাধ্যমে মাত্রাটি সেট করা হয়। ### ৩টি মাত্রা | মাত্রা | ছাঁটাইয়ের সীমা | Token সাশ্রয় | ঝুঁকি | যার জন্য সর্বোত্তম | | -------------------- | ------------------------- | ------------- | ------ | ---------------------------------- | | `minimal` | প্রতি section-এ ২৪টি line | ~20-40% | খুব কম | গুরুত্বপূর্ণ context-সহ production | | `standard` (default) | প্রতি section-এ ২৪টি line | ~50-70% | কম | দৈনন্দিন coding session | | `aggressive` | প্রতি section-এ ১৬টি line | ~70-90% | মাঝারি | দীর্ঘ session, সর্বাধিক সাশ্রয় | ### কোথায় ছাঁটাই ঘটে ছাঁটাইয়ের সীমা `lineFilter.ts`-কে প্রভাবিত করে: ```ts // open-sse/services/compression/engines/rtk/index.ts:329-330 থেকে config.intensity === "aggressive" ? 16 : 24, config.intensity === "aggressive" ? 16 : 24, ``` প্রতিটি section-এর **শুরু** এবং **শেষ**—উভয়ই সংরক্ষিত থাকে; ছাঁটাই কার্যকর হলে মাঝের content বাদ দেওয়া হয়। ### কী থাকে বনাম কী বাদ যায় | Content | minimal | standard | aggressive | | ------------------------- | ----------- | ------------- | ------------- | | Error / stack trace | ✅ সংরক্ষিত | ✅ সংরক্ষিত | ✅ সংরক্ষিত | | Test failure | ✅ সংরক্ষিত | ✅ সংরক্ষিত | ✅ সংরক্ষিত | | Build error | ✅ সংরক্ষিত | ✅ সংরক্ষিত | ✅ সংরক্ষিত | | Test pass (বিস্তারিত) | ✅ সংরক্ষিত | 🟡 সংকুচিত | 🟡 সংকুচিত | | নিয়মিত output (info log) | 🟡 সংকুচিত | 🟡 সংকুচিত | ❌ বাদ দেওয়া | | Progress bar | 🟡 সংকুচিত | ❌ বাদ দেওয়া | ❌ বাদ দেওয়া | | Banner / ASCII art | 🟡 সংকুচিত | ❌ বাদ দেওয়া | ❌ বাদ দেওয়া | ### সঠিক তীব্রতা নির্বাচন ``` context হারানো কি বিপর্যয়কর? │ ┌───────────┼───────────┐ │ │ │ হ্যাঁ না নিশ্চিত নন │ │ │ ▼ │ │ minimal │ │ │ │ │ │ ▼ ▼ │ throughput কতটা প্রথমে `standard` চেষ্টা করুন │ গুরুত্বপূর্ণ? (৮০% ক্ষেত্রে │ │ কার্যকর) │ ┌────┴────┐ │ │ │ │ কম বেশি │ │ │ │ ▼ ▼ │ standard aggressive │ │ │ └──────┴─────────┘ ``` ### তীব্রতা কনফিগার করা **প্রতি-combo** (combo config-এ): ```json { "combo": "my-coding-combo", "routing": {/* ... */}, "compression": { "engine": "rtk", "intensity": "aggressive" } } ``` **প্রোগ্রামগতভাবে**: `rtkEngine` (`@omniroute/open-sse/services/compression/engines/rtk`) একটি `CompressionEngine` এবং এতে কোনো `updateConfig` method নেই। পরিবর্তে registry helper-এর মাধ্যমে একটি engine-এর config আপডেট করুন: ```ts import { updateEngineConfig } from "@omniroute/open-sse/services/compression/engines/registry"; updateEngineConfig("rtk", { intensity: "aggressive" }); ``` ### প্রভাব যাচাই করা আপনার নির্বাচিত তীব্রতায় filter-টি নিরাপদ কিনা নিশ্চিত করতে **যাচাইকরণ গেট** (নিচে দেখুন) ব্যবহার করুন: ```ts import { runRtkFilterTests } from "omniroute/compression/engines/rtk/verify"; const result = runRtkFilterTests({ intensity: "aggressive" }); if (!result.passed) { console.error("Filters failed at aggressive intensity"); } ``` --- ## কাস্টম ফিল্টার ডেভেলপমেন্ট (v3.8.16+) `engines/rtk/filters/` ডিরেক্টরিতে **49+টি বিল্ট-ইন ফিল্টার JSON ফাইল** রয়েছে। ডিফল্টগুলোর আওতায় না থাকা কাস্টম টুলের আউটপুট সংকুচিত করতে আপনি নিজের ফিল্টার যোগ করতে পারেন। ### ফিল্টার স্কিমা (Zod) ```ts { "id": "string", // আবশ্যক। ফিল্টার শনাক্তকারী (kebab-case, যেমন, "python-traceback") "label": "string", // আবশ্যক। মানুষের পাঠযোগ্য ফিল্টারের নাম "description": "string", // ঐচ্ছিক (ডিফল্ট: "")। ফিল্টারটি কী করে তার সংক্ষিপ্ত বিবরণ "category": "git|test|build|shell|docker|package|infra|cloud|generic", "priority": number, // ঐচ্ছিক (0-100, ডিফল্ট: 50)। কার্যকর করার ক্রম (বেশি = আগে) "match": { "commands": ["string"], // মিল খোঁজার জন্য কমান্ডের নাম (যেমন, "python", "pytest") "patterns": ["string"], // আউটপুটের সঙ্গে মেলানোর জন্য Regex প্যাটার্ন "outputTypes": ["string"] // শনাক্ত করা আউটপুট শ্রেণি (যেমন, "test-failure") }, "rules": { "stripAnsi": boolean, // ঐচ্ছিক (ডিফল্ট: false)। ANSI রঙের কোড অপসারণ করে "replace": [ // খোঁজা-ও-প্রতিস্থাপন করার নিয়ম (ডিফল্ট: []) { "pattern": "regex", "replacement": "..." } ], "matchOutput": [ // প্যাটার্ন মিলে গেলে সংক্ষিপ্ত পথে সমাপ্ত হয় (ডিফল্ট: []) { "pattern": "regex", "message": "short summary", "unless": "regex" // এই প্যাটার্ন মিললে এড়িয়ে যায় } ], "includePatterns": ["string"], // যেসব লাইন রাখা হবে (Regex প্যাটার্ন, ডিফল্ট: []) "dropPatterns": ["string"], // যেসব লাইন বাদ দেওয়া হবে (Regex প্যাটার্ন, ডিফল্ট: []) "collapsePatterns": ["string"], // যেসব লাইন সংকুচিত করে একটি ঘটনায় নামিয়ে আনা হবে (ডিফল্ট: []) "deduplicate": boolean, // ঐচ্ছিক (ডিফল্ট: false)। সদৃশ লাইন অপসারণ করে "truncateLineAt": number, // ঐচ্ছিক (ডিফল্ট: 0)। লাইনগুলোকে সর্বোচ্চ অক্ষরসংখ্যায় ছেঁটে দেয় "maxLines": number, // ঐচ্ছিক (ডিফল্ট: 0)। মোট লাইনের কঠোর সর্বোচ্চ সীমা "headLines": number, // ঐচ্ছিক (ডিফল্ট: 20)। মিলে যাওয়া আউটপুটের প্রথম Nটি লাইন রাখে "tailLines": number, // ঐচ্ছিক (ডিফল্ট: 20)। মিলে যাওয়া আউটপুটের শেষ Nটি লাইন রাখে "onEmpty": "string", // ঐচ্ছিক (ডিফল্ট: "")। সব লাইন ফিল্টার হয়ে গেলে ফলব্যাক বার্তা "filterStderr": boolean // ঐচ্ছিক (ডিফল্ট: false)। stderr আউটপুটও ফিল্টার করে }, "preserve": { "errorPatterns": ["string"], // যেসব প্যাটার্ন অবশ্যই সবসময় সংরক্ষিত থাকবে (ডিফল্ট: []) "summaryPatterns": ["string"] // চূড়ান্ত সারাংশ লাইনের প্যাটার্ন (ডিফল্ট: []) }, "tests": [ // যাচাইয়ের জন্য ইনলাইন পরীক্ষা (ডিফল্ট: []) { "name": "string", // আবশ্যক। পরীক্ষার নাম "input": "sample output", // আবশ্যক। নমুনা ইনপুট টেক্সট "expected": "expected output", // আবশ্যক। প্রত্যাশিত সংকুচিত আউটপুট "command": "optional command" // ঐচ্ছিক। কমান্ডের প্রসঙ্গ } ] } ``` ### উদাহরণ: Python ট্রেসব্যাক ফিল্টার ```json { "id": "python-traceback", "label": "Python Traceback Filter", "description": "Compresses Python tracebacks to essential file/line locations and error type", "category": "test", "priority": 60, "match": { "commands": ["python", "python3", "pytest", "uv", "poetry"], "patterns": ["Traceback \\(most recent call last\\)", "Error", "Exception"], "outputTypes": ["error-traceback"] }, "rules": { "stripAnsi": true, "includePatterns": [ "Traceback \\(most recent call last\\)", "^\\s*File \".+\", line \\d+", "^\\s*[A-Z][a-zA-Z]+Error:", "^\\s*[A-Z][a-zA-Z]+Exception" ], "dropPatterns": ["site-packages/", "^\\s+[a-z_]+\\([^)]*\\)$"], "headLines": 5, "tailLines": 3, "maxLines": 25, "filterStderr": true }, "preserve": { "errorPatterns": ["Error:", "Exception:", "Traceback"], "summaryPatterns": ["^[A-Z][a-zA-Z]+(?:Error|Exception):"] }, "tests": [ { "name": "preserves-error-type-and-location", "input": "Traceback (most recent call last):\n File \"app.py\", line 42, in main\n do_thing()\n File \"lib/utils.py\", line 17, in helper\n return 1 / 0\nZeroDivisionError: division by zero", "expected": "Traceback (most recent call last):\n File \"app.py\", line 42, in main\n File \"lib/utils.py\", line 17, in helper\nZeroDivisionError: division by zero", "command": "python app.py" } ] } ``` ### কাস্টম ফিল্টার লোড করা ফাইলটি একটি স্বীকৃত অবস্থানে রাখুন: ``` ~/.omniroute/rtk/filters/my-filter.json # ব্যবহারকারী-স্তরের /.rtk/filters/my-filter.json # প্রকল্প-স্তরের ``` স্টার্টআপের সময় `open-sse/services/compression/engines/rtk/filterLoader.ts`-এর `loadRtkFilters()`-এর মাধ্যমে ফিল্টারগুলো স্বয়ংক্রিয়ভাবে লোড হয়। লোডারটি নিম্নলিখিত স্থান থেকে ফিল্টার খুঁজে বের করে: - বিল্ট-ইন ক্যাটালগ: `open-sse/services/compression/engines/rtk/filters/` - ব্যবহারকারী ডিরেক্টরি: `~/.omniroute/rtk/filters/` - প্রকল্প ডিরেক্টরি: `/.rtk/filters/` প্রোগ্রাম্যাটিকভাবে ফিল্টার লোড করতে: ```ts import { loadRtkFilters } from "@omniroute/open-sse/services/compression/engines/rtk/filterLoader"; // অপশন: customFiltersEnabled (ব্যবহারকারী/প্রকল্পের ফিল্টার লোড করে, ডিফল্টভাবে চালু), // trustProjectFilters, refresh। const filters = loadRtkFilters({ customFiltersEnabled: true }); ``` ### যাচাইকরণ লোড করার সময় Zod স্কিমার বিপরীতে ফিল্টারগুলো যাচাই করা হয়। ত্রুটিপূর্ণ কাঠামোর কোনো ফিল্টার লোড হতে ব্যর্থ হবে এবং একটি ত্রুটি লগ করবে: ``` RTK_FILTER_LOADER: filter "my-filter" failed validation: - rules.replace.0.pattern: Invalid regex - match.commands: must not be empty ``` ইনস্টল করা সব ফিল্টার যাচাই করতে, `runRtkFilterTests()` কল করুন, যা `open-sse/services/compression/engines/rtk/verify.ts` থেকে এক্সপোর্ট করা হয়েছে। ### সর্বোত্তম অনুশীলন 1. **সবসময় `tests[]` অন্তর্ভুক্ত করুন** — এগুলো প্রমাণ করে যে আপনার ফিল্টার কাজ করে এবং রিগ্রেশন প্রতিরোধ করে 2. **শর্ট-সার্কিটের জন্য `matchOutput` ব্যবহার করুন** — যদি একটি লাইনেই পুরো বিষয়টি বোঝানো যায়, তাহলে সম্পূর্ণ ব্লকটি প্রতিস্থাপন করুন 3. **`strip`-এর বদলে `keep`-কে অগ্রাধিকার দিন** — স্পষ্ট “সবসময় সংরক্ষণ করুন” নিয়মগুলো “সবসময় সরিয়ে ফেলুন” নিয়মগুলোর চেয়ে নিরাপদ 4. **৩টি ইনটেনসিটি লেভেলেই পরীক্ষা করুন** — `minimal`-এ কোনো পরিবর্তন হওয়া উচিত নয়, আর `aggressive`-এও ত্রুটিগুলো সংরক্ষিত থাকা উচিত 5. **`unless` ফিল্ডটি ব্যবহার করুন** — “X উপস্থিত থাকলে ট্রিগার করবেন না” শর্ত দিয়ে শর্ট-সার্কিটগুলো সুরক্ষিত করুন --- ## মূল আউটপুট পুনরুদ্ধার ও যাচাইকরণ গেট RTK যখন আউটপুট আক্রমণাত্মকভাবে সংকুচিত করে, তখন ডিবাগিং, অডিট বা রিপ্লের জন্য আপনি **মূল টেক্সট পুনরুদ্ধার** করতে পারেন। ### মূল আউটপুট পুনরুদ্ধার যেভাবে কাজ করে ``` মূল আউটপুট (10K টোকেন) │ ▼ RTK সংকোচন (rawOutput.enabled=true সহ) │ ├─▶ সংকুচিত আউটপুট (2K টোকেন) ──▶ LLM-এ │ └─▶ মূল আউটপুট (10K টোকেন) ──▶ DB-তে সংরক্ষিত (request_id দ্বারা সংযুক্ত) ``` ### মূল আউটপুট সংরক্ষণ সক্রিয় করা **প্রতি অনুরোধে** (কম্বো কনফিগে): ```json { "compression": { "engine": "rtk", "intensity": "aggressive", "rawOutput": { "enabled": true, "maxBytes": 1048576 // 1MB সীমা } } } ``` **ডিফল্ট**: `rawOutput.enabled: false` (স্টোরেজ সাশ্রয় করে)। ### স্টোরেজ খরচ | প্রতি অনুরোধে | 1MB সীমা | 10MB সীমা | | ----------------------- | ------------ | ------------- | | গড় সংকুচিত আউটপুট | ~5KB | ~5KB | | সংরক্ষিত মূল আউটপুট | ~50-500KB | ~500KB-5MB | | প্রতিদিন 1000টি অনুরোধে | 50-500MB/দিন | 500MB-5GB/দিন | > **সুপারিশ**: মূল আউটপুট সবসময় সক্রিয় না রেখে, শুধু **ডিবাগিং সেশন** বা **নমুনাভিত্তিক অডিটিংয়ের** জন্য সক্রিয় করুন। ### মূল আউটপুট পুনরুদ্ধার করা ```ts import { readRtkRawOutput } from "omniroute/compression/engines/rtk/rawOutput"; const raw = readRtkRawOutput(pointerId); // compression stats থেকে pointerId if (raw) { console.log("Original output:", raw); } ``` সংকোচনের পরে `pointerId`, `CompressionStats.rtkRawOutputPointers[]`-এ ফেরত দেওয়া হয়। ফাংশনের সিগনেচারের জন্য `open-sse/services/compression/engines/rtk/rawOutput.ts:102` দেখুন। ### যাচাইকরণ গেট **RTK ফিল্টার যাচাইকরণ** (`open-sse/services/compression/engines/rtk/verify.ts`) সব ফিল্টারকে তাদের `tests[]`-এর বিপরীতে যাচাই করে এবং তীব্রতার তিনটি স্তরেই আচরণ সঠিক আছে কি না নিশ্চিত করে। যাচাইকরণ চালাতে **`runRtkFilterTests()` কল করুন**: ```ts import { runRtkFilterTests } from "open-sse/services/compression/engines/rtk/verify"; const result = runRtkFilterTests(); console.log(`Passed: ${result.outcomes.filter((o) => o.passed).length}`); console.log(`Failed: ${result.outcomes.filter((o) => !o.passed).length}`); if (!result.passed) { console.error("Filters failed verification"); result.outcomes .filter((o) => !o.passed) .forEach((o) => { console.error( ` - ${o.filterId} / ${o.testName}: expected "${o.expected}", got "${o.actual}"` ); }); } ``` **এটি যা যাচাই করে**: 1. প্রতিটি ফিল্টার লোড হয় এবং স্কিমা যাচাইকরণে উত্তীর্ণ হয় 2. প্রতিটি `tests[]` এন্ট্রি প্রত্যাশিত আউটপুট তৈরি করে 3. `minimal` তীব্রতা কোনো পরিবর্তন করে না (মূল আউটপুট সংরক্ষণ করে, শুধু কাঠামোগত ফিল্টার প্রয়োগ করে) 4. `aggressive` তীব্রতা এরর, টেস্ট ব্যর্থতা এবং স্ট্যাক ট্রেস সংরক্ষণ করে 5. সংকুচিত আউটপুট কখনোই মূল ইনপুটের চেয়ে বড় হয় না - সোর্স: `open-sse/services/compression/engines/rtk/` (63টি ফাইল, ~70KB) - **কোনো ফিল্টার পরিবর্তন মার্জ করার আগে** — সবসময় নিশ্চিত করুন যে টেস্টগুলো পাস করছে - **RTK ইঞ্জিন আপগ্রেড করার পরে** — স্কিমা পরিবর্তিত হয়ে থাকতে পারে - **পর্যায়ক্রমিক মনিটরিংয়ের সময়** — টেস্ট ফিক্সচারের বিচ্যুতি থেকে সুরক্ষা দেয় - **নতুন কোনো টুল/কমান্ড পরিবার যোগ করার সময়** — প্রমাণ করে যে নতুন ফিল্টারটি কাজ করে --- ## আরও দেখুন - [COMPRESSION_GUIDE.md](./COMPRESSION_GUIDE.md) — সম্পূর্ণ কম্প্রেশন পাইপলাইনের সারসংক্ষেপ - [COMPRESSION_ENGINES.md](./COMPRESSION_ENGINES.md) — ইঞ্জিন রেজিস্ট্রি এবং বিল্ট-ইন ইঞ্জিনসমূহ - [EXTENDING_COMPRESSION.md](./EXTENDING_COMPRESSION.md) — কাস্টম ইঞ্জিন, ভাষা প্যাক এবং স্ট্যাকড পাইপলাইন - উৎস: `open-sse/services/compression/engines/rtk/` (63টি ফাইল, ~70KB)