@wenathlan/saddle 1.8.2 → 1.8.5

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 (257) hide show
  1. package/README.md +9 -9
  2. package/browser/playwright.js +22 -0
  3. package/docs/.gitkeep +0 -0
  4. package/docs/gapmatrix.md +3 -3
  5. package/docs/libraryapi.md +1 -0
  6. package/docs/logs/.gitkeep +0 -0
  7. package/docs/packageaudit185.md +23 -0
  8. package/docs/plans/00.index.md +50 -0
  9. package/docs/plans/01.architecture.md +86 -0
  10. package/docs/plans/02.research.computer.use.md +58 -0
  11. package/docs/plans/03.research.captcha.bypass.md +68 -0
  12. package/docs/plans/04.research.sandbox.ai.md +52 -0
  13. package/docs/plans/05.capture.platform.md +57 -0
  14. package/docs/plans/06.dependencies.md +97 -0
  15. package/docs/plans/07.captcha.test.page.md +41 -0
  16. package/docs/plans/08.production.infra.md +70 -0
  17. package/docs/plans/09.database.schema.md +121 -0
  18. package/docs/plans/10.cloudinary.storage.md +57 -0
  19. package/docs/plans/11.movement.logs.json.md +72 -0
  20. package/docs/plans/12.research.atlas.agent.browser.md +79 -0
  21. package/docs/plans/13.research.anti.detection.md +898 -0
  22. package/docs/plans/14.research.proxy.md +1495 -0
  23. package/docs/plans/15.research.retry.rate.limit.md +1958 -0
  24. package/docs/plans/16.research.crawling.md +1417 -0
  25. package/docs/plans/17.research.caching.md +1610 -0
  26. package/docs/plans/18.research.content.extraction.md +1952 -0
  27. package/docs/plans/19.research.errors.events.md +1523 -0
  28. package/docs/plans/20.research.zod.validation.md +1350 -0
  29. package/docs/plans/21.research.batch.concurrency.md +1888 -0
  30. package/docs/plans/22.research.universal.runtime.md +944 -0
  31. package/docs/plans/23.research.ai.integration.md +1465 -0
  32. package/docs/plans/24.research.memory.persistence.md +1979 -0
  33. package/docs/plans/25.research.server.api.md +342 -0
  34. package/docs/plans/26.research.compilation.md +249 -0
  35. package/docs/plans/27.research.html.parsing.md +251 -0
  36. package/docs/plans/28.action.plan.md +50 -0
  37. package/docs/plans/29.api.reference.md +174 -0
  38. package/docs/plans/30.architecture.plan.md +94 -0
  39. package/docs/plans/31.auditoria.dados.md +163 -0
  40. package/docs/plans/32.bots.automacao.computacional.md +214 -0
  41. package/docs/plans/33.bots.codigo.revisao.md +220 -0
  42. package/docs/plans/34.bots.seguranca.cicd.md +366 -0
  43. package/docs/plans/35.comparativo.concorrencia.md +464 -0
  44. package/docs/plans/36.computational.memory.md +340 -0
  45. package/docs/plans/37.deploystrategy.md +394 -0
  46. package/docs/plans/38.flow.md +155 -0
  47. package/docs/plans/39.multi.platform.bot.md +252 -0
  48. package/docs/plans/40.npm.publish.md +250 -0
  49. package/docs/plans/41.o.que.falta.md +407 -0
  50. package/docs/plans/42.pesquisa.concorrencia.md +721 -0
  51. package/docs/plans/43.plan.universal.architecture.md +496 -0
  52. package/docs/plans/44.reference.md +100 -0
  53. package/docs/plans/45.robotarchitecture.md +237 -0
  54. package/docs/plans/46.scdnintegration.md +284 -0
  55. package/docs/plans/47.multiforge.readme.md +129 -0
  56. package/docs/plans/48.theory.v4.repo.os.md +152 -0
  57. package/docs/plans/49.third.party.infra.md +12 -0
  58. package/docs/plans/50.file.as.compute.md +39 -0
  59. package/docs/plans/51.architecture.virtual.processor.md +80 -0
  60. package/docs/plans/52.manifesto.v8.md +11 -0
  61. package/docs/plans/58.cdn.list.md +23 -0
  62. package/docs/plans/59.sql.frameworks.md +33 -0
  63. package/docs/plans/60.sql.thirdparty.md +26 -0
  64. package/docs/plans/61.objective.multiforge.md +63 -0
  65. package/docs/plans/62.huggingface.upload.md +26 -0
  66. package/docs/plans/63.kaggle.upload.md +24 -0
  67. package/docs/plans/64.npm.storage.md +30 -0
  68. package/docs/plans/65.rclone.terabox.md +32 -0
  69. package/docs/plans/66.buckets.and.models.todo.md +14 -0
  70. package/docs/plans/67.database.todo.md +13 -0
  71. package/docs/plans/68.deploy.packages.todo.md +12 -0
  72. package/docs/plans/69.report.human.operator.md +133 -0
  73. package/docs/plans/70.report.brain2qwerty.ems.md +135 -0
  74. package/docs/plans/71.report.hd.infinito.vram.md +155 -0
  75. package/docs/plans/72.plan.hd.infinito.node.md +146 -0
  76. package/docs/plans/73.plan.scifi.repos.md +125 -0
  77. package/docs/plans/74.000.manifesto.v8.flat.2..md +11 -0
  78. package/docs/plans/README.md +489 -0
  79. package/docs/plans/aggregate_platforms.mjs +146 -0
  80. package/docs/plans/examplesession.json +36 -0
  81. package/docs/plans/missing-facts.md +192 -0
  82. package/docs/plans/models.md +64 -0
  83. package/docs/plans/organize.cjs +270 -0
  84. package/docs/plans/platforms.md +2887 -0
  85. package/docs/plans/sites.md +31322 -0
  86. package/docs/platformpipelineaudit.md +18 -0
  87. package/docs/platformpipelines.md +13 -0
  88. package/docs/registryresearch.md +4 -0
  89. package/docs/release.md +4 -4
  90. package/docs/release182notes.md +2 -0
  91. package/docs/release184notes.md +7 -0
  92. package/docs/release185notes.md +7 -0
  93. package/docs/sources/farm.py +117 -0
  94. package/docs/sources/html/saddle1.html +132 -0
  95. package/docs/sources/html/saddle2.html +157 -0
  96. package/docs/sources/html/saddle3.html +119 -0
  97. package/docs/sources/html/saddle4.html +144 -0
  98. package/docs/sources/html/saddle5.html +72 -0
  99. package/docs/sources/html/saddle6.html +171 -0
  100. package/docs/sources/html/saddle7.html +236 -0
  101. package/docs/sources/saddle.ts +74 -0
  102. package/docs/sources/schema.prisma +88 -0
  103. package/docs/sources/script.sh +64 -0
  104. package/docs/sources/workflows.yml +458 -0
  105. package/docs/talks1/_body.txt +14 -0
  106. package/docs/talks1/_index.md +15 -0
  107. package/docs/talks1/_screenshot.png +0 -0
  108. package/docs/talks1/assistant-01.md +5 -0
  109. package/docs/talks1/assistant-02.md +5 -0
  110. package/docs/talks1/assistant-03.md +531 -0
  111. package/docs/talks1/assistant-04.md +26 -0
  112. package/docs/talks1/assistant-05.md +774 -0
  113. package/docs/talks1/assistant-06.md +1718 -0
  114. package/docs/talks1/scrape-share.cjs +185 -0
  115. package/docs/talks1/scrape-share.ts +183 -0
  116. package/docs/talks1/user-01.md +3 -0
  117. package/docs/talks1/user-02.md +3 -0
  118. package/docs/talks1/user-03.md +88 -0
  119. package/docs/talks1/user-04.md +3 -0
  120. package/docs/talks1/user-05.md +3 -0
  121. package/docs/talks1/user-06.md +88 -0
  122. package/docs/talks1/user-07.md +88 -0
  123. package/docs/talks2/_body.txt +14 -0
  124. package/docs/talks2/_index.md +16 -0
  125. package/docs/talks2/_screenshot.png +0 -0
  126. package/docs/talks2/assistant-01.md +5 -0
  127. package/docs/talks2/assistant-02.md +5 -0
  128. package/docs/talks2/assistant-03.md +424 -0
  129. package/docs/talks2/assistant-04.md +598 -0
  130. package/docs/talks2/assistant-05.md +1280 -0
  131. package/docs/talks2/assistant-06.md +1227 -0
  132. package/docs/talks2/assistant-07.md +1252 -0
  133. package/docs/talks2/user-01.md +3 -0
  134. package/docs/talks2/user-02.md +3 -0
  135. package/docs/talks2/user-03.md +88 -0
  136. package/docs/talks2/user-04.md +88 -0
  137. package/docs/talks2/user-05.md +88 -0
  138. package/docs/talks2/user-06.md +88 -0
  139. package/docs/talks2/user-07.md +3 -0
  140. package/docs/talks3/_body.txt +467 -0
  141. package/docs/talks3/_index.md +10 -0
  142. package/docs/talks3/_screenshot.png +0 -0
  143. package/docs/talks3/assistant-01.md +417 -0
  144. package/docs/talks3/assistant-02.md +417 -0
  145. package/docs/talks3/assistant-03.md +29 -0
  146. package/docs/talks3/assistant-04.md +727 -0
  147. package/docs/talks3/user-01.md +88 -0
  148. package/docs/talks3/user-02.md +88 -0
  149. package/docs/talks3/user-03.md +3 -0
  150. package/docs/talks3/user-04.md +3 -0
  151. package/docs/talks4/_body.txt +14 -0
  152. package/docs/talks4/_index.md +12 -0
  153. package/docs/talks4/_screenshot.png +0 -0
  154. package/docs/talks4/assistant-01.md +5 -0
  155. package/docs/talks4/assistant-02.md +5 -0
  156. package/docs/talks4/assistant-03.md +35 -0
  157. package/docs/talks4/assistant-04.md +512 -0
  158. package/docs/talks4/assistant-05.md +599 -0
  159. package/docs/talks4/user-01.md +3 -0
  160. package/docs/talks4/user-02.md +3 -0
  161. package/docs/talks4/user-03.md +88 -0
  162. package/docs/talks4/user-04.md +88 -0
  163. package/docs/talks4/user-05.md +7 -0
  164. package/docs/talks5/_body.txt +14 -0
  165. package/docs/talks5/_index.md +13 -0
  166. package/docs/talks5/_screenshot.png +0 -0
  167. package/docs/talks5/assistant-01.md +5 -0
  168. package/docs/talks5/assistant-02.md +5 -0
  169. package/docs/talks5/assistant-03.md +690 -0
  170. package/docs/talks5/assistant-04.md +758 -0
  171. package/docs/talks5/assistant-05.md +974 -0
  172. package/docs/talks5/user-01.md +3 -0
  173. package/docs/talks5/user-02.md +3 -0
  174. package/docs/talks5/user-03.md +105 -0
  175. package/docs/talks5/user-04.md +105 -0
  176. package/docs/talks5/user-05.md +63 -0
  177. package/docs/talks5/user-06.md +105 -0
  178. package/docs/talks6/_body.txt +14 -0
  179. package/docs/talks6/_index.md +9 -0
  180. package/docs/talks6/_screenshot.png +0 -0
  181. package/docs/talks6/assistant-01.md +5 -0
  182. package/docs/talks6/assistant-02.md +5 -0
  183. package/docs/talks6/assistant-03.md +1499 -0
  184. package/docs/talks6/user-01.md +3 -0
  185. package/docs/talks6/user-02.md +3 -0
  186. package/docs/talks6/user-03.md +88 -0
  187. package/docs/talks6/user-04.md +88 -0
  188. package/docs/talks7/_body.txt +14 -0
  189. package/docs/talks7/_index.md +10 -0
  190. package/docs/talks7/_screenshot.png +0 -0
  191. package/docs/talks7/assistant-01.md +5 -0
  192. package/docs/talks7/assistant-02.md +5 -0
  193. package/docs/talks7/assistant-03.md +523 -0
  194. package/docs/talks7/assistant-04.md +617 -0
  195. package/docs/talks7/user-01.md +3 -0
  196. package/docs/talks7/user-02.md +3 -0
  197. package/docs/talks7/user-03.md +105 -0
  198. package/docs/talks7/user-04.md +67 -0
  199. package/docs/talks8/conversa1.txt +1322 -0
  200. package/docs/talks8/conversa2.txt +237 -0
  201. 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" +174 -0
  202. 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" +59 -0
  203. 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" +91 -0
  204. 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" +116 -0
  205. 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" +128 -0
  206. package/docs/talks9/README (2).md +489 -0
  207. package/docs/talks9/README.md +198 -0
  208. 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" +80 -0
  209. package/docs/talks9/conversa.txt +544 -0
  210. package/docs/talks9/other (2).md +39 -0
  211. package/docs/talks9/other.md +57 -0
  212. package/docs/talks9/outro.txt +24 -0
  213. package/extension/README.md +3 -3
  214. package/extension/serviceworker.js +63 -4
  215. package/extension/worker.js +3 -1
  216. package/package.json +12 -2
  217. package/packager/manifest.js +1 -1
  218. package/scrape/agent.ts +122 -0
  219. package/scrape/batch.ts +79 -0
  220. package/scrape/biome.json +76 -0
  221. package/scrape/browser.ts +222 -0
  222. package/scrape/cache.ts +84 -0
  223. package/scrape/chunking.ts +193 -0
  224. package/scrape/cli.ts +105 -0
  225. package/scrape/crawler.ts +115 -0
  226. package/scrape/dev-server.ts +94 -0
  227. package/scrape/errors.ts +132 -0
  228. package/scrape/events.ts +26 -0
  229. package/scrape/extract.ts +165 -0
  230. package/scrape/fetch.ts +105 -0
  231. package/scrape/formats.ts +85 -0
  232. package/scrape/headers.ts +71 -0
  233. package/scrape/index.ts +92 -0
  234. package/scrape/jsdom.d.ts +6 -0
  235. package/scrape/llms-txt.ts +84 -0
  236. package/scrape/middleware.ts +90 -0
  237. package/scrape/package-lock.json +9397 -0
  238. package/scrape/package.json +1420 -0
  239. package/scrape/pool.ts +95 -0
  240. package/scrape/port.ts +18 -0
  241. package/scrape/proxy.ts +103 -0
  242. package/scrape/rate-limiter.ts +95 -0
  243. package/scrape/renderer.ts +194 -0
  244. package/scrape/retry.ts +64 -0
  245. package/scrape/robots.ts +137 -0
  246. package/scrape/scrape.ts +123 -0
  247. package/scrape/serialize.ts +310 -0
  248. package/scrape/server.ts +137 -0
  249. package/scrape/session.ts +109 -0
  250. package/scrape/sitemap.ts +131 -0
  251. package/scrape/tokens.ts +45 -0
  252. package/scrape/tsconfig.json +28 -0
  253. package/scrape/types.ts +214 -0
  254. package/scrape/utils.ts +77 -0
  255. package/scrape/vite.config.ts +55 -0
  256. package/scrape/vitest.config.ts +17 -0
  257. package/workflow/templates.js +4 -4
