Code Keeper Bot

למפתחים ולסוכני AI:

  • התחלה מהירה - סוכני AI
    • מה אסור
    • מה מותר ומומלץ
    • פורמטי ציטוט קוד
    • מחיקה בטוחה (רק ב-/tmp)
    • קומיטים ו-PR
    • קישורים מהירים
    • Cheatsheet – GitHub CLI (gh)
  • התחלה מהירה - מפתחים
    • שלב 1: התקנה
    • שלב 2: הגדרת .env
    • שלב 3: הרצה
    • מה הלאה?
  • Quickstart לתרומה
    • צעדי הכנה
    • סביבת פיתוח
    • הרצת טסטים
    • על ה‑Stubs
    • קישורים
  • הנחיות מלאות לסוכני AI
    • מגבלות קריטיות
      • הרצת פקודות
    • כלי קבצים מאושרים
    • עקרונות עריכת קוד
    • קומיטים ו-Pull Requests
    • עבודה עם טסטים
    • קישורים מהירים
  • 🚦 מערכת Rate Limiting לסוכני AI ולווב
    • אסטרטגיה – Shadow Mode תחילה
    • משתני סביבה וקונפיג
    • אינטגרציה – בוט טלגרם
    • אינטגרציה – Flask/WebApp
    • החרגות חשובות
    • ניטור ומדדים (Prometheus)
    • אבטחה והגנות
    • קונפיגורציה (Pydantic Settings)
    • תקלות נפוצות
    • קישורים
  • Doc Authoring Guide (Sphinx/RTD)
    • מטרות
    • מדיניות
    • הצהרת תקציר בראש העמוד
    • ספירות בפרוזה: ספירת מופעים לעומת ערך שנאכף
    • הטמעת קוד מהמקור (literalinclude)
    • ייצוא הסעיפים בבניית האתר
    • כיוון האתר (מימין לשמאל)
    • התפריט עוקב אחרי הסעיף שקוראים בו
    • רשומה ב-What’s New
    • טיפים מהירים
    • קישורים
  • Style & Naming Glossary
    • מטרות
    • מיפוי מונחים
    • כללים
    • עוגני תיעוד
  • Versioning & Stable Anchors
    • מדיניות עוגנים יציבים
    • What’s New
    • דוגמת Anchors
    • קישורים
  • What’s New
    • 2026-11-05
    • 2026-11-04
    • 2026-11-03
    • 2026-10-31
    • 2026-10-30
    • 2026-10-29
    • 2026-10-28
    • 2026-10-27
    • 2026-10-25
    • 2026-10-24
    • 2026-10-23
    • 2026-10-22
    • 2026-10-19
    • 2026-10-18
    • 2026-10-17
    • 2026-10-16
    • 2026-10-14
    • 2026-10-13
    • 2026-10-12
    • 2026-10-11
    • 2026-10-10
    • 2026-10-07
    • 2026-10-06
    • 2026-10-05
    • 2026-10-04
    • 2026-10-01
    • 2026-09-30
    • 2026-09-29
    • 2026-09-28
    • 2026-09-27
    • 2026-09-23
    • 2026-09-22
    • 2026-09-21
    • 2026-09-20
    • 2026-09-17
    • 2026-09-16
    • 2026-09-15
    • 2026-09-14
    • 2026-09-13
    • 2026-09-10
    • 2026-09-09
    • 2026-09-08
    • 2026-09-07
    • 2026-09-06
    • 2026-09-02
    • 2026-09-01
    • 2026-08-31
    • 2026-08-25
    • 2026-08-21
    • 2026-01-29
    • 2025-12-11
    • 2025-11-11
    • 2025-11-06
    • 2025-11-05
    • 2025-10-30
    • 2025-10-29
    • 2025-10-15
  • ארכיטקטורה
    • תרשים רכיבים (תמציתי)
    • תרשים ארכיטקטורה מפורט
    • מבנה תיקיות
    • מקורות נוספים
      • Clean Architecture ב-src
        • תרשים שכבות
        • מבנה תיקיות
        • שכבת הדומיין (Domain)
        • שכבת היישום (Application)
        • שכבת התשתית (Infrastructure)
        • דוגמת זרימה: יצירת סניפט
        • הנחיות עבודה
    • זרימות מרכזיות
    • קישורים
    • תשתית HTTP – סשן aiohttp משותף
    • הפרדת אחריות – DocumentHandler
  • עקרונות להוספת פיצ’ר לסטיקי-נוטס
    • התיעוד למשתמש הוא חלק מהפיצ’ר
    • סעיפים שעברו לעמודים אחרים
  • עקרונות להוספת פיצ’ר לסטיקי-נוטס — השרת, המסד והחוזים בין השירותים
    • היעד: בדיוק אחד, ובשכבה טהורה אחת
    • המכסה: fail-closed, והפטור-לאדמין שהורג מכסות בשקט
    • אינדקס ייחודי: ממוספר, ונבנה לפני שמפילים
    • אכיפה שנבנית רק בצד אחד היא הבטחה שהצד השני מפר בשקט
    • זהות לעומת נורמליזציה: אותה פונקציה בשני הקצוות
    • יתומים: זיהוי בקריאה, לא בכתיבה
    • מצב התזכורת: שדה אחד מתאר, שניים סוטים
    • השם של פתק בשורה אחת: פונקציה אחת לפוש, לפעמון ולדשבורד
    • הקישור הקבוע של פתק על קובץ: הגרסה האחרונה, בזמן הקריאה
    • הדגימה: כשל אינו ”אין“, ו-401 אינו כשל
    • התוכן: נשמר כמו שנשלח, וה-escape שייך לתצוגה
    • העדפה שיש לה גם מצב ”רק במכשיר זה“
    • גודל הטקסט בעמוד ההגדרות: מה שמסוכן יושב סביב הבורר
    • צבע: מזהה במסד, hex נגזר, וכינוי במקום מיגרציה
      • הקלט סובלני, האחסון קנוני
      • color בתשובת ה-API הוא hex, ולא מה שמאוחסן
      • הפלטה חיה פעמיים, ובדיקה מצליבה אותן
      • הצבעים והמדידה
      • שני חצאים למיגרציה, ואף אחד מהם אינו מיותר
    • חיפוש בפתקים: למה רג’קס ולא $text
    • שרשורי תגובות: השרת
      • השרת: הבעלות קודמת לכל, והתשובה מהמסד
    • ארכיון: היעד הרביעי
    • מה לבדוק, ובמה
  • עקרונות להוספת פיצ’ר לסטיקי-נוטס — מנוע הרינדור והמארקדאון של הפתק
    • רינדור בתצוגה: innerHTML אף פעם לא על טקסט לא-מהימן
    • אינדקס המשימות: התאמה מלאה בין שרת ללקוח
    • טבלאות: בלוק רב-שורתי בתוך מנוע של שורה-לשורה
    • קינון רשימות: שאלה אחת, מקום אחד, ומקור מדיד
    • קוד בשורה: יחידה אחת, שקודמת לכל מפריד
    • בלוק קוד: כשצריכה של בלוק שלם מוחקת שלושה סייגים
      • מה שהסדר בלולאה אוכף, ומה שהוא לא
      • ההעתקה: מהמקור, לא מה-DOM
      • יישור לימין: אותה שאלה, ולכן אותה פונקציה
    • בלוקי אלרט: הבלוק הראשון שמכיל שורות אחרות
      • התחביר אינו שלנו, ולכן הוא נמדד
      • שתי סטיות מכוונות, ושתיהן מאותו שורש
      • מקור אחד לסוג, וכל הצרכנים קוראים ממנו
      • הצבעים: אין כאן פלטה
      • ::: details: הסוג היחיד שדורש אלמנט אחר, ולמה זה נעצר בו
      • הכרעת הקליק, וההיסט שאינו נוגע בו
      • הכותרת: אותה תווית שהמסמך מציג, ולמה דווקא כאן זה קריטי
      • הצבעים והכיול: אותה מלכודת של האלרט, ואותו כלל מובייל
      • innerHTML: מקום אחד, ובגלל הקלט ולא בגלל ה-API
  • עקרונות להוספת פיצ’ר לסטיקי-נוטס — הממשק בדפדפן: גאומטריה, אינטראקציה וניגודיות
    • עיגון שורה בפתקי ריפו: למה anchored אינו זמין
    • פתקי ריפו: המשטח הוא התוכן של הגולל, לא הקונטיינר
    • סדר: flush לפני כל פעולה הרסנית
    • גודל: מה שנקבע לעומת מה שנכנס
    • גודל של פתק חדש, והגיבוי של פתק בלי גודל
    • העתקת מזהה הפתק: בשורת השם, והמזהה נקרא ברגע הלחיצה
    • תפריט ⋮: הפעולות הנדירות, ומה קובע לאן הוא נפתח
    • גודל הטקסט: טוקן אחד, ולמה דווקא בפיקסלים
    • מקור אחד למחלקה, ומקור אחד לסדר
    • חיפוש בתוך פתק: מודול הדגשה אחד, ומה שהפתק מוסיף עליו
      • ההדגשה: מודול אחד, ולא עותק נוסף
      • הדילוג על SVG: סלקטור, ולא tagName
      • תצוגה שנבנית מאפס: המצב ברשומה, וההדגשה בסוף כל בנייה
      • בלוק מתקפל שהחיפוש פתח אינו של המשתמש
      • לחיצה רגילה, לחיצה ממושכת, ומקלדת
      • התיבה: ילד של הפתק, מעליו, ובלי לשנות את המלבן שלו
      • כשאין מקום מעל: חיישן, ולא חישוב
      • גלילה, מיקוד ומקשים: רק הפתק זז, ורק התיבה שומעת
      • הצבעים: משטח קשיח, ומדידה בפיקסלים
      • מה לבדוק, ובמה
    • שרשורי תגובות: השרת והממשק בוובאפ
      • הממשק: ילדים של הפתק, והמצב במקום אחד
      • הבקשות: הצלחה רק כשהשרת אמר, ותקרת זמן משלה
      • ערכות וניגודיות
      • מה לבדוק, ובמה
    • ארכיון: המנהל במצב ארכיון, העמוד וחלון השם
    • מה לבדוק, ובמה
  • מדריך תרומה
    • כללים כלליים
    • Workflow בסיסי
    • Pre-commit
    • Conventional Commits
    • דוגמאות שימושיות
    • קישורים
  • Branch Protection & PR Rules
    • כללי ענפים
    • חוקי PR
    • CI – Required Checks
    • קישורים

מדריכים בסיסיים:

  • התקנה והגדרה
    • דרישות מערכת
    • התקנה מהירה
      • 1. שכפל את הריפוזיטורי
      • 2. התקן תלויות
      • 3. הגדר משתני סביבה
      • 4. הפעל את הבוט
    • התקנה עם Docker
      • 1. בנה את ה-Image
      • 2. הפעל עם Docker Compose
      • 3. שדרוג volume קיים מ-MongoDB 6.0
    • הגדרת MongoDB
    • הגדרת Telegram Bot
    • הגדרות מתקדמות
    • בדיקת התקנה
    • פתרון בעיות
    • תמיכה
  • Rate Limiting
    • Environment variables
    • Databases and Cache (Pooling/Timeouts)
    • HTTP Clients
    • שימוש ב‑http_async (Async HTTP)
    • שימוש ב‑http_sync (Sync HTTP)
    • Flask
    • Telegram Bot
    • Metrics
    • Security
  • Config via Pydantic Settings
    • היררכיית טעינה
    • ולידציות
    • .env.example
    • שימוש לסוכנים
    • פרמטרי קונפיגורציה מרכזיים (חדשים)
    • איחוד תיעוד קונפיגורציה
  • קבצי קונפיגורציה ייעודיים
    • config/alert_graph_sources.json
    • config/observability_runbooks.yml
    • config/alert_quick_fixes.json
    • config/alerts.yml
    • config/error_signatures.yml
    • config/image_settings.yaml
  • משתני סביבה - רפרנס
    • טבלה מרכזית
    • התראות וניטור (הרחבה)
    • מדדים, OTEL וחיזוי
    • תפעול, אינטגרציות ופיצ’רים
    • דגלי בדיקות ופיתוח
    • דוגמאות קונפיגורציה
    • קישורים
    • טבלת Scopes לפיצ’רים של GitHub
  • 🚀 The Performance Bible: CodeKeeper Optimization Guide
    • 0. חוק הברזל: Cache First (מנע את הגישה ל-DB)
    • 1. חוק ה-Projection (אל תמשוך מה שאתה לא מציג)
    • 2. חישובים ב-DB (Smart Metadata)
    • 3. אינדוקס מורכב (Compound Indexes)
    • 4. אופטימיזציית API וחיפוש (The Snippet Pattern)
    • 5. הזרקת נתונים אסינכרונית (Lazy Loading)
    • 6. הגדרות סביבה (The Production Sweet Spot)
  • ביצועים והרחבה (Performance & Scaling)
    • עימוד (Pagination)
    • Projection
    • דגשים
    • כוונון Connection Pooling ו-Timeouts
    • לוגי איטיות (מהיר לאיתור צווארי בקבוק)
    • בדיקות מהירות אחרי שינוי ENV
    • הנחיות לפי סביבה
  • Sticky Notes Warmup – פתרון ביצועים משולב
    • רקע קצר
    • מה מחזיק את המסלול היום
    • מה השתנה מאז המעבר ל-gevent
    • העלאת ה-timeout — איך עושים את זה נכון
    • איפוס הדגל בעת שינוי אינדקסים
    • מה לבדוק אם ה-latency קופץ שוב
    • קישורים
  • טיפול בקבצים גדולים (Large Files)
    • מגבלות ופולבקים
    • הנחיות הפעלה
    • ניטור

