Bir projenin dokümantasyonu nadiren tek bir yerde yaşar. Bir kaynak o yerlerden biridir ve bir proje ihtiyacı kadar çok kaynak taşıyabilir — hepsi tek bir aranabilir endpoint’te birleşir.
| Tür | Nedir | Kim senkronize eder | Sayfa |
|---|---|---|---|
| Local directory | Sunucuya bağlanan bir klasör, olduğu yerde taranır. Hiçbir şey kopyalanmaz | İndeksleme anında okuyarak | Yerel Klasör Kaynağı |
| Git repository | Bir dalın, isteğe bağlı olarak yalnızca bir alt klasörünün shallow checkout’u | Her çalıştırmanın başında git fetch, ya da bir push webhook |
Git Deposu Kaynağı |
| Upload | Sunucuda açılan dosyalar, klasörler ve arşivler (.zip, .tar.gz, .rar) |
Senkronize edilecek bir şey yok — değiştiğinde tekrar yüklersiniz | Yükleme Kaynağı |
| Notion | Dahili bir entegrasyonla paylaşılan, Markdown’a dönüştürülen sayfalar | Notion API’si, yalnızca değişen sayfaları yeniden render ederek | Notion |
| Confluence | Bir Confluence Cloud ya da Data Center hesabının okuyabildiği ya da sizin adlandırdığınız her space, Markdown’a dönüştürülür | Confluence REST API’si, yalnızca sürümü değişen sayfaları yeniden render ederek; Data Center ayrıca bir webhook kabul edebilir | Confluence |
| Dokümantasyon sitesi | Herkese açık bir sitenin kendi sitemap’i, llms.txt’i ya da bir crawl’ı, Markdown’a dönüştürülür |
Sitenin tamamının yeniden çekilmesi; <lastmod> tarihleri olan bir sitemap.xml, değişiklikler için önce iki istekte kontrol edilebilir |
Dokümantasyon Sitesi Kaynağı |
Bir Obsidian vault’u bir Markdown klasörüdür, bu yüzden tek bir ayar çevrilerek local directory ya da upload olarak gelir. Bkz. Obsidian Vault’ları.
Mount adı
Her kaynağın bir adı vardır ve bu ad, katkıda bulunduğu her yolun önüne eklenir:
source "handbook" contains install.md → indexed as handbook/install.md
source "api-repo" contains install.md → indexed as api-repo/install.md
İki kaynağın çakışmadan aynı dosya adını taşıyabilmesinin, ve her arama sonucunun hangi kaynaktan geldiğini söyleyebilmesinin nedeni budur. Adın oluşturulduktan sonra değiştirilememesinin nedeni de budur — her indekslenmiş yol ve bir ajanın gördüğü her yol onu içerir. Bir kaynak hakkındaki geri kalan her şey düzenlenebilir.
Adlar, proje adlarıyla aynı kuralı izler: küçük harf, rakam, - ve _.
Bir kaynak eklemek
Bir proje üzerinde Add source, her tür için bir sekmesi olan bir diyalog açar. Ortak alanlar:
| Alan | Notlar |
|---|---|
| Name | Mount öneki. Değiştirilemez |
| Label | Listede gösterilen serbest metin. Opsiyonel, değiştirilebilir |
| Content type | Plain Markdown / text, Obsidian vault, Notion export ya da OpenAPI / Swagger — sonuncusu .yaml, .yml ve .json dosyalarını spesifikasyon olarak okur ve birini operasyon başına bir belgeye çevirir |
| File types | Hangi uzantıların indeksleneceği: varsayılan olarak .md ve .mdx, isteğe bağlı .txt, .html/.htm, .csv, .docx ve .pdf |
| Index now | Kaynak kaydedilir kaydedilmez bir çalıştırma kuyruğa alınır |
Git, Notion, Confluence ve dokümantasyon sitesi kaynaklarının, hiçbir şeyi indekslemeden kimlik bilgilerini ve erişilebilirliği kontrol eden bir Test connection düğmesi de vardır — kaydetmeden önce kullanın.
Kaynaklar nasıl senkronize edilir
Her kaynak her indeksleme çalıştırmasının başında senkronize edilir, birbiri ardına, sonra taranır:
- git kaynakları dalın ucunu çeker; Notion kaynakları değişen sayfaları çeker; local ve upload kaynaklarının çekecek bir şeyi yoktur.
- Her kaynağın klasörü, seçtiği dosya türleri için taranır.
- Yollar kaynak adıyla öneklenir ve indeksleyiciye verilir.
Tek bir kaynak satırında Sync’e basmak, başlıktaki Re-index ile aynı çalıştırmayı kuyruğa alır — kaynak başına değil, proje başına bir kuyruk vardır.
Bir kaynak başarısız olduğunda
Senkronize olamayan bir kaynak kendi satırında raporlar ve diğerleri yine indekslenir. Projenin
durumu bir özetle error olur:
2/3 sources synced; notion: API token is invalid
Önemlisi, içeriği hiç okunamayan bir kaynak, daha önce katkıda bulunduğu dokümanları korur. İptal edilmiş bir Notion paylaşımı ya da ulaşılamayan bir git host’u, bir kaynağı boşaltmaz, yalnızca bayatlatır. Nedeni düzeltin ve o satırda Sync’e basın.
Düzenleme ve kaldırma
Kaynağın ürettiğini değiştiren bir ayarı değiştirmek — yol, dal, alt klasör, dosya türleri, içerik türü — otomatik olarak bir indeksleme çalıştırması kuyruğa alır, bu yüzden bir kaynak asla sessizce bayat kalmaz.
Bir kaynağı silmek, dokümanlarını, chunk’larını ve somutlaştırdığı dosyaları kaldırır. Proje indekslenirken reddedilir.
Ne indekslenir
Yalnızca kaynağın seçtiği dosya türleri: varsayılan olarak .md ve .mdx, isteğe bağlı olarak
.txt, .html/.htm, .csv, .docx ve .pdf. Her şey girerken Markdown’a dönüşür — dönüşüm
kenarda, bir kez olur; böylece chunker, embedder ve read_document tek bir format görür. .yaml,
.yml ve .json bu listede değildir: yalnızca OpenAPI / Swagger içerik türüyle okunurlar ve okunan
bir spesifikasyon tek bir belge değil, operasyon başına bir belge olur.
Her zaman atlanır:
- gizli dosyalar ve gizli klasörler (
.git/,.obsidian/, …) node_modules,dist,build,vendor,__pycache__- kaynağın dışına işaret eden sembolik linkler
IGNORE_GLOBSile eşleşen her şey
| Tür | Neye dönüşür | Korunan | Kaybedilen |
|---|---|---|---|
.md, .mdx, .txt |
kendisi, değişmeden | her şey | hiçbir şey |
.html, .htm |
turndown + GFM ile Markdown | başlıklar, listeler, tablolar, kod, bağlantılar, <title> |
script’ler, stil sayfaları, svg, gömülü görsel verisi (alt metni kalır) |
.docx |
mammoth ile Markdown, sonra aynı dönüştürücü | Word’ün kendi başlık stilleri, numaralı ve madde imli listeler, tablolar, bağlantılar | görseller, dipnotlar, yorumlar, izlenen değişiklikler |
.csv |
bir GFM tablosu, her 200 satırda bir ## Rows n–m bölümü |
her bölümün üstündeki başlık, tırnaklı virgüller ve satır sonları, ;/tab/pipe ayraçları |
verinin hiçbir şeyi; hücre içi satır sonları <br> olur |
.pdf |
glif konumlarından yeniden kurulan Markdown | yazı tipi boyutuna göre başlıklar, satır sonları arasında yeniden birleştirilip tire kaldırılan paragraflar, madde imli ve numaralı listeler, kolon hizalı tablolar, iki kolonlu okuma sırası, düşürülen üst/alt bilgi satırları | dipnotlar, şekiller, ve kolonları hizalı olmayan her tablo |
Görseller ve diğer ikili dosyalar indekslenmez. OCR da yoktur, bu yüzden dönüştürülemeyen bir dosya — taranmış bir PDF, şifreli bir PDF, tamamı görsel olan bir Word dosyası, bu türlerden herhangi birinin bozuk bir kopyası, hiç metne dönüşmeyen bir sayfa ya da e-tablo — reddedilir, indekslenmez: dosyayı adıyla anan gerekçe kaynağın satırında gösterilir ve kaynağın geri kalanı normal şekilde indekslenir. Bir ret hiçbir zaman senkronizasyonu ya da projeyi başarısız kılmaz: artımlı bir çalıştırmada dosya zaten sahip olduğu belgeyi korur, ve bir rebuild onu yalnızca yeni nesle dahil etmez — hiç okunamayan bir kaynağa uygulanan kuralın aynısı.
Dönüştürme kendi worker thread’inde çalışır, pano ve MCP endpoint’ini sunan thread’de değil, bu yüzden
yavaş bir dosya hiçbir zaman bir aramayı engellemez ve heap’ini tüketen bir parser yalnızca o dosyayı
başarısız kılar. Boyut tavanları, tek bir dosyanın dönüşürken neye mal olabileceğini sınırlar —
bir belge için MAX_CONVERTED_FILE_BYTES, akla yatkın olmayan bir sayfa sayısı iddia eden bir PDF için
MAX_PDF_PAGES, bir .docx içindeki bir zip bomb’una karşı MAX_DOCX_UNPACKED_BYTES — ve
CONVERSION_TIMEOUT_MS / CONVERSION_IDLE_MS, bir dosyanın ve boşta bir worker’ın ne kadar
çalışmasına izin verildiğini sınırlar. Tüm varsayılanlar ve her birinin ne durdurduğu:
Yapılandırma.
Uzun bir PDF, MAX_STORED_DOCUMENT_BYTES’a karşı nereye düşer (1 MB UTF-8, bunun ötesinde
saklanan önek read_document’ın sunduğu şeydir ve content_truncated ayarlanır — kesme saklanan metin
üzerinde olduğu ve parçalar üzerinde olmadığı için belge her durumda tamamen aranabilir kalır). 80, 200,
600 ve 1600 yoğun sayfalık üretilmiş kılavuzlar üzerinde ölçülmüştür (yaklaşık 95 karakterlik 42 satır,
bir üst/alt bilgi satırı, her onuncu sayfada bir bölüm başlığı):
| Sayfa | Markdown | Sayfa başına | Çıkarma |
|---|---|---|---|
| 80 | 316 KiB | 4,0 KiB | 0,18 sn |
| 200 | 795 KiB | 4,0 KiB | 0,21 sn |
| 600 | 2393 KiB | 4,0 KiB | 0,61 sn |
| 1600 | 6414 KiB | 4,0 KiB | 1,73 sn |
Tavan kabaca 250 yoğun sayfada ısırır — daha gevşek gerçek dünya kılavuzları bunu 300–400 sayfaya kadar
uzatır. Çıkarma sayfa başına yaklaşık bir milisaniyeye mal olur ve içerik hash’i dosyanın değiştiğini
söyledikten sonra bir kez gerçekleşir. Bunların hiçbirinden önce, girişte sınırlanan şey dosyanın
kendisidir: varsayılan olarak 50 MB olan UPLOAD_MAX_FILE_BYTES.