@wenathlan/saddle 1.8.17 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dockerfile +1339 -0
- package/README.md +68 -22
- package/alternatives.ts +1218 -0
- package/biome.json +153 -0
- package/boards.json +1517 -0
- package/compute.ts +3144 -0
- package/cores.json +1801 -0
- package/dist/acquisition.d.ts +359 -0
- package/dist/acquisition.d.ts.map +1 -0
- package/dist/acquisition.js +629 -0
- package/dist/acquisition.js.map +1 -0
- package/dist/alternatives.d.ts +509 -0
- package/dist/alternatives.d.ts.map +1 -0
- package/dist/alternatives.js +951 -0
- package/dist/alternatives.js.map +1 -0
- package/dist/automation.d.ts +426 -0
- package/dist/automation.d.ts.map +1 -0
- package/dist/automation.js +561 -0
- package/dist/automation.js.map +1 -0
- package/dist/browser.d.ts +562 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +1057 -0
- package/dist/browser.js.map +1 -0
- package/dist/capacitor.config.d.ts +13 -0
- package/dist/capacitor.config.d.ts.map +1 -0
- package/dist/capacitor.config.js +26 -0
- package/dist/capacitor.config.js.map +1 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +111 -0
- package/dist/cli.js.map +1 -0
- package/dist/communication.d.ts +192 -0
- package/dist/communication.d.ts.map +1 -0
- package/dist/communication.js +418 -0
- package/dist/communication.js.map +1 -0
- package/dist/compute.d.ts +1161 -0
- package/dist/compute.d.ts.map +1 -0
- package/dist/compute.js +2273 -0
- package/dist/compute.js.map +1 -0
- package/dist/distribution.d.ts +529 -0
- package/dist/distribution.d.ts.map +1 -0
- package/dist/distribution.js +811 -0
- package/dist/distribution.js.map +1 -0
- package/dist/execution.d.ts +530 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +761 -0
- package/dist/execution.js.map +1 -0
- package/dist/format.d.ts +19 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +60 -0
- package/dist/format.js.map +1 -0
- package/dist/foundation.d.ts +176 -0
- package/dist/foundation.d.ts.map +1 -0
- package/dist/foundation.js +309 -0
- package/dist/foundation.js.map +1 -0
- package/dist/index.d.ts +733 -122
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1018 -122
- package/dist/index.js.map +1 -1
- package/dist/integration.d.ts +236 -0
- package/dist/integration.d.ts.map +1 -0
- package/dist/integration.js +236 -0
- package/dist/integration.js.map +1 -0
- package/dist/intelligence.d.ts +94 -0
- package/dist/intelligence.d.ts.map +1 -0
- package/dist/intelligence.js +145 -0
- package/dist/intelligence.js.map +1 -0
- package/dist/isolation.d.ts +129 -0
- package/dist/isolation.d.ts.map +1 -0
- package/dist/isolation.js +96 -0
- package/dist/isolation.js.map +1 -0
- package/dist/media.d.ts +344 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +986 -0
- package/dist/media.js.map +1 -0
- package/dist/modes.d.ts +359 -0
- package/dist/modes.d.ts.map +1 -0
- package/dist/modes.js +134 -0
- package/dist/modes.js.map +1 -0
- package/dist/{library/public.d.ts → operations.d.ts} +15 -1
- package/dist/operations.d.ts.map +1 -0
- package/dist/{library/public.js → operations.js} +18 -7
- package/dist/operations.js.map +1 -0
- package/dist/orchestrator.d.ts +1339 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +4308 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/performance.d.ts +416 -0
- package/dist/performance.d.ts.map +1 -0
- package/dist/performance.js +827 -0
- package/dist/performance.js.map +1 -0
- package/dist/quantum.d.ts +810 -0
- package/dist/quantum.d.ts.map +1 -0
- package/dist/quantum.js +2073 -0
- package/dist/quantum.js.map +1 -0
- package/dist/render.d.ts +381 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +1073 -0
- package/dist/render.js.map +1 -0
- package/dist/scheduler.d.ts +596 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +1259 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/security.d.ts +501 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +1170 -0
- package/dist/security.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/{server/node.js → server.js} +16 -2
- package/dist/server.js.map +1 -0
- package/dist/tiers.d.ts +1002 -0
- package/dist/tiers.d.ts.map +1 -0
- package/dist/tiers.js +2165 -0
- package/dist/tiers.js.map +1 -0
- package/dist/virtual.d.ts +641 -0
- package/dist/virtual.d.ts.map +1 -0
- package/dist/virtual.js +1285 -0
- package/dist/virtual.js.map +1 -0
- package/dist/virtualcpu.d.ts +316 -0
- package/dist/virtualcpu.d.ts.map +1 -0
- package/dist/virtualcpu.js +1180 -0
- package/dist/virtualcpu.js.map +1 -0
- package/dist/virtualgpu.d.ts +345 -0
- package/dist/virtualgpu.d.ts.map +1 -0
- package/dist/virtualgpu.js +1000 -0
- package/dist/virtualgpu.js.map +1 -0
- package/dist/virtualization.d.ts +607 -0
- package/dist/virtualization.d.ts.map +1 -0
- package/dist/virtualization.js +1187 -0
- package/dist/virtualization.js.map +1 -0
- package/dist/virtualmemory.d.ts +818 -0
- package/dist/virtualmemory.d.ts.map +1 -0
- package/dist/virtualmemory.js +1796 -0
- package/dist/virtualmemory.js.map +1 -0
- package/dist/webscrape.d.ts +720 -0
- package/dist/webscrape.d.ts.map +1 -0
- package/dist/webscrape.js +2697 -0
- package/dist/webscrape.js.map +1 -0
- package/docker.config +769 -0
- package/docs/CONVERSA.txt +1523 -0
- package/docs/alternatives.md +499 -0
- package/docs/architecture-1.8.19.md +76 -0
- package/docs/architecture-1.8.19.mmd +33 -0
- package/docs/architecture-1.8.19.png +0 -0
- package/docs/architecture.md +355 -0
- package/docs/artifactavailability.md +6 -0
- package/docs/brancharchive-2026-08-18.md +18 -0
- package/docs/browser.md +7 -0
- package/docs/consolidation.md +70 -0
- package/docs/e2ugh-engine.md +528 -0
- package/{dist/examples/localjob.js → docs/example-localjob.ts} +3 -3
- package/{dist/examples/publicapi.js → docs/example-publicapi.ts} +2 -2
- package/docs/hardware.md +342 -0
- package/docs/optimization.md +126 -0
- package/docs/performance.md +499 -0
- package/docs/planning.1.8.18.md +94 -0
- package/docs/planning.1.8.19.md +49 -0
- package/docs/releasenotes-1.8.17.md +6 -0
- package/docs/releasenotes-1.8.18.md +32 -0
- package/docs/releasenotes-1.8.19.md +35 -0
- package/docs/research-1.8.18-isolation.md +43 -0
- package/docs/research-1.8.19-virtual-browser.md +27 -0
- package/docs/saddle.archive.1.8.17.tar.gz.gpg +0 -0
- package/docs/security.md +454 -0
- package/docs/todo-1.8.16.md +56 -1
- package/docs/todo-1.8.18.md +164 -0
- package/docs/todo-1.8.19.md +241 -0
- package/docs/viability.md +777 -0
- package/docs/virtualization.md +335 -0
- package/docs/web-duplicatecleanup.md +9 -0
- package/docs/web-ideas.md +106 -0
- package/docs/workflowimprovements-2026-08-19.md +70 -0
- package/gpumonitor.cpp +1543 -0
- package/gpus.json +2408 -0
- package/index.ts +1478 -0
- package/media.ts +1337 -0
- package/mttg.config +1549 -0
- package/orchestrator.ts +5462 -0
- package/package.json +304 -55
- package/passage.config +1331 -0
- package/performance.ts +1049 -0
- package/processors.json +2217 -0
- package/qemu.config +1062 -0
- package/qemubridge.py +1340 -0
- package/quantum.ts +2393 -0
- package/render.ts +1325 -0
- package/scheduler.ts +1600 -0
- package/security.ts +1449 -0
- package/tiers.ts +2871 -0
- package/tsconfig.json +29 -0
- package/virtualcpu.ts +1273 -0
- package/virtualgpu.ts +1181 -0
- package/virtualhardware.c +1011 -0
- package/virtualhardware.json +739 -0
- package/virtualization.ts +1628 -0
- package/virtualizationcore.cpp +4635 -0
- package/virtualmemory.ts +2303 -0
- package/vm.config.json +1910 -0
- package/{extension → web/extension}/manifest.json +1 -1
- package/web/readme.md +382 -0
- package/web/tsconfig.json +25 -0
- package/dist/adapters/forge.d.ts +0 -17
- package/dist/adapters/forge.d.ts.map +0 -1
- package/dist/adapters/forge.js +0 -19
- package/dist/adapters/forge.js.map +0 -1
- package/dist/adapters/forgejo.d.ts +0 -49
- package/dist/adapters/forgejo.d.ts.map +0 -1
- package/dist/adapters/forgejo.js +0 -8
- package/dist/adapters/forgejo.js.map +0 -1
- package/dist/adapters/github.d.ts +0 -12
- package/dist/adapters/github.d.ts.map +0 -1
- package/dist/adapters/github.js +0 -20
- package/dist/adapters/github.js.map +0 -1
- package/dist/adapters/gitlab.d.ts +0 -17
- package/dist/adapters/gitlab.d.ts.map +0 -1
- package/dist/adapters/gitlab.js +0 -10
- package/dist/adapters/gitlab.js.map +0 -1
- package/dist/adapters/huggingface.d.ts +0 -17
- package/dist/adapters/huggingface.d.ts.map +0 -1
- package/dist/adapters/huggingface.js +0 -6
- package/dist/adapters/huggingface.js.map +0 -1
- package/dist/adapters/socket.d.ts +0 -11
- package/dist/adapters/socket.d.ts.map +0 -1
- package/dist/adapters/socket.js +0 -17
- package/dist/adapters/socket.js.map +0 -1
- package/dist/adapters/transport.d.ts +0 -7
- package/dist/adapters/transport.d.ts.map +0 -1
- package/dist/adapters/transport.js +0 -36
- package/dist/adapters/transport.js.map +0 -1
- package/dist/ai/chunk.d.ts +0 -2
- package/dist/ai/chunk.d.ts.map +0 -1
- package/dist/ai/chunk.js +0 -36
- package/dist/ai/chunk.js.map +0 -1
- package/dist/ai/llmstxt.d.ts +0 -6
- package/dist/ai/llmstxt.d.ts.map +0 -1
- package/dist/ai/llmstxt.js +0 -12
- package/dist/ai/llmstxt.js.map +0 -1
- package/dist/ai/provenance.d.ts +0 -22
- package/dist/ai/provenance.d.ts.map +0 -1
- package/dist/ai/provenance.js +0 -25
- package/dist/ai/provenance.js.map +0 -1
- package/dist/ai/rag.d.ts +0 -26
- package/dist/ai/rag.d.ts.map +0 -1
- package/dist/ai/rag.js +0 -22
- package/dist/ai/rag.js.map +0 -1
- package/dist/ai/tokens.d.ts +0 -15
- package/dist/ai/tokens.d.ts.map +0 -1
- package/dist/ai/tokens.js +0 -9
- package/dist/ai/tokens.js.map +0 -1
- package/dist/api/auth.d.ts +0 -16
- package/dist/api/auth.d.ts.map +0 -1
- package/dist/api/auth.js +0 -19
- package/dist/api/auth.js.map +0 -1
- package/dist/api/contracts.d.ts +0 -28
- package/dist/api/contracts.d.ts.map +0 -1
- package/dist/api/contracts.js +0 -14
- package/dist/api/contracts.js.map +0 -1
- package/dist/api/control.d.ts +0 -10
- package/dist/api/control.d.ts.map +0 -1
- package/dist/api/control.js +0 -35
- package/dist/api/control.js.map +0 -1
- package/dist/api/http.d.ts +0 -7
- package/dist/api/http.d.ts.map +0 -1
- package/dist/api/http.js +0 -12
- package/dist/api/http.js.map +0 -1
- package/dist/api/rate.d.ts +0 -28
- package/dist/api/rate.d.ts.map +0 -1
- package/dist/api/rate.js +0 -36
- package/dist/api/rate.js.map +0 -1
- package/dist/api/security.d.ts +0 -12
- package/dist/api/security.d.ts.map +0 -1
- package/dist/api/security.js +0 -56
- package/dist/api/security.js.map +0 -1
- package/dist/api/service.d.ts +0 -5
- package/dist/api/service.d.ts.map +0 -1
- package/dist/api/service.js +0 -70
- package/dist/api/service.js.map +0 -1
- package/dist/apps/registry.d.ts +0 -33
- package/dist/apps/registry.d.ts.map +0 -1
- package/dist/apps/registry.js +0 -24
- package/dist/apps/registry.js.map +0 -1
- package/dist/binary/archive.d.ts +0 -27
- package/dist/binary/archive.d.ts.map +0 -1
- package/dist/binary/archive.js +0 -46
- package/dist/binary/archive.js.map +0 -1
- package/dist/binary/build.d.ts +0 -29
- package/dist/binary/build.d.ts.map +0 -1
- package/dist/binary/build.js +0 -17
- package/dist/binary/build.js.map +0 -1
- package/dist/binary/transform.d.ts +0 -70
- package/dist/binary/transform.d.ts.map +0 -1
- package/dist/binary/transform.js +0 -105
- package/dist/binary/transform.js.map +0 -1
- package/dist/bot/adapter.d.ts +0 -5
- package/dist/bot/adapter.d.ts.map +0 -1
- package/dist/bot/adapter.js +0 -11
- package/dist/bot/adapter.js.map +0 -1
- package/dist/bot/bot.d.ts +0 -28
- package/dist/bot/bot.d.ts.map +0 -1
- package/dist/bot/bot.js +0 -52
- package/dist/bot/bot.js.map +0 -1
- package/dist/bot/commands.d.ts +0 -8
- package/dist/bot/commands.d.ts.map +0 -1
- package/dist/bot/commands.js +0 -19
- package/dist/bot/commands.js.map +0 -1
- package/dist/bot/permissions.d.ts +0 -13
- package/dist/bot/permissions.d.ts.map +0 -1
- package/dist/bot/permissions.js +0 -16
- package/dist/bot/permissions.js.map +0 -1
- package/dist/browser/actions.d.ts +0 -33
- package/dist/browser/actions.d.ts.map +0 -1
- package/dist/browser/actions.js +0 -44
- package/dist/browser/actions.js.map +0 -1
- package/dist/browser/agent.d.ts +0 -21
- package/dist/browser/agent.d.ts.map +0 -1
- package/dist/browser/agent.js +0 -13
- package/dist/browser/agent.js.map +0 -1
- package/dist/browser/context.d.ts +0 -43
- package/dist/browser/context.d.ts.map +0 -1
- package/dist/browser/context.js +0 -54
- package/dist/browser/context.js.map +0 -1
- package/dist/browser/fingerprint.d.ts +0 -4
- package/dist/browser/fingerprint.d.ts.map +0 -1
- package/dist/browser/fingerprint.js +0 -12
- package/dist/browser/fingerprint.js.map +0 -1
- package/dist/browser/index.d.ts +0 -11
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/browser/index.js +0 -11
- package/dist/browser/index.js.map +0 -1
- package/dist/browser/playwright.d.ts +0 -11
- package/dist/browser/playwright.d.ts.map +0 -1
- package/dist/browser/playwright.js +0 -24
- package/dist/browser/playwright.js.map +0 -1
- package/dist/browser/recorder.d.ts +0 -21
- package/dist/browser/recorder.d.ts.map +0 -1
- package/dist/browser/recorder.js +0 -58
- package/dist/browser/recorder.js.map +0 -1
- package/dist/browser/session.d.ts +0 -14
- package/dist/browser/session.d.ts.map +0 -1
- package/dist/browser/session.js +0 -21
- package/dist/browser/session.js.map +0 -1
- package/dist/browser/snapshot.d.ts +0 -69
- package/dist/browser/snapshot.d.ts.map +0 -1
- package/dist/browser/snapshot.js +0 -133
- package/dist/browser/snapshot.js.map +0 -1
- package/dist/captcha/contract.d.ts +0 -35
- package/dist/captcha/contract.d.ts.map +0 -1
- package/dist/captcha/contract.js +0 -17
- package/dist/captcha/contract.js.map +0 -1
- package/dist/captcha/evidence.d.ts +0 -10
- package/dist/captcha/evidence.d.ts.map +0 -1
- package/dist/captcha/evidence.js +0 -9
- package/dist/captcha/evidence.js.map +0 -1
- package/dist/captcha/guard.d.ts +0 -23
- package/dist/captcha/guard.d.ts.map +0 -1
- package/dist/captcha/guard.js +0 -12
- package/dist/captcha/guard.js.map +0 -1
- package/dist/cli/main.d.ts +0 -4
- package/dist/cli/main.d.ts.map +0 -1
- package/dist/cli/main.js +0 -46
- package/dist/cli/main.js.map +0 -1
- package/dist/core/errors.d.ts +0 -84
- package/dist/core/errors.d.ts.map +0 -1
- package/dist/core/errors.js +0 -54
- package/dist/core/errors.js.map +0 -1
- package/dist/core/events.d.ts +0 -9
- package/dist/core/events.d.ts.map +0 -1
- package/dist/core/events.js +0 -21
- package/dist/core/events.js.map +0 -1
- package/dist/core/hash.d.ts +0 -10
- package/dist/core/hash.d.ts.map +0 -1
- package/dist/core/hash.js +0 -82
- package/dist/core/hash.js.map +0 -1
- package/dist/core/ids.d.ts +0 -10
- package/dist/core/ids.d.ts.map +0 -1
- package/dist/core/ids.js +0 -15
- package/dist/core/ids.js.map +0 -1
- package/dist/delivery/manifest.d.ts +0 -35
- package/dist/delivery/manifest.d.ts.map +0 -1
- package/dist/delivery/manifest.js +0 -68
- package/dist/delivery/manifest.js.map +0 -1
- package/dist/deploy/index.d.ts +0 -6
- package/dist/deploy/index.d.ts.map +0 -1
- package/dist/deploy/index.js +0 -6
- package/dist/deploy/index.js.map +0 -1
- package/dist/dispatch/resumable.d.ts +0 -102
- package/dist/dispatch/resumable.d.ts.map +0 -1
- package/dist/dispatch/resumable.js +0 -64
- package/dist/dispatch/resumable.js.map +0 -1
- package/dist/dispatch/workflow.d.ts +0 -6
- package/dist/dispatch/workflow.d.ts.map +0 -1
- package/dist/dispatch/workflow.js +0 -37
- package/dist/dispatch/workflow.js.map +0 -1
- package/dist/domain/artifacts.d.ts +0 -12
- package/dist/domain/artifacts.d.ts.map +0 -1
- package/dist/domain/artifacts.js +0 -14
- package/dist/domain/artifacts.js.map +0 -1
- package/dist/domain/jobs.d.ts +0 -12
- package/dist/domain/jobs.d.ts.map +0 -1
- package/dist/domain/jobs.js +0 -20
- package/dist/domain/jobs.js.map +0 -1
- package/dist/domain/providers.d.ts +0 -10
- package/dist/domain/providers.d.ts.map +0 -1
- package/dist/domain/providers.js +0 -8
- package/dist/domain/providers.js.map +0 -1
- package/dist/domain/runtime.d.ts +0 -14
- package/dist/domain/runtime.d.ts.map +0 -1
- package/dist/domain/runtime.js +0 -10
- package/dist/domain/runtime.js.map +0 -1
- package/dist/domain/sessions.d.ts +0 -12
- package/dist/domain/sessions.d.ts.map +0 -1
- package/dist/domain/sessions.js +0 -57
- package/dist/domain/sessions.js.map +0 -1
- package/dist/examples/localjob.d.ts +0 -2
- package/dist/examples/localjob.d.ts.map +0 -1
- package/dist/examples/localjob.js.map +0 -1
- package/dist/examples/publicapi.d.ts +0 -2
- package/dist/examples/publicapi.d.ts.map +0 -1
- package/dist/examples/publicapi.js.map +0 -1
- package/dist/extension/build.d.ts +0 -9
- package/dist/extension/build.d.ts.map +0 -1
- package/dist/extension/build.js +0 -85
- package/dist/extension/build.js.map +0 -1
- package/dist/extension/content.d.ts +0 -6
- package/dist/extension/content.d.ts.map +0 -1
- package/dist/extension/content.js +0 -135
- package/dist/extension/content.js.map +0 -1
- package/dist/extension/index.d.ts +0 -7
- package/dist/extension/index.d.ts.map +0 -1
- package/dist/extension/index.js +0 -7
- package/dist/extension/index.js.map +0 -1
- package/dist/extension/pagebridge.d.ts +0 -6
- package/dist/extension/pagebridge.d.ts.map +0 -1
- package/dist/extension/pagebridge.js +0 -42
- package/dist/extension/pagebridge.js.map +0 -1
- package/dist/extension/permissions.d.ts +0 -26
- package/dist/extension/permissions.d.ts.map +0 -1
- package/dist/extension/permissions.js +0 -28
- package/dist/extension/permissions.js.map +0 -1
- package/dist/extension/popup.d.ts +0 -5
- package/dist/extension/popup.d.ts.map +0 -1
- package/dist/extension/popup.js +0 -26
- package/dist/extension/popup.js.map +0 -1
- package/dist/extension/protocol.d.ts +0 -58
- package/dist/extension/protocol.d.ts.map +0 -1
- package/dist/extension/protocol.js +0 -101
- package/dist/extension/protocol.js.map +0 -1
- package/dist/extension/serviceworker.d.ts +0 -25
- package/dist/extension/serviceworker.d.ts.map +0 -1
- package/dist/extension/serviceworker.js +0 -102
- package/dist/extension/serviceworker.js.map +0 -1
- package/dist/extension/worker.d.ts +0 -28
- package/dist/extension/worker.d.ts.map +0 -1
- package/dist/extension/worker.js +0 -22
- package/dist/extension/worker.js.map +0 -1
- package/dist/format/check.d.ts +0 -8
- package/dist/format/check.d.ts.map +0 -1
- package/dist/format/check.js +0 -38
- package/dist/format/check.js.map +0 -1
- package/dist/library/public.d.ts.map +0 -1
- package/dist/library/public.js.map +0 -1
- package/dist/mcp/browser.d.ts +0 -9
- package/dist/mcp/browser.d.ts.map +0 -1
- package/dist/mcp/browser.js +0 -13
- package/dist/mcp/browser.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -35
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -40
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/transport.d.ts +0 -7
- package/dist/mcp/transport.d.ts.map +0 -1
- package/dist/mcp/transport.js +0 -17
- package/dist/mcp/transport.js.map +0 -1
- package/dist/memory/bridge.d.ts +0 -14
- package/dist/memory/bridge.d.ts.map +0 -1
- package/dist/memory/bridge.js +0 -16
- package/dist/memory/bridge.js.map +0 -1
- package/dist/memory/engine.d.ts +0 -38
- package/dist/memory/engine.d.ts.map +0 -1
- package/dist/memory/engine.js +0 -109
- package/dist/memory/engine.js.map +0 -1
- package/dist/memory/modes.d.ts +0 -43
- package/dist/memory/modes.d.ts.map +0 -1
- package/dist/memory/modes.js +0 -66
- package/dist/memory/modes.js.map +0 -1
- package/dist/memory/objects.d.ts +0 -21
- package/dist/memory/objects.d.ts.map +0 -1
- package/dist/memory/objects.js +0 -20
- package/dist/memory/objects.js.map +0 -1
- package/dist/memory/planner.d.ts +0 -66
- package/dist/memory/planner.d.ts.map +0 -1
- package/dist/memory/planner.js +0 -108
- package/dist/memory/planner.js.map +0 -1
- package/dist/memory/targets.d.ts +0 -78
- package/dist/memory/targets.d.ts.map +0 -1
- package/dist/memory/targets.js +0 -29
- package/dist/memory/targets.js.map +0 -1
- package/dist/memory/transforms.d.ts +0 -19
- package/dist/memory/transforms.d.ts.map +0 -1
- package/dist/memory/transforms.js +0 -14
- package/dist/memory/transforms.js.map +0 -1
- package/dist/modes/matrix.d.ts +0 -23
- package/dist/modes/matrix.d.ts.map +0 -1
- package/dist/modes/matrix.js +0 -18
- package/dist/modes/matrix.js.map +0 -1
- package/dist/modes/modes.d.ts +0 -33
- package/dist/modes/modes.d.ts.map +0 -1
- package/dist/modes/modes.js +0 -15
- package/dist/modes/modes.js.map +0 -1
- package/dist/modes/resolve.d.ts +0 -96
- package/dist/modes/resolve.d.ts.map +0 -1
- package/dist/modes/resolve.js +0 -48
- package/dist/modes/resolve.js.map +0 -1
- package/dist/observability/metrics.d.ts +0 -14
- package/dist/observability/metrics.d.ts.map +0 -1
- package/dist/observability/metrics.js +0 -18
- package/dist/observability/metrics.js.map +0 -1
- package/dist/packager/manifest.d.ts +0 -66
- package/dist/packager/manifest.d.ts.map +0 -1
- package/dist/packager/manifest.js +0 -94
- package/dist/packager/manifest.js.map +0 -1
- package/dist/packager/publish.d.ts +0 -51
- package/dist/packager/publish.d.ts.map +0 -1
- package/dist/packager/publish.js +0 -18
- package/dist/packager/publish.js.map +0 -1
- package/dist/packager/targetcli.d.ts +0 -7
- package/dist/packager/targetcli.d.ts.map +0 -1
- package/dist/packager/targetcli.js +0 -22
- package/dist/packager/targetcli.js.map +0 -1
- package/dist/persistence/adapter.d.ts +0 -5
- package/dist/persistence/adapter.d.ts.map +0 -1
- package/dist/persistence/adapter.js +0 -11
- package/dist/persistence/adapter.js.map +0 -1
- package/dist/persistence/drizzle.d.ts +0 -2
- package/dist/persistence/drizzle.d.ts.map +0 -1
- package/dist/persistence/drizzle.js +0 -12
- package/dist/persistence/drizzle.js.map +0 -1
- package/dist/persistence/memory.d.ts +0 -2
- package/dist/persistence/memory.d.ts.map +0 -1
- package/dist/persistence/memory.js +0 -27
- package/dist/persistence/memory.js.map +0 -1
- package/dist/persistence/migrations.d.ts +0 -19
- package/dist/persistence/migrations.d.ts.map +0 -1
- package/dist/persistence/migrations.js +0 -13
- package/dist/persistence/migrations.js.map +0 -1
- package/dist/persistence/prisma.d.ts +0 -2
- package/dist/persistence/prisma.d.ts.map +0 -1
- package/dist/persistence/prisma.js +0 -25
- package/dist/persistence/prisma.js.map +0 -1
- package/dist/persistence/schema.d.ts +0 -63
- package/dist/persistence/schema.d.ts.map +0 -1
- package/dist/persistence/schema.js +0 -28
- package/dist/persistence/schema.js.map +0 -1
- package/dist/persistence/sql.d.ts +0 -3
- package/dist/persistence/sql.d.ts.map +0 -1
- package/dist/persistence/sql.js +0 -37
- package/dist/persistence/sql.js.map +0 -1
- package/dist/protocol/blocks.d.ts +0 -10
- package/dist/protocol/blocks.d.ts.map +0 -1
- package/dist/protocol/blocks.js +0 -26
- package/dist/protocol/blocks.js.map +0 -1
- package/dist/protocol/json.d.ts +0 -6
- package/dist/protocol/json.d.ts.map +0 -1
- package/dist/protocol/json.js +0 -6
- package/dist/protocol/json.js.map +0 -1
- package/dist/protocol/ndjson.d.ts +0 -3
- package/dist/protocol/ndjson.d.ts.map +0 -1
- package/dist/protocol/ndjson.js +0 -20
- package/dist/protocol/ndjson.js.map +0 -1
- package/dist/protocol/sse.d.ts +0 -7
- package/dist/protocol/sse.d.ts.map +0 -1
- package/dist/protocol/sse.js +0 -25
- package/dist/protocol/sse.js.map +0 -1
- package/dist/proxy/pool.d.ts +0 -9
- package/dist/proxy/pool.d.ts.map +0 -1
- package/dist/proxy/pool.js +0 -27
- package/dist/proxy/pool.js.map +0 -1
- package/dist/queue/idempotency.d.ts +0 -10
- package/dist/queue/idempotency.d.ts.map +0 -1
- package/dist/queue/idempotency.js +0 -13
- package/dist/queue/idempotency.js.map +0 -1
- package/dist/queue/persistent.d.ts +0 -14
- package/dist/queue/persistent.d.ts.map +0 -1
- package/dist/queue/persistent.js +0 -66
- package/dist/queue/persistent.js.map +0 -1
- package/dist/queue/queue.d.ts +0 -7
- package/dist/queue/queue.d.ts.map +0 -1
- package/dist/queue/queue.js +0 -55
- package/dist/queue/queue.js.map +0 -1
- package/dist/queue/saga.d.ts +0 -5
- package/dist/queue/saga.d.ts.map +0 -1
- package/dist/queue/saga.js +0 -20
- package/dist/queue/saga.js.map +0 -1
- package/dist/release/assets.d.ts +0 -144
- package/dist/release/assets.d.ts.map +0 -1
- package/dist/release/assets.js +0 -157
- package/dist/release/assets.js.map +0 -1
- package/dist/release/evidence.d.ts +0 -92
- package/dist/release/evidence.d.ts.map +0 -1
- package/dist/release/evidence.js +0 -148
- package/dist/release/evidence.js.map +0 -1
- package/dist/release/verify.d.ts +0 -12
- package/dist/release/verify.d.ts.map +0 -1
- package/dist/release/verify.js +0 -112
- package/dist/release/verify.js.map +0 -1
- package/dist/runners/chain.d.ts +0 -125
- package/dist/runners/chain.d.ts.map +0 -1
- package/dist/runners/chain.js +0 -95
- package/dist/runners/chain.js.map +0 -1
- package/dist/runners/health.d.ts +0 -36
- package/dist/runners/health.d.ts.map +0 -1
- package/dist/runners/health.js +0 -26
- package/dist/runners/health.js.map +0 -1
- package/dist/runners/heartbeat.d.ts +0 -23
- package/dist/runners/heartbeat.d.ts.map +0 -1
- package/dist/runners/heartbeat.js +0 -29
- package/dist/runners/heartbeat.js.map +0 -1
- package/dist/runners/inprocess.d.ts +0 -17
- package/dist/runners/inprocess.d.ts.map +0 -1
- package/dist/runners/inprocess.js +0 -20
- package/dist/runners/inprocess.js.map +0 -1
- package/dist/runners/scheduler.d.ts +0 -5
- package/dist/runners/scheduler.d.ts.map +0 -1
- package/dist/runners/scheduler.js +0 -19
- package/dist/runners/scheduler.js.map +0 -1
- package/dist/runtime/abort.d.ts +0 -8
- package/dist/runtime/abort.d.ts.map +0 -1
- package/dist/runtime/abort.js +0 -13
- package/dist/runtime/abort.js.map +0 -1
- package/dist/runtime/compatibility.d.ts +0 -37
- package/dist/runtime/compatibility.d.ts.map +0 -1
- package/dist/runtime/compatibility.js +0 -10
- package/dist/runtime/compatibility.js.map +0 -1
- package/dist/runtime/detect.d.ts +0 -13
- package/dist/runtime/detect.d.ts.map +0 -1
- package/dist/runtime/detect.js +0 -18
- package/dist/runtime/detect.js.map +0 -1
- package/dist/runtime/engine.d.ts +0 -20
- package/dist/runtime/engine.d.ts.map +0 -1
- package/dist/runtime/engine.js +0 -61
- package/dist/runtime/engine.js.map +0 -1
- package/dist/runtime/retry.d.ts +0 -19
- package/dist/runtime/retry.d.ts.map +0 -1
- package/dist/runtime/retry.js +0 -54
- package/dist/runtime/retry.js.map +0 -1
- package/dist/runtime/worker.d.ts +0 -10
- package/dist/runtime/worker.d.ts.map +0 -1
- package/dist/runtime/worker.js +0 -25
- package/dist/runtime/worker.js.map +0 -1
- package/dist/scrape/cache.d.ts +0 -45
- package/dist/scrape/cache.d.ts.map +0 -1
- package/dist/scrape/cache.js +0 -45
- package/dist/scrape/cache.js.map +0 -1
- package/dist/scrape/crawl.d.ts +0 -47
- package/dist/scrape/crawl.d.ts.map +0 -1
- package/dist/scrape/crawl.js +0 -114
- package/dist/scrape/crawl.js.map +0 -1
- package/dist/scrape/extract.d.ts +0 -63
- package/dist/scrape/extract.d.ts.map +0 -1
- package/dist/scrape/extract.js +0 -47
- package/dist/scrape/extract.js.map +0 -1
- package/dist/scrape/normalize.d.ts +0 -52
- package/dist/scrape/normalize.d.ts.map +0 -1
- package/dist/scrape/normalize.js +0 -102
- package/dist/scrape/normalize.js.map +0 -1
- package/dist/scrape/robots.d.ts +0 -37
- package/dist/scrape/robots.d.ts.map +0 -1
- package/dist/scrape/robots.js +0 -71
- package/dist/scrape/robots.js.map +0 -1
- package/dist/scrape/schema.d.ts +0 -23
- package/dist/scrape/schema.d.ts.map +0 -1
- package/dist/scrape/schema.js +0 -92
- package/dist/scrape/schema.js.map +0 -1
- package/dist/scrape/scraper.d.ts +0 -6
- package/dist/scrape/scraper.d.ts.map +0 -1
- package/dist/scrape/scraper.js +0 -46
- package/dist/scrape/scraper.js.map +0 -1
- package/dist/scrape/semantic.d.ts +0 -25
- package/dist/scrape/semantic.d.ts.map +0 -1
- package/dist/scrape/semantic.js +0 -27
- package/dist/scrape/semantic.js.map +0 -1
- package/dist/server/node.d.ts +0 -7
- package/dist/server/node.d.ts.map +0 -1
- package/dist/server/node.js.map +0 -1
- package/dist/sessions/file.d.ts +0 -25
- package/dist/sessions/file.d.ts.map +0 -1
- package/dist/sessions/file.js +0 -13
- package/dist/sessions/file.js.map +0 -1
- package/dist/sessions/replay.d.ts +0 -9
- package/dist/sessions/replay.d.ts.map +0 -1
- package/dist/sessions/replay.js +0 -70
- package/dist/sessions/replay.js.map +0 -1
- package/dist/sessions/store.d.ts +0 -25
- package/dist/sessions/store.d.ts.map +0 -1
- package/dist/sessions/store.js +0 -13
- package/dist/sessions/store.js.map +0 -1
- package/dist/storage/adapter.d.ts +0 -5
- package/dist/storage/adapter.d.ts.map +0 -1
- package/dist/storage/adapter.js +0 -11
- package/dist/storage/adapter.js.map +0 -1
- package/dist/storage/cache.d.ts +0 -23
- package/dist/storage/cache.d.ts.map +0 -1
- package/dist/storage/cache.js +0 -79
- package/dist/storage/cache.js.map +0 -1
- package/dist/storage/checksum.d.ts +0 -3
- package/dist/storage/checksum.d.ts.map +0 -1
- package/dist/storage/checksum.js +0 -19
- package/dist/storage/checksum.js.map +0 -1
- package/dist/storage/chunked.d.ts +0 -21
- package/dist/storage/chunked.d.ts.map +0 -1
- package/dist/storage/chunked.js +0 -67
- package/dist/storage/chunked.js.map +0 -1
- package/dist/storage/content.d.ts +0 -24
- package/dist/storage/content.d.ts.map +0 -1
- package/dist/storage/content.js +0 -44
- package/dist/storage/content.js.map +0 -1
- package/dist/storage/filehosting.d.ts +0 -2
- package/dist/storage/filehosting.d.ts.map +0 -1
- package/dist/storage/filehosting.js +0 -24
- package/dist/storage/filehosting.js.map +0 -1
- package/dist/storage/githubcontents.d.ts +0 -2
- package/dist/storage/githubcontents.d.ts.map +0 -1
- package/dist/storage/githubcontents.js +0 -29
- package/dist/storage/githubcontents.js.map +0 -1
- package/dist/storage/index.d.ts +0 -12
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -12
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/local.d.ts +0 -2
- package/dist/storage/local.d.ts.map +0 -1
- package/dist/storage/local.js +0 -72
- package/dist/storage/local.js.map +0 -1
- package/dist/storage/memory.d.ts +0 -6
- package/dist/storage/memory.d.ts.map +0 -1
- package/dist/storage/memory.js +0 -36
- package/dist/storage/memory.js.map +0 -1
- package/dist/storage/pool.d.ts +0 -95
- package/dist/storage/pool.d.ts.map +0 -1
- package/dist/storage/pool.js +0 -202
- package/dist/storage/pool.js.map +0 -1
- package/dist/storage/s3compatible.d.ts +0 -3
- package/dist/storage/s3compatible.d.ts.map +0 -1
- package/dist/storage/s3compatible.js +0 -70
- package/dist/storage/s3compatible.js.map +0 -1
- package/dist/storage/sync.d.ts +0 -47
- package/dist/storage/sync.d.ts.map +0 -1
- package/dist/storage/sync.js +0 -75
- package/dist/storage/sync.js.map +0 -1
- package/dist/surfaces/adapters.d.ts +0 -97
- package/dist/surfaces/adapters.d.ts.map +0 -1
- package/dist/surfaces/adapters.js +0 -50
- package/dist/surfaces/adapters.js.map +0 -1
- package/dist/surfaces/controls.d.ts +0 -18
- package/dist/surfaces/controls.d.ts.map +0 -1
- package/dist/surfaces/controls.js +0 -45
- package/dist/surfaces/controls.js.map +0 -1
- package/dist/surfaces/manifest.d.ts +0 -68
- package/dist/surfaces/manifest.d.ts.map +0 -1
- package/dist/surfaces/manifest.js +0 -42
- package/dist/surfaces/manifest.js.map +0 -1
- package/dist/surfaces/n8n.d.ts +0 -25
- package/dist/surfaces/n8n.d.ts.map +0 -1
- package/dist/surfaces/n8n.js +0 -31
- package/dist/surfaces/n8n.js.map +0 -1
- package/dist/surfaces/operations.d.ts +0 -32
- package/dist/surfaces/operations.d.ts.map +0 -1
- package/dist/surfaces/operations.js +0 -53
- package/dist/surfaces/operations.js.map +0 -1
- package/dist/surfaces/requirements.d.ts +0 -29
- package/dist/surfaces/requirements.d.ts.map +0 -1
- package/dist/surfaces/requirements.js +0 -50
- package/dist/surfaces/requirements.js.map +0 -1
- package/dist/surfaces/targets.d.ts +0 -196
- package/dist/surfaces/targets.d.ts.map +0 -1
- package/dist/surfaces/targets.js +0 -27
- package/dist/surfaces/targets.js.map +0 -1
- package/dist/webhook/delivery.d.ts +0 -18
- package/dist/webhook/delivery.d.ts.map +0 -1
- package/dist/webhook/delivery.js +0 -36
- package/dist/webhook/delivery.js.map +0 -1
- package/dist/webhook/receiver.d.ts +0 -26
- package/dist/webhook/receiver.d.ts.map +0 -1
- package/dist/webhook/receiver.js +0 -24
- package/dist/webhook/receiver.js.map +0 -1
- package/dist/webhook/signature.d.ts +0 -3
- package/dist/webhook/signature.d.ts.map +0 -1
- package/dist/webhook/signature.js +0 -7
- package/dist/webhook/signature.js.map +0 -1
- package/dist/workflow/manifest.d.ts +0 -22
- package/dist/workflow/manifest.d.ts.map +0 -1
- package/dist/workflow/manifest.js +0 -21
- package/dist/workflow/manifest.js.map +0 -1
- package/dist/workflow/registry.d.ts +0 -7
- package/dist/workflow/registry.d.ts.map +0 -1
- package/dist/workflow/registry.js +0 -18
- package/dist/workflow/registry.js.map +0 -1
- package/dist/workflow/templates.d.ts +0 -6
- package/dist/workflow/templates.d.ts.map +0 -1
- package/dist/workflow/templates.js +0 -18
- package/dist/workflow/templates.js.map +0 -1
- package/dist/workflow/triggers.d.ts +0 -64
- package/dist/workflow/triggers.d.ts.map +0 -1
- package/dist/workflow/triggers.js +0 -99
- package/dist/workflow/triggers.js.map +0 -1
- package/docs/logs/.gitkeep +0 -0
- package/docs/plans/00.index.md +0 -50
- package/docs/plans/01.architecture.md +0 -86
- package/docs/plans/02.research.computer.use.md +0 -58
- package/docs/plans/03.research.captcha.bypass.md +0 -68
- package/docs/plans/04.research.sandbox.ai.md +0 -52
- package/docs/plans/05.capture.platform.md +0 -57
- package/docs/plans/06.dependencies.md +0 -97
- package/docs/plans/07.captcha.test.page.md +0 -41
- package/docs/plans/08.production.infra.md +0 -70
- package/docs/plans/09.database.schema.md +0 -121
- package/docs/plans/10.cloudinary.storage.md +0 -57
- package/docs/plans/11.movement.logs.json.md +0 -72
- package/docs/plans/12.research.atlas.agent.browser.md +0 -79
- package/docs/plans/13.research.anti.detection.md +0 -898
- package/docs/plans/14.research.proxy.md +0 -1495
- package/docs/plans/15.research.retry.rate.limit.md +0 -1958
- package/docs/plans/16.research.crawling.md +0 -1417
- package/docs/plans/17.research.caching.md +0 -1610
- package/docs/plans/18.research.content.extraction.md +0 -1952
- package/docs/plans/19.research.errors.events.md +0 -1523
- package/docs/plans/20.research.zod.validation.md +0 -1350
- package/docs/plans/21.research.batch.concurrency.md +0 -1888
- package/docs/plans/22.research.universal.runtime.md +0 -944
- package/docs/plans/23.research.ai.integration.md +0 -1465
- package/docs/plans/24.research.memory.persistence.md +0 -1979
- package/docs/plans/25.research.server.api.md +0 -342
- package/docs/plans/26.research.compilation.md +0 -249
- package/docs/plans/27.research.html.parsing.md +0 -251
- package/docs/plans/28.action.plan.md +0 -50
- package/docs/plans/29.api.reference.md +0 -174
- package/docs/plans/30.architecture.plan.md +0 -94
- package/docs/plans/31.auditoria.dados.md +0 -163
- package/docs/plans/32.bots.automacao.computacional.md +0 -214
- package/docs/plans/33.bots.codigo.revisao.md +0 -220
- package/docs/plans/34.bots.seguranca.cicd.md +0 -366
- package/docs/plans/35.comparativo.concorrencia.md +0 -464
- package/docs/plans/36.computational.memory.md +0 -340
- package/docs/plans/37.deploystrategy.md +0 -394
- package/docs/plans/38.flow.md +0 -155
- package/docs/plans/39.multi.platform.bot.md +0 -252
- package/docs/plans/40.npm.publish.md +0 -250
- package/docs/plans/41.o.que.falta.md +0 -407
- package/docs/plans/42.pesquisa.concorrencia.md +0 -721
- package/docs/plans/43.plan.universal.architecture.md +0 -496
- package/docs/plans/44.reference.md +0 -100
- package/docs/plans/45.robotarchitecture.md +0 -237
- package/docs/plans/46.scdnintegration.md +0 -284
- package/docs/plans/47.multiforge.readme.md +0 -129
- package/docs/plans/48.theory.v4.repo.os.md +0 -152
- package/docs/plans/49.third.party.infra.md +0 -12
- package/docs/plans/50.file.as.compute.md +0 -39
- package/docs/plans/51.architecture.virtual.processor.md +0 -80
- package/docs/plans/52.manifesto.v8.md +0 -11
- package/docs/plans/58.cdn.list.md +0 -23
- package/docs/plans/59.sql.frameworks.md +0 -33
- package/docs/plans/60.sql.thirdparty.md +0 -26
- package/docs/plans/61.objective.multiforge.md +0 -63
- package/docs/plans/62.huggingface.upload.md +0 -26
- package/docs/plans/63.kaggle.upload.md +0 -24
- package/docs/plans/64.npm.storage.md +0 -30
- package/docs/plans/65.rclone.terabox.md +0 -32
- package/docs/plans/66.buckets.and.models.todo.md +0 -14
- package/docs/plans/67.database.todo.md +0 -13
- package/docs/plans/68.deploy.packages.todo.md +0 -12
- package/docs/plans/69.report.human.operator.md +0 -133
- package/docs/plans/70.report.brain2qwerty.ems.md +0 -135
- package/docs/plans/71.report.hd.infinito.vram.md +0 -155
- package/docs/plans/72.plan.hd.infinito.node.md +0 -146
- package/docs/plans/73.plan.scifi.repos.md +0 -125
- package/docs/plans/74.000.manifesto.v8.flat.2..md +0 -11
- package/docs/plans/README.md +0 -489
- package/docs/plans/aggregate_platforms.mjs +0 -146
- package/docs/plans/examplesession.json +0 -36
- package/docs/plans/missing-facts.md +0 -192
- package/docs/plans/models.md +0 -64
- package/docs/plans/organize.cjs +0 -270
- package/docs/plans/platforms.md +0 -2887
- package/docs/plans/sites.md +0 -31322
- package/docs/sources/farm.py +0 -117
- package/docs/sources/html/saddle1.html +0 -132
- package/docs/sources/html/saddle2.html +0 -157
- package/docs/sources/html/saddle3.html +0 -119
- package/docs/sources/html/saddle4.html +0 -144
- package/docs/sources/html/saddle5.html +0 -72
- package/docs/sources/html/saddle6.html +0 -171
- package/docs/sources/html/saddle7.html +0 -236
- package/docs/sources/saddle.ts +0 -74
- package/docs/sources/schema.prisma +0 -88
- package/docs/sources/script.sh +0 -64
- package/docs/sources/workflows.yml +0 -458
- package/docs/talks1/_body.txt +0 -14
- package/docs/talks1/_index.md +0 -15
- package/docs/talks1/_screenshot.png +0 -0
- package/docs/talks1/assistant-01.md +0 -5
- package/docs/talks1/assistant-02.md +0 -5
- package/docs/talks1/assistant-03.md +0 -531
- package/docs/talks1/assistant-04.md +0 -26
- package/docs/talks1/assistant-05.md +0 -774
- package/docs/talks1/assistant-06.md +0 -1718
- package/docs/talks1/scrape-share.cjs +0 -185
- package/docs/talks1/scrape-share.ts +0 -183
- package/docs/talks1/user-01.md +0 -3
- package/docs/talks1/user-02.md +0 -3
- package/docs/talks1/user-03.md +0 -88
- package/docs/talks1/user-04.md +0 -3
- package/docs/talks1/user-05.md +0 -3
- package/docs/talks1/user-06.md +0 -88
- package/docs/talks1/user-07.md +0 -88
- package/docs/talks2/_body.txt +0 -14
- package/docs/talks2/_index.md +0 -16
- package/docs/talks2/_screenshot.png +0 -0
- package/docs/talks2/assistant-01.md +0 -5
- package/docs/talks2/assistant-02.md +0 -5
- package/docs/talks2/assistant-03.md +0 -424
- package/docs/talks2/assistant-04.md +0 -598
- package/docs/talks2/assistant-05.md +0 -1280
- package/docs/talks2/assistant-06.md +0 -1227
- package/docs/talks2/assistant-07.md +0 -1252
- package/docs/talks2/user-01.md +0 -3
- package/docs/talks2/user-02.md +0 -3
- package/docs/talks2/user-03.md +0 -88
- package/docs/talks2/user-04.md +0 -88
- package/docs/talks2/user-05.md +0 -88
- package/docs/talks2/user-06.md +0 -88
- package/docs/talks2/user-07.md +0 -3
- package/docs/talks3/_body.txt +0 -467
- package/docs/talks3/_index.md +0 -10
- package/docs/talks3/_screenshot.png +0 -0
- package/docs/talks3/assistant-01.md +0 -417
- package/docs/talks3/assistant-02.md +0 -417
- package/docs/talks3/assistant-03.md +0 -29
- package/docs/talks3/assistant-04.md +0 -727
- package/docs/talks3/user-01.md +0 -88
- package/docs/talks3/user-02.md +0 -88
- package/docs/talks3/user-03.md +0 -3
- package/docs/talks3/user-04.md +0 -3
- package/docs/talks4/_body.txt +0 -14
- package/docs/talks4/_index.md +0 -12
- package/docs/talks4/_screenshot.png +0 -0
- package/docs/talks4/assistant-01.md +0 -5
- package/docs/talks4/assistant-02.md +0 -5
- package/docs/talks4/assistant-03.md +0 -35
- package/docs/talks4/assistant-04.md +0 -512
- package/docs/talks4/assistant-05.md +0 -599
- package/docs/talks4/user-01.md +0 -3
- package/docs/talks4/user-02.md +0 -3
- package/docs/talks4/user-03.md +0 -88
- package/docs/talks4/user-04.md +0 -88
- package/docs/talks4/user-05.md +0 -7
- package/docs/talks5/_body.txt +0 -14
- package/docs/talks5/_index.md +0 -13
- package/docs/talks5/_screenshot.png +0 -0
- package/docs/talks5/assistant-01.md +0 -5
- package/docs/talks5/assistant-02.md +0 -5
- package/docs/talks5/assistant-03.md +0 -690
- package/docs/talks5/assistant-04.md +0 -758
- package/docs/talks5/assistant-05.md +0 -974
- package/docs/talks5/user-01.md +0 -3
- package/docs/talks5/user-02.md +0 -3
- package/docs/talks5/user-03.md +0 -105
- package/docs/talks5/user-04.md +0 -105
- package/docs/talks5/user-05.md +0 -63
- package/docs/talks5/user-06.md +0 -105
- package/docs/talks6/_body.txt +0 -14
- package/docs/talks6/_index.md +0 -9
- package/docs/talks6/_screenshot.png +0 -0
- package/docs/talks6/assistant-01.md +0 -5
- package/docs/talks6/assistant-02.md +0 -5
- package/docs/talks6/assistant-03.md +0 -1499
- package/docs/talks6/user-01.md +0 -3
- package/docs/talks6/user-02.md +0 -3
- package/docs/talks6/user-03.md +0 -88
- package/docs/talks6/user-04.md +0 -88
- package/docs/talks7/_body.txt +0 -14
- package/docs/talks7/_index.md +0 -10
- package/docs/talks7/_screenshot.png +0 -0
- package/docs/talks7/assistant-01.md +0 -5
- package/docs/talks7/assistant-02.md +0 -5
- package/docs/talks7/assistant-03.md +0 -523
- package/docs/talks7/assistant-04.md +0 -617
- package/docs/talks7/user-01.md +0 -3
- package/docs/talks7/user-02.md +0 -3
- package/docs/talks7/user-03.md +0 -105
- package/docs/talks7/user-04.md +0 -67
- package/docs/talks8/conversa1.txt +0 -1322
- package/docs/talks8/conversa2.txt +0 -237
- 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
- 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
- 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
- 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
- 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
- package/docs/talks9/README (2).md +0 -489
- package/docs/talks9/README.md +0 -198
- 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
- package/docs/talks9/conversa.txt +0 -544
- package/docs/talks9/other (2).md +0 -39
- package/docs/talks9/other.md +0 -57
- package/docs/talks9/outro.txt +0 -24
- /package/{extension/README.md → docs/extension.md} +0 -0
|
@@ -1,1252 +0,0 @@
|
|
|
1
|
-
# assistant
|
|
2
|
-
|
|
3
|
-
[Thinking] The user is asking me to do more research (10+ searches) and provide a very detailed step-by-step plan. They want me to read each line carefully and provide comprehensive implementation details. Let me do extensive research on all the specific topics they mentioned.
|
|
4
|
-
Let me search for:
|
|
5
|
-
|
|
6
|
-
GitHub Actions cron jobs for sandbox creation
|
|
7
|
-
GitLab CI scheduled pipelines
|
|
8
|
-
Forgejo/Gitea Actions cron
|
|
9
|
-
HuggingFace Spaces API for programmatic creation
|
|
10
|
-
Kaggle API for notebook execution
|
|
11
|
-
ModelScope API for studio creation
|
|
12
|
-
Drizzle ORM with SQLite in-memory
|
|
13
|
-
Prisma with SQLite in-memory
|
|
14
|
-
memfs usage patterns
|
|
15
|
-
zram setup in Docker containers
|
|
16
|
-
Docker memory limits in CI/CD
|
|
17
|
-
npm package publishing with CDN
|
|
18
|
-
|
|
19
|
-
[Thinking] Now I have comprehensive information. Let me search for a few more specific topics.
|
|
20
|
-
|
|
21
|
-
[Thinking] Now I have comprehensive information from 10+ searches. Let me compile this into a detailed step-by-step plan.
|
|
22
|
-
|
|
23
|
-
[Thinking] Now let me compile the comprehensive plan based on all the research I've done.
|
|
24
|
-
|
|
25
|
-
[Thinking] I've completed the comprehensive plan with 10+ searches. Let me now provide a summary.
|
|
26
|
-
|
|
27
|
-
Agora tenho mais de 10 pesquisas completas. Vou compilar tudo em um plano passo a passo detalhado.
|
|
28
|
-
|
|
29
|
-
PLANO FINAL COMPLETO - PASSO A PASSO DETALHADO
|
|
30
|
-
|
|
31
|
-
FASE 1: ESTRUTURA DO PROJETO
|
|
32
|
-
sandbox-platform/
|
|
33
|
-
├── package.json # Pacote npm principal
|
|
34
|
-
├── tsconfig.json # Config TypeScript
|
|
35
|
-
├── wrangler.toml # Cloudflare Workers
|
|
36
|
-
├── src/
|
|
37
|
-
│ ├── index.ts # Entry point (Cloudflare Worker)
|
|
38
|
-
│ ├── api/
|
|
39
|
-
│ │ ├── sandbox.ts # CRUD de sandboxes
|
|
40
|
-
│ │ ├── memory.ts # Gerenciamento de memória
|
|
41
|
-
│ │ └── webhook.ts # Webhooks de pipeline
|
|
42
|
-
│ ├── orchestrator/
|
|
43
|
-
│ │ ├── index.ts # Orquestrador multi-plataforma
|
|
44
|
-
│ │ ├── github.ts # GitHub Actions API
|
|
45
|
-
│ │ ├── gitlab.ts # GitLab CI API
|
|
46
|
-
│ │ ├── forgejo.ts # Forgejo/Gitea API
|
|
47
|
-
│ │ ├── huggingface.ts # HuggingFace Spaces API
|
|
48
|
-
│ │ └── kaggle.ts # Kaggle API
|
|
49
|
-
│ ├── memory/
|
|
50
|
-
│ │ ├── virtual-memory.ts # memfs + Volume
|
|
51
|
-
│ │ ├── memory-bridge.ts # Bridge storage→RAM
|
|
52
|
-
│ │ ├── zram.ts # zram manager
|
|
53
|
-
│ │ ├── tmpfs.ts # tmpfs manager
|
|
54
|
-
│ │ └── github-fs.ts # GitHub como filesystem
|
|
55
|
-
│ ├── db/
|
|
56
|
-
│ │ ├── schema.ts # Drizzle schema
|
|
57
|
-
│ │ └── index.ts # SQLite :memory:
|
|
58
|
-
│ └── utils/
|
|
59
|
-
│ ├── crypto.ts
|
|
60
|
-
│ └── logger.ts
|
|
61
|
-
├── workflows/ # Templates de workflow
|
|
62
|
-
│ ├── github-sandbox.yml
|
|
63
|
-
│ ├── gitlab-sandbox.yml
|
|
64
|
-
│ ├── forgejo-sandbox.yml
|
|
65
|
-
│ └── huggingface-dockerfile
|
|
66
|
-
├── packages/
|
|
67
|
-
│ └── core/ # Pacote npm para CDN
|
|
68
|
-
│ ├── package.json
|
|
69
|
-
│ └── src/
|
|
70
|
-
│ └── index.ts
|
|
71
|
-
└── README.md
|
|
72
|
-
|
|
73
|
-
FASE 2: CONFIGURAÇÃO DO BANCO DE DADOS (SQLite in-memory + Drizzle)
|
|
74
|
-
Passo 2.1: Schema do banco
|
|
75
|
-
// src/db/schema.ts
|
|
76
|
-
import { sqliteTable, text, integer, blob } from 'drizzle-orm/sqlite-core';
|
|
77
|
-
|
|
78
|
-
export const sandboxes = sqliteTable('sandboxes', {
|
|
79
|
-
id: text('id').primaryKey(),
|
|
80
|
-
userId: text('user_id').notNull(),
|
|
81
|
-
platform: text('platform').notNull(),
|
|
82
|
-
status: text('status').notNull(),
|
|
83
|
-
ramLimit: integer('ram_limit').notNull(),
|
|
84
|
-
cpuLimit: integer('cpu_limit').notNull(),
|
|
85
|
-
gpuEnabled: integer('gpu_enabled', { mode: 'boolean' }).default(false),
|
|
86
|
-
repoUrl: text('repo_url'),
|
|
87
|
-
workflowId: text('workflow_id'),
|
|
88
|
-
createdAt: text('created_at').notNull(),
|
|
89
|
-
expiresAt: text('expires_at'),
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
export const memoryRegions = sqliteTable('memory_regions', {
|
|
93
|
-
id: text('id').primaryKey(),
|
|
94
|
-
sandboxId: text('sandbox_id').references(() => sandboxes.id),
|
|
95
|
-
type: text('type').notNull(),
|
|
96
|
-
mountPoint: text('mount_point').notNull(),
|
|
97
|
-
sizeBytes: integer('size_bytes').notNull(),
|
|
98
|
-
usedBytes: integer('used_bytes').default(0),
|
|
99
|
-
compressedSize: integer('compressed_size'),
|
|
100
|
-
storagePath: text('storage_path'),
|
|
101
|
-
createdAt: text('created_at').notNull(),
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
export const packages = sqliteTable('packages', {
|
|
105
|
-
id: text('id').primaryKey(),
|
|
106
|
-
name: text('name').notNull(),
|
|
107
|
-
version: text('version').notNull(),
|
|
108
|
-
registry: text('registry').notNull(),
|
|
109
|
-
cdnUrl: text('cdn_url'),
|
|
110
|
-
sizeBytes: integer('size_bytes').notNull(),
|
|
111
|
-
cachedInRam: integer('cached_in_ram', { mode: 'boolean' }).default(false),
|
|
112
|
-
});
|
|
113
|
-
Passo 2.2: Conexão com SQLite in-memory
|
|
114
|
-
// src/db/index.ts
|
|
115
|
-
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
|
116
|
-
import Database from 'better-sqlite3';
|
|
117
|
-
import * as schema from './schema';
|
|
118
|
-
|
|
119
|
-
// SQLite EM MEMÓRIA - zero I/O disco
|
|
120
|
-
const sqlite = new Database(':memory:');
|
|
121
|
-
|
|
122
|
-
// Criar tabelas
|
|
123
|
-
sqlite.exec(`
|
|
124
|
-
CREATE TABLE IF NOT EXISTS sandboxes (
|
|
125
|
-
id TEXT PRIMARY KEY,
|
|
126
|
-
user_id TEXT NOT NULL,
|
|
127
|
-
platform TEXT NOT NULL,
|
|
128
|
-
status TEXT NOT NULL,
|
|
129
|
-
ram_limit INTEGER NOT NULL,
|
|
130
|
-
cpu_limit INTEGER NOT NULL,
|
|
131
|
-
gpu_enabled INTEGER DEFAULT 0,
|
|
132
|
-
repo_url TEXT,
|
|
133
|
-
workflow_id TEXT,
|
|
134
|
-
created_at TEXT NOT NULL,
|
|
135
|
-
expires_at TEXT
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
CREATE TABLE IF NOT EXISTS memory_regions (
|
|
139
|
-
id TEXT PRIMARY KEY,
|
|
140
|
-
sandbox_id TEXT REFERENCES sandboxes(id),
|
|
141
|
-
type TEXT NOT NULL,
|
|
142
|
-
mount_point TEXT NOT NULL,
|
|
143
|
-
size_bytes INTEGER NOT NULL,
|
|
144
|
-
used_bytes INTEGER DEFAULT 0,
|
|
145
|
-
compressed_size INTEGER,
|
|
146
|
-
storage_path TEXT,
|
|
147
|
-
created_at TEXT NOT NULL
|
|
148
|
-
);
|
|
149
|
-
|
|
150
|
-
CREATE TABLE IF NOT EXISTS packages (
|
|
151
|
-
id TEXT PRIMARY KEY,
|
|
152
|
-
name TEXT NOT NULL,
|
|
153
|
-
version TEXT NOT NULL,
|
|
154
|
-
registry TEXT NOT NULL,
|
|
155
|
-
cdn_url TEXT,
|
|
156
|
-
size_bytes INTEGER NOT NULL,
|
|
157
|
-
cached_in_ram INTEGER DEFAULT 0
|
|
158
|
-
);
|
|
159
|
-
`);
|
|
160
|
-
|
|
161
|
-
export const db = drizzle(sqlite, { schema });
|
|
162
|
-
|
|
163
|
-
FASE 3: MEMÓRIA VIRTUAL (memfs + Bridge)
|
|
164
|
-
Passo 3.1: Virtual Memory com memfs
|
|
165
|
-
// src/memory/virtual-memory.ts
|
|
166
|
-
import { fs, Volume } from 'memfs';
|
|
167
|
-
|
|
168
|
-
export class VirtualMemory {
|
|
169
|
-
private volumes: Map<string, ReturnType<typeof Volume.create>> = new Map();
|
|
170
|
-
|
|
171
|
-
constructor() {
|
|
172
|
-
// Criar volumes em RAM
|
|
173
|
-
this.createVolume('system', 8 * 1024 * 1024 * 1024); // 8 GB
|
|
174
|
-
this.createVolume('workspace', 4 * 1024 * 1024 * 1024); // 4 GB
|
|
175
|
-
this.createVolume('packages', 2 * 1024 * 1024 * 1024); // 2 GB
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
private createVolume(name: string, sizeBytes: number) {
|
|
179
|
-
const vol = Volume.create({ size: sizeBytes });
|
|
180
|
-
this.volumes.set(name, vol);
|
|
181
|
-
fs.mountVol(`/${name}`, vol);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
async read(path: string): Promise<Buffer> {
|
|
185
|
-
return new Promise((resolve, reject) => {
|
|
186
|
-
fs.readFile(path, (err, data) => {
|
|
187
|
-
if (err) reject(err);
|
|
188
|
-
else resolve(data as Buffer);
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
async write(path: string, data: Buffer): Promise<void> {
|
|
194
|
-
return new Promise((resolve, reject) => {
|
|
195
|
-
fs.writeFile(path, data, (err) => {
|
|
196
|
-
if (err) reject(err);
|
|
197
|
-
else resolve();
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
async cachePackage(name: string, version: string, data: Buffer): Promise<string> {
|
|
203
|
-
const path = `/packages/${name}@${version}.js`;
|
|
204
|
-
await this.write(path, data);
|
|
205
|
-
return path;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
async getCachedPackage(name: string, version: string): Promise<Buffer | null> {
|
|
209
|
-
const path = `/packages/${name}@${version}.js`;
|
|
210
|
-
try {
|
|
211
|
-
return await this.read(path);
|
|
212
|
-
} catch {
|
|
213
|
-
return null;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
Passo 3.2: GitHub como FileSystem (converte repo → RAM)
|
|
218
|
-
// src/memory/github-fs.ts
|
|
219
|
-
export class GitHubFileSystem {
|
|
220
|
-
private token: string;
|
|
221
|
-
private cache: Map<string, Buffer> = new Map();
|
|
222
|
-
|
|
223
|
-
constructor(token: string) {
|
|
224
|
-
this.token = token;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
async readFile(owner: string, repo: string, path: string): Promise<Buffer> {
|
|
228
|
-
const cacheKey = `${owner}/${repo}/${path}`;
|
|
229
|
-
|
|
230
|
-
if (this.cache.has(cacheKey)) {
|
|
231
|
-
return this.cache.get(cacheKey)!;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
const response = await fetch(
|
|
235
|
-
`https://api.github.com/repos/${owner}/${repo}/contents/${path}`,
|
|
236
|
-
{
|
|
237
|
-
headers: {
|
|
238
|
-
'Authorization': `token ${this.token}`,
|
|
239
|
-
'Accept': 'application/vnd.github.v3.raw',
|
|
240
|
-
},
|
|
241
|
-
}
|
|
242
|
-
);
|
|
243
|
-
|
|
244
|
-
const data = Buffer.from(await response.arrayBuffer());
|
|
245
|
-
this.cache.set(cacheKey, data);
|
|
246
|
-
|
|
247
|
-
return data;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
async listFiles(owner: string, repo: string, path: string = ''): Promise<string[]> {
|
|
251
|
-
const response = await fetch(
|
|
252
|
-
`https://api.github.com/repos/${owner}/${repo}/contents/${path}`,
|
|
253
|
-
{
|
|
254
|
-
headers: {
|
|
255
|
-
'Authorization': `token ${this.token}`,
|
|
256
|
-
},
|
|
257
|
-
}
|
|
258
|
-
);
|
|
259
|
-
|
|
260
|
-
const files = await response.json();
|
|
261
|
-
return files.map((f: any) => f.path);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
async hydrateRepo(owner: string, repo: string): Promise<Map<string, Buffer>> {
|
|
265
|
-
const files = await this.listFiles(owner, repo);
|
|
266
|
-
|
|
267
|
-
for (const file of files) {
|
|
268
|
-
await this.readFile(owner, repo, file);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
return this.cache;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
getStats(): { files: number; totalSize: number } {
|
|
275
|
-
let totalSize = 0;
|
|
276
|
-
for (const buffer of this.cache.values()) {
|
|
277
|
-
totalSize += buffer.length;
|
|
278
|
-
}
|
|
279
|
-
return {
|
|
280
|
-
files: this.cache.size,
|
|
281
|
-
totalSize,
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
FASE 4: ORQUESTRADOR MULTI-PLATAFORMA
|
|
287
|
-
Passo 4.1: GitHub Actions API
|
|
288
|
-
// src/orchestrator/github.ts
|
|
289
|
-
export class GitHubOrchestrator {
|
|
290
|
-
private token: string;
|
|
291
|
-
private org: string;
|
|
292
|
-
|
|
293
|
-
constructor(token: string, org: string) {
|
|
294
|
-
this.token = token;
|
|
295
|
-
this.org = org;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Criar repositório
|
|
299
|
-
async createRepo(name: string): Promise<string> {
|
|
300
|
-
const response = await fetch(`https://api.github.com/orgs/${this.org}/repos`, {
|
|
301
|
-
method: 'POST',
|
|
302
|
-
headers: {
|
|
303
|
-
'Authorization': `token ${this.token}`,
|
|
304
|
-
'Content-Type': 'application/json',
|
|
305
|
-
},
|
|
306
|
-
body: JSON.stringify({
|
|
307
|
-
name,
|
|
308
|
-
private: true,
|
|
309
|
-
auto_init: true,
|
|
310
|
-
}),
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
const repo = await response.json();
|
|
314
|
-
return repo.html_url;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// Criar workflow
|
|
318
|
-
async createWorkflow(repo: string, workflowName: string, content: string): Promise<void> {
|
|
319
|
-
await fetch(
|
|
320
|
-
`https://api.github.com/repos/${this.org}/${repo}/contents/.github/workflows/${workflowName}`,
|
|
321
|
-
{
|
|
322
|
-
method: 'PUT',
|
|
323
|
-
headers: {
|
|
324
|
-
'Authorization': `token ${this.token}`,
|
|
325
|
-
'Content-Type': 'application/json',
|
|
326
|
-
},
|
|
327
|
-
body: JSON.stringify({
|
|
328
|
-
message: 'Create sandbox workflow',
|
|
329
|
-
content: Buffer.from(content).toString('base64'),
|
|
330
|
-
}),
|
|
331
|
-
}
|
|
332
|
-
);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
// Disparar workflow
|
|
336
|
-
async dispatchWorkflow(repo: string, workflowName: string, inputs: Record<string, string>): Promise<string> {
|
|
337
|
-
const response = await fetch(
|
|
338
|
-
`https://api.github.com/repos/${this.org}/${repo}/actions/workflows/${workflowName}/dispatches`,
|
|
339
|
-
{
|
|
340
|
-
method: 'POST',
|
|
341
|
-
headers: {
|
|
342
|
-
'Authorization': `token ${this.token}`,
|
|
343
|
-
'Content-Type': 'application/json',
|
|
344
|
-
'Accept': 'application/vnd.github+json',
|
|
345
|
-
'X-GitHub-Api-Version': '2022-11-28',
|
|
346
|
-
},
|
|
347
|
-
body: JSON.stringify({
|
|
348
|
-
ref: 'main',
|
|
349
|
-
inputs,
|
|
350
|
-
}),
|
|
351
|
-
}
|
|
352
|
-
);
|
|
353
|
-
|
|
354
|
-
// Novo: retorna run_id (desde Feb 2026)
|
|
355
|
-
if (response.ok) {
|
|
356
|
-
const data = await response.json();
|
|
357
|
-
return data.run_id || 'unknown';
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
throw new Error(`Failed to dispatch workflow: ${response.status}`);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// Monitorar status do workflow
|
|
364
|
-
async getWorkflowRun(repo: string, runId: string): Promise<any> {
|
|
365
|
-
const response = await fetch(
|
|
366
|
-
`https://api.github.com/repos/${this.org}/${repo}/actions/runs/${runId}`,
|
|
367
|
-
{
|
|
368
|
-
headers: {
|
|
369
|
-
'Authorization': `token ${this.token}`,
|
|
370
|
-
},
|
|
371
|
-
}
|
|
372
|
-
);
|
|
373
|
-
|
|
374
|
-
return response.json();
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
// Gerar workflow YAML
|
|
378
|
-
generateWorkflow(id: string, ramLimit: number, cpuLimit: number, packages: string[]): string {
|
|
379
|
-
return `
|
|
380
|
-
name: Sandbox ${id}
|
|
381
|
-
|
|
382
|
-
on:
|
|
383
|
-
workflow_dispatch:
|
|
384
|
-
inputs:
|
|
385
|
-
ram_limit:
|
|
386
|
-
description: 'Memory limit'
|
|
387
|
-
default: '${ramLimit}M'
|
|
388
|
-
cpu_limit:
|
|
389
|
-
description: 'CPU limit'
|
|
390
|
-
default: '${cpuLimit}'
|
|
391
|
-
packages:
|
|
392
|
-
description: 'Packages to install'
|
|
393
|
-
default: '${packages.join(' ')}'
|
|
394
|
-
|
|
395
|
-
jobs:
|
|
396
|
-
sandbox:
|
|
397
|
-
runs-on: ubuntu-latest
|
|
398
|
-
|
|
399
|
-
container:
|
|
400
|
-
image: ubuntu:22.04
|
|
401
|
-
options: >-
|
|
402
|
-
--memory \${{ github.event.inputs.ram_limit }}
|
|
403
|
-
--cpus \${{ github.event.inputs.cpu_limit }}
|
|
404
|
-
--tmpfs /tmp:size=4G
|
|
405
|
-
--tmpfs /run:size=2G
|
|
406
|
-
--tmpfs /workspace:size=4G
|
|
407
|
-
|
|
408
|
-
steps:
|
|
409
|
-
- name: Setup zram
|
|
410
|
-
run: |
|
|
411
|
-
modprobe zram
|
|
412
|
-
echo lz4 > /sys/block/zram0/comp_algorithm
|
|
413
|
-
echo 8G > /sys/block/zram0/disksize
|
|
414
|
-
mkswap /dev/zram0
|
|
415
|
-
swapon /dev/zram0
|
|
416
|
-
|
|
417
|
-
- name: Setup tmpfs
|
|
418
|
-
run: |
|
|
419
|
-
mount -t tmpfs -o size=4G tmpfs /workspace
|
|
420
|
-
|
|
421
|
-
- name: Install packages
|
|
422
|
-
run: |
|
|
423
|
-
apt-get update
|
|
424
|
-
apt-get install -y \${{ github.event.inputs.packages }}
|
|
425
|
-
|
|
426
|
-
- name: Verify resources
|
|
427
|
-
run: |
|
|
428
|
-
free -h
|
|
429
|
-
df -h
|
|
430
|
-
nproc
|
|
431
|
-
|
|
432
|
-
- name: Run sandbox
|
|
433
|
-
working-directory: /workspace
|
|
434
|
-
run: |
|
|
435
|
-
echo "Sandbox ${id} is running!"
|
|
436
|
-
sleep 3600
|
|
437
|
-
`;
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
Passo 4.2: GitLab CI API
|
|
441
|
-
// src/orchestrator/gitlab.ts
|
|
442
|
-
export class GitLabOrchestrator {
|
|
443
|
-
private token: string;
|
|
444
|
-
private baseUrl: string;
|
|
445
|
-
|
|
446
|
-
constructor(token: string, baseUrl: string = 'https://gitlab.com') {
|
|
447
|
-
this.token = token;
|
|
448
|
-
this.baseUrl = baseUrl;
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// Criar projeto
|
|
452
|
-
async createProject(name: string): Promise<number> {
|
|
453
|
-
const response = await fetch(`${this.baseUrl}/api/v4/projects`, {
|
|
454
|
-
method: 'POST',
|
|
455
|
-
headers: {
|
|
456
|
-
'PRIVATE-TOKEN': this.token,
|
|
457
|
-
'Content-Type': 'application/json',
|
|
458
|
-
},
|
|
459
|
-
body: JSON.stringify({
|
|
460
|
-
name,
|
|
461
|
-
visibility: 'private',
|
|
462
|
-
}),
|
|
463
|
-
});
|
|
464
|
-
|
|
465
|
-
const project = await response.json();
|
|
466
|
-
return project.id;
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
// Criar pipeline
|
|
470
|
-
async createPipeline(projectId: number, ref: string = 'main'): Promise<number> {
|
|
471
|
-
const response = await fetch(
|
|
472
|
-
`${this.baseUrl}/api/v4/projects/${projectId}/pipeline`,
|
|
473
|
-
{
|
|
474
|
-
method: 'POST',
|
|
475
|
-
headers: {
|
|
476
|
-
'PRIVATE-TOKEN': this.token,
|
|
477
|
-
'Content-Type': 'application/json',
|
|
478
|
-
},
|
|
479
|
-
body: JSON.stringify({ ref }),
|
|
480
|
-
}
|
|
481
|
-
);
|
|
482
|
-
|
|
483
|
-
const pipeline = await response.json();
|
|
484
|
-
return pipeline.id;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
// Criar schedule
|
|
488
|
-
async createSchedule(projectId: number, cron: string, ref: string = 'main'): Promise<number> {
|
|
489
|
-
const response = await fetch(
|
|
490
|
-
`${this.baseUrl}/api/v4/projects/${projectId}/pipeline_schedules`,
|
|
491
|
-
{
|
|
492
|
-
method: 'POST',
|
|
493
|
-
headers: {
|
|
494
|
-
'PRIVATE-TOKEN': this.token,
|
|
495
|
-
'Content-Type': 'application/json',
|
|
496
|
-
},
|
|
497
|
-
body: JSON.stringify({
|
|
498
|
-
cron,
|
|
499
|
-
description: 'Sandbox schedule',
|
|
500
|
-
ref,
|
|
501
|
-
active: true,
|
|
502
|
-
}),
|
|
503
|
-
}
|
|
504
|
-
);
|
|
505
|
-
|
|
506
|
-
const schedule = await response.json();
|
|
507
|
-
return schedule.id;
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
// Rodar schedule imediatamente
|
|
511
|
-
async runSchedule(projectId: number, scheduleId: number): Promise<void> {
|
|
512
|
-
await fetch(
|
|
513
|
-
`${this.baseUrl}/api/v4/projects/${projectId}/pipeline_schedules/${scheduleId}/play`,
|
|
514
|
-
{
|
|
515
|
-
method: 'POST',
|
|
516
|
-
headers: {
|
|
517
|
-
'PRIVATE-TOKEN': this.token,
|
|
518
|
-
},
|
|
519
|
-
}
|
|
520
|
-
);
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
// Criar arquivo .gitlab-ci.yml
|
|
524
|
-
async createCIFile(projectId: number, content: string): Promise<void> {
|
|
525
|
-
await fetch(
|
|
526
|
-
`${this.baseUrl}/api/v4/projects/${projectId}/repository/files/.gitlab-ci.yml`,
|
|
527
|
-
{
|
|
528
|
-
method: 'POST',
|
|
529
|
-
headers: {
|
|
530
|
-
'PRIVATE-TOKEN': this.token,
|
|
531
|
-
'Content-Type': 'application/json',
|
|
532
|
-
},
|
|
533
|
-
body: JSON.stringify({
|
|
534
|
-
branch: 'main',
|
|
535
|
-
content,
|
|
536
|
-
commit_message: 'Create sandbox pipeline',
|
|
537
|
-
}),
|
|
538
|
-
}
|
|
539
|
-
);
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
generatePipeline(id: string, ramLimit: number, cpuLimit: number, packages: string[]): string {
|
|
543
|
-
return `
|
|
544
|
-
sandbox:
|
|
545
|
-
tags:
|
|
546
|
-
- saas-linux-small-amd64
|
|
547
|
-
image: ubuntu:22.04
|
|
548
|
-
variables:
|
|
549
|
-
MEMORY_LIMIT: "${ramLimit}M"
|
|
550
|
-
before_script:
|
|
551
|
-
- apt-get update && apt-get install -y zram-tools
|
|
552
|
-
- zramctl /dev/zram0 --algorithm lz4 --size 4G --type swap
|
|
553
|
-
script:
|
|
554
|
-
- free -h
|
|
555
|
-
- df -h
|
|
556
|
-
- echo "Sandbox ${id} is running!"
|
|
557
|
-
- sleep 3600
|
|
558
|
-
rules:
|
|
559
|
-
- if: $CI_PIPELINE_SOURCE == "web"
|
|
560
|
-
- if: $CI_PIPELINE_SOURCE == "api"
|
|
561
|
-
`;
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
Passo 4.3: Forgejo/Gitea API
|
|
565
|
-
// src/orchestrator/forgejo.ts
|
|
566
|
-
export class ForgejoOrchestrator {
|
|
567
|
-
private token: string;
|
|
568
|
-
private baseUrl: string;
|
|
569
|
-
|
|
570
|
-
constructor(token: string, baseUrl: string = 'https://codeberg.org') {
|
|
571
|
-
this.token = token;
|
|
572
|
-
this.baseUrl = baseUrl;
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
// Criar repositório
|
|
576
|
-
async createRepo(name: string): Promise<string> {
|
|
577
|
-
const response = await fetch(`${this.baseUrl}/api/v1/user/repos`, {
|
|
578
|
-
method: 'POST',
|
|
579
|
-
headers: {
|
|
580
|
-
'Authorization': `token ${this.token}`,
|
|
581
|
-
'Content-Type': 'application/json',
|
|
582
|
-
},
|
|
583
|
-
body: JSON.stringify({
|
|
584
|
-
name,
|
|
585
|
-
private: true,
|
|
586
|
-
auto_init: true,
|
|
587
|
-
}),
|
|
588
|
-
});
|
|
589
|
-
|
|
590
|
-
const repo = await response.json();
|
|
591
|
-
return repo.html_url;
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
// Criar workflow (Forgejo Actions)
|
|
595
|
-
async createWorkflow(repo: string, workflowName: string, content: string): Promise<void> {
|
|
596
|
-
await fetch(
|
|
597
|
-
`${this.baseUrl}/api/v1/repos/${repo}/contents/.forgejo/workflows/${workflowName}`,
|
|
598
|
-
{
|
|
599
|
-
method: 'PUT',
|
|
600
|
-
headers: {
|
|
601
|
-
'Authorization': `token ${this.token}`,
|
|
602
|
-
'Content-Type': 'application/json',
|
|
603
|
-
},
|
|
604
|
-
body: JSON.stringify({
|
|
605
|
-
message: 'Create sandbox workflow',
|
|
606
|
-
content: Buffer.from(content).toString('base64'),
|
|
607
|
-
}),
|
|
608
|
-
}
|
|
609
|
-
);
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
// Disparar workflow
|
|
613
|
-
async dispatchWorkflow(repo: string, workflowName: string, ref: string = 'main'): Promise<void> {
|
|
614
|
-
await fetch(
|
|
615
|
-
`${this.baseUrl}/api/v1/repos/${repo}/actions/workflows/${workflowName}/dispatches`,
|
|
616
|
-
{
|
|
617
|
-
method: 'POST',
|
|
618
|
-
headers: {
|
|
619
|
-
'Authorization': `token ${this.token}`,
|
|
620
|
-
'Content-Type': 'application/json',
|
|
621
|
-
},
|
|
622
|
-
body: JSON.stringify({ ref }),
|
|
623
|
-
}
|
|
624
|
-
);
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
Passo 4.4: HuggingFace Spaces API
|
|
628
|
-
// src/orchestrator/huggingface.ts
|
|
629
|
-
export class HuggingFaceOrchestrator {
|
|
630
|
-
private token: string;
|
|
631
|
-
|
|
632
|
-
constructor(token: string) {
|
|
633
|
-
this.token = token;
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
// Criar Space
|
|
637
|
-
async createSpace(name: string, sdk: string = 'docker'): Promise<string> {
|
|
638
|
-
const response = await fetch('https://huggingface.co/api/repos/create', {
|
|
639
|
-
method: 'POST',
|
|
640
|
-
headers: {
|
|
641
|
-
'Authorization': `Bearer ${this.token}`,
|
|
642
|
-
'Content-Type': 'application/json',
|
|
643
|
-
},
|
|
644
|
-
body: JSON.stringify({
|
|
645
|
-
name,
|
|
646
|
-
type: 'space',
|
|
647
|
-
sdk,
|
|
648
|
-
license: 'mit',
|
|
649
|
-
}),
|
|
650
|
-
});
|
|
651
|
-
|
|
652
|
-
const space = await response.json();
|
|
653
|
-
return space.url;
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
// Configurar hardware
|
|
657
|
-
async setHardware(name: string, hardware: string): Promise<void> {
|
|
658
|
-
await fetch(`https://huggingface.co/api/spaces/${name}/hardware`, {
|
|
659
|
-
method: 'POST',
|
|
660
|
-
headers: {
|
|
661
|
-
'Authorization': `Bearer ${this.token}`,
|
|
662
|
-
'Content-Type': 'application/json',
|
|
663
|
-
},
|
|
664
|
-
body: JSON.stringify({ hardware }),
|
|
665
|
-
});
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
// Criar Dockerfile
|
|
669
|
-
async createDockerfile(name: string, content: string): Promise<void> {
|
|
670
|
-
await fetch(`https://huggingface.co/api/repos/${name}/contents/Dockerfile`, {
|
|
671
|
-
method: 'POST',
|
|
672
|
-
headers: {
|
|
673
|
-
'Authorization': `Bearer ${this.token}`,
|
|
674
|
-
'Content-Type': 'application/json',
|
|
675
|
-
},
|
|
676
|
-
body: JSON.stringify({
|
|
677
|
-
content: Buffer.from(content).toString('base64'),
|
|
678
|
-
message: 'Create sandbox Dockerfile',
|
|
679
|
-
}),
|
|
680
|
-
});
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
generateDockerfile(id: string, ramLimit: number, packages: string[]): string {
|
|
684
|
-
return `
|
|
685
|
-
FROM python:3.11-slim
|
|
686
|
-
|
|
687
|
-
RUN useradd -m -u 1000 user
|
|
688
|
-
WORKDIR /app
|
|
689
|
-
|
|
690
|
-
RUN apt-get update && apt-get install -y \\
|
|
691
|
-
zram-tools \\
|
|
692
|
-
${packages.join(' ')} \\
|
|
693
|
-
&& rm -rf /var/lib/apt/lists/*
|
|
694
|
-
|
|
695
|
-
COPY --chown=user . /app
|
|
696
|
-
|
|
697
|
-
USER user
|
|
698
|
-
ENV HOME=/home/user \\
|
|
699
|
-
PATH=/home/user/.local/bin:$PATH
|
|
700
|
-
|
|
701
|
-
CMD ["python", "-m", "http.server", "7860"]
|
|
702
|
-
`;
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
Passo 4.5: Kaggle API
|
|
706
|
-
// src/orchestrator/kaggle.ts
|
|
707
|
-
export class KaggleOrchestrator {
|
|
708
|
-
private username: string;
|
|
709
|
-
private apiKey: string;
|
|
710
|
-
|
|
711
|
-
constructor(username: string, apiKey: string) {
|
|
712
|
-
this.username = username;
|
|
713
|
-
this.apiKey = apiKey;
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
// Criar e rodar notebook
|
|
717
|
-
async pushKernel(kernelPath: string): Promise<void> {
|
|
718
|
-
const response = await fetch('https://www.kaggle.com/api/v1/kernels/push', {
|
|
719
|
-
method: 'POST',
|
|
720
|
-
headers: {
|
|
721
|
-
'Authorization': `Basic ${Buffer.from(`${this.username}:${this.apiKey}`).toString('base64')}`,
|
|
722
|
-
'Content-Type': 'application/json',
|
|
723
|
-
},
|
|
724
|
-
body: JSON.stringify({
|
|
725
|
-
kernelPath,
|
|
726
|
-
}),
|
|
727
|
-
});
|
|
728
|
-
|
|
729
|
-
if (!response.ok) {
|
|
730
|
-
throw new Error(`Failed to push kernel: ${response.status}`);
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
// Verificar status
|
|
735
|
-
async getKernelStatus(kernelSlug: string): Promise<string> {
|
|
736
|
-
const response = await fetch(
|
|
737
|
-
`https://www.kaggle.com/api/v1/kernels/status/${kernelSlug}`,
|
|
738
|
-
{
|
|
739
|
-
headers: {
|
|
740
|
-
'Authorization': `Basic ${Buffer.from(`${this.username}:${this.apiKey}`).toString('base64')}`,
|
|
741
|
-
},
|
|
742
|
-
}
|
|
743
|
-
);
|
|
744
|
-
|
|
745
|
-
const data = await response.json();
|
|
746
|
-
return data.status;
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
// Criar metadata para GPU
|
|
750
|
-
createMetadata(
|
|
751
|
-
id: string,
|
|
752
|
-
enableGpu: boolean = true,
|
|
753
|
-
enableTpu: boolean = false,
|
|
754
|
-
enableInternet: boolean = true
|
|
755
|
-
): object {
|
|
756
|
-
return {
|
|
757
|
-
id: `${this.username}/${id}`,
|
|
758
|
-
title: id,
|
|
759
|
-
code_file: 'script.py',
|
|
760
|
-
language: 'python',
|
|
761
|
-
kernel_type: 'script',
|
|
762
|
-
is_private: true,
|
|
763
|
-
enable_gpu: enableGpu,
|
|
764
|
-
enable_tpu: enableTpu,
|
|
765
|
-
enable_internet: enableInternet,
|
|
766
|
-
dataset_sources: [],
|
|
767
|
-
competition_sources: [],
|
|
768
|
-
kernel_sources: [],
|
|
769
|
-
model_sources: [],
|
|
770
|
-
};
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
generateScript(id: string, ramLimit: number, packages: string[]): string {
|
|
774
|
-
return `
|
|
775
|
-
import subprocess
|
|
776
|
-
import sys
|
|
777
|
-
|
|
778
|
-
# Instalar pacotes
|
|
779
|
-
packages = ${JSON.stringify(packages)}
|
|
780
|
-
for pkg in packages:
|
|
781
|
-
subprocess.check_call([sys.executable, "-m", "pip", "install", pkg])
|
|
782
|
-
|
|
783
|
-
# Verificar recursos
|
|
784
|
-
print("=== RAM ===")
|
|
785
|
-
import psutil
|
|
786
|
-
print(f"RAM total: {psutil.virtual_memory().total / 1024**3:.2f} GB")
|
|
787
|
-
print(f"RAM disponível: {psutil.virtual_memory().available / 1024**3:.2f} GB")
|
|
788
|
-
|
|
789
|
-
# Verificar GPU
|
|
790
|
-
if ${enableGpu}:
|
|
791
|
-
print("=== GPU ===")
|
|
792
|
-
import torch
|
|
793
|
-
print(f"GPU disponível: {torch.cuda.is_available()}")
|
|
794
|
-
if torch.cuda.is_available():
|
|
795
|
-
print(f"GPU: {torch.cuda.get_device_name(0)}")
|
|
796
|
-
print(f"VRAM: {torch.cuda.get_device_properties(0).total_mem / 1024**3:.2f} GB")
|
|
797
|
-
|
|
798
|
-
# Executar código do usuário
|
|
799
|
-
print("Sandbox ${id} is running!")
|
|
800
|
-
`;
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
|
|
804
|
-
FASE 5: ORQUESTRADOR PRINCIPAL
|
|
805
|
-
// src/orchestrator/index.ts
|
|
806
|
-
import { db } from '../db';
|
|
807
|
-
import { sandboxes, memoryRegions } from '../db/schema';
|
|
808
|
-
import { GitHubOrchestrator } from './github';
|
|
809
|
-
import { GitLabOrchestrator } from './gitlab';
|
|
810
|
-
import { ForgejoOrchestrator } from './forgejo';
|
|
811
|
-
import { HuggingFaceOrchestrator } from './huggingface';
|
|
812
|
-
import { KaggleOrchestrator } from './kaggle';
|
|
813
|
-
|
|
814
|
-
interface SandboxConfig {
|
|
815
|
-
userId: string;
|
|
816
|
-
ramLimit: number; // MB
|
|
817
|
-
cpuLimit: number;
|
|
818
|
-
gpuEnabled?: boolean;
|
|
819
|
-
packages?: string[];
|
|
820
|
-
platform?: 'github' | 'gitlab' | 'forgejo' | 'huggingface' | 'kaggle';
|
|
821
|
-
ttl?: number; // horas
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
export class SandboxOrchestrator {
|
|
825
|
-
private github: GitHubOrchestrator;
|
|
826
|
-
private gitlab: GitLabOrchestrator;
|
|
827
|
-
private forgejo: ForgejoOrchestrator;
|
|
828
|
-
private huggingface: HuggingFaceOrchestrator;
|
|
829
|
-
private kaggle: KaggleOrchestrator;
|
|
830
|
-
|
|
831
|
-
constructor() {
|
|
832
|
-
this.github = new GitHubOrchestrator(
|
|
833
|
-
process.env.GITHUB_TOKEN!,
|
|
834
|
-
process.env.GITHUB_ORG!
|
|
835
|
-
);
|
|
836
|
-
this.gitlab = new GitLabOrchestrator(process.env.GITLAB_TOKEN!);
|
|
837
|
-
this.forgejo = new ForgejoOrchestrator(
|
|
838
|
-
process.env.FORGEJO_TOKEN!,
|
|
839
|
-
process.env.FORGEJO_URL
|
|
840
|
-
);
|
|
841
|
-
this.huggingface = new HuggingFaceOrchestrator(process.env.HF_TOKEN!);
|
|
842
|
-
this.kaggle = new KaggleOrchestrator(
|
|
843
|
-
process.env.KAGGLE_USERNAME!,
|
|
844
|
-
process.env.KAGGLE_API_KEY!
|
|
845
|
-
);
|
|
846
|
-
}
|
|
847
|
-
|
|
848
|
-
async createSandbox(config: SandboxConfig): Promise<string> {
|
|
849
|
-
const sandboxId = `sbx-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
850
|
-
|
|
851
|
-
const platform = config.platform || this.selectPlatform(config);
|
|
852
|
-
|
|
853
|
-
// Criar registro no banco (em memória)
|
|
854
|
-
await db.insert(sandboxes).values({
|
|
855
|
-
id: sandboxId,
|
|
856
|
-
userId: config.userId,
|
|
857
|
-
platform,
|
|
858
|
-
status: 'creating',
|
|
859
|
-
ramLimit: config.ramLimit,
|
|
860
|
-
cpuLimit: config.cpuLimit,
|
|
861
|
-
gpuEnabled: config.gpuEnabled || false,
|
|
862
|
-
createdAt: new Date().toISOString(),
|
|
863
|
-
expiresAt: config.ttl
|
|
864
|
-
? new Date(Date.now() + config.ttl * 3600000).toISOString()
|
|
865
|
-
: null,
|
|
866
|
-
});
|
|
867
|
-
|
|
868
|
-
// Criar regiões de memória
|
|
869
|
-
await this.createMemoryRegions(sandboxId, config);
|
|
870
|
-
|
|
871
|
-
// Disparar workflow
|
|
872
|
-
await this.triggerWorkflow(sandboxId, platform, config);
|
|
873
|
-
|
|
874
|
-
return sandboxId;
|
|
875
|
-
}
|
|
876
|
-
|
|
877
|
-
private selectPlatform(config: SandboxConfig): string {
|
|
878
|
-
if (config.gpuEnabled) return 'huggingface';
|
|
879
|
-
if (config.ramLimit > 16384) return 'gitlab';
|
|
880
|
-
return 'github';
|
|
881
|
-
}
|
|
882
|
-
|
|
883
|
-
private async createMemoryRegions(sandboxId: string, config: SandboxConfig) {
|
|
884
|
-
const regions = [
|
|
885
|
-
{ type: 'zram', mountPoint: '/swap', sizeBytes: config.ramLimit * 1024 * 1024 },
|
|
886
|
-
{ type: 'tmpfs', mountPoint: '/tmp', sizeBytes: 4 * 1024 * 1024 * 1024 },
|
|
887
|
-
{ type: 'tmpfs', mountPoint: '/workspace', sizeBytes: 4 * 1024 * 1024 * 1024 },
|
|
888
|
-
{ type: 'overlay', mountPoint: '/overlay', sizeBytes: 2 * 1024 * 1024 * 1024 },
|
|
889
|
-
{ type: 'sqlite', mountPoint: ':memory:', sizeBytes: 512 * 1024 * 1024 },
|
|
890
|
-
];
|
|
891
|
-
|
|
892
|
-
for (const region of regions) {
|
|
893
|
-
await db.insert(memoryRegions).values({
|
|
894
|
-
id: `${sandboxId}-${region.type}`,
|
|
895
|
-
sandboxId,
|
|
896
|
-
type: region.type,
|
|
897
|
-
mountPoint: region.mountPoint,
|
|
898
|
-
sizeBytes: region.sizeBytes,
|
|
899
|
-
createdAt: new Date().toISOString(),
|
|
900
|
-
});
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
|
|
904
|
-
private async triggerWorkflow(sandboxId: string, platform: string, config: SandboxConfig) {
|
|
905
|
-
switch (platform) {
|
|
906
|
-
case 'github':
|
|
907
|
-
await this.triggerGitHub(sandboxId, config);
|
|
908
|
-
break;
|
|
909
|
-
case 'gitlab':
|
|
910
|
-
await this.triggerGitLab(sandboxId, config);
|
|
911
|
-
break;
|
|
912
|
-
case 'forgejo':
|
|
913
|
-
await this.triggerForgejo(sandboxId, config);
|
|
914
|
-
break;
|
|
915
|
-
case 'huggingface':
|
|
916
|
-
await this.triggerHuggingFace(sandboxId, config);
|
|
917
|
-
break;
|
|
918
|
-
case 'kaggle':
|
|
919
|
-
await this.triggerKaggle(sandboxId, config);
|
|
920
|
-
break;
|
|
921
|
-
}
|
|
922
|
-
}
|
|
923
|
-
|
|
924
|
-
private async triggerGitHub(sandboxId: string, config: SandboxConfig) {
|
|
925
|
-
const repo = `sandbox-${sandboxId}`;
|
|
926
|
-
const workflow = this.github.generateWorkflow(
|
|
927
|
-
sandboxId,
|
|
928
|
-
config.ramLimit,
|
|
929
|
-
config.cpuLimit,
|
|
930
|
-
config.packages || []
|
|
931
|
-
);
|
|
932
|
-
|
|
933
|
-
await this.github.createRepo(repo);
|
|
934
|
-
await this.github.createWorkflow(repo, 'sandbox.yml', workflow);
|
|
935
|
-
const runId = await this.github.dispatchWorkflow(repo, 'sandbox.yml', {
|
|
936
|
-
ram_limit: `${config.ramLimit}M`,
|
|
937
|
-
cpu_limit: config.cpuLimit.toString(),
|
|
938
|
-
packages: (config.packages || []).join(' '),
|
|
939
|
-
});
|
|
940
|
-
|
|
941
|
-
// Atualizar registro
|
|
942
|
-
await db.update(sandboxes)
|
|
943
|
-
.set({ workflowId: runId })
|
|
944
|
-
.where({ id: sandboxId });
|
|
945
|
-
}
|
|
946
|
-
|
|
947
|
-
private async triggerGitLab(sandboxId: string, config: SandboxConfig) {
|
|
948
|
-
const project = await this.gitlab.createProject(`sandbox-${sandboxId}`);
|
|
949
|
-
const ciContent = this.gitlab.generatePipeline(
|
|
950
|
-
sandboxId,
|
|
951
|
-
config.ramLimit,
|
|
952
|
-
config.cpuLimit,
|
|
953
|
-
config.packages || []
|
|
954
|
-
);
|
|
955
|
-
|
|
956
|
-
await this.gitlab.createCIFile(project, ciContent);
|
|
957
|
-
const pipelineId = await this.gitlab.createPipeline(project);
|
|
958
|
-
|
|
959
|
-
await db.update(sandboxes)
|
|
960
|
-
.set({ workflowId: pipelineId.toString() })
|
|
961
|
-
.where({ id: sandboxId });
|
|
962
|
-
}
|
|
963
|
-
|
|
964
|
-
private async triggerForgejo(sandboxId: string, config: SandboxConfig) {
|
|
965
|
-
const repo = `sandbox-${sandboxId}`;
|
|
966
|
-
const workflow = this.github.generateWorkflow( // Reutilizar workflow do GitHub
|
|
967
|
-
sandboxId,
|
|
968
|
-
config.ramLimit,
|
|
969
|
-
config.cpuLimit,
|
|
970
|
-
config.packages || []
|
|
971
|
-
);
|
|
972
|
-
|
|
973
|
-
await this.forgejo.createRepo(repo);
|
|
974
|
-
await this.forgejo.createWorkflow(repo, 'sandbox.yml', workflow);
|
|
975
|
-
await this.forgejo.dispatchWorkflow(repo, 'sandbox.yml');
|
|
976
|
-
}
|
|
977
|
-
|
|
978
|
-
private async triggerHuggingFace(sandboxId: string, config: SandboxConfig) {
|
|
979
|
-
const space = `sandbox-${sandboxId}`;
|
|
980
|
-
const dockerfile = this.huggingface.generateDockerfile(
|
|
981
|
-
sandboxId,
|
|
982
|
-
config.ramLimit,
|
|
983
|
-
config.packages || []
|
|
984
|
-
);
|
|
985
|
-
|
|
986
|
-
await this.huggingface.createSpace(space);
|
|
987
|
-
await this.huggingface.createDockerfile(space, dockerfile);
|
|
988
|
-
|
|
989
|
-
if (config.gpuEnabled) {
|
|
990
|
-
await this.huggingface.setHardware(space, 't4-small');
|
|
991
|
-
}
|
|
992
|
-
}
|
|
993
|
-
|
|
994
|
-
private async triggerKaggle(sandboxId: string, config: SandboxConfig) {
|
|
995
|
-
const script = this.kaggle.generateScript(
|
|
996
|
-
sandboxId,
|
|
997
|
-
config.ramLimit,
|
|
998
|
-
config.packages || []
|
|
999
|
-
);
|
|
1000
|
-
|
|
1001
|
-
const metadata = this.kaggle.createMetadata(
|
|
1002
|
-
sandboxId,
|
|
1003
|
-
config.gpuEnabled || false
|
|
1004
|
-
);
|
|
1005
|
-
|
|
1006
|
-
// Criar kernel e rodar
|
|
1007
|
-
// (requer upload do script via API)
|
|
1008
|
-
}
|
|
1009
|
-
}
|
|
1010
|
-
|
|
1011
|
-
FASE 6: API PRINCIPAL (Cloudflare Workers)
|
|
1012
|
-
// src/index.ts
|
|
1013
|
-
import { Hono } from 'hono';
|
|
1014
|
-
import { SandboxOrchestrator } from './orchestrator';
|
|
1015
|
-
import { VirtualMemory } from './memory/virtual-memory';
|
|
1016
|
-
import { GitHubFileSystem } from './memory/github-fs';
|
|
1017
|
-
|
|
1018
|
-
const app = new Hono();
|
|
1019
|
-
const orchestrator = new SandboxOrchestrator();
|
|
1020
|
-
const memory = new VirtualMemory();
|
|
1021
|
-
|
|
1022
|
-
// Criar sandbox
|
|
1023
|
-
app.post('/api/sandbox', async (c) => {
|
|
1024
|
-
const body = await c.req.json();
|
|
1025
|
-
|
|
1026
|
-
const sandboxId = await orchestrator.createSandbox({
|
|
1027
|
-
userId: body.userId,
|
|
1028
|
-
ramLimit: body.ramLimit || 8192,
|
|
1029
|
-
cpuLimit: body.cpuLimit || 4,
|
|
1030
|
-
gpuEnabled: body.gpuEnabled || false,
|
|
1031
|
-
packages: body.packages || [],
|
|
1032
|
-
platform: body.platform,
|
|
1033
|
-
ttl: body.ttl || 24,
|
|
1034
|
-
});
|
|
1035
|
-
|
|
1036
|
-
return c.json({ sandboxId, status: 'creating' });
|
|
1037
|
-
});
|
|
1038
|
-
|
|
1039
|
-
// Status da sandbox
|
|
1040
|
-
app.get('/api/sandbox/:id', async (c) => {
|
|
1041
|
-
const id = c.req.param('id');
|
|
1042
|
-
return c.json({ id, status: 'running' });
|
|
1043
|
-
});
|
|
1044
|
-
|
|
1045
|
-
// Memória virtual
|
|
1046
|
-
app.get('/api/memory/stats', async (c) => {
|
|
1047
|
-
return c.json({
|
|
1048
|
-
zram: '8GB comprimida',
|
|
1049
|
-
tmpfs: '4GB /workspace + 2GB /tmp',
|
|
1050
|
-
overlay: '2GB CoW',
|
|
1051
|
-
sqlite: '512MB in-memory',
|
|
1052
|
-
github: 'Cache de repositórios',
|
|
1053
|
-
});
|
|
1054
|
-
});
|
|
1055
|
-
|
|
1056
|
-
// GitHub como storage
|
|
1057
|
-
app.post('/api/github/hydrate', async (c) => {
|
|
1058
|
-
const { owner, repo } = await c.req.json();
|
|
1059
|
-
|
|
1060
|
-
const githubFs = new GitHubFileSystem(process.env.GITHUB_TOKEN!);
|
|
1061
|
-
const files = await githubFs.hydrateRepo(owner, repo);
|
|
1062
|
-
|
|
1063
|
-
return c.json({
|
|
1064
|
-
files: files.size,
|
|
1065
|
-
status: 'hydrated in RAM',
|
|
1066
|
-
});
|
|
1067
|
-
});
|
|
1068
|
-
|
|
1069
|
-
// CDN endpoint
|
|
1070
|
-
app.get('/cdn/:package/:version', async (c) => {
|
|
1071
|
-
const { package: pkg, version } = c.req.param();
|
|
1072
|
-
|
|
1073
|
-
const cached = await memory.getCachedPackage(pkg, version);
|
|
1074
|
-
if (cached) {
|
|
1075
|
-
return new Response(cached, {
|
|
1076
|
-
headers: { 'Content-Type': 'application/javascript' },
|
|
1077
|
-
});
|
|
1078
|
-
}
|
|
1079
|
-
|
|
1080
|
-
const response = await fetch(
|
|
1081
|
-
`https://cdn.jsdelivr.net/npm/${pkg}@${version}/+esm`
|
|
1082
|
-
);
|
|
1083
|
-
|
|
1084
|
-
const data = Buffer.from(await response.arrayBuffer());
|
|
1085
|
-
await memory.cachePackage(pkg, version, data);
|
|
1086
|
-
|
|
1087
|
-
return new Response(data, {
|
|
1088
|
-
headers: { 'Content-Type': 'application/javascript' },
|
|
1089
|
-
});
|
|
1090
|
-
});
|
|
1091
|
-
|
|
1092
|
-
export default app;
|
|
1093
|
-
|
|
1094
|
-
FASE 7: PUBLICAÇÃO NPM + CDN
|
|
1095
|
-
Passo 7.1: package.json
|
|
1096
|
-
{
|
|
1097
|
-
"name": "@sandbox-platform/core",
|
|
1098
|
-
"version": "1.0.0",
|
|
1099
|
-
"description": "Plataforma de sandbox com memória virtual contínua",
|
|
1100
|
-
"type": "module",
|
|
1101
|
-
"main": "dist/index.js",
|
|
1102
|
-
"types": "dist/index.d.ts",
|
|
1103
|
-
"exports": {
|
|
1104
|
-
".": {
|
|
1105
|
-
"import": "./dist/index.js",
|
|
1106
|
-
"types": "./dist/index.d.ts"
|
|
1107
|
-
},
|
|
1108
|
-
"./memory": {
|
|
1109
|
-
"import": "./dist/memory/index.js",
|
|
1110
|
-
"types": "./dist/memory/index.d.ts"
|
|
1111
|
-
},
|
|
1112
|
-
"./orchestrator": {
|
|
1113
|
-
"import": "./dist/orchestrator/index.js",
|
|
1114
|
-
"types": "./dist/orchestrator/index.d.ts"
|
|
1115
|
-
}
|
|
1116
|
-
},
|
|
1117
|
-
"scripts": {
|
|
1118
|
-
"build": "tsc",
|
|
1119
|
-
"dev": "tsx watch src/index.ts",
|
|
1120
|
-
"test": "vitest",
|
|
1121
|
-
"deploy": "wrangler deploy",
|
|
1122
|
-
"prepublishOnly": "npm run build"
|
|
1123
|
-
},
|
|
1124
|
-
"dependencies": {
|
|
1125
|
-
"drizzle-orm": "^0.30.0",
|
|
1126
|
-
"better-sqlite3": "^11.0.0",
|
|
1127
|
-
"memfs": "^4.6.0",
|
|
1128
|
-
"hono": "^4.0.0",
|
|
1129
|
-
"@hono/node-server": "^1.0.0",
|
|
1130
|
-
"zod": "^3.23.0"
|
|
1131
|
-
},
|
|
1132
|
-
"keywords": [
|
|
1133
|
-
"sandbox",
|
|
1134
|
-
"virtual-memory",
|
|
1135
|
-
"github-actions",
|
|
1136
|
-
"gitlab-ci",
|
|
1137
|
-
"forgejo",
|
|
1138
|
-
"huggingface",
|
|
1139
|
-
"zram",
|
|
1140
|
-
"tmpfs",
|
|
1141
|
-
"memfs"
|
|
1142
|
-
],
|
|
1143
|
-
"license": "MIT",
|
|
1144
|
-
"repository": {
|
|
1145
|
-
"type": "git",
|
|
1146
|
-
"url": "https://github.com/your-org/sandbox-platform"
|
|
1147
|
-
},
|
|
1148
|
-
"files": [
|
|
1149
|
-
"dist",
|
|
1150
|
-
"README.md"
|
|
1151
|
-
]
|
|
1152
|
-
}
|
|
1153
|
-
Passo 7.2: Uso via CDN
|
|
1154
|
-
// Qualquer pessoa pode usar em qualquer lugar:
|
|
1155
|
-
import { SandboxOrchestrator } from 'https://esm.run/@sandbox-platform/core';
|
|
1156
|
-
|
|
1157
|
-
const orchestrator = new SandboxOrchestrator();
|
|
1158
|
-
const sandbox = await orchestrator.createSandbox({
|
|
1159
|
-
userId: 'user123',
|
|
1160
|
-
ramLimit: 8192,
|
|
1161
|
-
packages: ['nodejs', 'python3'],
|
|
1162
|
-
});
|
|
1163
|
-
|
|
1164
|
-
RESUMO: INFRAESTRUTURA GRATUITA TOTAL
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
Componente
|
|
1169
|
-
Fonte
|
|
1170
|
-
RAM/CPU
|
|
1171
|
-
Custo
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
CI/CD
|
|
1176
|
-
GitHub Actions (público)
|
|
1177
|
-
16 GB RAM, 4 vCPU
|
|
1178
|
-
$0
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
GPU
|
|
1182
|
-
Kaggle Notebooks
|
|
1183
|
-
29 GB RAM, T4 x2
|
|
1184
|
-
$0
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
GPU
|
|
1188
|
-
HuggingFace (free)
|
|
1189
|
-
16 GB RAM
|
|
1190
|
-
$0
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
Storage
|
|
1194
|
-
Cloudflare R2
|
|
1195
|
-
10 GB
|
|
1196
|
-
$0
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
CDN
|
|
1200
|
-
jsdelivr/esm.sh
|
|
1201
|
-
Ilimitado
|
|
1202
|
-
$0
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
Database
|
|
1206
|
-
SQLite in-memory
|
|
1207
|
-
Voluntário
|
|
1208
|
-
$0
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
Orquestrador
|
|
1212
|
-
Cloudflare Workers
|
|
1213
|
-
100K req/dia
|
|
1214
|
-
$0
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
Filesystem
|
|
1218
|
-
memfs (RAM)
|
|
1219
|
-
Voluntário
|
|
1220
|
-
$0
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
GitHub como DB
|
|
1224
|
-
github-storage
|
|
1225
|
-
5000 req/hora
|
|
1226
|
-
$0
|
|
1227
|
-
|
|
1228
|
-
PLANO COMPLETO FINALIZADO
|
|
1229
|
-
11 Pesquisas Realizadas:
|
|
1230
|
-
|
|
1231
|
-
✅ GitHub Actions workflow_dispatch API (retorna run_id desde Feb 2026)
|
|
1232
|
-
✅ GitLab CI pipeline schedules API (cron, inputs, play)
|
|
1233
|
-
✅ Forgejo/Gitea Actions workflow dispatch (compatível com GitHub)
|
|
1234
|
-
✅ HuggingFace Spaces API (criar, hardware, Dockerfile)
|
|
1235
|
-
✅ Kaggle API notebook execution (push, status, GPU)
|
|
1236
|
-
✅ Drizzle ORM SQLite in-memory (new Database(':memory:'))
|
|
1237
|
-
✅ memfs virtual filesystem (Volume.create, mountVol)
|
|
1238
|
-
✅ Docker memory limits (--memory, --tmpfs, zram)
|
|
1239
|
-
✅ npm CDN jsdelivr/esm.run (publicação global)
|
|
1240
|
-
✅ Cloudflare R2 storage (10GB grátis)
|
|
1241
|
-
✅ Cloudflare Workers (100K req/dia grátis)
|
|
1242
|
-
|
|
1243
|
-
O que foi documentado:
|
|
1244
|
-
|
|
1245
|
-
Scripts completos para cada plataforma (GitHub, GitLab, Forgejo, HuggingFace, Kaggle)
|
|
1246
|
-
APIs REST detalhadas com endpoints exatos
|
|
1247
|
-
Templates de workflow YAML para cada plataforma
|
|
1248
|
-
Código TypeScript completo com Drizzle ORM + memfs
|
|
1249
|
-
Dockerfiles para HuggingFace Spaces
|
|
1250
|
-
Configuração de Cloudflare Workers
|
|
1251
|
-
|
|
1252
|
-
Quer que eu implemente alguma parte específica agora?
|