API Reference:

  • API Reference
    • main module
    • config module
    • bot_handlers module
    • conversation_handlers module
    • database package
      • Submodules
        • database.bookmark module
        • database.bookmarks_manager module
        • database.collections_manager module
        • database.manager module
        • database.models module
        • database.repository module
    • services package
      • Submodules
        • services.backoff_state module
        • services.backup_service module
        • services.code_service module
        • services.github_service module
        • services.google_drive_service module
        • services.investigation_service module
        • services.webserver module
    • handlers package
      • Subpackages
        • handlers.github package
      • Submodules
        • handlers.documents module
        • handlers.file_view module
        • handlers.pagination module
        • handlers.save_flow module
        • handlers.states module
    • utils module
      • CodeErrorLogger
        • CodeErrorLogger.__init__()
        • CodeErrorLogger.log_code_processing_error()
        • CodeErrorLogger.log_code_activity()
        • CodeErrorLogger.log_validation_failure()
        • CodeErrorLogger.log_sanitization_success()
      • TimeUtils
        • TimeUtils.ISRAEL_TZ_NAME
        • TimeUtils.to_israel_time()
        • TimeUtils.format_relative_time()
        • TimeUtils.parse_date_string()
        • TimeUtils.get_time_ranges()
      • TextUtils
        • TextUtils.truncate_text()
        • TextUtils.escape_markdown()
        • TextUtils.clean_filename()
        • TextUtils.extract_hashtags()
        • TextUtils.highlight_text()
        • TextUtils.format_file_size()
        • TextUtils.pluralize_hebrew()
      • SecurityUtils
        • SecurityUtils.generate_secure_token()
        • SecurityUtils.hash_content()
        • SecurityUtils.validate_user_input()
        • SecurityUtils.sanitize_code()
      • TelegramUtils
        • TelegramUtils.send_typing_action()
        • TelegramUtils.send_document_action()
        • TelegramUtils.safe_answer()
        • TelegramUtils.get_user_mention()
        • TelegramUtils.split_long_message()
        • TelegramUtils.safe_edit_message_text()
        • TelegramUtils.safe_edit_message_reply_markup()
        • TelegramUtils.extract_message_text_preserve_markdown()
      • CallbackQueryGuard
        • CallbackQueryGuard.DEFAULT_WINDOW_SECONDS
        • CallbackQueryGuard.should_block()
        • CallbackQueryGuard.should_block_async()
      • AsyncUtils
        • AsyncUtils.run_with_timeout()
        • AsyncUtils.batch_process()
      • PerformanceUtils
        • PerformanceUtils.timing_decorator()
        • PerformanceUtils.measure_time()
      • ValidationUtils
        • ValidationUtils.is_valid_filename()
        • ValidationUtils.is_safe_code()
      • FileUtils
        • FileUtils.download_file()
        • FileUtils.get_file_extension()
        • FileUtils.get_mime_type()
        • FileUtils.create_temp_file()
      • ConfigUtils
        • ConfigUtils.load_json_config()
        • ConfigUtils.save_json_config()
      • CacheUtils
        • CacheUtils.set()
        • CacheUtils.get()
        • CacheUtils.delete()
        • CacheUtils.clear()
      • get_memory_usage()
      • setup_logging()
      • generate_summary_stats()
      • detect_language_from_filename()
      • tg_emoji()
      • get_language_emoji()
      • SensitiveDataFilter
        • SensitiveDataFilter.filter()
      • install_sensitive_filter()
      • safe_zip_entry_name()
      • build_zip_bytes()
      • stash_pending_zip_bytes()
      • load_pending_zip_bytes()
      • cleanup_pending_zip()
      • cleanup_stale_pending_zips()
    • workspace
      • activity_reporter module
        • get_mongo_client()
        • close_mongo_client()
        • SimpleActivityReporter
        • create_reporter()
      • alert_forwarder module
        • emit_event()
        • public_webapp_base_url()
        • forward_alerts()
      • alert_manager module
        • emit_event()
        • reset_state_for_tests()
        • note_request()
        • get_current_error_rate_percent()
        • get_current_avg_latency_seconds()
        • get_request_stats_between()
        • bump_threshold()
        • get_thresholds_snapshot()
        • check_and_emit_alerts()
        • forward_critical_alert()
        • get_dispatch_log()
      • autocomplete_manager module
      • backup_menu_handler module
        • emit_event()
        • BackupMenuHandler
      • batch_commands module
      • batch_processor module
      • bot_handlers module
      • bot_rate_limiter module
      • cache_commands module
        • cache_stats_command()
        • clear_cache_command()
        • setup_cache_handlers()
        • cache_warm_command()
        • debug_cache_command()
      • cache_manager module
        • DynamicTTL
        • ActivityBasedTTL
        • build_cache_key()
        • CacheManager
        • dynamic_cache()
        • cached()
        • async_cached()
      • chatops package
        • Submodules
      • code_preview module
        • CodePreviewManager
      • code_processor module
      • config module
      • conftest module
      • conversation_handlers module
      • database package
        • Submodules
      • duplicate_detector module
        • scan_duplicates()
      • file_manager module
        • BackupInfo
        • BackupManager
        • SkillInfo
        • SkillManager
      • fix_telegram_parse_error module
        • clean_for_telegram()
        • apply_fix()
        • wrap_edit_message_calls()
      • github_menu_handler module
      • github_upload_fix module
        • github_upload_new_file()
        • handle_document_fixed()
        • upload_to_github_fixed()
        • setup_minimal_commands()
        • stats_command_secured()
        • check_commands()
      • handlers package
        • Subpackages
        • Submodules
      • http_async module
        • CircuitOpenError
        • get_session()
        • request()
        • close_session()
      • http_sync module
        • CircuitOpenError
        • get_session()
        • request()
      • i18n package
        • Submodules
      • integrations module
      • integrations_github_monitor module
        • fetch_rate_limit()
        • summarize_rate_limit()
      • integrations_sentry module
        • is_configured()
        • get_recent_issues()
        • search_events()
        • get_issue_events()
      • internal_alerts module
        • emit_event()
        • normalize_alert_details()
        • emit_internal_alert()
        • get_recent_alerts()
      • large_files_handler module
        • LargeFilesHandler
      • lazy_loader module
      • main module
      • metrics module
        • emit_event()
        • generate_latest()
        • track_performance()
        • metrics_endpoint_bytes()
        • metrics_content_type()
        • note_active_user()
        • note_request_started()
        • note_request_finished()
        • get_active_requests_count()
        • get_current_memory_usage()
        • get_recent_errors_count()
        • get_top_slow_endpoints()
        • get_slowest_endpoint()
        • note_deployment_started()
        • note_deployment_shutdown()
        • get_avg_response_time_seconds()
        • record_request_outcome()
        • update_health_gauges()
        • record_startup_stage_metric()
        • record_startup_total_metric()
        • record_http_request()
        • record_request_queue_delay()
        • record_outbound_request_duration()
        • increment_outbound_retry()
        • set_circuit_state()
        • set_circuit_success_rate()
        • get_boot_monotonic()
        • mark_startup_complete()
        • note_first_request_latency()
        • get_process_uptime_seconds()
        • record_dependency_init()
        • record_db_operation()
        • get_uptime_percentage()
        • set_adaptive_observability_gauges()
        • set_external_error_rate_percent()
        • track_file_saved()
        • track_search_performed()
        • track_github_sync()
      • monitoring package
        • Submodules
      • observability module
      • observability_instrumentation module
        • traced()
        • start_span()
        • set_current_span_attributes()
      • observability_otel module
        • setup_telemetry()
      • predictive_engine module
        • emit_event()
        • Trend
        • note_observation()
        • evaluate_predictions()
        • reset_state_for_tests()
        • maybe_recompute_and_preempt()
        • get_recent_predictions()
        • get_trend_snapshot()
      • rate_limiter module
        • RateLimiter
      • refactor_handlers module
      • refactoring_engine module
        • מדיניות וקונפיגורציה
        • מקרה מיוחד: Safe Decomposition ל‑models.py
      • remediation_manager module
        • handle_critical_incident()
        • get_incidents()
      • reminders package
        • Submodules
      • repo_analyzer module
        • emit_event()
        • RepoAnalyzer
      • search_engine module
      • secret_manager module
        • encrypt_secret()
        • decrypt_secret()
      • services package
        • Submodules
      • setup_bookmarks module
        • emit_event()
        • check_mongodb_connection()
        • setup_bookmarks_collection()
        • verify_installation()
        • main()
      • terminal_commands module
        • emit_event()
        • run_in_sandbox()
        • terminal_enter()
        • terminal_exit()
        • terminal_run_command()
        • terminal_command()
        • setup_terminal_handlers()
      • test_basic module
        • test_python_version()
        • test_import_main()
        • test_environment()
        • test_basic_calculation()
        • TestRequirements
      • test_bookmarks module
      • user_stats module
        • UserStats
      • utils module
        • CodeErrorLogger
        • TimeUtils
        • TextUtils
        • SecurityUtils
        • TelegramUtils
        • CallbackQueryGuard
        • AsyncUtils
        • PerformanceUtils
        • ValidationUtils
        • FileUtils
        • ConfigUtils
        • CacheUtils
        • get_memory_usage()
        • setup_logging()
        • generate_summary_stats()
        • detect_language_from_filename()
        • tg_emoji()
        • get_language_emoji()
        • SensitiveDataFilter
        • install_sensitive_filter()
        • safe_zip_entry_name()
        • build_zip_bytes()
        • stash_pending_zip_bytes()
        • load_pending_zip_bytes()
        • cleanup_pending_zip()
        • cleanup_stale_pending_zips()
      • webapp package
        • Submodules
  • מודולים ראשיים
    • File Management
    • GitHub Integration
    • Backup System
    • Code Processing
    • Search Engine
    • Repository Analysis
    • Batch Processing
    • Large Files Handling
    • Cache Management
    • User Statistics
    • Activity Reporting
    • Utilities
    • Lazy Loading
    • Integrations
    • Terminal Commands
    • Autocomplete Manager
  • Handlers
    • זרימת פקודה בסיסית
    • ארכיטקטורת Handlers
    • Show Command
      • Show Command
        • מפרט פקודת /show
        • דוגמת תגובת HTML
        • הערות יישום
        • קישורים
    • Drive Menu
      • Drive Menu V2
        • דגל פיצ’ר
        • זרימות עיקריות
        • התחברות (Device Flow)
        • טיפול שגיאות
        • ניטור
        • API (autodoc)
    • File View Handler
      • File View Handler Module
    • Pagination Handler
    • Save Flow Handler
    • States Handler
    • GitHub Handlers
    • GitHub Menu Bridge
    • Document Flow
      • זרימת הטיפול במסמכים (Document Flow)
        • מפה ותפקידים
        • זרימת טיפול בקובץ
        • מצבי upload_mode
        • תלויות והזרקות
        • Best Practices
        • שכבת אחסון (FilesFacade מול DB הישן)
        • ראו גם
    • Drive Utilities
  • Services
    • Code Service
      • Code Service Module
    • GitHub Service
    • Backup Service
    • AI Explain Service
    • Community Library Service
    • Image Generator Service
    • Snippet Library Service
    • Observability HTTP Service
    • Google Drive Service
      • Google Drive Service
        • סקירה
        • חיבור נפרד לכל שירות (owner)
        • החיבור בוובאפ: קוד ה-state נשמר בשרת
        • עמוד מדיניות הפרטיות (/privacy)
        • הערות OAuth
        • בדיקת חיבור לפני גיבוי (check_connection)
        • כשלים שמוחזרים כ-None
        • מבני קבצים
        • API (autodoc)
  • Database
    • Database Manager
    • Models
      • CodeSnippet Model
      • DatabaseManager Class
    • Database Operations
      • Save Operations
      • Search Operations
      • Delete Operations
      • Statistics Operations
    • אינדקסים בקולקציית users
    • מדריכי מודולים ייעודיים
      • מנהל סימניות – BookmarksManager
        • מתי משתמשים בו?
        • מבנה ואינדקסים
        • מגבלות שימוש
        • תהליך Toggle
        • סנכרון עם שינויים בקובץ
        • אירועים (Analytics)
        • Autodoc
      • מנהל אוספים – CollectionsManager
        • רכיבי בסיס
        • אינדקסים
        • סוגי אוספים
        • תרחישי שימוש נפוצים
        • חוקים ושמירה על איכות
        • שיתוף ציבורי
        • Autodoc
  • MongoDB Indexing Cookbook
    • למה?
    • אינדקסים מומלצים
    • מתכונים (Python / PyMongo)
    • בדיקות explain (Mongo Shell)
    • מה לחפש ב-explain?
    • בדיקת קיום אינדקסים
    • אינדקסים שהם התנהגות, לא אופטימיזציה
    • שיטות עבודה מומלצות
    • דוגמאות נוספות
    • Gotchas נפוצים
  • Cursor-based Pagination (created_at / _id)
    • למה?
    • עקרונות מיון יציב
    • קידוד/פענוח קורסור (Python)
    • תבנית שאילתה (חדש → ישן)
    • PyMongo – דוגמה מלאה
    • דפדוף לאחור (ישן → חדש)
    • בדיקות ידניות (Copy‑Paste)
    • שיטות עבודה מומלצות
    • Gotchas נפוצים
    • קישורים
  • Database Schema
    • Collections
      • code_snippets
      • users
      • bookmarks
      • sessions (WebApp)
    • Indexes
    • Relationships
    • קישורים
  • מבנה נתונים מפורט (Detailed Database Schema)
    • אוסף: code_snippets
    • אוסף: large_files
    • אוסף: users
    • אוסף: bookmarks
    • אוסף: collections
    • אוסף: backups
    • אוסף: sticky_notes
    • אוסף: note_boards
    • יחסים בין אוספים
    • סכמת מערכת Observability - התראות ומטריקות
    • Best Practices
    • קישורים

