lasso-mcp 1.17.3 → 1.18.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dedao-extract/.qc-v3/fk-14.png +0 -0
- package/.dedao-extract/.qc-v3/fkp2-02.png +0 -0
- package/.dedao-extract/.qc-v3/l001-6.png +0 -0
- package/.dedao-extract/.qc-v3/l001-7.png +0 -0
- package/.dedao-extract/.qc-v3/l002-4.png +0 -0
- package/.dedao-extract/analyze.mjs +169 -0
- package/.dedao-extract/b1-01-navigate.json +14 -0
- package/.dedao-extract/b1-02-ready.json +5 -0
- package/.dedao-extract/b1-98-results.json +119 -0
- package/.dedao-extract/b1-99-log.json +18 -0
- package/.dedao-extract/b1-a1-assert.json +18 -0
- package/.dedao-extract/b1-a1-chain.json +13 -0
- package/.dedao-extract/b1-a1-stabilize.json +7 -0
- package/.dedao-extract/b1-a1-switch.json +5 -0
- package/.dedao-extract/b1-a2-assert.json +18 -0
- package/.dedao-extract/b1-a2-chain.json +13 -0
- package/.dedao-extract/b1-a2-stabilize.json +7 -0
- package/.dedao-extract/b1-a2-switch.json +5 -0
- package/.dedao-extract/b1-a3-assert.json +18 -0
- package/.dedao-extract/b1-a3-chain.json +13 -0
- package/.dedao-extract/b1-a3-stabilize.json +7 -0
- package/.dedao-extract/b1-a3-switch.json +5 -0
- package/.dedao-extract/b2-01-navigate.json +14 -0
- package/.dedao-extract/b2-02-ready.json +5 -0
- package/.dedao-extract/b2-98-results.json +242 -0
- package/.dedao-extract/b2-99-log.json +21 -0
- package/.dedao-extract/b2-a1-assert.json +18 -0
- package/.dedao-extract/b2-a1-cleanup.json +35 -0
- package/.dedao-extract/b2-a1-print.json +5 -0
- package/.dedao-extract/b2-a1-stabilize.json +7 -0
- package/.dedao-extract/b2-a1-switch.json +5 -0
- package/.dedao-extract/b2-a2-assert.json +18 -0
- package/.dedao-extract/b2-a2-cleanup.json +35 -0
- package/.dedao-extract/b2-a2-print.json +5 -0
- package/.dedao-extract/b2-a2-stabilize.json +7 -0
- package/.dedao-extract/b2-a2-switch.json +5 -0
- package/.dedao-extract/b2-a3-assert.json +18 -0
- package/.dedao-extract/b2-a3-cleanup.json +35 -0
- package/.dedao-extract/b2-a3-print.json +5 -0
- package/.dedao-extract/b2-a3-stabilize.json +7 -0
- package/.dedao-extract/b2-a3-switch.json +5 -0
- package/.dedao-extract/b3-01-navigate.json +14 -0
- package/.dedao-extract/b3-02-ready.json +5 -0
- package/.dedao-extract/b3-98-results.json +281 -0
- package/.dedao-extract/b3-99-log.json +21 -0
- package/.dedao-extract/b3-a1-assert.json +18 -0
- package/.dedao-extract/b3-a1-cleanup.json +48 -0
- package/.dedao-extract/b3-a1-print.json +5 -0
- package/.dedao-extract/b3-a1-stabilize.json +7 -0
- package/.dedao-extract/b3-a1-switch.json +5 -0
- package/.dedao-extract/b3-a2-assert.json +18 -0
- package/.dedao-extract/b3-a2-cleanup.json +48 -0
- package/.dedao-extract/b3-a2-print.json +5 -0
- package/.dedao-extract/b3-a2-stabilize.json +7 -0
- package/.dedao-extract/b3-a2-switch.json +5 -0
- package/.dedao-extract/b3-a3-assert.json +18 -0
- package/.dedao-extract/b3-a3-cleanup.json +48 -0
- package/.dedao-extract/b3-a3-print.json +5 -0
- package/.dedao-extract/b3-a3-stabilize.json +7 -0
- package/.dedao-extract/b3-a3-switch.json +5 -0
- package/.dedao-extract/b4-diag.json +105 -0
- package/.dedao-extract/dbg-fixscreen.mjs +43 -0
- package/.dedao-extract/dbg-text.mjs +25 -0
- package/.dedao-extract/dbg-text2.mjs +20 -0
- package/.dedao-extract/dbg-text3.mjs +18 -0
- package/.dedao-extract/dbg-text4.mjs +27 -0
- package/.dedao-extract/dbg-text5.mjs +31 -0
- package/.dedao-extract/diag-tail.mjs +90 -0
- package/.dedao-extract/extract-batch1.mjs +377 -0
- package/.dedao-extract/extract-batch2.mjs +371 -0
- package/.dedao-extract/extract-batch3.mjs +392 -0
- package/.dedao-extract/extract-v2.mjs +539 -0
- package/.dedao-extract/extract-v3.mjs +745 -0
- package/.dedao-extract/gapfill.mjs +154 -0
- package/.dedao-extract/probe-frag.mjs +125 -0
- package/.dedao-extract/prod-chapters-dry.json +2516 -0
- package/.dedao-extract/prod-enumeration.json +1682 -0
- package/.dedao-extract/produce-all.mjs +555 -0
- package/.dedao-extract/qc-final.mjs +65 -0
- package/.dedao-extract/qc-v3.mjs +91 -0
- package/.dedao-extract/r2-01-navigate.json +14 -0
- package/.dedao-extract/r2-98-results.json +697 -0
- package/.dedao-extract/r2-99-log.json +15 -0
- package/.dedao-extract/r2-analyze.mjs +96 -0
- package/.dedao-extract/r2-fk-dump.json +139 -0
- package/.dedao-extract/r2-fk-figattr.json +62 -0
- package/.dedao-extract/r2-fk-pagemap.json +64 -0
- package/.dedao-extract/r2-l001-dump.json +129 -0
- package/.dedao-extract/r2-l001-figattr.json +53 -0
- package/.dedao-extract/r2-l001-pagemap.json +55 -0
- package/.dedao-extract/r2-l002-dump.json +109 -0
- package/.dedao-extract/r2-l002-figattr.json +35 -0
- package/.dedao-extract/r2-l002-pagemap.json +37 -0
- package/.dedao-extract/s8-01-navigate.json +14 -0
- package/.dedao-extract/s8-98-results.json +43 -0
- package/.dedao-extract/s8-99-log.json +24 -0
- package/.dedao-extract/s8-fk-fix.json +15 -0
- package/.dedao-extract/s8-fk-pagemap-post.json +58 -0
- package/.dedao-extract/s8-fk-pagemap-pre.json +68 -0
- package/.dedao-extract/s8-fk-promo.json +11 -0
- package/.dedao-extract/s8-ink.mjs +49 -0
- package/.dedao-extract/s8-l003-fix.json +21 -0
- package/.dedao-extract/s8-l003-pagemap-post.json +38 -0
- package/.dedao-extract/s8-l003-pagemap-pre.json +48 -0
- package/.dedao-extract/s8-l003-promo.json +11 -0
- package/.dedao-extract/s9-sikao.json +394 -0
- package/.dedao-extract/scout7-round2.mjs +386 -0
- package/.dedao-extract/scout7b.mjs +121 -0
- package/.dedao-extract/scout7c.mjs +99 -0
- package/.dedao-extract/scout8.mjs +334 -0
- package/.dedao-extract/scout9.mjs +121 -0
- package/.dedao-extract/scratch/fk-01.pgm +75 -0
- package/.dedao-extract/scratch/fk-02.pgm +4 -0
- package/.dedao-extract/scratch/fk-03.pgm +207 -0
- package/.dedao-extract/scratch/fk-04.pgm +986 -0
- package/.dedao-extract/scratch/fk-05.pgm +4 -0
- package/.dedao-extract/scratch/fk-06.pgm +4 -0
- package/.dedao-extract/scratch/fk-07.pgm +4 -0
- package/.dedao-extract/scratch/fk-08.pgm +4 -0
- package/.dedao-extract/scratch/fk-09.pgm +4 -0
- package/.dedao-extract/scratch/fk-10.pgm +4 -0
- package/.dedao-extract/scratch/fk-11.pgm +4 -0
- package/.dedao-extract/scratch/fk-12.pgm +4 -0
- package/.dedao-extract/scratch/fk-13.pgm +4 -0
- package/.dedao-extract/scratch/fk-14.pgm +107 -0
- package/.dedao-extract/scratch/fk-analysis.json +47 -0
- package/.dedao-extract/scratch/fk-before.pdf +0 -0
- package/.dedao-extract/scratch/fk-clean-inner.txt +42 -0
- package/.dedao-extract/scratch/fk-dom-inner.txt +381 -0
- package/.dedao-extract/scratch/fk-fix-inner.txt +42 -0
- package/.dedao-extract/scratch/fk-pdftotext.txt +66 -0
- package/.dedao-extract/scratch/fk-r3-base.pdf +0 -0
- package/.dedao-extract/scratch/fk-r3-base.txt +66 -0
- package/.dedao-extract/scratch/fk-r3-fix.pdf +0 -0
- package/.dedao-extract/scratch/fk-r3-fix.txt +66 -0
- package/.dedao-extract/scratch/fk-r3-s09.pdf +0 -0
- package/.dedao-extract/scratch/l001-1.pgm +6 -0
- package/.dedao-extract/scratch/l001-2.pgm +38 -0
- package/.dedao-extract/scratch/l001-3.pgm +38 -0
- package/.dedao-extract/scratch/l001-4.pgm +4 -0
- package/.dedao-extract/scratch/l001-5.pgm +179 -0
- package/.dedao-extract/scratch/l001-6.pgm +43 -1
- package/.dedao-extract/scratch/l001-7.pgm +4 -0
- package/.dedao-extract/scratch/l001-8.pgm +107 -0
- package/.dedao-extract/scratch/l001-analysis.json +23 -0
- package/.dedao-extract/scratch/l001-before.pdf +0 -0
- package/.dedao-extract/scratch/l001-dom-inner.txt +444 -0
- package/.dedao-extract/scratch/l001-pdftotext.txt +146 -0
- package/.dedao-extract/scratch/l002-1.pgm +6 -0
- package/.dedao-extract/scratch/l002-2.pgm +4 -0
- package/.dedao-extract/scratch/l002-3.pgm +4 -0
- package/.dedao-extract/scratch/l002-4.pgm +4 -0
- package/.dedao-extract/scratch/l002-5.pgm +106 -0
- package/.dedao-extract/scratch/l002-analysis.json +17 -0
- package/.dedao-extract/scratch/l002-before.pdf +0 -0
- package/.dedao-extract/scratch/l002-dom-inner.txt +392 -0
- package/.dedao-extract/scratch/l002-pdftotext.txt +82 -0
- package/.dedao-extract/scratch/l003-clean-inner.txt +74 -0
- package/.dedao-extract/scratch/l003-fix-inner.txt +74 -0
- package/.dedao-extract/scratch/l003-r3-base.pdf +0 -0
- package/.dedao-extract/scratch/l003-r3-base.txt +109 -0
- package/.dedao-extract/scratch/l003-r3-fix.pdf +0 -0
- package/.dedao-extract/scratch/l003-r3-fix.txt +108 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-01.pgm +32 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-02.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-03.pgm +119 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-04.pgm +496 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-05.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-06.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-07.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-08.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-09.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-10.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-11.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-12.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-13.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-base-14.pgm +58 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-01.pgm +32 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-02.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-03.pgm +119 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-04.pgm +496 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-05.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-06.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-07.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-08.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-09.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-10.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-11.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-12.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-13.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-fix-14.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-s09-01.pgm +15 -0
- package/.dedao-extract/scratch/pp-fk-r3-s09-02.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-s09-03.pgm +27 -0
- package/.dedao-extract/scratch/pp-fk-r3-s09-04.pgm +128 -0
- package/.dedao-extract/scratch/pp-fk-r3-s09-05.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-s09-06.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-s09-07.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-s09-08.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-s09-09.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-s09-10.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-s09-11.pgm +4 -0
- package/.dedao-extract/scratch/pp-fk-r3-s09-12.pgm +18 -0
- package/.dedao-extract/scratch/pp-l003-r3-base-1.pgm +7 -0
- package/.dedao-extract/scratch/pp-l003-r3-base-2.pgm +114 -0
- package/.dedao-extract/scratch/pp-l003-r3-base-3.pgm +4 -0
- package/.dedao-extract/scratch/pp-l003-r3-base-4.pgm +30 -0
- package/.dedao-extract/scratch/pp-l003-r3-base-5.pgm +4 -0
- package/.dedao-extract/scratch/pp-l003-r3-base-6.pgm +64 -0
- package/.dedao-extract/scratch/pp-l003-r3-fix-1.pgm +7 -0
- package/.dedao-extract/scratch/pp-l003-r3-fix-2.pgm +114 -0
- package/.dedao-extract/scratch/pp-l003-r3-fix-3.pgm +4 -0
- package/.dedao-extract/scratch/pp-l003-r3-fix-4.pgm +31 -0
- package/.dedao-extract/scratch/pp-l003-r3-fix-5.pgm +4 -0
- package/.dedao-extract/scratch/promo-fk-datauri.txt +1 -0
- package/.dedao-extract/scratch/promo-fk.jpg +0 -0
- package/.dedao-extract/scratch/promo-l001.jpg +0 -0
- package/.dedao-extract/scratch/promo-l002.jpg +0 -0
- package/.dedao-extract/scratch/s8-ink-report.json +447 -0
- package/.dedao-extract/scratch/v2-fk-clean-inner.txt +42 -0
- package/.dedao-extract/scratch/v2-fk-it1.pdf +0 -0
- package/.dedao-extract/scratch/v2-fk-it2.pdf +0 -0
- package/.dedao-extract/scratch/v2-fk-it3.pdf +0 -0
- package/.dedao-extract/scratch/v2-l001-clean-inner.txt +99 -0
- package/.dedao-extract/scratch/v2-l001-it1.pdf +0 -0
- package/.dedao-extract/scratch/v2-l001-it2.pdf +0 -0
- package/.dedao-extract/scratch/v2-l002-clean-inner.txt +53 -0
- package/.dedao-extract/scratch/v2-l002-it1.pdf +0 -0
- package/.dedao-extract/scratch/v2-l002-it2.pdf +0 -0
- package/.dedao-extract/scratch/v3-fk-clean-inner.txt +42 -0
- package/.dedao-extract/scratch/v3-fk-it1.pdf +0 -0
- package/.dedao-extract/scratch/v3-fk-it2.pdf +0 -0
- package/.dedao-extract/scratch/v3-fk-it3.pdf +0 -0
- package/.dedao-extract/scratch/v3-l001-clean-inner.txt +93 -0
- package/.dedao-extract/scratch/v3-l001-it1.pdf +0 -0
- package/.dedao-extract/scratch/v3-l001-it2.pdf +0 -0
- package/.dedao-extract/scratch/v3-l002-clean-inner.txt +49 -0
- package/.dedao-extract/scratch/v3-l002-it1.pdf +0 -0
- package/.dedao-extract/scratch/v3-l002-it2.pdf +0 -0
- package/.dedao-extract/v2-01-navigate.json +14 -0
- package/.dedao-extract/v2-98-results.json +128 -0
- package/.dedao-extract/v2-99-log.json +20 -0
- package/.dedao-extract/v2-fk-figs-it1.json +76 -0
- package/.dedao-extract/v2-fk-figs-it2.json +76 -0
- package/.dedao-extract/v2-fk-fix-screen.json +20 -0
- package/.dedao-extract/v2-fk-meta.json +145 -0
- package/.dedao-extract/v2-fk-promo-audit.json +12 -0
- package/.dedao-extract/v2-fk-targets-it1.json +94 -0
- package/.dedao-extract/v2-fk-targets-it2.json +94 -0
- package/.dedao-extract/v2-l001-figs-it1.json +62 -0
- package/.dedao-extract/v2-l001-fix-screen.json +20 -0
- package/.dedao-extract/v2-l001-meta.json +147 -0
- package/.dedao-extract/v2-l001-promo-audit.json +12 -0
- package/.dedao-extract/v2-l001-targets-it1.json +84 -0
- package/.dedao-extract/v2-l002-figs-it1.json +34 -0
- package/.dedao-extract/v2-l002-fix-screen.json +13 -0
- package/.dedao-extract/v2-l002-meta.json +126 -0
- package/.dedao-extract/v2-l002-promo-audit.json +12 -0
- package/.dedao-extract/v2-l002-targets-it1.json +46 -0
- package/.dedao-extract/v2-qc-final.json +60 -0
- package/.dedao-extract/v3-01-navigate.json +14 -0
- package/.dedao-extract/v3-98-results.json +530 -0
- package/.dedao-extract/v3-99-log.json +60 -0
- package/.dedao-extract/v3-fk-figs-it1.json +66 -0
- package/.dedao-extract/v3-fk-figs-it2.json +66 -0
- package/.dedao-extract/v3-fk-fix-screen.json +20 -0
- package/.dedao-extract/v3-fk-meta.json +164 -0
- package/.dedao-extract/v3-fk-promo-audit.json +12 -0
- package/.dedao-extract/v3-fk-sikao.json +6 -0
- package/.dedao-extract/v3-fk-targets-it1.json +84 -0
- package/.dedao-extract/v3-fk-targets-it2.json +84 -0
- package/.dedao-extract/v3-l001-figs-it1.json +54 -0
- package/.dedao-extract/v3-l001-fix-screen.json +19 -0
- package/.dedao-extract/v3-l001-meta.json +192 -0
- package/.dedao-extract/v3-l001-promo-audit.json +12 -0
- package/.dedao-extract/v3-l001-sikao.json +41 -0
- package/.dedao-extract/v3-l001-targets-it1.json +76 -0
- package/.dedao-extract/v3-l002-figs-it1.json +30 -0
- package/.dedao-extract/v3-l002-fix-screen.json +12 -0
- package/.dedao-extract/v3-l002-meta.json +172 -0
- package/.dedao-extract/v3-l002-promo-audit.json +12 -0
- package/.dedao-extract/v3-l002-sikao.json +32 -0
- package/.dedao-extract/v3-l002-targets-it1.json +42 -0
- package/.dedao-extract/v3-qc-final.json +77 -0
- package/.dedao-extract/write-version-record.py +43 -0
- package/.dedao-scout/01-navigate.json +14 -0
- package/.dedao-scout/02-ready.json +5 -0
- package/.dedao-scout/03-sidebar-hits.json +4 -0
- package/.dedao-scout/04-sidebar-container.json +38 -0
- package/.dedao-scout/05-sidebar-total.json +3 -0
- package/.dedao-scout/06-sidebar-slice-000.json +42 -0
- package/.dedao-scout/07-firstpub.json +12 -0
- package/.dedao-scout/08-heads-audio.json +117 -0
- package/.dedao-scout/09-images.json +4 -0
- package/.dedao-scout/10-content-blocks.json +4 -0
- package/.dedao-scout/11-selected.json +33 -0
- package/.dedao-scout/12-layout.json +75 -0
- package/.dedao-scout/20-ready.json +5 -0
- package/.dedao-scout/21-sidebar-deep.json +148 -0
- package/.dedao-scout/22-right-blocks.json +70 -0
- package/.dedao-scout/23-title.json +13 -0
- package/.dedao-scout/24-playbtn-roots.json +17 -0
- package/.dedao-scout/25-chapter-mods.json +4 -0
- package/.dedao-scout/26-editor-children.json +4 -0
- package/.dedao-scout/27-audio.json +6 -0
- package/.dedao-scout/28-timeinfo-siblings.json +49 -0
- package/.dedao-scout/29-scroll.json +11 -0
- package/.dedao-scout/30-sidebar-scroll.json +4 -0
- package/.dedao-scout/31-click-001.json +10 -0
- package/.dedao-scout/32-after-click.json +4 -0
- package/.dedao-scout/33-audio-article.json +4 -0
- package/.dedao-scout/34-img-lazy.json +27 -0
- package/.dedao-scout/40-all-chapters.json +146 -0
- package/.dedao-scout/41-click-001.json +6 -0
- package/.dedao-scout/42-audio-article-structure.json +4 -0
- package/.dedao-scout/50-click.json +5 -0
- package/.dedao-scout/51-audio-structure.json +111 -0
- package/.dedao-scout/60-chapter-tree.json +31 -0
- package/.dedao-scout/99-log.json +6 -0
- package/.dedao-scout/scout.mjs +246 -0
- package/.dedao-scout/scout2.mjs +163 -0
- package/.dedao-scout/scout3.mjs +132 -0
- package/.dedao-scout/scout4.mjs +119 -0
- package/.dedao-scout/scout5.mjs +89 -0
- package/.dedao-scout/scout6.mjs +100 -0
- package/ARCHITECTURE.md +17 -3
- package/README.md +19 -2
- package/dist/browse/StepEngine.d.ts +1 -1
- package/dist/browse/StepEngine.d.ts.map +1 -1
- package/dist/browse/StepEngine.js +28 -4
- package/dist/browse/StepEngine.js.map +1 -1
- package/dist/browse/cdp-actions.d.ts +8 -0
- package/dist/browse/cdp-actions.d.ts.map +1 -1
- package/dist/browse/cdp-actions.js +16 -0
- package/dist/browse/cdp-actions.js.map +1 -1
- package/dist/browse/steps-types.d.ts +2 -2
- package/dist/browse/steps-types.d.ts.map +1 -1
- package/dist/channels/BrowseChannel.d.ts +22 -1
- package/dist/channels/BrowseChannel.d.ts.map +1 -1
- package/dist/channels/BrowseChannel.js +150 -15
- package/dist/channels/BrowseChannel.js.map +1 -1
- package/dist/channels/LoggedInChannel.d.ts +18 -0
- package/dist/channels/LoggedInChannel.d.ts.map +1 -1
- package/dist/channels/LoggedInChannel.js +81 -0
- package/dist/channels/LoggedInChannel.js.map +1 -1
- package/dist/config/config.d.ts +9 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +27 -0
- package/dist/config/config.js.map +1 -1
- package/dist/desktop/AppleScriptProvider.d.ts +1 -1
- package/dist/desktop/AppleScriptProvider.d.ts.map +1 -1
- package/dist/desktop/AppleScriptProvider.js +6 -2
- package/dist/desktop/AppleScriptProvider.js.map +1 -1
- package/dist/desktop/AxProvider.d.ts +6 -3
- package/dist/desktop/AxProvider.d.ts.map +1 -1
- package/dist/desktop/AxProvider.js +6 -2
- package/dist/desktop/AxProvider.js.map +1 -1
- package/dist/desktop/ScreenshotVlmProvider.d.ts.map +1 -1
- package/dist/desktop/ScreenshotVlmProvider.js +4 -3
- package/dist/desktop/ScreenshotVlmProvider.js.map +1 -1
- package/dist/doctor/doctor.d.ts +1 -1
- package/dist/doctor/doctor.js +1 -1
- package/dist/fallback/BudgetTracker.d.ts +8 -0
- package/dist/fallback/BudgetTracker.d.ts.map +1 -1
- package/dist/fallback/BudgetTracker.js +13 -0
- package/dist/fallback/BudgetTracker.js.map +1 -1
- package/dist/fallback/FallbackDecider.d.ts.map +1 -1
- package/dist/fallback/FallbackDecider.js +5 -2
- package/dist/fallback/FallbackDecider.js.map +1 -1
- package/dist/fallback/LongCircuitBreaker.d.ts +40 -10
- package/dist/fallback/LongCircuitBreaker.d.ts.map +1 -1
- package/dist/fallback/LongCircuitBreaker.js +41 -5
- package/dist/fallback/LongCircuitBreaker.js.map +1 -1
- package/dist/fallback/outcome.d.ts +1 -0
- package/dist/fallback/outcome.d.ts.map +1 -1
- package/dist/fallback/outcome.js +48 -4
- package/dist/fallback/outcome.js.map +1 -1
- package/dist/index.js +32 -5
- package/dist/index.js.map +1 -1
- package/dist/launcher/chrome-idle-reaper.d.ts +36 -3
- package/dist/launcher/chrome-idle-reaper.d.ts.map +1 -1
- package/dist/launcher/chrome-idle-reaper.js +125 -5
- package/dist/launcher/chrome-idle-reaper.js.map +1 -1
- package/dist/launcher/chrome-stop.d.ts +19 -1
- package/dist/launcher/chrome-stop.d.ts.map +1 -1
- package/dist/launcher/chrome-stop.js +20 -10
- package/dist/launcher/chrome-stop.js.map +1 -1
- package/dist/launcher/launch-chrome.d.ts +19 -1
- package/dist/launcher/launch-chrome.d.ts.map +1 -1
- package/dist/launcher/launch-chrome.js +20 -3
- package/dist/launcher/launch-chrome.js.map +1 -1
- package/dist/runtime/CallerTierTracker.d.ts +11 -6
- package/dist/runtime/CallerTierTracker.d.ts.map +1 -1
- package/dist/runtime/CallerTierTracker.js +11 -6
- package/dist/runtime/CallerTierTracker.js.map +1 -1
- package/dist/ssrf/ssrf-guard.d.ts +23 -0
- package/dist/ssrf/ssrf-guard.d.ts.map +1 -1
- package/dist/ssrf/ssrf-guard.js +37 -0
- package/dist/ssrf/ssrf-guard.js.map +1 -1
- package/dist/tools/admin.d.ts.map +1 -1
- package/dist/tools/admin.js +24 -3
- package/dist/tools/admin.js.map +1 -1
- package/dist/tools/browse.d.ts.map +1 -1
- package/dist/tools/browse.js +10 -4
- package/dist/tools/browse.js.map +1 -1
- package/dist/tools/browserbase.d.ts.map +1 -1
- package/dist/tools/browserbase.js +7 -4
- package/dist/tools/browserbase.js.map +1 -1
- package/dist/tools/descriptions.d.ts.map +1 -1
- package/dist/tools/descriptions.js +12 -0
- package/dist/tools/descriptions.js.map +1 -1
- package/dist/tools/fetch-feed.d.ts.map +1 -1
- package/dist/tools/fetch-feed.js +7 -4
- package/dist/tools/fetch-feed.js.map +1 -1
- package/dist/tools/fetch-url.d.ts.map +1 -1
- package/dist/tools/fetch-url.js +27 -13
- package/dist/tools/fetch-url.js.map +1 -1
- package/dist/tools/network.d.ts.map +1 -1
- package/dist/tools/network.js +17 -8
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/pdf.d.ts.map +1 -1
- package/dist/tools/pdf.js +18 -9
- package/dist/tools/pdf.js.map +1 -1
- package/dist/tools/screenshot.d.ts.map +1 -1
- package/dist/tools/screenshot.js +7 -4
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/steel.d.ts.map +1 -1
- package/dist/tools/steel.js +7 -4
- package/dist/tools/steel.js.map +1 -1
- package/dist/tools/wayback.d.ts.map +1 -1
- package/dist/tools/wayback.js +7 -4
- package/dist/tools/wayback.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/util/output-envelope.d.ts +4 -1
- package/dist/util/output-envelope.d.ts.map +1 -1
- package/dist/util/output-envelope.js +51 -9
- package/dist/util/output-envelope.js.map +1 -1
- package/doc/28-/351/235/231/351/273/230/345/256/210/345/210/231/345/256/241/350/256/241/audit.md +227 -0
- package/doc/28-/351/235/231/351/273/230/345/256/210/345/210/231/345/256/241/350/256/241/decisions.md +80 -0
- package/doc/28-/351/235/231/351/273/230/345/256/210/345/210/231/345/256/241/350/256/241/fix-2.md +88 -0
- package/doc/28-/351/235/231/351/273/230/345/256/210/345/210/231/345/256/241/350/256/241/fix.md +39 -0
- package/doc/28-/351/235/231/351/273/230/345/256/210/345/210/231/345/256/241/350/256/241/review-03.md +69 -0
- package/doc/28-/351/235/231/351/273/230/345/256/210/345/210/231/345/256/241/350/256/241/verify.md +186 -0
- package/doc/29-/351/224/231/351/205/215/346/234/272/345/210/266/345/256/241/350/256/241/enumerate.md +139 -0
- package/doc/29-/351/224/231/351/205/215/346/234/272/345/210/266/345/256/241/350/256/241/fixes.md +132 -0
- package/doc/29-/351/224/231/351/205/215/346/234/272/345/210/266/345/256/241/350/256/241/verdict.md +104 -0
- package/doc/KEY-GUIDE.md +30 -3
- package/package.json +1 -1
- package/src/browse/StepEngine.ts +32 -5
- package/src/browse/cdp-actions.ts +18 -0
- package/src/browse/steps-types.ts +2 -2
- package/src/channels/BrowseChannel.ts +176 -14
- package/src/channels/LoggedInChannel.ts +76 -0
- package/src/config/config.ts +38 -0
- package/src/desktop/AppleScriptProvider.ts +7 -3
- package/src/desktop/AxProvider.ts +12 -5
- package/src/desktop/ScreenshotVlmProvider.ts +3 -2
- package/src/doctor/doctor.ts +1 -1
- package/src/fallback/BudgetTracker.ts +15 -0
- package/src/fallback/FallbackDecider.ts +5 -2
- package/src/fallback/LongCircuitBreaker.ts +48 -9
- package/src/fallback/outcome.ts +49 -4
- package/src/index.ts +31 -4
- package/src/invariants/check-invariants.mjs +83 -0
- package/src/launcher/chrome-idle-reaper.ts +139 -5
- package/src/launcher/chrome-stop.ts +38 -7
- package/src/launcher/launch-chrome.ts +31 -3
- package/src/runtime/CallerTierTracker.ts +11 -6
- package/src/ssrf/ssrf-guard.ts +43 -0
- package/src/tools/admin.ts +26 -3
- package/src/tools/browse.ts +10 -4
- package/src/tools/browserbase.ts +7 -4
- package/src/tools/descriptions.ts +12 -0
- package/src/tools/fetch-feed.ts +8 -5
- package/src/tools/fetch-url.ts +30 -15
- package/src/tools/network.ts +18 -9
- package/src/tools/pdf.ts +19 -10
- package/src/tools/screenshot.ts +8 -5
- package/src/tools/steel.ts +7 -4
- package/src/tools/wayback.ts +8 -5
- package/src/types.ts +7 -0
- package/src/util/output-envelope.ts +54 -8
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// analyze.mjs — v2 管线共享分析器(零光栅快测 + 墨迹终检 + 文字零丢失)
|
|
3
|
+
// 白盒依据:P14-探察-二轮 §3(S-A' 闭环:pdfimages 0.1s + pdftotext -bbox 0.07s/页;
|
|
4
|
+
// pdftoppm 对含课程表 PDF 约 2min/份,只作出厂终检,禁入主管线)
|
|
5
|
+
import { execFileSync } from "node:child_process";
|
|
6
|
+
import * as fs from "node:fs";
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
import * as os from "node:os";
|
|
9
|
+
|
|
10
|
+
// 打印参数(extract-batch3 同款):A4、四边 0.4in → pt 域
|
|
11
|
+
export const PT_PER_IN = 72;
|
|
12
|
+
export const PAGE_W_IN = 8.268, PAGE_H_IN = 11.693, MARGIN_IN = 0.4;
|
|
13
|
+
export const CONTENT_TOP = MARGIN_IN * 72; // 28.8pt
|
|
14
|
+
export const PAGE_H_PT = PAGE_H_IN * 72; // 841.92
|
|
15
|
+
export const CONTENT_BOTTOM = PAGE_H_PT - MARGIN_IN * 72; // 813.12
|
|
16
|
+
export const CONTENT_H_PT = CONTENT_BOTTOM - CONTENT_TOP; // 784.32
|
|
17
|
+
export const PAGE_CSS = Math.round((PAGE_H_IN - 2 * MARGIN_IN) * 96); // 1046 css px/页
|
|
18
|
+
export const PROMO_NAT = { w: 1080, h: 607 }; // P14 §1.1 尾部宣传图自然尺寸指纹
|
|
19
|
+
|
|
20
|
+
function tmp(pdf) {
|
|
21
|
+
return path.join(os.tmpdir(), `dz-ana-${process.pid}-${path.basename(pdf)}`);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// ---- pdfimages -list 解析 ----
|
|
25
|
+
export function pdfImages(pdf) {
|
|
26
|
+
const out = execFileSync("pdfimages", ["-list", pdf], { maxBuffer: 64 << 20 }).toString();
|
|
27
|
+
const rows = [];
|
|
28
|
+
for (const line of out.split("\n").slice(2)) {
|
|
29
|
+
const t = line.trim().split(/\s+/);
|
|
30
|
+
if (t.length < 14 || !/^\d+$/.test(t[0])) continue;
|
|
31
|
+
rows.push({
|
|
32
|
+
page: +t[0], num: +t[1], type: t[2], w: +t[3], h: +t[4],
|
|
33
|
+
enc: t[8], xppi: +t[t.length - 4], yppi: +t[t.length - 3],
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return rows.filter((r) => r.type === "image"); // smask=同对象 alpha 通道,不计
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// ---- pdftotext -bbox 解析(词级坐标) ----
|
|
40
|
+
export function bboxWords(pdf) {
|
|
41
|
+
const out = execFileSync("pdftotext", ["-bbox", pdf, "-"], { maxBuffer: 128 << 20 }).toString();
|
|
42
|
+
const pages = [];
|
|
43
|
+
let page = null;
|
|
44
|
+
const re = /<page width="([\d.]+)" height="([\d.]+)">|<word xMin="([\d.-]+)" yMin="([\d.-]+)" xMax="([\d.-]+)" yMax="([\d.-]+)">([\s\S]*?)<\/word>/g;
|
|
45
|
+
let m;
|
|
46
|
+
while ((m = re.exec(out))) {
|
|
47
|
+
if (m[1]) { page = { w: +m[1], h: +m[2], words: [] }; pages.push(page); }
|
|
48
|
+
else if (page) {
|
|
49
|
+
page.words.push({ x0: +m[3], y0: +m[4], x1: +m[5], y1: +m[6], text: m[7] });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return pages;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ---- 快测洞报告(S-A' 闭环核心) ----
|
|
56
|
+
// 判定:非末页 ∧ 文本尾空 >12% ∧ 版面充满度 <0.88(文本跨距 + 图显示高 + 图间隙)
|
|
57
|
+
// 课程表切片页(全页图)被充满度豁免;图片收尾页被充满度豁免(bbox 只见文字的假洞)
|
|
58
|
+
// P23 修复:页脚页码(displayHeaderFooter,y≈821-827 > CONTENT_BOTTOM=813.12)必须排除——
|
|
59
|
+
// 路线b 合并 PDF 带页码页脚,计入会把 textBottom 钉死在页脚 → tailPct 恒 0 → 洞检测全盲。
|
|
60
|
+
// 单章管线(engine)无页脚,此过滤为无操作,行为不变。
|
|
61
|
+
export function holeReport(pdf, { tailPct = 12, fullFloor = 0.88, gapPt = 24 } = {}) {
|
|
62
|
+
const imgs = pdfImages(pdf);
|
|
63
|
+
const pages = bboxWords(pdf);
|
|
64
|
+
const n = pages.length;
|
|
65
|
+
const per = pages.map((pg, i) => {
|
|
66
|
+
const contentWords = pg.words.filter((w) => w.y1 <= CONTENT_BOTTOM + 0.75); // 页脚词排除
|
|
67
|
+
const ys = contentWords.map((w) => w.y1);
|
|
68
|
+
const textBottom = ys.length ? Math.max(...ys) : null;
|
|
69
|
+
const textTop = contentWords.length ? Math.min(...contentWords.map((w) => w.y0)) : null;
|
|
70
|
+
const imgsOnPage = imgs.filter((r) => r.page === i + 1);
|
|
71
|
+
const imgPt = Math.min(
|
|
72
|
+
CONTENT_H_PT,
|
|
73
|
+
imgsOnPage.reduce((s, r) => s + (r.yppi > 0 ? (r.h / r.yppi) * PT_PER_IN : 0), 0),
|
|
74
|
+
);
|
|
75
|
+
const textSpan = textBottom !== null ? textBottom - CONTENT_TOP : 0;
|
|
76
|
+
const used = Math.max(textSpan, 0) + imgPt + imgsOnPage.length * gapPt;
|
|
77
|
+
const fullness = +(used / CONTENT_H_PT).toFixed(3);
|
|
78
|
+
const tailPt = textBottom !== null ? CONTENT_BOTTOM - textBottom : CONTENT_H_PT;
|
|
79
|
+
const tailPctV = +(Math.max(0, tailPt) / CONTENT_H_PT * 100).toFixed(1);
|
|
80
|
+
const isLast = i === n - 1;
|
|
81
|
+
const hole = !isLast && tailPctV > tailPct && fullness < fullFloor;
|
|
82
|
+
const freePt = +Math.max(0, CONTENT_H_PT - used).toFixed(1); // 版面自由空间(保守:文本跨距+图高+图间隙的加性模型)
|
|
83
|
+
const freePct = +(freePt / CONTENT_H_PT * 100).toFixed(1);
|
|
84
|
+
return { page: i + 1, textBottom, textTop, imgCount: imgsOnPage.length, imgPt: Math.round(imgPt), fullness, tailPt: +tailPt.toFixed(1), tailPct: tailPctV, freePt, freePct, isLast, hole };
|
|
85
|
+
});
|
|
86
|
+
return { pdf, pages: n, holes: per.filter((p) => p.hole), per };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ---- 宣传图断言:PDF 内不得存在 1080×607 图 ----
|
|
90
|
+
export function promoInPdf(pdf) {
|
|
91
|
+
return pdfImages(pdf).filter((r) => r.w === PROMO_NAT.w && r.h === PROMO_NAT.h);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ---- 文字零丢失(P14 §3 定案:cleanup 态 innerText vs pdftotext,missing 必须为空) ----
|
|
95
|
+
export function textZeroLoss(pdf, innerTxt) {
|
|
96
|
+
const pdftxt = execFileSync("pdftotext", [pdf, "-"], { maxBuffer: 128 << 20 }).toString();
|
|
97
|
+
const norm = (s) => s.normalize("NFC").replace(/[\s]/g, "");
|
|
98
|
+
const a = norm(pdftxt), b = norm(innerTxt); // a=PDF 侧,b=DOM 侧
|
|
99
|
+
// 多重集 diff(字符级,CJK 字≈词;PDF 侧多出字符=良性:CSS 列表序号等)
|
|
100
|
+
const cnt = new Map();
|
|
101
|
+
for (const ch of a) cnt.set(ch, (cnt.get(ch) || 0) + 1);
|
|
102
|
+
const missCnt = new Map();
|
|
103
|
+
for (const ch of b) {
|
|
104
|
+
const left = cnt.get(ch) || 0;
|
|
105
|
+
if (left > 0) cnt.set(ch, left - 1);
|
|
106
|
+
else missCnt.set(ch, (missCnt.get(ch) || 0) + 1);
|
|
107
|
+
}
|
|
108
|
+
const missing = [...missCnt.entries()].map(([ch, c]) => `${ch}x${c}`);
|
|
109
|
+
// 保序检查:b 必须是 a 的子序列
|
|
110
|
+
let j = 0;
|
|
111
|
+
for (let i = 0; i < a.length && j < b.length; i++) if (a[i] === b[j]) j++;
|
|
112
|
+
return { missing, missingEmpty: missing.length === 0, inOrder: j === b.length, pdfChars: a.length, domChars: b.length };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// ---- 墨迹终检(慢:pdftoppm PGM,仅出厂抽检/3 章对比证据) ----
|
|
116
|
+
export function inkReport(pdf, { first = 1, last = null, tailInkTh = 242, dpi = 36 } = {}) {
|
|
117
|
+
const dir = tmp(pdf);
|
|
118
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
119
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
120
|
+
const npages = last ?? bboxWords(pdf).length;
|
|
121
|
+
const args = ["-f", String(first), "-l", String(last ?? npages), "-r", String(dpi), "-gray", pdf, path.join(dir, "p")];
|
|
122
|
+
execFileSync("pdftoppm", args, { maxBuffer: 64 << 20, timeout: 570000 });
|
|
123
|
+
const files = fs.readdirSync(dir).filter((f) => f.endsWith(".pgm")).sort();
|
|
124
|
+
const out = [];
|
|
125
|
+
for (const f of files) {
|
|
126
|
+
const buf = fs.readFileSync(path.join(dir, f));
|
|
127
|
+
let p = 0;
|
|
128
|
+
const tok = () => {
|
|
129
|
+
while (p < buf.length && (buf[p] === 0x20 || buf[p] === 0x0a || buf[p] === 0x0d || buf[p] === 0x09)) p++;
|
|
130
|
+
if (buf[p] === 0x23) { while (p < buf.length && buf[p] !== 0x0a) p++; return tok(); }
|
|
131
|
+
const s = p;
|
|
132
|
+
while (p < buf.length && !(buf[p] === 0x20 || buf[p] === 0x0a || buf[p] === 0x0d || buf[p] === 0x09)) p++;
|
|
133
|
+
return buf.toString("latin1", s, p);
|
|
134
|
+
};
|
|
135
|
+
if (tok() !== "P5") continue;
|
|
136
|
+
const w = +tok(), h = +tok(); tok(); p++;
|
|
137
|
+
const data = buf.subarray(p, p + w * h);
|
|
138
|
+
let lastInk = -1, firstInk = -1;
|
|
139
|
+
for (let y = 0; y < h && firstInk < 0; y++)
|
|
140
|
+
for (let x = 0; x < w; x++) if (data[y * w + x] < tailInkTh) { firstInk = y; break; }
|
|
141
|
+
for (let y = h - 1; y >= 0; y--) {
|
|
142
|
+
let ink = false;
|
|
143
|
+
for (let x = 0; x < w; x++) if (data[y * w + x] < tailInkTh) { ink = true; break; }
|
|
144
|
+
if (ink) { lastInk = y; break; }
|
|
145
|
+
}
|
|
146
|
+
out.push({ page: +f.match(/(\d+)\.pgm$/)[1], tailBlankPct: +(((h - 1 - lastInk) / h) * 100).toFixed(1), headBlankPct: firstInk < 0 ? 100 : +((firstInk / h) * 100).toFixed(1) });
|
|
147
|
+
}
|
|
148
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
149
|
+
return out;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// ---- Chrome 可见性守卫(P16:PID 定向,禁进程名全量) ----
|
|
153
|
+
export function chromeGuard() {
|
|
154
|
+
try {
|
|
155
|
+
const pid = execFileSync("zsh", ["-c", "lsof -nP -iTCP:9226 -sTCP:LISTEN | awk 'NR>1{print $2}' | sort -u | head -1"])
|
|
156
|
+
.toString().trim();
|
|
157
|
+
if (!pid || !/^\d+$/.test(pid)) return { ok: false, err: "no-pid" };
|
|
158
|
+
const vis = execFileSync("osascript", ["-e",
|
|
159
|
+
`tell application "System Events" to get visible of (first process whose unix id is ${pid})`]).toString().trim();
|
|
160
|
+
if (vis === "true") {
|
|
161
|
+
execFileSync("osascript", ["-e",
|
|
162
|
+
`tell application "System Events" to set visible of (first process whose unix id is ${pid}) to false`]);
|
|
163
|
+
return { ok: true, pid, was: "visible", action: "rehidden" };
|
|
164
|
+
}
|
|
165
|
+
return { ok: true, pid, was: "hidden", action: "none" };
|
|
166
|
+
} catch (e) {
|
|
167
|
+
return { ok: false, err: String(e).slice(0, 120) };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"outcome": "worked",
|
|
3
|
+
"data": {
|
|
4
|
+
"url": "https://www.dedao.cn/course/article?id=6EBOqDNZ27YlVdg8oKm4bQ1odMAkgz",
|
|
5
|
+
"action": "navigate",
|
|
6
|
+
"state_id": "dd7fea5c-e412-46bb-a9e6-c26ef6f0cfcb",
|
|
7
|
+
"content_path": "/Users/wangdong/.cache/lasso/de9b1e35-8cdf-4555-9a8b-61b15c6dba5e/browse_logged_in-dd7fea5c-e412-46bb-a9e6-c26ef6f0cfcb.json",
|
|
8
|
+
"preview": "navigated",
|
|
9
|
+
"final_url": "https://www.dedao.cn/course/article?id=6EBOqDNZ27YlVdg8oKm4bQ1odMAkgz."
|
|
10
|
+
},
|
|
11
|
+
"served_by": "browse_logged_in",
|
|
12
|
+
"fallback_used": false,
|
|
13
|
+
"retrieval_method": "chrome_devtools_mcp"
|
|
14
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"chapterDir": "课前必读(1讲)",
|
|
4
|
+
"title": "发刊词丨只给你地道的经济学思维",
|
|
5
|
+
"expectAudio": false,
|
|
6
|
+
"phases": {
|
|
7
|
+
"switch": {
|
|
8
|
+
"mode": "already",
|
|
9
|
+
"title": "发刊词丨只给你地道的经济学思维",
|
|
10
|
+
"url": "https://www.dedao.cn/course/article?id=6EBOqDNZ27YlVdg8oKm4bQ1odMAkgz"
|
|
11
|
+
},
|
|
12
|
+
"stabilize": {
|
|
13
|
+
"ok": true,
|
|
14
|
+
"bodyLen": 1696,
|
|
15
|
+
"imgs": 6,
|
|
16
|
+
"imgsNotLoaded": 0,
|
|
17
|
+
"docH": 27664
|
|
18
|
+
},
|
|
19
|
+
"assert": {
|
|
20
|
+
"url": "https://www.dedao.cn/course/article?id=6EBOqDNZ27YlVdg8oKm4bQ1odMAkgz",
|
|
21
|
+
"title": "发刊词丨只给你地道的经济学思维",
|
|
22
|
+
"hasWrap": true,
|
|
23
|
+
"cover": true,
|
|
24
|
+
"ddAudio": 0,
|
|
25
|
+
"audioTags": 0,
|
|
26
|
+
"timeInfo": true,
|
|
27
|
+
"wrapChildren": [
|
|
28
|
+
"DIV.pageControl",
|
|
29
|
+
"DIV.",
|
|
30
|
+
"DIV.article-body",
|
|
31
|
+
"DIV.article-time-info",
|
|
32
|
+
"DIV.my-comment",
|
|
33
|
+
"DIV.message-v2"
|
|
34
|
+
],
|
|
35
|
+
"bodyLen": 1696
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"assertFails": [],
|
|
39
|
+
"fatal": "chain_failed:unknown:Error: upstream_pdf_error:is_error:MCP error -32602: Tool pdf not found"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"chapterDir": "01-经济学本源之一:东西不够(110讲)",
|
|
43
|
+
"title": "第001讲丨战俘营里的经济组织",
|
|
44
|
+
"expectAudio": true,
|
|
45
|
+
"phases": {
|
|
46
|
+
"switch": {
|
|
47
|
+
"mode": "clicked",
|
|
48
|
+
"title": "第001讲丨战俘营里的经济组织",
|
|
49
|
+
"url": "https://www.dedao.cn/course/article?id=ml9WNdP1QvaeKYG0PJAzx82Dyog0BZ"
|
|
50
|
+
},
|
|
51
|
+
"stabilize": {
|
|
52
|
+
"ok": true,
|
|
53
|
+
"bodyLen": 3742,
|
|
54
|
+
"imgs": 5,
|
|
55
|
+
"imgsNotLoaded": 0,
|
|
56
|
+
"docH": 13752
|
|
57
|
+
},
|
|
58
|
+
"assert": {
|
|
59
|
+
"url": "https://www.dedao.cn/course/article?id=ml9WNdP1QvaeKYG0PJAzx82Dyog0BZ",
|
|
60
|
+
"title": "第001讲丨战俘营里的经济组织",
|
|
61
|
+
"hasWrap": true,
|
|
62
|
+
"cover": true,
|
|
63
|
+
"ddAudio": 1,
|
|
64
|
+
"audioTags": 0,
|
|
65
|
+
"timeInfo": true,
|
|
66
|
+
"wrapChildren": [
|
|
67
|
+
"DIV.pageControl",
|
|
68
|
+
"DIV.",
|
|
69
|
+
"DIV.article-body",
|
|
70
|
+
"DIV.article-time-info",
|
|
71
|
+
"DIV.my-comment",
|
|
72
|
+
"DIV.message-v2"
|
|
73
|
+
],
|
|
74
|
+
"bodyLen": 3742
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"assertFails": [],
|
|
78
|
+
"fatal": "chain_failed:unknown:Error: upstream_pdf_error:is_error:MCP error -32602: Tool pdf not found"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"chapterDir": "01-经济学本源之一:东西不够(110讲)",
|
|
82
|
+
"title": "第002讲丨马粪争夺案",
|
|
83
|
+
"expectAudio": true,
|
|
84
|
+
"phases": {
|
|
85
|
+
"switch": {
|
|
86
|
+
"mode": "clicked",
|
|
87
|
+
"title": "第002讲丨马粪争夺案",
|
|
88
|
+
"url": "https://www.dedao.cn/course/article?id=Ay7GQpR6ndOgX60ReV8eBvPzMN4lwE"
|
|
89
|
+
},
|
|
90
|
+
"stabilize": {
|
|
91
|
+
"ok": true,
|
|
92
|
+
"bodyLen": 2133,
|
|
93
|
+
"imgs": 3,
|
|
94
|
+
"imgsNotLoaded": 0,
|
|
95
|
+
"docH": 10861
|
|
96
|
+
},
|
|
97
|
+
"assert": {
|
|
98
|
+
"url": "https://www.dedao.cn/course/article?id=Ay7GQpR6ndOgX60ReV8eBvPzMN4lwE",
|
|
99
|
+
"title": "第002讲丨马粪争夺案",
|
|
100
|
+
"hasWrap": true,
|
|
101
|
+
"cover": true,
|
|
102
|
+
"ddAudio": 1,
|
|
103
|
+
"audioTags": 0,
|
|
104
|
+
"timeInfo": true,
|
|
105
|
+
"wrapChildren": [
|
|
106
|
+
"DIV.pageControl",
|
|
107
|
+
"DIV.",
|
|
108
|
+
"DIV.article-body",
|
|
109
|
+
"DIV.article-time-info",
|
|
110
|
+
"DIV.my-comment",
|
|
111
|
+
"DIV.message-v2"
|
|
112
|
+
],
|
|
113
|
+
"bodyLen": 2133
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
"assertFails": [],
|
|
117
|
+
"fatal": "chain_failed:unknown:Error: upstream_pdf_error:is_error:MCP error -32602: Tool pdf not found"
|
|
118
|
+
}
|
|
119
|
+
]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
[
|
|
2
|
+
"[ready] {\"rs\":\"complete\",\"title\":\"发刊词丨只给你地道的经济学思维\",\"len\":3127}",
|
|
3
|
+
"\n===== [1/3] 发刊词丨只给你地道的经济学思维 =====",
|
|
4
|
+
"[switch] {\"mode\":\"already\",\"title\":\"发刊词丨只给你地道的经济学思维\",\"url\":\"https://www.dedao.cn/course/article?id=6EBOqDNZ27YlVdg8oKm4bQ1odMAkgz\"}",
|
|
5
|
+
"[stabilize] {\"ok\":true,\"bodyLen\":1696,\"imgs\":6,\"imgsNotLoaded\":0,\"docH\":27664}",
|
|
6
|
+
"[assert] {\"url\":\"https://www.dedao.cn/course/article?id=6EBOqDNZ27YlVdg8oKm4bQ1odMAkgz\",\"title\":\"发刊词丨只给你地道的经济学思维\",\"hasWrap\":true,\"cover\":true,\"ddAudio\":0,\"audioTags\":0,\"timeInfo\":true,\"wrapChildren\":[\"DIV.pageControl\",\"DIV.\",\"DIV.article-body\",\"DIV.article-time-info\",\"DIV.my-comment\",\"DIV.message-v2\"],\"bodyLen\":1696}",
|
|
7
|
+
"[FATAL] chain_failed:unknown:Error: upstream_pdf_error:is_error:MCP error -32602: Tool pdf not found",
|
|
8
|
+
"\n===== [2/3] 第001讲丨战俘营里的经济组织 =====",
|
|
9
|
+
"[switch] {\"mode\":\"clicked\",\"title\":\"第001讲丨战俘营里的经济组织\",\"url\":\"https://www.dedao.cn/course/article?id=ml9WNdP1QvaeKYG0PJAzx82Dyog0BZ\"}",
|
|
10
|
+
"[stabilize] {\"ok\":true,\"bodyLen\":3742,\"imgs\":5,\"imgsNotLoaded\":0,\"docH\":13752}",
|
|
11
|
+
"[assert] {\"url\":\"https://www.dedao.cn/course/article?id=ml9WNdP1QvaeKYG0PJAzx82Dyog0BZ\",\"title\":\"第001讲丨战俘营里的经济组织\",\"hasWrap\":true,\"cover\":true,\"ddAudio\":1,\"audioTags\":0,\"timeInfo\":true,\"wrapChildren\":[\"DIV.pageControl\",\"DIV.\",\"DIV.article-body\",\"DIV.article-time-info\",\"DIV.my-comment\",\"DIV.message-v2\"],\"bodyLen\":3742}",
|
|
12
|
+
"[FATAL] chain_failed:unknown:Error: upstream_pdf_error:is_error:MCP error -32602: Tool pdf not found",
|
|
13
|
+
"\n===== [3/3] 第002讲丨马粪争夺案 =====",
|
|
14
|
+
"[switch] {\"mode\":\"clicked\",\"title\":\"第002讲丨马粪争夺案\",\"url\":\"https://www.dedao.cn/course/article?id=Ay7GQpR6ndOgX60ReV8eBvPzMN4lwE\"}",
|
|
15
|
+
"[stabilize] {\"ok\":true,\"bodyLen\":2133,\"imgs\":3,\"imgsNotLoaded\":0,\"docH\":10861}",
|
|
16
|
+
"[assert] {\"url\":\"https://www.dedao.cn/course/article?id=Ay7GQpR6ndOgX60ReV8eBvPzMN4lwE\",\"title\":\"第002讲丨马粪争夺案\",\"hasWrap\":true,\"cover\":true,\"ddAudio\":1,\"audioTags\":0,\"timeInfo\":true,\"wrapChildren\":[\"DIV.pageControl\",\"DIV.\",\"DIV.article-body\",\"DIV.article-time-info\",\"DIV.my-comment\",\"DIV.message-v2\"],\"bodyLen\":2133}",
|
|
17
|
+
"[FATAL] chain_failed:unknown:Error: upstream_pdf_error:is_error:MCP error -32602: Tool pdf not found"
|
|
18
|
+
]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"url": "https://www.dedao.cn/course/article?id=6EBOqDNZ27YlVdg8oKm4bQ1odMAkgz",
|
|
3
|
+
"title": "发刊词丨只给你地道的经济学思维",
|
|
4
|
+
"hasWrap": true,
|
|
5
|
+
"cover": true,
|
|
6
|
+
"ddAudio": 0,
|
|
7
|
+
"audioTags": 0,
|
|
8
|
+
"timeInfo": true,
|
|
9
|
+
"wrapChildren": [
|
|
10
|
+
"DIV.pageControl",
|
|
11
|
+
"DIV.",
|
|
12
|
+
"DIV.article-body",
|
|
13
|
+
"DIV.article-time-info",
|
|
14
|
+
"DIV.my-comment",
|
|
15
|
+
"DIV.message-v2"
|
|
16
|
+
],
|
|
17
|
+
"bodyLen": 1696
|
|
18
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"outcome": "unknown",
|
|
3
|
+
"error": "Error: upstream_pdf_error:is_error:MCP error -32602: Tool pdf not found",
|
|
4
|
+
"stopped_at": {
|
|
5
|
+
"step_index": 1,
|
|
6
|
+
"reason": "step_error",
|
|
7
|
+
"failed_action": "pdf",
|
|
8
|
+
"detail": "outcome=unknown: Error: upstream_pdf_error:is_error:MCP error -32602: Tool pdf not found"
|
|
9
|
+
},
|
|
10
|
+
"bounded": null,
|
|
11
|
+
"has_chain_inline": true,
|
|
12
|
+
"preview_head": "{\"actions_and_results\":[{\"step\":{\"action\":\"evaluate\",\"js\":\"return (()=>{\\n const q=(s,r)=>(r||document).querySelector(s);\\n const qa=(s,r)=>[...(r||document).querySelectorAll(s)];\\n const rep={ok:t"
|
|
13
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"url": "https://www.dedao.cn/course/article?id=ml9WNdP1QvaeKYG0PJAzx82Dyog0BZ",
|
|
3
|
+
"title": "第001讲丨战俘营里的经济组织",
|
|
4
|
+
"hasWrap": true,
|
|
5
|
+
"cover": true,
|
|
6
|
+
"ddAudio": 1,
|
|
7
|
+
"audioTags": 0,
|
|
8
|
+
"timeInfo": true,
|
|
9
|
+
"wrapChildren": [
|
|
10
|
+
"DIV.pageControl",
|
|
11
|
+
"DIV.",
|
|
12
|
+
"DIV.article-body",
|
|
13
|
+
"DIV.article-time-info",
|
|
14
|
+
"DIV.my-comment",
|
|
15
|
+
"DIV.message-v2"
|
|
16
|
+
],
|
|
17
|
+
"bodyLen": 3742
|
|
18
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"outcome": "unknown",
|
|
3
|
+
"error": "Error: upstream_pdf_error:is_error:MCP error -32602: Tool pdf not found",
|
|
4
|
+
"stopped_at": {
|
|
5
|
+
"step_index": 1,
|
|
6
|
+
"reason": "step_error",
|
|
7
|
+
"failed_action": "pdf",
|
|
8
|
+
"detail": "outcome=unknown: Error: upstream_pdf_error:is_error:MCP error -32602: Tool pdf not found"
|
|
9
|
+
},
|
|
10
|
+
"bounded": null,
|
|
11
|
+
"has_chain_inline": true,
|
|
12
|
+
"preview_head": "{\"actions_and_results\":[{\"step\":{\"action\":\"evaluate\",\"js\":\"return (()=>{\\n const q=(s,r)=>(r||document).querySelector(s);\\n const qa=(s,r)=>[...(r||document).querySelectorAll(s)];\\n const rep={ok:t"
|
|
13
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"url": "https://www.dedao.cn/course/article?id=Ay7GQpR6ndOgX60ReV8eBvPzMN4lwE",
|
|
3
|
+
"title": "第002讲丨马粪争夺案",
|
|
4
|
+
"hasWrap": true,
|
|
5
|
+
"cover": true,
|
|
6
|
+
"ddAudio": 1,
|
|
7
|
+
"audioTags": 0,
|
|
8
|
+
"timeInfo": true,
|
|
9
|
+
"wrapChildren": [
|
|
10
|
+
"DIV.pageControl",
|
|
11
|
+
"DIV.",
|
|
12
|
+
"DIV.article-body",
|
|
13
|
+
"DIV.article-time-info",
|
|
14
|
+
"DIV.my-comment",
|
|
15
|
+
"DIV.message-v2"
|
|
16
|
+
],
|
|
17
|
+
"bodyLen": 2133
|
|
18
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"outcome": "unknown",
|
|
3
|
+
"error": "Error: upstream_pdf_error:is_error:MCP error -32602: Tool pdf not found",
|
|
4
|
+
"stopped_at": {
|
|
5
|
+
"step_index": 1,
|
|
6
|
+
"reason": "step_error",
|
|
7
|
+
"failed_action": "pdf",
|
|
8
|
+
"detail": "outcome=unknown: Error: upstream_pdf_error:is_error:MCP error -32602: Tool pdf not found"
|
|
9
|
+
},
|
|
10
|
+
"bounded": null,
|
|
11
|
+
"has_chain_inline": true,
|
|
12
|
+
"preview_head": "{\"actions_and_results\":[{\"step\":{\"action\":\"evaluate\",\"js\":\"return (()=>{\\n const q=(s,r)=>(r||document).querySelector(s);\\n const qa=(s,r)=>[...(r||document).querySelectorAll(s)];\\n const rep={ok:t"
|
|
13
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"outcome": "worked",
|
|
3
|
+
"data": {
|
|
4
|
+
"url": "https://www.dedao.cn/course/article?id=6EBOqDNZ27YlVdg8oKm4bQ1odMAkgz",
|
|
5
|
+
"action": "navigate",
|
|
6
|
+
"state_id": "6d52b621-ef37-4b25-9435-a7bb3b792dbe",
|
|
7
|
+
"content_path": "/Users/wangdong/.cache/lasso/98305202-a8c9-4e97-93ec-60ed94e57f3a/browse_logged_in-6d52b621-ef37-4b25-9435-a7bb3b792dbe.json",
|
|
8
|
+
"preview": "navigated",
|
|
9
|
+
"final_url": "https://www.dedao.cn/course/article?id=6EBOqDNZ27YlVdg8oKm4bQ1odMAkgz."
|
|
10
|
+
},
|
|
11
|
+
"served_by": "browse_logged_in",
|
|
12
|
+
"fallback_used": false,
|
|
13
|
+
"retrieval_method": "chrome_devtools_mcp"
|
|
14
|
+
}
|