forked from bai/curriculum-project-hub
feat: org capacity policy admin surface
ADR-0022 / Spec.System.Capacity pins layered capacity limits: a platform ceiling per dimension is unbreakable, and each organization may only set a lower `organizationLimit`. The effective limit is the minimum of the two (`LayeredLimit.effective`); dimensions with no org override fall back to the platform ceiling. No dimension may be unlimited (a ceiling must exist before an org limit can be set, `LayeredLimit.Valid`). Add the backend: the pinned 23 CapacityDimension set + labels (src/capacity/dimensions.ts), platform ceilings sourced from existing runtime env vars plus `HUB_CEILING_<DIMENSION>` (src/capacity/ceilings.ts), the OrganizationCapacityPolicy prisma model + migration, the getCapacityPolicy/setCapacityPolicy service enforcing LayeredLimit.Valid, and org-admin GET/PUT /api/org/:orgSlug/capacity-policy routes wired into the org route tree. Add the admin-web surface: CapacityDimension/CapacityPolicyView api client types, capacityPolicy/setCapacityPolicy methods, a `容量` nav entry, and a capacity page that lists every dimension with its platform ceiling (or `未配置` when unset), an org-limit input (disabled until a ceiling exists), and a live effective-value column. Saving sends the partial limits map; the service rejects values above the ceiling or for unconfigured dimensions.
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
/**
|
||||
* ADR-0022 capacity dimensions (spec `Spec.System.Capacity.CapacityDimension`).
|
||||
* The 23 PINNED dimensions; exact numeric ceilings are `OPEN` and calibrated by
|
||||
* capacity testing. This module is the single source of the dimension set shared
|
||||
* by the platform-ceiling config and the org capacity-policy service.
|
||||
*/
|
||||
export const CAPACITY_DIMENSIONS = [
|
||||
"requestRate",
|
||||
"requestBodySize",
|
||||
"agentConcurrency",
|
||||
"admissionQueueLength",
|
||||
"admissionQueueWait",
|
||||
"fileSize",
|
||||
"attachmentCount",
|
||||
"archiveExpansion",
|
||||
"projectStorage",
|
||||
"organizationStorage",
|
||||
"memberCount",
|
||||
"projectCount",
|
||||
"teamCount",
|
||||
"folderCount",
|
||||
"sessionCount",
|
||||
"runWallTime",
|
||||
"runTurns",
|
||||
"runToolCalls",
|
||||
"toolWallTime",
|
||||
"runOutputSize",
|
||||
"processMemory",
|
||||
"processCpu",
|
||||
"processCount",
|
||||
] as const;
|
||||
|
||||
export type CapacityDimension = (typeof CAPACITY_DIMENSIONS)[number];
|
||||
|
||||
export const CAPACITY_DIMENSION_LABELS: Record<CapacityDimension, string> = {
|
||||
requestRate: "HTTP 请求速率",
|
||||
requestBodySize: "请求体大小",
|
||||
agentConcurrency: "智能体并发",
|
||||
admissionQueueLength: "接纳队列长度",
|
||||
admissionQueueWait: "接纳队列等待",
|
||||
fileSize: "单文件大小",
|
||||
attachmentCount: "每消息附件数",
|
||||
archiveExpansion: "归档展开",
|
||||
projectStorage: "项目存储",
|
||||
organizationStorage: "组织存储",
|
||||
memberCount: "成员数",
|
||||
projectCount: "项目数",
|
||||
teamCount: "团队数",
|
||||
folderCount: "文件夹数",
|
||||
sessionCount: "会话数",
|
||||
runWallTime: "单次运行墙钟",
|
||||
runTurns: "单次运行轮次",
|
||||
runToolCalls: "单次运行工具调用",
|
||||
toolWallTime: "工具墙钟",
|
||||
runOutputSize: "运行输出大小",
|
||||
processMemory: "进程内存",
|
||||
processCpu: "进程 CPU",
|
||||
processCount: "进程数",
|
||||
};
|
||||
|
||||
export function isCapacityDimension(value: string): value is CapacityDimension {
|
||||
return (CAPACITY_DIMENSIONS as readonly string[]).includes(value);
|
||||
}
|
||||
Reference in New Issue
Block a user