עזרה ודוגמאות:

  • דוגמאות שימוש
    • שימוש בסיסי
      • יצירת אפליקציית בוט
      • שמירת קוד חדש
      • חיפוש קוד
    • שימוש ב-Handlers
      • יצירת Command Handler
      • יצירת Conversation Handler
    • שימוש ב-Services
      • זיהוי שפת תכנות
      • ניתוח קוד
    • אינטגרציה עם GitHub
      • העלאת קוד ל-Gist
      • שליפת Gists של משתמש
    • עבודה עם מסד הנתונים
      • ביצוע שאילתות מורכבות
      • עדכון קבצים
      • סטטיסטיקות
    • טיפול בשגיאות
      • טיפול בשגיאות בסיסי
      • Retry Logic
    • בדיקות
      • בדיקת יחידה
      • בדיקת אינטגרציה
    • דוגמאות מתקדמות
      • עיבוד באצווה
      • קאשינג
    • שיתוף ציבורי דרך ה‑API (curl)
    • דוגמת Markdown מתקדמת לתצוגה
  • Testing Guide
    • 🚀 Quickstart לטסטים
    • הנחיות קריטיות
    • טעינת Stubs לטלגרם
    • דוגמת שימוש ב‑tmp_path
    • מחיקה בטוחה
    • Mocking HTTP ב‑github_menu_handler
    • השהיות של קוד הייצור בטסטים
    • רישום Blueprint בסביבת טסטים
    • בדיקות מול מונגו אמיתי
      • GLIBC_TUNABLES בשירותי המונגו
      • אימות ביטוי מול גרסת הייצור, בלי לכתוב
    • כיסוי בדיקות (pytest-cov)
    • CI נתמך
    • טסטי Markdown כבדים (md_heavy)
    • בדיקות דפדפן, ותקרת הזמן
    • Sentry בבדיקות
    • מצב שקוד הייצור זוכר בזיכרון התהליך
    • הקפאת זמן ותהליכוני רקע
    • בדיקות ביצועים (Performance)
    • קישורים
  • דוגמאות טסטים – Rate Limiting ואסינכרוניות
    • Rate Limiting (Redis Mock)
    • טסטים אסינכרוניים
  • בדיקות ביצועים (Performance Tests)
    • סימון טסטים
    • הרצה מקומית
    • CI / GitHub Actions
    • דוחות וזמני ריצה
    • טיפים
  • CI/CD Guide
    • חוקים קשיחים
    • סטטוסים נדרשים
    • ריכוז CI (Overview)
    • תווית ה-runner
    • פואמה על PR
    • בדיקות מומלצות
    • בנייה של התיעוד
    • קישורים
  • Conversation Handlers & States
    • רשימת States (מבחר בפועל)
    • Save Flow (תרשים מצבים)
    • GitHub Flow (תרשים מצבים)
    • ספריית סניפטים – זרימת הגשה (Bot)
      • ביטול הוגן
      • התראות אדמין והודעת משתמש
    • דוגמת Handler תמציתית
    • טבלת זרימות מלאה
    • קישורים
    • דוגמאות קוד תמציתיות (ממשיות)
      • Save – שלבים עיקריים
      • GitHub – תפריט ושיחת העלאה
      • Backup – תפריט
      • Drive – תפריט
    • מוקשים נפוצים ופתרונות
      • query.answer()
      • עריכת הודעות בבטחה – ”Message is not modified“
      • Filters
      • Persistent data (context.user_data)
    • דוגמאות טסטים קצרות
      • Save – התחלה וזרימה בסיסית
      • GitHub – upload_conv_handler
  • מצב היועץ (/advisor)
    • כניסה ויציאה
    • הניתוב
    • מה נשמר במסד
    • הגדרות והקריאה למודל
    • בדיקות
  • Troubleshooting Guide
    • שגיאות נפוצות
    • ImportError בזמן טסטים (telegram / ConversationHandler / filters)
    • שגיאות parse_mode
    • שגיאות asyncio: ”attached to a different loop“ / ”Event loop is closed“
    • דיבוג מהיר
    • בדיקת חיבור MongoDB
    • קישורים
  • Development Workflow
    • הוספת Handler חדש
    • הוספת Endpoint ל‑WebApp
    • עדכון Schema במסד הנתונים
    • קישורים
  • Pre-commit Hooks
    • התקנה והרצה
    • Hooks פעילים (עיקריים)
    • טיפים לפתרון בעיות
  • כלי עזר למפתחים
    • tools/analyze_queries.py
      • מטרה
      • דרישות
      • דוגמת הרצה
      • פלט אופייני
      • טיפים
    • tools/dup_scan.py
      • מטרה
      • דוגמת הרצה
      • פרמטרים חשובים
      • Best Practices
  • סקריפטים שימושיים
    • scripts/cleanup_repo_tags.py
    • scripts/migrate_reminder_acked_status.py
    • scripts/dev_seed.py
    • scripts/import_snippets_from_markdown.py
    • scripts/measure_md_parse_cost.py
    • scripts/md_parser_upgrade_zero_diff.py
    • scripts/migrate_workspace_collections.py
    • scripts/run_log_aggregator.py
    • scripts/start_webapp.sh
    • scripts/start_with_worker.sh
    • scripts/run_all.sh
  • בינאום ותמיכה בשפות
    • מבנה הקבצים
    • בחירת שפה בזמן ריצה
    • הוספת שפה חדשה
    • עקרונות כתיבה
    • בדיקות מהירות
  • Integrations
    • GitHub API
      • יצירת Gist (דוגמה)
    • Google Drive (OAuth Flow)
    • Telegram Webhooks vs Polling
    • קישורים
    • GitHub – Scopes נדרשים
    • Troubleshooting GitHub – Rate limits
    • GitHub CLI (gh) – תקציר קצר
    • Repository Providers
    • Best Practices – מאגרים גדולים/Monorepos
  • שרת ה-MCP — חיבור Claude ל-CodeKeeper
    • מה זה נותן
    • ארכיטקטורה בקצרה
    • מודל הריצה של הכלים
    • הכלים
    • הקבועים, התקרות ואוצר המילים של התשובה
    • אימות והרשאות
    • תקרת התשובה — מה כלי מצהיר, ומי אוכף
    • גבולות הבקשה — גודל הגוף והקצב
    • פריימר לסוכן — GET /api/agent/primer
      • עריכה מהדפדפן
    • העלאת תוכן בלי לעבור דרך המודל
      • הראוט — PUT /api/agent/upload
      • upload_id בכלים
      • האחסון
    • הורדת קובץ לדיסק בלי לעבור דרך המודל
      • הראוט — GET /api/agent/download
    • הפעלה — צעד אחר צעד
      • שלב 1 — שירות חדש
      • שלב 2 — מצב בסיס (PAT בלבד)
      • שלב 3 — מצב OAuth (מוסיף את Claude.ai)
      • שלב 4 — דפדפן הריפו (אדמין, אופציונלי)
    • חיבור לקוחות
      • Claude.ai (Custom Connector)
      • Claude Code (טוקן)
      • Claude Desktop
    • דפדפן הריפו — איך זה עובד
      • רענון אוטומטי (autosync)
      • אימות מול GitHub — הטוקן לא נשמר במראה
      • מדיניות סינון סודות
      • התנהגות בזמן sync
    • מדידת שימוש (PostHog MCP Analytics)
      • לכידת הכוונה (context)
      • מצב הקריאה (ck_read_mode)
    • אבטחה — עקרונות
    • פתרון תקלות
    • סעיפים שעברו לעמודים אחרים
    • ראו גם
  • שרת ה-MCP — קבצים ופתקים במסד: גרסאות, עקביות ומחזור חיים
    • עדכון תיאור בלי גרסה חדשה
    • תיאור ארוך בשמירה — description_saved
    • גיל התיאור — description_age_versions
      • מתי החותמת זזה
      • קבצים שנשמרו לפני שהשדה קיים
    • האם זו הגרסה האחרונה — is_latest
    • טביעת אצבע לתוכן — content_sha256 ו-content_changed
      • תשובות הכתיבה: content_changed
      • למה מחשבים ולא שומרים
      • פתקים: note.content_sha256 ו-content_changed
    • כמה עריכות בגרסה אחת — codekeeper_multi_edit_file
      • עריכה על מה שקראתם — expected_content_sha256
    • קריאת פתק בודד — codekeeper_get_note
    • היסטוריית פתקים
    • שרשורי תגובות על פתקים — codekeeper_comment_note
    • התראה כשסוכן שומר קובץ
  • שרת ה-MCP — קריאה, פרסור וחיפוש בתוכן
    • ענף שלא במראה, מול קובץ שלא קיים
    • איזה קובץ docs_get_section קורא, ובאיזה ריפו
    • איפה מפת ה-Markdown חולקת על GitHub
    • איך docs_get_section מוצא כותרת
    • מפת סימבולים (outline)
      • HTML ו-Jinja
      • CSS
      • RST
    • קריאת טווח שורות
    • כמה מופעים יש באמת (total מול total_at_least)
      • החוזה היום
      • איך זה נספר
      • מה לא נכנס לספירה
      • רישיות
      • סינון לפי נתיב (file_pattern)
    • איך מחפשים קובץ ופתק — codekeeper_search_code ו-codekeeper_search_notes
    • חיפוש בתוך קובץ שמור (query)
      • מה ההתאמה עושה, ומה לא
      • מצבי הקצה
    • קריאה לפי סעיף בקובץ Markdown שמור (toc ו-section)
      • איזה קובץ נקרא לפי סעיף
      • מצבי הקצה
      • איפה המפה חולקת על הוובאפ
    • גודל וספירת שורות ברשימת הריפו
    • קריאה קבוצתית — codekeeper_read_batch
      • למה באץ«, ולא קריאות במקביל
      • פריט, ומה הוא מחזיר
      • commit אחד לכל ריפו
      • קריאה אחת לכל קובץ, ושני סדרים
      • תקציב הבתים, ולמה בתים הם גם תווים
      • הדדליין
      • מכסת הקצב, ולמה אין החזר
  • Repository Integrations
    • מצב תמיכה
    • הערות
  • Security Guide
    • סודות ופרטיות
      • ניקוי טוקן הבוט מלוגים, חריגות ו‑Sentry
    • הרצת קוד (Code Execution Playground)
    • הצפנת טוקנים (דוגמה)
    • CSRF ב‑WebApp
    • Rate Limiting (דוגמה)
    • קישורים
    • אבטחת הודעות בטלגרם
  • Smart Observability v7 – Predictive Health & Adaptive Feedback
    • חיבור Grafana → Telegram (Webhook)
    • Grafana Annotations
    • Adaptive Thresholds (ספים דינמיים)
    • הפרדה בין שגיאות פנימיות לחיצוניות
    • Predictive Health (v7)
      • SAFE_MODE ודילוג על פעולות מנע
      • ChatOps
      • הרשאות ChatOps ו-Rate Limit
      • Grafana – ייבוא דשבורד לדוגמה
    • Grafana – Accuracy & Prevention Panels
      • תרשים זרימת Feedback Loop
    • Auto‑Remediation (v5)
      • Incident Memory
      • Feedback Loop לאירועים חוזרים
    • ChatOps – /observe
      • הרחבות מצב מפורט
    • Endpoints
    • קישורים לתיעוד ChatOps
    • טיפים
  • Git LFS Integration
    • מתי להשתמש ב‑LFS
    • התקנה בסיסית
    • Best Practices
    • מגבלות וגבולות
    • קישורים
  • סימניות (Bookmarks)
    • מהן סימניות?
    • איך להוסיף סימנייה
    • פאנל הסימניות
    • Anchor יציב
    • מגבלות, אבטחה ופרטיות
    • API קצר (למפתחים)
    • הערות שימושיות
  • פתקים דביקים (Sticky Notes)
    • מהם פתקים דביקים?
    • איך מוסיפים ומנהלים פתקים
    • עיגון יציב לעומת מיקום קבוע
    • שילוב עם סימניות
    • מגבלות, פרטיות ואבטחה
    • לוחות פתקים
      • שם, ביטול והעתקה
      • תפריט ⋮
      • צבע הפתק
      • חיפוש בפתקים
      • גלילה אינסופית בלוח
      • צ’קבוקסים בפתק
      • עיצוב מארקדאון
      • חיפוש בתוך פתק
      • גודל הטקסט בפתק
      • כתב יד
      • לוחות דרך MCP
      • תזכורות בפתקי לוח
    • פתקים על קבצי ריפו
      • יתומים
      • פתקי ריפו דרך MCP
      • חיפוש פתק לפי שם
    • שרשורי תגובות על פתקים
    • ארכיון
    • טיפים שימושיים
    • API קצר (למפתחים)
    • התראות ותזכורות (Reminders)
      • איורים
    • Troubleshooting קצר
      • בעיות נפוצות בתזכורות
  • תזכורות בבוט
    • פקודות עיקריות
    • איך הוויזרד עובד
    • טיפים לשימוש בפקודה מהירה
    • ניהול התזכורות
    • מגבלות ומדיניות
    • מתזמן והתאוששות
    • חיבור לקוד
    • קישורים
  • האוספים שלי (My Collections)
    • יכולות מרכזיות
    • איך משתמשים
    • תיוג פריטים באוספים
    • שילוב עם סימניות ופתקים דביקים
    • מגבלות ופרטיות
    • API קצר (למפתחים)
    • טיפים
    • מובייל/טאבלט – גרירה לסידור
    • לוח Kanban עבור שולחן העבודה
  • שיתוף קוד (חשוב)
    • מה זה עושה?
    • איפה הכפתור מופיע?
    • איך זה עובד (זרימה)
    • דרישות
    • מגבלות והתנהגות
    • הודעות הצלחה/שגיאה
    • Troubleshooting קצר
    • דוגמאות (טקסטואליות)
  • עיון בקוד GitHub (כולל חיפוש בשם קובץ)
    • שורת כלים
    • תוצאות חיפוש
    • ניווט ריפו
  • הורדת ריפו
    • מה בדיוק מוריד
    • הורדת תיקייה כ־ZIP
      • לאן נשמר
      • שם הקובץ
    • מגבלות
    • הודעות נפוצות
  • תכנית בדיקות לבוט – Composition Root (Container) לשירות Snippet
    • איך לבדוק
    • סט דוגמאות לשמירה (Copy/Paste)
    • בדיקות נוספות
    • תקלות שכדאי לעקוב אחריהן
    • בדיקות זרימה מורחבות (לאחר מעבר ל-Facade/Container)
      • 1) שמירה/תצוגה/עריכה (קבצים רגילים)
      • 2) קבצים גדולים
      • 3) מסמכים/העלאות
      • 4) Google Drive
      • 5) ChatOps – זיהוי שפה (שקיפות ודיבוג)
      • 6) רגרסיה כללית

