Files
ST-Bionic-Memory-Ecology/prompting/prompt-node-references.js

94 lines
2.2 KiB
JavaScript

import { truncateNodeLabel } from "../graph/node-labels.js";
function normalizePromptNodeText(value) {
return String(value ?? "")
.replace(/\s+/g, " ")
.trim();
}
function resolvePromptNode(value = {}) {
if (value?.node && typeof value.node === "object") {
return value.node;
}
return value && typeof value === "object" ? value : {};
}
export function resolvePromptNodeId(value = {}) {
const node = resolvePromptNode(value);
return String(value?.nodeId || node?.id || "").trim();
}
export function getPromptNodeLabel(value = {}, { maxLength = 32 } = {}) {
const node = resolvePromptNode(value);
const fallbackId = typeof node?.id === "string" ? node.id.slice(0, 8) : "";
const rawLabel = normalizePromptNodeText(
node?.fields?.title ||
node?.fields?.name ||
node?.fields?.summary ||
node?.fields?.insight ||
node?.fields?.belief ||
node?.name ||
fallbackId ||
"—",
);
return truncateNodeLabel(rawLabel || "—", maxLength);
}
export function createPromptNodeReferenceMap(
entries = [],
{
prefix = "N",
maxLength = 32,
buildMeta = null,
} = {},
) {
const keyToNodeId = {};
const keyToMeta = {};
const nodeIdToKey = {};
const references = [];
for (const [index, entry] of (Array.isArray(entries) ? entries : []).entries()) {
const node = resolvePromptNode(entry);
const nodeId = resolvePromptNodeId(entry);
if (!nodeId || nodeIdToKey[nodeId]) {
continue;
}
const key = `${String(prefix || "N").trim() || "N"}${references.length + 1}`;
const label = getPromptNodeLabel(node, { maxLength });
const extraMeta = typeof buildMeta === "function"
? buildMeta({
entry,
node,
nodeId,
key,
index,
label,
})
: {};
keyToNodeId[key] = nodeId;
nodeIdToKey[nodeId] = key;
keyToMeta[key] = {
nodeId,
type: String(node?.type || ""),
label,
...(extraMeta && typeof extraMeta === "object" ? extraMeta : {}),
};
references.push({
key,
nodeId,
node,
meta: keyToMeta[key],
});
}
return {
prefix: String(prefix || "N").trim() || "N",
references,
keyToNodeId,
keyToMeta,
nodeIdToKey,
};
}