dpml-prompt
Version:
DPML-powered AI prompt framework - Revolutionary AI-First CLI system based on Deepractice Prompt Markup Language. Build sophisticated AI agents with structured prompts, memory systems, and execution frameworks.
367 lines (317 loc) • 11.2 kB
JavaScript
const fs = require('fs')
const RegistryData = require('./RegistryData')
const ResourceProtocolParser = require('./resourceProtocolParser')
const DiscoveryManager = require('./discovery/DiscoveryManager')
const logger = require('../../utils/logger')
// 导入协议处理器
const PackageProtocol = require('./protocols/PackageProtocol')
const ProjectProtocol = require('./protocols/ProjectProtocol')
const RoleProtocol = require('./protocols/RoleProtocol')
const ThoughtProtocol = require('./protocols/ThoughtProtocol')
const ExecutionProtocol = require('./protocols/ExecutionProtocol')
const KnowledgeProtocol = require('./protocols/KnowledgeProtocol')
const ToolProtocol = require('./protocols/ToolProtocol')
const ManualProtocol = require('./protocols/ManualProtocol')
const UserProtocol = require('./protocols/UserProtocol')
const FileProtocol = require('./protocols/FileProtocol')
class ResourceManager {
constructor() {
// 新架构:统一的资源注册表
this.registryData = RegistryData.createEmpty('merged', null)
// 协议解析器
this.protocolParser = new ResourceProtocolParser()
this.parser = new ResourceProtocolParser() // 向后兼容别名
// 资源发现管理器
this.discoveryManager = new DiscoveryManager()
// 初始化协议处理器
this.protocols = new Map()
this.initializeProtocols()
}
/**
* 初始化所有协议处理器
*/
initializeProtocols() {
// 基础协议 - 直接文件系统映射
this.protocols.set('package', new PackageProtocol())
this.protocols.set('project', new ProjectProtocol())
this.protocols.set('file', new FileProtocol())
this.protocols.set('user', new UserProtocol())
// 逻辑协议 - 需要注册表查询
this.protocols.set('role', new RoleProtocol())
this.protocols.set('thought', new ThoughtProtocol())
this.protocols.set('execution', new ExecutionProtocol())
this.protocols.set('knowledge', new KnowledgeProtocol())
this.protocols.set('tool', new ToolProtocol())
this.protocols.set('manual', new ManualProtocol())
}
/**
* 新架构初始化方法
*/
async initializeWithNewArchitecture() {
try {
// 1. 清空现有注册表
this.registryData.clear()
// 2. 清除发现器缓存
if (this.discoveryManager && typeof this.discoveryManager.clearCache === 'function') {
this.discoveryManager.clearCache()
}
// 3. 填充新的RegistryData
await this.populateRegistryData()
// 4. 为逻辑协议设置注册表引用
this.setupLogicalProtocols()
// 5. 设置初始化状态
this.initialized = true
// 初始化完成,不输出日志避免干扰用户界面
} catch (error) {
logger.warn(`ResourceManager new architecture initialization failed: ${error.message}`)
logger.warn('ResourceManager continuing with empty registry')
this.initialized = true // 即使失败也标记为已初始化,避免重复尝试
}
}
/**
* 填充新的RegistryData
*/
async populateRegistryData() {
// 清空现有数据
this.registryData.clear()
// 从各个发现器获取RegistryData并合并
for (const discovery of this.discoveryManager.discoveries) {
try {
if (typeof discovery.getRegistryData === 'function') {
const registryData = await discovery.getRegistryData()
if (registryData && registryData.resources) {
// 合并资源到主注册表
this.registryData.merge(registryData, true) // 允许覆盖
}
}
} catch (error) {
logger.warn(`Failed to get RegistryData from ${discovery.source}: ${error.message}`)
}
}
}
/**
* 为逻辑协议设置注册表引用
*/
setupLogicalProtocols() {
// 将统一注册表传递给逻辑协议处理器
const roleProtocol = this.protocols.get('role')
const executionProtocol = this.protocols.get('execution')
const thoughtProtocol = this.protocols.get('thought')
const knowledgeProtocol = this.protocols.get('knowledge')
const toolProtocol = this.protocols.get('tool')
const manualProtocol = this.protocols.get('manual')
if (roleProtocol) {
roleProtocol.setRegistryManager(this)
}
if (executionProtocol) {
executionProtocol.setRegistryManager(this)
}
if (thoughtProtocol) {
thoughtProtocol.setRegistryManager(this)
}
if (knowledgeProtocol) {
knowledgeProtocol.setRegistryManager(this)
}
if (toolProtocol) {
toolProtocol.setRegistryManager(this)
}
if (manualProtocol) {
manualProtocol.setRegistryManager(this)
}
// 逻辑协议设置完成,不输出日志避免干扰用户界面
}
/**
* 通过协议解析加载资源内容
* @param {string} reference - 资源引用
* @returns {Promise<string>} 资源内容
*/
async loadResourceByProtocol(reference) {
// 1. 使用ResourceProtocolParser解析DPML语法
const parsed = this.protocolParser.parse(reference)
// 2. 获取对应的协议处理器
const protocol = this.protocols.get(parsed.protocol)
if (!protocol) {
throw new Error(`不支持的协议: ${parsed.protocol}`)
}
// 3. 委托给协议处理器解析并加载内容
const result = await protocol.resolve(parsed.path, parsed.queryParams)
// 4. 确保返回字符串内容,解包可能的对象格式
if (typeof result === 'string') {
return result
} else if (result && typeof result === 'object' && result.content) {
return result.content
} else {
throw new Error(`协议${parsed.protocol}返回了无效的内容格式`)
}
}
async loadResource(resourceId) {
try {
// 确保ResourceManager已初始化
if (!this.initialized) {
await this.initializeWithNewArchitecture()
}
// 处理@开头的DPML格式(如 @file://path, @!role://java-developer)
if (resourceId.startsWith('@')) {
const parsed = this.protocolParser.parse(resourceId)
// 对于基础协议(file, user, package, project),直接通过协议处理器加载
const basicProtocols = ['file', 'user', 'package', 'project']
if (basicProtocols.includes(parsed.protocol)) {
const content = await this.loadResourceByProtocol(resourceId)
return {
success: true,
content,
resourceId,
reference: resourceId
}
}
// 对于逻辑协议,从RegistryData查找资源
const resourceData = this.registryData.findResourceById(parsed.path, parsed.protocol)
if (!resourceData) {
throw new Error(`Resource not found: ${parsed.protocol}:${parsed.path}`)
}
// 通过协议解析加载内容
const content = await this.loadResourceByProtocol(resourceData.reference)
return {
success: true,
content,
resourceId,
reference: resourceData.reference
}
}
// 处理URL格式(如 thought://systematic-testing)
const urlMatch = resourceId.match(/^([a-zA-Z][a-zA-Z0-9_-]*):\/\/(.+)$/)
if (urlMatch) {
const [, protocol, id] = urlMatch
const resourceData = this.registryData.findResourceById(id, protocol)
if (!resourceData) {
throw new Error(`Resource not found: ${resourceId}`)
}
// 通过协议解析加载内容
const content = await this.loadResourceByProtocol(resourceData.reference)
return {
success: true,
content,
resourceId,
reference: resourceData.reference
}
}
// 处理传统格式(如 role:java-developer)
let reference = null
// 如果包含协议前缀(如 thought:remember)
if (resourceId.includes(':')) {
const [protocol, id] = resourceId.split(':', 2)
const resourceData = this.registryData.findResourceById(id, protocol)
if (resourceData) {
reference = resourceData.reference
}
} else {
// 如果没有协议前缀,尝试查找任意协议的资源
const resourceData = this.registryData.findResourceById(resourceId)
if (resourceData) {
reference = resourceData.reference
}
}
if (!reference) {
throw new Error(`Resource not found: ${resourceId}`)
}
// 通过协议解析加载内容
const content = await this.loadResourceByProtocol(reference)
return {
success: true,
content,
resourceId,
reference
}
} catch (error) {
logger.debug(`ResourceManager.loadResource failed for ${resourceId}: ${error.message}`)
return {
success: false,
error: error, // 返回完整的Error对象,而不是message字符串
resourceId
}
}
}
/**
* 解析协议引用并返回相关信息
*/
async resolveProtocolReference(reference) {
try {
const parsed = this.protocolParser.parse(reference)
return {
success: true,
protocol: parsed.protocol,
path: parsed.path,
queryParams: parsed.queryParams,
reference
}
} catch (error) {
return {
success: false,
error: error.message,
reference
}
}
}
/**
* 获取所有可用的协议列表
*/
getAvailableProtocols() {
return Array.from(this.protocols.keys())
}
/**
* 检查是否支持指定协议
*/
supportsProtocol(protocol) {
return this.protocols.has(protocol)
}
/**
* 设置初始化状态
*/
set initialized(value) {
this._initialized = value
}
/**
* 获取初始化状态
*/
get initialized() {
return this._initialized || false
}
/**
* 解析资源URL(向后兼容接口)
* 返回格式:{success: boolean, content?: string, error?: Error}
*/
async resolve(resourceUrl) {
return await this.loadResource(resourceUrl)
}
/**
* 获取注册表统计信息
*/
getStats() {
return {
totalResources: this.registryData.size,
protocols: this.getAvailableProtocols(),
initialized: this.initialized
}
}
/**
* 刷新资源(重新发现并注册)
*/
async refreshResources() {
try {
// 1. 标记为未初始化
this.initialized = false
// 2. 清空注册表
this.registryData.clear()
// 3. 清除发现器缓存
if (this.discoveryManager && typeof this.discoveryManager.clearCache === 'function') {
this.discoveryManager.clearCache()
}
// 4. 重新初始化
await this.initializeWithNewArchitecture()
} catch (error) {
logger.warn(`ResourceManager resource refresh failed: ${error.message}`)
// 失败时保持注册表为空状态,下次调用时重试
}
}
}
module.exports = ResourceManager