/**
 * src/agent/tool-intent.ts
 *
 * (v2.5.5) Natural-language / slang / typo-tolerant tool-intent inference.
 *
 * Given a user message in any mix of Saudi/Gulf Arabic dialect, MSA, English,
 * Hinglish/Arabish, with typos and slang — return which native tool(s) the
 * user is asking for. Used by:
 *   - brain.ts retry-directive builder (which tool to nudge toward)
 *   - brain.ts tool-list filter (drop irrelevant categories from the
 *     Qwen schema, preventing the v2.5.4 ZATCA-misfire on Excel requests)
 *   - hallucination guard's "you claimed X but didn't call Y" matcher
 *
 * Critical: JavaScript's `\b` only recognizes [A-Za-z0-9_] as word chars,
 * NOT Arabic letters. So `\bايميل\b` does NOT match `ابعت ايميل لاحمد`
 * because the boundary between Arabic letter and space is non-word →
 * non-word, not a word boundary. That single bug silently broke ~80% of
 * Arabic patterns in v2.5.4. This module uses an Arabic-aware boundary
 * helper (`ar()`) built around lookarounds that recognize Arabic ranges:
 *   - U+0600-U+06FF: Arabic
 *   - U+0750-U+077F: Arabic Supplement
 *   - U+FB50-U+FDFF: Arabic Presentation Forms-A
 *   - U+FE70-U+FEFF: Arabic Presentation Forms-B
 */
