agent-supervisor-memory (MCP server)
本目录提供一个 单进程 的 Python MCP server(stdio),默认启用:
workflow_*: 生成最小化 spec(lite/spike/heavy)+ 路由建议(模型/effort)memory_*: 个人记忆(JSON 存储,关键词+tags+key 命名空间检索;无向量数据库/无 embedding)
MCP server ID:agent-supervisor-memory(见 mcp-tools/agent-supervisor-memory/src/agent_supervisor_memory/server.py)。
代码结构(便于加载更小的上下文):
server.py: wiring(组合 config + services + tools)config.py: env/flag 解析(主前缀AGENT_SUPERVISOR_MEMORY_*)services/:dispatch.py/memory_store.py/policy.py/workflow_spec.pytools/:core.py/dispatch.py/memory.py/workflow.pyutils/: env/fs/text helpers(路径推断、tail 截断、verbosity 归一化)
Quickstart
cd mcp-tools/agent-supervisor-memory
poetry install
poetry run agent-supervisor-memory
# 默认写入当前/最近的 .codex/codex-dispatch;如需跨多个 repo 共用 dispatch dir(避免 client cwd 不确定),显式传:
# poetry run agent-supervisor-memory --dispatch-dir "$HOME/.codex/codex-dispatch"
环境变量(优先顺序):
- 推荐前缀:
AGENT_SUPERVISOR_MEMORY_*(如 DISPATCH_DIR / MEMORY_PATH / POLICY_PATH / ENABLED / MEMORY_MAX / VERBOSE / VERBOSITY)
默认存储文件:
- Memory:优先使用“最近的祖先目录中已存在的
.codex/”下的.codex/memory.json;若不存在,则用<cwd>/.codex/memory.json - Policy:同理,默认
.codex/agent-policy.json - Dispatch:默认使用“最近的祖先目录中已存在的
.codex/”下的.codex/codex-dispatch/;若不存在,则用<cwd>/.codex/codex-dispatch/。也可通过--dispatch-dir指定一个 base 目录(推荐跨 repo 场景显式指定),server 会按项目自动分桶:<dispatch-dir>/<project_bucket>/<job_id>/{meta.json,stdout.jsonl,stderr.log,last_message.txt}project_bucket会尽量从codex_dispatch_start(cwd=...)的 cwd 向上推断(优先.codex/,其次.git/),并用 hash 保证稳定且不会太长job_id形如<project_bucket>--<uuid>
说明:Poetry 会统一管理虚拟环境与依赖,避免你本机 shell 的 python/pip alias 干扰。
Dispatch 作业清理(pruning)
新增 CLI / env flags(默认关闭清理,仅启用“完成即清理”开关):
--dispatch-prune-enabled(默认false)--dispatch-prune-on-job-finish/--no-dispatch-prune-on-job-finish(默认true)--dispatch-prune-on-startup(默认false,启用后 server 启动会遍历<dispatch-dir>/*/逐桶清理)--dispatch-retain-max-jobs-per-bucket(默认100,超过后按时间保留最新的 N 个)--dispatch-retain-max-age-days(默认7,超过天数优先清理)--dispatch-retain-keep-failed/--no-dispatch-retain-keep-failed(默认保留 failed)--dispatch-prune-dry-run(只打印,不删除)--dispatch-prune-verbose(stderr 打印筛选/删除详情)
删除规则:仅清理已完成/已取消(failed 取决于 keep-failed);若 meta.pid 仍存活则跳过;每桶加 .prune.lock 避免并发;删除前先重命名为 .__deleting__*。
推荐用法:agent-supervisor-memory --dispatch-prune-enabled --dispatch-prune-on-job-finish --dispatch-retain-keep-failed --dispatch-retain-max-age-days 7 --dispatch-retain-max-jobs-per-bucket 100
如何引用(MCP client 注册)
不同 MCP client 的配置方式不同,但核心信息通常是:
command:uvxargs:["agent-supervisor-memory", "...flags"]
工具名引用方式是 tool name,例如:memory_search、workflow_route。
参考配置片段(TOML 风格)
如果你的 client 支持类似下面这种配置(你贴的 exa 例子就是这种风格),可以这样写:
[mcp_servers.supervisor_memory]
command = "uvx"
args = ["agent-supervisor-memory"]
# 或显式指定 dispatch dir(推荐跨 repo 场景)
# args = ["agent-supervisor-memory", "--dispatch-dir", "/ABS/PATH/TO/.codex/codex-dispatch"]
# 或仅配置 env:AGENT_SUPERVISOR_MEMORY_DISPATCH_DIR=/ABS/...
说明:
[mcp_servers.supervisor_memory]里的supervisor_memory是 client 侧别名,你可以随便取(只要不跟别的 server 重名)。- 是否“唯一”由你的 client 配置决定;PyPI 包名的唯一性是另一层(发布时)。
常用开关
[mcp_servers.supervisor_memory]
command = "uvx"
args = ["agent-supervisor-memory", "--global-memory", "--global-policy"]
关闭某些能力(默认都是启用):
[mcp_servers.supervisor_memory]
command = "uvx"
args = ["agent-supervisor-memory", "--no-memory", "--no-subagents", "--no-policy"]
高级覆盖(一般不需要)
为兼容少数 client 场景,仍保留路径覆盖参数(优先级最高;不建议作为默认配置):
agent-supervisor-memory --dispatch-dir /abs/path/to/codex-dispatch --memory-path /abs/path/to/memory.json --policy-path /abs/path/to/agent-policy.json
每次 tool 调用也可传:
options.enable_memory:true|falseoptions.enable_subagents:true|falseoptions.idempotency_key:string(codex_dispatch_start;避免 client 超时重试导致重复启动)
超时诊断(60s tool call)
- 每次 tool 调用会追加写入
.codex/operations-log.md两行:state=started与结束行(含elapsed_ms),可用来定位“卡在哪个 tool/哪次调用”。 - 调用
metrics_get可查看近 N 次调用的p50/p95/max延迟与最近调用列表。 workflow_route会返回一个recipe(执行配方),建议默认budget_ms/max_refresh、是否 refresh、以及 dispatch/patch 的保守参数,适合直接拿来当 Supervisor 的默认调用参数。
project_status / project_tick 的轻量参数
为避免 client 的单次 tool call 60s 超时,以下行为默认更“保守”(更快返回):
project_status默认不刷新 running tasks;传options.refresh=true或options.include_handles=true才刷新(可配max_refresh/budget_ms,超限会返回partial=true+remaining_*)。project_status默认不生成 patch(git diff可能很慢);传options.include_patch=true才会触发生成。project_tick默认refresh=true,但同样遵守max_refresh/budget_ms(budget_ms<=0表示不限制;耗尽预算会返回partial=true)。project_run默认background=true:只做排队(state=queued/starting),由后台 worker 执行git worktree add+dispatch.start,避免一次 tool call 内做重活导致 60s 超时。
可用参数:
options.refresh:true|false(project_tick默认true;project_status默认false)options.include_patch:true|falseoptions.max_refresh:int(缺省:不限刷新次数)options.budget_ms:int(缺省:0,即不限制;到点会返回partial=true)options.background:true|false(project_run默认true;设为false会直接进入starting状态,仍由后台 worker 完成重活)
project_patch_list / project_patch_view(避免隐式 git diff)
默认不会为了“查看 patch”而隐式跑 git diff 生成 patch(这在任务多/改动大时可能非常慢)。
project_patch_list: 传options.generate_patch=true才会尝试生成缺失 patch;否则会返回state=missing的条目并提示。支持options.budget_ms,超时会返回partial=true。project_patch_view: patch 文件缺失时默认返回E_PATCH_NOT_GENERATED;传options.generate_patch=true才会尝试生成。支持options.budget_ms。
project_diagnose(失败模式聚合)
project_diagnose(project_id) 会读取该项目的 .codex/operations-log.md(按 project cwd 定位)与 .codex/projects/<project_id>/traces.jsonl,聚合慢调用/卡顿/缺失 patch 等信号,并返回建议的 project_status/project_tick/project_patch_list 参数组合。
模型与模式(跨模型路由)
本 server 不直接调用模型;它只提供“建议路由”,由你的 Supervisor/Client 负责真正使用什么模型去执行。
policy_get: 读取策略文件workflow_route: 根据任务文本 +mode/effort/auto给出建议的supervisor_model/coder_model/effort
默认配置:
- Supervisor:
codex-5.2 - Coder:
gpt-5.1-codex-max saving:默认effort=mediumefficient:默认effort=medium
如何确认正在使用(VSCode/其他 client)
- 调用
capabilities_get,查看返回里的memory.mode/policy.mode(project|global|disabled)以及落盘path。 - 写入/检索验证:
memory_put写入一条,然后memory_search搜索关键字。
VSCode:自动“主/子模型”分工(推荐)
如果你同时启用了:
mcp__supervisor_memory__*(本 server 的 tools)mcp__codex__codex/mcp__codex__codex-reply(Codex MCP)
那么可以在一个 Supervisor 会话里自动启动 Coder 子会话,并显式指定 coder 使用 model=gpt-5.1-codex-max(或按策略自动选择):
- 生成最小 spec(供 coder 执行):
- 调用
mcp__supervisor_memory__workflow_ensure_spec(输入你的任务文本)
- 获取路由建议(选择 coder 模型与 effort):
- 调用
mcp__supervisor_memory__workflow_route(task_text传上一步的 spec)
- 启动 coder 子会话并执行:
- 调用
mcp__codex__codex,并设置:cwd: 项目根目录model: 上一步返回的coder_modelprompt: spec + 约束(例如:只做必要改动、不要跑 build gate、先做最小校验)
- 迭代直至完成:
- 用
mcp__codex__codex-reply(conversationId为上一步返回)继续
如果 mcp__codex__codex 超时/返回类型不兼容
部分环境下,Codex MCP tool 可能会遇到 tool-call 超时(例如 60s)或 “Unexpected response type”。
此时可以改用本 server 自带的 dispatch 工具:它会在本机启动 codex exec 作为后台任务,并通过轮询查询结果。
流程:
- 启动任务(内部记录
job_id,可按需返回):
- 调用
codex_dispatch_start(model用workflow_route返回的coder_model;cwd为项目根目录;prompt传 spec) - 默认 异步:返回
{state:\"running\", job_id, job_ref}(job_ref为本进程内短句柄);如需 job 目录等完整字段,请传options={\"verbosity\":\"full\"}。 - 如需进一步缩短返回:传
options={\"omit_job_id\":true}(仅保留job_ref);如需路径 artifacts:传options={\"include_artifacts\":true}。 - 如需“阻塞等待”一小段时间:传
options={\"wait\":true,\"max_wait_seconds\":45}(到点仍在运行则返回state:\"running\",避免 tool-call 60s 超时)。 - 为避免大 prompt 导致 UI/context 膨胀:用
prompt_path=\"/abs/path/to/spec.txt\"(或options={\"prompt_path\":\"...\"})替代直接传prompt。 - 为防 client 重试导致重复启动,传
options.idempotency_key(同 bucket + key 会复用同一job_id,返回现有状态/handles)。 - 支持
options.max_model_reasoning_effort(例如 medium)来限制 codex exec 的推理开销;options.fast_mode默认true,在未显式传max_model_reasoning_effort/max_reasoning_effort时,会自动追加model_reasoning_effort="medium",传fast_mode=false可关闭这一默认 cap。 - 如项目根目录存在
.codex/structured-request.json,可用options={\"use_project_prompt\":true}让 server 自动读取作为 prompt(避免在参数里携带文本)。
- 轮询结果:
- 调用
codex_dispatch_status(job_id=... 可省略)直到state变为completed|failed(默认仅回传最小字段) - 默认输出最小化:运行/完成返回
{state, message}(message为提取后的“最后一条用户可读消息”,非原始 JSONL);失败返回{state:'failed', exit_code?, message}(message 优先 stderr 摘要);未找到返回{state:'not_found'}。默认不会返回job_id/meta/artifacts/last_message;若需原始 JSONL/full meta,请用options={\"verbosity\":\"full\"}。 - 为减少 context 噪声:
message默认优先使用summary的最后一行(running/长输出时尤其稳定),避免被 cat/sed 等命令输出污染。 - 默认 tail 读取约 2KB 的 stdout/stderr(可通过
stdout_tail_bytes/stderr_tail_bytes调整);需要完整日志时,请使用 full 模式。 job_id参数可选:缺省时自动使用 server 进程内记录的上一次codex_dispatch_startjob;也可用job_ref(短句柄)替代job_id。- 增量轮询(推荐,减少重复 tail):传
stdout_cursor/stderr_cursor(首次传0),并设置stdout_tail_bytes/stderr_tail_bytes作为“本次最多返回的新增字节”;响应会附带cursor={stdout,stderr}与stdout_delta/stderr_delta(如有新增)。 - 默认增量轮询只回
{state,cursor,has_*_delta,*_delta_len};如需实际文本,传options={\"include_deltas\":true,\"delta_max_chars\":1200}。 - 如需原始/完整响应(含
meta/artifacts/last_message等),请传options={\"verbosity\":\"full\"}或options={\"verbose\":true},或在启动 server 时设置AGENT_SUPERVISOR_MEMORY_VERBOSE=1(或AGENT_SUPERVISOR_MEMORY_VERBOSITY=full)。 - summary 游标:
options.include_summary_cursor=true时,codex_dispatch_status输出会附带基于内部增量的summary_cursor(cursor/非 cursor 模式均支持);codex_dispatch_wait_all也会在 summary-only entries 与详细 jobs 中附带summary_cursor,便于增量判断摘要是否更新。 codex_dispatch_status在非 full 模式下、且state=='running'时,会返回next_poll_ms(默认开启);options.include_next_poll_ms=false或options.omit_next_poll_ms=true可关闭。- 批量等待:
codex_dispatch_wait_all(job_ids , options?)建议始终显式传job_ids(例如来自project_status的 task state)。若省略job_ids且当前 server 进程未记录过 started jobs,会返回E_JOB_IDS_REQUIRED(避免误导性地返回空列表)。默认 summary-only(返回{state, jobs:[{job_id,state,summary?}], counts?},每个 job 都包含状态及近期 summary;跳过 stdout/stderr tail);若需 jobs 详情/last_message/artifacts,传options={\"summary_only\":false}。options.problem_only=true(可配合options.problem_states,支持 JSON list 或逗号分隔字符串,默认集合为 failed/timeout/not_found/canceled)时 jobs 仅保留问题状态且强制返回 counts;options.include_problem_job_ids=true会额外返回failed_job_ids/timeout_job_ids/not_found_job_ids/canceled_job_ids(以及额外的problem_job_idsmap);options.include_summary_cursor=true让 summary-only entries/详细 jobs 附带summary_cursor。 - 取消任务:
codex_dispatch_cancel(job_id|job_ref)会发送 SIGTERM 并标记 cancel requested;任务退出后状态会变为canceled|failed|completed。 - 事件级增量(推荐,最省 context):
codex_dispatch_events(job_id|job_ref, cursor=0)返回解析后的 stdout.jsonl events(默认已过滤噪声并压缩 text),并用cursor增量拉取;options.max_paths(默认 20,仅 compact 生效)限制file_change事件的paths长度并返回paths_total/paths_extra,text仍展示前 3 个路径并用+N表示剩余数量;如需原始事件对象(不裁剪paths),传options={\"raw\":true}。
Project Orchestrator(多任务并行编排)
提供一组轻量 project_* tools,用于 Supervisor 将一个大需求拆成多个 task 并行启动多个 codex coder(后台 codex exec)。
- 默认输出极简:不会返回
job_id/job_ref;需要时传options.include_handles=true。 - 轻量持久化:写入项目级
.codex/projects/<project_id>/,会话断开后仍可恢复查看状态与摘要。 - 项目落盘位置:
project_create(cwd=...)会按该目录所属 repo 的.codex/projects/保存项目,并写入全局~/.codex/projects-index.json方便在 server cwd 变化时定位。 - 全局索引:
project_*tools 会优先读取~/.codex/projects-index.json查找项目的绝对路径;若索引缺失才回退到当前 cwd 推断的.codex/projects/。 - 摘要优先:
project_status返回每个 task 的最近摘要行,并附带轻量 timing(running_for_sec/last_output_sec_ago/stalled_suspected)。 - 并行冲突控制(轻量):task 可声明
locks:[\"path/prefix\"](按前缀匹配),project_run会避免同时运行冲突锁的任务。 - Patch-only(默认):
project_run会为每个 task 创建独立 git worktree;patch 文件在project_patch_list/view/apply(_all)时按需生成(避免在轮询路径里跑git diff导致卡顿)。 - 自动记忆(超短):每次
project_collect会按关键词从输入/报告中提取 2–5 条“偏好/约束”,并写入 memory(是否为全局由--global-memory决定)。
兼容性(Compatibility)
保留 MCP_* 路径/开关 与 SUPERVISOR_MEMORY_*(verbosity 只读)的解析,便于旧配置继续工作;新配置请统一使用 AGENT_SUPERVISOR_MEMORY_*。
Tools
capabilities_gethealth_get(快速健康检查,无磁盘 I/O)metrics_get(最近调用延迟统计)policy_getmemory_putmemory_searchmemory_deletememory_compact(生成profile.json,把“杂乱记忆”压缩为分类摘要)workflow_ensure_specworkflow_routesubagents_echo(示例)codex_dispatch_start(启动codex exec后台任务)codex_dispatch_status(轮询任务状态/输出)codex_dispatch_cancel(取消后台任务)codex_dispatch_events(增量读取 stdout.jsonl events)project_create(创建项目记录)project_plan_set(写入 task plan,自动落盘 prompts)project_run(按依赖/并行度启动可运行 tasks)project_status(最小状态+摘要)project_collect(生成一轮汇总报告到.codex/projects/.../reports/)project_patch_list(列出各 task patch)project_patch_view(patch 预览:stat + 头部片段)project_patch_apply(将 patch 应用到主 repo:先 check 再 apply)project_patch_apply_all(批量 apply patches:遇到错误即停止)project_worktree_list(列出本项目 worktrees)project_worktree_cleanup(清理已完成且 patch 已 apply 的 worktree;默认不 force)project_tick(单入口:刷新状态→启动任务→汇总)project_diagnose(超时/卡顿/失败模式诊断 + 建议参数)
发布到 PyPI(维护者)
PyPI 不允许覆盖已发布的同版本号,所以每次发布前都需要 bump version。
cd mcp-tools/agent-supervisor-memory
# 1) release helper(bump patch + build + publish + 清理 uv/uvx 缓存)
chmod +x scripts/bump_patch_and_clear_uv_cache.sh # 一次即可
./scripts/bump_patch_and_clear_uv_cache.sh [--dry-run] [--verbose] [--testpypi] [--cache-only]
# token:优先用 Poetry 配置(如 `poetry config pypi-token.pypi ...`);也可用环境变量覆盖:`PYPI_TOKEN` / `TESTPYPI_TOKEN`
Release files for agent-supervisor-memory 0.2.41
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| agent_supervisor_memory-0.2.41.tar.gz | 68.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agent_supervisor_memory-0.2.41-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 137.7 kB
Release files / agent_supervisor_memory-0.2.41.tar.gz
| Download URL | agent_supervisor_memory-0.2.41.tar.gz |
|---|---|
| Size | 68.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1b3a273a17cc03b4d6145995907e29894befec3bb1cdaecf315b61c7706061f5
|
|
BLAKE2b-256 checksum How to use checksums |
d8a62ed965823422158cbac819dabc66397569b4663813d6f512eff6f8b4adb8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.2.1 CPython/3.14.2 Darwin/24.6.0
|
Release files / agent_supervisor_memory-0.2.41-py3-none-any.whl
| Download URL | agent_supervisor_memory-0.2.41-py3-none-any.whl |
|---|---|
| Size | 69.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ed020ada6734b6ecb2856febbba8e86b38755b78cd938f3d5485a4b9e7b56965
|
|
BLAKE2b-256 checksum How to use checksums |
1cdee700d155d968472b15b796c0a440b01384feb8b70f9684fba3818b183c50
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.2.1 CPython/3.14.2 Darwin/24.6.0
|