refactor: 将 A_Memorix 重构为主线长期记忆子系统并重建管理界面
- 将 A_Memorix 从旧 submodule / 插件形态迁入主线源码,主体落到 src/A_memorix - 调整主程序接入方式,使 A_Memorix 作为源码内长期记忆子系统运行 - 回收父项目插件体系中针对 A_Memorix 的特判,减少对 plugin 通用层的侵入 - 将长期记忆配置、运行时、自检、导入、调优等能力收口到 memory 路由与主线服务层 - 重做长期记忆控制台与图谱页面,按 MaiBot 现有 dashboard 风格接入 - 补充实体关系图与证据视图双视图能力,支持查看节点、关系、段落及其证据链路 - 新增长期记忆配置编辑器与 memory-api,支持主线内配置管理 - 补齐删除管理能力:删除预览、混合删除、来源批量删除、删除操作恢复 - 优化删除预览与删除操作详情的前端展示,支持分页、检索,并以实体名/关系内容/段落摘要替代单纯 hash 展示 - 修复图谱与控制台相关前端问题,包括证据视图切换、查询触发时机、删除弹层空值保护等 - 新增或更新 A_Memorix 相关测试、WebUI 路由测试、前端 vitest 测试与辅助验证脚本 - 移除旧 plugins/A_memorix、.gitmodules 及相关历史维护文档
This commit is contained in:
@@ -830,14 +830,7 @@ run_installation() {
|
||||
echo -e "${RED}克隆MaiCore仓库失败!${RESET}"
|
||||
exit 1
|
||||
}
|
||||
echo -e "${GREEN}初始化MaiCore子模块...${RESET}"
|
||||
# 使用与主仓一致的 GitHub 加速前缀,避免子模块直连 github.com 失败
|
||||
git -C MaiBot config submodule.plugins/A_memorix.url "$GITHUB_REPO/A-Dawn/A_memorix.git"
|
||||
git -C MaiBot submodule sync --recursive
|
||||
git -C MaiBot submodule update --init --recursive || {
|
||||
echo -e "${RED}初始化MaiCore子模块失败!${RESET}"
|
||||
exit 1
|
||||
}
|
||||
echo -e "${GREEN}A_Memorix 已内置到源码,无需初始化子模块。${RESET}"
|
||||
|
||||
echo -e "${GREEN}克隆 maim_message 包仓库...${RESET}"
|
||||
git clone $GITHUB_REPO/MaiM-with-u/maim_message.git || {
|
||||
|
||||
25
scripts/run_a_memorix_webui_backend.py
Normal file
25
scripts/run_a_memorix_webui_backend.py
Normal file
@@ -0,0 +1,25 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).resolve().parents[1]
|
||||
if str(PROJECT_ROOT) not in sys.path:
|
||||
sys.path.insert(0, str(PROJECT_ROOT))
|
||||
|
||||
from src.A_memorix.host_service import a_memorix_host_service
|
||||
from src.webui.webui_server import get_webui_server
|
||||
|
||||
|
||||
async def main() -> None:
|
||||
server = get_webui_server()
|
||||
await a_memorix_host_service.start()
|
||||
try:
|
||||
await server.start()
|
||||
finally:
|
||||
await a_memorix_host_service.stop()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
21
scripts/sync_a_memorix_subtree.sh
Executable file
21
scripts/sync_a_memorix_subtree.sh
Executable file
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
MODE="${1:-pull}"
|
||||
REMOTE_URL="${2:-https://github.com/A-Dawn/A_memorix.git}"
|
||||
BRANCH="${3:-MaiBot_branch}"
|
||||
PREFIX="src/A_memorix"
|
||||
|
||||
case "$MODE" in
|
||||
add)
|
||||
git subtree add --prefix="$PREFIX" "$REMOTE_URL" "$BRANCH" --squash
|
||||
;;
|
||||
pull)
|
||||
git subtree pull --prefix="$PREFIX" "$REMOTE_URL" "$BRANCH" --squash
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 [add|pull] [remote_url] [branch]" >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
83
scripts/verify_a_memorix_webui.sh
Executable file
83
scripts/verify_a_memorix_webui.sh
Executable file
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
DASHBOARD_ROOT="$REPO_ROOT/dashboard"
|
||||
OUTPUT_DIR="${MAIBOT_UI_SNAPSHOT_DIR:-$REPO_ROOT/tmp/ui-snapshots/a_memorix-electron}"
|
||||
PYTHON_BIN="${MAIBOT_PYTHON_BIN:-$REPO_ROOT/../../.venv/bin/python}"
|
||||
ELECTRON_BIN="${MAIBOT_ELECTRON_BIN:-$DASHBOARD_ROOT/node_modules/electron/dist/Electron.app/Contents/MacOS/Electron}"
|
||||
DRIVER_SCRIPT="$DASHBOARD_ROOT/scripts/a_memorix_electron_validate.cjs"
|
||||
BACKEND_SCRIPT="$REPO_ROOT/scripts/run_a_memorix_webui_backend.py"
|
||||
BACKEND_HOST="${MAIBOT_WEBUI_HOST:-127.0.0.1}"
|
||||
BACKEND_PORT="${MAIBOT_WEBUI_PORT:-8001}"
|
||||
DASHBOARD_HOST="${MAIBOT_DASHBOARD_HOST:-127.0.0.1}"
|
||||
DASHBOARD_PORT="${MAIBOT_DASHBOARD_PORT:-7999}"
|
||||
BACKEND_URL="http://${BACKEND_HOST}:${BACKEND_PORT}"
|
||||
DASHBOARD_URL="http://${DASHBOARD_HOST}:${DASHBOARD_PORT}"
|
||||
REUSE_SERVICES="${MAIBOT_UI_REUSE_SERVICES:-0}"
|
||||
|
||||
BACKEND_PID=""
|
||||
DASHBOARD_PID=""
|
||||
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
cleanup() {
|
||||
local exit_code=$?
|
||||
if [[ -n "$DASHBOARD_PID" ]] && kill -0 "$DASHBOARD_PID" >/dev/null 2>&1; then
|
||||
kill "$DASHBOARD_PID" >/dev/null 2>&1 || true
|
||||
wait "$DASHBOARD_PID" >/dev/null 2>&1 || true
|
||||
fi
|
||||
if [[ -n "$BACKEND_PID" ]] && kill -0 "$BACKEND_PID" >/dev/null 2>&1; then
|
||||
kill "$BACKEND_PID" >/dev/null 2>&1 || true
|
||||
wait "$BACKEND_PID" >/dev/null 2>&1 || true
|
||||
fi
|
||||
exit "$exit_code"
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
wait_for_url() {
|
||||
local url="$1"
|
||||
local label="$2"
|
||||
local timeout="${3:-60}"
|
||||
local started_at
|
||||
started_at="$(date +%s)"
|
||||
while true; do
|
||||
if env -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY NO_PROXY=127.0.0.1,localhost \
|
||||
curl -fsS "$url" >/dev/null 2>&1; then
|
||||
return 0
|
||||
fi
|
||||
if (( "$(date +%s)" - started_at >= timeout )); then
|
||||
echo "Timed out waiting for ${label}: ${url}" >&2
|
||||
return 1
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
}
|
||||
|
||||
if [[ "$REUSE_SERVICES" != "1" ]]; then
|
||||
if ! env -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY NO_PROXY=127.0.0.1,localhost \
|
||||
curl -fsS "${BACKEND_URL}/api/webui/health" >/dev/null 2>&1; then
|
||||
(
|
||||
cd "$REPO_ROOT"
|
||||
WEBUI_HOST="$BACKEND_HOST" WEBUI_PORT="$BACKEND_PORT" "$PYTHON_BIN" "$BACKEND_SCRIPT"
|
||||
) >"$OUTPUT_DIR/backend.log" 2>&1 &
|
||||
BACKEND_PID="$!"
|
||||
wait_for_url "${BACKEND_URL}/api/webui/health" "MaiBot WebUI backend" 120
|
||||
fi
|
||||
|
||||
if ! env -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY NO_PROXY=127.0.0.1,localhost \
|
||||
curl -fsS "${DASHBOARD_URL}/auth" >/dev/null 2>&1; then
|
||||
(
|
||||
cd "$DASHBOARD_ROOT"
|
||||
npm run dev -- --host "$DASHBOARD_HOST" --port "$DASHBOARD_PORT"
|
||||
) >"$OUTPUT_DIR/dashboard.log" 2>&1 &
|
||||
DASHBOARD_PID="$!"
|
||||
wait_for_url "${DASHBOARD_URL}/auth" "dashboard dev server" 120
|
||||
fi
|
||||
fi
|
||||
|
||||
env -u ELECTRON_RUN_AS_NODE \
|
||||
MAIBOT_DASHBOARD_URL="$DASHBOARD_URL" \
|
||||
MAIBOT_UI_SNAPSHOT_DIR="$OUTPUT_DIR" \
|
||||
"$ELECTRON_BIN" "$DRIVER_SCRIPT"
|
||||
Reference in New Issue
Block a user