fix: move folder creation into project move flow

This commit is contained in:
2026-07-13 17:05:45 +08:00
parent 2f0e0f2cd7
commit 2211beb42c
4 changed files with 144 additions and 17 deletions
+21 -10
View File
@@ -56,7 +56,6 @@ import { createSlashCommandRegistry, parseSlashInvocation } from "./slashCommand
import { cphHubMcpToolsForRole, roleToolsAllow } from "../agent/roleTools.js";
import {
bindFeishuChatToProject,
createFolder,
createProjectFromFeishuChat,
ensureOrganizationProjectSettings,
moveProjectToFolder,
@@ -75,6 +74,7 @@ import {
import {
archiveCurrentRoleSession,
browseFolderDestinations,
createFolderAndMoveProject,
listRoleSessionHistory,
loadProjectConsole,
resumeRoleSession,
@@ -221,7 +221,6 @@ export function makeTriggerHandler(deps: TriggerDeps): TriggerHandler {
roles: visibleRoles,
currentSession: state.currentSession,
canManageProject: manageDecision.allowed || isOrgAdmin,
canCreateFolder: isOrgAdmin,
...(title !== undefined ? { title } : {}),
});
}
@@ -949,6 +948,7 @@ export function makeTriggerHandler(deps: TriggerDeps): TriggerHandler {
organizationId: state.organizationId,
projectId,
projectName: state.projectName,
canCreateFolder: isOrgAdmin,
...page,
}));
return;
@@ -968,18 +968,20 @@ export function makeTriggerHandler(deps: TriggerDeps): TriggerHandler {
if (!isOrgAdmin) throw new Error("creating an Organization folder requires OWNER or ADMIN");
const folderName = event.action.form_value?.["folder_name"];
if (typeof folderName !== "string") throw new Error("create folder form is missing folder_name");
const folder = await createFolder(deps.prisma, {
const folder = await createFolderAndMoveProject(deps.prisma, {
organizationId: state.organizationId,
name: folderName.slice(0, 100),
...(state.folderId !== null ? { parentId: state.folderId } : {}),
});
await writeAudit(deps.prisma, {
projectId,
action: "folder.created_from_feishu",
metadata: { folderId: folder.id, parentId: state.folderId, name: folder.name },
parentFolderId: action.folder_id ?? null,
name: folderName.slice(0, 100),
...(manageDecision.actorUserId !== undefined ? { actorUserId: manageDecision.actorUserId } : {}),
});
if (messageId === undefined) throw new Error("folder creation requires message id");
await patchCard(rt, messageId, await projectConsoleCard(projectId, chatId, operatorOpenId, "目录已创建"));
await patchCard(rt, messageId, await projectConsoleCard(
projectId,
chatId,
operatorOpenId,
`已新建目录“${folder.folderName}”并移动项目`,
));
return;
}
if (action.action === "rename_project") {
@@ -1359,6 +1361,15 @@ export function makeTriggerHandler(deps: TriggerDeps): TriggerHandler {
return;
}
const key = messageBatchKey(chatId, senderOpenId, runContext.roleId);
for (const [pendingKey, pendingContext] of batchContexts) {
if (
pendingKey !== key &&
pendingContext.chatId === chatId &&
pendingContext.senderOpenId === senderOpenId
) {
await messageBatcher.flushNow(pendingKey);
}
}
if (!batchContexts.has(key)) {
batchContexts.set(key, runContext);
}