Panggilan Gagal Kini Percuma, dan Pembaikan Daripada Semakan Kesemua 31 Alat
6.22.0 membaiki apa yang ditemui oleh semakan langsung kesemua 31 alat pada 6.21.1: kira-kira 470 panggilan, dengan setiap kecacatan dihasilkan semula oleh penguji kedua sebelum dibaiki. Setiap panggilan yang gagal kini percuma, termasuk kegagalan extract_structured, extract_with_llm dan summarize_content yang sebelum ini dicaj sebagai berjaya. crawl_deep mengikut ubah hala dengan betul dan tidak lagi menyekat pelayan pada halaman yang sangat besar, alat agent kekal dalam had 120 saatnya dan menjawab soalan tentang keadaan semasa daripada sumber rasmi, dan mesej ralat menamakan punca sebenar (kegagalan DNS, sambungan ditolak, pemilih yang tidak sepadan dengan apa-apa) bersama langkah seterusnya yang membantu. Dalam API REST, analyze_content dan format question bagi scrape menerima pembaikan sentimen dan asas bukti yang sama: analyze_content menambah medan confidence, dan answer.grounded boleh bernilai false. 6.22.1 menjadikan alat agent menandakan URL yang dipetik tetapi tiada dalam mana-mana sumbernya, dan menghalang deep_research daripada melaporkan baris jadual dan tajuk yang tercantum sebagai dapatan. 6.22.2 mengekalkan pautan yang ditulis bersebelahan pada baris berasingan dalam teks halaman, jadi jadual kandungan tidak lagi dibaca sebagai satu ayat yang tercantum. 6.22.3 membolehkan alat agent memetik pautan tepat bagi sesuatu item pada halaman yang dibacanya, dan menghalang deep_research daripada melaporkan soalan, pemberat rubrik, ayat pembuka yang ditujukan kepada pembaca dan ayat yang terpotong di tengah perkataan sebagai dapatan.
- Setiap panggilan yang gagal adalah percuma: hasil ralat, ralat yang dilontar atau badan success: false dicaj 0 credits dan dilog sebagai ralat, dan _cost serta next_step kini turut muncul dalam structuredContent
- crawl_deep menyelesaikan pautan berdasarkan halaman yang dicapainya selepas ubah hala, dan analisis pautannya tidak lagi menyekat pelayan: halaman 7.3 MB dengan 16,766 pautan turun daripada 50 s kepada 0.5 s. map_site menyertakan URL permulaan, dan search_web tidak lagi menggabungkan halaman berbeza sebagai pendua
- analyze_content menilai sentimen dengan leksikon AFINN-165 dan bukan senarai perkataan yang menganggap teks yang jelas positif sebagai neutral, format question bagi scrape menjawab daripada artikel dan bukan senarai rujukannya, dan templat github-repo membaca nama, topik dan isu terbuka daripada halaman semasa GitHub
search_web Menamakan Bahagian Belakangnya, dan serp_rank Menandakan Hasil Umpan
6.21.0 menyusuli perpindahan CrawlForge daripada Google Custom Search, yang dihentikan Google pada 2027-01-01, kepada Brave Search API. search_web kini melaporkan bahagian belakang yang melayaninya, dan serp_rank menandakan halaman hasil yang kelihatan seperti umpan: Google mula memberikan sesetengah semakan kedudukan automatik hasil yang kelihatan sebenar tetapi tidak berkaitan dengan pertanyaan. Nota naik taraf: hasil search_web datang daripada indeks bebas Brave, total_results tidak lagi dilaporkan dan related_searches kosong. 6.21.1 membetulkan penomboran halaman search_web pada Brave: offset yang bukan gandaan limit memulangkan hasil yang salah, dan offset 90 dengan limit kecil kembali kosong.
- serp_rank memulangkan suspect: true dan satu amaran apabila kurang daripada 1 dalam 5 hasil teratas menyebut kata kunci. Pada 2026-10-19 satu semakan untuk "crawlforge" kembali tanpa satu pun daripada 10 teratas menamakannya, sedangkan Search Console meletakkan tapak itu di #1. Tetap 5 credits
- search_web melaporkan provider.backend sebagai Brave Search API dan bukan Google Search yang ditetapkan tegar, dan Creator Mode boleh memanggil Brave Search API secara terus
- Berkas .mcpb membaca PDF pada macOS dan Windows: setiap berkas sejak 6.0.0 hanya membawa binari asli Linux, jadi process_document gagal dengan "DOMMatrix is not defined". Manifest kini menyenaraikan kesemua 31 alat
Tindakan Pelayar Menunggu Crawl-delay, dan Laluan Fail Tempatan Kekal Tempatan
6.20.0 menjadikan alat pelayar sesopan alat pengambilan dan menutup dua jurang yang senyap. Klik, tekan kekunci, select atau kotak semak dalam scrape_with_actions dan browser_session kini menunggu Crawl-delay robots.txt halaman yang sedang dibuka sebelum dijalankan, seperti navigate sebelum ini, dan permintaan yang sampai ke satu hos pada masa yang sama beratur dengan jarak satu kelewatan penuh. Nota naik taraf: scrape kini menerima paling banyak satu format highlights dan satu format question bagi setiap panggilan. Format kedua ditolak tanpa caj, sedangkan dahulu ia menggantikan yang pertama.
- scrape_with_actions dan browser_session: click, press, select atau check menunggu Crawl-delay hos halaman sebelum dijalankan, kerana pelayar menghantar sebarang permintaan yang dicetuskannya sebelum apa-apa sempat bertanya. navigate dan muatan pertama sudah pun dijarakkan
- Permintaan yang tiba serentak untuk hos yang mempunyai Crawl-delay kini beratur dengan jarak satu kelewatan penuh pada MCP server dan API REST. Dahulu, setiap permintaan yang masuk semasa satu penantian keluar pada saat yang sama, dan map_site serta generate_llms_txt kini turut menjarakkan pengambilan peta laman
- process_document membaca fail tempatan, dan laporan penggunaannya menghantar laluan penuh ke crawlforge.dev. Kini ia hanya melaporkan jenis fail, sebagai [local file].pdf, laman web menyamarkan laluan daripada pelayan lama apabila ia tiba, dan baris yang disimpan telah dibersihkan
- scrape: format highlights atau question kedua dalam satu panggilan ialah ralat pengesahan tanpa caj, bukannya menindih yang pertama secara senyap sementara caj tambahan +1 kredit masih dikenakan
Setiap Kecacatan daripada Ujian Langsung Oktober Dibaiki atau Diputuskan
6.19.0 melengkapkan ujian langsung ke atas kesemua 31 alat yang dijalankan pada 2026-10-03. Parameter yang tidak berbuat apa-apa kini berfungsi atau telah dibuang, alat teks tidak lagi mencantumkan perenggan, ralat menamakan langkah seterusnya mengikut apa yang sebenarnya gagal, dan lapan lagi alat menerima max_inline_chars. Nota naik taraf: enable dan disable stealth_mode serta captureScreenshots scrape_with_actions dibuang, read browser_session memulangkan seluruh halaman, dan beberapa medan yang terlalu besar dipangkas daripada extract_content, search_web, map_site dan scrape_with_actions.
- stealth_mode pada Chromium telah menghalang cabaran Cloudflare sendiri daripada dimuatkan: tiga pengepala paksa menyebabkan setiap permintaan rentas asal menghantar pra-semakan CORS yang ditolak oleh challenges.cloudflare.com. Kini cabaran itu dimuatkan, dan halaman dilaporkan sebagai disekat oleh cloudflare. 6.19.1 membuang pengepala paksa yang sama jenis daripada konteks pelayar yang disetempatkan
- Jadual extract_text ialah grid seragam dengan URL imej dan pautan mutlak pada MCP server dan REST API, dikongsi melalui crawlforge-extractors 1.17.0, dan markdown scrape REST mengekalkan jadualnya
- comment_count reddit_search mengira setiap ulasan yang dipulangkan dan comments_collapsed yang ditinggalkan; serp_rank menyatakan bahawa sasaran dipadankan mengikut hos dan satu semakan ialah satu sampel, dan REST API memulangkan se_results_count dan check_url. 6.19.2 menetapkan depth lalainya kepada 30 pada kedua-duanya
- Ralat membawa langkah seterusnya mengikut kegagalan sebenar (robots, SSRF, 404, tamat masa atau parameter yang salah), dan analyze_content mempunyai kata henti untuk sebelas lagi bahasa
extract_text dan extract_links Mencapai Halaman Berdinding dan Sepadan dengan REST API
Dua pembaca halaman paling murah mendapat tangga pengambilan scrape. Dengan escalate: true, halaman berdinding (vendor bernama, 403, 429 atau 444) dibaca semula melalui peringkat stealth yang sama yang digunakan oleh scrape, diunjurkan pada 6 credits dan dicaj 1 apabila pengambilan biasa mendapat halaman itu; 404 atau 5xx tidak pernah dieskalasi. Tanpanya, kegagalan kini menyatakan apa jawapan sasaran dan vendor mana yang menyekatnya. PDF atau binari lain gagal dengan petunjuk ke process_document dan bukannya memulangkan sampah, badan JSON kembali dengan nota, had masa pengambilan ialah 15 s dengan satu cubaan semula selepas Retry-After yang singkat, dan cangkerang kosong yang dipaparkan pada klien ditandakan dengan rendered: false. Kedua-dua alat kini memulangkan apa yang dipulangkan oleh REST API: extract_text membaca satu baris bagi setiap elemen blok dan menerima selector serta max_length, dan extract_links memulangkan satu bentuk rekod pada kedua-dua permukaan. Nota naik taraf: rekod extract_links tidak lagi membawa is_external; baca type sebagai gantinya. 6.18.1 membetulkan apa yang ditemui oleh ujian langsung ke atas kesemua 31 alat: crawl_deep tidak lagi ranap pada URL permulaan yang ditolak dan berhenti apabila max_pages dicapai, map_site melaporkan URL permulaan yang tidak dapat dibacanya sebagai ralat, batch_scrape menolak PDF dan bukannya memulangkan baitnya sebagai teks, dan scrape menamakan halaman cabaran klien Fastly sebagai dinding. Nota naik taraf: pages_crawled crawl_deep kini mengira halaman yang berjaya diambil sahaja, dan monitoringOptions.enabled: false track_changes tidak lagi memulakan pemantau.
- URL yang sama melalui MCP server dan REST API memulangkan pautan yang sama: 327, 196 dan 123 pautan, dengan 20 yang pertama serupa, pada tangkapan Wikipedia, Hacker News dan BBC News
- Rekod pautan ialah { href, text, type, domain, rel, original_href }: pautan mailto:, tel: dan javascript: mempunyai type "other", <base href> dipatuhi, dan pendua dipadankan tanpa fragmen atau garis miring di hujung
- browserOptions.timeout scrape_with_actions kini mengehadkan pemuatan halaman, dan hasil scrape_with_actions atau browser_session yang melebihi had mengekalkan laporan dindingnya secara inline
- 6.18.1: crawl_deep dengan max_pages: 3 pada laman yang sarat pautan mengambil 232 s dan memproses 2,290 pautan dalam baris gilir; kini ia berhenti apabila had dicapai. formAutoFill menanda butang radio dan kotak semak serta memilih pilihan, act browser_session memulangkan tangkapan skrin sebagai URI sumber dan bukannya base64 sebaris, dan agent tidak menjalankan carian web bagi soalan yang terhad kepada URL permulaannya
Setiap Dinding yang Ditemui Rantaian Dinamakan, dan Proksi Anda Sendiri pada Rantaian Tindakan
scrape_with_actions kini menyemak setiap navigasi yang dibuatnya, bukan hanya halaman akhir: pemuatan awal dan setiap tindakan navigate disenaraikan di bawah navigations dengan status HTTP masing-masing dan, apabila bertemu dinding, vendornya. Halaman perantaraan cabaran AWS WAF, iaitu halaman 202 yang digunakan Amazon untuk menjawab pelayar headless, kini dinamakan aws-waf pada setiap permukaan. Rantaian stealth boleh keluar melalui proksi kediaman pemanggil sendiri dengan browserOptions.proxyRotation (Chromium sahaja; CrawlForge tidak membekalkan proksi), dengan kelayakan dibuang daripada hasil dan laporan penggunaan. Proksi bagi setiap panggilan ditolak pada Camoufox, yang berkongsi satu pelayar merentas panggilan dan oleh itu akan membawa trafik pemanggil lain. 6.17.1 juga membolehkan penantian Cloudflare stealth mengenali halaman "Performing security verification" semasa Cloudflare, dan mengehadkan penantian itu pada 10 s seperti yang dimaksudkan: rantaian doordash.com yang berdinding turun daripada 39.5 s kepada 19.5 s. Tiada apa-apa di sini yang melepasi cabaran.
- navigations: [{ url, finalUrl, httpStatus, blocked? }] pada setiap rantaian, serta httpStatus dan blocked pada setiap hasil navigate; success dan blocked peringkat atas masih ditentukan oleh halaman akhir
- Proksi pemanggil yang hosnya ialah loopback, link-local atau alamat metadata awan ditolak sebelum pelayar dilancarkan
- Peraturan aws-waf terletak dalam crawlforge-extractors 1.12.0, jadi MCP server dan REST API menamakannya dengan cara yang sama
extract_embedded_state Menyahkod Nuxt 3, SvelteKit, YouTube dan Shopify, dan Ubah Hala Kini Disaring
extract_embedded_state kini menyahkod apa yang sudah dibawa pulang oleh pengambilan biasa, tanpa pelayar: __NUXT_DATA__ Nuxt 3 sebagai objek dan bukannya tatasusunan indeks, data halaman SvelteKit, ytInitialData dan ytInitialPlayerResponse (halaman tontonan YouTube memulangkan videoDetails-nya), Remix, data-page Inertia, ShopifyAnalytics.meta dan JSON produk Shopify, serta atribut data-* JSON yang besar. Pemboleh ubah global yang diberikan literal JavaScript dan bukannya JSON dibaca oleh penilai statik, jadi tiada kod halaman dijalankan. Rujukan baris Next.js Flight kepada baris lain diselesaikan, indeks data_rows menunjuk kepada baris yang membawa data dan bukannya markup, dan find memulangkan setiap laluan yang kuncinya sepadan, sedia untuk dihantar semula sebagai path. Keluaran yang sama menyaring setiap ubah hala: setiap lompatan disemak terhadap senarai sekatan dan robots.txt sebelum diikuti, menunggu Crawl-delay hos, dan ditandatangani semula untuk Web Bot Auth. Harga kekal 2.
- find memulangkan sehingga 50 padanan sebagai { path, preview } dengan 200 aksara pertama nilai itu; raw: true turut mengekalkan tatasusunan Nuxt yang belum dinyahkod. Kedua-duanya berfungsi pada REST API juga
- Ubah hala ke laluan yang tidak dibenarkan oleh robots.txt, atau ke hos yang disekat, ditolak sebelum diminta, dan panggilan yang gagal kerananya tidak dicaj. Alat pelayar menyemak setiap lompatan dan URL tempat halaman mendarat, dan halaman yang disimpan oleh scrape_with_actions atau browser_session disemak semula selepas setiap tindakan
- Baris log audit tidak lagi menyimpan kelayakan daripada URL: userinfo dibuang dan parameter pertanyaan yang dinamakan seperti key atau token disunting
extract_embedded_state: Pratonton untuk Muatan Besar, dan Bacaan Semula Stealth
Hasil yang melebihi max_inline_chars kini kembali sebagai pratonton dan result_handle dan bukannya keseluruhan muatan: producthunt.com dan zappos.com sebelum ini memulangkan 1-2 MB secara inline. Bahagian inline mengekalkan senarai found, saiz bait, kunci peringkat atas data dan pratonton berformat yang dipotong pada sempadan baris, tidak sekali-kali di tengah nilai, dan read_result membaca mana-mana bahagian muatan penuh mengikut json_path. keys_only: true memulangkan dua peringkat kunci dengan setiap nilai digantikan oleh jenisnya, untuk penerokaan yang murah. Dengan escalate: true, halaman berdinding (403, 429, halaman cabaran atau cangkerang kosong) dibaca semula melalui peringkat stealth yang sama yang digunakan oleh scrape dan dihuraikan sekali lagi, dan dalam pelayar, pemboleh ubah global rangka kerja dibaca daripada window selepas JavaScript berjalan, di bawah window_state. Tanpa escalate, dinding kini menjadi ralat yang menamakan vendornya dan bukannya kejayaan tanpa apa-apa ditemui. Harga kekal 2; escalate diunjurkan 7 dan mengenakan 2 apabila pengambilan biasa mendapat halaman itu.
- Disahkan pada max_inline_chars: 3000: producthunt.com 2,979 dan zappos.com 2,970 aksara secara inline, selebihnya hanya satu panggilan read_result
- doordash.com (Cloudflare) memulangkan 103-106 baris Next.js Flight melalui escalate pada impit, Camoufox dan Chromium
- window_state membaca __NEXT_DATA__, __NUXT__, __remixContext, ytInitialData, ytInitialPlayerResponse, stor Redux dan Apollo, __TGT_DATA__ dan __PWS_DATA__; pada Camoufox, bacaan melalui dunia terpencil (isolated world) Firefox, jadi tiada skrip berjalan dalam dunia halaman itu sendiri
Snapshot di Dalam Shadow DOM dan Iframe, dan Sepanduk Kuki Dijawab
Snapshot kini menggunakan snapshot kebolehcapaian asli Playwright, jadi elemen di dalam shadow root terbuka dan iframe, termasuk yang merentas asal, muncul dalam pepohon dengan ref @e biasa yang boleh diklik oleh act. Format pepohon tidak berubah, penjelajahan halaman lama kekal sebagai sandaran, dan setiap snapshot menyatakan yang mana satu dijalankan. scrape_with_actions juga menerima browserOptions.consent: "reject" menjalankan opt-out DuckDuckGo autoconsent sekali selepas navigasi pertama dan selepas setiap tindakan navigate, "accept" menjalankan opt-in-nya, dan lalai "off" membiarkan sepanduk, jadi rantaian yang mengkliknya sendiri terus berfungsi. Harga tidak berubah.
- source: "aria" | "walk" pada setiap snapshot; snapshot browser_session mendapat pepohon yang sama, dan kawalan aria-hidden yang kelihatan pada skrin kini disenaraikan
- consent: { cmp, action, ms } pada hasil, dihadkan pada 2 s setiap navigasi; halaman tanpa sepanduk yang sepadan melaporkan action: "none" dan tidak sekali-kali menggagalkan rantaian. Disahkan pada dialog Sourcepoint The Guardian dan pada Ecosia di bawah Camoufox
- Pembantu stealth untuk tatal dan masa membaca menerima pemilih Playwright, jadi ref di dalam shadow root dan bingkai turut berfungsi pada laluan stealth
Snapshot yang Menunggu Halaman, dan Baris Gilir Menggantikan Penolakan
Pusingan kedua pembetulan scrape_with_actions. Snapshot kini menunggu halaman dipaparkan sebelum membacanya: peristiwa load, kemudian tetingkap senyap tanpa perubahan DOM selama 300 ms dan tanpa permintaan yang sedang berjalan selama 500 ms, berhad dan tidak sekali-kali melebihi had masa tindakan itu. Snapshot halaman utama Amazon meningkat daripada 0 nod kepada 236, termasuk kotak carian. Klik, tekanan kekunci dan pilihan menunggu dengan cara yang sama selepasnya, jadi perubahan laluan aplikasi satu halaman dapat dilihat. Lonjakan panggilan yang melebihi had pelayar kini beratur sehingga 60 s dan bukannya gagal dengan "Maximum concurrent sessions", dan browser_session berkongsi slot yang sama hanya semasa ia membuka halaman. Klik stealth pada Camoufox tidak lagi tersekat: dua lapisan pemanusiaan kursor telah ditindan, dan klik persetujuan Ecosia turun daripada 12-20 s kepada 1.4 s. Harga tidak berubah.
- Hasil snapshot melaporkan waited_ms dan settled_by (quiet, cap atau closed); snapshot browser_session mendapat penantian yang sama
- CRAWLFORGE_MAX_ACTION_SESSIONS menetapkan slot pelayar (lalai 3) dan CRAWLFORGE_ACTION_QUEUE_TIMEOUT_MS tempoh beratur (lalai 60 s); hasil membawa queued_ms, dan executionTime tidak lagi mengira masa menunggu
- Pada Camoufox, simulator klik membuat satu gerakan dan membiarkan Camoufox melukis laluannya, dengan had 0.5 s bagi setiap gerakan; simulateClick kini mematuhi had masa tindakan dan bukannya lalai 30 s Playwright
Halaman Ralat Aplikasi Dikesan, dan Kegagalan scrape_with_actions yang Lebih Murah
Susulan kepada langkah impit dalam 6.11.0. Halaman pendek yang teksnya bermula dengan ralat aplikasi — "Something went wrong", "Oops!", "An error occurred" atau pengecualian sisi klien Next.js — kini dianggap sekatan lembut walaupun tajuknya biasa, jadi ia diteruskan ke pelayar stealth dan bukannya dikembalikan sebagai halaman. "Something went wrong. Wait a moment and try again." daripada quora.com sebelum ini lepas pada setiap laluan, bukan hanya melalui impit. Peraturan ini datang daripada crawlforge-extractors 1.10.0, yang kini diperlukan oleh pelayan. Tetapan baharu CRAWLFORGE_IMPIT=off mematikan langkah impit untuk keseluruhan pelaksanaan: diukur dari IP pusat data instans yang dihoskan, ia tidak melepasi satu pun dinding penanda aras, jadi perkhidmatan yang dihoskan menjalankannya dalam keadaan mati manakala pemasangan npm mengekalkannya hidup. Harga tidak berubah. 6.12.1 ialah pusingan pertama pembetulan scrape_with_actions daripada semakan langsung: maxRetries kini lalai kepada 0, jadi rantaian yang gagal tidak lagi berjalan dua kali (klik pada pemilih yang tiada turun daripada 20.8 s kepada kira-kira 4 s), dan setiap larian yang memang diminta oleh pemanggil dilaporkan di bawah attempts[]. browserOptions.timeout kini sampai kepada setiap tindakan, screenshotOnError: false dipatuhi, dan bait tangkapan skrin tidak lagi bocor secara inline di sebelah URI sumbernya.
- Dokumen di bawah 200 aksara yang teksnya bermula dengan frasa ralat aplikasi ialah sekatan lembut tanpa mengira tajuknya, jadi halaman ralat sandaran dicuba semula dalam pelayar dan bukannya dikembalikan sebagai kandungan
- CRAWLFORGE_IMPIT=off melangkau langkah impit peringkat eskalasi bagi pelaksanaan yang IP keluarnya tidak dapat dibantu olehnya, dan dibaca pada setiap panggilan. Perkhidmatan yang dihoskan mematikannya; pemasangan npm mengekalkannya, dan dari IP kediaman ia melepasi indeed.com
- Eskalasi scrape pada API REST kekal menggunakan pelayar sahaja atas keputusan, dan cadangan memainkan semula kuki kelulusan Cloudflare melalui impit ditolak: kuki itu terikat pada User-Agent yang digunakan untuk memperolehnya, jadi memainkannya semula bermakna menghantar User-Agent pelayar dan bukannya User-Agent CrawlForge sendiri
- scrape_with_actions: maxRetries lalai kepada 0 dengan setiap larian dilaporkan dalam attempts[], browserOptions.timeout ialah had masa bagi setiap tindakan, pemulihan ralat dihadkan pada 3 s setiap tindakan dan dilangkau bagi tindakan menunggu atau pemilih yang tidak sepadan dengan apa-apa, dan rantaian dengan satu tangkapan skrin kembali di bawah 5 KB dan bukannya kira-kira 118 KB
Cubaan TLS Chrome Sebelum Pelayar
Apabila scrape dijalankan dengan escalate: true, atau agent mencuba semula halaman yang disekat, dan enjinnya "auto" (lalai), jabat tangan TLS Chrome kini dicuba sebelum sebarang pelayar dilancarkan. Ia membawa User-Agent CrawlForge yang jujur. Jika ia mendapat halaman, tiada pelayar dimulakan: indeed.com kembali dalam kira-kira sesaat dari IP kediaman di mana pengambilan biasa disekat oleh Cloudflare. Jika tidak, pelayar berjalan seperti sebelum ini, dan harganya 2 + 5 dalam kedua-dua keadaan. Langkah ini menggunakan impit, kebergantungan pilihan baharu dengan binari prabina; tanpanya, eskalasi berkelakuan sama seperti dalam 6.10.0. Pada Chromium, pemaparan stealth yang masih tertahan oleh dinding Cloudflare dengan bingkai Turnstile kini mengklik kotak semak sekali, halaman 200 yang hanya membenamkan widget Turnstile tidak lagi dianggap sekatan, dan setiap eskalasi menulis satu baris ke log audit pematuhan.
- impit hanya berjalan dalam peringkat eskalasi: tidak pernah pada pengambilan biasa, dan tidak pernah apabila pemanggil menamakan playwright atau camoufox. Halaman yang diperolehnya melaporkan stealth.engine: "impit" dengan amaran yang menamakannya, setiap lompatan ubah hala disemak SSRF dengan resolusi DNS, dan halaman dengan kurang daripada 200 aksara teks yang kelihatan diteruskan ke pelayar
- Klik kotak semak Turnstile pada Chromium melalui input tetikus Playwright biasa, hanya apabila dinding masih ada selepas tempoh menunggu biasa dan halaman mempunyai bingkai challenges.cloudflare.com. Disahkan terhadap sitekey ujian interaktif paksa Cloudflare, yang hanya membuktikan mekanismenya: sama ada laman sebenar menerima klik itu masih bergantung pada IP dan cap jari yang dinilainya
- nowsecure.nl menjawab 200 dengan widget Turnstile pada sitekey ujian Cloudflare, dan setiap "Blocked" yang direkodkan untuknya datang daripada lapisan keputusan kami sendiri. Dokumen 200 dengan tajuk, teks dan hanya penanda widget kini lulus; dinding sebenar (403) dan halaman kosong kekal disekat
- Satu baris stealth_escalation ditulis ke logs/compliance-audit.log untuk scrape dengan escalate, cubaan semula stealth agent dan stealth_mode, selepas pintu pematuhan dan sebelum pelayar menavigasi, dengan ID kunci dan pemilik yang dicincang dan bukannya nilai mentah. Baris robots_override tidak lagi menunjukkan apiKeyId: "anonymous" pada pelayan langsung
Clearance Jar: Cabaran yang Diselesaikan Kekal Selesai
Apabila pemaparan stealth berjaya melepasi dinding Cloudflare atau DataDome, kuki kelulusan vendor itu — tepatnya cf_clearance, __cf_bm dan datadome — disimpan dan dimainkan semula ke konteks stealth seterusnya yang mempunyai enjin, User-Agent dan proksi yang sama. Ini merangkumi peringkat eskalasi scrape, stealth_mode, cubaan semula stealth agent, browser_session dan scrape_with_actions. Pada stackoverflow.com dari IP kediaman, panggilan stealth pertama melalui halaman perantaraan Cloudflare dalam 4.1 saat; panggilan kedua terus mendapat 200 tanpa cabaran dalam 1.6 saat. Tiada kuki lain yang pernah disimpan, jadi log masuk seorang pemanggil tidak boleh sampai ke konteks pemanggil lain.
- Hanya tiga kuki bernama disimpan, dikunci mengikut enjin, User-Agent dan proksi. Pemaparan yang bertemu dinding sekali lagi membuang kelulusan hos itu, tempoh luputnya mengikut kuki itu sendiri dengan had 24 jam, dan jar menyimpan paling banyak 32 identiti dengan 200 kuki setiap satu
- Disimpan di ~/.crawlforge/stealth-clearance.json dengan mod 0600 dan kunci dicincang, jadi proses kedua menggunakan semula kelulusan dari cakera: indeed.com dimuatkan tanpa sebarang permintaan platform cabaran. CRAWLFORGE_CLEARANCE_JAR=off mematikannya
- Kumpulan profil Chromium kekal sengaja tidak dibina: profil yang dikongsi menyimpan log masuk dan storan laman, dan pada instans yang dihoskan ia akan bocor antara pelanggan
agent Mencuba Semula Halaman yang Disekat dalam Pelayar Stealth
Sebelum 6.9.0, peringkat tindakan alat agent hanya menjalankan pengambilan biasa. Halaman benih yang dicabar digugurkan dan jawapan dibina daripada petikan carian, yang dalam ujian Indeed semakan itu menghasilkan "3.3 stars, based on 3.3 reviews". Kini halaman yang bertemu cabaran, 403 atau 429, halaman kosong atau tamat masa dicuba semula melalui peringkat stealth yang sama digunakan oleh escalate: true pada scrape, dengan pintu pematuhan, pemilih enjin dan proksi yang sama. Dengan enjin Chromium, ujian yang sama membaca halaman benih itu sendiri dan menjawab 3.3 bintang daripada 58,942 ulasan. Harga mengikut apa yang berjaya: 8 credits, ditambah 5 bagi setiap cubaan semula stealth yang mendapat halaman.
- URL yang dinamakan pemanggil dicuba semula dahulu, dan URL yang ditemui hanya apabila ia tiada petikan carian yang relevan. Penolakan, 404 dan ralat 5xx tidak pernah dicuba semula, satu larian membuat paling banyak 2 cubaan semula, dan tiada yang bermula dengan kurang daripada 20 saat masa berbaki
- Cubaan semula yang bertemu dinding sekali lagi, atau gagal, adalah percuma. Keputusan melaporkan stealth_retries (cubaan) dan stealth_retries_charged (dicaj), bukti daripada cubaan semula ditanda via: "stealth", dan had yang diterbitkan ialah 18 credits, 8 apabila tiada cubaan semula. Laluan REST mengecaj sama: 8 + 5 bagi setiap cubaan semula yang dicaj
- Seperti yang diukur: dengan enjin Camoufox dari IP yang sama, Cloudflare menyekat cubaan semula itu, dan eskalasi scrape yang tidak diubah gagal dengan cara yang sama di situ
Penanda Aras Stealth, dan Kebocoran yang Diukurnya Ditutup
Penanda aras semakan stealth 2026-09 sebelum ini dijalankan secara manual; 6.8.0 menjadikannya satu arahan, npm run bench:stealth, yang menguji pelayar stealth dan pengambilan biasa terhadap dua belas dinding bot dan lima halaman pengesan, dan mengepalai matriksnya dengan OS hos, kelas IP keluar, enjin dan versi pelayar. Diukur dengannya, kebocoran ditutup: navigator.webdriver membaca false dan bukannya dipadam dan tiada apa yang menjadi sifat sendiri navigator, userAgentData tidak lagi membawa jenama HeadlessChrome, versi utama Chrome diambil daripada binari yang dipasang, dan Web Worker kini menjawab sama seperti dokumen. Ujian kendiri pengesan mencapai 19 lulus, 0 gagal, 1 dilangkau pada kedua-dua enjin. Camoufox, enjin yang melepasi paling banyak dinding, kini lalai melalui enjin "auto", dengan peralihan ke Chromium yang dilaporkan dan bukannya senyap.
- npm run bench:stealth:ci menjalankan sepuluh ujian kendiri dalam halaman yang tidak memerlukan laman pihak ketiga dan hanya gagal pada regresi yang tidak disenaraikan dalam fail garis dasar, dengan kawalan negatif --self-check yang memaksa navigator.webdriver kepada true dan mesti dikesan
- Halaman yang hanya membenamkan widget Turnstile tidak lagi dianggap sekatan Cloudflare (quora.com kini lulus pada kedua-dua enjin), dan halaman perantaraan bertajuk tersuai mendapat masa menunggunya. Halaman stealth tidak lagi memintas permintaan atau membuang imej, fon dan helaian gaya secara rawak, dan --disable-web-security dibuang daripada pelayar stealth
- escalate_engine pada scrape dan engine pada stealth_mode kini lalai kepada "auto": Camoufox dahulu, Chromium dengan amaran apabila binarinya tiada. browser_session dan scrape_with_actions mendapat parameter engine, CRAWLFORGE_STEALTH_PROXIES memberi setiap laluan stealth senarai proksi peringkat pelayan, dan User-Agent Camoufox yang dua nombor versinya tidak sepadan pada kira-kira separuh pelancaran telah dibaiki
Putaran Proksi yang Benar-benar Menghala, dan Camoufox yang Kekal Firefox
Satu ujian pengesanan bot terhadap 6.6.2 mengesyorkan penghalaan melalui proksi kediaman untuk melepasi semakan reputasi IP Cloudflare. Konfigurasi itu tidak berbuat apa-apa, dalam tiga cara berbeza: proksi diletakkan pada bendera Chromium yang tidak boleh membawa user:pass yang disertakan dengan setiap proksi kediaman, laluan pelancaran Camoufox berjalan tanpa proksi walau apa pun yang diminta, dan proksi dibaca sekali sahaja semasa pelancaran, jadi putaran tidak pernah berlaku. Ketiga-tiganya telah dibaiki, dan stealthConfig.proxyRotation kini menerima URL proksi biasa dengan kelayakan dikenakan bagi setiap konteks pelayar. Siasatan itu turut menemui lebih banyak bahagian laluan stealth yang bertentangan dengan dirinya sendiri: Camoufox, yang dipilih kerana tiada apa untuk dikesan, telah diberi User-Agent Chrome dan client hints Chromium.
- proxyRotation menerima URL http, https, socks4 dan socks5, membuat pengesahan pada kedua-dua enjin, menganggap entri yang cacat sebagai ralat dan bukannya permintaan tanpa proksi, bermula pada entri pertama, dan tidak lagi memulangkan kata laluan proksi daripada get_stats. CrawlForge tidak menyediakan proksi; ini menghala melalui proksi anda
- Camoufox menampilkan identiti Firefoxnya sendiri, tanpa pengepala sec-ch-ua dan tanpa skrip berbentuk Chromium disuntik, dan berjalan dengan ciri geoip, block_webrtc dan humanize sendiri dihidupkan. Di sebalik proksi ia mengambil bahasa, zon waktu dan lokasi daripada IP keluar
- scrape pada stealth_mode menunggu peristiwa load halaman dan sehingga DOM berhenti berubah sebelum membaca, melaporkan waited_for_render_ms, dan ralat JavaScript tidak ditangkap milik halaman Firefox tidak lagi menamatkan proses
browser_session — alat ke-31
Satu halaman pelayar yang terus hidup selepas panggilan yang membukanya berakhir. browser_session ialah satu alat dengan parameter operation: open membuka sesi pada satu URL dan mengembalikan session id, snapshot mengembalikan pepohon kebolehcapaian halaman dengan ref stabil pada setiap elemen interaktif (@e1 [textbox] "Email", @e3 [button] "Sign in"), act menjalankan 1-20 tindakan pelayar yang selector-nya boleh jadi salah satu ref itu, read mengekstrak markdown, HTML, teks atau metadata daripada DOM langsung seperti keadaannya selepas segala yang diklik sesi itu, screenshot menangkap halaman atau satu elemen, close menamatkan sesi dan list menyatakan sesi yang sedang dipegang oleh sesuatu API key. Kitarannya ialah lihat dahulu, kemudian bertindak: agent membaca ref yang diberikan snapshot dan bukan meneka pemilih CSS, dan log masuk dibayar sekali sahaja dan bukan sekali bagi setiap panggilan — scrape_with_actions tidak mampu berbuat demikian kerana pelayarnya ditutup sebaik panggilan itu selesai. Setiap operation dikenakan harga secara berasingan bermula 1 credit: open 3, read 2, manakala snapshot, act, screenshot, close dan list 1 setiap satu, dengan 3 milik open sebagai kadar yang diterbitkan. Sesi memang direka pendek: ttl (lalai 600s, julat 30-3600) ialah jam mutlak dan activity_ttl (lalai 300s, julat 10-3600) jam melahu, dan mana-mana yang tamat dahulu menutup halaman itu. Gerak "lihat dahulu" yang sama turut sampai kepada rantaian sekali jalan: scrape_with_actions menerima tindakan snapshot, jadi satu rantaian boleh menyenaraikan apa yang ditawarkan halaman sebelum menamakan pemilih. 6.6.1 menyusul dengan pusingan ujian langsung pertama terhadap alat ini sendiri: halaman yang disekat kini dinamakan sedemikian dan bukan dikembalikan sebagai kandungan, executeJavaScript memulangkan nilainya, dan read dihadkan seperti setiap alat kandungan yang lain. 6.6.2 menutup pusingan langsung kedua: tangkapan skrin halaman penuh yang melebihi had mesej stdio sebelum ini menutup keseluruhan sambungan MCP, dan kini ditolak dengan saiznya dan apa yang patut diambil sebagai ganti.
- browser_session baharu (1-3 credits setiap operation) mengekalkan satu halaman pelayar hidup merentas panggilan API: open, snapshot, act, read, screenshot, close dan list, dengan session id daripada open dibawa pada setiap panggilan berikutnya. Setiap operation dibilkan pada harganya sendiri — open 3, read 2, selebihnya 1 setiap satu — jadi satu lihatan murah tidak sekali-kali membayar harga open yang mahal, dan aliran log masuk lalu baca (open, snapshot, act, act, read, close) berjumlah 9 credits
- snapshot mengembalikan halaman sebagai pepohon kebolehcapaian dengan ref stabil pada setiap elemen interaktif, dan act menghalakan selector ke @e1 dan bukan pemilih CSS yang diteka. Satu ref hanya milik dokumen tempat snapshot-nya diambil: sebarang navigasi membatalkan semua ref, dan bertindak pada ref basi gagal dengan ralat yang menyuruh anda snapshot semula, bukan senyap-senyap mengklik benda yang salah. scrape_with_actions turut mendapat tindakan snapshot yang sama, jadi rantaian sekali jalan pun boleh melihat sebelum bertindak
- Sudah langsung pada REST API di POST /api/v1/tools/browser_session dengan sampul yang sama seperti setiap alat lain. Satu REST API key hanya boleh memegang satu sesi pada satu masa, dan open kedua semasa satu sesi masih hidup ditolak dengan ralat bernama dan bukan dibaris gilir, jadi close sesi itu apabila selesai dan jangan biarkan TTL tamat sendiri
- 6.6.1 membaiki kegagalan yang paling penting: dinding bot atau halaman ralat HTTP tidak lagi dibaca sebagai sesi yang berjaya. open dan read melaporkan httpStatus dan menamakan vendor yang menyekatnya — sebelum ini 403 daripada DataDome kembali sebagai success dengan satu perkataan "g2.com" sebagai halaman — executeJavaScript memulangkan nilainya tanpa perlu diminta, dan read dihadkan pada max_inline_chars dengan result_handle dan bukannya memulangkan setengah juta aksara secara inline
- 6.6.2 mengehadkan sumber tangkapan skrin di bawah had mesej stdio — PNG halaman penuh 18.5 MB sebelum ini menutup keseluruhan sesi MCP, bersama setiap alat pada sambungan itu — dan respect_robots: false kini memulangkan amarannya daripada open dan act, diaudit sebagai browser_session dan bukannya scrape_with_actions
Pusingan Merentas Sektor: Sokongan DOCX dan Tujuh Pembetulan
Enam kecacatan dan empat jurang daripada pusingan langsung kesemua 30 alat merentasi kira-kira 600 URL dalam tiga belas sektor: hartanah, penjagaan kesihatan, kewangan, pendidikan, sukan, makanan, hiburan, undang-undang dan kerajaan, bekalan industri, telekomunikasi dan harga SaaS, badan bukan untung, aktiviti luar dan sains. process_document kini membaca dokumen Word: fail .docx yang diambil sebagai URL sebelum ini kembali sebagai satu megabait bait ZIP yang dilaporkan sebagai teks halaman; kini kandungan yang diambil menentukan cara ia dibaca, PDF yang dihidangkan di bawah URL biasa sampai ke penghurai PDF, dan arkib atau imej ditolak dengan nama. scrape mengembalikan halaman tahap cukai irs.gov sebagai pengepalanya sahaja kerana laluan kandungan tersembunyi membaca helaian gaya cetakan sebagai CSS skrin, melipat gaya sebaris menjadi peraturan universal, dan memisahkan senarai pemilih :has() pada setiap koma; ketiga-tiganya dibetulkan dan halaman itu mengembalikan empat jadual kadarnya. track_changes menilai suapan yang bertambah satu rekod penuh sebagai tiada perubahan, extract_structured gagal sepenuhnya mengekstrak jadual apabila model melebihi bajet keluarannya, map_site mengabaikan laluan URL benih dan carian, dan scrape yang dipangkas kehilangan jawapan highlights dan question. Seperti yang diterbitkan, 6.5.0 juga menolak sebarang URL reddit.com sebelum pengambilan, kerana reddit.com menyekat setiap klien bukan pelayar, dan menamakan panggilan reddit_search yang membaca post yang sama; reddit_search kini mencuba Arctic Shift dahulu kemudian PullPush.
- process_document membaca DOCX dengan mammoth dan menghalakan PDF yang dihidangkan di bawah sourceType url ke penghurai PDF; kandungan yang tidak dapat dibacanya ditolak dengan nama dan bukannya dikembalikan sebagai bait
- Laluan kandungan tersembunyi scrape melangkau helaian gaya cetakan, tidak lagi membaca gaya sebaris sebagai peraturan universal, dan memisahkan senarai pemilih pada koma peringkat atas sahaja, jadi jadual cukai irs.gov kembali; hasil yang dipangkas mengekalkan jawapan highlights, question dan json secara sebaris
- track_changes mendaftarkan dokumen teks sahaja yang bertambah satu rekod; extract_structured mengekalkan baris lengkap daripada respons yang terpotong sebagai partial: true dan menamakan sebab sandaran yang sebenar; map_site mengehadkan skop kepada laluan URL benih dan menyusun mengikut istilah carian dalam setiap URL; Crawl-delay robots.txt yang panjang dinamakan dalam respons
- URL reddit.com ditolak sebelum sebarang pengambilan dengan USE_REDDIT_SEARCH dan dihalakan ke panggilan reddit_search yang tepat untuk URL itu, dan reddit_search mencuba Arctic Shift dahulu kemudian PullPush
Pembetulan Pusingan Runcit, Pelancongan dan Penerbangan
Lima kecacatan dan lima jurang daripada pusingan langsung kesemua 30 alat merentas 415 URL runcit, pelancongan dan penerbangan. Seperti pusingan sebelumnya, setiap kecacatan telah mengembalikan kejayaan dengan sesuatu yang hilang, bukan ralat. map_site membaca 75 daripada 1,878 URL peta laman boeing.com kerana peta laman itu menggunakan laluan loc relatif yang menyebabkan penghurai gagal; kini loc diselesaikan terhadap URL peta laman itu sendiri, entri yang rosak dilangkau secara sendirian, dan penghuraian kosong tidak disimpan ke cache mahupun dihidangkan daripadanya. scrape pada onlyMainContent lalainya menggugurkan jadual yuran bagasi berdaftar WestJet yang 6 baris, terlalu kecil untuk ujian saiz jadual data dan berada dalam komponen yang Readability skor rendah; kini jadual yang digugurkan dengan sel pengepala th dipulihkan tanpa mengira saiznya, dan jadual yang bermula dengan sel sudut kosong dipaparkan sebagai jadual paip dan bukan teks rata. scrape_with_actions pada pusat bantuan JavaScript mengembalikan pemegang tempat Content not available in markdown format sebagai kejayaan; markdown dan html kini datang daripada DOM selepas tindakan apabila pengekstrak tiada apa-apa. agent, apabila ditanya apa yang Southwest caj untuk beg berdaftar pertama, hanya merancang pertanyaan entiti kosong dan menjawab bahawa yuran itu tidak dinyatakan; pelan yang berhenti pada satu pertanyaan kini menerima perkataan tugas itu sendiri sebagai pertanyaan kedua, hanya pertanyaan entiti mengundi untuk akar langsung, dan jawapannya ialah $45 dengan petikan southwest.com. Pratonton crawl_deep ialah menu mega laman pada setiap halaman; halaman kini melalui laluan kandungan utama yang sama seperti scrape. Tiada alat yang berubah harga.
- map_site membaca peta laman yang ditulis dengan laluan loc relatif. Peta laman 1,878 URL boeing.com telah dihuraikan sebagai kosong kerana normalizeUrl gagal pada /, jadi alat itu berundur kepada merangkak pautan halaman utama dan mengembalikan 75. loc diselesaikan terhadap URL peta laman, satu entri rosak tidak lagi membuang yang lain, dan penghuraian kosong tidak pernah ditulis ke atau dihidangkan daripada cache peta laman, yang terus menjawab 75 selama sejam selepas penghurai dibetulkan
- Jadual dan halaman JavaScript: scrape memulihkan jadual yang digugurkan yang penulisnya menandakan sel pengepala th tanpa mengira saiznya, jadi jadual yuran WestJet kekal pada onlyMainContent lalai, dan sel sudut kosong dalam baris pertama yang selebihnya th dinaikkan supaya jadual dipaparkan dengan lajurnya. scrape_with_actions menghidangkan markdown dan html daripada DOM selepas tindakan, dengan markdownSource: body, dan bukan pemegang tempat apabila Readability tidak menemui artikel. Kandungan crawl_deep ialah kandungan utama halaman dan bukan menunya
- agent menambah perkataan tugas itu sendiri sebagai pertanyaan carian kedua apabila pelan keadaan semasa berhenti pada nama entiti kosong, mengekalkan pertanyaan entiti sebagai satu-satunya undian untuk akar langsung, dan boleh melangkaui halaman langsung apabila ia tidak menyatakan jawapan. get_batch_results menerima max_inline_chars dan mengembalikan pratonton serta result_handle melebihi had; extract_links tidak lagi mengira pseudo-pautan javascript:; reddit_search menamakan tetingkap pemanggil dan cara menyempitkannya apabila Arctic Shift tamat masa di dalamnya
Pengesahan Bersarang, Autoriti Versi dan Log Masuk Linux
Empat kecacatan daripada pusingan langsung R19, setiap satu jawapan salah yang yakin dan bukan ralat, ditambah satu ranap khusus Linux. extract_structured hanya mengesahkan satu peringkat, jadi tatasusunan teks halaman yang sesat lulus skema yang meminta tatasusunan objek; pengesah kini berada dalam satu modul, setiap pengguna menggunakannya termasuk sandaran pemilih CSS, dan success ialah false apabila medan wajib hadir tetapi bentuknya salah. Alat yang sama berundur kepada pemilih CSS pada jadual besar tanpa penjelasan kerana belanjawan keluaran mengira tatasusunan sebagai satu medan; belanjawan kini berskala dengan tatasusunan dalam skema, respons yang terpotong dicuba semula sekali pada dua kali belanjawan, dan kegagalan menamakan had token — julat yang boleh digunakan meningkat daripada kira-kira 43 baris kepada kira-kira 156. agent menjawab soalan versi daripada siaran forum yang lulus provenans kerana rentetan itu ada pada halaman yang diambil; untuk soalan versi, versi itu kini mesti muncul dalam sumber yang bukan halaman perbincangan, dan yang gagal ditandakan dalam provenance.unsupported_versions. analyze_content mereka entiti dan skor kebolehbacaan untuk teks bukan Latin; kedua-duanya melaporkan notApplicable untuk Cyrillic, Yunani, Arab dan Devanagari, dan kata henti Rusia menyertai senarai. 6.3.1: crawlforge login ranap pada Linux dengan ERR_MODULE_NOT_FOUND kerana satu import menggunakan huruf besar kecil yang salah, yang disembunyikan oleh sistem fail tidak peka huruf; ujian baharu membandingkan setiap import relatif dengan git ls-files.
- extract_structured mengesahkan bentuk bersarang: countries sebagai tatasusunan rentetan terhadap skema objek tidak lagi dilaporkan sah. Satu pengesah dalam src/utils/schemaValidate.js melayani setiap pengguna, ralat menamakan laluan (Field countries.0.capital: expected string, got number) dan dihadkan kepada sepuluh serta satu kiraan, dan success ialah false apabila medan wajib hadir tetapi bentuknya salah — perubahan yang ketara bagi pemanggil yang bercabang padanya
- Belanjawan token keluaran extract_structured berskala dengan tatasusunan dalam skema dan bukan mengira tatasusunan sebagai satu medan, respons yang terputus di tengah objek dicuba semula sekali pada dua kali belanjawan, dan kegagalan menyatakan model response was cut off at the N-token output limit dan bukan melaporkan ofset JSON; julat jadual yang boleh digunakan meningkat daripada kira-kira 43 baris kepada kira-kira 156. agent tidak lagi menjawab soalan versi daripada halaman perbincangan: versi mesti muncul dalam sumber bukan forum, satu penulisan semula pembetulan dijalankan, dan apa yang kekal ditandakan dalam provenance.unsupported_versions; provenance.checked kini melaporkan sama ada semakan itu dijalankan
- analyze_content melaporkan notApplicable untuk entiti dan kebolehbacaan pada teks bukan Latin dan bukan merekanya (rain and gusty telah kembali sebagai organisasi, dan laporan cuaca Rusia mendapat skor Very Easy), melanjutkan pengawal CJK kepada Cyrillic, Yunani, Arab dan Devanagari. 6.3.1 membetulkan crawlforge login pada Linux: satu import AuthManager.js menggunakan huruf besar kecil yang salah, yang diselesaikan oleh macOS dan Windows tetapi bukan Linux, jadi perintah itu mati semasa import bagi setiap pengguna Linux sejak 6.1.0; tests/unit/importCaseExactness.test.js kini menyemak setiap import relatif terhadap git ls-files
Monitor Terhos daripada MCP server
Monitor berjadual pada MCP server kini ada dua jenis. Monitor tempatan, operasi create_scheduled_monitor seperti sebelum ini, disimpan di bawah ~/.crawlforge/monitors, menyala dalam proses hanya selagi proses MCP server itu hidup, mengejar semula larian yang terlepas semasa mula semula, dan memberitahu melalui webhook atau Slack dari mesin anda; crawlforge monitor:run-due daripada cron sistem kekal sebagai laluan tempatan yang terjamin, dan monitor tempatan tidak pernah menghantar e-mel. Hantar scheduledMonitorOptions dengan hosted: true dan pelayan sebaliknya mendaftarkan monitor itu dengan perkhidmatan terhos di /api/v1/monitors menggunakan kunci API yang dikonfigurasikan, lalu mengembalikan id terhos dan URL papan pemuka. Sejak itu ia ialah monitor terhos yang sama yang diuruskan oleh API REST dan papan pemuka: penjadual CrawlForge sendiri mengambil, membandingkan, merekodkan setiap pemeriksaan dan memberitahu melalui e-mel dan webhook bertandatangan tanpa apa-apa yang berjalan di pihak anda, selang masa ditukar kepada cron dengan lantai 5 minit, dan zon waktunya UTC. Tiada alat yang berubah harga: mencipta atau menghentikan monitor terhos tidak berkos, mencipta monitor tempatan masih berkos 3 credits, dan setiap pemeriksaan terhos mengecaj harga track_changes bagi setiap sasaran yang dibandingkan.
- hosted: true pada monitor berjadual. create_scheduled_monitor mendaftarkan monitor itu dengan perkhidmatan terhos melalui /api/v1/monitors menggunakan kunci API yang dikonfigurasikan dan mengembalikan id terhos dan URL papan pemuka; e-mel dihantar ke notificationOptions.email.recipients dan webhook bertandatangan ke notificationOptions.webhook. list_scheduled_monitors menyenaraikan monitor tempatan dan terhos bersama-sama, setiap satu membawa bendera hosted, dan stop_scheduled_monitor memadam mana-mana satu. Mencipta atau menghentikan monitor terhos daripada MCP server tidak berkos, sama seperti API REST monitor; mencipta monitor tempatan masih berkos 3 credits
- Monitor tempatan berhenti berpura-pura menghantar e-mel. Monitor tempatan dengan tetapan pemberitahuan e-mel kini melaporkan ralat yang menunjuk kepada hosted: true dan bukannya kejayaan palsu; laluan e-mel tempatan itu sentiasa hanya pemegang tempat. Monitor tempatan memberitahu melalui webhook atau Slack dari mesin anda, menyala hanya selagi proses MCP server berjalan, mengejar semula larian yang terlepas semasa mula semula, dan crawlforge monitor:run-due daripada cron sistem ialah laluan tempatan yang terjamin
- Skema input track_changes diisytiharkan sekali sahaja dan dikongsi oleh pendaftaran pelayan dan alat itu, tanpa perubahan tingkah laku. AlertNotificationSystem.js, 601 baris yang tidak diimport oleh apa-apa pun, dipadamkan: padanannya yang hidup ialah modul notifier, dan perkhidmatan terhos yang menghantar e-mel dan webhook bertandatangan
Gesaan Pengesahan pada Kedua-dua Era Protokol
Lima alat yang bertanya sebelum larian yang mahal — crawl_deep melebihi 500 halaman, batch_scrape dalam mod segerak melebihi 25 URL, deep_research melebihi 50 URL, agent pada model pro, dan extract_structured tanpa LLM yang dikonfigurasikan serta lebih daripada tiga medan wajib — berserta amaran baki credits rendah, dibina atas permintaan sebaris elicitation/create era 2025, sedangkan revisi 2026-07-28 langsung tiada saluran permintaan dari pelayan ke klien: pada era itu gesaan tersebut senyap-senyap tidak menyala dan operasi diteruskan tanpa ditanya. Kini semuanya ialah pemulangan input_required berbilang pusingan, yang disajikan oleh SDK pada kedua-dua era, jadi gesaan itu sampai kepada anda pada era mana sekalipun. Panggilan yang kembali meminta pengesahan belum melakukan apa-apa kerja, jadi ia tidak memakan credits dan tidak menghasilkan rekod penggunaan; caj diambil sekali sahaja, apabila panggilan itu benar-benar selesai, dan menolaknya tidak menelan apa-apa kos. Keluaran yang sama membaiki elicitation atas HTTP, yang sebenarnya tidak pernah berfungsi: kedua-dua kaki HTTP disajikan daripada klon instans pelayan dan hanya klon yang pernah disambungkan, jadi pembantu itu membaca keupayaan klien yang tidak tertakrif pada setiap permintaan HTTP dan setiap sesi diteruskan tanpa ditanya — rosak sejak v3.2.0 dan gagal ke arah selamat sepanjang masa itu. Pengangkutan kini mencap klon yang menyajikan permintaan itu pada konteks permintaan, dan stdio tidak pernah terjejas.
- Gesaan pengesahan kini sampai kepada klien era 2026-07-28: crawl_deep melebihi 500 halaman, batch_scrape dalam mod segerak melebihi 25 URL, deep_research melebihi 50 URL, agent pada model pro, dan extract_structured tanpa LLM yang dikonfigurasikan serta lebih daripada tiga medan wajib, berserta amaran baki credits rendah, semuanya bertanya sebelum berjalan. Kesemuanya dibina atas permintaan sebaris elicitation/create era 2025, dan revisi 2026-07-28 tiada saluran permintaan dari pelayan ke klien, jadi pada era itu gesaan tersebut senyap-senyap tidak menyala dan operasi diteruskan tanpa ditanya. Setiap satu kini ialah pemulangan input_required berbilang pusingan, yang disajikan oleh SDK pada kedua-dua era — gesaan itu sampai kepada pengguna sama ada pada klien era 2025 mahupun era 2026
- Satu pusingan pengesahan tidak pernah dicaj. Panggilan yang kembali meminta pengesahan belum melakukan apa-apa kerja, jadi ia berharga 0 credits dan tidak menghasilkan rekod penggunaan; caj diambil sekali sahaja, apabila panggilan itu benar-benar selesai. Menolak pengesahan tidak menelan apa-apa kos, dan tiada alat yang berubah harga dalam keluaran ini
- Elicitation atas HTTP sudah dibaiki, dan ia sebenarnya tidak pernah berfungsi: kedua-dua kaki HTTP disajikan daripada klon instans pelayan dan hanya klon yang pernah disambungkan, jadi pembantu itu membaca keupayaan klien yang tidak tertakrif pada setiap permintaan HTTP dan setiap sesi diteruskan tanpa ditanya — rosak sejak v3.2.0 dan gagal ke arah selamat sepanjang masa itu, tidak pernah bertanya dan bukan bertanya secara salah. Pengangkutan kini mencap klon yang menyajikan permintaan itu pada konteks permintaan. Ini endpoint HTTP terhos sahaja: sambungan stdio, iaitu cara npx crawlforge-mcp-server dan setiap klien desktop bersambung, tidak pernah terjejas. Turut dibaiki: ujian asap bundel .mcpb dalam CI tidak lagi menetapkan kunci API pengganti
- Perintah baharu `crawlforge login`: serahan kunci API melalui pelayar. CLI mencetak URL kelulusan, pengguna yang telah log masuk meluluskannya di laman web, dan kunci dihantar kepada CLI sekali sahaja lalu disimpan ke ~/.crawlforge/config.json. Ia tidak pernah mengedit konfigurasi klien; ejen pengekodan boleh menjalankannya dan menyampaikan URL supaya kunci tidak pernah ditampal ke dalam terminal
Migrasi Protokol 2026-07-28
Keluaran besar, kerana tiga perkara yang boleh dilihat oleh pemanggil dibuang atau berubah. MCP server kini bertutur revisi protokol 2026-07-28 tanpa keadaan pada endpoint /mcp yang sama yang sudah pun menyajikan era 2025, tanpa jabat tangan, tanpa id sesi dan dengan server/discover menggantikan initialize. Era mana yang menaungi sesuatu permintaan ditentukan oleh pengelas milik MCP SDK sendiri dan bukan oleh peraturan kami, jadi endpoint itu tidak mungkin bercanggah dengan SDK tentang permintaan yang terletak di sempadan, dan kedua-dua era disajikan daripada satu definisi alat yang sama supaya keduanya tidak boleh menyimpang. Ini endpoint HTTP sahaja: sambungan stdio, iaitu cara npx crawlforge-mcp-server dan setiap klien desktop bersambung, masih merundingkan era 2025 dan tiada apa-apa padanya berubah. Dibuang: parameter task dan mod tugasan tak segerak pada crawl_deep, batch_scrape, deep_research dan agent, kerana spesifikasi itu memadam permukaan SDK yang mendasarinya dan bukan memindahkannya; dan bendera --legacy-http, empat versi kecil selepas amarannya sendiri berkata ia akan pergi. Turut dibaiki: endpoint HTTP terhos tidak pernah menjalani pusingan kebersihan protokol yang sentiasa ada pada stdio, jadi ia mengembalikan alat mengikut susunan pendaftaran, tanpa ikon dan tanpa dialek skema.
- Revisi 2026-07-28 pada endpoint HTTP /mcp, disajikan tanpa keadaan bersebelahan era 2025 bersesi pada laluan yang sama. Permintaan moden membawa sampul _meta bagi setiap permintaan (versi protokol, clientInfo, clientCapabilities) berserta pengepala Mcp-Method, dan Mcp-Name pada panggilan alat; ia mendapat instans pelayannya sendiri dan tiada id sesi. Penghalaan, semakan ketidakpadanan antara pengepala dan badan, serta 415 bagi content type yang bukan JSON semuanya ialah kod milik SDK sendiri dan bukan pelaksanaan semula, dan setiap satu daripadanya menolak permintaan itu sebelum alat berjalan, jadi panggilan yang ditolak tidak pernah dicaj. Pengesahan tidak berubah dan serupa pada kedua-dua era — Bearer atau X-API-Key pada setiap permintaan — dan ia berjalan sebelum penghalaan era, jadi tiada lompang berbentuk era. GET /health kini menyenaraikan setiap revisi yang disajikan oleh endpoint itu
- Perubahan yang memutuskan keserasian: params.task dan mod tugasan tak segerak sudah tiada pada crawl_deep, batch_scrape, deep_research dan agent. Kedua-duanya dibina atas API tasks eksperimen milik MCP SDK, dan SEP-2663 membuang API itu terus dan bukan memindahkannya menjadi sambungan — pada sambungan era 2026, tasks/get yang masuk menjawab -32601 walaupun pengendalinya didaftarkan, jadi tiada apa-apa lagi yang tinggal untuk dimigrasikan. Keempat-empat alat itu tidak lagi mengiklankan execution.taskSupport dan kini berjalan secara segerak, iaitu tepat apa yang sudah pun diterima oleh setiap pemanggil yang tidak pernah menghantar task. Bagi kerja panjang yang tidak sepatutnya menahan sambungan terbuka, gunakan mod webhook tak segerak batch_scrape atau corak result_handle dan read_result. Turut memutuskan keserasian: CRAWLFORGE_LEGACY_HTTP dan --legacy-http dibuang bersama mod tanpa keadaan v3.1 yang dikawalnya; klien era 2025 tidak terjejas, kerana mereka disajikan oleh pengangkutan bersesi yang menjadi lalai sejak v3.2.0
- Dibaiki: endpoint HTTP terhos kini mengembalikan tools/list yang sama seperti yang sentiasa diterima oleh klien stdio. Pembalut kebersihan protokol — susunan abjad, ikon, dialek JSON Schema 2020-12, dan penanda boleh cache pada sepuluh alat baca sahaja — berada pada instans protokol milik pelayan templat itu sendiri, bukan dalam jadual pendaftaran yang disalin oleh klon setiap sesi HTTP, jadi sesi HTTP selama ini disajikan alat mengikut susunan pendaftaran tanpa satu pun daripada empat perkara itu sedangkan stdio memilikinya semua. Ini mengubah apa yang dikembalikan oleh endpoint terhos pada era 2025: outputnya disusun semula serta memperoleh ikon dan dialek skema pada setiap alat. Ia metadata tambahan berserta satu susunan semula — tiada apa-apa dibuang — tetapi klien yang mematok susunan lama akan melihatnya beralih. Dibaiki secara berasingan: gesaan elicitation sampai kepada klien yang secara senyap berhenti menerimanya sejak SDK dinaik taraf, kerana kaedah mudah SDK itu menolak satu bentuk keupayaan yang menurut peraturannya sendiri sah