From 983259836dff200ba7b5f0da92751e831dfb26bb Mon Sep 17 00:00:00 2001 From: chii Date: Tue, 1 Sep 2026 15:19:52 +0800 Subject: [PATCH] chore: init workspace with onesvm-dev-md + casa-commander MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docs: 联网搜索服务架构方案全套(plan-final/design-arch/选型决策/整合导览/MCP文档/部署预设/联调手册) bench: 5 方案 + 代理 + 站点矩阵本机实测工程(无密钥) 部署目标:primary mgr1 先行测试(待批准后执行) --- .dsh/casa.yml | 81 ++ .../contract-20260901-browser-arch.md | 115 +++ .dsh/contracts/plan-20260901-01.md | 70 ++ .dsh/contracts/plan-20260901-02.md | 35 + .gitignore | 4 + .gitmodules | 6 + AGENTS.md | 52 + bench/chrome-headless-shell/_lib.sh | 122 +++ bench/chrome-headless-shell/cdp_fetch.mjs | 358 +++++++ bench/chrome-headless-shell/compose.yml | 17 + .../raw/T4-amz-1.excerpt | 1 + .../raw/T4-amz-2.excerpt | 1 + .../raw/T4-amz-3.excerpt | 1 + .../raw/T4-ctrl-1.excerpt | 1 + .../raw/T4-ctrl-2.excerpt | 1 + .../raw/T4-ctrl-3.excerpt | 1 + .../raw/T4-medium-1.excerpt | 1 + .../raw/T4-medium-2.excerpt | 1 + .../raw/T4-medium-3.excerpt | 1 + .../raw/T4-shop-1.excerpt | 1 + .../raw/T4-shop-2.excerpt | 1 + .../raw/T4-shop-3.excerpt | 1 + .../raw/T4-t3x-1.excerpt | 1 + .../raw/cdp-version.json | 8 + bench/chrome-headless-shell/raw/idle.tsv | 68 ++ .../chrome-headless-shell/raw/image-meta.json | 35 + bench/chrome-headless-shell/raw/pull.how | 1 + bench/chrome-headless-shell/raw/session.done | 0 bench/chrome-headless-shell/raw/session.tsv | 52 + bench/chrome-headless-shell/raw/t4.jsonl | 13 + .../chrome-headless-shell/raw/t5-queue.jsonl | 60 ++ bench/chrome-headless-shell/raw/t5-stats.tsv | 35 + bench/chrome-headless-shell/raw/t5.done | 0 bench/chrome-headless-shell/raw/t5.jsonl | 60 ++ bench/chrome-headless-shell/request.sh | 106 ++ bench/chrome-headless-shell/results.json | 323 ++++++ bench/chrome-headless-shell/run.sh | 246 +++++ .../chrome-headless-shell/samples/T4-amz.json | 1 + .../samples/T4-ctrl.json | 1 + .../samples/T4-medium.json | 1 + .../samples/T4-shop.json | 1 + .../chrome-headless-shell/samples/T4-t3x.json | 1 + bench/chrome-headless-shell/samples/t5-1.json | 28 + bench/chrome-headless-shell/samples/t5-2.json | 28 + bench/chrome-headless-shell/summarize.py | 275 +++++ bench/lightpanda/_lib.sh | 122 +++ bench/lightpanda/cdp_fetch.mjs | 358 +++++++ bench/lightpanda/compose.yml | 19 + bench/lightpanda/raw/T4-amz-1.excerpt | 1 + bench/lightpanda/raw/T4-amz-2.excerpt | 1 + bench/lightpanda/raw/T4-amz-3.excerpt | 1 + bench/lightpanda/raw/T4-ctrl-1.excerpt | 1 + bench/lightpanda/raw/T4-ctrl-2.excerpt | 1 + bench/lightpanda/raw/T4-ctrl-3.excerpt | 1 + bench/lightpanda/raw/T4-medium-1.excerpt | 1 + bench/lightpanda/raw/T4-medium-2.excerpt | 1 + bench/lightpanda/raw/T4-medium-3.excerpt | 1 + bench/lightpanda/raw/T4-shop-1.excerpt | 1 + bench/lightpanda/raw/T4-shop-2.excerpt | 1 + bench/lightpanda/raw/T4-shop-3.excerpt | 1 + bench/lightpanda/raw/T4-t3x-1.excerpt | 1 + bench/lightpanda/raw/cdp-version.json | 1 + bench/lightpanda/raw/idle.tsv | 66 ++ bench/lightpanda/raw/image-meta.json | 35 + bench/lightpanda/raw/pull.how | 1 + bench/lightpanda/raw/session.done | 0 bench/lightpanda/raw/session.tsv | 29 + bench/lightpanda/raw/t4.jsonl | 18 + bench/lightpanda/raw/t5-queue.jsonl | 60 ++ bench/lightpanda/raw/t5-stats.tsv | 18 + bench/lightpanda/raw/t5.done | 0 bench/lightpanda/raw/t5.jsonl | 60 ++ bench/lightpanda/request.sh | 106 ++ bench/lightpanda/results.json | 379 +++++++ bench/lightpanda/run.sh | 246 +++++ bench/lightpanda/samples/T4-amz.json | 1 + bench/lightpanda/samples/T4-ctrl.json | 1 + bench/lightpanda/samples/T4-medium.json | 1 + bench/lightpanda/samples/T4-shop.json | 1 + bench/lightpanda/samples/T4-t3x.json | 1 + bench/lightpanda/samples/t5-1.json | 28 + bench/lightpanda/samples/t5-2.json | 28 + bench/lightpanda/summarize.py | 275 +++++ bench/plan.md | 488 +++++++++ bench/proxy/down.sh | 12 + bench/proxy/lib.py | 148 +++ bench/proxy/probe-results.json | 958 ++++++++++++++++++ bench/proxy/probe.py | 276 +++++ bench/proxy/probe.sh | 12 + bench/proxy/sub-summary.json | 20 + bench/proxy/up.sh | 95 ++ bench/searxng-cn/compose.yml | 14 + bench/searxng-cn/eval_t1.py | 144 +++ bench/searxng-cn/raw/bodies/t1-1.json | 1 + bench/searxng-cn/raw/bodies/t1-2.json | 1 + bench/searxng-cn/raw/bodies/t1-3.json | 1 + bench/searxng-cn/raw/bodies/t1-4.json | 1 + bench/searxng-cn/raw/bodies/t1-5.json | 1 + bench/searxng-cn/raw/bodies/t5-1.json | 1 + bench/searxng-cn/raw/bodies/t5-10.json | 1 + bench/searxng-cn/raw/bodies/t5-11.json | 1 + bench/searxng-cn/raw/bodies/t5-12.json | 1 + bench/searxng-cn/raw/bodies/t5-13.json | 1 + bench/searxng-cn/raw/bodies/t5-14.json | 1 + bench/searxng-cn/raw/bodies/t5-15.json | 1 + bench/searxng-cn/raw/bodies/t5-16.json | 1 + bench/searxng-cn/raw/bodies/t5-17.json | 1 + bench/searxng-cn/raw/bodies/t5-18.json | 1 + bench/searxng-cn/raw/bodies/t5-19.json | 1 + bench/searxng-cn/raw/bodies/t5-2.json | 1 + bench/searxng-cn/raw/bodies/t5-20.json | 1 + bench/searxng-cn/raw/bodies/t5-21.json | 1 + bench/searxng-cn/raw/bodies/t5-22.json | 1 + bench/searxng-cn/raw/bodies/t5-23.json | 1 + bench/searxng-cn/raw/bodies/t5-24.json | 1 + bench/searxng-cn/raw/bodies/t5-25.json | 1 + bench/searxng-cn/raw/bodies/t5-26.json | 1 + bench/searxng-cn/raw/bodies/t5-27.json | 1 + bench/searxng-cn/raw/bodies/t5-28.json | 1 + bench/searxng-cn/raw/bodies/t5-29.json | 1 + bench/searxng-cn/raw/bodies/t5-3.json | 1 + bench/searxng-cn/raw/bodies/t5-30.json | 1 + bench/searxng-cn/raw/bodies/t5-31.json | 1 + bench/searxng-cn/raw/bodies/t5-32.json | 1 + bench/searxng-cn/raw/bodies/t5-33.json | 1 + bench/searxng-cn/raw/bodies/t5-34.json | 1 + bench/searxng-cn/raw/bodies/t5-35.json | 1 + bench/searxng-cn/raw/bodies/t5-36.json | 1 + bench/searxng-cn/raw/bodies/t5-37.json | 1 + bench/searxng-cn/raw/bodies/t5-38.json | 1 + bench/searxng-cn/raw/bodies/t5-39.json | 1 + bench/searxng-cn/raw/bodies/t5-4.json | 1 + bench/searxng-cn/raw/bodies/t5-40.json | 1 + bench/searxng-cn/raw/bodies/t5-41.json | 1 + bench/searxng-cn/raw/bodies/t5-42.json | 1 + bench/searxng-cn/raw/bodies/t5-43.json | 1 + bench/searxng-cn/raw/bodies/t5-44.json | 1 + bench/searxng-cn/raw/bodies/t5-45.json | 1 + bench/searxng-cn/raw/bodies/t5-46.json | 1 + bench/searxng-cn/raw/bodies/t5-47.json | 1 + bench/searxng-cn/raw/bodies/t5-48.json | 1 + bench/searxng-cn/raw/bodies/t5-49.json | 1 + bench/searxng-cn/raw/bodies/t5-5.json | 1 + bench/searxng-cn/raw/bodies/t5-50.json | 1 + bench/searxng-cn/raw/bodies/t5-51.json | 1 + bench/searxng-cn/raw/bodies/t5-52.json | 1 + bench/searxng-cn/raw/bodies/t5-53.json | 1 + bench/searxng-cn/raw/bodies/t5-54.json | 1 + bench/searxng-cn/raw/bodies/t5-55.json | 1 + bench/searxng-cn/raw/bodies/t5-56.json | 1 + bench/searxng-cn/raw/bodies/t5-57.json | 1 + bench/searxng-cn/raw/bodies/t5-58.json | 1 + bench/searxng-cn/raw/bodies/t5-59.json | 1 + bench/searxng-cn/raw/bodies/t5-6.json | 1 + bench/searxng-cn/raw/bodies/t5-60.json | 1 + bench/searxng-cn/raw/bodies/t5-7.json | 1 + bench/searxng-cn/raw/bodies/t5-8.json | 1 + bench/searxng-cn/raw/bodies/t5-9.json | 1 + bench/searxng-cn/raw/meta.json | 75 ++ bench/searxng-cn/raw/p0-combo.tsv | 21 + bench/searxng-cn/raw/searxng-cn-idle.tsv | 46 + bench/searxng-cn/raw/searxng-cn-session.tsv | 8 + bench/searxng-cn/raw/searxng-cn-t5.tsv | 8 + bench/searxng-cn/raw/t1-1.metrics.json | 1 + bench/searxng-cn/raw/t1-2.metrics.json | 1 + bench/searxng-cn/raw/t1-3.metrics.json | 1 + bench/searxng-cn/raw/t1-4.metrics.json | 1 + bench/searxng-cn/raw/t1-5.metrics.json | 1 + bench/searxng-cn/raw/t1.jsonl | 5 + bench/searxng-cn/raw/t5-1.metrics.json | 1 + bench/searxng-cn/raw/t5-10.metrics.json | 1 + bench/searxng-cn/raw/t5-11.metrics.json | 1 + bench/searxng-cn/raw/t5-12.metrics.json | 1 + bench/searxng-cn/raw/t5-13.metrics.json | 1 + bench/searxng-cn/raw/t5-14.metrics.json | 1 + bench/searxng-cn/raw/t5-15.metrics.json | 1 + bench/searxng-cn/raw/t5-16.metrics.json | 1 + bench/searxng-cn/raw/t5-17.metrics.json | 1 + bench/searxng-cn/raw/t5-18.metrics.json | 1 + bench/searxng-cn/raw/t5-19.metrics.json | 1 + bench/searxng-cn/raw/t5-2.metrics.json | 1 + bench/searxng-cn/raw/t5-20.metrics.json | 1 + bench/searxng-cn/raw/t5-21.metrics.json | 1 + bench/searxng-cn/raw/t5-22.metrics.json | 1 + bench/searxng-cn/raw/t5-23.metrics.json | 1 + bench/searxng-cn/raw/t5-24.metrics.json | 1 + bench/searxng-cn/raw/t5-25.metrics.json | 1 + bench/searxng-cn/raw/t5-26.metrics.json | 1 + bench/searxng-cn/raw/t5-27.metrics.json | 1 + bench/searxng-cn/raw/t5-28.metrics.json | 1 + bench/searxng-cn/raw/t5-29.metrics.json | 1 + bench/searxng-cn/raw/t5-3.metrics.json | 1 + bench/searxng-cn/raw/t5-30.metrics.json | 1 + bench/searxng-cn/raw/t5-31.metrics.json | 1 + bench/searxng-cn/raw/t5-32.metrics.json | 1 + bench/searxng-cn/raw/t5-33.metrics.json | 1 + bench/searxng-cn/raw/t5-34.metrics.json | 1 + bench/searxng-cn/raw/t5-35.metrics.json | 1 + bench/searxng-cn/raw/t5-36.metrics.json | 1 + bench/searxng-cn/raw/t5-37.metrics.json | 1 + bench/searxng-cn/raw/t5-38.metrics.json | 1 + bench/searxng-cn/raw/t5-39.metrics.json | 1 + bench/searxng-cn/raw/t5-4.metrics.json | 1 + bench/searxng-cn/raw/t5-40.metrics.json | 1 + bench/searxng-cn/raw/t5-41.metrics.json | 1 + bench/searxng-cn/raw/t5-42.metrics.json | 1 + bench/searxng-cn/raw/t5-43.metrics.json | 1 + bench/searxng-cn/raw/t5-44.metrics.json | 1 + bench/searxng-cn/raw/t5-45.metrics.json | 1 + bench/searxng-cn/raw/t5-46.metrics.json | 1 + bench/searxng-cn/raw/t5-47.metrics.json | 1 + bench/searxng-cn/raw/t5-48.metrics.json | 1 + bench/searxng-cn/raw/t5-49.metrics.json | 1 + bench/searxng-cn/raw/t5-5.metrics.json | 1 + bench/searxng-cn/raw/t5-50.metrics.json | 1 + bench/searxng-cn/raw/t5-51.metrics.json | 1 + bench/searxng-cn/raw/t5-52.metrics.json | 1 + bench/searxng-cn/raw/t5-53.metrics.json | 1 + bench/searxng-cn/raw/t5-54.metrics.json | 1 + bench/searxng-cn/raw/t5-55.metrics.json | 1 + bench/searxng-cn/raw/t5-56.metrics.json | 1 + bench/searxng-cn/raw/t5-57.metrics.json | 1 + bench/searxng-cn/raw/t5-58.metrics.json | 1 + bench/searxng-cn/raw/t5-59.metrics.json | 1 + bench/searxng-cn/raw/t5-6.metrics.json | 1 + bench/searxng-cn/raw/t5-60.metrics.json | 1 + bench/searxng-cn/raw/t5-7.metrics.json | 1 + bench/searxng-cn/raw/t5-8.metrics.json | 1 + bench/searxng-cn/raw/t5-9.metrics.json | 1 + bench/searxng-cn/raw/t5.jsonl | 60 ++ bench/searxng-cn/request.sh | 22 + bench/searxng-cn/results.json | 184 ++++ bench/searxng-cn/run.sh | 240 +++++ bench/searxng-cn/samples/t1-1.excerpt.json | 55 + bench/searxng-cn/samples/t1-2.excerpt.json | 55 + bench/searxng-cn/samples/t1-3.excerpt.json | 55 + .../samples/t5-fail-captcha.excerpt.json | 46 + bench/searxng-cn/samples/t5-ok.excerpt.json | 42 + bench/searxng-cn/settings.yml | 40 + bench/searxng-cn/summarize.py | 288 ++++++ bench/searxng-global/_lib.sh | 130 +++ bench/searxng-global/compose.yml | 22 + bench/searxng-global/raw/idle.tsv | 46 + bench/searxng-global/raw/image-meta.json | 34 + bench/searxng-global/raw/pull.how | 1 + bench/searxng-global/raw/session.done | 0 bench/searxng-global/raw/session.tsv | 17 + bench/searxng-global/raw/session2.done | 0 .../searxng-global/raw/t3-engine-bing.excerpt | 1 + .../raw/t3-engine-brave.excerpt | 1 + .../raw/t3-engine-duckduckgo.excerpt | 1 + .../raw/t3-engine-google.excerpt | 1 + bench/searxng-global/raw/t3-engines.jsonl | 4 + bench/searxng-global/raw/t3-excerpt-1.json | 1 + bench/searxng-global/raw/t3-excerpt-2.json | 1 + bench/searxng-global/raw/t3-excerpt-3.json | 1 + bench/searxng-global/raw/t3-excerpt-4.json | 1 + bench/searxng-global/raw/t3-excerpt-5.json | 1 + .../searxng-global/raw/t3-excerpt-probe.json | 1 + bench/searxng-global/raw/t3-probe-one.json | 1 + bench/searxng-global/raw/t3.jsonl | 5 + bench/searxng-global/raw/t5-parts/01.json | 1 + bench/searxng-global/raw/t5-parts/02.json | 1 + bench/searxng-global/raw/t5-parts/03.json | 1 + bench/searxng-global/raw/t5-parts/04.json | 1 + bench/searxng-global/raw/t5-parts/05.json | 1 + bench/searxng-global/raw/t5-parts/06.json | 1 + bench/searxng-global/raw/t5-parts/07.json | 1 + bench/searxng-global/raw/t5-parts/08.json | 1 + bench/searxng-global/raw/t5-parts/09.json | 1 + bench/searxng-global/raw/t5-parts/10.json | 1 + bench/searxng-global/raw/t5-parts/11.json | 1 + bench/searxng-global/raw/t5-parts/12.json | 1 + bench/searxng-global/raw/t5-parts/13.json | 1 + bench/searxng-global/raw/t5-parts/14.json | 1 + bench/searxng-global/raw/t5-parts/15.json | 1 + bench/searxng-global/raw/t5-parts/16.json | 1 + bench/searxng-global/raw/t5-parts/17.json | 1 + bench/searxng-global/raw/t5-parts/18.json | 1 + bench/searxng-global/raw/t5-parts/19.json | 1 + bench/searxng-global/raw/t5-parts/20.json | 1 + bench/searxng-global/raw/t5-parts/21.json | 1 + bench/searxng-global/raw/t5-parts/22.json | 1 + bench/searxng-global/raw/t5-parts/23.json | 1 + bench/searxng-global/raw/t5-parts/24.json | 1 + bench/searxng-global/raw/t5-parts/25.json | 1 + bench/searxng-global/raw/t5-parts/26.json | 1 + bench/searxng-global/raw/t5-parts/27.json | 1 + bench/searxng-global/raw/t5-parts/28.json | 1 + bench/searxng-global/raw/t5-parts/29.json | 1 + bench/searxng-global/raw/t5-parts/30.json | 1 + bench/searxng-global/raw/t5-parts/31.json | 1 + bench/searxng-global/raw/t5-parts/32.json | 1 + bench/searxng-global/raw/t5-parts/33.json | 1 + bench/searxng-global/raw/t5-parts/34.json | 1 + bench/searxng-global/raw/t5-parts/35.json | 1 + bench/searxng-global/raw/t5-parts/36.json | 1 + bench/searxng-global/raw/t5-parts/37.json | 1 + bench/searxng-global/raw/t5-parts/38.json | 1 + bench/searxng-global/raw/t5-parts/39.json | 1 + bench/searxng-global/raw/t5-parts/40.json | 1 + bench/searxng-global/raw/t5-parts/41.json | 1 + bench/searxng-global/raw/t5-parts/42.json | 1 + bench/searxng-global/raw/t5-parts/43.json | 1 + bench/searxng-global/raw/t5-parts/44.json | 1 + bench/searxng-global/raw/t5-parts/45.json | 1 + bench/searxng-global/raw/t5-parts/46.json | 1 + bench/searxng-global/raw/t5-parts/47.json | 1 + bench/searxng-global/raw/t5-parts/48.json | 1 + bench/searxng-global/raw/t5-parts/49.json | 1 + bench/searxng-global/raw/t5-parts/50.json | 1 + bench/searxng-global/raw/t5-parts/51.json | 1 + bench/searxng-global/raw/t5-parts/52.json | 1 + bench/searxng-global/raw/t5-parts/53.json | 1 + bench/searxng-global/raw/t5-parts/54.json | 1 + bench/searxng-global/raw/t5-parts/55.json | 1 + bench/searxng-global/raw/t5-parts/56.json | 1 + bench/searxng-global/raw/t5-parts/57.json | 1 + bench/searxng-global/raw/t5-parts/58.json | 1 + bench/searxng-global/raw/t5-parts/59.json | 1 + bench/searxng-global/raw/t5-parts/60.json | 1 + bench/searxng-global/raw/t5-stats.tsv | 15 + bench/searxng-global/raw/t5.done | 0 bench/searxng-global/raw/t5.jsonl | 60 ++ bench/searxng-global/request.sh | 135 +++ bench/searxng-global/results.json | 173 ++++ bench/searxng-global/run.sh | 173 ++++ bench/searxng-global/samples/t3-1.json | 1 + bench/searxng-global/samples/t3-2.json | 1 + bench/searxng-global/samples/t3-3.json | 1 + .../samples/t3-engine-bing.json | 1 + .../samples/t3-engine-brave.json | 1 + .../samples/t3-engine-duckduckgo.json | 1 + .../samples/t3-engine-google.json | 1 + bench/searxng-global/samples/t5-1.json | 42 + bench/searxng-global/samples/t5-2.json | 43 + bench/searxng-global/settings.yml | 44 + bench/searxng-global/summarize.py | 283 ++++++ bench/site-matrix/cdp_fetch.mjs | 304 ++++++ bench/site-matrix/classify.py | 131 +++ .../site-matrix/compose-lightpanda-direct.yml | 15 + .../site-matrix/compose-lightpanda-proxy.yml | 19 + bench/site-matrix/http_probe.py | 330 ++++++ bench/site-matrix/lp_probe.py | 137 +++ bench/site-matrix/raw/cdp-version-direct.json | 1 + bench/site-matrix/raw/cdp-version-proxy.json | 1 + .../raw/http-01-wikipedia.html.head | 144 +++ bench/site-matrix/raw/http-01-wikipedia.json | 51 + .../raw/http-02-hackernews.html.head | 1 + bench/site-matrix/raw/http-02-hackernews.json | 39 + .../raw/http-03-stackoverflow.html.head | 1 + .../raw/http-03-stackoverflow.json | 47 + .../site-matrix/raw/http-04-github.html.head | 81 ++ bench/site-matrix/raw/http-04-github.json | 50 + bench/site-matrix/raw/http-05-mdn.html.head | 319 ++++++ bench/site-matrix/raw/http-05-mdn.json | 57 ++ bench/site-matrix/raw/http-06-bbc.html.head | 18 + bench/site-matrix/raw/http-06-bbc.json | 62 ++ .../raw/http-07-techcrunch.html.head | 116 +++ bench/site-matrix/raw/http-07-techcrunch.json | 48 + .../site-matrix/raw/http-08-medium.html.head | 1 + bench/site-matrix/raw/http-08-medium.json | 47 + .../site-matrix/raw/http-09-reddit.html.head | 1 + bench/site-matrix/raw/http-09-reddit.json | 42 + .../site-matrix/raw/http-10-amazon.html.head | 45 + bench/site-matrix/raw/http-10-amazon.json | 49 + .../raw/http-11-allbirds.html.head | 327 ++++++ bench/site-matrix/raw/http-11-allbirds.json | 63 ++ .../site-matrix/raw/http-12-youtube.html.head | 18 + bench/site-matrix/raw/http-12-youtube.json | 50 + bench/site-matrix/raw/http-13-x.html.head | 2 + bench/site-matrix/raw/http-13-x.json | 55 + .../raw/http-14-linkedin.html.head | 206 ++++ bench/site-matrix/raw/http-14-linkedin.json | 48 + bench/site-matrix/raw/http-15-baike.html.head | 1 + bench/site-matrix/raw/http-15-baike.json | 33 + bench/site-matrix/raw/http-16-zhihu.html.head | 2 + bench/site-matrix/raw/http-16-zhihu.json | 40 + bench/site-matrix/raw/http-17-govcn.html.head | 285 ++++++ bench/site-matrix/raw/http-17-govcn.json | 37 + .../raw/http-17-govcn.listing.html.head | 482 +++++++++ .../raw/http-17-govcn.listing.json | 37 + .../site-matrix/raw/http-18-newscn.html.head | 248 +++++ bench/site-matrix/raw/http-18-newscn.json | 34 + bench/site-matrix/raw/http-19-kr36.html.head | 9 + bench/site-matrix/raw/http-19-kr36.json | 35 + bench/site-matrix/raw/http-20-weibo.html.head | 277 +++++ bench/site-matrix/raw/http-20-weibo.json | 44 + bench/site-matrix/raw/http-domestic.jsonl | 6 + bench/site-matrix/raw/http-foreign.jsonl | 14 + .../raw/lp-01-wikipedia.excerpt.json | 20 + bench/site-matrix/raw/lp-01-wikipedia.json | 31 + .../raw/lp-02-hackernews.excerpt.json | 17 + bench/site-matrix/raw/lp-02-hackernews.json | 25 + .../raw/lp-03-stackoverflow.excerpt.json | 20 + .../site-matrix/raw/lp-03-stackoverflow.json | 25 + .../site-matrix/raw/lp-04-github.excerpt.json | 18 + bench/site-matrix/raw/lp-04-github.json | 31 + bench/site-matrix/raw/lp-05-mdn.excerpt.json | 19 + bench/site-matrix/raw/lp-05-mdn.json | 25 + bench/site-matrix/raw/lp-06-bbc.excerpt.json | 25 + bench/site-matrix/raw/lp-06-bbc.json | 25 + .../raw/lp-07-techcrunch.excerpt.json | 19 + bench/site-matrix/raw/lp-07-techcrunch.json | 36 + .../site-matrix/raw/lp-08-medium.excerpt.json | 19 + bench/site-matrix/raw/lp-08-medium.json | 31 + .../site-matrix/raw/lp-09-reddit.excerpt.json | 18 + bench/site-matrix/raw/lp-09-reddit.json | 25 + .../site-matrix/raw/lp-10-amazon.excerpt.json | 20 + bench/site-matrix/raw/lp-10-amazon.json | 25 + .../raw/lp-11-allbirds.excerpt.json | 36 + bench/site-matrix/raw/lp-11-allbirds.json | 31 + .../raw/lp-12-youtube.excerpt.json | 20 + bench/site-matrix/raw/lp-12-youtube.json | 36 + bench/site-matrix/raw/lp-13-x.excerpt.json | 21 + bench/site-matrix/raw/lp-13-x.json | 25 + .../raw/lp-14-linkedin.excerpt.json | 19 + bench/site-matrix/raw/lp-14-linkedin.json | 25 + .../site-matrix/raw/lp-15-baike.excerpt.json | 17 + bench/site-matrix/raw/lp-15-baike.json | 25 + .../site-matrix/raw/lp-16-zhihu.excerpt.json | 21 + bench/site-matrix/raw/lp-16-zhihu.json | 25 + .../site-matrix/raw/lp-17-govcn.excerpt.json | 17 + bench/site-matrix/raw/lp-17-govcn.json | 25 + .../site-matrix/raw/lp-17-govcn.listing.json | 25 + .../site-matrix/raw/lp-18-newscn.excerpt.json | 17 + bench/site-matrix/raw/lp-18-newscn.json | 25 + bench/site-matrix/raw/lp-19-kr36.excerpt.json | 20 + bench/site-matrix/raw/lp-19-kr36.json | 25 + .../site-matrix/raw/lp-20-weibo.excerpt.json | 18 + bench/site-matrix/raw/lp-20-weibo.json | 36 + bench/site-matrix/raw/lp-domestic.jsonl | 6 + bench/site-matrix/raw/lp-foreign.jsonl | 14 + bench/site-matrix/raw/resolved-domestic.json | 3 + bench/site-matrix/raw/resolved-foreign.json | 16 + bench/site-matrix/reclassify.py | 149 +++ bench/site-matrix/results.json | 794 +++++++++++++++ bench/site-matrix/run.sh | 199 ++++ bench/site-matrix/summarize.py | 338 ++++++ bench/site-matrix/targets.json | 179 ++++ bench/trafilatura-http/Dockerfile | 7 + bench/trafilatura-http/app.py | 166 +++ bench/trafilatura-http/compose.yml | 14 + bench/trafilatura-http/eval_t2.py | 101 ++ bench/trafilatura-http/raw/bodies/t2-1.json | 1 + bench/trafilatura-http/raw/bodies/t2-2.json | 1 + bench/trafilatura-http/raw/bodies/t2-3.json | 1 + bench/trafilatura-http/raw/bodies/t2-4.json | 1 + bench/trafilatura-http/raw/bodies/t2-5.json | 1 + .../raw/bodies/t2-cross-govcn.json | 1 + .../raw/bodies/t2-fallback-404.json | 1 + bench/trafilatura-http/raw/bodies/t5-1.json | 1 + bench/trafilatura-http/raw/bodies/t5-10.json | 1 + bench/trafilatura-http/raw/bodies/t5-11.json | 1 + bench/trafilatura-http/raw/bodies/t5-12.json | 1 + bench/trafilatura-http/raw/bodies/t5-13.json | 1 + bench/trafilatura-http/raw/bodies/t5-14.json | 1 + bench/trafilatura-http/raw/bodies/t5-15.json | 1 + bench/trafilatura-http/raw/bodies/t5-16.json | 1 + bench/trafilatura-http/raw/bodies/t5-17.json | 1 + bench/trafilatura-http/raw/bodies/t5-18.json | 1 + bench/trafilatura-http/raw/bodies/t5-19.json | 1 + bench/trafilatura-http/raw/bodies/t5-2.json | 1 + bench/trafilatura-http/raw/bodies/t5-20.json | 1 + bench/trafilatura-http/raw/bodies/t5-21.json | 1 + bench/trafilatura-http/raw/bodies/t5-22.json | 1 + bench/trafilatura-http/raw/bodies/t5-23.json | 1 + bench/trafilatura-http/raw/bodies/t5-24.json | 1 + bench/trafilatura-http/raw/bodies/t5-25.json | 1 + bench/trafilatura-http/raw/bodies/t5-26.json | 1 + bench/trafilatura-http/raw/bodies/t5-27.json | 1 + bench/trafilatura-http/raw/bodies/t5-28.json | 1 + bench/trafilatura-http/raw/bodies/t5-29.json | 1 + bench/trafilatura-http/raw/bodies/t5-3.json | 1 + bench/trafilatura-http/raw/bodies/t5-30.json | 1 + bench/trafilatura-http/raw/bodies/t5-31.json | 1 + bench/trafilatura-http/raw/bodies/t5-32.json | 1 + bench/trafilatura-http/raw/bodies/t5-33.json | 1 + bench/trafilatura-http/raw/bodies/t5-34.json | 1 + bench/trafilatura-http/raw/bodies/t5-35.json | 1 + bench/trafilatura-http/raw/bodies/t5-36.json | 1 + bench/trafilatura-http/raw/bodies/t5-37.json | 1 + bench/trafilatura-http/raw/bodies/t5-38.json | 1 + bench/trafilatura-http/raw/bodies/t5-39.json | 1 + bench/trafilatura-http/raw/bodies/t5-4.json | 1 + bench/trafilatura-http/raw/bodies/t5-40.json | 1 + bench/trafilatura-http/raw/bodies/t5-41.json | 1 + bench/trafilatura-http/raw/bodies/t5-42.json | 1 + bench/trafilatura-http/raw/bodies/t5-43.json | 1 + bench/trafilatura-http/raw/bodies/t5-44.json | 1 + bench/trafilatura-http/raw/bodies/t5-45.json | 1 + bench/trafilatura-http/raw/bodies/t5-46.json | 1 + bench/trafilatura-http/raw/bodies/t5-47.json | 1 + bench/trafilatura-http/raw/bodies/t5-48.json | 1 + bench/trafilatura-http/raw/bodies/t5-49.json | 1 + bench/trafilatura-http/raw/bodies/t5-5.json | 1 + bench/trafilatura-http/raw/bodies/t5-50.json | 1 + bench/trafilatura-http/raw/bodies/t5-51.json | 1 + bench/trafilatura-http/raw/bodies/t5-52.json | 1 + bench/trafilatura-http/raw/bodies/t5-53.json | 1 + bench/trafilatura-http/raw/bodies/t5-54.json | 1 + bench/trafilatura-http/raw/bodies/t5-55.json | 1 + bench/trafilatura-http/raw/bodies/t5-56.json | 1 + bench/trafilatura-http/raw/bodies/t5-57.json | 1 + bench/trafilatura-http/raw/bodies/t5-58.json | 1 + bench/trafilatura-http/raw/bodies/t5-59.json | 1 + bench/trafilatura-http/raw/bodies/t5-6.json | 1 + bench/trafilatura-http/raw/bodies/t5-60.json | 1 + bench/trafilatura-http/raw/bodies/t5-7.json | 1 + bench/trafilatura-http/raw/bodies/t5-8.json | 1 + bench/trafilatura-http/raw/bodies/t5-9.json | 1 + bench/trafilatura-http/raw/meta.json | 70 ++ bench/trafilatura-http/raw/p0-combo.tsv | 21 + bench/trafilatura-http/raw/t2-1.metrics.json | 1 + bench/trafilatura-http/raw/t2-2.metrics.json | 1 + bench/trafilatura-http/raw/t2-3.metrics.json | 1 + bench/trafilatura-http/raw/t2-4.metrics.json | 1 + bench/trafilatura-http/raw/t2-5.metrics.json | 1 + .../raw/t2-cross-govcn.metrics.json | 1 + .../raw/t2-cross-govcn.verdict.json | 1 + .../raw/t2-fallback-404.metrics.json | 1 + .../raw/t2-fallback-404.verdict.json | 1 + bench/trafilatura-http/raw/t2.jsonl | 5 + bench/trafilatura-http/raw/t5-1.metrics.json | 1 + bench/trafilatura-http/raw/t5-10.metrics.json | 1 + bench/trafilatura-http/raw/t5-11.metrics.json | 1 + bench/trafilatura-http/raw/t5-12.metrics.json | 1 + bench/trafilatura-http/raw/t5-13.metrics.json | 1 + bench/trafilatura-http/raw/t5-14.metrics.json | 1 + bench/trafilatura-http/raw/t5-15.metrics.json | 1 + bench/trafilatura-http/raw/t5-16.metrics.json | 1 + bench/trafilatura-http/raw/t5-17.metrics.json | 1 + bench/trafilatura-http/raw/t5-18.metrics.json | 1 + bench/trafilatura-http/raw/t5-19.metrics.json | 1 + bench/trafilatura-http/raw/t5-2.metrics.json | 1 + bench/trafilatura-http/raw/t5-20.metrics.json | 1 + bench/trafilatura-http/raw/t5-21.metrics.json | 1 + bench/trafilatura-http/raw/t5-22.metrics.json | 1 + bench/trafilatura-http/raw/t5-23.metrics.json | 1 + bench/trafilatura-http/raw/t5-24.metrics.json | 1 + bench/trafilatura-http/raw/t5-25.metrics.json | 1 + bench/trafilatura-http/raw/t5-26.metrics.json | 1 + bench/trafilatura-http/raw/t5-27.metrics.json | 1 + bench/trafilatura-http/raw/t5-28.metrics.json | 1 + bench/trafilatura-http/raw/t5-29.metrics.json | 1 + bench/trafilatura-http/raw/t5-3.metrics.json | 1 + bench/trafilatura-http/raw/t5-30.metrics.json | 1 + bench/trafilatura-http/raw/t5-31.metrics.json | 1 + bench/trafilatura-http/raw/t5-32.metrics.json | 1 + bench/trafilatura-http/raw/t5-33.metrics.json | 1 + bench/trafilatura-http/raw/t5-34.metrics.json | 1 + bench/trafilatura-http/raw/t5-35.metrics.json | 1 + bench/trafilatura-http/raw/t5-36.metrics.json | 1 + bench/trafilatura-http/raw/t5-37.metrics.json | 1 + bench/trafilatura-http/raw/t5-38.metrics.json | 1 + bench/trafilatura-http/raw/t5-39.metrics.json | 1 + bench/trafilatura-http/raw/t5-4.metrics.json | 1 + bench/trafilatura-http/raw/t5-40.metrics.json | 1 + bench/trafilatura-http/raw/t5-41.metrics.json | 1 + bench/trafilatura-http/raw/t5-42.metrics.json | 1 + bench/trafilatura-http/raw/t5-43.metrics.json | 1 + bench/trafilatura-http/raw/t5-44.metrics.json | 1 + bench/trafilatura-http/raw/t5-45.metrics.json | 1 + bench/trafilatura-http/raw/t5-46.metrics.json | 1 + bench/trafilatura-http/raw/t5-47.metrics.json | 1 + bench/trafilatura-http/raw/t5-48.metrics.json | 1 + bench/trafilatura-http/raw/t5-49.metrics.json | 1 + bench/trafilatura-http/raw/t5-5.metrics.json | 1 + bench/trafilatura-http/raw/t5-50.metrics.json | 1 + bench/trafilatura-http/raw/t5-51.metrics.json | 1 + bench/trafilatura-http/raw/t5-52.metrics.json | 1 + bench/trafilatura-http/raw/t5-53.metrics.json | 1 + bench/trafilatura-http/raw/t5-54.metrics.json | 1 + bench/trafilatura-http/raw/t5-55.metrics.json | 1 + bench/trafilatura-http/raw/t5-56.metrics.json | 1 + bench/trafilatura-http/raw/t5-57.metrics.json | 1 + bench/trafilatura-http/raw/t5-58.metrics.json | 1 + bench/trafilatura-http/raw/t5-59.metrics.json | 1 + bench/trafilatura-http/raw/t5-6.metrics.json | 1 + bench/trafilatura-http/raw/t5-60.metrics.json | 1 + bench/trafilatura-http/raw/t5-7.metrics.json | 1 + bench/trafilatura-http/raw/t5-8.metrics.json | 1 + bench/trafilatura-http/raw/t5-9.metrics.json | 1 + bench/trafilatura-http/raw/t5.jsonl | 60 ++ .../raw/trafilatura-http-idle.tsv | 46 + .../raw/trafilatura-http-session.tsv | 8 + .../raw/trafilatura-http-t5.tsv | 7 + bench/trafilatura-http/request.sh | 21 + bench/trafilatura-http/results.json | 124 +++ bench/trafilatura-http/run.sh | 239 +++++ .../samples/t2-1.excerpt.json | 11 + .../samples/t2-2.excerpt.json | 11 + .../samples/t2-3.excerpt.json | 11 + .../samples/t2-cross-govcn.excerpt.json | 14 + bench/trafilatura-http/summarize.py | 254 +++++ casa-commander | 1 + docs/README.md | 25 + docs/decision-candidates-20260901.md | 82 ++ docs/deploy-prod-preset-20260901.md | 98 ++ docs/design-arch-20260901.md | 461 +++++++++ docs/integration-vlepontas-20260901.md | 85 ++ docs/mcp-usage-20260901.md | 312 ++++++ docs/overview-integration-20260901.md | 121 +++ docs/plan-final-20260901.md | 179 ++++ onesvm-dev-md | 1 + 605 files changed, 18817 insertions(+) create mode 100644 .dsh/casa.yml create mode 100644 .dsh/contracts/contract-20260901-browser-arch.md create mode 100644 .dsh/contracts/plan-20260901-01.md create mode 100644 .dsh/contracts/plan-20260901-02.md create mode 100644 .gitmodules create mode 100644 AGENTS.md create mode 100644 bench/chrome-headless-shell/_lib.sh create mode 100644 bench/chrome-headless-shell/cdp_fetch.mjs create mode 100644 bench/chrome-headless-shell/compose.yml create mode 100644 bench/chrome-headless-shell/raw/T4-amz-1.excerpt create mode 100644 bench/chrome-headless-shell/raw/T4-amz-2.excerpt create mode 100644 bench/chrome-headless-shell/raw/T4-amz-3.excerpt create mode 100644 bench/chrome-headless-shell/raw/T4-ctrl-1.excerpt create mode 100644 bench/chrome-headless-shell/raw/T4-ctrl-2.excerpt create mode 100644 bench/chrome-headless-shell/raw/T4-ctrl-3.excerpt create mode 100644 bench/chrome-headless-shell/raw/T4-medium-1.excerpt create mode 100644 bench/chrome-headless-shell/raw/T4-medium-2.excerpt create mode 100644 bench/chrome-headless-shell/raw/T4-medium-3.excerpt create mode 100644 bench/chrome-headless-shell/raw/T4-shop-1.excerpt create mode 100644 bench/chrome-headless-shell/raw/T4-shop-2.excerpt create mode 100644 bench/chrome-headless-shell/raw/T4-shop-3.excerpt create mode 100644 bench/chrome-headless-shell/raw/T4-t3x-1.excerpt create mode 100644 bench/chrome-headless-shell/raw/cdp-version.json create mode 100644 bench/chrome-headless-shell/raw/idle.tsv create mode 100644 bench/chrome-headless-shell/raw/image-meta.json create mode 100644 bench/chrome-headless-shell/raw/pull.how create mode 100644 bench/chrome-headless-shell/raw/session.done create mode 100644 bench/chrome-headless-shell/raw/session.tsv create mode 100644 bench/chrome-headless-shell/raw/t4.jsonl create mode 100644 bench/chrome-headless-shell/raw/t5-queue.jsonl create mode 100644 bench/chrome-headless-shell/raw/t5-stats.tsv create mode 100644 bench/chrome-headless-shell/raw/t5.done create mode 100644 bench/chrome-headless-shell/raw/t5.jsonl create mode 100755 bench/chrome-headless-shell/request.sh create mode 100644 bench/chrome-headless-shell/results.json create mode 100755 bench/chrome-headless-shell/run.sh create mode 100644 bench/chrome-headless-shell/samples/T4-amz.json create mode 100644 bench/chrome-headless-shell/samples/T4-ctrl.json create mode 100644 bench/chrome-headless-shell/samples/T4-medium.json create mode 100644 bench/chrome-headless-shell/samples/T4-shop.json create mode 100644 bench/chrome-headless-shell/samples/T4-t3x.json create mode 100644 bench/chrome-headless-shell/samples/t5-1.json create mode 100644 bench/chrome-headless-shell/samples/t5-2.json create mode 100644 bench/chrome-headless-shell/summarize.py create mode 100644 bench/lightpanda/_lib.sh create mode 100644 bench/lightpanda/cdp_fetch.mjs create mode 100644 bench/lightpanda/compose.yml create mode 100644 bench/lightpanda/raw/T4-amz-1.excerpt create mode 100644 bench/lightpanda/raw/T4-amz-2.excerpt create mode 100644 bench/lightpanda/raw/T4-amz-3.excerpt create mode 100644 bench/lightpanda/raw/T4-ctrl-1.excerpt create mode 100644 bench/lightpanda/raw/T4-ctrl-2.excerpt create mode 100644 bench/lightpanda/raw/T4-ctrl-3.excerpt create mode 100644 bench/lightpanda/raw/T4-medium-1.excerpt create mode 100644 bench/lightpanda/raw/T4-medium-2.excerpt create mode 100644 bench/lightpanda/raw/T4-medium-3.excerpt create mode 100644 bench/lightpanda/raw/T4-shop-1.excerpt create mode 100644 bench/lightpanda/raw/T4-shop-2.excerpt create mode 100644 bench/lightpanda/raw/T4-shop-3.excerpt create mode 100644 bench/lightpanda/raw/T4-t3x-1.excerpt create mode 100644 bench/lightpanda/raw/cdp-version.json create mode 100644 bench/lightpanda/raw/idle.tsv create mode 100644 bench/lightpanda/raw/image-meta.json create mode 100644 bench/lightpanda/raw/pull.how create mode 100644 bench/lightpanda/raw/session.done create mode 100644 bench/lightpanda/raw/session.tsv create mode 100644 bench/lightpanda/raw/t4.jsonl create mode 100644 bench/lightpanda/raw/t5-queue.jsonl create mode 100644 bench/lightpanda/raw/t5-stats.tsv create mode 100644 bench/lightpanda/raw/t5.done create mode 100644 bench/lightpanda/raw/t5.jsonl create mode 100755 bench/lightpanda/request.sh create mode 100644 bench/lightpanda/results.json create mode 100755 bench/lightpanda/run.sh create mode 100644 bench/lightpanda/samples/T4-amz.json create mode 100644 bench/lightpanda/samples/T4-ctrl.json create mode 100644 bench/lightpanda/samples/T4-medium.json create mode 100644 bench/lightpanda/samples/T4-shop.json create mode 100644 bench/lightpanda/samples/T4-t3x.json create mode 100644 bench/lightpanda/samples/t5-1.json create mode 100644 bench/lightpanda/samples/t5-2.json create mode 100644 bench/lightpanda/summarize.py create mode 100644 bench/plan.md create mode 100755 bench/proxy/down.sh create mode 100755 bench/proxy/lib.py create mode 100644 bench/proxy/probe-results.json create mode 100755 bench/proxy/probe.py create mode 100755 bench/proxy/probe.sh create mode 100644 bench/proxy/sub-summary.json create mode 100755 bench/proxy/up.sh create mode 100644 bench/searxng-cn/compose.yml create mode 100755 bench/searxng-cn/eval_t1.py create mode 100644 bench/searxng-cn/raw/bodies/t1-1.json create mode 100644 bench/searxng-cn/raw/bodies/t1-2.json create mode 100644 bench/searxng-cn/raw/bodies/t1-3.json create mode 100644 bench/searxng-cn/raw/bodies/t1-4.json create mode 100644 bench/searxng-cn/raw/bodies/t1-5.json create mode 100644 bench/searxng-cn/raw/bodies/t5-1.json create mode 100644 bench/searxng-cn/raw/bodies/t5-10.json create mode 100644 bench/searxng-cn/raw/bodies/t5-11.json create mode 100644 bench/searxng-cn/raw/bodies/t5-12.json create mode 100644 bench/searxng-cn/raw/bodies/t5-13.json create mode 100644 bench/searxng-cn/raw/bodies/t5-14.json create mode 100644 bench/searxng-cn/raw/bodies/t5-15.json create mode 100644 bench/searxng-cn/raw/bodies/t5-16.json create mode 100644 bench/searxng-cn/raw/bodies/t5-17.json create mode 100644 bench/searxng-cn/raw/bodies/t5-18.json create mode 100644 bench/searxng-cn/raw/bodies/t5-19.json create mode 100644 bench/searxng-cn/raw/bodies/t5-2.json create mode 100644 bench/searxng-cn/raw/bodies/t5-20.json create mode 100644 bench/searxng-cn/raw/bodies/t5-21.json create mode 100644 bench/searxng-cn/raw/bodies/t5-22.json create mode 100644 bench/searxng-cn/raw/bodies/t5-23.json create mode 100644 bench/searxng-cn/raw/bodies/t5-24.json create mode 100644 bench/searxng-cn/raw/bodies/t5-25.json create mode 100644 bench/searxng-cn/raw/bodies/t5-26.json create mode 100644 bench/searxng-cn/raw/bodies/t5-27.json create mode 100644 bench/searxng-cn/raw/bodies/t5-28.json create mode 100644 bench/searxng-cn/raw/bodies/t5-29.json create mode 100644 bench/searxng-cn/raw/bodies/t5-3.json create mode 100644 bench/searxng-cn/raw/bodies/t5-30.json create mode 100644 bench/searxng-cn/raw/bodies/t5-31.json create mode 100644 bench/searxng-cn/raw/bodies/t5-32.json create mode 100644 bench/searxng-cn/raw/bodies/t5-33.json create mode 100644 bench/searxng-cn/raw/bodies/t5-34.json create mode 100644 bench/searxng-cn/raw/bodies/t5-35.json create mode 100644 bench/searxng-cn/raw/bodies/t5-36.json create mode 100644 bench/searxng-cn/raw/bodies/t5-37.json create mode 100644 bench/searxng-cn/raw/bodies/t5-38.json create mode 100644 bench/searxng-cn/raw/bodies/t5-39.json create mode 100644 bench/searxng-cn/raw/bodies/t5-4.json create mode 100644 bench/searxng-cn/raw/bodies/t5-40.json create mode 100644 bench/searxng-cn/raw/bodies/t5-41.json create mode 100644 bench/searxng-cn/raw/bodies/t5-42.json create mode 100644 bench/searxng-cn/raw/bodies/t5-43.json create mode 100644 bench/searxng-cn/raw/bodies/t5-44.json create mode 100644 bench/searxng-cn/raw/bodies/t5-45.json create mode 100644 bench/searxng-cn/raw/bodies/t5-46.json create mode 100644 bench/searxng-cn/raw/bodies/t5-47.json create mode 100644 bench/searxng-cn/raw/bodies/t5-48.json create mode 100644 bench/searxng-cn/raw/bodies/t5-49.json create mode 100644 bench/searxng-cn/raw/bodies/t5-5.json create mode 100644 bench/searxng-cn/raw/bodies/t5-50.json create mode 100644 bench/searxng-cn/raw/bodies/t5-51.json create mode 100644 bench/searxng-cn/raw/bodies/t5-52.json create mode 100644 bench/searxng-cn/raw/bodies/t5-53.json create mode 100644 bench/searxng-cn/raw/bodies/t5-54.json create mode 100644 bench/searxng-cn/raw/bodies/t5-55.json create mode 100644 bench/searxng-cn/raw/bodies/t5-56.json create mode 100644 bench/searxng-cn/raw/bodies/t5-57.json create mode 100644 bench/searxng-cn/raw/bodies/t5-58.json create mode 100644 bench/searxng-cn/raw/bodies/t5-59.json create mode 100644 bench/searxng-cn/raw/bodies/t5-6.json create mode 100644 bench/searxng-cn/raw/bodies/t5-60.json create mode 100644 bench/searxng-cn/raw/bodies/t5-7.json create mode 100644 bench/searxng-cn/raw/bodies/t5-8.json create mode 100644 bench/searxng-cn/raw/bodies/t5-9.json create mode 100644 bench/searxng-cn/raw/meta.json create mode 100644 bench/searxng-cn/raw/p0-combo.tsv create mode 100644 bench/searxng-cn/raw/searxng-cn-idle.tsv create mode 100644 bench/searxng-cn/raw/searxng-cn-session.tsv create mode 100644 bench/searxng-cn/raw/searxng-cn-t5.tsv create mode 100644 bench/searxng-cn/raw/t1-1.metrics.json create mode 100644 bench/searxng-cn/raw/t1-2.metrics.json create mode 100644 bench/searxng-cn/raw/t1-3.metrics.json create mode 100644 bench/searxng-cn/raw/t1-4.metrics.json create mode 100644 bench/searxng-cn/raw/t1-5.metrics.json create mode 100644 bench/searxng-cn/raw/t1.jsonl create mode 100644 bench/searxng-cn/raw/t5-1.metrics.json create mode 100644 bench/searxng-cn/raw/t5-10.metrics.json create mode 100644 bench/searxng-cn/raw/t5-11.metrics.json create mode 100644 bench/searxng-cn/raw/t5-12.metrics.json create mode 100644 bench/searxng-cn/raw/t5-13.metrics.json create mode 100644 bench/searxng-cn/raw/t5-14.metrics.json create mode 100644 bench/searxng-cn/raw/t5-15.metrics.json create mode 100644 bench/searxng-cn/raw/t5-16.metrics.json create mode 100644 bench/searxng-cn/raw/t5-17.metrics.json create mode 100644 bench/searxng-cn/raw/t5-18.metrics.json create mode 100644 bench/searxng-cn/raw/t5-19.metrics.json create mode 100644 bench/searxng-cn/raw/t5-2.metrics.json create mode 100644 bench/searxng-cn/raw/t5-20.metrics.json create mode 100644 bench/searxng-cn/raw/t5-21.metrics.json create mode 100644 bench/searxng-cn/raw/t5-22.metrics.json create mode 100644 bench/searxng-cn/raw/t5-23.metrics.json create mode 100644 bench/searxng-cn/raw/t5-24.metrics.json create mode 100644 bench/searxng-cn/raw/t5-25.metrics.json create mode 100644 bench/searxng-cn/raw/t5-26.metrics.json create mode 100644 bench/searxng-cn/raw/t5-27.metrics.json create mode 100644 bench/searxng-cn/raw/t5-28.metrics.json create mode 100644 bench/searxng-cn/raw/t5-29.metrics.json create mode 100644 bench/searxng-cn/raw/t5-3.metrics.json create mode 100644 bench/searxng-cn/raw/t5-30.metrics.json create mode 100644 bench/searxng-cn/raw/t5-31.metrics.json create mode 100644 bench/searxng-cn/raw/t5-32.metrics.json create mode 100644 bench/searxng-cn/raw/t5-33.metrics.json create mode 100644 bench/searxng-cn/raw/t5-34.metrics.json create mode 100644 bench/searxng-cn/raw/t5-35.metrics.json create mode 100644 bench/searxng-cn/raw/t5-36.metrics.json create mode 100644 bench/searxng-cn/raw/t5-37.metrics.json create mode 100644 bench/searxng-cn/raw/t5-38.metrics.json create mode 100644 bench/searxng-cn/raw/t5-39.metrics.json create mode 100644 bench/searxng-cn/raw/t5-4.metrics.json create mode 100644 bench/searxng-cn/raw/t5-40.metrics.json create mode 100644 bench/searxng-cn/raw/t5-41.metrics.json create mode 100644 bench/searxng-cn/raw/t5-42.metrics.json create mode 100644 bench/searxng-cn/raw/t5-43.metrics.json create mode 100644 bench/searxng-cn/raw/t5-44.metrics.json create mode 100644 bench/searxng-cn/raw/t5-45.metrics.json create mode 100644 bench/searxng-cn/raw/t5-46.metrics.json create mode 100644 bench/searxng-cn/raw/t5-47.metrics.json create mode 100644 bench/searxng-cn/raw/t5-48.metrics.json create mode 100644 bench/searxng-cn/raw/t5-49.metrics.json create mode 100644 bench/searxng-cn/raw/t5-5.metrics.json create mode 100644 bench/searxng-cn/raw/t5-50.metrics.json create mode 100644 bench/searxng-cn/raw/t5-51.metrics.json create mode 100644 bench/searxng-cn/raw/t5-52.metrics.json create mode 100644 bench/searxng-cn/raw/t5-53.metrics.json create mode 100644 bench/searxng-cn/raw/t5-54.metrics.json create mode 100644 bench/searxng-cn/raw/t5-55.metrics.json create mode 100644 bench/searxng-cn/raw/t5-56.metrics.json create mode 100644 bench/searxng-cn/raw/t5-57.metrics.json create mode 100644 bench/searxng-cn/raw/t5-58.metrics.json create mode 100644 bench/searxng-cn/raw/t5-59.metrics.json create mode 100644 bench/searxng-cn/raw/t5-6.metrics.json create mode 100644 bench/searxng-cn/raw/t5-60.metrics.json create mode 100644 bench/searxng-cn/raw/t5-7.metrics.json create mode 100644 bench/searxng-cn/raw/t5-8.metrics.json create mode 100644 bench/searxng-cn/raw/t5-9.metrics.json create mode 100644 bench/searxng-cn/raw/t5.jsonl create mode 100755 bench/searxng-cn/request.sh create mode 100644 bench/searxng-cn/results.json create mode 100755 bench/searxng-cn/run.sh create mode 100644 bench/searxng-cn/samples/t1-1.excerpt.json create mode 100644 bench/searxng-cn/samples/t1-2.excerpt.json create mode 100644 bench/searxng-cn/samples/t1-3.excerpt.json create mode 100644 bench/searxng-cn/samples/t5-fail-captcha.excerpt.json create mode 100644 bench/searxng-cn/samples/t5-ok.excerpt.json create mode 100644 bench/searxng-cn/settings.yml create mode 100755 bench/searxng-cn/summarize.py create mode 100644 bench/searxng-global/_lib.sh create mode 100644 bench/searxng-global/compose.yml create mode 100644 bench/searxng-global/raw/idle.tsv create mode 100644 bench/searxng-global/raw/image-meta.json create mode 100644 bench/searxng-global/raw/pull.how create mode 100644 bench/searxng-global/raw/session.done create mode 100644 bench/searxng-global/raw/session.tsv create mode 100644 bench/searxng-global/raw/session2.done create mode 100644 bench/searxng-global/raw/t3-engine-bing.excerpt create mode 100644 bench/searxng-global/raw/t3-engine-brave.excerpt create mode 100644 bench/searxng-global/raw/t3-engine-duckduckgo.excerpt create mode 100644 bench/searxng-global/raw/t3-engine-google.excerpt create mode 100644 bench/searxng-global/raw/t3-engines.jsonl create mode 100644 bench/searxng-global/raw/t3-excerpt-1.json create mode 100644 bench/searxng-global/raw/t3-excerpt-2.json create mode 100644 bench/searxng-global/raw/t3-excerpt-3.json create mode 100644 bench/searxng-global/raw/t3-excerpt-4.json create mode 100644 bench/searxng-global/raw/t3-excerpt-5.json create mode 100644 bench/searxng-global/raw/t3-excerpt-probe.json create mode 100644 bench/searxng-global/raw/t3-probe-one.json create mode 100644 bench/searxng-global/raw/t3.jsonl create mode 100644 bench/searxng-global/raw/t5-parts/01.json create mode 100644 bench/searxng-global/raw/t5-parts/02.json create mode 100644 bench/searxng-global/raw/t5-parts/03.json create mode 100644 bench/searxng-global/raw/t5-parts/04.json create mode 100644 bench/searxng-global/raw/t5-parts/05.json create mode 100644 bench/searxng-global/raw/t5-parts/06.json create mode 100644 bench/searxng-global/raw/t5-parts/07.json create mode 100644 bench/searxng-global/raw/t5-parts/08.json create mode 100644 bench/searxng-global/raw/t5-parts/09.json create mode 100644 bench/searxng-global/raw/t5-parts/10.json create mode 100644 bench/searxng-global/raw/t5-parts/11.json create mode 100644 bench/searxng-global/raw/t5-parts/12.json create mode 100644 bench/searxng-global/raw/t5-parts/13.json create mode 100644 bench/searxng-global/raw/t5-parts/14.json create mode 100644 bench/searxng-global/raw/t5-parts/15.json create mode 100644 bench/searxng-global/raw/t5-parts/16.json create mode 100644 bench/searxng-global/raw/t5-parts/17.json create mode 100644 bench/searxng-global/raw/t5-parts/18.json create mode 100644 bench/searxng-global/raw/t5-parts/19.json create mode 100644 bench/searxng-global/raw/t5-parts/20.json create mode 100644 bench/searxng-global/raw/t5-parts/21.json create mode 100644 bench/searxng-global/raw/t5-parts/22.json create mode 100644 bench/searxng-global/raw/t5-parts/23.json create mode 100644 bench/searxng-global/raw/t5-parts/24.json create mode 100644 bench/searxng-global/raw/t5-parts/25.json create mode 100644 bench/searxng-global/raw/t5-parts/26.json create mode 100644 bench/searxng-global/raw/t5-parts/27.json create mode 100644 bench/searxng-global/raw/t5-parts/28.json create mode 100644 bench/searxng-global/raw/t5-parts/29.json create mode 100644 bench/searxng-global/raw/t5-parts/30.json create mode 100644 bench/searxng-global/raw/t5-parts/31.json create mode 100644 bench/searxng-global/raw/t5-parts/32.json create mode 100644 bench/searxng-global/raw/t5-parts/33.json create mode 100644 bench/searxng-global/raw/t5-parts/34.json create mode 100644 bench/searxng-global/raw/t5-parts/35.json create mode 100644 bench/searxng-global/raw/t5-parts/36.json create mode 100644 bench/searxng-global/raw/t5-parts/37.json create mode 100644 bench/searxng-global/raw/t5-parts/38.json create mode 100644 bench/searxng-global/raw/t5-parts/39.json create mode 100644 bench/searxng-global/raw/t5-parts/40.json create mode 100644 bench/searxng-global/raw/t5-parts/41.json create mode 100644 bench/searxng-global/raw/t5-parts/42.json create mode 100644 bench/searxng-global/raw/t5-parts/43.json create mode 100644 bench/searxng-global/raw/t5-parts/44.json create mode 100644 bench/searxng-global/raw/t5-parts/45.json create mode 100644 bench/searxng-global/raw/t5-parts/46.json create mode 100644 bench/searxng-global/raw/t5-parts/47.json create mode 100644 bench/searxng-global/raw/t5-parts/48.json create mode 100644 bench/searxng-global/raw/t5-parts/49.json create mode 100644 bench/searxng-global/raw/t5-parts/50.json create mode 100644 bench/searxng-global/raw/t5-parts/51.json create mode 100644 bench/searxng-global/raw/t5-parts/52.json create mode 100644 bench/searxng-global/raw/t5-parts/53.json create mode 100644 bench/searxng-global/raw/t5-parts/54.json create mode 100644 bench/searxng-global/raw/t5-parts/55.json create mode 100644 bench/searxng-global/raw/t5-parts/56.json create mode 100644 bench/searxng-global/raw/t5-parts/57.json create mode 100644 bench/searxng-global/raw/t5-parts/58.json create mode 100644 bench/searxng-global/raw/t5-parts/59.json create mode 100644 bench/searxng-global/raw/t5-parts/60.json create mode 100644 bench/searxng-global/raw/t5-stats.tsv create mode 100644 bench/searxng-global/raw/t5.done create mode 100644 bench/searxng-global/raw/t5.jsonl create mode 100755 bench/searxng-global/request.sh create mode 100644 bench/searxng-global/results.json create mode 100755 bench/searxng-global/run.sh create mode 100644 bench/searxng-global/samples/t3-1.json create mode 100644 bench/searxng-global/samples/t3-2.json create mode 100644 bench/searxng-global/samples/t3-3.json create mode 100644 bench/searxng-global/samples/t3-engine-bing.json create mode 100644 bench/searxng-global/samples/t3-engine-brave.json create mode 100644 bench/searxng-global/samples/t3-engine-duckduckgo.json create mode 100644 bench/searxng-global/samples/t3-engine-google.json create mode 100644 bench/searxng-global/samples/t5-1.json create mode 100644 bench/searxng-global/samples/t5-2.json create mode 100644 bench/searxng-global/settings.yml create mode 100644 bench/searxng-global/summarize.py create mode 100644 bench/site-matrix/cdp_fetch.mjs create mode 100644 bench/site-matrix/classify.py create mode 100644 bench/site-matrix/compose-lightpanda-direct.yml create mode 100644 bench/site-matrix/compose-lightpanda-proxy.yml create mode 100755 bench/site-matrix/http_probe.py create mode 100755 bench/site-matrix/lp_probe.py create mode 100644 bench/site-matrix/raw/cdp-version-direct.json create mode 100644 bench/site-matrix/raw/cdp-version-proxy.json create mode 100644 bench/site-matrix/raw/http-01-wikipedia.html.head create mode 100644 bench/site-matrix/raw/http-01-wikipedia.json create mode 100644 bench/site-matrix/raw/http-02-hackernews.html.head create mode 100644 bench/site-matrix/raw/http-02-hackernews.json create mode 100644 bench/site-matrix/raw/http-03-stackoverflow.html.head create mode 100644 bench/site-matrix/raw/http-03-stackoverflow.json create mode 100644 bench/site-matrix/raw/http-04-github.html.head create mode 100644 bench/site-matrix/raw/http-04-github.json create mode 100644 bench/site-matrix/raw/http-05-mdn.html.head create mode 100644 bench/site-matrix/raw/http-05-mdn.json create mode 100644 bench/site-matrix/raw/http-06-bbc.html.head create mode 100644 bench/site-matrix/raw/http-06-bbc.json create mode 100644 bench/site-matrix/raw/http-07-techcrunch.html.head create mode 100644 bench/site-matrix/raw/http-07-techcrunch.json create mode 100644 bench/site-matrix/raw/http-08-medium.html.head create mode 100644 bench/site-matrix/raw/http-08-medium.json create mode 100644 bench/site-matrix/raw/http-09-reddit.html.head create mode 100644 bench/site-matrix/raw/http-09-reddit.json create mode 100644 bench/site-matrix/raw/http-10-amazon.html.head create mode 100644 bench/site-matrix/raw/http-10-amazon.json create mode 100644 bench/site-matrix/raw/http-11-allbirds.html.head create mode 100644 bench/site-matrix/raw/http-11-allbirds.json create mode 100644 bench/site-matrix/raw/http-12-youtube.html.head create mode 100644 bench/site-matrix/raw/http-12-youtube.json create mode 100644 bench/site-matrix/raw/http-13-x.html.head create mode 100644 bench/site-matrix/raw/http-13-x.json create mode 100644 bench/site-matrix/raw/http-14-linkedin.html.head create mode 100644 bench/site-matrix/raw/http-14-linkedin.json create mode 100644 bench/site-matrix/raw/http-15-baike.html.head create mode 100644 bench/site-matrix/raw/http-15-baike.json create mode 100644 bench/site-matrix/raw/http-16-zhihu.html.head create mode 100644 bench/site-matrix/raw/http-16-zhihu.json create mode 100644 bench/site-matrix/raw/http-17-govcn.html.head create mode 100644 bench/site-matrix/raw/http-17-govcn.json create mode 100644 bench/site-matrix/raw/http-17-govcn.listing.html.head create mode 100644 bench/site-matrix/raw/http-17-govcn.listing.json create mode 100644 bench/site-matrix/raw/http-18-newscn.html.head create mode 100644 bench/site-matrix/raw/http-18-newscn.json create mode 100644 bench/site-matrix/raw/http-19-kr36.html.head create mode 100644 bench/site-matrix/raw/http-19-kr36.json create mode 100644 bench/site-matrix/raw/http-20-weibo.html.head create mode 100644 bench/site-matrix/raw/http-20-weibo.json create mode 100644 bench/site-matrix/raw/http-domestic.jsonl create mode 100644 bench/site-matrix/raw/http-foreign.jsonl create mode 100644 bench/site-matrix/raw/lp-01-wikipedia.excerpt.json create mode 100644 bench/site-matrix/raw/lp-01-wikipedia.json create mode 100644 bench/site-matrix/raw/lp-02-hackernews.excerpt.json create mode 100644 bench/site-matrix/raw/lp-02-hackernews.json create mode 100644 bench/site-matrix/raw/lp-03-stackoverflow.excerpt.json create mode 100644 bench/site-matrix/raw/lp-03-stackoverflow.json create mode 100644 bench/site-matrix/raw/lp-04-github.excerpt.json create mode 100644 bench/site-matrix/raw/lp-04-github.json create mode 100644 bench/site-matrix/raw/lp-05-mdn.excerpt.json create mode 100644 bench/site-matrix/raw/lp-05-mdn.json create mode 100644 bench/site-matrix/raw/lp-06-bbc.excerpt.json create mode 100644 bench/site-matrix/raw/lp-06-bbc.json create mode 100644 bench/site-matrix/raw/lp-07-techcrunch.excerpt.json create mode 100644 bench/site-matrix/raw/lp-07-techcrunch.json create mode 100644 bench/site-matrix/raw/lp-08-medium.excerpt.json create mode 100644 bench/site-matrix/raw/lp-08-medium.json create mode 100644 bench/site-matrix/raw/lp-09-reddit.excerpt.json create mode 100644 bench/site-matrix/raw/lp-09-reddit.json create mode 100644 bench/site-matrix/raw/lp-10-amazon.excerpt.json create mode 100644 bench/site-matrix/raw/lp-10-amazon.json create mode 100644 bench/site-matrix/raw/lp-11-allbirds.excerpt.json create mode 100644 bench/site-matrix/raw/lp-11-allbirds.json create mode 100644 bench/site-matrix/raw/lp-12-youtube.excerpt.json create mode 100644 bench/site-matrix/raw/lp-12-youtube.json create mode 100644 bench/site-matrix/raw/lp-13-x.excerpt.json create mode 100644 bench/site-matrix/raw/lp-13-x.json create mode 100644 bench/site-matrix/raw/lp-14-linkedin.excerpt.json create mode 100644 bench/site-matrix/raw/lp-14-linkedin.json create mode 100644 bench/site-matrix/raw/lp-15-baike.excerpt.json create mode 100644 bench/site-matrix/raw/lp-15-baike.json create mode 100644 bench/site-matrix/raw/lp-16-zhihu.excerpt.json create mode 100644 bench/site-matrix/raw/lp-16-zhihu.json create mode 100644 bench/site-matrix/raw/lp-17-govcn.excerpt.json create mode 100644 bench/site-matrix/raw/lp-17-govcn.json create mode 100644 bench/site-matrix/raw/lp-17-govcn.listing.json create mode 100644 bench/site-matrix/raw/lp-18-newscn.excerpt.json create mode 100644 bench/site-matrix/raw/lp-18-newscn.json create mode 100644 bench/site-matrix/raw/lp-19-kr36.excerpt.json create mode 100644 bench/site-matrix/raw/lp-19-kr36.json create mode 100644 bench/site-matrix/raw/lp-20-weibo.excerpt.json create mode 100644 bench/site-matrix/raw/lp-20-weibo.json create mode 100644 bench/site-matrix/raw/lp-domestic.jsonl create mode 100644 bench/site-matrix/raw/lp-foreign.jsonl create mode 100644 bench/site-matrix/raw/resolved-domestic.json create mode 100644 bench/site-matrix/raw/resolved-foreign.json create mode 100644 bench/site-matrix/reclassify.py create mode 100644 bench/site-matrix/results.json create mode 100755 bench/site-matrix/run.sh create mode 100755 bench/site-matrix/summarize.py create mode 100644 bench/site-matrix/targets.json create mode 100644 bench/trafilatura-http/Dockerfile create mode 100755 bench/trafilatura-http/app.py create mode 100644 bench/trafilatura-http/compose.yml create mode 100755 bench/trafilatura-http/eval_t2.py create mode 100644 bench/trafilatura-http/raw/bodies/t2-1.json create mode 100644 bench/trafilatura-http/raw/bodies/t2-2.json create mode 100644 bench/trafilatura-http/raw/bodies/t2-3.json create mode 100644 bench/trafilatura-http/raw/bodies/t2-4.json create mode 100644 bench/trafilatura-http/raw/bodies/t2-5.json create mode 100644 bench/trafilatura-http/raw/bodies/t2-cross-govcn.json create mode 100644 bench/trafilatura-http/raw/bodies/t2-fallback-404.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-1.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-10.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-11.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-12.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-13.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-14.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-15.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-16.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-17.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-18.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-19.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-2.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-20.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-21.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-22.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-23.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-24.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-25.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-26.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-27.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-28.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-29.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-3.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-30.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-31.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-32.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-33.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-34.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-35.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-36.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-37.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-38.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-39.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-4.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-40.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-41.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-42.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-43.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-44.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-45.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-46.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-47.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-48.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-49.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-5.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-50.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-51.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-52.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-53.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-54.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-55.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-56.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-57.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-58.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-59.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-6.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-60.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-7.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-8.json create mode 100644 bench/trafilatura-http/raw/bodies/t5-9.json create mode 100644 bench/trafilatura-http/raw/meta.json create mode 100644 bench/trafilatura-http/raw/p0-combo.tsv create mode 100644 bench/trafilatura-http/raw/t2-1.metrics.json create mode 100644 bench/trafilatura-http/raw/t2-2.metrics.json create mode 100644 bench/trafilatura-http/raw/t2-3.metrics.json create mode 100644 bench/trafilatura-http/raw/t2-4.metrics.json create mode 100644 bench/trafilatura-http/raw/t2-5.metrics.json create mode 100644 bench/trafilatura-http/raw/t2-cross-govcn.metrics.json create mode 100644 bench/trafilatura-http/raw/t2-cross-govcn.verdict.json create mode 100644 bench/trafilatura-http/raw/t2-fallback-404.metrics.json create mode 100644 bench/trafilatura-http/raw/t2-fallback-404.verdict.json create mode 100644 bench/trafilatura-http/raw/t2.jsonl create mode 100644 bench/trafilatura-http/raw/t5-1.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-10.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-11.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-12.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-13.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-14.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-15.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-16.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-17.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-18.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-19.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-2.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-20.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-21.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-22.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-23.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-24.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-25.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-26.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-27.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-28.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-29.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-3.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-30.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-31.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-32.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-33.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-34.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-35.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-36.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-37.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-38.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-39.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-4.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-40.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-41.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-42.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-43.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-44.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-45.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-46.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-47.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-48.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-49.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-5.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-50.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-51.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-52.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-53.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-54.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-55.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-56.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-57.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-58.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-59.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-6.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-60.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-7.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-8.metrics.json create mode 100644 bench/trafilatura-http/raw/t5-9.metrics.json create mode 100644 bench/trafilatura-http/raw/t5.jsonl create mode 100644 bench/trafilatura-http/raw/trafilatura-http-idle.tsv create mode 100644 bench/trafilatura-http/raw/trafilatura-http-session.tsv create mode 100644 bench/trafilatura-http/raw/trafilatura-http-t5.tsv create mode 100755 bench/trafilatura-http/request.sh create mode 100644 bench/trafilatura-http/results.json create mode 100755 bench/trafilatura-http/run.sh create mode 100644 bench/trafilatura-http/samples/t2-1.excerpt.json create mode 100644 bench/trafilatura-http/samples/t2-2.excerpt.json create mode 100644 bench/trafilatura-http/samples/t2-3.excerpt.json create mode 100644 bench/trafilatura-http/samples/t2-cross-govcn.excerpt.json create mode 100755 bench/trafilatura-http/summarize.py create mode 160000 casa-commander create mode 100644 docs/README.md create mode 100644 docs/decision-candidates-20260901.md create mode 100644 docs/deploy-prod-preset-20260901.md create mode 100644 docs/design-arch-20260901.md create mode 100644 docs/integration-vlepontas-20260901.md create mode 100644 docs/mcp-usage-20260901.md create mode 100644 docs/overview-integration-20260901.md create mode 100644 docs/plan-final-20260901.md create mode 160000 onesvm-dev-md diff --git a/.dsh/casa.yml b/.dsh/casa.yml new file mode 100644 index 0000000..08d3142 --- /dev/null +++ b/.dsh/casa.yml @@ -0,0 +1,81 @@ +# CASA 项目配置(DSH 版) +# 复制到:.dsh/casa.yml +# models.families.* 只是偏好声明:DSH 会话模型由部署决定,禁止编造模型名。 + +# ---------- 知识库(可选)---------- +knowledge: + mode: off # off | builtin | external;有组织 KB(onesvm-dev-md)→ off + before_contract: true + builtin_root: casa-commander/kb + builtin_entrypoints: + - README.md + - norms/coding-baseline.md + - norms/casa-task.md + - procedures/task-flow.md + external: + root: "" + entrypoints: [] + merge_into_arch_review: true + +# ---------- 模型族(DSH:仅建议;subagent_cursor 可真实解析)---------- +# family = 角色/复杂度标签。DSH 内置 subagent 继承部署路由(family 仅为偏好); +# 派发 subagent_cursor 时 family 直接映射为 Cursor 模型 spec(brief 的 Required +# model 行逐次生效)。spec 语法:{模型id}[?参数=值&...]。 +# 已实测可用:composer-2.5;grok-4.6 全档(effort low/medium/high/xhigh ±fast)。 +models: + families: + simple: grok-4.6?effort=high + hard: grok-4.6?effort=xhigh + architect: grok-4.6?effort=xhigh + reviewer: grok-4.6?effort=xhigh + +routing: + default_family: simple + complexity: + simple: simple + hard: hard + core_framework: architect + +architecture_review: + enabled_for: + - core_framework + reviewer: subagent_fork # 只读审查者 + norm_globs: + - docs/**/*.md + - AGENTS.md + - onesvm-dev-md/base/**/*.md + require_pass_to_done: true + +# ---------- Gate 运行时(纪律参数)---------- +runtime: + session_ttl_hours: 8 + worker_ttl_minutes: 30 + # 缺 Plan/Step/scope 时:warn(默认)= 建议并放行;enforce = 硬拒绝。 + # 过期 / 暂停 / 错误 Plan ID 仍始终硬拒绝。 + worker_start: warn + # 讨论 CASA 本身不启模式;仅明确「使用/启用」才激活 + intent_only: true + allow_simple_without_gate: true + runtime_dir: .dsh/casa-runtime + +policy: + max_iterations: 3 + control_plane_max_file_bytes: 0 + write_timeline: true + +# ---------- onesvm-dev-md 自动提交(可选,项目级)---------- +# 仅当工作区含 onesvm-dev-md submodule 且本会话新改时生效;绝不自动 push。 +dev_md_sync: + enabled: true + auto_commit: true + auto_push: false + require_verify_docs: true + exclude: + - base/credentials.md + - base/local-machine-services.md + +preferences_note: | + DSH 会话模型由部署决定,本文件的 families 仅是偏好标签,不改变路由。 + 已有组织知识库时保持 knowledge.mode: off。 + 简单任务默认直接执行;仅明确启动 CASA 或已有活动 Plan 时启用门禁。 + DSH 无 hooks:Gate 是 agent 自律纪律,硬边界为沙箱与审批栈。 diff --git a/.dsh/contracts/contract-20260901-browser-arch.md b/.dsh/contracts/contract-20260901-browser-arch.md new file mode 100644 index 0000000..5cd4e22 --- /dev/null +++ b/.dsh/contracts/contract-20260901-browser-arch.md @@ -0,0 +1,115 @@ +# Contract: onesvm-browser-server 联网搜索服务架构选型与实测评定 + +> 状态: done +> 创建: 2026-09-01(Asia/Shanghai) +> run_id: run-20260901-browser-arch +> CASA Contract Gate — 仅 `approved` / `in_progress` 后进入 Execute + +## deliverable_type + +docs + spike(架构方案文档 + 开源方案实测评定;本轮**不**写生产业务代码) + +## complexity + +core_framework(最终方案须经 Architecture Review 通过才可 done) + +## model_family + +architect(最终方案);实测/调研步骤 hard/simple 见 Plan 步骤表 + +## model_override + +(空) + +## 档位 + +commander(用户明确「作为开发架构与开发指挥官」) + +## 背景 + +新仓 onesvm-browser-server 要构建「支持可扩容、集成多浏览器自构建方案、高并发排队」的联网搜索服务,服务对象为 Vlepontas(60 会话级)与 EAI 等内部 toB 智能体。用户给出 6 项任务:统一出口 / 集群与排队 / 拓展坞协议+整合器 / ProxyManager 合规代理 / 开源方案筛选实测 / 最终方案 review。用户已确认四项关键决策:① 部署目标 dev-swarm 内网集群;② 已有代理订阅(容灾后续补充,明文仅存 `.dsh/artifacts/proxy-subscriptions.local.md`,gitignore);③ 出口 MCP Server 为主 + HTTP API 兜底;④ 本机 Docker 全量实测。 + +## scope + +### in_scope + +``` +.dsh/contracts/** +.dsh/artifacts/** +.dsh/casa-runtime/** +docs/** +research/** +bench/** +``` + +### out_of_scope + +``` +生产/primary 环境任何变更(本轮仅设计+本机实测) +其它业务仓(vlepontas / EAI 等) +onesvm-dev-md/base/credentials.md(只读不改) +git commit / push(除非用户明确要求) +代理订阅明文(禁止写入任何 in-scope 的可提交文件;仅 .dsh/artifacts/*.local.md) +生产级源码实现(src/** 本轮不建,方案通过后另开 Contract) +``` + +## acceptance + +- [ ] 最终方案文档 `docs/` 覆盖用户任务 1–6 全部要点,含 mermaid 拓扑 +- [ ] 实测报告覆盖**国内外各 ≥2 套**候选方案,每套含:数据质量样本、延迟、内存占用、成功率、反爬表现;搜索需求模板 ≥5 套(国内搜索 / 国内正文提取 / 国外搜索·代理 / 国外 JS 渲染页 / 60 会话 burst 压测) +- [ ] 集群规格设计落在 dev-swarm 现实约束(3 节点 × ~6.5GB RAM)内,且**本项目全栈(网关+排队+ProxyManager+无头 worker 集群)总内存 ≤1GB,按需求从低水位渐进递增至 1GB 上限**;给出无 Redis 排队机制与横向扩展公式(含 1GB 内的渐进扩容档位表) +- [ ] ProxyManager 设计含:订阅解析容灾、健康检查轮换、出口端合规拦截(违反中国法律的数据获取直接拦截)+ MCP 文档消费侧规则(双向保险) +- [ ] 出口形态 = MCP Server 为主 + HTTP API 兜底;HTTP 侧采用组织 urlapi 惯例(独立端口 + `/search-api` 类前缀),认证头遵循 service-secret-protocol(静态 key 走 `X-Service-Token`/`X-API-Key`,禁 Bearer) +- [ ] 有头浏览器仅抽象插拔预留,不建具体设施 +- [ ] 所有实测数据来自本机 Docker 真实运行,禁止纸面编造(每条数据可追溯至 `bench/` 产物) +- [ ] Verify + 独立 Reverify 双过;Architecture Review PASS + +## constraints + +- 能不加 Redis 就不加(用户硬性偏好,排队机制须给无 Redis 方案) +- **本项目集群总内存硬上限 1GB,且按需求渐进递增(起步低水位 → 逐步增至 1GB)**:内存成为选型的决定性指标,实测必须精确记录每方案 idle/单会话/60 burst 三档内存;超轻量内核(Lightpanda/Bouncy/chrome-headless-shell/PinchTab 类)优先级上调,重型方案(Camoufox 等)须论证单实例内存或降为预留档 +- **若 bench 数据显示 1GB 无法维持 Vlepontas 60 会话级 + EAI 并发负载**,最终方案必须附「扩容提议」:给出维持该负载所需的具体规格(内存总量/节点分布/各组件副本数)与预期性能(并发能力/延迟/吞吐),每项数字由 bench 实测数据换算支撑,供用户决策 +- 轻量化/无头优先;有头仅预留插拔 +- 候选方案最终评定:国内外各 ≥2,总数控制在 4–6 套,稳定质量好优先 +- 本机 Mac Docker 实测须控制资源(同时运行候选容器 ≤3,实测完即停) +- 时间/时区一律 Asia/Shanghai +- 源文件行数硬上限 600(本轮主要为文档与 bench 脚本) +- 实测执行类委派 `subagent_cursor`(brief 写 `Required model: grok-4.6?effort=high`;复杂实测 `xhigh`) + +## artifact_io + +| stage | 读取 (kinds/paths) | 写入 (kinds/paths) | +|-------|--------------------|--------------------| +| S1 research | web + 用户附表 | `.dsh/artifacts/run-20260901-browser-arch/research/*.md` | +| S2 select | S1 产物 + 附表 | `.dsh/artifacts/run-20260901-browser-arch/select.md` + `bench/plan.md` | +| S3a proxy-probe | `.dsh/artifacts/proxy-subscriptions.local.md` | `.dsh/artifacts/run-20260901-browser-arch/proxy-probe.md` | +| S3b/S3c bench | S2 选定方案 + 代理 | `bench/**` + `.dsh/artifacts/run-20260901-browser-arch/bench/*.md,*.json` | +| S4 arch-design | KB + S1 | `docs/design-arch-*.md` | +| S5 final-plan | 全部前置产物 | `docs/plan-final-*.md` | +| S6 verify/reverify | S5 文档 + 全部产物 | `.dsh/artifacts/run-20260901-browser-arch/review*.md` | +| S7 arch_review | S5 + norms | `.dsh/artifacts/run-20260901-browser-arch/arch-review.md` | + +## stage_dag + +``` +[S1] ∥ [S3a] → [S2] → [S3b ∥ S3c] → [S5] +[S4(依赖 S1,与 S2/S3 并行)] ↗ +[S5] → [S6 verify+reverify] → [S7 arch_review] → done +``` + +## revisions + +| 日期 | 变更摘要 | 作废 artifact | +|------|----------|---------------| +| 2026-09-01 | 初版;用户四问已确认(dev-swarm / 代理订阅已有 / MCP+HTTP / 本机全量实测) | — | +| 2026-09-01 | 用户补充硬约束:本项目集群总内存 ≤1GB 且按需求渐进递增;内存升为选型决定性指标 | — | +| 2026-09-01 | 用户补充:若 1GB 不够维持 Vlepontas+EAI 负载,须给出扩容提议(规格+预期性能,bench 数据支撑) | — | +| 2026-09-01 | S6 ITERATE:Verify PASS + Reverify FAIL(P1×2/P2×4/P3×2)→ 主会话修订 plan-final 与 design-arch(记账口径/入队路径/420×/mihomo 标注/节点布局/扩容换算/端口取代/MCP 表述),送双重复查 | reverify.md 初版结论 FAIL,待复审 | + +## notes + +- 组织 KB 入口:`onesvm-dev-md/base/development-standards.md`、`deployment-rules.md`、`infrastructure-inventory.md`;经验 `experience/projects/vlepontas.md`(既有 WSG/Tavily 先例,本服务为其自构建替代/升级)、`dev-swarm.md` +- dev-swarm 事实:3 manager(.61/.62/.63,VM107/108/109),6656MB RAM/节点,overlay 10.60.0.0/16,Engine 29.5.3;镜像传输走 docker save/load + `--resolve-image never` +- 已有 central-proxy(.53:7890,订阅 :8080/sub/onesvm.yaml)可作 ProxyManager 参考/复用点 +- 风险:① 代理订阅节点质量未知(S3a 先探活);② 本机 Mac 资源有限,全量实测分批;③ 部分候选(Camoufox/Lightpanda)平台兼容性需实测验证 +- 回滚:本轮仅文档与本机容器,`docker compose down` + 删文档即可 diff --git a/.dsh/contracts/plan-20260901-01.md b/.dsh/contracts/plan-20260901-01.md new file mode 100644 index 0000000..fa6d603 --- /dev/null +++ b/.dsh/contracts/plan-20260901-01.md @@ -0,0 +1,70 @@ +# Commander Plan: onesvm-browser-server 架构选型与实测评定 + +> 状态: done +> 创建: 2026-09-01(Asia/Shanghai) +> plan_id: plan-20260901-01 +> Plan Gate — 仅 `approved` / `in_progress` 后 Commander 可派发 Worker + +## 目标 + +交付一份用户可 review 的最终方案:统一出口架构 + 无 Redis 高并发排队集群规格(dev-swarm 现实约束)+ 拓展坞协议 Worker 模版/整合器 + ProxyManager 合规代理 + 国内外各 ≥2 套开源方案的实测评定与入选结论。 + +## 背景与约束 + +- Norm: `onesvm-dev-md/base/development-standards.md`、`deployment-rules.md`、`devops-role-boundaries.md`;全局 service-secret-protocol(静态 key 禁 Bearer) +- Fact: dev-swarm 3×~6.5GB RAM;既有 WSG(Tavily)先例 urlapi `/search-api`+`/mcp`;central-proxy `.53:7890` +- constraints: 见 Contract(含 2026-09-01 补充:全栈总内存 ≤1GB 渐进递增,内存为选型决定性指标);执行类一律 `subagent_cursor`(grok);代理明文仅 `.local.md` + +## 默认 model_family + +hard(实测/调研);architect(S4/S5 设计);reviewer(S6/S7) + +## 步骤表(Stage DAG) + +| step_id | goal | worker | model_family | scope (in) | out_of_scope | acceptance | depends_on | status | +|---------|------|--------|--------------|------------|--------------|------------|------------|--------| +| S1 | 主流联网搜索服务架构调研:统一出口/注册key模式、AI原生输出格式(Firecrawl/Crawl4AI/Jina 等 markdown+schema 实践)、无Redis排队与浏览器集群管理(Browserless/steel 等) | subagent_cursor(explore) | hard | 写入仅 `.dsh/artifacts/run-20260901-browser-arch/research/` | 业务代码 | research/*.md 含可引用的架构要点与来源链接 | — | done | +| S3a | 代理解析与探活:解析订阅(Clash/V2Ray),本机起客户端,验证 ≥3 个可用出口节点,测速与目标站连通性(google/bing/reddit/amazon),输出可用节点清单与路由建议 | subagent_cursor(shell) | simple | `.dsh/artifacts/run-20260901-browser-arch/proxy-probe.md` + `bench/proxy/**` | 订阅明文禁入 git 可提交文件 | proxy-probe.md 含实测连通数据 | — | done(52 vless 全活,最优 167ms;hy2 UDP 全灭弃用) | +| S2 | 候选筛选 | subagent_cursor(explore) | hard | select.md + bench/plan.md | — | 入选/排除+模板指标 | S1 | done(5套入选) | +| S3b | 国内组实测:本机 Docker 部署入选国内方案,跑 5 模板,记录质量/延迟/**idle·单会话·60burst 三档内存**/成功率(内存为决定性指标) | subagent_cursor(implement) | hard | `bench/**` + `.dsh/artifacts/.../bench/` | 不碰代理国外链路 | bench 产物含原始日志+汇总表(含三档内存实测) | S2 | done | +| S3c | 国外组实测:同上但走 S3a 代理路由,含 JS 渲染页与反爬观察 | subagent_cursor(implement) | hard | `bench/**` + `.dsh/artifacts/.../bench/` | — | 同上 | S2, S3a | done | +| S4 | 任务1–4 架构设计:统一出口+注册/key、拓展坞协议 Worker 模版+整合器、统一 AI 原生输出格式、无 Redis 排队、ProxyManager 合规双向拦截、有头插拔预留、dev-swarm 集群规格与扩展公式 | subagent_fork(implement) | architect | `docs/design-arch-20260901.md` | bench/ | 文档覆盖任务1–4 全部要点,含 mermaid | S1 | done | +| S5 | 最终方案整合:S4 设计 + S3 实测结论 + 入选方案与部署规格 + MCP 使用规则草案 → 用户 review 版 | 主会话(指挥官整合) | architect | `docs/plan-final-20260901.md` | — | 覆盖任务 1–6,数据均可追溯 bench 产物 | S3b,S3c,S4 | done | +| S6 | Verify + 独立 Reverify | subagent_fork(review) ×2 | reviewer | 只读 S5 + 全部产物 | — | review.md / reverify.md 无未解决 blocker | S5 | done(Verify PASS + Reverify FAIL→修订→复审 PASS;残留 R1/R2 已顺手修) | +| S7 | Architecture Review(core_framework 强制) | subagent_fork(arch-review) | reviewer | 只读 S5 + norms | — | arch-review.md PASS | S6 | done(一轮 FAIL P1-AR1 → 修订 → 二轮 PASS) | + +## 并行策略 + +- S1 ∥ S3a 同时启动 +- S4 在 S1 完成后启动,与 S2/S3 实测并行 +- S3b ∥ S3c 并行(本机资源约束:同时运行候选容器 ≤3,worker 须自纪律分批) +- S5 等 S3b/S3c/S4 全部 done 后由主会话整合 + +## 全局 acceptance(Plan 级) + +- [ ] Contract acceptance 全过(见 Contract) +- [ ] 各 step status = done +- [ ] `.dsh/artifacts/run-20260901-browser-arch/review.md` 与 `arch-review.md` 无未解决 blocker + +## artifact 布局 + +``` +.dsh/artifacts/run-20260901-browser-arch/ +├── commander.log +├── research/ # S1 +├── select.md # S2 +├── proxy-probe.md # S3a +├── bench/ # S3b/S3c 汇总(原始在 bench/) +├── review.md / reverify.md +└── arch-review.md +bench/ # 本机实测 compose/脚本/原始数据(可提交,禁含密钥) +docs/ # 设计文档与最终方案(可提交) +.dsh/casa-runtime/sessions/session-af595dc1-78f9-4dbd-93ef-6c21e3c1f912.json +``` + +## 风险与回滚 + +- 代理节点不可用 → S3a 报告具体失败,S3c 降级为「仅直连可达国外源」实测 + 方案级评估,并向用户报告 +- 本机资源不足 → 分批实测,bench/plan.md 记录批次 +- 候选方案 Mac 不兼容(如 browser-swarm 仅限 Apple Silicon 反而有利;Camoufox 需 xvfb)→ 记录为实测结论之一 +- 回滚:仅文档与本机容器,无生产影响 diff --git a/.dsh/contracts/plan-20260901-02.md b/.dsh/contracts/plan-20260901-02.md new file mode 100644 index 0000000..a6b7d7c --- /dev/null +++ b/.dsh/contracts/plan-20260901-02.md @@ -0,0 +1,35 @@ +# Commander Plan: 文档体系 + 部署预设 + 强对抗优化方案(第二轮) + +> 状态: done +> 创建: 2026-09-01(Asia/Shanghai) +> plan_id: plan-20260901-02 +> run_id: run-20260901-browser-arch(沿用首轮实测数据) + +## 目标 + +交付 5 项:T0 整合架构梳理文档;T1 MCP 使用文档(含能力数据范围);T2 生产部署预设详情(供用户审批,不实际部署);T3 打不过的 9 类站点优化方案研究;T4 Vlepontas 联调使用说明草稿。 + +## 背景与约束 + +- 数据基础:run-20260901-browser-arch 全部产物(bench 实测、site-matrix、三 PASS 验收) +- 约束:本轮纯文档/调研,不部署、不改生产;技术栈选型给预设建议并标决策点;文档 ≤600 行/份 + +## 步骤表 + +| step_id | goal | worker | model_family | scope (in) | acceptance | depends_on | status | +|---------|------|--------|--------------|------------|------------|------------|--------| +| P1 | T3 强对抗站点优化方案研究:Amazon/Medium/Reddit/X/知乎/微博/百度百科/SO/YouTube 各站的可行获取路径(官方 API/RSSHub/移动端/住宅代理/Camoufox/第三方数据服务),按成本-质量-合规分级 | subagent_cursor(explore) | hard | 写 `.dsh/artifacts/run-20260901-browser-arch/research/06-blocked-sites.md` | 每站给出 ≥1 可行路径 + 成本 + 合规注记 + 来源链接 | — | done | +| P2 | T0 整合架构梳理文档:整合哪些自部署服务/怎么整合(Dock 协议+模版层)/提供什么服务/并发排队机制 | subagent_fork(implement) | hard | 写 `docs/overview-integration-20260901.md` + `docs/README.md` 索引 | 覆盖用户四问,引用既有文档不重复造数 | — | done | +| P3 | T1 MCP 使用文档:工具清单/参数/认证/错误码/合规使用规则/能力数据范围(引擎矩阵+站点矩阵+性能档位) | subagent_fork(implement) | hard | 写 `docs/mcp-usage-20260901.md` | 智能体读完可正确接入;能力范围与实测一致 | — | done | +| P4 | T2 生产部署预设:服务清单(控制层/worker)、技术栈、镜像、资源、节点布局、端口、健康检查、部署流程 | 主会话 | architect | 写 `docs/deploy-prod-preset-20260901.md` | 与档位表/布局一致;标出待用户拍板项 | — | done | +| P5 | T4 Vlepontas 联调使用说明草稿(注册/拿 key/接 MCP/验收用例/反馈回路) | 主会话 | hard | 写 `docs/integration-vlepontas-20260901.md` | 批准部署后可直接发对方 | P4 | done | +| P6 | 四份文档独立验收 | subagent_fork(review) | reviewer | 只读 | review 无 blocker | P1–P5 | done(PASS;F1-F5 已修) | + +## 并行策略 + +P1 ∥ P2 ∥ P3 同时启动;P4/P5 主会话穿插;P6 收尾。 + +## 风险 + +- T3 部分站点可能无合规可行路径 → 如实写「无可行路径/需住宅代理成本项」 +- 技术栈预设(Go vs Python)用户可能有偏好 → 标决策点 diff --git a/.gitignore b/.gitignore index f2510d8..0dc3de5 100644 --- a/.gitignore +++ b/.gitignore @@ -190,3 +190,7 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ +.dsh/casa-runtime/ +.dsh/artifacts/ +casa-mode.active +casa-commander.active diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..89719ff --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "onesvm-dev-md"] + path = onesvm-dev-md + url = https://git.onesvm.com/1svm/onesvm-dev-md.git +[submodule "casa-commander"] + path = casa-commander + url = https://git.onesvm.com/surmus/casa-commander.git diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..a408f15 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,52 @@ +# AGENTS — CASA 指挥官工作区(DSH) + +> DSH 会自动加载本文件为基线指令。会话模型由部署决定,不在本文件指定。 + +## 哲学 + +让 LLM 做判断,让系统保证秩序。Agent 之间只传**产物**,不传对话。 + +## 角色 + +### dialogue(主会话) + +- 采集需求 → Contract(含 `complexity` / 档位)→ approved +- 禁止跳过 Contract 大改;禁止口头覆盖 acceptance + +### orchestrator(指挥官) + +- Compile + Normalize → 委派 Worker(subagent / subagent_fork) +- 编排轮不写大段业务实现;不吞产物全文编拓扑 +- `core_framework`:验收后主持 Architecture Review(只读审查) + +### worker-explore / worker-shell / worker-implement + +- brief 含 Goal / Read / Write / Scope / Acceptance / Mode +- 只在 Contract.scope 与 artifact_io 内工作 + +### evaluator-review + +- readonly;builder ≠ judge + +## 默认 Stage + +``` +explore? → implement → verify → review → arch_review? +``` + +## Agent Loop + +`PLAN → EXECUTE → VERIFY → REVERIFY → [ARCH_REVIEW] → DONE` +失败 ITERATE:只注入 `fail-*.md`(+ Contract)。 + +## 工作区约定 + +- 契约/产物:`.dsh/contracts/` 与 `.dsh/artifacts/`(不提交) +- 会话状态:`.dsh/casa-runtime/`(不提交;agent 自律维护) +- 项目配置:`.dsh/casa.yml`;项目技能:`.dsh/skills/` +- 组织知识库:`onesvm-dev-md/`(`knowledge.mode: off`,直接按入口读) +- 组织规范入口:`onesvm-dev-md/base/development-standards.md`、`deployment-rules.md`、`devops-role-boundaries.md` +- 经验库:`onesvm-dev-md/experience/`(`projects/*` 与 `general/lessons-learned.md`) +- 凭据:`onesvm-dev-md/base/credentials.md` 只读,不修改、不编造 IP +- 绝不 `git push` / force-push;未授权不 commit +- CASA 模式细节:加载 `casa-commander` 技能 diff --git a/bench/chrome-headless-shell/_lib.sh b/bench/chrome-headless-shell/_lib.sh new file mode 100644 index 0000000..2d0d9a4 --- /dev/null +++ b/bench/chrome-headless-shell/_lib.sh @@ -0,0 +1,122 @@ +# shared helpers for S3c bench (no secrets) +set -euo pipefail + +log() { printf '[%s] %s\n' "$(date '+%Y-%m-%dT%H:%M:%S%z')" "$*"; } + +parse_mem_mib() { + python3 - "$1" <<'PY' +import re, sys +s = sys.argv[1].split("/")[0].strip() +m = re.match(r"([0-9.]+)\s*([A-Za-z]+)", s) +if not m: + print("0") + raise SystemExit +v, u = float(m.group(1)), m.group(2).lower() +mult = {"b":1,"kib":1024,"kb":1000,"mib":1024**2,"mb":1000**2,"gib":1024**3,"gb":1000**3}.get(u) +if not mult: + print("0"); raise SystemExit +print(f"{v * mult / (1024**2):.3f}") +PY +} + +cgroup_mib() { + local c="$1" raw="" + raw="$(docker exec "$c" sh -c 'cat /sys/fs/cgroup/memory.current 2>/dev/null || cat /sys/fs/cgroup/memory/memory.usage_in_bytes 2>/dev/null' 2>/dev/null || true)" + if [[ -z "$raw" ]]; then + echo "" + return + fi + python3 -c "print(f'{int(\"$raw\")/(1024*1024):.3f}')" +} + +sample_stats() { + local out="$1" interval="$2" duration="$3" + shift 3 + mkdir -p "$(dirname "$out")" + echo -e "ts_iso\tname\tmem_usage\tcpu_pct\tmem_mib\tcgroup_mib" > "$out" + local end=$(( $(date +%s) + duration )) + while [ "$(date +%s)" -lt "$end" ]; do + local ts + ts=$(date -u +%Y-%m-%dT%H:%M:%SZ) + local name mem cpu + while IFS='|' read -r name mem cpu; do + [[ -z "${name:-}" ]] && continue + local mib cg + mib="$(parse_mem_mib "$mem")" + cg="$(cgroup_mib "$name")" + printf '%s\t%s\t%s\t%s\t%s\t%s\n' "$ts" "$name" "$mem" "$cpu" "$mib" "${cg:-}" >> "$out" + done < <(docker stats --no-stream --format '{{.Name}}|{{.MemUsage}}|{{.CPUPerc}}' "$@" 2>/dev/null || true) + sleep "$interval" + done +} + +sample_until_file() { + local out="$1" interval="$2" sentinel="$3" extra_s="$4" + shift 4 + mkdir -p "$(dirname "$out")" + echo -e "ts_iso\tname\tmem_usage\tcpu_pct\tmem_mib\tcgroup_mib" > "$out" + while [[ ! -f "$sentinel" ]]; do + local ts name mem cpu mib cg + ts=$(date -u +%Y-%m-%dT%H:%M:%SZ) + while IFS='|' read -r name mem cpu; do + [[ -z "${name:-}" ]] && continue + mib="$(parse_mem_mib "$mem")" + cg="$(cgroup_mib "$name")" + printf '%s\t%s\t%s\t%s\t%s\t%s\n' "$ts" "$name" "$mem" "$cpu" "$mib" "${cg:-}" >> "$out" + done < <(docker stats --no-stream --format '{{.Name}}|{{.MemUsage}}|{{.CPUPerc}}' "$@" 2>/dev/null || true) + sleep "$interval" + done + local end=$(( $(date +%s) + extra_s )) + while [ "$(date +%s)" -lt "$end" ]; do + local ts name mem cpu mib cg + ts=$(date -u +%Y-%m-%dT%H:%M:%SZ) + while IFS='|' read -r name mem cpu; do + [[ -z "${name:-}" ]] && continue + mib="$(parse_mem_mib "$mem")" + cg="$(cgroup_mib "$name")" + printf '%s\t%s\t%s\t%s\t%s\t%s\n' "$ts" "$name" "$mem" "$cpu" "$mib" "${cg:-}" >> "$out" + done < <(docker stats --no-stream --format '{{.Name}}|{{.MemUsage}}|{{.CPUPerc}}' "$@" 2>/dev/null || true) + sleep "$interval" + done +} + +ensure_image() { + local img="$1" note="${2:-}" + local platform="linux/arm64" + local how="local" + if docker image inspect "$img" >/dev/null 2>&1; then + local arch + arch="$(docker image inspect --format '{{.Architecture}}' "$img")" + if [[ "$arch" == "arm64" || "$arch" == "arm64/v8" ]]; then + log "image present $img arch=$arch" + [[ -n "$note" ]] && echo "$how" > "$note" + return 0 + fi + log "image $img arch=$arch not arm64; re-pull" + fi + log "docker pull --platform $platform $img" + if docker pull --platform "$platform" "$img"; then + how="hub" + [[ -n "$note" ]] && echo "$how" > "$note" + return 0 + fi + local short="${img#docker.io/}" + local mirror="docker.m.daocloud.io/${short}" + log "primary pull failed; retry $mirror" + docker pull --platform "$platform" "$mirror" + docker tag "$mirror" "$img" + how="daocloud_mirror" + [[ -n "$note" ]] && echo "$how" > "$note" +} + +wait_http() { + local url="$1" tries="${2:-40}" + local i + for i in $(seq 1 "$tries"); do + if curl -sf --max-time 2 "$url" >/dev/null; then + return 0 + fi + sleep 1 + done + return 1 +} diff --git a/bench/chrome-headless-shell/cdp_fetch.mjs b/bench/chrome-headless-shell/cdp_fetch.mjs new file mode 100644 index 0000000..b0a8e4c --- /dev/null +++ b/bench/chrome-headless-shell/cdp_fetch.mjs @@ -0,0 +1,358 @@ +#!/usr/bin/env node +/** + * Minimal CDP navigate+extract via native WebSocket (Node 22+). + * Usage: node cdp_fetch.mjs [nav_timeout_s] + * Prints one JSON object to stdout. No secrets. + */ +const cdpHttp = process.argv[2] || "http://127.0.0.1:19222"; +const targetUrl = process.argv[3]; +const navTimeoutS = Number(process.argv[4] || 25); +if (!targetUrl) { + console.error("usage: node cdp_fetch.mjs [nav_timeout_s]"); + process.exit(2); +} + +const UA = + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.7922.109 Safari/537.36"; + +const EXTRACT_JS = `(() => { + const title = document.title || ""; + const bodyText = (document.body && document.body.innerText) ? document.body.innerText : ""; + const html = document.documentElement ? document.documentElement.outerHTML : ""; + let price = ""; + const meta = document.querySelector('meta[itemprop="price"], meta[property="product:price:amount"]'); + if (meta) price = (meta.getAttribute("content") || "").trim(); + if (!price) { + const el = document.querySelector('[class*="price"], [data-testid*="price"], .product-price, #priceblock_ourprice, .a-price .a-offscreen'); + if (el) price = (el.textContent || "").trim().slice(0, 80); + } + let jsonldPrice = ""; + for (const s of document.querySelectorAll('script[type="application/ld+json"]')) { + try { + const j = JSON.parse(s.textContent || "null"); + const arr = Array.isArray(j) ? j : [j]; + const walk = (o) => { + if (!o || typeof o !== "object") return; + if (o.offers) { + const off = Array.isArray(o.offers) ? o.offers[0] : o.offers; + if (off && (off.price || off.lowPrice)) jsonldPrice = String(off.price || off.lowPrice); + } + if (Array.isArray(o["@graph"])) o["@graph"].forEach(walk); + }; + arr.forEach(walk); + } catch (e) {} + } + const quoteCount = document.querySelectorAll(".quote").length; + const lc = (title + "\\n" + bodyText).toLowerCase(); + return { + title, + text: bodyText.slice(0, 8000), + htmlLen: html.length, + textLen: bodyText.length, + price, + jsonldPrice, + quoteCount, + htmlHead: html.slice(0, 1800), + finalUrl: location.href, + readyState: document.readyState, + looksBlocked: /(robot|captcha|sorry|click the button|continue shopping|just a moment|attention required|verify you are human|are you a human)/i.test(lc), + }; +})()`; + +function rewriteWs(wsUrl, httpEndpoint) { + const u = new URL(wsUrl); + const h = new URL(httpEndpoint); + u.protocol = h.protocol === "https:" ? "wss:" : "ws:"; + u.hostname = h.hostname; + u.port = h.port; + return u.toString(); +} + +async function httpJson(url) { + const r = await fetch(url, { signal: AbortSignal.timeout(5000) }); + if (!r.ok) throw new Error(`GET ${url} ${r.status}`); + return r.json(); +} + +class Cdp { + constructor(wsUrl) { + this.wsUrl = wsUrl; + this.ws = null; + this.nextId = 1; + this.pending = new Map(); + this.events = []; + this.handlers = new Map(); + } + async open() { + this.ws = new WebSocket(this.wsUrl); + await new Promise((resolve, reject) => { + const t = setTimeout(() => reject(new Error("ws open timeout")), 8000); + this.ws.addEventListener("open", () => { + clearTimeout(t); + resolve(); + }); + this.ws.addEventListener("error", (e) => { + clearTimeout(t); + reject(e); + }); + }); + this.ws.addEventListener("message", (ev) => { + let msg; + try { + msg = JSON.parse(ev.data); + } catch { + return; + } + if (msg.id && this.pending.has(msg.id)) { + const { resolve, reject } = this.pending.get(msg.id); + this.pending.delete(msg.id); + if (msg.error) reject(new Error(JSON.stringify(msg.error))); + else resolve(msg.result || {}); + return; + } + if (msg.method) { + this.events.push(msg); + const hs = this.handlers.get(msg.method) || []; + for (const h of hs) h(msg.params || {}, msg.sessionId); + } + }); + } + on(method, fn) { + const arr = this.handlers.get(method) || []; + arr.push(fn); + this.handlers.set(method, arr); + } + send(method, params = {}, sessionId) { + const id = this.nextId++; + const payload = { id, method, params }; + if (sessionId) payload.sessionId = sessionId; + return new Promise((resolve, reject) => { + const t = setTimeout(() => { + this.pending.delete(id); + reject(new Error(`cdp timeout ${method}`)); + }, 20000); + this.pending.set(id, { + resolve: (v) => { + clearTimeout(t); + resolve(v); + }, + reject: (e) => { + clearTimeout(t); + reject(e); + }, + }); + this.ws.send(JSON.stringify(payload)); + }); + } + close() { + try { + this.ws && this.ws.close(); + } catch {} + } +} + +function detectVendor(ex) { + const blob = `${ex.title || ""}\n${ex.text || ""}\n${ex.htmlHead || ""}`.toLowerCase(); + if (/cloudflare|cf-challenge|just a moment|cf-turnstile/.test(blob)) return "cloudflare"; + if (/datadome|captcha-delivery/.test(blob)) return "datadome"; + if (/akamai|access denied/.test(blob) && /akamai/.test(blob)) return "akamai"; + if (/amazon|opfcaptcha|validatecaptcha|enter the characters you see/.test(blob) && /robot|captcha/.test(blob)) + return "amazon"; + if (ex.looksBlocked) return "unknown"; + return "none"; +} + +async function pickWs() { + const notes = []; + try { + const ver = await httpJson(`${cdpHttp}/json/version`); + notes.push({ step: "json/version", keys: Object.keys(ver) }); + if (ver.webSocketDebuggerUrl) { + return { ws: rewriteWs(ver.webSocketDebuggerUrl, cdpHttp), notes, mode: "version" }; + } + } catch (e) { + notes.push({ step: "json/version", error: String(e) }); + } + try { + const list = await httpJson(`${cdpHttp}/json/list`); + notes.push({ step: "json/list", n: Array.isArray(list) ? list.length : 0 }); + const page = (list || []).find((t) => t.webSocketDebuggerUrl); + if (page) return { ws: rewriteWs(page.webSocketDebuggerUrl, cdpHttp), notes, mode: "list" }; + } catch (e) { + notes.push({ step: "json/list", error: String(e) }); + } + try { + const created = await httpJson(`${cdpHttp}/json/new?${encodeURIComponent("about:blank")}`); + if (created.webSocketDebuggerUrl) { + return { ws: rewriteWs(created.webSocketDebuggerUrl, cdpHttp), notes, mode: "new" }; + } + } catch (e) { + notes.push({ step: "json/new", error: String(e) }); + } + // last resort: ws on same host/port + const u = new URL(cdpHttp); + return { ws: `ws://${u.hostname}:${u.port}`, notes, mode: "bare" }; +} + +async function waitEvent(cdp, method, timeoutMs, pred) { + return new Promise((resolve, reject) => { + const t = setTimeout(() => reject(new Error(`wait ${method} timeout`)), timeoutMs); + const fn = (params, sessionId) => { + if (pred && !pred(params, sessionId)) return; + clearTimeout(t); + resolve({ params, sessionId }); + }; + cdp.on(method, fn); + }); +} + +async function main() { + const t0 = Date.now(); + const pick = await pickWs(); + const cdp = new Cdp(pick.ws); + await cdp.open(); + let sessionId; + let targetId; + const errors = []; + try { + try { + await cdp.send("Browser.getVersion"); + } catch (e) { + errors.push(`Browser.getVersion: ${e.message}`); + } + try { + const created = await cdp.send("Target.createTarget", { url: "about:blank" }); + targetId = created.targetId; + const attached = await cdp.send("Target.attachToTarget", { targetId, flatten: true }); + sessionId = attached.sessionId; + } catch (e) { + errors.push(`Target.create/attach: ${e.message}`); + sessionId = undefined; + } + const send = (m, p) => cdp.send(m, p, sessionId); + try { + await send("Page.enable"); + } catch (e) { + errors.push(`Page.enable: ${e.message}`); + } + try { + await send("Runtime.enable"); + } catch (e) { + errors.push(`Runtime.enable: ${e.message}`); + } + try { + await send("Network.enable"); + } catch (e) { + errors.push(`Network.enable: ${e.message}`); + } + try { + await send("Network.setUserAgentOverride", { userAgent: UA }); + } catch (e) { + errors.push(`UA override: ${e.message}`); + } + + let inflight = 0; + let lastNet = Date.now(); + cdp.on("Network.requestWillBeSent", () => { + inflight += 1; + lastNet = Date.now(); + }); + cdp.on("Network.loadingFinished", () => { + inflight = Math.max(0, inflight - 1); + lastNet = Date.now(); + }); + cdp.on("Network.loadingFailed", () => { + inflight = Math.max(0, inflight - 1); + lastNet = Date.now(); + }); + + let loadFired = false; + cdp.on("Page.loadEventFired", () => { + loadFired = true; + }); + cdp.on("Page.domContentEventFired", () => {}); + + const navStart = Date.now(); + let navResult; + try { + navResult = await send("Page.navigate", { url: targetUrl }); + } catch (e) { + throw new Error(`Page.navigate failed: ${e.message}`); + } + const navDeadline = Date.now() + navTimeoutS * 1000; + while (Date.now() < navDeadline && !loadFired) { + await new Promise((r) => setTimeout(r, 100)); + } + const loadWaitMs = Date.now() - navStart; + // networkidle up to 8s, else 2s settle + const idleDeadline = Date.now() + 8000; + let usedIdle = false; + while (Date.now() < idleDeadline) { + if (inflight === 0 && Date.now() - lastNet >= 500 && loadFired) { + usedIdle = true; + break; + } + await new Promise((r) => setTimeout(r, 100)); + } + if (!usedIdle) { + await new Promise((r) => setTimeout(r, 2000)); + } + + let extract = {}; + try { + const ev = await send("Runtime.evaluate", { + expression: EXTRACT_JS, + returnByValue: true, + awaitPromise: true, + }); + extract = (ev.result && ev.result.value) || {}; + if (ev.exceptionDetails) { + errors.push(`evaluate exception: ${JSON.stringify(ev.exceptionDetails)}`); + } + } catch (e) { + errors.push(`Runtime.evaluate: ${e.message}`); + } + + if (targetId) { + try { + await cdp.send("Target.closeTarget", { targetId }); + } catch {} + } + + const vendor = detectVendor(extract); + const out = { + ok: true, + cdp_mode: pick.mode, + t_total: (Date.now() - t0) / 1000, + t_nav_s: loadWaitMs / 1000, + networkidle: usedIdle, + errorText: navResult && navResult.errorText, + loaderId: navResult && navResult.loaderId, + ...extract, + challenge_vendor: vendor, + blocked: Boolean(extract.looksBlocked) || vendor !== "none", + cdp_errors: errors, + pick_notes: pick.notes, + }; + process.stdout.write(JSON.stringify(out) + "\n"); + } finally { + cdp.close(); + } +} + +main().catch((e) => { + process.stdout.write( + JSON.stringify({ + ok: false, + error: String(e && e.message ? e.message : e), + t_total: 0, + title: "", + text: "", + htmlLen: 0, + textLen: 0, + blocked: true, + challenge_vendor: "unknown", + }) + "\n" + ); + process.exit(0); +}); diff --git a/bench/chrome-headless-shell/compose.yml b/bench/chrome-headless-shell/compose.yml new file mode 100644 index 0000000..114c230 --- /dev/null +++ b/bench/chrome-headless-shell/compose.yml @@ -0,0 +1,17 @@ +services: + shell: + image: docker.io/chromedp/headless-shell:151.0.7922.109 + platform: linux/arm64 + container_name: bench-s3c-headless-shell + ports: + - "19223:9222" + extra_hosts: + - "host.docker.internal:host-gateway" + # Image ENTRYPOINT /headless-shell/run.sh already sets --no-sandbox, + # --remote-debugging-port=9223 and socat 9222->9223. Do not override those ports. + command: + - --disable-dev-shm-usage + - --proxy-server=http://host.docker.internal:17890 + shm_size: "128m" + mem_limit: 400m + restart: "no" diff --git a/bench/chrome-headless-shell/raw/T4-amz-1.excerpt b/bench/chrome-headless-shell/raw/T4-amz-1.excerpt new file mode 100644 index 0000000..96dd33a --- /dev/null +++ b/bench/chrome-headless-shell/raw/T4-amz-1.excerpt @@ -0,0 +1 @@ +{"tier": "T4-amz", "title": "Page Not Found", "final_url": "https://www.amazon.com/dp/B08N5WRWNW", "html_len": 2327, "text_len": 0, "price": "", "jsonld_price": "", "blocked": false, "vendor": "none", "text_head": "", "html_head": "\n \n \n \n \n Page Not Found\n \n \n\n\n\n\n + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Jump to content +
+
+
+ + + + +
+
+ + + +