UNPKG

@convo-lang/convo-lang

Version:
266 lines 9.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getConvoGraphEventString = exports.compareConvoGraphSelections = exports.createConvoGraphEntity = exports.roundConvoGraphLayoutProps = exports.createEmptyConvoGraphDb = exports.fixConvoGraphDb = exports.hasConvoGraphDb = exports.createConvoNodeExecCtxConvo = exports.resetConvoNodeExecCtxConvo = exports.createConvoNodeExecCtxAsync = exports.getConvoNodeMetadataAsync = exports.getConvoTraverserStoreIdById = exports.getConvoTraverserStoreId = exports.getConvoTraverserForSaving = exports.applyConvoTraverserControlPath = exports.defaultConvoGraphUserDataVarName = exports.convoTraverserProxyVar = exports.convoTraverserStateStoreSuffix = exports.maxConvoGraphConcurrentStepExe = void 0; const common_1 = require("@iyio/common"); const Conversation_1 = require("./Conversation"); const convo_lib_1 = require("./convo-lib"); exports.maxConvoGraphConcurrentStepExe = 5; exports.convoTraverserStateStoreSuffix = '_suffix'; exports.convoTraverserProxyVar = '_proxy'; exports.defaultConvoGraphUserDataVarName = 'userData'; const applyConvoTraverserControlPath = (tv) => { if (tv.controlPath) { const suffix = tv.state[exports.convoTraverserStateStoreSuffix]; (0, common_1.uiRouterService)().replace(suffix ? (0, common_1.joinPaths)(tv.controlPath, suffix) : tv.controlPath); } }; exports.applyConvoTraverserControlPath = applyConvoTraverserControlPath; const getConvoTraverserForSaving = (tv) => { const map = tv.state[exports.convoTraverserProxyVar]; if (!map || (typeof map !== 'object')) { return tv; } tv = { ...tv }; tv.state = { ...tv.state }; for (const e in map) { delete tv.state[e]; } return tv; }; exports.getConvoTraverserForSaving = getConvoTraverserForSaving; const getConvoTraverserStoreId = (tv, ext) => { const suffix = tv.state?.[exports.convoTraverserStateStoreSuffix]; return (0, exports.getConvoTraverserStoreIdById)(tv.id, suffix, ext); }; exports.getConvoTraverserStoreId = getConvoTraverserStoreId; const getConvoTraverserStoreIdById = (id, storeSuffix, ext) => { id = storeSuffix ? id + '-' + storeSuffix : id; if (ext && !id.endsWith(ext)) { id += ext; } return id; }; exports.getConvoTraverserStoreIdById = getConvoTraverserStoreIdById; const getConvoNodeMetadataAsync = async (convo) => { const outputTypes = []; const metadata = { outputTypes }; const typeMap = {}; let sharedVars; if (!convo) { return { metadata, typeMap, sharedVars: {} }; } try { const flat = await convo.getLastAutoFlatAsync(); if (!flat) { return { metadata, typeMap, sharedVars: {} }; } const inputVar = flat.exe.getVarAsType('Input'); if (inputVar) { metadata.inputType = { name: 'Input' }; typeMap['Input'] = inputVar; } for (const msg of flat.messages) { if (msg.tags && (convo_lib_1.convoTags.output in msg.tags) && msg.fn?.returnType) { const outputVar = flat.exe.getVarAsType(msg.fn.returnType); if (outputVar) { const output = { name: msg.fn.returnType, fnName: msg.fn.name, }; outputTypes.push(output); } } } if (!outputTypes.length && inputVar) { outputTypes.push({ name: 'Input' }); } sharedVars = flat.exe.getUserSharedVarsExcludeTypes(); } catch (ex) { console.warn('Creating ConvoMetadataAndTypeMap failed. This could be due to undefined vars in the last step of a node', ex); } return { metadata, typeMap, sharedVars: sharedVars ?? {} }; }; exports.getConvoNodeMetadataAsync = getConvoNodeMetadataAsync; const createConvoNodeExecCtxAsync = async (node, convoOptions) => { const defaultVars = { ...convoOptions?.defaultVars }; if (node.userData) { const varName = node.userDataVarName === undefined ? exports.defaultConvoGraphUserDataVarName : node.userDataVarName; if (varName && defaultVars[varName] === undefined) { defaultVars[varName] = { ...node.userData }; } } const metadataAndMap = await (0, exports.getConvoNodeMetadataAsync)((node.sharedConvo || node.steps.length) ? (0, exports.createConvoNodeExecCtxConvo)(node, defaultVars, convoOptions, (node.steps[node.steps.length - 1]?.convo ?? '')) : null); return { ...metadataAndMap, node, defaultVars, convo: (0, exports.createConvoNodeExecCtxConvo)(node, defaultVars, convoOptions), steps: node.steps.map((step) => ({ nodeStep: step, })) }; }; exports.createConvoNodeExecCtxAsync = createConvoNodeExecCtxAsync; const resetConvoNodeExecCtxConvo = (ctx) => { ctx.convo = (0, exports.createConvoNodeExecCtxConvo)(ctx.node, ctx.defaultVars, ctx.convoOptions); }; exports.resetConvoNodeExecCtxConvo = resetConvoNodeExecCtxConvo; const createConvoNodeExecCtxConvo = (node, defaultVars, convoOptions, appendConvo = '') => { return new Conversation_1.Conversation({ ...convoOptions, defaultVars, initConvo: ((convoOptions?.initConvo ? convoOptions?.initConvo + '\n\n' : '') + (node.sharedConvo ? node.sharedConvo + '\n\n' : '') + appendConvo) }); }; exports.createConvoNodeExecCtxConvo = createConvoNodeExecCtxConvo; const hasConvoGraphDb = (obj) => { return (obj && (typeof obj === 'object') && (Array.isArray(obj.db?.nodes)) && (Array.isArray(obj.db?.edges)) && (Array.isArray(obj.db?.traversers))) ? true : false; }; exports.hasConvoGraphDb = hasConvoGraphDb; const fixConvoGraphDb = (db) => { let changes = false; if (!db.edges) { db.edges = []; changes = true; } if (!db.nodes) { db.nodes = []; changes = true; } if (!db.traversers) { db.traversers = []; changes = true; } if (!db.inputs) { db.inputs = []; changes = true; } if (!db.sourceNodes) { db.sourceNodes = []; changes = true; } return changes; }; exports.fixConvoGraphDb = fixConvoGraphDb; const createEmptyConvoGraphDb = () => { return { nodes: [], edges: [], traversers: [], inputs: [], sourceNodes: [], }; }; exports.createEmptyConvoGraphDb = createEmptyConvoGraphDb; const roundConvoGraphLayoutProps = (db) => { roundLayoutItems(db.nodes); roundLayoutItems(db.edges); roundLayoutItems(db.inputs); roundLayoutItems(db.sourceNodes); roundLayoutItems(db.traversers); }; exports.roundConvoGraphLayoutProps = roundConvoGraphLayoutProps; const roundLayoutItems = (items) => { if (!items) { return; } for (const i of items) { if (i.x !== undefined) { i.x = Math.round(i.x); } if (i.y !== undefined) { i.y = Math.round(i.y); } } }; const createConvoGraphEntity = (entities) => { if (entities.node) { return { type: 'node', id: entities.node.id, entity: entities.node, ...entities }; } else if (entities.edge) { return { type: 'edge', id: entities.edge.id, entity: entities.edge, ...entities }; } else if (entities.input) { return { type: 'input', id: entities.input.id, entity: entities.input, ...entities }; } else if (entities.source) { return { type: 'source', id: entities.source.id, entity: entities.source, ...entities }; } else if (entities.traverser) { return { type: 'traverser', id: entities.traverser.id, entity: entities.traverser, ...entities }; } else { return undefined; } }; exports.createConvoGraphEntity = createConvoGraphEntity; const compareConvoGraphSelections = (a, b) => { if (a === b) { return true; } if (!a || !b) { return false; } if (a.id !== b.id || a.multi.length !== b.multi.length) { return false; } for (let i = 0; i < a.multi.length; i++) { const sa = a.multi[i]; const sb = b.multi[i]; if (sa?.id !== sb?.id) { return false; } } return true; }; exports.compareConvoGraphSelections = compareConvoGraphSelections; const getConvoGraphEventString = (e, usage) => { try { return (`${e.type} / ${e.traverser?.exeState} - ${e.text} - \npayload:${JSON.stringify(e.traverser?.payload ?? null, null, 4)}\nstate:${JSON.stringify(e.traverser?.state ?? null, null, 4)}${e.node?.userData ? `\nuserData:${JSON.stringify(e.node.userData, null, 4)}` : ''}${usage ? `\nusage: ${(0, convo_lib_1.convoUsageTokensToString)(usage)}` : ''}`); } catch (ex) { return (`${e.type} / ${e.traverser?.exeState} - ${e.text} - \njsonStringifyError:${(0, common_1.getErrorMessage)(ex)}${usage ? `\nusage: ${(0, convo_lib_1.convoUsageTokensToString)(usage)}` : ''}`); } }; exports.getConvoGraphEventString = getConvoGraphEventString; //# sourceMappingURL=convo-graph-lib.js.map