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.
172 lines (146 loc) • 4.09 kB
JavaScript
const fs = require('fs-extra')
const path = require('path')
/**
* 锦囊状态机管理器
* 负责管理锦囊之间的状态转换
*/
class PouchStateMachine {
constructor () {
this.currentState = 'initial'
this.stateHistory = []
this.context = {
currentPouch: '',
history: [],
userProfile: {},
sessionData: {},
domainContext: {}
}
this.commands = new Map()
}
/**
* 注册锦囊命令
* @param {string} name - 命令名称
* @param {BasePouchCommand} command - 命令实例
*/
registerCommand (name, command) {
this.commands.set(name, command)
}
/**
* 执行状态转换
* @param {string} commandName - 命令名称
* @param {Array} args - 命令参数
* @returns {Promise<PouchOutput>} 执行结果
*/
async transition (commandName, args = []) {
// 获取命令对应的锦囊
const command = this.commands.get(commandName)
if (!command) {
throw new Error(`未找到命令: ${commandName}`)
}
// 记录历史
this.stateHistory.push({
from: this.currentState,
command: commandName,
timestamp: new Date().toISOString(),
args
})
// 更新上下文
this.context.currentPouch = commandName
this.context.history = this.stateHistory.map(h => h.command || h.to)
// 设置命令上下文
command.setContext(this.context)
// 执行命令
const result = await command.execute(args)
// 根据PATEOAS导航更新状态
if (result && result.pateoas && result.pateoas.currentState) {
this.currentState = result.pateoas.currentState
}
// 保存状态
await this.saveState()
return result
}
/**
* 获取当前状态
* @returns {string} 当前状态
*/
getCurrentState () {
return this.currentState
}
/**
* 获取可用的状态转换
* @returns {string[]} 可转换的状态列表
*/
getAvailableTransitions () {
const transitions = {
initial: ['init', 'hello'],
initialized: ['hello', 'action', 'learn'],
discovering: ['action', 'learn', 'init'],
activated: ['learn', 'recall', 'hello'],
learned: ['action', 'recall', 'hello'],
recalled: ['action', 'learn', 'remember']
}
// 根据当前状态的前缀匹配
for (const [statePrefix, availableStates] of Object.entries(transitions)) {
if (this.currentState.startsWith(statePrefix)) {
return availableStates
}
}
// 默认可转换状态
return ['hello', 'init']
}
/**
* 保存状态到文件
*/
async saveState () {
const promptxDir = path.join(process.cwd(), '.promptx')
const configPath = path.join(promptxDir, 'pouch.json')
try {
// 确保 .promptx 目录存在
await fs.ensureDir(promptxDir)
let config = {}
if (await fs.pathExists(configPath)) {
config = await fs.readJson(configPath)
}
config.currentState = this.currentState
config.stateHistory = this.stateHistory.slice(-50) // 只保留最近50条记录
config.lastUpdated = new Date().toISOString()
await fs.writeJson(configPath, config, { spaces: 2 })
} catch (error) {
console.error('保存状态失败:', error)
}
}
/**
* 从文件加载状态
*/
async loadState () {
const configPath = path.join(process.cwd(), '.promptx', 'pouch.json')
try {
if (await fs.pathExists(configPath)) {
const config = await fs.readJson(configPath)
if (config.currentState) {
this.currentState = config.currentState
}
if (config.stateHistory) {
this.stateHistory = config.stateHistory
}
}
} catch (error) {
console.error('加载状态失败:', error)
}
}
/**
* 重置状态机
*/
reset () {
this.currentState = 'initial'
this.stateHistory = []
this.context = {
currentPouch: '',
history: [],
userProfile: {},
sessionData: {},
domainContext: {}
}
}
}
module.exports = PouchStateMachine