זרימות עבודה:

  • זרימות עבודה (Workflows)
    • רשימת זרימות
      • זרימת שמירת קוד (Save Flow)
        • סקירה כללית
        • מצבי שמירה
        • זרימת עבודה בסיסית
        • מצב איסוף ארוך (LONG_COLLECT)
        • זיהוי סודות (Secrets Detection)
        • טיפול בכפילויות
        • ניקוי קוד מודבק
        • Edge Cases
        • קישורים
      • זרימת חיפוש (Search Flow)
        • סקירה כללית
        • סוגי חיפוש
        • זרימת עבודה
        • מבנה SearchIndex
        • פילטרים
        • טיפול בשגיאות Regex
        • מיון תוצאות
        • חישוב Relevance Score
        • Edge Cases
        • קישורים
      • זרימת רפקטורינג (Refactor Flow)
        • סוגי רפקטורינג
        • זרימת עבודה
        • שימוש בבוט (Telegram)
        • CodeAnalyzer
        • יצירת הצעת רפקטורינג
        • אימות לפני ואחרי
        • ייצוא לגיסט (אופציונלי)
        • שמירת גרסה
        • Edge Cases
        • מדיניות קיבוץ ופיצול (Cohesion Policy)
        • Smart Clustering ו‑Cycle Guard
        • Safe Decomposition ל‑models.py
        • שמות קבצים דומייניים (Canonical)
        • מצב שכבות (Layered)
        • פרמטרים ניתנים לכוונון
        • מגבלות ידועות
        • קישורים
      • זרימת גיבוי ושחזור (Backup Flow)
        • סקירה כללית
        • סוגי גיבויים
        • יצירת גיבוי מלא
        • שחזור מגיבוי
        • גיבוי ל-Google Drive
        • ניהול גיבויים
        • ייבוא ZIP חיצוני
        • Edge Cases
        • קישורים
      • זרימת שיתוף ב-Gist (Gist Flow)
        • סקירה כללית
        • נקודות כניסה
        • זרימת עבודה בסיסית
        • אימות הטוקן — למה יש שורה שנראית מיותרת
        • שלושת מצבי auth_failed
        • למה שתי הודעות ולא אחת
        • Fail-closed
        • Edge Cases
        • קישורים
    • קישורים

מנועי המערכת:

  • מנועי המערכת (System Engines)
    • מנוע חיפוש (Search Engine)
    • מנוע רפקטורינג (Refactoring Engine)
    • יכולות מתקדמות (Smart Clustering, Cycle Guard)
    • מצב שכבות (Layered Mode)
    • Safe Decomposition ל‑models.py (פיצול בטוח לחבילת models/)
    • מעבד קוד (Code Processor)
    • מנוע ניתוח (Code Analyzer)
    • מנוע גיבויים (Backup Service)
    • מנוע אינטגרציות (Integration Services)
    • מנוע Observability
    • קישורים

Edge Cases וטיפול בשגיאות:

  • Edge Cases וטיפול בשגיאות
    • קבצים גדולים
    • קידודים לא סטנדרטיים
    • GitHub Rate Limits
    • MongoDB Connection Errors
    • Redis Unavailability
    • שגיאות Parsing
    • שגיאות File I/O
    • שגיאות Network
    • שגיאות Validation
    • שגיאות Concurrent Access
    • Best Practices
    • קישורים

איכות וקונבנציות:

  • 📝 Type Hints – Best Practices
    • אסטרטגיה: הקשחה הדרגתית
    • פרוטוקולים וסטאבים
    • דוגמאות מהקוד
    • הגדרות MyPy
    • מסלול מיגרציה
    • הנחיות לסוכנים
    • דוגמאות קצרות
  • ניקוי קוד מודבק (Pasted-code cleanup)
    • הכלל: שמירה שומרת בדיוק את מה שנשלח
    • החריג: קוד שמודבק בבוט
    • תווים שמשנים את סדר התצוגה
      • איפה מוצגת אזהרה
      • איפה עדיין אין אזהרה
    • הוובאפ: פענוח של השליחה, לא ניקוי
    • ה-MCP
    • כשמוסיפים כניסה חדשה
    • טסטים
    • קישורים
  • כללי שכבות – CodeBot
    • שכבות
    • Composition Root
    • זיהוי שפה – מקור אמת
    • בדיקות אכיפה

