[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80795":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":15,"stars30d":16,"stars90d":14,"forks30d":14,"starsTrendScore":17,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":9,"pushedAt":9,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":14,"starSnapshotCount":14,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},80795,"MokioAgent","Wood-Q\u002FMokioAgent","Wood-Q","从ToolCall到Claw全Agent指南",null,"Python",70,14,1,0,15,33,4,51.33,false,"master",true,[],"2026-06-12 04:01:30","\u003Cp align=\"center\">\n  \u003Cimg src=\".\u002Flogo.png\" alt=\"MokioClaw Logo\" width=\"460\" \u002F>\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">MokioClaw\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  从零开始，一步步丰富一个真正能做事的 Agent 系统。\n\u003C\u002Fp>\n\n## 项目主旨\n\nMokioClaw 是一个教学优先的 Mini CodeAgent 项目。它按 Agent 系统自然生长的路径推进：先从 ToolCall 触碰文件和命令行开始，再升级到 LangGraph 显式工作流，然后继续引入 MultiAgent、Context Engineering、Harness Engineering、Skill 和更完整的 Claw 产品壳。\n\n项目的核心不是“写一个神秘黑盒”，而是把 Agent 如何规划、调用工具、交接子 Agent、验证结果讲清楚。每个阶段都要能运行、能展示、能解释。\n\n## 当前阶段\n\n当前处于第 6 阶段的第一步：在 MultiAgent、Context Engineering、Harness Engineering 基础上，新增 Textual TUI 本地交互层。飞书 API 交互仍属于下一步。\n\n第 3 阶段的图不再是固定的 `planner -> searchAgent -> codeAgent -> verifier` 顺序链路。现在外层 LangGraph 只有 supervisor 与验收循环：\n\n```text\nUser Task\n   |\n   v\nplanner \u002F supervisor\n   |  toolcall: CallSearchAgentTool\n   |-----------------------------> searchAgent\n   |\u003C----------------------------- research notes + sources\n   |\n   |  toolcall: CallCodeAgentTool\n   |-----------------------------> codeAgent\n   |\u003C----------------------------- files + command results\n   |\n   v\ncontext_monitor\n   | token >= limit\n   v\ncontext_compressor\n   |\n   v\nverifier \u002F model reviewer\n   | pass\n   v\nfinal\n   ^\n   | fail and attempts \u003C max_attempts\n   +--------- planner\n```\n\n标志性演示任务：\n\n```bash\nuv run mokioclaw \"帮我查阅明日方舟阿米娅，并编写一个 HTML 介绍人物\"\n```\n\n这个任务适合展示 MultiAgent，因为它需要先查资料，再把资料转成可交付的 HTML 页面，最后由模型版 verifier 读取文件、执行检查、判断是否完成。第 4 阶段会在 planner\u002Fverifier 之间自动监控上下文 token，达到阈值后插入压缩节点，并把规则、工作记忆、历史摘要拆成独立层次展示。\n\n## Context Engineering\n\n### 自动压缩\n\n自动压缩不是简单追加一段摘要。`context_compressor` 会使用 LangGraph 的 `RemoveMessage(REMOVE_ALL_MESSAGES)` 真正清空旧 `messages`，再写入一条压缩后的上下文摘要 message。这样后续节点看到的是更小的窗口，而不是越来越长的 transcript。\n\n压缩会保留：\n\n- 用户任务、当前计划、todo、验收标准、验证命令\n- searchAgent 的研究结论和来源链接\n- codeAgent 的产物、重要文件和执行摘要\n- verifier 的失败原因、下一步建议和风险\n- workspace 内 `TODO.md` 和 `NOTEPAD.md` 中的持久上下文\n\n默认压缩阈值是 `400000` token，可通过环境变量调整。为了演示压缩效果，可以临时设置小阈值：\n\n```bash\nMOKIO_CONTEXT_TOKEN_LIMIT=2000 uv run mokioclaw \"帮我查阅明日方舟阿米娅，并编写一个 HTML 介绍人物\"\n```\n\n### 分层记忆\n\n分层记忆把原来散落在 `messages`、state、`TODO.md` 和 `NOTEPAD.md` 中的信息收束成一个 `Memory Snapshot`。节点 prompt 不再各自手写拼接大段上下文，而是统一读取三层记忆：\n\n| Memory 层 | 来源 | 用途 |\n| --- | --- | --- |\n| `rules` | 系统自动生成 | 稳定规则、workspace 边界、文件职责，不暴露给 Agent 改写 |\n| `working_memory` | graph state \u002F `TODO.md` | 当前任务、计划、todo、验收标准、验证命令、来源、handoff、最近错误 |\n| `history_summary_store` | `NOTEPAD.md` \u002F `HISTORY_SUMMARY.md` \u002F `context_summary` | 长期笔记、压缩后的历史摘要、最近压缩事件 |\n\n运行时终端会展示 `Memory Snapshot` 面板，显示三层摘要、todo 数、source 数、handoff 数，以及 `NOTEPAD.md` 和 `HISTORY_SUMMARY.md` 是否存在。这样可以直观看到 Context Engineering 不只是删消息，还把不同类型的信息放到了不同层里。\n\n## 当前 Tool 与 Agent 架构\n\n| 节点 \u002F Agent | 使用工具 | 职责 |\n| --- | --- | --- |\n| `planner` | `TodoWriteTool` \u002F `CallSearchAgentTool` \u002F `CallCodeAgentTool` | 制定计划，并通过 toolcall 分派专家 Agent |\n| `searchAgent` | `WebSearchTool` | 调用 Tavily 搜索资料，返回研究摘要和 sources |\n| `codeAgent` | `FileReadTool` \u002F `FileWriteTool` \u002F `FileEditTool` \u002F `GrepTool` \u002F `BashTool` \u002F `TodoUpdateTool` | 写文件、运行检查、更新 todo 进度 |\n| `context_monitor` | 无 | 估算当前上下文 token，决定是否触发压缩 |\n| `context_compressor` | 模型压缩 prompt \u002F 分层记忆 | 删除旧 messages，生成可恢复的压缩上下文，并写入 `HISTORY_SUMMARY.md` |\n| `verifier` | `FileReadTool` \u002F `GrepTool` \u002F `BashTool` \u002F `WebSearchTool` | 模型验收节点，只读检查，不修改文件 |\n| `final` | 无 | 汇总计划、来源、验收结果和运行方式 |\n\n当前工具：\n\n| Tool | 职责 | 设计重点 |\n| --- | --- | --- |\n| `TodoWriteTool` | 写入 todo、验收标准、验证命令 | 让 planner 的计划外显；兼容列表、JSON 列表和以 todo id 为 key 的 description 字典 |\n| `TodoUpdateTool` | 更新 todo 状态 | 同步更新 state 和 workspace 内的 `TODO.md` |\n| `CallSearchAgentTool` | 调用 searchAgent | 把子 Agent 包装成 planner 的 toolcall |\n| `CallCodeAgentTool` | 调用 codeAgent | 把实现专家包装成 planner 的 toolcall |\n| `NotepadReadTool` | 读取长期笔记 | 从 workspace 的 `NOTEPAD.md` 恢复上下文 |\n| `NotepadAppendTool` | 追加长期笔记 | 记录发现、决策、重要文件、风险和下一步 |\n| `WebSearchTool` | Tavily 网络搜索 | 返回 answer 和结构化 sources |\n| `FileReadTool` | 读取 workspace 内文本文件 | 支持 `offset` \u002F `limit`，记录“已读状态” |\n| `FileWriteTool` | 创建文件或整文件写入 | 覆盖已有文件前要求先读 |\n| `FileEditTool` | 对已有文件做局部替换 | 基于 `old_text` \u002F `new_text`，要求唯一匹配 |\n| `GrepTool` | 搜索 workspace 内文本内容 | 用结构化方式定位内容 |\n| `BashTool` | 执行开发命令 | 固定 workspace、fresh shell、可配置超时、长输出落盘、后台任务、env file 注入、基础安全拦截；高风险命令需要人类审批 |\n\n## Harness Engineering\n\n当前先引入 Harness Engineering 的三块能力：human-in-the-loop approval、checkpoint\u002Fresume、trace 链路观测。`BashTool` 被包成更像真实 harness 的执行层，CLI 运行时则持续保存可恢复的工作快照和可读的运行日志。这里参考的是 Claude Code 公开文档里可见的机制：命令权限\u002F审批、默认和最大 timeout、fresh shell 执行、环境注入、长输出处理、后台任务、可恢复工作状态、运行观测。Claude Code 源码和内部提示未公开，因此这里不照搬源码，而是实现同类边界能力。\n\n默认审批模式是 `inline`：\n\n```bash\nuv run mokioclaw --approval-mode inline \"搭建一个 FastAPI Todo 后端，并运行检查\"\n```\n\n当 Agent 尝试运行 `uv add fastapi`、`pip install fastapi`、`npm install`、`curl ...`、`uvicorn ...` 等命令时，CLI 会展示命令和风险原因，并询问 `Approve? [y\u002FN]`。输入 `y` 或 `yes` 才会执行，其余输入会拒绝该命令并把结构化失败结果返回给 Agent。\n\n`BashTool` 每次调用都会启动 fresh shell，`export FOO=bar` 这类临时环境变量不会跨工具调用保留。执行环境会生成 `.mokioclaw\u002Fshims` 并放到 `PATH` 前面，把 `python`、`python3`、`pip`、`pip3` 稳定指向当前运行 MokioClaw 的 Python；同时会优先加入 workspace 的 `.venv\u002Fbin`、`venv\u002Fbin` 和 `node_modules\u002F.bin`，减少工具链漂移。需要跨命令复用的环境变量可以写入 workspace 下的 `.mokioclaw.env`，或用 `MOKIO_BASH_ENV_FILE` 指向一个 env 文件；env 文件支持 `export KEY=value` 和 `PATH=.venv\u002Fbin:$PATH` 这类变量展开。普通命令默认最多等待 120 秒，最大允许 600 秒；长输出会截断展示，并把完整 stdout\u002Fstderr 写到 workspace 的 `.mokioclaw\u002Fbash-outputs\u002F`。长时服务应通过 `run_in_background=true` 启动，输出会落到 `.mokioclaw\u002Fbackground\u002F`。\n\n可用模式：\n\n| 模式 | 行为 |\n| --- | --- |\n| `inline` | 高风险命令在 CLI 中询问人类审批 |\n| `deny` | 高风险命令一律拒绝，适合测试和非交互运行 |\n| `auto` | 高风险命令自动批准，适合受控演示 |\n\nCheckpoint 默认开启轻量模式：\n\n```bash\nuv run mokioclaw --checkpoint-mode light \"搭建一个 FastAPI Todo 后端，并运行检查\"\n```\n\n如果中途按 `Ctrl+C`，MokioClaw 会在 workspace 内写入 `.mokioclaw\u002Fcheckpoints\u002FRECOVERY.md` 和 `checkpoint.json`，并在 CLI 里打印恢复命令：\n\n```bash\nuv run mokioclaw --resume .mokioclaw\u002Fworkspaces\u002Fworkspace-YYYYMMDD-HHMMSS-xxxxxx\n```\n\n可用 checkpoint 模式：\n\n| 模式 | 行为 |\n| --- | --- |\n| `light` | 默认模式；保存 workspace 文件快照、`TODO.md`、`NOTEPAD.md`、`HISTORY_SUMMARY.md`、恢复摘要和内部 git 文件版本，恢复时让模型基于这些上下文继续任务 |\n| `strict` | 在 light 基础上保存可序列化 graph state 和事件日志；恢复时执行 state-backed restart，若 state 不可读则自动降级 light resume |\n| `off` | 不保存 checkpoint |\n\ncheckpoint 文件都位于当前 workspace 的 `.mokioclaw\u002Fcheckpoints\u002F`，内部 git repo 只用于该 workspace 文件快照，不会接管项目仓库。运行中会在开始、graph update、失败\u002F审批类工具结果、中断和结束这些关键安全点刷新 checkpoint；完整事件链路由 Trace 记录。\n\nTrace 默认开启，并在每次运行结束或中断时展示 `Trace Summary`：\n\n```bash\nuv run mokioclaw --trace-mode on \"搭建一个 FastAPI Todo 后端，并运行检查\"\n```\n\nTrace 文件位于当前 workspace 的 `.mokioclaw\u002Ftraces\u002Ftrace-*\u002F`：\n\n| 文件 | 作用 |\n| --- | --- |\n| `events.jsonl` | 顺序记录 run、graph update、tool call\u002Fresult、handoff、checkpoint 等结构化摘要事件 |\n| `summary.json` | 记录节点访问次数、工具调用数、失败工具数、审批数、checkpoint 数和最终状态 |\n| `timeline.md` | 给人类阅读的简短运行时间线 |\n\nTrace 只做观测，不改变 Agent 行为，也不替代 checkpoint\u002Fresume。\n\n## 交互层：Textual TUI\n\n除了原来的 Rich 时间线输出，MokioClaw 现在提供一个 Textual 终端界面：\n\n```bash\nuv run mokioclaw tui\n```\n\n也可以启动后立即执行一个任务：\n\n```bash\nuv run mokioclaw tui \"帮我创建一个简易的贪吃蛇游戏代码，并执行检查\"\n```\n\nTUI 使用 `stream_session_events()` 维护一个持续 coding session：一次 TUI 会话默认绑定同一个 workspace，后续输入会带着 session history、TODO、分层 memory、checkpoint 和 trace 继续推进；一次性 Rich CLI 仍使用单轮 `stream_agent_events()`。\n\n- 顶部展示 MokioClaw 状态和无文字像素 logo。\n- 中间展示事件时间线：plan、tool call\u002Fresult、handoff、verifier、final、checkpoint、trace summary。\n- 右侧展示当前 session、workspace、todo、工具调用数、审批数、checkpoint 和 trace 路径。\n- 底部输入消息，按 Enter 发送；一个 turn 完成后可以继续输入下一轮。\n- 默认多轮复用同一个 workspace；输入 `\u002Fnew` 可以切换到一个全新的 session workspace。\n- 高风险 BashTool 命令会在 TUI 内弹出审批对话框，支持 `y` \u002F Enter 批准，`n` \u002F Esc 拒绝。\n\n为了避免“你好”这类输入也启动完整复杂流程，LangGraph 前面增加了一个模型路由节点 `intent_router`。它会先结合当前输入和 session context 判断应该走轻量 `chat_responder`，还是进入 planner \u002F codeAgent \u002F verifier 复杂工作流。寒暄、感谢、帮助说明和普通概念问答会直接通过 `chat_response` 回复，只写入 session 记录，不进入 planner，也不会写 checkpoint\u002Ftrace。需要创建\u002F修改文件、运行命令、搜索资料、验证结果、检查项目，或者“继续\u002F修一下\u002F运行测试”这类引用当前 workspace 的后续指令时，才进入完整 MultiAgent 工作流。\n\nTUI 子命令支持和普通 CLI 相同的运行选项：\n\n```bash\nuv run mokioclaw tui --approval-mode inline --checkpoint-mode light --trace-mode on\nuv run mokioclaw tui --workspace .mokioclaw\u002Fworkspaces\u002Fmy-session\nuv run mokioclaw tui --resume .mokioclaw\u002Fworkspaces\u002Fworkspace-YYYYMMDD-HHMMSS-xxxxxx\n```\n\n原有一次性 CLI 仍然保留：\n\n```bash\nuv run mokioclaw \"帮我查阅明日方舟阿米娅，并编写一个 HTML 介绍人物\"\n```\n\n## 文件目录\n\n```text\nMokioAgent\u002F\n├─ assets\u002F\n│  └─ logo-no-words.png\n├─ logo.png\n├─ README.md\n├─ pyproject.toml\n├─ uv.lock\n├─ src\u002F\n│  └─ mokioclaw\u002F\n│     ├─ agents\u002F\n│     │  ├─ search_agent.py     # searchAgent：Tavily 研究专家\n│     │  └─ code_agent.py       # codeAgent：文件和命令执行专家\n│     ├─ cli\u002F\n│     │  ├─ app.py              # Typer CLI 入口与 tui 子命令\n│     │  ├─ formatter.py        # Rich 事件时间线展示\n│     │  ├─ event_summary.py    # Rich CLI \u002F Textual TUI 共用事件摘要\n│     │  └─ tui\u002F                # Textual 本地交互层\n│     ├─ core\u002F\n│     │  ├─ agent.py            # LangGraph workflow 运行入口\n│     │  ├─ checkpoint.py       # light \u002F strict checkpoint 与 resume\n│     │  ├─ paths.py            # 项目根目录与 workspace 路径\n│     │  └─ state.py            # RuntimeState 与文件快照\n│     ├─ graph\u002F\n│     │  ├─ state.py            # Graph state\n│     │  ├─ memory.py           # rules \u002F working memory \u002F history summary-store\n│     │  ├─ nodes.py            # planner \u002F context monitor \u002F compressor \u002F verifier \u002F final\n│     │  └─ workflow.py         # StateGraph 组装与路由\n│     ├─ providers\u002F\n│     │  └─ openai_provider.py  # 从 .env 创建 ChatOpenAI\n│     ├─ prompts\u002F\n│     │  ├─ stage3.py           # 第 3 阶段节点与子 Agent prompt\n│     │  └─ stage4.py           # Context compression prompt\n│     └─ tools\u002F\n│        ├─ registry.py         # 工具注册\n│        ├─ todo_tool.py        # TodoWrite \u002F TodoUpdate \u002F TODO.md 持久化\n│        ├─ notepad_tool.py     # NOTEPAD.md 长期工作笔记\n│        ├─ web_search_tool.py  # Tavily WebSearchTool\n│        ├─ file_tools.py       # Read \u002F Write \u002F Edit\n│        ├─ grep_tool.py        # 内容搜索\n│        └─ bash_tool.py        # 命令执行\n└─ tests\u002F\n   ├─ test_tools.py\n   ├─ test_graph.py\n   ├─ test_formatter.py\n   └─ test_cli_smoke.py\n```\n\n运行时会自动创建：\n\n```text\n.mokioclaw\u002F\n└─ workspaces\u002F\n   └─ workspace-YYYYMMDD-HHMMSS-xxxxxx\u002F\n      ├─ TODO.md       # 当前任务计划、todo、验收标准和验证命令\n      ├─ NOTEPAD.md    # 长期工作笔记，压缩后仍可恢复关键信息\n      ├─ HISTORY_SUMMARY.md # 压缩后的历史摘要 store\n      ├─ SESSION_SUMMARY.md # TUI 多轮 session 的可读摘要\n      ├─ .mokioclaw\u002F\n      │  ├─ session\u002F\n      │  │  └─ session.json    # TUI session 的结构化 turn\u002Fhistory 状态\n      │  ├─ bash-outputs\u002F       # BashTool 长输出落盘\n      │  ├─ background\u002F         # 后台任务输出\n      │  ├─ traces\u002F\n      │  │  └─ trace-*\u002F         # 结构化链路观测日志\n      │  └─ checkpoints\u002F\n      │     ├─ checkpoint.json  # checkpoint 元数据和工作摘要\n      │     ├─ RECOVERY.md      # light resume 使用的恢复摘要\n      │     ├─ state.json       # strict 模式的可序列化 graph state\n      │     ├─ events.jsonl     # strict 模式事件日志\n      │     └─ git\u002F             # 内部 workspace 文件快照仓库\n      └─ ... Agent 生成的代码、页面、测试和运行产物\n```\n\n默认每次新任务都会创建一个新的 `workspace-*` 目录，避免不同任务互相污染。需要复用或指定目录时，可以显式传入 `--workspace`。\n\n## 示例执行链路\n\n用户输入：\n\n```bash\nuv run mokioclaw \"帮我查阅明日方舟阿米娅，并编写一个 HTML 介绍人物\"\n```\n\n指定 workspace：\n\n```bash\nuv run mokioclaw --workspace .mokioclaw\u002Fworkspaces\u002Fdemo \"帮我查阅明日方舟阿米娅，并编写一个 HTML 介绍人物\"\n```\n\n典型链路：\n\n1. CLI 创建 workspace 和 `RuntimeState`。\n2. `planner` 生成计划：搜索资料、创建 `amiya_profile.html`、加入来源链接、运行检查。\n3. `planner` 通过 `CallSearchAgentTool` 把研究任务交给 `searchAgent`。\n4. `searchAgent` 调用 `WebSearchTool`，从 Tavily 返回摘要和来源链接。\n5. `planner` 收到 research notes 和 sources 后，通过 `CallCodeAgentTool` 把实现任务交给 `codeAgent`。\n6. `codeAgent` 调用 `TodoUpdateTool` 标记进度，调用 `FileWriteTool` 写出 HTML，并用 `BashTool` 做非交互检查。\n7. `codeAgent` 可以调用 `NotepadAppendTool` 把重要发现、文件、风险和下一步写入 `NOTEPAD.md`。\n8. 各节点生成 `Memory Snapshot`，把 rules、working memory、history summary-store 分层注入 prompt 并在终端展示。\n9. `context_monitor` 估算 token；达到阈值时进入 `context_compressor` 压缩消息窗口。\n10. 压缩摘要会进入 state 的 `history_summary`，并持久化到 workspace 的 `HISTORY_SUMMARY.md`。\n11. `verifier` 作为模型验收节点读取分层记忆，再调用 `FileReadTool` \u002F `GrepTool` \u002F `BashTool` \u002F `WebSearchTool` 检查结果。\n12. 如果 verifier 失败，失败原因和下一步建议回到 `planner`，planner 再次分派子 Agent 修复。\n13. 运行期间 checkpoint 会持续刷新；中断后可用 `--resume \u003Cworkspace>` 让模型基于恢复摘要和 workspace 文件继续任务。\n14. Trace 旁路记录节点、工具、handoff、checkpoint 和最终状态，结束时 CLI 展示 `Trace Summary`。\n15. 如果 verifier 通过，进入 `final`，输出文件、来源、验收结论、压缩次数和运行方式；CLI 会直接展示这个最终总结。\n\n这一阶段的教学价值是：MultiAgent 不只是“多个节点排队”，还可以是 supervisor 把 specialist agent 当成工具调用，让交接、上下文和职责边界都在终端里清楚呈现。\n\n更完整的 workspace 生命周期、checkpoint、shims、bash-outputs 讲解见 [docs\u002Fworkspace-lifecycle.md](docs\u002Fworkspace-lifecycle.md)。\n\n## 运行方式\n\n`.env` 配置：\n\n```text\nAPI_KEY=...\nMODEL=...\nBASE_URL=...\nTAVILY_API_KEY=...\nMOKIO_CONTEXT_TOKEN_LIMIT=400000\nMOKIO_BASH_DEFAULT_TIMEOUT_SECONDS=120\nMOKIO_BASH_MAX_TIMEOUT_SECONDS=600\nMOKIO_BASH_MAX_OUTPUT_CHARS=6000\nMOKIO_BASH_ENV_FILE=\nMOKIO_CHECKPOINT_MODE=light\nMOKIO_TRACE_MODE=on\n```\n\n同步依赖：\n\n```bash\nuv sync\n```\n\n运行测试：\n\n```bash\nuv run pytest -q\n```\n\n运行 Agent：\n\n```bash\nuv run mokioclaw \"帮我查阅明日方舟阿米娅，并编写一个 HTML 介绍人物\"\n```\n","MokioClaw 是一个教学优先的 Mini CodeAgent 项目，旨在逐步构建一个能够实际执行任务的 Agent 系统。该项目采用 Python 语言开发，通过从基础的 ToolCall 开始，逐渐引入 LangGraph 显式工作流、MultiAgent 协同、Context Engineering 以及更复杂的技能和产品壳，来展示 Agent 的规划、工具调用、子 Agent 交接及结果验证等过程。每个阶段都保证可运行、可展示、可解释。特别适合于教育场景或对 Agent 系统感兴趣的开发者学习使用。当前版本已经实现了基于上下文监控与压缩机制的多 Agent 协作框架，能够在处理如信息检索并生成 HTML 页面等复杂任务时保持高效稳定的性能。",2,"2026-06-11 04:02:23","CREATED_QUERY"]