Wire expected_revision, blob PDF framing, mustChangePassword session rewrite, client_key project create, no-project send disable, and right-rail persistence. Co-authored-by: Cursor <cursoragent@cursor.com>
88 lines
2.5 KiB
TypeScript
88 lines
2.5 KiB
TypeScript
import { ProjectInfo, ProjectMember, ProjectSession } from '../types/workbench';
|
|
import { DEFAULT_PROJECTS } from '@demo-seeds';
|
|
|
|
/** Must stay in sync with STORAGE_KEYS.PROJECTS in storage.ts */
|
|
const STORAGE_KEY_PROJECTS = 'smdf_agent_workbench_v6_projects';
|
|
|
|
export { DEFAULT_PROJECTS };
|
|
|
|
/**
|
|
* 加载项目列表
|
|
*/
|
|
export function loadProjects(fallback: ProjectInfo[] = DEFAULT_PROJECTS): ProjectInfo[] {
|
|
try {
|
|
const raw = localStorage.getItem(STORAGE_KEY_PROJECTS);
|
|
if (!raw) return fallback;
|
|
const parsed = JSON.parse(raw);
|
|
if (!Array.isArray(parsed) || parsed.length === 0) return fallback;
|
|
return parsed;
|
|
} catch (err) {
|
|
console.warn('[ProjectsStorage] 加载项目失败,回退默认基线:', err);
|
|
return fallback;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 保存项目列表
|
|
*/
|
|
export function saveProjects(projects: ProjectInfo[]): void {
|
|
try {
|
|
localStorage.setItem(STORAGE_KEY_PROJECTS, JSON.stringify(projects));
|
|
} catch (err) {
|
|
console.warn('[ProjectsStorage] 保存项目失败:', err);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 依据项目成员身份严格过滤当前用户可见的项目会话:
|
|
* 1. 未加入(非项目成员):完全不可见;
|
|
* 2. 在职成员 (active):正常可见,可操作;
|
|
* 3. 中途加入后已退出 (exited):保留会话显示,附加 isExited=true 标记供界面只读留痕;
|
|
* 4. 超级管理员 (userId === 4):通配可见所有会话。
|
|
*/
|
|
export function filterProjectSessionsForUser(
|
|
sessions: ProjectSession[],
|
|
projects: ProjectInfo[],
|
|
userId: number,
|
|
isAdmin: boolean = false
|
|
): ProjectSession[] {
|
|
if (isAdmin) {
|
|
return sessions.filter((s) => s.userId === userId || s.userId == null);
|
|
}
|
|
|
|
const projectMap = new Map<number, ProjectInfo>();
|
|
for (const p of projects) {
|
|
projectMap.set(p.id, p);
|
|
}
|
|
|
|
const userSessions = sessions.filter((s) => s.userId === userId);
|
|
|
|
return userSessions.filter((s) => {
|
|
const proj = projectMap.get(s.projectId);
|
|
if (!proj) {
|
|
return true;
|
|
}
|
|
const member = proj.members.find((m) => m.userId === userId);
|
|
if (!member) {
|
|
return false;
|
|
}
|
|
if (member.status === 'exited') {
|
|
s.isExited = true;
|
|
return true;
|
|
}
|
|
s.isExited = false;
|
|
return true;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 获取用户在指定项目中的成员记录
|
|
*/
|
|
export function getProjectMembership(
|
|
project: ProjectInfo | undefined,
|
|
userId: number
|
|
): ProjectMember | undefined {
|
|
if (!project) return undefined;
|
|
return project.members.find((m) => m.userId === userId);
|
|
}
|