@@ -0,0 +1,598 @@
1
+ # assistant
2
+
3
+ [Thinking] The user is asking me to provide a step-by-step guide with scripts, pipelines, and implementations for creating a sandbox platform using free infrastructure from GitHub, GitLab, Forgejo, Gitea, Codeberg, etc. They want to understand how to:
4
+
5
+ Use storage as RAM (zram, tmpfs, etc.)
6
+ Create sandbox environments using CI/CD pipelines
7
+ Use the free tiers of these platforms
8
+ Implement this with various tools (Docker, Node.js, Python, Rust, etc.)
9
+
10
+ They also mention wanting to download the init-fullstack.sh script and run it, but since this is a plan mode, I need to provide a comprehensive plan without actually executing anything.
11
+ Let me create a detailed plan covering:
12
+
13
+ Architecture overview
14
+ Infrastructure setup on each platform
15
+ Memory/storage conversion techniques
16
+ Pipeline implementations
17
+ Scripts and configurationsI should search for more specific information about implementing this.
18
+
19
+ [Thinking] Now I have enough information to create a comprehensive step-by-step plan. Let me organize this into a clear, actionable guide.
20
+
21
+ [Thinking] Now let me create a comprehensive plan. I need to be thorough but also concise.
22
+
23
+ [Thinking] I've provided a comprehensive plan. Let me now ask if the user wants me to implement any specific part of this plan.
24
+
25
+ PLANO COMPLETO: Plataforma Sandbox com Infraestrutura Gratuita
26
+
27
+ VISÃO GERAL DA ARQUITETURA
28
+ ┌─────────────────────────────────────────────────────────────┐
29
+ │ SEU SISTEMA (Cloudflare Workers/Node) │
30
+ │ ┌─────────┐ ┌──────────┐ ┌─────────┐ ┌──────────────┐ │
31
+ │ │ API │ │ Auth │ │ Cron │ │ Monitor │ │
32
+ │ │ REST │ │ JWT/OAuth│ │ Jobs │ │ Dashboard │ │
33
+ │ └────┬─────┘ └────┬─────┘ └────┬────┘ └──────┬───────┘ │
34
+ │ └──────────────┴─────────────┴──────────────┘ │
35
+ └───────────────────────────┬─────────────────────────────────┘
36
+
37
+ ┌───────────────────┼───────────────────┐
38
+ ▼ ▼ ▼
39
+ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐
40
+ │ GitHub Actions│ │ GitLab CI │ │ Forgejo/Gitea │
41
+ │ (público: │ │ (400 min/mês) │ │ (self-hosted) │
42
+ │ ilimitado) │ │ │ │ │
43
+ │ 16GB RAM │ │ 8-128GB RAM │ │ RAM ilimitada │
44
+ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘
45
+ │ │ │
46
+ ▼ ▼ ▼
47
+ ┌─────────────────────────────────────────────────────────────┐
48
+ │ RUNNER EFÊMERO (Docker/VM) │
49
+ │ ┌─────────┐ ┌──────────┐ ┌─────────┐ ┌──────────────┐ │
50
+ │ │ zram │ │ tmpfs │ │ overlay │ │ cgroup │ │
51
+ │ │ swap │ │ /tmp │ │ fs │ │ limits │ │
52
+ │ │ compr. │ │ em RAM │ │ CoW │ │ --memory │ │
53
+ │ └─────────┘ └──────────┘ └─────────┘ └──────────────┘ │
54
+ └─────────────────────────────────────────────────────────────┘
55
+
56
+ PASSO 1: Infraestrutura Gratuita por Plataforma
57
+ GitHub Actions (Repositórios Públicos)
58
+ # .github/workflows/sandbox.yml
59
+ name: Sandbox Runner
60
+
61
+ on:
62
+ repository_dispatch:
63
+ types: [create-sandbox]
64
+ workflow_dispatch:
65
+ inputs:
66
+ sandbox_id:
67
+ description: 'ID da sandbox'
68
+ required: true
69
+ ram_limit:
70
+ description: 'Limite RAM (ex: 8G)'
71
+ default: '8G'
72
+ cpu_limit:
73
+ description: 'Limite CPU'
74
+ default: '4'
75
+ packages:
76
+ description: 'Pacotes para instalar'
77
+ default: 'nodejs python3'
78
+
79
+ jobs:
80
+ sandbox:
81
+ runs-on: ubuntu-latest # 4 vCPU, 16 GB RAM grátis
82
+
83
+ container:
84
+ image: ubuntu:22.04
85
+ options: >-
86
+ --memory ${{ github.event.inputs.ram_limit || '8G' }}
87
+ --cpus ${{ github.event.inputs.cpu_limit || '4' }}
88
+ --tmpfs /tmp:size=4G
89
+ --tmpfs /run:size=2G
90
+
91
+ steps:
92
+ - name: Setup zram
93
+ run: |
94
+ modprobe zram
95
+ echo lz4 > /sys/block/zram0/comp_algorithm
96
+ echo 8G > /sys/block/zram0/disksize
97
+ mkswap /dev/zram0
98
+ swapon /dev/zram0
99
+ echo "zram configurado:"
100
+ zramctl
101
+
102
+ - name: Setup tmpfs
103
+ run: |
104
+ mount -t tmpfs -o size=4G tmpfs /workspace
105
+ echo "tmpfs configurado:"
106
+ df -h /workspace
107
+
108
+ - name: Instalar pacotes
109
+ run: |
110
+ apt-get update
111
+ apt-get install -y ${{ github.event.inputs.packages || 'nodejs python3' }}
112
+
113
+ - name: Clone repositório
114
+ uses: actions/checkout@v4
115
+ with:
116
+ path: /workspace
117
+
118
+ - name: Verificar recursos
119
+ run: |
120
+ echo "=== RAM ==="
121
+ free -h
122
+ echo "=== Disco ==="
123
+ df -h
124
+ echo "=== CPU ==="
125
+ nproc
126
+
127
+ - name: Executar sandbox
128
+ working-directory: /workspace
129
+ run: |
130
+ # Aqui roda o código do usuário
131
+ ls -la
132
+ # node app.js ou python main.py
133
+ GitLab CI
134
+ # .gitlab-ci.yml
135
+ stages:
136
+ - sandbox
137
+
138
+ sandbox:
139
+ stage: sandbox
140
+ tags:
141
+ - saas-linux-small-amd64 # 2 vCPU, 8 GB RAM
142
+ image: ubuntu:22.04
143
+ variables:
144
+ MEMORY_LIMIT: "7G"
145
+ CPU_LIMIT: "2"
146
+ before_script:
147
+ - apt-get update && apt-get install -y zram-tools
148
+ - zramctl /dev/zram0 --algorithm lz4 --size 4G --type swap
149
+ script:
150
+ - free -h
151
+ - df -h
152
+ - # Código do usuário
153
+ rules:
154
+ - if: $CI_PIPELINE_SOURCE == "web"
155
+ - if: $CI_PIPELINE_SOURCE == "api"
156
+ Forgejo/Gitea (Self-hosted)
157
+ # .forgejo/workflows/sandbox.yml
158
+ name: Self-hosted Sandbox
159
+
160
+ on:
161
+ push:
162
+ branches: [main]
163
+
164
+ jobs:
165
+ sandbox:
166
+ runs-on: self-hosted
167
+ container:
168
+ image: catthehacker/ubuntu:act-latest
169
+ options: >-
170
+ --memory 8G
171
+ --cpus 4
172
+ --tmpfs /tmp:size=4G
173
+
174
+ steps:
175
+ - name: Setup
176
+ run: |
177
+ if modprobe zram 2>/dev/null; then
178
+ echo lz4 > /sys/block/zram0/comp_algorithm
179
+ echo 8G > /sys/block/zram0/disksize
180
+ mkswap /dev/zram0 && swapon /dev/zram0
181
+ fi
182
+
183
+ - uses: actions/checkout@v4
184
+ - run: npm install && npm test
185
+
186
+ PASSO 2: Conversão Storage → RAM
187
+ Script de Setup de Memória
188
+ #!/bin/bash
189
+ # setup-memory.sh - Converte storage em RAM
190
+
191
+ setup_zram() {
192
+ local size="${1:-4G}"
193
+ local algo="${2:-lz4}"
194
+
195
+ modprobe zram
196
+ echo $algo > /sys/block/zram0/comp_algorithm
197
+ echo $size > /sys/block/zram0/disksize
198
+ mkswap /dev/zram0
199
+ swapon /dev/zram0
200
+
201
+ echo "zram configurado: $size com $algo"
202
+ zramctl
203
+ }
204
+
205
+ setup_tmpfs() {
206
+ local mount_point="${1:-/workspace}"
207
+ local size="${2:-4G}"
208
+
209
+ mkdir -p $mount_point
210
+ mount -t tmpfs -o size=$size tmpfs $mount_point
211
+
212
+ echo "tmpfs configurado em $mount_point: $size"
213
+ df -h $mount_point
214
+ }
215
+
216
+ setup_overlay() {
217
+ local upper="${1:-/tmp/overlay-upper}"
218
+ local work="${2:-/tmp/overlay-work}"
219
+ local merged="${3:-/merged}"
220
+
221
+ mkdir -p $upper $work $merged
222
+ mount -t overlay overlay \
223
+ -o lowerdir=/lower,upperdir=$upper,workdir=$work \
224
+ $merged
225
+
226
+ echo "overlay configurado em $merged"
227
+ }
228
+
229
+ # Executar setup
230
+ setup_zram "8G"
231
+ setup_tmpfs "/workspace" "4G"
232
+ setup_tmpfs "/tmp" "2G"
233
+ Docker Compose com Limits
234
+ # docker-compose.sandbox.yml
235
+ version: '3.8'
236
+
237
+ services:
238
+ sandbox:
239
+ image: ubuntu:22.04
240
+ deploy:
241
+ resources:
242
+ limits:
243
+ cpus: '4'
244
+ memory: 8G
245
+ reservations:
246
+ memory: 2G
247
+ volumes:
248
+ - workspace:/workspace
249
+ - tmpfs:/tmp
250
+ tmpfs:
251
+ - /tmp:size=4G
252
+ - /run:size=2G
253
+ command: >
254
+ bash -c "
255
+ modprobe zram &&
256
+ echo lz4 > /sys/block/zram0/comp_algorithm &&
257
+ echo 8G > /sys/block/zram0/disksize &&
258
+ mkswap /dev/zram0 &&
259
+ swapon /dev/zram0 &&
260
+ free -h &&
261
+ df -h &&
262
+ sleep infinity
263
+ "
264
+
265
+ volumes:
266
+ workspace:
267
+ tmpfs:
268
+
269
+ PASSO 3: Projetos Open Source para Sandboxing
270
+ Para microVMs (mais isolamento):
271
+
272
+
273
+
274
+ Projeto
275
+ Comando
276
+ RAM por fork
277
+
278
+
279
+
280
+ kern
281
+ kern box --image alpine --memory 512M -it -- sh
282
+ ~1.5 MB
283
+
284
+
285
+ exec-sandbox
286
+ exec-sandbox run --memory 192 -- python code.py
287
+ 192 MB
288
+
289
+
290
+ mitos
291
+ mitos sandbox create --from-sandbox <id>
292
+ ~3 MiB
293
+
294
+
295
+ rust-nano-vm
296
+ nanovm create --memory 256
297
+ ~0.5 MiB
298
+
299
+
300
+ Para containers Docker:
301
+
302
+
303
+
304
+ Projeto
305
+ Comando
306
+ RAM por fork
307
+
308
+
309
+
310
+ ez-gh-actions
311
+ ezgha start --memory 4096 --cpus 2
312
+ Configurável
313
+
314
+
315
+ outrunner
316
+ outrunner run --memory 4G --image ubuntu
317
+ Configurável
318
+
319
+
320
+ ephemerd
321
+ ephemerd serve --memory 8192
322
+ Configurável
323
+
324
+
325
+ Para storage→RAM:
326
+
327
+
328
+
329
+ Projeto
330
+ Comando
331
+ Uso
332
+
333
+
334
+
335
+ zram-config
336
+ zram-config start
337
+ Swap comprimido
338
+
339
+
340
+ MAVFS
341
+ python run_mafs.py shell --ram redis
342
+ Filesystem virtual
343
+
344
+
345
+ DiskLLM
346
+ diskllm run --kv-backend ssd
347
+ Cache em SSD
348
+
349
+
350
+ storage.llm
351
+ ./storagellm-server --model ./model
352
+ Offload storage→VRAM
353
+
354
+
355
+
356
+ PASSO 4: Orquestrador com Cloudflare Workers
357
+ // src/index.js
358
+ export default {
359
+ async scheduled(event, env, ctx) {
360
+ // Cron job para limpar sandboxes antigas
361
+ await cleanupOldSandboxes(env);
362
+ },
363
+
364
+ async fetch(request, env, ctx) {
365
+ const url = new URL(request.url);
366
+
367
+ if (url.pathname === '/api/sandbox/create') {
368
+ return await createSandbox(request, env);
369
+ }
370
+
371
+ if (url.pathname === '/api/sandbox/destroy') {
372
+ return await destroySandbox(request, env);
373
+ }
374
+
375
+ return new Response('Sandbox Platform API');
376
+ }
377
+ };
378
+
379
+ async function createSandbox(request, env) {
380
+ const { userId, ramLimit, cpuLimit, packages } = await request.json();
381
+
382
+ // Escolher plataforma baseado na carga
383
+ let platform = 'github'; // padrão: gratuito para públicos
384
+
385
+ if (ramLimit > 16) {
386
+ platform = 'gitlab'; // até 128 GB no premium
387
+ }
388
+
389
+ // Criar repositório e disparar workflow
390
+ const repoName = `sandbox-${userId}-${Date.now()}`;
391
+
392
+ if (platform === 'github') {
393
+ await createGitHubRepo(repoName, env);
394
+ await triggerGitHubWorkflow(repoName, { ramLimit, cpuLimit, packages }, env);
395
+ } else if (platform === 'gitlab') {
396
+ await createGitLabProject(repoName, env);
397
+ await triggerGitLabPipeline(repoName, { ramLimit, cpuLimit, packages }, env);
398
+ } else if (platform === 'forgejo') {
399
+ await createForgejoRepo(repoName, env);
400
+ await triggerForgejoWorkflow(repoName, { ramLimit, cpuLimit, packages }, env);
401
+ }
402
+
403
+ return Response.json({
404
+ sandboxId: repoName,
405
+ platform,
406
+ status: 'creating',
407
+ estimatedReady: '30s'
408
+ });
409
+ }
410
+
411
+ async function triggerGitHubWorkflow(repoName, config, env) {
412
+ const workflow = `
413
+ name: Sandbox
414
+ on:
415
+ workflow_dispatch:
416
+ inputs:
417
+ ram_limit:
418
+ default: '${config.ramLimit}'
419
+ cpu_limit:
420
+ default: '${config.cpuLimit}'
421
+ packages:
422
+ default: '${config.packages}'
423
+
424
+ jobs:
425
+ run:
426
+ runs-on: ubuntu-latest
427
+ container:
428
+ image: ubuntu:22.04
429
+ options: --memory \${{ github.event.inputs.ram_limit }} --cpus \${{ github.event.inputs.cpu_limit }}
430
+ steps:
431
+ - run: apt-get update && apt-get install -y \${{ github.event.inputs.packages }}
432
+ - run: free -h && df -h
433
+ `;
434
+
435
+ // Criar arquivo .github/workflows/sandbox.yml
436
+ await fetch(`https://api.github.com/repos/${env.GITHUB_ORG}/${repoName}/contents/.github/workflows/sandbox.yml`, {
437
+ method: 'PUT',
438
+ headers: {
439
+ 'Authorization': `token ${env.GITHUB_TOKEN}`,
440
+ 'Content-Type': 'application/json'
441
+ },
442
+ body: JSON.stringify({
443
+ message: 'Create sandbox workflow',
444
+ content: btoa(workflow)
445
+ })
446
+ });
447
+
448
+ // Disparar workflow
449
+ await fetch(`https://api.github.com/repos/${env.GITHUB_ORG}/${repoName}/actions/workflows/sandbox.yml/dispatches`, {
450
+ method: 'POST',
451
+ headers: {
452
+ 'Authorization': `token ${env.GITHUB_TOKEN}`,
453
+ 'Content-Type': 'application/json'
454
+ },
455
+ body: JSON.stringify({
456
+ ref: 'main',
457
+ inputs: {
458
+ ram_limit: config.ramLimit,
459
+ cpu_limit: config.cpuLimit,
460
+ packages: config.packages
461
+ }
462
+ })
463
+ });
464
+ }
465
+
466
+ PASSO 5: Monitoramento e Limpeza
467
+ // src/monitor.js
468
+ export async function cleanupOldSandboxes(env) {
469
+ const sandboxes = await env.DB.prepare(
470
+ 'SELECT * FROM sandboxes WHERE created_at < datetime("now", "-1 hour")'
471
+ ).all();
472
+
473
+ for (const sandbox of sandboxes.results) {
474
+ // Destruir repositório e resources
475
+ await destroySandbox(sandbox.id, sandbox.platform, env);
476
+
477
+ // Remover do banco
478
+ await env.DB.prepare('DELETE FROM sandboxes WHERE id = ?').bind(sandbox.id).run();
479
+ }
480
+ }
481
+
482
+ export async function getMetrics(sandboxId, env) {
483
+ // Buscar métricas do runner
484
+ const metrics = await fetch(`https://api.github.com/repos/${env.GITHUB_ORG}/${sandboxId}/actions/runs`, {
485
+ headers: {
486
+ 'Authorization': `token ${env.GITHUB_TOKEN}`
487
+ }
488
+ });
489
+
490
+ return {
491
+ status: metrics.workflow_runs[0]?.status,
492
+ conclusion: metrics.workflow_runs[0]?.conclusion,
493
+ duration: metrics.workflow_runs[0]?.run_started_at,
494
+ logs: await getRunLogs(sandboxId, env)
495
+ };
496
+ }
497
+
498
+ PASSO 6: Script de Setup Local (Windows/Mac/Linux)
499
+ #!/bin/bash
500
+ # setup-sandbox-platform.sh
501
+
502
+ echo "=== Configurando Plataforma Sandbox ==="
503
+
504
+ # 1. Instalar dependências
505
+ echo "Instalando dependências..."
506
+ npm install -g wrangler # Cloudflare Workers CLI
507
+ npm install -g @cloudflare/workers-types
508
+
509
+ # 2. Criar projeto
510
+ echo "Criando projeto..."
511
+ mkdir sandbox-platform && cd sandbox-platform
512
+ npm init -y
513
+ npm install @cloudflare/workers-types typescript
514
+
515
+ # 3. Configurar Cloudflare
516
+ echo "Configurando Cloudflare..."
517
+ wrangler login
518
+ wrangler secret put GITHUB_TOKEN
519
+ wrangler secret put GITLAB_TOKEN
520
+ wrangler secret put FORGEJO_TOKEN
521
+
522
+ # 4. Criar banco de dados
523
+ echo "Criando banco de dados..."
524
+ wrangler d1 create sandboxes-db
525
+
526
+ # 5. Deploy
527
+ echo "Fazendo deploy..."
528
+ wrangler deploy
529
+
530
+ echo "=== Plataforma configurada! ==="
531
+ echo "API URL: https://sandbox-platform.your-subdomain.workers.dev"
532
+
533
+ RESUMO DOS RECURSOS GRATUITOS
534
+
535
+
536
+
537
+ Plataforma
538
+ RAM
539
+ CPU
540
+ Storage
541
+ Minutos/mês
542
+
543
+
544
+
545
+ GitHub (público)
546
+ 16 GB
547
+ 4 vCPU
548
+ 14 GB
549
+ Ilimitado
550
+
551
+
552
+ GitHub (privado)
553
+ 16 GB
554
+ 4 vCPU
555
+ 14 GB
556
+ 2.000
557
+
558
+
559
+ GitLab Free
560
+ 8 GB
561
+ 2 vCPU
562
+ 30 GB
563
+ 400
564
+
565
+
566
+ Codeberg
567
+ 8 GB
568
+ 4 vCPU
569
+ -
570
+ -
571
+
572
+
573
+ Forgejo self-hosted
574
+ Ilimitado
575
+ Ilimitado
576
+ Ilimitado
577
+ Ilimitado
578
+
579
+
580
+
581
+ MACETES PRINCIPAIS
582
+
583
+ Repositórios públicos no GitHub = ilimitado (16 GB RAM grátis)
584
+ zram converte 4 GB storage em ~12 GB RAM comprimida
585
+ tmpfs coloca arquivos direto em RAM (zero I/O disco)
586
+ Docker --memory isola cada sandbox sem afetar outras
587
+ Cloudflare Workers free tier orquestra tudo
588
+ Cron jobs mantêm sandboxes limpas automaticamente
589
+
590
+ Quer que eu implemente alguma parte específica? Posso:
591
+
592
+ Criar o projeto completo com Cloudflare Workers + GitHub/GitLab/Forgejo
593
+ Criar os scripts de setup de zram/tmpfs/overlay
594
+ Configurar o Forgejo self-hosted no seu servidor
595
+ Criar o orchestador com cron jobs e monitoramento
596
+ Integrar com o script init-fullstack.sh do Z.ai
597
+
598
+ Qual parte quer começar?