feat(web): sandboxed executor family on the web roster

apps/cli/cordis.yml swaps bash-local/fs-local for the acp-agent composition
(sandbox-local + sandbox-policy + bash-sandbox + user-approval + permission
+ fs-sandbox; fs-policy composes on top unchanged). The deployment default
stays danger-full-access + never — byte-for-byte the old unconfined
behavior, so the replay e2e lane and demos are unaffected — while
DSH_PERMISSION_MODE opts a process into a confined default and the
/permission command switches per session. The permission preset table ships
the three product presets (read-only/ask, workspace-write/ask,
danger-full-access/never) explicitly in the deployment config.
This commit is contained in:
imccyu
2026-07-28 22:59:12 +08:00
parent 25265b312c
commit c0e7c008cf
3 changed files with 67 additions and 12 deletions

View File

@@ -120,8 +120,45 @@
- id: subprocess - id: subprocess
name: '@deepseek-ai/dsh-subprocess-local' name: '@deepseek-ai/dsh-subprocess-local'
- id: bash-local # The sandboxed product path (the acp-agent composition): per-platform
name: '@deepseek-ai/dsh-bash-local' # runner provider, the shared policy home, the confined bash executor, and
# the approval seam its escalation asks through. The web deployment default
# is danger-full-access + never (same behavior as the former bash-local
# rows); DSH_PERMISSION_MODE opts a process into a confined default, and
# per-session switches ride the /permission command's knob events.
- id: sandbox
name: '@deepseek-ai/dsh-sandbox-local'
- id: sandbox-policy
name: '@deepseek-ai/dsh-sandbox-policy'
config:
mode: !!js process.env.DSH_PERMISSION_MODE ?? 'danger-full-access'
workspaceRoot: !!js process.cwd()
- id: bash-sandbox
name: '@deepseek-ai/dsh-bash-sandbox'
- id: approval
name: '@deepseek-ai/dsh-user-approval'
config:
policy: !!js "(process.env.DSH_PERMISSION_MODE ?? 'danger-full-access') === 'danger-full-access' ? 'never' : 'ask'"
# Presets over the two knobs (requires the confining executor + approval):
# the web permission chip's table, served through the permissions projection
# and switched through /permission.
- id: permission
name: '@deepseek-ai/dsh-permission'
config:
presets:
read-only:
sandbox: read-only
approval: ask
workspace-write:
sandbox: workspace-write
approval: ask
danger-full-access:
sandbox: danger-full-access
approval: never
- id: tool-bash - id: tool-bash
name: '@deepseek-ai/dsh-tool-bash' name: '@deepseek-ai/dsh-tool-bash'
@@ -133,9 +170,11 @@
name: '@deepseek-ai/dsh-tool-tasks' name: '@deepseek-ai/dsh-tool-tasks'
# fs cwd stays the package default (process.cwd()) — the same value the # fs cwd stays the package default (process.cwd()) — the same value the
# gateway injects into session.cwd, so paths and sessions agree. # gateway injects into session.cwd, so paths and sessions agree. The
- id: fs-local # sandboxed backend rides the SAME policy as bash: write/edit fence by the
name: '@deepseek-ai/dsh-fs-local' # effective mode, so read/write/edit stay available under every mode.
- id: fs-sandbox
name: '@deepseek-ai/dsh-fs-sandbox'
- id: fs-policy - id: fs-policy
name: '@deepseek-ai/dsh-fs-policy' name: '@deepseek-ai/dsh-fs-policy'

View File

