Files
EasyFlow/easyflow-ui-admin/app/src/views/ai/skill/skill-create.ts
陈子默 5de3b209c1 feat: 重塑技能库与统一文件工作台
- 统一分类检索、新建导入和发布交互

- 使用单一文件工作台编辑全部 Skill 资源

- 下沉可复用 Markdown 与代码编辑能力
2026-08-14 18:58:20 +08:00

50 lines
1.4 KiB
TypeScript

import type { SkillInfo, SkillVisibilityScope } from './types';
import { syncSkillMarkdownFrontmatter } from './skill-markdown';
/** Build a hidden, standards-compliant canonical name for a new Skill. */
export function createSkillCanonicalName(
displayName: string,
suffix = createRandomSuffix(),
): string {
const slug = displayName
.normalize('NFKD')
.toLowerCase()
.replaceAll(/[^a-z0-9]+/g, '-')
.replaceAll(/^-+|-+$/g, '')
.slice(0, 48)
.replaceAll(/-+$/g, '');
const prefix = slug || 'skill';
return `${prefix}-${suffix}`.slice(0, 64).replaceAll(/-+$/g, '');
}
/** Create the minimal valid package accepted by the Skill draft endpoint. */
export function buildInitialSkillDraft(input: {
categoryId?: number | string;
displayName: string;
visibilityScope: SkillVisibilityScope;
}): SkillInfo {
const displayName = input.displayName.trim();
const name = createSkillCanonicalName(displayName);
const content = syncSkillMarkdownFrontmatter(
'# Instructions\n\n',
name,
displayName,
);
return {
categoryId: input.categoryId || undefined,
description: displayName,
displayName,
name,
publishStatus: 'DRAFT',
skillContent: content,
visibilityScope: input.visibilityScope,
};
}
function createRandomSuffix() {
const uuid = globalThis.crypto?.randomUUID?.().replaceAll('-', '');
if (uuid) return uuid.slice(0, 10);
return Math.random().toString(36).slice(2, 12).padEnd(10, '0');
}