mirror of
https://github.com/langgenius/dify.git
synced 2026-05-13 08:57:28 +08:00
Port the complete infrastructure for agent sandbox execution and skill system: Sandbox & Virtual Environment (core/sandbox/, core/virtual_environment/): - Sandbox entity with lifecycle management (ready/failed/cancelled states) - SandboxBuilder with fluent API for configuring providers - 5 VM providers: Local, SSH, Docker, E2B, AWS CodeInterpreter - VirtualEnvironment base with command execution, file transfer, transport layers - Channel transport: pipe, queue, socket implementations - Bash session management and DifyCli binary integration - Storage: archive storage, file storage, noop storage, presign storage - Initializers: DifyCli, AppAssets, DraftAppAssets, Skills - Inspector: file browser, archive/runtime source, script utils - Security: encryption utils, debug helpers Skill & App Assets (core/skill/, core/app_assets/, core/app_bundle/): - Skill entity and manager - App asset accessor, builder pipeline (file, skill builders) - App bundle source zip extractor - Storage and converter utilities API Endpoints: - CLI API blueprint (controllers/cli_api/) for sandbox callback - Sandbox provider management (workspace/sandbox_providers) - Sandbox file browser (console/sandbox_files) - App asset management (console/app/app_asset) - Skill management (console/app/skills) - Storage file endpoints (controllers/files/storage_files) Services: - Sandbox service, provider service, file service - App asset service, app bundle service Config: - CliApiConfig, CreatorsPlatformConfig, CollaborationConfig - FILES_API_URL for sandbox file access Note: Controller route registration temporarily commented out (marked TODO) pending resolution of deep dependency chains (socketio, workflow_comment, command node, etc.). Core sandbox modules are fully ported and syntax-validated. 110 files changed, 10,549 insertions. Made-with: Cursor
59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
from typing import Final
|
|
|
|
|
|
class DifyCli:
|
|
"""Per-sandbox Dify CLI paths, namespaced under ``/tmp/.dify/{env_id}``.
|
|
|
|
Every sandbox environment gets its own directory tree so that
|
|
concurrent sessions on the same host (e.g. SSH provider) never
|
|
collide on config files or CLI binaries.
|
|
|
|
Class-level constants (``CONFIG_FILENAME``, ``PATH_PATTERN``) are
|
|
safe to share; all path attributes are instance-level and derived
|
|
from the ``env_id`` passed at construction time.
|
|
"""
|
|
|
|
# --- class-level constants (no path component) ---
|
|
CONFIG_FILENAME: Final[str] = ".dify_cli.json"
|
|
PATH_PATTERN: Final[str] = "dify-cli-{os}-{arch}"
|
|
|
|
# --- instance attributes ---
|
|
root: str
|
|
bin_dir: str
|
|
bin_path: str
|
|
tools_root: str
|
|
global_tools_path: str
|
|
global_config_path: str
|
|
|
|
def __init__(self, env_id: str) -> None:
|
|
self.root = f"/tmp/.dify/{env_id}"
|
|
self.bin_dir = f"{self.root}/bin"
|
|
self.bin_path = f"{self.bin_dir}/dify"
|
|
self.tools_root = f"{self.root}/tools"
|
|
self.global_tools_path = f"{self.root}/tools/global"
|
|
self.global_config_path = f"{self.global_tools_path}/{DifyCli.CONFIG_FILENAME}"
|
|
|
|
def node_tools_path(self, node_id: str) -> str:
|
|
return f"{self.tools_root}/{node_id}"
|
|
|
|
def node_config_path(self, node_id: str) -> str:
|
|
return f"{self.node_tools_path(node_id)}/{DifyCli.CONFIG_FILENAME}"
|
|
|
|
|
|
class AppAssets:
|
|
"""App Assets constants.
|
|
|
|
``PATH`` is a relative path resolved by each provider against its
|
|
own workspace root — already isolated. ``zip_path`` is an absolute
|
|
temp path and must be namespaced per environment to avoid collisions.
|
|
"""
|
|
|
|
PATH: Final[str] = "skills"
|
|
|
|
root: str
|
|
zip_path: str
|
|
|
|
def __init__(self, env_id: str) -> None:
|
|
self.root = f"/tmp/.dify/{env_id}"
|
|
self.zip_path = f"{self.root}/assets.zip"
|