| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /**
- * 统一解析结点入参、出参:将 action 中的变量引用用 variableContext 解析为实际值。
- * 规则:{var}、{{var}} 为变量(替换为变量值),"hello" 为字符串字面量,"hello{var}" 为字符串+变量拼接。
- */
- const setParser = require('./actions/set-parser.js')
- const resolveValue = setParser.resolveValue
- const replaceVariablesInString = setParser.replaceVariablesInString
- const extractVarName = setParser.extractVarName
- /** 视为入参的字段(会被解析);inVars 由各结点按需解析(因部分结点将 inVars 某项作为输出变量名)。 */
- const INPUT_KEYS = [
- 'value', 'target', 'template', 'area', 'savePath', 'condition', 'delay', 'interval',
- 'items', 'screenshot', 'region', 'method', 'clear', 'timeout', 'retry',
- 'min', 'max', 'avatar1', 'avatar2', 'friendAvatar', 'avatar', 'path', 'filePath',
- 'inputDataString', 'textVariable', 'senderVariable', 'appendMode',
- 'summaryPrompt', 'historyPrompt', 'model', 'prompt', 'systemPrompt',
- 'regionArea', 'saveDir', 'url', 'filename', 'imageUrl',
- ]
- /**
- * 解析单值:先对字符串做 {{var}} 替换,再对整体做 {var} 引用解析
- */
- function resolveInputValue(val, variableContext) {
- if (variableContext == null) return val
- if (typeof val === 'string') {
- const replaced = replaceVariablesInString(val, variableContext)
- let result = resolveValue(replaced, variableContext)
- if (result === val && /^[\w-]+$/.test(val) && variableContext[val] !== undefined) result = variableContext[val]
- return result
- }
- if (Array.isArray(val)) return val.map(item => resolveInputValue(item, variableContext))
- if (typeof val === 'object' && val !== null) {
- const out = {}
- for (const k in val) out[k] = resolveInputValue(val[k], variableContext)
- return out
- }
- return val
- }
- /**
- * 解析整条 action 的入参,返回新对象(不修改原 action)
- * @param {object} action - 原始或已 parse 的 action
- * @param {object} variableContext - 变量表
- * @returns {object} 入参解析后的 action 副本
- */
- function resolveActionInputs(action, variableContext) {
- if (!action || typeof action !== 'object') return action
- if (!variableContext || typeof variableContext !== 'object') return Object.assign({}, action)
- const resolved = Object.assign({}, action)
- for (const key of INPUT_KEYS) {
- if (key in resolved && resolved[key] !== undefined && resolved[key] !== null) {
- resolved[key] = resolveInputValue(resolved[key], variableContext)
- }
- }
- if (resolved.inVars && Array.isArray(resolved.inVars)) {
- resolved.inVars = resolved.inVars.map((v) => resolveInputValue(v, variableContext))
- }
- if (resolved.outVars && Array.isArray(resolved.outVars)) {
- resolved.outVars = resolved.outVars.map((v) => (typeof v === 'string' ? extractVarName(v) : v))
- }
- if (resolved.condition && typeof resolved.condition === 'object' && !Array.isArray(resolved.condition)) {
- const c = resolved.condition
- if (c.interval != null) resolved.condition = Object.assign({}, c, { interval: resolveInputValue(c.interval, variableContext) })
- if (c.repeat != null) resolved.condition = Object.assign({}, resolved.condition, { repeat: resolveInputValue(c.repeat, variableContext) })
- }
- return resolved
- }
- module.exports = {
- resolveActionInputs,
- resolveInputValue,
- }
|