@wenathlan/saddle 1.8.16 → 1.8.18

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 (223) hide show
  1. package/README.md +38 -13
  2. package/dist/apps/registry.d.ts +1 -1
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/isolation/contracts.d.ts +118 -0
  8. package/dist/isolation/contracts.d.ts.map +1 -0
  9. package/dist/isolation/contracts.js +84 -0
  10. package/dist/isolation/contracts.js.map +1 -0
  11. package/dist/mcp/server.d.ts +2 -2
  12. package/dist/scrape/robots.js +1 -1
  13. package/docs/artifactavailability.md +18 -2
  14. package/docs/containerplatforms-1.8.17.md +29 -0
  15. package/docs/releasenotes-1.8.16.md +6 -2
  16. package/docs/releasenotes-1.8.17.md +43 -0
  17. package/docs/releasenotes-1.8.18.md +32 -0
  18. package/docs/research-1.8.18-isolation.md +43 -0
  19. package/docs/saddle.archive.1.8.17.tar.gz.gpg +0 -0
  20. package/docs/todo-1.8.16.md +92 -8
  21. package/docs/todo-1.8.18.md +152 -0
  22. package/docs/workflowoperations.md +32 -0
  23. package/extension/manifest.json +1 -1
  24. package/package.json +3 -2
  25. package/docs/logs/.gitkeep +0 -0
  26. package/docs/plans/00.index.md +0 -50
  27. package/docs/plans/01.architecture.md +0 -86
  28. package/docs/plans/02.research.computer.use.md +0 -58
  29. package/docs/plans/03.research.captcha.bypass.md +0 -68
  30. package/docs/plans/04.research.sandbox.ai.md +0 -52
  31. package/docs/plans/05.capture.platform.md +0 -57
  32. package/docs/plans/06.dependencies.md +0 -97
  33. package/docs/plans/07.captcha.test.page.md +0 -41
  34. package/docs/plans/08.production.infra.md +0 -70
  35. package/docs/plans/09.database.schema.md +0 -121
  36. package/docs/plans/10.cloudinary.storage.md +0 -57
  37. package/docs/plans/11.movement.logs.json.md +0 -72
  38. package/docs/plans/12.research.atlas.agent.browser.md +0 -79
  39. package/docs/plans/13.research.anti.detection.md +0 -898
  40. package/docs/plans/14.research.proxy.md +0 -1495
  41. package/docs/plans/15.research.retry.rate.limit.md +0 -1958
  42. package/docs/plans/16.research.crawling.md +0 -1417
  43. package/docs/plans/17.research.caching.md +0 -1610
  44. package/docs/plans/18.research.content.extraction.md +0 -1952
  45. package/docs/plans/19.research.errors.events.md +0 -1523
  46. package/docs/plans/20.research.zod.validation.md +0 -1350
  47. package/docs/plans/21.research.batch.concurrency.md +0 -1888
  48. package/docs/plans/22.research.universal.runtime.md +0 -944
  49. package/docs/plans/23.research.ai.integration.md +0 -1465
  50. package/docs/plans/24.research.memory.persistence.md +0 -1979
  51. package/docs/plans/25.research.server.api.md +0 -342
  52. package/docs/plans/26.research.compilation.md +0 -249
  53. package/docs/plans/27.research.html.parsing.md +0 -251
  54. package/docs/plans/28.action.plan.md +0 -50
  55. package/docs/plans/29.api.reference.md +0 -174
  56. package/docs/plans/30.architecture.plan.md +0 -94
  57. package/docs/plans/31.auditoria.dados.md +0 -163
  58. package/docs/plans/32.bots.automacao.computacional.md +0 -214
  59. package/docs/plans/33.bots.codigo.revisao.md +0 -220
  60. package/docs/plans/34.bots.seguranca.cicd.md +0 -366
  61. package/docs/plans/35.comparativo.concorrencia.md +0 -464
  62. package/docs/plans/36.computational.memory.md +0 -340
  63. package/docs/plans/37.deploystrategy.md +0 -394
  64. package/docs/plans/38.flow.md +0 -155
  65. package/docs/plans/39.multi.platform.bot.md +0 -252
  66. package/docs/plans/40.npm.publish.md +0 -250
  67. package/docs/plans/41.o.que.falta.md +0 -407
  68. package/docs/plans/42.pesquisa.concorrencia.md +0 -721
  69. package/docs/plans/43.plan.universal.architecture.md +0 -496
  70. package/docs/plans/44.reference.md +0 -100
  71. package/docs/plans/45.robotarchitecture.md +0 -237
  72. package/docs/plans/46.scdnintegration.md +0 -284
  73. package/docs/plans/47.multiforge.readme.md +0 -129
  74. package/docs/plans/48.theory.v4.repo.os.md +0 -152
  75. package/docs/plans/49.third.party.infra.md +0 -12
  76. package/docs/plans/50.file.as.compute.md +0 -39
  77. package/docs/plans/51.architecture.virtual.processor.md +0 -80
  78. package/docs/plans/52.manifesto.v8.md +0 -11
  79. package/docs/plans/58.cdn.list.md +0 -23
  80. package/docs/plans/59.sql.frameworks.md +0 -33
  81. package/docs/plans/60.sql.thirdparty.md +0 -26
  82. package/docs/plans/61.objective.multiforge.md +0 -63
  83. package/docs/plans/62.huggingface.upload.md +0 -26
  84. package/docs/plans/63.kaggle.upload.md +0 -24
  85. package/docs/plans/64.npm.storage.md +0 -30
  86. package/docs/plans/65.rclone.terabox.md +0 -32
  87. package/docs/plans/66.buckets.and.models.todo.md +0 -14
  88. package/docs/plans/67.database.todo.md +0 -13
  89. package/docs/plans/68.deploy.packages.todo.md +0 -12
  90. package/docs/plans/69.report.human.operator.md +0 -133
  91. package/docs/plans/70.report.brain2qwerty.ems.md +0 -135
  92. package/docs/plans/71.report.hd.infinito.vram.md +0 -155
  93. package/docs/plans/72.plan.hd.infinito.node.md +0 -146
  94. package/docs/plans/73.plan.scifi.repos.md +0 -125
  95. package/docs/plans/74.000.manifesto.v8.flat.2..md +0 -11
  96. package/docs/plans/README.md +0 -489
  97. package/docs/plans/aggregate_platforms.mjs +0 -146
  98. package/docs/plans/examplesession.json +0 -36
  99. package/docs/plans/missing-facts.md +0 -192
  100. package/docs/plans/models.md +0 -64
  101. package/docs/plans/organize.cjs +0 -270
  102. package/docs/plans/platforms.md +0 -2887
  103. package/docs/plans/sites.md +0 -31322
  104. package/docs/sources/farm.py +0 -117
  105. package/docs/sources/html/saddle1.html +0 -132
  106. package/docs/sources/html/saddle2.html +0 -157
  107. package/docs/sources/html/saddle3.html +0 -119
  108. package/docs/sources/html/saddle4.html +0 -144
  109. package/docs/sources/html/saddle5.html +0 -72
  110. package/docs/sources/html/saddle6.html +0 -171
  111. package/docs/sources/html/saddle7.html +0 -236
  112. package/docs/sources/saddle.ts +0 -74
  113. package/docs/sources/schema.prisma +0 -88
  114. package/docs/sources/script.sh +0 -64
  115. package/docs/sources/workflows.yml +0 -458
  116. package/docs/talks1/_body.txt +0 -14
  117. package/docs/talks1/_index.md +0 -15
  118. package/docs/talks1/_screenshot.png +0 -0
  119. package/docs/talks1/assistant-01.md +0 -5
  120. package/docs/talks1/assistant-02.md +0 -5
  121. package/docs/talks1/assistant-03.md +0 -531
  122. package/docs/talks1/assistant-04.md +0 -26
  123. package/docs/talks1/assistant-05.md +0 -774
  124. package/docs/talks1/assistant-06.md +0 -1718
  125. package/docs/talks1/scrape-share.cjs +0 -185
  126. package/docs/talks1/scrape-share.ts +0 -183
  127. package/docs/talks1/user-01.md +0 -3
  128. package/docs/talks1/user-02.md +0 -3
  129. package/docs/talks1/user-03.md +0 -88
  130. package/docs/talks1/user-04.md +0 -3
  131. package/docs/talks1/user-05.md +0 -3
  132. package/docs/talks1/user-06.md +0 -88
  133. package/docs/talks1/user-07.md +0 -88
  134. package/docs/talks2/_body.txt +0 -14
  135. package/docs/talks2/_index.md +0 -16
  136. package/docs/talks2/_screenshot.png +0 -0
  137. package/docs/talks2/assistant-01.md +0 -5
  138. package/docs/talks2/assistant-02.md +0 -5
  139. package/docs/talks2/assistant-03.md +0 -424
  140. package/docs/talks2/assistant-04.md +0 -598
  141. package/docs/talks2/assistant-05.md +0 -1280
  142. package/docs/talks2/assistant-06.md +0 -1227
  143. package/docs/talks2/assistant-07.md +0 -1252
  144. package/docs/talks2/user-01.md +0 -3
  145. package/docs/talks2/user-02.md +0 -3
  146. package/docs/talks2/user-03.md +0 -88
  147. package/docs/talks2/user-04.md +0 -88
  148. package/docs/talks2/user-05.md +0 -88
  149. package/docs/talks2/user-06.md +0 -88
  150. package/docs/talks2/user-07.md +0 -3
  151. package/docs/talks3/_body.txt +0 -467
  152. package/docs/talks3/_index.md +0 -10
  153. package/docs/talks3/_screenshot.png +0 -0
  154. package/docs/talks3/assistant-01.md +0 -417
  155. package/docs/talks3/assistant-02.md +0 -417
  156. package/docs/talks3/assistant-03.md +0 -29
  157. package/docs/talks3/assistant-04.md +0 -727
  158. package/docs/talks3/user-01.md +0 -88
  159. package/docs/talks3/user-02.md +0 -88
  160. package/docs/talks3/user-03.md +0 -3
  161. package/docs/talks3/user-04.md +0 -3
  162. package/docs/talks4/_body.txt +0 -14
  163. package/docs/talks4/_index.md +0 -12
  164. package/docs/talks4/_screenshot.png +0 -0
  165. package/docs/talks4/assistant-01.md +0 -5
  166. package/docs/talks4/assistant-02.md +0 -5
  167. package/docs/talks4/assistant-03.md +0 -35
  168. package/docs/talks4/assistant-04.md +0 -512
  169. package/docs/talks4/assistant-05.md +0 -599
  170. package/docs/talks4/user-01.md +0 -3
  171. package/docs/talks4/user-02.md +0 -3
  172. package/docs/talks4/user-03.md +0 -88
  173. package/docs/talks4/user-04.md +0 -88
  174. package/docs/talks4/user-05.md +0 -7
  175. package/docs/talks5/_body.txt +0 -14
  176. package/docs/talks5/_index.md +0 -13
  177. package/docs/talks5/_screenshot.png +0 -0
  178. package/docs/talks5/assistant-01.md +0 -5
  179. package/docs/talks5/assistant-02.md +0 -5
  180. package/docs/talks5/assistant-03.md +0 -690
  181. package/docs/talks5/assistant-04.md +0 -758
  182. package/docs/talks5/assistant-05.md +0 -974
  183. package/docs/talks5/user-01.md +0 -3
  184. package/docs/talks5/user-02.md +0 -3
  185. package/docs/talks5/user-03.md +0 -105
  186. package/docs/talks5/user-04.md +0 -105
  187. package/docs/talks5/user-05.md +0 -63
  188. package/docs/talks5/user-06.md +0 -105
  189. package/docs/talks6/_body.txt +0 -14
  190. package/docs/talks6/_index.md +0 -9
  191. package/docs/talks6/_screenshot.png +0 -0
  192. package/docs/talks6/assistant-01.md +0 -5
  193. package/docs/talks6/assistant-02.md +0 -5
  194. package/docs/talks6/assistant-03.md +0 -1499
  195. package/docs/talks6/user-01.md +0 -3
  196. package/docs/talks6/user-02.md +0 -3
  197. package/docs/talks6/user-03.md +0 -88
  198. package/docs/talks6/user-04.md +0 -88
  199. package/docs/talks7/_body.txt +0 -14
  200. package/docs/talks7/_index.md +0 -10
  201. package/docs/talks7/_screenshot.png +0 -0
  202. package/docs/talks7/assistant-01.md +0 -5
  203. package/docs/talks7/assistant-02.md +0 -5
  204. package/docs/talks7/assistant-03.md +0 -523
  205. package/docs/talks7/assistant-04.md +0 -617
  206. package/docs/talks7/user-01.md +0 -3
  207. package/docs/talks7/user-02.md +0 -3
  208. package/docs/talks7/user-03.md +0 -105
  209. package/docs/talks7/user-04.md +0 -67
  210. package/docs/talks8/conversa1.txt +0 -1322
  211. package/docs/talks8/conversa2.txt +0 -237
  212. package/docs/talks9/Beyond the Obvious_ 50 Plataformas Auto-Hospedadas de Forja de C/303/263digo para Al/303/251m de Gitea e GitLab.md" +0 -174
  213. package/docs/talks9/De NPM a Multi-Linguagem_ Uma Arquitetura T/303/251cnica para a Execu/303/247/303/243o Integrada de C/303/263digo no Ecossistema Node.js.md" +0 -59
  214. package/docs/talks9/De NPM a VMs Virtuais_ Uma An/303/241lise Arquitet/303/264nica para a Realiza/303/247/303/243o do Ciclo de Vida do Projeto SADDLE.md" +0 -91
  215. package/docs/talks9/Mapeamento da Engrenagem Computacional_ Uma Arquitetura para Execu/303/247/303/243o Isolada e Persist/303/252ncia em Ambientes Distribu/303/255dos.md" +0 -116
  216. package/docs/talks9/O Cen/303/241rio Pr/303/241tico do SADDLE_ Uma An/303/241lise de Viabilidade e Modelo de Ciclo de Vida Integrado.md" +0 -128
  217. package/docs/talks9/README (2).md +0 -489
  218. package/docs/talks9/README.md +0 -198
  219. package/docs/talks9/Viabilidade do Saddle_ Uma An/303/241lise T/303/251cnica da Transforma/303/247/303/243o de Armazenamento Remoto em Mem/303/263ria Computacional.md" +0 -80
  220. package/docs/talks9/conversa.txt +0 -544
  221. package/docs/talks9/other (2).md +0 -39
  222. package/docs/talks9/other.md +0 -57
  223. package/docs/talks9/outro.txt +0 -24