// ─── Boundary helper ────────────────────────────────────────────────────
// `\p{L}` (Unicode letter) covers Arabic letters in the `u` flag.
// We extend with digits and underscore to mirror `\w`-like behavior. Then
// the lookarounds say "not preceded/followed by another word char".
//
// Result: `ar('ايميل')` matches `ابعت ايميل لاحمد` (where `\bايميل\b` fails)
//         but still rejects `سيايميلي` (substring inside another word).
const NOT_WORD = '[^\\p{L}\\p{N}_]';
function ar(body, flags = 'iu') {
    // Wrap the pattern body with unicode-aware "word boundary" lookarounds.
    // `(?<=^|NOT_WORD)` = preceded by start-of-string or non-word char.
    // `(?=$|NOT_WORD)`  = followed by end-of-string or non-word char.
    return new RegExp(`(?<=^|${NOT_WORD})(?:${body})(?=$|${NOT_WORD})`, flags);
}
// ─── Pattern Table ──────────────────────────────────────────────────────
// Order matters when two patterns overlap: regulated/specific tools come
// FIRST so they win over generic "create a file" matches.
//
// Each pattern is intentionally LIBERAL. The patterns recognize:
//   - Saudi/Gulf dialect:    سويلي / ابي / ودي / فرجني / ورني / حضرلي
//   - MSA:                   أرسل / أنشئ / اعرض / احذف
//   - English (incl. typos): excell, exel, scedule, remmber, whatsap, imail
//   - Mixed/Arabish:         "اعمللي excel sheet", "ابي pdf report"
//
const RULES = [
    // ═══════════════════════════════════════════════════════════════════
    // SAUDI-REGULATORY (matched FIRST to avoid generic "create excel"
    // collisions when the user actually wants a ZATCA invoice)
    // ═══════════════════════════════════════════════════════════════════
    // ZATCA / e-invoice (requires explicit VAT/tax signal)
    {
        pattern: ar('zatca|ز[اآ]?تك?ا|فاتورة\\s*(?:ضريبية|الكترونية|إلكترونية|zatca|بضريبة|مع\\s+ضريبة)|tax\\s*invoice|vat\\s*invoice|e[-\\s]?invoice|فاتورة\\s+القيمة\\s+المضافة|فاتورة\\s+(?:VAT|vat)|قيمة\\s+مضافة'),
        tool: 'zatca_invoice',
        category: 'saudi-regulatory',
    },
    // Saudization / Nitaqat
    {
        pattern: ar('saudization|saudisation|nitaqat|نطاقات|سعودة|نسبة\\s+السعودة|نسبة\\s+سعودة|hrsd|قوى\\s+العاملة|workforce\\s+(?:saudization|nationals)|توطين'),
        tool: 'saudization_check',
        category: 'saudi-regulatory',
    },
    // Saudi Post / courier tracking
    {
        pattern: ar('saudi\\s*post|smsa|aramex|fedex|dhl|البريد\\s+السعودي|بريد\\s+سعودي|spl|wasl|wasel|waslny|تتبع\\s+(?:شحنة|الشحنة|طرد|الطرد|البريد|الشحن)|track\\s+(?:my\\s+)?(?:shipment|parcel|package|order)|رقم\\s+(?:الشحنة|التتبع)'),
        tool: 'saudi_post_track',
        category: 'saudi-regulatory',
    },
    // Prayer times
    {
        pattern: ar('prayer\\s*times?|salah\\s*times?|adhan|azan|أذان|مواقيت\\s+(?:الصلاة|الصلوات|الصلاه)|أوقات\\s+الصلاة|اوقات\\s+الصلاة|(?:صلاة|وقت)\\s+(?:الفجر|الظهر|العصر|المغرب|العشاء)|متى\\s+(?:الفجر|الظهر|العصر|المغرب|العشاء)|iqamah?|إقامة'),
        tool: 'prayer_times',
        category: 'saudi-regulatory',
    },
    // Hijri date / Islamic calendar
    {
        pattern: ar('hijri(?:\\s*(?:date|calendar))?|islamic\\s+(?:date|calendar)|التاريخ\\s+(?:الهجري|بالهجري)|تاريخ\\s+هجري|كم\\s+التاريخ\\s+الهجري|اليوم\\s+هجري(?:اً|ا)?|(?:شهر\\s+)?(?:محرم|صفر|ربيع\\s+الأول|ربيع\\s+الثاني|جمادى\\s+(?:الأولى|الآخرة)|رجب|شعبان|رمضان|شوال|ذو\\s+القعدة|ذو\\s+الحجة)'),
        tool: 'hijri_date',
        category: 'saudi-regulatory',
    },
    // Ramadan working hours
    {
        pattern: ar('ramadan\\s+(?:hours|working\\s+hours|schedule)|دوام\\s+(?:رمضان|شهر\\s+رمضان)|ساعات\\s+(?:رمضان|العمل\\s+في\\s+رمضان|دوام\\s+رمضان)'),
        tool: 'ramadan_hours',
        category: 'saudi-regulatory',
    },
    // Arabic / bilingual contract (must precede generic "write file")
    {
        pattern: ar('arabic\\s+contract|bilingual\\s+contract|عقد\\s+(?:عربي|بالعربي|بالعربية|ثنائي\\s+اللغة)|اعمل(?:لي)?\\s+عقد|سويلي\\s+عقد|اكتبلي\\s+عقد|حضرلي\\s+عقد|generate\\s+(?:an?\\s+)?(?:arabic|legal)?\\s*contract|draft\\s+(?:an?\\s+)?contract'),
        tool: 'arabic_contract_gen',
        category: 'saudi-regulatory',
    },
    // Saudi market research (precedes generic "research")
    {
        pattern: ar('saudi\\s+market\\s+(?:research|study|analysis|insight|insights)|دراسة\\s+(?:السوق|سوق)\\s+(?:السعودي|السعودية)|تحليل\\s+(?:السوق|سوق)\\s+(?:السعودي|السعودية)|بحث\\s+السوق\\s+السعودي|سوق\\s+السعودية|insights?\\s+(?:on\\s+|about\\s+)?saudi'),
        tool: 'saudi_market_research',
        category: 'saudi-regulatory',
    },
    // Local payment gateway
    {
        pattern: ar('mada|sada?d|سداد|tabby|تابي|tamara|تمارا|stc\\s*pay|stcpay|اس\\s*تي\\s*سي\\s*pay|hyperpay|moyasar|ميسر|paytabs|amazon\\s+pay|apple\\s+pay|payment\\s+gateway|بوابة\\s+(?:الدفع|دفع)|integration\\s+payment'),
        tool: 'local_payment_gateway',
        category: 'saudi-regulatory',
    },
    // Saudi social listening
    {
        pattern: ar('social\\s+listening|saudi\\s+social|brand\\s+(?:mentions|monitoring)|إشارات\\s+(?:العلامة|البراند)|مراقبة\\s+(?:السوشال|الإعلام|التواصل)'),
        tool: 'saudi_social_listening',
        category: 'saudi-regulatory',
    },
    // Saudi weather alert
    {
        pattern: ar('weather\\s+alert|saudi\\s+weather|طقس|حالة\\s+(?:الطقس|الجو)|تحذير\\s+(?:جوي|الطقس)|أمطار|عواصف|temperature\\s+(?:in\\s+)?(?:jeddah|riyadh|makkah|medina|dammam)'),
        tool: 'saudi_weather_alert',
        category: 'saudi-regulatory',
    },
    // ═══════════════════════════════════════════════════════════════════
    // DOCUMENT (Excel / PDF / generic file writes)
    // ═══════════════════════════════════════════════════════════════════
    // Excel / spreadsheet — broadened MUCH from v2.5.4 (was only "create excel")
    {
        pattern: ar('excel|exel|excell|exce|excle|xls\\.?|xlsx|spread\\s*sheet|spreadshet|spread-?sheet|workbook|work-?book|اكسل|إكسل|اكسيل|إكسيل|اكسيلي|جدول\\s*(?:بيانات|بيناتي|اكسل|excel|xlsx)|(?:google|gs)\\s+sheets?'),
        tool: 'create_excel',
        category: 'document',
    },
    // PDF report
    {
        pattern: ar('pdf|pdef|p\\.d\\.f\\.?|بي\\s*دي\\s*اف|بي\\s*دي|تقرير\\s+pdf|report\\s+pdf|pdf\\s+report|اعمل(?:لي)?\\s+تقرير|سويلي\\s+تقرير|حضرلي\\s+تقرير|ابي\\s+تقرير|generate\\s+(?:a\\s+|the\\s+)?(?:report|pdf)|export\\s+(?:to|as)\\s+pdf'),
        tool: 'create_pdf_report',
        category: 'document',
    },
    // HTML → PDF (also the primary path for slide decks)
    {
        pattern: ar('html\\s*(?:to|->)\\s*pdf|render\\s+(?:html|webpage)\\s+to\\s+pdf|طبع\\s+الصفحة|اطبع\\s+(?:الصفحة|الموقع)\\s+(?:pdf|بي\\s+دي\\s+اف)'),
        tool: 'html_to_pdf',
        category: 'document',
    },
    // Slides / pitch deck — routes to create_presentation (v2.5.11) which
    // generates the full slide HTML internally so Qwen doesn't have to.
    {
        pattern: ar('slides?|slide\\s*deck|pitch\\s*deck|presentation|powerpoint|power\\s*point|pptx?|keynote|google\\s*slides|بريزنتيشن|برزنتيشن|عرض\\s+تقديمي|عرض\\s+شرائح|شرائح|شريحة|بيتش\\s*ديك|بيتش|investor\\s+deck|sales\\s+deck|company\\s+presentation'),
        tool: 'create_presentation',
        category: 'document',
    },
    // Learn from document (ingest into memory)
    {
        pattern: ar('learn\\s+from\\s+(?:this\\s+|the\\s+)?(?:file|document|pdf|doc)|ingest\\s+(?:the\\s+|this\\s+)?(?:file|document|pdf|doc)|تعلم\\s+من\\s+(?:هذا\\s+)?(?:الملف|المستند|الـ?pdf|الوثيقة)|اقرأ\\s+(?:هذا\\s+)?(?:الملف|المستند)\\s+و?تعلم|علمك\\s+من\\s+(?:هذا\\s+)?(?:الملف|المستند)|علّمك\\s+من\\s+(?:هذا\\s+)?(?:الملف|المستند)'),
        tool: 'learn_from_document',
        category: 'memory',
    },
    // ═══════════════════════════════════════════════════════════════════
    // BROWSER
    // ═══════════════════════════════════════════════════════════════════
    // Screenshot
    {
        pattern: ar('screen\\s*shot|screenshot|سكرين\\s*شوت|سكرين\\s*شت|سكر?ين\\s*شو?ت|لقطة\\s*شاشة|التقط(?:ي?\\s*ل?ي)?\\s*(?:شاشة|الشاشة|صورة\\s+للشاشة)|صور\\s+(?:الشاشة|الشاش)|صورلي\\s+الشاشة|capture\\s+(?:the\\s+)?(?:screen|page)|snap(?:shot)?\\s+(?:the\\s+)?(?:page|screen)'),
        tool: 'browser_screenshot',
        category: 'browser',
    },
    // Browser open
    {
        pattern: ar('open\\s+(?:in\\s+)?(?:browser|chrome|safari|firefox)|launch\\s+(?:the\\s+)?browser|browse\\s+(?:to|the\\s+page)|افتح\\s+(?:المتصفح|متصفح|chrome|safari)|روح\\s+(?:على\\s+|لـ?\\s*)المتصفح|شغل\\s+(?:المتصفح|chrome|safari)'),
        tool: 'browser_open',
        category: 'browser',
    },
    // Browser read / page extract
    {
        pattern: ar('read\\s+(?:the\\s+)?page|extract\\s+(?:text|content)\\s+from\\s+(?:the\\s+)?page|اقرأ\\s+الصفحة|محتوى\\s+الصفحة'),
        tool: 'browser_read',
        category: 'browser',
    },
    // ═══════════════════════════════════════════════════════════════════
    // RESEARCH (most specific first)
    // ═══════════════════════════════════════════════════════════════════
    // Internal knowledge graph search
    {
        pattern: ar('search\\s+(?:my\\s+|our\\s+|the\\s+)?(?:knowledge|memory|kg|graph)|knowledge\\s+(?:graph\\s+)?search|بحث\\s+(?:في\\s+)?(?:المعرفة|الذاكرة|قاعدة\\s+المعرفة)|ابحث\\s+في\\s+(?:ذاكرتك|معرفتك)'),
        tool: 'internal_knowledge_search',
        category: 'research',
    },
    // Web search (explicit "web")
    {
        pattern: ar('web\\s+search|google(?:\\s+(?:it|this|that))?|ابحث\\s+(?:في|على|عبر|عن)?\\s+(?:الويب|الإنترنت|النت|قوقل|google)|سيرش\\s+ويب|بحث\\s+ويب|google\\s+search'),
        tool: 'web_search',
        category: 'research',
    },
    // Web fetch (specific URL)
    {
        pattern: ar('fetch\\s+(?:the\\s+)?(?:url|page|website|link)|scrape\\s+(?:the\\s+)?(?:url|page|website|link)|get\\s+(?:the\\s+)?(?:html|content)\\s+(?:of|from)|اجلب\\s+(?:محتوى|الـ?html)\\s+(?:من|الـ?url)'),
        tool: 'web_fetch',
        category: 'research',
    },
    // Generic research / lookup
    {
        pattern: ar('research|investigate|deep\\s*dive|find\\s+out|look\\s+(?:up|into|for)|ابحثلي|ابحث|دورلي|دورها|دور|فتشلي|فتش|لقيلي|لقيها|لقي|استعلم|اكتشف|اكتشفي|تحرى|study|analyze\\s+(?:the\\s+)?topic|اعطني\\s+(?:معلومات|تفاصيل|بحث)|قولي\\s+(?:كل\\s+شي|ايش\\s+تعرف|وش\\s+تعرف)|ابغى\\s+اعرف|عرفني|خبرني\\s+عن'),
        tool: 'research_topic',
        category: 'research',
    },
    // ═══════════════════════════════════════════════════════════════════
    // SEND
    // ═══════════════════════════════════════════════════════════════════
    // WhatsApp (more specific than email — match first)
    {
        pattern: ar('whats\\s*app|whatsapp|whatsap|whatspp|wattsap|wattsapp|whatsapp\\s*business|wa\\s+(?:message|send)|wsp|واتس|واتساب|واتساآب|واتسآب|ع\\s*الواتس|على\\s*الواتس|عبر\\s*الواتس'),
        tool: 'send_whatsapp',
        category: 'send',
    },
    // Email
    {
        pattern: ar('e[-\\s]?mail|imail|email|emaill|emial|gmail|outlook|بريد(?:\\s+إلكتروني)?|إيميل|ايميل|إيميلي|أرسل(?:لي)?\\s+(?:إيميل|بريد|ايميل)|ابعت(?:لي)?\\s+(?:إيميل|بريد|ميل|ايميل)|راسلي?\\s+ع?بر?\\s+(?:البريد|الإيميل)'),
        tool: 'send_email',
        category: 'send',
    },
    // ═══════════════════════════════════════════════════════════════════
    // SCHEDULE
    // ═══════════════════════════════════════════════════════════════════
    // Recurring schedule
    {
        pattern: ar('every\\s+(?:day|morning|evening|night|week|monday|tuesday|wednesday|thursday|friday|saturday|sunday|month|hour|minute|year)|كل\\s+(?:يوم|صباح|مساء|أسبوع|شهر|ساعة|دقيقة|إثنين|اثنين|ثلاثاء|أربعاء|اربعاء|خميس|جمعة|سبت|أحد|احد)|يومي|يومياً|يوميا|أسبوعي|أسبوعياً|أسبوعيا|اسبوعي|اسبوعياً|اسبوعيا|شهري|شهرياً|شهريا|سنوي|سنوياً|سنويا|daily|weekly|monthly|hourly|yearly|cron|recurring|repeat\\s+(?:every|each)|كرر|كررها|كرره'),
        tool: 'schedule_recurring',
        category: 'schedule',
    },
    // One-shot reminder
    {
        pattern: ar('remind\\s+me|reminder|set\\s+(?:a\\s+)?reminder|ذكرني|ذكّرني|ذكر|فكرني|فكّرني|نبهني|نبّهني|حطلي\\s+(?:تذكير|reminder|alarm)|بكرة|بكره|غداً|غدا|tomorrow|next\\s+(?:monday|tuesday|wednesday|thursday|friday|saturday|sunday|week|month)|الساعة\\s+\\d|عند\\s+\\d|في\\s+\\d{1,2}(?::\\d{2})?|at\\s+\\d{1,2}(?::\\d{2})?|بعد\\s+(?:ساعة|يوم|دقيقة|أسبوع)'),
        tool: 'schedule_followup',
        category: 'schedule',
    },
    // ═══════════════════════════════════════════════════════════════════
    // FILESYSTEM
    // ═══════════════════════════════════════════════════════════════════
    // Write file (generic)
    {
        pattern: ar('write\\s+(?:to\\s+)?(?:a\\s+|the\\s+)?file|create\\s+(?:a\\s+|the\\s+)?file|save\\s+(?:as|to|into)\\s+(?:a\\s+)?file|اكتب(?:لي)?\\s+(?:في\\s+)?ملف|سويلي\\s+ملف|أنشئ\\s+(?:لي\\s+)?ملف|احفظ\\s+(?:كملف|في\\s+ملف)'),
        tool: 'write_file',
        category: 'filesystem',
    },
    // Read file
    {
        pattern: ar('read\\s+(?:the\\s+|a\\s+)?file|cat\\s+the\\s+file|اقرأ(?:لي)?\\s+(?:الملف|ملف|محتوى)|اطلع(?:لي)?\\s+على\\s+(?:الملف|محتوى)|افتح(?:لي)?\\s+(?:الملف|ملف)\\s+(?:و|ثم)\\s+اقرأ|عرض\\s+محتوى\\s+الملف'),
        tool: 'read_file',
        category: 'filesystem',
    },
    // List files
    {
        pattern: ar('list\\s+(?:files|the\\s+(?:folder|directory|dir))|ls(?:\\s+(?:the\\s+|my\\s+)?(?:folder|directory|files|dir))?|اعرض(?:لي)?\\s+(?:الملفات|ملفات\\s+المجلد|محتوى\\s+(?:المجلد|الفولدر))|وش\\s+في\\s+(?:المجلد|الفولدر|الديركتوري)|ملفات\\s+(?:المجلد|الفولدر)'),
        tool: 'list_files',
        category: 'filesystem',
    },
    // Delete file
    {
        pattern: ar('delete\\s+(?:the\\s+|a\\s+)?file|remove\\s+(?:the\\s+|a\\s+)?file|drop\\s+(?:the\\s+|a\\s+)?file|rm\\s+(?:-rf?\\s+)?|احذف(?:لي)?\\s+(?:ملف|الملف)|امسح(?:لي)?\\s+(?:ملف|الملف)|شيل\\s+(?:ملف|الملف)|ازل\\s+(?:ملف|الملف)'),
        tool: 'delete_file',
        category: 'filesystem',
    },
    // ═══════════════════════════════════════════════════════════════════
    // SYSTEM
    // ═══════════════════════════════════════════════════════════════════
    // Exec command
    {
        pattern: ar('run\\s+(?:the\\s+|this\\s+)?(?:command|shell|terminal|cli)|exec(?:ute)?\\s+(?:the\\s+|this\\s+)?(?:command|shell)?|shoot\\s+(?:a\\s+)?command|سوي\\s+(?:كوماند|أمر)|شغل\\s+(?:أمر|كوماند|terminal|terminal\\s+command)|شغّل\\s+(?:أمر|كوماند|terminal)|نفذ\\s+(?:أمر|الأمر|كوماند)'),
        tool: 'exec_command',
        category: 'system',
    },
    // System info
    {
        pattern: ar('system\\s+info(?:rmation)?|os\\s+info|sys\\s+info|machine\\s+info|معلومات\\s+(?:النظام|الجهاز|الكومبيوتر)|تفاصيل\\s+الجهاز|مواصفات\\s+الجهاز|نوع\\s+النظام'),
        tool: 'get_system_info',
        category: 'system',
    },
    // ═══════════════════════════════════════════════════════════════════
    // DISPLAY
    // ═══════════════════════════════════════════════════════════════════
    // Display result / open the just-created artifact
    {
        pattern: ar('open\\s+(?:it|that|the\\s+file)|افتحها|افتحه|افتح\\s+لي\\s+(?:الملف|اياه)|افتح\\s+الملف|اعرضها|اعرضه|اعرض\\s+لي\\s+(?:الملف|اياه)|ورني|ورنيها|ورنيه|فرجني|فرجنيها|فرجنيه|show\\s+(?:it|that|me\\s+(?:the\\s+file|that))|display\\s+(?:it|that|the\\s+file)'),
        tool: 'display_result',
        category: 'display',
    },
    // Show steps
    {
        pattern: ar('show\\s+(?:me\\s+)?(?:the\\s+)?(?:steps|how|what\\s+you\\s+did)|how\\s+did\\s+you\\s+(?:do|make|create|build)|اعرض(?:لي)?\\s+(?:الخطوات|كيف)|كيف\\s+(?:فعلت|عملتها|سويتها|سويت)|ايش\\s+(?:سويت|فعلت|عملت)\\s+(?:بالضبط|كل\\s+شي)'),
        tool: 'show_steps',
        category: 'display',
    },
    // Open URL / link
    {
        pattern: ar('open\\s+(?:the\\s+)?(?:url|website|the\\s+(?:link|page))|افتح(?:لي)?\\s+(?:موقع|الموقع|رابط|الرابط|اللينك|الصفحة|https?:)|روح\\s+(?:ع|إلى|الى|للموقع|للينك)'),
        tool: 'open_url',
        category: 'display',
    },
    // ═══════════════════════════════════════════════════════════════════
    // MEDIA
    // ═══════════════════════════════════════════════════════════════════
    // YouTube
    {
        pattern: ar('play\\s+(?:on\\s+)?youtube|youtube|youtu\\.be|يوتيوب|يوتوب|شغل(?:لي)?\\s+(?:فيديو|على\\s+يوتيوب|على\\s+اليوتيوب)|شغّل(?:لي)?\\s+(?:فيديو|على\\s+يوتيوب)|فرجني\\s+(?:فيديو|على\\s+يوتيوب)'),
        tool: 'play_youtube',
        category: 'media',
    },
    // Analyze image
    {
        pattern: ar('analy[sz]e\\s+(?:this\\s+|the\\s+)?(?:image|picture|photo|pic|img)|describe\\s+(?:this\\s+|the\\s+)?(?:image|picture|photo|pic|img)|what(?:\'s|s|\\s+is)\\s+in\\s+(?:this\\s+|the\\s+)?(?:image|picture|photo)|فحص\\s+(?:الصورة|هذي\\s+الصورة|الصور)|اوصف\\s+(?:الصورة|هذي\\s+الصورة)|وش\\s+في\\s+(?:الصورة|هالصورة)|اعرف(?:لي)?\\s+(?:الصورة|هذي\\s+الصورة)'),
        tool: 'analyze_image',
        category: 'media',
    },
    // Transcribe audio
    {
        pattern: ar('transcribe|transcription|speech\\s+to\\s+text|stt|تفريغ\\s+(?:صوت|الصوت|مكالمة|التسجيل|الفويس|الفويسات)|اكتب(?:لي)?\\s+(?:الصوت|التسجيل|المكالمة|الفويس)|اكتبلي\\s+(?:الصوت|التسجيل|المكالمة|الفويس)|حول\\s+(?:الـ?صوت|الـ?تسجيل|المكالمة|الفويس)\\s+(?:إلى|لـ?)\\s*نص'),
        tool: 'transcribe_audio',
        category: 'media',
    },
    // ═══════════════════════════════════════════════════════════════════
    // CRM
    // ═══════════════════════════════════════════════════════════════════
    // Get customer
    {
        pattern: ar('get\\s+(?:the\\s+)?customer|customer\\s+(?:info|details|data|lookup|record)|lookup\\s+customer|find\\s+(?:the\\s+)?customer|بيانات\\s+(?:العميل|الزبون)|معلومات\\s+(?:العميل|الزبون)|من\\s+(?:هو\\s+)?(?:العميل|الزبون)|عميل\\s+رقم|اعرض\\s+(?:العميل|بيانات)'),
        tool: 'get_customer',
        category: 'crm',
    },
    // Update customer
    {
        pattern: ar('update\\s+(?:the\\s+)?customer|edit\\s+(?:the\\s+)?customer|change\\s+(?:the\\s+)?customer|حدث\\s+(?:بيانات\\s+)?(?:العميل|الزبون)|عدل\\s+(?:بيانات\\s+)?(?:العميل|الزبون)|غير\\s+(?:بيانات\\s+)?(?:العميل|الزبون)'),
        tool: 'update_customer',
        category: 'crm',
    },
    // ═══════════════════════════════════════════════════════════════════
    // PLANNING
    // ═══════════════════════════════════════════════════════════════════
    // Plan complex task
    {
        pattern: ar('plan\\s+(?:out\\s+|the\\s+)?(?:task|project|approach|strategy)|make\\s+a\\s+plan|create\\s+a\\s+plan|outline\\s+(?:the\\s+)?(?:task|approach|plan)|اعمل(?:لي)?\\s+(?:خطة|بلان)|خطط(?:لي)?|ضع\\s+خطة|بلان\\s+(?:للمشروع|للمهمة)'),
        tool: 'plan_complex_task',
        category: 'planning',
    },
    // Verify answer
    {
        pattern: ar('verify\\s+(?:the\\s+)?(?:answer|result|output)|double[\\s-]check|sanity\\s+check|تحقق\\s+من\\s+(?:الإجابة|النتيجة|المخرجات)|راجع(?:لي)?\\s+(?:الإجابة|النتيجة)'),
        tool: 'verify_answer',
        category: 'planning',
    },
    // ═══════════════════════════════════════════════════════════════════
    // MEMORY
    // ═══════════════════════════════════════════════════════════════════
    // Recall conversation (more specific — must precede recall_fact)
    {
        pattern: ar('recall\\s+(?:the\\s+)?conversation|previous\\s+(?:chat|message|conversation|session)|آخر\\s+(?:محادثة|رسائل|كلام|جلسة)|كلامنا\\s+(?:السابق|قبل)|عودة\\s+(?:لمحادثة|للنقاش|للكلام)'),
        tool: 'recall_conversation',
        category: 'memory',
    },
    // Recall fact
    {
        pattern: ar('recall|do\\s+you\\s+remember|what\\s+did\\s+(?:i|we)\\s+(?:say|tell|share)|تذكر\\s+(?:معي|وش|إيش|ما|إن|ان)|تذكرت|ماذا\\s+(?:كنت|قلت)|ما\\s+(?:كنت|قلت)|وش\\s+(?:قلت\\s+لك|أخبرتك)|إيش\\s+قلت\\s+لك'),
        tool: 'recall_fact',
        category: 'memory',
    },
    // Remember fact
    {
        pattern: ar('remember\\s+(?:that|when|this|the\\s+fact)|note\\s+(?:that|this|down)|save\\s+(?:this\\s+)?(?:fact|info)|store\\s+(?:this|that)|تذكر|تذكر\\s+(?:أن|إن|أنه|إنه|هذا|هذي)|احفظ\\s+(?:هذي|هذا|إن|أن|هالمعلومة|عندك)|دون|دوّن|دون\\s+(?:عندك|عندي|أن|إن|هذا|هذي)|سجل|سجّل|سجل\\s+(?:عندك|هذي|هذا|أن|إن)'),
        tool: 'remember_fact',
        category: 'memory',
    },
    // ═══════════════════════════════════════════════════════════════════
    // SKILLS
    // ═══════════════════════════════════════════════════════════════════
    // Install skill from URL
    {
        pattern: ar('install\\s+(?:a\\s+|the\\s+)?skill|add\\s+(?:a\\s+)?skill|skill\\s+from\\s+(?:github|url|link)|حمل(?:لي)?\\s+(?:مهارة|سكيل|skill)|حمّل(?:لي)?\\s+(?:مهارة|سكيل|skill)|ركب(?:لي)?\\s+(?:مهارة|skill|سكيل)'),
        tool: 'skill_install_from_url',
        category: 'skills',
    },
    // Lookup / search skill
    {
        pattern: ar('lookup\\s+(?:a\\s+|the\\s+)?skill|find\\s+(?:a\\s+|the\\s+)?skill|search\\s+(?:for\\s+)?(?:a\\s+)?skill|دور(?:لي)?\\s+(?:على\\s+)?(?:مهارة|سكيل|skill)|ابحث\\s+عن\\s+(?:مهارة|skill)'),
        tool: 'lookup_skill',
        category: 'skills',
    },
    // List tools
    {
        pattern: ar('list\\s+(?:all\\s+)?(?:tools|capabilities|abilities)|what\\s+(?:tools|can\\s+you\\s+do)|اعرض(?:لي)?\\s+(?:الأدوات|قدراتك|كل\\s+اللي\\s+تقدر)|وش\\s+تقدر\\s+تسوي|ايش\\s+قدراتك'),
        tool: 'list_tools',
        category: 'skills',
    },
];
// ─── Public API ─────────────────────────────────────────────────────────
/**
 * Match the first tool intent in the message (highest-priority rule wins).
 * Use this when you only need ONE tool — e.g. the retry directive.
 */
export function inferTool(message) {
    if (!message || typeof message !== 'string')
        return null;
    for (const rule of RULES) {
        if (rule.pattern.test(message)) {
            return { tool: rule.tool, category: rule.category };
        }
    }
    return null;
}
/**
 * Match ALL tool intents in the message. Used for category-based tool
 * filtering so a message can pull in multiple categories (e.g. "اكتب
 * تقرير pdf وأرسله بالإيميل" → document + send).
 */
export function inferAllTools(message) {
    if (!message || typeof message !== 'string')
        return [];
    const matched = [];
    const seen = new Set();
    for (const rule of RULES) {
        if (rule.pattern.test(message) && !seen.has(rule.tool)) {
            seen.add(rule.tool);
            matched.push({ tool: rule.tool, category: rule.category });
        }
    }
    return matched;
}
/**
 * Get all matched categories for a message. Useful for tool-list filtering:
 * if no Saudi-regulatory match, drop ZATCA/Saudization/etc from the catalog
 * so Qwen doesn't misfire them onto an Excel request.
 */
export function inferCategories(message) {
    return new Set(inferAllTools(message).map((m) => m.category));
}
//# sourceMappingURL=tool-intent.js.map