feat(agent): unify MCP tools and adopt Responses delivery

Move project and host queries into native MCP with host-owned OAuth/context,
while retaining memory, skills, actions and publication plugins. Add nearby-model
queries and explicit chat/task/learning model defaults.

Adopt Responses HTTP/SSE and native steer/queue inbox delivery, preserving scoped
session ownership, pending input edits and investigation communication.

Disable local-provider discovery: Server /health allowed native vLLM to probe
/v1/models on port 8000. A native before/after regression prevents recurrence.

Validation: 170 focused Bun tests; service/plugin typechecks; native discovery,
provider-discovery and input-inbox smoke checks; no paid model inference.
This commit is contained in:
2026-10-19 18:46:58 +08:00
parent f5c3cde2c2
commit 6a49d2209e
164 changed files with 12286 additions and 2368 deletions
+177 -6
View File
@@ -2,7 +2,7 @@
"schema_version": 1,
"id": "tjwater.supply-agent",
"name": "TJWater 供水 Agent",
"description": "供水 Agent 的指令、OpenCode 插件、Skill 与外部 MCP 管理索引。",
"description": "供水 Agent 的角色指令、TJWater 插件工具、第一方查询与分析 MCP、OpenCode 原生工具及 Skill 管理索引;计算等待预算由Agent按任务指定,受Server工具目录上限约束。",
"purpose": "documentation-index",
"path_base": ".opencode",
"runtime": {
@@ -12,20 +12,162 @@
"agents": [
{
"id": "instruction",
"description": "编排供水数据查询、地图展示和工况任务,遵守类型化工具与业务证据边界。",
"description": "普通聊天与任务协作主 Agent:通过 mcp_tjwater 查询授权资料或执行受控分析,用插件组织回答、地图展示和业务写入;不启动子代理。此文件的公共规则也供后台调查继承。",
"path": "agents/instruction.md",
"mode": "primary"
},
{
"id": "investigation",
"description": "仅可信 task_execution 会话使用的后台调查主 Agent:在公共指令后追加调查规则,自行调用受控分析,协调最多两个前台只读子任务,统一发布进度、展示请求与报告;完成状态由 Server 运行接口结算。",
"path": "agents/investigation.md",
"mode": "primary"
},
{
"id": "investigation-reader",
"description": "独立只读指令,仅使用已核验父任务授权的 25 项项目查询,返回证据编号、发现与局限;可读已有分析结果,但无计算、宿主查询、消息、发布、文件、Shell 或递归权限。任务查询仍由 Server 保存证据快照。",
"path": "agents/investigation-reader.md",
"mode": "subagent"
}
],
"plugins": [
{
"id": "tjwater.tools",
"description": "注册业务工具、本地交互式回答 present_answer 和待办工具,安装会话 Shell 沙箱与 MCP 权限策略,并提供模型校验和工具发现 RPC。",
"description": "注册 20 个回答、展示、调查写入、通信、记忆/技能管理及待办工具;安装会话 Shell 沙箱、原生 MCP 连接和权限策略。查询由 MCP 提供,公开网页搜索使用原生 websearch。",
"package": "tjwater-plugin",
"entrypoint": "tjwater-plugin/index.ts",
"implementation": "plugins/tjwater-tools.ts"
"implementation": "plugins/tjwater-tools.ts",
"tool_groups": [
{
"description": "本地交互式回答与完整最终答复;不代表后台任务完成。",
"tools": [
"present_answer",
"final_answer"
]
},
{
"description": "地图定位、缩放、图表、历史面板及 SCADA 覆盖层展示;保留各工具的前端执行回执语义。",
"tools": [
"locate_features",
"zoom_to_map",
"show_chart",
"view_history",
"render_scada_analysis",
"clear_scada_analysis"
]
},
{
"description": "调查进度、报告、任务展示、人工证据、动作提议和数据授权申请;计划仅用于解释,提议及申请不直接执行操作。",
"tools": [
"publish_task_progress",
"publish_task_presentation",
"publish_task_report",
"publish_execution_plan",
"propose_task_action",
"add_task_human_evidence",
"request_task_data_access"
]
},
{
"description": "发送调查讨论消息及回复原消息;读取使用 MCP,排队不代表已处理。",
"tools": [
"send_task_message",
"reply_agent_message"
]
},
{
"description": "保留完整读写插件接口:记忆支持 add/list/replace/remove;Skill 支持目录、正文、pattern、reference 和 script 管理。",
"tools": [
"memory_manager",
"skill_manager"
]
},
{
"description": "写入当前会话待办;读取使用 mcp_tjwater_todoread,待办不调度后台调查。",
"tools": [
"todowrite"
]
}
],
"host_rpc": [
"list",
"mcp",
"check_models",
"read_todos"
]
}
],
"native_tools": {
"description": "由 OpenCode 提供,不是 TJWater 插件注册项;目录可见不等于允许执行,仍受会话、审批和沙箱约束。",
"tool_groups": [
{
"description": "会话文件读取、检索及编辑。",
"tools": [
"read",
"glob",
"grep",
"edit",
"write",
"patch"
]
},
{
"description": "TJWater 插件替换执行器的会话 Shell,受 Landlock、seccomp 和审批限制。",
"tools": [
"shell"
]
},
{
"description": "公开网页搜索与抓取;仓库默认搜索引擎为 Exa,部署可覆盖。",
"tools": [
"websearch",
"webfetch"
]
},
{
"description": "按需加载 Skill、向用户提问及受限子代理;子代理仅向可信调查协调会话开放。",
"tools": [
"skill",
"question",
"subagent"
]
},
{
"description": "原生模型、会话与 Git worktree 管理,保留原生权限检查。",
"tools": [
"opencode_models",
"opencode_session_move",
"opencode_session_rename",
"opencode_worktree_create",
"opencode_worktree_list",
"opencode_worktree_remove"
]
},
{
"description": "原生 MCP 资源访问,遵守与 MCP 工具相同的会话策略。",
"tools": [
"opencode_list_mcp_resources",
"opencode_read_mcp_resource"
]
}
],
"disabled": [
"browser",
"browser_*"
],
"config_builder": "../src/runtime/opencode2-config.ts"
},
"agent_messages": {
"description": "查询通过本地 MCP;发送与回复通过写入桥。两者核验身份、项目、运行和线程,保留 originalMessage 来源。",
"tools": [
"mcp_tjwater_list_investigation_tasks",
"mcp_tjwater_get_investigation_task",
"send_task_message",
"mcp_tjwater_read_agent_messages",
"reply_agent_message"
],
"bridge": "/internal/agent-messages/send|reply",
"policy": "agent-message-policy.ts"
},
"skills": {
"description": "部署实例的可复用流程和辅助文件,由 skill_manager 经可信内部工具桥维护。",
"default_root": "skills",
@@ -35,15 +177,44 @@
"store": "../src/skills/store.ts"
},
"mcp": {
"description": "管理员配置的远程 HTTP 或本地 stdio 连接,执行时按会话类型应用权限策略。",
"description": "只读查询与受控分析通过原生 MCP 发现和调用;第一方 mcp_tjwater 由宿主提供,管理员外部连接单独配置。分析不操作现场设备,工具目录不授予业务权限,不恢复旧查询插件或 HTTP 查询执行桥。",
"first_party": {
"server": "mcp_tjwater",
"description": "6 项宿主查询加 35 项产品工具,其中产品工具含 25 项查询与 10 项受控分析,完整目录合计 41 项。各角色按白名单缩减,Server 产品目录须与 Agent 预期完全匹配才可启用。原生工具 ID 使用 mcp_tjwater_<name>,项目凭据和上下文由宿主绑定。",
"connection": "query-mcp.ts",
"implementation": "../src/mcp/query-server.ts",
"tool_ids": "../src/runtime/product-mcp-tools.ts",
"local_catalog": "../src/mcp/local-query-tools.ts",
"session_policy": "../src/runtime/query-mcp-policy.ts",
"product_client": "../src/product/mcp-query-client.ts",
"catalog_compatibility": {
"description": "Server 与 Agent 的产品目录均为 35 项,prepare 对工具名做全等检查。查询和分析名单分别以 PRODUCT_MCP_READ_TOOLS、PRODUCT_MCP_ANALYSIS_TOOLS 为准;reader 仅使用查询名单。目录一致不代表当前用户或任务已获得全部业务权限。",
"server_catalog": "../../next-tjwater-server/app/mcp/catalog.py",
"analysis_contract": "../../next-tjwater-server/docs/mcp-analysis-tools.md"
}
},
"config_file": "../opencode.json",
"config_key": "mcp.servers",
"override_env": "OPENCODE_CONFIG_CONTENT",
"policy": "mcp-policy.ts",
"status_endpoint": "/api/v1/agent/chat/session/:session_id/mcp"
"status_endpoint": "/api/v1/session/:session_id/mcp"
},
"workspace": {
"description": "按用户、个人或项目范围和会话保存聊天、学习进度与计算文件;chat/ 由服务管理,workspace/ 是原生计算目录,删除标记阻止旧记录恢复。",
"default_root": "../data/session-workspaces",
"root_env": "CONVERSATION_WORKSPACE_ROOT",
"manager": "../src/runtime/conversationWorkspace.ts",
"chat_store": "../src/sessions/workspace-store.ts"
},
"models": {
"config_file": "../agent-models.json",
"override_env": "AGENT_MODEL_CONFIG_PATH"
},
"http_api": {
"base_path": "/api/v1",
"generation_endpoint": "POST /api/v1/responses",
"protocol": "Responses text input/output and streaming events, with explicit tjwater extensions",
"request_contract": "../src/chat/responses-protocol.ts",
"description": "Agent独立服务保留;前端通过Responses传输适配器接入,内部插件和查询MCP继续使用各自认证边界。"
}
}