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.
Files changed (483) hide show
  1. package/.dedao-extract/.qc-v3/fk-14.png +0 -0
  2. package/.dedao-extract/.qc-v3/fkp2-02.png +0 -0
  3. package/.dedao-extract/.qc-v3/l001-6.png +0 -0
  4. package/.dedao-extract/.qc-v3/l001-7.png +0 -0
  5. package/.dedao-extract/.qc-v3/l002-4.png +0 -0
  6. package/.dedao-extract/analyze.mjs +169 -0
  7. package/.dedao-extract/b1-01-navigate.json +14 -0
  8. package/.dedao-extract/b1-02-ready.json +5 -0
  9. package/.dedao-extract/b1-98-results.json +119 -0
  10. package/.dedao-extract/b1-99-log.json +18 -0
  11. package/.dedao-extract/b1-a1-assert.json +18 -0
  12. package/.dedao-extract/b1-a1-chain.json +13 -0
  13. package/.dedao-extract/b1-a1-stabilize.json +7 -0
  14. package/.dedao-extract/b1-a1-switch.json +5 -0
  15. package/.dedao-extract/b1-a2-assert.json +18 -0
  16. package/.dedao-extract/b1-a2-chain.json +13 -0
  17. package/.dedao-extract/b1-a2-stabilize.json +7 -0
  18. package/.dedao-extract/b1-a2-switch.json +5 -0
  19. package/.dedao-extract/b1-a3-assert.json +18 -0
  20. package/.dedao-extract/b1-a3-chain.json +13 -0
  21. package/.dedao-extract/b1-a3-stabilize.json +7 -0
  22. package/.dedao-extract/b1-a3-switch.json +5 -0
  23. package/.dedao-extract/b2-01-navigate.json +14 -0
  24. package/.dedao-extract/b2-02-ready.json +5 -0
  25. package/.dedao-extract/b2-98-results.json +242 -0
  26. package/.dedao-extract/b2-99-log.json +21 -0
  27. package/.dedao-extract/b2-a1-assert.json +18 -0
  28. package/.dedao-extract/b2-a1-cleanup.json +35 -0
  29. package/.dedao-extract/b2-a1-print.json +5 -0
  30. package/.dedao-extract/b2-a1-stabilize.json +7 -0
  31. package/.dedao-extract/b2-a1-switch.json +5 -0
  32. package/.dedao-extract/b2-a2-assert.json +18 -0
  33. package/.dedao-extract/b2-a2-cleanup.json +35 -0
  34. package/.dedao-extract/b2-a2-print.json +5 -0
  35. package/.dedao-extract/b2-a2-stabilize.json +7 -0
  36. package/.dedao-extract/b2-a2-switch.json +5 -0
  37. package/.dedao-extract/b2-a3-assert.json +18 -0
  38. package/.dedao-extract/b2-a3-cleanup.json +35 -0
  39. package/.dedao-extract/b2-a3-print.json +5 -0
  40. package/.dedao-extract/b2-a3-stabilize.json +7 -0
  41. package/.dedao-extract/b2-a3-switch.json +5 -0
  42. package/.dedao-extract/b3-01-navigate.json +14 -0
  43. package/.dedao-extract/b3-02-ready.json +5 -0
  44. package/.dedao-extract/b3-98-results.json +281 -0
  45. package/.dedao-extract/b3-99-log.json +21 -0
  46. package/.dedao-extract/b3-a1-assert.json +18 -0
  47. package/.dedao-extract/b3-a1-cleanup.json +48 -0
  48. package/.dedao-extract/b3-a1-print.json +5 -0
  49. package/.dedao-extract/b3-a1-stabilize.json +7 -0
  50. package/.dedao-extract/b3-a1-switch.json +5 -0
  51. package/.dedao-extract/b3-a2-assert.json +18 -0
  52. package/.dedao-extract/b3-a2-cleanup.json +48 -0
  53. package/.dedao-extract/b3-a2-print.json +5 -0
  54. package/.dedao-extract/b3-a2-stabilize.json +7 -0
  55. package/.dedao-extract/b3-a2-switch.json +5 -0
  56. package/.dedao-extract/b3-a3-assert.json +18 -0
  57. package/.dedao-extract/b3-a3-cleanup.json +48 -0
  58. package/.dedao-extract/b3-a3-print.json +5 -0
  59. package/.dedao-extract/b3-a3-stabilize.json +7 -0
  60. package/.dedao-extract/b3-a3-switch.json +5 -0
  61. package/.dedao-extract/b4-diag.json +105 -0
  62. package/.dedao-extract/dbg-fixscreen.mjs +43 -0
  63. package/.dedao-extract/dbg-text.mjs +25 -0
  64. package/.dedao-extract/dbg-text2.mjs +20 -0
  65. package/.dedao-extract/dbg-text3.mjs +18 -0
  66. package/.dedao-extract/dbg-text4.mjs +27 -0
  67. package/.dedao-extract/dbg-text5.mjs +31 -0
  68. package/.dedao-extract/diag-tail.mjs +90 -0
  69. package/.dedao-extract/extract-batch1.mjs +377 -0
  70. package/.dedao-extract/extract-batch2.mjs +371 -0
  71. package/.dedao-extract/extract-batch3.mjs +392 -0
  72. package/.dedao-extract/extract-v2.mjs +539 -0
  73. package/.dedao-extract/extract-v3.mjs +745 -0
  74. package/.dedao-extract/gapfill.mjs +154 -0
  75. package/.dedao-extract/probe-frag.mjs +125 -0
  76. package/.dedao-extract/prod-chapters-dry.json +2516 -0
  77. package/.dedao-extract/prod-enumeration.json +1682 -0
  78. package/.dedao-extract/produce-all.mjs +555 -0
  79. package/.dedao-extract/qc-final.mjs +65 -0
  80. package/.dedao-extract/qc-v3.mjs +91 -0
  81. package/.dedao-extract/r2-01-navigate.json +14 -0
  82. package/.dedao-extract/r2-98-results.json +697 -0
  83. package/.dedao-extract/r2-99-log.json +15 -0
  84. package/.dedao-extract/r2-analyze.mjs +96 -0
  85. package/.dedao-extract/r2-fk-dump.json +139 -0
  86. package/.dedao-extract/r2-fk-figattr.json +62 -0
  87. package/.dedao-extract/r2-fk-pagemap.json +64 -0
  88. package/.dedao-extract/r2-l001-dump.json +129 -0
  89. package/.dedao-extract/r2-l001-figattr.json +53 -0
  90. package/.dedao-extract/r2-l001-pagemap.json +55 -0
  91. package/.dedao-extract/r2-l002-dump.json +109 -0
  92. package/.dedao-extract/r2-l002-figattr.json +35 -0
  93. package/.dedao-extract/r2-l002-pagemap.json +37 -0
  94. package/.dedao-extract/s8-01-navigate.json +14 -0
  95. package/.dedao-extract/s8-98-results.json +43 -0
  96. package/.dedao-extract/s8-99-log.json +24 -0
  97. package/.dedao-extract/s8-fk-fix.json +15 -0
  98. package/.dedao-extract/s8-fk-pagemap-post.json +58 -0
  99. package/.dedao-extract/s8-fk-pagemap-pre.json +68 -0
  100. package/.dedao-extract/s8-fk-promo.json +11 -0
  101. package/.dedao-extract/s8-ink.mjs +49 -0
  102. package/.dedao-extract/s8-l003-fix.json +21 -0
  103. package/.dedao-extract/s8-l003-pagemap-post.json +38 -0
  104. package/.dedao-extract/s8-l003-pagemap-pre.json +48 -0
  105. package/.dedao-extract/s8-l003-promo.json +11 -0
  106. package/.dedao-extract/s9-sikao.json +394 -0
  107. package/.dedao-extract/scout7-round2.mjs +386 -0
  108. package/.dedao-extract/scout7b.mjs +121 -0
  109. package/.dedao-extract/scout7c.mjs +99 -0
  110. package/.dedao-extract/scout8.mjs +334 -0
  111. package/.dedao-extract/scout9.mjs +121 -0
  112. package/.dedao-extract/scratch/fk-01.pgm +75 -0
  113. package/.dedao-extract/scratch/fk-02.pgm +4 -0
  114. package/.dedao-extract/scratch/fk-03.pgm +207 -0
  115. package/.dedao-extract/scratch/fk-04.pgm +986 -0
  116. package/.dedao-extract/scratch/fk-05.pgm +4 -0
  117. package/.dedao-extract/scratch/fk-06.pgm +4 -0
  118. package/.dedao-extract/scratch/fk-07.pgm +4 -0
  119. package/.dedao-extract/scratch/fk-08.pgm +4 -0
  120. package/.dedao-extract/scratch/fk-09.pgm +4 -0
  121. package/.dedao-extract/scratch/fk-10.pgm +4 -0
  122. package/.dedao-extract/scratch/fk-11.pgm +4 -0
  123. package/.dedao-extract/scratch/fk-12.pgm +4 -0
  124. package/.dedao-extract/scratch/fk-13.pgm +4 -0
  125. package/.dedao-extract/scratch/fk-14.pgm +107 -0
  126. package/.dedao-extract/scratch/fk-analysis.json +47 -0
  127. package/.dedao-extract/scratch/fk-before.pdf +0 -0
  128. package/.dedao-extract/scratch/fk-clean-inner.txt +42 -0
  129. package/.dedao-extract/scratch/fk-dom-inner.txt +381 -0
  130. package/.dedao-extract/scratch/fk-fix-inner.txt +42 -0
  131. package/.dedao-extract/scratch/fk-pdftotext.txt +66 -0
  132. package/.dedao-extract/scratch/fk-r3-base.pdf +0 -0
  133. package/.dedao-extract/scratch/fk-r3-base.txt +66 -0
  134. package/.dedao-extract/scratch/fk-r3-fix.pdf +0 -0
  135. package/.dedao-extract/scratch/fk-r3-fix.txt +66 -0
  136. package/.dedao-extract/scratch/fk-r3-s09.pdf +0 -0
  137. package/.dedao-extract/scratch/l001-1.pgm +6 -0
  138. package/.dedao-extract/scratch/l001-2.pgm +38 -0
  139. package/.dedao-extract/scratch/l001-3.pgm +38 -0
  140. package/.dedao-extract/scratch/l001-4.pgm +4 -0
  141. package/.dedao-extract/scratch/l001-5.pgm +179 -0
  142. package/.dedao-extract/scratch/l001-6.pgm +43 -1
  143. package/.dedao-extract/scratch/l001-7.pgm +4 -0
  144. package/.dedao-extract/scratch/l001-8.pgm +107 -0
  145. package/.dedao-extract/scratch/l001-analysis.json +23 -0
  146. package/.dedao-extract/scratch/l001-before.pdf +0 -0
  147. package/.dedao-extract/scratch/l001-dom-inner.txt +444 -0
  148. package/.dedao-extract/scratch/l001-pdftotext.txt +146 -0
  149. package/.dedao-extract/scratch/l002-1.pgm +6 -0
  150. package/.dedao-extract/scratch/l002-2.pgm +4 -0
  151. package/.dedao-extract/scratch/l002-3.pgm +4 -0
  152. package/.dedao-extract/scratch/l002-4.pgm +4 -0
  153. package/.dedao-extract/scratch/l002-5.pgm +106 -0
  154. package/.dedao-extract/scratch/l002-analysis.json +17 -0
  155. package/.dedao-extract/scratch/l002-before.pdf +0 -0
  156. package/.dedao-extract/scratch/l002-dom-inner.txt +392 -0
  157. package/.dedao-extract/scratch/l002-pdftotext.txt +82 -0
  158. package/.dedao-extract/scratch/l003-clean-inner.txt +74 -0
  159. package/.dedao-extract/scratch/l003-fix-inner.txt +74 -0
  160. package/.dedao-extract/scratch/l003-r3-base.pdf +0 -0
  161. package/.dedao-extract/scratch/l003-r3-base.txt +109 -0
  162. package/.dedao-extract/scratch/l003-r3-fix.pdf +0 -0
  163. package/.dedao-extract/scratch/l003-r3-fix.txt +108 -0
  164. package/.dedao-extract/scratch/pp-fk-r3-base-01.pgm +32 -0
  165. package/.dedao-extract/scratch/pp-fk-r3-base-02.pgm +4 -0
  166. package/.dedao-extract/scratch/pp-fk-r3-base-03.pgm +119 -0
  167. package/.dedao-extract/scratch/pp-fk-r3-base-04.pgm +496 -0
  168. package/.dedao-extract/scratch/pp-fk-r3-base-05.pgm +4 -0
  169. package/.dedao-extract/scratch/pp-fk-r3-base-06.pgm +4 -0
  170. package/.dedao-extract/scratch/pp-fk-r3-base-07.pgm +4 -0
  171. package/.dedao-extract/scratch/pp-fk-r3-base-08.pgm +4 -0
  172. package/.dedao-extract/scratch/pp-fk-r3-base-09.pgm +4 -0
  173. package/.dedao-extract/scratch/pp-fk-r3-base-10.pgm +4 -0
  174. package/.dedao-extract/scratch/pp-fk-r3-base-11.pgm +4 -0
  175. package/.dedao-extract/scratch/pp-fk-r3-base-12.pgm +4 -0
  176. package/.dedao-extract/scratch/pp-fk-r3-base-13.pgm +4 -0
  177. package/.dedao-extract/scratch/pp-fk-r3-base-14.pgm +58 -0
  178. package/.dedao-extract/scratch/pp-fk-r3-fix-01.pgm +32 -0
  179. package/.dedao-extract/scratch/pp-fk-r3-fix-02.pgm +4 -0
  180. package/.dedao-extract/scratch/pp-fk-r3-fix-03.pgm +119 -0
  181. package/.dedao-extract/scratch/pp-fk-r3-fix-04.pgm +496 -0
  182. package/.dedao-extract/scratch/pp-fk-r3-fix-05.pgm +4 -0
  183. package/.dedao-extract/scratch/pp-fk-r3-fix-06.pgm +4 -0
  184. package/.dedao-extract/scratch/pp-fk-r3-fix-07.pgm +4 -0
  185. package/.dedao-extract/scratch/pp-fk-r3-fix-08.pgm +4 -0
  186. package/.dedao-extract/scratch/pp-fk-r3-fix-09.pgm +4 -0
  187. package/.dedao-extract/scratch/pp-fk-r3-fix-10.pgm +4 -0
  188. package/.dedao-extract/scratch/pp-fk-r3-fix-11.pgm +4 -0
  189. package/.dedao-extract/scratch/pp-fk-r3-fix-12.pgm +4 -0
  190. package/.dedao-extract/scratch/pp-fk-r3-fix-13.pgm +4 -0
  191. package/.dedao-extract/scratch/pp-fk-r3-fix-14.pgm +4 -0
  192. package/.dedao-extract/scratch/pp-fk-r3-s09-01.pgm +15 -0
  193. package/.dedao-extract/scratch/pp-fk-r3-s09-02.pgm +4 -0
  194. package/.dedao-extract/scratch/pp-fk-r3-s09-03.pgm +27 -0
  195. package/.dedao-extract/scratch/pp-fk-r3-s09-04.pgm +128 -0
  196. package/.dedao-extract/scratch/pp-fk-r3-s09-05.pgm +4 -0
  197. package/.dedao-extract/scratch/pp-fk-r3-s09-06.pgm +4 -0
  198. package/.dedao-extract/scratch/pp-fk-r3-s09-07.pgm +4 -0
  199. package/.dedao-extract/scratch/pp-fk-r3-s09-08.pgm +4 -0
  200. package/.dedao-extract/scratch/pp-fk-r3-s09-09.pgm +4 -0
  201. package/.dedao-extract/scratch/pp-fk-r3-s09-10.pgm +4 -0
  202. package/.dedao-extract/scratch/pp-fk-r3-s09-11.pgm +4 -0
  203. package/.dedao-extract/scratch/pp-fk-r3-s09-12.pgm +18 -0
  204. package/.dedao-extract/scratch/pp-l003-r3-base-1.pgm +7 -0
  205. package/.dedao-extract/scratch/pp-l003-r3-base-2.pgm +114 -0
  206. package/.dedao-extract/scratch/pp-l003-r3-base-3.pgm +4 -0
  207. package/.dedao-extract/scratch/pp-l003-r3-base-4.pgm +30 -0
  208. package/.dedao-extract/scratch/pp-l003-r3-base-5.pgm +4 -0
  209. package/.dedao-extract/scratch/pp-l003-r3-base-6.pgm +64 -0
  210. package/.dedao-extract/scratch/pp-l003-r3-fix-1.pgm +7 -0
  211. package/.dedao-extract/scratch/pp-l003-r3-fix-2.pgm +114 -0
  212. package/.dedao-extract/scratch/pp-l003-r3-fix-3.pgm +4 -0
  213. package/.dedao-extract/scratch/pp-l003-r3-fix-4.pgm +31 -0
  214. package/.dedao-extract/scratch/pp-l003-r3-fix-5.pgm +4 -0
  215. package/.dedao-extract/scratch/promo-fk-datauri.txt +1 -0
  216. package/.dedao-extract/scratch/promo-fk.jpg +0 -0
  217. package/.dedao-extract/scratch/promo-l001.jpg +0 -0
  218. package/.dedao-extract/scratch/promo-l002.jpg +0 -0
  219. package/.dedao-extract/scratch/s8-ink-report.json +447 -0
  220. package/.dedao-extract/scratch/v2-fk-clean-inner.txt +42 -0
  221. package/.dedao-extract/scratch/v2-fk-it1.pdf +0 -0
  222. package/.dedao-extract/scratch/v2-fk-it2.pdf +0 -0
  223. package/.dedao-extract/scratch/v2-fk-it3.pdf +0 -0
  224. package/.dedao-extract/scratch/v2-l001-clean-inner.txt +99 -0
  225. package/.dedao-extract/scratch/v2-l001-it1.pdf +0 -0
  226. package/.dedao-extract/scratch/v2-l001-it2.pdf +0 -0
  227. package/.dedao-extract/scratch/v2-l002-clean-inner.txt +53 -0
  228. package/.dedao-extract/scratch/v2-l002-it1.pdf +0 -0
  229. package/.dedao-extract/scratch/v2-l002-it2.pdf +0 -0
  230. package/.dedao-extract/scratch/v3-fk-clean-inner.txt +42 -0
  231. package/.dedao-extract/scratch/v3-fk-it1.pdf +0 -0
  232. package/.dedao-extract/scratch/v3-fk-it2.pdf +0 -0
  233. package/.dedao-extract/scratch/v3-fk-it3.pdf +0 -0
  234. package/.dedao-extract/scratch/v3-l001-clean-inner.txt +93 -0
  235. package/.dedao-extract/scratch/v3-l001-it1.pdf +0 -0
  236. package/.dedao-extract/scratch/v3-l001-it2.pdf +0 -0
  237. package/.dedao-extract/scratch/v3-l002-clean-inner.txt +49 -0
  238. package/.dedao-extract/scratch/v3-l002-it1.pdf +0 -0
  239. package/.dedao-extract/scratch/v3-l002-it2.pdf +0 -0
  240. package/.dedao-extract/v2-01-navigate.json +14 -0
  241. package/.dedao-extract/v2-98-results.json +128 -0
  242. package/.dedao-extract/v2-99-log.json +20 -0
  243. package/.dedao-extract/v2-fk-figs-it1.json +76 -0
  244. package/.dedao-extract/v2-fk-figs-it2.json +76 -0
  245. package/.dedao-extract/v2-fk-fix-screen.json +20 -0
  246. package/.dedao-extract/v2-fk-meta.json +145 -0
  247. package/.dedao-extract/v2-fk-promo-audit.json +12 -0
  248. package/.dedao-extract/v2-fk-targets-it1.json +94 -0
  249. package/.dedao-extract/v2-fk-targets-it2.json +94 -0
  250. package/.dedao-extract/v2-l001-figs-it1.json +62 -0
  251. package/.dedao-extract/v2-l001-fix-screen.json +20 -0
  252. package/.dedao-extract/v2-l001-meta.json +147 -0
  253. package/.dedao-extract/v2-l001-promo-audit.json +12 -0
  254. package/.dedao-extract/v2-l001-targets-it1.json +84 -0
  255. package/.dedao-extract/v2-l002-figs-it1.json +34 -0
  256. package/.dedao-extract/v2-l002-fix-screen.json +13 -0
  257. package/.dedao-extract/v2-l002-meta.json +126 -0
  258. package/.dedao-extract/v2-l002-promo-audit.json +12 -0
  259. package/.dedao-extract/v2-l002-targets-it1.json +46 -0
  260. package/.dedao-extract/v2-qc-final.json +60 -0
  261. package/.dedao-extract/v3-01-navigate.json +14 -0
  262. package/.dedao-extract/v3-98-results.json +530 -0
  263. package/.dedao-extract/v3-99-log.json +60 -0
  264. package/.dedao-extract/v3-fk-figs-it1.json +66 -0
  265. package/.dedao-extract/v3-fk-figs-it2.json +66 -0
  266. package/.dedao-extract/v3-fk-fix-screen.json +20 -0
  267. package/.dedao-extract/v3-fk-meta.json +164 -0
  268. package/.dedao-extract/v3-fk-promo-audit.json +12 -0
  269. package/.dedao-extract/v3-fk-sikao.json +6 -0
  270. package/.dedao-extract/v3-fk-targets-it1.json +84 -0
  271. package/.dedao-extract/v3-fk-targets-it2.json +84 -0
  272. package/.dedao-extract/v3-l001-figs-it1.json +54 -0
  273. package/.dedao-extract/v3-l001-fix-screen.json +19 -0
  274. package/.dedao-extract/v3-l001-meta.json +192 -0
  275. package/.dedao-extract/v3-l001-promo-audit.json +12 -0
  276. package/.dedao-extract/v3-l001-sikao.json +41 -0
  277. package/.dedao-extract/v3-l001-targets-it1.json +76 -0
  278. package/.dedao-extract/v3-l002-figs-it1.json +30 -0
  279. package/.dedao-extract/v3-l002-fix-screen.json +12 -0
  280. package/.dedao-extract/v3-l002-meta.json +172 -0
  281. package/.dedao-extract/v3-l002-promo-audit.json +12 -0
  282. package/.dedao-extract/v3-l002-sikao.json +32 -0
  283. package/.dedao-extract/v3-l002-targets-it1.json +42 -0
  284. package/.dedao-extract/v3-qc-final.json +77 -0
  285. package/.dedao-extract/write-version-record.py +43 -0
  286. package/.dedao-scout/01-navigate.json +14 -0
  287. package/.dedao-scout/02-ready.json +5 -0
  288. package/.dedao-scout/03-sidebar-hits.json +4 -0
  289. package/.dedao-scout/04-sidebar-container.json +38 -0
  290. package/.dedao-scout/05-sidebar-total.json +3 -0
  291. package/.dedao-scout/06-sidebar-slice-000.json +42 -0
  292. package/.dedao-scout/07-firstpub.json +12 -0
  293. package/.dedao-scout/08-heads-audio.json +117 -0
  294. package/.dedao-scout/09-images.json +4 -0
  295. package/.dedao-scout/10-content-blocks.json +4 -0
  296. package/.dedao-scout/11-selected.json +33 -0
  297. package/.dedao-scout/12-layout.json +75 -0
  298. package/.dedao-scout/20-ready.json +5 -0
  299. package/.dedao-scout/21-sidebar-deep.json +148 -0
  300. package/.dedao-scout/22-right-blocks.json +70 -0
  301. package/.dedao-scout/23-title.json +13 -0
  302. package/.dedao-scout/24-playbtn-roots.json +17 -0
  303. package/.dedao-scout/25-chapter-mods.json +4 -0
  304. package/.dedao-scout/26-editor-children.json +4 -0
  305. package/.dedao-scout/27-audio.json +6 -0
  306. package/.dedao-scout/28-timeinfo-siblings.json +49 -0
  307. package/.dedao-scout/29-scroll.json +11 -0
  308. package/.dedao-scout/30-sidebar-scroll.json +4 -0
  309. package/.dedao-scout/31-click-001.json +10 -0
  310. package/.dedao-scout/32-after-click.json +4 -0
  311. package/.dedao-scout/33-audio-article.json +4 -0
  312. package/.dedao-scout/34-img-lazy.json +27 -0
  313. package/.dedao-scout/40-all-chapters.json +146 -0
  314. package/.dedao-scout/41-click-001.json +6 -0
  315. package/.dedao-scout/42-audio-article-structure.json +4 -0
  316. package/.dedao-scout/50-click.json +5 -0
  317. package/.dedao-scout/51-audio-structure.json +111 -0
  318. package/.dedao-scout/60-chapter-tree.json +31 -0
  319. package/.dedao-scout/99-log.json +6 -0
  320. package/.dedao-scout/scout.mjs +246 -0
  321. package/.dedao-scout/scout2.mjs +163 -0
  322. package/.dedao-scout/scout3.mjs +132 -0
  323. package/.dedao-scout/scout4.mjs +119 -0
  324. package/.dedao-scout/scout5.mjs +89 -0
  325. package/.dedao-scout/scout6.mjs +100 -0
  326. package/ARCHITECTURE.md +17 -3
  327. package/README.md +19 -2
  328. package/dist/browse/StepEngine.d.ts +1 -1
  329. package/dist/browse/StepEngine.d.ts.map +1 -1
  330. package/dist/browse/StepEngine.js +28 -4
  331. package/dist/browse/StepEngine.js.map +1 -1
  332. package/dist/browse/cdp-actions.d.ts +8 -0
  333. package/dist/browse/cdp-actions.d.ts.map +1 -1
  334. package/dist/browse/cdp-actions.js +16 -0
  335. package/dist/browse/cdp-actions.js.map +1 -1
  336. package/dist/browse/steps-types.d.ts +2 -2
  337. package/dist/browse/steps-types.d.ts.map +1 -1
  338. package/dist/channels/BrowseChannel.d.ts +22 -1
  339. package/dist/channels/BrowseChannel.d.ts.map +1 -1
  340. package/dist/channels/BrowseChannel.js +150 -15
  341. package/dist/channels/BrowseChannel.js.map +1 -1
  342. package/dist/channels/LoggedInChannel.d.ts +18 -0
  343. package/dist/channels/LoggedInChannel.d.ts.map +1 -1
  344. package/dist/channels/LoggedInChannel.js +81 -0
  345. package/dist/channels/LoggedInChannel.js.map +1 -1
  346. package/dist/config/config.d.ts +9 -0
  347. package/dist/config/config.d.ts.map +1 -1
  348. package/dist/config/config.js +27 -0
  349. package/dist/config/config.js.map +1 -1
  350. package/dist/desktop/AppleScriptProvider.d.ts +1 -1
  351. package/dist/desktop/AppleScriptProvider.d.ts.map +1 -1
  352. package/dist/desktop/AppleScriptProvider.js +6 -2
  353. package/dist/desktop/AppleScriptProvider.js.map +1 -1
  354. package/dist/desktop/AxProvider.d.ts +6 -3
  355. package/dist/desktop/AxProvider.d.ts.map +1 -1
  356. package/dist/desktop/AxProvider.js +6 -2
  357. package/dist/desktop/AxProvider.js.map +1 -1
  358. package/dist/desktop/ScreenshotVlmProvider.d.ts.map +1 -1
  359. package/dist/desktop/ScreenshotVlmProvider.js +4 -3
  360. package/dist/desktop/ScreenshotVlmProvider.js.map +1 -1
  361. package/dist/doctor/doctor.d.ts +1 -1
  362. package/dist/doctor/doctor.js +1 -1
  363. package/dist/fallback/BudgetTracker.d.ts +8 -0
  364. package/dist/fallback/BudgetTracker.d.ts.map +1 -1
  365. package/dist/fallback/BudgetTracker.js +13 -0
  366. package/dist/fallback/BudgetTracker.js.map +1 -1
  367. package/dist/fallback/FallbackDecider.d.ts.map +1 -1
  368. package/dist/fallback/FallbackDecider.js +5 -2
  369. package/dist/fallback/FallbackDecider.js.map +1 -1
  370. package/dist/fallback/LongCircuitBreaker.d.ts +40 -10
  371. package/dist/fallback/LongCircuitBreaker.d.ts.map +1 -1
  372. package/dist/fallback/LongCircuitBreaker.js +41 -5
  373. package/dist/fallback/LongCircuitBreaker.js.map +1 -1
  374. package/dist/fallback/outcome.d.ts +1 -0
  375. package/dist/fallback/outcome.d.ts.map +1 -1
  376. package/dist/fallback/outcome.js +48 -4
  377. package/dist/fallback/outcome.js.map +1 -1
  378. package/dist/index.js +32 -5
  379. package/dist/index.js.map +1 -1
  380. package/dist/launcher/chrome-idle-reaper.d.ts +36 -3
  381. package/dist/launcher/chrome-idle-reaper.d.ts.map +1 -1
  382. package/dist/launcher/chrome-idle-reaper.js +125 -5
  383. package/dist/launcher/chrome-idle-reaper.js.map +1 -1
  384. package/dist/launcher/chrome-stop.d.ts +19 -1
  385. package/dist/launcher/chrome-stop.d.ts.map +1 -1
  386. package/dist/launcher/chrome-stop.js +20 -10
  387. package/dist/launcher/chrome-stop.js.map +1 -1
  388. package/dist/launcher/launch-chrome.d.ts +19 -1
  389. package/dist/launcher/launch-chrome.d.ts.map +1 -1
  390. package/dist/launcher/launch-chrome.js +20 -3
  391. package/dist/launcher/launch-chrome.js.map +1 -1
  392. package/dist/runtime/CallerTierTracker.d.ts +11 -6
  393. package/dist/runtime/CallerTierTracker.d.ts.map +1 -1
  394. package/dist/runtime/CallerTierTracker.js +11 -6
  395. package/dist/runtime/CallerTierTracker.js.map +1 -1
  396. package/dist/ssrf/ssrf-guard.d.ts +23 -0
  397. package/dist/ssrf/ssrf-guard.d.ts.map +1 -1
  398. package/dist/ssrf/ssrf-guard.js +37 -0
  399. package/dist/ssrf/ssrf-guard.js.map +1 -1
  400. package/dist/tools/admin.d.ts.map +1 -1
  401. package/dist/tools/admin.js +24 -3
  402. package/dist/tools/admin.js.map +1 -1
  403. package/dist/tools/browse.d.ts.map +1 -1
  404. package/dist/tools/browse.js +10 -4
  405. package/dist/tools/browse.js.map +1 -1
  406. package/dist/tools/browserbase.d.ts.map +1 -1
  407. package/dist/tools/browserbase.js +7 -4
  408. package/dist/tools/browserbase.js.map +1 -1
  409. package/dist/tools/descriptions.d.ts.map +1 -1
  410. package/dist/tools/descriptions.js +12 -0
  411. package/dist/tools/descriptions.js.map +1 -1
  412. package/dist/tools/fetch-feed.d.ts.map +1 -1
  413. package/dist/tools/fetch-feed.js +7 -4
  414. package/dist/tools/fetch-feed.js.map +1 -1
  415. package/dist/tools/fetch-url.d.ts.map +1 -1
  416. package/dist/tools/fetch-url.js +27 -13
  417. package/dist/tools/fetch-url.js.map +1 -1
  418. package/dist/tools/network.d.ts.map +1 -1
  419. package/dist/tools/network.js +17 -8
  420. package/dist/tools/network.js.map +1 -1
  421. package/dist/tools/pdf.d.ts.map +1 -1
  422. package/dist/tools/pdf.js +18 -9
  423. package/dist/tools/pdf.js.map +1 -1
  424. package/dist/tools/screenshot.d.ts.map +1 -1
  425. package/dist/tools/screenshot.js +7 -4
  426. package/dist/tools/screenshot.js.map +1 -1
  427. package/dist/tools/steel.d.ts.map +1 -1
  428. package/dist/tools/steel.js +7 -4
  429. package/dist/tools/steel.js.map +1 -1
  430. package/dist/tools/wayback.d.ts.map +1 -1
  431. package/dist/tools/wayback.js +7 -4
  432. package/dist/tools/wayback.js.map +1 -1
  433. package/dist/types.d.ts +7 -0
  434. package/dist/types.d.ts.map +1 -1
  435. package/dist/util/output-envelope.d.ts +4 -1
  436. package/dist/util/output-envelope.d.ts.map +1 -1
  437. package/dist/util/output-envelope.js +51 -9
  438. package/dist/util/output-envelope.js.map +1 -1
  439. 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
  440. 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
  441. 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
  442. 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
  443. 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
  444. 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
  445. 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
  446. 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
  447. 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
  448. package/doc/KEY-GUIDE.md +30 -3
  449. package/package.json +1 -1
  450. package/src/browse/StepEngine.ts +32 -5
  451. package/src/browse/cdp-actions.ts +18 -0
  452. package/src/browse/steps-types.ts +2 -2
  453. package/src/channels/BrowseChannel.ts +176 -14
  454. package/src/channels/LoggedInChannel.ts +76 -0
  455. package/src/config/config.ts +38 -0
  456. package/src/desktop/AppleScriptProvider.ts +7 -3
  457. package/src/desktop/AxProvider.ts +12 -5
  458. package/src/desktop/ScreenshotVlmProvider.ts +3 -2
  459. package/src/doctor/doctor.ts +1 -1
  460. package/src/fallback/BudgetTracker.ts +15 -0
  461. package/src/fallback/FallbackDecider.ts +5 -2
  462. package/src/fallback/LongCircuitBreaker.ts +48 -9
  463. package/src/fallback/outcome.ts +49 -4
  464. package/src/index.ts +31 -4
  465. package/src/invariants/check-invariants.mjs +83 -0
  466. package/src/launcher/chrome-idle-reaper.ts +139 -5
  467. package/src/launcher/chrome-stop.ts +38 -7
  468. package/src/launcher/launch-chrome.ts +31 -3
  469. package/src/runtime/CallerTierTracker.ts +11 -6
  470. package/src/ssrf/ssrf-guard.ts +43 -0
  471. package/src/tools/admin.ts +26 -3
  472. package/src/tools/browse.ts +10 -4
  473. package/src/tools/browserbase.ts +7 -4
  474. package/src/tools/descriptions.ts +12 -0
  475. package/src/tools/fetch-feed.ts +8 -5
  476. package/src/tools/fetch-url.ts +30 -15
  477. package/src/tools/network.ts +18 -9
  478. package/src/tools/pdf.ts +19 -10
  479. package/src/tools/screenshot.ts +8 -5
  480. package/src/tools/steel.ts +7 -4
  481. package/src/tools/wayback.ts +8 -5
  482. package/src/types.ts +7 -0
  483. package/src/util/output-envelope.ts +54 -8
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,5 @@
1
+ {
2
+ "rs": "complete",
3
+ "title": "发刊词丨只给你地道的经济学思维",
4
+ "len": 3127
5
+ }
@@ -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,7 @@
1
+ {
2
+ "ok": true,
3
+ "bodyLen": 1696,
4
+ "imgs": 6,
5
+ "imgsNotLoaded": 0,
6
+ "docH": 27664
7
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "mode": "already",
3
+ "title": "发刊词丨只给你地道的经济学思维",
4
+ "url": "https://www.dedao.cn/course/article?id=6EBOqDNZ27YlVdg8oKm4bQ1odMAkgz"
5
+ }
@@ -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,7 @@
1
+ {
2
+ "ok": true,
3
+ "bodyLen": 3742,
4
+ "imgs": 5,
5
+ "imgsNotLoaded": 0,
6
+ "docH": 13752
7
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "mode": "clicked",
3
+ "title": "第001讲丨战俘营里的经济组织",
4
+ "url": "https://www.dedao.cn/course/article?id=ml9WNdP1QvaeKYG0PJAzx82Dyog0BZ"
5
+ }
@@ -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,7 @@
1
+ {
2
+ "ok": true,
3
+ "bodyLen": 2133,
4
+ "imgs": 3,
5
+ "imgsNotLoaded": 0,
6
+ "docH": 10861
7
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "mode": "clicked",
3
+ "title": "第002讲丨马粪争夺案",
4
+ "url": "https://www.dedao.cn/course/article?id=Ay7GQpR6ndOgX60ReV8eBvPzMN4lwE"
5
+ }
@@ -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
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "rs": "complete",
3
+ "title": "发刊词丨只给你地道的经济学思维",
4
+ "len": 3127
5
+ }