From 70e488df534c8b5d1e9f8d196ccdc19f25b67e09 Mon Sep 17 00:00:00 2001 From: Hao19911125 <99091644+Hao19911125@users.noreply.github.com> Date: Tue, 14 Apr 2026 12:14:34 +0800 Subject: [PATCH] Make task memory browser search manual --- style.css | 4 ++ ui/panel.js | 132 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 110 insertions(+), 26 deletions(-) diff --git a/style.css b/style.css index e076a6b..8ae9e8f 100644 --- a/style.css +++ b/style.css @@ -1295,6 +1295,10 @@ flex: 0 0 auto; } +.bme-memory-list-filters .bme-task-memory-search-btn { + width: 100%; +} + .bme-memory-list-filters .bme-floor-input { max-width: 120px; flex: 0 0 auto; diff --git a/ui/panel.js b/ui/panel.js index dac4947..92b0328 100644 --- a/ui/panel.js +++ b/ui/panel.js @@ -323,6 +323,8 @@ let currentTabId = "dashboard"; let currentConfigSectionId = "toggles"; let currentTaskSectionId = "pipeline"; let currentSelectedMemoryNodeId = ""; +let taskMemorySearchDraft = _createTaskMemorySearchState(); +let taskMemorySearchApplied = _createTaskMemorySearchState(); let currentTaskProfileTaskType = "extract"; let currentTaskProfileTabId = "generation"; let currentTaskProfileBlockId = ""; @@ -1733,6 +1735,88 @@ function _matchesFloorFilter(node, ranges) { return false; } +function _createTaskMemorySearchState(overrides = {}) { + return { + query: String(overrides.query || ""), + floorQuery: String(overrides.floorQuery || ""), + filter: String(overrides.filter || "all") || "all", + }; +} + +function _readTaskMemoryDraftFromControls() { + taskMemorySearchDraft = _createTaskMemorySearchState({ + query: document.getElementById("bme-task-memory-search")?.value, + floorQuery: document.getElementById("bme-task-memory-floor")?.value, + filter: document.getElementById("bme-task-memory-filter")?.value, + }); + return _createTaskMemorySearchState(taskMemorySearchDraft); +} + +function _applyTaskMemorySearchDraft() { + taskMemorySearchApplied = _readTaskMemoryDraftFromControls(); + _refreshTaskMemoryBrowser(); +} + +function _ensureTaskMemoryBrowserShell(el) { + if (!el) return null; + + let listEl = document.getElementById("bme-task-memory-list"); + let detailEl = document.getElementById("bme-task-memory-detail"); + if (!listEl || !detailEl) { + const draft = _createTaskMemorySearchState(taskMemorySearchDraft); + el.innerHTML = ` +
+
+
+ + + + +
+
+
+
+
+ `; + listEl = document.getElementById("bme-task-memory-list"); + detailEl = document.getElementById("bme-task-memory-detail"); + } + + const searchInput = document.getElementById("bme-task-memory-search"); + const floorInput = document.getElementById("bme-task-memory-floor"); + const filterSelect = document.getElementById("bme-task-memory-filter"); + const applyButton = document.getElementById("bme-task-memory-apply"); + if (searchInput && !searchInput._bmeBound) { + const syncDraft = () => { + _readTaskMemoryDraftFromControls(); + }; + searchInput.addEventListener("input", syncDraft); + floorInput?.addEventListener("input", syncDraft); + filterSelect?.addEventListener("change", syncDraft); + applyButton?.addEventListener("click", () => _applyTaskMemorySearchDraft()); + searchInput._bmeBound = true; + } + + return { listEl, detailEl }; +} + function _refreshTaskMemoryBrowser() { const el = document.getElementById("bme-task-memory"); if (!el) return; @@ -1744,11 +1828,14 @@ function _refreshTaskMemoryBrowser() { return; } - const currentQuery = String(document.getElementById("bme-task-memory-search")?.value || "") - .trim() - .toLowerCase(); - const currentFilter = document.getElementById("bme-task-memory-filter")?.value || "all"; - const currentFloorQuery = String(document.getElementById("bme-task-memory-floor")?.value || "").trim(); + const shell = _ensureTaskMemoryBrowserShell(el); + const listEl = shell?.listEl; + if (!listEl) return; + + const currentQuery = String(taskMemorySearchApplied.query || ""); + const normalizedQuery = currentQuery.trim().toLowerCase(); + const currentFilter = taskMemorySearchApplied.filter || "all"; + const currentFloorQuery = String(taskMemorySearchApplied.floorQuery || "").trim(); let nodes = Array.isArray(graph.nodes) ? graph.nodes.filter((node) => !node?.archived) @@ -1758,15 +1845,15 @@ function _refreshTaskMemoryBrowser() { nodes = nodes.filter((node) => _matchesMemoryFilter(node, currentFilter)); } - if (currentQuery) { + if (normalizedQuery) { nodes = nodes.filter((node) => { const name = getNodeDisplayName(node).toLowerCase(); const snippet = _getNodeSnippet(node).toLowerCase(); const fieldsText = JSON.stringify(node?.fields || {}).toLowerCase(); return ( - name.includes(currentQuery) || - snippet.includes(currentQuery) || - fieldsText.includes(currentQuery) + name.includes(normalizedQuery) || + snippet.includes(normalizedQuery) || + fieldsText.includes(normalizedQuery) ); }); } @@ -1810,6 +1897,14 @@ function _refreshTaskMemoryBrowser() { `; }).join(""); + listEl.innerHTML = + listItems || + '
鏃犺妭鐐?/div>'; + + _renderTaskMemoryDetailSelection(graph); + _bindTaskMemoryListClick(); + return; + el.innerHTML = `
@@ -1838,27 +1933,11 @@ function _refreshTaskMemoryBrowser() { _renderTaskMemoryDetailSelection(graph); _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; - searchInput.addEventListener("input", () => { - clearTimeout(timer); - timer = setTimeout(() => _refreshTaskMemoryBrowser(), 180); - }); - floorInput?.addEventListener("input", () => { - clearTimeout(timer); - timer = setTimeout(() => _refreshTaskMemoryBrowser(), 180); - }); - } - filterSelect?.addEventListener("change", () => _refreshTaskMemoryBrowser()); } function _bindTaskMemoryListClick() { const list = document.getElementById("bme-task-memory-list"); - if (!list) return; + if (!list || list._bmeBound) return; list.addEventListener("click", (e) => { const item = e.target.closest(".bme-memory-node-item"); if (!item) return; @@ -1872,6 +1951,7 @@ function _bindTaskMemoryListClick() { _renderTaskMemoryDetailSelection(graph); } }); + list._bmeBound = true; } function _renderTaskMemoryDetailSelection(graph = _getGraph?.()) {