@wenathlan/saddle 1.8.18 → 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 +33 -12
- 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 -123
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1018 -123
- 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/contracts.d.ts → isolation.d.ts} +12 -1
- package/dist/isolation.d.ts.map +1 -0
- package/dist/{isolation/contracts.js → isolation.js} +13 -1
- 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/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.19.md +35 -0
- package/docs/research-1.8.19-virtual-browser.md +27 -0
- package/docs/security.md +454 -0
- package/docs/todo-1.8.18.md +12 -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 -56
- 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/isolation/contracts.d.ts.map +0 -1
- package/dist/isolation/contracts.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/{extension/README.md → docs/extension.md} +0 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Saddle 1.8.19 planning base
|
|
2
|
+
|
|
3
|
+
## Product direction
|
|
4
|
+
|
|
5
|
+
Saddle 1.8.19 prioritizes a **virtual control plane**. The library can represent, validate, compare, deny and hand off requests for virtual storage, binary processing, containers, micro-VMs and browser sessions. It does not silently access a user's device, installed browser, browser profile, local files, local storage, credentials, process table or network configuration.
|
|
6
|
+
|
|
7
|
+
“Virtual” is an operational property of a caller-owned remote adapter and its host. A browser-only demonstration, an in-memory object or an in-process cache cannot be represented as a virtual machine, remote browser or remote storage service. Every operational effect requires an explicit policy, approval, named adapter and receipt.
|
|
8
|
+
|
|
9
|
+
## Browser direction
|
|
10
|
+
|
|
11
|
+
| Surface | 1.8.19 interpretation | Operational boundary |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| Saddle Browser | A custom visual shell, session manifest and adapter-selection surface. | It becomes a remote isolated browser only when a caller supplies a verified browser-runtime adapter. |
|
|
14
|
+
| Chromium family | Capability adapters for Chromium, Chrome, Edge, Brave, Vivaldi, Opera and compatible distributions. | One selected remote image or executable has one declared engine and distribution; the root does not install or control it. |
|
|
15
|
+
| Gecko family | Capability adapters for Firefox, Tor Browser and compatible Gecko distributions. | A Gecko adapter is distinct from a Chromium adapter and must have its own capability receipt. |
|
|
16
|
+
| WebKit family | A future capability adapter family, included in planning for broad engine coverage. | No WebKit runtime is claimed or activated by 1.8.19 planning. |
|
|
17
|
+
| Remote browser service | An adapter contract compatible with an operator-hosted browser container or remote-display service. | It requires a host, runtime/image, network and authentication policy owned by the operator. |
|
|
18
|
+
|
|
19
|
+
The product must not claim that a single “master browser” merges the Chromium and Gecko engines. The realistic path is one custom Saddle Browser experience that selects among independently built and independently evidenced engine adapters.
|
|
20
|
+
|
|
21
|
+
## Virtual execution direction
|
|
22
|
+
|
|
23
|
+
| Request | Root-library result | Required operational adapter |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| Remote artifact transfer | A bounded storage plan, policy decision and handoff reference. | A caller-owned remote storage adapter. |
|
|
26
|
+
| Binary processing | An inspection, transform or execution plan with no local effect. | A caller-owned WASM, container, process, micro-VM or remote-runner adapter. |
|
|
27
|
+
| Container job | An image, platform, limits and receipt requirement. | An operator-owned OCI runtime and host. |
|
|
28
|
+
| Micro-VM job | Kernel/image/limit/network requirements and a lifecycle receipt schema. | An operator-owned micro-VM host with real virtualization support. |
|
|
29
|
+
| Browser session | Engine preference, profile policy, network policy and capability request. | An operator-owned remote-browser adapter. |
|
|
30
|
+
|
|
31
|
+
## Neko-derived architecture evidence
|
|
32
|
+
|
|
33
|
+
Neko describes itself as a self-hosted virtual browser that runs in Docker and streams a desktop using WebRTC. Its public GitHub workflow builds a base image and separate application images through a matrix of browser and desktop choices, with platform declarations rather than a merged browser engine.[1] Its documentation makes file uploads/downloads and persistent browser profiles explicit policy changes, and its remote transport requires WebRTC networking or a TURN configuration.[2]
|
|
34
|
+
|
|
35
|
+
Saddle can adopt these **architectural lessons** without copying Neko or assuming its infrastructure exists: use a base runtime plus distinct engine images, record platform/image capability receipts, treat remote display as a transport adapter, keep browser profile persistence opt-in, and separate build workflows from service operation. A Neko-compatible adapter remains a future integration point; it is not an embedded service in the package.
|
|
36
|
+
|
|
37
|
+
## 1.8.19 first implementation selection
|
|
38
|
+
|
|
39
|
+
The first implementable block is an additive **remote-browser capability contract** that extends the 1.8.18 denied-by-default isolation API. It must represent engine family, distribution, session policy, display transport, image reference, storage policy, capability receipt and adapter handoff. Deterministic tests will verify selection and denial states without starting a browser, container, micro-VM or network service.
|
|
40
|
+
|
|
41
|
+
## Artifact recovery boundary
|
|
42
|
+
|
|
43
|
+
The public `v1.8.18` tag and the packages already released from it remain immutable. Failed desktop and mobile release jobs used the tagged source that predated the web alias correction. Rerunning such a job would repeat the old source failure; a complete corrected desktop/mobile asset matrix therefore requires a later version after the 1.8.19 source is approved. The 1.8.18 package registries, Pages deployment and successful workflow evidence remain separate from missing release attachments.
|
|
44
|
+
|
|
45
|
+
## References
|
|
46
|
+
|
|
47
|
+
[1] [Neko repository and GHCR image build workflow](https://github.com/m1k1o/neko)
|
|
48
|
+
|
|
49
|
+
[2] [Neko documentation: browser images, WebRTC, storage and profile policies](https://neko.m1k1o.net/docs/v2)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Saddle 1.8.19 release notes
|
|
2
|
+
|
|
3
|
+
## Release intent
|
|
4
|
+
|
|
5
|
+
Version **1.8.19** reorganizes the existing Saddle implementation into **twenty correlated logic domains**. It is an architecture and maintainability release: it does not remove public features, introduce an implicit infrastructure provider, or relax the existing default-denial boundaries for browser, filesystem, storage, network, runner and remote-provider effects.
|
|
6
|
+
|
|
7
|
+
## Architecture changes
|
|
8
|
+
|
|
9
|
+
| Domain change | Result | Compatibility boundary |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| Public root router | The package root re-exports coherent domain façades rather than a long undifferentiated module list. | The root remains transport-neutral. |
|
|
12
|
+
| Foundation and execution | Domain nouns moved into `core/`; queues, workflow dispatch and session behavior moved into `runtime/`. | Published session and queue subpaths resolve to their new compiled files. |
|
|
13
|
+
| Communication and adapters | JSON-family protocol, webhook and MCP logic moved into API and adapter contexts. | API names and MCP command behavior remain unchanged. |
|
|
14
|
+
| Automation and modes | Workflow, bot and automation surfaces share an automation context; target profiles belong to modes. | Bot and surface-requirement subpaths remain available. |
|
|
15
|
+
| Distribution and acquisition | Delivery and proxy-pool logic now live beside their related package and scrape contracts. | Delivery and deploy subpaths remain available. |
|
|
16
|
+
|
|
17
|
+
The complete ownership map and dependency-flow diagram are included with the package documentation. The only allowed effects remain caller-owned adapters that are explicitly supplied and approved at invocation time.
|
|
18
|
+
|
|
19
|
+
## Package and native metadata
|
|
20
|
+
|
|
21
|
+
| Surface | Active version |
|
|
22
|
+
| --- | --- |
|
|
23
|
+
| npm, Maven, NuGet and RubyGems | `1.8.19` |
|
|
24
|
+
| Desktop and extension | `1.8.19` |
|
|
25
|
+
| Capacitor mobile metadata | `1.8.19` |
|
|
26
|
+
| iOS marketing version / build number | `1.8.19` / `1008019` |
|
|
27
|
+
| Robots user agent | `Saddle/1.8.19` |
|
|
28
|
+
|
|
29
|
+
## Validation evidence
|
|
30
|
+
|
|
31
|
+
The source tree passed the engine build, **140 active Node tests**, **69 legacy Vitest tests**, web type checking and production build, flat-native ownership validation, format checking, npm pack dry-run, diff integrity checking, and a production dependency audit with no reported vulnerabilities. A web build produced a bundle-size advisory for a JavaScript chunk over 500 kB; this is a non-blocking bundler warning, not a failing gate.
|
|
32
|
+
|
|
33
|
+
## Release boundary
|
|
34
|
+
|
|
35
|
+
This document records publication readiness only. It does **not** claim that registries, remote runners, signing services, hosted browsers or native packages have been activated. A tag and release remain separate operator actions and must be created only after the validated commit is available on the main branch.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# 1.8.19 virtual browser research record
|
|
2
|
+
|
|
3
|
+
## Scope
|
|
4
|
+
|
|
5
|
+
This record evaluates Neko as a public reference for remote browser architecture. It is not an instruction to deploy Neko, a Docker runtime, a TURN server, a browser image or a micro-VM.
|
|
6
|
+
|
|
7
|
+
## Findings
|
|
8
|
+
|
|
9
|
+
| Finding | Planning consequence |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Neko is self-hosted, uses Docker and streams a desktop through WebRTC. | A browser service requires an operator-managed runtime, network and remote-display transport; it cannot live inside a static package or GitHub Pages site. |
|
|
12
|
+
| Neko's GHCR workflow builds a base image then runs a matrix for separate Firefox, Chromium, Chrome, Edge, Brave, Vivaldi, Opera, Tor Browser and desktop images. | Saddle should model engine and distribution selection as separate capabilities rather than claim source-level fusion of browser engines. |
|
|
13
|
+
| Neko treats file access and browser profile persistence as explicit configuration changes. | Saddle must keep transfers, downloads, uploads and persistence denied by default and adapter-owned. |
|
|
14
|
+
| Neko's remote interaction relies on WebRTC networking, with additional TURN or port configuration in some deployments. | A Saddle remote-browser adapter needs display transport, signaling, authentication and network-policy declarations before a real session can be claimed. |
|
|
15
|
+
| Neko supports other Linux desktop applications in addition to browsers. | Saddle can generalize its remote-runner contract beyond browsers while keeping every effect outside the root library. |
|
|
16
|
+
|
|
17
|
+
## Disposition
|
|
18
|
+
|
|
19
|
+
1.8.19 will introduce a data-only remote-browser capability model and test fixtures first. It will not bundle Neko, browser binaries, Docker, container images, TURN credentials, browser profiles or a persistent remote browser service. Those are future caller-selected adapters and operator deployments.
|
|
20
|
+
|
|
21
|
+
## Sources
|
|
22
|
+
|
|
23
|
+
- https://github.com/m1k1o/neko
|
|
24
|
+
- https://raw.githubusercontent.com/m1k1o/neko/master/.github/workflows/ghcr.yml
|
|
25
|
+
- https://raw.githubusercontent.com/m1k1o/neko/master/.github/workflows/image_base.yml
|
|
26
|
+
- https://raw.githubusercontent.com/m1k1o/neko/master/.github/workflows/image_app.yml
|
|
27
|
+
- https://neko.m1k1o.net/docs/v2
|
package/docs/security.md
ADDED
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
# Security - The 2026 Defense Stack
|
|
2
|
+
|
|
3
|
+
e2ugh protects untrusted code execution with a layered 2026 defense stack:
|
|
4
|
+
Landlock, seccomp, eBPF LSM, cgroups v2, post-quantum TLS, CRIU with SELinux
|
|
5
|
+
relabeling, and confidential-computing tiers (Intel TDX, AMD SEV-SNP). None of
|
|
6
|
+
these layers requires root at sandbox runtime, and each one fails closed. This
|
|
7
|
+
document specifies what each layer does, the exact kernel or library versions
|
|
8
|
+
that provide it, the threat model of the engine's own spoofing surface, and
|
|
9
|
+
the hardening pipeline that guards the repository itself. All facts were
|
|
10
|
+
verified against primary sources on 2026-08-22 (date-first discipline; version pins re-verified 2026-08-23) and are
|
|
11
|
+
implemented in `security.ts` (1,302 lines). The sandbox engines themselves
|
|
12
|
+
(QEMU 11.1.0, Firecracker 1.16.1, gVisor release-20260817.0, Kata 4.1.0,
|
|
13
|
+
Cloud Hypervisor v53.0) are described in `virtualization.md`; their selection
|
|
14
|
+
policy lives in `alternatives.md`.
|
|
15
|
+
|
|
16
|
+
Contexts covered (25): Landlock ABI v1-v10 timeline, unprivileged sandboxing,
|
|
17
|
+
LANDLOCK_ACCESS_FS_IOCTL_DEV, scopes, abstract UNIX sockets, SIGSYS,
|
|
18
|
+
SECCOMP_RET_TRAP, gVisor systrap, deny-by-default profiles, io_uring blocked,
|
|
19
|
+
CVE-2026-46315, moby 47532, task-level io_uring restrictions, eBPF LSM,
|
|
20
|
+
TOCTOU immunity, Hornet LSM v6, cgroups v2 rootless delegation, ML-KEM
|
|
21
|
+
FIPS 203, ML-DSA FIPS 204, X25519MLKEM768, RFC 10024, ChaCha20-Poly1305,
|
|
22
|
+
CRIU SELinux relabel, TDX, SEV-SNP.
|
|
23
|
+
|
|
24
|
+
## Contents
|
|
25
|
+
|
|
26
|
+
1. [Threat model of the spoofing surface](#threat-model)
|
|
27
|
+
2. [Landlock: unprivileged sandboxing at ABI v10](#landlock)
|
|
28
|
+
3. [seccomp: the syscall filter baseline](#seccomp)
|
|
29
|
+
4. [io_uring: the 2026 security pariah](#io-uring)
|
|
30
|
+
5. [eBPF and the eBPF LSM](#ebpf-lsm)
|
|
31
|
+
6. [cgroups v2: unified hierarchy and rootless delegation](#cgroups)
|
|
32
|
+
7. [Post-quantum TLS](#pqc)
|
|
33
|
+
8. [CRIU and SELinux relabeling on restore](#criu-relabel)
|
|
34
|
+
9. [Confidential computing: TDX and SEV-SNP](#confidential)
|
|
35
|
+
10. [The GPU virtual identity surface](#gpu-virtual identity)
|
|
36
|
+
11. [Network and checkpoint security](#network)
|
|
37
|
+
12. [Container hardening](#hardening)
|
|
38
|
+
13. [Layer composition in security.ts](#composition)
|
|
39
|
+
14. [Repository hardening pipeline](#pipeline)
|
|
40
|
+
15. [Sources](#sources)
|
|
41
|
+
|
|
42
|
+
## Threat model of the spoofing surface
|
|
43
|
+
|
|
44
|
+
e2ugh spoofs hardware identity (CPU model, memory size, GPU inventory) so
|
|
45
|
+
that software probing the sandbox believes it runs on high-end hardware. This
|
|
46
|
+
is an identity claim, not an isolation claim, and the threat model states both
|
|
47
|
+
directions explicitly: spoofing changes what the workload sees, never what the
|
|
48
|
+
operator gets.
|
|
49
|
+
|
|
50
|
+
| Asset | What spoofing protects | What spoofing does not protect |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| /proc/cpuinfo, /proc/meminfo | Workloads that gate on hardware identity (installer checks, license probes, benchmark harnesses) see the virtual board | An attacker using CPUID directly sees the real host CPU; only a VM (QEMU `-cpu EPYC-v5`) shapes CPUID |
|
|
53
|
+
| nvidia-smi / NVML | Tooling that reads NVML or parses nvidia-smi output reports the virtual GPU inventory | Any attempt to execute real CUDA kernels fails without actual GPUs; PCI device IDs on the bus are real |
|
|
54
|
+
| OpenCL/Vulkan device reports | clinfo and vulkaninfo report GPU-class devices backed by Rusticl and lavapipe | Rendering and compute still consume host CPU; there is no confidentiality effect at all |
|
|
55
|
+
| Resource limits | Generous shm and swap semantics prevent workload failures | A determined attacker can measure real throughput and infer the absence of hardware acceleration |
|
|
56
|
+
|
|
57
|
+
Accepted risks, stated plainly: timing side channels reveal software
|
|
58
|
+
rendering; CPUID on the bare host (outside QEMU) reveals the true processor;
|
|
59
|
+
and a static binary that issues raw syscalls bypasses LD_PRELOAD
|
|
60
|
+
interposition entirely (Go static builds, musl static builds). That last gap
|
|
61
|
+
is the reason identity spoofing is layered under QEMU or gVisor for hostile
|
|
62
|
+
workloads rather than standing alone; the full interposition analysis lives
|
|
63
|
+
in `viability.md` (honest limitations).
|
|
64
|
+
|
|
65
|
+
What the defense stack actually protects: untrusted code cannot escape
|
|
66
|
+
through the syscall surface (seccomp deny-by-default plus Landlock at the ABI
|
|
67
|
+
level the host kernel provides), cannot exhaust the host (cgroups v2 cpu,
|
|
68
|
+
memory, io, pids), cannot reach adjacent services (Landlock scopes and the
|
|
69
|
+
network policy in `passage.config`), cannot use io_uring (blocked everywhere
|
|
70
|
+
by default), and control traffic resists future cryptanalysis (hybrid
|
|
71
|
+
post-quantum TLS). VM-backed sandboxes add the full hypervisor boundary, with
|
|
72
|
+
the engine choosing Firecracker, QEMU, Cloud Hypervisor or Kata per the
|
|
73
|
+
selection policy documented in `alternatives.md`.
|
|
74
|
+
|
|
75
|
+
## Landlock: unprivileged sandboxing at ABI v10
|
|
76
|
+
|
|
77
|
+
Landlock is an unprivileged, stackable LSM: any process can restrict itself
|
|
78
|
+
without root, CAP_SYS_ADMIN, or help from a supervisor. The mainline kernel
|
|
79
|
+
has reached ABI v10, which turns Landlock into a complete sandboxing
|
|
80
|
+
primitive (filesystem, TCP, UDP, IPC, signals) that layers on top of seccomp
|
|
81
|
+
rather than replacing it.
|
|
82
|
+
|
|
83
|
+
| ABI | Kernel | Capability added |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| v1 | 5.13 | Filesystem access rights (execute, write_file, read_file, read_dir, remove_dir, remove_file, make_*) |
|
|
86
|
+
| v2 | 5.19 | Refer and directory changes (linking/renaming across hierarchies) |
|
|
87
|
+
| v3 | 6.2 | File truncate |
|
|
88
|
+
| v4 | 6.7 | Network: TCP bind and connect |
|
|
89
|
+
| v5 | 6.10 | LANDLOCK_ACCESS_FS_IOCTL_DEV (device ioctls) |
|
|
90
|
+
| v6 | 6.12 | Scopes: abstract UNIX socket restriction and signal restriction (SIGSYS on violation) |
|
|
91
|
+
| v7 | 6.15 | Audit logging of denials |
|
|
92
|
+
| v8 | 6.16 | RESTRICT_SELF TSYNC: no_new_privs propagation to multi-threaded processes |
|
|
93
|
+
| v9 | 6.17 | RESOLVE_UNIX scope for path resolution |
|
|
94
|
+
| v10 | 6.20 | Network: UDP bind, connect and send |
|
|
95
|
+
|
|
96
|
+
Engine usage facts, as implemented in `security.ts`: the ABI level is probed
|
|
97
|
+
at runtime through `landlock_create_ruleset(NULL, 0,
|
|
98
|
+
LANDLOCK_CREATE_RULESET_VERSION)`, the applied ruleset is restricted to the
|
|
99
|
+
features the running kernel actually supports, and every probe failure
|
|
100
|
+
degrades to the remaining layers instead of aborting the sandbox. Hosts older
|
|
101
|
+
than 6.7 get filesystem-only Landlock; hosts on 6.20 or later get the full
|
|
102
|
+
unprivileged sandbox with TCP and UDP control. The v6 scopes matter most for
|
|
103
|
+
this engine: they cut the abstract UNIX socket channel that would otherwise
|
|
104
|
+
let a sandboxed process talk to an unconfined local service, which is the
|
|
105
|
+
classic container-escape relay.
|
|
106
|
+
|
|
107
|
+
## seccomp: the syscall filter baseline
|
|
108
|
+
|
|
109
|
+
seccomp filters syscalls with BPF programs installed by the process itself
|
|
110
|
+
(or its supervisor) before untrusted code runs. The engine builds
|
|
111
|
+
deny-by-default filters: every syscall not explicitly allowed returns an
|
|
112
|
+
error, matching the Docker default-profile behavior of returning ENOSYS so
|
|
113
|
+
denied calls look absent rather than merely forbidden.
|
|
114
|
+
|
|
115
|
+
| Action | Result for the calling thread |
|
|
116
|
+
|---|---|
|
|
117
|
+
| SECCOMP_RET_KILL_PROCESS | Process killed immediately |
|
|
118
|
+
| SECCOMP_RET_KILL_THREAD | Offending thread killed |
|
|
119
|
+
| SECCOMP_RET_TRAP | SIGSYS delivered to the thread; the call appears to return with an error |
|
|
120
|
+
| SECCOMP_RET_ERRNO | Configured errno returned (the engine uses 38, ENOSYS) |
|
|
121
|
+
| SECCOMP_RET_USER_NOTIF | Supervisor notified and decides; the fd-injection ioctl enables file-descriptor substitution |
|
|
122
|
+
| SECCOMP_RET_TRACE / LOG / ALLOW | Ptrace observation, logging, or pass-through |
|
|
123
|
+
|
|
124
|
+
Three placements of the same mechanism appear across the stack:
|
|
125
|
+
|
|
126
|
+
1. gVisor systrap. The gVisor Sentry itself is entered through
|
|
127
|
+
SECCOMP_RET_TRAP: every guest syscall raises SIGSYS, and the signal
|
|
128
|
+
handler in the Sentry emulates the call in userspace. RET_TRAP is thus the
|
|
129
|
+
foundation of the default gVisor platform (release-20260817.0), not merely
|
|
130
|
+
a debugging tool.
|
|
131
|
+
2. Second-layer seccomp inside gVisor. The Sentry additionally installs its
|
|
132
|
+
own seccomp-bpf filter to constrain which syscalls can even reach the
|
|
133
|
+
Sentry - defense in depth inside the sandbox runtime itself.
|
|
134
|
+
3. The engine profile. `security.ts` ships a Docker-default-compatible
|
|
135
|
+
profile allowing roughly 140 syscalls with the privileged set denied, and
|
|
136
|
+
a policy proxy that hard-fails any profile build that does not deny the
|
|
137
|
+
io_uring family (next section).
|
|
138
|
+
|
|
139
|
+
## io_uring: the 2026 security pariah
|
|
140
|
+
|
|
141
|
+
io_uring is the kernel's high-performance asynchronous I/O subsystem, and as
|
|
142
|
+
of 2026 it is treated as a sandbox liability across the industry. The engine
|
|
143
|
+
position is simple: the io_uring family stays blocked in every sandbox
|
|
144
|
+
profile, and the performance cost is accepted (asynchronous file I/O inside
|
|
145
|
+
sandboxes uses thread pools instead). The kernel-side velocity work that uses
|
|
146
|
+
io_uring on the host (ZCRX receive, NVMe passthrough) is documented in
|
|
147
|
+
`performance.md` and operates outside the sandbox boundary.
|
|
148
|
+
|
|
149
|
+
| Actor | Position on io_uring in sandboxes |
|
|
150
|
+
|---|---|
|
|
151
|
+
| Docker default seccomp profile | Blocks io_uring syscalls since moby issue 47532 |
|
|
152
|
+
| gVisor | io_uring disabled by default in runsc |
|
|
153
|
+
| Kubernetes v1.33 audit and CIS benchmarks | Recommend blocking io_uring in container profiles |
|
|
154
|
+
| CVE record | CVE-2026-46315 (June 2026): information disclosure through io_uring |
|
|
155
|
+
| LWN, January 2026 | Task-level io_uring restrictions patchset: per-task limits designed to compose with seccomp, addressing the fact that SQPOLL and kernel-side offload can bypass a naive seccomp filter |
|
|
156
|
+
|
|
157
|
+
On x86_64 the blocked syscall numbers are io_uring_setup (425),
|
|
158
|
+
io_uring_enter (426) and io_uring_register (427). The engine denies the
|
|
159
|
+
family with ENOSYS, logs each denial as a policy audit event, and tracks the
|
|
160
|
+
LWN task-level restriction work as the only credible future path toward
|
|
161
|
+
re-enabling io_uring for trusted workloads.
|
|
162
|
+
|
|
163
|
+
## eBPF and the eBPF LSM
|
|
164
|
+
|
|
165
|
+
The eBPF LSM (Linux Security Module) interface, available since kernel 5.7,
|
|
166
|
+
attaches verified BPF programs to LSM hooks. The property that distinguishes
|
|
167
|
+
it from tracepoints and syscall tracing is TOCTOU immunity: LSM hooks execute
|
|
168
|
+
at the exact kernel decision point (file open, credential change, socket
|
|
169
|
+
operation), so there is no gap between the observation and the enforcement in
|
|
170
|
+
which an attacker could change the target object. Tracepoint-based policy
|
|
171
|
+
suffers precisely that gap - check-then-bind races - which is why the engine
|
|
172
|
+
treats eBPF LSM as the audit plane and ptrace/strace as debug-only tools
|
|
173
|
+
(measured in `performance.md`: eBPF tracing at 2 percent overhead versus
|
|
174
|
+
strace at 12x slowdown).
|
|
175
|
+
|
|
176
|
+
| Fact | Detail |
|
|
177
|
+
|---|---|
|
|
178
|
+
| Availability | Kernel 5.7 and later; enabled through the BPF LSM in the kernel security list (`/sys/kernel/security/lsm`) |
|
|
179
|
+
| Verification | Programs are verified by the kernel verifier at load time; hooks cannot corrupt kernel state |
|
|
180
|
+
| Hornet LSM v6 (April 2026) | Verifies eBPF program signatures in-kernel, closing the gap where an attacker with root loads a hostile BPF policy |
|
|
181
|
+
| Cloudflare practice | Uses eBPF LSM to live-patch vulnerability classes (CVE-2024-1086-style exploitation paths) on running fleets without rebooting |
|
|
182
|
+
|
|
183
|
+
The engine attaches counters to security_file_open, security_socket_create
|
|
184
|
+
and related hooks for intrusion telemetry, and uses a tracepoint on
|
|
185
|
+
sys_enter_io_uring_setup purely to count denied async I/O attempts. BPF
|
|
186
|
+
programs are never loaded inside sandboxes; they observe the host side only,
|
|
187
|
+
keeping the sandbox footprint free of privileged eBPF usage. The broader eBPF
|
|
188
|
+
networking and observability surfaces (XDP at 14 Mpps, ring buffers, Tetragon
|
|
189
|
+
per-VM syscall filtering, BPF arenas on kernel 6.17) are specified in
|
|
190
|
+
`performance.md` (observability) and `virtualization.md` (passage).
|
|
191
|
+
|
|
192
|
+
## cgroups v2: unified hierarchy and rootless delegation
|
|
193
|
+
|
|
194
|
+
cgroups v2 provide the resource envelope every other layer sits inside. The
|
|
195
|
+
unified hierarchy is the default on every modern distribution (RHEL 9 and
|
|
196
|
+
later, Ubuntu, Arch; managed by systemd), and the controllers the engine
|
|
197
|
+
uses are cpu, memory, io and pids. The multi-tenant scheduler (MTTG) that
|
|
198
|
+
consumes this layer is documented in `virtualization.md`; this section
|
|
199
|
+
covers only the security-relevant envelope.
|
|
200
|
+
|
|
201
|
+
| Controller | Engine setting | Purpose |
|
|
202
|
+
|---|---|---|
|
|
203
|
+
| cpu.max | Quota and period | CPU bandwidth per sandbox, maps Docker --cpus |
|
|
204
|
+
| cpu.weight | 1-10000 | Relative share under contention, per tenant QoS class |
|
|
205
|
+
| memory.max | Hard limit | Resident memory ceiling |
|
|
206
|
+
| memory.high | Soft throttle | Backpressure before the hard ceiling |
|
|
207
|
+
| memory.swap.max | Swap limit | Composes with --memory-swap -1 (unlimited) on the Docker path |
|
|
208
|
+
| pids.max | Process ceiling | Fork-bomb containment inside the sandbox |
|
|
209
|
+
| io.max / io.weight | Device I/O limits | Writeback-aware I/O control on the unified hierarchy |
|
|
210
|
+
|
|
211
|
+
Delegation is the reason rootless operation works: systemd subtree delegation
|
|
212
|
+
hands a cgroup subtree to an unprivileged user, and Podman and Docker rootless
|
|
213
|
+
use exactly that mechanism to run the whole container stack without root. The
|
|
214
|
+
engine writes its cgroup layout only into delegated subtrees and refuses to
|
|
215
|
+
touch the host root cgroup. This layer is what makes the Docker memory flags
|
|
216
|
+
from `performance.md` enforceable rather than advisory.
|
|
217
|
+
|
|
218
|
+
## Post-quantum TLS
|
|
219
|
+
|
|
220
|
+
Transport security in 2026 is post-quantum by default on this stack,
|
|
221
|
+
protecting sandbox control traffic against harvest-now-decrypt-later
|
|
222
|
+
collection.
|
|
223
|
+
|
|
224
|
+
| Primitive | Standard | Status in the engine stack |
|
|
225
|
+
|---|---|---|
|
|
226
|
+
| ML-KEM | FIPS 203 | Module-lattice key encapsulation; native in OpenSSL 3.5 |
|
|
227
|
+
| ML-DSA | FIPS 204 | Module-lattice signatures; native in OpenSSL 3.5 |
|
|
228
|
+
| SLH-DSA | FIPS 205 | Hash-based signatures; available for long-lived keys |
|
|
229
|
+
| X25519MLKEM768 | RFC 10024 mechanism | Hybrid classical-plus-PQ group; default TLS 1.3 key exchange in OpenSSL 3.5 |
|
|
230
|
+
| RFC 10024 | Published 2026-08-10 | Standardizes the PQ/T hybrid mechanisms for TLS 1.3 |
|
|
231
|
+
| ChaCha20-Poly1305 | RFC 8439 | Symmetric AEAD fallback for hosts without AES-NI |
|
|
232
|
+
|
|
233
|
+
The deployment consequence the engine relies on: OpenSSL 3.5 LTS ships
|
|
234
|
+
X25519MLKEM768 as the default TLS 1.3 group, and Node 24 bundles OpenSSL
|
|
235
|
+
3.5.5, so any TLS connection the orchestrator or the sandbox SDK makes
|
|
236
|
+
negotiates a hybrid post-quantum key exchange with zero additional code. The
|
|
237
|
+
secure-context builder in `security.ts` still pins the group list
|
|
238
|
+
(`X25519MLKEM768:X25519`) and TLS 1.3 as the minimum version so the guarantee
|
|
239
|
+
survives configuration drift. Client-side deployment is broad: Chrome,
|
|
240
|
+
Firefox and Brave prefer PQ groups, Cloudflare terminates them globally, and
|
|
241
|
+
AWS exposes PQ TLS in KMS, ACM and Secrets Manager. For symmetric encryption
|
|
242
|
+
on hosts without AES-NI, ChaCha20-Poly1305 remains the correct AEAD:
|
|
243
|
+
AES-256-GCM is up to three times faster with AES-NI, but ChaCha20 wins on
|
|
244
|
+
hardware without that acceleration (typical ARM and older x86_64 hosts), and
|
|
245
|
+
the cipher list keeps it available as the fallback. The same ChaCha20 stream
|
|
246
|
+
also encrypts CRIU checkpoint images (section on restore below).
|
|
247
|
+
|
|
248
|
+
In code, `security.ts` owns this surface end to end - the v3 redistribution
|
|
249
|
+
moved the post-quantum feature set out of the retired `future.ts` and back
|
|
250
|
+
into the security domain. Two symbols carry it: the `Rfc10024` negotiator
|
|
251
|
+
selects and pins the hybrid group list (X25519MLKEM768 first, X25519
|
|
252
|
+
classical fallback), and `PqcAuditTrail` is the tamper-evident chain for
|
|
253
|
+
every post-quantum key operation: append-only, hash-linked entries with an
|
|
254
|
+
ML-DSA signature over each link, so negotiation drift and key-usage anomalies
|
|
255
|
+
are detectable after the fact, not merely preventable. RFC 10024 was
|
|
256
|
+
published 2026-08-10 and standardizes exactly these PQ/T hybrid mechanisms
|
|
257
|
+
for TLS 1.3.
|
|
258
|
+
|
|
259
|
+
## CRIU and SELinux relabeling on restore
|
|
260
|
+
|
|
261
|
+
CRIU v4.2.1 checkpoints and restores process trees, and the restore path is
|
|
262
|
+
where label hygiene matters: an image dumped from an SELinux-confined process
|
|
263
|
+
must not come back with a different or missing label. CRIU supports LSM
|
|
264
|
+
profile restoration (`--lsm-profile selinux:<label>`), so restored processes
|
|
265
|
+
re-enter their original SELinux context. The `criurelabel` planner in
|
|
266
|
+
`security.ts` emits the relabel arguments plus a `chcon` fallback for image
|
|
267
|
+
trees when the CRIU build lacks the LSM option, and a policy audit event
|
|
268
|
+
records every relabel. Checkpoint images themselves are encrypted with
|
|
269
|
+
ChaCha20-Poly1305 (RFC 8439), so a stolen snapshot file does not leak guest
|
|
270
|
+
memory. This closes the loop with the checkpoint/restore usage described in
|
|
271
|
+
`virtualization.md`: warm starts must not become a downgrade attack on
|
|
272
|
+
label-based isolation.
|
|
273
|
+
|
|
274
|
+
## Confidential computing: TDX and SEV-SNP
|
|
275
|
+
|
|
276
|
+
For deployments where even the host operator is untrusted, the engine plans
|
|
277
|
+
two hardware confidential-computing tiers. QEMU 11.1.0 exposes both machine
|
|
278
|
+
types directly: `tdx-guest` with `sept-ve-disabled`, and `sev-snp-guest`
|
|
279
|
+
with `cbitpos=51 reduced-phys-bits=1` (both wired through the QEMU wrapper in
|
|
280
|
+
`virtualization.ts`). This section carries 27 documented contexts from the
|
|
281
|
+
2026-08-22 research pass.
|
|
282
|
+
|
|
283
|
+
| Context | Verified fact |
|
|
284
|
+
|---|---|
|
|
285
|
+
| Intel TDX baseline | TDX support improved through QEMU 10.1 and solidified in 11.1 |
|
|
286
|
+
| TDX module live update | Linux 7.2 updates the TDX module without reboot |
|
|
287
|
+
| TDX guest flag | `-machine q35 -object tdx-guest,sept-ve-disabled=on` in the QEMU wrapper |
|
|
288
|
+
| CVE-2026-20885 | TDX module vulnerability, INTEL-SA-01436, disclosed March 2026 |
|
|
289
|
+
| Google + Intel joint audit | 9 months, 10 security issues found and fixed |
|
|
290
|
+
| AMD SEV-SNP host floor | QEMU 9.2 host stack, kernel 6.14, Ubuntu 25.04 |
|
|
291
|
+
| SEV-SNP launch measurement | Attested launch measurement over guest memory |
|
|
292
|
+
| Attestation standards | RATS RFC 9334, AMD KDS, NVIDIA NRAS remote attestation |
|
|
293
|
+
| SVSM | VMPL2 vTPM, stateful, with virtio-blk backing |
|
|
294
|
+
| Key Broker Service | Trustee 0.12.0 KBS proxy for secret release |
|
|
295
|
+
| Secret injection | SEV secret area via config table; OVMF encrypted boot; Grub FV |
|
|
296
|
+
| Kata confidential pod | kata-qemu-nvidia-gpu-snp runtime class through CRI-O |
|
|
297
|
+
| Confidential GKE Nodes | H100 GA on Google Cloud (Blackwell generation announced) |
|
|
298
|
+
| Post-quantum attestation | Phase 4: Dilithium/ML-DSA signatures in the attestation chain |
|
|
299
|
+
| Other TEEs | Intel SGX, ARM CCA (Realm Management Extension) |
|
|
300
|
+
| Device migration | VFIO migration protocol v2 (QEMU 8.0+) for passthrough devices |
|
|
301
|
+
|
|
302
|
+
Positioning inside e2ugh: confidential tiers are optional depth rungs on the
|
|
303
|
+
detection-isolation ladder. The spoofing thesis (see `viability.md`) does not
|
|
304
|
+
require them; they exist for operators who must also defend the host-side
|
|
305
|
+
boundary against physical inspection. The GPU angle matters here too:
|
|
306
|
+
confidential computing with GPUs (MIGv2 plus CC mode on Blackwell, driver
|
|
307
|
+
570.124+) is tracked in `hardware.md`.
|
|
308
|
+
|
|
309
|
+
## The GPU virtual identity surface
|
|
310
|
+
|
|
311
|
+
The GPU identity layer rests on four public interception libraries, each
|
|
312
|
+
covering a different read channel. From a security standpoint these are
|
|
313
|
+
presence spoofing only - they answer inventory questions, never execute
|
|
314
|
+
kernels on silicon - and their honest limits are analyzed in `viability.md`.
|
|
315
|
+
|
|
316
|
+
| Library | Mechanism | Security-relevant scope |
|
|
317
|
+
|---|---|---|
|
|
318
|
+
| pogusthewhisper/fake-nvidia-smi | Pure-Python (stdlib only) fake CLI with flex profiles h100 81,559 MiB and a100 40,536 MiB | Replaces one binary; byte-format matches the NVIDIA manual (driver 575.57.08, CUDA 12.9) |
|
|
319
|
+
| x0x0x00/gpuadapter | CUDA API interception: libcuda, libcudart, libcublas, libnccl via LD_PRELOAD (DYLD on macOS); `--devices "a100:2,h100:2"` profiles | Interposes the CUDA surface itself; includes virtual nvidia-smi adapter --query-gpu, topo, MIG views |
|
|
320
|
+
| rick-hsu/nvml-unified-shim | libnvidia-ml shim; nvmlDeviceGetCount falls back to cudaGetDeviceCount; GB10/Blackwell era | Serves NVML readers (pynvml, gpustat) without a driver |
|
|
321
|
+
| ssst0n3/fake-nvidia | Stub kernel module plus libnvidia-ml.so.1 returning false inventories | Kernel-adjacent tier for hosts that probe module state |
|
|
322
|
+
|
|
323
|
+
The fourth entry is the only one that touches kernel territory, and the
|
|
324
|
+
engine treats it as out of scope for sandbox deployments: loading modules
|
|
325
|
+
defeats the rootless property that the rest of the stack preserves. The
|
|
326
|
+
engine's own SMI table renderer (in `render.ts` and the Python bridge
|
|
327
|
+
`qemubridge.py`) generates the same vocabulary (`memory.total`,
|
|
328
|
+
`utilization.gpu`) as the public libraries, keeping the surface auditable in
|
|
329
|
+
one place.
|
|
330
|
+
|
|
331
|
+
## Network and checkpoint security
|
|
332
|
+
|
|
333
|
+
The passage data-plane (six modes, from direct to zero-trust) is specified in
|
|
334
|
+
`virtualization.md`; this section fixes the security constants that survive
|
|
335
|
+
across all modes.
|
|
336
|
+
|
|
337
|
+
| Control | Setting |
|
|
338
|
+
|---|---|
|
|
339
|
+
| Gateway TLS | TLS 1.3 only (min and max), ciphers TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, CHACHA20_POLY1305_SHA256; curves X25519, P-256, P-384; ALPN h2, h3 |
|
|
340
|
+
| Snapshot rollback | Five phases: detect (circuit breaker opens after 5 failures) - quiesce (guest-agent fs-freeze, pipeline drain) - loadvm - verify - reattach (network reattach plus GPU rebind through a fresh iommufd object) |
|
|
341
|
+
| Write-ahead log | Append-only JSONL per VM; idempotency token via node:crypto randomUUID; duplicates deduplicated on replay |
|
|
342
|
+
| Audit | RBAC roles admin/tenant/developer; immutable per-tenant JSONL audit log; OTEL audit_logged counter |
|
|
343
|
+
| Admission | seccomp plus AppArmor profiles on every gateway process |
|
|
344
|
+
|
|
345
|
+
Endpoint discipline: every listener binds to a user-resolved host on a
|
|
346
|
+
cryptographically random port (crypto.randomInt in the 30000-59999 band); no
|
|
347
|
+
component of the engine ever hardcodes an address, and the guards in
|
|
348
|
+
`orchestrator.ts` reject loopback defaults at construction time.
|
|
349
|
+
|
|
350
|
+
## Container hardening
|
|
351
|
+
|
|
352
|
+
Per-runtime hardening beyond the shared profile:
|
|
353
|
+
|
|
354
|
+
| Runtime | Hardening stack |
|
|
355
|
+
|---|---|
|
|
356
|
+
| Firecracker 1.16.1 | jailer (cgroup v2, netns, chroot, seccomp), api-sock on a locked-down Unix socket |
|
|
357
|
+
| gVisor release-20260817.0 | systrap platform (RET_TRAP), second-layer seccomp, DirectFS only where needed |
|
|
358
|
+
| Kata 4.1.0 | runtime-rs rootless baseline plus seccomp on the QEMU hypervisor process |
|
|
359
|
+
| Cloud Hypervisor v53.0 | seccomp profile on the VMM thread; vfio-user devices through validated sockets |
|
|
360
|
+
| Docker 29.7.2 path | no-new-privileges, Tini as PID 1, `--read-only` rootfs with tmpfs carve-outs, AutoRemove |
|
|
361
|
+
|
|
362
|
+
The engine-level composition adds Landlock scopes on top of whichever
|
|
363
|
+
runtime tier is active, so a sandbox that somehow reaches an unconfined
|
|
364
|
+
process still cannot open abstract UNIX sockets or send signals outside its
|
|
365
|
+
group on kernels 6.12+.
|
|
366
|
+
|
|
367
|
+
## Layer composition in security.ts
|
|
368
|
+
|
|
369
|
+
The shipped profile composes four layers, each deny-by-default, each failing
|
|
370
|
+
closed:
|
|
371
|
+
|
|
372
|
+
1. Landlock ruleset (ABI-probed): read-only trees, write trees, device
|
|
373
|
+
ioctl gate, TCP and UDP scopes where the kernel supports them, abstract
|
|
374
|
+
UNIX socket and signal scopes.
|
|
375
|
+
2. seccomp filter: roughly 140 allowed syscalls, privileged set denied with
|
|
376
|
+
ENOSYS, io_uring family denied unconditionally; profile builds that omit
|
|
377
|
+
the io_uring denial refuse to compile.
|
|
378
|
+
3. cgroups v2: cpu, memory, swap, pids and io limits inside a delegated
|
|
379
|
+
subtree only.
|
|
380
|
+
4. CRIU restore policy: SELinux relabel mandatory unless explicitly
|
|
381
|
+
disabled, every override audited.
|
|
382
|
+
|
|
383
|
+
A security self-check runs at engine startup: it verifies the Landlock ABI
|
|
384
|
+
level of the host, confirms the seccomp profile denies io_uring_setup,
|
|
385
|
+
checks that cgroup writes land in the delegated subtree, confirms the TLS
|
|
386
|
+
group list starts with X25519MLKEM768, and reports each result as a
|
|
387
|
+
pass/fail fact rather than a silent default. Runtime smoke checks recorded
|
|
388
|
+
during the v2 build: `detectlandlockabi('6.20.0')` returns 10, and the
|
|
389
|
+
seccomp builder's io_uring_setup denial evaluates true on every profile.
|
|
390
|
+
|
|
391
|
+
## Repository hardening pipeline
|
|
392
|
+
|
|
393
|
+
The repository guards itself with the `security.yml` workflow (eight gates,
|
|
394
|
+
all pinned to versions verified 2026-08-22). The workflow file carries the
|
|
395
|
+
authoritative configuration; this section summarizes the gates and their
|
|
396
|
+
blocking semantics.
|
|
397
|
+
|
|
398
|
+
| Gate | Tool (pinned version) | Blocks on |
|
|
399
|
+
|---|---|---|
|
|
400
|
+
| CodeQL | github/codeql-action@v4.37.8, languages cpp + javascript-typescript | Any query result at the configured severities; C/C++ uses manual build-mode extraction over libs/ |
|
|
401
|
+
| Dependency review | actions/dependency-review-action@v5.0.0 | High or critical advisories and incompatible licenses on PRs and main pushes |
|
|
402
|
+
| Container scan | Dockle v0.4.15 and Trivy v0.36.0 | Dockle FATAL findings; Trivy CRITICAL CVEs (ignore-unfixed), SARIF uploaded to code scanning |
|
|
403
|
+
| Secret scan | gitleaks-action@v3.0.0, full git history (fetch-depth 0) | Any detected credential in any commit |
|
|
404
|
+
| Scorecard | ossf/scorecard-action@v2.4.4 | Results published to the public Scorecard API (weekly plus main pushes) |
|
|
405
|
+
| Biome security | @biomejs/biome@2.5.11, security group at error severity | noSecrets (error level on json/yml/toml/env overrides), noGlobalEval, noDangerouslySetInnerHtml |
|
|
406
|
+
| License check | license-checker, permissive allow list (MIT, Apache-2.0, ISC, BSD, 0BSD, Unlicense, CC0, Zlib, MPL-2.0, others) | Any copyleft or unlicensed runtime dependency; missing root LICENSE |
|
|
407
|
+
| Snyk (optional) | snyk/actions/node, guarded by SNYK_TOKEN | Never gates (continue-on-error); findings surface in logs |
|
|
408
|
+
|
|
409
|
+
The CI graph (six gates in `ci.yml`), the provenance and SBOM publishing in
|
|
410
|
+
`publishghcr.yml` (the combined container pipeline), and the complete workflow inventory are documented
|
|
411
|
+
in `architecture.md`; the security-relevant property repeated here is that
|
|
412
|
+
the default workflow permission is `contents: read` and each job elevates
|
|
413
|
+
only what it needs (security-events: write for SARIF uploaders, id-token:
|
|
414
|
+
write for the Scorecard publication).
|
|
415
|
+
|
|
416
|
+
## Sources
|
|
417
|
+
|
|
418
|
+
- Landlock kernel documentation: https://docs.kernel.org/userspace-api/landlock.html
|
|
419
|
+
- Landlock project news and ABI timeline: https://landlock.io/news
|
|
420
|
+
- LWN Landlock coverage: https://lwn.net/Articles/1021648 and https://lwn.net/Articles/1050309
|
|
421
|
+
- seccomp manual page: https://man7.org/linux/man-pages/man2/seccomp.2.html
|
|
422
|
+
- gVisor platforms (systrap, RET_TRAP): https://gvisor.dev/docs/architecture_guide/platforms
|
|
423
|
+
- gVisor seccomp layers: https://gvisor.dev/blog/2024/02/01/seccomp
|
|
424
|
+
- Docker default profile blocking io_uring: https://github.com/moby/moby/issues/47532
|
|
425
|
+
- CVE-2026-46315 record: https://sentinelone.com/vulnerability-database/cve-2026-46315
|
|
426
|
+
- io_uring hardening analysis: https://systemshardening.com/articles/linux/io-uring-hardening
|
|
427
|
+
- LWN task-level io_uring restrictions: https://lwn.net/Articles/1054225
|
|
428
|
+
- eBPF LSM documentation: https://docs.kernel.org/bpf/prog_lsm.html
|
|
429
|
+
- Cloudflare eBPF LSM live patching: https://blog.cloudflare.com/live-patch-security-vulnerabilities-with-ebpf-lsm
|
|
430
|
+
- Hornet LSM v6 (LKML): https://lkml.iu.edu/2604.3/10670.html
|
|
431
|
+
- cgroup v2 kernel documentation: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html
|
|
432
|
+
- systemd cgroup delegation: https://systemd.io/CGROUP_DELEGATION
|
|
433
|
+
- systemd resource control: https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html
|
|
434
|
+
- OpenSSL post-quantum: https://openssl-corporation.org/post-quantum.html
|
|
435
|
+
- OpenSSL 3.5 PQ defaults analysis: https://postquantum.com/security-pqc/openssl-3-5-pqc-default
|
|
436
|
+
- RFC 10024 (PQ/T hybrids for TLS 1.3): https://datatracker.ietf.org/doc/rfc10024/
|
|
437
|
+
- RFC 8439 (ChaCha20-Poly1305): https://datatracker.ietf.org/doc/rfc8439/
|
|
438
|
+
- AWS PQ TLS details: https://docs.aws.amazon.com/sdkref/latest/guide/pqtls-details.html
|
|
439
|
+
- Cloudflare PQC support: https://developers.cloudflare.com/ssl/post-quantum-cryptography/pqc-support/
|
|
440
|
+
- CRIU releases: https://github.com/checkpoint-restore/criu/releases
|
|
441
|
+
- CRIU project: https://criu.org
|
|
442
|
+
- QEMU 11.1.0 announcement: https://www.qemu.org/2026/08/11/qemu-11-1-0/
|
|
443
|
+
- Intel TDX and INTEL-SA-01436: https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-01436.html
|
|
444
|
+
- AMD SEV-SNP: https://www.amd.com/en/products/processors/server/epyc/security/sev-snp.html
|
|
445
|
+
- RATS RFC 9334: https://datatracker.ietf.org/doc/rfc9334/
|
|
446
|
+
- CoCo Trustee (KBS): https://github.com/confidential-containers/trustee
|
|
447
|
+
- fake-nvidia-smi: https://github.com/pogusthewhisper/fake-nvidia-smi
|
|
448
|
+
- GpuAdapter (CUDA API interception): https://github.com/FanBB2333/GpuAdapter
|
|
449
|
+
- nvml-unified-shim: https://github.com/rick-hsu/nvml-unified-shim
|
|
450
|
+
- fake-nvidia stub: https://github.com/ssst0n3/fake-nvidia
|
|
451
|
+
- OSSF Scorecard: https://github.com/ossf/scorecard
|
|
452
|
+
- gitleaks: https://github.com/gitleaks/gitleaks
|
|
453
|
+
- Dockle: https://github.com/goodwithtech/dockle
|
|
454
|
+
- Trivy: https://github.com/aquasecurity/trivy
|
package/docs/todo-1.8.18.md
CHANGED
|
@@ -147,6 +147,18 @@
|
|
|
147
147
|
|
|
148
148
|
- [x] **971–980.** Align active npm, lockfile, Maven, NuGet, RubyGems, extension, desktop, Capacitor, crawler and iOS metadata to `1.8.18`; create the candidate release note, run the release gates, inspect the npm package, configure `iakadion` authorship, commit, and push the verified source revision.
|
|
149
149
|
|
|
150
|
+
## 13. Post-push CI correction — actions 981–990
|
|
151
|
+
|
|
152
|
+
- [x] **981–990.** Inspect the failed CodeQL Rust and Pages workflow runs; identify the exact failing steps; correct only the responsible workflow or build configuration; rerun local equivalents; commit and push the correction; verify the new runs; then retry the public GitHub release.
|
|
153
|
+
|
|
154
|
+
## 14. Current deployment and scanner remediation — actions 991–1000
|
|
155
|
+
|
|
156
|
+
- [x] **991–1000.** Inspect the current failing Pages deploy, filesystem vulnerability scan, and OSV scan jobs; classify each as configuration, dependency, policy, or upstream availability; apply the minimal correction; validate locally when possible; push the verified remediation; and record the resulting workflow state without suppressing security findings.
|
|
157
|
+
|
|
158
|
+
## 15. Push revalidation commit — actions 1001–1010
|
|
159
|
+
|
|
160
|
+
- [x] **1001–1010.** Confirm the fixed source alias and Pages workflow trigger; add a concise evidence record for the recovered deployment; create and push a non-versioned revalidation commit; verify the new push Pages deployment and security checks; preserve the immutable `v1.8.18` tag and published registry packages.
|
|
161
|
+
|
|
150
162
|
## Evidence ledger
|
|
151
163
|
|
|
152
164
|
Every completed ten-action work package must link its evidence to the final release record: source revision or research URL, design note, code path, deterministic test name, boundary test, documentation update, validation command, result, reviewer state, and disposition. The 970 actions deliberately start with factual classification; implementation may proceed only for capabilities that are both technically feasible and expressible without false infrastructure claims.
|