WebApp:

  • המיני Web App (סקירה)
    • מה נותן?
    • דשבורד חדש
      • אייקוני שפה אחידים
      • הנחיות לסוכני AI
    • כתובת והרשאות
    • הגדרות ENV
    • קישורים ותמונות מסך
    • ראו גם
    • באנר הכרזות בראש המסך
      • איך מפעילים?
      • הערות וקישורים
      • מה קורה מאחורי הקלעים?
      • כיבוי זמני
      • המלצות לתוכן
  • דפדפן קוד (Code Browser)
    • ייבוא ריפו חדש
    • הגדרת סנכרון אוטומטי
      • הגדרת Webhook ב-GitHub
      • בדיקת הגדרת ה-Webhook
      • מה קורה לג’וב סנכרון
      • דיסק בלי mirrors: המילוי בעלייה
    • משתני סביבה נדרשים
    • תצוגה מרונדרת (Markdown ועמודי תיעוד)
      • עמודי התיעוד (rst)
      • חיפוש בתוך הקובץ בתצוגה המרונדרת
    • התוכן כמו שהוא בריפו, ומי רואה אותו
    • ראו גם
  • ממשקי משתמשים (Web)
    • היכן זה נמצא?
    • מסכים בולטים
    • גרסאות: צפייה והשוואה
      • השוואה בין שתי גרסאות
    • סל המיחזור: שורה לכל קובץ
    • הצ’קליסט ”צעדים ראשונים“ בדשבורד
    • זרימת עבודה דרך הבוט
    • שדות חובה ולוגיקת ולידציה
    • חיווי מצב תהליך
    • ממשק אדמין
    • דוגמאות שימוש לסוכני AI
    • אבטחה ופרטיות
    • הערות תאימות
  • גלריית צילומי המסך (/gallery)
    • הצילומים והכיתובים
    • החלפה או הוספה של צילום
    • המעבר בין הצילומים
    • שיתוף, cache ומגבלת קצב
  • העורך הציבורי (/markdown-editor)
    • הערכה
    • טקסט ההדגמה
    • העורך, התצוגה החיה וסרגל ה-MD
    • הטיוטה והכפתורים
    • ייצוא HTML מעוצב
    • העזרים המשותפים של עמודי העורך
    • מנועי חיפוש
    • הבדיקות
  • ספריית סניפטים (Web)
    • מאפייני UI
    • API – JSON
      • OpenAPI (תקציר)
      • JSON Schema (Response)
      • כללי דפדוף/ספירה
      • שגיאות
      • דוגמאות cURL
    • הגשות, אישור וניהול (אדמין)
    • ייבוא מסמך (אדמין)
    • הגשה דרך הבוט
    • UI בבוט – הסרות ושיפורים
    • גרסה משודרגת – מה חדש
    • מדריך קצר לסוכני AI
  • Caching & HTTP Validators (ETag / Last-Modified / 304)
    • למה זה חשוב?
    • עקרונות בסיס
    • מתכון: Flask + werkzeug
    • בדיקות ידניות (Copy‑Paste)
    • Checklist למימוש נכון
    • Gotchas נפוצים
    • שילוב עם Cache-Control
    • קישורים נוספים
  • מערכת Caching מתקדמת עם TTL דינמי
    • עקרונות
    • קוד לדוגמה
    • דגשים תפעוליים
    • Warmup לנכסי Frontend
    • קישורים
  • Cache Inspector (לוח בקרה של Redis)
    • מה זה Cache Inspector?
      • למה צריך את זה?
    • איך נכנסים?
    • יכולות עיקריות
      • סטטיסטיקות כלליות
      • חיפוש מפתחות
      • הצגת TTL וסטטוס
      • פעולות מחיקה
    • אבטחה ובטיחות
      • הגנת הרשאות
      • הסתרת מידע רגיש (Masking)
      • שימוש ב-SCAN במקום KEYS
      • תקציב זמן למחיקות
    • API Endpoints
      • דוגמאות API
    • תקלות נפוצות
      • Redis מושבת
      • אין הרשאות
      • חיפוש איטי
    • משתני סביבה רלוונטיים
    • ראו גם
  • Config Inspector (סקירת משתני סביבה)
    • מה זה Config Inspector?
    • איך נכנסים?
    • שני עמודים — ולמה
      • עמוד 1: שירות ה-Webapp (עם Status וערך פעיל)
      • עמוד 2: שירותים אחרים — Bot / MCP / Webserver
    • ארבעת הסטטוסים — ואיך נמנעים מ-”Modified“ שגוי
    • לאיזה שירות שייך המשתנה? — לבדוק, לא לנחש
    • משתנה שמשרת כמה שירותים — לתעד בכל המקומות
    • מתי הערך נקרא — ומה קורה כשהוא שגוי
      • שתי הצורות בקוד
      • מה זה אומר בפועל
      • שלוש מלכודות
      • הגדרה ברנדר — שלוש אפשרויות שמירה
    • מיסוך ערכים רגישים
    • צ’קליסט: הוספת משתנה סביבה חדש
    • מדידת הפער ואכיפתו
    • ראו גם
  • MCP Analytics (מדידת השימוש בכלי ה-MCP)
    • מה זה
    • מאיפה הנתונים מגיעים
    • תקרת שורות ומאיפה מגיעה הספירה
    • סימון ”טופל“ / ”נדחה“ בכלים חסרים
    • מיון והעתקה
      • פרמטרים
      • העתקה
    • משתני סביבה
    • מצבי כשל
    • תקציב זמן
    • אבטחה
    • איך העמוד מציג את ההודעה, ואיך קוראים אותה
    • ”X שגיאות חדשות מאז הביקור האחרון“
    • הטורים שנוספו, ומה הם לא אומרים
    • מה שאי אפשר להביא לכאן, ולמה
    • עיצוב
    • טסטים
    • ראו גם
  • Static Performance & Security Checklist (gzip/br, Cache, SRI)
    • דחיסה (br/gzip)
    • כותרות Cache-Control
    • Subresource Integrity (SRI)
    • בדיקות ידניות (Copy‑Paste)
    • Best Practices
    • Gotchas
  • תחזוקת קטלוג הפקודות (commands.json)
    • מבוא
    • מבנה הנתונים (Schema)
    • דוגמת JSON
    • הנחיות סיווג (Taxonomy)
      • טיפים לזיהוי אוטומטי
    • צ’ק-ליסט להוספת פקודה
    • בדיקות
    • כרטיסיות חדשות (דצמ« 2025)
  • חיפוש גלובלי — סוגי החיפוש
    • איפה זה בממשק
    • סוגי החיפוש
      • תוכן
      • טקסט
      • Regex
      • מטושטש
      • פונקציות
      • חיפוש חכם
      • תיעוד
    • כשהסוג שבחרתם לא מוצא כלום
    • מגבלות
    • האינדקס בזיכרון
    • קאש
    • השלמה אוטומטית
    • לא לבלבל עם
    • אינדקס התיעוד
      • מה נכנס לאינדקס
      • המעבר
      • עמוד האדמין
      • הגדרה חד-פעמית
    • ראו גם
  • הרצת קוד (Code Execution Playground)
    • איפה זה ב‑UI?
    • הרשאות (Premium/Admin)
    • Feature Flag (זמינות הפיצ׳ר)
    • API
      • GET /api/code/run/limits
      • POST /api/code/run
    • אבטחה: מה יש ומה חשוב להבין
      • Docker sandbox (מומלץ)
      • חסימת קוד ”מסוכן“
      • לוגים ופרטיות
    • Fail‑Closed מול Fallback
    • תפעול מומלץ בפרודקשן (Runner נפרד)
    • Troubleshooting
      • ”אין כפתור Run“
      • enabled=false ב‑/api/code/run/limits
      • docker_available=false ב‑limits
    • Known Limitations
  • WebApp API Reference
    • Endpoints
    • Authentication Flow
    • Response Schema Example
    • Errors
    • שגיאות נפוצות – POST /api/shared/save
    • קישורים
    • מסנן ושדות קלט ל-/files
      • טבלת פרמטרים
      • דוגמאות בקשה
      • דוגמאות תגובה
  • Bulk actions (בחירה מרובה)
    • סקירה
    • Endpoints
      • POST /api/files/bulk-favorite
      • POST /api/files/bulk-unfavorite
      • POST /api/files/bulk-tag
      • POST /api/files/create-zip
      • POST /api/files/bulk-delete (Soft Delete)
      • POST /api/files/create-share-link
    • שגיאות נפוצות
    • הערות למפתחים
  • ⌨️ עורך קוד (WebApp Editor)
    • טעינת CodeMirror ומצב isLoading
    • החבילה המקומית של CodeMirror, וכיוון לכל שורה
    • שמירת העדפות משתמש – שני נתיבי API
    • המלצות
  • Markdown – מצב מצומצם (קיפול כותרות ###) – אדמין בלבד
    • מאפיינים עיקריים
    • הזרקת דגל הרשאה לתבנית
    • עקרונות המימוש בצד הלקוח
    • צ’ק‑ליסט לפיצ’רים מקומיים דומים
  • מדריך סגנונות וארכיטקטורת Markdown
    • 1. סקירה טכנית (Architecture)
    • 2. מערכת הצבעים (Reader Mode)
    • 3. קטלוג רכיבים (Component Gallery)
      • Admonitions
      • Tables
      • Task Lists
      • Mermaid
      • Details / Summary
      • Code Blocks
      • Highlight (==מארקר==)
      • נוסחאות ($...$, $$...$$)
    • 4. הנחיות למפתחים (Best Practices)
  • Smooth Scrolling (WebApp) — מדריך תמציתי לסוכני AI
    • המצב הנוכחי
    • למה כבוי
    • מה נשאר פעיל
    • הדלקה לניפוי בלבד
    • מה המודול עדיין יודע לעשות כשמדליקים אותו
    • הנחיות לסוכני AI
    • קישורים פנימיים
  • מודולים פנימיים ב-WebApp
    • activity_tracker.py – דגימת פעילות משתמשים
    • community_library_api.py – REST עבור אוסף הקהילה
    • community_library_ui.py – תצוגת Web
    • snippet_library_api.py ו-snippet_library_ui.py
    • push_api.py – Web Push Subscriptions
    • workspace_api.py – ניהול Kanban (Workspaces)
    • config_radar.py – רנטגן קונפיגורציה
    • איך להשתמש בעמוד זה

Frontend > Theming

  • מערכת ערכות הנושא והטוקנים החדשה
    • רקע ומוטיבציה
    • שכבות משתנים וטעינת data-theme
      • תרשים זרימת היררכיית טוקנים
    • טבלת טוקנים עיקריים
    • מפת ערכות הנושא (Theme Reference)
    • Markdown Viewer ו‑Split View
    • הנחיות למפתחים (Best Practices)
      • דוגמת קוד – לא תקין לעומת תקין
    • Component Tokens ו‑Theme Builder
    • בדיקות חובה לפני Merge
    • שימושים נוספים וחריגים
    • קישורים ונספחים
  • ערכות נושא מותאמות אישית – מדריך מקיף
    • מבוא וסקירה כללית
      • מהי ערכת נושא מותאמת אישית?
      • ההבדל בין Presets לבין Custom Themes
      • יכולות המערכת
    • ייבוא ערכות VS Code
      • פורמטים נתמכים
      • מבנה ערכת VS Code
      • מיפוי צבעי UI
    • יצירה ידנית (Native Format)
      • מבנה הפורמט המקומי
      • משתנים חובה
      • רשימת משתנים מלאה (Whitelist)
    • דריסת טוקן שאין לו מקבילה ב-VS Code
      • הצעות ההשלמה בחיפוש הגלובלי
      • בלוקי הקוד בתצוגת ה-Markdown של דפדפן הריפו
      • הטקסט בכפתורי primary
      • ערכה מיובאת בהירה: שדות טופס, הפיד והפוש בדשבורד, ושורת החיפוש ב-Markdown
    • הדגשת תחביר (Syntax Highlighting)
      • ארכיטקטורה
      • מיפוי VS Code Scopes ל-CodeMirror Tags
      • מנגנון Fallback
      • CodeMirror CSS Classes
    • אבטחה וולידציה
      • ולידציית צבעים
      • סניטציה
    • API Reference
      • Endpoints
      • מבנה תגובה
    • פרסום ערכה לציבורית (Shared Themes)
      • מבנה נתונים ב-DB
      • שמירת משתנים בפרסום
    • פתרון בעיות (Troubleshooting)
      • בעיות נפוצות
      • דוגמה לייבוא ערכת Nord
    • קישורים קשורים
  • אייקוני שפות התכנות
    • למה זה נבנה כמערכת ולא כהחלפה נקודתית
    • המבנה
      • צד השרת
      • צד הלקוח
    • גדלים
      • למה 44px ולא 32px
    • הוספה או שינוי של אייקון
      • מבנה קובץ אייקון
      • שמות נרדפים
    • נגישות
    • מלכודות שכבר נתקלנו בהן
      • הסתרת הספרייט
      • הטמעה inline ולא כקובץ חיצוני
      • שני מסלולי רינדור לאותו מסך
    • הנחיות לסוכני AI
    • בדיקות

Observability

  • אובזרווביליות (Observability)
    • מטרות
    • קהלי יעד
    • תצורה
    • בחירת Backend ל־Traces
    • הגדרת OTLP לסביבות
    • קישורים
    • אינסטרומנטציה ידנית (Manual Instrumentation)
    • דוקר קומפוז – הפעלה מהירה עם Jaeger
      • Quick start – אימות ספאנים ב־Jaeger
    • כיסוי דקורטור @traced
    • אימות ב-Staging
  • Background Jobs Monitor
    • סקירה כללית
    • רכיבים וקוד רלוונטי
    • מסד נתונים
      • קולקציה: job_runs
      • פיוס הרצות יתומות
    • UI / WebApp
      • גישה לדשבורד
      • מה רואים בדשבורד
      • Jobs סטטיים vs. דינמיים
    • API Reference
      • GET /api/jobs
      • GET /api/jobs/active
      • GET /api/jobs/{job_id}
      • GET /api/jobs/runs/{run_id}
      • POST /api/jobs/{job_id}/trigger
    • אבטחה
      • הגנה על ה-API
    • ENV וקונפיגורציה
      • משתני סביבה
    • ChatOps – פקודת /jobs
      • פקודות זמינות
      • דוגמאות
    • Alerts
      • הגדרות ב-alerts.yml
      • Flow של Alerts
    • Troubleshooting
      • ”הטריגר לא עובד“
      • ”אין jobs דינמיים בדשבורד“
      • ”לא מגיעים Alerts“
      • ”Job תקוע אבל אין התראה“
      • ”השרת מחזיר 401/403“
      • ”לוגים ריקים בדשבורד“
    • Best Practices
    • ראו גם
  • 📡 Observability Dashboard & API
    • 🖥️ סקירת הממשק /admin/observability
      • חלוקת הדף
      • יכולות סינון
      • מקרא ו־UI
      • 🤖 הסבר AI להתראות
    • 📚 API Reference
      • פרמטרי זמן משותפים
      • GET /api/observability/alerts
        • Meta מועשר להתראות High Error Rate
      • GET /api/observability/aggregations
      • GET /api/observability/timeseries
      • GET /api/observability/replay
      • Runbooks דינמיים + Quick Fix
      • GET /api/observability/export
      • POST /api/observability/quickfix/track
      • POST /api/observability/alerts/ai_explain
    • 🔐 אבטחה, Rate Limiting וקאש
    • 🔌 אינטגרציות ודוגמאות שימוש
      • Grafana / BI
      • Slack / On-call Bot
      • שילוב עם Config Radar
      • רפרנס ל־README
    • ✔️ מה הלאה?
  • Query Performance Profiler
    • Overview
      • קהל יעד
      • מה הכלי לא עושה
    • ממשק משתמש (WebApp)
      • הנתיב
      • איך להגיע
      • מה רואים בדשבורד
    • API Reference
      • Authentication
      • Endpoints
        • GET /api/profiler/summary
        • GET /api/profiler/slow-queries
        • GET /api/profiler/patterns
        • ערכים אמיתיים לשאילתות שלך (query_raw)
        • POST /api/profiler/explain
        • POST /api/profiler/recommendations
        • GET /api/profiler/collection/<name>/stats
    • Security
      • Authentication
      • הגדרת Token
    • אזהרת Observer Effect
    • Privacy / PII
    • Persistence
      • Collection
      • TTL Index
      • אינדקסים נוספים
    • Metrics (Prometheus)
    • Environment Variables
    • המלצות אופטימיזציה נפוצות
    • קישורים נוספים
  • 🧠 Quick Fix חכם (Queue Delay + עומס/DB) – הנחיות למפתחים ולסוכני AI
    • איפה זה מופיע
    • מקור אמת: איפה החוקים חיים
    • טבלת החלטה (Latency / Slow Response)
    • אילו שדות אנחנו משתמשים בהם (סכמת נתונים)
      • אותות עיקריים
      • עומס ומשאבים
      • “DB Pool utilization”
    • עקרונות Safety (חשוב)
    • איך להוסיף/לשנות חוק (צ’קליסט למפתחים ול‑AI)
    • הערות לסוכני AI (איך לעבוד נכון)
  • Asyncio תחת WSGI: הרצת קורוטינות בבטחה
    • רקע קצר
    • התסמינים
    • למה ה-fallback ל-thread לא עוזר
    • הכיוון הנכון
    • Checklist לפני דיפלוי
    • איך בודקים את זה
  • Visual Rule Engine - מנוע כללים ויזואלי
    • סקירה כללית
    • זרימת ההחלטה
    • UI Walkthrough
      • גישה למסך הכללים
      • יצירת כלל חדש
      • הפעלה/כיבוי כלל
      • מחיקת כלל
    • מבנה הכלל (JSON Schema)
      • שדות הכלל
      • דוגמה 1: כלל פשוט (Suppress)
      • דוגמה 2: כלל עם Group (AND)
      • דוגמה 3: OR עם NOT פנימי
      • דוגמה 4: GitHub Issue לשגיאות Sentry חדשות
    • פעולות (Actions)
      • suppress
      • send_alert
      • create_github_issue
      • webhook
    • Evaluation Context - שדות זמינים
      • שדות בסיסיים מההתראה
      • שדות מ-details
      • שדות מדדים
      • שדות זמן (מחושבים)
    • אופרטורים
    • אבטחה
      • הרשאות אדמין
      • Webhook SSRF Protection
    • הסימולטור
    • משתני סביבה
    • פתרון בעיות
      • ”הכלל לא רץ“
      • ”webhook נחסם“
      • ”is_new_error תמיד False“
      • ”GitHub Issue לא נוצר“
    • Test Plan
    • API Reference
    • קישורים
  • Coverage Report (Runbooks / Quick Fixes)
    • מטרה
    • מקור האמת (Catalog / Registry)
    • הגדרות כיסוי (Matching)
      • Runbooks
      • Quick Fixes
    • מה מוצג בדוח
    • API
  • 🧠 Observability AI Explain API
    • 🔐 אימות ובקרות
    • 📥 בקשה (POST /api/ai/explain)
    • 📤 תגובה מוצלחת (200 OK)
    • ❗ קודי שגיאה
    • ⚙️ קונפיגורציה נדרשת
    • 🧪 בדיקות
    • 📝 טיפים לפריסה
  • Rate Limiting
    • Shadow Mode
    • Soft‑Warning (80%)
    • Admin Bypass
    • Monitoring
    • Troubleshooting
    • קישורים
  • 📊 הנחיות Observability ואירועים
    • תבנית אירוע/לוג – שדות חובה
    • עקרון Fail-Open
    • הנחיות טיפול בשגיאות
    • קורלציה עם request_id
    • סטנדרטים נוספים
  • סכמת לוגים
    • שדות חובה
    • שדות מומלצים
    • דוגמה
    • דגימה (Sampling)
      • מה אומר היעדר של שורה
    • פרטיות
    • טקסונומיית שגיאות (Error codes)
  • מדדים (Metrics)
    • נקודת קצה
    • מטריקות קיימות
    • מדדי CodeBot ייעודיים (Handlers/Commands/DB)
    • מטריקות OpenTelemetry (אם זמינות)
    • דוגמאות PromQL
    • Tracing ב-Grafana
    • SLO/SLI לדוגמה
    • התראות (Prometheus alerting rules)
  • Resilience לשירותים חיצוניים
    • למה שכבה מרוכזת?
    • איך זה עובד?
    • דיאגרמת טיפול בשגיאות
    • קונפיגורציה חשובה (ENV)
    • טיפ
    • שימוש בקוד
    • ראו גם
  • התראות (Alerts)
    • סקירה מהירה
    • חוקי ברירת המחדל
    • התאמה לצרכים שלך
    • מדדי Health ו-Startup ל-Prometheus
    • קונפיגורציית alert_manager באפליקציה
    • טעינת שינויים
    • בדיקת הזרימה בקצה השני
    • טיפים אחרונים
    • ראו גם
    • התראות מערכת – דיסק כמעט מלא
  • התראות מבוססות לוגים (Log‑based Alerts)
    • מה זה ולמה
    • הרכיבים בקוד
    • קבצי קונפיג
      • דוגמה מינימלית: config/error_signatures.yml
      • דוגמה מינימלית: config/alerts.yml
    • Option B – חיבור בתוך הקוד (מומש)
      • משתני סביבה
    • Option A – Sidecar מזרם לוגים
    • ספים וקיבוץ – ברירות מחדל
    • אסטרטגיית fingerprint וקנוניקליזציה
    • צ’קליסט למפתחים
    • בדיקה מקומית (סימולציה)
    • הנחיות לסוכני AI
    • אבטחה ופרטיות
    • Rollout מומלץ
    • Troubleshooting
    • ראו גם
    • קישורים לקוד
    • טקסונומיית שגיאות וחתימות
      • תרשים זרימה מקוצר
    • תצוגה ב‑ChatOps
      • פלט לדוגמה (Placeholder)
    • קריאת המשך – classify_error()
  • מנוע ניתוח לוגים (Log Event Aggregator)
    • ארכיטקטורה
    • קונפיגורציה וקבצים
    • הרצת CLI מקומית
    • שילוב במערכת
    • עבודה בטוחה
    • ניפוי תקלות נפוץ
  • Sentry
    • הפעלה (משתני סביבה)
    • התראות ל־Telegram וללוח Observability
      • איפה להגדיר משתנים
      • מה צריך כדי שזה יופיע בלוח Observability
      • מה צריך כדי שזה יישלח לטלגרם
      • Polling – משתנים רלוונטיים
      • Webhook – אבטחה ודה-דופליקציה
    • עקרונות
  • Incident Checklist (On‑Call)
    • בעת פתיחת Incident
    • סטטוסי מעקב אחידים
    • קישורים
  • שינוי רמות לוגים
    • מתי להעלות ל-DEBUG
    • טיפ
  • GitHub Backup & Restore Runbook
    • דרישות מקדימות
    • יצירת נקודת גיבוי (Checkpoint Tag)
    • יצירת ארכיון ZIP
    • שחזור – בדיקה מקומית
    • שחזור מלא לפרודקשן (זהירות!)
    • שחזור קבצים/תיקיות נקודתיים
    • טיפים ובטיחות
    • קישורים
  • Runbooks – SLO Incidents
    • HighErrorRate
    • SLOAvailabilityBreach (זמינות < 99.9%)
    • SLOLatencyP95Breach (P95 > 0.5s)
    • תקלת התחברות ל‑DB (MongoDB) – קריטי
      • סימפטומים
      • סדר פעולות (בקצרה)
    • איטיות/נפילה של שירות חיצוני – בינוני
      • סימפטומים
      • סדר פעולות
    • באג אחרי Deploy / Release – משתנה
      • סדר פעולות
    • דשבורד

פריסה ו-Workers

  • עובדי Push
    • דרישות מוקדמות
    • מסלול מקומי (pywebpush)
      • תקרת זמן למסירה מקומית
    • Node Push Worker (/push_worker)
    • חיבור ל-WebApp (webapp/push_api.py)
    • מי שולח את התזכורות, ומתי
    • המקור השני: כתיבה שהגיעה מ-MCP
    • המקור השלישי: תגובה של סוכן על פתק
    • צד הלקוח
    • בדיקות ועצות

ChatOps

  • ChatOps – סקירה כללית
    • עקרונות
    • קישורים
  • פקודות ChatOps
    • כרטיסיות חיפוש (Ctrl/Cmd+K)
    • /status
    • /health
    • /uptime
    • /system_info
    • /check commands
    • /metrics
    • /observe
    • /observe -v (מפורט)
    • /observe -vv (מפורט מאוד)
    • /errors
      • סטטוסי תוצאות (Mappings)
    • /alerts
    • /jobs
    • /incidents
    • /triage
    • /predict
    • /accuracy
    • /rate_limit
    • /enable_backoff
    • /disable_backoff
    • /sen
    • /lang
    • /lang_debug
    • /dm
    • /ban
    • /unban
    • /blocked
    • /silence
    • /unsilence
    • /silences
    • /cache_stats
    • /clear_cache
    • /cache_warm
    • /cache_clear_stale
    • /debug_cache
    • /status_worker
    • /version_history
  • ChatOps – /observe: הרחבות -v ו- -vv
    • תחביר ופרמטרים
    • דוגמאות
    • פלט לדוגמה – ‎-v
    • פלט לדוגמה – ‎-vv
    • הערות שימוש
    • קישורים רלוונטיים
  • הגבלת קצב לפקודות רגישות
    • עקרונות מרכזיים
    • שימוש בדקורטור
    • קונפיגורציה
    • שילוב בבוט
    • Autodoc
  • Playbooks – תרחישים נפוצים
    • p95 Latency עלה מעל הסף
    • Error Rate > 1%
    • Memory Usage מטפס
    • שירות חיצוני איטי
    • Repeated Incident תחת 15 דק«
  • הרשאות ו-Rate Limit
  • פתרון תקלות (FAQ)
  • שאלות נפוצות

סוכני AI:

  • 🤖 מדריך לסוכני AI
    • נקודת פתיחה מהירה
    • מבנה הפרויקט (בקצרה)
    • הוספת פיצ’רים
    • סקריפטים חשובים
    • מפת דרכים
    • GitHub Issues ו-ChatOps
  • 🚦 מערכת Rate Limiting לסוכני AI ולווב
    • אסטרטגיה – Shadow Mode תחילה
    • משתני סביבה וקונפיג
    • אינטגרציה – בוט טלגרם
    • אינטגרציה – Flask/WebApp
    • החרגות חשובות
    • ניטור ומדדים (Prometheus)
    • אבטחה והגנות
    • קונפיגורציה (Pydantic Settings)
    • תקלות נפוצות
    • קישורים

Observability – Advanced

  • קטלוג אירועים קנוניים
    • GitHub
    • DB
    • Metrics (DB)
    • Web/Share
    • Alerts
    • Web Push
    • Jobs
    • מילוי ה-mirrors בעליית הוובאפ
    • Google Drive
    • אינדקס התיעוד
    • פתקים דביקים
    • Repo Analyzer
    • Business
  • מילון קודי שגיאה (Error Codes)
    • דוגמאות מיפוי
    • הנחיות
  • Tracing ממוקד בנקודות חמות
    • תרשימי זרימה
      • זרימת bot.update
        • מאפיינים מומלצים ל‑Spans (bot.update)
      • זרימת web.request
        • מאפיינים מומלצים ל‑Spans (web.request)
    • טבלת ”היכן עוטפים“
    • דוגמת Trace Viewer
    • הטמעת דקורטור ושימוש בפונקציות עזר
    • Best Practices
    • ראו גם
  • שאילתות PromQL שימושיות
    • זמן תגובה (Latency)
    • שיעור שגיאות
    • אירועי ביזנס
  • Playbook קצר להתראות
    • זרימה
    • דיאגרמת מערכת התראות חכמות
    • קישורים בקוד
    • דגשים
    • כיוונון רעש
    • טיפים מהירים
Code Keeper Bot
  • חיפוש גלובלי — סוגי החיפוש
  • הצגת מקור הדף
הקודם הבא

חיפוש גלובלי — סוגי החיפוש

איפה זה בממשק

תיבת החיפוש הגלובלי יושבת בראש עמוד הקבצים (/files). ליד התיבה יש רשימה נפתחת (#searchType ב-webapp/templates/files.html) שבה בוחרים את סוג החיפוש, וברירת המחדל היא תוכן.

הדפדפן (performGlobalSearch ב-webapp/static/js/global_search.js) שולח את החיפוש ל-POST /api/search/global (api_search_global). שני סוגים נשלחים ל-endpoint נפרד: חיפוש חכם (חיפוש חכם) ותיעוד (תיעוד).

סוגי החיפוש

תווית בממשק

ערך

על מה מחפש

איך מתאים

תוכן

content

תוכן הקוד בלבד

מחרוזת רצופה, כמו שהוקלדה

חיפוש חכם

semantic

קטעי קוד לפי משמעות

חיפוש היברידי: וקטורים + טקסט

טקסט

text

מילים מתוך תוכן הקוד

כל מילה בנפרד, גם כחלק ממילה ארוכה יותר

Regex

regex

תוכן הקוד בלבד

ביטוי רגולרי

מטושטש

fuzzy

שם הקובץ, תוכן הקוד והתגיות

דמיון משוער, גם עם שגיאות הקלדה

פונקציות

function

שמות פונקציות שחולצו מהקוד

השאילתה מופיעה בתוך שם הפונקציה

תיעוד

docs

סעיפים באתר התיעוד (לאדמין בלבד)

לפי משמעות: חיפוש וקטורי באינדקס התיעוד

”תוכן“, ”טקסט“, ”Regex“, ”מטושטש“ ו“פונקציות“ לא מבחינים בין אותיות גדולות לקטנות.

חשוב

”תוכן“, ”טקסט“, ”Regex“ ו“פונקציות“ לא מחפשים בשם הקובץ — הם מסתכלים על הקוד בלבד. שם הקובץ נכנס רק ב“מטושטש“, ובחיפוש החכם (כחלק מהטקסט שממנו נבנה הווקטור של כל קטע). מי שמחפש קובץ לפי השם שלו צריך לבחור ”מטושטש“, או להשתמש בחיפוש לפי שם שבאותו עמוד (לא לבלבל עם). יש חריג אחד: כשהסוג שבחרתם לא מוצא כלום, החיפוש עובר לגיבוי שכן מסתכל גם על שמות — ראו כשהסוג שבחרתם לא מוצא כלום.

תוכן

המימוש הוא _content_search ב-search_engine.py. הוא עובר על כל הקבצים של המשתמש במנות (SEARCH_PAGE_SIZE), ובכל קובץ סופר כמה פעמים השאילתה מופיעה כמחרוזת רצופה בתוך הקוד. אין פירוק למילים: get user נמצא רק איפה שכתוב בדיוק get user, עם הרווח.

הדירוג לפי צפיפות: כמה הופעות יש ביחס לאורך הקובץ. קובץ קצר עם שתי הופעות יעלה מעל קובץ ארוך עם אותן שתי הופעות.

הסוג הזה לא משתמש באינדקס בזיכרון ולא באינדקס הטקסט של מונגו — הוא קורא את הקוד עצמו.

טקסט

המימוש הוא _text_search. השאילתה מתפרקת למילים, ומילות עצירה (stop_words) ומילים של תו אחד נזרקות. כל מילה שנשארת מחפשת באינדקס המילים שבזיכרון (SearchIndex.word_index), שנבנה מתוך תוכן הקוד בלבד.

כל מילה מתאימה בשתי דרכים:

  • התאמה מדויקת — המילה קיימת בקוד כמו שהיא. מקבלת ניקוד גבוה יותר.

  • התאמה חלקית — המילה היא תחילית של מילה בקוד, או מופיעה בתוכה. למשל user מתאים גם ל-username וגם ל-get_user_id.

הניקוד של קובץ הוא סכום הניקוד של כל המילים שמצאו אותו. סדר המילים בשאילתה לא משנה, ואין דרישה שכל המילים יופיעו: קובץ שמתאים למילה אחת בלבד עדיין נכנס לתוצאות.

Regex

המימוש הוא _regex_search. התחביר הוא של מודול re בפייתון, בלי הבחנה בין אותיות גדולות לקטנות, ו-^ ו-$ מתייחסים לתחילת שורה ולסוף שורה ולא לקובץ כולו. הדירוג לפי מספר ההתאמות בקובץ.

לפני שהחיפוש רץ, _is_regex_safe (בתוך api_search_global) דוחה תבניות שעלולות לתקוע את השרת: תבנית ארוכה מ-200 תווים, .* שמופיע פעמיים, כמתים מקוננים כמו (a+)+, כמתים מספריים גדולים, ותבנית שלא מתקמפלת. תבנית שנדחתה מחזירה שגיאה ולא רצה.

מטושטש

המימוש הוא _fuzzy_search, עם fuzz.partial_ratio מ-rapidfuzz. לכל קובץ מחושב ציון דמיון בנפרד לשם הקובץ, לתוכן הקוד ולתגיות (מחוברות ברווח), והקובץ מקבל את הציון הגבוה מבין השלושה.

קובץ נכנס לתוצאות רק אם הציון שלו הוא לפחות 60 מתוך 100. הסף הזה כתוב ישירות בתוך _fuzzy_search.

partial_ratio מחפש את הקטע הכי דומה בתוך הטקסט ולא משווה את כל הטקסט. לכן שאילתה קצרה מוצאת קובץ ארוך שמכיל משהו דומה לה.

פונקציות

המימוש הוא _function_search. הוא מחפש באינדקס הפונקציות שבזיכרון (SearchIndex.function_index), שנבנה משמות הפונקציות ש-code_processor.extract_functions מחלץ מכל קובץ. פונקציה מתאימה אם השאילתה מופיעה בתוך השם שלה. כל פונקציה מתאימה מוסיפה לניקוד של הקובץ שלה, לפי כמה השם שלה קרוב לשאילתה כולה: בשאילתה save, פונקציה בשם save מוסיפה יותר מ-save_all_files_to_disk. לכן קובץ עם כמה פונקציות מתאימות יכול לעלות מעל קובץ עם התאמה מדויקת אחת.

מה שהחילוץ לא מזהה כפונקציה לא יימצא כאן. במקרה כזה אפשר לחפש את השם עם ”תוכן“.

חיפוש חכם

”חיפוש חכם“ לא עובר דרך /api/search/global. הדפדפן שולח אותו ל-POST /api/search/semantic (api_semantic_search), שמריץ את הפונקציה semantic_search ב-search_engine.py. זה חיפוש היברידי: חיפוש וקטורי על קטעי קוד (snippet_chunks) יחד עם חיפוש טקסט של Atlas, והתוצאות של שניהם מאוחדות. הפרטים הפנימיים, כולל שני רפי הציון, נמצאים ב-זרימת חיפוש (Search Flow).

מסנן השפה: בחיפוש חכם נשלחת רק השפה הראשונה מבין השפות שסימנתם.

יש לו גיבוי גם בשרת וגם בדפדפן, וחשוב להכיר אותם, כי בשניהם תקבלו תוצאות אבל לא של חיפוש לפי משמעות:

  • בשרת — כש-SEMANTIC_SEARCH_ENABLED כבוי, כששירות ה-embeddings לא זמין, כשיצירת ה-embedding לשאילתה נכשלה, או כשהאוסף snippet_chunks לא זמין, semantic_search מחזיר במקום זה תוצאות של מטושטש (_fallback_text_search).

  • בדפדפן — כשהבקשה ל-/api/search/semantic נכשלת, performGlobalSearch שולח את אותה שאילתה ל-/api/search/global עם semantic כסוג. api_search_global לא מכיר את הערך הזה וממפה אותו ל-תוכן.

האפשרות ”חיפוש חכם“ מופיעה ברשימה תמיד, גם כשהחיפוש הסמנטי כבוי.

תיעוד

האפשרות ”תיעוד“ מופיעה ברשימה רק לאדמין, וגם לו לא במצב צפייה כמשתמש (user_is_admin בתבנית). היא מחפשת בסעיפים של אתר התיעוד, ולא בקבצים. הדפדפן שולח אותה ל-POST /api/search/docs (api_search_docs), ואין מעבר לחיפוש אחר כשמשהו נכשל: /api/search/global היה ממפה סוג שהוא לא מכיר ל“תוכן“, ותוצאות של קבצים היו נראות כמו תשובה מהתיעוד. במקום זה מוצגת הודעה עם הסיבה.

החיפוש עצמו הוא search_docs ב-services/docs_search_service.py:

  • השאלה מוטמעת במודל שהאינדקס נבנה בו, ולא במודל שבהגדרות כרגע. אחרי החלפת מודל, ועד שמעבר של האינדקס מסיים להטמיע מחדש, השאלה והנתחים עדיין באותו מרחב וקטורי.

  • האינדקס הווקטורי נבדק לפני ההטמעה. כשהוא חסר, במצב שגיאה, עוד לא מוכן לחיפוש או במימד אחר, התשובה היא index_unavailable עם הסיבה (reason), ולא ”לא נמצאו תוצאות“.

  • $vectorSearch מסנן כבר בתוך האינדקס לנתחים של אותו מודל. נתחים של אותו סעיף מתאחדים לציון הגבוה שבהם, והמארקדאון נשלף רק לסעיפים שמוחזרים.

  • סעיף ארוך לא דוחק החוצה את השאר. הסבב הראשון מבקש CHUNKS_PER_RESULT נתחים לכל סעיף שמוחזר. כשהנתחים נופלים בפחות סעיפים ממה שהתבקש והחיפוש מילא את כל המכסה — כי סעיף ארוך תפס את רובה — המכסה מוכפלת: עד שיש מספיק סעיפים, עד שהחיפוש מחזיר פחות נתחים ממה שביקשנו, או עד התקרה של Atlas (MAX_NUM_CANDIDATES). כשהסבב הראשון מוצא מספיק סעיפים, אין סבב נוסף.

  • לכל שלב יש תקרה משלו: QUERY_EMBED_DEADLINE_SECONDS להטמעת השאלה, ו-SEARCH_DB_TIMEOUT_SECONDS לכל אחד משני החלקים מול המסד. ההמתנה של הדפדפן (DOCS_SEARCH_DEADLINE_MS ב-global_search.js) ארוכה מסכומן, ו-tests/test_docs_search_files_page.py משווה ביניהן.

  • שאלה ארוכה מ-QUERY_MAX_BYTES בתים של UTF-8, אותו תקציב כמו נתח של התיעוד, נדחית ב-query_too_long ולא נחתכת.

  • אין לה מגבלת קצב משלה: אדמינים פטורים מהמגבלות של Flask-Limiter (_is_rate_limit_exempt_user ב-webapp/app.py). הקצב מול Gemini נשמר בשער של התהליך, כמו במעבר של האינדקס.

כל סעיף מוצג בכרטיס, מימין לשמאל, כמו בתצוגת ה-Markdown של דפדפן הקוד: אותו רינדור (MarkdownLiveRenderer), אותו עיצוב (markdown-preview.css) ואותו משטח (תצוגה מרונדרת (Markdown ועמודי תיעוד)). מעל הסעיף מופיעים קובץ המקור שלו בריפו (source_path בתשובה, למשל docs/webapp/global-search.rst), שביל הכותרות והציון, ומתחתיו ”פתח באתר התיעוד“ (בלשונית חדשה, עם rel="noopener") ו“העתק כמארקדאון“. קובץ המקור מוצג כטקסט, ולא כקישור. ברשומה של עדכון ביומן עדכונים (אינדקס התיעוד) הכותרת היא הפתיח של העדכון, ו“פתח באתר התיעוד“ קופץ אליו ולא לראש היום: אחרי העוגן של היום, הכתובת נושאת את הפתיח (השדה link_text של הרשומה, דרך text_fragment ב-services/docs_search_contract.py). את הקפיצה עושה הדפדפן, לפי התקן של URL Fragment Text Directives (https://wicg.github.io/scroll-to-text-fragment/), והוא מחפש את הפתיח בלי הבדל בין אותיות גדולות לקטנות ובלי ניקוד. ב-Chromium 141, על האתר עצמו (11.10.2026), הקפיצה מביאה את העדכון למסך. כשהפתיח כבר אינו בעמוד, למשל כי העדכון נערך אחרי שהאינדקס נבנה, הדפדפן מגיע לראש היום, כמו בקישור בלי קפיצה. דפדפן שאינו תומך בתחביר הזה לא קופץ לעדכון, ולאן הוא מגיע לא נמדד. סעיף ארוך מוצג בהתחלה רק בחלקו העליון, דוהה בתחתית, עם ”הצג את כל הסעיף“. כשהסעיף פתוח הכפתור מציע לכווץ אותו: הטקסט, האייקון ו-aria-expanded נגזרים יחד מהמצב של הסעיף (syncDocsExpandButton ב-global_search.js). הכפתור יושב בתחתית הסעיף הפתוח, ולכן מגיעים אליו בגלילה. אחרי הכיווץ, כשראש הכרטיס מעל המסך, המסך חוזר לראש הכרטיס, גם כשהכרטיס המכווץ גבוה מהמסך. כרטיס שראשו כבר על המסך לא זז. מזהים בתוך כרטיס מקבלים קידומת של הכרטיס, כדי ששני סעיפים עם אותה כותרת לא ייתנו אותו id בעמוד.

שורת המצב מעל הכרטיסים אומרת לאיזה קומיט של האתר האינדקס נכון, ומקשרת לעמוד האדמין של האינדקס (אינדקס התיעוד). כשהאינדקס לא מעודכן לפריסה האחרונה, או שנבנה בכללים קודמים (index_complete שקר, ראו ”שלם או חלקי“ ב-אינדקס התיעוד), השורה אומרת שייתכן שחסרים בו סעיפים. מספר התוצאות הוא ברירת המחדל של ה-API (DEFAULT_LIMIT). מיון, מספר תוצאות בעמוד וסינון לפי שפה לא חלים כאן, ולכן הפקדים שלהם מושבתים כשבוחרים ”תיעוד“.

חיפוש שהתחיל אחרון הוא שמוצג. תשובה של חיפוש קודם, שמגיעה אחרי שחיפוש חדש כבר התחיל, לא מוצגת. הכלל הזה חל על כל סוגי החיפוש בתיבה, כי Enter, הצעה ומעבר עמוד מתחילים חיפוש חדש גם כשהכפתור מושבת.

כשהסוג שבחרתם לא מוצא כלום

api_search_global לא קורא למנוע ישירות, אלא דרך _safe_search ב-webapp/app.py. אם המנוע מחזיר רשימה ריקה, או זורק חריגה, _safe_search מריץ חיפוש גיבוי ישירות במונגו:

  • ב-Regex — $regex על תוכן הקוד בלבד.

  • בכל שאר הסוגים — $text על אינדקס הטקסט search_text_idx. האינדקס הזה (מוגדר ב-database/manager.py) כולל את שם הקובץ, התיאור, התגיות והקוד. כלומר בגיבוי חיפוש ”תוכן“ או ”טקסט“ כן יכול למצוא קובץ לפי השם שלו.

הקוד לא מעביר ל-$text שפה או רגישות לאותיות, ולכן חלות ברירות המחדל של מונגו. לפי התיעוד של MongoDB על $text:

  • הוא מתאים מילה שלמה (אחרי stemming) ולא חלק ממילה: blue לא מוצא blueberry.

  • הוא לא מבחין בין אותיות גדולות לקטנות.

  • כמה מילים בשאילתה מחוברות ב-או: get user מחזיר כל קובץ שיש בו get או user.

מה שונה בתוצאות של הגיבוי:

  • לכל התוצאות אותו ציון, כך שהמיון לפי רלוונטיות לא אומר כלום.

  • הסדר הוא תמיד מהקובץ שעודכן לאחרונה, בלי קשר למיון שבחרתם.

  • רק מסנני השפה והתגיות מוחלים.

מגבלות

מגבלה

ערך

איפה נאכפת

אורך שאילתה

500 תווים

api_search_global ו-api_semantic_search

תבנית Regex

ראו Regex

_is_regex_safe

קצב בקשות

הכלל "30 per minute" על כל אחד משני ה-endpoints, לפי המשתמש המחובר. אדמינים ומשתמשים ברשימת ההחרגה לא מוגבלים

_search_limiter_decorator; המפתח _client_rate_key, וההחרגה _is_rate_limit_exempt_user

תוצאות בעמוד

בין 1 ל-100 (בממשק: 5, 10, 20 או 50)

api_search_global; הרשימה #resultsPerPage ב-files.html

האינדקס בזיכרון

”טקסט“ ו“פונקציות“ קוראים מאינדקס שנבנה בזיכרון של התהליך (SearchIndex). הבנייה היא סריקה של כל קבצי המשתמש, כולל הקוד. היא קורית בחיפוש הראשון מהסוגים האלה, וחוזרת כשהאינדקס מתיישן (SearchIndex.should_rebuild). ”תוכן“, ”Regex“ ו“מטושטש“ לא קוראים מהאינדקס, ולכן גם לא בונים אותו — אלא אם SEARCH_MEMORY_INDEX_EAGER_BUILD דלוק.

משתני הסביבה ששולטים בזה (את ברירות המחדל שלהם מתעד משתני סביבה - רפרנס):

  • SEARCH_MEMORY_INDEX_ENABLED — כשהוא כבוי, האינדקס נשאר ריק. ”טקסט“ ו“פונקציות“ לא ימצאו כלום במנוע, ולכן תמיד יעברו לגיבוי (כשהסוג שבחרתם לא מוצא כלום). בגיבוי ההתאמה החלקית של ”טקסט“ נעלמת, ו“פונקציות“ כבר לא מחפש בשמות פונקציות.

  • SEARCH_MEMORY_INDEX_EAGER_BUILD — כשהוא דלוק, האינדקס נבנה גם בחיפושי ”תוכן“, ”Regex“ ו“מטושטש“. הסיבה היחידה להדליק אותו היא ההשלמה האוטומטית (השלמה אוטומטית), שקוראת מהאינדקס רק אם הוא כבר קיים.

  • SEARCH_PAGE_SIZE — כמה קבצים נקראים בכל מנה, בסוגים שסורקים את הקבצים עצמם.

קאש

api_search_global שומר את התוצאות בקאש דרך cache.set_dynamic עם סוג התוכן search_results. מפתח הקאש נבנה מהמשתמש, מהשאילתה, מהסוג, מהמסננים, מהמיון, מהעמוד ומכמות התוצאות בעמוד. כלומר אותו חיפוש שחוזר על עצמו מגיע מהקאש, וכל שינוי באחד מהם הוא חיפוש חדש.

זמן התפוגה נקבע ב-DynamicTTL.calculate_ttl לפי סוג התוכן ולפי ההקשר. ההסבר על המנגנון נמצא ב-מערכת Caching מתקדמת עם TTL דינמי.

השלמה אוטומטית

כשמקלידים בתיבה, הדפדפן מבקש הצעות מ-GET /api/search/suggestions (api_search_suggestions), שקורא ל-suggest_completions. ההצעות מגיעות מהמקורות האלה:

  • שמות קבצים, תגיות (בצורת #tag) ושפות, מ-autocomplete_manager.

  • חיפוש $text במונגו, רק כשהשאילתה כבר מכילה מילה שלמה.

  • מילים ושמות פונקציות מהאינדקס שבזיכרון, רק אם הוא כבר נבנה. ההשלמה לא בונה אותו בעצמה.

לחיצה על הצעה מכניסה אותה לתיבה ומריצה חיפוש מהסוג שבחור ברשימה.

לא לבלבל עם

  • החיפוש לפי שם בעמוד הקבצים. זו תיבה אחרת באותו עמוד (שדה q, והטקסט ”חיפוש לפי שם, תיאור או תגית…“). היא שולחת את הדף מחדש עם ?q=, ומחפשת בשם, בתיאור ובתגיות של הגרסה האחרונה של כל קובץ — לא בקוד: כל מילה בשאילתה צריכה להופיע באחד מהשלושה, גם כחלק ממילה, ובלי הבדל בין אותיות גדולות לקטנות. הכלל ב-_files_search_file_match ב-webapp/app.py, והוא חל בכל התצוגות של העמוד. אין לה סוגי חיפוש, והיא לא משתמשת ב-search_text_idx. עד אוקטובר 2026 היא הריצה $text על האינדקס הזה, ולכן, בניגוד לטקסט שבה, מצאה גם קבצים שהמילה רק בקוד שלהם.

  • ``/search`` בבוט. הבוט לא משתמש בסוגי החיפוש שבעמוד הזה. יש שני מימושים של search_command, ואף אחד מהם לא קורא למנוע: זה שב-main.py מזהה תגית (#tag) או שם של שפה, ובכל מקרה אחר קורא ל-db.search_code. זה שב-bot_handlers.py רק מפרק את השאילתה ומחזיר תצוגת הדגמה.

אינדקס התיעוד

החיפוש בתיעוד (הסוג ”תיעוד“ בתיבה, תיעוד) נשען על אינדקס של הסעיפים באתר התיעוד. האינדקס נבנה בוובאפ מתוך קובץ הייצוא של האתר (_export/sections.json, ראו Doc Authoring Guide (Sphinx/RTD)), ולא ממקור ה-rst, ומתעדכן אחרי כל פריסה של האתר. המימוש הוא services/docs_index_service.py. השמות שהכותב והחיפוש חייבים להסכים עליהם — האוספים, השדות, האינדקס הווקטורי וכתובת האתר — יושבים ב-services/docs_search_contract.py.

מה נכנס לאינדקס

  • סעיף (האוסף docs_sections) — מה שכרטיס בתוצאות יציג: העמוד, העוגן, שביל הכותרות והמארקדאון של הסעיף.

  • נתח (האוסף docs_chunks) — הטקסט שנשלח להטמעה והווקטור שלו: שביל הכותרות, שורה ריקה, והגוף. סעיף ארוך מ-CHUNK_MAX_BYTES (services/chunking_service.py) מתחלק ב-split_code_to_chunks, ושביל הכותרות נספר בתוך התקציב.

  • עמוד (האוסף docs_pages) — עמוד rst שלם, למסך התצוגה המרונדרת בדפדפן הקוד (עמודי התיעוד (rst)): כל הסעיפים של העמוד לפי הסדר בקובץ, כל אחד עם הכותרת שלו ברמה שלו (page_markdown ו-build_pages). בעמוד נכנסים כל הסעיפים, גם אלה שהחיפוש מדלג עליהם, ויומן עדכונים נשמר בו כימים ולא כעדכונים. עם העמוד נשמרים הקבצים האחרים שהוא נבנה מהם (dependencies בקובץ הייצוא), שדפדפן הקוד משווה כדי לדעת אם העמוד ישן מהקוד שהוא מציג. המפתח הוא קובץ המקור. עמוד לא מוטמע, ולכן הוא אינו נספר בעלות ובאישור.

  • סעיף בלי טקסט, או שכולו קישורים (”ראו גם“), לא נכנס כסעיף ולא כנתח (is_links_only). בעמוד הוא נשאר.

  • יומן עדכונים (UPDATE_LOG_SOURCES, היום What’s New) — שם רשומה היא עדכון אחד ולא יום שלם: כל פריט ברשימה של יום נכנס כרשומה משלו. הכותרת שלה היא הפתיח המודגש של העדכון, והשביל הוא שביל היום ועוד הפתיח, כך שגם כל נתח של עדכון ארוך פותח בו. הגוף הוא שאר העדכון, כמו שסעיף נשמר בלי הכותרת שלו. עדכון בלי פתיח מודגש נכנס כרשומה בשם של היום, עם העדכון כולו. כך גם עדכון שהפתיח שלו מופיע בעמוד יותר מפעם אחת, בהשוואה של הדפדפן — בלי הבדל בין אותיות גדולות לקטנות, ובלי ניקוד ואקסנטים: אז הוא תווית, כמו ”מגבלה ידועה:“, ולא שם של עדכון. וכך גם עדכון שהפתיח שלו ארוך מהתקרה של כותרת בקובץ הייצוא (MAX_TITLE_BYTES), או שהשביל איתו ארוך מהתקרה של שביל (MAX_BREADCRUMB_BYTES): הפתיח הארוך לא נחתך, ורק עליו נרשמת אזהרה בלוג. מה שביום מחוץ לרשימה, כמו פסקה אחרי הבולטים, נכנס כרשומה אחת בשם של היום. איך כותבים עדכון שמתפרק כך: רשומה ב-What’s New.

  • המפתח של סעיף הוא קובץ המקור, שביל הכותרות ומספר סידורי לשביל שחוזר באותו עמוד — בלי העוגן, כי העוגן של כותרת בלי תווית זז. עוגן שזז מעדכן את הסעיף בלי הטמעה מחדש. נתח מוטמע מחדש רק כשה-sha256 של הטקסט שלו השתנה, או כשהמודל בהגדרות השתנה. ברשומה של עדכון השביל כולל את הפתיח, ולכן עדכון שנוסף ליומן לא משנה את המפתח של עדכון אחר עם פתיח, כל עוד הפתיח שלו נשאר ייחודי בעמוד.

המעבר

מעבר (run_pass) משווה את מה שבקובץ למה שבמסד, ומיישר: מטמיע רק נתחים חדשים או שהשתנו, ומוחק מה שהקובץ כבר לא מכיר. מעבר אחד רץ בכל פעם, ב-thread ברקע, תחת lease במסמך המצב (האוסף docs_index_state). בקשה שמגיעה בזמן שמעבר רץ ממתינה ורצה אחריו; כמה בקשות שממתינות מתאחדות לאחרונה שבהן, כי כל מעבר קורא ממילא את הקובץ העדכני.

מה מפעיל מעבר:

  • פריסה של האתר — ה-webhook של GitHub, באירוע deployment_status, כשפריסה של github-pages בריפו המקור הסתיימה בהצלחה (handle_deployment_status_event ב-webapp/routes/webhooks.py). המעבר קורא את העותק של הקובץ לפי הקומיט של הפריסה, כי הקובץ הראשי עלול להגיע ממטמון האתר.

  • רשת ביטחון — ה-webhook של push לענף הראשי של ריפו המקור (handle_push_event ב-webapp/routes/webhooks.py), לצד הסנכרון של המראה ובלי תלות בו: היא קוראת את הקובץ הראשי של האתר עם If-None-Match, ובדרך כלל חוזרת ב-304 בלי לעשות כלום. היא תופסת פריסה שה-webhook שלה לא הגיע — אבל רק ב-push שאחריה, כי בזמן ה-push הבנייה שלו עוד לא נפרסה.

  • ”בדוק עכשיו“ בעמוד האדמין — כמו רשת הביטחון.

השומרים:

  • עלות. מעבר אוטומטי שיש לו יותר מ-APPROVAL_THRESHOLD_CHUNKS נתחים להטמעה — וכל מילוי ראשון או החלפת מודל — לא שולח כלום ועוצר ב“מחכה לאישור“, עם התוכנית וטביעת אצבע שלה. האישור בעמוד האדמין מריץ אותה רק אם התוכנית שהמעבר מחשב מחדש זהה לזו שאושרה; אם היא השתנתה לתוכנית שאינה דורשת אישור, היא רצה כמו מעבר אוטומטי. כשהאינדקס נכנס להמתנה נשלחת התראה לבוט, עם מספר הנתחים, התקרה והקומיטים, ושורת Quick Fix לעמוד האדמין (ALERT_APPROVAL_NEEDED, ראו אינדקס התיעוד). מעבר שעוצר שוב בזמן שהאינדקס כבר מחכה — למשל מיזוג שמחשב מחדש את אותו פער מצטבר — אינו שולח עוד אחת. ההמתנה נגמרת כשמעבר מתחיל לכתוב, ולכן אחריו — בין שהצליח ובין שנעצר באמצע, למשל ב-paused_quota — הכניסה הבאה להמתנה שולחת שוב: זו כבר בקשה חדשה לאישור.

  • מחיקה. מוחקים רק כשהקובץ מכיר לפחות סעיף, נתח או עמוד אחד מאלה שבמסד. קובץ שלא מכיר אף אחד מהם לא מוחק כלום, והמעבר רושם כמה מחיקות נחסכו.

  • לא אחורה. קובץ שנבנה לפני הקובץ שכבר הוחל לא מוחל (הקוד older_export): עותק ישן ממטמון האתר, או webhook של פריסה קודמת שהגיע באיחור, לא מחזירים את האינדקס אחורה.

  • שלם או חלקי. הקומיט שהאינדקס נכון אליו (indexed_source_commit) נמחק לפני הכתיבה הראשונה של מעבר, ונכתב רק אחרי קריאה חוזרת שמוצאת כל סעיף, נתח ועמוד רצויים, עם ה-sha (ובנתחים גם המודל) הנכונים. בין שני הרגעים העמוד מציג את האינדקס כ“חלקי“. לצד הקומיט נשמרת גרסת הכללים שבנו את הרשומות (RECORDS_VERSION). קוד שהופך את אותו קובץ לרשומות אחרות מעלה אותה, ועד שמעבר בונה את האינדקס בכללים החדשים is_index_complete מחזיר שקר: רשת הביטחון ו“בדוק עכשיו“ לא נעצרים על 304, אלא קוראים את הקובץ בלי If-None-Match ובונים את התוכנית מחדש — גם כשקובץ הייצוא לא השתנה — ושורת המצב בחיפוש אומרת שייתכן שחסרים סעיפים. עמוד האדמין קובע ”שלם“ לפי הקומיט בלבד (admin_docs_index.html), ולכן אינו מסמן את המצב הזה.

  • עצירה ודדליין. לפני כל אצווה שכותבת — הטמעה, כתיבת סעיפים או מחיקה — נבדקות בקשת עצירה ו-PASS_DEADLINE_SECONDS, וה-lease מתחדש. עצירה היא גם בלם: מעבר שמוחק או כותב בלי הטמעות נעצר באותה נקודה, והספירה של מה שכבר נמחק נשמרת ב-run.deleted. מכסה של Gemini (429) עוצרת את המעבר במצב paused_quota; המעבר הבא ממשיך מאיפה שהקודם עצר, ושולח רק את מה שחסר.

עמוד האדמין

/admin/docs-index, וכרטיס שמוביל אליו בהגדרות, בקבוצה ”כלי אדמין“. בעמוד: המעבר האחרון ומצבו, הקומיט שהאינדקס נכון אליו מול הקובץ שנקרא לאחרונה ומול ה-HEAD של המראה (כדי שפיגור ייראה), תוכנית ”יבשה“ מהקובץ הראשי, אישור של תוכנית, ”בדוק עכשיו“ ועצירה. ה-API של העמוד (/api/docs-index והנתיבים שתחתיו) פתוח לאדמינים בלבד, וחסום גם במצב צפייה כמשתמש (admin_api_required). פעולה שמשנה מצב היא POST עם גוף JSON.

הגדרה חד-פעמית

  1. ה-webhook. ב-webhook של הריפו ב-GitHub — אותו webhook שמפעיל את הסנכרון (דפדפן קוד (Code Browser)) — בוחרים Let me select individual events ומסמנים, לצד push, גם את deployment_status. בלי זה רק רשת הביטחון והכפתור מפעילים מעבר. ה-webhook מוחרג מהמגבלה הגורפת של קצב הבקשות בוובאפ, כי GitHub שולח מכמה כתובות קבועות, ולכל פריסה יש כמה סטטוסים.

  2. האינדקס הווקטורי. ב-Atlas יוצרים אינדקס מסוג Vector Search בשם docs_vector_index על האוסף docs_chunks, עם ההגדרה שעמוד האדמין מציג (vector_index_definition): cosine על chunkEmbedding במימד של ההגדרות הפעילות, ופילטר על embeddingModelKey. אחרי החלפת מודל במימד אחר צריך ליצור אותו מחדש, והעמוד אומר אם המימד תואם. בשרת שאינו Atlas העמוד מציג את מצב האינדקס כ“לא ידוע“.

  3. מילוי ראשון. ”בדוק עכשיו“ — המעבר עוצר לאישור ומציג כמה נתחים יישלחו — ואז ”אשר והתחל“.

האירועים של המעבר ושל העמוד מתועדים ב-אינדקס התיעוד.

ראו גם

  • זרימת חיפוש (Search Flow) — הפרטים הפנימיים של מנוע החיפוש: SearchIndex, מסננים, מיון, והחיפוש הסמנטי.

  • תחזוקת קטלוג הפקודות (commands.json) — כרטיסי ”קיצורי הדרך“ שמופיעים באותה תיבת חיפוש.

  • משתני סביבה - רפרנס — המשתנים SEARCH_* ו-SEMANTIC_*.

  • אינדקס התיעוד — האירועים של אינדקס התיעוד.

הקודם הבא

© Copyright 2026, Development Team.

נבנה עם Sphinx, עם ערכת עיצוב של Read the Docs.