关于 pmll-memory-mcp
pmll-memory-mcp 为编码 Agent 提供持久化上下文记忆,结合会话隔离的短期 KV 缓存与可选的长期图存储,并以 Q-promise 去重。
主要功能
- 01会话隔离的 KV 记忆
- 02基于 Q-promise 的去重
- 03SQLite 属性图存储
- 04语义搜索与时间衰减
- 05统一上下文解析与自动提升
适用场景
- 01任务开始时初始化记忆
- 02调用昂贵工具前查询缓存
- 03跨会话检索常用信息
MCP 相关
这是一个 MCP 服务,向 MCP 客户端提供短期记忆、长期图记忆及统一上下文解析工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
5收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| silo_size | integer | 否 | KV 槽位的最大数量(与 memory_silo_t.size 一致)。 |
| session_id | string | 是 | 此 Agent 任务的唯一标识符(例如 UUID)。 |
详细介绍
PPM — Python Package Manager
pypm 打包命令行工具,配备共享的 PMLL 记忆和 Q-promise。同系列项目:drQedwards/pmll。
Stellar pmll-anchor 实时 ID:docs/STELLAR.md · 技能:SKILL.md · 承诺:Q_promise_lib/README.md。
简而言之:PPM 用于打包 Python(C CLI)。共享的 PMLL 负责记忆/状态(
memory_silo_t、精确peek和语义peek_semantic、 SAT 桥接、init_pml)。Q-promise 负责时序/控制流(qpromise_*、libqpromise.so) ——它不会取代 silo。可选的 Stellar 承诺通过pmll-anchor将链下CodeworkPayload哈希为 32 字节摘要(ABI:init/store/get/bump)。 配套的打包命令行工具和 MCP 记忆服务位于仓库内。
PMLL 为 Agent 工作流提供持久化结构化记忆,同时还提供 PPM 打包命令行工具 (隔离构建包、插件、签名)和 PMLL Memory MCP 服务。 长期图工具改编自 Context+。
目录
分层(合并后)
两个互补层,不可相互替代:
| 层 | 负责内容 | 主要接口 |
|---|---|---|
| PMLL | 持久化记忆/状态 | memory_silo_t、peek / peek_semantic、silo_set、SAT 桥接、init_pml |
| Q-promise | 时序/控制流 | qpromise_* API、libqpromise.so、延迟执行的 qpromise_drain() |
Q-promise 不会取代 silo。Promise 可以引用一个记忆键(以及可选的 SAT 状态 ID);结果会通过 silo_set / qpromise_resolve_commit 写回。
预期循环
retrieve (peek / peek_semantic)
→ compute / request work
→ promise PENDING
→ resolve / reject (optionally resolve_commit → silo)
→ continuation (then / catch / finally via qpromise_drain)
→ memory update
→ retrieve again
线程安全:C Q-promise drain 为单线程。Continuation 仅在调用线程上执行 qpromise_drain() 时运行;调用方必须在外部串行化访问。详情:Q_promise_lib/README.md。
C 核心(PMLL)
头文件:PMLL.h · 实现:PMLL.c
| 符号 | 作用 |
|---|---|
memory_silo_t | 关联/语义 silo:tree、slots[]、embed_dim(PMLL_EMBED_DIM=32)、slot_count |
silo_slot_t | key、content、embedding、resolved |
init_silo / free_silo / silo_set | 分配、释放、写入键/内容及嵌入 |
peek | 精确键查找,否则按索引查找 |
peek_semantic | 在嵌入上按余弦相似度 ≥ min_sim 查找(silo_embed_text、silo_cosine_similarity) |
init_pml | 将每个 assignment[i] 设为 -1(未决) |
check_conflict | 将 -1 视为未决(而非因零填充而固定为 false) |
sat_bridge_* | 将 3SAT token 映射为 silo 中的关联字符串字面量 |
Q-promise 库
构建/测试/API:Q_promise_lib/README.md(权威文档)。公共符号为 qpromise_*;共享对象为 libqpromise.so。旧原型(QMemNode / q_mem_* / memory-chain walker)已移除;Q_promises.h 是兼容性头文件,会重定向到 qpromise.h。
✨ 功能
| 命令 | 功能说明 |
|---|---|
pypm doctor | 检查 Python 头文件、C 编译器、OpenSSL、WASI 工具链、GPU,等等 |
pypm sandbox [-d DIR] | 进入临时目录(或自定义 DIR),并获得完整的 shell 环境 |
pypm plugin add NAME SRC | 将 .so 插件(从 URL 或路径)下载到 ~/.pypm/plugins/ |
pypm plugin run NAME … | 在指定插件中执行 pypm_plugin_main() |
pypm pypylock [-o FILE] | 将所有 wheel + 解释器打包到 dist/venv.tar.gz(或 FILE) |
pypm version | 打印当前 CLI 版本 |
ppm import PKG | 导入并缓存软件包,并使用 GPU 加速哈希校验 |
ppm add PKG --lock | 添加软件包并更新锁文件 |
ppm plan / ppm apply | 规划依赖项变更,然后应用变更并保留审计记录 |
ppm snapshot / ppm rollback | 创建环境快照;回滚到任意先前状态 |
ppm sign / ppm verify | 对制品进行签名(Ed25519)并验证加密收据 |
ppm sbom | 生成软件物料清单(SBOM) |
已列入路线图: SAT 依赖求解器(独立的 SAT.c CDCL 求解器已存在,但尚未用于解析)、并行 wheel 缓存、使用单个锁文件的工作区、
WASM wheel 解析、Conda 和 Poetry 导入插件。
🔧 从源代码构建
系统依赖项
- C11 编译器(
gcc、clang或 MSVC) libcurl(用于下载插件)libdl(用于动态加载,在 Linux / macOS 上为标准库)tar/libarchive(可选,用于pypylock打包)
构建并首次运行
git clone https://github.com/drQedwards/PPM.git
cd PPM
cc -Wall -Wextra -ldl -lcurl -o pypm Ppm.c
./pypm doctor # Diagnose your dev box
./pypm sandbox # Spin up a throw-away REPL playground
Q-promise 共享库
cd Q_promise_lib
make clean && make test
make shared # → libqpromise.so
cd ..
可选:CUDA 加速构建
nvcc -O3 CLI/CLI.cu -lcuda -o ppm-gpu
./ppm-gpu import transformers torch --verbose
🖥 CLI 命令
导入软件包
# Import a single package
ppm import transformers
# Import with a specific version
ppm import transformers==4.43.3
# Import multiple packages
ppm import transformers torch numpy
# Scan a Python file for imports and install them
ppm import --from-file my_script.py
# Verbose — watch what's happening
ppm import transformers --verbose
# 🔍 Resolving transformers...
# ⬇️ Downloading transformers-4.43.3-py3-none-any.whl
# 🔐 GPU integrity check: PASSED
# ✅ transformers==4.43.3 imported successfully
项目初始化
ppm init
# Creates:
# .ppm/
# ├── ledger.jsonl ← append-only operation log
# ├── state.json ← current state
# ├── lock.json ← dependency lockfile
# └── snapshots/ ← rollback points
依赖解析与锁定
ppm add transformers torch==2.4.0 --lock
ppm plan
# { "plan": "install", "packages": { "transformers": "4.43.3", ... } }
ppm apply --note "Added ML stack"
快照与回滚
ppm snapshot --name "before-upgrade"
ppm snapshots
ppm rollback before-upgrade
环境诊断
ppm doctor
# ✅ Python dev headers found
# ✅ C compiler available
# ✅ CUDA toolkit available
# 🏁 Diagnostics complete (0 issues found)
沙盒
ppm sandbox # ephemeral temp directory
ppm sandbox -d /tmp/mydir # custom directory
密封打包
ppm pypylock -o production-env.tar.gz
🔐 GPU 与安全功能
GPU 加速哈希校验
ppm import torch --verbose
# 🚀 GPU hash verification: SHA-256 computed on device
# ✅ Integrity verified: e3b0c44298fc1c149afbf4c8996fb924...
GPU 后端选择
ppm ensure transformers --gpu auto # auto-detect CUDA
ppm ensure transformers --gpu cu121 # force CUDA 12.1
ppm ensure transformers --gpu cpu # CPU-only
Ed25519 加密签名
ppm keygen --out-priv ed25519.priv --out-pub ed25519.pub
ppm sign --sk ed25519.priv --file torch-2.4.0-*.whl --gpu ./libbreath_gpu.so
ppm verify --receipt torch-2.4.0-*.whl.receipt.json --file torch-2.4.0-*.whl
来源信息与 SBOM
ppm sbom --out project-sbom.json
ppm provenance --out provenance.json
ppm graph --dot | dot -Tpng -o deps.png
🔌 插件系统
# Install a plugin
ppm plugin add auditwheel https://cdn.example.com/auditwheel.so
# Run it
ppm plugin run auditwheel repair --wheel torch-2.4.0-cp310-linux_x86_64.whl
编写插件(C)
// hello.c
#include <stdio.h>
int pypm_plugin_main(int argc, char **argv) {
puts("Hello from a plugin 👋");
return 0;
}
cc -shared -fPIC -o hello.so hello.c
mv hello.so ~/.pypm/plugins/
pypm plugin run hello
⚙️ 配置
pypm.toml
[tool.ppm]
python = "^3.10"
default_gpu = "auto"
[tool.ppm.backends]
cpu.index = "https://download.pytorch.org/whl/cpu"
cu121.index = "https://download.pytorch.org/whl/cu121"
cu122.index = "https://download.pytorch.org/whl/cu122"
torch_prefer = "2.4.*"
transformers_prefer = "4.43.*"
环境变量
export PYP_WORKSPACE_ROOT=/path/to/project # override workspace detection
export PYP_DEBUG=1 # enable debug output
export CUDA_VISIBLE_DEVICES=0 # control GPU usage
🧠 PMLL Memory MCP 服务
持久化记忆逻辑循环,结合短期 KV 上下文记忆、Q-promise 去重,以及 Context+ 长期 记忆图,旨在提升编码 Agent 的上下文保留与检索能力。
pmll-memory-mcp 是一个 Model Context Protocol(MCP)服务,包含互补的短期 KV 层和可选的长期图层。构建服务时优先使用
MCPServer(mcp 2.x),并在不可用时回退到 FastMCP(mcp 1.x)——参见
mcp/pmll_memory_mcp/server.py。
以代码中的工具名称为准:TypeScript(mcp/src/index.ts)有 15 个工具,包括
graphql 和 create_relation 等名称;Python(mcp/pmll_memory_mcp/server.py)
有 14 个工具(没有 graphql),其中一些名称较长,例如 create_memory_relation。
Ppm-lib/pmll_mcp/ 中的 ctypes 示例通过 qpromise_* 加载 libqpromise.so。
记忆层:
- 短期 KV 缓存(5 个工具)——按会话隔离的键值记忆,带有 Q-promise 去重功能,并与
PMLL.c::memory_silo_t相对应。 - 长期记忆图(6 个工具)——改编自 @ForLoopCodes 的 Context+,提供由 SQLite 支持的属性图,其中包含类型化节点、加权边、时间衰减评分(e^(-λt)),以及通过稳定哈希嵌入实现的语义搜索。
- 解决方案引擎(3 个工具)——连接这两层,提供统一的上下文解析(短期 → 长期 → 未命中)、自动将频繁访问的条目提升至长期记忆,以及统一的记忆状态视图。
该服务旨在作为与 Playwright 和其他 MCP 工具并列的第 3 个初始化器——在每个 Agent 任务开始时加载一次。Agent 在任务开始时调用一次 init,然后在调用任何耗时较长的 MCP 工具前使用 peek,以避免重复调用。频繁访问的条目会被提升至长期记忆图,以便跨会话进行语义检索(由 SQLite 支持的图)。
不同实现的工具数量有所不同(TS 为 15 个,含 graphql;Python 为 14 个——见上文说明)。下方历史文档列出的是 TypeScript 工具接口。
为什么它是出色的第 3 个初始化器
现代 Claude Agent 任务通常会调用 Playwright、文件系统工具和其他 MCP 服务。如果没有共享记忆层,每个子任务都会从头重新初始化相同的上下文。pmll-memory-mcp 通过两个互补的记忆层消除了这项开销:
Agent task start
├── 1st init: Playwright MCP
├── 2nd init: Unstoppable Domains MCP (see unstoppable-domains/)
└── 3rd init: pmll-memory-mcp ← this server
├── Short-term: all tool calls go through peek() first
└── Long-term: frequently accessed entries auto-promote to graph
peek() 模式
在调用每一个耗时较长的 MCP 工具前,Agent 都会调用 peek 检查缓存:
// Pseudocode — what the agent does automatically via MCP tool calls
// 1. Check cache before navigating
const result = mcp.call("pmll-memory-mcp", "peek", { session_id: sid, key: "https://example.com" });
if (result.hit) {
const pageContent = result.value; // ← served from PMLL silo, no browser needed
} else {
// 2. Cache miss — do the real work
const pageContent = mcp.call("playwright", "navigate", { url: "https://example.com" });
// 3. Populate the cache for future agents / subtasks
mcp.call("pmll-memory-mcp", "set", {
session_id: sid,
key: "https://example.com",
value: pageContent,
});
}
工具参考(15 个工具)
短期 KV 内存(5 个工具)
| 工具 | 输入 | 输出 | 描述 |
|---|---|---|---|
init | session_id: str,silo_size: int = 256 | {status, session_id, silo_size, cleared} | 设置或重置会话 silo 和 Q-promise 状态(cleared 始终为 true) |
peek | session_id: str,key: str | {hit, value?, index?} 或 {hit, status, promise_id} | 非破坏性地检查缓存和 promise |
set | session_id: str,key: str,value: str | {status: "stored", index} | 在 silo 中存储 KV 键值对 |
resolve | session_id: str,promise_id: str | {status: "resolved"|"pending", payload?} | 检查/解析 Q-promise 延续 |
flush | session_id: str | {status: "flushed", cleared_count} | 任务完成时清除所有 silo 槽位 |
GraphQL(1 个工具)
| 工具 | 输入 | 输出 | 描述 |
|---|---|---|---|
graphql | query: str,variables?: object,operationName?: str | {data} 或 {errors} | 对内存存储执行 GraphQL 查询/变更 |
长期记忆图(6 个工具 — 改编自 Context+)
这些工具改编自 @ForLoopCodes 的 Context+,提供由 SQLite 支持的语义记忆,具备图遍历、衰减评分和余弦相似度搜索功能。
| 工具 | 输入 | 输出 | 描述 |
|---|---|---|---|
upsert_memory_node | session_id、type、label、content、metadata? | {node} | 创建或更新记忆节点,并自动生成稳定哈希嵌入 |
create_relation | session_id、source_id、target_id、relation、weight?、metadata? | {edge} | 创建类型化边(relates_to、depends_on、implements、references、similar_to、contains) |
search_memory_graph | session_id、query、max_depth?、top_k?、edge_filter? | {direct, neighbors, totalNodes, totalEdges} | 通过图遍历进行语义搜索 — 直接匹配项加邻居遍历 |
prune_stale_links | session_id、threshold? | {removed, remaining} | 移除已衰减的边(e^(-λt) 低于阈值)以及访问次数较少的孤立节点 |
add_interlinked_context | session_id、items[]、auto_link? | {nodes, edges} | 批量添加节点并自动建立相似度链接(余弦相似度 ≥ 0.72 时创建边) |
retrieve_with_traversal | session_id、start_node_id、max_depth?、edge_filter? | [{node, depth, pathRelations, relevanceScore}] | 从节点向外遍历 — 返回可达邻居,并按衰减和深度评分 |
解决方案引擎(3 个工具)
| 工具 | 输入 | 输出 | 描述 |
|---|---|---|---|
resolve_context | session_id、key | {source, value, score} | 统一上下文查找:短期 KV → 长期记忆图 → 未命中 |
promote_to_long_term | session_id、key、value、node_type?、metadata? | {promoted, nodeId} | 将短期 KV 条目提升到长期记忆图 |
memory_status | session_id | {shortTerm, longTerm, promotionThreshold} | 统一查看短期 KV 和长期记忆图的状态 |
安装
通过 npx(推荐 — 无需安装)
npx pmll-memory-mcp
通过 npm
npm install -g pmll-memory-mcp
pmll-memory-mcp # starts the stdio MCP server
通过 pip(Python)
pip install pmll-memory-mcp
pmll-memory-mcp # starts the stdio MCP server
Claude Desktop / MCP 配置(claude_desktop_config.json)
NPX
{
"tools": [
{
"name": "init",
"description": "Set up PMLL silo and Q-promise state for a session. Call once at task start.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" },
"silo_size": { "type": "integer", "default": 256 }
},
"required": ["session_id"]
}
},
{
"name": "peek",
"description": "Non-destructive cache lookup + Q-promise check. Call before every expensive MCP tool invocation.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" },
"key": { "type": "string" }
},
"required": ["session_id", "key"]
}
},
{
"name": "set",
"description": "Store a key-value pair in the session silo. Call after a cache miss.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" },
"key": { "type": "string" },
"value": { "type": "string" }
},
"required": ["session_id", "key", "value"]
}
},
{
"name": "resolve",
"description": "Check or resolve a Q-promise continuation by promise ID.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" },
"promise_id": { "type": "string" }
},
"required": ["session_id", "promise_id"]
}
},
{
"name": "flush",
"description": "Clear all silo slots for a session. Call at task completion.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" }
},
"required": ["session_id"]
}
},
{
"name": "graphql",
"description": "Execute GraphQL queries or mutations against the memory store.",
"inputSchema": {
"type": "object",
"properties": {
"query": { "type": "string" },
"variables": { "type": "object" },
"operationName": { "type": "string" }
},
"required": ["query"]
}
},
{
"name": "upsert_memory_node",
"description": "Create or update a memory node with auto-generated stable hashing embeddings.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" },
"type": { "type": "string" },
"label": { "type": "string" },
"content": { "type": "string" },
"metadata": { "type": "object" }
},
"required": ["session_id", "type", "label", "content"]
}
},
{
"name": "create_relation",
"description": "Create a typed, weighted edge between two memory nodes.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" },
"source_id": { "type": "string" },
"target_id": { "type": "string" },
"relation": {
"type": "string",
"enum": ["relates_to", "depends_on", "implements", "references", "similar_to", "contains"]
},
"weight": { "type": "number" },
"metadata": { "type": "object" }
},
"required": ["session_id", "source_id", "target_id", "relation"]
}
},
{
"name": "search_memory_graph",
"description": "Semantic search with graph traversal — returns direct matches and neighbor walk.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" },
"query": { "type": "string" },
"max_depth": { "type": "integer" },
"top_k": { "type": "integer" },
"edge_filter": { "type": "string" }
},
"required": ["session_id", "query"]
}
},
{
"name": "prune_stale_links",
"description": "Remove decayed edges (e^(-λt) below threshold) and orphan nodes with low access count.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" },
"threshold": { "type": "number" }
},
"required": ["session_id"]
}
},
{
"name": "add_interlinked_context",
"description": "Bulk-add nodes with auto-similarity linking (cosine >= 0.72 creates edges).",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" },
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": { "type": "string" },
"label": { "type": "string" },
"content": { "type": "string" },
"metadata": { "type": "object" }
},
"required": ["type", "label", "content"]
}
},
"auto_link": { "type": "boolean" }
},
"required": ["session_id", "items"]
}
},
{
"name": "retrieve_with_traversal",
"description": "Walk outward from a node, returning reachable neighbors scored by temporal decay and depth.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" },
"start_node_id": { "type": "string" },
"max_depth": { "type": "integer" },
"edge_filter": { "type": "string" }
},
"required": ["session_id", "start_node_id"]
}
},
{
"name": "resolve_context",
"description": "Unified context lookup: short-term KV -> long-term graph -> miss. Returns source and score.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" },
"key": { "type": "string" }
},
"required": ["session_id", "key"]
}
},
{
"name": "promote_to_long_term",
"description": "Promote a short-term KV entry to the long-term memory graph.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" },
"key": { "type": "string" },
"value": { "type": "string" },
"node_type": { "type": "string" },
"metadata": { "type": "object" }
},
"required": ["session_id", "key", "value"]
}
},
{
"name": "memory_status",
"description": "Unified view of short-term KV and long-term graph memory status for a session.",
"inputSchema": {
"type": "object",
"properties": {
"session_id": { "type": "string" }
},
"required": ["session_id"]
}
}
]
}
Docker
{
"mcpServers": {
"pmll-memory-mcp": {
"command": "docker",
"args": [
"run", "-i",
"-v", "pmll_data:/app/data",
"-e", "MEMORY_FILE_PATH=/app/data/memory.jsonl",
"--rm", "pmll-memory-mcp"
]
}
}
}
VS Code MCP 配置
添加到 .vscode/mcp.json(或从命令面板打开 MCP: 打开用户配置):
NPX
{
"servers": {
"pmll-memory-mcp": {
"command": "npx",
"args": ["-y", "pmll-memory-mcp"]
}
}
}
Docker
{
"servers": {
"pmll-memory-mcp": {
"command": "docker",
"args": [
"run", "-i",
"-v", "pmll_data:/app/data",
"-e", "MEMORY_FILE_PATH=/app/data/memory.jsonl",
"--rm", "pmll-memory-mcp"
]
}
}
}
Docker
# Build from the repository root
docker build -f mcp/Dockerfile -t pmll-memory-mcp .
# Run
docker run --rm -i pmll-memory-mcp:latest
# Run with persistent KV memory via volume
docker run --rm -i \
-v pmll_data:/app/data \
-e MEMORY_FILE_PATH=/app/data/memory.jsonl \
pmll-memory-mcp:latest
配套服务与集成
| 服务 / 集成 | 目录 / 来源 | 传输方式 | 描述 |
|---|---|---|---|
| Unstoppable Domains | unstoppable-domains/ | HTTP(远程) | 通过自然对话搜索、购买和管理 Web3 域名。 |
| Context+ | github.com/ForLoopCodes/contextplus | 集成 | 长期语义记忆图,已改编到 memory-graph.ts 和 solution-engine.ts。作者: @ForLoopCodes。 |
完整 MCP 服务文档:mcp/README.md
⚓ Stellar 承诺(pmll-anchor)
记忆 / 代码工作负载保留在链下。可选的 32 字节 SHA-256 承诺通过 Soroban pmll-anchor 部署在 Stellar 主网上(与 drQedwards/pmll 共用)。
ABI 保持不变:仅有 init / store / get / bump——请勿虚构字段或合约 ID。
此 PPM 树可能不包含完整的 pmll-anchor/ 合约源代码;类型化负载仍镜像为 skill.ts。
调用文档 / 合约源代码:pmll/SKILL.md。本地摘要:SKILL.md。
| 网络 | 合约 ID | 浏览器 |
|---|---|---|
| 主网 | CCF3B64AXLS4OLY5RN4H4K2CFZAYNZCJQY5MKCKCVAKMZNH7G7F7XUUF | stellar.expert |
| 测试网 | CDLQR24LLFWXTNGGJVJCRXAF3ZRDWFZRUFTDZ5SJOT2J33CS7DDYP7IU | stellar.expert |
管理员:GBFOFCD3XDANQWSGMHKJJ2V3YXS2QQD7RNC4LMDBVNBTUJOQZ3RLSB3E · wasm 哈希 1b6ad9c574e0f5c9e39968f836a410c03adcf057afa93a63d2710bd30fdd53ba
技能摘要:SKILL.md · 完整调用文档:pmll/SKILL.md
🏛 架构
┌───────────────┐
│ pypm (CLI) │ ← C-based command parser
└───────┬───────┘
│
▼
┌───────────────┐ ┌─────────────┐ ┌──────────────┐
│ Workspace │◀───▶│ Resolver │◀───▶│ Wheel Cache │
│ (TOML / YAML) │ │ (SAT + PEP) │ │ (~/.cache) │
└───────────────┘ └─────┬───────┘ └─────┬────────┘
│ │
▼ ▼
┌──────────┐ ┌────────────┐
│ Env Mgr │ │ Plugin Host│
│ (.venv) │ │ (dlopen) │
└──────────┘ └────────────┘
┌─────────────────────────────────────────────────────┐
│ pmll-memory-mcp v1.0.1 │
│ │
│ ┌──────────── Short-term (5 tools) ──────────┐ │
│ │ index.ts → peekContext() → kv-store.ts │ │
│ │ │ │ │
│ │ └──────► q-promise-bridge │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ ┌──────── Long-term — Context+ (6 tools) ────┐ │
│ │ memory-graph.ts → embeddings.ts │ │
│ │ (nodes, edges, decay, cosine similarity) │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ ┌──────── Solution Engine (3 tools) ─────────┐ │
│ │ solution-engine.ts │ │
│ │ (resolve_context, promote, memory_status) │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
│ │
▼ ▼
PMLL.c / PMLL.h Q_promise_lib/
(memory_silo_t) (qpromise_* / libqpromise.so)
关键组件
| 文件 / 目录 | 用途 |
|---|---|
Ppm.c | C 核心命令行工具 v0.0.3-dev — 集成式单文件构建(约 500 行代码) |
Pypm.c | PyPM 0.3.x 前端分发器;将任务委托给模块源文件 |
PMLL.c / PMLL.h | 关联式 / 语义隔离区、peek/peek_semantic、SAT 桥接、init_pml=-1 |
SAT.c / SAT.h | 独立布尔 SAT 求解器(采用 first-UIP 学习的 CDCL,可选 DRUP 证明;由 tests/test_sat_c.py 测试)。尚未接入依赖解析(已列入路线图)。SAT.py / SAT.pyx:用 Python 和 Cython 实现的同一算法;参见 docs/SAT_SOLVERS.md |
Q_promise_lib/ | Promise/continuation 库(qpromise_*、libqpromise.so;单线程清空队列) |
skill.ts / SKILL.md | 链下 CodeworkPayload + Stellar 技能入口 |
pmll-anchor/ | Soroban 承诺合约(pmll 源码中包含;此处可能不存在) |
lattice/ | 仅在 pmll 中 — 可玩的 Stellar 技能图 / ARC-AGI-3 游玩测试 |
mcp/ | TypeScript PMLL Memory MCP 服务(15 个工具) |
mcp/src/memory-graph.ts | 改编自 Context+ 的长期记忆图 |
mcp/src/solution-engine.ts | 连接短期 KV 与长期图的解决方案引擎 |
mcp/src/embeddings.ts | 用于语义搜索的稳定哈希嵌入和余弦相似度(TF-IDF 类保留为旧版) |
CLI/ | 扩展命令行界面 |
Panda-lib/ Torch-lib/ Numpy-lib/ | 库集成适配层 |
scripts/ | 构建辅助工具和自动化脚本 |
📝 发布说明
合并后(2026-08)— 语义隔离区 + Q-promise
- PMLL C 核心:关联式 / 语义隔离区(
slots+ 嵌入)、peek+peek_semantic、SAT 桥接、init_pml赋值从-1(未定)开始。 - Q-promise 演进为
qpromise_*+libqpromise.so;原型QMemNode/q_mem_*API 已移除。 - Stellar 技能 /
skill.ts已对齐,支持将链下CodeworkPayload哈希写入现有pmll-anchor(ABI 未变)。 - MCP 服务优先使用
MCPServer,并在不可用时回退到FastMCP;Q-promise MCP 演示会加载libqpromise.so。
pypm 0.0.3-dev(2025 年 6 月 25 日)
新增与改进
| 区域 | 更新内容 |
|---|---|
| 统一源文件 | 将 v0.0.1 + v0.0.2 合并到单个 pypm.c 文件中,简化构建流程。 |
| 版本升级 | CLI 现在报告 0.0.3-dev。 |
| 工作区覆盖 | 遵循 PYP_WORKSPACE_ROOT,并仍会向上查找 pypm-workspace.toml。 |
| Doctor v2.1 | 统计问题数量并以该数量作为退出码;通过 here-doc 执行内联 Python 探测。 |
| Sandbox v2.1 | 新增 -d <DIR> 标志;默认值仍为 mkdtemp。 |
| 插件获取器加固 | 安全创建 ~/.pypm/plugins;HTTP 4xx/5xx 错误使用 CURLOPT_FAILONERROR;保留插件退出码。 |
| Hermetic bundle 标志 | 无论标志顺序如何,pypylock -o <file> 都能正常工作;默认值为 dist/venv.tar.gz。 |
| 错误呈现 | fatal() 现在通过 perror 显示 errno;dlopen/curl 错误会向上传递。 |
修复
- 子命令后的 CLI 标志有时会被
getopt跳过 → 解析前设置optind = 2。 - 插件加载器在
dlsym失败时仍返回成功 → 现在会返回非零值并关闭句柄。 - 工作区扫描不再覆盖后续
getcwd()调用所用的cwd。
不兼容变更
pypm version现在是子命令(而非--version标志)。doctor的退出码现在可以大于 1(表示问题数量)。
迁移(0.0.2 → 0.0.3-dev)
| 如果你曾…… | 现在请执行 |
|---|---|
./pypm doctor && echo OK | 检查 [[ $? -eq 0 ]] 或解析数字计数。 |
使用 pypm_v002.c / pypm_v001.c | 改用 pypm.c,并执行 make clean && make。 |
硬编码 dist/venv.tar.gz 路径 | 使用 -o 标志指定自定义输出路径。 |
已知问题
- Windows 构建需要:
LoadLibraryW、_mktemp_s、bsdtar.exe回退方案(#22)。 pypylock依赖 shelltar;计划在 0.0.4 中移植libarchive。- WASI/Rust/OpenSSL 检查目前仅为提示性桩。
pmll-memory-mcp 1.0.1
- 版本升级 — 从 1.0.0 升级至 1.0.1,以修复 PyPI 发布问题(1.0.0 已存在于 PyPI)。
- 更新项目描述 — PyPI 和 npm 软件包描述现在加入了“in Claude Sonnet/Opus agent tasks”,以匹配 mcp/README.md 中的标语。
- 刷新 README — PPM README.md 的 MCP 部分已更新,包含完整的工具参考、带 TypeScript 示例的
peek()模式、VS Code MCP 配置,以及来自 mcp/README.md 的配套服务表。
pmll-memory-mcp 1.0.0
- Context+ 集成 — 改造了 6 个长期记忆图工具,源自
Context+,作者为
@ForLoopCodes:
upsert_memory_node、create_relation、search_memory_graph、prune_stale_links、add_interlinked_context、retrieve_with_traversal。 - 解决方案引擎 — 新增 2 个工具和 1 个状态工具,用于连接短期 KV 缓存
与长期记忆图:
resolve_context、promote_to_long_term、memory_status。 - GraphQL 工具 — 提供
graphql工具,以灵活地访问查询和变更操作。 - 共 15 个工具(5 个短期 KV + 1 个 GraphQL + 6 个长期记忆图 + 3 个解决方案引擎)。
- 稳定哈希嵌入(维度固定、不共享词汇表),支持在记忆图中进行余弦相似度搜索。
- 对图边进行时间衰减评分(e^(-λt)),并自动清理。
- 批量添加上下文时自动建立相似度链接(余弦相似度 ≥ 0.72)。
- 统一的上下文解析路径:短期 → 长期 → 未命中。
pmll-memory-mcp 0.2.0
- 首次提交到 MCP Registry。
- 提供五个工具:
init、peek、set、resolve、flush。 - 使用 TypeScript KV 存储,镜像
PMLL.c::memory_silo_t。 - Q-promise 注册表(历史版本);当前 C API 为
qpromise_*/libqpromise.so。 - 支持持久卷的 Docker 多阶段镜像。
- 随附的 Unstoppable Domains MCP 服务位于
mcp/unstoppable-domains/。
pypm 0.0.2 (25 Jun 2025)
工作区自动检测、Doctor v2、沙盒升级、添加/运行插件、pypylock -o。
重大变更:移除了 --version 标志;存在问题时,doctor 会以非零状态码退出。
pypm 0.0.1 (23 Jun 2025)
初始概念验证——单文件 CLI,包含 doctor、sandbox、plugin 和 pypylock。
🗺 路线图
| 版本 | 计划功能 |
|---|---|
| 0.0.4 | Lockfile 解析器 + wheel 复制器,用于创建真正隔离的捆绑包 |
| 0.0.5 | 基于 libsolv 的依赖解析器 |
| 0.1.0 | 跨平台 shim(Windows / macOS) |
| 0.1.1 | WASI 工具链检测与 wheel 优先选择 |
| future | SAT 依赖求解器、并行 wheel 缓存、工作区、WASM 解析 |
🤝 贡献与赞助
欢迎提交拉取请求!请在以下地址提交问题和 PR:
https://github.com/drQedwards/PPM/issues
如果你觉得 PPM 或 pmll-memory-mcp 有用,请考虑支持开发:
由 Dr. Q Josef Kurk Edwards 构建——借助共享的 PMLL 内存栈,让 Python 打包变得快速、确定且易于改造。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。