ui: add floor number search to memory browser (task + graph tabs)

This commit is contained in:
Youzini-afk
2026-04-13 00:11:21 +08:00
parent 572ba2d3eb
commit aed3154a52
2 changed files with 64 additions and 0 deletions

View File

@@ -1550,6 +1550,36 @@ function _getMemoryNodeTypeClass(type) {
}
}
function _parseFloorFilter(raw) {
const text = String(raw || "").trim();
if (!text) return null;
const ranges = [];
for (const part of text.split(/[,\s]+/)) {
const rangeParts = part.split(/[-~]/);
if (rangeParts.length === 2) {
const lo = parseInt(rangeParts[0], 10);
const hi = parseInt(rangeParts[1], 10);
if (!Number.isNaN(lo) && !Number.isNaN(hi)) {
ranges.push([Math.min(lo, hi), Math.max(lo, hi)]);
}
} else {
const n = parseInt(part, 10);
if (!Number.isNaN(n)) ranges.push([n, n]);
}
}
return ranges.length ? ranges : null;
}
function _matchesFloorFilter(node, ranges) {
const seq = node.seq ?? -1;
const seqLo = node.seqRange?.[0] ?? seq;
const seqHi = node.seqRange?.[1] ?? seq;
for (const [lo, hi] of ranges) {
if (seqHi >= lo && seqLo <= hi) return true;
}
return false;
}
function _refreshTaskMemoryBrowser() {
const el = document.getElementById("bme-task-memory");
if (!el) return;
@@ -1565,6 +1595,7 @@ function _refreshTaskMemoryBrowser() {
.trim()
.toLowerCase();
const currentFilter = document.getElementById("bme-task-memory-filter")?.value || "all";
const currentFloorQuery = String(document.getElementById("bme-task-memory-floor")?.value || "").trim();
let nodes = Array.isArray(graph.nodes)
? graph.nodes.filter((node) => !node?.archived)
@@ -1587,6 +1618,13 @@ function _refreshTaskMemoryBrowser() {
});
}
if (currentFloorQuery) {
const floorFilter = _parseFloorFilter(currentFloorQuery);
if (floorFilter) {
nodes = nodes.filter((node) => _matchesFloorFilter(node, floorFilter));
}
}
const sorted = nodes.slice().sort((a, b) => {
const importanceDiff = (b.importance || 5) - (a.importance || 5);
if (importanceDiff !== 0) return importanceDiff;
@@ -1624,6 +1662,7 @@ function _refreshTaskMemoryBrowser() {
<div class="bme-memory-list-panel">
<div class="bme-memory-list-filters">
<input type="text" class="bme-search-input" id="bme-task-memory-search" placeholder="搜索记忆节点..." value="${_escHtml(currentQuery)}" />
<input type="text" class="bme-search-input bme-floor-input" id="bme-task-memory-floor" placeholder="楼层 (如 4, 3-10)" value="${_escHtml(currentFloorQuery)}" />
<select class="bme-filter-select" id="bme-task-memory-filter">
<option value="all"${currentFilter === "all" ? " selected" : ""}>全部</option>
<option value="scope:objective"${currentFilter === "scope:objective" ? " selected" : ""}>客观</option>
@@ -1648,6 +1687,7 @@ function _refreshTaskMemoryBrowser() {
_bindTaskMemoryListClick();
const searchInput = document.getElementById("bme-task-memory-search");
const floorInput = document.getElementById("bme-task-memory-floor");
const filterSelect = document.getElementById("bme-task-memory-filter");
if (searchInput) {
let timer = null;
@@ -1655,6 +1695,10 @@ function _refreshTaskMemoryBrowser() {
clearTimeout(timer);
timer = setTimeout(() => _refreshTaskMemoryBrowser(), 180);
});
floorInput?.addEventListener("input", () => {
clearTimeout(timer);
timer = setTimeout(() => _refreshTaskMemoryBrowser(), 180);
});
}
filterSelect?.addEventListener("change", () => _refreshTaskMemoryBrowser());
}
@@ -3300,6 +3344,7 @@ function _refreshMemoryBrowser() {
const searchInput = document.getElementById("bme-memory-search");
const regionInput = document.getElementById("bme-memory-region-filter");
const floorInput = document.getElementById("bme-memory-floor-filter");
const filterSelect = document.getElementById("bme-memory-filter");
const listEl = document.getElementById("bme-memory-list");
if (!listEl) return;
@@ -3307,6 +3352,7 @@ function _refreshMemoryBrowser() {
const canRenderGraph = _canRenderGraphData(loadInfo);
if (searchInput) searchInput.disabled = !canRenderGraph;
if (regionInput) regionInput.disabled = !canRenderGraph;
if (floorInput) floorInput.disabled = !canRenderGraph;
if (filterSelect) filterSelect.disabled = !canRenderGraph;
if (!canRenderGraph && loadInfo.loadState !== "empty-confirmed") {
@@ -3347,6 +3393,14 @@ function _refreshMemoryBrowser() {
});
}
const floorQuery = String(floorInput?.value || "").trim();
if (floorQuery) {
const floorFilter = _parseFloorFilter(floorQuery);
if (floorFilter) {
nodes = nodes.filter((node) => _matchesFloorFilter(node, floorFilter));
}
}
nodes.sort((a, b) => {
const importanceDiff = (b.importance || 5) - (a.importance || 5);
if (importanceDiff !== 0) return importanceDiff;
@@ -3451,6 +3505,10 @@ function _refreshMemoryBrowser() {
clearTimeout(timer);
timer = setTimeout(() => _refreshMemoryBrowser(), 200);
});
floorInput?.addEventListener("input", () => {
clearTimeout(timer);
timer = setTimeout(() => _refreshMemoryBrowser(), 200);
});
filterSelect?.addEventListener("change", () => _refreshMemoryBrowser());
searchInput._bmeBound = true;
}