refactor(e2b): compose portable runtime consumers

This commit is contained in:
Tianyi Cui
2026-07-29 02:51:44 +08:00
parent 97496c3d00
commit 2abc9823e7
64 changed files with 1426 additions and 4229 deletions
+15 -8
View File
@@ -1,6 +1,6 @@
# POC overlay: keep the advanced headless agent and model-facing tools, but
# place its filesystem, processes, terminals, language servers, and Code Mode
# execution in one short-lived E2B sandbox.
# place its filesystem and process substrate in one short-lived E2B sandbox;
# the generic Bash, PTY, LSP, and Code Runtime consumers compose above them.
- id: base
name: '@cordisjs/plugin-include'
config:
@@ -32,18 +32,25 @@
name: '@deepseek-ai/dsh-subprocess-e2b'
- id: fs-e2b
name: '@deepseek-ai/dsh-fs-e2b'
- id: code-runtime-e2b
name: '@deepseek-ai/dsh-code-runtime-e2b'
- id: code-runtime-subprocess
name: '@deepseek-ai/dsh-code-runtime-subprocess'
- id: sandbox
name: '@deepseek-ai/dsh-sandbox-local'
- id: sandbox-policy
name: '@deepseek-ai/dsh-sandbox-policy'
config:
mode: danger-full-access
workspaceRoot: !!js process.cwd()
- id: pty
name: '@deepseek-ai/dsh-pty'
- id: pty-e2b
name: '@deepseek-ai/dsh-pty-e2b'
- id: pty-local
name: '@deepseek-ai/dsh-pty-local'
- id: tool-pty
name: '@deepseek-ai/dsh-tool-pty'
- id: lsp
name: '@deepseek-ai/dsh-lsp'
- id: lsp-e2b
name: '@deepseek-ai/dsh-lsp-e2b'
- id: lsp-local
name: '@deepseek-ai/dsh-lsp-local'
config:
servers:
typescript:
+9 -10
View File
@@ -1,15 +1,14 @@
import { readFile } from 'node:fs/promises'
import { posix, resolve } from 'node:path'
import { boot } from '@deepseek-ai/dsh-app-boot'
import { AgentMessageId } from '@deepseek-ai/dsh-agent'
import type { Agent } from '@deepseek-ai/dsh-agent'
import { Session, SessionId } from '@deepseek-ai/dsh-session'
import type {} from '@deepseek-ai/dsh-code-runtime-e2b'
import type {} from '@deepseek-ai/dsh-code-runtime-subprocess'
import { quoteE2BShellArg } from '@deepseek-ai/dsh-e2b'
import type {} from '@deepseek-ai/dsh-fs-e2b'
import type {} from '@deepseek-ai/dsh-bash-local'
import type {} from '@deepseek-ai/dsh-lsp-e2b'
import type {} from '@deepseek-ai/dsh-pty-e2b'
import type {} from '@deepseek-ai/dsh-lsp-local'
import type {} from '@deepseek-ai/dsh-pty-local'
const configPath = process.argv[2]
if (configPath === undefined) throw new Error('usage: bin.ts <cordis.yml>')
@@ -24,10 +23,10 @@ const owner: Agent = {
status: 'idle',
acceptsNextStep: false,
ctx: ownerFiber.ctx,
followup: () => AgentMessageId('unused'),
steer: () => AgentMessageId('unused'),
inject: () => AgentMessageId('unused'),
send: () => AgentMessageId('unused'),
followup() {},
steer() {},
inject() {},
send() {},
cancel() {},
whenIdle: () => Promise.resolve(),
}
@@ -159,7 +158,7 @@ try {
const runRemoteCommand = remoteCommands.run.bind(sandbox.commands)
let containmentFaultInjected = false
remoteCommands.run = async (command, options) => {
if (!containmentFaultInjected && command.includes('dsh-e2b-source-reader') && command.includes('swapped-parent/source.ts')) {
if (!containmentFaultInjected && command.includes('dsh-e2b-bounded-reader') && command.includes('swapped-parent/source.ts')) {
containmentFaultInjected = true
await runRemoteCommand(
`rm -rf -- ${quoteE2BShellArg(swappedParentPath)} && ln -s -- ${quoteE2BShellArg(swappedOutsidePath)} ${quoteE2BShellArg(swappedParentPath)}`,
@@ -194,7 +193,7 @@ try {
workspaceRoot: process.cwd(),
})
} catch (error: unknown) {
lspDocumentBound = String(error).includes('over the 4000000-byte limit')
lspDocumentBound = String(error).includes('exceeds the 4000000-byte limit')
if (!lspDocumentBound) throw error
}
if (!lspDocumentBound) throw new Error('E2B LSP accepted an oversized remote source')
+17 -6
View File
@@ -21,22 +21,33 @@
- id: agents
name: '@deepseek-ai/dsh-agent'
- id: sandbox
name: '@deepseek-ai/dsh-sandbox-local'
- id: sandbox-policy
name: '@deepseek-ai/dsh-sandbox-policy'
config:
mode: danger-full-access
workspaceRoot: !!js process.cwd()
- id: pty
name: '@deepseek-ai/dsh-pty'
- id: pty-e2b
name: '@deepseek-ai/dsh-pty-e2b'
- id: pty-local
name: '@deepseek-ai/dsh-pty-local'
config:
pollIntervalMs: 25
exactProbeAfterMs: 150
idleSilenceMs: 2000
handoffGraceMs: 500
timeoutMs: 5000
disposeGraceMs: 1000
- id: lsp
name: '@deepseek-ai/dsh-lsp'
- id: lsp-e2b
name: '@deepseek-ai/dsh-lsp-e2b'
- id: lsp-local
name: '@deepseek-ai/dsh-lsp-local'
config:
servers:
fixture:
@@ -48,8 +59,8 @@
shutdownTimeoutMs: 1000
killGraceMs: 500
- id: code-runtime-e2b
name: '@deepseek-ai/dsh-code-runtime-e2b'
- id: code-runtime-subprocess
name: '@deepseek-ai/dsh-code-runtime-subprocess'
config:
computeMs: 500
maxWallMs: 5000
-2
View File
@@ -43,12 +43,10 @@
"@deepseek-ai/dsh-llm-replay": "workspace:*",
"@deepseek-ai/dsh-loader-smoke": "workspace:*",
"@deepseek-ai/dsh-lsp": "workspace:*",
"@deepseek-ai/dsh-lsp-e2b": "workspace:*",
"@deepseek-ai/dsh-lsp-local": "workspace:*",
"@deepseek-ai/dsh-permission": "workspace:*",
"@deepseek-ai/dsh-plan-mode": "workspace:*",
"@deepseek-ai/dsh-pty": "workspace:*",
"@deepseek-ai/dsh-pty-e2b": "workspace:*",
"@deepseek-ai/dsh-pty-local": "workspace:*",
"@deepseek-ai/dsh-pwsh-local": "workspace:*",
"@deepseek-ai/dsh-repeat-tool-guard": "workspace:*",