@@ -1,407 +0,0 @@
1
- # O Que Falta: Roadmap Técnico do webscrape
2
-
3
- > **Data:** 2026-06-08
4
- > **Versão:** 1.0
5
- > **Baseado em:** PESQUISA-CONCORRENCIA.md, COMPARATIVO-CONCORRENCIA.md, AUDITORIA-DADOS.md, análise de código-fonte
6
-
7
- ---
8
-
9
- ## Sumário
10
-
11
- `@wenathlan/webscrape` é um toolkit all-in-one que combina scraping, serialização multi-formato, AI formatting e chunking para RAG — um posicionamento único no mercado. No entanto, 3 gaps críticos impedem a adoção em produção: ausência de anti-detection real, queue persistente e suporte Docker. Este documento lista tudo que falta, priorizado por impacto.
12
-
13
- ---
14
-
15
- ## 1. Itens de Ação Prioritários
16
-
17
- | Prioridade | Item | Esforço | Impacto | Status |
18
- |-----------|------|---------|---------|--------|
19
- | **P0** | Anti-Detection (stealth plugin) | 1-2 dias | CRÍTICO | Opcional disponível, não integrado |
20
- | **P0** | Persistent Queue (SQLite) | 3-5 dias | ALTO | `better-sqlite3` já é dependência |
21
- | **P0** | Docker support | 1-2 dias | ALTO | Nenhum Dockerfile existe |
22
- | **P1** | MCP Server | 3-5 dias | MÉDIO-ALTO | Zero integração MCP |
23
- | **P1** | Session persistence | 2-3 dias | MÉDIO | `session.ts:83-105` é in-memory |
24
- | **P1** | Zod schema extraction | 2-3 dias | MÉDIO | `agent.ts:68-118` não valida com schema |
25
- | **P2** | PDF generation | 1 dia | MÉDIO | Playwright `page.pdf()` disponível |
26
- | **P2** | Configurable token prices | 1 dia | MÉDIO | `tokens.ts:37-44` hardcoded 2024 |
27
- | **P2** | Webhook support | 2-3 dias | MÉDIO | `server.ts` não notifica eventos |
28
- | **P2** | Video extraction | 2-3 dias | BAIXO-MÉDIO | Nenhum suporte |
29
- | **P3** | Mobile emulation | 1 dia | BAIXO | Playwright suporta nativamente |
30
- | **P3** | Tracing/debug | 3-5 dias | BAIXO | Playwright tracing disponível |
31
- | **P3** | Adaptive rendering cache | 1-2 dias | BAIXO | `fetch.ts:97-104` não cacheia decisões |
32
-
33
- ---
34
-
35
- ## 2. Correções Críticas (P0)
36
-
37
- ### 2.1 Anti-Detection / Stealth
38
-
39
- **Problema:** Nenhuma proteção real contra bots. O toolkit falha contra Cloudflare, DataDome, PerimeterX.
40
-
41
- **Estado atual:**
42
- - `browser.ts:13`: User-Agent único hardcoded como default do `AgentBrowser`
43
- - `browser.ts:37`: `'--disable-web-security'` hardcoded nos launch args (risco de segurança)
44
- - `headers.ts:9-38`: Apenas 4 profiles estáticos (Chrome/FF/Safari × Win/Mac)
45
- - `optionalDependencies` em `package.json:778-781`: `playwright-extra` e `puppeteer-extra-plugin-stealth` estão listados mas **não são importados em nenhum arquivo**
46
-
47
- **O que falta:**
48
-
49
- | Capacidade | Implementado | Referência do concorrente |
50
- |-----------|-------------|---------------------------|
51
- | Fingerprint randomization | ❌ | Crawlee: fingerprints human-like automáticos |
52
- | TLS fingerprint rotation | ❌ | Browserless: TLS fingerprint rotation |
53
- | Canvas/WebGL spoofing | ❌ | Firecrawl: stealth mode com proxy residential |
54
- | Navigator property randomization | ❌ | Browserless: BrowserQL |
55
- | Captcha solving | ❌ | Firecrawl: captcha handling integrado |
56
- | Proxy residential | ❌ | Firecrawl/Browserless: IP rotation gerenciada |
57
-
58
- **Implementação necessária:**
59
- 1. Integrar `puppeteer-extra-plugin-stealth` em `browser.ts` — importar e aplicar ao browser launcher
60
- 2. Usar `playwright-extra` como wrapper do Playwright em vez de `playwright` direto (já é dependência opcional)
61
- 3. Remover `'--disable-web-security'` de `browser.ts:37` ou torná-lo opcional via config
62
- 4. Expandir `headers.ts` para 20+ profiles com versões dinâmicas de Chrome/FF
63
- 5. Adicionar config de `stealth: boolean` ao `AgentBrowser` (já existe em `browser.ts:21` como `stealth: true` mas não é usado)
64
-
65
- **Arquivos afetados:**
66
- - `browser.ts:28-44` — reescrever `launch()` para usar `playwright-extra`
67
- - `browser.ts:11-22` — expandir `DEFAULTS` com opções de stealth
68
- - `headers.ts:9-38` — adicionar profiles dinâmicos
69
-
70
- ---
71
-
72
- ### 2.2 Persistent Queue
73
-
74
- **Problema:** Crawler usa `Set<string>` in-memory para visited tracking e `Array` como queue. Impossível resumir crawls após crash, impossível lidar com milhões de URLs.
75
-
76
- **Estado atual:**
77
- - `crawler.ts:56`: `const visited = new Set<string>();`
78
- - `crawler.ts:57`: `const queue: CrawlEntry[] = [{ url: startUrl, depth: 0 }];`
79
- - `crawler.ts:63`: `while (queue.length > 0 && results.length < maxPages)`
80
- - `crawler.ts:64`: `const batch = queue.splice(0, maxConcurrent);`
81
- - `better-sqlite3` já é dependência em `package.json:237`
82
-
83
- **O que falta:**
84
-
85
- | Capacidade | Implementado | Referência do concorrente |
86
- |-----------|-------------|---------------------------|
87
- | Queue persistente (sobrevive restarts) | ❌ | Crawlee: `RequestQueue` com SQLite/disk/cloud |
88
- | Dedup persistente | ❌ | Crawlee: URLs processadas sobrevivem a restarts |
89
- | Priorização de requests | ❌ | Crawlee: FIFO/LIFO |
90
- | Auto-skip de URLs processadas | ❌ | Crawlee |
91
-
92
- **Implementação necessária:**
93
- 1. Criar `queue.ts` com `SqliteQueue` usando `better-sqlite3`
94
- 2. Schema SQLite: `CREATE TABLE requests (url TEXT PRIMARY KEY, depth INT, status TEXT, created_at INT, processed_at INT)`
95
- 3. Substituir `Set<string>` + `Array` em `crawler.ts` por `SqliteQueue`
96
- 4. Adicionar `persist?: boolean | string` ao `CrawlOptions` (path do SQLite)
97
- 5. Manter fallback in-memory para uso sem persistência
98
-
99
- **Arquivos afetados:**
100
- - Novo: `queue.ts` — classe `SqliteQueue`
101
- - `crawler.ts:39-115` — refatorar `crawl()` para usar queue
102
- - `types.ts` — adicionar `CrawlOptions.persist`
103
-
104
- ---
105
-
106
- ### 2.3 Docker Support
107
-
108
- **Problema:** Nenhum container de deploy. Impossível rodar em Kubernetes, Railway, Fly.io.
109
-
110
- **Estado atual:**
111
- - Nenhum `Dockerfile` no repositório (verificado via glob)
112
- - Nenhum `docker-compose.yml`
113
- - `server.ts:128-134` — `createServer()` retorna Hono fetch handler
114
- - `server.ts:132` — host hardcoded `'0.0.0.0'` (AUDITORIA-DADOS.md)
115
-
116
- **O que falta:**
117
- - Todos os 7 concorrentes oferecem Docker (Crawlee templates, Browserless Docker-first, Firecrawl self-hosted)
118
-
119
- **Implementação necessária:**
120
- 1. Criar `Dockerfile` multi-stage: build → production
121
- 2. Criar `docker-compose.yml` com Redis/SQLite como opções
122
- 3. Fixar `server.ts:132` — default para `127.0.0.1` (AUDITORIA-DADOS.md)
123
- 4. Adicionar docs de deploy: Railway, Fly.io, AWS ECS
124
-
125
- **Arquivos afetados:**
126
- - Novo: `Dockerfile`
127
- - Novo: `docker-compose.yml`
128
- - `server.ts:132` — alterar default host
129
-
130
- ---
131
-
132
- ## 3. Gaps Competitivos (P1)
133
-
134
- ### 3.1 MCP Server
135
-
136
- **Problema:** Não pode ser usado por AI agents (Claude Desktop, Cursor, Windsurf) nativamente.
137
-
138
- **Estado atual:**
139
- - Zero integração MCP em qualquer arquivo
140
- - `server.ts` fornece REST API mas não MCP
141
-
142
- **Concorrentes com MCP:**
143
- - Playwright: `@playwright/mcp` — browser automation para AI agents
144
- - Firecrawl: `firecrawl-mcp` — scrape/crawl como MCP tools
145
- - Browserless: MCP server integrado
146
- - Puppeteer: `chrome-devtools-mcp`
147
-
148
- **Implementação necessária:**
149
- 1. Criar pacote `@wenathlan/webscrape-mcp`
150
- 2. Expor endpoints como MCP tools: `scrape`, `crawl`, `batch`, `extract`, `serialize`
151
- 3. Usar SDK oficial `@modelcontextprotocol/sdk`
152
- 4. Adicionar configuração MCP ao `cli.ts`
153
-
154
- **Arquivos afetados:**
155
- - Novo: `mcp.ts` ou pacote separado
156
- - `cli.ts` — adicionar subcomando `mcp`
157
-
158
- ---
159
-
160
- ### 3.2 Session Persistence
161
-
162
- **Problema:** `CookieJar` e `ScrapingSession` são in-memory. Perdem estado entre execuções.
163
-
164
- **Estado atual:**
165
- - `session.ts:11-81`: `CookieJar` com `Map<string, Cookie>` in-memory
166
- - `session.ts:83-105`: `ScrapingSession` com `Map<string, unknown>` in-memory
167
- - Sem persistência em disco ou banco
168
-
169
- **Concorrentes:**
170
- - Browserless: 90 dias de retenção de cookies/cache/localStorage
171
- - Crawlee: persiste sessões em disco
172
-
173
- **Implementação necessária:**
174
- 1. Adicionar opção de file-based storage ao `CookieJar`
175
- 2. Adicionar opção SQLite para `ScrapingSession`
176
- 3. Adicionar `save(path)` / `load(path)` methods
177
- 4. Manter in-memory como default para backward compatibility
178
-
179
- **Arquivos afetados:**
180
- - `session.ts:11-105` — adicionar persistência
181
-
182
- ---
183
-
184
- ### 3.3 Zod Schema Extraction
185
-
186
- **Problema:** Não é possível extrair dados estruturados com validação de schema.
187
-
188
- **Estado atual:**
189
- - `agent.ts:68-118`: `formatForAgent()` gera output genérico para AI agents
190
- - `tokens.ts:37-44`: `MODEL_PRICES` hardcoded
191
- - `zod` já é dependência (`package.json:421`)
192
-
193
- **Concorrentes:**
194
- - Firecrawl: structured output com Zod schemas
195
- - Crawlee: structured output
196
-
197
- **Implementação necessária:**
198
- 1. Criar `extractWithSchema(url, schema)` — scrape + extrair + validar com Zod
199
- 2. Usar LLM para extrair dados baseado no schema quando necessário
200
- 3. Gerar output TypeScript tipado
201
- 4. Integrar com `server.ts` como novo endpoint `/scrape/schema`
202
-
203
- **Arquivos afetados:**
204
- - Novo: `schema-extract.ts`
205
- - `server.ts` — novo endpoint
206
- - `types.ts` — tipos para schema extraction
207
-
208
- ---
209
-
210
- ## 4. Nice-to-Have (P2/P3)
211
-
212
- ### 4.1 PDF Generation (P2)
213
-
214
- **Estado atual:** Screenshots apenas. Sem geração de PDF.
215
-
216
- **Implementação:**
217
- - Usar Playwright `page.pdf()` — já disponível via `browser.ts`
218
- - Adicionar `pdf()` method ao `AgentBrowser`
219
- - Adicionar endpoint `/pdf` ao `server.ts`
220
-
221
- **Arquivos:** `browser.ts`, `server.ts`
222
-
223
- ---
224
-
225
- ### 4.2 Configurable Token Prices (P2)
226
-
227
- **Estado atual:** `tokens.ts:37-44` com preços hardcoded de 2024.
228
-
229
- ```typescript
230
- const PRICES = {
231
- 'gpt-4o': { input: 0.0025, output: 0.01 }, // ← DESATUALIZADO
232
- 'gpt-4o-mini': { input: 0.00015, output: 0.0006 },
233
- // ... 7 modelos desatualizados
234
- };
235
- ```
236
-
237
- **Implementação:**
238
- - Tornar `MODEL_PRICES` configurável via options
239
- - Adicionar `setModelPrices(prices)` function
240
- - Manter defaults como fallback
241
-
242
- **Arquivos:** `tokens.ts`
243
-
244
- ---
245
-
246
- ### 4.3 Webhook Support (P2)
247
-
248
- **Estado atual:** `server.ts` não notifica eventos externos.
249
-
250
- **Implementação:**
251
- - Adicionar `webhook?: { url: string, events: string[] }` ao `CrawlOptions`
252
- - POST para webhook em: crawl started, batch completed, error occurred
253
- - Integrar com `events.ts` (já existe)
254
-
255
- **Arquivos:** `events.ts`, `crawler.ts`, `batch.ts`, `server.ts`
256
-
257
- ---
258
-
259
- ### 4.4 Video Extraction (P2)
260
-
261
- **Estado atual:** Nenhum suporte.
262
-
263
- **Implementação:**
264
- - Detectar URLs de vídeo (YouTube, TikTok)
265
- - Extrair metadados (título, duração, thumbnail)
266
- - Não baixar vídeo (complexidade alta), apenas metadata + transcript
267
-
268
- **Arquivos:** Novo: `video.ts`
269
-
270
- ---
271
-
272
- ### 4.5 Mobile Emulation (P3)
273
-
274
- **Estado atual:** Não implementado. Playwright suporta nativamente.
275
-
276
- **Implementação:**
277
- - Adicionar `device?: string` ao `BrowserAgentConfig`
278
- - Usar `playwright.devices[device]` para viewport + user agent
279
-
280
- **Arquivos:** `browser.ts`, `types.ts`
281
-
282
- ---
283
-
284
- ### 4.6 Tracing/Debug (P3)
285
-
286
- **Estado atual:** Não implementado. Playwright tracing disponível.
287
-
288
- **Implementação:**
289
- - Adicionar `tracing?: boolean` ao `BrowserAgentConfig`
290
- - Usar `context.tracing.start()` / `tracing.stop()`
291
- - Salvar trace para debugging
292
-
293
- **Arquivos:** `browser.ts`
294
-
295
- ---
296
-
297
- ### 4.7 Adaptive Rendering Cache (P3)
298
-
299
- **Estado atual:** `fetch.ts:97-104` — `detectRenderingMode()` é chamada toda vez.
300
-
301
- **Implementação:**
302
- - Cacheiar decisões de rendering mode por domínio usando `cache.ts`
303
- - Usar heurísticas: framework detection (React/Vue/Angular), API calls
304
-
305
- **Arquivos:** `fetch.ts`, `cache.ts`
306
-
307
- ---
308
-
309
- ## 5. Roadmap de Implementação
310
-
311
- ### Semana 1: Fundação de Produção
312
-
313
- | Dia | Tarefa | Arquivos |
314
- |-----|--------|----------|
315
- | 1-2 | Integrar stealth plugin | `browser.ts` |
316
- | 3 | Fixar `--disable-web-security`, expandir header profiles | `browser.ts`, `headers.ts` |
317
- | 4-5 | Criar `SqliteQueue` para crawler | `queue.ts` (novo), `crawler.ts` |
318
- | 6 | Criar `Dockerfile` + `docker-compose.yml` | Novos arquivos |
319
- | 7 | Fixar host hardcoded, criar docs Docker | `server.ts`, docs |
320
-
321
- ### Semana 2: AI & Sessions
322
-
323
- | Dia | Tarefa | Arquivos |
324
- |-----|--------|----------|
325
- | 1-3 | Criar MCP server | `mcp.ts` (novo), `cli.ts` |
326
- | 4-5 | Session persistence (SQLite/file) | `session.ts` |
327
- | 6-7 | Zod schema extraction | `schema-extract.ts` (novo), `server.ts` |
328
-
329
- ### Semana 3: Features e Polish
330
-
331
- | Dia | Tarefa | Arquivos |
332
- |-----|--------|----------|
333
- | 1 | PDF generation | `browser.ts`, `server.ts` |
334
- | 2 | Configurable token prices | `tokens.ts` |
335
- | 3-4 | Webhook support | `events.ts`, `crawler.ts`, `server.ts` |
336
- | 5 | Mobile emulation | `browser.ts` |
337
- | 6-7 | Adaptive rendering cache | `fetch.ts` |
338
-
339
- ---
340
-
341
- ## 6. Resumo de Impacto
342
-
343
- ### Antes vs Depois
344
-
345
- | Capacidade | Antes | Depois |
346
- |-----------|-------|--------|
347
- | Anti-detection | ❌ User-Agent fixo | ✅ Stealth plugin + fingerprint rotation |
348
- | Queue | ❌ In-memory, sem persistência | ✅ SQLite, sobrevive restarts |
349
- | Docker | ❌ Nenhum | ✅ Dockerfile multi-stage |
350
- | MCP | ❌ Nenhum | ✅ Server MCP para AI agents |
351
- | Sessions | ❌ In-memory | ✅ Persistente (SQLite/file) |
352
- | Schema extraction | ❌ Nenhum | ✅ Zod validation |
353
- | PDF | ❌ Screenshots apenas | ✅ Geração de PDF |
354
- | Deploy | ❌ Manual | ✅ Docker + docs Railway/Fly.io |
355
-
356
- ### Posicionamento Atualizado
357
-
358
- ```
359
- Mais Abstrato
360
-
361
-
362
- Firecrawl ────┼──── Browserless
363
- (API-first) │ (DaaS)
364
-
365
- ←───────────────────┼──────────────────→
366
- Mais simples │ Mais complexo
367
-
368
- webscrape ─────┼──── Crawlee
369
- (Toolkit+) │ (Framework)
370
-
371
-
372
- Menos Abstrato
373
- ```
374
-
375
- **Depois do roadmap:** webscrape sobe para "Toolkit+" — mantendo o diferencial AI/RAG e ganhando production readiness.
376
-
377
- ---
378
-
379
- ## 7. Checklist de Validação
380
-
381
- ### P0 — Obrigatório antes de qualquer release
382
-
383
- - [ ] `browser.ts` importa e usa `playwright-extra` + stealth plugin
384
- - [ ] `--disable-web-security` removido ou configurável
385
- - [ ] `queue.ts` implementa `SqliteQueue` com better-sqlite3
386
- - [ ] `crawler.ts` usa queue persistente quando `persist` habilitado
387
- - [ ] `Dockerfile` existe e builda com sucesso
388
- - [ ] `docker-compose.yml` existe com opções de storage
389
- - [ ] `server.ts:132` default para `127.0.0.1`
390
-
391
- ### P1 — Obrigatório para v3.0
392
-
393
- - [ ] MCP server funcional com endpoints scrape/crawl/batch
394
- - [ ] `session.ts` suporta persistência SQLite/file
395
- - [ ] `schema-extract.ts` implementa `extractWithSchema(url, zodSchema)`
396
- - [ ] Testes unitários para cada nova feature
397
-
398
- ### P2 — Nice-to-have para v3.x
399
-
400
- - [ ] PDF generation via `page.pdf()`
401
- - [ ] Token prices configuráveis
402
- - [ ] Webhook support para crawl/batch events
403
- - [ ] Video metadata extraction
404
-
405
- ---
406
-
407
- *Documento gerado em 2026-06-08. Baseado em análise de código-fonte e documentos de pesquisa existentes.*