fix(workspace): 会话创建项目改用新结构目录 + 写入 directory_name

根因:_t_create_project 用旧结构 build_workspace_path({space}/{项目名}),不写
directory_name;而工作空间读取端已迁到新结构 {space}/projects/{英文slug},
导致会话新建的项目显示「项目目录(不可用)」。

修复:
- 改用 build_space_path 拼 {space}/projects/{slug} 并 os.makedirs
- slug 保留 [A-Za-z0-9_-],须含字母(避免纯数字如'7'),否则兑底 proj_{短ID}
- 写入 directory_name 字段(工作空间读路径依据)
- 同 slug 冲突追加短 ID
This commit is contained in:
ymq 2026-08-27 16:11:43 +08:00
parent 09f8b85f66
commit 58d773b6ad

View File

@ -859,6 +859,7 @@ class AgentExecutor:
async def _t_create_project(self, sor, p, pid):
import os
import re
from appPublic.uniqueID import getID
name = p.get("name", "").strip()
@ -874,18 +875,29 @@ class AgentExecutor:
if _u:
org_id = getattr(_u[0], "orgid", "0") or "0"
# 项目专属工作空间目录workspace_base 从 appbase params 表读,可动态配置)
# 项目空间 = self.space通用助手 'general' / 专业产线 pipeline_id隔离不共享。
from .workspace import get_workspace_base, build_workspace_path
# 项目专属工作空间目录(新结构:{base}/{org}/{space}/projects/{英文slug}/
# 与 apps/、modules/ 平级;工作空间控件按此结构读取)。
# 英文 slug项目名保留 [A-Za-z0-9_-],且须含字母才有辨识度(避免纯数字如 "7"
# 纯中文或纯数字名兑底 proj_{短ID}。
from .workspace import get_workspace_base, build_space_path
workspace_base = await get_workspace_base(sor)
pid_val = getID()
workspace_dir = build_workspace_path(workspace_base, org_id, self.space, name, pid_val)
os.makedirs(workspace_dir, exist_ok=True)
space_dir = build_space_path(workspace_base, org_id, self.space)
slug = re.sub(r'[^A-Za-z0-9_-]', '', name).strip('_-')
if not slug or not re.search(r'[A-Za-z]', slug):
slug = 'proj_' + pid_val[-8:]
project_dir = os.path.join(space_dir, 'projects', slug)
if os.path.isdir(project_dir):
# 同 slug 已存在(不同项目重名)→ 追加短 ID避免共享目录互相覆盖
slug = f"{slug}_{pid_val[-8:]}"
project_dir = os.path.join(space_dir, 'projects', slug)
os.makedirs(project_dir, exist_ok=True)
await sor.C("sd_projects", {
"id": pid_val, "name": name, "description": desc,
"status": "active", "org_id": org_id,
"pipeline_id": self.space, "workspace_dir": workspace_dir,
"pipeline_id": self.space, "workspace_dir": project_dir,
"directory_name": slug,
"created_by": self.user_id or "",
"default_model": self.model_name or "",
})