@@ -20,7 +20,7 @@
"@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-agent": "workspace:^",
"@deepseek-ai/dsh-agent-loop": "workspace:^", "@deepseek-ai/dsh-agent-loop": "workspace:^",
"@deepseek-ai/dsh-app-boot": "workspace:^", "@deepseek-ai/dsh-app-boot": "workspace:^",
"@deepseek-ai/dsh-bash-local": "workspace:^", "@deepseek-ai/dsh-bash-sandbox": "workspace:^",
"@deepseek-ai/dsh-client-connection": "workspace:^", "@deepseek-ai/dsh-client-connection": "workspace:^",
"@deepseek-ai/dsh-client-hmr": "workspace:^", "@deepseek-ai/dsh-client-hmr": "workspace:^",
"@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-client-locale": "workspace:^",
@@ -45,15 +45,18 @@
"@deepseek-ai/dsh-commands": "workspace:^", "@deepseek-ai/dsh-commands": "workspace:^",
"@deepseek-ai/dsh-compact-basic": "workspace:^", "@deepseek-ai/dsh-compact-basic": "workspace:^",
"@deepseek-ai/dsh-frontend": "workspace:^", "@deepseek-ai/dsh-frontend": "workspace:^",
"@deepseek-ai/dsh-fs-local": "workspace:^",
"@deepseek-ai/dsh-fs-policy": "workspace:^", "@deepseek-ai/dsh-fs-policy": "workspace:^",
"@deepseek-ai/dsh-fs-sandbox": "workspace:^",
"@deepseek-ai/dsh-host-apiproxy": "workspace:^", "@deepseek-ai/dsh-host-apiproxy": "workspace:^",
"@deepseek-ai/dsh-host-webserver": "workspace:^", "@deepseek-ai/dsh-host-webserver": "workspace:^",
"@deepseek-ai/dsh-llm": "workspace:^", "@deepseek-ai/dsh-llm": "workspace:^",
"@deepseek-ai/dsh-llm-deepseek": "workspace:^", "@deepseek-ai/dsh-llm-deepseek": "workspace:^",
"@deepseek-ai/dsh-llm-retry": "workspace:^", "@deepseek-ai/dsh-llm-retry": "workspace:^",
"@deepseek-ai/dsh-paths": "workspace:^", "@deepseek-ai/dsh-paths": "workspace:^",
"@deepseek-ai/dsh-permission": "workspace:^",
"@deepseek-ai/dsh-plan-mode": "workspace:^", "@deepseek-ai/dsh-plan-mode": "workspace:^",
"@deepseek-ai/dsh-sandbox-local": "workspace:^",
"@deepseek-ai/dsh-sandbox-policy": "workspace:^",
"@deepseek-ai/dsh-session": "workspace:^", "@deepseek-ai/dsh-session": "workspace:^",
"@deepseek-ai/dsh-session-persistence-jsonl": "workspace:^", "@deepseek-ai/dsh-session-persistence-jsonl": "workspace:^",
"@deepseek-ai/dsh-session-projection": "workspace:^", "@deepseek-ai/dsh-session-projection": "workspace:^",
@@ -84,6 +87,7 @@
"@deepseek-ai/dsh-tool-workflow": "workspace:^", "@deepseek-ai/dsh-tool-workflow": "workspace:^",
"@deepseek-ai/dsh-tools": "workspace:^", "@deepseek-ai/dsh-tools": "workspace:^",
"@deepseek-ai/dsh-tui": "workspace:^", "@deepseek-ai/dsh-tui": "workspace:^",
"@deepseek-ai/dsh-user-approval": "workspace:^",
"@deepseek-ai/dsh-user-interaction": "workspace:^", "@deepseek-ai/dsh-user-interaction": "workspace:^",
"@deepseek-ai/dsh-workflow-workerthread": "workspace:^", "@deepseek-ai/dsh-workflow-workerthread": "workspace:^",
"@deepseek-ai/dsh-workspace": "workspace:^", "@deepseek-ai/dsh-workspace": "workspace:^",

22
pnpm-lock.yaml generated
View File

@@ -128,9 +128,9 @@ importers:
'@deepseek-ai/dsh-app-boot': '@deepseek-ai/dsh-app-boot':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/ui/app-boot version: link:../../packages/ui/app-boot
'@deepseek-ai/dsh-bash-local': '@deepseek-ai/dsh-bash-sandbox':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/bash/bash-local version: link:../../packages/bash/bash-sandbox
'@deepseek-ai/dsh-client-connection': '@deepseek-ai/dsh-client-connection':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/client/connection version: link:../../packages/client/connection
@@ -203,12 +203,12 @@ importers:
'@deepseek-ai/dsh-frontend': '@deepseek-ai/dsh-frontend':
specifier: workspace:^ specifier: workspace:^
version: link:../web version: link:../web
'@deepseek-ai/dsh-fs-local':
specifier: workspace:^
version: link:../../packages/fs/fs-local
'@deepseek-ai/dsh-fs-policy': '@deepseek-ai/dsh-fs-policy':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/fs/fs-policy version: link:../../packages/fs/fs-policy
'@deepseek-ai/dsh-fs-sandbox':
specifier: workspace:^
version: link:../../packages/fs/fs-sandbox
'@deepseek-ai/dsh-host-apiproxy': '@deepseek-ai/dsh-host-apiproxy':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/host/apiproxy version: link:../../packages/host/apiproxy
@@ -227,9 +227,18 @@ importers:
'@deepseek-ai/dsh-paths': '@deepseek-ai/dsh-paths':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/util/paths version: link:../../packages/util/paths
'@deepseek-ai/dsh-permission':
specifier: workspace:^
version: link:../../packages/ui/permission
'@deepseek-ai/dsh-plan-mode': '@deepseek-ai/dsh-plan-mode':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/plan/plan-mode version: link:../../packages/plan/plan-mode
'@deepseek-ai/dsh-sandbox-local':
specifier: workspace:^
version: link:../../packages/sandbox/sandbox-local
'@deepseek-ai/dsh-sandbox-policy':
specifier: workspace:^
version: link:../../packages/sandbox/sandbox-policy
'@deepseek-ai/dsh-session': '@deepseek-ai/dsh-session':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/core/session version: link:../../packages/core/session
@@ -320,6 +329,9 @@ importers:
'@deepseek-ai/dsh-tui': '@deepseek-ai/dsh-tui':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/ui/tui version: link:../../packages/ui/tui
'@deepseek-ai/dsh-user-approval':
specifier: workspace:^
version: link:../../packages/ui/user-approval
'@deepseek-ai/dsh-user-interaction': '@deepseek-ai/dsh-user-interaction':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/ui/user-interaction version: link:../../packages/ui/user-interaction