Files
PromptX/src/lib/core/resource/protocols/RoleProtocol.js

80 lines
1.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const ResourceProtocol = require('./ResourceProtocol')
const fs = require('fs-extra')
const path = require('path')
/**
* AI角色协议处理器
* 处理 role:// 协议的资源解析直接加载完整role文件
*/
class RoleProtocol extends ResourceProtocol {
constructor () {
super('role')
this.registry = {}
}
/**
* 设置注册表
*/
setRegistry (registry) {
this.registry = registry || {}
}
/**
* 获取协议信息
*/
getProtocolInfo () {
return {
name: 'role',
description: 'AI角色资源协议',
location: 'role://{role_id}',
examples: [
'role://video-copywriter',
'role://product-owner',
'role://assistant',
'role://prompt-developer'
]
}
}
/**
* 解析资源路径
*/
async resolvePath (resourcePath, queryParams) {
const roleId = resourcePath.trim()
if (!this.registry[roleId]) {
throw new Error(`角色 "${roleId}" 未在注册表中找到。可用角色:${Object.keys(this.registry).join(', ')}`)
}
let resolvedPath = this.registry[roleId]
// 处理 @package:// 前缀
if (resolvedPath.startsWith('@package://')) {
resolvedPath = resolvedPath.replace('@package://', '')
}
return resolvedPath
}
/**
* 加载资源内容
*/
async loadContent (resolvedPath, queryParams) {
try {
const content = await fs.readFile(resolvedPath, 'utf-8')
return content
} catch (error) {
throw new Error(`无法加载角色文件 ${resolvedPath}: ${error.message}`)
}
}
/**
* 验证资源路径
*/
validatePath (resourcePath) {
return /^[a-zA-Z0-9_-]+$/.test(resourcePath)
}
}
module.exports = RoleProtocol