@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
package/docs/talks9/README.md
DELETED
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
<p align="center">
|
|
2
|
-
<img src="docs/assets/saddlemark.svg" alt="Saddle" width="720" />
|
|
3
|
-
</p>
|
|
4
|
-
|
|
5
|
-
<p align="center">
|
|
6
|
-
<strong>Storage-backed jobs, scraping contracts and portable runners for Node.js.</strong><br />
|
|
7
|
-
<a href="https://github.com/iakadion/saddle/actions/workflows/ci.yml"><img src="https://github.com/iakadion/saddle/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
|
|
8
|
-
<a href="https://github.com/iakadion/saddle/releases/tag/v1.0.0"><img src="https://img.shields.io/badge/release-v1.0.0-d35d3d" alt="Release 1.0.0" /></a>
|
|
9
|
-
<a href="https://github.com/iakadion/saddle/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-GPL--3.0-202a2f" alt="GPL 3.0 license" /></a>
|
|
10
|
-
</p>
|
|
11
|
-
|
|
12
|
-
Saddle is a **JavaScript ESM engine** for jobs that move data between storage, a working set, an injected runner and durable artifacts. It includes focused contracts for scraping, crawling, browser agents, queues, persistence, MCP transport, webhooks and package delivery without taking ownership of the caller's credentials or infrastructure.
|
|
13
|
-
|
|
14
|
-
> **Core idea:** storage is the durable side of the working set; the runner is replaceable; the artifact is the boundary.
|
|
15
|
-
|
|
16
|
-
<p align="center">
|
|
17
|
-
<img src="docs/assets/architecture.svg" alt="Saddle runtime architecture: storage, bridge, runner and artifact" width="100%" />
|
|
18
|
-
</p>
|
|
19
|
-
|
|
20
|
-
## Start here
|
|
21
|
-
|
|
22
|
-
Saddle requires **Node.js 22 or newer**.
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
npm install @wenathlan/saddle
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
The public API uses injected transports. A caller can use the built-in `fetch`, a custom fetcher, a browser adapter, a storage backend or a runner without changing the core contracts.
|
|
29
|
-
|
|
30
|
-
```js
|
|
31
|
-
import { scrapeurl, formatforagent } from "@wenathlan/saddle";
|
|
32
|
-
|
|
33
|
-
const result = await scrapeurl("https://example.com", {
|
|
34
|
-
format: "markdown"
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
const context = formatforagent(result, {
|
|
38
|
-
maxchunksize: 2000,
|
|
39
|
-
keypoints: 4
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
console.log(context.summary);
|
|
43
|
-
console.log(context.chunks);
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
For a deterministic example with no network access:
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
node examples/publicapi.js
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## What is included
|
|
53
|
-
|
|
54
|
-
| Area | Contract | Result |
|
|
55
|
-
| --- | --- | --- |
|
|
56
|
-
| Jobs | `engine`, `scheduler`, `inprocess` | `prepare → process → sync → cleanup` |
|
|
57
|
-
| Storage | local, chunked, S3-compatible, GitHub Contents, file hosting | durable objects and chunks |
|
|
58
|
-
| Working set | memory bridge, modes, objects, transforms | storage-to-compute and compute-to-storage |
|
|
59
|
-
| Scraping | robots, cache, extraction, schema, scraper | text, metadata, links and structured output |
|
|
60
|
-
| Crawl | normalization, BFS crawler, persistent frontier | bounded domain-aware crawling |
|
|
61
|
-
| Browser | fingerprint, session, replay and injected agent | browser actions without a vendor lock-in |
|
|
62
|
-
| Operations | queues, idempotency, saga, retry, circuit breaker | controlled execution and recovery |
|
|
63
|
-
| Protocols | JSON, NDJSON, SSE, blocks and MCP | transport-neutral messages |
|
|
64
|
-
| Delivery | manifests, workflow registry, binary/container plans | package and runner surfaces |
|
|
65
|
-
|
|
66
|
-
## Public API
|
|
67
|
-
|
|
68
|
-
The root export is intentionally broad. Subpath exports are available for consumers that want a smaller dependency surface.
|
|
69
|
-
|
|
70
|
-
| Export | Purpose |
|
|
71
|
-
| --- | --- |
|
|
72
|
-
| `saddleurl` | choose the fetch or injected browser path |
|
|
73
|
-
| `scrapeurl` | fetch one URL and extract content |
|
|
74
|
-
| `scrapehtml` | extract content from HTML without network access |
|
|
75
|
-
| `extractcontent` | expose structured extraction directly |
|
|
76
|
-
| `serializeresult` | serialize as JSON, text, Markdown, XML or Redis payload |
|
|
77
|
-
| `formatforagent` | produce summary, key points, chunks, links and token count |
|
|
78
|
-
| `batchscrape` | process bounded URL groups with progress callbacks |
|
|
79
|
-
| `crawlurl` | run the crawl contract through the public surface |
|
|
80
|
-
| `browseragent` | adapt navigation, click, type, screenshot, DOM and scroll |
|
|
81
|
-
| `mcpserver` / `mcptransport` | expose optional MCP tools over JSONL or HTTP |
|
|
82
|
-
| `nodeserver` | expose a Web Request/Response handler through Node HTTP |
|
|
83
|
-
|
|
84
|
-
The complete API is documented in [`docs/libraryapi.md`](docs/libraryapi.md).
|
|
85
|
-
|
|
86
|
-
## The execution model
|
|
87
|
-
|
|
88
|
-
Saddle coordinates contracts instead of hiding providers behind a mandatory platform. A typical job looks like this:
|
|
89
|
-
|
|
90
|
-
```js
|
|
91
|
-
import {
|
|
92
|
-
engine,
|
|
93
|
-
eventbus,
|
|
94
|
-
inprocess,
|
|
95
|
-
localmemory,
|
|
96
|
-
localstorage,
|
|
97
|
-
scheduler
|
|
98
|
-
} from "@wenathlan/saddle";
|
|
99
|
-
|
|
100
|
-
const events = eventbus();
|
|
101
|
-
const run = engine({
|
|
102
|
-
storage: localstorage("./.saddle-data"),
|
|
103
|
-
memory: localmemory(),
|
|
104
|
-
scheduler: scheduler([inprocess()]),
|
|
105
|
-
events
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
const result = await run.run(
|
|
109
|
-
{ name: "example", input: { value: 42 } },
|
|
110
|
-
({ job }) => ({ jobid: job.id, ok: true })
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
console.log(result.artifact);
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
The caller still chooses how to provide `fetcher`, browser transport, persistence, proxy pool, captcha solver, webhook secret and remote credentials. Saddle does not embed secrets, fixed hosts or a mandatory cloud vendor.
|
|
117
|
-
|
|
118
|
-
## CLI
|
|
119
|
-
|
|
120
|
-
The package includes the `saddle` executable.
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
saddle help
|
|
124
|
-
saddle modes
|
|
125
|
-
saddle runexample
|
|
126
|
-
saddle mcp
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
The CLI keeps local execution explicit. Remote execution belongs to the configured forge, storage and workflow adapters.
|
|
130
|
-
|
|
131
|
-
## Security boundaries
|
|
132
|
-
|
|
133
|
-
Saddle follows a caller-owned infrastructure model.
|
|
134
|
-
|
|
135
|
-
| Boundary | Policy |
|
|
136
|
-
| --- | --- |
|
|
137
|
-
| Credentials | injected at runtime; never committed |
|
|
138
|
-
| Network | `http` and `https` URLs are validated; private targets are blocked by the API/MCP security layer |
|
|
139
|
-
| Crawling | robots rules and crawl delay are explicit inputs to the crawl contract |
|
|
140
|
-
| Storage | adapters are replaceable; the core does not assume one object store |
|
|
141
|
-
| Runtime | Node HTTP is isolated in `server/node.js`; core contracts stay transport-oriented |
|
|
142
|
-
| Failure | retry policy, circuit breaker, idempotency and saga compensation remain configurable |
|
|
143
|
-
|
|
144
|
-
The engine is an orchestration layer, not a promise that every website, browser or external service can be automated. Operators remain responsible for authorization, terms of service and data handling.
|
|
145
|
-
|
|
146
|
-
## Package surfaces
|
|
147
|
-
|
|
148
|
-
The release is distributed through the following GitHub Packages registries.
|
|
149
|
-
|
|
150
|
-
| Registry | Published artifact | Workflow |
|
|
151
|
-
| --- | --- | --- |
|
|
152
|
-
| GitHub npm | `@iakadion/saddle@1.0.0` | [`publishgithubnpm.yml`](.github/workflows/publishgithubnpm.yml) |
|
|
153
|
-
| GHCR | `ghcr.io/iakadion/saddle:latest` | [`publishghcr.yml`](.github/workflows/publishghcr.yml) |
|
|
154
|
-
| Maven | `io.devthink:saddle:1.0.0` | [`publishmaven.yml`](.github/workflows/publishmaven.yml) |
|
|
155
|
-
| NuGet | `Saddle 1.0.0` | [`publishnuget.yml`](.github/workflows/publishnuget.yml) |
|
|
156
|
-
| RubyGems | `saddle 1.0.0` | [`publishrubygems.yml`](.github/workflows/publishrubygems.yml) |
|
|
157
|
-
|
|
158
|
-
The canonical JavaScript package name remains `@wenathlan/saddle` for the public npmjs workflow. GitHub Packages uses `@iakadion/saddle` because the GitHub Actions token is authorized for the repository owner namespace.
|
|
159
|
-
|
|
160
|
-
## Development
|
|
161
|
-
|
|
162
|
-
```bash
|
|
163
|
-
npm ci
|
|
164
|
-
npm test
|
|
165
|
-
npm run check
|
|
166
|
-
npm run formatcheck
|
|
167
|
-
npm run pack:check
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
The test suite is deterministic and does not require network access or real credentials. `npm run pack:check` runs syntax checks, the JSDoc format audit, all tests and an npm pack dry-run.
|
|
171
|
-
|
|
172
|
-
## Repository map
|
|
173
|
-
|
|
174
|
-
```text
|
|
175
|
-
core/ errors, events and identifiers
|
|
176
|
-
domain/ jobs, artifacts, sessions and providers
|
|
177
|
-
memory/ working-set bridge, modes, objects and transforms
|
|
178
|
-
storage/ local, chunked, remote and file-hosting adapters
|
|
179
|
-
scrape/ robots, cache, extraction, schema and scraper
|
|
180
|
-
crawl/ URL normalization, crawler and persistent frontier
|
|
181
|
-
queue/ queue, idempotency, saga and recovery
|
|
182
|
-
browser/ fingerprint, session and agent contracts
|
|
183
|
-
mcp/ optional server and JSONL/HTTP transport
|
|
184
|
-
protocol/ JSON, NDJSON, SSE and block serializers
|
|
185
|
-
workflow/ manifests, templates and registry
|
|
186
|
-
tests/ deterministic engine coverage
|
|
187
|
-
docs/ architecture, API, release and registry notes
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
The project deliberately uses a **root-based JavaScript ESM layout**. There is no `src/` directory and no TypeScript build requirement.
|
|
191
|
-
|
|
192
|
-
## Current scope
|
|
193
|
-
|
|
194
|
-
Version 1.0 establishes the engine contracts and a tested package surface. Browser implementations, provider credentials, persistent databases and production deployment remain caller-selected adapters. The next improvements should extend those contracts without coupling the core to one forge, registry, browser or storage vendor.
|
|
195
|
-
|
|
196
|
-
## License
|
|
197
|
-
|
|
198
|
-
Saddle is distributed under the [GNU General Public License v3.0](LICENSE).
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
# Viabilidade do Saddle: Uma Análise Técnica da Transformação de Armazenamento Remoto em Memória Computacional
|
|
2
|
-
|
|
3
|
-
## Fundamentos Tecnológicos da Transformação de Armazenamento em Memória
|
|
4
|
-
|
|
5
|
-
A premissa central do framework Saddle, conforme descrito, é a transformação de serviços de armazenamento de terceiros — como Hugging Face, Kaggle e Terabox — numa única entidade de memória computacional virtual, incluindo RAM, GPU e CPU [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. Esta abstração radical, que postula que "bytes de armazenamento e bytes de memória computacional são os mesmos bytes", depende de uma arquitetura complexa e interdependente de três pilares tecnológicos fundamentais: a montagem de sistemas de ficheiros remotos, a criação de um sistema de ficheiros temporário em memória rápida, e a implementação de troca de dados comprimidos para ampliar a capacidade de memória virtual [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. A análise detalhada de cada componente revela tanto a robustez dos seus componentes individuais quanto os riscos sistémicos inerentes à sua síntese.
|
|
6
|
-
|
|
7
|
-
O mecanismo primário para unificar os diversos serviços de armazenamento é a utilização de Filesystem in Userspace (FUSE), uma tecnologia que permite a implementação de sistemas de ficheiros sem necessidade de modificar o kernel do sistema operativo [[6](https://gist.github.com/jacky9813/8bb473869a24ce0e493a0aa0c9b577d6), [21](https://rclone.org/commands/rclone_mount/)]. O utilitário `rclone` serve como a ponte crucial nesta arquitetura, permitindo montar qualquer um dos serviços suportados (Cloudflare R2, GitHub, S3, etc.) como um sistema de ficheiros local através de FUSE [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE), [21](https://rclone.org/commands/rclone_mount/)]. A viabilidade desta abordagem está bem estabelecida; existem documentações técnicas extensas sobre como configurar o kernel Linux para suportar FUSE, e ferramentas como o `AnimMouse/setup-rclone` demonstram a integração prática desta tecnologia em ambientes automatizados como o GitHub Actions [[6](https://gist.github.com/jacky9813/8bb473869a24ce0e493a0aa0c9b577d6), [18](https://github.com/marketplace/actions/setup-rclone-action)]. No entanto, a transparência desta camada de abstração esconde um custo significativo em termos de consumo de memória e desempenho de E/S. Relatos de utilizadores indicam consistentemente que as montagens `rclone` podem consumir quantidades substanciais de RAM, mesmo em estado inativo. Um caso notável documentou um aumento drástico no consumo de memória residente de cerca de 1.8GB para mais de 7GB após uma atualização de versão, resultando na terminação por força do processo pelo mecanismo de "Out-of-Memory" (OOM) do kernel [[16](https://github.com/rclone/rclone/issues/2157)]. Outro relato descreve um monte que cresceu o consumo de RAM de 137K para além de 4GB ao longo de dois dias, devido a um processo de enumeração de diretórios em segundo plano que continuava a carregar metadados na memória [[19](https://forum.rclone.org/t/rclone-mount-memory-leaks-gdrive-enumeration/16475)]. Para o Saddle, cujo objetivo é criar um "disco virtual" ilimitado agregando múltiplos serviços, este consumo de RAM oculto representa o risco mais crítico. Se o custo marginal de expandir o armazenamento virtual se traduzir num custo proibitivo de memória, a proposta de valor de um sistema gratuito ou de baixo custo será invalidada. Adicionalmente, o desempenho de E/S via FUSE está intrinsecamente ligado à latência da rede e à eficiência da implementação específica. Testes de utilizadores mostraram que a velocidade de escrita em um sistema de ficheiros `tmpfs` montado para trabalhos do GitLab Runner era de apenas 60 MB/s, comparável a um disco rígido padrão e muito abaixo das expectativas de um sistema de memória ideal [[22](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29651)]. Situações de alta concorrência de I/O também podem exacerbar estes problemas; um servidor Java com um monte OneDrive falhou em gerir o tráfego de pico, enquanto o desempenho era estável com ficheiros locais, sugerindo que a plataforma `rclone` pode não ser adequada para cargas de trabalho intensivas em E/S [[24](https://forum.rclone.org/t/rclone-mount-performance-issue/43184)].
|
|
8
|
-
|
|
9
|
-
Para mitigar os gargalos de desempenho do armazenamento remoto e fornecer uma camada de acesso rápido, o Saddle propõe uma hierarquia de memória virtual construída sobre tecnologias nativas do Linux, nomeadamente `tmpfs`, `zram` e `union-fs`. A arquitetura parece consistir numa camada de disco (o volume FUSE montado), uma camada de cache de memória (`tmpfs`) para ficheiros ativamente utilizados, e uma camada de troca (`zram`) para alargar ainda mais a capacidade de memória virtual [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. O `tmpfs` é um sistema de ficheiros em memória RAM que funciona como uma área de trabalho temporária extremamente rápida [[5](https://spin.atomicobject.com/protecting-ubuntu-root-filesystem/)]. A sua principal limitação é o tamanho, que por defeito corresponde a metade da RAM física disponível, e qualquer tentativa de escrever um ficheiro maior que este limite provavelmente levará à falha do sistema [[5](https://spin.atomicobject.com/protecting-ubuntu-root-filesystem/)]. A estratégia do Saddle parece depender de um `tmpfs` dinâmico, mas a sua gestão eficiente sob carga pesada permanece um desafio. Por outro lado, o `zram` é um módulo do kernel que cria um dispositivo de bloco comprimido directamente na memória RAM [[10](https://docs.kernel.org/admin-guide/blockdev/zram.html), [12](https://www.infradead.org/~mchehab/kernel_docs/admin-guide/blockdev/zram.html)]. Quando utilizado como espaço de troca (`swapon`), permite ao sistema operativo mover páginas de memória inativas para este dispositivo comprimido, efectivamente aumentando a quantidade total de "memória" disponível para além da RAM física. Existem guias detalhados sobre como configurar múltiplos dispositivos `zram` com algoritmos de compressão avançados como `zstd`, optimizando o desempenho para cargas específicas [[9](https://bbs.archlinux.org/viewtopic.php?id=261842), [14](https://forums.gentoo.org/viewtopic.php?t=1126471)]. A combinação de `tmpfs` como cache rápido e `zram` como swap é a parte mais inovadora desta arquitectura. Uma discussão técnica sugere que esta abordagem é tecnicamente factível para contenção, pois permite que o espaço seja partilhado dinamicamente entre os dados em cache e a troca, evitando a alocação prévia exigida por métodos alternativos [[8](https://forum.puppylinux.com/viewtopic.php?t=6043)]. No entanto, a literatura apresenta contradições sobre a eficiência deste modelo. Uma perspectiva argumenta que usar `zram` como um sistema de ficheiros (ext4) é ineficiente porque a mesma informação pode residir duas vezes na RAM: uma vez dentro do dispositivo `zram` comprimido e outra vez no cache de página do sistema operativo [[13](https://www.reddit.com/r/linuxadmin/comments/sseos8/zram_vs_tmpfs/)]. Outra visão defende que `zram` é superior ao `tmpfs` para muitos propósitos devido à sua capacidade de armazenar muito mais dados graças à compressão [[11](http://nixventure.blogspot.com/2017/07/discovering-zram-and-replacing-all-tmpfs.html)]. A viabilidade prática do modelo do Saddle depende criticamente de encontrar um equilíbrio que minimize a sobrecarga da compressão/descompressão e evite que o consumo de RAM do `rclone` domine os recursos disponíveis para a camada de cache e troca.
|
|
10
|
-
|
|
11
|
-
| Componente Tecnológico | Propósito no Saddle | Vantagens Comprovadas | Riscos e Limitações Identificadas |
|
|
12
|
-
| :--- | :--- | :--- | :--- |
|
|
13
|
-
| **Filesystem in Userspace (FUSE)** | Montar serviços de armazenamento remoto (Hugging Face, Kaggle, etc.) como um sistema de ficheiros local. | Abstração de alto nível para sistemas de ficheiros remotos; vasto suporte de ferramentas como o rclone [[21](https://rclone.org/commands/rclone_mount/)]. | Consumo elevado de RAM (vazamentos e enumeração de diretórios) [[16](https://github.com/rclone/rclone/issues/2157), [19](https://forum.rclone.org/t/rclone-mount-memory-leaks-gdrive-enumeration/16475)]; desempenho de E/S limitado pela latência da rede [[22](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29651), [24](https://forum.rclone.org/t/rclone-mount-performance-issue/43184)]. |
|
|
14
|
-
| **rclone** | Ferramenta de linha de comando para gerir transferências e montar sistemas de ficheiros remotos via FUSE. | Suporte para centenas de backends de armazenamento; integração com pipelines de CI/CD (ex: GitHub Actions) [[18](https://github.com/marketplace/actions/setup-rclone-action)]. | Regressões de desempenho entre versões [[16](https://github.com/rclone/rclone/issues/2157)]; configuração complexa para otimização (cache, buffers, transfers) [[24](https://forum.rclone.org/t/rclone-mount-performance-issue/43184)]. |
|
|
15
|
-
| **tmpfs** | Sistema de ficheiros em RAM para uso como cache de memória e ponto de montagem temporário. | Velocidade de E/S extremamente rápida, próxima da RAM [[5](https://spin.atomicobject.com/protecting-ubuntu-root-filesystem/)]. | Tamanho limitado (por defeito, metade da RAM); potencial para falhas se o limite for ultrapassado [[5](https://spin.atomicobject.com/protecting-ubuntu-root-filesystem/)]. |
|
|
16
|
-
| **zram** | Módulo do kernel para criar um dispositivo de bloco comprimido em RAM para uso como swap. | Amplia a capacidade de memória virtual além da RAM física; I/O muito mais rápido que o disco físico [[10](https://docs.kernel.org/admin-guide/blockdev/zram.html)]. | Sobrecarga de CPU para compressão/descompressão; a eficácia depende do tipo de dados (melhor para dados compressíveis) [[14](https://forums.gentoo.org/viewtopic.php?t=1126471)]. |
|
|
17
|
-
| **union-fs / mergerfs** | Agregar múltiplos sistemas de ficheiros (incluindo o FUSE mount) num único ponto de montagem lógico. | Flexibilidade na gestão de armazenamento heterogéneo [[23](https://github.com/trapexit/mergerfs/issues/869)]. | Não é uma solução de cache de memória; pode introduzir complexidade e potenciais gargalos de desempenho [[23](https://github.com/trapexit/mergerfs/issues/869)]. |
|
|
18
|
-
|
|
19
|
-
Em suma, embora os blocos de construção individuais para a arquitetura de memória virtual do Saddle sejam tecnologias maduras e bem compreendidas, a sua integração numa solução coesa e escalável é onde reside a maior incerteza técnica. A premissa de que "armazenamento bytes and compute-memory bytes are the same bytes" é uma simplificação poderosa para a concepção do sistema, mas a realidade operacional envolverá um compromisso constante entre a latência do armazenamento remoto, o consumo de memória do software de montagem, a velocidade do cache de memória e a eficiência da troca comprimida. A viabilidade do projeto depende da capacidade de projetar e otimizar estas interacções para minimizar os gargalos e manter o consumo de recursos dentro de limites sustentáveis, especialmente em relação à memória RAM, que é o recurso mais escasso e crítico nestes ambientes.
|
|
20
|
-
|
|
21
|
-
## Arquitetura de Orquestração Distribuída e Utilização de Recursos Gratuitos
|
|
22
|
-
|
|
23
|
-
A estratégia de negócio e técnica do Saddle assenta numa premissa poderosa: a orquestração distribuída de cargas de trabalho computacionais utilizando plataformas de código aberto e gratuitas como backend [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. Em vez de construir e manter a sua própria infraestrutura de nuvem, o framework visa agir como um "bot" multi-plataforma, inscrevendo-se como uma aplicação de terceiros e alocando recursos de computação em serviços como GitHub Actions & Codespaces, GitLab CI, Forgejo/Gitea, e até mesmo cadernetas Jupyter em plataformas como ModelScope [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. Esta abordagem descentralizada promete uma escalabilidade teoricamente ilimitada com um custo operacional próximo de zero, um diferencial competitivo significativo. A viabilidade desta estratégia depende não apenas da existência dessas plataformas, mas também da sua capacidade de serem integradas, orquestradas e geridas de forma eficiente, superando as suas inherentemente variáveis e limitadas naturezas.
|
|
24
|
-
|
|
25
|
-
A plataforma primária mencionada para a execução de cargas de trabalho é o GitHub Actions [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. A integração seria alcançada através da publicação do pacote `@wenathlan/saddle` num registo público como o npm, que por sua vez seria consumido por fluxos de trabalho de ações [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. A viabilidade desta integração é corroborada pela existência de acções personalizadas, como o `AnimMouse/setup-rclone`, que demonstram a capacidade de automatizar a instalação e configuração de ferramentas complexas como o rclone dentro de um ambiente de runner do GitHub [[18](https://github.com/marketplace/actions/setup-rclone-action)]. Estas acções permitem passar credenciais e configurações como segredos codificados em Base64, resolvendo o problema da autenticação programática [[18](https://github.com/marketplace/actions/setup-rclone-action)]. No entanto, a utilização de GitHub Actions não está isenta de desafios. Os runners nativos têm limitações bem definidas em termos de tempo de execução e recursos de memória. Relatos de utilizadores mostram que até mesmo runners auto-hospedados podem sofrer de esgotamento de memória, levando a falhas inesperadas no início de um job [[28](https://github.com/microsoft/AL-Go/issues/781)]. Da mesma forma, fluxos de trabalho de ações nativos podem falhar com erros de "out of memory" mesmo quando funcionam perfeitamente noutras configurações, indicando a fragilidade dos recursos alojados [[27](https://github.com/actions/runner/issues/1051)]. O Saddle pretende mitigar este risco fragmentando a carga de trabalho e distribuindo-a simultaneamente por múltiplas plataformas, criando um grande agrupamento de recursos de computação dispersos geograficamente. Este modelo de "multi-tenancy" de recursos de terceiros é a essência da sua proposta.
|
|
26
|
-
|
|
27
|
-
Além do GitHub, o Saddle alarga a sua rede de recursos a outras plataformas de CI/CD e desenvolvimento. O GitLab Free oferece um número limitado de minutos de CI mensais (400 min/mês) e tem restrições no tamanho do projeto (10 GB), o que implica uma gestão cuidadosa dos artefactos e da duração dos jobs para não exceder os quotas [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. Serviços como o Codeberg, frequentemente associado a motores de CI como o Woodpecker, oferecem quotas adicionais (ex: 750 MB para projetos de código aberto livre), expandindo ainda mais o ecossistema de recursos disponíveis [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. A inclusão de plataformas como o ModelScope, que fornece cadernetas Jupyter VMs gratuitas, e servidores auto-hospedados de Forgejo/Gitea ou outros registos de pacotes, mostra uma ambição de maximizar a utilização de qualquer recurso computacional disponível [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. A viabilidade desta estratégia de diversificação depende inteiramente da robustez do motor de orquestração do Saddle. Este motor deve ser capaz de interpretar uma tarefa, avaliar as quotas e limitações de cada plataforma-alvo, distribuir partes da carga de forma inteligente, monitorizar o progresso, e recuperar de falhas que são inerentes a ambientes tão heterogéneos e pouco controláveis. A complexidade não reside tanto em iniciar um trabalho numa plataforma, mas em gerir o ciclo de vida completo de uma tarefa distribuída através de uma frota de serviços com diferentes políticas, níveis de serviço e taxas de falha.
|
|
28
|
-
|
|
29
|
-
A tabela seguinte resume as características e limitações das plataformas de computação propostas, destacando os desafios para a orquestração distribuída pelo Saddle.
|
|
30
|
-
|
|
31
|
-
| Plataforma | Tipo de Recurso | Limitações Chave | Viabilidade para Saddle |
|
|
32
|
-
| :--- | :--- | :--- | :--- |
|
|
33
|
-
| **GitHub Actions** | Runners Alojados e Codespaces | Tempo de execução máximo por job (ex: 6 horas); limitações de memória (ex: 14 GB); custo para minutos excedentes [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. | Baixa-média. O risco de falhas por falta de memória é alto [[27](https://github.com/actions/runner/issues/1051), [28](https://github.com/microsoft/AL-Go/issues/781)]. A orquestração depende de múltiplas plataformas para mitigar isto. |
|
|
34
|
-
| **GitLab CI** | Minutos de CI Mensais | Limite de 400 minutos/mês no plano gratuito [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. | Média. A quota de tempo é um fator limitante importante que requer gestão eficiente da carga de trabalho. |
|
|
35
|
-
| **Forgejo / Gitea** | Auto-hospedado | Capacidade teoricamente ilimitada, mas dependente da infraestrutura subjacente e da manutenção do executor [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. | Alta. Oferece recursos estáveis e previsíveis, sendo uma boa base para executores confiáveis. |
|
|
36
|
-
| **ModelScope** | Caderneta Jupyter VM | Disponibilidade e política de uso para tarefas computacionais prolongadas são incertas [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. | Baixa. A natureza imprevisível e potencialmente restritiva torna-o um recurso de baixa confiança. |
|
|
37
|
-
| **Registos de Pacotes (npm, Docker)** | Execução de Código | Permite a execução de código como parte de processos de build ou deploy. Pode ser usado como um executor de tarefas simples [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. | Baixa. As capacidades computacionais e as quotas são geralmente muito limitadas. |
|
|
38
|
-
|
|
39
|
-
A estratégia de utilizar uma frota heterogénea de plataformas de terceiros é tecnicamente viável e representa uma abordagem moderna à computação distribuída. No entanto, o sucesso do Saddle não estará no seu conhecimento das APIs individuais, mas na sofisticação do seu motor de orquestração. Este motor precisa de ser um "mestre do campo", capaz de tomar decisões dinâmicas sobre onde executar cada parte de uma tarefa complexa. Ele deve ponderar o custo implícito (consumo de memória, tempo de execução, risco de falha) de cada plataforma e alavancar a fragmentação para construir uma máquina virtual coesa e resiliente. O desafio principal é transformar a instabilidade e a heterogeneidade inerentes a este modelo em uma vantagem competitiva, proporcionando um ambiente de execução aparentemente homogéneo e de alto desempenho, tudo enquanto opera "nas sombras" de gigantes da tecnologia, sem violar os seus termos de serviço.
|
|
40
|
-
|
|
41
|
-
## Gestão de Infraestrutura, Automação e Contornos de Segurança
|
|
42
|
-
|
|
43
|
-
Para além da arquitetura de armazenamento e orquestração, a viabilidade prática do Saddle depende criticamente da sua capacidade de gerir uma infraestrutura complexa e dinâmica. Este gestor de infraestrutura deve lidar com a automação de pré-requisitos nos ambientes de execução, a superação de barreiras de acesso programático como os CAPTCHAs, e a distribuição eficiente do próprio pacote de software. Cada um destes elementos representa um conjunto distinto de desafios técnicos e operacionais que, se mal executados, podem comprometer todo o sistema.
|
|
44
|
-
|
|
45
|
-
Um dos requisitos operacionais mais básicos para o Saddle é a capacidade de preparar o ambiente de execução antes de poderem ser iniciadas as cargas de trabalho computacionais. Dado que os runners das plataformas de terceiros (como GitHub Actions ou GitLab CI) começam num estado limpo, todas as dependências, como o utilitário `rclone` e as suas configurações de remoto, precisam de ser instaladas e configuradas dinamicamente. A viabilidade desta automação é demonstrada pela existência de acções GitHub personalizadas, como o `AnimMouse/setup-rclone`, que automatizam precisamente este processo [[18](https://github.com/marketplace/actions/setup-rclone-action)]. Estas acções podem instalar uma versão específica do `rclone`, configurá-lo a partir de um segredo codificado em Base64 (uma prática necessária devido aos limites de tamanho de segredos de 48 KB), e até mesmo gerir tokens de API expirados [[18](https://github.com/marketplace/actions/setup-rclone-action)]. A estratégia do Saddle de distribuir o pacote `@wenathlan/saddle` através de registos públicos como o npm e o GitHub Packages é o meio ideal para entregar o script de orquestração que invocará estas acções de pré-instalação [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. A entrega do pacote através de uma CDN pública como o jsDelivr garante uma distribuição global rápida e eficiente [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. A repackagem do pacote para formatos complementares, como um nó para a ferramenta de automação n8n, uma extensão de navegador CRX, ou aplicações nativas para Android/iOS, demonstra uma ambição de integração profunda que vai além de simples execução de scripts de linha de comandos [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. No entanto, a complexidade da configuração de `rclone`, que pode envolver ficheiros de configuração grandes e a gestão de múltiplos sistemas de ficheiros remotos, representa um ponto de fricção. A necessidade de comprimir e codificar em Base64 grandes ficheiros de configuração para caber nos limites de segredos de algumas plataformas adiciona uma camada de complexidade à automação [[18](https://github.com/marketplace/actions/setup-rclone-action)].
|
|
46
|
-
|
|
47
|
-
Um obstáculo mais significativo à automação programática é a proliferação de sistemas de verificação humana, mais conhecidos como CAPTCHAs, usados por muitos serviços web para impedir o acesso de bots. O Saddle reconhece este desafio e afirma ter uma estratégia para o contornar, especificamente mencionando o uso de "Vision-Language Models (VLM ONNX) and token-based APIs" para bypass de captchas como hCaptcha, Cloudflare Turnstile e reCAPTCHA [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. Esta é uma declaração de alto nível que carece de detalhes técnicos concretos nas fontes fornecidas. O uso de modelos de aprendizagem de máquina para resolver CAPTCHAs é um campo de investigação ativo, mas a implementação prática, a fiabilidade em larga escala, o custo computacional e, crucialmente, a conformidade com os termos de serviço das plataformas-alvo (como Google para reCAPTCHA) são questões profundamente incertas. Nenhuma das fontes consultadas refere projetos de código aberto maduros ou frameworks que realizem esta tarefa de forma robusta e generalizável. Portanto, esta funcionalidade representa o maior ponto de incerteza e risco para o projeto. Se a estratégia de bypass de CAPTCHAs falhar, o Saddle ficaria bloqueado para acesso programático a uma vasta gama de serviços essenciais, desde os próprios serviços de armazenamento até às plataformas de orquestração. A sua eficácia seria o verdadeiro teste de viabilidade, separando a visão do produto real.
|
|
48
|
-
|
|
49
|
-
Finalmente, a distribuição e a segurança do pacote `@wenathlan/saddle` são aspectos fundamentais. A escolha de distribuir o pacote através de múltiplos registos (npm, Maven, NuGet, etc.) e de o espelhar automaticamente para o jsDelivr é uma estratégia sólida para garantir a resiliência e a disponibilidade [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. Esta redundância ajuda a mitigar a falha de um único ponto de distribuição. No entanto, ao tornar-se uma biblioteca executável que se torna uma máquina virtual wherever it is installed [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)], o pacote adquire um poder considerável. Ele terá permissões para montar sistemas de ficheiros, criar processos, e aceder a segredos (como chaves de API) armazenados nas plataformas de terceiros onde é executado. A segurança deste pacote torna-se, portanto, um requisito não negociável. Qualquer vulnerabilidade nele poderia ser explorada para comprometer a segurança dos recursos de armazenamento e computação acessados pelos runners. A governança do projeto, a auditoria de código regular e a comunicação transparente sobre as permissões necessárias e como são geridas são cruciais para ganhar a confiança da comunidade de desenvolvedores e dos proprietários das plataformas que apoiam o Saddle. A complexidade da arquitetura, com o pacote a ser repackaged para tantos formatos diferentes, também aumenta a superfície de ataque e o potencial para erros de implementação em certas camadas de abstração. Em última análise, a gestão de infraestrutura do Saddle é um exercício de engenharia sofisticada, onde a automação bem-sucedida, a superação de barreiras de segurança e a distribuição segura do núcleo do software devem funcionar em perfeita sintonia para sustentar toda a visão do projeto.
|
|
50
|
-
|
|
51
|
-
## Análise Comparativa de Desempenho e Riscos Operacionais
|
|
52
|
-
|
|
53
|
-
A avaliação da viabilidade do Saddle não pode ser puramente teórica; ela exige uma análise crítica do seu desempenho real e dos riscos operacionais inerentes ao seu modelo de funcionamento descentralizado. Ao examinar as evidências disponíveis, surgem paralelos interessantes com soluções comerciais de computação acelerada e emergem claramente os gargalos que podem limitar a eficácia do sistema. A proposta de valor do Saddle — um sistema de memória virtual gratuito e ilimitado — colide diretamente com as realidades físicas da computação: a latência da rede, a capacidade finita dos recursos de hardware e a complexidade da gestão distribuída.
|
|
54
|
-
|
|
55
|
-
Uma análise comparativa revela que, embora o Saddle aspire a criar uma experiência de memória local, ele dependerá de uma stack de software complexa que, por si só, introduz significativos atrasos. Soluções comerciais como o Depot, que se focam em acelerar pipelines de CI/CD, oferecem uma perspetiva valiosa. O Depot implementa um acelerador de disco em memória de nível de bloco, que intercepta as operações de E/S do disco e as redireciona para uma área de memória RAM [[25](https://news.ycombinator.com/item?id=43506574)]. Esta abordagem de nível inferior é fundamentalmente diferente da do Saddle, que depende do sistema de ficheiros do kernel e de ferramentas como o `rclone`. A vantagem do Depot é o controlo explícito: pode-se instruir o sistema para persistir imagens de Docker ou outros artefactos grandes em RAM, garantindo que não sejam evitados pelo algoritmo de substituição de página LRU (Least Recently Used) do kernel, que age de forma oportunista [[25](https://news.ycombinator.com/item?id=43506574)]. O Saddle, ao contrário, está sujeito ao comportamento do sistema de ficheiros padrão, o que significa que o seu "cache" de memória pode ser menos eficiente e mais difícil de prever. Além disso, o Depot utiliza ramdisks de verdade (dispositivos de bloco em RAM montados como sistemas de ficheiros), que oferecem desempenho de E/S superior ao de um `tmpfs` tradicional, especialmente para operações aleatórias [[26](https://medium.com/@akhilesh-mishra/your-github-actions-runners-are-slow-and-you-are-paying-too-much-for-them-5406577314fe)]. Embora o Saddle tente simular esta capacidade com a sua hierarquia `tmpfs`/`zram`, a sobrecarga da camada de FUSE e do `rclone` provavelmente irá mascarar a maioria, senão toda, a vantagem de desempenho potencial.
|
|
56
|
-
|
|
57
|
-
Os riscos operacionais do Saddle são multifacetados e estão intrinsecamente ligados à sua dependência de infraestruturas de terceiros. O primeiro e mais óbvio risco é a instabilidade. Os runners de plataformas como GitHub Actions ou GitLab CI são recursos partilhados, sujeitos a reinicializações, atualizações e falhas de hardware que estão fora do controlo do Saddle. Uma tarefa computacional complexa e de longa duração pode ser interrompida a qualquer momento, exigindo um mecanismo robusto de verificação e recomeço, o que adiciona complexidade ao fluxo de trabalho. A segunda categoria de riscos está relacionada com os limites e as políticas das plataformas. Como já mencionado, os limites de tempo, memória e armazenamento são severos e variam entre plataformas [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE), [27](https://github.com/actions/runner/issues/1051), [28](https://github.com/microsoft/AL-Go/issues/781)]. O Saddle precisará de um motor de orquestração extraordinariamente sofisticado para navegar nestes territórios, tomando decisões informadas sobre onde executar cada sub-tarefa. A mudança de políticas por parte de uma plataforma-chave (por exemplo, Microsoft introduzindo uma taxa para runners auto-hospedados no final de 2025) pode alterar drasticamente o equilíbrio de custos e benefícios do modelo de negócio do Saddle [[26](https://medium.com/@akhilesh-mishra/your-github-actions-runners-are-slow-and-you-are-paying-too-much-for-them-5406577314fe)].
|
|
58
|
-
|
|
59
|
-
A seguir, uma tabela que sintetiza os principais riscos operacionais e as suas consequências potenciais:
|
|
60
|
-
|
|
61
|
-
| Categoria de Risco | Descrição do Risco | Consequência Potencial para o Saddle |
|
|
62
|
-
| :--- | :--- | :--- |
|
|
63
|
-
| **Instabilidade de Recursos** | Dependência de runners de terceiros que podem falhar, reiniciar ou serem desativados inesperadamente. | Interrupção de tarefas de longa duração; necessidade de lógica complexa de verificação e recomeço; resultados inconsistentes. |
|
|
64
|
-
| **Consumo Oculto de Memória** | O processo de montagem `rclone` consome RAM de forma significativa, que não é creditada ao job da tarefa. | Redução da RAM disponível para a computação real; risco de falhas por falta de memória ("Out-of-Memory"); anulação da economia pretendida. [[16](https://github.com/rclone/rclone/issues/2157), [19](https://forum.rclone.org/t/rclone-mount-memory-leaks-gdrive-enumeration/16475)] |
|
|
65
|
-
| **Desempenho de I/O Inconsistente** | A performance de E/S via FUSE é variável, sensível à latência da rede e à carga do servidor remoto. | Desempenho geral mais lento do que a RAM local; gargalos de E/S que limitam a velocidade da computação; experiências de usuário frustrantes. [[22](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29651), [24](https://forum.rclone.org/t/rclone-mount-performance-issue/43184)] |
|
|
66
|
-
| **Dependência de CAPTCHAs** | A necessidade de contornar sistemas de verificação humana para obter acesso programático a serviços. | Bloqueio total de acesso a serviços importantes se a estratégia de bypass falhar; dependência de tecnologias de IA voláteis e potencialmente ilegais. [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)] |
|
|
67
|
-
| **Complexidade de Gestão** | A necessidade de gerir uma frota heterogénea de plataformas com diferentes APIs, limites e políticas. | Altíssima complexidade de desenvolvimento do motor de orquestração; dificuldade em otimizar a alocação de recursos; aumento do custo de manutenção. |
|
|
68
|
-
| **Segurança e Governança** | O pacote `@wenathlan/saddle` possui privilégios elevados nos ambientes onde é executado. | Vulnerabilidades de segurança que podem ser exploradas para comprometer os recursos de armazenamento e computação dos utilizadores. [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)] |
|
|
69
|
-
|
|
70
|
-
Em última análise, a proposta do Saddle é menos uma implementação de um framework existente e mais um experimento de fronteira na engenharia de sistemas. A sua viabilidade prática não será determinada por um único fator, mas por uma série de compromissos. O sistema funcionará melhor para cargas de trabalho que são tolerantes à latência, resilientes a interrupções e cujos dados são suficientemente compressíveis para minimizar o impacto do `zram`. Para tarefas que exigem desempenho de memória de baixa latência e alta confiabilidade, como treinar modelos de IA de grande escala, o Saddle provavelmente não será competitivo em relação a soluções de nuvem dedicadas. No entanto, para tarefas mais moderadas, como compilação de software, processamento de dados em pequena escala ou como um ambiente de desenvolvimento interativo leve, a sua proposta de valor de um sistema de memória virtual gratuito e descentralizado pode ser extremamente atraente. A chave para o seu sucesso reside em gerir ativamente estes riscos, aceitando as suas limitações e construindo uma camada de abstração que torne a complexidade subjacente invisível ao utilizador final.
|
|
71
|
-
|
|
72
|
-
## Conclusões sobre a Viabilidade Prática e Potencial Futuro
|
|
73
|
-
|
|
74
|
-
Após uma análise aprofundada dos componentes técnicos, da arquitetura de orquestração e dos riscos operacionais inerentes, a viabilidade prática do framework Saddle emerge como uma possibilidade intermediária, marcada por avanços significativos na fronteira da engenharia de sistemas, mas também por riscos substantivos que ameaçam a sua estabilidade e desempenho. O projeto não é impossível, mas representa um protótipo de engenharia sofisticada que combina peças de software existentes numa nova e ambiciosa configuração. A sua viabilidade final dependerá da capacidade de mitigar os gargalos identificados, principalmente aqueles relacionados com o consumo de memória e a performance de E/S.
|
|
75
|
-
|
|
76
|
-
A premissa central do Saddle — transformar armazenamento em memória — é tecnicamente viável em princípio, graças à existência de tecnologias maduras como FUSE para montar sistemas de ficheiros remotos, e `tmpfs` e `zram` para criar uma hierarquia de memória virtual [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE), [5](https://spin.atomicobject.com/protecting-ubuntu-root-filesystem/), [10](https://docs.kernel.org/admin-guide/blockdev/zram.html), [21](https://rclone.org/commands/rclone_mount/)]. A integração destas tecnologias em um ecossistema automatizado, como demonstrado pela existência de acções GitHub para instalar o `rclone`, valida a viabilidade de criar um ambiente de execução dinâmico em plataformas de terceiros [[18](https://github.com/marketplace/actions/setup-rclone-action)]. No entanto, a síntese destes componentes numa máquina virtual coesa é onde reside a maior incerteza. A evidência indica que o processo de montagem remota via `rclone` pode ter um custo de memória oculto significativo, com relatos de utilizadores de consumo excessivo de RAM que podem levar a falhas de sistema [[16](https://github.com/rclone/rclone/issues/2157), [19](https://forum.rclone.org/t/rclone-mount-memory-leaks-gdrive-enumeration/16475)]. Este consumo de RAM, combinado com a alocação de `tmpfs` e `zram`, pode criar um ciclo vicioso onde o "custo" de expansão do armazenamento virtual se traduz num "custo" de memória proibitivo, anulando a economia pretendida e representando o risco mais proeminente para o projeto. Adicionalmente, a performance de E/S através de FUSE é inerentemente limitada pela latência da rede e pode ser inadequada para cargas de trabalho intensivas, como demonstrado por benchmarks que mostram velocidades comparáveis a discos rígidos padrão [[22](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29651), [24](https://forum.rclone.org/t/rclone-mount-performance-issue/43184)].
|
|
77
|
-
|
|
78
|
-
A estratégia de orquestração distribuída, que alarga os recursos de computação através de múltiplas plataformas gratuitas como GitHub Actions, GitLab CI e ModelScope, é uma jogada estratégica e tecnicamente viável [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. A capacidade de fragmentar e distribuir cargas de trabalho para evitar os limites de recursos de uma única plataforma é um conceito poderoso. Contudo, o sucesso desta estratégia depende de um motor de orquestração excepcionalmente robusto, capaz de gerir a heterogeneidade, as variações de políticas e a instabilidade inerentes a esta frota de recursos de terceiros. O desafio não está em fazer a chamada à API, mas em gerir o ciclo de vida completo de uma tarefa distribuída de forma resiliente e eficiente. A incerteza mais crítica neste domínio é a estratégia do Saddle para contornar os CAPTCHAs, que são um obstáculo fundamental para o acesso programático a muitos dos serviços que pretende utilizar [[1](https://cdn.qwenlm.ai/b9f87ac9-82a2-4ffc-aa86-c8227a70fa27/0d3870e4-eec0-4114-af59-4bc61f73c724_README.TXT?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXNvdXJjZV91c2VyX2lkIjoiYjlmODdhYzktODJhMi00ZmZjLWFhODYtYzgyMjdhNzBmYTI3IiwicmVzb3VyY2VfaWQiOiIwZDM4NzBlNC1lZWMwLTQxMTQtYWY1OS00YmM2MWY3M2M3MjQiLCJyZXNvdXJjZV9jaGF0X2lkIjpudWxsfQ.bRWGBFygDqaxP7GECDPmmu2ZKBTDEMX99ciQ64K2NlE)]. A ausência de evidências concretas sobre a implementação e fiabilidade desta funcionalidade representa um ponto de risco elevado.
|
|
79
|
-
|
|
80
|
-
Se bem-sucedido, o Saddle poderia democratizar o acesso a poder de computação, permitindo que indivíduos e pequenos grupos realizassem tarefas computacionais que hoje exigem investimentos significativos em infraestrutura de nuvem. O seu potencial futuro reside na sua capacidade de se tornar uma camada de abstração de baixo nível, transparente para o utilizador final, que mascara a complexidade da gestão distribuída e dos recursos de terceiros. No entanto, se falhar, o resultado mais provável será um sistema frustrantemente lento e instável, com custos de RAM ocultos que tornam a sua proposta de "gratuito" questionável. Em conclusão, a pesquisa indica que o framework Saddle é uma hipótese de implementação tecnicamente desafiadora, mas não impossível. A sua validação prática requer uma implementação extremamente cuidadosa, otimização de baixo nível e uma aceitação explícita dos compromissos de desempenho inevitáveis.
|